promptkaizen-agent 0.2.0 → 0.3.0

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 (176) hide show
  1. package/README.md +5 -1
  2. package/dist/backfill/run.d.ts +15 -0
  3. package/dist/backfill/run.d.ts.map +1 -0
  4. package/dist/backfill/run.js +33 -0
  5. package/dist/backfill/run.js.map +1 -0
  6. package/dist/backfill/scanner.d.ts +82 -0
  7. package/dist/backfill/scanner.d.ts.map +1 -0
  8. package/dist/backfill/scanner.js +271 -0
  9. package/dist/backfill/scanner.js.map +1 -0
  10. package/dist/cli/detect.d.ts +2 -0
  11. package/dist/cli/detect.d.ts.map +1 -0
  12. package/dist/cli/detect.js +40 -0
  13. package/dist/cli/detect.js.map +1 -0
  14. package/dist/cli/disable.d.ts +2 -0
  15. package/dist/cli/disable.d.ts.map +1 -0
  16. package/dist/cli/disable.js +44 -0
  17. package/dist/cli/disable.js.map +1 -0
  18. package/dist/cli/enable.d.ts +2 -0
  19. package/dist/cli/enable.d.ts.map +1 -0
  20. package/dist/cli/enable.js +105 -0
  21. package/dist/cli/enable.js.map +1 -0
  22. package/dist/cli/hook.d.ts +2 -0
  23. package/dist/cli/hook.d.ts.map +1 -0
  24. package/dist/cli/hook.js +406 -0
  25. package/dist/cli/hook.js.map +1 -0
  26. package/dist/cli/init.d.ts.map +1 -1
  27. package/dist/cli/init.js +70 -8
  28. package/dist/cli/init.js.map +1 -1
  29. package/dist/cli/install-hooks.d.ts +5 -0
  30. package/dist/cli/install-hooks.d.ts.map +1 -0
  31. package/dist/cli/install-hooks.js +132 -0
  32. package/dist/cli/install-hooks.js.map +1 -0
  33. package/dist/cli/install-task.d.ts +28 -0
  34. package/dist/cli/install-task.d.ts.map +1 -0
  35. package/dist/cli/install-task.js +119 -0
  36. package/dist/cli/install-task.js.map +1 -0
  37. package/dist/cli/mcp.d.ts +2 -0
  38. package/dist/cli/mcp.d.ts.map +1 -0
  39. package/dist/cli/mcp.js +148 -0
  40. package/dist/cli/mcp.js.map +1 -0
  41. package/dist/cli/metrics.d.ts +2 -0
  42. package/dist/cli/metrics.d.ts.map +1 -0
  43. package/dist/cli/metrics.js +103 -0
  44. package/dist/cli/metrics.js.map +1 -0
  45. package/dist/cli/report.d.ts +2 -0
  46. package/dist/cli/report.d.ts.map +1 -0
  47. package/dist/cli/report.js +211 -0
  48. package/dist/cli/report.js.map +1 -0
  49. package/dist/cli/scan.d.ts +2 -0
  50. package/dist/cli/scan.d.ts.map +1 -0
  51. package/dist/cli/scan.js +171 -0
  52. package/dist/cli/scan.js.map +1 -0
  53. package/dist/cli/start.d.ts.map +1 -1
  54. package/dist/cli/start.js +70 -17
  55. package/dist/cli/start.js.map +1 -1
  56. package/dist/cli/status.d.ts.map +1 -1
  57. package/dist/cli/status.js +82 -18
  58. package/dist/cli/status.js.map +1 -1
  59. package/dist/cli/uninstall-task.d.ts +8 -0
  60. package/dist/cli/uninstall-task.d.ts.map +1 -0
  61. package/dist/cli/uninstall-task.js +44 -0
  62. package/dist/cli/uninstall-task.js.map +1 -0
  63. package/dist/config.d.ts +172 -6
  64. package/dist/config.d.ts.map +1 -1
  65. package/dist/config.js +114 -2
  66. package/dist/config.js.map +1 -1
  67. package/dist/console-safe.d.ts +21 -0
  68. package/dist/console-safe.d.ts.map +1 -0
  69. package/dist/console-safe.js +71 -0
  70. package/dist/console-safe.js.map +1 -0
  71. package/dist/detection-secret.d.ts.map +1 -1
  72. package/dist/detection-secret.js +12 -0
  73. package/dist/detection-secret.js.map +1 -1
  74. package/dist/env-detect.d.ts +44 -0
  75. package/dist/env-detect.d.ts.map +1 -0
  76. package/dist/env-detect.js +151 -0
  77. package/dist/env-detect.js.map +1 -0
  78. package/dist/exec/executor.d.ts +42 -0
  79. package/dist/exec/executor.d.ts.map +1 -0
  80. package/dist/exec/executor.js +135 -0
  81. package/dist/exec/executor.js.map +1 -0
  82. package/dist/exec/pk-execute.d.ts +30 -0
  83. package/dist/exec/pk-execute.d.ts.map +1 -0
  84. package/dist/exec/pk-execute.js +174 -0
  85. package/dist/exec/pk-execute.js.map +1 -0
  86. package/dist/exec/policy-fetcher.d.ts +9 -0
  87. package/dist/exec/policy-fetcher.d.ts.map +1 -0
  88. package/dist/exec/policy-fetcher.js +46 -0
  89. package/dist/exec/policy-fetcher.js.map +1 -0
  90. package/dist/exec/policy.d.ts +32 -0
  91. package/dist/exec/policy.d.ts.map +1 -0
  92. package/dist/exec/policy.js +88 -0
  93. package/dist/exec/policy.js.map +1 -0
  94. package/dist/hooks/block-store.d.ts +14 -0
  95. package/dist/hooks/block-store.d.ts.map +1 -0
  96. package/dist/hooks/block-store.js +26 -0
  97. package/dist/hooks/block-store.js.map +1 -0
  98. package/dist/hooks/claude-hook.d.ts +55 -0
  99. package/dist/hooks/claude-hook.d.ts.map +1 -0
  100. package/dist/hooks/claude-hook.js +122 -0
  101. package/dist/hooks/claude-hook.js.map +1 -0
  102. package/dist/hooks/continuity.d.ts +48 -0
  103. package/dist/hooks/continuity.d.ts.map +1 -0
  104. package/dist/hooks/continuity.js +92 -0
  105. package/dist/hooks/continuity.js.map +1 -0
  106. package/dist/hooks/observation.d.ts +27 -0
  107. package/dist/hooks/observation.d.ts.map +1 -0
  108. package/dist/hooks/observation.js +0 -0
  109. package/dist/hooks/observation.js.map +1 -0
  110. package/dist/hooks/platforms.d.ts +24 -0
  111. package/dist/hooks/platforms.d.ts.map +1 -0
  112. package/dist/hooks/platforms.js +57 -0
  113. package/dist/hooks/platforms.js.map +1 -0
  114. package/dist/hooks/read-cache.d.ts +71 -0
  115. package/dist/hooks/read-cache.d.ts.map +1 -0
  116. package/dist/hooks/read-cache.js +166 -0
  117. package/dist/hooks/read-cache.js.map +1 -0
  118. package/dist/hooks/reduction.d.ts +78 -0
  119. package/dist/hooks/reduction.d.ts.map +1 -0
  120. package/dist/hooks/reduction.js +111 -0
  121. package/dist/hooks/reduction.js.map +1 -0
  122. package/dist/hooks/settings-merge.d.ts +32 -0
  123. package/dist/hooks/settings-merge.d.ts.map +1 -0
  124. package/dist/hooks/settings-merge.js +74 -0
  125. package/dist/hooks/settings-merge.js.map +1 -0
  126. package/dist/hooks/snapshot.d.ts +37 -0
  127. package/dist/hooks/snapshot.d.ts.map +1 -0
  128. package/dist/hooks/snapshot.js +180 -0
  129. package/dist/hooks/snapshot.js.map +1 -0
  130. package/dist/index.js +51 -0
  131. package/dist/index.js.map +1 -1
  132. package/dist/mcp/server.d.ts +118 -0
  133. package/dist/mcp/server.d.ts.map +1 -0
  134. package/dist/mcp/server.js +240 -0
  135. package/dist/mcp/server.js.map +1 -0
  136. package/dist/onboarding-report.d.ts +66 -0
  137. package/dist/onboarding-report.d.ts.map +1 -0
  138. package/dist/onboarding-report.js +152 -0
  139. package/dist/onboarding-report.js.map +1 -0
  140. package/dist/onboarding.d.ts +55 -0
  141. package/dist/onboarding.d.ts.map +1 -0
  142. package/dist/onboarding.js +98 -0
  143. package/dist/onboarding.js.map +1 -0
  144. package/dist/pii-masker.d.ts +7 -0
  145. package/dist/pii-masker.d.ts.map +1 -1
  146. package/dist/pii-masker.js +27 -51
  147. package/dist/pii-masker.js.map +1 -1
  148. package/dist/privacy.d.ts +13 -0
  149. package/dist/privacy.d.ts.map +1 -0
  150. package/dist/privacy.js +67 -0
  151. package/dist/privacy.js.map +1 -0
  152. package/dist/residency.d.ts +21 -0
  153. package/dist/residency.d.ts.map +1 -0
  154. package/dist/residency.js +68 -0
  155. package/dist/residency.js.map +1 -0
  156. package/dist/secret-detector.d.ts +19 -0
  157. package/dist/secret-detector.d.ts.map +1 -1
  158. package/dist/secret-detector.js +116 -0
  159. package/dist/secret-detector.js.map +1 -1
  160. package/dist/store/local-store.d.ts +167 -0
  161. package/dist/store/local-store.d.ts.map +1 -0
  162. package/dist/store/local-store.js +538 -0
  163. package/dist/store/local-store.js.map +1 -0
  164. package/dist/store/schema.d.ts +38 -0
  165. package/dist/store/schema.d.ts.map +1 -0
  166. package/dist/store/schema.js +189 -0
  167. package/dist/store/schema.js.map +1 -0
  168. package/dist/types.d.ts +13 -2
  169. package/dist/types.d.ts.map +1 -1
  170. package/dist/version.d.ts +1 -1
  171. package/dist/version.js +1 -1
  172. package/dist/watcher.d.ts +6 -0
  173. package/dist/watcher.d.ts.map +1 -1
  174. package/dist/watcher.js +13 -2
  175. package/dist/watcher.js.map +1 -1
  176. package/package.json +4 -2
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_RECALL_CHARS = exports.PK_RECALL_TOOL = exports.PK_EXECUTE_TOOL = exports.PK_FETCH_TOOL = exports.MAX_FULL_TEXT_CHARS = exports.SERVER_INFO = exports.PROTOCOL_VERSION = void 0;
4
+ exports.runPkFetch = runPkFetch;
5
+ exports.runPkRecall = runPkRecall;
6
+ exports.dispatchRpc = dispatchRpc;
7
+ const version_1 = require("../version");
8
+ // =============================================
9
+ // ローカル MCP サーバー — pk_fetch (#93 R1) / pk_execute (#94 R2)
10
+ // =============================================
11
+ //
12
+ // stdio transport (1 行 1 JSON-RPC メッセージ) の最小実装で、
13
+ // functions/src/mcp/protocol.ts (リモート MCP #71) と同じ部分集合を話す:
14
+ // initialize / notifications/* / ping / tools/list / tools/call
15
+ // MCP SDK は導入しない (#71 と同方針: 依存を増やさずステートレス部分集合で足りる)。
16
+ //
17
+ // - pk_fetch: R1 が退避したツール出力 (tool_output_refs) の取得 (マスク済み本文のみ)
18
+ // - pk_execute: サンドボックス実行 (R2)。生データをコンテキストに入れず結果だけ返す
19
+ //
20
+ // セットアップ: docs/local-mcp-setup.md (claude mcp add / Codex config.toml)
21
+ exports.PROTOCOL_VERSION = '2024-11-05';
22
+ exports.SERVER_INFO = { name: 'promptkaizen-local', version: version_1.AGENT_VERSION };
23
+ /** 全文取得時の上限文字数。超過分は切り詰めて query 絞り込みを促す。 */
24
+ exports.MAX_FULL_TEXT_CHARS = 80_000;
25
+ const ERR_INVALID_REQUEST = -32600;
26
+ const ERR_METHOD_NOT_FOUND = -32601;
27
+ const ERR_INVALID_PARAMS = -32602;
28
+ const ERR_INTERNAL = -32603;
29
+ function ok(id, result) {
30
+ return { jsonrpc: '2.0', id: id ?? null, result };
31
+ }
32
+ function err(id, code, message) {
33
+ return { jsonrpc: '2.0', id: id ?? null, error: { code, message } };
34
+ }
35
+ exports.PK_FETCH_TOOL = {
36
+ name: 'pk_fetch',
37
+ description: 'PromptKaizen が退避したツール出力を参照IDで取得する。' +
38
+ 'query を指定すると該当行と前後の文脈だけを返す (大きな出力にはこちらを推奨)。' +
39
+ 'ツール結果に「ref_id: pk-...」と表示されている場合に使用する。',
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ ref_id: {
44
+ type: 'string',
45
+ description: '退避時にツール結果へ埋め込まれた参照ID (例: pk-1a2b3c4d5e6f)',
46
+ },
47
+ query: {
48
+ type: 'string',
49
+ description: '絞り込み検索語 (省略時は全文を返す)',
50
+ },
51
+ },
52
+ required: ['ref_id'],
53
+ },
54
+ };
55
+ /** pk_fetch の本体。store は呼び出しごとに開いた LocalStore を渡す。 */
56
+ function runPkFetch(store, args) {
57
+ const refId = typeof args.ref_id === 'string' ? args.ref_id.trim() : '';
58
+ const query = typeof args.query === 'string' ? args.query.trim() : '';
59
+ if (!refId) {
60
+ return { content: [{ type: 'text', text: 'ref_id は必須です (例: pk-1a2b3c4d5e6f)' }], isError: true };
61
+ }
62
+ if (!query) {
63
+ const ref = store.getToolOutputRef(refId);
64
+ if (!ref) {
65
+ return {
66
+ content: [{ type: 'text', text: `ref_id ${refId} は見つかりません (期限切れ・別端末の可能性)` }],
67
+ isError: true,
68
+ };
69
+ }
70
+ let text = ref.body;
71
+ if (text.length > exports.MAX_FULL_TEXT_CHARS) {
72
+ text =
73
+ text.slice(0, exports.MAX_FULL_TEXT_CHARS) +
74
+ `\n--- 出力が大きいため ${exports.MAX_FULL_TEXT_CHARS.toLocaleString()} 文字で切り詰めました。` +
75
+ `query 引数で絞り込んでください ---`;
76
+ }
77
+ return { content: [{ type: 'text', text }] };
78
+ }
79
+ const result = store.queryToolOutputRef(refId, query);
80
+ if (!result) {
81
+ return {
82
+ content: [{ type: 'text', text: `ref_id ${refId} は見つかりません (期限切れ・別端末の可能性)` }],
83
+ isError: true,
84
+ };
85
+ }
86
+ if (result.totalMatches === 0 || result.excerpts.length === 0) {
87
+ return { content: [{ type: 'text', text: `"${query}" に一致する行はありませんでした` }] };
88
+ }
89
+ const header = `"${query}" に ${result.totalMatches} 行が一致 (先頭 ${result.excerpts.length} 件を行番号付きで表示):\n\n`;
90
+ return { content: [{ type: 'text', text: header + result.excerpts.join('\n---\n') }] };
91
+ }
92
+ exports.PK_EXECUTE_TOOL = {
93
+ name: 'pk_execute',
94
+ description: 'コードをローカルのサンドボックス制約付き (タイムアウト・プロジェクトルート固定・' +
95
+ '秘匿環境変数の遮断・組織ポリシー判定) で実行し stdout を返す。' +
96
+ '大きなファイル・ログ・APIレスポンスを処理する際は、cat 等で全文をコンテキストに' +
97
+ '読み込む代わりにこのツールでコードに処理させ、結果だけを受け取ること。',
98
+ inputSchema: {
99
+ type: 'object',
100
+ properties: {
101
+ language: {
102
+ type: 'string',
103
+ enum: ['bash', 'node', 'python'],
104
+ description: '実行言語',
105
+ },
106
+ code: { type: 'string', description: '実行するコード' },
107
+ timeout: {
108
+ type: 'number',
109
+ description: 'タイムアウト秒 (省略時 30s、最大 300s)',
110
+ },
111
+ },
112
+ required: ['language', 'code'],
113
+ },
114
+ };
115
+ exports.PK_RECALL_TOOL = {
116
+ name: 'pk_recall',
117
+ description: '過去セッションの文脈 (会話・作業状態スナップショット) をローカル全文検索して必要な断片だけ返す。' +
118
+ 'コンパクトやセッション再開で過去の作業内容が不明なとき、ファイルの再読込や再探索を行う前に' +
119
+ 'まずこのツールで検索すること。日本語クエリ対応 (3 文字以上推奨)。',
120
+ inputSchema: {
121
+ type: 'object',
122
+ properties: {
123
+ query: { type: 'string', description: '検索語 (日本語可)' },
124
+ scope: {
125
+ type: 'string',
126
+ enum: ['current_session', 'project', 'all'],
127
+ description: '検索範囲 (省略時 project = このプロジェクトの全セッション)',
128
+ },
129
+ },
130
+ required: ['query'],
131
+ },
132
+ };
133
+ /** pk_recall の応答上限 (復元目的の検索が逆にコンテキストを食わないように)。 */
134
+ exports.MAX_RECALL_CHARS = 8_000;
135
+ /** pk_recall 本体。マスク済みデータ (events / snapshots) のみが対象。 */
136
+ function runPkRecall(store, args, projectRoot) {
137
+ const query = typeof args.query === 'string' ? args.query.trim() : '';
138
+ if (!query) {
139
+ return { content: [{ type: 'text', text: 'query は必須です' }], isError: true };
140
+ }
141
+ const scope = typeof args.scope === 'string' ? args.scope : 'project';
142
+ let sessionId;
143
+ let cwd;
144
+ if (scope === 'current_session') {
145
+ const sid = store.latestSessionIdForCwd(projectRoot);
146
+ if (!sid) {
147
+ return {
148
+ content: [{ type: 'text', text: 'このプロジェクトのセッションがまだ記録されていません (scope を project / all にして再試行できます)' }],
149
+ };
150
+ }
151
+ sessionId = sid;
152
+ }
153
+ else if (scope === 'project') {
154
+ cwd = projectRoot;
155
+ } // 'all' は無条件
156
+ const snapshots = store.searchSnapshots(query, { limit: 3, cwd });
157
+ const events = store.search(query, { limit: 10, sessionId, cwd });
158
+ if (snapshots.length === 0 && events.length === 0) {
159
+ return {
160
+ content: [
161
+ { type: 'text', text: `"${query}" に一致する過去文脈は見つかりませんでした (scope: ${scope})` },
162
+ ],
163
+ };
164
+ }
165
+ const parts = [];
166
+ if (snapshots.length > 0) {
167
+ parts.push('--- 作業状態スナップショット ---\n' +
168
+ snapshots
169
+ .map((s) => `[${s.createdAt} / session ${s.sessionId?.slice(0, 8) ?? '?'}]\n${s.summary}`)
170
+ .join('\n---\n'));
171
+ }
172
+ if (events.length > 0) {
173
+ parts.push('--- 会話・イベント (新しい順) ---\n' +
174
+ events
175
+ .map((e) => `[${e.ts ?? e.recordedAt} / ${e.type ?? '?'} / session ${e.sessionId?.slice(0, 8) ?? '?'}]\n` +
176
+ (e.body ?? '').slice(0, 600))
177
+ .join('\n---\n'));
178
+ }
179
+ let text = parts.join('\n\n');
180
+ if (text.length > exports.MAX_RECALL_CHARS) {
181
+ text = text.slice(0, exports.MAX_RECALL_CHARS) + '\n--- 上限により切り詰めました。query を絞ってください ---';
182
+ }
183
+ return { content: [{ type: 'text', text }] };
184
+ }
185
+ /** 1 件の JSON-RPC を処理する。通知 (id 無し) は null (応答しない)。 */
186
+ async function dispatchRpc(req, deps) {
187
+ if (!req || req.jsonrpc !== '2.0' || typeof req.method !== 'string') {
188
+ return err(req?.id ?? null, ERR_INVALID_REQUEST, 'Invalid JSON-RPC request');
189
+ }
190
+ const isNotification = req.id === undefined || req.id === null;
191
+ switch (req.method) {
192
+ case 'initialize':
193
+ return ok(req.id, {
194
+ protocolVersion: exports.PROTOCOL_VERSION,
195
+ capabilities: { tools: { listChanged: false } },
196
+ serverInfo: exports.SERVER_INFO,
197
+ });
198
+ case 'notifications/initialized':
199
+ case 'notifications/cancelled':
200
+ return null;
201
+ case 'ping':
202
+ return ok(req.id, {});
203
+ case 'tools/list': {
204
+ const tools = [exports.PK_FETCH_TOOL, exports.PK_RECALL_TOOL];
205
+ if (deps.pkExecute)
206
+ tools.splice(1, 0, exports.PK_EXECUTE_TOOL);
207
+ return ok(req.id, { tools });
208
+ }
209
+ case 'tools/call': {
210
+ if (isNotification)
211
+ return null;
212
+ const name = req.params?.name;
213
+ const args = (req.params?.arguments ?? {});
214
+ if (typeof name !== 'string') {
215
+ return err(req.id, ERR_INVALID_PARAMS, 'tools/call requires params.name');
216
+ }
217
+ try {
218
+ if (name === exports.PK_FETCH_TOOL.name) {
219
+ return ok(req.id, deps.withStore((store) => runPkFetch(store, args)));
220
+ }
221
+ if (name === exports.PK_RECALL_TOOL.name) {
222
+ const root = deps.projectRoot ?? process.cwd();
223
+ return ok(req.id, deps.withStore((store) => runPkRecall(store, args, root)));
224
+ }
225
+ if (name === exports.PK_EXECUTE_TOOL.name && deps.pkExecute) {
226
+ return ok(req.id, await deps.pkExecute(args));
227
+ }
228
+ return err(req.id, ERR_METHOD_NOT_FOUND, `Unknown tool: ${name}`);
229
+ }
230
+ catch (e) {
231
+ return err(req.id, ERR_INTERNAL, e.message);
232
+ }
233
+ }
234
+ default:
235
+ if (isNotification)
236
+ return null;
237
+ return err(req.id, ERR_METHOD_NOT_FOUND, `Method not found: ${req.method}`);
238
+ }
239
+ }
240
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { EnvironmentDetection } from './env-detect';
2
+ import type { ScanSummary } from './backfill/scanner';
3
+ export interface OnboardingReport {
4
+ /** 実際にスキャンしたセッション数 (≒ filesScanned。1 jsonl = 1 セッション)。 */
5
+ sessionsAnalyzed: number;
6
+ /** 検出された履歴の総セッション数 (env-detect)。解析が頭打ちでも母数を示す。 */
7
+ sessionsTotal: number;
8
+ entriesScanned: number;
9
+ /** 🔴 秘密情報 (category=secret) の検知件数。 */
10
+ secret: number;
11
+ /** 🟡 機微情報 (category=pii / pii_jp) の検知件数。 */
12
+ sensitive: number;
13
+ /** 🟢 ポリシー (category=custom: 組織辞書) の検知件数。 */
14
+ policy: number;
15
+ /** 重大度別 (= ScanSummary.counts)。 */
16
+ severity: {
17
+ high: number;
18
+ medium: number;
19
+ low: number;
20
+ };
21
+ /** 秘密情報の露出があったセッション数 (filepath 単位)。 */
22
+ secretSessions: number;
23
+ /** セキュリティスコア 0–100 = 秘密露出のないセッション割合。 */
24
+ securityScore: number;
25
+ timedOut: boolean;
26
+ scanElapsedMs: number;
27
+ /** 'online' = クラウド連携あり (ダッシュボード可)。'local' = 完全ローカル。 */
28
+ mode: 'online' | 'local';
29
+ /** 詳細ダッシュボード URL (online のみ。local は null)。 */
30
+ dashboardUrl: string | null;
31
+ }
32
+ /** cloud functions エンドポイントからダッシュボード URL を導出する。online でなければ null。 */
33
+ export declare function resolveDashboardUrl(apiEndpoint: string | undefined): string | null;
34
+ /**
35
+ * バックフィル結果 + 環境検出から初回レポートを組み立てる。
36
+ * セキュリティスコア = 秘密情報の露出がないセッションの割合 (0 件解析時は 100)。
37
+ */
38
+ export declare function buildOnboardingReport(summary: ScanSummary, env: EnvironmentDetection, opts: {
39
+ apiEndpoint?: string;
40
+ }): OnboardingReport;
41
+ export interface PostureVerdict {
42
+ level: 'clean' | 'attention' | 'action';
43
+ headline: string;
44
+ message: string;
45
+ }
46
+ /** レポートからポスチャー判定を導く。検出 0 件は「健全」を価値として提示する。 */
47
+ export declare function postureVerdict(r: Pick<OnboardingReport, 'secret' | 'sensitive' | 'policy' | 'sessionsAnalyzed'>): PostureVerdict;
48
+ /** ポスチャーに応じた推奨アクション (実行可能な次の一手)。 */
49
+ export declare function recommendedActions(r: Pick<OnboardingReport, 'secret' | 'sensitive' | 'policy'>, platform?: NodeJS.Platform): string[];
50
+ export interface DemoHit {
51
+ severity: 'high';
52
+ sessionLabel: string;
53
+ when: string;
54
+ ruleId: string;
55
+ maskedPreview: string;
56
+ }
57
+ /** デモ用のダミーヒット (マスク済みプレビューのみ。実在の値ではない)。 */
58
+ export declare const DEMO_HIT: DemoHit;
59
+ /**
60
+ * デモ用の代表的レポートを組み立てる (実スキャンしない)。
61
+ * 検知が「どう見えるか」を体感させるため、秘密 1 件を含む代表値を返す。
62
+ */
63
+ export declare function buildDemoReport(opts?: {
64
+ apiEndpoint?: string;
65
+ }): OnboardingReport;
66
+ //# sourceMappingURL=onboarding-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-report.d.ts","sourceRoot":"","sources":["../src/onboarding-report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAUrD,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,gBAAgB,EAAE,MAAM,CAAA;IACxB,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,mCAAmC;IACnC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACvD,uCAAuC;IACvC,cAAc,EAAE,MAAM,CAAA;IACtB,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,uDAAuD;IACvD,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;IACxB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAelF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,oBAAoB,EACzB,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,gBAAgB,CA2ClB;AASD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAA;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAC5B,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,kBAAkB,CAAC,GAChF,cAAc,CAsBhB;AAED,oCAAoC;AACpC,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC,EAC5D,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,EAAE,CAkBV;AAMD,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,0CAA0C;AAC1C,eAAO,MAAM,QAAQ,EAAE,OAMtB,CAAA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,gBAAgB,CAmBrF"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEMO_HIT = void 0;
4
+ exports.resolveDashboardUrl = resolveDashboardUrl;
5
+ exports.buildOnboardingReport = buildOnboardingReport;
6
+ exports.postureVerdict = postureVerdict;
7
+ exports.recommendedActions = recommendedActions;
8
+ exports.buildDemoReport = buildDemoReport;
9
+ /** cloud functions エンドポイントからダッシュボード URL を導出する。online でなければ null。 */
10
+ function resolveDashboardUrl(apiEndpoint) {
11
+ if (!apiEndpoint)
12
+ return null;
13
+ let host;
14
+ try {
15
+ host = new URL(apiEndpoint).host;
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ // 例: asia-northeast1-promptkaizen-stg.cloudfunctions.net → project = promptkaizen-stg
21
+ const m = host.match(/^[a-z0-9-]+-(promptkaizen[a-z0-9-]*)\.cloudfunctions\.net$/i);
22
+ const project = m?.[1];
23
+ if (!project)
24
+ return null;
25
+ // prod は独自ドメイン、それ以外は <project>.web.app。
26
+ if (project === 'promptkaizen-prod')
27
+ return 'https://promptkaizen.ai';
28
+ return `https://${project}.web.app`;
29
+ }
30
+ /**
31
+ * バックフィル結果 + 環境検出から初回レポートを組み立てる。
32
+ * セキュリティスコア = 秘密情報の露出がないセッションの割合 (0 件解析時は 100)。
33
+ */
34
+ function buildOnboardingReport(summary, env, opts) {
35
+ let secret = 0;
36
+ let sensitive = 0;
37
+ let policy = 0;
38
+ const secretSessionKeys = new Set();
39
+ for (const hit of summary.hits) {
40
+ let hasSecret = false;
41
+ for (const d of hit.detections) {
42
+ if (d.category === 'secret') {
43
+ secret += d.count;
44
+ hasSecret = true;
45
+ }
46
+ else if (d.category === 'pii' || d.category === 'pii_jp') {
47
+ sensitive += d.count;
48
+ }
49
+ else if (d.category === 'custom') {
50
+ policy += d.count;
51
+ }
52
+ }
53
+ if (hasSecret)
54
+ secretSessionKeys.add(hit.filepath);
55
+ }
56
+ const sessionsAnalyzed = summary.filesScanned;
57
+ const secretSessions = secretSessionKeys.size;
58
+ const securityScore = sessionsAnalyzed > 0
59
+ ? Math.round(100 * (1 - secretSessions / sessionsAnalyzed))
60
+ : 100;
61
+ const dashboardUrl = resolveDashboardUrl(opts.apiEndpoint);
62
+ return {
63
+ sessionsAnalyzed,
64
+ sessionsTotal: env.tools.reduce((n, t) => n + t.sessions, 0),
65
+ entriesScanned: summary.entriesScanned,
66
+ secret,
67
+ sensitive,
68
+ policy,
69
+ severity: summary.counts,
70
+ secretSessions,
71
+ securityScore,
72
+ timedOut: summary.timedOut,
73
+ scanElapsedMs: summary.elapsedMs,
74
+ mode: dashboardUrl ? 'online' : 'local',
75
+ dashboardUrl,
76
+ };
77
+ }
78
+ /** レポートからポスチャー判定を導く。検出 0 件は「健全」を価値として提示する。 */
79
+ function postureVerdict(r) {
80
+ if (r.secret > 0) {
81
+ return {
82
+ level: 'action',
83
+ headline: '🔴 要対応 — 秘密情報の露出が見つかりました',
84
+ message: '下記の推奨アクションで露出した秘密情報を無効化し、再発を防いでください。',
85
+ };
86
+ }
87
+ if (r.sensitive > 0 || r.policy > 0) {
88
+ return {
89
+ level: 'attention',
90
+ headline: '🟡 確認推奨 — 個人情報 / 組織ルール該当があります',
91
+ message: '露出はマスク済みで保存・送信されています。取り扱い範囲を確認してください。',
92
+ };
93
+ }
94
+ return {
95
+ level: 'clean',
96
+ headline: '✅ 異常なし(健全)',
97
+ message: `${r.sessionsAnalyzed.toLocaleString()} セッションを解析し、秘密情報・個人情報の露出は見つかりませんでした。` +
98
+ '「漏れていない」ことを確認できたこと自体が、ガバナンスの確かな成果です。',
99
+ };
100
+ }
101
+ /** ポスチャーに応じた推奨アクション (実行可能な次の一手)。 */
102
+ function recommendedActions(r, platform = process.platform) {
103
+ const out = [];
104
+ if (r.secret > 0) {
105
+ out.push('🔴 露出した秘密情報はローテーション(再発行)してください。今後は環境変数 / シークレットマネージャ経由に。');
106
+ out.push(' `promptkaizen-agent install-hooks` で、秘密情報を含むツール実行を事前ブロックできます。');
107
+ }
108
+ if (r.sensitive > 0) {
109
+ out.push('🟡 個人情報・PII は保存・送信前にマスク済みです。共有範囲・保持方針を確認してください。');
110
+ }
111
+ if (r.policy > 0) {
112
+ out.push('🟢 組織ルール該当があります。ポリシー設定(ダッシュボード)で内容を確認してください。');
113
+ }
114
+ if (r.secret === 0 && r.sensitive === 0 && r.policy === 0) {
115
+ const installCmd = platform === 'linux' ? 'install-systemd' : platform === 'win32' ? 'install-task' : 'install-launchd';
116
+ out.push(`✅ 常駐監視を有効化すると、今後の貼り付けもリアルタイムで守れます: promptkaizen-agent ${installCmd}`);
117
+ }
118
+ return out;
119
+ }
120
+ /** デモ用のダミーヒット (マスク済みプレビューのみ。実在の値ではない)。 */
121
+ exports.DEMO_HIT = {
122
+ severity: 'high',
123
+ sessionLabel: 'my-api-service · 3f9c1a2b',
124
+ when: '2026-06-10 14:23',
125
+ ruleId: 'anthropic_key',
126
+ maskedPreview: 'sk-a…Yx',
127
+ };
128
+ /**
129
+ * デモ用の代表的レポートを組み立てる (実スキャンしない)。
130
+ * 検知が「どう見えるか」を体感させるため、秘密 1 件を含む代表値を返す。
131
+ */
132
+ function buildDemoReport(opts = {}) {
133
+ const sessionsAnalyzed = 12;
134
+ const secretSessions = 1;
135
+ const dashboardUrl = resolveDashboardUrl(opts.apiEndpoint);
136
+ return {
137
+ sessionsAnalyzed,
138
+ sessionsTotal: sessionsAnalyzed,
139
+ entriesScanned: 1843,
140
+ secret: 1,
141
+ sensitive: 3,
142
+ policy: 0,
143
+ severity: { high: 1, medium: 1, low: 2 },
144
+ secretSessions,
145
+ securityScore: Math.round(100 * (1 - secretSessions / sessionsAnalyzed)),
146
+ timedOut: false,
147
+ scanElapsedMs: 3200,
148
+ mode: dashboardUrl ? 'online' : 'local',
149
+ dashboardUrl,
150
+ };
151
+ }
152
+ //# sourceMappingURL=onboarding-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-report.js","sourceRoot":"","sources":["../src/onboarding-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export declare const DEFAULT_ONBOARDING_PATH: string;
2
+ /** オンボーディング・ファネルのステージ (順序が離脱分析の軸)。 */
3
+ export declare const ONBOARDING_STAGES: readonly ["init", "detect", "scan", "report", "enable"];
4
+ export type OnboardingStage = (typeof ONBOARDING_STAGES)[number];
5
+ /** 目標値 (#102 の PR 配信ゲート)。 */
6
+ export declare const TTV_TARGET_MS = 120000;
7
+ export declare const COMPLETION_TARGET_RATE = 0.8;
8
+ /** レポート到達時に残す指標スナップショット (本文・生値は持たない)。 */
9
+ export interface OnboardingReportSnapshot {
10
+ completedAt: string;
11
+ /** init からの経過 (ms)。init 起点が無ければ null。 */
12
+ ttvMs: number | null;
13
+ securityScore: number;
14
+ sessionsAnalyzed: number;
15
+ secret: number;
16
+ sensitive: number;
17
+ policy: number;
18
+ mode: 'online' | 'local';
19
+ }
20
+ interface StageRecord {
21
+ firstAt: string;
22
+ lastAt: string;
23
+ count: number;
24
+ }
25
+ export interface OnboardingState {
26
+ /** 現在の試行の init 開始時刻 (TTV 起点)。 */
27
+ startedAt: string | null;
28
+ /** 到達したステージごとの記録。 */
29
+ stages: Partial<Record<OnboardingStage, StageRecord>>;
30
+ /** 最新のレポート到達スナップショット (完走)。 */
31
+ report: OnboardingReportSnapshot | null;
32
+ agentVersion: string | null;
33
+ updatedAt: string;
34
+ }
35
+ export interface RecordStageOptions {
36
+ agentVersion?: string;
37
+ /** stage==='report' のとき残す指標 (ttvMs/completedAt はここで計算・付与)。 */
38
+ report?: Omit<OnboardingReportSnapshot, 'completedAt' | 'ttvMs'>;
39
+ /** テスト用の時計注入。 */
40
+ now?: () => Date;
41
+ }
42
+ /**
43
+ * ファネルのステージ到達を記録する (best-effort。失敗しても本処理は妨げない)。
44
+ * - init : 新しい試行の起点。startedAt を now に設定し report をクリアする。
45
+ * - report : 指標スナップショットを残し、ttvMs = now - startedAt を計算する。
46
+ */
47
+ export declare function recordStage(stage: OnboardingStage, opts?: RecordStageOptions, filePath?: string): Promise<void>;
48
+ /** 計測ファイルを読む。無ければ null。 */
49
+ export declare function readOnboardingState(filePath?: string): Promise<OnboardingState | null>;
50
+ /** TTV (ms): レポート到達スナップショットに記録済みの値。未到達なら null。 */
51
+ export declare function computeTtvMs(state: OnboardingState | null): number | null;
52
+ /** このインストールがレポートに到達した (完走した) か。 */
53
+ export declare function isCompleted(state: OnboardingState | null): boolean;
54
+ export {};
55
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,uBAAuB,QAA8D,CAAA;AAElG,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,yDAA0D,CAAA;AACxF,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhE,6BAA6B;AAC7B,eAAO,MAAM,aAAa,SAAU,CAAA;AACpC,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC,yCAAyC;AACzC,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,yCAAyC;IACzC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAA;CACzB;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAA;IACrD,8BAA8B;IAC9B,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAAA;IACvC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,aAAa,GAAG,OAAO,CAAC,CAAA;IAChE,iBAAiB;IACjB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAMD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE,kBAAuB,EAC7B,QAAQ,GAAE,MAAgC,GACzC,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,2BAA2B;AAC3B,wBAAsB,mBAAmB,CACvC,QAAQ,GAAE,MAAgC,GACzC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAcjC;AAED,kDAAkD;AAClD,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAEzE;AAED,mCAAmC;AACnC,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAElE"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.COMPLETION_TARGET_RATE = exports.TTV_TARGET_MS = exports.ONBOARDING_STAGES = exports.DEFAULT_ONBOARDING_PATH = void 0;
7
+ exports.recordStage = recordStage;
8
+ exports.readOnboardingState = readOnboardingState;
9
+ exports.computeTtvMs = computeTtvMs;
10
+ exports.isCompleted = isCompleted;
11
+ const promises_1 = __importDefault(require("fs/promises"));
12
+ const os_1 = __importDefault(require("os"));
13
+ const path_1 = __importDefault(require("path"));
14
+ // =============================================
15
+ // オンボーディング計測ファネル (Issue #106 完走記録 → #109 TTV/完走率)
16
+ // =============================================
17
+ //
18
+ // PR 配信ゲート (#102/#49) の判定に使う 2 指標を計測する:
19
+ // - TTV : init 開始 → 初回レポート表示 までの経過時間 (目標 120 秒)
20
+ // - 完走率: 初回起動 (init) → レポート到達 (report) の割合 (目標 80%)
21
+ // さらにステージ別 (init/detect/scan/report/enable) の到達を記録し、離脱ポイントを特定する。
22
+ //
23
+ // プライバシー方針 (受け入れ条件): 計測は **このマシン内のローカル JSON に完結**し、
24
+ // 自動送信はしない。生のプロンプトや検出値は持たず、件数・スコア・タイムスタンプのみ。
25
+ // 将来クラウドへ集計送信する場合も、匿名化 (端末/ユーザーを特定しない集計値) の範囲を
26
+ // 明示した上で同意制とする。詳細は agent/docs/onboarding-metrics.md。
27
+ exports.DEFAULT_ONBOARDING_PATH = path_1.default.join(os_1.default.homedir(), '.promptkaizen', 'onboarding.json');
28
+ /** オンボーディング・ファネルのステージ (順序が離脱分析の軸)。 */
29
+ exports.ONBOARDING_STAGES = ['init', 'detect', 'scan', 'report', 'enable'];
30
+ /** 目標値 (#102 の PR 配信ゲート)。 */
31
+ exports.TTV_TARGET_MS = 120_000;
32
+ exports.COMPLETION_TARGET_RATE = 0.8;
33
+ function emptyState() {
34
+ return { startedAt: null, stages: {}, report: null, agentVersion: null, updatedAt: '' };
35
+ }
36
+ /**
37
+ * ファネルのステージ到達を記録する (best-effort。失敗しても本処理は妨げない)。
38
+ * - init : 新しい試行の起点。startedAt を now に設定し report をクリアする。
39
+ * - report : 指標スナップショットを残し、ttvMs = now - startedAt を計算する。
40
+ */
41
+ async function recordStage(stage, opts = {}, filePath = exports.DEFAULT_ONBOARDING_PATH) {
42
+ try {
43
+ const now = (opts.now?.() ?? new Date()).toISOString();
44
+ const state = (await readOnboardingState(filePath)) ?? emptyState();
45
+ if (stage === 'init') {
46
+ // 新しいオンボーディング試行の開始 → TTV 起点を更新し、前回の完走をクリア。
47
+ state.startedAt = now;
48
+ state.report = null;
49
+ }
50
+ const prev = state.stages[stage];
51
+ state.stages[stage] = {
52
+ firstAt: prev?.firstAt ?? now,
53
+ lastAt: now,
54
+ count: (prev?.count ?? 0) + 1,
55
+ };
56
+ if (stage === 'report' && opts.report) {
57
+ const ttvMs = state.startedAt
58
+ ? new Date(now).getTime() - new Date(state.startedAt).getTime()
59
+ : null;
60
+ state.report = { ...opts.report, completedAt: now, ttvMs: ttvMs !== null && ttvMs >= 0 ? ttvMs : null };
61
+ }
62
+ if (opts.agentVersion)
63
+ state.agentVersion = opts.agentVersion;
64
+ state.updatedAt = now;
65
+ await promises_1.default.mkdir(path_1.default.dirname(filePath), { recursive: true });
66
+ await promises_1.default.writeFile(filePath, JSON.stringify(state, null, 2), { mode: 0o600 });
67
+ }
68
+ catch {
69
+ // 計測記録は best-effort。
70
+ }
71
+ }
72
+ /** 計測ファイルを読む。無ければ null。 */
73
+ async function readOnboardingState(filePath = exports.DEFAULT_ONBOARDING_PATH) {
74
+ try {
75
+ const parsed = JSON.parse(await promises_1.default.readFile(filePath, 'utf8'));
76
+ if (!parsed || typeof parsed !== 'object')
77
+ return null;
78
+ return {
79
+ startedAt: parsed.startedAt ?? null,
80
+ stages: parsed.stages ?? {},
81
+ report: parsed.report ?? null,
82
+ agentVersion: parsed.agentVersion ?? null,
83
+ updatedAt: parsed.updatedAt ?? '',
84
+ };
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ /** TTV (ms): レポート到達スナップショットに記録済みの値。未到達なら null。 */
91
+ function computeTtvMs(state) {
92
+ return state?.report?.ttvMs ?? null;
93
+ }
94
+ /** このインストールがレポートに到達した (完走した) か。 */
95
+ function isCompleted(state) {
96
+ return Boolean(state?.report);
97
+ }
98
+ //# sourceMappingURL=onboarding.js.map