セキュリティとプライバシー、
審査のために。

Gnistaは、コーディングエージェントを見守り、ノッチから応答できるようにするMacのアプリです。このページは、会社のMacに入れる前にそれを審査する方のためのものです。何を読み、何を送り、何かがうまくいかないときにどうなるか。

更新:

要点

  • Macの上で動きます。アカウントも、テレメトリも、アナリティクスもありません。
  • 誰のセッションも、コードも、プロンプトも、Macの外に出ません。
  • 通信は下に挙げるものだけ。それ以外はありません。
  • 自分から何かを承認することは決してありません。迷ったときは、エージェントが自身の確認画面で確認を求めます。
  • Developer IDで署名され、Appleの公証を受け、Hardened Runtimeでビルドされています。

Gnistaが読むもの

  • エージェントのフックからのイベント。小さなヘルパーが、Application Support内のGnistaのフォルダにあるUnixソケット越しに送ります。ローカルのみで、ネットワークで待ち受けるのは、コンテナをオンにしたときの、パスワードを求めるMacのループバック上のポート一つだけです。リモートマシンのイベントは、ユーザ自身のsshを通って、Mac上の専用のソケットに届きます。
  • エージェント自身のセッションファイルと設定ファイル。それぞれの場所にあるものを、タイトル、進捗、コスト、プランの上限のために読みます。
  • Gnista専用のキーチェーン項目。ライセンスキーと試用期間の開始日を保存します(開始日は環境設定にも保存します)。同期はしません。
  • 許可がある場合だけ:目的のターミナルのタブやエディタのウインドウを前面に出すための、オートメーションとアクセシビリティ。どちらも任意です。

決してしないこと

  • ほかのアプリのキーチェーン項目や、認証情報を読むこと。
  • ポートを探ったり、ネットワークをスキャンしたりすること。
  • テレメトリやアナリティクスをどこかのサービスに送ること。アカウントもありません。クラッシュレポートは、ユーザが同意したときか、組織がCrashReportsModeをalwaysにしたときだけ送ります。
  • エージェントの設定ファイルの、自分の項目以外を変えること。設定ファイルは先にバックアップし、書式とキーの順序はそのまま保ち、エージェントの接続を解除するとGnistaの行だけがきっちり消えます。

すべての通信

接続先通信タイミングと送る内容
gnista.shアップデートの確認自動アップデートがオンの間、1日1回ほど。ほかの通信と同じくIPアドレスが含まれ、Gnistaのバージョンを送ります。Macのプロファイル情報は送りません。
github.comダウンロード:アップデート、Linux用ヘルパー確認でアップデートが見つかったときはそのアップデート、リモートマシンを接続していて必要な場合は、このバージョンとそのプロセッサ用のLinux用ヘルパー。どちらもGnistaの公開ダウンロード(github.com/BlixtDunder/gnista-downloads、配信元はrelease-assets.githubusercontent.com)から取得します。ほかの通信と同じくIPアドレスが含まれます。どれもGnistaの鍵で署名されている場合だけ使います。
report.gnista.shライセンス、クラッシュレポートライセンス:キーをアクティベートするとき(キーと、アクティベーションのラベルとしてMacの名前)、その後は週1回ほどの確認、そしてキーを削除するときに、そのMacの枠を空けるため(どちらもキーとこのMacのアクティベーションID)。Gnistaの中継サーバはそれだけを販売事業者(merchant of record)のCreemに渡し、ライセンスに関しては、アドレスごとのリクエスト数(ソルト付きハッシュで、翌日には消える)のほかは何も残しません。エージェント、プロジェクト、使用量については何も送りません。クラッシュレポート:Gnistaまたはそのヘルパーがクラッシュした後だけ、しかもユーザが同意したか、常に送ると選んだか、組織がCrashReportsModeをalwaysにした場合だけ:エラーの内容、発生した日時とGnistaのコード内の場所、スレッドのキューの名前、読み込んでいたライブラリの名前とアドレス、GnistaとmacOSのバージョン、Macの機種とプロセッサのアーキテクチャ、クラッシュレポート用に作られたランダムなID。ユーザ名、ファイルパス、プロジェクト、プロンプト、コードは含みません。スウェーデンにあるGnistaの中継サーバが、Gnistaのチームにメールで届け、コピーは残しません。
sshリモートマシン設定 ▸ リモートで接続したマシンだけ。ユーザ自身のsshとssh設定(ポッドならkubectl)を通して:ヘルパーとエージェントのフックのセットアップ、エージェントのイベントをMacへ、応答をそのマシンへ運ぶ接続(接続がmanualのときはなし)、そしてクリックしたときのエージェントのtmuxペインの表示。Gnistaのチームには何も届きません。
ampcode.comAmpのスレッド行にAmpのセッションがある場合だけ:GnistaはAmp自身のCLI(amp threads export、amp threads usage、amp usage)を、ユーザのアカウントでサインインした状態で実行し、それがAmpからスレッド、そのコスト、アカウントのクレジットを読み取ります。Gnista独自のものは何も加えず、Gnistaのチームには何も届きません。
raw.githubusercontent.comモデル価格「使用量」をオンにした場合だけ:LiteLLMの公開モデル価格表を、多くても1日1回。ただのダウンロードで、利用者に関することは何も送りません。

自動アップデートをオフにすると(またはMDMでAutomaticUpdatesをfalseにすると)、アップデートの確認は止まります。試用期間にはネットへの接続は何も要らず、個人ライセンスのキーは一度アクティベートすればオフラインでも使えます。チームのキーは、最後の確認から30日を超えて公開されたビルドを使うために、ときどき確認が必要です。RemoteMachinesAllowedをfalseにすると、すべてのトンネルが閉じ、誰もサーバを接続できなくなります。

承認が安全側に倒れる仕組み

Gnistaでの応答は設定で、Claude Code、Codex、OpenCodeなど、ノッチからの応答を受け付けるエージェントが対象です。リクエストが許可されるのは、人が許可したときだけ。しかも「許可」は、押せるようになるまで0.5秒待ちます。初期設定で承認されるものはありません。

  • Gnistaで応答がない場合:Claude Codeは同時に自身の確認画面も表示し、先に応答されたほうが有効になります。ほかのエージェントにはリクエストが戻り、いつもどおり自身の確認画面で確認を求めます。タブへ行けばすぐに、ノッチが閉じていれば10秒後に、ノッチを開いていても長くて45秒後に。
  • Gnistaが起動していない場合:フックは誰も待ち受けていないことを確かめ、すぐに戻ります。エージェントは自身の確認画面で確認を求めます。
  • Gnistaがロックされている場合(試用期間が終わり、ライセンスがない):すべてのリクエストを、待たずにそのまま返します。
  • フックがエージェントを止めることはありません:状態を伝えるフックは約30msで戻り、いつもきれいに終了します。
  • リモートマシン:そのマシンのヘルパーがノッチからの応答を待つのは、Gnistaでの応答がオンの間だけです。そのマシンのroot権限を持つ人は誰でも、その承認に応答できます。マシンを接続すると、設定にもそう表示されます。
  • 社内のルール:チームプランなら、MDMでGnistaでの応答をオフにしたり、一部のエージェントに限ったりできます。MDMでGnistaををご覧ください。

リモートマシン

Gnistaは、サーバ、コンテナ、Kubernetesのポッドで動くエージェントを表示し、ノッチから応答できます。誰かがマシンを接続するまではオフのままで、RemoteMachinesAllowedをfalseにするとオフのままになります。

  • ユーザ自身のssh:GnistaはMacのsshを、ユーザのssh設定、鍵、エージェントで、ユーザ本人と同じように実行します。パスワードや鍵は保存しません。ログインに人の操作(パスワード、2FA)が必要なときは、「ログイン」がそのためにターミナルを開きます。ポッドにはユーザ自身のkubectlを使います。
  • 署名されたヘルパー、rootもデーモンも不要:Gnistaはヘルパーをそのマシンのユーザのホームの~/.gnistaにコピーし、Macと同じように、そこのエージェントの設定ファイルに自分の行を加えます。Linux用のヘルパーはGnistaの鍵で署名されており、署名が一致しないものをGnistaは受け付けません。公開鍵はgnista.sh/downloads/linux/gnista-linux.pubにあります。root権限は要らず、サービスもインストールせず、エージェントのフックが呼び出したときだけ動きます。
  • Macごとに一つのソケット:マシンを接続した各Macには、そのマシン上に専用のソケットができ、そのユーザだけが読めます。Mac上のコンテナはMacのループバック上のポートを通してそこへ届き、どの接続もランダムなパスワードで始めなければなりません。パスワードは、それをマウントするコンテナのために~/.gnista/containersに保存されます。
  • 接続解除すると、そのマシンのエージェントの設定ファイルからGnistaの行を取り除き、~/.gnistaを削除します。ほかのMacがまだ使っている場合は除きます。

セキュリティツールがトンネルを検出する場合

マシンごとに接続の設定があり、チームプランなら、MDMのRemoteConnectionですべてのMacに設定できます:

  • 自動(automatic):Gnista自身のssh接続が、マシンのソケットをMacへ転送します。サーバがソケットを転送しない場合は、パスワードを求めるそのループバック上のポートを使い、何も転送しない場合は、転送なしと同じように動きます。
  • 転送なし(relay):転送は一切しません。Kubernetesのポッドと同じように、ヘルパーがフックのメッセージを、普通のsshコマンドの入出力に乗せて運びます。
  • 自分の ssh 経由(manual):Gnistaは接続を開きません。「設定」がヘルパーを一度インストールし、ユーザのssh設定に加えるRemoteForwardの行を示します。その後は、ユーザ自身のsshセッションがエージェントのイベントを運びます。サーバのsshd_configにStreamLocalBindUnlink yesがあれば、切れたセッションの後のセッションもすぐに接続できます。

Macに残すもの

Application Support内の自分のフォルダに、最近終わったセッション、最新のプランの上限、モデルの価格表、変更したエージェントの設定ファイルのバックアップ、まだ送っていないクラッシュレポート(30日後に削除)、ダウンロードしたLinux用のヘルパー、ユーザが作ったエージェント、モデル、ジャンプのルールのファイル。設定は環境設定ドメインsh.gnista.Gnistaに、ライセンスキーと試用期間の開始日はGnista専用のキーチェーン項目に保存し、試用期間の開始日は環境設定にも保存します。設定ですべてのエージェントの接続を解除すると、各設定ファイルから自分の行を削除します。

署名とアップデート

GnistaはDeveloper IDで署名され、Appleの公証を受け、Hardened Runtimeでビルドされています。そのため警告なしに開き、macOSは改変されていないことを確認します。Gnistaはgnista.shでアップデートを見つけ、Sparkle経由でGitHub上のGnistaの公開ダウンロードから取得します。アップデートはどれも私たちのEdDSA鍵で署名されています。署名が一致しないアップデートを、Gnistaは受け付けません。

サンドボックス化はされておらず、それはできません。エージェントのファイルを読み、設定ファイルを編集する必要があるからです。Mac App Storeにないのも同じ理由です。

ご質問

審査に必要なことで、ここにないものがありますか? support@gnista.shまでご連絡ください。ウェブサイトと購入については:プライバシー。