promptkaizen-agent 0.1.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 (189) hide show
  1. package/README.md +10 -4
  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 -5
  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-systemd.d.ts +17 -0
  34. package/dist/cli/install-systemd.d.ts.map +1 -0
  35. package/dist/cli/install-systemd.js +96 -0
  36. package/dist/cli/install-systemd.js.map +1 -0
  37. package/dist/cli/install-task.d.ts +28 -0
  38. package/dist/cli/install-task.d.ts.map +1 -0
  39. package/dist/cli/install-task.js +119 -0
  40. package/dist/cli/install-task.js.map +1 -0
  41. package/dist/cli/mcp.d.ts +2 -0
  42. package/dist/cli/mcp.d.ts.map +1 -0
  43. package/dist/cli/mcp.js +148 -0
  44. package/dist/cli/mcp.js.map +1 -0
  45. package/dist/cli/metrics.d.ts +2 -0
  46. package/dist/cli/metrics.d.ts.map +1 -0
  47. package/dist/cli/metrics.js +103 -0
  48. package/dist/cli/metrics.js.map +1 -0
  49. package/dist/cli/report.d.ts +2 -0
  50. package/dist/cli/report.d.ts.map +1 -0
  51. package/dist/cli/report.js +211 -0
  52. package/dist/cli/report.js.map +1 -0
  53. package/dist/cli/scan.d.ts +2 -0
  54. package/dist/cli/scan.d.ts.map +1 -0
  55. package/dist/cli/scan.js +171 -0
  56. package/dist/cli/scan.js.map +1 -0
  57. package/dist/cli/start.d.ts.map +1 -1
  58. package/dist/cli/start.js +112 -18
  59. package/dist/cli/start.js.map +1 -1
  60. package/dist/cli/status.d.ts.map +1 -1
  61. package/dist/cli/status.js +105 -19
  62. package/dist/cli/status.js.map +1 -1
  63. package/dist/cli/uninstall-systemd.d.ts +8 -0
  64. package/dist/cli/uninstall-systemd.d.ts.map +1 -0
  65. package/dist/cli/uninstall-systemd.js +58 -0
  66. package/dist/cli/uninstall-systemd.js.map +1 -0
  67. package/dist/cli/uninstall-task.d.ts +8 -0
  68. package/dist/cli/uninstall-task.d.ts.map +1 -0
  69. package/dist/cli/uninstall-task.js +44 -0
  70. package/dist/cli/uninstall-task.js.map +1 -0
  71. package/dist/config.d.ts +233 -6
  72. package/dist/config.d.ts.map +1 -1
  73. package/dist/config.js +145 -3
  74. package/dist/config.js.map +1 -1
  75. package/dist/console-safe.d.ts +21 -0
  76. package/dist/console-safe.d.ts.map +1 -0
  77. package/dist/console-safe.js +71 -0
  78. package/dist/console-safe.js.map +1 -0
  79. package/dist/detection-secret.d.ts +8 -0
  80. package/dist/detection-secret.d.ts.map +1 -0
  81. package/dist/detection-secret.js +49 -0
  82. package/dist/detection-secret.js.map +1 -0
  83. package/dist/env-detect.d.ts +44 -0
  84. package/dist/env-detect.d.ts.map +1 -0
  85. package/dist/env-detect.js +151 -0
  86. package/dist/env-detect.js.map +1 -0
  87. package/dist/exec/executor.d.ts +42 -0
  88. package/dist/exec/executor.d.ts.map +1 -0
  89. package/dist/exec/executor.js +135 -0
  90. package/dist/exec/executor.js.map +1 -0
  91. package/dist/exec/pk-execute.d.ts +30 -0
  92. package/dist/exec/pk-execute.d.ts.map +1 -0
  93. package/dist/exec/pk-execute.js +174 -0
  94. package/dist/exec/pk-execute.js.map +1 -0
  95. package/dist/exec/policy-fetcher.d.ts +9 -0
  96. package/dist/exec/policy-fetcher.d.ts.map +1 -0
  97. package/dist/exec/policy-fetcher.js +46 -0
  98. package/dist/exec/policy-fetcher.js.map +1 -0
  99. package/dist/exec/policy.d.ts +32 -0
  100. package/dist/exec/policy.d.ts.map +1 -0
  101. package/dist/exec/policy.js +88 -0
  102. package/dist/exec/policy.js.map +1 -0
  103. package/dist/hooks/block-store.d.ts +14 -0
  104. package/dist/hooks/block-store.d.ts.map +1 -0
  105. package/dist/hooks/block-store.js +26 -0
  106. package/dist/hooks/block-store.js.map +1 -0
  107. package/dist/hooks/claude-hook.d.ts +55 -0
  108. package/dist/hooks/claude-hook.d.ts.map +1 -0
  109. package/dist/hooks/claude-hook.js +122 -0
  110. package/dist/hooks/claude-hook.js.map +1 -0
  111. package/dist/hooks/continuity.d.ts +48 -0
  112. package/dist/hooks/continuity.d.ts.map +1 -0
  113. package/dist/hooks/continuity.js +92 -0
  114. package/dist/hooks/continuity.js.map +1 -0
  115. package/dist/hooks/observation.d.ts +27 -0
  116. package/dist/hooks/observation.d.ts.map +1 -0
  117. package/dist/hooks/observation.js +0 -0
  118. package/dist/hooks/observation.js.map +1 -0
  119. package/dist/hooks/platforms.d.ts +24 -0
  120. package/dist/hooks/platforms.d.ts.map +1 -0
  121. package/dist/hooks/platforms.js +57 -0
  122. package/dist/hooks/platforms.js.map +1 -0
  123. package/dist/hooks/read-cache.d.ts +71 -0
  124. package/dist/hooks/read-cache.d.ts.map +1 -0
  125. package/dist/hooks/read-cache.js +166 -0
  126. package/dist/hooks/read-cache.js.map +1 -0
  127. package/dist/hooks/reduction.d.ts +78 -0
  128. package/dist/hooks/reduction.d.ts.map +1 -0
  129. package/dist/hooks/reduction.js +111 -0
  130. package/dist/hooks/reduction.js.map +1 -0
  131. package/dist/hooks/settings-merge.d.ts +32 -0
  132. package/dist/hooks/settings-merge.d.ts.map +1 -0
  133. package/dist/hooks/settings-merge.js +74 -0
  134. package/dist/hooks/settings-merge.js.map +1 -0
  135. package/dist/hooks/snapshot.d.ts +37 -0
  136. package/dist/hooks/snapshot.d.ts.map +1 -0
  137. package/dist/hooks/snapshot.js +180 -0
  138. package/dist/hooks/snapshot.js.map +1 -0
  139. package/dist/index.js +64 -5
  140. package/dist/index.js.map +1 -1
  141. package/dist/mask-rules-fetcher.d.ts +15 -0
  142. package/dist/mask-rules-fetcher.d.ts.map +1 -0
  143. package/dist/mask-rules-fetcher.js +67 -0
  144. package/dist/mask-rules-fetcher.js.map +1 -0
  145. package/dist/mcp/server.d.ts +118 -0
  146. package/dist/mcp/server.d.ts.map +1 -0
  147. package/dist/mcp/server.js +240 -0
  148. package/dist/mcp/server.js.map +1 -0
  149. package/dist/onboarding-report.d.ts +66 -0
  150. package/dist/onboarding-report.d.ts.map +1 -0
  151. package/dist/onboarding-report.js +152 -0
  152. package/dist/onboarding-report.js.map +1 -0
  153. package/dist/onboarding.d.ts +55 -0
  154. package/dist/onboarding.d.ts.map +1 -0
  155. package/dist/onboarding.js +98 -0
  156. package/dist/onboarding.js.map +1 -0
  157. package/dist/pii-masker.d.ts +55 -1
  158. package/dist/pii-masker.d.ts.map +1 -1
  159. package/dist/pii-masker.js +137 -58
  160. package/dist/pii-masker.js.map +1 -1
  161. package/dist/privacy.d.ts +13 -0
  162. package/dist/privacy.d.ts.map +1 -0
  163. package/dist/privacy.js +67 -0
  164. package/dist/privacy.js.map +1 -0
  165. package/dist/residency.d.ts +21 -0
  166. package/dist/residency.d.ts.map +1 -0
  167. package/dist/residency.js +68 -0
  168. package/dist/residency.js.map +1 -0
  169. package/dist/secret-detector.d.ts +101 -0
  170. package/dist/secret-detector.d.ts.map +1 -0
  171. package/dist/secret-detector.js +516 -0
  172. package/dist/secret-detector.js.map +1 -0
  173. package/dist/store/local-store.d.ts +167 -0
  174. package/dist/store/local-store.d.ts.map +1 -0
  175. package/dist/store/local-store.js +538 -0
  176. package/dist/store/local-store.js.map +1 -0
  177. package/dist/store/schema.d.ts +38 -0
  178. package/dist/store/schema.d.ts.map +1 -0
  179. package/dist/store/schema.js +189 -0
  180. package/dist/store/schema.js.map +1 -0
  181. package/dist/types.d.ts +25 -2
  182. package/dist/types.d.ts.map +1 -1
  183. package/dist/version.d.ts +1 -1
  184. package/dist/version.js +1 -1
  185. package/dist/watcher.d.ts +6 -0
  186. package/dist/watcher.d.ts.map +1 -1
  187. package/dist/watcher.js +13 -2
  188. package/dist/watcher.js.map +1 -1
  189. package/package.json +4 -2
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Windows のレガシーコンソール (conhost / Windows PowerShell のラスタ・Consolas フォント) は
3
+ * 絵文字 (✅ ❌ ⚠️ 🔴 …) をグリフを持たず □ (tofu) として表示してしまう。
4
+ * セットアップは PowerShell を右クリック→管理者として実行する前提なので、ここで CLI 出力の
5
+ * 絵文字を ASCII 記号へ変換し、文字化けを防ぐ。
6
+ *
7
+ * Windows Terminal (WT_SESSION) や VS Code 統合ターミナルなど絵文字を描画できる環境では
8
+ * そのまま絵文字を残す。PROMPTKAIZEN_ASCII=1/0 で強制切り替えも可能。
9
+ *
10
+ * 注意: console 出力 (表示) のみを変換する。クラウド送信やファイル書き込みのデータには触れない。
11
+ */
12
+ /** ASCII フォールバックを使うべきか。Windows のレガシーコンソールのみ true。 */
13
+ export declare function shouldUseAsciiFallback(): boolean;
14
+ /** 文字列内の絵文字を ASCII 記号へ置換する。 */
15
+ export declare function toAsciiSafe(s: string): string;
16
+ /**
17
+ * 必要な環境でのみ console.log / console.error / console.warn をラップし、
18
+ * 文字列引数を ASCII セーフに変換する。CLI エントリポイントの先頭で一度だけ呼ぶ。
19
+ */
20
+ export declare function installConsoleSafe(): void;
21
+ //# sourceMappingURL=console-safe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-safe.d.ts","sourceRoot":"","sources":["../src/console-safe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkBH,qDAAqD;AACrD,wBAAgB,sBAAsB,IAAI,OAAO,CAShD;AAED,+BAA+B;AAC/B,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAUzC"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ /**
3
+ * Windows のレガシーコンソール (conhost / Windows PowerShell のラスタ・Consolas フォント) は
4
+ * 絵文字 (✅ ❌ ⚠️ 🔴 …) をグリフを持たず □ (tofu) として表示してしまう。
5
+ * セットアップは PowerShell を右クリック→管理者として実行する前提なので、ここで CLI 出力の
6
+ * 絵文字を ASCII 記号へ変換し、文字化けを防ぐ。
7
+ *
8
+ * Windows Terminal (WT_SESSION) や VS Code 統合ターミナルなど絵文字を描画できる環境では
9
+ * そのまま絵文字を残す。PROMPTKAIZEN_ASCII=1/0 で強制切り替えも可能。
10
+ *
11
+ * 注意: console 出力 (表示) のみを変換する。クラウド送信やファイル書き込みのデータには触れない。
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.shouldUseAsciiFallback = shouldUseAsciiFallback;
15
+ exports.toAsciiSafe = toAsciiSafe;
16
+ exports.installConsoleSafe = installConsoleSafe;
17
+ /** 絵文字 → ASCII 記号。status / report / enable など全コマンドの表示に効く。 */
18
+ const ASCII_MAP = [
19
+ [/✅/g, '[OK]'],
20
+ [/✓/g, '[OK]'],
21
+ [/❌/g, '[NG]'],
22
+ [/✗/g, '[NG]'],
23
+ [/⚠️/g, '[!]'],
24
+ [/⚠/g, '[!]'],
25
+ // 信号機絵文字は「重要度」と「スコア健全性」の両義で使われるため、どちらでも自然に
26
+ // 読める記号にする (🔴=要対応, 🟡=注意, 🟢=良好)
27
+ [/🔴/g, '[!!]'],
28
+ [/🟡/g, '[!]'],
29
+ [/🟢/g, '[OK]'],
30
+ [/️/g, ''], // 単独で残った異体字セレクタを除去
31
+ ];
32
+ /** ASCII フォールバックを使うべきか。Windows のレガシーコンソールのみ true。 */
33
+ function shouldUseAsciiFallback() {
34
+ const force = process.env.PROMPTKAIZEN_ASCII;
35
+ if (force === '1')
36
+ return true;
37
+ if (force === '0')
38
+ return false;
39
+ if (process.platform !== 'win32')
40
+ return false;
41
+ // 絵文字を描画できる新しめのターミナルは除外
42
+ if (process.env.WT_SESSION)
43
+ return false; // Windows Terminal
44
+ if (process.env.TERM_PROGRAM === 'vscode')
45
+ return false; // VS Code 統合ターミナル
46
+ return true; // 旧来の conhost / Windows PowerShell
47
+ }
48
+ /** 文字列内の絵文字を ASCII 記号へ置換する。 */
49
+ function toAsciiSafe(s) {
50
+ let out = s;
51
+ for (const [re, rep] of ASCII_MAP)
52
+ out = out.replace(re, rep);
53
+ return out;
54
+ }
55
+ /**
56
+ * 必要な環境でのみ console.log / console.error / console.warn をラップし、
57
+ * 文字列引数を ASCII セーフに変換する。CLI エントリポイントの先頭で一度だけ呼ぶ。
58
+ */
59
+ function installConsoleSafe() {
60
+ if (!shouldUseAsciiFallback())
61
+ return;
62
+ const wrap = (orig) => {
63
+ return (...args) => {
64
+ orig(...args.map((a) => (typeof a === 'string' ? toAsciiSafe(a) : a)));
65
+ };
66
+ };
67
+ console.log = wrap(console.log.bind(console));
68
+ console.error = wrap(console.error.bind(console));
69
+ console.warn = wrap(console.warn.bind(console));
70
+ }
71
+ //# sourceMappingURL=console-safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-safe.js","sourceRoot":"","sources":["../src/console-safe.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAmBH,wDASC;AAGD,kCAIC;AAMD,gDAUC;AAjDD,6DAA6D;AAC7D,MAAM,SAAS,GAA4B;IACzC,CAAC,IAAI,EAAE,MAAM,CAAC;IACd,CAAC,IAAI,EAAE,MAAM,CAAC;IACd,CAAC,IAAI,EAAE,MAAM,CAAC;IACd,CAAC,IAAI,EAAE,MAAM,CAAC;IACd,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,IAAI,EAAE,KAAK,CAAC;IACb,2CAA2C;IAC3C,kCAAkC;IAClC,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,mBAAmB;CAChC,CAAA;AAED,qDAAqD;AACrD,SAAgB,sBAAsB;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IAC5C,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC9B,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAA;IAC9C,wBAAwB;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA,CAAC,mBAAmB;IAC5D,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA,CAAC,kBAAkB;IAC1E,OAAO,IAAI,CAAA,CAAC,mCAAmC;AACjD,CAAC;AAED,+BAA+B;AAC/B,SAAgB,WAAW,CAAC,CAAS;IACnC,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,SAAS;QAAE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IAC7D,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB;IAChC,IAAI,CAAC,sBAAsB,EAAE;QAAE,OAAM;IACrC,MAAM,IAAI,GAAG,CAAC,IAAkC,EAAE,EAAE;QAClD,OAAO,CAAC,GAAG,IAAe,EAAQ,EAAE;YAClC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACxE,CAAC,CAAA;IACH,CAAC,CAAA;IACD,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IAC7C,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;AACjD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * HMAC 鍵を解決する。優先順:
3
+ * 1. agent 設定 `detection.hmacSecret`
4
+ * 2. 既存の鍵ファイル (~/.promptkaizen/detection-secret)
5
+ * 3. 初回起動時に生成して同ファイルへ保存 (mode 600)
6
+ */
7
+ export declare function loadOrCreateDetectionSecret(configSecret?: string, secretPath?: string): Promise<string>;
8
+ //# sourceMappingURL=detection-secret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection-secret.d.ts","sourceRoot":"","sources":["../src/detection-secret.ts"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,GAAE,MAA4B,GACvC,OAAO,CAAC,MAAM,CAAC,CA0BjB"}
@@ -0,0 +1,49 @@
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.loadOrCreateDetectionSecret = loadOrCreateDetectionSecret;
7
+ const child_process_1 = require("child_process");
8
+ const crypto_1 = require("crypto");
9
+ const promises_1 = __importDefault(require("fs/promises"));
10
+ const os_1 = __importDefault(require("os"));
11
+ const path_1 = __importDefault(require("path"));
12
+ // pii/pii_jp の matchHash (HMAC-SHA256) に使うローカルシークレット (Issue #42)。
13
+ // マイナンバー等の低エントロピー値を無塩ハッシュで送ると総当たりで復元できてしまう
14
+ // ため、鍵付きハッシュにする。鍵はローカルにのみ保持し、クラウドへは送らない。
15
+ const DEFAULT_SECRET_PATH = path_1.default.join(os_1.default.homedir(), '.promptkaizen', 'detection-secret');
16
+ /**
17
+ * HMAC 鍵を解決する。優先順:
18
+ * 1. agent 設定 `detection.hmacSecret`
19
+ * 2. 既存の鍵ファイル (~/.promptkaizen/detection-secret)
20
+ * 3. 初回起動時に生成して同ファイルへ保存 (mode 600)
21
+ */
22
+ async function loadOrCreateDetectionSecret(configSecret, secretPath = DEFAULT_SECRET_PATH) {
23
+ if (configSecret)
24
+ return configSecret;
25
+ try {
26
+ const existing = (await promises_1.default.readFile(secretPath, 'utf8')).trim();
27
+ if (existing.length >= 32)
28
+ return existing;
29
+ }
30
+ catch {
31
+ // ファイルなし (初回起動) → 下で生成する
32
+ }
33
+ const secret = (0, crypto_1.randomBytes)(32).toString('hex');
34
+ await promises_1.default.mkdir(path_1.default.dirname(secretPath), { recursive: true });
35
+ await promises_1.default.writeFile(secretPath, secret + '\n', { mode: 0o600 });
36
+ // Windows は mode 600 が無視されるため、ACL で本人のみに制限する (Issue #61 方針)。
37
+ // 継承 ACE を外し (inheritance:r)、現在ユーザーへのフルコントロールだけ付与する。
38
+ // 失敗しても鍵自体は機能する (相関がローカルに限定されるだけ) ので best-effort。
39
+ if (process.platform === 'win32') {
40
+ try {
41
+ (0, child_process_1.execFileSync)('icacls', [secretPath, '/inheritance:r', '/grant:r', `${os_1.default.userInfo().username}:F`], { stdio: 'ignore' });
42
+ }
43
+ catch {
44
+ // best-effort
45
+ }
46
+ }
47
+ return secret;
48
+ }
49
+ //# sourceMappingURL=detection-secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection-secret.js","sourceRoot":"","sources":["../src/detection-secret.ts"],"names":[],"mappings":";;;;;AAkBA,kEA6BC;AA/CD,iDAA4C;AAC5C,mCAAoC;AACpC,2DAA4B;AAC5B,4CAAmB;AACnB,gDAAuB;AAEvB,kEAAkE;AAClE,2CAA2C;AAC3C,yCAAyC;AAEzC,MAAM,mBAAmB,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAA;AAExF;;;;;GAKG;AACI,KAAK,UAAU,2BAA2B,CAC/C,YAAqB,EACrB,aAAqB,mBAAmB;IAExC,IAAI,YAAY;QAAE,OAAO,YAAY,CAAA;IACrC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/D,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE;YAAE,OAAO,QAAQ,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;IAC3B,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC9C,MAAM,kBAAE,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7D,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9D,6DAA6D;IAC7D,qDAAqD;IACrD,kDAAkD;IAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,IAAA,4BAAY,EACV,QAAQ,EACR,CAAC,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,YAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,CAAC,EACzE,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAA;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,44 @@
1
+ export type DetectedTool = 'claude_code' | 'codex';
2
+ export interface ToolDetection {
3
+ tool: DetectedTool;
4
+ label: string;
5
+ /** 検出に採用したディレクトリ (存在する候補のうちセッション数最大)。未検出なら null。 */
6
+ basePath: string | null;
7
+ present: boolean;
8
+ /** Claude: project ディレクトリ数。Codex は概念がないため 0。 */
9
+ projects: number;
10
+ /** *.jsonl セッションファイル数。 */
11
+ sessions: number;
12
+ /** watchPaths 用の glob (~ 圧縮済み)。未検出なら null。 */
13
+ watchGlob: string | null;
14
+ }
15
+ export interface EnvironmentDetection {
16
+ platform: NodeJS.Platform;
17
+ isWSL: boolean;
18
+ home: string;
19
+ tools: ToolDetection[];
20
+ /** 検出されたツールのみ。 */
21
+ detected: ToolDetection[];
22
+ anyDetected: boolean;
23
+ /** 検出ツールの watch glob 一覧 (config.watchPaths に使える)。 */
24
+ watchPaths: string[];
25
+ }
26
+ export interface DetectOptions {
27
+ homeDir?: string;
28
+ platform?: NodeJS.Platform;
29
+ isWSL?: boolean;
30
+ /** WSL 時に探索する Windows ユーザーディレクトリ (/mnt/c/Users/<u>)。テスト注入可。 */
31
+ windowsUserDirs?: string[];
32
+ /** ディレクトリ walk の深さ上限 (暴走防止)。 */
33
+ maxDepth?: number;
34
+ }
35
+ /** WSL 上で動いているか (/proc/version に microsoft/WSL を含むか)。 */
36
+ export declare function detectWSL(platform?: NodeJS.Platform): boolean;
37
+ /**
38
+ * 環境を検出する。各ツールについて候補ベース (ホーム + WSL の Windows ユーザー) を評価し、
39
+ * 「存在する候補のうちセッション数が最大のもの」を採用する。
40
+ */
41
+ export declare function detectEnvironment(opts?: DetectOptions): Promise<EnvironmentDetection>;
42
+ /** 検出結果を人間向けの要約行に整形する (例: `Claude Code : 12 projects / 348 sessions`)。 */
43
+ export declare function formatDetectionSummary(env: EnvironmentDetection): string[];
44
+ //# sourceMappingURL=env-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-detect.d.ts","sourceRoot":"","sources":["../src/env-detect.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,OAAO,CAAA;AAElD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAA;IAChB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,kBAAkB;IAClB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,WAAW,EAAE,OAAO,CAAA;IACpB,qDAAqD;IACrD,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAOD,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,OAAO,CAO/E;AAqED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyC/F;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAe1E"}
@@ -0,0 +1,151 @@
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.detectWSL = detectWSL;
7
+ exports.detectEnvironment = detectEnvironment;
8
+ exports.formatDetectionSummary = formatDetectionSummary;
9
+ const promises_1 = __importDefault(require("fs/promises"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const TOOL_META = {
14
+ claude_code: { label: 'Claude Code', rel: ['.claude', 'projects'] },
15
+ codex: { label: 'Codex', rel: ['.codex', 'sessions'] },
16
+ };
17
+ /** WSL 上で動いているか (/proc/version に microsoft/WSL を含むか)。 */
18
+ function detectWSL(platform = process.platform) {
19
+ if (platform !== 'linux')
20
+ return false;
21
+ try {
22
+ return /microsoft|wsl/i.test(fs_1.default.readFileSync('/proc/version', 'utf8'));
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ /** /mnt/c/Users 配下の実ユーザーディレクトリ (WSL から Windows 側履歴を拾う)。 */
29
+ function listWindowsUserDirs() {
30
+ const root = '/mnt/c/Users';
31
+ const skip = new Set(['Public', 'Default', 'Default User', 'All Users', 'desktop.ini']);
32
+ try {
33
+ return fs_1.default
34
+ .readdirSync(root, { withFileTypes: true })
35
+ .filter((e) => e.isDirectory() && !skip.has(e.name))
36
+ .map((e) => path_1.default.join(root, e.name));
37
+ }
38
+ catch {
39
+ return [];
40
+ }
41
+ }
42
+ /** base を ~ 圧縮した watch glob を返す。home 配下なら `~/...`、それ以外は絶対パス。 */
43
+ function toWatchGlob(base, home) {
44
+ const norm = base.replace(/\\/g, '/');
45
+ const h = home.replace(/\\/g, '/').replace(/\/+$/, '');
46
+ const rel = norm === h ? '' : norm.startsWith(h + '/') ? norm.slice(h.length + 1) : null;
47
+ const head = rel === null ? norm : rel === '' ? '~' : `~/${rel}`;
48
+ return `${head}/**/*.jsonl`;
49
+ }
50
+ /** base ディレクトリの project 数 (直下のディレクトリ) と *.jsonl セッション数を数える。 */
51
+ async function countDir(base, maxDepth) {
52
+ let exists = false;
53
+ let projects = 0;
54
+ let sessions = 0;
55
+ let top;
56
+ try {
57
+ top = await promises_1.default.readdir(base, { withFileTypes: true });
58
+ exists = true;
59
+ }
60
+ catch {
61
+ return { exists: false, projects: 0, sessions: 0 };
62
+ }
63
+ // 直下のディレクトリ数 = projects (Claude の project 単位)。
64
+ projects = top.filter((e) => e.isDirectory() && !e.isSymbolicLink()).length;
65
+ // *.jsonl を再帰カウント (symlink は辿らない / 深さ上限)。
66
+ const walk = async (dir, entries, depth) => {
67
+ for (const e of entries) {
68
+ if (e.isSymbolicLink())
69
+ continue;
70
+ const full = path_1.default.join(dir, e.name);
71
+ if (e.isFile()) {
72
+ if (e.name.toLowerCase().endsWith('.jsonl'))
73
+ sessions++;
74
+ }
75
+ else if (e.isDirectory() && depth < maxDepth) {
76
+ let sub;
77
+ try {
78
+ sub = await promises_1.default.readdir(full, { withFileTypes: true });
79
+ }
80
+ catch {
81
+ continue;
82
+ }
83
+ await walk(full, sub, depth + 1);
84
+ }
85
+ }
86
+ };
87
+ await walk(base, top, 0);
88
+ return { exists, projects, sessions };
89
+ }
90
+ /**
91
+ * 環境を検出する。各ツールについて候補ベース (ホーム + WSL の Windows ユーザー) を評価し、
92
+ * 「存在する候補のうちセッション数が最大のもの」を採用する。
93
+ */
94
+ async function detectEnvironment(opts = {}) {
95
+ const home = opts.homeDir ?? os_1.default.homedir();
96
+ const platform = opts.platform ?? process.platform;
97
+ const isWSL = opts.isWSL ?? detectWSL(platform);
98
+ const maxDepth = opts.maxDepth ?? 24;
99
+ const windowsUserDirs = opts.windowsUserDirs ?? (isWSL ? listWindowsUserDirs() : []);
100
+ const tools = [];
101
+ for (const tool of Object.keys(TOOL_META)) {
102
+ const { label, rel } = TOOL_META[tool];
103
+ const candidates = [path_1.default.join(home, ...rel), ...windowsUserDirs.map((d) => path_1.default.join(d, ...rel))];
104
+ let chosen = null;
105
+ for (const base of candidates) {
106
+ const counts = await countDir(base, maxDepth);
107
+ if (!counts.exists)
108
+ continue;
109
+ // 存在する候補のうちセッション数が最大のものを採用 (同数なら先勝ち = ホーム優先)。
110
+ if (!chosen || counts.sessions > chosen.counts.sessions)
111
+ chosen = { base, counts };
112
+ }
113
+ tools.push({
114
+ tool,
115
+ label,
116
+ basePath: chosen?.base ?? null,
117
+ present: chosen !== null,
118
+ projects: tool === 'codex' ? 0 : (chosen?.counts.projects ?? 0),
119
+ sessions: chosen?.counts.sessions ?? 0,
120
+ watchGlob: chosen ? toWatchGlob(chosen.base, home) : null,
121
+ });
122
+ }
123
+ const detected = tools.filter((t) => t.present);
124
+ return {
125
+ platform,
126
+ isWSL,
127
+ home,
128
+ tools,
129
+ detected,
130
+ anyDetected: detected.length > 0,
131
+ watchPaths: detected.map((t) => t.watchGlob).filter(Boolean),
132
+ };
133
+ }
134
+ /** 検出結果を人間向けの要約行に整形する (例: `Claude Code : 12 projects / 348 sessions`)。 */
135
+ function formatDetectionSummary(env) {
136
+ const lines = [];
137
+ for (const t of env.tools) {
138
+ if (!t.present) {
139
+ lines.push(` ${t.label.padEnd(12)}: 未検出`);
140
+ continue;
141
+ }
142
+ const count = t.tool === 'codex'
143
+ ? `${t.sessions.toLocaleString()} sessions`
144
+ : `${t.projects.toLocaleString()} projects / ${t.sessions.toLocaleString()} sessions`;
145
+ lines.push(` ${t.label.padEnd(12)}: ${count} (${t.basePath})`);
146
+ }
147
+ if (env.isWSL)
148
+ lines.push(' (WSL を検出: Linux ホーム + /mnt/c/Users を探索)');
149
+ return lines;
150
+ }
151
+ //# sourceMappingURL=env-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-detect.js","sourceRoot":"","sources":["../src/env-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export declare const SUPPORTED_LANGUAGES: readonly ["bash", "node", "python"];
2
+ export type ExecLanguage = (typeof SUPPORTED_LANGUAGES)[number];
3
+ export declare function isExecLanguage(v: unknown): v is ExecLanguage;
4
+ /**
5
+ * 子プロセスへ伝播する環境変数のホワイトリスト。
6
+ * 秘匿値 (ANTHROPIC_API_KEY / AWS_* / *_TOKEN 等) はリストに無い時点で遮断される
7
+ * (ブラックリストではなくホワイトリスト = 新種のキーも漏れない)。
8
+ * HOME は実ホームを隠すため一時ディレクトリに差し替える。
9
+ */
10
+ export declare const ENV_WHITELIST: readonly ["PATH", "LANG", "LC_ALL", "LC_CTYPE", "TZ", "TERM", "TMPDIR"];
11
+ export interface ExecRequest {
12
+ language: ExecLanguage;
13
+ code: string;
14
+ /** 実行の作業ディレクトリ (プロジェクトルート)。 */
15
+ projectRoot: string;
16
+ /** タイムアウト ms (既定 30_000)。 */
17
+ timeoutMs?: number;
18
+ /** stdout / stderr の取り込み上限 (メモリ保護のハードキャップ)。 */
19
+ maxCaptureBytes?: number;
20
+ }
21
+ export interface ExecResult {
22
+ /** 取り込んだ stdout (maxCaptureBytes でハードキャップ済み・マスク前)。 */
23
+ stdout: string;
24
+ /** stderr の先頭 (診断用に小さく保持)。 */
25
+ stderrHead: string;
26
+ exitCode: number | null;
27
+ /** タイムアウトで SIGKILL したか。 */
28
+ timedOut: boolean;
29
+ /** stdout が maxCaptureBytes を超えて切り捨てられたか。 */
30
+ captureTruncated: boolean;
31
+ durationMs: number;
32
+ }
33
+ /** ホワイトリストで子プロセス環境を構築。HOME は一時ディレクトリに差し替え。 */
34
+ export declare function buildSandboxEnv(parentEnv: NodeJS.ProcessEnv, sandboxHome: string): NodeJS.ProcessEnv;
35
+ /**
36
+ * code を一時ファイル経由で実行する。例外は投げず ExecResult に正規化する
37
+ * (インタープリタ不在等は exitCode null + stderrHead にメッセージ)。
38
+ */
39
+ export declare function executeCode(req: ExecRequest): Promise<ExecResult>;
40
+ /** 実行ログ・参照IDに使う一意 ID。 */
41
+ export declare function generateExecId(): string;
42
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/exec/executor.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,mBAAmB,qCAAsC,CAAA;AACtE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/D,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,YAAY,CAE5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,yEAA0E,CAAA;AAEpG,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,2BAA2B;IAC3B,QAAQ,EAAE,OAAO,CAAA;IACjB,6CAA6C;IAC7C,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;CACnB;AAcD,8CAA8C;AAC9C,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAOpG;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAwEvE;AAED,yBAAyB;AACzB,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,135 @@
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.ENV_WHITELIST = exports.SUPPORTED_LANGUAGES = void 0;
7
+ exports.isExecLanguage = isExecLanguage;
8
+ exports.buildSandboxEnv = buildSandboxEnv;
9
+ exports.executeCode = executeCode;
10
+ exports.generateExecId = generateExecId;
11
+ const child_process_1 = require("child_process");
12
+ const crypto_1 = require("crypto");
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const os_1 = __importDefault(require("os"));
15
+ const path_1 = __importDefault(require("path"));
16
+ // =============================================
17
+ // pk_execute 実行エンジン (Issue #94 / Epic #91 R2)
18
+ // =============================================
19
+ //
20
+ // 生データをコンテキストに入れず、エージェントが書いたコードをローカルで実行して
21
+ // 結果 (stdout) だけを返す。安全制約:
22
+ // - タイムアウト (既定 30s、SIGKILL)
23
+ // - 作業ディレクトリ = プロジェクトルート (cwd 固定)
24
+ // - 環境変数はホワイトリストのみ伝播 (API キー類を子プロセスへ渡さない)
25
+ // - stdout は上限でトリム (超過分は呼び出し側が R1 退避へ回す)
26
+ // ポリシー判定 (policy.ts) は呼び出し側 (mcp/server.ts) が実行前に行う。
27
+ exports.SUPPORTED_LANGUAGES = ['bash', 'node', 'python'];
28
+ function isExecLanguage(v) {
29
+ return typeof v === 'string' && exports.SUPPORTED_LANGUAGES.includes(v);
30
+ }
31
+ /**
32
+ * 子プロセスへ伝播する環境変数のホワイトリスト。
33
+ * 秘匿値 (ANTHROPIC_API_KEY / AWS_* / *_TOKEN 等) はリストに無い時点で遮断される
34
+ * (ブラックリストではなくホワイトリスト = 新種のキーも漏れない)。
35
+ * HOME は実ホームを隠すため一時ディレクトリに差し替える。
36
+ */
37
+ exports.ENV_WHITELIST = ['PATH', 'LANG', 'LC_ALL', 'LC_CTYPE', 'TZ', 'TERM', 'TMPDIR'];
38
+ const DEFAULT_TIMEOUT_MS = 30_000;
39
+ const DEFAULT_MAX_CAPTURE_BYTES = 5 * 1024 * 1024; // 5MB (メモリ保護)
40
+ const STDERR_HEAD_BYTES = 4 * 1024;
41
+ const INTERPRETER = {
42
+ bash: { cmd: 'bash', args: (f) => [f] },
43
+ node: { cmd: 'node', args: (f) => [f] },
44
+ python: { cmd: 'python3', args: (f) => [f] },
45
+ };
46
+ const FILE_EXT = { bash: '.sh', node: '.cjs', python: '.py' };
47
+ /** ホワイトリストで子プロセス環境を構築。HOME は一時ディレクトリに差し替え。 */
48
+ function buildSandboxEnv(parentEnv, sandboxHome) {
49
+ const env = {};
50
+ for (const key of exports.ENV_WHITELIST) {
51
+ if (parentEnv[key] !== undefined)
52
+ env[key] = parentEnv[key];
53
+ }
54
+ env.HOME = sandboxHome;
55
+ return env;
56
+ }
57
+ /**
58
+ * code を一時ファイル経由で実行する。例外は投げず ExecResult に正規化する
59
+ * (インタープリタ不在等は exitCode null + stderrHead にメッセージ)。
60
+ */
61
+ async function executeCode(req) {
62
+ const timeoutMs = req.timeoutMs ?? DEFAULT_TIMEOUT_MS;
63
+ const maxCapture = req.maxCaptureBytes ?? DEFAULT_MAX_CAPTURE_BYTES;
64
+ const started = Date.now();
65
+ // 一時ファイル + サンドボックス HOME (実行ごとに隔離、終了後に削除)
66
+ const workDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'pk-exec-'));
67
+ const codeFile = path_1.default.join(workDir, `code${FILE_EXT[req.language]}`);
68
+ const sandboxHome = path_1.default.join(workDir, 'home');
69
+ fs_1.default.mkdirSync(sandboxHome);
70
+ fs_1.default.writeFileSync(codeFile, req.code, { mode: 0o600 });
71
+ const { cmd, args } = INTERPRETER[req.language];
72
+ try {
73
+ return await new Promise((resolve) => {
74
+ const child = (0, child_process_1.spawn)(cmd, args(codeFile), {
75
+ cwd: req.projectRoot,
76
+ env: buildSandboxEnv(process.env, sandboxHome),
77
+ timeout: timeoutMs,
78
+ killSignal: 'SIGKILL',
79
+ stdio: ['ignore', 'pipe', 'pipe'],
80
+ });
81
+ const out = [];
82
+ let outBytes = 0;
83
+ let captureTruncated = false;
84
+ const err = [];
85
+ let errBytes = 0;
86
+ child.stdout.on('data', (chunk) => {
87
+ if (outBytes >= maxCapture) {
88
+ captureTruncated = true;
89
+ return;
90
+ }
91
+ const room = maxCapture - outBytes;
92
+ const take = chunk.length > room ? chunk.subarray(0, room) : chunk;
93
+ if (take.length < chunk.length)
94
+ captureTruncated = true;
95
+ out.push(take);
96
+ outBytes += take.length;
97
+ });
98
+ child.stderr.on('data', (chunk) => {
99
+ if (errBytes >= STDERR_HEAD_BYTES)
100
+ return;
101
+ const take = chunk.subarray(0, STDERR_HEAD_BYTES - errBytes);
102
+ err.push(take);
103
+ errBytes += take.length;
104
+ });
105
+ child.on('error', (e) => {
106
+ resolve({
107
+ stdout: '',
108
+ stderrHead: `実行に失敗しました: ${e.message}`,
109
+ exitCode: null,
110
+ timedOut: false,
111
+ captureTruncated: false,
112
+ durationMs: Date.now() - started,
113
+ });
114
+ });
115
+ child.on('close', (code, signal) => {
116
+ resolve({
117
+ stdout: Buffer.concat(out).toString('utf8'),
118
+ stderrHead: Buffer.concat(err).toString('utf8'),
119
+ exitCode: code,
120
+ timedOut: signal === 'SIGKILL' && Date.now() - started >= timeoutMs - 50,
121
+ captureTruncated,
122
+ durationMs: Date.now() - started,
123
+ });
124
+ });
125
+ });
126
+ }
127
+ finally {
128
+ fs_1.default.rmSync(workDir, { recursive: true, force: true });
129
+ }
130
+ }
131
+ /** 実行ログ・参照IDに使う一意 ID。 */
132
+ function generateExecId() {
133
+ return `pk-exec-${(0, crypto_1.randomBytes)(6).toString('hex')}`;
134
+ }
135
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/exec/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { StoredToolOutputRef } from '../store/local-store';
2
+ import type { ParsedEntry } from '../types';
3
+ import { type ExecutionPolicy } from './policy';
4
+ import { executeCode } from './executor';
5
+ export interface PkExecuteDeps {
6
+ /** マスキング前置パイプライン (#68 の不変条件)。 */
7
+ maskText: (text: string) => string;
8
+ /** R1 退避ストアへの保存 (#93)。 */
9
+ storeRef: (ref: StoredToolOutputRef) => void;
10
+ /** 実行ログ entry の記録 + 送信 (best-effort、呼び出し側で実装)。 */
11
+ recordEntry: (entry: ParsedEntry) => Promise<void>;
12
+ /** 組織実行ポリシー (cloud 配信、オフライン時 null)。 */
13
+ getPolicy: () => ExecutionPolicy | null;
14
+ projectRoot: string;
15
+ timeoutMs: number;
16
+ maxReturnBytes: number;
17
+ /** テスト注入用。 */
18
+ now?: () => string;
19
+ execImpl?: typeof executeCode;
20
+ }
21
+ export interface PkExecuteResult {
22
+ content: Array<{
23
+ type: 'text';
24
+ text: string;
25
+ }>;
26
+ isError?: boolean;
27
+ }
28
+ /** pk_execute 本体。例外を投げず PkExecuteResult に正規化する。 */
29
+ export declare function runPkExecute(deps: PkExecuteDeps, args: Record<string, unknown>): Promise<PkExecuteResult>;
30
+ //# sourceMappingURL=pk-execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pk-execute.d.ts","sourceRoot":"","sources":["../../src/exec/pk-execute.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAwB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AACrE,OAAO,EAAE,WAAW,EAAmD,MAAM,YAAY,CAAA;AAYzF,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,0BAA0B;IAC1B,QAAQ,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAC5C,kDAAkD;IAClD,WAAW,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,uCAAuC;IACvC,SAAS,EAAE,MAAM,eAAe,GAAG,IAAI,CAAA;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc;IACd,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,WAAW,CAAA;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAmDD,mDAAmD;AACnD,wBAAsB,YAAY,CAChC,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,eAAe,CAAC,CAwI1B"}