@cjhyy/code-shell-core 0.7.1 → 0.8.0

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