@cjhyy/code-shell-core 0.7.1 → 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 (594) 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/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /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;