@cjhyy/code-shell-core 0.7.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -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;