@cjhyy/code-shell-core 0.7.1 → 0.8.0

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