@cjhyy/code-shell-core 0.7.0 → 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 (621) 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 +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -1,4 +1,5 @@
1
1
  import { resolve } from "node:path";
2
+ import { valid as validSemver, validRange as validSemverRange } from "semver";
2
3
  import { githubRepoToCloneUrl } from "../gitOps.js";
3
4
  import { PluginInstallError } from "./types.js";
4
5
  /** SSH shorthand `git@host:org/repo.git` — has a `:` after the `git@host` part. */
@@ -9,6 +10,51 @@ function isRemote(s) {
9
10
  const lower = s.toLowerCase();
10
11
  return lower.startsWith("github:") || /^[a-z][a-z0-9+.-]*:\/\//i.test(s) || isSshUrl(s);
11
12
  }
13
+ const MAX_NPM_PACKAGE_NAME = 214;
14
+ const MAX_NPM_SELECTOR = 128;
15
+ const NPM_PACKAGE_NAME = /^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/;
16
+ const NPM_DIST_TAG = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
17
+ /** Parse the intentionally small npm Phase-A source grammar. */
18
+ export function parseNpmPluginSource(input) {
19
+ if (!input.startsWith("npm:")) {
20
+ throw new PluginInstallError("npm plugin source must start with npm:");
21
+ }
22
+ const spec = input.slice("npm:".length);
23
+ let packageName = spec;
24
+ let selector = "latest";
25
+ // Scoped names contain their own leading '@'. A selector separator is only
26
+ // an '@' after the slash; unscoped names use their last '@'.
27
+ const selectorAt = spec.startsWith("@")
28
+ ? (() => {
29
+ const slash = spec.indexOf("/");
30
+ return slash < 0 ? -1 : spec.lastIndexOf("@") > slash ? spec.lastIndexOf("@") : -1;
31
+ })()
32
+ : spec.lastIndexOf("@");
33
+ if (selectorAt >= 0) {
34
+ packageName = spec.slice(0, selectorAt);
35
+ selector = spec.slice(selectorAt + 1);
36
+ }
37
+ if (packageName.length === 0 ||
38
+ packageName.length > MAX_NPM_PACKAGE_NAME ||
39
+ !NPM_PACKAGE_NAME.test(packageName)) {
40
+ throw new PluginInstallError(`invalid public npm package name: ${packageName || "(empty)"}`);
41
+ }
42
+ const exact = validSemver(selector);
43
+ if (selector.length === 0 ||
44
+ selector.length > MAX_NPM_SELECTOR ||
45
+ (!exact && (!NPM_DIST_TAG.test(selector) || validSemverRange(selector) !== null))) {
46
+ throw new PluginInstallError(`npm selector must be an exact version or dist-tag (ranges are not supported): ${selector || "(empty)"}`);
47
+ }
48
+ const inferredName = packageName.split("/").pop() ?? packageName;
49
+ return {
50
+ kind: "npm",
51
+ packageName,
52
+ selector: exact ?? selector,
53
+ selectorKind: exact ? "exact" : "tag",
54
+ raw: input,
55
+ inferredName,
56
+ };
57
+ }
12
58
  function unsafeTransport(input) {
13
59
  const scheme = input.match(/^([a-z][a-z0-9+.-]*):\/\//i)?.[1]?.toLowerCase();
14
60
  if (!scheme)
@@ -37,6 +83,8 @@ function lastSegment(p) {
37
83
  return p.split("/").filter(Boolean).pop() ?? p;
38
84
  }
39
85
  export function parseSource(input, options = {}) {
86
+ if (input.startsWith("npm:"))
87
+ return parseNpmPluginSource(input);
40
88
  if (!isRemote(input)) {
41
89
  return { kind: "local", path: resolve(input) };
42
90
  }
@@ -0,0 +1,101 @@
1
+ import { type InstallLocalOptions, type LocalPluginSourceInput } from "./installFromArchive.js";
2
+ import { PluginInstallError } from "./types.js";
3
+ export type LocalPluginPreviewWarningKind = "executable-hooks" | "stdio-mcp" | "network-mcp" | "automation-templates" | "external-links" | "media";
4
+ export interface LocalPluginPreviewWarning {
5
+ count: number;
6
+ kind: LocalPluginPreviewWarningKind;
7
+ severity: "warning" | "info";
8
+ }
9
+ export interface LocalPluginHookPreview {
10
+ command: string;
11
+ commandTruncated: boolean;
12
+ event: string;
13
+ matcher?: string;
14
+ matcherTruncated?: boolean;
15
+ }
16
+ export interface LocalPluginMcpPreview {
17
+ command?: string;
18
+ commandTruncated?: boolean;
19
+ name: string;
20
+ transport: "stdio" | "sse" | "streamable-http";
21
+ url?: string;
22
+ urlTruncated?: boolean;
23
+ }
24
+ export interface LocalPluginAutomationTemplatePreview {
25
+ description?: string;
26
+ id: string;
27
+ permissionLevel: "read-only" | "workspace-write" | "full";
28
+ prompt: string;
29
+ promptTruncated: boolean;
30
+ schedule: string;
31
+ timezone?: string;
32
+ title: {
33
+ default: string;
34
+ en?: string;
35
+ "zh-CN"?: string;
36
+ };
37
+ workspace: "current" | "none";
38
+ }
39
+ export interface LocalPluginMediaPreview {
40
+ composerIcon?: string;
41
+ logo?: string;
42
+ logoDark?: string;
43
+ screenshots: string[];
44
+ }
45
+ export interface LocalPluginInterfacePreview {
46
+ brandColor?: string;
47
+ capabilities: string[];
48
+ category?: string;
49
+ defaultPrompt: string[];
50
+ developerName?: string;
51
+ displayName?: string;
52
+ externalLinks: Array<{
53
+ kind: "website" | "privacy" | "terms";
54
+ url: string;
55
+ }>;
56
+ longDescription?: string;
57
+ media: LocalPluginMediaPreview;
58
+ shortDescription?: string;
59
+ }
60
+ export interface LocalPluginPreview {
61
+ agents: string[];
62
+ alreadyInstalled: boolean;
63
+ commands: string[];
64
+ format: "cc" | "codex";
65
+ hooks: LocalPluginHookPreview[];
66
+ installedVersion?: string;
67
+ interface: LocalPluginInterfacePreview;
68
+ mcpServers: LocalPluginMcpPreview[];
69
+ name: string;
70
+ automationTemplates: LocalPluginAutomationTemplatePreview[];
71
+ reviewToken: string;
72
+ skills: Array<{
73
+ description?: string;
74
+ name: string;
75
+ }>;
76
+ source: {
77
+ kind: "dir" | "zip";
78
+ label: string;
79
+ };
80
+ version?: string;
81
+ warnings: LocalPluginPreviewWarning[];
82
+ }
83
+ export declare class LocalPluginReviewChangedError extends PluginInstallError {
84
+ constructor();
85
+ }
86
+ /**
87
+ * Inspect a local directory/zip through the exact runtime projection used by
88
+ * install. No plugin root or installed registry is mutated.
89
+ */
90
+ export declare function previewLocalPlugin(input: LocalPluginSourceInput): Promise<LocalPluginPreview>;
91
+ /**
92
+ * Install exactly the source tree represented by a review token.
93
+ *
94
+ * A private, symlink-free snapshot closes the gap between re-review and
95
+ * installation: after its projection matches the token, the installer reads
96
+ * only that snapshot, never the caller-owned directory or archive again.
97
+ */
98
+ export declare function installReviewedLocalPlugin(input: LocalPluginSourceInput, expectedReviewToken: string, installedAt: string, options?: InstallLocalOptions): Promise<{
99
+ dir: string;
100
+ name: string;
101
+ }>;
@@ -0,0 +1,336 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { cp, lstat, mkdtemp, readFile, readdir, readlink, realpath, rm, stat, } from "node:fs/promises";
4
+ import { basename, join, relative, sep } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { parseFrontmatter } from "../../skills/frontmatter.js";
7
+ import { readInstalledPlugins } from "../installedPlugins.js";
8
+ import { inspectPluginHooks } from "../pluginHookIntegrity.js";
9
+ import { deriveName, installLocalPlugin, normalizePluginName, withLocalPluginSourceRoot, } from "./installFromArchive.js";
10
+ import { readPluginMcp } from "./loadPluginMcp.js";
11
+ import { pluginInstallDir } from "./paths.js";
12
+ import { assertBoundedPluginSource, projectPluginSource } from "./projectPluginSource.js";
13
+ import { PluginInstallError } from "./types.js";
14
+ const MAX_PREVIEW_ITEMS = 256;
15
+ const MAX_PREVIEW_SKILL_BYTES = 512 * 1024;
16
+ const MAX_PREVIEW_TEXT = 240;
17
+ const MAX_PREVIEW_DESCRIPTION = 300;
18
+ const MAX_PREVIEW_MCP_BYTES = 1024 * 1024;
19
+ export class LocalPluginReviewChangedError extends PluginInstallError {
20
+ constructor() {
21
+ super("Plugin source changed after review. Review it again before installing.");
22
+ this.name = "LocalPluginReviewChangedError";
23
+ }
24
+ }
25
+ function truncated(value, max = MAX_PREVIEW_TEXT) {
26
+ if (value.length <= max)
27
+ return { text: value, truncated: false };
28
+ return { text: `${value.slice(0, Math.max(0, max - 1))}…`, truncated: true };
29
+ }
30
+ function ensureItemBound(kind, count) {
31
+ if (count > MAX_PREVIEW_ITEMS) {
32
+ throw new PluginInstallError(`plugin declares more than ${MAX_PREVIEW_ITEMS} ${kind}; preview refused`);
33
+ }
34
+ }
35
+ async function listMarkdownNames(root, recursive) {
36
+ if (!existsSync(root))
37
+ return [];
38
+ const names = [];
39
+ const walk = async (directory) => {
40
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
41
+ const path = join(directory, entry.name);
42
+ if (entry.isDirectory() && recursive) {
43
+ await walk(path);
44
+ continue;
45
+ }
46
+ if (!entry.isFile() || !entry.name.endsWith(".md"))
47
+ continue;
48
+ names.push(relative(root, path).replaceAll(sep, "/").replace(/\.md$/, ""));
49
+ ensureItemBound("entries", names.length);
50
+ }
51
+ };
52
+ await walk(root);
53
+ return names.sort();
54
+ }
55
+ async function listSkills(root) {
56
+ if (!existsSync(root))
57
+ return [];
58
+ const output = [];
59
+ for (const entry of (await readdir(root, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
60
+ if (!entry.isDirectory())
61
+ continue;
62
+ const skillFile = join(root, entry.name, "SKILL.md");
63
+ if (!existsSync(skillFile) || !(await stat(skillFile)).isFile())
64
+ continue;
65
+ const info = await stat(skillFile);
66
+ if (info.size > MAX_PREVIEW_SKILL_BYTES) {
67
+ throw new PluginInstallError(`skills/${entry.name}/SKILL.md exceeds ${MAX_PREVIEW_SKILL_BYTES} bytes`);
68
+ }
69
+ const { frontmatter } = parseFrontmatter(await readFile(skillFile, "utf-8"));
70
+ const description = typeof frontmatter.description === "string"
71
+ ? truncated(frontmatter.description, MAX_PREVIEW_DESCRIPTION).text
72
+ : undefined;
73
+ output.push({ name: entry.name, ...(description ? { description } : {}) });
74
+ ensureItemBound("skills", output.length);
75
+ }
76
+ return output;
77
+ }
78
+ function listHooks(projectionRoot) {
79
+ const snapshot = inspectPluginHooks(projectionRoot);
80
+ if (snapshot.state === "invalid") {
81
+ throw new PluginInstallError(`invalid plugin hooks: ${snapshot.error ?? "unknown error"}`);
82
+ }
83
+ const hooks = [];
84
+ for (const [event, groups] of Object.entries(snapshot.definition?.hooks ?? {})) {
85
+ for (const group of groups ?? []) {
86
+ const matcher = group.matcher ? truncated(group.matcher) : null;
87
+ for (const hook of group.hooks) {
88
+ const command = truncated(hook.command);
89
+ hooks.push({
90
+ event,
91
+ command: command.text,
92
+ commandTruncated: command.truncated,
93
+ ...(matcher
94
+ ? {
95
+ matcher: matcher.text,
96
+ matcherTruncated: matcher.truncated,
97
+ }
98
+ : {}),
99
+ });
100
+ ensureItemBound("hooks", hooks.length);
101
+ }
102
+ }
103
+ }
104
+ return hooks;
105
+ }
106
+ async function assertCcMcpPreviewComplete(projectionRoot, normalizedCount) {
107
+ const path = join(projectionRoot, ".mcp.json");
108
+ if (!existsSync(path))
109
+ return;
110
+ const info = await lstat(path);
111
+ if (info.isSymbolicLink() || !info.isFile() || info.size > MAX_PREVIEW_MCP_BYTES) {
112
+ throw new PluginInstallError("plugin .mcp.json is not a bounded regular file");
113
+ }
114
+ let parsed;
115
+ try {
116
+ parsed = JSON.parse(await readFile(path, "utf-8"));
117
+ }
118
+ catch (error) {
119
+ throw new PluginInstallError(`invalid plugin .mcp.json: ${error instanceof Error ? error.message : String(error)}`);
120
+ }
121
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
122
+ throw new PluginInstallError("plugin .mcp.json root must be an object");
123
+ }
124
+ const raw = "mcpServers" in parsed ? parsed.mcpServers : parsed;
125
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
126
+ throw new PluginInstallError("plugin .mcp.json mcpServers must be an object");
127
+ }
128
+ if (Object.keys(raw).length !== normalizedCount) {
129
+ throw new PluginInstallError("plugin .mcp.json contains invalid MCP server declarations");
130
+ }
131
+ }
132
+ async function listMcp(projectionRoot, pluginName, format) {
133
+ const configs = readPluginMcp(projectionRoot, pluginName);
134
+ if (format === "cc") {
135
+ await assertCcMcpPreviewComplete(projectionRoot, Object.keys(configs).length);
136
+ }
137
+ const output = Object.entries(configs)
138
+ .map(([key, config]) => {
139
+ const transport = config.transport ??
140
+ (config.url && !config.command ? "streamable-http" : "stdio");
141
+ const command = config.command ? truncated(config.command) : null;
142
+ const url = config.url ? truncated(config.url) : null;
143
+ return {
144
+ name: key.startsWith(`${pluginName}:`) ? key.slice(pluginName.length + 1) : key,
145
+ transport: transport === "sse" || transport === "streamable-http" ? transport : "stdio",
146
+ ...(command ? { command: command.text, commandTruncated: command.truncated } : {}),
147
+ ...(url ? { url: url.text, urlTruncated: url.truncated } : {}),
148
+ };
149
+ })
150
+ .sort((a, b) => a.name.localeCompare(b.name));
151
+ ensureItemBound("MCP servers", output.length);
152
+ return output;
153
+ }
154
+ function interfacePreview(value) {
155
+ const externalLinks = [];
156
+ if (value?.websiteURL)
157
+ externalLinks.push({ kind: "website", url: value.websiteURL });
158
+ if (value?.privacyPolicyURL) {
159
+ externalLinks.push({ kind: "privacy", url: value.privacyPolicyURL });
160
+ }
161
+ if (value?.termsOfServiceURL) {
162
+ externalLinks.push({ kind: "terms", url: value.termsOfServiceURL });
163
+ }
164
+ return {
165
+ capabilities: [...(value?.capabilities ?? [])],
166
+ defaultPrompt: [...(value?.defaultPrompt ?? [])],
167
+ externalLinks,
168
+ media: {
169
+ ...(value?.composerIcon ? { composerIcon: value.composerIcon } : {}),
170
+ ...(value?.logo ? { logo: value.logo } : {}),
171
+ ...(value?.logoDark ? { logoDark: value.logoDark } : {}),
172
+ screenshots: [...(value?.screenshots ?? [])],
173
+ },
174
+ ...(value?.displayName ? { displayName: value.displayName } : {}),
175
+ ...(value?.shortDescription ? { shortDescription: value.shortDescription } : {}),
176
+ ...(value?.longDescription ? { longDescription: value.longDescription } : {}),
177
+ ...(value?.developerName ? { developerName: value.developerName } : {}),
178
+ ...(value?.category ? { category: value.category } : {}),
179
+ ...(value?.brandColor ? { brandColor: value.brandColor } : {}),
180
+ };
181
+ }
182
+ function warningsFor(hooks, mcpServers, automationTemplates, metadata) {
183
+ const warnings = [];
184
+ if (hooks.length > 0) {
185
+ warnings.push({ kind: "executable-hooks", severity: "warning", count: hooks.length });
186
+ }
187
+ const stdio = mcpServers.filter((server) => server.transport === "stdio").length;
188
+ const network = mcpServers.length - stdio;
189
+ if (stdio > 0)
190
+ warnings.push({ kind: "stdio-mcp", severity: "warning", count: stdio });
191
+ if (network > 0)
192
+ warnings.push({ kind: "network-mcp", severity: "warning", count: network });
193
+ if (automationTemplates.length > 0) {
194
+ warnings.push({
195
+ kind: "automation-templates",
196
+ severity: "warning",
197
+ count: automationTemplates.length,
198
+ });
199
+ }
200
+ if (metadata.externalLinks.length > 0) {
201
+ warnings.push({
202
+ kind: "external-links",
203
+ severity: "info",
204
+ count: metadata.externalLinks.length,
205
+ });
206
+ }
207
+ const mediaCount = Number(Boolean(metadata.media.composerIcon)) +
208
+ Number(Boolean(metadata.media.logo)) +
209
+ Number(Boolean(metadata.media.logoDark)) +
210
+ metadata.media.screenshots.length;
211
+ if (mediaCount > 0) {
212
+ warnings.push({ kind: "media", severity: "info", count: mediaCount });
213
+ }
214
+ return warnings;
215
+ }
216
+ async function digestProjection(root) {
217
+ const hash = createHash("sha256").update("codeshell-local-plugin-review-v1").update("\0");
218
+ const canonicalRoot = await realpath(root);
219
+ const walk = async (directory) => {
220
+ for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
221
+ const path = join(directory, entry.name);
222
+ const rel = relative(canonicalRoot, path).replaceAll(sep, "/");
223
+ // rewritePluginVars intentionally stamps this explanatory breadcrumb
224
+ // with the current time. It does not affect runtime capabilities and
225
+ // must not make two reviews of unchanged source produce different tokens.
226
+ if (rel === ".code-shell-installed.json")
227
+ continue;
228
+ hash.update(rel).update("\0");
229
+ const info = await lstat(path);
230
+ if (info.isDirectory()) {
231
+ hash.update("dir\0");
232
+ await walk(path);
233
+ }
234
+ else if (info.isSymbolicLink()) {
235
+ const target = await readlink(path);
236
+ hash.update("link\0").update(target).update("\0");
237
+ }
238
+ else if (info.isFile()) {
239
+ hash
240
+ .update("file\0")
241
+ .update(await readFile(path))
242
+ .update("\0");
243
+ }
244
+ }
245
+ };
246
+ await walk(canonicalRoot);
247
+ return hash.digest("hex");
248
+ }
249
+ function installedVersion(name) {
250
+ const entries = readInstalledPlugins().plugins[`${name}@local`] ?? [];
251
+ return entries.at(-1)?.version;
252
+ }
253
+ /**
254
+ * Inspect a local directory/zip through the exact runtime projection used by
255
+ * install. No plugin root or installed registry is mutated.
256
+ */
257
+ export async function previewLocalPlugin(input) {
258
+ return withLocalPluginSourceRoot(input, async (sourceRoot) => {
259
+ const name = normalizePluginName(await deriveName(sourceRoot));
260
+ const projectionRoot = await mkdtemp(join(tmpdir(), "cs-plugin-preview-"));
261
+ try {
262
+ const projected = await projectPluginSource(sourceRoot, projectionRoot, name);
263
+ const skills = await listSkills(join(projectionRoot, "skills"));
264
+ const commands = await listMarkdownNames(join(projectionRoot, "commands"), false);
265
+ const agents = await listMarkdownNames(join(projectionRoot, "agents"), true);
266
+ const hooks = listHooks(projectionRoot);
267
+ const mcpServers = await listMcp(projectionRoot, name, projected.format);
268
+ const automationTemplates = (projected.canonicalManifest.automations?.templates ?? []).map((template) => {
269
+ const prompt = truncated(template.prompt, 500);
270
+ return {
271
+ id: template.id,
272
+ title: template.title,
273
+ ...(template.description ? { description: template.description } : {}),
274
+ schedule: template.schedule,
275
+ prompt: prompt.text,
276
+ promptTruncated: prompt.truncated,
277
+ ...(template.timezone ? { timezone: template.timezone } : {}),
278
+ permissionLevel: template.permissionLevel,
279
+ workspace: template.workspace,
280
+ };
281
+ });
282
+ const metadata = interfacePreview(projected.canonicalManifest.interface);
283
+ const reviewToken = await digestProjection(projectionRoot);
284
+ const exists = existsSync(pluginInstallDir(name));
285
+ const currentInstalledVersion = exists ? installedVersion(name) : undefined;
286
+ return {
287
+ name,
288
+ format: projected.format,
289
+ ...(projected.version ? { version: projected.version } : {}),
290
+ source: { kind: input.kind, label: basename(input.path) },
291
+ alreadyInstalled: exists,
292
+ ...(currentInstalledVersion ? { installedVersion: currentInstalledVersion } : {}),
293
+ reviewToken,
294
+ skills,
295
+ commands,
296
+ agents,
297
+ hooks,
298
+ mcpServers,
299
+ automationTemplates,
300
+ interface: metadata,
301
+ warnings: warningsFor(hooks, mcpServers, automationTemplates, metadata),
302
+ };
303
+ }
304
+ finally {
305
+ await rm(projectionRoot, { recursive: true, force: true });
306
+ }
307
+ });
308
+ }
309
+ /**
310
+ * Install exactly the source tree represented by a review token.
311
+ *
312
+ * A private, symlink-free snapshot closes the gap between re-review and
313
+ * installation: after its projection matches the token, the installer reads
314
+ * only that snapshot, never the caller-owned directory or archive again.
315
+ */
316
+ export async function installReviewedLocalPlugin(input, expectedReviewToken, installedAt, options) {
317
+ if (!/^[a-f0-9]{64}$/.test(expectedReviewToken)) {
318
+ throw new PluginInstallError("local plugin review token is invalid");
319
+ }
320
+ return withLocalPluginSourceRoot(input, async (sourceRoot) => {
321
+ const snapshotContainer = await mkdtemp(join(tmpdir(), "cs-plugin-reviewed-"));
322
+ const snapshotRoot = join(snapshotContainer, "source");
323
+ try {
324
+ await assertBoundedPluginSource(sourceRoot);
325
+ await cp(sourceRoot, snapshotRoot, { recursive: true, errorOnExist: true });
326
+ const snapshotPreview = await previewLocalPlugin({ kind: "dir", path: snapshotRoot });
327
+ if (snapshotPreview.reviewToken !== expectedReviewToken) {
328
+ throw new LocalPluginReviewChangedError();
329
+ }
330
+ return await installLocalPlugin({ kind: "dir", path: snapshotRoot }, installedAt, snapshotPreview.name, options);
331
+ }
332
+ finally {
333
+ await rm(snapshotContainer, { recursive: true, force: true });
334
+ }
335
+ });
336
+ }
@@ -0,0 +1,14 @@
1
+ import { type CanonicalPluginManifest as CanonicalPluginManifestData } from "./types.js";
2
+ export interface ProjectedPluginSource {
3
+ canonicalManifest: CanonicalPluginManifestData;
4
+ format: "cc" | "codex";
5
+ version?: string;
6
+ }
7
+ /** Bound local directory input before copying or parsing author-controlled files. */
8
+ export declare function assertBoundedPluginSource(sourceDir: string): Promise<void>;
9
+ /**
10
+ * Build the same CodeShell-native projection used by installation, without
11
+ * touching the plugin root or installed registry. The destination must be a
12
+ * private temporary/staging directory owned by the caller.
13
+ */
14
+ export declare function projectPluginSource(sourceDir: string, destinationRoot: string, name: string): Promise<ProjectedPluginSource>;
@@ -0,0 +1,140 @@
1
+ import { existsSync } from "node:fs";
2
+ import { cp, lstat, readFile, readdir, realpath, stat, writeFile } from "node:fs/promises";
3
+ import { join, relative } from "node:path";
4
+ import { rewritePluginVars } from "../varRewrite.js";
5
+ import { convertCodexAgentsDirectory } from "./codex/convertAgents.js";
6
+ import { copyCodexCommands } from "./codex/convertCommands.js";
7
+ import { copyCodexHooks } from "./codex/convertHooks.js";
8
+ import { resolveCodexMcpServers } from "./codex/convertMcp.js";
9
+ import { copyCodexSkills } from "./codex/convertSkills.js";
10
+ import { detectPluginFormat } from "./detectFormat.js";
11
+ import { normalizePluginMcpMap } from "./loadPluginMcp.js";
12
+ import { normalizePluginManifest } from "./normalizeManifest.js";
13
+ import { CodexPluginManifest, PluginInstallError, } from "./types.js";
14
+ import { PANEL_APP_MANIFEST_FILE } from "../../panel-apps/manifest.js";
15
+ const MAX_PLUGIN_SOURCE_ENTRIES = 10_000;
16
+ const MAX_PLUGIN_SOURCE_BYTES = 256 * 1024 * 1024;
17
+ const MAX_PLUGIN_SOURCE_FILE_BYTES = 64 * 1024 * 1024;
18
+ const MAX_PLUGIN_SOURCE_DEPTH = 32;
19
+ const MAX_PLUGIN_SOURCE_RELATIVE_PATH = 1_024;
20
+ const MAX_PLUGIN_MANIFEST_BYTES = 1024 * 1024;
21
+ async function assertBoundedTreeEntry(root, directory, depth, budget) {
22
+ if (depth > MAX_PLUGIN_SOURCE_DEPTH) {
23
+ throw new PluginInstallError(`plugin source exceeds the maximum directory depth ${MAX_PLUGIN_SOURCE_DEPTH}`);
24
+ }
25
+ const entries = await readdir(directory, { withFileTypes: true });
26
+ for (const entry of entries) {
27
+ budget.entries += 1;
28
+ if (budget.entries > MAX_PLUGIN_SOURCE_ENTRIES) {
29
+ throw new PluginInstallError(`plugin source contains more than ${MAX_PLUGIN_SOURCE_ENTRIES} entries`);
30
+ }
31
+ const path = join(directory, entry.name);
32
+ const rel = relative(root, path);
33
+ if (rel.length > MAX_PLUGIN_SOURCE_RELATIVE_PATH) {
34
+ throw new PluginInstallError(`plugin source path exceeds ${MAX_PLUGIN_SOURCE_RELATIVE_PATH} characters`);
35
+ }
36
+ const info = await lstat(path);
37
+ if (info.isSymbolicLink()) {
38
+ throw new PluginInstallError(`plugin source must not contain symbolic links; link escapes the stable review boundary: ${rel}`);
39
+ }
40
+ if (info.isDirectory()) {
41
+ await assertBoundedTreeEntry(root, path, depth + 1, budget);
42
+ continue;
43
+ }
44
+ if (!info.isFile()) {
45
+ throw new PluginInstallError(`plugin source contains an unsupported file type: ${rel}`);
46
+ }
47
+ if (info.size > MAX_PLUGIN_SOURCE_FILE_BYTES) {
48
+ throw new PluginInstallError(`plugin source file exceeds ${MAX_PLUGIN_SOURCE_FILE_BYTES} bytes: ${rel}`);
49
+ }
50
+ budget.bytes += info.size;
51
+ if (budget.bytes > MAX_PLUGIN_SOURCE_BYTES) {
52
+ throw new PluginInstallError(`plugin source exceeds the ${MAX_PLUGIN_SOURCE_BYTES} byte size limit`);
53
+ }
54
+ }
55
+ }
56
+ /** Bound local directory input before copying or parsing author-controlled files. */
57
+ export async function assertBoundedPluginSource(sourceDir) {
58
+ let root;
59
+ try {
60
+ root = await realpath(sourceDir);
61
+ }
62
+ catch {
63
+ throw new PluginInstallError(`source is not a readable directory: ${sourceDir}`);
64
+ }
65
+ if (!(await stat(root)).isDirectory()) {
66
+ throw new PluginInstallError(`source is not a directory: ${sourceDir}`);
67
+ }
68
+ await assertBoundedTreeEntry(root, root, 0, { bytes: 0, entries: 0 });
69
+ }
70
+ async function readBoundedJson(path) {
71
+ const info = await stat(path);
72
+ if (!info.isFile() || info.size > MAX_PLUGIN_MANIFEST_BYTES) {
73
+ throw new PluginInstallError(`plugin manifest must be a regular file no larger than ${MAX_PLUGIN_MANIFEST_BYTES} bytes`);
74
+ }
75
+ try {
76
+ const parsed = JSON.parse(await readFile(path, "utf-8"));
77
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
78
+ throw new Error("manifest root must be an object");
79
+ }
80
+ return parsed;
81
+ }
82
+ catch (error) {
83
+ if (error instanceof PluginInstallError)
84
+ throw error;
85
+ throw new PluginInstallError(`invalid plugin manifest: ${error instanceof Error ? error.message : String(error)}`);
86
+ }
87
+ }
88
+ /**
89
+ * Build the same CodeShell-native projection used by installation, without
90
+ * touching the plugin root or installed registry. The destination must be a
91
+ * private temporary/staging directory owned by the caller.
92
+ */
93
+ export async function projectPluginSource(sourceDir, destinationRoot, name) {
94
+ if (existsSync(join(sourceDir, PANEL_APP_MANIFEST_FILE))) {
95
+ throw new PluginInstallError(`Panel App packages use a separate installer; remove ${PANEL_APP_MANIFEST_FILE} from the agent plugin source`);
96
+ }
97
+ await assertBoundedPluginSource(sourceDir);
98
+ const format = detectPluginFormat(sourceDir);
99
+ let version;
100
+ await cp(sourceDir, destinationRoot, { recursive: true });
101
+ if (format === "codex") {
102
+ const manifest = CodexPluginManifest.parse(await readBoundedJson(join(sourceDir, ".codex-plugin", "plugin.json")));
103
+ version = manifest.version;
104
+ await copyCodexSkills(sourceDir, destinationRoot);
105
+ await convertCodexAgentsDirectory(sourceDir, destinationRoot, name);
106
+ await copyCodexCommands(sourceDir, destinationRoot);
107
+ await copyCodexHooks(sourceDir, destinationRoot, manifest.hooks);
108
+ const servers = resolveCodexMcpServers(sourceDir, manifest.mcpServers);
109
+ const keyed = {};
110
+ for (const [serverName, config] of Object.entries(servers)) {
111
+ const key = `${name}:${serverName}`;
112
+ keyed[key] = { ...config, name: key };
113
+ }
114
+ if (Object.keys(keyed).length > 0) {
115
+ const normalized = normalizePluginMcpMap(keyed, name, true);
116
+ if (Object.keys(normalized).length !== Object.keys(keyed).length) {
117
+ throw new PluginInstallError("invalid plugin MCP server declaration");
118
+ }
119
+ await writeFile(join(destinationRoot, "mcp-servers.json"), JSON.stringify(normalized, null, 2));
120
+ }
121
+ }
122
+ else {
123
+ const manifestPath = join(sourceDir, ".claude-plugin", "plugin.json");
124
+ if (existsSync(manifestPath)) {
125
+ const manifest = await readBoundedJson(manifestPath);
126
+ version =
127
+ typeof manifest.version === "string" && manifest.version.length > 0
128
+ ? manifest.version
129
+ : undefined;
130
+ }
131
+ }
132
+ const canonicalManifest = await normalizePluginManifest(sourceDir, {
133
+ name,
134
+ version,
135
+ format,
136
+ destinationRoot,
137
+ });
138
+ rewritePluginVars(destinationRoot);
139
+ return { canonicalManifest, format, version };
140
+ }