@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
@@ -0,0 +1,99 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
4
+ import { dirname } from "node:path";
5
+ import { z } from "zod";
6
+ import { panelAppsRegistryPath } from "./paths.js";
7
+ import { lock } from "../utils/lockfile.js";
8
+ const GitSource = z
9
+ .object({
10
+ kind: z.literal("git"),
11
+ url: z.string().url().max(4_096),
12
+ ref: z.string().min(1).max(255).optional(),
13
+ subdir: z.string().min(1).max(1_024).optional(),
14
+ })
15
+ .strict();
16
+ const RegistryEntry = z
17
+ .object({
18
+ id: z.string().regex(/^[a-z][a-z0-9-]{0,63}$/),
19
+ version: z.string().min(1).max(80),
20
+ source: z.union([z.string().min(1).max(4_096), GitSource]),
21
+ installedAt: z.string().min(1).max(128),
22
+ lastUpdated: z.string().min(1).max(128),
23
+ })
24
+ .strict();
25
+ const Registry = z
26
+ .object({
27
+ version: z.literal(1),
28
+ apps: z.array(RegistryEntry).max(1_024),
29
+ })
30
+ .strict();
31
+ async function readRegistryUnlocked() {
32
+ const path = panelAppsRegistryPath();
33
+ if (!existsSync(path))
34
+ return [];
35
+ try {
36
+ return Registry.parse(JSON.parse(await readFile(path, "utf-8"))).apps;
37
+ }
38
+ catch {
39
+ return [];
40
+ }
41
+ }
42
+ async function writeRegistryUnlocked(apps) {
43
+ const path = panelAppsRegistryPath();
44
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
45
+ const tmp = `${path}.${process.pid}.${randomUUID()}.tmp`;
46
+ try {
47
+ const registry = Registry.parse({
48
+ version: 1,
49
+ apps: [...apps].sort((left, right) => left.id.localeCompare(right.id)),
50
+ });
51
+ await writeFile(tmp, `${JSON.stringify(registry, null, 2)}\n`, {
52
+ encoding: "utf-8",
53
+ flag: "wx",
54
+ mode: 0o600,
55
+ });
56
+ await rename(tmp, path);
57
+ }
58
+ finally {
59
+ await rm(tmp, { force: true });
60
+ }
61
+ }
62
+ async function mutateRegistry(mutation) {
63
+ const directory = dirname(panelAppsRegistryPath());
64
+ await mkdir(directory, { recursive: true, mode: 0o700 });
65
+ const release = await lock(directory, {
66
+ realpath: true,
67
+ stale: 10_000,
68
+ retries: { retries: 8, minTimeout: 10, maxTimeout: 120, factor: 1.5 },
69
+ });
70
+ try {
71
+ const next = mutation(await readRegistryUnlocked());
72
+ await writeRegistryUnlocked(next.apps);
73
+ return next.result;
74
+ }
75
+ finally {
76
+ await release();
77
+ }
78
+ }
79
+ export async function readInstalledPanelAppsRegistry() {
80
+ return readRegistryUnlocked();
81
+ }
82
+ export async function writeInstalledPanelAppsRegistry(apps) {
83
+ await mutateRegistry(() => ({ apps, result: undefined }));
84
+ }
85
+ export async function upsertInstalledPanelAppRecord(record) {
86
+ await mutateRegistry((current) => ({
87
+ apps: [
88
+ ...current.filter((candidate) => candidate.id !== record.id),
89
+ RegistryEntry.parse(record),
90
+ ],
91
+ result: undefined,
92
+ }));
93
+ }
94
+ export async function removeInstalledPanelAppRecord(id) {
95
+ await mutateRegistry((current) => ({
96
+ apps: current.filter((candidate) => candidate.id !== id),
97
+ result: undefined,
98
+ }));
99
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * UI-agnostic lifecycle runtime for trusted, code-backed Panel App modules.
3
+ *
4
+ * A host supplies its own service object and panel context. Core owns ordering,
5
+ * instance identity, and error isolation; it does not import React/Electron or
6
+ * decide how an untrusted installed Panel App is sandboxed.
7
+ */
8
+ export type PanelAppLifecycleEventName = "activate" | "panel_mount" | "panel_context_changed" | "panel_visibility_changed" | "panel_unmount" | "deactivate";
9
+ export interface PanelAppInstance<TContext extends object = Record<string, unknown>> {
10
+ panelId: string;
11
+ instanceId: string;
12
+ context: TContext;
13
+ visible: boolean;
14
+ }
15
+ export type PanelAppLifecycleEvent<TContext extends object = Record<string, unknown>> = {
16
+ type: "activate";
17
+ } | {
18
+ type: "panel_mount";
19
+ panel: PanelAppInstance<TContext>;
20
+ } | {
21
+ type: "panel_context_changed";
22
+ panel: PanelAppInstance<TContext>;
23
+ } | {
24
+ type: "panel_visibility_changed";
25
+ panel: PanelAppInstance<TContext>;
26
+ } | {
27
+ type: "panel_unmount";
28
+ panel: PanelAppInstance<TContext>;
29
+ } | {
30
+ type: "deactivate";
31
+ };
32
+ export interface PanelAppLifecycleHookContext<THost, TContext extends object = Record<string, unknown>> {
33
+ appId: string;
34
+ host: THost;
35
+ event: PanelAppLifecycleEvent<TContext>;
36
+ }
37
+ export type PanelAppLifecycleHook<THost, TContext extends object = Record<string, unknown>> = (context: PanelAppLifecycleHookContext<THost, TContext>) => void | Promise<void>;
38
+ export type PanelAppLifecycleHooks<THost, TContext extends object = Record<string, unknown>> = Partial<Record<PanelAppLifecycleEventName, PanelAppLifecycleHook<THost, TContext> | readonly PanelAppLifecycleHook<THost, TContext>[]>>;
39
+ /** Trusted code module. Installed web content must not be imported through this boundary. */
40
+ export interface PanelAppLifecycleModule<THost, TContext extends object = Record<string, unknown>> {
41
+ id: string;
42
+ hooks?: PanelAppLifecycleHooks<THost, TContext>;
43
+ }
44
+ export interface PanelAppLifecycleError<THost, TContext extends object = Record<string, unknown>> {
45
+ appId: string;
46
+ event: PanelAppLifecycleEvent<TContext>;
47
+ host: THost;
48
+ error: unknown;
49
+ }
50
+ export interface PanelAppLifecycleRuntimeOptions<THost, TContext extends object = Record<string, unknown>> {
51
+ onError?(error: PanelAppLifecycleError<THost, TContext>): void;
52
+ }
53
+ /**
54
+ * Stateful lifecycle coordinator shared by headless and UI hosts.
55
+ *
56
+ * Mounting the first panel activates its module automatically. State changes
57
+ * are recorded before hooks run, so re-entrant/StrictMode calls remain
58
+ * idempotent even when a hook is asynchronous.
59
+ */
60
+ export declare class PanelAppLifecycleRuntime<THost, TContext extends object = Record<string, unknown>> {
61
+ private readonly options;
62
+ private readonly modules;
63
+ private readonly active;
64
+ private readonly panels;
65
+ constructor(options?: PanelAppLifecycleRuntimeOptions<THost, TContext>);
66
+ register(module: PanelAppLifecycleModule<THost, TContext>): () => void;
67
+ has(appId: string): boolean;
68
+ isActive(appId: string): boolean;
69
+ mountedPanels(appId?: string): PanelAppInstance<TContext>[];
70
+ activate(appId: string, host: THost): Promise<void>;
71
+ mountPanel(appId: string, panel: PanelAppInstance<TContext>, host: THost): Promise<void>;
72
+ updatePanelContext(appId: string, instanceId: string, context: TContext, host: THost): Promise<void>;
73
+ setPanelVisibility(appId: string, instanceId: string, visible: boolean, host: THost): Promise<void>;
74
+ unmountPanel(appId: string, instanceId: string, host: THost): Promise<void>;
75
+ deactivate(appId: string, host: THost): Promise<void>;
76
+ private hasMountedPanels;
77
+ private requireModule;
78
+ private requirePanel;
79
+ private emit;
80
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * UI-agnostic lifecycle runtime for trusted, code-backed Panel App modules.
3
+ *
4
+ * A host supplies its own service object and panel context. Core owns ordering,
5
+ * instance identity, and error isolation; it does not import React/Electron or
6
+ * decide how an untrusted installed Panel App is sandboxed.
7
+ */
8
+ function panelKey(appId, instanceId) {
9
+ return `${appId}\0${instanceId}`;
10
+ }
11
+ function clonePanel(panel) {
12
+ return { ...panel, context: { ...panel.context } };
13
+ }
14
+ /**
15
+ * Stateful lifecycle coordinator shared by headless and UI hosts.
16
+ *
17
+ * Mounting the first panel activates its module automatically. State changes
18
+ * are recorded before hooks run, so re-entrant/StrictMode calls remain
19
+ * idempotent even when a hook is asynchronous.
20
+ */
21
+ export class PanelAppLifecycleRuntime {
22
+ options;
23
+ modules = new Map();
24
+ active = new Set();
25
+ panels = new Map();
26
+ constructor(options = {}) {
27
+ this.options = options;
28
+ }
29
+ register(module) {
30
+ if (!module.id)
31
+ throw new Error("Panel App lifecycle module id is required");
32
+ if (this.modules.has(module.id)) {
33
+ throw new Error(`Panel App lifecycle module '${module.id}' is already registered`);
34
+ }
35
+ this.modules.set(module.id, module);
36
+ let disposed = false;
37
+ return () => {
38
+ if (disposed)
39
+ return;
40
+ if (this.active.has(module.id) || this.hasMountedPanels(module.id)) {
41
+ throw new Error(`Panel App lifecycle module '${module.id}' must be deactivated first`);
42
+ }
43
+ disposed = true;
44
+ if (this.modules.get(module.id) === module)
45
+ this.modules.delete(module.id);
46
+ };
47
+ }
48
+ has(appId) {
49
+ return this.modules.has(appId);
50
+ }
51
+ isActive(appId) {
52
+ return this.active.has(appId);
53
+ }
54
+ mountedPanels(appId) {
55
+ const prefix = appId === undefined ? null : `${appId}\0`;
56
+ return [...this.panels.entries()]
57
+ .filter(([key]) => prefix === null || key.startsWith(prefix))
58
+ .map(([, panel]) => clonePanel(panel));
59
+ }
60
+ async activate(appId, host) {
61
+ this.requireModule(appId);
62
+ if (this.active.has(appId))
63
+ return;
64
+ this.active.add(appId);
65
+ await this.emit(appId, host, { type: "activate" });
66
+ }
67
+ async mountPanel(appId, panel, host) {
68
+ this.requireModule(appId);
69
+ const key = panelKey(appId, panel.instanceId);
70
+ if (this.panels.has(key))
71
+ return;
72
+ const snapshot = clonePanel(panel);
73
+ this.panels.set(key, snapshot);
74
+ await this.activate(appId, host);
75
+ // A host can unmount/remount while an async activate hook is pending. Only
76
+ // the generation that installed this snapshot may publish its mount event.
77
+ if (this.panels.get(key) !== snapshot)
78
+ return;
79
+ await this.emit(appId, host, { type: "panel_mount", panel: clonePanel(snapshot) });
80
+ }
81
+ async updatePanelContext(appId, instanceId, context, host) {
82
+ const current = this.requirePanel(appId, instanceId);
83
+ const next = { ...current, context: { ...context } };
84
+ this.panels.set(panelKey(appId, instanceId), next);
85
+ await this.emit(appId, host, {
86
+ type: "panel_context_changed",
87
+ panel: clonePanel(next),
88
+ });
89
+ }
90
+ async setPanelVisibility(appId, instanceId, visible, host) {
91
+ const current = this.requirePanel(appId, instanceId);
92
+ if (current.visible === visible)
93
+ return;
94
+ const next = { ...current, visible };
95
+ this.panels.set(panelKey(appId, instanceId), next);
96
+ await this.emit(appId, host, {
97
+ type: "panel_visibility_changed",
98
+ panel: clonePanel(next),
99
+ });
100
+ }
101
+ async unmountPanel(appId, instanceId, host) {
102
+ const key = panelKey(appId, instanceId);
103
+ const current = this.panels.get(key);
104
+ if (!current)
105
+ return;
106
+ this.panels.delete(key);
107
+ await this.emit(appId, host, {
108
+ type: "panel_unmount",
109
+ panel: clonePanel(current),
110
+ });
111
+ }
112
+ async deactivate(appId, host) {
113
+ this.requireModule(appId);
114
+ for (const panel of this.mountedPanels(appId)) {
115
+ await this.unmountPanel(appId, panel.instanceId, host);
116
+ }
117
+ if (!this.active.delete(appId))
118
+ return;
119
+ await this.emit(appId, host, { type: "deactivate" });
120
+ }
121
+ hasMountedPanels(appId) {
122
+ const prefix = `${appId}\0`;
123
+ for (const key of this.panels.keys()) {
124
+ if (key.startsWith(prefix))
125
+ return true;
126
+ }
127
+ return false;
128
+ }
129
+ requireModule(appId) {
130
+ const module = this.modules.get(appId);
131
+ if (!module)
132
+ throw new Error(`unknown Panel App lifecycle module '${appId}'`);
133
+ return module;
134
+ }
135
+ requirePanel(appId, instanceId) {
136
+ const panel = this.panels.get(panelKey(appId, instanceId));
137
+ if (!panel) {
138
+ throw new Error(`Panel App instance '${appId}:${instanceId}' is not mounted`);
139
+ }
140
+ return panel;
141
+ }
142
+ async emit(appId, host, event) {
143
+ const configured = this.requireModule(appId).hooks?.[event.type];
144
+ const hooks = configured ? (Array.isArray(configured) ? configured : [configured]) : [];
145
+ for (const hook of hooks) {
146
+ try {
147
+ await hook({ appId, host, event });
148
+ }
149
+ catch (error) {
150
+ this.options.onError?.({ appId, event, host, error });
151
+ }
152
+ }
153
+ }
154
+ }
@@ -63,6 +63,10 @@ async function runGit(args, cwd, timeoutMs = 60_000) {
63
63
  cwd: cwd ?? process.cwd(),
64
64
  env: nonInteractiveGitEnv(process.env),
65
65
  timeoutMs,
66
+ // A stalled git clone/fetch owns helpers such as git-remote-https. Keep
67
+ // them in a dedicated group so the timeout cannot leave network workers
68
+ // running after the UI operation has failed.
69
+ processGroup: process.platform !== "win32",
66
70
  });
67
71
  if (r.spawnFailed) {
68
72
  return { ok: false, error: `git ${args.join(" ")} failed: ${r.error ?? "spawn failed"}` };
@@ -164,7 +168,10 @@ export async function gitLsRemote(url, ref) {
164
168
  return r;
165
169
  const sha = r.stdout.split(/\s+/)[0] ?? "";
166
170
  if (!/^[0-9a-f]{7,40}$/i.test(sha)) {
167
- return { ok: false, error: `ls-remote: no sha for ${ref ?? "HEAD"} in: ${r.stdout.slice(0, 120)}` };
171
+ return {
172
+ ok: false,
173
+ error: `ls-remote: no sha for ${ref ?? "HEAD"} in: ${r.stdout.slice(0, 120)}`,
174
+ };
168
175
  }
169
176
  return { ok: true, stdout: sha };
170
177
  }
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Read/write ~/.code-shell/plugins/installed_plugins.json (V2 format).
3
- * Byte-compatible with Claude Code's analogous file.
3
+ * Reads the Claude Code-compatible V2 shape plus optional CodeShell integrity
4
+ * fields on each install entry.
4
5
  */
5
6
  import type { InstalledPluginsV2, PluginInstallEntry } from "./types.js";
6
7
  export declare function installedPluginsPath(): string;
@@ -1,26 +1,153 @@
1
1
  /**
2
2
  * Read/write ~/.code-shell/plugins/installed_plugins.json (V2 format).
3
- * Byte-compatible with Claude Code's analogous file.
3
+ * Reads the Claude Code-compatible V2 shape plus optional CodeShell integrity
4
+ * fields on each install entry.
4
5
  */
5
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
+ import { randomUUID } from "node:crypto";
7
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
6
8
  import { dirname, join } from "node:path";
7
9
  import { homedir } from "node:os";
10
+ const MAX_PLUGIN_KEYS = 2_048;
11
+ const MAX_INSTALLS_PER_KEY = 16;
12
+ const MAX_KEY_LENGTH = 256;
13
+ const MAX_PATH_LENGTH = 4_096;
14
+ const MAX_METADATA_LENGTH = 512;
15
+ const DIGEST_RE = /^[a-f0-9]{64}$/;
16
+ const MAX_HOOK_REVIEW_ITEMS = 256;
17
+ const MAX_HOOK_REVIEW_COMMAND_LENGTH = 4_096;
18
+ const MAX_HOOK_REVIEW_MATCHER_LENGTH = 4_096;
8
19
  function userHome() {
9
20
  return process.env.HOME ?? homedir();
10
21
  }
11
22
  export function installedPluginsPath() {
12
23
  return join(userHome(), ".code-shell", "plugins", "installed_plugins.json");
13
24
  }
14
- const EMPTY = { version: 2, plugins: {} };
25
+ function recordOf(value) {
26
+ return value && typeof value === "object" && !Array.isArray(value)
27
+ ? value
28
+ : undefined;
29
+ }
30
+ function boundedString(value, maxLength) {
31
+ return typeof value === "string" &&
32
+ value.length > 0 &&
33
+ value.length <= maxLength &&
34
+ !value.includes("\0")
35
+ ? value
36
+ : undefined;
37
+ }
38
+ function hookReviewItemOf(value) {
39
+ const raw = recordOf(value);
40
+ if (!raw)
41
+ return undefined;
42
+ const rawEvent = boundedString(raw.rawEvent, 128);
43
+ const command = boundedString(raw.command, MAX_HOOK_REVIEW_COMMAND_LENGTH);
44
+ const commandDigest = typeof raw.commandDigest === "string" && DIGEST_RE.test(raw.commandDigest)
45
+ ? raw.commandDigest
46
+ : undefined;
47
+ if (!rawEvent || !command || !commandDigest)
48
+ return undefined;
49
+ const matcher = raw.matcher === undefined
50
+ ? undefined
51
+ : boundedString(raw.matcher, MAX_HOOK_REVIEW_MATCHER_LENGTH);
52
+ if (raw.matcher !== undefined && matcher === undefined)
53
+ return undefined;
54
+ if (raw.commandTruncated !== undefined && typeof raw.commandTruncated !== "boolean") {
55
+ return undefined;
56
+ }
57
+ if (raw.async !== undefined && typeof raw.async !== "boolean")
58
+ return undefined;
59
+ const timeoutMs = raw.timeoutMs === undefined ||
60
+ (typeof raw.timeoutMs === "number" &&
61
+ Number.isSafeInteger(raw.timeoutMs) &&
62
+ raw.timeoutMs >= 1 &&
63
+ raw.timeoutMs <= 600_000)
64
+ ? raw.timeoutMs
65
+ : null;
66
+ if (timeoutMs === null)
67
+ return undefined;
68
+ return {
69
+ rawEvent,
70
+ ...(matcher === undefined ? {} : { matcher }),
71
+ command,
72
+ commandDigest,
73
+ ...(raw.commandTruncated === true ? { commandTruncated: true } : {}),
74
+ ...(raw.async === undefined ? {} : { async: raw.async }),
75
+ ...(timeoutMs === undefined ? {} : { timeoutMs }),
76
+ };
77
+ }
78
+ function installEntryOf(value) {
79
+ const raw = recordOf(value);
80
+ if (!raw || raw.scope !== "user")
81
+ return undefined;
82
+ const installPath = boundedString(raw.installPath, MAX_PATH_LENGTH);
83
+ const version = boundedString(raw.version, MAX_METADATA_LENGTH);
84
+ const installedAt = boundedString(raw.installedAt, MAX_METADATA_LENGTH);
85
+ const lastUpdated = boundedString(raw.lastUpdated, MAX_METADATA_LENGTH);
86
+ if (!installPath || !version || !installedAt || !lastUpdated)
87
+ return undefined;
88
+ const entry = {
89
+ scope: "user",
90
+ installPath,
91
+ version,
92
+ installedAt,
93
+ lastUpdated,
94
+ };
95
+ const gitCommitSha = boundedString(raw.gitCommitSha, MAX_METADATA_LENGTH);
96
+ if (gitCommitSha)
97
+ entry.gitCommitSha = gitCommitSha;
98
+ for (const field of [
99
+ "hookDigest",
100
+ "approvedHookDigest",
101
+ "mcpDigest",
102
+ "approvedMcpDigest",
103
+ ]) {
104
+ const digest = raw[field];
105
+ if (typeof digest === "string" && DIGEST_RE.test(digest))
106
+ entry[field] = digest;
107
+ }
108
+ if (Array.isArray(raw.approvedHookSnapshot) &&
109
+ raw.approvedHookSnapshot.length <= MAX_HOOK_REVIEW_ITEMS) {
110
+ const snapshot = raw.approvedHookSnapshot
111
+ .map((item) => hookReviewItemOf(item))
112
+ .filter((item) => item !== undefined);
113
+ if (snapshot.length === raw.approvedHookSnapshot.length)
114
+ entry.approvedHookSnapshot = snapshot;
115
+ }
116
+ return entry;
117
+ }
118
+ function registryOf(value) {
119
+ const raw = recordOf(value);
120
+ const plugins = recordOf(raw?.plugins);
121
+ if (raw?.version !== 2 || !plugins)
122
+ return undefined;
123
+ const entries = Object.entries(plugins);
124
+ if (entries.length > MAX_PLUGIN_KEYS)
125
+ return undefined;
126
+ const normalized = { version: 2, plugins: {} };
127
+ for (const [key, value] of entries) {
128
+ if (key.length === 0 ||
129
+ key.length > MAX_KEY_LENGTH ||
130
+ key.includes("\0") ||
131
+ !Array.isArray(value) ||
132
+ value.length > MAX_INSTALLS_PER_KEY) {
133
+ continue;
134
+ }
135
+ const installs = value
136
+ .map((entry) => installEntryOf(entry))
137
+ .filter((entry) => entry !== undefined);
138
+ if (installs.length > 0)
139
+ normalized.plugins[key] = installs;
140
+ }
141
+ return normalized;
142
+ }
15
143
  export function readInstalledPlugins() {
16
144
  const path = installedPluginsPath();
17
145
  if (!existsSync(path))
18
146
  return { version: 2, plugins: {} };
19
147
  try {
20
- const raw = JSON.parse(readFileSync(path, "utf-8"));
21
- if (raw && typeof raw === "object" && raw.version === 2 && raw.plugins && typeof raw.plugins === "object") {
22
- return raw;
23
- }
148
+ const parsed = registryOf(JSON.parse(readFileSync(path, "utf-8")));
149
+ if (parsed)
150
+ return parsed;
24
151
  }
25
152
  catch {
26
153
  // Corrupt — treat as empty so the user can re-install.
@@ -30,7 +157,18 @@ export function readInstalledPlugins() {
30
157
  export function writeInstalledPlugins(data) {
31
158
  const path = installedPluginsPath();
32
159
  mkdirSync(dirname(path), { recursive: true });
33
- writeFileSync(path, JSON.stringify(data, null, 2) + "\n", "utf-8");
160
+ const tmp = `${path}.${process.pid}.${randomUUID()}.tmp`;
161
+ try {
162
+ writeFileSync(tmp, JSON.stringify(data, null, 2) + "\n", {
163
+ encoding: "utf-8",
164
+ flag: "wx",
165
+ mode: 0o600,
166
+ });
167
+ renameSync(tmp, path);
168
+ }
169
+ finally {
170
+ rmSync(tmp, { force: true });
171
+ }
34
172
  }
35
173
  /**
36
174
  * Append an install entry for `<plugin>@<marketplace>`. Multiple entries
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Convert one Codex agent TOML into a CC agent Markdown string.
3
- * Real CC fields: name, description, model, body(=developer_instructions).
3
+ * Real CodeShell fields: name, description, model, MCP allowlist and
4
+ * body(=developer_instructions).
4
5
  * Every other field is preserved with a `codex_` prefix (v1 inert; see spec §7.1).
5
6
  * `mcp_servers` values are rewritten to `<plugin>:<server>` to match the MCP merge key.
6
7
  */
7
8
  export declare function convertCodexAgentToml(toml: string, sourceName: string, pluginName: string): string;
9
+ /** Walk <sourceDir>/agents/**.toml → <destDir>/agents/**.md. */
10
+ export declare function convertCodexAgentsDirectory(sourceDir: string, destDir: string, pluginName: string): Promise<void>;
@@ -1,11 +1,15 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, readFile, readdir, realpath, stat, writeFile } from "node:fs/promises";
3
+ import { isAbsolute, join, relative, sep } from "node:path";
1
4
  import { parse as parseToml } from "smol-toml";
2
5
  import { stringify as stringifyYaml } from "yaml";
3
6
  import { serializeAgentDefinition } from "../../../agent/agent-definition.js";
4
7
  import { PluginInstallError } from "../types.js";
5
- const MAPPED = new Set(["name", "description", "model", "developer_instructions"]);
8
+ const MAPPED = new Set(["name", "description", "model", "developer_instructions", "mcp_servers"]);
6
9
  /**
7
10
  * Convert one Codex agent TOML into a CC agent Markdown string.
8
- * Real CC fields: name, description, model, body(=developer_instructions).
11
+ * Real CodeShell fields: name, description, model, MCP allowlist and
12
+ * body(=developer_instructions).
9
13
  * Every other field is preserved with a `codex_` prefix (v1 inert; see spec §7.1).
10
14
  * `mcp_servers` values are rewritten to `<plugin>:<server>` to match the MCP merge key.
11
15
  */
@@ -24,11 +28,24 @@ export function convertCodexAgentToml(toml, sourceName, pluginName) {
24
28
  throw new PluginInstallError(`${sourceName}: missing required 'description'`);
25
29
  }
26
30
  const body = typeof raw.developer_instructions === "string" ? raw.developer_instructions.trim() : "";
31
+ let mcp;
32
+ if (raw.mcp_servers !== undefined) {
33
+ if (!Array.isArray(raw.mcp_servers) ||
34
+ raw.mcp_servers.length > 256 ||
35
+ raw.mcp_servers.some((server) => typeof server !== "string" ||
36
+ server.length === 0 ||
37
+ server.length > 256 ||
38
+ !/^[A-Za-z0-9._-]+$/u.test(server))) {
39
+ throw new PluginInstallError(`${sourceName}: 'mcp_servers' must be an array of at most 256 safe server names`);
40
+ }
41
+ mcp = [...new Set(raw.mcp_servers.map((server) => `${pluginName}:${server}`))];
42
+ }
27
43
  const base = serializeAgentDefinition({
28
44
  name: raw.name.trim(),
29
45
  description: raw.description.trim(),
30
46
  systemPrompt: body,
31
47
  ...(typeof raw.model === "string" && raw.model.trim() ? { model: raw.model.trim() } : {}),
48
+ ...(mcp !== undefined ? { mcp } : {}),
32
49
  });
33
50
  // Collect codex_-prefixed extras.
34
51
  const extras = {};
@@ -36,12 +53,7 @@ export function convertCodexAgentToml(toml, sourceName, pluginName) {
36
53
  if (MAPPED.has(key))
37
54
  continue;
38
55
  const outKey = `codex_${key}`;
39
- if (key === "mcp_servers" && Array.isArray(value)) {
40
- extras[outKey] = value.map((s) => (typeof s === "string" ? `${pluginName}:${s}` : s));
41
- }
42
- else {
43
- extras[outKey] = value;
44
- }
56
+ extras[outKey] = value;
45
57
  }
46
58
  if (Object.keys(extras).length === 0)
47
59
  return base;
@@ -53,3 +65,45 @@ export function convertCodexAgentToml(toml, sourceName, pluginName) {
53
65
  const [, fm, rest] = match;
54
66
  return `---\n${fm}\n${extraYaml}\n---\n${rest}`;
55
67
  }
68
+ /** Walk <sourceDir>/agents/**.toml → <destDir>/agents/**.md. */
69
+ export async function convertCodexAgentsDirectory(sourceDir, destDir, pluginName) {
70
+ const agentsSrc = join(sourceDir, "agents");
71
+ if (!existsSync(agentsSrc))
72
+ return;
73
+ const sourceRoot = await realpath(sourceDir);
74
+ const resolvedAgentsRoot = await resolveContainedAgentSource(sourceRoot, agentsSrc, "agents");
75
+ const walk = async (dir) => {
76
+ for (const dirent of await readdir(dir, { withFileTypes: true })) {
77
+ const abs = join(dir, dirent.name);
78
+ if (dirent.isDirectory()) {
79
+ await walk(abs);
80
+ continue;
81
+ }
82
+ if (!dirent.name.endsWith(".toml"))
83
+ continue;
84
+ const source = await resolveContainedAgentSource(resolvedAgentsRoot, abs, relative(resolvedAgentsRoot, abs));
85
+ if (!(await stat(source)).isFile())
86
+ continue;
87
+ const rel = relative(resolvedAgentsRoot, abs).replace(/\.toml$/, ".md");
88
+ const outPath = join(destDir, "agents", rel);
89
+ await mkdir(join(outPath, ".."), { recursive: true });
90
+ const markdown = convertCodexAgentToml(await readFile(source, "utf-8"), rel, pluginName);
91
+ await writeFile(outPath, markdown);
92
+ }
93
+ };
94
+ await walk(resolvedAgentsRoot);
95
+ }
96
+ async function resolveContainedAgentSource(sourceRoot, candidate, label) {
97
+ let target;
98
+ try {
99
+ target = await realpath(candidate);
100
+ }
101
+ catch {
102
+ throw new PluginInstallError(`agent source not found: ${label}`);
103
+ }
104
+ const rel = relative(sourceRoot, target);
105
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
106
+ throw new PluginInstallError(`agent source escapes plugin dir: ${label}`);
107
+ }
108
+ return target;
109
+ }
@@ -7,11 +7,11 @@
7
7
  * already scans `commands/*.md`. So the conversion is a flat copy of every
8
8
  * `.md` from `prompts/` (and any explicit `commands/`) into `dest/commands/`.
9
9
  *
10
- * Placeholder syntax differs (Codex `$1`/`$FILE` vs CC `$ARGUMENTS`) but the
11
- * body is copied verbatim v1 inert, the same stance taken for `codex_`
12
- * agent fields (see convertAgents.ts). Non-`.md` files are ignored, matching
13
- * Codex's own behaviour. On a filename collision an explicit `commands/`
14
- * entry wins over `prompts/` (the more specific source).
10
+ * Placeholder syntax differs (Codex `$1`/`$FILE` vs CC `$ARGUMENTS`), so the
11
+ * body is copied verbatim and expanded at invocation time by
12
+ * `expandPluginCommandBody`. Non-`.md` files are ignored, matching Codex's
13
+ * own behaviour. On a filename collision an explicit `commands/` entry wins
14
+ * over `prompts/` (the more specific source).
15
15
  *
16
16
  * Async fs throughout: this runs in the Electron main process during install;
17
17
  * sync copies block the event loop and freeze the UI (see convertSkills.ts).