@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
@@ -1,4 +1,90 @@
1
1
  import { z } from "zod";
2
+ const PluginLocalizedTitle = z
3
+ .object({
4
+ default: z.string().min(1).max(120),
5
+ en: z.string().min(1).max(120).optional(),
6
+ "zh-CN": z.string().min(1).max(120).optional(),
7
+ })
8
+ .strict();
9
+ export const PluginAutomationTemplate = z
10
+ .object({
11
+ id: z.string().regex(/^[a-z][a-z0-9-]{0,63}$/),
12
+ title: PluginLocalizedTitle,
13
+ description: z.string().min(1).max(500).optional(),
14
+ schedule: z.string().min(1).max(128),
15
+ prompt: z.string().min(1).max(32_768),
16
+ timezone: z.string().min(1).max(100).optional(),
17
+ permissionLevel: z.enum(["read-only", "workspace-write", "full"]).default("read-only"),
18
+ workspace: z.enum(["current", "none"]).default("current"),
19
+ })
20
+ .strict();
21
+ export const PluginAutomationsManifest = z
22
+ .object({
23
+ version: z.literal(1),
24
+ templates: z.array(PluginAutomationTemplate).max(32),
25
+ })
26
+ .strict()
27
+ .superRefine((value, ctx) => {
28
+ const ids = new Set();
29
+ for (const [index, template] of value.templates.entries()) {
30
+ if (ids.has(template.id)) {
31
+ ctx.addIssue({
32
+ code: z.ZodIssueCode.custom,
33
+ path: ["templates", index, "id"],
34
+ message: `duplicate automation template id: ${template.id}`,
35
+ });
36
+ }
37
+ ids.add(template.id);
38
+ }
39
+ });
40
+ const CodexHooksDeclaration = z.union([
41
+ z.string(),
42
+ z.record(z.any()),
43
+ z.array(z.union([z.string(), z.record(z.any())])),
44
+ ]);
45
+ const HttpsPluginUrl = z
46
+ .string()
47
+ .url()
48
+ .max(2048)
49
+ .refine((value) => {
50
+ try {
51
+ const url = new URL(value);
52
+ return url.protocol === "https:" && Boolean(url.hostname) && !url.username && !url.password;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }, { message: "plugin interface URL must use https" });
58
+ export const PluginInterfaceMetadata = z
59
+ .object({
60
+ displayName: z.string().min(1).max(120).optional(),
61
+ shortDescription: z.string().min(1).max(300).optional(),
62
+ longDescription: z.string().min(1).max(4000).optional(),
63
+ developerName: z.string().min(1).max(160).optional(),
64
+ category: z.string().min(1).max(100).optional(),
65
+ capabilities: z.array(z.string().min(1).max(80)).max(32).optional(),
66
+ websiteURL: HttpsPluginUrl.optional(),
67
+ privacyPolicyURL: HttpsPluginUrl.optional(),
68
+ termsOfServiceURL: HttpsPluginUrl.optional(),
69
+ defaultPrompt: z.array(z.string().min(1).max(128)).max(3).optional(),
70
+ brandColor: z
71
+ .string()
72
+ .regex(/^#[0-9a-fA-F]{6}$/)
73
+ .optional(),
74
+ composerIcon: z.string().min(1).max(512).optional(),
75
+ logo: z.string().min(1).max(512).optional(),
76
+ logoDark: z.string().min(1).max(512).optional(),
77
+ screenshots: z.array(z.string().min(1).max(512)).max(3).optional(),
78
+ })
79
+ .strip();
80
+ /** CodeShell-only manifest overlay kept outside `.codex-plugin/plugin.json`. */
81
+ export const CodeShellPluginOverlay = z
82
+ .object({
83
+ schemaVersion: z.literal(1),
84
+ automations: PluginAutomationsManifest.optional(),
85
+ })
86
+ .strict();
87
+ export const CODESHELL_PLUGIN_OVERLAY_FILE = ".codeshell-plugin/plugin.json";
2
88
  /** Codex `.codex-plugin/plugin.json`. v1 reads required fields; unknowns pass through. */
3
89
  export const CodexPluginManifest = z
4
90
  .object({
@@ -9,8 +95,22 @@ export const CodexPluginManifest = z
9
95
  mcpServers: z.union([z.string(), z.record(z.any())]).optional(),
10
96
  skills: z.string().optional(),
11
97
  agents: z.string().optional(),
98
+ hooks: CodexHooksDeclaration.optional(),
99
+ interface: PluginInterfaceMetadata.passthrough().optional(),
12
100
  })
13
101
  .passthrough();
102
+ /** Trusted, normalized manifest written into an installed plugin directory. */
103
+ export const CanonicalPluginManifest = z
104
+ .object({
105
+ schemaVersion: z.literal(1),
106
+ name: z.string().min(1),
107
+ version: z.string().optional(),
108
+ description: z.string().optional(),
109
+ interface: PluginInterfaceMetadata.optional(),
110
+ automations: PluginAutomationsManifest.optional(),
111
+ })
112
+ .strict();
113
+ export const CANONICAL_PLUGIN_MANIFEST_FILE = ".cs-plugin-manifest.json";
14
114
  /** `.cs-meta.json` written into every installed plugin dir. */
15
115
  export const CSMeta = z.object({
16
116
  name: z.string(),
@@ -1,3 +1,8 @@
1
+ export declare const MAX_PLUGIN_ZIP_BYTES: number;
2
+ export declare const MAX_PLUGIN_ZIP_ENTRIES = 10000;
3
+ export declare const MAX_PLUGIN_ZIP_EXTRACTED_BYTES: number;
4
+ export declare const MAX_PLUGIN_ZIP_ENTRY_BYTES: number;
5
+ export declare const MAX_PLUGIN_ZIP_ENTRY_NAME = 1024;
1
6
  /**
2
7
  * Reject path traversal ("zip slip"): a malicious archive can carry entries
3
8
  * like `../../etc/foo` that escape the extraction root. We normalize and
@@ -12,3 +17,9 @@ export declare function safeJoin(destDir: string, entryName: string): string;
12
17
  * needs and keeps the surface safe.
13
18
  */
14
19
  export declare function extractZip(zipPath: string, destDir: string): Promise<void>;
20
+ /**
21
+ * Extract one repository-relative subtree from an archive with a single
22
+ * wrapper directory, as produced by GitHub source archives. Unrelated
23
+ * monorepo content is never materialized or counted against extracted limits.
24
+ */
25
+ export declare function extractZipSubdirectory(zipPath: string, destDir: string, subdirectory?: string): Promise<void>;
@@ -1,9 +1,14 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { createWriteStream } from "node:fs";
3
- import { mkdir } from "node:fs/promises";
3
+ import { mkdir, stat } from "node:fs/promises";
4
4
  import { dirname, join, normalize, sep } from "node:path";
5
5
  import { pipeline } from "node:stream/promises";
6
6
  import { PluginInstallError } from "./types.js";
7
+ export const MAX_PLUGIN_ZIP_BYTES = 128 * 1024 * 1024;
8
+ export const MAX_PLUGIN_ZIP_ENTRIES = 10_000;
9
+ export const MAX_PLUGIN_ZIP_EXTRACTED_BYTES = 256 * 1024 * 1024;
10
+ export const MAX_PLUGIN_ZIP_ENTRY_BYTES = 64 * 1024 * 1024;
11
+ export const MAX_PLUGIN_ZIP_ENTRY_NAME = 1_024;
7
12
  let _yauzl;
8
13
  function yauzl() {
9
14
  if (!_yauzl) {
@@ -17,6 +22,14 @@ function yauzl() {
17
22
  * require the resolved path to stay within `destDir`.
18
23
  */
19
24
  export function safeJoin(destDir, entryName) {
25
+ if (entryName.length === 0 ||
26
+ entryName.length > MAX_PLUGIN_ZIP_ENTRY_NAME ||
27
+ entryName.includes("\0") ||
28
+ entryName.includes("\\") ||
29
+ entryName.startsWith("/") ||
30
+ /^[A-Za-z]:/.test(entryName)) {
31
+ throw new PluginInstallError(`refusing unsafe zip entry name: ${entryName}`);
32
+ }
20
33
  // Zip entries always use forward slashes; normalize to the host separator.
21
34
  const target = normalize(join(destDir, entryName));
22
35
  const root = normalize(destDir.endsWith(sep) ? destDir : destDir + sep);
@@ -33,6 +46,10 @@ export function safeJoin(destDir, entryName) {
33
46
  * needs and keeps the surface safe.
34
47
  */
35
48
  export async function extractZip(zipPath, destDir) {
49
+ const archive = await stat(zipPath);
50
+ if (!archive.isFile() || archive.size > MAX_PLUGIN_ZIP_BYTES) {
51
+ throw new PluginInstallError(`plugin zip must be a regular file no larger than ${MAX_PLUGIN_ZIP_BYTES} bytes`);
52
+ }
36
53
  const zip = await openZip(zipPath);
37
54
  try {
38
55
  await drainEntries(zip, destDir);
@@ -41,6 +58,61 @@ export async function extractZip(zipPath, destDir) {
41
58
  zip.close();
42
59
  }
43
60
  }
61
+ /**
62
+ * Extract one repository-relative subtree from an archive with a single
63
+ * wrapper directory, as produced by GitHub source archives. Unrelated
64
+ * monorepo content is never materialized or counted against extracted limits.
65
+ */
66
+ export async function extractZipSubdirectory(zipPath, destDir, subdirectory = "") {
67
+ const archive = await stat(zipPath);
68
+ if (!archive.isFile() || archive.size > MAX_PLUGIN_ZIP_BYTES) {
69
+ throw new PluginInstallError(`plugin zip must be a regular file no larger than ${MAX_PLUGIN_ZIP_BYTES} bytes`);
70
+ }
71
+ const normalizedSubdirectory = subdirectory.replaceAll("\\", "/").replace(/\/+$/, "");
72
+ if (normalizedSubdirectory.startsWith("/") ||
73
+ normalizedSubdirectory.split("/").some((segment) => segment === "." || segment === "..")) {
74
+ throw new PluginInstallError(`refusing unsafe zip subdirectory: ${subdirectory}`);
75
+ }
76
+ let wrapper;
77
+ const prefix = normalizedSubdirectory ? `${normalizedSubdirectory}/` : "";
78
+ const zip = await openZip(zipPath);
79
+ try {
80
+ const selected = await drainEntries(zip, destDir, (entryName) => {
81
+ // Validate the original archive path before removing GitHub's generated
82
+ // top-level wrapper. safeJoin rejects traversal, absolute paths, NULs,
83
+ // drive letters, and backslashes.
84
+ safeJoin(destDir, entryName);
85
+ const slash = entryName.indexOf("/");
86
+ if (slash < 1)
87
+ return null;
88
+ const entryWrapper = entryName.slice(0, slash);
89
+ if (wrapper === undefined)
90
+ wrapper = entryWrapper;
91
+ else if (wrapper !== entryWrapper) {
92
+ throw new PluginInstallError("GitHub source archive contains multiple root directories");
93
+ }
94
+ const repositoryPath = entryName.slice(slash + 1);
95
+ if (!repositoryPath)
96
+ return null;
97
+ if (normalizedSubdirectory) {
98
+ if (repositoryPath !== normalizedSubdirectory && !repositoryPath.startsWith(prefix)) {
99
+ return null;
100
+ }
101
+ const relativePath = repositoryPath === normalizedSubdirectory ? "" : repositoryPath.slice(prefix.length);
102
+ return relativePath || null;
103
+ }
104
+ return repositoryPath;
105
+ });
106
+ if (selected === 0) {
107
+ throw new PluginInstallError(normalizedSubdirectory
108
+ ? `GitHub source archive does not contain subdirectory: ${normalizedSubdirectory}`
109
+ : "GitHub source archive is empty");
110
+ }
111
+ }
112
+ finally {
113
+ zip.close();
114
+ }
115
+ }
44
116
  function openZip(zipPath) {
45
117
  return new Promise((resolve, reject) => {
46
118
  yauzl().open(zipPath, { lazyEntries: true }, (err, z) => {
@@ -52,23 +124,65 @@ function openZip(zipPath) {
52
124
  });
53
125
  });
54
126
  }
55
- function drainEntries(zip, destDir) {
127
+ function drainEntries(zip, destDir, mapEntryName = (entryName) => entryName) {
56
128
  return new Promise((resolve, reject) => {
57
- zip.on("error", (e) => reject(e));
58
- zip.on("end", () => resolve());
129
+ let entryCount = 0;
130
+ let extractedBytes = 0;
131
+ let settled = false;
132
+ const fail = (error) => {
133
+ if (settled)
134
+ return;
135
+ settled = true;
136
+ zip.close();
137
+ reject(error);
138
+ };
139
+ zip.on("error", fail);
140
+ zip.on("end", () => {
141
+ if (settled)
142
+ return;
143
+ settled = true;
144
+ resolve(entryCount);
145
+ });
59
146
  zip.on("entry", (entry) => {
60
- const onErr = (e) => reject(e);
147
+ let entryName;
148
+ try {
149
+ entryName = mapEntryName(entry.fileName);
150
+ }
151
+ catch (error) {
152
+ fail(error);
153
+ return;
154
+ }
155
+ if (entryName === null) {
156
+ zip.readEntry();
157
+ return;
158
+ }
159
+ entryCount += 1;
160
+ if (entryCount > MAX_PLUGIN_ZIP_ENTRIES) {
161
+ fail(new PluginInstallError(`plugin zip contains more than ${MAX_PLUGIN_ZIP_ENTRIES} entries`));
162
+ return;
163
+ }
164
+ if (entryName.length > MAX_PLUGIN_ZIP_ENTRY_NAME ||
165
+ entry.uncompressedSize > MAX_PLUGIN_ZIP_ENTRY_BYTES) {
166
+ fail(new PluginInstallError(`plugin zip entry exceeds preview/install limits: ${entryName}`));
167
+ return;
168
+ }
169
+ extractedBytes += entry.uncompressedSize;
170
+ if (extractedBytes > MAX_PLUGIN_ZIP_EXTRACTED_BYTES) {
171
+ fail(new PluginInstallError(`plugin zip expands beyond ${MAX_PLUGIN_ZIP_EXTRACTED_BYTES} bytes`));
172
+ return;
173
+ }
174
+ const onErr = (e) => fail(e);
61
175
  // Directory entry — yauzl signals these with a trailing slash.
62
- if (/\/$/.test(entry.fileName)) {
63
- mkdir(safeJoin(destDir, entry.fileName), { recursive: true })
176
+ if (/\/$/.test(entryName)) {
177
+ mkdir(safeJoin(destDir, entryName), { recursive: true })
64
178
  .then(() => zip.readEntry())
65
179
  .catch(onErr);
66
180
  return;
67
181
  }
68
- const outPath = safeJoin(destDir, entry.fileName);
182
+ const outPath = safeJoin(destDir, entryName);
69
183
  zip.openReadStream(entry, (err, stream) => {
70
184
  if (err || !stream) {
71
- onErr(new PluginInstallError(`cannot read zip entry ${entry.fileName}: ${err?.message ?? "unknown"}`));
185
+ onErr(new PluginInstallError(`cannot read zip entry ${entryName}: ${err?.message ?? "unknown"}`));
72
186
  return;
73
187
  }
74
188
  mkdir(dirname(outPath), { recursive: true })
@@ -15,8 +15,8 @@ export interface UpdatePluginOptions {
15
15
  * on failure we delete any partial install and rename the backup back.
16
16
  *
17
17
  * Async fs only — this runs in the Electron main process, so we never block the
18
- * event loop with sync fs. process.pid (not Date.now(), unavailable here) makes
19
- * the backup name unique.
18
+ * event loop with sync fs. A random sibling name keeps concurrent attempts
19
+ * from deleting or restoring each other's backup.
20
20
  */
21
21
  export declare function reinstallAtomic(name: string, source: string, doInstall: () => Promise<unknown>): Promise<void>;
22
22
  /**
@@ -1,3 +1,4 @@
1
+ import { randomUUID } from "node:crypto";
1
2
  import { existsSync, readFileSync } from "node:fs";
2
3
  import { rename, rm } from "node:fs/promises";
3
4
  import { join } from "node:path";
@@ -7,6 +8,9 @@ import { installPluginFromPath } from "./install.js";
7
8
  import { installPluginFromSource } from "./installFromSource.js";
8
9
  import { parseSource } from "./parseSource.js";
9
10
  import { pluginInstallKey, readInstalledPlugins, removeInstallEntries, writeInstalledPlugins, } from "../installedPlugins.js";
11
+ import { pluginHookInstallRecord } from "../pluginHookIntegrity.js";
12
+ import { pluginMcpInstallRecord } from "../pluginMcpIntegrity.js";
13
+ import { readPluginMcp } from "./loadPluginMcp.js";
10
14
  import { CodexPluginManifest, CSMeta, PluginInstallError } from "./types.js";
11
15
  /**
12
16
  * Reinstall a plugin atomically: a failed update leaves the OLD plugin intact.
@@ -18,24 +22,56 @@ import { CodexPluginManifest, CSMeta, PluginInstallError } from "./types.js";
18
22
  * on failure we delete any partial install and rename the backup back.
19
23
  *
20
24
  * Async fs only — this runs in the Electron main process, so we never block the
21
- * event loop with sync fs. process.pid (not Date.now(), unavailable here) makes
22
- * the backup name unique.
25
+ * event loop with sync fs. A random sibling name keeps concurrent attempts
26
+ * from deleting or restoring each other's backup.
23
27
  */
24
28
  export async function reinstallAtomic(name, source, doInstall) {
25
29
  const dir = pluginInstallDir(name);
26
- const backup = `${dir}.bak-${process.pid}`;
30
+ const backup = `${dir}.bak-${process.pid}-${randomUUID()}`;
27
31
  // Capture the existing install_plugins.json entries so a failed reinstall can
28
32
  // restore them (uninstall-then-install used to drop them on failure; here the
29
33
  // old plugin survives, so its registration must survive too).
30
34
  const key = pluginInstallKey(name, "local");
31
35
  const savedEntries = readInstalledPlugins().plugins[key];
32
- await rm(backup, { recursive: true, force: true });
33
36
  await rename(dir, backup);
34
37
  // The installer re-adds the entry on success; remove the stale one first so a
35
38
  // successful reinstall doesn't accumulate a duplicate.
36
39
  removeInstallEntries(key);
37
40
  try {
38
41
  await doInstall();
42
+ if (savedEntries) {
43
+ const data = readInstalledPlugins();
44
+ const installed = data.plugins[key] ?? [];
45
+ let changed = false;
46
+ for (const entry of installed) {
47
+ const next = pluginHookInstallRecord(entry.installPath, savedEntries);
48
+ const nextMcp = pluginMcpInstallRecord(entry.installPath, Object.keys(readPluginMcp(entry.installPath, name)).length > 0, savedEntries);
49
+ if (entry.hookDigest !== next.hookDigest ||
50
+ entry.approvedHookDigest !== next.approvedHookDigest ||
51
+ JSON.stringify(entry.approvedHookSnapshot) !==
52
+ JSON.stringify(next.approvedHookSnapshot) ||
53
+ entry.mcpDigest !== nextMcp.mcpDigest ||
54
+ entry.approvedMcpDigest !== nextMcp.approvedMcpDigest) {
55
+ entry.hookDigest = next.hookDigest;
56
+ if (next.approvedHookDigest)
57
+ entry.approvedHookDigest = next.approvedHookDigest;
58
+ else
59
+ delete entry.approvedHookDigest;
60
+ if (next.approvedHookSnapshot)
61
+ entry.approvedHookSnapshot = next.approvedHookSnapshot;
62
+ else
63
+ delete entry.approvedHookSnapshot;
64
+ entry.mcpDigest = nextMcp.mcpDigest;
65
+ if (nextMcp.approvedMcpDigest)
66
+ entry.approvedMcpDigest = nextMcp.approvedMcpDigest;
67
+ else
68
+ delete entry.approvedMcpDigest;
69
+ changed = true;
70
+ }
71
+ }
72
+ if (changed)
73
+ writeInstalledPlugins(data);
74
+ }
39
75
  }
40
76
  catch (err) {
41
77
  // Roll back: drop any partial install, restore the old dir + its entries.
@@ -75,6 +111,9 @@ export async function updatePluginByName(name, installedAt, force, options = {})
75
111
  const parsed = parseSource(meta.source, {
76
112
  allowUnsafeTransport: options.allowUnsafeTransport === true,
77
113
  });
114
+ if (parsed.kind === "npm") {
115
+ throw new PluginInstallError("npm plugin auto-update is not available in Phase A; install an explicit npm:<package>@<version> source instead");
116
+ }
78
117
  if (parsed.kind === "remote") {
79
118
  // No local version to diff against — always re-clone and reinstall.
80
119
  await reinstallAtomic(name, meta.source, () => installPluginFromSource(parsed, name, installedAt));
@@ -30,20 +30,31 @@
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 type { HookEventName } from "../hooks/events.js";
48
+ import type { HookContext, HookEventName } from "../hooks/events.js";
46
49
  import type { HookRegistry } from "../hooks/registry.js";
50
+ import { type PluginHookApprovalState, type PluginHookIntegrity } from "./pluginHookIntegrity.js";
51
+ /**
52
+ * Per-event matcher logic. Returns true when the hook should fire.
53
+ *
54
+ * We only consult the matcher for events where CC defines its semantics;
55
+ * for others we always fire (matcher is treated as advisory metadata only).
56
+ */
57
+ export declare function matcherAccepts(event: HookEventName, matcher: string | undefined, ctx: HookContext): boolean;
47
58
  /**
48
59
  * Stable identity for ONE plugin-provided hook, used as the record key in
49
60
  * `capabilityOverrides.pluginHooks` (per-hook project off-switch). Derived
@@ -78,6 +89,8 @@ export declare function pluginHookKey(hook: {
78
89
  export declare function loadPluginHooks(registry: HookRegistry, disabledPlugins?: string[], disabledPluginHooks?: string[]): void;
79
90
  /** A single plugin-provided hook, surfaced read-only to the settings UI. */
80
91
  export interface PluginHookEntry {
92
+ /** Full install key (`plugin@marketplace`) used by approval APIs. */
93
+ installKey: string;
81
94
  /** Source plugin name (bare, no @marketplace). */
82
95
  plugin: string;
83
96
  /** Mapped codeshell event name. */
@@ -90,6 +103,10 @@ export interface PluginHookEntry {
90
103
  matcher?: string;
91
104
  /** Whether the owning plugin is currently disabled (its hooks don't fire). */
92
105
  disabled: boolean;
106
+ /** Install-time integrity state for the executable hook definition. */
107
+ integrity: PluginHookIntegrity;
108
+ /** Explicit execution trust state. Pending/changed hooks do not register. */
109
+ approval: PluginHookApprovalState;
93
110
  /** Stable per-hook identity ({@link pluginHookKey}) — the record key the
94
111
  * UI writes to `capabilityOverrides.pluginHooks` to toggle just this hook. */
95
112
  key: string;