@cjhyy/code-shell-core 0.7.1 → 0.8.1

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