@cjhyy/code-shell-core 0.5.0-rc.2 → 0.6.0-rc.2

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 (387) hide show
  1. package/README.md +13 -10
  2. package/dist/agent/agent-definition-registry.d.ts +3 -0
  3. package/dist/agent/agent-definition-registry.js +3 -1
  4. package/dist/agent/agent-definition.d.ts +15 -0
  5. package/dist/agent/agent-definition.js +27 -3
  6. package/dist/arena/context/context-tools.js +47 -4
  7. package/dist/arena/ledger.js +9 -1
  8. package/dist/arena/strategies/utils.d.ts +1 -4
  9. package/dist/arena/strategies/utils.js +7 -84
  10. package/dist/automation/cron-expr.d.ts +10 -0
  11. package/dist/automation/cron-expr.js +23 -5
  12. package/dist/automation/runner.d.ts +21 -4
  13. package/dist/automation/runner.js +48 -12
  14. package/dist/automation/scheduler.d.ts +38 -0
  15. package/dist/automation/scheduler.js +89 -12
  16. package/dist/automation/store.js +5 -2
  17. package/dist/capability-control/disabled-lists.d.ts +25 -0
  18. package/dist/capability-control/disabled-lists.js +57 -0
  19. package/dist/capability-control/overlay.d.ts +15 -0
  20. package/dist/capability-control/overlay.js +27 -0
  21. package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
  22. package/dist/cc-orchestrator/agent-adapter.js +133 -0
  23. package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
  24. package/dist/cc-orchestrator/cc-capability.js +53 -0
  25. package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
  26. package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
  27. package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
  28. package/dist/cc-orchestrator/codex-session-history.js +187 -0
  29. package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
  30. package/dist/cc-orchestrator/external-agent-changes.js +214 -0
  31. package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
  32. package/dist/cc-orchestrator/external-agent-driver.js +69 -0
  33. package/dist/cc-orchestrator/index.d.ts +8 -0
  34. package/dist/cc-orchestrator/index.js +8 -0
  35. package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
  36. package/dist/cc-orchestrator/relevance-judge.js +29 -0
  37. package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
  38. package/dist/cc-orchestrator/session-discovery.js +125 -0
  39. package/dist/cc-orchestrator/session-history.d.ts +19 -0
  40. package/dist/cc-orchestrator/session-history.js +67 -0
  41. package/dist/cli/agent-server-stdio.d.ts +15 -1
  42. package/dist/cli/agent-server-stdio.js +115 -17
  43. package/dist/cli/agent-server-tcp.js +40 -26
  44. package/dist/context/compaction.d.ts +56 -0
  45. package/dist/context/compaction.js +186 -0
  46. package/dist/context/manager.js +25 -4
  47. package/dist/cost-tracker.js +5 -61
  48. package/dist/credentials/cipher.d.ts +49 -0
  49. package/dist/credentials/cipher.js +45 -0
  50. package/dist/credentials/cookie-jar.d.ts +24 -0
  51. package/dist/credentials/cookie-jar.js +40 -0
  52. package/dist/credentials/index.d.ts +7 -0
  53. package/dist/credentials/index.js +5 -0
  54. package/dist/credentials/inject-credential-tool.d.ts +20 -0
  55. package/dist/credentials/inject-credential-tool.js +130 -0
  56. package/dist/credentials/store.d.ts +72 -0
  57. package/dist/credentials/store.js +184 -0
  58. package/dist/credentials/types.d.ts +56 -0
  59. package/dist/credentials/use-credential-tool.d.ts +29 -0
  60. package/dist/credentials/use-credential-tool.js +205 -0
  61. package/dist/credentials/use-gate.d.ts +56 -0
  62. package/dist/credentials/use-gate.js +52 -0
  63. package/dist/data/model-metadata.d.ts +77 -0
  64. package/dist/data/model-metadata.js +56 -0
  65. package/dist/data/model-metadata.json +216 -0
  66. package/dist/data/openrouter-models.d.ts +18 -7
  67. package/dist/data/openrouter-models.js +35 -8
  68. package/dist/engine/aux-key.d.ts +10 -0
  69. package/dist/engine/aux-key.js +11 -0
  70. package/dist/engine/dynamic-tool-defs.d.ts +19 -0
  71. package/dist/engine/dynamic-tool-defs.js +36 -0
  72. package/dist/engine/engine.d.ts +267 -138
  73. package/dist/engine/engine.js +957 -191
  74. package/dist/engine/friendly-error.d.ts +18 -0
  75. package/dist/engine/friendly-error.js +63 -0
  76. package/dist/engine/goal.d.ts +145 -0
  77. package/dist/engine/goal.js +144 -0
  78. package/dist/engine/image-policy.d.ts +13 -0
  79. package/dist/engine/image-policy.js +24 -0
  80. package/dist/engine/model-connections-pool.d.ts +17 -0
  81. package/dist/engine/model-connections-pool.js +66 -0
  82. package/dist/engine/model-facade.d.ts +10 -0
  83. package/dist/engine/model-facade.js +25 -0
  84. package/dist/engine/patch-orphaned-tools.js +3 -0
  85. package/dist/engine/resolve-llm-config.d.ts +16 -0
  86. package/dist/engine/resolve-llm-config.js +44 -0
  87. package/dist/engine/runtime.js +2 -1
  88. package/dist/engine/sandbox-cache-key.d.ts +10 -0
  89. package/dist/engine/sandbox-cache-key.js +9 -0
  90. package/dist/engine/sandbox-config.d.ts +31 -0
  91. package/dist/engine/sandbox-config.js +38 -0
  92. package/dist/engine/session-usage.d.ts +19 -0
  93. package/dist/engine/session-usage.js +25 -0
  94. package/dist/engine/steer-queue.d.ts +32 -0
  95. package/dist/engine/steer-queue.js +26 -0
  96. package/dist/engine/streaming-tool-queue.d.ts +12 -0
  97. package/dist/engine/streaming-tool-queue.js +50 -10
  98. package/dist/engine/turn-loop.d.ts +67 -3
  99. package/dist/engine/turn-loop.js +292 -41
  100. package/dist/engine/types.d.ts +175 -0
  101. package/dist/engine/types.js +13 -0
  102. package/dist/external-agents/config.d.ts +2 -0
  103. package/dist/external-agents/config.js +15 -0
  104. package/dist/external-agents/types.d.ts +31 -0
  105. package/dist/external-agents/types.js +1 -0
  106. package/dist/git/utils.js +11 -6
  107. package/dist/git/worktree.d.ts +48 -0
  108. package/dist/git/worktree.js +86 -10
  109. package/dist/hooks/goal-stop-hook.d.ts +28 -0
  110. package/dist/hooks/goal-stop-hook.js +186 -9
  111. package/dist/hooks/registry.d.ts +8 -0
  112. package/dist/hooks/registry.js +19 -0
  113. package/dist/hooks/shell-runner.js +10 -21
  114. package/dist/index.d.ts +49 -6
  115. package/dist/index.js +60 -4
  116. package/dist/llm/capabilities/param-specs.d.ts +14 -0
  117. package/dist/llm/capabilities/param-specs.js +62 -0
  118. package/dist/llm/capabilities/rules.js +4 -0
  119. package/dist/llm/capabilities/types.d.ts +10 -0
  120. package/dist/llm/client-base.d.ts +28 -1
  121. package/dist/llm/client-base.js +119 -13
  122. package/dist/llm/model-cache.js +4 -2
  123. package/dist/llm/model-pool.d.ts +14 -0
  124. package/dist/llm/model-pool.js +13 -0
  125. package/dist/llm/provider-auth.d.ts +41 -0
  126. package/dist/llm/provider-auth.js +76 -0
  127. package/dist/llm/provider-catalog.d.ts +4 -0
  128. package/dist/llm/providers/anthropic.js +64 -14
  129. package/dist/llm/providers/openai.d.ts +36 -0
  130. package/dist/llm/providers/openai.js +257 -51
  131. package/dist/llm/reasoning-setting.d.ts +3 -3
  132. package/dist/llm/reasoning-setting.js +9 -1
  133. package/dist/llm/stream-watchdog.js +5 -1
  134. package/dist/llm/token-counter.js +9 -2
  135. package/dist/llm/types.d.ts +4 -0
  136. package/dist/logging/sanitize-messages.js +22 -0
  137. package/dist/lsp/manager.d.ts +1 -1
  138. package/dist/lsp/manager.js +40 -10
  139. package/dist/model-catalog/builtin.d.ts +12 -0
  140. package/dist/model-catalog/builtin.js +407 -0
  141. package/dist/model-catalog/gen-connections.d.ts +20 -0
  142. package/dist/model-catalog/gen-connections.js +28 -0
  143. package/dist/model-catalog/index.d.ts +41 -0
  144. package/dist/model-catalog/index.js +90 -0
  145. package/dist/model-catalog/params.d.ts +20 -0
  146. package/dist/model-catalog/params.js +45 -0
  147. package/dist/model-catalog/resolve.d.ts +48 -0
  148. package/dist/model-catalog/resolve.js +33 -0
  149. package/dist/model-catalog/save-entry.d.ts +32 -0
  150. package/dist/model-catalog/save-entry.js +104 -0
  151. package/dist/model-catalog/types.d.ts +561 -0
  152. package/dist/model-catalog/types.js +93 -0
  153. package/dist/model-catalog/upsert.d.ts +9 -0
  154. package/dist/model-catalog/upsert.js +8 -0
  155. package/dist/onboarding.d.ts +12 -82
  156. package/dist/onboarding.js +61 -326
  157. package/dist/plugins/gitOps.d.ts +19 -0
  158. package/dist/plugins/gitOps.js +73 -4
  159. package/dist/plugins/installer/checkUpdate.d.ts +16 -0
  160. package/dist/plugins/installer/checkUpdate.js +32 -0
  161. package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
  162. package/dist/plugins/installer/codex/convertCommands.js +46 -0
  163. package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
  164. package/dist/plugins/installer/codex/convertMcp.js +45 -5
  165. package/dist/plugins/installer/install.js +25 -1
  166. package/dist/plugins/installer/installFromArchive.d.ts +43 -0
  167. package/dist/plugins/installer/installFromArchive.js +134 -0
  168. package/dist/plugins/installer/installFromSource.js +8 -2
  169. package/dist/plugins/installer/loadPluginAgents.js +6 -2
  170. package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
  171. package/dist/plugins/installer/loadPluginMcp.js +35 -2
  172. package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
  173. package/dist/plugins/installer/pruneDisabled.js +73 -0
  174. package/dist/plugins/installer/types.d.ts +5 -2
  175. package/dist/plugins/installer/types.js +1 -0
  176. package/dist/plugins/installer/uninstall.js +4 -0
  177. package/dist/plugins/installer/unzip.d.ts +14 -0
  178. package/dist/plugins/installer/unzip.js +82 -0
  179. package/dist/plugins/installer/update.d.ts +14 -0
  180. package/dist/plugins/installer/update.js +53 -21
  181. package/dist/plugins/loadPluginHooks.d.ts +47 -1
  182. package/dist/plugins/loadPluginHooks.js +73 -1
  183. package/dist/plugins/marketplaceManager.d.ts +7 -0
  184. package/dist/plugins/marketplaceManager.js +20 -0
  185. package/dist/plugins/pluginCommandHook.js +4 -18
  186. package/dist/plugins/pluginContent.d.ts +30 -0
  187. package/dist/plugins/pluginContent.js +83 -0
  188. package/dist/plugins/pluginInstaller.d.ts +13 -0
  189. package/dist/plugins/pluginInstaller.js +42 -8
  190. package/dist/plugins/schemas.js +1 -0
  191. package/dist/plugins/types.d.ts +6 -0
  192. package/dist/preset/index.d.ts +7 -1
  193. package/dist/preset/index.js +96 -6
  194. package/dist/product/types.d.ts +1 -1
  195. package/dist/prompt/composer.d.ts +27 -0
  196. package/dist/prompt/composer.js +67 -21
  197. package/dist/prompt/instruction-scanner.js +5 -3
  198. package/dist/prompt/section-loader.js +1 -0
  199. package/dist/prompt/sections/base.md +1 -0
  200. package/dist/prompt/sections/browser.md +10 -0
  201. package/dist/prompt/sections/coding.md +4 -0
  202. package/dist/protocol/chat-session-manager.d.ts +8 -2
  203. package/dist/protocol/chat-session-manager.js +36 -0
  204. package/dist/protocol/chat-session.d.ts +65 -0
  205. package/dist/protocol/chat-session.js +94 -2
  206. package/dist/protocol/client.d.ts +27 -0
  207. package/dist/protocol/client.js +38 -0
  208. package/dist/protocol/server.d.ts +112 -0
  209. package/dist/protocol/server.js +586 -16
  210. package/dist/protocol/transport.js +3 -2
  211. package/dist/protocol/types.d.ts +46 -0
  212. package/dist/protocol/types.js +16 -0
  213. package/dist/quota/credentials.d.ts +3 -0
  214. package/dist/quota/credentials.js +80 -0
  215. package/dist/quota/index.d.ts +36 -0
  216. package/dist/quota/index.js +155 -0
  217. package/dist/quota/types.d.ts +48 -0
  218. package/dist/quota/types.js +13 -0
  219. package/dist/review/review-prompt.d.ts +28 -0
  220. package/dist/review/review-prompt.js +81 -0
  221. package/dist/run/FileRunStore.js +8 -3
  222. package/dist/run/RunApprovalBackend.js +25 -5
  223. package/dist/run/RunManager.d.ts +12 -0
  224. package/dist/run/RunManager.js +35 -0
  225. package/dist/run/factory.d.ts +1 -1
  226. package/dist/runtime/background-shell.d.ts +139 -0
  227. package/dist/runtime/background-shell.js +495 -0
  228. package/dist/runtime/output-clean.d.ts +24 -0
  229. package/dist/runtime/output-clean.js +41 -0
  230. package/dist/runtime/ring-file.d.ts +64 -0
  231. package/dist/runtime/ring-file.js +174 -0
  232. package/dist/runtime/safe-spawn.js +15 -34
  233. package/dist/runtime/spawn-common.d.ts +148 -0
  234. package/dist/runtime/spawn-common.js +303 -0
  235. package/dist/runtime/truncate-output.d.ts +22 -0
  236. package/dist/runtime/truncate-output.js +49 -0
  237. package/dist/runtime/utf8-cut.d.ts +11 -0
  238. package/dist/runtime/utf8-cut.js +23 -0
  239. package/dist/services/auto-dream.d.ts +4 -0
  240. package/dist/services/auto-dream.js +26 -26
  241. package/dist/services/diagnostics.d.ts +1 -2
  242. package/dist/services/diagnostics.js +12 -7
  243. package/dist/services/extract-memories.d.ts +14 -1
  244. package/dist/services/extract-memories.js +45 -6
  245. package/dist/services/memory-orchestrator.d.ts +21 -0
  246. package/dist/services/memory-orchestrator.js +125 -50
  247. package/dist/services/session-memory.js +24 -12
  248. package/dist/session/file-history.d.ts +124 -1
  249. package/dist/session/file-history.js +222 -6
  250. package/dist/session/memory.d.ts +116 -2
  251. package/dist/session/memory.js +250 -28
  252. package/dist/session/session-manager.d.ts +40 -0
  253. package/dist/session/session-manager.js +113 -3
  254. package/dist/session/simple-diff.d.ts +23 -0
  255. package/dist/session/simple-diff.js +84 -0
  256. package/dist/session/transcript.d.ts +25 -1
  257. package/dist/session/transcript.js +35 -2
  258. package/dist/session/undo-target.d.ts +67 -0
  259. package/dist/session/undo-target.js +144 -0
  260. package/dist/settings/disk-defaults.d.ts +9 -2
  261. package/dist/settings/disk-defaults.js +11 -2
  262. package/dist/settings/feature-flags.d.ts +64 -0
  263. package/dist/settings/feature-flags.js +61 -0
  264. package/dist/settings/manager.d.ts +68 -1
  265. package/dist/settings/manager.js +266 -29
  266. package/dist/settings/migrate-config.d.ts +45 -0
  267. package/dist/settings/migrate-config.js +125 -0
  268. package/dist/settings/schema-export.d.ts +25 -0
  269. package/dist/settings/schema-export.js +38 -0
  270. package/dist/settings/schema.d.ts +1186 -771
  271. package/dist/settings/schema.js +268 -97
  272. package/dist/skills/scanner.d.ts +9 -0
  273. package/dist/skills/scanner.js +30 -2
  274. package/dist/stt/resolve-transcribe.d.ts +31 -0
  275. package/dist/stt/resolve-transcribe.js +108 -0
  276. package/dist/stt/transcribe.d.ts +51 -0
  277. package/dist/stt/transcribe.js +65 -0
  278. package/dist/tool-system/browser-bridge.d.ts +226 -0
  279. package/dist/tool-system/browser-bridge.js +163 -0
  280. package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
  281. package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
  282. package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
  283. package/dist/tool-system/builtin/agent-notifications.js +9 -3
  284. package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
  285. package/dist/tool-system/builtin/agent-output-file.js +72 -0
  286. package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
  287. package/dist/tool-system/builtin/agent-registry.js +8 -0
  288. package/dist/tool-system/builtin/agent.d.ts +21 -1
  289. package/dist/tool-system/builtin/agent.js +489 -42
  290. package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
  291. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
  292. package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
  293. package/dist/tool-system/builtin/apply-patch/index.js +0 -15
  294. package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
  295. package/dist/tool-system/builtin/background-jobs.js +124 -0
  296. package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
  297. package/dist/tool-system/builtin/background-shell-tools.js +108 -0
  298. package/dist/tool-system/builtin/background-work.d.ts +67 -0
  299. package/dist/tool-system/builtin/background-work.js +86 -0
  300. package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
  301. package/dist/tool-system/builtin/bash-output-style.js +40 -0
  302. package/dist/tool-system/builtin/bash.d.ts +5 -2
  303. package/dist/tool-system/builtin/bash.js +98 -62
  304. package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
  305. package/dist/tool-system/builtin/browser-tools.js +312 -0
  306. package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
  307. package/dist/tool-system/builtin/cancel-goal.js +64 -0
  308. package/dist/tool-system/builtin/check-quota.d.ts +15 -0
  309. package/dist/tool-system/builtin/check-quota.js +34 -0
  310. package/dist/tool-system/builtin/config.js +7 -0
  311. package/dist/tool-system/builtin/cron.d.ts +7 -0
  312. package/dist/tool-system/builtin/cron.js +55 -3
  313. package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
  314. package/dist/tool-system/builtin/drive-claude-code.js +157 -0
  315. package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
  316. package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
  317. package/dist/tool-system/builtin/edit.js +20 -16
  318. package/dist/tool-system/builtin/eol.d.ts +29 -0
  319. package/dist/tool-system/builtin/eol.js +37 -0
  320. package/dist/tool-system/builtin/file-cache.d.ts +6 -0
  321. package/dist/tool-system/builtin/file-cache.js +8 -0
  322. package/dist/tool-system/builtin/generate-image.d.ts +35 -0
  323. package/dist/tool-system/builtin/generate-image.js +278 -50
  324. package/dist/tool-system/builtin/generate-video.d.ts +55 -0
  325. package/dist/tool-system/builtin/generate-video.js +361 -0
  326. package/dist/tool-system/builtin/glob.js +0 -7
  327. package/dist/tool-system/builtin/grep.js +6 -8
  328. package/dist/tool-system/builtin/image-providers.d.ts +86 -0
  329. package/dist/tool-system/builtin/image-providers.js +190 -0
  330. package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
  331. package/dist/tool-system/builtin/image-uploader.js +74 -0
  332. package/dist/tool-system/builtin/index.d.ts +7 -1
  333. package/dist/tool-system/builtin/index.js +249 -25
  334. package/dist/tool-system/builtin/mcp-tools.js +23 -3
  335. package/dist/tool-system/builtin/memory.js +45 -7
  336. package/dist/tool-system/builtin/notebook-edit.js +0 -7
  337. package/dist/tool-system/builtin/powershell.js +4 -1
  338. package/dist/tool-system/builtin/read.js +10 -10
  339. package/dist/tool-system/builtin/repl.js +4 -1
  340. package/dist/tool-system/builtin/skill.js +9 -0
  341. package/dist/tool-system/builtin/sleep.js +3 -2
  342. package/dist/tool-system/builtin/tool-search.js +25 -7
  343. package/dist/tool-system/builtin/video-providers.d.ts +154 -0
  344. package/dist/tool-system/builtin/video-providers.js +235 -0
  345. package/dist/tool-system/builtin/web-fetch.js +12 -2
  346. package/dist/tool-system/builtin/web-search.js +21 -7
  347. package/dist/tool-system/builtin/worktree.d.ts +2 -1
  348. package/dist/tool-system/builtin/worktree.js +31 -4
  349. package/dist/tool-system/builtin/write.js +0 -6
  350. package/dist/tool-system/context.d.ts +154 -6
  351. package/dist/tool-system/executor.d.ts +3 -1
  352. package/dist/tool-system/executor.js +172 -88
  353. package/dist/tool-system/investigation-guard.js +1 -1
  354. package/dist/tool-system/mcp-manager.d.ts +42 -4
  355. package/dist/tool-system/mcp-manager.js +186 -20
  356. package/dist/tool-system/path-policy.d.ts +5 -0
  357. package/dist/tool-system/path-policy.js +307 -8
  358. package/dist/tool-system/permission.d.ts +36 -1
  359. package/dist/tool-system/permission.js +281 -69
  360. package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
  361. package/dist/tool-system/plan-mode-allowlist.js +24 -2
  362. package/dist/tool-system/registry.d.ts +1 -0
  363. package/dist/tool-system/registry.js +16 -2
  364. package/dist/tool-system/sandbox/index.d.ts +8 -0
  365. package/dist/tool-system/sandbox/index.js +7 -2
  366. package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
  367. package/dist/tool-system/validate-tool-metadata.js +63 -0
  368. package/dist/types.d.ts +217 -6
  369. package/dist/updater.js +20 -9
  370. package/dist/utils/envUtils.d.ts +0 -9
  371. package/dist/utils/envUtils.js +3 -28
  372. package/dist/utils/exec.d.ts +40 -0
  373. package/dist/utils/exec.js +144 -0
  374. package/dist/utils/json.d.ts +12 -0
  375. package/dist/utils/json.js +92 -0
  376. package/dist/utils/theme.d.ts +1 -1
  377. package/dist/utils/theme.js +1 -1
  378. package/dist/utils/toolDisplay.js +0 -1
  379. package/package.json +13 -7
  380. package/dist/agent/coordinator.d.ts +0 -49
  381. package/dist/agent/coordinator.js +0 -77
  382. package/dist/settings/manager.test.js +0 -73
  383. package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
  384. package/dist/tool-system/builtin/remote-trigger.js +0 -54
  385. package/dist/tool-system/builtin/send-message.d.ts +0 -6
  386. package/dist/tool-system/builtin/send-message.js +0 -47
  387. /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
@@ -0,0 +1,7 @@
1
+ export { CredentialStore } from "./store.js";
2
+ export type { CredentialScope, MaskedCredential } from "./store.js";
3
+ export { type EncryptionCipher, PlaintextCipher, setDefaultCredentialCipher, getDefaultCredentialCipher, } from "./cipher.js";
4
+ export type { Credential, CredentialType, CredentialStoreFile } from "./types.js";
5
+ export { formatNetscapeCookies, parseCookieJar, type CookieLike } from "./cookie-jar.js";
6
+ export { useCredentialToolDef, useCredentialToolDefFor, useCredentialTool, sweepStaleCredentialCookies, } from "./use-credential-tool.js";
7
+ export { credentialUseGate } from "./use-gate.js";
@@ -0,0 +1,5 @@
1
+ export { CredentialStore } from "./store.js";
2
+ export { PlaintextCipher, setDefaultCredentialCipher, getDefaultCredentialCipher, } from "./cipher.js";
3
+ export { formatNetscapeCookies, parseCookieJar } from "./cookie-jar.js";
4
+ export { useCredentialToolDef, useCredentialToolDefFor, useCredentialTool, sweepStaleCredentialCookies, } from "./use-credential-tool.js";
5
+ export { credentialUseGate } from "./use-gate.js";
@@ -0,0 +1,20 @@
1
+ /**
2
+ * InjectCredential 工具:把一条 cookie 凭证「注入内置浏览器」(恢复登录态),
3
+ * 让 AI 能以该账号身份在内置浏览器面板做 UI 操作(配 browser_* 工具)。
4
+ *
5
+ * 与 UseCredential 的区别:
6
+ * - UseCredential 取 cookie 文件路径走 HTTP 请求(curl/yt-dlp),只读、不改浏览器。
7
+ * - InjectCredential 改的是内置浏览器的登录态(先清再灌),副作用更大 →
8
+ * 独立的逐条门 `autoInjectByAI`(不复用 autoUseByAI)。
9
+ *
10
+ * 跨进程:实际的 restoreCookiesToBrowser 在 desktop main(core 够不到 Electron
11
+ * session),经 `ctx.injectCredentialToBrowser` 回调(宿主注入,镜像 askUser)触发。
12
+ */
13
+ import type { ToolDefinition } from "../types.js";
14
+ import type { ToolContext } from "../tool-system/context.js";
15
+ export declare const injectCredentialToolDef: ToolDefinition;
16
+ /** 该工具仅在有 cookie 凭证 且 宿主接了注入回调时才可见(BUILTIN_TOOL_GUARDS)。 */
17
+ export declare function isInjectCredentialAvailable(cwd: string): boolean;
18
+ export declare function injectCredentialTool(args: Record<string, unknown>, ctx?: ToolContext): Promise<string>;
19
+ /** 测试钩子:清空会话 allow 集。 */
20
+ export declare function __resetInjectCredentialSessionAllowForTests(): void;
@@ -0,0 +1,130 @@
1
+ /**
2
+ * InjectCredential 工具:把一条 cookie 凭证「注入内置浏览器」(恢复登录态),
3
+ * 让 AI 能以该账号身份在内置浏览器面板做 UI 操作(配 browser_* 工具)。
4
+ *
5
+ * 与 UseCredential 的区别:
6
+ * - UseCredential 取 cookie 文件路径走 HTTP 请求(curl/yt-dlp),只读、不改浏览器。
7
+ * - InjectCredential 改的是内置浏览器的登录态(先清再灌),副作用更大 →
8
+ * 独立的逐条门 `autoInjectByAI`(不复用 autoUseByAI)。
9
+ *
10
+ * 跨进程:实际的 restoreCookiesToBrowser 在 desktop main(core 够不到 Electron
11
+ * session),经 `ctx.injectCredentialToBrowser` 回调(宿主注入,镜像 askUser)触发。
12
+ */
13
+ import { CredentialStore } from "./store.js";
14
+ import { credentialUseGate, } from "./use-gate.js";
15
+ import { SettingsManager } from "../settings/manager.js";
16
+ const TOOL_NAME = "InjectCredential";
17
+ const BASE_DESCRIPTION = "Inject a stored COOKIE credential into the built-in browser to restore its " +
18
+ "login state, so you can then drive the page as that logged-in account with the " +
19
+ "browser_* tools (snapshot/click/type/navigate). This replaces the browser's " +
20
+ "current cookies.\n\n" +
21
+ "ONLY call this when the user EXPLICITLY asks to log in / act as a specific " +
22
+ "account / do something that requires being signed in. Do NOT call it just to " +
23
+ "open, navigate to, or browse a site — 'open 小红书 / go to <url> / take a look' " +
24
+ "is plain navigation: use browser_navigate WITHOUT injecting any cookies. " +
25
+ "Injecting overwrites the browser's current session, so an unrequested inject is " +
26
+ "a surprising, destructive side effect. When unsure whether login is wanted, " +
27
+ "navigate first and ask the user rather than injecting.\n\n" +
28
+ "When it IS wanted: call UseCredential with no args first to see available " +
29
+ "credentials, then call this with `id` of a cookie credential. For HTTP " +
30
+ "scraping/downloads (curl/yt-dlp) use UseCredential instead — this is only for " +
31
+ "driving the built-in browser UI. Gated by a quick user approval unless the " +
32
+ "credential has auto-inject enabled.";
33
+ export const injectCredentialToolDef = {
34
+ name: TOOL_NAME,
35
+ description: BASE_DESCRIPTION,
36
+ inputSchema: {
37
+ type: "object",
38
+ properties: {
39
+ id: {
40
+ type: "string",
41
+ description: "Cookie credential id to inject into the built-in browser.",
42
+ },
43
+ purpose: {
44
+ type: "string",
45
+ description: "Short reason you need it (shown in the approval prompt).",
46
+ },
47
+ },
48
+ required: ["id"],
49
+ },
50
+ };
51
+ /** 内存会话 allow 集(每 Engine 一份,与 UseCredential 分开:注入是独立动作)。 */
52
+ const injectSessionAllowByEngine = new Map();
53
+ function sessionAllowFor(ctx) {
54
+ // 同 UseCredential:无 sessionId 时绝不共享全局桶,返回一次性 Set,避免跨上下文串台。
55
+ if (!ctx?.sessionId)
56
+ return new Set();
57
+ const key = ctx.sessionId;
58
+ let set = injectSessionAllowByEngine.get(key);
59
+ if (!set) {
60
+ set = new Set();
61
+ injectSessionAllowByEngine.set(key, set);
62
+ }
63
+ return set;
64
+ }
65
+ function readAutoApprove(cwd) {
66
+ try {
67
+ const s = new SettingsManager(cwd, "full").get();
68
+ return s.credentialUse?.autoApprove === true;
69
+ }
70
+ catch {
71
+ return false;
72
+ }
73
+ }
74
+ /** 该工具仅在有 cookie 凭证 且 宿主接了注入回调时才可见(BUILTIN_TOOL_GUARDS)。 */
75
+ export function isInjectCredentialAvailable(cwd) {
76
+ try {
77
+ return new CredentialStore(cwd).listMasked().some((c) => c.type === "cookie");
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ export async function injectCredentialTool(args, ctx) {
84
+ const cwd = ctx?.cwd ?? process.cwd();
85
+ const id = typeof args.id === "string" ? args.id.trim() : "";
86
+ const purpose = typeof args.purpose === "string" ? args.purpose : undefined;
87
+ if (!id) {
88
+ return json({ kind: "error", error: "缺少 id。先用 UseCredential(无参)列出凭证,再用 cookie 凭证的 id 调本工具。" });
89
+ }
90
+ if (!ctx?.injectCredentialToBrowser) {
91
+ return json({
92
+ kind: "error",
93
+ error: "当前环境无内置浏览器(headless/无面板),无法注入。请改用 UseCredential 取 cookie 走 HTTP 请求。",
94
+ });
95
+ }
96
+ const cred = new CredentialStore(cwd).resolve(id);
97
+ if (!cred) {
98
+ return json({ kind: "error", error: `凭证不存在: "${id}"。调用 UseCredential(无参)可列出可用凭证。` });
99
+ }
100
+ if (cred.type !== "cookie") {
101
+ return json({ kind: "error", error: `凭证「${cred.label}」不是 cookie 类型,不能注入浏览器。` });
102
+ }
103
+ // 过门:复用三档,但用该凭证的 autoInjectByAI(不是 autoUseByAI)。
104
+ const ask = ctx.askUser ? (q, opts) => ctx.askUser(q, opts) : undefined;
105
+ const decision = await credentialUseGate({ id: cred.id, label: cred.label, purpose }, {
106
+ autoApprove: readAutoApprove(cwd),
107
+ credentialAutoUse: cred.autoInjectByAI === true,
108
+ sessionAllow: sessionAllowFor(ctx),
109
+ ask,
110
+ });
111
+ if (!decision.allowed) {
112
+ const msg = decision.reason === "no-ui"
113
+ ? "无法注入:当前无审批 UI(headless),且该凭证未开启自动注入。"
114
+ : `用户拒绝把「${cred.label}」注入浏览器。`;
115
+ return json({ kind: "error", error: msg });
116
+ }
117
+ // 跨进程触发宿主注入。
118
+ const res = await ctx.injectCredentialToBrowser(cred.id);
119
+ if (!res.ok) {
120
+ return json({ kind: "error", error: res.error ?? "注入浏览器失败(宿主未返回成功)。" });
121
+ }
122
+ return json({ kind: "injected", count: res.count ?? 0 });
123
+ }
124
+ function json(r) {
125
+ return JSON.stringify(r);
126
+ }
127
+ /** 测试钩子:清空会话 allow 集。 */
128
+ export function __resetInjectCredentialSessionAllowForTests() {
129
+ injectSessionAllowByEngine.clear();
130
+ }
@@ -0,0 +1,72 @@
1
+ import type { Credential } from "./types.js";
2
+ import { type EncryptionCipher } from "./cipher.js";
3
+ export type CredentialScope = "user" | "project";
4
+ export interface MaskedCredential extends Omit<Credential, "secret"> {
5
+ hasSecret: boolean;
6
+ /** 形如 `****abcd`,绝不含完整明文。 */
7
+ secretHint?: string;
8
+ }
9
+ /**
10
+ * 两层凭证库,镜像 SettingsManager 的 user(~/.code-shell)/ project(<cwd>/.code-shell)
11
+ * 双层模型。只存 token / link;cookie 不进库(见 credentials-module 设计稿)。
12
+ */
13
+ export declare class CredentialStore {
14
+ private readonly cwd?;
15
+ private readonly cipher;
16
+ /**
17
+ * @param cwd project root for the project-scope store (undefined → user only).
18
+ * @param cipher secret encryption strategy. Defaults to the process-wide
19
+ * cipher (see setDefaultCredentialCipher) — PlaintextCipher
20
+ * unless the host installed one. The store always sees and
21
+ * returns PLAINTEXT secrets; encryption is applied only at the
22
+ * disk boundary (read decrypts, write encrypts).
23
+ */
24
+ constructor(cwd?: string | undefined, cipher?: EncryptionCipher);
25
+ private pathFor;
26
+ /**
27
+ * Decrypt a stored secret to plaintext. A value this cipher can't decrypt
28
+ * (foreign ciphertext, or legacy plaintext under an encrypting cipher that
29
+ * rejects it) is left as-is rather than crashing the whole store — the worst
30
+ * case is one unusable credential, not an empty list. Re-encryption happens
31
+ * lazily on the next save() of that credential.
32
+ */
33
+ private decryptSecret;
34
+ private read;
35
+ private write;
36
+ /** Upsert by id within a scope. */
37
+ save(scope: CredentialScope, cred: Credential): void;
38
+ /**
39
+ * 只改元数据(label / exposeAsEnv / autoUseByAI / meta),保留 secret 原样。
40
+ * 给 UI「编辑/开关」用 —— 渲染层拿不到明文 secret,故不能走 save(会清空)。
41
+ * id 不存在则 no-op。
42
+ */
43
+ patch(scope: CredentialScope, id: string, fields: Partial<Pick<Credential, "label" | "exposeAsEnv" | "autoUseByAI" | "autoInjectByAI" | "meta">>): void;
44
+ remove(scope: CredentialScope, id: string): void;
45
+ /**
46
+ * List credentials visible to an engine of the given settings scope.
47
+ * - "full" (default): merge user(~/.code-shell) then project, project wins —
48
+ * the host-application behavior.
49
+ * - "project": ONLY the project store. A project/isolated-scope engine
50
+ * (e.g. SDK-embedded) must never surface the host user's credentials —
51
+ * same host-isolation contract as {@link envExposures} and top-level env.
52
+ */
53
+ list(scope?: "full" | "project"): Credential[];
54
+ resolve(id: string, scope?: "full" | "project"): Credential | undefined;
55
+ /**
56
+ * Credentials flagged "expose as env var" → a `{ ENV_NAME: secret }` map for
57
+ * layering into the shell env (Engine.readShellEnv). This is the missing
58
+ * consumer of `Credential.exposeAsEnv` — the UI/store recorded the flag but
59
+ * nothing injected the secret, so `$FIGMA_TOKEN` was always empty.
60
+ *
61
+ * `scope` mirrors the engine's settings scope to keep the host-isolation
62
+ * contract identical to top-level `env`:
63
+ * - "full": merge user(~/.code-shell) then project (project wins), matching
64
+ * `list()` precedence.
65
+ * - "project": ONLY the project store — a project-scoped engine must never
66
+ * surface the host user's credentials (SDK-embedding safety).
67
+ * Only credentials with BOTH a non-empty exposeAsEnv and a non-empty secret
68
+ * contribute; a later layer (project) overrides an earlier env name.
69
+ */
70
+ envExposures(scope: "full" | "project"): Record<string, string>;
71
+ listMasked(scope?: "full" | "project"): MaskedCredential[];
72
+ }
@@ -0,0 +1,184 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { getDefaultCredentialCipher } from "./cipher.js";
5
+ import { logger } from "../logging/logger.js";
6
+ /** 测试可经 process.env.HOME 覆盖(镜像 settings/manager.ts userHome)。 */
7
+ function userHome() {
8
+ return process.env.HOME ?? homedir();
9
+ }
10
+ const EMPTY = { version: 1, credentials: [] };
11
+ /**
12
+ * 两层凭证库,镜像 SettingsManager 的 user(~/.code-shell)/ project(<cwd>/.code-shell)
13
+ * 双层模型。只存 token / link;cookie 不进库(见 credentials-module 设计稿)。
14
+ */
15
+ export class CredentialStore {
16
+ cwd;
17
+ cipher;
18
+ /**
19
+ * @param cwd project root for the project-scope store (undefined → user only).
20
+ * @param cipher secret encryption strategy. Defaults to the process-wide
21
+ * cipher (see setDefaultCredentialCipher) — PlaintextCipher
22
+ * unless the host installed one. The store always sees and
23
+ * returns PLAINTEXT secrets; encryption is applied only at the
24
+ * disk boundary (read decrypts, write encrypts).
25
+ */
26
+ constructor(cwd, cipher) {
27
+ this.cwd = cwd;
28
+ this.cipher = cipher ?? getDefaultCredentialCipher();
29
+ }
30
+ pathFor(scope) {
31
+ if (scope === "user")
32
+ return join(userHome(), ".code-shell", "credentials.json");
33
+ if (!this.cwd)
34
+ return undefined;
35
+ return join(this.cwd, ".code-shell", "credentials.json");
36
+ }
37
+ /**
38
+ * Decrypt a stored secret to plaintext. A value this cipher can't decrypt
39
+ * (foreign ciphertext, or legacy plaintext under an encrypting cipher that
40
+ * rejects it) is left as-is rather than crashing the whole store — the worst
41
+ * case is one unusable credential, not an empty list. Re-encryption happens
42
+ * lazily on the next save() of that credential.
43
+ */
44
+ decryptSecret(stored) {
45
+ try {
46
+ if (this.cipher.canDecrypt && !this.cipher.canDecrypt(stored))
47
+ return stored;
48
+ return this.cipher.decrypt(stored);
49
+ }
50
+ catch (err) {
51
+ logger.warn("credentials.decrypt_fail", { error: err.message });
52
+ return stored;
53
+ }
54
+ }
55
+ read(scope) {
56
+ const p = this.pathFor(scope);
57
+ if (!p || !existsSync(p))
58
+ return { ...EMPTY, credentials: [] };
59
+ try {
60
+ const raw = JSON.parse(readFileSync(p, "utf8"));
61
+ const creds = Array.isArray(raw.credentials) ? raw.credentials : [];
62
+ // Decrypt secrets at the disk boundary so all callers see plaintext.
63
+ for (const c of creds) {
64
+ if (typeof c.secret === "string" && c.secret.length > 0) {
65
+ c.secret = this.decryptSecret(c.secret);
66
+ }
67
+ }
68
+ return { version: 1, credentials: creds };
69
+ }
70
+ catch {
71
+ return { ...EMPTY, credentials: [] };
72
+ }
73
+ }
74
+ write(scope, file) {
75
+ const p = this.pathFor(scope);
76
+ if (!p)
77
+ return;
78
+ mkdirSync(dirname(p), { recursive: true });
79
+ // Encrypt secrets at the disk boundary. `file` carries plaintext secrets
80
+ // (read() decrypted them); serialize a copy with each secret encrypted so
81
+ // we never persist plaintext under an encrypting cipher.
82
+ const onDisk = {
83
+ version: file.version,
84
+ credentials: file.credentials.map((c) => typeof c.secret === "string" && c.secret.length > 0
85
+ ? { ...c, secret: this.cipher.encrypt(c.secret) }
86
+ : c),
87
+ };
88
+ const tmp = `${p}.${process.pid}.${String(performance.now()).replace(".", "")}.tmp`;
89
+ writeFileSync(tmp, JSON.stringify(onDisk, null, 2), { mode: 0o600 });
90
+ renameSync(tmp, p);
91
+ }
92
+ /** Upsert by id within a scope. */
93
+ save(scope, cred) {
94
+ const file = this.read(scope);
95
+ const idx = file.credentials.findIndex((c) => c.id === cred.id);
96
+ if (idx >= 0)
97
+ file.credentials[idx] = cred;
98
+ else
99
+ file.credentials.push(cred);
100
+ this.write(scope, file);
101
+ }
102
+ /**
103
+ * 只改元数据(label / exposeAsEnv / autoUseByAI / meta),保留 secret 原样。
104
+ * 给 UI「编辑/开关」用 —— 渲染层拿不到明文 secret,故不能走 save(会清空)。
105
+ * id 不存在则 no-op。
106
+ */
107
+ patch(scope, id, fields) {
108
+ const file = this.read(scope);
109
+ const idx = file.credentials.findIndex((c) => c.id === id);
110
+ if (idx < 0)
111
+ return;
112
+ file.credentials[idx] = { ...file.credentials[idx], ...fields };
113
+ this.write(scope, file);
114
+ }
115
+ remove(scope, id) {
116
+ const file = this.read(scope);
117
+ file.credentials = file.credentials.filter((c) => c.id !== id);
118
+ this.write(scope, file);
119
+ }
120
+ /**
121
+ * List credentials visible to an engine of the given settings scope.
122
+ * - "full" (default): merge user(~/.code-shell) then project, project wins —
123
+ * the host-application behavior.
124
+ * - "project": ONLY the project store. A project/isolated-scope engine
125
+ * (e.g. SDK-embedded) must never surface the host user's credentials —
126
+ * same host-isolation contract as {@link envExposures} and top-level env.
127
+ */
128
+ list(scope = "full") {
129
+ const byId = new Map();
130
+ if (scope === "full") {
131
+ for (const c of this.read("user").credentials)
132
+ byId.set(c.id, c);
133
+ }
134
+ for (const c of this.read("project").credentials)
135
+ byId.set(c.id, c); // project wins
136
+ return [...byId.values()];
137
+ }
138
+ resolve(id, scope = "full") {
139
+ return this.list(scope).find((c) => c.id === id);
140
+ }
141
+ /**
142
+ * Credentials flagged "expose as env var" → a `{ ENV_NAME: secret }` map for
143
+ * layering into the shell env (Engine.readShellEnv). This is the missing
144
+ * consumer of `Credential.exposeAsEnv` — the UI/store recorded the flag but
145
+ * nothing injected the secret, so `$FIGMA_TOKEN` was always empty.
146
+ *
147
+ * `scope` mirrors the engine's settings scope to keep the host-isolation
148
+ * contract identical to top-level `env`:
149
+ * - "full": merge user(~/.code-shell) then project (project wins), matching
150
+ * `list()` precedence.
151
+ * - "project": ONLY the project store — a project-scoped engine must never
152
+ * surface the host user's credentials (SDK-embedding safety).
153
+ * Only credentials with BOTH a non-empty exposeAsEnv and a non-empty secret
154
+ * contribute; a later layer (project) overrides an earlier env name.
155
+ */
156
+ envExposures(scope) {
157
+ const out = {};
158
+ const layers = scope === "project"
159
+ ? [this.read("project").credentials]
160
+ : [this.read("user").credentials, this.read("project").credentials];
161
+ for (const layer of layers) {
162
+ for (const c of layer) {
163
+ const name = c.exposeAsEnv?.trim();
164
+ if (name && typeof c.secret === "string" && c.secret.length > 0) {
165
+ out[name] = c.secret;
166
+ }
167
+ }
168
+ }
169
+ return out;
170
+ }
171
+ listMasked(scope = "full") {
172
+ return this.list(scope).map((c) => {
173
+ const { secret, ...rest } = c;
174
+ return {
175
+ ...rest,
176
+ hasSecret: typeof secret === "string" && secret.length > 0,
177
+ // Reveal at most the last 4 chars — and ONLY when the secret is longer
178
+ // than 4, so those chars aren't the whole secret. `"ab".slice(-4)` is
179
+ // "ab", so a short secret would otherwise leak in full through the hint.
180
+ secretHint: secret ? (secret.length > 4 ? `****${secret.slice(-4)}` : "****") : undefined,
181
+ };
182
+ });
183
+ }
184
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 常驻凭证:token / link / cookie。
3
+ * - token/link 第一期已有;cookie 第二期改为「具名 cookie 凭证」进库
4
+ * (用户主动按域拓取存,支持同域多账号),见 credential-use-gate 设计稿。
5
+ */
6
+ export type CredentialType = "token" | "link" | "cookie";
7
+ export interface Credential {
8
+ /**
9
+ * 引用键,kebab-case,全局/项目两层内唯一。
10
+ * - token/link 如 "my-figma-token"。
11
+ * - cookie 为 `${platform}__${slug(label)}`,如 "xiaohongshu__accountA"
12
+ * (同一域可有多条不同账号,故 id 不等于域名)。
13
+ */
14
+ id: string;
15
+ type: CredentialType;
16
+ /** 展示名。 */
17
+ label: string;
18
+ /**
19
+ * 密文(UI 只显示掩码):
20
+ * - token: token 值;
21
+ * - link: client id/secret 等的 JSON 字符串;
22
+ * - cookie: 序列化的 cookie jar(JSON.stringify 的 ElectronCookieLike[])。
23
+ */
24
+ secret?: string;
25
+ /** 可选:静态暴露为该 shell env 变量名(进 readShellEnv)。 */
26
+ exposeAsEnv?: string;
27
+ /**
28
+ * 逐条「AI 可自动取用」开关:为 true 时该凭证免过审批门(等价于对它单独开了
29
+ * 全局 credentialUse.autoApprove)。默认 false / 缺省 = 走全局开关 + 审批门。
30
+ * 管的是「AI 取 cookie 文件走 HTTP 请求」(UseCredential)。
31
+ */
32
+ autoUseByAI?: boolean;
33
+ /**
34
+ * 逐条「AI 可自动注入浏览器」开关(仅 cookie):为 true 时 AI 调「注入浏览器」工具
35
+ * (把该 cookie 灌进内置浏览器以登录态打开页面)免审批。默认 false = 弹审批。
36
+ * 与 autoUseByAI 分开 —— 注入浏览器改的是浏览器登录态,比只读取用风险更高。
37
+ */
38
+ autoInjectByAI?: boolean;
39
+ /**
40
+ * link: 业务方 app 注册地址;cookie: 拓取所用平台与主域 + 抓取范围 + 切换策略。
41
+ * - scope="all" 表示该 jar 是整分区全量抓的(切换时整包导回);缺省/"domain" = 仅该域。
42
+ * - switchMode 决定「切换」时怎么写回浏览器:"clear"(默认)先清空整分区再注入(干净换号);
43
+ * "merge" 只覆盖同名 cookie、保留分区里其他站(不踢掉别的登录态)。
44
+ */
45
+ meta?: {
46
+ appUrl?: string;
47
+ platform?: string;
48
+ domain?: string;
49
+ scope?: "domain" | "all";
50
+ switchMode?: "clear" | "merge";
51
+ };
52
+ }
53
+ export interface CredentialStoreFile {
54
+ version: 1;
55
+ credentials: Credential[];
56
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * UseCredential 工具(凭证模块第二期 §3-§5)。
3
+ *
4
+ * 对 AI 暴露**一个统一工具**取用已存凭证(token / link / cookie 同构,描述只说「凭证」)。
5
+ * - 无 `id` → 返回脱敏清单(权威实时源,兜底动态描述的滞后)。
6
+ * - 有 `id` → 过 CredentialUseGate(默认问 / 本会话记住 / 全自动)后:
7
+ * - token/link → `{ kind: "value", value }`
8
+ * - cookie → 就地写临时 cookies.txt(0600),返回 `{ kind: "cookie", cookiesFile, count }`
9
+ *
10
+ * 取值全部 core 直读 CredentialStore(cookie 值第二期已进库),无跨进程。
11
+ * 集中在 core/src/credentials/ 下,只经 ToolDefinition 注册 + ToolContext.askUser 耦合 core,
12
+ * 满足设计稿 §1「可整块外移」约束。
13
+ */
14
+ import type { ToolDefinition } from "../types.js";
15
+ import type { ToolContext } from "../tool-system/context.js";
16
+ export declare const useCredentialToolDef: ToolDefinition;
17
+ /**
18
+ * 动态描述:在基础描述末尾附当前可用凭证清单(镜像 generateVideoToolDefFor)。
19
+ * 空时回退基础描述。AI 一搜出/一看到就知道有哪些可用,减少无谓的无参列举调用。
20
+ */
21
+ export declare function useCredentialToolDefFor(cwd: string): ToolDefinition;
22
+ /**
23
+ * 启动期清理上次遗留的临时 cookies.txt(沿用 sweepStaleLeases 思路:扫同目录、按 mtime)。
24
+ * 不引入 lease 对象/定时器 —— 文件用完靠进程退出 + 这个轻量 sweep。
25
+ */
26
+ export declare function sweepStaleCredentialCookies(now?: number): void;
27
+ export declare function useCredentialTool(args: Record<string, unknown>, ctx?: ToolContext): Promise<string>;
28
+ /** 测试钩子:清空会话 allow 集(避免跨用例污染)。 */
29
+ export declare function __resetCredentialSessionAllowForTests(): void;