@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,622 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { cp, lstat, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, writeFile, } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { basename, extname, join, posix, relative, resolve, sep } from "node:path";
6
+ import { extractZip, extractZipSubdirectory } from "../plugins/installer/unzip.js";
7
+ import { downloadGitHubPanelAppArchive } from "./github-archive.js";
8
+ import { PANEL_APP_MANIFEST_FILE, PanelAppManifest, } from "./manifest.js";
9
+ import { PanelAppAlreadyInstalledError, PanelAppInstallError, PanelAppReviewChangedError, assertSafePanelAppId, panelAppInstallDir, panelAppsRoot, } from "./paths.js";
10
+ import { readInstalledPanelAppsRegistry, removeInstalledPanelAppRecord, upsertInstalledPanelAppRecord, } from "./registry.js";
11
+ const PANEL_APP_META_FILE = ".cs-panel-app-meta.json";
12
+ const MAX_SOURCE_PATH = 4_096;
13
+ const MAX_ENTRIES = 2_000;
14
+ const MAX_TOTAL_BYTES = 64 * 1024 * 1024;
15
+ const MAX_FILE_BYTES = 16 * 1024 * 1024;
16
+ const MAX_DEPTH = 16;
17
+ const MAX_MANIFEST_BYTES = 1024 * 1024;
18
+ const MAX_AGENT_SKILL_BYTES = 256 * 1024;
19
+ const REVIEWED_GIT_SNAPSHOT_TTL_MS = 10 * 60 * 1000;
20
+ const MAX_REVIEWED_GIT_SNAPSHOTS = 8;
21
+ const ALLOWED_ASSET_EXTENSIONS = new Set([
22
+ ".html",
23
+ ".js",
24
+ ".mjs",
25
+ ".md",
26
+ ".css",
27
+ ".json",
28
+ ".png",
29
+ ".jpg",
30
+ ".jpeg",
31
+ ".webp",
32
+ ".woff",
33
+ ".woff2",
34
+ ".ttf",
35
+ ]);
36
+ const ALLOWED_AGENT_ASSET_EXTENSIONS = new Set([".md", ".json", ".png", ".jpg", ".jpeg", ".webp"]);
37
+ const FORBIDDEN_AGENT_CONTENT = [
38
+ ".claude-plugin",
39
+ ".codex-plugin",
40
+ ".codeshell-plugin",
41
+ ".mcp.json",
42
+ "agents",
43
+ "commands",
44
+ "hooks",
45
+ "skills",
46
+ ];
47
+ const reviewedGitPanelAppSnapshots = new Map();
48
+ function validLocalSourceInput(input) {
49
+ return (Boolean(input) &&
50
+ (input.kind === "dir" || input.kind === "zip") &&
51
+ typeof input.path === "string" &&
52
+ input.path.length > 0 &&
53
+ input.path.length <= MAX_SOURCE_PATH &&
54
+ !input.path.includes("\0"));
55
+ }
56
+ function normalizeGitPanelAppSource(input) {
57
+ if (!input || input.kind !== "git" || typeof input.url !== "string") {
58
+ throw new PanelAppInstallError("GitHub Panel App source is invalid");
59
+ }
60
+ const raw = input.url.trim();
61
+ if (!raw || raw.length > MAX_SOURCE_PATH || raw.includes("\0")) {
62
+ throw new PanelAppInstallError("GitHub repository URL is invalid");
63
+ }
64
+ let parsed;
65
+ try {
66
+ parsed = new URL(raw);
67
+ }
68
+ catch {
69
+ throw new PanelAppInstallError("GitHub repository URL is invalid");
70
+ }
71
+ if (parsed.protocol !== "https:" ||
72
+ parsed.hostname.toLowerCase() !== "github.com" ||
73
+ parsed.username ||
74
+ parsed.password ||
75
+ parsed.port ||
76
+ parsed.search ||
77
+ parsed.hash) {
78
+ throw new PanelAppInstallError("Panel Apps support public https://github.com repositories only");
79
+ }
80
+ const parts = parsed.pathname.replace(/^\/+|\/+$/g, "").split("/");
81
+ if (parts.length < 2 || !parts[0] || !parts[1]) {
82
+ throw new PanelAppInstallError("GitHub URL must include owner/repository");
83
+ }
84
+ const owner = parts[0];
85
+ const repo = parts[1].replace(/\.git$/i, "");
86
+ if (!/^[A-Za-z0-9_.-]{1,100}$/.test(owner) || !/^[A-Za-z0-9_.-]{1,100}$/.test(repo)) {
87
+ throw new PanelAppInstallError("GitHub owner or repository name is invalid");
88
+ }
89
+ let urlRef;
90
+ let urlSubdir;
91
+ if (parts.length > 2) {
92
+ if (parts[2] !== "tree" || !parts[3]) {
93
+ throw new PanelAppInstallError("GitHub URL must point to a repository or /tree/<ref>/<path>");
94
+ }
95
+ urlRef = decodeURIComponent(parts[3]);
96
+ urlSubdir =
97
+ parts.length > 4
98
+ ? parts
99
+ .slice(4)
100
+ .map((part) => decodeURIComponent(part))
101
+ .join("/")
102
+ : undefined;
103
+ }
104
+ if ((input.ref && urlRef) || (input.subdir && urlSubdir)) {
105
+ throw new PanelAppInstallError("GitHub tree URLs cannot be combined with separate ref or subdirectory fields");
106
+ }
107
+ const ref = input.ref?.trim() || urlRef;
108
+ const subdir = input.subdir?.trim().replaceAll("\\", "/") || urlSubdir;
109
+ if (ref &&
110
+ (!/^[A-Za-z0-9][A-Za-z0-9._/-]{0,254}$/.test(ref) ||
111
+ ref.includes("..") ||
112
+ ref.includes("//") ||
113
+ ref.endsWith("/") ||
114
+ ref.endsWith(".lock"))) {
115
+ throw new PanelAppInstallError("GitHub branch, tag, or commit is invalid");
116
+ }
117
+ if (subdir) {
118
+ const segments = subdir.split("/");
119
+ if (subdir.length > 1_024 ||
120
+ subdir.startsWith("/") ||
121
+ segments.some((segment) => !segment || segment === "." || segment === "..")) {
122
+ throw new PanelAppInstallError("GitHub Panel App subdirectory is invalid");
123
+ }
124
+ }
125
+ return {
126
+ kind: "git",
127
+ url: `https://github.com/${owner}/${repo}.git`,
128
+ ...(ref ? { ref } : {}),
129
+ ...(subdir ? { subdir } : {}),
130
+ };
131
+ }
132
+ function normalizedGitSourceKey(input) {
133
+ return JSON.stringify(normalizeGitPanelAppSource(input));
134
+ }
135
+ function looksLikePanelAppRoot(directory) {
136
+ return existsSync(join(directory, PANEL_APP_MANIFEST_FILE));
137
+ }
138
+ async function findPanelAppRoot(directory) {
139
+ if (looksLikePanelAppRoot(directory))
140
+ return directory;
141
+ const entries = await readdir(directory, { withFileTypes: true });
142
+ const children = entries.filter((entry) => entry.isDirectory() && !entry.name.startsWith("."));
143
+ if (children.length === 1) {
144
+ const nested = join(directory, children[0].name);
145
+ if (looksLikePanelAppRoot(nested))
146
+ return nested;
147
+ }
148
+ throw new PanelAppInstallError(`no Panel App found (expected ${PANEL_APP_MANIFEST_FILE})`);
149
+ }
150
+ async function openGitPanelAppSource(input) {
151
+ const source = normalizeGitPanelAppSource(input);
152
+ const temporaryRoot = await mkdtemp(join(tmpdir(), "cs-panel-app-git-"));
153
+ try {
154
+ const archivePath = join(temporaryRoot, "source.zip");
155
+ const extractedRoot = join(temporaryRoot, "source");
156
+ await mkdir(extractedRoot, { recursive: true, mode: 0o700 });
157
+ await downloadGitHubPanelAppArchive(source, archivePath);
158
+ await extractZipSubdirectory(archivePath, extractedRoot, source.subdir);
159
+ await rm(archivePath, { force: true });
160
+ return {
161
+ source,
162
+ sourceKey: JSON.stringify(source),
163
+ sourceRoot: await findPanelAppRoot(extractedRoot),
164
+ temporaryRoot,
165
+ };
166
+ }
167
+ catch (error) {
168
+ await rm(temporaryRoot, { recursive: true, force: true }).catch(() => undefined);
169
+ throw error;
170
+ }
171
+ }
172
+ async function disposeReviewedGitSnapshot(snapshot) {
173
+ clearTimeout(snapshot.expiryTimer);
174
+ await rm(snapshot.temporaryRoot, { recursive: true, force: true }).catch(() => undefined);
175
+ }
176
+ async function removeReviewedGitSnapshot(key, expected) {
177
+ const snapshot = reviewedGitPanelAppSnapshots.get(key);
178
+ if (!snapshot || (expected && snapshot !== expected))
179
+ return;
180
+ reviewedGitPanelAppSnapshots.delete(key);
181
+ await disposeReviewedGitSnapshot(snapshot);
182
+ }
183
+ async function cacheReviewedGitSnapshot(opened, id, reviewToken) {
184
+ for (const [key, snapshot] of reviewedGitPanelAppSnapshots) {
185
+ if (snapshot.sourceKey === opened.sourceKey) {
186
+ await removeReviewedGitSnapshot(key, snapshot);
187
+ }
188
+ }
189
+ while (reviewedGitPanelAppSnapshots.size >= MAX_REVIEWED_GIT_SNAPSHOTS) {
190
+ const oldest = [...reviewedGitPanelAppSnapshots.entries()].sort(([, left], [, right]) => left.createdAt - right.createdAt)[0];
191
+ if (!oldest)
192
+ break;
193
+ await removeReviewedGitSnapshot(oldest[0], oldest[1]);
194
+ }
195
+ const key = `${opened.sourceKey}\0${reviewToken}`;
196
+ const snapshot = {
197
+ ...opened,
198
+ id,
199
+ reviewToken,
200
+ createdAt: Date.now(),
201
+ expiryTimer: setTimeout(() => {
202
+ void removeReviewedGitSnapshot(key, snapshot);
203
+ }, REVIEWED_GIT_SNAPSHOT_TTL_MS),
204
+ };
205
+ snapshot.expiryTimer.unref?.();
206
+ reviewedGitPanelAppSnapshots.set(key, snapshot);
207
+ }
208
+ function takeReviewedGitSnapshot(input, reviewToken) {
209
+ const key = `${normalizedGitSourceKey(input)}\0${reviewToken}`;
210
+ const snapshot = reviewedGitPanelAppSnapshots.get(key);
211
+ if (!snapshot)
212
+ return undefined;
213
+ reviewedGitPanelAppSnapshots.delete(key);
214
+ clearTimeout(snapshot.expiryTimer);
215
+ return snapshot;
216
+ }
217
+ async function withPanelAppSourceRoot(input, operation) {
218
+ if (input.kind === "git") {
219
+ const opened = await openGitPanelAppSource(input);
220
+ try {
221
+ return await operation(opened.sourceRoot);
222
+ }
223
+ finally {
224
+ await rm(opened.temporaryRoot, { recursive: true, force: true });
225
+ }
226
+ }
227
+ if (!validLocalSourceInput(input))
228
+ throw new PanelAppInstallError("Panel App source is invalid");
229
+ if (input.kind === "dir") {
230
+ if (!existsSync(input.path) || !(await stat(input.path)).isDirectory()) {
231
+ throw new PanelAppInstallError(`source is not a directory: ${input.path}`);
232
+ }
233
+ return operation(await findPanelAppRoot(input.path));
234
+ }
235
+ if (!existsSync(input.path) || !(await stat(input.path)).isFile()) {
236
+ throw new PanelAppInstallError(`archive is not a file: ${input.path}`);
237
+ }
238
+ const temporary = await mkdtemp(join(tmpdir(), "cs-panel-app-zip-"));
239
+ try {
240
+ await extractZip(input.path, temporary);
241
+ return await operation(await findPanelAppRoot(temporary));
242
+ }
243
+ finally {
244
+ await rm(temporary, { recursive: true, force: true });
245
+ }
246
+ }
247
+ async function walkBoundedTree(root, directory, depth, budget, files, directories) {
248
+ if (depth > MAX_DEPTH) {
249
+ throw new PanelAppInstallError(`Panel App exceeds maximum directory depth ${MAX_DEPTH}`);
250
+ }
251
+ const entries = (await readdir(directory, { withFileTypes: true })).sort((left, right) => left.name.localeCompare(right.name));
252
+ for (const entry of entries) {
253
+ budget.entries += 1;
254
+ if (budget.entries > MAX_ENTRIES) {
255
+ throw new PanelAppInstallError(`Panel App contains more than ${MAX_ENTRIES} entries`);
256
+ }
257
+ const absolute = join(directory, entry.name);
258
+ const relativePath = relative(root, absolute).split(sep).join("/");
259
+ const info = await lstat(absolute);
260
+ if (info.isSymbolicLink()) {
261
+ throw new PanelAppInstallError(`Panel App must not contain symlinks: ${relativePath}`);
262
+ }
263
+ if (info.isDirectory()) {
264
+ directories.push(relativePath);
265
+ await walkBoundedTree(root, absolute, depth + 1, budget, files, directories);
266
+ continue;
267
+ }
268
+ if (!info.isFile()) {
269
+ throw new PanelAppInstallError(`unsupported Panel App file type: ${relativePath}`);
270
+ }
271
+ if (info.size > MAX_FILE_BYTES) {
272
+ throw new PanelAppInstallError(`Panel App file is too large: ${relativePath}`);
273
+ }
274
+ budget.bytes += info.size;
275
+ if (budget.bytes > MAX_TOTAL_BYTES) {
276
+ throw new PanelAppInstallError("Panel App exceeds the 64 MiB package limit");
277
+ }
278
+ files.push(relativePath);
279
+ }
280
+ }
281
+ async function readManifest(sourceRoot) {
282
+ const file = join(sourceRoot, PANEL_APP_MANIFEST_FILE);
283
+ let info;
284
+ try {
285
+ info = await stat(file);
286
+ }
287
+ catch {
288
+ throw new PanelAppInstallError(`missing ${PANEL_APP_MANIFEST_FILE}`);
289
+ }
290
+ if (!info.isFile() || info.size > MAX_MANIFEST_BYTES) {
291
+ throw new PanelAppInstallError(`${PANEL_APP_MANIFEST_FILE} must be a regular file no larger than 1 MiB`);
292
+ }
293
+ try {
294
+ return PanelAppManifest.parse(JSON.parse(await readFile(file, "utf-8")));
295
+ }
296
+ catch (error) {
297
+ throw new PanelAppInstallError(`invalid Panel App manifest: ${error instanceof Error ? error.message : String(error)}`);
298
+ }
299
+ }
300
+ async function inspectPanelAppSource(sourceRoot) {
301
+ const root = await realpath(sourceRoot);
302
+ const files = [];
303
+ const directories = [];
304
+ await walkBoundedTree(root, root, 0, { entries: 0, bytes: 0 }, files, directories);
305
+ for (const forbidden of FORBIDDEN_AGENT_CONTENT) {
306
+ if ([...directories, ...files].some((entry) => entry === forbidden || entry.startsWith(`${forbidden}/`))) {
307
+ throw new PanelAppInstallError(`Panel App packages cannot contain agent-plugin content '${forbidden}'`);
308
+ }
309
+ }
310
+ const manifest = await readManifest(root);
311
+ assertSafePanelAppId(manifest.id);
312
+ const entry = await realpath(resolve(root, ...manifest.entry.split("/"))).catch(() => "");
313
+ if (!entry || (entry !== root && !entry.startsWith(`${root}${sep}`))) {
314
+ throw new PanelAppInstallError(`Panel App entry escapes its package: ${manifest.entry}`);
315
+ }
316
+ if (!(await stat(entry)).isFile()) {
317
+ throw new PanelAppInstallError(`Panel App entry is not a file: ${manifest.entry}`);
318
+ }
319
+ const assetRoot = posix.dirname(manifest.entry);
320
+ const agent = manifest.schemaVersion === 2 ? manifest.agent : undefined;
321
+ const declaredAgentRoots = new Set((agent?.skills ?? []).map((entry) => posix.dirname(entry)));
322
+ for (const skillEntry of agent?.skills ?? []) {
323
+ if (!files.includes(skillEntry)) {
324
+ throw new PanelAppInstallError(`declared Panel App skill is missing: ${skillEntry}`);
325
+ }
326
+ const skillInfo = await stat(join(root, ...skillEntry.split("/")));
327
+ if (!skillInfo.isFile() || skillInfo.size > MAX_AGENT_SKILL_BYTES) {
328
+ throw new PanelAppInstallError(`declared Panel App skill must be a file no larger than 256 KiB: ${skillEntry}`);
329
+ }
330
+ }
331
+ for (const file of files) {
332
+ if (file === PANEL_APP_MANIFEST_FILE || file === PANEL_APP_META_FILE)
333
+ continue;
334
+ const relation = posix.relative(assetRoot, file);
335
+ if (relation === ".." || relation.startsWith("../") || posix.isAbsolute(relation)) {
336
+ if (file === "README.md" || file === "LICENSE" || file === "LICENSE.md")
337
+ continue;
338
+ if ([...declaredAgentRoots].some((rootEntry) => file === rootEntry || file.startsWith(`${rootEntry}/`))) {
339
+ if (!ALLOWED_AGENT_ASSET_EXTENSIONS.has(extname(file).toLowerCase())) {
340
+ throw new PanelAppInstallError(`unsupported Panel App agent asset extension: ${file}`);
341
+ }
342
+ continue;
343
+ }
344
+ throw new PanelAppInstallError(`Panel App content must live beside its entry point: ${file}`);
345
+ }
346
+ if (!ALLOWED_ASSET_EXTENSIONS.has(extname(file).toLowerCase())) {
347
+ throw new PanelAppInstallError(`unsupported Panel App asset extension: ${file}`);
348
+ }
349
+ }
350
+ const hash = createHash("sha256");
351
+ for (const file of files.sort()) {
352
+ hash
353
+ .update(file)
354
+ .update("\0")
355
+ .update(await readFile(join(root, ...file.split("/"))));
356
+ }
357
+ return { manifest, files, digest: hash.digest("hex") };
358
+ }
359
+ function previewFrom(manifest, reviewToken, input) {
360
+ const source = input.kind === "git" ? normalizeGitPanelAppSource(input) : input;
361
+ return {
362
+ id: manifest.id,
363
+ version: manifest.version,
364
+ title: manifest.title,
365
+ ...(manifest.description ? { description: manifest.description } : {}),
366
+ entry: manifest.entry,
367
+ icon: manifest.icon,
368
+ singleton: manifest.singleton,
369
+ permissions: [...manifest.permissions],
370
+ ...(manifest.schemaVersion === 2 && manifest.agent
371
+ ? {
372
+ agent: {
373
+ tools: manifest.agent.tools.map((tool) => ({
374
+ ...tool,
375
+ inputSchema: { ...tool.inputSchema },
376
+ })),
377
+ skills: [...manifest.agent.skills],
378
+ },
379
+ }
380
+ : {}),
381
+ alreadyInstalled: existsSync(panelAppInstallDir(manifest.id)),
382
+ reviewToken,
383
+ source: {
384
+ kind: input.kind,
385
+ label: source.kind === "git"
386
+ ? `${new URL(source.url).pathname.replace(/^\/|\.git$/g, "")}${source.subdir ? `/${source.subdir}` : ""}`
387
+ : basename(source.path),
388
+ },
389
+ warnings: [
390
+ ...(manifest.permissions.length > 0
391
+ ? [`Panel App requests ${manifest.permissions.length} host permission(s)`]
392
+ : []),
393
+ ...(manifest.schemaVersion === 2 && manifest.agent
394
+ ? [
395
+ `Panel App contributes ${manifest.agent.tools.length} Agent tool(s) and ${manifest.agent.skills.length} Skill(s)`,
396
+ ]
397
+ : []),
398
+ ],
399
+ };
400
+ }
401
+ export async function previewLocalPanelApp(input) {
402
+ if (input.kind === "git") {
403
+ const opened = await openGitPanelAppSource(input);
404
+ let retained = false;
405
+ try {
406
+ const inspected = await inspectPanelAppSource(opened.sourceRoot);
407
+ const preview = previewFrom(inspected.manifest, inspected.digest, opened.source);
408
+ await cacheReviewedGitSnapshot(opened, preview.id, preview.reviewToken);
409
+ retained = true;
410
+ return preview;
411
+ }
412
+ finally {
413
+ if (!retained) {
414
+ await rm(opened.temporaryRoot, { recursive: true, force: true }).catch(() => undefined);
415
+ }
416
+ }
417
+ }
418
+ return withPanelAppSourceRoot(input, async (sourceRoot) => {
419
+ const inspected = await inspectPanelAppSource(sourceRoot);
420
+ return previewFrom(inspected.manifest, inspected.digest, input);
421
+ });
422
+ }
423
+ async function installedPanelAppSource(id) {
424
+ assertSafePanelAppId(id);
425
+ const record = (await readInstalledPanelAppsRegistry()).find((candidate) => candidate.id === id);
426
+ if (!record)
427
+ throw new PanelAppInstallError(`Panel App '${id}' has no installed source record`);
428
+ if (typeof record.source !== "string") {
429
+ return normalizeGitPanelAppSource(record.source);
430
+ }
431
+ let info;
432
+ try {
433
+ info = await stat(record.source);
434
+ }
435
+ catch {
436
+ throw new PanelAppInstallError(`original source for Panel App '${id}' is unavailable: ${record.source}`);
437
+ }
438
+ if (info.isDirectory())
439
+ return { kind: "dir", path: record.source };
440
+ if (info.isFile() && extname(record.source).toLowerCase() === ".zip") {
441
+ return { kind: "zip", path: record.source };
442
+ }
443
+ throw new PanelAppInstallError(`original source for Panel App '${id}' is not a folder or zip archive`);
444
+ }
445
+ /**
446
+ * Re-open the original folder, archive, or GitHub source through the same
447
+ * bounded installer review. This is the repo-development path: edit or push
448
+ * source files, review the new digest, then explicitly apply the update.
449
+ */
450
+ export async function previewInstalledPanelAppUpdate(id) {
451
+ const input = await installedPanelAppSource(id);
452
+ const preview = await previewLocalPanelApp(input);
453
+ if (preview.id !== id) {
454
+ if (input.kind === "git") {
455
+ const snapshot = takeReviewedGitSnapshot(input, preview.reviewToken);
456
+ if (snapshot)
457
+ await disposeReviewedGitSnapshot(snapshot);
458
+ }
459
+ throw new PanelAppInstallError(`original source now declares Panel App '${preview.id}', expected '${id}'`);
460
+ }
461
+ return preview;
462
+ }
463
+ async function replaceInstalledDirectory(id, staging, overwrite) {
464
+ const finalDir = panelAppInstallDir(id);
465
+ if (!existsSync(finalDir)) {
466
+ await rename(staging, finalDir);
467
+ return {};
468
+ }
469
+ if (!overwrite) {
470
+ throw new PanelAppAlreadyInstalledError(id);
471
+ }
472
+ const backup = join(panelAppsRoot(), `.backup-${id}-${randomUUID()}`);
473
+ await rename(finalDir, backup);
474
+ try {
475
+ await rename(staging, finalDir);
476
+ return { backup };
477
+ }
478
+ catch (error) {
479
+ await rename(backup, finalDir).catch(() => undefined);
480
+ throw error;
481
+ }
482
+ }
483
+ async function installReviewedPanelAppFromRoot(sourceRoot, input, expectedReviewToken, installedAt, options) {
484
+ const inspected = await inspectPanelAppSource(sourceRoot);
485
+ if (options.expectedId && inspected.manifest.id !== options.expectedId) {
486
+ throw new PanelAppInstallError(`original source now declares Panel App '${inspected.manifest.id}', expected '${options.expectedId}'`);
487
+ }
488
+ if (inspected.digest !== expectedReviewToken)
489
+ throw new PanelAppReviewChangedError();
490
+ await mkdir(panelAppsRoot(), { recursive: true, mode: 0o700 });
491
+ const staging = await mkdtemp(join(panelAppsRoot(), `.tmp-${inspected.manifest.id}-`));
492
+ let backup;
493
+ let directoryReplaced = false;
494
+ try {
495
+ await cp(sourceRoot, staging, { recursive: true });
496
+ const copied = await inspectPanelAppSource(staging);
497
+ if (copied.digest !== expectedReviewToken)
498
+ throw new PanelAppReviewChangedError();
499
+ const storedSource = input.kind === "git" ? normalizeGitPanelAppSource(input) : input.path;
500
+ await writeFile(join(staging, PANEL_APP_META_FILE), `${JSON.stringify({
501
+ schemaVersion: 1,
502
+ id: copied.manifest.id,
503
+ version: copied.manifest.version,
504
+ source: storedSource,
505
+ installedAt,
506
+ }, null, 2)}\n`, { mode: 0o600 });
507
+ ({ backup } = await replaceInstalledDirectory(copied.manifest.id, staging, options.overwrite === true));
508
+ directoryReplaced = true;
509
+ const previous = (await readInstalledPanelAppsRegistry()).find((candidate) => candidate.id === copied.manifest.id);
510
+ await upsertInstalledPanelAppRecord({
511
+ id: copied.manifest.id,
512
+ version: copied.manifest.version,
513
+ source: storedSource,
514
+ installedAt: previous?.installedAt ?? installedAt,
515
+ lastUpdated: installedAt,
516
+ });
517
+ if (backup)
518
+ await rm(backup, { recursive: true, force: true }).catch(() => undefined);
519
+ return installedPanelApp(copied.manifest, {
520
+ id: copied.manifest.id,
521
+ version: copied.manifest.version,
522
+ source: storedSource,
523
+ installedAt: previous?.installedAt ?? installedAt,
524
+ lastUpdated: installedAt,
525
+ });
526
+ }
527
+ catch (error) {
528
+ await rm(staging, { recursive: true, force: true }).catch(() => undefined);
529
+ if (directoryReplaced) {
530
+ const finalDir = panelAppInstallDir(inspected.manifest.id);
531
+ await rm(finalDir, { recursive: true, force: true }).catch(() => undefined);
532
+ }
533
+ if (backup) {
534
+ const finalDir = panelAppInstallDir(inspected.manifest.id);
535
+ await rename(backup, finalDir).catch(() => undefined);
536
+ }
537
+ throw error;
538
+ }
539
+ }
540
+ export async function installReviewedLocalPanelApp(input, expectedReviewToken, installedAt, options = {}) {
541
+ if (!/^[a-f0-9]{64}$/.test(expectedReviewToken)) {
542
+ throw new PanelAppInstallError("Panel App review token is invalid");
543
+ }
544
+ if (input.kind === "git") {
545
+ const snapshot = takeReviewedGitSnapshot(input, expectedReviewToken);
546
+ if (snapshot) {
547
+ try {
548
+ return await installReviewedPanelAppFromRoot(snapshot.sourceRoot, snapshot.source, expectedReviewToken, installedAt, options);
549
+ }
550
+ finally {
551
+ await disposeReviewedGitSnapshot(snapshot);
552
+ }
553
+ }
554
+ }
555
+ return withPanelAppSourceRoot(input, (sourceRoot) => installReviewedPanelAppFromRoot(sourceRoot, input, expectedReviewToken, installedAt, options));
556
+ }
557
+ export async function installReviewedPanelAppUpdate(id, expectedReviewToken, installedAt) {
558
+ const input = await installedPanelAppSource(id);
559
+ return installReviewedLocalPanelApp(input, expectedReviewToken, installedAt, {
560
+ overwrite: true,
561
+ expectedId: id,
562
+ });
563
+ }
564
+ function installedPanelApp(manifest, record) {
565
+ return {
566
+ id: manifest.id,
567
+ version: manifest.version,
568
+ title: manifest.title,
569
+ ...(manifest.description ? { description: manifest.description } : {}),
570
+ entry: manifest.entry,
571
+ icon: manifest.icon,
572
+ singleton: manifest.singleton,
573
+ permissions: [...manifest.permissions],
574
+ ...(manifest.schemaVersion === 2 && manifest.agent
575
+ ? {
576
+ agent: {
577
+ tools: manifest.agent.tools.map((tool) => ({
578
+ ...tool,
579
+ inputSchema: { ...tool.inputSchema },
580
+ })),
581
+ skills: [...manifest.agent.skills],
582
+ },
583
+ }
584
+ : {}),
585
+ installPath: panelAppInstallDir(manifest.id),
586
+ source: record.source,
587
+ installedAt: record.installedAt,
588
+ lastUpdated: record.lastUpdated,
589
+ };
590
+ }
591
+ export async function listInstalledPanelApps() {
592
+ const output = [];
593
+ for (const record of await readInstalledPanelAppsRegistry()) {
594
+ try {
595
+ const root = await realpath(panelAppInstallDir(record.id));
596
+ const inspected = await inspectPanelAppSource(root);
597
+ if (inspected.manifest.id !== record.id)
598
+ continue;
599
+ output.push(installedPanelApp(inspected.manifest, record));
600
+ }
601
+ catch {
602
+ // One corrupt/missing app must not hide the rest of the catalog.
603
+ }
604
+ }
605
+ return output.sort((left, right) => left.id.localeCompare(right.id));
606
+ }
607
+ export async function uninstallPanelApp(id) {
608
+ assertSafePanelAppId(id);
609
+ const directory = panelAppInstallDir(id);
610
+ if (!existsSync(directory))
611
+ throw new PanelAppInstallError(`Panel App '${id}' is not installed`);
612
+ const quarantine = join(panelAppsRoot(), `.remove-${id}-${randomUUID()}`);
613
+ await rename(directory, quarantine);
614
+ try {
615
+ await removeInstalledPanelAppRecord(id);
616
+ }
617
+ catch (error) {
618
+ await rename(quarantine, directory).catch(() => undefined);
619
+ throw error;
620
+ }
621
+ await rm(quarantine, { recursive: true, force: true });
622
+ }