@cjhyy/code-shell-core 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -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,9 +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";
42
+ import { closeHookStdin, MAX_HOOK_STDIN_BYTES, writeHookStdin } from "../hooks/shell-runner.js";
35
43
  import { killChildTree } from "../runtime/spawn-common.js";
36
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
+ }
37
52
  /**
38
53
  * Extract the user-facing context string from a CC plugin's stdout JSON.
39
54
  * Returns null if the payload doesn't carry context (which is valid — the
@@ -60,34 +75,69 @@ function extractAdditionalContext(parsed) {
60
75
  }
61
76
  return null;
62
77
  }
78
+ function extractExplicitDenial(parsed) {
79
+ if (!parsed || typeof parsed !== "object")
80
+ return null;
81
+ const obj = parsed;
82
+ const nested = obj.hookSpecificOutput && typeof obj.hookSpecificOutput === "object"
83
+ ? obj.hookSpecificOutput
84
+ : undefined;
85
+ const decision = obj.decision ?? obj.permissionDecision ?? nested?.decision ?? nested?.permissionDecision;
86
+ if (decision !== "deny" && decision !== "reject")
87
+ return null;
88
+ const message = obj.reason ??
89
+ obj.message ??
90
+ obj.permissionDecisionReason ??
91
+ nested?.reason ??
92
+ nested?.message ??
93
+ nested?.permissionDecisionReason;
94
+ return typeof message === "string" && message.trim() ? { message: message.trim() } : {};
95
+ }
96
+ function parseJson(stdout) {
97
+ if (!stdout)
98
+ return undefined;
99
+ try {
100
+ return JSON.parse(stdout);
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
63
106
  /**
64
- * Run one plugin hook command. Returns an empty HookResult on any failure
65
- * (spawn error, timeout, non-zero exit, unparseable stdout) so the hook
66
- * chain keeps moving — a misbehaving plugin must not wedge the engine.
107
+ * Run one plugin hook command. CC's exit-code 2 and explicit deny/reject JSON
108
+ * are normalized to the native HookResult deny contract. Other failures stay
109
+ * non-blocking so a broken plugin does not wedge the engine.
67
110
  *
68
111
  * Stdin carries the same envelope shape the codeshell-native shell-runner
69
112
  * uses (eventName + data) so plugin authors who want richer context can
70
113
  * read it; CC plugins typically ignore stdin and emit context derived from
71
114
  * their own state (e.g. reading a SKILL.md off disk via PLUGIN_ROOT).
72
115
  */
73
- export async function runPluginCommandHook(spec, ctx) {
116
+ export async function runPluginCommandHook(spec, ctx, abortSignal) {
74
117
  const timeoutMs = spec.timeoutMs ?? DEFAULT_TIMEOUT_MS;
118
+ const signal = abortSignal ?? ctx.data.signal;
119
+ if (signal?.aborted)
120
+ return {};
75
121
  return new Promise((resolve) => {
76
122
  let child;
77
123
  try {
78
- // Strip CLAUDE_PLUGIN_ROOT from the inherited env: a plugin script
79
- // 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
80
128
  // "not Claude Code" and pick the codeshell branch. varRewrite.ts
81
- // converted the literal `${CLAUDE_PLUGIN_ROOT}` references to the
82
- // codeshell name; this drop closes the runtime side of the same
83
- // story.
129
+ // converted literal root/data references to CodeShell-native names;
130
+ // this drop closes the runtime side of the same story.
84
131
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
85
- const { CLAUDE_PLUGIN_ROOT: _stripped, ...parentEnv } = process.env;
132
+ const { CLAUDE_PLUGIN_ROOT: _strippedRoot, CLAUDE_PLUGIN_DATA: _strippedData, ...parentEnv } = process.env;
86
133
  child = spawn(spec.command, [], {
87
134
  shell: true,
88
135
  env: {
89
136
  ...parentEnv,
90
137
  CODESHELL_PLUGIN_ROOT: spec.installPath,
138
+ PLUGIN_ROOT: spec.installPath,
139
+ CODESHELL_PLUGIN_DATA: pluginDataPath,
140
+ PLUGIN_DATA: pluginDataPath,
91
141
  CODESHELL_HOOK_EVENT: ctx.eventName,
92
142
  },
93
143
  });
@@ -112,8 +162,14 @@ export async function runPluginCommandHook(spec, ctx) {
112
162
  if (settled)
113
163
  return;
114
164
  settled = true;
165
+ clearTimeout(timer);
166
+ signal?.removeEventListener("abort", onAbort);
115
167
  resolve(value);
116
168
  };
169
+ const onAbort = () => {
170
+ killChildTree(child, 1000);
171
+ settle({});
172
+ };
117
173
  const timer = setTimeout(() => {
118
174
  // eslint-disable-next-line no-console
119
175
  console.warn(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} timed out after ${timeoutMs}ms`);
@@ -121,6 +177,9 @@ export async function runPluginCommandHook(spec, ctx) {
121
177
  killChildTree(child, 1000);
122
178
  settle({});
123
179
  }, timeoutMs);
180
+ signal?.addEventListener("abort", onAbort, { once: true });
181
+ if (signal?.aborted)
182
+ onAbort();
124
183
  child.stdout?.on("data", (chunk) => {
125
184
  stdoutBytes += chunk.length;
126
185
  if (stdoutBytes > MAX_HOOK_OUTPUT_BYTES) {
@@ -150,21 +209,29 @@ export async function runPluginCommandHook(spec, ctx) {
150
209
  console.error(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} spawn error:`, err.message);
151
210
  settle({});
152
211
  });
153
- child.on("close", (code) => {
154
- clearTimeout(timer);
212
+ let stdinFinished = false;
213
+ let pendingClose;
214
+ const handleClose = (code) => {
155
215
  if (stdoutCapped) {
156
216
  // eslint-disable-next-line no-console
157
217
  console.error(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} killed due to oversized stdout (> ${MAX_HOOK_OUTPUT_BYTES} bytes)`);
158
218
  settle({});
159
219
  return;
160
220
  }
221
+ const trimmed = stdout.trim();
222
+ const parsedForDecision = parseJson(trimmed);
223
+ const explicitDenial = extractExplicitDenial(parsedForDecision);
224
+ if (code === 2 || explicitDenial) {
225
+ const message = stderr.trim() || explicitDenial?.message || "Plugin denied this tool operation";
226
+ settle({ decision: "deny", messages: [message] });
227
+ return;
228
+ }
161
229
  if (code !== 0) {
162
230
  // eslint-disable-next-line no-console
163
231
  console.warn(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} exited ${code}; stderr:`, stderr.slice(0, 500));
164
232
  settle({});
165
233
  return;
166
234
  }
167
- const trimmed = stdout.trim();
168
235
  if (trimmed.length === 0) {
169
236
  settle({});
170
237
  return;
@@ -185,16 +252,64 @@ export async function runPluginCommandHook(spec, ctx) {
185
252
  return;
186
253
  }
187
254
  settle({ messages: [additional] });
255
+ };
256
+ child.on("close", (code) => {
257
+ clearTimeout(timer);
258
+ if (settled)
259
+ return;
260
+ if (!stdinFinished && !stdoutCapped) {
261
+ pendingClose = { code };
262
+ return;
263
+ }
264
+ handleClose(code);
188
265
  });
266
+ const finishStdin = () => {
267
+ stdinFinished = true;
268
+ if (pendingClose && !settled) {
269
+ const { code } = pendingClose;
270
+ pendingClose = undefined;
271
+ handleClose(code);
272
+ }
273
+ };
189
274
  // Stdin envelope: matches the shape codeshell-native shell hooks use.
190
- // CC plugins generally don't read stdin, but writing it is cheap and
191
- // keeps the protocol open for plugin authors who want it.
275
+ let envelope;
192
276
  try {
193
- child.stdin?.write(JSON.stringify({ eventName: ctx.eventName, data: ctx.data }));
194
- child.stdin?.end();
277
+ envelope = JSON.stringify({ eventName: ctx.eventName, data: ctx.data });
195
278
  }
196
279
  catch {
197
- // Child may have closed stdin already; not fatal.
280
+ closeHookStdin(child.stdin);
281
+ finishStdin();
282
+ return;
198
283
  }
284
+ if (Buffer.byteLength(envelope, "utf8") > MAX_HOOK_STDIN_BYTES) {
285
+ // eslint-disable-next-line no-console
286
+ console.warn(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} stdin exceeded ${MAX_HOOK_STDIN_BYTES} bytes; running without envelope`);
287
+ closeHookStdin(child.stdin);
288
+ finishStdin();
289
+ return;
290
+ }
291
+ setImmediate(() => {
292
+ void (async () => {
293
+ if (settled)
294
+ return;
295
+ try {
296
+ await writeHookStdin(child.stdin, envelope);
297
+ finishStdin();
298
+ }
299
+ catch (error) {
300
+ clearTimeout(timer);
301
+ const err = error;
302
+ const failure = {
303
+ type: "stdin_error",
304
+ code: typeof err?.code === "string" ? err.code : "UNKNOWN",
305
+ message: err instanceof Error ? err.message : String(error),
306
+ };
307
+ // eslint-disable-next-line no-console
308
+ console.error(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} stdin error:`, failure.message);
309
+ killChildTree(child, 1000);
310
+ settle({ data: { hookFailure: failure } });
311
+ }
312
+ })();
313
+ });
199
314
  });
200
315
  }
@@ -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;
@@ -5,12 +5,16 @@
5
5
  * MVP subset (single-level commands directory, no nested subcommands,
6
6
  * no inline-via-plugin.json commands).
7
7
  */
8
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
9
- import { join } from "node:path";
8
+ import { closeSync, constants, existsSync, fstatSync, openSync, readdirSync, readSync, realpathSync, statSync, } from "node:fs";
9
+ import { isAbsolute, join, relative, sep } from "node:path";
10
10
  import { homedir } from "node:os";
11
11
  import { memoize } from "../utils/memoize.js";
12
12
  import { parseFrontmatter, coerceDescription } from "../skills/frontmatter.js";
13
13
  import { installedPluginsPath, readInstalledPlugins } from "./installedPlugins.js";
14
+ /** Bounded prompt contribution limits shared by Desktop, TUI, and protocol hosts. */
15
+ export const MAX_PLUGIN_COMMAND_FILE_BYTES = 256 * 1024;
16
+ export const MAX_PLUGIN_COMMAND_ARGUMENT_CHARS = 32 * 1024;
17
+ export const MAX_PLUGIN_COMMAND_EXPANDED_CHARS = 512 * 1024;
14
18
  function isENOENT(e) {
15
19
  return (typeof e === "object" && e !== null && "code" in e && e.code === "ENOENT");
16
20
  }
@@ -18,14 +22,34 @@ function isInaccessible(e) {
18
22
  if (typeof e !== "object" || e === null || !("code" in e))
19
23
  return false;
20
24
  const code = e.code;
21
- return code === "EACCES" || code === "EPERM" || code === "EIO";
25
+ return code === "EACCES" || code === "EPERM" || code === "EIO" || code === "ELOOP";
22
26
  }
23
27
  function userHome() {
24
28
  return process.env.HOME ?? homedir();
25
29
  }
26
30
  function readCommandFile(filePath) {
31
+ let fd;
27
32
  try {
28
- return readFileSync(filePath, "utf-8");
33
+ fd = openSync(filePath, constants.O_RDONLY | constants.O_NOFOLLOW);
34
+ const stat = fstatSync(fd);
35
+ if (!stat.isFile() || stat.size > MAX_PLUGIN_COMMAND_FILE_BYTES)
36
+ return null;
37
+ const chunks = [];
38
+ let total = 0;
39
+ while (true) {
40
+ const remaining = MAX_PLUGIN_COMMAND_FILE_BYTES + 1 - total;
41
+ if (remaining <= 0)
42
+ return null;
43
+ const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, remaining));
44
+ const bytesRead = readSync(fd, chunk, 0, chunk.length, null);
45
+ if (bytesRead === 0)
46
+ break;
47
+ total += bytesRead;
48
+ if (total > MAX_PLUGIN_COMMAND_FILE_BYTES)
49
+ return null;
50
+ chunks.push(chunk.subarray(0, bytesRead));
51
+ }
52
+ return Buffer.concat(chunks, total).toString("utf-8");
29
53
  }
30
54
  catch (e) {
31
55
  if (isENOENT(e))
@@ -37,6 +61,29 @@ function readCommandFile(filePath) {
37
61
  }
38
62
  throw e;
39
63
  }
64
+ finally {
65
+ if (fd !== undefined)
66
+ closeSync(fd);
67
+ }
68
+ }
69
+ /**
70
+ * Resolve a plugin contribution through symlinks and require it to remain
71
+ * inside its declared owner directory. Installed plugin trees are untrusted:
72
+ * without this check `commands -> /some/private/dir` or `command.md` symlinks
73
+ * could make the host read arbitrary local Markdown and expose it as a prompt.
74
+ */
75
+ function resolveContainedPath(root, candidate) {
76
+ try {
77
+ const realRoot = realpathSync(root);
78
+ const realCandidate = realpathSync(candidate);
79
+ const rel = relative(realRoot, realCandidate);
80
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel))
81
+ return null;
82
+ return realCandidate;
83
+ }
84
+ catch {
85
+ return null;
86
+ }
40
87
  }
41
88
  function scanOnce() {
42
89
  const data = readInstalledPlugins();
@@ -51,14 +98,17 @@ function scanOnce() {
51
98
  const commandsDir = join(entry.installPath, "commands");
52
99
  if (!existsSync(commandsDir))
53
100
  continue;
101
+ const resolvedCommandsDir = resolveContainedPath(entry.installPath, commandsDir);
102
+ if (!resolvedCommandsDir)
103
+ continue;
54
104
  let dirEntries;
55
105
  try {
56
- dirEntries = readdirSync(commandsDir, { withFileTypes: true });
106
+ dirEntries = readdirSync(resolvedCommandsDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
57
107
  }
58
108
  catch (e) {
59
109
  if (isInaccessible(e)) {
60
110
  // eslint-disable-next-line no-console
61
- console.warn(`[plugin-commands] cannot read ${commandsDir}: ${e.message}`);
111
+ console.warn(`[plugin-commands] cannot read ${resolvedCommandsDir}: ${e.message}`);
62
112
  continue;
63
113
  }
64
114
  throw e;
@@ -68,7 +118,17 @@ function scanOnce() {
68
118
  continue;
69
119
  if (!dirent.name.endsWith(".md"))
70
120
  continue;
71
- const filePath = join(commandsDir, dirent.name);
121
+ const filePath = resolveContainedPath(resolvedCommandsDir, join(resolvedCommandsDir, dirent.name));
122
+ if (!filePath)
123
+ continue;
124
+ try {
125
+ const fileStat = statSync(filePath);
126
+ if (!fileStat.isFile() || fileStat.size > MAX_PLUGIN_COMMAND_FILE_BYTES)
127
+ continue;
128
+ }
129
+ catch {
130
+ continue;
131
+ }
72
132
  const raw = readCommandFile(filePath);
73
133
  if (raw === null)
74
134
  continue;
@@ -112,3 +172,117 @@ export function scanPluginCommands() {
112
172
  export function invalidatePluginCommandsCache() {
113
173
  memoized.cache.clear?.();
114
174
  }
175
+ function parsePluginCommandArguments(input) {
176
+ const tokens = [];
177
+ let current = "";
178
+ let quote = null;
179
+ let escaping = false;
180
+ const push = () => {
181
+ if (current.length === 0)
182
+ return;
183
+ tokens.push(current);
184
+ current = "";
185
+ };
186
+ for (const character of input.trim()) {
187
+ if (escaping) {
188
+ current += character;
189
+ escaping = false;
190
+ continue;
191
+ }
192
+ if (character === "\\" && quote !== "'") {
193
+ escaping = true;
194
+ continue;
195
+ }
196
+ if (quote) {
197
+ if (character === quote)
198
+ quote = null;
199
+ else
200
+ current += character;
201
+ continue;
202
+ }
203
+ if (character === "'" || character === '"') {
204
+ quote = character;
205
+ continue;
206
+ }
207
+ if (/\s/u.test(character)) {
208
+ push();
209
+ continue;
210
+ }
211
+ current += character;
212
+ }
213
+ if (escaping)
214
+ current += "\\";
215
+ push();
216
+ const positional = [];
217
+ const named = new Map();
218
+ for (const token of tokens) {
219
+ const assignment = /^([A-Z][A-Z0-9_]*)=(.*)$/u.exec(token);
220
+ if (assignment)
221
+ named.set(assignment[1], assignment[2]);
222
+ else
223
+ positional.push(token);
224
+ }
225
+ return { positional, named };
226
+ }
227
+ export function describePluginCommands(commands, disabledPluginNames = new Set()) {
228
+ return commands
229
+ .filter((command) => !disabledPluginNames.has(command.pluginName))
230
+ .map((command) => ({
231
+ name: command.name,
232
+ pluginName: command.pluginName,
233
+ description: command.description,
234
+ ...(command.argumentHint ? { argumentHint: command.argumentHint } : {}),
235
+ }))
236
+ .sort((left, right) => left.name.localeCompare(right.name));
237
+ }
238
+ const PLUGIN_COMMAND_PLACEHOLDER = /\$\$|\$ARGUMENTS|\{args\}|\$([1-9])|\$([A-Z][A-Z0-9_]*)(?![A-Z0-9_])/gu;
239
+ function pluginCommandReplacement(token, positionalIndex, namedPlaceholder, rawArguments, parsed) {
240
+ if (token === "$$")
241
+ return "$";
242
+ if (token === "$ARGUMENTS" || token === "{args}")
243
+ return rawArguments;
244
+ if (positionalIndex)
245
+ return parsed.positional[Number(positionalIndex) - 1] ?? "";
246
+ if (namedPlaceholder && parsed.named.has(namedPlaceholder)) {
247
+ return parsed.named.get(namedPlaceholder);
248
+ }
249
+ return token;
250
+ }
251
+ function assertExpansionBudget(body, rawArguments, parsed) {
252
+ if (Buffer.byteLength(body, "utf-8") > MAX_PLUGIN_COMMAND_FILE_BYTES) {
253
+ throw new Error(`plugin command body exceeds ${MAX_PLUGIN_COMMAND_FILE_BYTES} bytes`);
254
+ }
255
+ if (rawArguments.length > MAX_PLUGIN_COMMAND_ARGUMENT_CHARS) {
256
+ throw new Error(`plugin command arguments exceed ${MAX_PLUGIN_COMMAND_ARGUMENT_CHARS} characters`);
257
+ }
258
+ let projected = body.length;
259
+ for (const match of body.matchAll(PLUGIN_COMMAND_PLACEHOLDER)) {
260
+ projected +=
261
+ pluginCommandReplacement(match[0], match[1], match[2], rawArguments, parsed).length -
262
+ match[0].length;
263
+ if (projected > MAX_PLUGIN_COMMAND_EXPANDED_CHARS)
264
+ break;
265
+ }
266
+ if (projected > MAX_PLUGIN_COMMAND_EXPANDED_CHARS) {
267
+ throw new Error(`expanded plugin command exceeds ${MAX_PLUGIN_COMMAND_EXPANDED_CHARS} characters`);
268
+ }
269
+ }
270
+ /**
271
+ * Expand CC/CodeShell and deprecated Codex custom-prompt placeholders.
272
+ *
273
+ * Codex plugins in the wild still ship `prompts/*.md`, so compatibility needs
274
+ * `$1`…`$9`, named `KEY=value` placeholders, `$ARGUMENTS`, and `$$` literals
275
+ * even though new upstream workflows are expected to use skills.
276
+ */
277
+ export function expandPluginCommandBody(body, rawArguments = "") {
278
+ if (rawArguments.length > MAX_PLUGIN_COMMAND_ARGUMENT_CHARS) {
279
+ throw new Error(`plugin command arguments exceed ${MAX_PLUGIN_COMMAND_ARGUMENT_CHARS} characters`);
280
+ }
281
+ const parsed = parsePluginCommandArguments(rawArguments);
282
+ assertExpansionBudget(body, rawArguments, parsed);
283
+ const expanded = body.replace(PLUGIN_COMMAND_PLACEHOLDER, (token, positionalIndex, namedPlaceholder) => pluginCommandReplacement(token, positionalIndex, namedPlaceholder, rawArguments, parsed));
284
+ if (expanded.length > MAX_PLUGIN_COMMAND_EXPANDED_CHARS) {
285
+ throw new Error(`expanded plugin command exceeds ${MAX_PLUGIN_COMMAND_EXPANDED_CHARS} characters`);
286
+ }
287
+ return expanded;
288
+ }
@@ -6,6 +6,11 @@
6
6
  * loaders use so the inventory can't drift from what actually loads.
7
7
  */
8
8
  import { type PluginHookEntry } from "./loadPluginHooks.js";
9
+ import { type PluginHookReview } from "./pluginHookApproval.js";
10
+ import { type PluginAutomationTemplate } from "./installer/types.js";
11
+ export type PluginAutomationTemplateDescriptor = PluginAutomationTemplate & {
12
+ revision: string;
13
+ };
9
14
  export interface PluginContentInventory {
10
15
  /** skills/<name>/SKILL.md — name + frontmatter description when present. */
11
16
  skills: {
@@ -18,8 +23,12 @@ export interface PluginContentInventory {
18
23
  agents: string[];
19
24
  /** hooks/hooks.json entries (event + command), owner-filtered. */
20
25
  hooks: PluginHookEntry[];
26
+ /** Current hook definition compared with the last explicitly approved snapshot. */
27
+ hookReview?: PluginHookReview;
21
28
  /** MCP server names as merged (keyed `<plugin>:<server>` — bare name here). */
22
29
  mcpServers: string[];
30
+ /** Reusable scheduled-task templates; never instantiated automatically. */
31
+ automationTemplates: PluginAutomationTemplateDescriptor[];
23
32
  }
24
33
  /**
25
34
  * Inventory one plugin's contributions. `pluginName` is the bare name (no
@@ -27,4 +36,4 @@ export interface PluginContentInventory {
27
36
  * scanners the runtime loaders use (filtered to this plugin) so naming —
28
37
  * e.g. MCP's `<plugin>:<server>` record keys — matches what users see live.
29
38
  */
30
- export declare function describePluginContent(pluginName: string, installPath: string): PluginContentInventory;
39
+ export declare function describePluginContent(pluginName: string, installPath: string, installKey?: string): PluginContentInventory;