@cjhyy/code-shell-core 0.7.1 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -0,0 +1,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;
@@ -0,0 +1,152 @@
1
+ /**
2
+ * 数字人仓库(catalog):从 git 仓库读取一批数字人定义。
3
+ *
4
+ * 与插件市场并列而非寄生:数字人有自己的一等分发原语(导入/导出 + 本仓库),
5
+ * 不需要先成为插件。仓库布局与 cjhyy/mimi-humans 一致:
6
+ *
7
+ * humans.json —— 目录清单(name/label/description/category/tags)
8
+ * humans/<name>/profile.json —— WorkspaceProfile 定义(含可选 requires)
9
+ *
10
+ * 本模块只做**读取与校验**,克隆/更新由 host 驱动(涉及网络与磁盘写入)。
11
+ */
12
+ import { existsSync, readFileSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ import { WorkspaceProfileSchema } from "./types.js";
15
+ /** `owner/repo`,与 SKILL_REPO_RE 同源,供仓库地址复用。 */
16
+ export const CATALOG_REPO_RE = /^[A-Za-z0-9][A-Za-z0-9-]{0,38}\/[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/;
17
+ /** 单个目录段的安全名,挡住 `..`、分隔符与 NUL。 */
18
+ const SAFE_SEGMENT_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
19
+ /**
20
+ * `owner/repo` → 一个安全的目录段。小写化保证同一仓库不同大小写写法命中同一份
21
+ * 缓存;斜杠换成 `-` 后仍需通过 SAFE_SEGMENT_RE,杜绝路径逃逸。
22
+ */
23
+ export function sourceToRepoKey(repo) {
24
+ if (!CATALOG_REPO_RE.test(repo)) {
25
+ throw new Error(`invalid digital-human repo "${repo}" (expected owner/repo)`);
26
+ }
27
+ const key = repo
28
+ .toLowerCase()
29
+ .replace(/\.git$/, "")
30
+ .replace("/", "-");
31
+ if (!SAFE_SEGMENT_RE.test(key)) {
32
+ throw new Error(`digital-human repo "${repo}" does not map to a safe directory name`);
33
+ }
34
+ return key;
35
+ }
36
+ /** 解析 humans.json。缺 humans 数组按空目录处理;JSON 坏了才抛。 */
37
+ export function parseHumansManifest(raw) {
38
+ const value = JSON.parse(raw);
39
+ const rawHumans = Array.isArray(value.humans) ? value.humans : [];
40
+ const humans = [];
41
+ for (const item of rawHumans) {
42
+ if (!item || typeof item !== "object" || Array.isArray(item))
43
+ continue;
44
+ const entry = item;
45
+ if (typeof entry.name !== "string" || !entry.name)
46
+ continue;
47
+ humans.push({
48
+ name: entry.name,
49
+ ...(typeof entry.label === "string" ? { label: entry.label } : {}),
50
+ ...(typeof entry.description === "string" ? { description: entry.description } : {}),
51
+ ...(typeof entry.category === "string" ? { category: entry.category } : {}),
52
+ tags: Array.isArray(entry.tags)
53
+ ? entry.tags.filter((t) => typeof t === "string")
54
+ : [],
55
+ });
56
+ }
57
+ const rawTeams = Array.isArray(value.teams) ? value.teams : [];
58
+ const teams = [];
59
+ for (const item of rawTeams) {
60
+ if (!item || typeof item !== "object" || Array.isArray(item))
61
+ continue;
62
+ const entry = item;
63
+ if (typeof entry.id !== "string" || !entry.id)
64
+ continue;
65
+ if (typeof entry.name !== "string" || !entry.name)
66
+ continue;
67
+ const rawMembers = Array.isArray(entry.members) ? entry.members : [];
68
+ const members = rawMembers.filter((m) => typeof m === "string" && m.length > 0);
69
+ if (members.length < 2)
70
+ continue;
71
+ teams.push({
72
+ id: entry.id,
73
+ name: entry.name,
74
+ ...(typeof entry.description === "string" ? { description: entry.description } : {}),
75
+ members,
76
+ ...(typeof entry.lead === "string" && entry.lead ? { lead: entry.lead } : {}),
77
+ ...(typeof entry.playbook === "string" && entry.playbook ? { playbook: entry.playbook } : {}),
78
+ });
79
+ }
80
+ return {
81
+ ...(typeof value.name === "string" ? { name: value.name } : {}),
82
+ ...(typeof value.description === "string" ? { description: value.description } : {}),
83
+ humans,
84
+ teams,
85
+ };
86
+ }
87
+ /** 读取一个已克隆的数字人仓库目录。 */
88
+ export function readCatalogFromDir(dir, sourceRepo) {
89
+ const manifestPath = join(dir, "humans.json");
90
+ if (!existsSync(manifestPath)) {
91
+ return { entries: [], teams: [], errors: [`${sourceRepo}: humans.json not found`] };
92
+ }
93
+ let manifest;
94
+ try {
95
+ manifest = parseHumansManifest(readFileSync(manifestPath, "utf-8"));
96
+ }
97
+ catch (error) {
98
+ return {
99
+ entries: [],
100
+ teams: [],
101
+ errors: [`${sourceRepo}: humans.json is not valid JSON (${describe(error)})`],
102
+ };
103
+ }
104
+ const entries = [];
105
+ const errors = [];
106
+ for (const item of manifest.humans) {
107
+ // The manifest is untrusted input from a cloned repo — never join a name
108
+ // that could climb out of the humans/ directory.
109
+ if (!SAFE_SEGMENT_RE.test(item.name)) {
110
+ errors.push(`${sourceRepo}: entry "${item.name}" has an unsafe name`);
111
+ continue;
112
+ }
113
+ const profilePath = join(dir, "humans", item.name, "profile.json");
114
+ try {
115
+ const profile = WorkspaceProfileSchema.parse(JSON.parse(readFileSync(profilePath, "utf-8")));
116
+ entries.push({
117
+ profile,
118
+ sourceRepo,
119
+ ...(item.category ? { category: item.category } : {}),
120
+ tags: item.tags ?? [],
121
+ });
122
+ }
123
+ catch (error) {
124
+ errors.push(`${sourceRepo}: "${item.name}" is invalid (${describe(error)})`);
125
+ }
126
+ }
127
+ // A team is only usable if every member ships in this same repo — otherwise
128
+ // summoning it would create Sessions bound to digital humans that do not exist.
129
+ const shipped = new Set(entries.map((entry) => entry.profile.name));
130
+ const teams = [];
131
+ for (const team of manifest.teams) {
132
+ if (!SAFE_SEGMENT_RE.test(team.id)) {
133
+ errors.push(`${sourceRepo}: team "${team.id}" has an unsafe id`);
134
+ continue;
135
+ }
136
+ const missing = team.members.filter((member) => !shipped.has(member));
137
+ if (missing.length > 0) {
138
+ errors.push(`${sourceRepo}: team "${team.id}" references missing ${missing.join(", ")}`);
139
+ continue;
140
+ }
141
+ if (team.lead && !team.members.includes(team.lead)) {
142
+ errors.push(`${sourceRepo}: team "${team.id}" lead is not one of its members`);
143
+ continue;
144
+ }
145
+ teams.push({ ...team, sourceRepo });
146
+ }
147
+ return { entries, teams, errors };
148
+ }
149
+ function describe(error) {
150
+ const message = error instanceof Error ? error.message : String(error);
151
+ return message.length > 200 ? `${message.slice(0, 200)}…` : message;
152
+ }
@@ -0,0 +1,7 @@
1
+ export { SKILL_REPO_RE, WORKSPACE_PROFILE_NAME_RE, WorkspaceProfileRequirementsSchema, WorkspaceProfileSchema, type SkillRequirement, type ToolRequirement, type WorkspaceProfile, type WorkspaceProfileInput, type WorkspaceProfileRequirements, } from "./types.js";
2
+ export { CATALOG_REPO_RE, parseHumansManifest, readCatalogFromDir, sourceToRepoKey, type CatalogEntry as DigitalHumanCatalogSourceEntry, type CatalogTeam as DigitalHumanCatalogTeam, type HumansManifestTeam, type CatalogReadResult, type HumansManifest, type HumansManifestEntry, } from "./catalog.js";
3
+ export { addHumanRepo, humanRepoDir, humanReposRoot, listHumanRepoDetails, listHumanRepos, readAllHumanRepoEntries, removeHumanRepo, type HumanRepoListEntry, type RegisteredHumanRepo, } from "./catalog-store.js";
4
+ export { buildSkillInstallArgs, planProfileRequirements, summarizeSkillConflicts, type KnownSkill, type MissingTool, type PlannedSkillInstall, type ProfileRequirementPlan, type SkillConflict, } from "./requirements.js";
5
+ export { deleteWorkspaceProfile, listWorkspaceProfiles, readWorkspaceProfile, saveWorkspaceProfile, workspaceProfileDir, workspaceProfilesRoot, } from "./store.js";
6
+ export { activateWorkspaceProfile, deactivateWorkspaceProfile, profileOverridesFromDefinition, type InstalledCapabilityNames, type WorkspaceProfileSubtree, } from "./activation.js";
7
+ export { resolveActiveWorkspaceProfile, workspaceProfilePresetFor, type ResolveActiveWorkspaceProfileInput, } from "./resolve.js";
@@ -0,0 +1,7 @@
1
+ export { SKILL_REPO_RE, WORKSPACE_PROFILE_NAME_RE, WorkspaceProfileRequirementsSchema, WorkspaceProfileSchema, } from "./types.js";
2
+ export { CATALOG_REPO_RE, parseHumansManifest, readCatalogFromDir, sourceToRepoKey, } from "./catalog.js";
3
+ export { addHumanRepo, humanRepoDir, humanReposRoot, listHumanRepoDetails, listHumanRepos, readAllHumanRepoEntries, removeHumanRepo, } from "./catalog-store.js";
4
+ export { buildSkillInstallArgs, planProfileRequirements, summarizeSkillConflicts, } from "./requirements.js";
5
+ export { deleteWorkspaceProfile, listWorkspaceProfiles, readWorkspaceProfile, saveWorkspaceProfile, workspaceProfileDir, workspaceProfilesRoot, } from "./store.js";
6
+ export { activateWorkspaceProfile, deactivateWorkspaceProfile, profileOverridesFromDefinition, } from "./activation.js";
7
+ export { resolveActiveWorkspaceProfile, workspaceProfilePresetFor, } from "./resolve.js";
@@ -0,0 +1,76 @@
1
+ /**
2
+ * 数字人依赖:把 profile.requires 解析成「将要发生什么」的计划,供 UI 先展示、
3
+ * 用户确认后再执行。
4
+ *
5
+ * 为什么需要这一层:plugins/skills/mcp/agents 四个字段只是 force-enable 开关,
6
+ * 只能打开磁盘上已存在的能力。没有获取步骤,一个声明了 skill 的数字人在新机器上
7
+ * 会静默变成空壳(能力名写着,实际什么都没启用)。
8
+ *
9
+ * 安全边界:安装会克隆远程仓库并执行 `npx skills add`,属于运行远程代码。本模块
10
+ * 只负责**计划与校验**,从不自行执行;执行由 host 在拿到用户确认后驱动
11
+ * ({@link buildSkillInstallArgs} 给出确切 argv)。
12
+ */
13
+ import type { SkillRequirement, WorkspaceProfileRequirements } from "./types.js";
14
+ /** scanner 已发现的一条 skill(`plugin:skill` 形式代表插件来源)。 */
15
+ export interface KnownSkill {
16
+ name: string;
17
+ source: "project" | "user" | "plugin" | "panel-app";
18
+ }
19
+ export interface SkillConflict {
20
+ name: string;
21
+ /** 已占用该名字的来源。安装到 project 根后它会被遮蔽。 */
22
+ existingSource: KnownSkill["source"];
23
+ }
24
+ export interface PlannedSkillInstall {
25
+ requirement: SkillRequirement;
26
+ /** 具名子集里确实缺失的那些;整仓安装(--all)时为 undefined。 */
27
+ missing?: string[];
28
+ }
29
+ export type MissingToolReason = "not-found" | "too-old";
30
+ export interface MissingTool {
31
+ bin: string;
32
+ reason: MissingToolReason;
33
+ /** reason=too-old 时实际探到的版本。 */
34
+ found?: string;
35
+ /** reason=too-old 时 profile 要求的版本。 */
36
+ required?: string;
37
+ hint?: string;
38
+ }
39
+ export interface ProfileRequirementPlan {
40
+ skillInstalls: PlannedSkillInstall[];
41
+ missingTools: MissingTool[];
42
+ conflicts: SkillConflict[];
43
+ /** 是否有需要用户确认后执行的安装动作。 */
44
+ needsInstall: boolean;
45
+ }
46
+ export interface PlanRequirementsContext {
47
+ /** 当前 scanner 能看到的全部 skill。 */
48
+ installedSkills: readonly KnownSkill[];
49
+ /** 探测一个外部命令的版本输出;不存在返回 null。 */
50
+ toolProbe: (bin: string) => string | null;
51
+ }
52
+ /**
53
+ * 组装 `npx skills add` 的 argv。
54
+ *
55
+ * 两条硬约束:
56
+ * 1. **绝不加 `-g`** —— 全局安装落在 `~/.claude/skills`,而 scanner 只读
57
+ * `<cwd>/.code-shell/skills`、`<cwd>/.agents/skills`、`~/.code-shell/skills`
58
+ * 三个根。装了却扫不到,就是又一个"配了等于没配"。
59
+ * 2. repo 与 skill 名各自占独立 argv 槽,不拼 shell 字符串;配合 schema 的
60
+ * `SKILL_REPO_RE` 挡住 `--flag` / `../` / `;rm -rf` 一类注入。
61
+ */
62
+ export declare function buildSkillInstallArgs(requirement: SkillRequirement): string[];
63
+ /** 从 `--version` 输出里取第一个点分版本号。 */
64
+ export declare function parseToolVersion(output: string): string | undefined;
65
+ /** 按数字段比较;返回 <0 / 0 / >0。缺省段视为 0,故 "22" == "22.0.0"。 */
66
+ export declare function compareToolVersions(a: string, b: string): number;
67
+ /**
68
+ * 找出即将安装的裸名与已有 skill 的撞名。
69
+ *
70
+ * scanner 的去重是「先到先得且静默」——同名后来者直接被丢弃,不告警。所以要在
71
+ * 安装前把遮蔽关系摊开给用户看。插件 skill 带 `plugin:` 命名空间、走独立 dedup
72
+ * 集合,永远不会与裸名互相覆盖,故排除。
73
+ */
74
+ export declare function summarizeSkillConflicts(incoming: readonly string[], installed: readonly KnownSkill[]): SkillConflict[];
75
+ /** 纯函数:不碰磁盘、不起进程,全部输入经 context 注入,便于测试。 */
76
+ export declare function planProfileRequirements(requires: WorkspaceProfileRequirements | undefined, context: PlanRequirementsContext): ProfileRequirementPlan;