@lnar/cli 0.0.1-dev.5da411d → 0.0.1-dev.632e82b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +16 -54
  2. package/dist/api-client.d.ts +19 -0
  3. package/dist/api-client.js +40 -0
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/auth.d.ts +20 -0
  6. package/dist/auth.js +74 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/browser.d.ts +1 -0
  9. package/dist/browser.js +68 -0
  10. package/dist/browser.js.map +1 -0
  11. package/dist/capture-client.d.ts +13 -0
  12. package/dist/capture-client.js +37 -0
  13. package/dist/capture-client.js.map +1 -0
  14. package/dist/capture-worker.d.ts +14 -0
  15. package/dist/capture-worker.js +105 -0
  16. package/dist/capture-worker.js.map +1 -0
  17. package/dist/cli.js +21 -0
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/daemon.d.ts +2 -0
  20. package/dist/commands/daemon.js +114 -1
  21. package/dist/commands/daemon.js.map +1 -1
  22. package/dist/commands/login.d.ts +2 -0
  23. package/dist/commands/login.js +19 -9
  24. package/dist/commands/login.js.map +1 -1
  25. package/dist/commands/record.d.ts +7 -0
  26. package/dist/commands/record.js +117 -0
  27. package/dist/commands/record.js.map +1 -0
  28. package/dist/commands/scan.js +12 -0
  29. package/dist/commands/scan.js.map +1 -1
  30. package/dist/commands/sync.js +3 -0
  31. package/dist/commands/sync.js.map +1 -1
  32. package/dist/commands/up.js +19 -0
  33. package/dist/commands/up.js.map +1 -1
  34. package/dist/machine-id.d.ts +2 -0
  35. package/dist/machine-id.js +48 -0
  36. package/dist/machine-id.js.map +1 -0
  37. package/dist/pending-client.d.ts +1 -1
  38. package/dist/recording/bundle.d.ts +25 -0
  39. package/dist/recording/bundle.js +55 -0
  40. package/dist/recording/bundle.js.map +1 -0
  41. package/dist/recording/capture.d.ts +53 -0
  42. package/dist/recording/capture.js +163 -0
  43. package/dist/recording/capture.js.map +1 -0
  44. package/dist/recording/session.d.ts +30 -0
  45. package/dist/recording/session.js +47 -0
  46. package/dist/recording/session.js.map +1 -0
  47. package/dist/recording/types.d.ts +59 -0
  48. package/dist/recording/types.js +8 -0
  49. package/dist/recording/types.js.map +1 -0
  50. package/dist/run-client.d.ts +19 -0
  51. package/dist/run-client.js +44 -0
  52. package/dist/run-client.js.map +1 -0
  53. package/dist/run-worker.d.ts +25 -0
  54. package/dist/run-worker.js +85 -0
  55. package/dist/run-worker.js.map +1 -0
  56. package/dist/runtime/actions.d.ts +13 -0
  57. package/dist/runtime/actions.js +107 -0
  58. package/dist/runtime/actions.js.map +1 -0
  59. package/dist/runtime/client.d.ts +3 -0
  60. package/dist/runtime/client.js +85 -0
  61. package/dist/runtime/client.js.map +1 -0
  62. package/dist/runtime/login.d.ts +20 -0
  63. package/dist/runtime/login.js +34 -0
  64. package/dist/runtime/login.js.map +1 -0
  65. package/dist/runtime/loop.d.ts +28 -0
  66. package/dist/runtime/loop.js +68 -0
  67. package/dist/runtime/loop.js.map +1 -0
  68. package/dist/runtime/playbook.d.ts +49 -0
  69. package/dist/runtime/playbook.js +73 -0
  70. package/dist/runtime/playbook.js.map +1 -0
  71. package/dist/runtime/runner.d.ts +20 -0
  72. package/dist/runtime/runner.js +54 -0
  73. package/dist/runtime/runner.js.map +1 -0
  74. package/dist/runtime/types.d.ts +69 -0
  75. package/dist/runtime/types.js +10 -0
  76. package/dist/runtime/types.js.map +1 -0
  77. package/dist/scanners/claude-code-skills.d.ts +6 -0
  78. package/dist/scanners/claude-code-skills.js +201 -0
  79. package/dist/scanners/claude-code-skills.js.map +1 -0
  80. package/dist/scanners/claude-code.js +10 -3
  81. package/dist/scanners/claude-code.js.map +1 -1
  82. package/dist/scanners/index.js +3 -2
  83. package/dist/scanners/index.js.map +1 -1
  84. package/dist/service/files.d.ts +14 -2
  85. package/dist/service/files.js +16 -4
  86. package/dist/service/files.js.map +1 -1
  87. package/dist/service/install.js +83 -16
  88. package/dist/service/install.js.map +1 -1
  89. package/dist/sse-client.d.ts +72 -0
  90. package/dist/sse-client.js +174 -0
  91. package/dist/sse-client.js.map +1 -0
  92. package/dist/types.d.ts +43 -3
  93. package/dist/types.js +34 -2
  94. package/dist/types.js.map +1 -1
  95. package/dist/writers/claude-code.js +31 -10
  96. package/dist/writers/claude-code.js.map +1 -1
  97. package/dist/writers/registry.js +0 -4
  98. package/dist/writers/registry.js.map +1 -1
  99. package/package.json +11 -1
  100. package/dist/scanners/chatgpt.d.ts +0 -20
  101. package/dist/scanners/chatgpt.js +0 -49
  102. package/dist/scanners/chatgpt.js.map +0 -1
  103. package/dist/writers/chatgpt.d.ts +0 -8
  104. package/dist/writers/chatgpt.js +0 -12
  105. package/dist/writers/chatgpt.js.map +0 -1
@@ -10,11 +10,12 @@
10
10
  * いずれも管理者権限不要 (per-user スコープ) でインストールできる構成。
11
11
  */
12
12
  import { exec } from 'node:child_process';
13
+ import { realpathSync } from 'node:fs';
13
14
  import { mkdir, mkdtemp, rm, unlink, writeFile } from 'node:fs/promises';
14
15
  import { homedir, platform, tmpdir, userInfo } from 'node:os';
15
16
  import { dirname, join } from 'node:path';
16
17
  import { promisify } from 'node:util';
17
- import { linuxSystemdUnit, macOsPlist, SERVICE_LABEL, windowsTaskXml, } from './files.js';
18
+ import { linuxSystemdUnit, macOsLogPaths, macOsPlist, SERVICE_LABEL, windowsTaskXml, } from './files.js';
18
19
  const execAsync = promisify(exec);
19
20
  async function run(cmd, options = {}) {
20
21
  const { stdout } = await execAsync(cmd, options);
@@ -30,7 +31,27 @@ async function runIgnoring(cmd) {
30
31
  }
31
32
  function detectTarget() {
32
33
  const nodePath = process.execPath;
33
- const scriptPath = process.argv[1] ?? '';
34
+ const rawScriptPath = process.argv[1] ?? '';
35
+ // ----------------------------------------------------------------------
36
+ // scriptPath は symlink を解決した実体パスにする。
37
+ // `npm install -g @lnar/cli` 後の `lnar` は `/opt/homebrew/bin/lnar` 等の
38
+ // symlink で、これをそのまま plist の ProgramArguments に入れると macOS
39
+ // launchd が bootstrap 時に EIO ("Input/output error") を返すことがある
40
+ // (Homebrew bin symlink + launchd の既知の癖)。さらに symlink を経由する
41
+ // と、後で symlink が張り替わったり消えたときに plist が壊れるリスクも
42
+ // 残る。realpath で解決した絶対パス
43
+ // (`.../lib/node_modules/@lnar/cli/dist/cli.js`) を plist に書くことで、
44
+ // bootstrap の安定性とパスの永続性の両方を確保する。
45
+ // ----------------------------------------------------------------------
46
+ let scriptPath = rawScriptPath;
47
+ try {
48
+ if (rawScriptPath) {
49
+ scriptPath = realpathSync(rawScriptPath);
50
+ }
51
+ }
52
+ catch {
53
+ // 解決失敗 (パスが存在しない等) は raw を使う best-effort
54
+ }
34
55
  let warning = null;
35
56
  if (scriptPath.includes('/_npx/') || scriptPath.includes('\\_npx\\')) {
36
57
  warning =
@@ -47,6 +68,10 @@ function detectTarget() {
47
68
  function macOsPlistPath() {
48
69
  return join(homedir(), 'Library', 'LaunchAgents', `${SERVICE_LABEL}.plist`);
49
70
  }
71
+ /** macOS のログ出力先ディレクトリ (`~/Library/Logs/lnar`)。`/tmp` を避ける。 */
72
+ function macOsLogDir() {
73
+ return join(homedir(), 'Library', 'Logs', 'lnar');
74
+ }
50
75
  function macOsServiceTarget() {
51
76
  return `gui/${userInfo().uid}/${SERVICE_LABEL}`;
52
77
  }
@@ -59,29 +84,71 @@ async function isMacOsServiceLoaded() {
59
84
  return false;
60
85
  }
61
86
  }
87
+ const LAUNCHCTL_EIO_PATTERN = /Input\/output error|errno 5\b|:\s*5:/i;
88
+ async function bootoutBothDomains(uid) {
89
+ // gui ドメインと user ドメインの両方を best-effort で bootout する。
90
+ // `launchctl print gui/uid/<label>` で見えなくても launchd 内部に過去の
91
+ // 別パス bootstrap 由来の "torn-down" レコードが残っていることがあり、
92
+ // この状態で新規 bootstrap すると EIO になる。両ドメインを叩いて
93
+ // launchd 側のキャッシュを確実にクリアする。
94
+ await runIgnoring(`launchctl bootout gui/${uid}/${SERVICE_LABEL}`);
95
+ await runIgnoring(`launchctl bootout user/${uid}/${SERVICE_LABEL}`);
96
+ }
97
+ async function bootstrapMacOsWithRetry(uid, plistPath) {
98
+ const bootstrapCmd = `launchctl bootstrap gui/${uid} ${plistPath}`;
99
+ const maxAttempts = 3;
100
+ let lastError;
101
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
102
+ try {
103
+ await run(bootstrapCmd);
104
+ return;
105
+ }
106
+ catch (err) {
107
+ lastError = err;
108
+ const message = err instanceof Error ? err.message : String(err);
109
+ const isEio = LAUNCHCTL_EIO_PATTERN.test(message);
110
+ if (!isEio || attempt === maxAttempts) {
111
+ throw err;
112
+ }
113
+ process.stderr.write(`launchctl bootstrap returned EIO; retrying (${attempt}/${maxAttempts - 1})…\n`);
114
+ await bootoutBothDomains(uid);
115
+ await new Promise((r) => setTimeout(r, 500 * attempt));
116
+ }
117
+ }
118
+ // 到達不能だが TS の型チェックのため
119
+ throw lastError instanceof Error ? lastError : new Error('launchctl bootstrap failed');
120
+ }
62
121
  async function installMacOs(target) {
63
122
  const plistPath = macOsPlistPath();
123
+ const logDir = macOsLogDir();
124
+ // ログディレクトリを先に作る (launchd は親 dir が無いと StandardOutPath を作れない)。
125
+ await mkdir(logDir, { recursive: true, mode: 0o700 });
64
126
  await mkdir(dirname(plistPath), { recursive: true });
65
- await writeFile(plistPath, macOsPlist(target));
66
- // 既存サービスを bootout → bootstrap で差し替える。
67
- // macOS bootout が非同期で、すぐ bootstrap すると "Input/output error (EIO)" を返すため、
68
- // 実際に unload されるまで最大 ~3 秒ポーリングする。`lnar up` の冪等性に必要。
69
- if (await isMacOsServiceLoaded()) {
70
- await runIgnoring(`launchctl bootout ${macOsServiceTarget()}`);
71
- for (let i = 0; i < 30; i++) {
72
- if (!(await isMacOsServiceLoaded()))
73
- break;
74
- await new Promise((r) => setTimeout(r, 100));
75
- }
127
+ await writeFile(plistPath, macOsPlist(target, logDir));
128
+ const uid = userInfo().uid;
129
+ // 既存サービスは print 結果に関わらず両ドメインを bootout する。
130
+ // (詳細は bootoutBothDomains のコメント参照)
131
+ await bootoutBothDomains(uid);
132
+ // bootout は非同期で完了する。実際に unload されるまで最大 ~3 秒ポーリングする。
133
+ // `lnar up` の冪等性に必要。
134
+ for (let i = 0; i < 30; i++) {
135
+ if (!(await isMacOsServiceLoaded()))
136
+ break;
137
+ await new Promise((r) => setTimeout(r, 100));
76
138
  }
77
- await run(`launchctl bootstrap gui/${userInfo().uid} ${plistPath}`);
139
+ // bootstrap launchd の内部状態キャッシュにより最初の試行が EIO になる
140
+ // ことがある。EIO を検出して再 bootout + 短い backoff で数回リトライする。
141
+ await bootstrapMacOsWithRetry(uid, plistPath);
78
142
  await run(`launchctl enable ${macOsServiceTarget()}`);
143
+ const log = macOsLogPaths(logDir);
79
144
  process.stdout.write(`Installed: ${plistPath}\n`);
80
- process.stdout.write(`Logs: /tmp/lnar-daemon.log /tmp/lnar-daemon.err.log\n`);
145
+ process.stdout.write(`Logs: ${log.stdout} ${log.stderr}\n`);
81
146
  }
82
147
  async function uninstallMacOs() {
83
148
  const plistPath = macOsPlistPath();
84
- await runIgnoring(`launchctl bootout ${macOsServiceTarget()}`);
149
+ // install 側と同様、両ドメインの torn-down レコードまで掃除する。
150
+ // これを怠ると `lnar down` → `lnar up` 再実行時に EIO を踏む。
151
+ await bootoutBothDomains(userInfo().uid);
85
152
  try {
86
153
  await unlink(plistPath);
87
154
  process.stdout.write(`Removed: ${plistPath}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/service/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/service/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Minimal SSE client for daemon → API event channel.
3
+ *
4
+ * Node 20 にはネイティブの `EventSource` グローバルが無いため、`fetch` の
5
+ * `ReadableStream<Uint8Array>` を自前で SSE フレームにパースする。
6
+ * 依存を増やさず、必要な機能 (event name + data) だけを抜き出す最小実装。
7
+ *
8
+ * 重要な設計判断:
9
+ * - **canonical fetch パターン**: SSE はベストエフォート通知レイヤー。
10
+ * payload に頼らず、event を受けたら呼び出し元が必ず再 fetch する
11
+ * 責務を持つ。これにより exactly-once / 順序問題から解放される。
12
+ * - **exponential backoff**: 1s → 2s → 4s → ... cap 30s。401 はリトライ不可。
13
+ * - **再接続時の取りこぼし防止**: caller は connect-callback で必ず 1 回
14
+ * fetch を回す前提。SSE が落ちている間に発生したイベントは fallback
15
+ * poll が拾うので、SSE 側で catch-up を実装する必要は無い。
16
+ */
17
+ import type { ApiError } from './api-client.js';
18
+ interface SseEvent {
19
+ /** SSE の `event:` フィールド。デフォルトは "message"。 */
20
+ type: string;
21
+ /** SSE の `data:` フィールドの結合結果 (連続行は `\n` で join)。 */
22
+ data: string;
23
+ }
24
+ export interface SseClientOptions {
25
+ /** SSE エンドポイントの完全 URL (例: https://api.lnar.ai/v1/monitoring/daemon/events?hostname=...) */
26
+ url: string;
27
+ /** OAuth bearer token。 */
28
+ token: string;
29
+ /** イベント到着時に呼ばれる。例外は無視されない (caller で握る)。 */
30
+ onEvent: (event: SseEvent) => Promise<void> | void;
31
+ /** SSE がオープンしたタイミング (初回 + 各再接続時)。catch-up fetch を仕込むのに使う。 */
32
+ onOpen?: () => Promise<void> | void;
33
+ /** 致命的に止めるシグナル。AbortSignal を渡せば caller が close 可能。 */
34
+ signal?: AbortSignal;
35
+ /** 初期 backoff (ms)。テスト時に短縮できるよう注入可能。default 1000。 */
36
+ initialBackoffMs?: number;
37
+ /** 最大 backoff (ms)。default 30000。 */
38
+ maxBackoffMs?: number;
39
+ }
40
+ /**
41
+ * 1 行ずつ SSE フィールドを読み取って `SseEvent` を組み立てるパーサ。
42
+ * 仕様: https://html.spec.whatwg.org/multipage/server-sent-events.html
43
+ *
44
+ * 必要な部分だけ実装: event / data / 空行で flush。id / retry はサーバ側で
45
+ * 使っていないので無視。
46
+ */
47
+ declare class SseFrameParser {
48
+ private buffer;
49
+ private currentEvent;
50
+ private currentData;
51
+ /** 受信したテキスト断片をフィードし、確定した event だけを返す。 */
52
+ feed(chunk: string): SseEvent[];
53
+ private flush;
54
+ }
55
+ /**
56
+ * 終端不能エラー (401 など) を表す例外。caller がリトライをやめる判断に使う。
57
+ */
58
+ export declare class SseFatalError extends Error {
59
+ status: number;
60
+ constructor(message: string, status: number);
61
+ }
62
+ /**
63
+ * SSE エンドポイントに常時接続し、event を caller に流し続ける。
64
+ *
65
+ * 戻り値の Promise は signal が abort されたとき、もしくは SseFatalError が
66
+ * 発生したときに解決する。通常運用では永久ループのため await は daemon の
67
+ * シャットダウンと組み合わせて使う。
68
+ */
69
+ export declare const runSseClient: (options: SseClientOptions) => Promise<void>;
70
+ export declare const _SseFrameParserForTest: typeof SseFrameParser;
71
+ export type { SseEvent };
72
+ export type { ApiError };
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Minimal SSE client for daemon → API event channel.
3
+ *
4
+ * Node 20 にはネイティブの `EventSource` グローバルが無いため、`fetch` の
5
+ * `ReadableStream<Uint8Array>` を自前で SSE フレームにパースする。
6
+ * 依存を増やさず、必要な機能 (event name + data) だけを抜き出す最小実装。
7
+ *
8
+ * 重要な設計判断:
9
+ * - **canonical fetch パターン**: SSE はベストエフォート通知レイヤー。
10
+ * payload に頼らず、event を受けたら呼び出し元が必ず再 fetch する
11
+ * 責務を持つ。これにより exactly-once / 順序問題から解放される。
12
+ * - **exponential backoff**: 1s → 2s → 4s → ... cap 30s。401 はリトライ不可。
13
+ * - **再接続時の取りこぼし防止**: caller は connect-callback で必ず 1 回
14
+ * fetch を回す前提。SSE が落ちている間に発生したイベントは fallback
15
+ * poll が拾うので、SSE 側で catch-up を実装する必要は無い。
16
+ */
17
+ const DEFAULT_INITIAL_BACKOFF_MS = 1000;
18
+ const DEFAULT_MAX_BACKOFF_MS = 30_000;
19
+ /**
20
+ * 1 行ずつ SSE フィールドを読み取って `SseEvent` を組み立てるパーサ。
21
+ * 仕様: https://html.spec.whatwg.org/multipage/server-sent-events.html
22
+ *
23
+ * 必要な部分だけ実装: event / data / 空行で flush。id / retry はサーバ側で
24
+ * 使っていないので無視。
25
+ */
26
+ class SseFrameParser {
27
+ buffer = '';
28
+ currentEvent = null;
29
+ currentData = [];
30
+ /** 受信したテキスト断片をフィードし、確定した event だけを返す。 */
31
+ feed(chunk) {
32
+ this.buffer += chunk;
33
+ const events = [];
34
+ let lineEnd;
35
+ // CR / LF / CRLF いずれにも対応するため正規表現で分割。
36
+ while ((lineEnd = this.buffer.search(/\r\n|\r|\n/)) !== -1) {
37
+ const line = this.buffer.slice(0, lineEnd);
38
+ const sepLen = this.buffer.slice(lineEnd, lineEnd + 2) === '\r\n' ? 2 : 1;
39
+ this.buffer = this.buffer.slice(lineEnd + sepLen);
40
+ if (line === '') {
41
+ // 空行 = event 区切り
42
+ const event = this.flush();
43
+ if (event)
44
+ events.push(event);
45
+ continue;
46
+ }
47
+ // コメント行 (':' で始まる) は heartbeat 用なので無視。
48
+ if (line.startsWith(':'))
49
+ continue;
50
+ const colonIdx = line.indexOf(':');
51
+ const field = colonIdx === -1 ? line : line.slice(0, colonIdx);
52
+ // SSE 仕様: `:` の直後の単一スペースは省く。
53
+ let value = colonIdx === -1 ? '' : line.slice(colonIdx + 1);
54
+ if (value.startsWith(' '))
55
+ value = value.slice(1);
56
+ if (field === 'event') {
57
+ this.currentEvent = value;
58
+ }
59
+ else if (field === 'data') {
60
+ this.currentData.push(value);
61
+ }
62
+ // id / retry はサポート外。
63
+ }
64
+ return events;
65
+ }
66
+ flush() {
67
+ if (this.currentData.length === 0 && this.currentEvent == null)
68
+ return null;
69
+ const event = {
70
+ type: this.currentEvent ?? 'message',
71
+ data: this.currentData.join('\n'),
72
+ };
73
+ this.currentEvent = null;
74
+ this.currentData = [];
75
+ return event;
76
+ }
77
+ }
78
+ /**
79
+ * 終端不能エラー (401 など) を表す例外。caller がリトライをやめる判断に使う。
80
+ */
81
+ export class SseFatalError extends Error {
82
+ status;
83
+ constructor(message, status) {
84
+ super(message);
85
+ this.status = status;
86
+ this.name = 'SseFatalError';
87
+ }
88
+ }
89
+ /**
90
+ * SSE エンドポイントに常時接続し、event を caller に流し続ける。
91
+ *
92
+ * 戻り値の Promise は signal が abort されたとき、もしくは SseFatalError が
93
+ * 発生したときに解決する。通常運用では永久ループのため await は daemon の
94
+ * シャットダウンと組み合わせて使う。
95
+ */
96
+ export const runSseClient = async (options) => {
97
+ const initialBackoff = options.initialBackoffMs ?? DEFAULT_INITIAL_BACKOFF_MS;
98
+ const maxBackoff = options.maxBackoffMs ?? DEFAULT_MAX_BACKOFF_MS;
99
+ let backoff = initialBackoff;
100
+ while (!options.signal?.aborted) {
101
+ try {
102
+ await connectAndStream(options);
103
+ // 正常クローズ (サーバ側切断 / EOF) は即再接続する。
104
+ backoff = initialBackoff;
105
+ }
106
+ catch (err) {
107
+ if (options.signal?.aborted)
108
+ return;
109
+ if (err instanceof SseFatalError && err.status === 401) {
110
+ // トークン期限切れなどは上位 daemon ループで refresh されるため
111
+ // ここでは終了して上位に任せる。
112
+ throw err;
113
+ }
114
+ const message = err instanceof Error ? err.message : String(err);
115
+ process.stderr.write(`lnar daemon: SSE disconnected (${message}); retry in ${Math.round(backoff / 1000)}s\n`);
116
+ await sleep(backoff, options.signal);
117
+ backoff = Math.min(backoff * 2, maxBackoff);
118
+ }
119
+ }
120
+ };
121
+ const sleep = (ms, signal) => new Promise((resolve) => {
122
+ if (signal?.aborted)
123
+ return resolve();
124
+ const timer = setTimeout(() => {
125
+ signal?.removeEventListener('abort', onAbort);
126
+ resolve();
127
+ }, ms);
128
+ const onAbort = () => {
129
+ clearTimeout(timer);
130
+ resolve();
131
+ };
132
+ signal?.addEventListener('abort', onAbort, { once: true });
133
+ });
134
+ const connectAndStream = async (options) => {
135
+ const response = await fetch(options.url, {
136
+ method: 'GET',
137
+ headers: {
138
+ Authorization: `Bearer ${options.token}`,
139
+ Accept: 'text/event-stream',
140
+ },
141
+ signal: options.signal,
142
+ });
143
+ if (!response.ok) {
144
+ const body = await response.text().catch(() => '');
145
+ if (response.status === 401 || response.status === 403) {
146
+ throw new SseFatalError(`SSE auth failed: ${response.status} ${body}`, response.status);
147
+ }
148
+ throw new Error(`SSE HTTP ${response.status}: ${body}`);
149
+ }
150
+ if (response.body == null) {
151
+ throw new Error('SSE response has no body');
152
+ }
153
+ if (options.onOpen) {
154
+ // open callback は parser 起動 *前* に走らせる。これにより SSE 接続中に
155
+ // 来たイベントよりも前に必ず 1 回の canonical fetch が動く。
156
+ await options.onOpen();
157
+ }
158
+ const decoder = new TextDecoder('utf-8');
159
+ const parser = new SseFrameParser();
160
+ const reader = response.body.getReader();
161
+ while (true) {
162
+ const { value, done } = await reader.read();
163
+ if (done)
164
+ return;
165
+ const text = decoder.decode(value, { stream: true });
166
+ const events = parser.feed(text);
167
+ for (const event of events) {
168
+ await options.onEvent(event);
169
+ }
170
+ }
171
+ };
172
+ // テスト用: パーサ単体をエクスポートする (private クラスに匹敵)。
173
+ export const _SseFrameParserForTest = SseFrameParser;
174
+ //# sourceMappingURL=sse-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../src/sse-client.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,7 +4,6 @@ export declare const AgentKind: z.ZodEnum<{
4
4
  codex: "codex";
5
5
  cursor: "cursor";
6
6
  gemini_cli: "gemini_cli";
7
- chatgpt: "chatgpt";
8
7
  }>;
9
8
  export type AgentKind = z.infer<typeof AgentKind>;
10
9
  export declare const McpTransport: z.ZodEnum<{
@@ -63,13 +62,30 @@ export declare const PluginEntry: z.ZodObject<{
63
62
  gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
64
63
  }, z.core.$strip>;
65
64
  export type PluginEntry = z.infer<typeof PluginEntry>;
65
+ export declare const SkillScope: z.ZodEnum<{
66
+ project: "project";
67
+ user: "user";
68
+ }>;
69
+ export type SkillScope = z.infer<typeof SkillScope>;
70
+ export declare const SkillEntry: z.ZodObject<{
71
+ name: z.ZodString;
72
+ description: z.ZodString;
73
+ scope: z.ZodEnum<{
74
+ project: "project";
75
+ user: "user";
76
+ }>;
77
+ projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
78
+ sourcePath: z.ZodString;
79
+ contentHash: z.ZodString;
80
+ body: z.ZodString;
81
+ }, z.core.$strip>;
82
+ export type SkillEntry = z.infer<typeof SkillEntry>;
66
83
  export declare const AgentSnapshot: z.ZodObject<{
67
84
  agentKind: z.ZodEnum<{
68
85
  claude_code: "claude_code";
69
86
  codex: "codex";
70
87
  cursor: "cursor";
71
88
  gemini_cli: "gemini_cli";
72
- chatgpt: "chatgpt";
73
89
  }>;
74
90
  agentVersion: z.ZodOptional<z.ZodString>;
75
91
  servers: z.ZodArray<z.ZodObject<{
@@ -107,10 +123,23 @@ export declare const AgentSnapshot: z.ZodObject<{
107
123
  lastUpdatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
108
124
  gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
109
125
  }, z.core.$strip>>>;
126
+ skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
127
+ name: z.ZodString;
128
+ description: z.ZodString;
129
+ scope: z.ZodEnum<{
130
+ project: "project";
131
+ user: "user";
132
+ }>;
133
+ projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
134
+ sourcePath: z.ZodString;
135
+ contentHash: z.ZodString;
136
+ body: z.ZodString;
137
+ }, z.core.$strip>>>;
110
138
  }, z.core.$strip>;
111
139
  export type AgentSnapshot = z.infer<typeof AgentSnapshot>;
112
140
  export declare const ScanResult: z.ZodObject<{
113
141
  hostname: z.ZodString;
142
+ machineId: z.ZodOptional<z.ZodString>;
114
143
  scannedAt: z.ZodString;
115
144
  agents: z.ZodArray<z.ZodObject<{
116
145
  agentKind: z.ZodEnum<{
@@ -118,7 +147,6 @@ export declare const ScanResult: z.ZodObject<{
118
147
  codex: "codex";
119
148
  cursor: "cursor";
120
149
  gemini_cli: "gemini_cli";
121
- chatgpt: "chatgpt";
122
150
  }>;
123
151
  agentVersion: z.ZodOptional<z.ZodString>;
124
152
  servers: z.ZodArray<z.ZodObject<{
@@ -156,6 +184,18 @@ export declare const ScanResult: z.ZodObject<{
156
184
  lastUpdatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
157
185
  gitCommitSha: z.ZodOptional<z.ZodNullable<z.ZodString>>;
158
186
  }, z.core.$strip>>>;
187
+ skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
188
+ name: z.ZodString;
189
+ description: z.ZodString;
190
+ scope: z.ZodEnum<{
191
+ project: "project";
192
+ user: "user";
193
+ }>;
194
+ projectPath: z.ZodOptional<z.ZodNullable<z.ZodString>>;
195
+ sourcePath: z.ZodString;
196
+ contentHash: z.ZodString;
197
+ body: z.ZodString;
198
+ }, z.core.$strip>>>;
159
199
  }, z.core.$strip>>;
160
200
  }, z.core.$strip>;
161
201
  export type ScanResult = z.infer<typeof ScanResult>;
package/dist/types.js CHANGED
@@ -3,8 +3,11 @@ import { z } from 'zod';
3
3
  // codex: Codex CLI (OpenAI)
4
4
  // cursor: Cursor IDE
5
5
  // gemini_cli: Google Gemini CLI (~/.gemini/settings.json)
6
- // chatgpt: ChatGPT (Desktop / connectors) — 設定の暗号化のため現状は placeholder
7
- export const AgentKind = z.enum(['claude_code', 'codex', 'cursor', 'gemini_cli', 'chatgpt']);
6
+ //
7
+ // chatgpt OS keychain で暗号化された設定にしかアクセスできず読み取り API
8
+ // 公開されていないため、現状サポート対象外。pending change として残しておくと
9
+ // AgentKind enum が広がるだけで実体が無いので、enum 自体から外す。
10
+ export const AgentKind = z.enum(['claude_code', 'codex', 'cursor', 'gemini_cli']);
8
11
  export const McpTransport = z.enum(['stdio', 'http', 'sse']);
9
12
  // global: マシン全体 (plugin / ~/.claude.json top-level)
10
13
  // project: .mcp.json (チーム共有 / repo にコミットされる)
@@ -38,15 +41,44 @@ export const PluginEntry = z.object({
38
41
  lastUpdatedAt: z.string().nullable().optional(),
39
42
  gitCommitSha: z.string().nullable().optional(),
40
43
  });
44
+ // user: ~/.claude/skills/<name>/SKILL.md (マシン共通、個人 skill)
45
+ // project: <projectDir>/.claude/skills/<name>/SKILL.md (repo にコミットされ、チームで共有)
46
+ //
47
+ // plugin 同梱の skill (~/.claude/plugins/.../skills/...) は plugin 自体の情報から派生で
48
+ // 分かるため、本 snapshot には含めない (二重送信を避ける)。
49
+ export const SkillScope = z.enum(['user', 'project']);
50
+ export const SkillEntry = z.object({
51
+ // SKILL.md の YAML frontmatter から取り出した `name`
52
+ name: z.string(),
53
+ // SKILL.md の YAML frontmatter から取り出した `description` (skill のトリガー条件説明)
54
+ description: z.string(),
55
+ scope: SkillScope,
56
+ // project scope の場合のみ、所属する project ディレクトリ
57
+ projectPath: z.string().nullable().optional(),
58
+ // SKILL.md の絶対パス
59
+ sourcePath: z.string(),
60
+ // SKILL.md 全体の SHA-256 (先頭 16 桁) — 内容変更の検知に使う
61
+ contentHash: z.string(),
62
+ // SKILL.md 本文 (frontmatter 含む全体)。dashboard で開いたとき内容を見せるため。
63
+ // 多くても数 KB なので毎スキャンで送ってよい (圧縮効くので)。
64
+ body: z.string(),
65
+ });
41
66
  export const AgentSnapshot = z.object({
42
67
  agentKind: AgentKind,
43
68
  agentVersion: z.string().optional(),
44
69
  servers: z.array(McpServerEntry),
45
70
  // Claude Code のみ意味があるので、他 agent_kind では未指定でよい (omit = 空)。
46
71
  plugins: z.array(PluginEntry).optional(),
72
+ // Claude Code のみ意味があるので、他 agent_kind では未指定でよい (omit = 空)。
73
+ skills: z.array(SkillEntry).optional(),
47
74
  });
48
75
  export const ScanResult = z.object({
76
+ // hostname は macOS のネットワーク状況により `xxx.local` ↔ `xxx.kkbnj1.kt.home.ne.jp`
77
+ // のように変動する。表示用に保持しつつ、agent 同一性の判定には machineId を使う。
49
78
  hostname: z.string(),
79
+ // ~/.config/lnar/machine.json に永続化される UUID。同一マシンを跨ぐスキャンを
80
+ // 1 agent に集約するためのキー。古い CLI 互換のため optional。
81
+ machineId: z.string().optional(),
50
82
  scannedAt: z.string(),
51
83
  agents: z.array(AgentSnapshot),
52
84
  });
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}