@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
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 激活/切换/关闭事务。原子性来源:整个 `profile` 子树一次
3
+ * saveProjectSetting 写入(内部 tmp+rename)——切换即全量替换,
4
+ * 永远不存在“旧的撤一半、新的写一半”。
5
+ * mainInstruction / portableMemory 不落 settings:settings 只记 active
6
+ * 名字(+ preset/overrides 快照),活字段由 resolve.ts 从库读取。
7
+ */
8
+ import type { SettingsManager } from "../settings/manager.js";
9
+ import type { CapabilityOverrides } from "../settings/schema.js";
10
+ import type { WorkspaceProfile } from "./types.js";
11
+ /** settings.profile 子树的形状(与 settings/schema.ts 的 zod 定义一致)。 */
12
+ export interface WorkspaceProfileSubtree {
13
+ active: string;
14
+ preset?: string;
15
+ overrides?: CapabilityOverrides;
16
+ }
17
+ /**
18
+ * 当前机器上可见的能力清单,用于 `exclusiveCapabilities` 决定「要关掉哪些」。
19
+ * 由 host 注入(core 不扫描磁盘)。缺省即无法独占,退回并集语义。
20
+ */
21
+ export interface InstalledCapabilityNames {
22
+ skills?: readonly string[];
23
+ plugins?: readonly string[];
24
+ mcp?: readonly string[];
25
+ agents?: readonly string[];
26
+ }
27
+ /**
28
+ * 把 profile 声明的能力展开为 override 快照;空 bucket 不落键。
29
+ *
30
+ * 默认只产出 `"on"`(并集:保证该有的在,不动用户开的)。profile 声明
31
+ * `exclusiveCapabilities` 且 host 给出 `installed` 时,未声明的同类能力显式
32
+ * 落 `"off"`,形成独占工作面。
33
+ */
34
+ export declare function profileOverridesFromDefinition(profile: WorkspaceProfile, installed?: InstalledCapabilityNames): NonNullable<CapabilityOverrides>;
35
+ export declare function activateWorkspaceProfile(settings: SettingsManager, name: string, cwd: string, installed?: InstalledCapabilityNames): WorkspaceProfile;
36
+ export declare function deactivateWorkspaceProfile(settings: SettingsManager, cwd: string): void;
@@ -0,0 +1,57 @@
1
+ import { readWorkspaceProfile } from "./store.js";
2
+ /**
3
+ * 把 profile 声明的能力展开为 override 快照;空 bucket 不落键。
4
+ *
5
+ * 默认只产出 `"on"`(并集:保证该有的在,不动用户开的)。profile 声明
6
+ * `exclusiveCapabilities` 且 host 给出 `installed` 时,未声明的同类能力显式
7
+ * 落 `"off"`,形成独占工作面。
8
+ */
9
+ // 返回 NonNullable:`CapabilityOverrides` 自身以 `.optional()` 结尾(settings 里
10
+ // 整个 key 可以缺失),但这个函数**总是**构造一个对象字面量,永不返回 undefined。
11
+ // 沿用可空别名会迫使每个调用方(含断言 `overrides.skills` 的测试)先做一次不可能
12
+ // 为真的 null 检查。
13
+ export function profileOverridesFromDefinition(profile, installed) {
14
+ const exclusive = profile.exclusiveCapabilities === true;
15
+ const bucket = (declared, available) => {
16
+ const entries = {};
17
+ for (const name of declared)
18
+ entries[name] = "on";
19
+ if (exclusive && available) {
20
+ const claimed = new Set(declared);
21
+ for (const name of available) {
22
+ if (!claimed.has(name))
23
+ entries[name] = "off";
24
+ }
25
+ }
26
+ return Object.keys(entries).length > 0 ? entries : undefined;
27
+ };
28
+ const plugins = bucket(profile.plugins, installed?.plugins);
29
+ const skills = bucket(profile.skills, installed?.skills);
30
+ const mcp = bucket(profile.mcp, installed?.mcp);
31
+ const agents = bucket(profile.agents, installed?.agents);
32
+ return {
33
+ ...(plugins ? { plugins } : {}),
34
+ ...(skills ? { skills } : {}),
35
+ ...(mcp ? { mcp } : {}),
36
+ ...(agents ? { agents } : {}),
37
+ };
38
+ }
39
+ export function activateWorkspaceProfile(settings, name, cwd, installed) {
40
+ const profile = readWorkspaceProfile(name);
41
+ if (!profile) {
42
+ throw new Error(`Workspace profile "${name}" not found in the global library`);
43
+ }
44
+ const subtree = {
45
+ active: profile.name,
46
+ // A digital human contributes its role, capabilities, and memory. The
47
+ // CodeShell runtime base is a host concern and must not vary with imported
48
+ // definitions that happen to carry a legacy basePreset value.
49
+ preset: "general",
50
+ overrides: profileOverridesFromDefinition(profile, installed),
51
+ };
52
+ settings.saveProjectSetting("profile", subtree, cwd);
53
+ return profile;
54
+ }
55
+ export function deactivateWorkspaceProfile(settings, cwd) {
56
+ settings.deleteProjectSetting("profile", cwd);
57
+ }
@@ -0,0 +1,77 @@
1
+ import { type CatalogEntry, type CatalogTeam } from "./catalog.js";
2
+ export interface RegisteredHumanRepo {
3
+ /** `owner/repo` */
4
+ repo: string;
5
+ addedAt: number;
6
+ }
7
+ export interface HumanRepoListEntry extends RegisteredHumanRepo {
8
+ /** 该仓库当前提供的数字人数量。 */
9
+ count: number;
10
+ /** 读取过程中的问题(坏定义、缺 manifest)。 */
11
+ errors: string[];
12
+ cloned: boolean;
13
+ }
14
+ export declare function humanReposRoot(): string;
15
+ export declare function humanRepoDir(repo: string): string;
16
+ export declare function listHumanRepos(): RegisteredHumanRepo[];
17
+ /**
18
+ * 注册并克隆一个数字人仓库。已存在则拉取更新。
19
+ *
20
+ * 克隆是网络+磁盘写入操作,调用方应已取得用户确认。
21
+ */
22
+ export declare function addHumanRepo(repo: string): Promise<{
23
+ ok: true;
24
+ entry: HumanRepoListEntry;
25
+ } | {
26
+ ok: false;
27
+ error: string;
28
+ }>;
29
+ /**
30
+ * Swap a validated staging tree into place.
31
+ *
32
+ * Ordering matters for crash safety: promote FIRST (rename staging over a
33
+ * now-absent `dir`), and only retire the old tree around it. The previous
34
+ * `dir → retired` then `staging → dir` sequence left no tree at `dir` at all if
35
+ * the process died in between, and nothing scanned for `.retired-*` on startup,
36
+ * so the UI showed "尚未克隆" with the data still on disk under a name nobody
37
+ * looked for. Here the only window is one where BOTH the old tree (at `retired`)
38
+ * and the new tree (at `staging`) still exist, and `reclaimOrphanedTrees`
39
+ * cleans up whatever is left over on the next call.
40
+ */
41
+ declare function promoteStagedRepo(staging: string, dir: string): void;
42
+ /**
43
+ * Recover from a crash during a previous swap.
44
+ *
45
+ * If `dir` is missing but a `.retired-*` sibling exists, a process died between
46
+ * retiring the old tree and promoting the new one. Restore the newest retired
47
+ * tree rather than leaving the repo looking un-cloned, then drop the rest.
48
+ * Runs under the repo lock, so no concurrent swap can be mid-flight.
49
+ */
50
+ declare function reclaimOrphanedTrees(dir: string): void;
51
+ /**
52
+ * Crash-safety internals, exposed for tests only.
53
+ *
54
+ * `promoteStagedRepo`/`reclaimOrphanedTrees` implement the swap-and-recover
55
+ * protocol. Exercising them through `addHumanRepo` would require network git, so
56
+ * the recovery cases (interrupted swap, stale retired trees) are tested here
57
+ * directly. Not part of the package's public surface.
58
+ */
59
+ export declare const __testables: {
60
+ promoteStagedRepo: typeof promoteStagedRepo;
61
+ reclaimOrphanedTrees: typeof reclaimOrphanedTrees;
62
+ };
63
+ export declare function removeHumanRepo(repo: string): void;
64
+ /** 注册表 + 每个仓库的读取结果,供设置页展示。 */
65
+ export declare function listHumanRepoDetails(): HumanRepoListEntry[];
66
+ /**
67
+ * 所有已注册仓库提供的数字人。
68
+ *
69
+ * 同名定义按注册顺序先到先得,并记一条冲突说明——静默覆盖会让用户以为装的是
70
+ * 另一个仓库的版本。
71
+ */
72
+ export declare function readAllHumanRepoEntries(): {
73
+ entries: CatalogEntry[];
74
+ teams: CatalogTeam[];
75
+ errors: string[];
76
+ };
77
+ export {};
@@ -0,0 +1,346 @@
1
+ /**
2
+ * 已注册的数字人仓库:注册表 + 克隆缓存 + 读取。
3
+ *
4
+ * 与插件市场并列的一等分发通道。数字人不必先成为插件——它有自己的定义格式和
5
+ * 导入/导出原语,仓库只是把「一批定义」打包分发。
6
+ *
7
+ * 磁盘布局:
8
+ * ~/.code-shell/human-repos.json —— 注册表(owner/repo 列表)
9
+ * ~/.code-shell/human-repos/<key>/ —— 各仓库的浅克隆
10
+ */
11
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
12
+ import { randomUUID } from "node:crypto";
13
+ import { basename, dirname, join } from "node:path";
14
+ import { codeShellHome } from "../session/session-manager.js";
15
+ import { acquireLockOnPath, mutateJsonFile } from "../utils/file-mutex.js";
16
+ // gitFetchAndReset is deliberately NOT used any more: updating in place is what
17
+ // destroyed the last-known-good tree on a bad upstream commit. Updates clone to
18
+ // a staging dir and swap (see addHumanRepo).
19
+ import { gitClone, githubRepoToCloneUrl } from "../plugins/gitOps.js";
20
+ import { CATALOG_REPO_RE, readCatalogFromDir, sourceToRepoKey, } from "./catalog.js";
21
+ const MAX_REPOS = 32;
22
+ export function humanReposRoot() {
23
+ return join(codeShellHome(), "human-repos");
24
+ }
25
+ function registryPath() {
26
+ return join(codeShellHome(), "human-repos.json");
27
+ }
28
+ export function humanRepoDir(repo) {
29
+ return join(humanReposRoot(), sourceToRepoKey(repo));
30
+ }
31
+ export function listHumanRepos() {
32
+ try {
33
+ // Missing or corrupt registry reads as "no repos" — never fatal.
34
+ return parseRegistry(readFileSync(registryPath(), "utf-8"));
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ }
40
+ function parseRegistry(raw) {
41
+ if (raw === undefined)
42
+ return [];
43
+ try {
44
+ const parsed = JSON.parse(raw);
45
+ if (!Array.isArray(parsed.repos))
46
+ return [];
47
+ return parsed.repos
48
+ .filter((r) => !!r &&
49
+ typeof r === "object" &&
50
+ typeof r.repo === "string" &&
51
+ CATALOG_REPO_RE.test(r.repo))
52
+ .map((r) => ({ repo: r.repo, addedAt: Number(r.addedAt) || 0 }));
53
+ }
54
+ catch {
55
+ return [];
56
+ }
57
+ }
58
+ /**
59
+ * Serialize add/update/remove of ONE repo across processes.
60
+ *
61
+ * Distinct from the registry lock inside `updateRegistry`: that one only guards
62
+ * the JSON file, and is held for a moment. This one spans the whole mutation —
63
+ * capacity check, directory swap, registry write — so two processes cannot both
64
+ * decide the repo is absent and clone into the same path, and cannot both slip
65
+ * past MAX_REPOS. Keyed per repo, so unrelated repos still install in parallel.
66
+ *
67
+ * The lock file lives next to the clones and is never the clone dir itself
68
+ * (proper-lockfile creates `<path>.lock`, which must not collide with a tree we
69
+ * rename over).
70
+ */
71
+ function withHumanRepoLock(repo, run) {
72
+ const root = humanReposRoot();
73
+ mkdirSync(root, { recursive: true });
74
+ const lockTarget = join(root, `.${sourceToRepoKey(repo)}.repo-lock`);
75
+ if (!existsSync(lockTarget))
76
+ writeFileSync(lockTarget, "", { mode: 0o600 });
77
+ // Lock the marker FILE, not humanReposRoot(): a directory lock would serialize
78
+ // unrelated repos and deadlock against the registry lock taken below.
79
+ // 30s covers a swap that waits behind another process's publish step.
80
+ const release = acquireLockOnPath(lockTarget, 30_000);
81
+ try {
82
+ return run();
83
+ }
84
+ finally {
85
+ release();
86
+ }
87
+ }
88
+ /**
89
+ * Read-modify-write the registry under a cross-process lock.
90
+ *
91
+ * add/remove used to be `listHumanRepos()` in the caller followed by a bare
92
+ * `writeFileSync` of the whole array. Two windows (or a window plus an agent)
93
+ * mutating different repos would each write back their own stale snapshot, so
94
+ * one of the entries silently disappeared. The single-window UI operation lock
95
+ * did not help, because it does not span processes.
96
+ */
97
+ function updateRegistry(change) {
98
+ mkdirSync(codeShellHome(), { recursive: true });
99
+ mutateJsonFile(registryPath(), {
100
+ parse: parseRegistry,
101
+ serialize: (repos) => `${JSON.stringify({ repos }, null, 2)}\n`,
102
+ mutation: (current) => ({ value: change(current) }),
103
+ mode: 0o600,
104
+ });
105
+ }
106
+ /**
107
+ * 注册并克隆一个数字人仓库。已存在则拉取更新。
108
+ *
109
+ * 克隆是网络+磁盘写入操作,调用方应已取得用户确认。
110
+ */
111
+ export async function addHumanRepo(repo) {
112
+ if (!CATALOG_REPO_RE.test(repo)) {
113
+ return { ok: false, error: `"${repo}" 不是合法的仓库地址(应为 owner/repo)` };
114
+ }
115
+ const dir = humanRepoDir(repo);
116
+ mkdirSync(humanReposRoot(), { recursive: true });
117
+ // Clone into a private staging dir FIRST, outside the lock — this is the slow
118
+ // network step and must not hold the lock for the duration. Both the add and
119
+ // the update path stage: cloning straight into `dir` let two processes race
120
+ // into the same path, and the loser's `rmSync(dir)` then deleted the winner's
121
+ // perfectly good clone.
122
+ const staging = `${dir}.staging-${process.pid}-${randomUUID()}`;
123
+ try {
124
+ const cloned = await gitClone(githubRepoToCloneUrl(repo), staging, { full: true });
125
+ if (!cloned.ok) {
126
+ // Only ever removes OUR staging dir (finally below); `dir` is untouched.
127
+ return { ok: false, error: explainGitFailure(cloned.error, repo) };
128
+ }
129
+ const staged = readCatalogFromDir(staging, repo);
130
+ if (staged.entries.length === 0 && staged.errors.length > 0) {
131
+ // A repo that yields nothing usable is a mistake worth surfacing now
132
+ // rather than leaving an empty row in the list. On update this also keeps
133
+ // the last known good tree in place.
134
+ const hadPrevious = existsSync(dir);
135
+ return {
136
+ ok: false,
137
+ error: hadPrevious
138
+ ? `更新 ${repo} 失败,已保留上一个可用版本:${staged.errors[0]}`
139
+ : staged.errors[0],
140
+ };
141
+ }
142
+ // Publish under the repo lock: capacity check, directory swap and registry
143
+ // write must be one critical section. Checking MAX_REPOS before the lock
144
+ // let N processes each observe 31 repos and all proceed past the cap.
145
+ const published = withHumanRepoLock(repo, () => {
146
+ const current = listHumanRepos();
147
+ const alreadyRegistered = current.some((r) => r.repo === repo);
148
+ if (current.length >= MAX_REPOS && !alreadyRegistered) {
149
+ return { ok: false, error: `最多只能添加 ${MAX_REPOS} 个数字人仓库` };
150
+ }
151
+ promoteStagedRepo(staging, dir);
152
+ updateRegistry((repos) => [
153
+ ...repos.filter((r) => r.repo !== repo),
154
+ { repo, addedAt: Date.now() },
155
+ ]);
156
+ return { ok: true };
157
+ });
158
+ if (!published.ok)
159
+ return published;
160
+ return {
161
+ ok: true,
162
+ entry: {
163
+ repo,
164
+ addedAt: Date.now(),
165
+ count: staged.entries.length,
166
+ errors: staged.errors,
167
+ cloned: true,
168
+ },
169
+ };
170
+ }
171
+ finally {
172
+ rmSync(staging, { recursive: true, force: true });
173
+ }
174
+ }
175
+ /**
176
+ * Swap a validated staging tree into place.
177
+ *
178
+ * Ordering matters for crash safety: promote FIRST (rename staging over a
179
+ * now-absent `dir`), and only retire the old tree around it. The previous
180
+ * `dir → retired` then `staging → dir` sequence left no tree at `dir` at all if
181
+ * the process died in between, and nothing scanned for `.retired-*` on startup,
182
+ * so the UI showed "尚未克隆" with the data still on disk under a name nobody
183
+ * looked for. Here the only window is one where BOTH the old tree (at `retired`)
184
+ * and the new tree (at `staging`) still exist, and `reclaimOrphanedTrees`
185
+ * cleans up whatever is left over on the next call.
186
+ */
187
+ function promoteStagedRepo(staging, dir) {
188
+ reclaimOrphanedTrees(dir);
189
+ if (!existsSync(dir)) {
190
+ renameSync(staging, dir);
191
+ return;
192
+ }
193
+ const retired = `${dir}.retired-${process.pid}-${randomUUID()}`;
194
+ renameSync(dir, retired);
195
+ try {
196
+ renameSync(staging, dir);
197
+ }
198
+ catch (err) {
199
+ // Promotion failed — put the good tree back before surfacing the error.
200
+ try {
201
+ renameSync(retired, dir);
202
+ }
203
+ catch {
204
+ // Best effort; the retired copy is still on disk for manual recovery.
205
+ }
206
+ throw err;
207
+ }
208
+ rmSync(retired, { recursive: true, force: true });
209
+ }
210
+ /**
211
+ * Recover from a crash during a previous swap.
212
+ *
213
+ * If `dir` is missing but a `.retired-*` sibling exists, a process died between
214
+ * retiring the old tree and promoting the new one. Restore the newest retired
215
+ * tree rather than leaving the repo looking un-cloned, then drop the rest.
216
+ * Runs under the repo lock, so no concurrent swap can be mid-flight.
217
+ */
218
+ function reclaimOrphanedTrees(dir) {
219
+ const parent = dirname(dir);
220
+ const prefix = `${basename(dir)}.retired-`;
221
+ let orphans;
222
+ try {
223
+ orphans = readdirSync(parent).filter((name) => name.startsWith(prefix));
224
+ }
225
+ catch {
226
+ return;
227
+ }
228
+ if (orphans.length === 0)
229
+ return;
230
+ orphans.sort();
231
+ if (!existsSync(dir)) {
232
+ const restore = orphans.pop();
233
+ try {
234
+ renameSync(join(parent, restore), dir);
235
+ }
236
+ catch {
237
+ // Fall through: leave it for manual recovery rather than deleting data.
238
+ }
239
+ }
240
+ for (const stale of orphans) {
241
+ rmSync(join(parent, stale), { recursive: true, force: true });
242
+ }
243
+ }
244
+ /**
245
+ * Crash-safety internals, exposed for tests only.
246
+ *
247
+ * `promoteStagedRepo`/`reclaimOrphanedTrees` implement the swap-and-recover
248
+ * protocol. Exercising them through `addHumanRepo` would require network git, so
249
+ * the recovery cases (interrupted swap, stale retired trees) are tested here
250
+ * directly. Not part of the package's public surface.
251
+ */
252
+ export const __testables = { promoteStagedRepo, reclaimOrphanedTrees };
253
+ /**
254
+ * Turn a raw git failure into something a user can act on.
255
+ *
256
+ * gitOps deliberately returns the full command line (`git clone --depth 1
257
+ * --filter=blob:none … exited 128: …`) because it serves low-level callers.
258
+ * Pasting that into an "add a repo" box tells the user nothing about the actual
259
+ * problem — usually just a typo in the name.
260
+ */
261
+ function explainGitFailure(error, repo) {
262
+ if (/repository not found|could not read from remote|remote: not found/i.test(error)) {
263
+ return `找不到仓库 ${repo}。请检查拼写,并确认它是公开仓库。`;
264
+ }
265
+ if (/authentication failed|permission denied|terminal prompts disabled/i.test(error)) {
266
+ return `无权访问 ${repo}。私有仓库需要先配置 git 凭据。`;
267
+ }
268
+ if (/could not resolve host|network is unreachable|timed out|operation timed out/i.test(error)) {
269
+ return `无法连接 GitHub,请检查网络后重试。`;
270
+ }
271
+ if (error.startsWith("GIT_NOT_FOUND")) {
272
+ // Already a written, actionable message from gitOps.
273
+ return error;
274
+ }
275
+ // Unrecognized: keep the tail (the actual stderr) and drop the command line,
276
+ // so the user sees the cause rather than our argv.
277
+ const tail = error.includes(": ") ? error.slice(error.lastIndexOf(": ") + 2) : error;
278
+ return `克隆 ${repo} 失败:${tail.trim() || "未知错误"}`;
279
+ }
280
+ export function removeHumanRepo(repo) {
281
+ if (!CATALOG_REPO_RE.test(repo))
282
+ throw new Error("invalid digital-human repo");
283
+ // Same repo lock as add/update: otherwise a remove can delete the tree a
284
+ // concurrent add just published, leaving a registered repo with no clone.
285
+ withHumanRepoLock(repo, () => {
286
+ // Filter inside the registry lock so a concurrent add of a DIFFERENT repo
287
+ // is not lost.
288
+ updateRegistry((repos) => repos.filter((r) => r.repo !== repo));
289
+ const dir = humanRepoDir(repo);
290
+ rmSync(dir, { recursive: true, force: true });
291
+ // Drop any tree a crashed swap left behind, so a later re-add does not
292
+ // resurrect the old contents via reclaimOrphanedTrees.
293
+ reclaimOrphanedTrees(dir);
294
+ rmSync(dir, { recursive: true, force: true });
295
+ });
296
+ }
297
+ /** 注册表 + 每个仓库的读取结果,供设置页展示。 */
298
+ export function listHumanRepoDetails() {
299
+ return listHumanRepos().map((registered) => {
300
+ const dir = humanRepoDir(registered.repo);
301
+ if (!existsSync(dir)) {
302
+ return { ...registered, count: 0, errors: ["尚未克隆"], cloned: false };
303
+ }
304
+ const read = readCatalogFromDir(dir, registered.repo);
305
+ return { ...registered, count: read.entries.length, errors: read.errors, cloned: true };
306
+ });
307
+ }
308
+ /**
309
+ * 所有已注册仓库提供的数字人。
310
+ *
311
+ * 同名定义按注册顺序先到先得,并记一条冲突说明——静默覆盖会让用户以为装的是
312
+ * 另一个仓库的版本。
313
+ */
314
+ export function readAllHumanRepoEntries() {
315
+ const entries = [];
316
+ const teams = [];
317
+ const errors = [];
318
+ const seen = new Map();
319
+ const seenTeams = new Map();
320
+ for (const { repo } of listHumanRepos()) {
321
+ const dir = humanRepoDir(repo);
322
+ if (!existsSync(dir))
323
+ continue;
324
+ const read = readCatalogFromDir(dir, repo);
325
+ errors.push(...read.errors);
326
+ for (const entry of read.entries) {
327
+ const owner = seen.get(entry.profile.name);
328
+ if (owner) {
329
+ errors.push(`"${entry.profile.name}" 同时存在于 ${owner} 与 ${repo},已采用前者`);
330
+ continue;
331
+ }
332
+ seen.set(entry.profile.name, repo);
333
+ entries.push(entry);
334
+ }
335
+ for (const team of read.teams) {
336
+ const owner = seenTeams.get(team.id);
337
+ if (owner) {
338
+ errors.push(`团队 "${team.id}" 同时存在于 ${owner} 与 ${repo},已采用前者`);
339
+ continue;
340
+ }
341
+ seenTeams.set(team.id, repo);
342
+ teams.push(team);
343
+ }
344
+ }
345
+ return { entries, teams, errors };
346
+ }
@@ -0,0 +1,54 @@
1
+ import { type WorkspaceProfile } from "./types.js";
2
+ /** `owner/repo`,与 SKILL_REPO_RE 同源,供仓库地址复用。 */
3
+ export declare const CATALOG_REPO_RE: RegExp;
4
+ export interface HumansManifestEntry {
5
+ name: string;
6
+ label?: string;
7
+ description?: string;
8
+ category?: string;
9
+ tags?: string[];
10
+ }
11
+ export interface HumansManifest {
12
+ name?: string;
13
+ description?: string;
14
+ humans: HumansManifestEntry[];
15
+ teams: HumansManifestTeam[];
16
+ }
17
+ /**
18
+ * A team shipped by a repo. Same shape as a locally-authored team minus `mode`
19
+ * (the dead enum): `lead` picks the coordinator, `playbook` is the collaboration
20
+ * rules injected into its opening briefing.
21
+ */
22
+ export interface HumansManifestTeam {
23
+ id: string;
24
+ name: string;
25
+ description?: string;
26
+ members: string[];
27
+ lead?: string;
28
+ playbook?: string;
29
+ }
30
+ export interface CatalogTeam extends HumansManifestTeam {
31
+ sourceRepo: string;
32
+ }
33
+ export interface CatalogEntry {
34
+ profile: WorkspaceProfile;
35
+ /** 来源仓库 `owner/repo`,用于展示与去重。 */
36
+ sourceRepo: string;
37
+ category?: string;
38
+ tags: string[];
39
+ }
40
+ export interface CatalogReadResult {
41
+ entries: CatalogEntry[];
42
+ teams: CatalogTeam[];
43
+ /** 逐条目的失败原因;一个坏定义不该让整个仓库不可用。 */
44
+ errors: string[];
45
+ }
46
+ /**
47
+ * `owner/repo` → 一个安全的目录段。小写化保证同一仓库不同大小写写法命中同一份
48
+ * 缓存;斜杠换成 `-` 后仍需通过 SAFE_SEGMENT_RE,杜绝路径逃逸。
49
+ */
50
+ export declare function sourceToRepoKey(repo: string): string;
51
+ /** 解析 humans.json。缺 humans 数组按空目录处理;JSON 坏了才抛。 */
52
+ export declare function parseHumansManifest(raw: string): HumansManifest;
53
+ /** 读取一个已克隆的数字人仓库目录。 */
54
+ export declare function readCatalogFromDir(dir: string, sourceRepo: string): CatalogReadResult;