@cjhyy/code-shell-core 0.7.0 → 0.8.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 (621) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -5,17 +5,46 @@
5
5
  * actually installs (feedback#15). Read-only; reuses the same parsers the
6
6
  * loaders use so the inventory can't drift from what actually loads.
7
7
  */
8
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
9
- import { join } from "node:path";
8
+ import { readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
9
+ import { isAbsolute, join, relative, sep } from "node:path";
10
10
  import { parseFrontmatter } from "../skills/frontmatter.js";
11
11
  import { listPluginHooks } from "./loadPluginHooks.js";
12
- import { mergePluginMcpServers } from "./installer/loadPluginMcp.js";
13
- function listMdNames(dir) {
14
- if (!existsSync(dir))
12
+ import { reviewPluginHooks } from "./pluginHookApproval.js";
13
+ import { readPluginMcp } from "./installer/loadPluginMcp.js";
14
+ import { CANONICAL_PLUGIN_MANIFEST_FILE, CanonicalPluginManifest, } from "./installer/types.js";
15
+ import { pluginAutomationTemplateRevision } from "./pluginCatalog.js";
16
+ function resolveContainedPath(root, candidate) {
17
+ try {
18
+ const realRoot = realpathSync(root);
19
+ const realCandidate = realpathSync(candidate);
20
+ const rel = relative(realRoot, realCandidate);
21
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel))
22
+ return null;
23
+ return realCandidate;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ function listMdNames(installPath, dirName) {
30
+ const dir = resolveContainedPath(installPath, join(installPath, dirName));
31
+ if (!dir)
15
32
  return [];
16
33
  try {
17
34
  return readdirSync(dir)
18
- .filter((f) => f.endsWith(".md"))
35
+ .filter((file) => {
36
+ if (!file.endsWith(".md"))
37
+ return false;
38
+ const target = resolveContainedPath(dir, join(dir, file));
39
+ if (!target)
40
+ return false;
41
+ try {
42
+ return statSync(target).isFile();
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ })
19
48
  .map((f) => f.replace(/\.md$/, ""))
20
49
  .sort();
21
50
  }
@@ -24,15 +53,18 @@ function listMdNames(dir) {
24
53
  }
25
54
  }
26
55
  function listSkills(installPath) {
27
- const dir = join(installPath, "skills");
28
- if (!existsSync(dir))
56
+ const dir = resolveContainedPath(installPath, join(installPath, "skills"));
57
+ if (!dir)
29
58
  return [];
30
59
  const out = [];
31
60
  try {
32
61
  for (const entry of readdirSync(dir).sort()) {
33
- const skillMd = join(dir, entry, "SKILL.md");
34
62
  try {
35
- if (!statSync(join(dir, entry)).isDirectory() || !existsSync(skillMd))
63
+ const skillDir = resolveContainedPath(dir, join(dir, entry));
64
+ if (!skillDir || !statSync(skillDir).isDirectory())
65
+ continue;
66
+ const skillMd = resolveContainedPath(skillDir, join(skillDir, "SKILL.md"));
67
+ if (!skillMd || !statSync(skillMd).isFile())
36
68
  continue;
37
69
  const { frontmatter } = parseFrontmatter(readFileSync(skillMd, "utf-8"));
38
70
  const desc = typeof frontmatter.description === "string" ? frontmatter.description : undefined;
@@ -54,30 +86,55 @@ function listSkills(installPath) {
54
86
  * scanners the runtime loaders use (filtered to this plugin) so naming —
55
87
  * e.g. MCP's `<plugin>:<server>` record keys — matches what users see live.
56
88
  */
57
- export function describePluginContent(pluginName, installPath) {
89
+ export function describePluginContent(pluginName, installPath, installKey) {
58
90
  const mcpPrefix = `${pluginName}:`;
59
- let mcpServers = [];
60
- try {
61
- mcpServers = Object.keys(mergePluginMcpServers({}))
62
- .filter((k) => k.startsWith(mcpPrefix))
63
- .map((k) => k.slice(mcpPrefix.length))
64
- .sort();
65
- }
66
- catch {
67
- mcpServers = [];
68
- }
69
- let hooks = [];
70
- try {
71
- hooks = listPluginHooks().filter((h) => h.plugin === pluginName);
72
- }
73
- catch {
74
- hooks = [];
75
- }
91
+ const mcpServers = (() => {
92
+ try {
93
+ return Object.keys(readPluginMcp(installPath, pluginName))
94
+ .filter((k) => k.startsWith(mcpPrefix))
95
+ .map((k) => k.slice(mcpPrefix.length))
96
+ .sort();
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ })();
102
+ const hooks = (() => {
103
+ try {
104
+ return listPluginHooks().filter((h) => h.plugin === pluginName && (installKey === undefined || h.installKey === installKey));
105
+ }
106
+ catch {
107
+ return [];
108
+ }
109
+ })();
110
+ const hookReview = (() => {
111
+ if (!installKey)
112
+ return undefined;
113
+ try {
114
+ return reviewPluginHooks(installKey)[0];
115
+ }
116
+ catch {
117
+ return undefined;
118
+ }
119
+ })();
120
+ const manifest = (() => {
121
+ try {
122
+ return CanonicalPluginManifest.parse(JSON.parse(readFileSync(join(installPath, CANONICAL_PLUGIN_MANIFEST_FILE), "utf-8")));
123
+ }
124
+ catch {
125
+ return null;
126
+ }
127
+ })();
76
128
  return {
77
129
  skills: listSkills(installPath),
78
- commands: listMdNames(join(installPath, "commands")),
79
- agents: listMdNames(join(installPath, "agents")),
130
+ commands: listMdNames(installPath, "commands"),
131
+ agents: listMdNames(installPath, "agents"),
80
132
  hooks,
133
+ ...(hookReview ? { hookReview } : {}),
81
134
  mcpServers,
135
+ automationTemplates: (manifest?.automations?.templates ?? []).map((template) => ({
136
+ ...template,
137
+ revision: pluginAutomationTemplateRevision(installKey ?? pluginName, template),
138
+ })),
82
139
  };
83
140
  }
@@ -0,0 +1,30 @@
1
+ import { type PluginHookApprovalState } from "./pluginHookIntegrity.js";
2
+ import type { StoredPluginHookReview } from "./types.js";
3
+ export interface PluginHookApprovalResult {
4
+ installKey: string;
5
+ plugin: string;
6
+ status: PluginHookApprovalState;
7
+ changed: boolean;
8
+ }
9
+ export interface PluginHookReviewDiffItem {
10
+ change: "added" | "removed" | "changed" | "unchanged";
11
+ current?: StoredPluginHookReview;
12
+ previous?: StoredPluginHookReview;
13
+ }
14
+ export interface PluginHookReview {
15
+ installKey: string;
16
+ plugin: string;
17
+ status: PluginHookApprovalState;
18
+ baselineAvailable: boolean;
19
+ items: PluginHookReviewDiffItem[];
20
+ error?: string;
21
+ }
22
+ /** Review current hooks against the last explicitly approved per-command snapshot. */
23
+ export declare function reviewPluginHooks(target: string): PluginHookReview[];
24
+ /** Approve the exact install-time digest; changed-on-disk hooks cannot be blessed. */
25
+ export declare function approvePluginHooks(target: string): PluginHookApprovalResult[];
26
+ /**
27
+ * Revoke hook execution. Legacy entries are first migrated to a recorded
28
+ * digest so revocation fails closed instead of falling back to legacy trust.
29
+ */
30
+ export declare function revokePluginHooks(target: string): PluginHookApprovalResult[];
@@ -0,0 +1,160 @@
1
+ import { readInstalledPlugins, writeInstalledPlugins } from "./installedPlugins.js";
2
+ import { inspectPluginHooks, pluginHookReviewSnapshot, pluginHookApprovalState, } from "./pluginHookIntegrity.js";
3
+ function pluginNameFromKey(key) {
4
+ const at = key.lastIndexOf("@");
5
+ return at > 0 ? key.slice(0, at) : key;
6
+ }
7
+ function matchingInstallKeys(data, target) {
8
+ if (!target.trim())
9
+ throw new Error("plugin hook approval requires a plugin name or install key");
10
+ if (data.plugins[target])
11
+ return [target];
12
+ const matches = Object.keys(data.plugins).filter((key) => pluginNameFromKey(key) === target);
13
+ if (matches.length === 0)
14
+ throw new Error(`plugin "${target}" is not installed`);
15
+ if (matches.length > 1) {
16
+ throw new Error(`plugin "${target}" has multiple installs; use one of: ${matches.join(", ")}`);
17
+ }
18
+ return matches;
19
+ }
20
+ function result(installKey, entry, changed, snapshot) {
21
+ return {
22
+ installKey,
23
+ plugin: pluginNameFromKey(installKey),
24
+ status: pluginHookApprovalState(entry, snapshot),
25
+ changed,
26
+ };
27
+ }
28
+ function sameReviewHook(a, b) {
29
+ return (a.rawEvent === b.rawEvent &&
30
+ a.matcher === b.matcher &&
31
+ a.commandDigest === b.commandDigest &&
32
+ a.async === b.async &&
33
+ a.timeoutMs === b.timeoutMs);
34
+ }
35
+ function diffHookReview(current, previous) {
36
+ if (previous === undefined)
37
+ return current.map((hook) => ({ change: "added", current: hook }));
38
+ const unused = new Set(previous.map((_, index) => index));
39
+ const items = [];
40
+ for (const hook of current) {
41
+ const exact = [...unused].find((index) => sameReviewHook(hook, previous[index]));
42
+ if (exact !== undefined) {
43
+ unused.delete(exact);
44
+ items.push({ change: "unchanged", current: hook, previous: previous[exact] });
45
+ continue;
46
+ }
47
+ let changed = [...unused].find((index) => {
48
+ const old = previous[index];
49
+ return (old.rawEvent === hook.rawEvent &&
50
+ (old.commandDigest === hook.commandDigest || old.matcher === hook.matcher));
51
+ });
52
+ // If both command and matcher changed, pair the remaining command at the
53
+ // same event when that match is unambiguous instead of presenting a noisy
54
+ // remove+add pair.
55
+ if (changed === undefined) {
56
+ const sameEvent = [...unused].filter((index) => previous[index].rawEvent === hook.rawEvent);
57
+ if (sameEvent.length === 1)
58
+ changed = sameEvent[0];
59
+ }
60
+ if (changed !== undefined) {
61
+ unused.delete(changed);
62
+ items.push({ change: "changed", current: hook, previous: previous[changed] });
63
+ continue;
64
+ }
65
+ items.push({ change: "added", current: hook });
66
+ }
67
+ for (const index of unused)
68
+ items.push({ change: "removed", previous: previous[index] });
69
+ return items;
70
+ }
71
+ function review(installKey, entry) {
72
+ const snapshot = inspectPluginHooks(entry.installPath);
73
+ return {
74
+ installKey,
75
+ plugin: pluginNameFromKey(installKey),
76
+ status: pluginHookApprovalState(entry, snapshot),
77
+ baselineAvailable: entry.approvedHookSnapshot !== undefined,
78
+ items: diffHookReview(pluginHookReviewSnapshot(snapshot), entry.approvedHookSnapshot),
79
+ ...(snapshot.error ? { error: snapshot.error } : {}),
80
+ };
81
+ }
82
+ /** Review current hooks against the last explicitly approved per-command snapshot. */
83
+ export function reviewPluginHooks(target) {
84
+ const data = readInstalledPlugins();
85
+ return matchingInstallKeys(data, target).flatMap((installKey) => (data.plugins[installKey] ?? []).map((entry) => review(installKey, entry)));
86
+ }
87
+ /** Approve the exact install-time digest; changed-on-disk hooks cannot be blessed. */
88
+ export function approvePluginHooks(target) {
89
+ const data = readInstalledPlugins();
90
+ const keys = matchingInstallKeys(data, target);
91
+ const out = [];
92
+ let writeNeeded = false;
93
+ for (const installKey of keys) {
94
+ for (const entry of data.plugins[installKey] ?? []) {
95
+ let entryChanged = false;
96
+ const snapshot = inspectPluginHooks(entry.installPath);
97
+ if (snapshot.state === "invalid") {
98
+ throw new Error(`plugin "${installKey}" hooks definition is invalid and cannot be approved: ${snapshot.error ?? "unknown error"}`);
99
+ }
100
+ if (entry.hookDigest && snapshot.digest !== entry.hookDigest) {
101
+ throw new Error(`plugin "${installKey}" hooks changed after install; reinstall or update before approving`);
102
+ }
103
+ if (!entry.hookDigest) {
104
+ entry.hookDigest = snapshot.digest;
105
+ entryChanged = true;
106
+ writeNeeded = true;
107
+ }
108
+ if (entry.approvedHookDigest !== entry.hookDigest) {
109
+ entry.approvedHookDigest = entry.hookDigest;
110
+ entryChanged = true;
111
+ writeNeeded = true;
112
+ }
113
+ const nextReview = pluginHookReviewSnapshot(snapshot);
114
+ if (JSON.stringify(entry.approvedHookSnapshot) !== JSON.stringify(nextReview)) {
115
+ entry.approvedHookSnapshot = nextReview;
116
+ entryChanged = true;
117
+ writeNeeded = true;
118
+ }
119
+ out.push(result(installKey, entry, entryChanged, snapshot));
120
+ }
121
+ }
122
+ if (writeNeeded)
123
+ writeInstalledPlugins(data);
124
+ return out;
125
+ }
126
+ /**
127
+ * Revoke hook execution. Legacy entries are first migrated to a recorded
128
+ * digest so revocation fails closed instead of falling back to legacy trust.
129
+ */
130
+ export function revokePluginHooks(target) {
131
+ const data = readInstalledPlugins();
132
+ const keys = matchingInstallKeys(data, target);
133
+ const out = [];
134
+ let writeNeeded = false;
135
+ for (const installKey of keys) {
136
+ for (const entry of data.plugins[installKey] ?? []) {
137
+ let entryChanged = false;
138
+ const snapshot = inspectPluginHooks(entry.installPath);
139
+ if (!entry.hookDigest) {
140
+ entry.hookDigest = snapshot.digest;
141
+ entryChanged = true;
142
+ }
143
+ if (snapshot.hasExecutableHooks || snapshot.state === "invalid") {
144
+ if (entry.approvedHookDigest !== undefined) {
145
+ delete entry.approvedHookDigest;
146
+ entryChanged = true;
147
+ }
148
+ }
149
+ else if (entry.approvedHookDigest !== entry.hookDigest) {
150
+ entry.approvedHookDigest = entry.hookDigest;
151
+ entryChanged = true;
152
+ }
153
+ writeNeeded ||= entryChanged;
154
+ out.push(result(installKey, entry, entryChanged, snapshot));
155
+ }
156
+ }
157
+ if (writeNeeded)
158
+ writeInstalledPlugins(data);
159
+ return out;
160
+ }
@@ -0,0 +1,69 @@
1
+ import type { PluginInstallEntry, StoredPluginHookReview } from "./types.js";
2
+ /** Hard limits for one canonical plugin hook definition. */
3
+ export declare const MAX_PLUGIN_HOOK_FILE_BYTES = 1048576;
4
+ export declare const MAX_PLUGIN_HOOK_EVENTS = 32;
5
+ export declare const MAX_PLUGIN_HOOK_GROUPS = 128;
6
+ export declare const MAX_PLUGIN_HOOK_COMMANDS = 256;
7
+ export declare const MAX_PLUGIN_HOOK_EVENT_NAME_LENGTH = 128;
8
+ export declare const MAX_PLUGIN_HOOK_COMMAND_LENGTH = 32768;
9
+ export declare const MAX_PLUGIN_HOOK_MATCHER_LENGTH = 4096;
10
+ export declare const MAX_PLUGIN_HOOK_TIMEOUT_MS = 600000;
11
+ export declare const MAX_PLUGIN_HOOK_REVIEW_COMMAND_LENGTH = 4096;
12
+ export declare const SUPPORTED_PLUGIN_HOOK_EVENTS: readonly ["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse", "PreCompact", "Notification", "Stop", "SubagentStop"];
13
+ export type SupportedPluginHookEvent = (typeof SUPPORTED_PLUGIN_HOOK_EVENTS)[number];
14
+ export interface ParsedPluginCommandHook {
15
+ command: string;
16
+ async?: boolean;
17
+ timeoutMs?: number;
18
+ }
19
+ export interface ParsedPluginHookGroup {
20
+ matcher?: string;
21
+ hooks: ParsedPluginCommandHook[];
22
+ }
23
+ export interface ParsedPluginHooksDefinition {
24
+ hooks: Partial<Record<SupportedPluginHookEvent, ParsedPluginHookGroup[]>>;
25
+ }
26
+ export interface PluginHooksSnapshot {
27
+ state: "absent" | "valid" | "invalid";
28
+ digest: string;
29
+ definition: ParsedPluginHooksDefinition | null;
30
+ hasExecutableHooks: boolean;
31
+ error?: string;
32
+ }
33
+ export type PluginHookIntegrity = "verified" | "changed" | "legacy";
34
+ export type PluginHookApprovalState = "approved" | "pending" | "changed" | "legacy" | "none";
35
+ /**
36
+ * Securely read and parse the one canonical hook file. All digest, approval,
37
+ * listing, and runtime decisions consume this snapshot so malformed or
38
+ * replaced files cannot be interpreted differently by separate code paths.
39
+ */
40
+ export declare function inspectPluginHooks(installPath: string): PluginHooksSnapshot;
41
+ /**
42
+ * Digest the exact canonical hooks file after it passes the bounded parser.
43
+ * Valid and absent definitions preserve the existing v1 digest contract;
44
+ * every invalid definition shares a fail-closed sentinel digest.
45
+ */
46
+ export declare function pluginHooksDigest(installPath: string): string;
47
+ /** Whether the bounded canonical definition currently contains an executable command hook. */
48
+ export declare function pluginHasExecutableHooks(installPath: string): boolean;
49
+ /** Build bounded, non-executable review metadata from one validated snapshot. */
50
+ export declare function pluginHookReviewSnapshot(snapshot: PluginHooksSnapshot): StoredPluginHookReview[];
51
+ /**
52
+ * Older installed_plugins.json entries predate hook digests and remain
53
+ * compatible as `legacy`. New entries fail closed when their effective hook
54
+ * file no longer matches the bytes approved by install/update.
55
+ */
56
+ export declare function verifyPluginHookIntegrity(entry: PluginInstallEntry, snapshot?: PluginHooksSnapshot): PluginHookIntegrity;
57
+ /**
58
+ * Runtime trust state for one installed plugin. Legacy entries stay compatible;
59
+ * new entries with executable hooks remain pending until the approved digest
60
+ * matches the install-time digest. Invalid definitions always fail closed as
61
+ * hook-free regardless of legacy state.
62
+ */
63
+ export declare function pluginHookApprovalState(entry: PluginInstallEntry, snapshot?: PluginHooksSnapshot): PluginHookApprovalState;
64
+ /**
65
+ * Integrity fields written at install/update. Hook-free packages approve the
66
+ * absent-hooks digest automatically; executable hooks require explicit trust.
67
+ * A previously approved identical digest remains approved across an update.
68
+ */
69
+ export declare function pluginHookInstallRecord(installPath: string, previousEntries?: PluginInstallEntry[]): Pick<PluginInstallEntry, "hookDigest" | "approvedHookDigest" | "approvedHookSnapshot">;