@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
@@ -30,22 +30,24 @@
30
30
  * PreCompact → pre_compact
31
31
  * Notification → notification
32
32
  * Stop → on_session_end
33
- * SubagentStop → (skipped codeshell sub-agents don't surface this event)
33
+ * SubagentStop → notification (implied matcher on kind ^agent_(completed|failed|cancelled)$)
34
34
  *
35
35
  * matcher semantics:
36
36
  * SessionStart — matches against ctx.data.source ("startup"|"resume"|"clear"|"compact")
37
37
  * PreToolUse /
38
38
  * PostToolUse — matches against ctx.data.toolName
39
+ * Notification /
40
+ * SubagentStop — matches against ctx.data.kind (agent_* terminal states,
41
+ * approval_requested/resolved, mcp_server_*, …)
39
42
  * other events — matcher is currently ignored (the CC spec doesn't
40
43
  * define matcher semantics for them either)
41
44
  *
42
45
  * Errors are swallowed per-plugin: a malformed hooks.json from one plugin
43
46
  * must not block other plugins from loading.
44
47
  */
45
- import { existsSync, readFileSync } from "node:fs";
46
- import { join } from "node:path";
47
48
  import { readInstalledPlugins } from "./installedPlugins.js";
48
49
  import { runPluginCommandHook } from "./pluginCommandHook.js";
50
+ import { inspectPluginHooks, pluginHookApprovalState, verifyPluginHookIntegrity, } from "./pluginHookIntegrity.js";
49
51
  /** Priority for plugin hooks — between built-in (100) and settings (50). */
50
52
  const PLUGIN_HOOK_PRIORITY = 80;
51
53
  const EVENT_NAME_MAP = {
@@ -56,31 +58,24 @@ const EVENT_NAME_MAP = {
56
58
  PreCompact: "pre_compact",
57
59
  Notification: "notification",
58
60
  Stop: "on_session_end",
59
- SubagentStop: null,
61
+ // Sub-agent terminal states surface on the notification hook with
62
+ // kind "agent_completed" / "agent_failed" / "agent_cancelled"; the matcher
63
+ // filters on that kind, so SubagentStop maps to a kind-filtered
64
+ // notification subscription (notify-only — codeshell sub-agent stops are
65
+ // not interceptable the way CC's SubagentStop is).
66
+ SubagentStop: "notification",
67
+ };
68
+ /** CC events whose codeshell notification `kind` the matcher defaults to when absent. */
69
+ const IMPLIED_NOTIFICATION_KIND = {
70
+ SubagentStop: "^agent_(completed|failed|cancelled)$",
60
71
  };
61
- function readHooksJson(installPath) {
62
- const path = join(installPath, "hooks", "hooks.json");
63
- if (!existsSync(path))
64
- return null;
65
- try {
66
- const raw = JSON.parse(readFileSync(path, "utf8"));
67
- if (raw && typeof raw === "object" && !Array.isArray(raw)) {
68
- return raw;
69
- }
70
- }
71
- catch (err) {
72
- // eslint-disable-next-line no-console
73
- console.warn(`[plugin-hooks] failed to parse ${path}:`, err.message);
74
- }
75
- return null;
76
- }
77
72
  /**
78
73
  * Per-event matcher logic. Returns true when the hook should fire.
79
74
  *
80
75
  * We only consult the matcher for events where CC defines its semantics;
81
76
  * for others we always fire (matcher is treated as advisory metadata only).
82
77
  */
83
- function matcherAccepts(event, matcher, ctx) {
78
+ export function matcherAccepts(event, matcher, ctx) {
84
79
  if (!matcher)
85
80
  return true;
86
81
  let re;
@@ -88,8 +83,9 @@ function matcherAccepts(event, matcher, ctx) {
88
83
  re = new RegExp(matcher);
89
84
  }
90
85
  catch {
91
- // Bad regex be permissive (matches CC's "log + drop" behavior).
92
- return true;
86
+ // Runtime definitions are pre-validated, but direct callers still fail
87
+ // closed if they supply an invalid expression.
88
+ return false;
93
89
  }
94
90
  if (event === "on_session_start") {
95
91
  const source = ctx.data.source;
@@ -103,12 +99,36 @@ function matcherAccepts(event, matcher, ctx) {
103
99
  return false;
104
100
  return re.test(toolName);
105
101
  }
102
+ if (event === "notification") {
103
+ // Notification fan-in carries a `kind` discriminator (agent_* terminal
104
+ // states, approval_requested/resolved, mcp_server_*…). Matcher filters on
105
+ // it so a subscriber only wakes for the kinds it cares about.
106
+ const kind = ctx.data.kind;
107
+ if (typeof kind !== "string")
108
+ return true;
109
+ return re.test(kind);
110
+ }
106
111
  return true;
107
112
  }
108
113
  function pluginNameFromKey(key) {
109
114
  const at = key.lastIndexOf("@");
110
115
  return at > 0 ? key.slice(0, at) : key;
111
116
  }
117
+ function* iteratePluginHooks(definition) {
118
+ for (const rawEvent of Object.keys(definition.hooks)) {
119
+ const event = EVENT_NAME_MAP[rawEvent];
120
+ for (const group of definition.hooks[rawEvent] ?? []) {
121
+ for (const command of group.hooks) {
122
+ yield {
123
+ rawEvent,
124
+ event,
125
+ matcher: group.matcher,
126
+ command,
127
+ };
128
+ }
129
+ }
130
+ }
131
+ }
112
132
  /**
113
133
  * Stable identity for ONE plugin-provided hook, used as the record key in
114
134
  * `capabilityOverrides.pluginHooks` (per-hook project off-switch). Derived
@@ -147,49 +167,42 @@ export function loadPluginHooks(registry, disabledPlugins = [], disabledPluginHo
147
167
  continue;
148
168
  for (const entry of entries) {
149
169
  const installPath = entry.installPath;
150
- if (!installPath || !existsSync(installPath))
170
+ if (!installPath)
151
171
  continue;
152
- const raw = readHooksJson(installPath);
153
- if (!raw?.hooks)
172
+ const snapshot = inspectPluginHooks(installPath);
173
+ const approval = pluginHookApprovalState(entry, snapshot);
174
+ if (approval === "pending" || approval === "changed" || approval === "none") {
175
+ // Pending and changed executable definitions fail closed. The rest of
176
+ // the plugin remains available; hook-free installs have nothing to load.
154
177
  continue;
155
- for (const [eventNameRaw, groups] of Object.entries(raw.hooks)) {
156
- const mapped = EVENT_NAME_MAP[eventNameRaw];
157
- if (mapped === null || mapped === undefined) {
158
- // Unmapped event name (e.g. SubagentStop) — silently skip; logging
159
- // every unknown event for every plugin would be noisy.
160
- continue;
161
- }
162
- if (!Array.isArray(groups))
178
+ }
179
+ if (!snapshot.definition)
180
+ continue;
181
+ for (const hook of iteratePluginHooks(snapshot.definition)) {
182
+ if (disabledHookSet.has(pluginHookKey({
183
+ plugin: pluginNameFromKey(key),
184
+ rawEvent: hook.rawEvent,
185
+ command: hook.command.command,
186
+ }))) {
163
187
  continue;
164
- for (const group of groups) {
165
- const commands = group.hooks ?? [];
166
- for (const cmd of commands) {
167
- if (cmd.type !== "command" || typeof cmd.command !== "string") {
168
- continue;
169
- }
170
- if (disabledHookSet.has(pluginHookKey({
171
- plugin: pluginNameFromKey(key),
172
- rawEvent: eventNameRaw,
173
- command: cmd.command,
174
- }))) {
175
- continue;
176
- }
177
- const commandLine = cmd.command;
178
- const timeoutMs = cmd.timeout_ms;
179
- const matcher = group.matcher;
180
- const handler = async (ctx) => {
181
- if (!matcherAccepts(mapped, matcher, ctx))
182
- return {};
183
- return runPluginCommandHook({
184
- command: commandLine,
185
- installPath,
186
- pluginKey: key,
187
- timeoutMs,
188
- }, ctx);
189
- };
190
- registry.register(mapped, handler, PLUGIN_HOOK_PRIORITY, `plugin:${pluginNameFromKey(key)}:${eventNameRaw}`);
191
- }
192
188
  }
189
+ const commandLine = hook.command.command;
190
+ const timeoutMs = hook.command.timeoutMs;
191
+ // A CC event that maps onto a SHARED codeshell event (SubagentStop
192
+ // → notification) gets an implied kind-matcher, so it only fires
193
+ // for the notification kinds that correspond to the CC semantics.
194
+ const matcher = hook.matcher ?? IMPLIED_NOTIFICATION_KIND[hook.rawEvent];
195
+ const handler = async (ctx) => {
196
+ if (!matcherAccepts(hook.event, matcher, ctx))
197
+ return {};
198
+ return runPluginCommandHook({
199
+ command: commandLine,
200
+ installPath,
201
+ pluginKey: key,
202
+ timeoutMs,
203
+ }, ctx);
204
+ };
205
+ registry.register(hook.event, handler, PLUGIN_HOOK_PRIORITY, `plugin:${pluginNameFromKey(key)}:${hook.rawEvent}`);
193
206
  }
194
207
  }
195
208
  }
@@ -211,32 +224,30 @@ export function listPluginHooks(disabledPlugins = []) {
211
224
  const disabled = disabledSet.has(plugin);
212
225
  for (const entry of entries) {
213
226
  const installPath = entry.installPath;
214
- if (!installPath || !existsSync(installPath))
227
+ if (!installPath)
215
228
  continue;
216
- const raw = readHooksJson(installPath);
217
- if (!raw?.hooks)
229
+ const snapshot = inspectPluginHooks(installPath);
230
+ const integrity = verifyPluginHookIntegrity(entry, snapshot);
231
+ const approval = pluginHookApprovalState(entry, snapshot);
232
+ if (!snapshot.definition)
218
233
  continue;
219
- for (const [eventNameRaw, groups] of Object.entries(raw.hooks)) {
220
- const mapped = EVENT_NAME_MAP[eventNameRaw];
221
- if (mapped === null || mapped === undefined)
222
- continue;
223
- if (!Array.isArray(groups))
224
- continue;
225
- for (const group of groups) {
226
- for (const cmd of group.hooks ?? []) {
227
- if (cmd.type !== "command" || typeof cmd.command !== "string")
228
- continue;
229
- out.push({
230
- plugin,
231
- event: mapped,
232
- rawEvent: eventNameRaw,
233
- command: cmd.command,
234
- matcher: group.matcher,
235
- disabled,
236
- key: pluginHookKey({ plugin, rawEvent: eventNameRaw, command: cmd.command }),
237
- });
238
- }
239
- }
234
+ for (const hook of iteratePluginHooks(snapshot.definition)) {
235
+ out.push({
236
+ installKey: key,
237
+ plugin,
238
+ event: hook.event,
239
+ rawEvent: hook.rawEvent,
240
+ command: hook.command.command,
241
+ matcher: hook.matcher,
242
+ disabled,
243
+ integrity,
244
+ approval,
245
+ key: pluginHookKey({
246
+ plugin,
247
+ rawEvent: hook.rawEvent,
248
+ command: hook.command.command,
249
+ }),
250
+ });
240
251
  }
241
252
  }
242
253
  }
@@ -0,0 +1,18 @@
1
+ import type { CronJob, CronScheduler } from "../automation/scheduler.js";
2
+ export declare const MAX_PLUGIN_AUTOMATIONS = 256;
3
+ export interface InstantiatePluginAutomationTemplateOptions {
4
+ scheduler: Pick<CronScheduler, "create" | "list">;
5
+ installKey: string;
6
+ templateId: string;
7
+ expectedRevision: string;
8
+ cwd?: string;
9
+ /** Effective project/global disable list computed by the host for this cwd. */
10
+ disabledPluginNames: ReadonlySet<string>;
11
+ maxJobs?: number;
12
+ }
13
+ /**
14
+ * Copy an installed plugin template into a standalone cron job. This never
15
+ * runs during install/update and never trusts executable fields supplied by a
16
+ * renderer or protocol client.
17
+ */
18
+ export declare function instantiatePluginAutomationTemplate(options: InstantiatePluginAutomationTemplateOptions): CronJob;
@@ -0,0 +1,50 @@
1
+ import { loadPluginAutomationTemplateContributions } from "./pluginCatalog.js";
2
+ export const MAX_PLUGIN_AUTOMATIONS = 256;
3
+ /**
4
+ * Copy an installed plugin template into a standalone cron job. This never
5
+ * runs during install/update and never trusts executable fields supplied by a
6
+ * renderer or protocol client.
7
+ */
8
+ export function instantiatePluginAutomationTemplate(options) {
9
+ if (typeof options.installKey !== "string" || !options.installKey) {
10
+ throw new Error("installKey is required");
11
+ }
12
+ if (typeof options.templateId !== "string" || !options.templateId) {
13
+ throw new Error("templateId is required");
14
+ }
15
+ if (!/^[a-f0-9]{64}$/.test(options.expectedRevision)) {
16
+ throw new Error("automation template revision is invalid");
17
+ }
18
+ const contribution = loadPluginAutomationTemplateContributions().find((entry) => entry.installKey === options.installKey && entry.template.id === options.templateId);
19
+ if (!contribution) {
20
+ throw new Error(`automation template not found: ${options.installKey}/${options.templateId}`);
21
+ }
22
+ if (contribution.template.workspace === "current" && !options.cwd) {
23
+ throw new Error("this automation template requires a current project");
24
+ }
25
+ if (contribution.revision !== options.expectedRevision) {
26
+ throw new Error("automation template changed after review; review it again before creating");
27
+ }
28
+ if (options.disabledPluginNames.has(contribution.pluginName)) {
29
+ throw new Error(`plugin is disabled for this project: ${contribution.pluginName}`);
30
+ }
31
+ const maxJobs = options.maxJobs ?? MAX_PLUGIN_AUTOMATIONS;
32
+ if (!Number.isSafeInteger(maxJobs) || maxJobs <= 0) {
33
+ throw new Error("maxJobs must be a positive safe integer");
34
+ }
35
+ if (options.scheduler.list().length >= maxJobs) {
36
+ throw new Error(`automation limit reached (${maxJobs})`);
37
+ }
38
+ const template = contribution.template;
39
+ return options.scheduler.create(template.title.default, template.schedule, template.prompt, {
40
+ ...(template.workspace === "current" && options.cwd ? { cwd: options.cwd } : {}),
41
+ ...(template.timezone ? { timezone: template.timezone } : {}),
42
+ permissionLevel: template.permissionLevel,
43
+ templateSource: {
44
+ installKey: options.installKey,
45
+ templateId: options.templateId,
46
+ revision: contribution.revision,
47
+ ...(contribution.pluginVersion ? { pluginVersion: contribution.pluginVersion } : {}),
48
+ },
49
+ });
50
+ }
@@ -0,0 +1,45 @@
1
+ import { type PluginAutomationTemplate, type CanonicalPluginManifest as CanonicalPluginManifestData } from "./installer/types.js";
2
+ import type { InstalledPluginsV2 } from "./types.js";
3
+ /** Core-owned, trusted view of one installed plugin. */
4
+ export interface PluginCatalogEntry {
5
+ installKey: string;
6
+ name: string;
7
+ marketplace: string | null;
8
+ installPath: string;
9
+ version: string;
10
+ installedAt: string;
11
+ lastUpdated: string;
12
+ manifest: CanonicalPluginManifestData | null;
13
+ /** Reusable scheduled-task templates. They never instantiate during install. */
14
+ automationTemplates: readonly PluginAutomationTemplate[];
15
+ }
16
+ export interface LoadPluginCatalogOptions {
17
+ /** Override points make the loader reusable by isolated hosts and deterministic tests. */
18
+ root?: string;
19
+ installed?: InstalledPluginsV2;
20
+ }
21
+ export interface PluginAutomationTemplateContribution {
22
+ kind: "automation-template";
23
+ installKey: string;
24
+ pluginName: string;
25
+ marketplace: string | null;
26
+ installPath: string;
27
+ pluginVersion?: string;
28
+ revision: string;
29
+ template: PluginAutomationTemplate;
30
+ }
31
+ /**
32
+ * Stable content revision used to bind a user review to the exact template
33
+ * instantiated later. Install paths and timestamps are intentionally excluded.
34
+ */
35
+ export declare function pluginAutomationTemplateRevision(installKey: string, template: PluginAutomationTemplate): string;
36
+ /**
37
+ * Load the installed plugin catalog at the core boundary.
38
+ *
39
+ * Installed state is user-writable, so paths are realpath-contained before any
40
+ * manifest is exposed. Multiple scope rows for one install key collapse to the
41
+ * first safe entry, matching the current single-user-scope runtime contract.
42
+ */
43
+ export declare function loadPluginCatalog(options?: LoadPluginCatalogOptions): PluginCatalogEntry[];
44
+ /** Load reusable automation templates without creating or enabling any jobs. */
45
+ export declare function loadPluginAutomationTemplateContributions(options?: LoadPluginCatalogOptions): PluginAutomationTemplateContribution[];
@@ -0,0 +1,87 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { createHash } from "node:crypto";
3
+ import { join } from "node:path";
4
+ import { readInstalledPlugins } from "./installedPlugins.js";
5
+ import { pluginsRoot } from "./installer/paths.js";
6
+ import { CANONICAL_PLUGIN_MANIFEST_FILE, CanonicalPluginManifest, } from "./installer/types.js";
7
+ import { resolveSafePluginPath } from "./pluginInstaller.js";
8
+ /**
9
+ * Stable content revision used to bind a user review to the exact template
10
+ * instantiated later. Install paths and timestamps are intentionally excluded.
11
+ */
12
+ export function pluginAutomationTemplateRevision(installKey, template) {
13
+ return createHash("sha256")
14
+ .update("codeshell-plugin-automation-template-v1")
15
+ .update("\0")
16
+ .update(installKey)
17
+ .update("\0")
18
+ .update(JSON.stringify(template))
19
+ .digest("hex");
20
+ }
21
+ function readCanonicalManifest(installPath) {
22
+ const file = join(installPath, CANONICAL_PLUGIN_MANIFEST_FILE);
23
+ if (!existsSync(file))
24
+ return null;
25
+ try {
26
+ return CanonicalPluginManifest.parse(JSON.parse(readFileSync(file, "utf-8")));
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ function identityFromInstallKey(installKey, manifest) {
33
+ const at = installKey.lastIndexOf("@");
34
+ if (at > 0 && at < installKey.length - 1) {
35
+ return { name: installKey.slice(0, at), marketplace: installKey.slice(at + 1) };
36
+ }
37
+ return { name: manifest?.name ?? installKey, marketplace: null };
38
+ }
39
+ /**
40
+ * Load the installed plugin catalog at the core boundary.
41
+ *
42
+ * Installed state is user-writable, so paths are realpath-contained before any
43
+ * manifest is exposed. Multiple scope rows for one install key collapse to the
44
+ * first safe entry, matching the current single-user-scope runtime contract.
45
+ */
46
+ export function loadPluginCatalog(options = {}) {
47
+ const root = options.root ?? pluginsRoot();
48
+ const installed = options.installed ?? readInstalledPlugins();
49
+ const catalog = [];
50
+ const loadedKeys = new Set();
51
+ for (const installKey of Object.keys(installed.plugins).sort()) {
52
+ for (const entry of installed.plugins[installKey] ?? []) {
53
+ if (loadedKeys.has(installKey))
54
+ break;
55
+ const installPath = resolveSafePluginPath(entry.installPath, root);
56
+ if (!installPath)
57
+ continue;
58
+ const manifest = readCanonicalManifest(installPath);
59
+ const identity = identityFromInstallKey(installKey, manifest);
60
+ catalog.push({
61
+ installKey,
62
+ ...identity,
63
+ installPath,
64
+ version: entry.version,
65
+ installedAt: entry.installedAt,
66
+ lastUpdated: entry.lastUpdated,
67
+ manifest,
68
+ automationTemplates: manifest?.automations?.templates ?? [],
69
+ });
70
+ loadedKeys.add(installKey);
71
+ }
72
+ }
73
+ return catalog;
74
+ }
75
+ /** Load reusable automation templates without creating or enabling any jobs. */
76
+ export function loadPluginAutomationTemplateContributions(options = {}) {
77
+ return loadPluginCatalog(options).flatMap((plugin) => plugin.automationTemplates.map((template) => ({
78
+ kind: "automation-template",
79
+ installKey: plugin.installKey,
80
+ pluginName: plugin.name,
81
+ marketplace: plugin.marketplace,
82
+ installPath: plugin.installPath,
83
+ ...(plugin.manifest?.version ? { pluginVersion: plugin.manifest.version } : {}),
84
+ revision: pluginAutomationTemplateRevision(plugin.installKey, template),
85
+ template,
86
+ })));
87
+ }
@@ -22,6 +22,9 @@
22
22
  * reference this via ${CODESHELL_PLUGIN_ROOT}
23
23
  * (varRewrite.ts rewrites CC's CLAUDE_PLUGIN_ROOT
24
24
  * to this name at install time).
25
+ * PLUGIN_ROOT — Codex-compatible alias for the installed root.
26
+ * CODESHELL_PLUGIN_DATA — stable writable state directory for this plugin.
27
+ * PLUGIN_DATA — Codex-compatible alias for the state directory.
25
28
  * CODESHELL_HOOK_EVENT — the codeshell-side event name (snake_case)
26
29
  *
27
30
  * We deliberately do NOT set CLAUDE_PLUGIN_ROOT here. Plugin scripts that
@@ -38,17 +41,20 @@ export interface PluginCommandHookSpec {
38
41
  installPath: string;
39
42
  /** Plugin install key (`name@marketplace`), used for log lines. */
40
43
  pluginKey: string;
44
+ /** Stable writable plugin data directory; primarily an injection point for tests/hosts. */
45
+ dataPath?: string;
41
46
  /** Per-hook override; falls back to DEFAULT_TIMEOUT_MS. */
42
47
  timeoutMs?: number;
43
48
  }
49
+ export declare function resolvePluginDataPath(pluginKey: string): string;
44
50
  /**
45
- * Run one plugin hook command. Returns an empty HookResult on any failure
46
- * (spawn error, timeout, non-zero exit, unparseable stdout) so the hook
47
- * chain keeps moving — a misbehaving plugin must not wedge the engine.
51
+ * Run one plugin hook command. CC's exit-code 2 and explicit deny/reject JSON
52
+ * are normalized to the native HookResult deny contract. Other failures stay
53
+ * non-blocking so a broken plugin does not wedge the engine.
48
54
  *
49
55
  * Stdin carries the same envelope shape the codeshell-native shell-runner
50
56
  * uses (eventName + data) so plugin authors who want richer context can
51
57
  * read it; CC plugins typically ignore stdin and emit context derived from
52
58
  * their own state (e.g. reading a SKILL.md off disk via PLUGIN_ROOT).
53
59
  */
54
- export declare function runPluginCommandHook(spec: PluginCommandHookSpec, ctx: HookContext): Promise<HookResult>;
60
+ export declare function runPluginCommandHook(spec: PluginCommandHookSpec, ctx: HookContext, abortSignal?: AbortSignal): Promise<HookResult>;