@cjhyy/code-shell-core 0.7.1 → 0.8.1

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 (595) 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 +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /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,9 +41,12 @@ 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
51
  * Run one plugin hook command. CC's exit-code 2 and explicit deny/reject JSON
46
52
  * are normalized to the native HookResult deny contract. Other failures stay
@@ -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
@@ -31,10 +34,21 @@
31
34
  * branch — not the CC one.
32
35
  */
33
36
  import { spawn } from "node:child_process";
37
+ import { createHash } from "node:crypto";
38
+ import { mkdirSync } from "node:fs";
39
+ import { homedir } from "node:os";
40
+ import { join } from "node:path";
34
41
  import { MAX_HOOK_OUTPUT_BYTES } from "../hooks/hook-output.js";
35
42
  import { closeHookStdin, MAX_HOOK_STDIN_BYTES, writeHookStdin } from "../hooks/shell-runner.js";
36
43
  import { killChildTree } from "../runtime/spawn-common.js";
37
44
  const DEFAULT_TIMEOUT_MS = 60_000;
45
+ function codeShellHome() {
46
+ return process.env.CODE_SHELL_HOME || join(process.env.HOME ?? homedir(), ".code-shell");
47
+ }
48
+ export function resolvePluginDataPath(pluginKey) {
49
+ const stableKey = createHash("sha256").update(pluginKey).digest("hex");
50
+ return join(codeShellHome(), "plugin-data", stableKey);
51
+ }
38
52
  /**
39
53
  * Extract the user-facing context string from a CC plugin's stdout JSON.
40
54
  * Returns null if the payload doesn't carry context (which is valid — the
@@ -107,19 +121,23 @@ export async function runPluginCommandHook(spec, ctx, abortSignal) {
107
121
  return new Promise((resolve) => {
108
122
  let child;
109
123
  try {
110
- // Strip CLAUDE_PLUGIN_ROOT from the inherited env: a plugin script
111
- // that branches on `[ -n "$CLAUDE_PLUGIN_ROOT" ]` must conclude
124
+ const pluginDataPath = spec.dataPath ?? resolvePluginDataPath(spec.pluginKey);
125
+ mkdirSync(pluginDataPath, { recursive: true, mode: 0o700 });
126
+ // Strip Claude-specific plugin vars from the inherited env: a plugin
127
+ // script that branches on `[ -n "$CLAUDE_PLUGIN_ROOT" ]` must conclude
112
128
  // "not Claude Code" and pick the codeshell branch. varRewrite.ts
113
- // converted the literal `${CLAUDE_PLUGIN_ROOT}` references to the
114
- // codeshell name; this drop closes the runtime side of the same
115
- // story.
129
+ // converted literal root/data references to CodeShell-native names;
130
+ // this drop closes the runtime side of the same story.
116
131
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
117
- const { CLAUDE_PLUGIN_ROOT: _stripped, ...parentEnv } = process.env;
132
+ const { CLAUDE_PLUGIN_ROOT: _strippedRoot, CLAUDE_PLUGIN_DATA: _strippedData, ...parentEnv } = process.env;
118
133
  child = spawn(spec.command, [], {
119
134
  shell: true,
120
135
  env: {
121
136
  ...parentEnv,
122
137
  CODESHELL_PLUGIN_ROOT: spec.installPath,
138
+ PLUGIN_ROOT: spec.installPath,
139
+ CODESHELL_PLUGIN_DATA: pluginDataPath,
140
+ PLUGIN_DATA: pluginDataPath,
123
141
  CODESHELL_HOOK_EVENT: ctx.eventName,
124
142
  },
125
143
  });
@@ -133,7 +151,6 @@ export async function runPluginCommandHook(spec, ctx, abortSignal) {
133
151
  let stdout = "";
134
152
  let stderr = "";
135
153
  let settled = false;
136
- let timer;
137
154
  // Output byte caps mirror src/hooks/shell-runner.ts so a chatty plugin
138
155
  // hook can't hold engine memory hostage. Past the cap we SIGTERM the
139
156
  // child and treat the hook as failed; stderr cap truncates with a
@@ -153,7 +170,7 @@ export async function runPluginCommandHook(spec, ctx, abortSignal) {
153
170
  killChildTree(child, 1000);
154
171
  settle({});
155
172
  };
156
- timer = setTimeout(() => {
173
+ const timer = setTimeout(() => {
157
174
  // eslint-disable-next-line no-console
158
175
  console.warn(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} timed out after ${timeoutMs}ms`);
159
176
  // win32: taskkill /T reaps the tree; POSIX: SIGTERM → grace → SIGKILL.
@@ -21,5 +21,24 @@ export interface PluginCommand {
21
21
  /** Absolute path to the .md file. */
22
22
  filePath: string;
23
23
  }
24
+ export interface PluginCommandDescriptor {
25
+ name: string;
26
+ pluginName: string;
27
+ description: string;
28
+ argumentHint?: string;
29
+ }
30
+ /** Bounded prompt contribution limits shared by Desktop, TUI, and protocol hosts. */
31
+ export declare const MAX_PLUGIN_COMMAND_FILE_BYTES: number;
32
+ export declare const MAX_PLUGIN_COMMAND_ARGUMENT_CHARS: number;
33
+ export declare const MAX_PLUGIN_COMMAND_EXPANDED_CHARS: number;
24
34
  export declare function scanPluginCommands(): PluginCommand[];
25
35
  export declare function invalidatePluginCommandsCache(): void;
36
+ export declare function describePluginCommands(commands: readonly Pick<PluginCommand, "name" | "pluginName" | "description" | "argumentHint">[], disabledPluginNames?: ReadonlySet<string>): PluginCommandDescriptor[];
37
+ /**
38
+ * Expand CC/CodeShell and deprecated Codex custom-prompt placeholders.
39
+ *
40
+ * Codex plugins in the wild still ship `prompts/*.md`, so compatibility needs
41
+ * `$1`…`$9`, named `KEY=value` placeholders, `$ARGUMENTS`, and `$$` literals
42
+ * even though new upstream workflows are expected to use skills.
43
+ */
44
+ export declare function expandPluginCommandBody(body: string, rawArguments?: string): string;