@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
@@ -2,7 +2,35 @@
2
2
  * Settings schema with Zod validation.
3
3
  */
4
4
  import { z } from "zod";
5
- import { DEFAULT_WORKTREE_BRANCH_PREFIX, isValidWorktreeBranchPrefix, normalizeWorktreeBranchPrefix, } from "../git/worktree/slug.js";
5
+ import { WorkspaceSourceBindingSchema } from "../sources/types.js";
6
+ const DEFAULT_WORKTREE_BRANCH_PREFIX = "worktree/";
7
+ const McpToolNameListSchema = z
8
+ .array(z
9
+ .string()
10
+ .min(1)
11
+ .max(256)
12
+ .refine((value) => !value.includes("\0"), "Invalid MCP tool name"))
13
+ .max(256);
14
+ function isValidWorktreeBranchPrefix(prefix) {
15
+ const raw = prefix.trim();
16
+ if (!raw || raw.startsWith("/") || raw.includes("//"))
17
+ return false;
18
+ if (raw.includes("..") || raw.includes("@{"))
19
+ return false;
20
+ if (/[\x00-\x20~^:?*[\]\\]/.test(raw))
21
+ return false;
22
+ const value = raw.endsWith("/") ? raw.slice(0, -1) : raw;
23
+ return (value.length > 0 &&
24
+ value
25
+ .split("/")
26
+ .every((part) => Boolean(part) && !part.startsWith(".") && !part.endsWith(".") && !part.endsWith(".lock")));
27
+ }
28
+ function normalizeWorktreeBranchPrefix(prefix) {
29
+ const raw = prefix.trim();
30
+ if (!isValidWorktreeBranchPrefix(raw))
31
+ throw new Error(`Invalid worktree branch prefix: ${prefix}`);
32
+ return raw.endsWith("/") ? raw : `${raw}/`;
33
+ }
6
34
  /**
7
35
  * Tri-state project capability overlay. Lives in PROJECT settings only and
8
36
  * layers over the global baseline (disabledSkills / disabledPlugins /
@@ -21,6 +49,8 @@ export const CapabilityOverridesSchema = z
21
49
  agents: z.record(CapabilityOverrideSchema).optional(),
22
50
  mcp: z.record(CapabilityOverrideSchema).optional(),
23
51
  builtin: z.record(CapabilityOverrideSchema).optional(),
52
+ /** Per-project Pet capability preferences layered over the user baseline. */
53
+ pet: z.record(CapabilityOverrideSchema).optional(),
24
54
  /**
25
55
  * Per-hook overlay for PLUGIN-provided hooks, keyed by
26
56
  * `pluginHookKey()` (`<plugin>:<RawEvent>:<command>`). Finer-grained
@@ -42,7 +72,9 @@ export const SettingsSchema = z
42
72
  agent: z
43
73
  .object({
44
74
  // Use z.string() instead of z.enum() to allow custom presets registered via registerPreset()
45
- preset: z.string().default("terminal-coding"),
75
+ // No domain preset is baked into core. Installed capabilities may
76
+ // contribute a host default.
77
+ preset: z.string().optional(),
46
78
  enabledBuiltinTools: z.array(z.string()).default([]),
47
79
  disabledBuiltinTools: z.array(z.string()).default([]),
48
80
  customSystemPrompt: z.string().optional(),
@@ -65,6 +97,27 @@ export const SettingsSchema = z
65
97
  * Can also be disabled via env var `DISABLE_AUTOUPDATER=1`.
66
98
  */
67
99
  autoUpdates: z.boolean().default(true),
100
+ /**
101
+ * Pet (Mimi) global-view preferences.
102
+ */
103
+ pet: z
104
+ .object({
105
+ /**
106
+ * Show external Codex CLI/App sessions in the Pet global view. When off,
107
+ * the host does not scan or tail Codex session files at all. Default off.
108
+ */
109
+ showExternalCodexSessions: z.boolean().default(false),
110
+ /** Same, for external Claude Code CLI sessions. Default off. */
111
+ showExternalClaudeSessions: z.boolean().default(false),
112
+ /**
113
+ * Auto-extract durable memories + an event-journal entry from each closed
114
+ * Mimi topic segment. When off, segment closure still archives the model
115
+ * context (so it cannot grow without bound) but writes no journal/memory.
116
+ * Default on.
117
+ */
118
+ memoryAutoExtract: z.boolean().default(true),
119
+ })
120
+ .default({}),
68
121
  /**
69
122
  * Image generation is a general capability, decoupled from LLM providers
70
123
  * (TODO 7.1): a vendor may use different keys/endpoints/models for chat vs
@@ -267,18 +320,23 @@ export const SettingsSchema = z
267
320
  // Codex-style on/off switch. Absent or true → connected; only
268
321
  // literal false disables. Filtered in MCPManager.connectAll.
269
322
  enabled: z.boolean().optional(),
323
+ allowedTools: McpToolNameListSchema.optional(),
324
+ disabledTools: McpToolNameListSchema.optional(),
270
325
  })))
271
326
  .default({}),
272
327
  /**
273
- * User supplements for PLUGIN-provided MCP servers, keyed by the server's
274
- * `<plugin>:<server>` name. Layered onto the plugin config at merge time
275
- * (mergePluginMcpServers). Only env/credential fields are accepted —
276
- * command/args/url/transport are intentionally absent and `.strict()`
277
- * rejects them, so a plugin update is never shadowed by a stale copy.
328
+ * User policy/supplements for PLUGIN-provided MCP servers, keyed by the
329
+ * server's `<plugin>:<server>` name. Layered onto the plugin config at merge
330
+ * time (mergePluginMcpServers). Only server/tool policy + env/credential
331
+ * fields are accepted — command/args/url/transport are intentionally absent and
332
+ * `.strict()` rejects them, so an update is never shadowed by a stale copy.
278
333
  */
279
334
  mcpServerOverrides: z
280
335
  .record(z
281
336
  .object({
337
+ enabled: z.boolean().optional(),
338
+ allowedTools: McpToolNameListSchema.optional(),
339
+ disabledTools: McpToolNameListSchema.optional(),
282
340
  env: z.record(z.string()).optional(),
283
341
  envVars: z.array(z.string()).optional(),
284
342
  credentialRef: z.string().optional(),
@@ -301,6 +359,19 @@ export const SettingsSchema = z
301
359
  * names (no colon suffix). See scanSkills(opts.disabledPlugins).
302
360
  */
303
361
  disabledPlugins: z.array(z.string()).default([]),
362
+ /** Globally disabled Panel Apps, including their declared tools and bundled Skills. */
363
+ disabledPanelApps: z.array(z.string()).default([]),
364
+ /**
365
+ * Explicit project binding for installed Panel Apps. Installed apps form a
366
+ * global catalog, but only IDs in this project-owned list contribute panel
367
+ * UI, Agent tools, bundled Skills, or project-scoped storage.
368
+ */
369
+ panelAppBindings: z.array(z.string()).default([]),
370
+ /**
371
+ * Legacy per-project Panel App policy. `on` is read as an explicit binding
372
+ * during migration; new writes use panelAppBindings.
373
+ */
374
+ panelAppOverrides: z.record(CapabilityOverrideSchema).default({}),
304
375
  /**
305
376
  * Sub-agent role names (the `name` in .code-shell/agents/*.md) to
306
377
  * hide from the registry. A disabled role is filtered out at load
@@ -315,6 +386,26 @@ export const SettingsSchema = z
315
386
  * capability-assembly time. Optional — absence === everything inherits.
316
387
  */
317
388
  capabilityOverrides: CapabilityOverridesSchema,
389
+ /**
390
+ * 由 WorkspaceProfile 激活事务整体拥有的子树(profile/activation.ts)。
391
+ * 激活/切换 = 原子全量重写本子树;关闭 = 删除本子树。
392
+ * `overrides` 是 profile 声明展开的 force-enable 快照,折叠时排在
393
+ * 用户手写 capabilityOverrides 之下(用户按 key 永远赢,见 overlay.ts
394
+ * 的 effectiveProjectOverrides)。只存在于 PROJECT settings。
395
+ */
396
+ profile: z
397
+ .object({
398
+ active: z.string(),
399
+ preset: z.string().optional(),
400
+ overrides: CapabilityOverridesSchema,
401
+ })
402
+ .optional(),
403
+ /**
404
+ * Workspace 数据源绑定(只存 ref/scope/readPolicy,绝不存 secret)。
405
+ * 语义见 docs/todo/workspace-datasource-binding-adr.md §1.2。
406
+ * 只存在于 PROJECT settings。
407
+ */
408
+ sources: z.array(WorkspaceSourceBindingSchema).optional(),
318
409
  /**
319
410
  * Feature flags overlay: a map of flag name → boolean that overrides the
320
411
  * compiled-in defaults (see settings/feature-flags.ts FEATURE_FLAGS).
@@ -349,24 +440,6 @@ export const SettingsSchema = z
349
440
  ignoreGitBoundary: z.boolean().default(false),
350
441
  })
351
442
  .default({}),
352
- arena: z
353
- .object({
354
- participants: z
355
- .array(z.union([
356
- // Short form: just a model pool key
357
- z.string(),
358
- // Full form: explicit config (backward compat)
359
- z.object({
360
- name: z.string(),
361
- model: z.string(),
362
- provider: z.string().optional(),
363
- apiKey: z.string().optional(),
364
- baseUrl: z.string().optional(),
365
- }),
366
- ]))
367
- .default([]),
368
- })
369
- .default({}),
370
443
  search: z
371
444
  .object({
372
445
  provider: z.enum(["serper", "tavily", "searxng"]).default("serper"),
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Skill scanner — discovers <base>/<name>/SKILL.md files from project
3
3
  * `.code-shell/skills`, project `.agents/skills`, user `.code-shell/skills`,
4
- * and installed plugins. Mirrors Claude Code's
4
+ * installed plugins, and schema-v2 Panel Apps. Mirrors Claude Code's
5
5
  * `loadSkillsFromSkillsDir` (skills/loadSkillsDir.ts:407) plus plugin
6
6
  * integration (utils/plugins/pluginLoader.ts).
7
7
  */
8
+ type SkillSource = "project" | "user" | "plugin" | "panel-app";
8
9
  export interface SkillDefinition {
9
10
  /** Directory name; authoritative regardless of frontmatter.name. */
10
11
  name: string;
@@ -15,7 +16,7 @@ export interface SkillDefinition {
15
16
  /** Absolute path to the SKILL.md file. */
16
17
  filePath: string;
17
18
  /** Where the skill was loaded from. */
18
- source: "project" | "user" | "plugin";
19
+ source: SkillSource;
19
20
  }
20
21
  /**
21
22
  * Options accepted by scanSkills. Both filters are applied after the
@@ -34,6 +35,8 @@ export interface SkillDefinition {
34
35
  export interface ScanSkillsOptions {
35
36
  disabledSkills?: string[];
36
37
  disabledPlugins?: string[];
38
+ /** Include skills owned by Panel Apps disabled or unbound for this project. */
39
+ includeDisabledPanelApps?: boolean;
37
40
  /**
38
41
  * Hard skill isolation for sub-agents. When set, ONLY skills whose name is
39
42
  * in this list survive — every other skill is dropped from the result
@@ -46,3 +49,4 @@ export interface ScanSkillsOptions {
46
49
  }
47
50
  export declare function scanSkills(cwd: string, opts?: ScanSkillsOptions): SkillDefinition[];
48
51
  export declare function invalidateSkillCache(): void;
52
+ export {};
@@ -1,16 +1,20 @@
1
1
  /**
2
2
  * Skill scanner — discovers <base>/<name>/SKILL.md files from project
3
3
  * `.code-shell/skills`, project `.agents/skills`, user `.code-shell/skills`,
4
- * and installed plugins. Mirrors Claude Code's
4
+ * installed plugins, and schema-v2 Panel Apps. Mirrors Claude Code's
5
5
  * `loadSkillsFromSkillsDir` (skills/loadSkillsDir.ts:407) plus plugin
6
6
  * integration (utils/plugins/pluginLoader.ts).
7
7
  */
8
8
  import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
9
- import { join } from "node:path";
9
+ import { isAbsolute, join, relative, sep } from "node:path";
10
10
  import { homedir } from "node:os";
11
11
  import { memoize } from "../utils/memoize.js";
12
12
  import { parseFrontmatter, coerceDescription } from "./frontmatter.js";
13
13
  import { installedPluginsPath, readInstalledPlugins } from "../plugins/installedPlugins.js";
14
+ import { PANEL_APP_MANIFEST_FILE, PanelAppManifest } from "../panel-apps/manifest.js";
15
+ import { panelAppsRegistryPath, panelAppsRoot } from "../panel-apps/paths.js";
16
+ import { isPanelAppBound, resolvePanelAppBindingPolicy, resolvePanelAppBindingProjectPath, } from "../panel-apps/bindings.js";
17
+ import { SettingsManager } from "../settings/manager.js";
14
18
  function userHome() {
15
19
  // Honor process.env.HOME so tests (and shell overrides) can redirect the
16
20
  // user-skills lookup. node:os homedir() reads from getpwuid and ignores
@@ -49,6 +53,19 @@ function readSkillFile(skillFile) {
49
53
  throw e;
50
54
  }
51
55
  }
56
+ function resolveContainedPath(root, candidate) {
57
+ try {
58
+ const realRoot = realpathSync(root);
59
+ const realCandidate = realpathSync(candidate);
60
+ const rel = relative(realRoot, realCandidate);
61
+ if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel))
62
+ return null;
63
+ return realCandidate;
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
52
69
  function buildSkillFromFile(filePath, defaultName, source, raw, namePrefix) {
53
70
  const { frontmatter, body } = parseFrontmatter(raw);
54
71
  const fmName = typeof frontmatter.name === "string" ? frontmatter.name : undefined;
@@ -114,14 +131,17 @@ function scanInstalledPlugins(results) {
114
131
  const skillsDir = join(entry.installPath, "skills");
115
132
  if (!existsSync(skillsDir))
116
133
  continue;
134
+ const resolvedSkillsDir = resolveContainedPath(entry.installPath, skillsDir);
135
+ if (!resolvedSkillsDir)
136
+ continue;
117
137
  let dirEntries;
118
138
  try {
119
- dirEntries = readdirSync(skillsDir, { withFileTypes: true });
139
+ dirEntries = readdirSync(resolvedSkillsDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
120
140
  }
121
141
  catch (e) {
122
142
  if (isInaccessible(e)) {
123
143
  // eslint-disable-next-line no-console
124
- console.warn(`[skills] cannot read ${skillsDir}: ${e.message}`);
144
+ console.warn(`[skills] cannot read ${resolvedSkillsDir}: ${e.message}`);
125
145
  continue;
126
146
  }
127
147
  throw e;
@@ -132,7 +152,26 @@ function scanInstalledPlugins(results) {
132
152
  const namespacedName = `${pluginName}:${dirent.name}`;
133
153
  if (pluginSeen.has(namespacedName))
134
154
  continue;
135
- const skillFile = join(skillsDir, dirent.name, "SKILL.md");
155
+ const skillDir = resolveContainedPath(resolvedSkillsDir, join(resolvedSkillsDir, dirent.name));
156
+ if (!skillDir)
157
+ continue;
158
+ try {
159
+ if (!statSync(skillDir).isDirectory())
160
+ continue;
161
+ }
162
+ catch {
163
+ continue;
164
+ }
165
+ const skillFile = resolveContainedPath(skillDir, join(skillDir, "SKILL.md"));
166
+ if (!skillFile)
167
+ continue;
168
+ try {
169
+ if (!statSync(skillFile).isFile())
170
+ continue;
171
+ }
172
+ catch {
173
+ continue;
174
+ }
136
175
  const raw = readSkillFile(skillFile);
137
176
  if (raw === null)
138
177
  continue;
@@ -142,14 +181,98 @@ function scanInstalledPlugins(results) {
142
181
  }
143
182
  }
144
183
  }
184
+ function scanInstalledPanelApps(results) {
185
+ const root = panelAppsRoot();
186
+ if (!existsSync(root))
187
+ return;
188
+ let installedIds;
189
+ try {
190
+ const registry = JSON.parse(readFileSync(panelAppsRegistryPath(), "utf-8"));
191
+ if (registry.version !== 1 || !Array.isArray(registry.apps))
192
+ return;
193
+ installedIds = new Set(registry.apps
194
+ .map((entry) => entry &&
195
+ typeof entry === "object" &&
196
+ "id" in entry &&
197
+ typeof entry.id === "string" &&
198
+ /^[a-z][a-z0-9-]{0,63}$/.test(entry.id)
199
+ ? entry.id
200
+ : null)
201
+ .filter((id) => id !== null));
202
+ }
203
+ catch {
204
+ return;
205
+ }
206
+ let appDirectories;
207
+ try {
208
+ appDirectories = readdirSync(root, { withFileTypes: true })
209
+ .filter((entry) => entry.isDirectory() && installedIds.has(entry.name))
210
+ .sort((left, right) => left.name.localeCompare(right.name));
211
+ }
212
+ catch (error) {
213
+ if (isInaccessible(error))
214
+ return;
215
+ throw error;
216
+ }
217
+ const seen = new Set(results.map((skill) => skill.name));
218
+ for (const directory of appDirectories) {
219
+ const appRoot = join(root, directory.name);
220
+ let manifest;
221
+ try {
222
+ manifest = PanelAppManifest.parse(JSON.parse(readFileSync(join(appRoot, PANEL_APP_MANIFEST_FILE), "utf-8")));
223
+ }
224
+ catch {
225
+ continue;
226
+ }
227
+ if (manifest.id !== directory.name || manifest.schemaVersion !== 2 || !manifest.agent)
228
+ continue;
229
+ for (const relativeEntry of manifest.agent.skills) {
230
+ const segments = relativeEntry.split("/");
231
+ const defaultName = segments[2];
232
+ if (!defaultName)
233
+ continue;
234
+ const namespacedName = `${manifest.id}:${defaultName}`;
235
+ if (seen.has(namespacedName))
236
+ continue;
237
+ const skillFile = resolveContainedPath(appRoot, join(appRoot, ...relativeEntry.split("/")));
238
+ if (!skillFile)
239
+ continue;
240
+ try {
241
+ if (!statSync(skillFile).isFile())
242
+ continue;
243
+ }
244
+ catch {
245
+ continue;
246
+ }
247
+ const raw = readSkillFile(skillFile);
248
+ if (raw === null)
249
+ continue;
250
+ results.push(buildSkillFromFile(skillFile, defaultName, "panel-app", raw, manifest.id));
251
+ seen.add(namespacedName);
252
+ }
253
+ }
254
+ }
145
255
  function scanOnce(cwd) {
146
256
  const results = [];
147
257
  const seen = new Set();
148
258
  const seenBaseDirs = new Set();
149
259
  scanDirBases(bases(cwd), results, seen, seenBaseDirs);
150
260
  scanInstalledPlugins(results);
261
+ scanInstalledPanelApps(results);
151
262
  return results;
152
263
  }
264
+ function installedPanelAppsMtime() {
265
+ return [panelAppsRoot(), panelAppsRegistryPath()]
266
+ .map((path) => {
267
+ try {
268
+ return statSync(path).mtimeMs.toString();
269
+ }
270
+ catch {
271
+ return "0";
272
+ }
273
+ })
274
+ .join("|");
275
+ }
153
276
  function installedPluginsMtime() {
154
277
  const p = installedPluginsPath();
155
278
  try {
@@ -181,28 +304,56 @@ function skillsDirsMtime(cwd) {
181
304
  })
182
305
  .join("|");
183
306
  }
184
- const memoized = memoize(scanOnce, (cwd) => `${cwd}\0${userHome()}\0${installedPluginsMtime()}\0${skillsDirsMtime(cwd)}`);
307
+ const memoized = memoize(scanOnce, (cwd) => `${cwd}\0${userHome()}\0${installedPluginsMtime()}\0${installedPanelAppsMtime()}\0${skillsDirsMtime(cwd)}`);
308
+ function panelAppBindingPolicy(cwd) {
309
+ try {
310
+ const projectPath = resolvePanelAppBindingProjectPath(cwd);
311
+ const settings = new SettingsManager(projectPath, "full");
312
+ return resolvePanelAppBindingPolicy(settings.getForScope("user"), settings.getForScope("project", projectPath), Boolean(projectPath));
313
+ }
314
+ catch {
315
+ // Binding failures must not leak every installed Panel App Skill into the
316
+ // project prompt. Fail closed with an empty binding set.
317
+ return resolvePanelAppBindingPolicy(undefined, undefined, false);
318
+ }
319
+ }
185
320
  export function scanSkills(cwd, opts) {
186
321
  const all = memoized(cwd);
187
322
  const disabledSkills = opts?.disabledSkills;
188
323
  const disabledPlugins = opts?.disabledPlugins;
189
324
  const skillAllowlist = opts?.skillAllowlist;
325
+ const panelPolicy = opts?.includeDisabledPanelApps ? null : panelAppBindingPolicy(cwd);
190
326
  const hasSkillFilter = disabledSkills && disabledSkills.length > 0;
191
327
  const hasPluginFilter = disabledPlugins && disabledPlugins.length > 0;
192
328
  // An allowlist of [] is meaningful (no skills at all), so check for
193
329
  // presence with !== undefined, not truthiness/length.
194
330
  const hasAllowlist = skillAllowlist !== undefined;
195
- if (!hasSkillFilter && !hasPluginFilter && !hasAllowlist)
196
- return all;
331
+ if (!hasSkillFilter && !hasPluginFilter && !hasAllowlist) {
332
+ if (panelPolicy === null)
333
+ return all;
334
+ const hasUnboundPanelSkill = all.some((skill) => {
335
+ if (skill.source !== "panel-app")
336
+ return false;
337
+ const colon = skill.name.indexOf(":");
338
+ return colon <= 0 || !isPanelAppBound(skill.name.slice(0, colon), panelPolicy);
339
+ });
340
+ if (!hasUnboundPanelSkill)
341
+ return all;
342
+ }
197
343
  const skillSet = hasSkillFilter ? new Set(disabledSkills) : null;
198
344
  const pluginSet = hasPluginFilter ? new Set(disabledPlugins) : null;
199
345
  const allowSet = hasAllowlist ? new Set(skillAllowlist) : null;
200
346
  return all.filter((s) => {
347
+ if (panelPolicy && s.source === "panel-app") {
348
+ const colon = s.name.indexOf(":");
349
+ if (colon <= 0 || !isPanelAppBound(s.name.slice(0, colon), panelPolicy))
350
+ return false;
351
+ }
201
352
  if (allowSet && !allowSet.has(s.name))
202
353
  return false;
203
354
  if (skillSet && skillSet.has(s.name))
204
355
  return false;
205
- if (pluginSet) {
356
+ if (pluginSet && s.source === "plugin") {
206
357
  // Use indexOf, not split — skill names may theoretically contain
207
358
  // more colons after the first; the namespace boundary is the
208
359
  // first ":" only.
@@ -0,0 +1,14 @@
1
+ /** provider 无关的连接器边界(ADR §4)。core 不出现任何具体 provider 名。 */
2
+ import type { SourceContent, SourceDefinition, SourceResourceMeta, SourceScope } from "./types.js";
3
+ export interface ConnectorAdapter {
4
+ kind: string;
5
+ listScopes(definition: SourceDefinition): Promise<SourceScope[]>;
6
+ listResources(definition: SourceDefinition, scopeId: string): Promise<SourceResourceMeta[]>;
7
+ read(definition: SourceDefinition, resourceId: string, options: {
8
+ maxBytes: number;
9
+ signal?: AbortSignal;
10
+ cwd?: string;
11
+ }): Promise<SourceContent>;
12
+ }
13
+ export declare function registerConnectorAdapter(adapter: ConnectorAdapter): void;
14
+ export declare function connectorAdapterFor(kind: string): ConnectorAdapter | undefined;
@@ -0,0 +1,7 @@
1
+ const registry = new Map();
2
+ export function registerConnectorAdapter(adapter) {
3
+ registry.set(adapter.kind, adapter);
4
+ }
5
+ export function connectorAdapterFor(kind) {
6
+ return registry.get(kind);
7
+ }
@@ -0,0 +1,10 @@
1
+ import type { ConnectorAdapter } from "../adapter.js";
2
+ import type { SourceDefinition, SourceResourceMeta } from "../types.js";
3
+ export declare const LOCAL_FILES_SOURCE_ID = "project-uploads";
4
+ export declare function uploadsDir(cwd: string): string;
5
+ /** Validate a write/delete basename and resolve it inside the workspace uploads directory. */
6
+ export declare function resolveUploadTarget(cwd: string, name: string): string;
7
+ export declare function localFilesSourceFor(cwd: string): SourceDefinition;
8
+ export declare const localFilesAdapter: ConnectorAdapter;
9
+ /** cwd 维度的文件列举;隐式源不在 definition 里携带路径。 */
10
+ export declare function listLocalFiles(cwd: string): SourceResourceMeta[];
@@ -0,0 +1,127 @@
1
+ /**
2
+ * 上传文件源(ADR §4.3):每个 workspace 隐式自带,不进全局 catalog。
3
+ * 文件在 ${cwd}/.code-shell/uploads/ 内;读取前规范化 resourceId,
4
+ * 并校验消解 symlink 后的真实路径仍在 uploads 目录内。
5
+ */
6
+ import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
7
+ import { basename, dirname, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
8
+ import { truncateUtf8Bytes } from "../truncate-utf8.js";
9
+ export const LOCAL_FILES_SOURCE_ID = "project-uploads";
10
+ export function uploadsDir(cwd) {
11
+ return join(cwd, ".code-shell", "uploads");
12
+ }
13
+ /** Validate a write/delete basename and resolve it inside the workspace uploads directory. */
14
+ export function resolveUploadTarget(cwd, name) {
15
+ let decoded = name;
16
+ try {
17
+ for (let pass = 0; pass < 3; pass += 1) {
18
+ const next = decodeURIComponent(decoded);
19
+ if (next === decoded)
20
+ break;
21
+ decoded = next;
22
+ }
23
+ }
24
+ catch {
25
+ throw new Error(`invalid upload name: ${name}`);
26
+ }
27
+ if (!name ||
28
+ name !== decoded ||
29
+ name.startsWith(".") ||
30
+ name.includes("/") ||
31
+ name.includes("\\") ||
32
+ name.includes("\0") ||
33
+ basename(name) !== name) {
34
+ throw new Error(`invalid upload name: ${name}`);
35
+ }
36
+ const root = resolve(uploadsDir(cwd));
37
+ const target = resolve(root, name);
38
+ if (dirname(target) !== root)
39
+ throw new Error(`invalid upload name: ${name}`);
40
+ return target;
41
+ }
42
+ export function localFilesSourceFor(cwd) {
43
+ return {
44
+ id: LOCAL_FILES_SOURCE_ID,
45
+ kind: "local-files",
46
+ label: "项目文件",
47
+ description: `本 workspace 上传的文件(${uploadsDir(cwd)})`,
48
+ adapterConfig: {},
49
+ enabled: true,
50
+ };
51
+ }
52
+ function canonicalResourceId(resourceId) {
53
+ let decoded = resourceId;
54
+ try {
55
+ for (let pass = 0; pass < 3; pass += 1) {
56
+ const next = decodeURIComponent(decoded);
57
+ if (next === decoded)
58
+ break;
59
+ decoded = next;
60
+ }
61
+ }
62
+ catch {
63
+ throw new Error(`invalid local-files resource path: ${resourceId}`);
64
+ }
65
+ if (decoded.length === 0 ||
66
+ decoded.includes("\0") ||
67
+ decoded.includes("\\") ||
68
+ isAbsolute(decoded) ||
69
+ /^[a-zA-Z]:[\\/]/.test(decoded)) {
70
+ throw new Error(`invalid local-files resource path: ${resourceId}`);
71
+ }
72
+ const canonical = normalize(decoded);
73
+ if (canonical === "." || canonical === ".." || canonical.startsWith(`..${sep}`)) {
74
+ throw new Error(`resource escapes uploads dir: ${resourceId}`);
75
+ }
76
+ return canonical.split(sep).join("/");
77
+ }
78
+ function resolveInsideUploads(cwd, resourceId) {
79
+ const root = realpathSync(uploadsDir(cwd));
80
+ const canonicalId = canonicalResourceId(resourceId);
81
+ const candidate = resolve(root, ...canonicalId.split("/"));
82
+ const real = realpathSync(candidate);
83
+ if (real !== root && !real.startsWith(`${root}${sep}`)) {
84
+ throw new Error(`resource escapes uploads dir: ${resourceId}`);
85
+ }
86
+ const finalId = relative(root, real).split(sep).join("/");
87
+ if (!finalId || finalId === ".." || finalId.startsWith("../")) {
88
+ throw new Error(`invalid local-files resource path: ${resourceId}`);
89
+ }
90
+ return { path: real, resourceId: finalId };
91
+ }
92
+ export const localFilesAdapter = {
93
+ kind: "local-files",
94
+ async listScopes() {
95
+ return [{ id: "uploads", label: "上传文件" }];
96
+ },
97
+ async listResources() {
98
+ throw new Error("use listLocalFiles(cwd) — local-files listing is cwd-scoped");
99
+ },
100
+ async read(_definition, resourceId, options) {
101
+ if (!options.cwd) {
102
+ throw new Error("local-files read requires cwd");
103
+ }
104
+ const resolved = resolveInsideUploads(options.cwd, resourceId);
105
+ const buffer = readFileSync(resolved.path);
106
+ const truncated = truncateUtf8Bytes(buffer, options.maxBytes);
107
+ return {
108
+ resourceId: resolved.resourceId,
109
+ ...truncated,
110
+ };
111
+ },
112
+ };
113
+ /** cwd 维度的文件列举;隐式源不在 definition 里携带路径。 */
114
+ export function listLocalFiles(cwd) {
115
+ const directory = uploadsDir(cwd);
116
+ if (!existsSync(directory))
117
+ return [];
118
+ return readdirSync(directory, { withFileTypes: true })
119
+ .filter((entry) => entry.isFile())
120
+ .sort((left, right) => left.name.localeCompare(right.name))
121
+ .map((entry) => ({
122
+ id: entry.name,
123
+ scopeId: "uploads",
124
+ name: entry.name,
125
+ sizeBytes: statSync(join(directory, entry.name)).size,
126
+ }));
127
+ }
@@ -0,0 +1,17 @@
1
+ /** MCP resource 包装 adapter:MCP 只是 kind 之一,不塞 mcpServers(ADR §1/§4)。 */
2
+ import type { ConnectorAdapter } from "../adapter.js";
3
+ interface McpResourceInfo {
4
+ uri: string;
5
+ name?: string;
6
+ description?: string;
7
+ serverName: string;
8
+ }
9
+ interface McpLike {
10
+ listResources(server?: string, signal?: AbortSignal): Promise<McpResourceInfo[]>;
11
+ readResource(server: string, uri: string, signal?: AbortSignal): Promise<string>;
12
+ }
13
+ type McpManagerFactory = () => McpLike | Promise<McpLike>;
14
+ export declare function createMcpResourceAdapter(getManager: McpManagerFactory): ConnectorAdapter;
15
+ /** 生产默认:方法首次执行时才加载真 MCPManager,避免静态模块环。 */
16
+ export declare function defaultMcpResourceAdapter(): ConnectorAdapter;
17
+ export {};