@cjhyy/code-shell-core 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (594) 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/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -0,0 +1,665 @@
1
+ import { asArray, asRecord, assertPathSegment, firstString, intParam, linkRequestJson, pathParam, pathSegmentParam, pick, stringParam, } from "./http.js";
2
+ const bearer = (token) => ({ Authorization: `Bearer ${token}` });
3
+ const GITHUB_API_VERSION = "2022-11-28";
4
+ const NOTION_API_VERSION = "2022-06-28";
5
+ const githubHeaders = (token) => ({
6
+ ...bearer(token),
7
+ Accept: "application/vnd.github+json",
8
+ "X-GitHub-Api-Version": GITHUB_API_VERSION,
9
+ });
10
+ function action(id, title, description, execute, risk = "read") {
11
+ return { id, title, description, risk, execute };
12
+ }
13
+ async function request(context, url, options = {}) {
14
+ return linkRequestJson({
15
+ url: typeof url === "string" ? new URL(url) : url,
16
+ method: options.method,
17
+ headers: options.headers ?? bearer(context.token),
18
+ body: options.body,
19
+ signal: context.signal,
20
+ fetchImpl: context.fetchImpl,
21
+ });
22
+ }
23
+ function identity(data, idKeys, labelKeys, detailKeys = []) {
24
+ const record = asRecord(data) ?? {};
25
+ const externalAccountId = firstString(...idKeys.map((key) => record[key])) ?? String(record.id ?? "account");
26
+ const label = firstString(...labelKeys.map((key) => record[key])) ?? externalAccountId;
27
+ const detail = firstString(...detailKeys.map((key) => record[key]));
28
+ return { externalAccountId, label, ...(detail ? { detail } : {}) };
29
+ }
30
+ function compactList(data, keys, limit = 50) {
31
+ return asArray(data)
32
+ .slice(0, limit)
33
+ .map((value) => pick(value, keys));
34
+ }
35
+ const github = {
36
+ id: "github",
37
+ displayName: "GitHub",
38
+ tokenLabel: "Fine-grained PAT",
39
+ tokenPlaceholder: "github_pat_…",
40
+ async validate(context) {
41
+ const data = await request(context, "https://api.github.com/user", {
42
+ headers: githubHeaders(context.token),
43
+ });
44
+ const repositoriesUrl = new URL("https://api.github.com/user/repos");
45
+ repositoriesUrl.searchParams.set("per_page", "12");
46
+ repositoriesUrl.searchParams.set("sort", "updated");
47
+ const repositories = await request(context, repositoriesUrl, {
48
+ headers: githubHeaders(context.token),
49
+ });
50
+ return {
51
+ ...identity(data, ["id"], ["login", "name"], ["name", "email"]),
52
+ resourceLabels: asArray(repositories)
53
+ .map((value) => firstString(asRecord(value)?.full_name))
54
+ .filter((value) => Boolean(value))
55
+ .slice(0, 12),
56
+ };
57
+ },
58
+ actions: [
59
+ action("list_repositories", "列出仓库", "列出当前 Token 可访问的 GitHub 仓库。", async (ctx) => {
60
+ const url = new URL("https://api.github.com/user/repos");
61
+ url.searchParams.set("per_page", String(intParam(ctx.params, "limit", 30, 100)));
62
+ url.searchParams.set("sort", "updated");
63
+ const data = await request(ctx, url, {
64
+ headers: githubHeaders(ctx.token),
65
+ });
66
+ return {
67
+ repositories: compactList(data, [
68
+ "id",
69
+ "full_name",
70
+ "description",
71
+ "private",
72
+ "archived",
73
+ "default_branch",
74
+ "html_url",
75
+ "updated_at",
76
+ ], 100),
77
+ };
78
+ }),
79
+ action("get_readme", "读取 README", "读取 GitHub README;params: owner, repo。", async (ctx) => {
80
+ const owner = pathSegmentParam(ctx.params, "owner", { required: true, maxLength: 100 });
81
+ const repo = pathSegmentParam(ctx.params, "repo", { required: true, maxLength: 100 });
82
+ const data = asRecord(await request(ctx, `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/readme`, { headers: githubHeaders(ctx.token) })) ?? {};
83
+ const encoded = typeof data.content === "string" ? data.content.replace(/\s/g, "") : "";
84
+ const content = encoded
85
+ ? Buffer.from(encoded, "base64").toString("utf8").slice(0, 262_144)
86
+ : "";
87
+ return {
88
+ owner,
89
+ repo,
90
+ path: data.path,
91
+ sha: data.sha,
92
+ content,
93
+ truncated: content.length >= 262_144,
94
+ html_url: data.html_url,
95
+ };
96
+ }),
97
+ action("list_issues", "列出 Issue", "列出 GitHub Issue(排除 Pull Request);params: owner, repo, 可选 limit。", async (ctx) => {
98
+ const owner = pathSegmentParam(ctx.params, "owner", { required: true, maxLength: 100 });
99
+ const repo = pathSegmentParam(ctx.params, "repo", { required: true, maxLength: 100 });
100
+ const url = new URL(`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues`);
101
+ url.searchParams.set("per_page", String(intParam(ctx.params, "limit", 30, 100)));
102
+ const data = asArray(await request(ctx, url, {
103
+ headers: githubHeaders(ctx.token),
104
+ }));
105
+ return {
106
+ issues: data
107
+ .filter((value) => !asRecord(value)?.pull_request)
108
+ .slice(0, 100)
109
+ .map((value) => pick(value, [
110
+ "number",
111
+ "title",
112
+ "state",
113
+ "html_url",
114
+ "created_at",
115
+ "updated_at",
116
+ "user",
117
+ "labels",
118
+ ])),
119
+ };
120
+ }),
121
+ action("get_file", "读取指定文件", "读取 GitHub 仓库文件;params: owner, repo, path, 可选 ref。", async (ctx) => {
122
+ const owner = pathSegmentParam(ctx.params, "owner", { required: true, maxLength: 100 });
123
+ const repo = pathSegmentParam(ctx.params, "repo", { required: true, maxLength: 100 });
124
+ const path = pathParam(ctx.params, "path", { required: true, maxLength: 2_000 });
125
+ const ref = stringParam(ctx.params, "ref", { maxLength: 300 });
126
+ const url = new URL(`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/contents/${path}`);
127
+ if (ref)
128
+ url.searchParams.set("ref", ref);
129
+ const data = asRecord(await request(ctx, url, { headers: githubHeaders(ctx.token) })) ?? {};
130
+ if (data.type !== "file")
131
+ throw new Error("GitHub path is not a file");
132
+ const encoded = typeof data.content === "string" ? data.content.replace(/\s/g, "") : "";
133
+ const content = encoded
134
+ ? Buffer.from(encoded, "base64").toString("utf8").slice(0, 262_144)
135
+ : "";
136
+ return {
137
+ owner,
138
+ repo,
139
+ path: data.path,
140
+ ref,
141
+ sha: data.sha,
142
+ size: data.size,
143
+ content,
144
+ truncated: typeof data.size === "number" ? data.size > Buffer.byteLength(content) : false,
145
+ html_url: data.html_url,
146
+ };
147
+ }),
148
+ action("list_pull_requests", "列出 Pull Request", "列出 GitHub Pull Request;params: owner, repo, 可选 limit。", async (ctx) => {
149
+ const owner = pathSegmentParam(ctx.params, "owner", { required: true, maxLength: 100 });
150
+ const repo = pathSegmentParam(ctx.params, "repo", { required: true, maxLength: 100 });
151
+ const url = new URL(`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls`);
152
+ url.searchParams.set("per_page", String(intParam(ctx.params, "limit", 30, 100)));
153
+ const data = await request(ctx, url, {
154
+ headers: githubHeaders(ctx.token),
155
+ });
156
+ return {
157
+ pull_requests: compactList(data, [
158
+ "number",
159
+ "title",
160
+ "state",
161
+ "draft",
162
+ "html_url",
163
+ "created_at",
164
+ "updated_at",
165
+ "user",
166
+ "head",
167
+ "base",
168
+ ], 100),
169
+ };
170
+ }),
171
+ action("get_issue", "查看 Issue", "查看单个 GitHub Issue;params: owner, repo, issue_number。", async (ctx) => {
172
+ const owner = pathSegmentParam(ctx.params, "owner", { required: true, maxLength: 100 });
173
+ const repo = pathSegmentParam(ctx.params, "repo", { required: true, maxLength: 100 });
174
+ const number = intParam(ctx.params, "issue_number", 0, Number.MAX_SAFE_INTEGER);
175
+ return pick(await request(ctx, `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues/${number}`, { headers: githubHeaders(ctx.token) }), [
176
+ "number",
177
+ "title",
178
+ "body",
179
+ "state",
180
+ "state_reason",
181
+ "html_url",
182
+ "created_at",
183
+ "updated_at",
184
+ "closed_at",
185
+ "user",
186
+ "assignees",
187
+ "labels",
188
+ "milestone",
189
+ "comments",
190
+ ]);
191
+ }),
192
+ action("get_pull_request", "查看 Pull Request", "查看单个 GitHub Pull Request;params: owner, repo, pull_number。", async (ctx) => {
193
+ const owner = pathSegmentParam(ctx.params, "owner", { required: true, maxLength: 100 });
194
+ const repo = pathSegmentParam(ctx.params, "repo", { required: true, maxLength: 100 });
195
+ const number = intParam(ctx.params, "pull_number", 0, Number.MAX_SAFE_INTEGER);
196
+ return pick(await request(ctx, `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/pulls/${number}`, { headers: githubHeaders(ctx.token) }), [
197
+ "number",
198
+ "title",
199
+ "body",
200
+ "state",
201
+ "draft",
202
+ "merged",
203
+ "mergeable",
204
+ "html_url",
205
+ "created_at",
206
+ "updated_at",
207
+ "closed_at",
208
+ "merged_at",
209
+ "user",
210
+ "assignees",
211
+ "requested_reviewers",
212
+ "labels",
213
+ "head",
214
+ "base",
215
+ "commits",
216
+ "additions",
217
+ "deletions",
218
+ "changed_files",
219
+ ]);
220
+ }),
221
+ action("create_issue", "创建 Issue", "创建 GitHub Issue;params: owner, repo, title, 可选 body;执行前始终审批。", async (ctx) => {
222
+ const owner = pathSegmentParam(ctx.params, "owner", { required: true, maxLength: 100 });
223
+ const repo = pathSegmentParam(ctx.params, "repo", { required: true, maxLength: 100 });
224
+ const title = stringParam(ctx.params, "title", { required: true, maxLength: 256 });
225
+ const body = stringParam(ctx.params, "body", { maxLength: 20_000 });
226
+ const data = await request(ctx, `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/issues`, {
227
+ method: "POST",
228
+ headers: githubHeaders(ctx.token),
229
+ body: { title, ...(body ? { body } : {}) },
230
+ });
231
+ return pick(data, ["number", "title", "state", "html_url", "created_at"]);
232
+ }, "write"),
233
+ ],
234
+ };
235
+ const gitlab = {
236
+ id: "gitlab",
237
+ displayName: "GitLab",
238
+ tokenLabel: "Personal access token",
239
+ tokenPlaceholder: "glpat-…",
240
+ async validate(context) {
241
+ const data = await request(context, "https://gitlab.com/api/v4/user", {
242
+ headers: { "PRIVATE-TOKEN": context.token },
243
+ });
244
+ return identity(data, ["id"], ["username", "name"], ["name", "email"]);
245
+ },
246
+ actions: [
247
+ action("list_projects", "列出项目", "列出当前 Token 可访问的 GitLab 项目。", async (ctx) => {
248
+ const url = new URL("https://gitlab.com/api/v4/projects");
249
+ url.searchParams.set("membership", "true");
250
+ url.searchParams.set("simple", "true");
251
+ url.searchParams.set("per_page", String(intParam(ctx.params, "limit", 30, 100)));
252
+ const data = await request(ctx, url, { headers: { "PRIVATE-TOKEN": ctx.token } });
253
+ return {
254
+ projects: compactList(data, [
255
+ "id",
256
+ "name",
257
+ "path_with_namespace",
258
+ "description",
259
+ "visibility",
260
+ "default_branch",
261
+ "web_url",
262
+ "last_activity_at",
263
+ ], 100),
264
+ };
265
+ }),
266
+ action("list_issues", "列出 Issue", "列出当前用户可见的 GitLab Issue。", async (ctx) => {
267
+ const url = new URL("https://gitlab.com/api/v4/issues");
268
+ url.searchParams.set("scope", "assigned_to_me");
269
+ url.searchParams.set("per_page", String(intParam(ctx.params, "limit", 30, 100)));
270
+ const data = await request(ctx, url, { headers: { "PRIVATE-TOKEN": ctx.token } });
271
+ return {
272
+ issues: compactList(data, [
273
+ "id",
274
+ "iid",
275
+ "project_id",
276
+ "title",
277
+ "state",
278
+ "web_url",
279
+ "created_at",
280
+ "updated_at",
281
+ "labels",
282
+ ], 100),
283
+ };
284
+ }),
285
+ ],
286
+ };
287
+ const figma = {
288
+ id: "figma",
289
+ displayName: "Figma",
290
+ tokenLabel: "Personal access token",
291
+ tokenPlaceholder: "figd_…",
292
+ async validate(context) {
293
+ const data = await request(context, "https://api.figma.com/v1/me", {
294
+ headers: { "X-Figma-Token": context.token },
295
+ });
296
+ return identity(data, ["id"], ["handle", "email"], ["email"]);
297
+ },
298
+ actions: [
299
+ action("get_file", "读取文件摘要", "用 file_url_or_key 读取 Figma 文件名称、版本和第一页结构摘要。", async (ctx) => {
300
+ const fileKey = figmaFileKey(ctx.params);
301
+ const url = new URL(`https://api.figma.com/v1/files/${encodeURIComponent(fileKey)}`);
302
+ url.searchParams.set("depth", "1");
303
+ const data = asRecord(await request(ctx, url, { headers: { "X-Figma-Token": ctx.token } })) ?? {};
304
+ const document = asRecord(data.document);
305
+ return {
306
+ name: data.name,
307
+ lastModified: data.lastModified,
308
+ version: data.version,
309
+ role: data.role,
310
+ pages: compactList(document?.children, ["id", "name", "type"], 100),
311
+ };
312
+ }),
313
+ action("get_comments", "读取评论", "用 file_url_or_key 读取 Figma 文件评论。", async (ctx) => {
314
+ const fileKey = figmaFileKey(ctx.params);
315
+ const data = asRecord(await request(ctx, `https://api.figma.com/v1/files/${encodeURIComponent(fileKey)}/comments`, { headers: { "X-Figma-Token": ctx.token } })) ?? {};
316
+ return {
317
+ comments: compactList(data.comments, ["id", "message", "created_at", "resolved_at", "user", "client_meta"], 100),
318
+ };
319
+ }),
320
+ ],
321
+ };
322
+ function figmaFileKey(params) {
323
+ const value = stringParam(params, "file_url_or_key", { maxLength: 1_000 }) ??
324
+ stringParam(params, "file_key", { maxLength: 200 });
325
+ if (!value)
326
+ throw new Error("Missing required Link Action parameter: file_url_or_key");
327
+ if (!/^https?:\/\//i.test(value))
328
+ return assertPathSegment(value, "file_url_or_key");
329
+ let url;
330
+ try {
331
+ url = new URL(value);
332
+ }
333
+ catch {
334
+ throw new Error("file_url_or_key must be a Figma URL or file key");
335
+ }
336
+ if (url.hostname !== "figma.com" && !url.hostname.endsWith(".figma.com")) {
337
+ throw new Error("file_url_or_key must use figma.com");
338
+ }
339
+ const match = url.pathname.match(/\/(?:file|design|board)\/([^/]+)/);
340
+ if (!match?.[1])
341
+ throw new Error("Could not find a Figma file key in the URL");
342
+ return assertPathSegment(decodeURIComponent(match[1]), "file_url_or_key");
343
+ }
344
+ const notionHeaders = (token) => ({
345
+ ...bearer(token),
346
+ "Notion-Version": NOTION_API_VERSION,
347
+ });
348
+ const notion = {
349
+ id: "notion",
350
+ displayName: "Notion",
351
+ tokenLabel: "Internal integration token",
352
+ tokenPlaceholder: "ntn_… / secret_…",
353
+ async validate(context) {
354
+ const data = await request(context, "https://api.notion.com/v1/users/me", {
355
+ headers: notionHeaders(context.token),
356
+ });
357
+ const record = asRecord(data) ?? {};
358
+ const bot = asRecord(record.bot);
359
+ return {
360
+ externalAccountId: String(record.id ?? "bot"),
361
+ label: firstString(record.name, bot?.owner && "Notion integration") ?? "Notion integration",
362
+ detail: firstString(record.type),
363
+ };
364
+ },
365
+ actions: [
366
+ action("search", "搜索页面和数据库", "搜索已授权给该 Integration 的 Notion 页面和数据库。", async (ctx) => {
367
+ const query = stringParam(ctx.params, "query", { maxLength: 200 });
368
+ const data = asRecord(await request(ctx, "https://api.notion.com/v1/search", {
369
+ method: "POST",
370
+ headers: notionHeaders(ctx.token),
371
+ body: {
372
+ page_size: intParam(ctx.params, "limit", 30, 100),
373
+ ...(query ? { query } : {}),
374
+ },
375
+ })) ?? {};
376
+ return {
377
+ results: asArray(data.results)
378
+ .slice(0, 100)
379
+ .map((value) => pick(value, [
380
+ "object",
381
+ "id",
382
+ "url",
383
+ "created_time",
384
+ "last_edited_time",
385
+ "archived",
386
+ "parent",
387
+ "properties",
388
+ "title",
389
+ ])),
390
+ has_more: data.has_more,
391
+ next_cursor: data.next_cursor,
392
+ };
393
+ }),
394
+ action("get_page", "读取页面属性", "读取 Notion 页面属性;params: page_id。", async (ctx) => {
395
+ const pageId = pathSegmentParam(ctx.params, "page_id", { required: true, maxLength: 100 });
396
+ return pick(await request(ctx, `https://api.notion.com/v1/pages/${encodeURIComponent(pageId)}`, {
397
+ headers: notionHeaders(ctx.token),
398
+ }), [
399
+ "object",
400
+ "id",
401
+ "url",
402
+ "created_time",
403
+ "last_edited_time",
404
+ "archived",
405
+ "parent",
406
+ "properties",
407
+ ]);
408
+ }),
409
+ ],
410
+ };
411
+ async function linearGraphql(context, query, variables = {}) {
412
+ const response = asRecord(await request(context, "https://api.linear.app/graphql", {
413
+ method: "POST",
414
+ headers: { Authorization: context.token },
415
+ body: { query, variables },
416
+ })) ?? {};
417
+ if (asArray(response.errors).length)
418
+ throw new Error(`Linear GraphQL request failed: ${JSON.stringify(response.errors).slice(0, 300)}`);
419
+ return asRecord(response.data) ?? {};
420
+ }
421
+ const linear = {
422
+ id: "linear",
423
+ displayName: "Linear",
424
+ tokenLabel: "Personal API key",
425
+ tokenPlaceholder: "lin_api_…",
426
+ async validate(context) {
427
+ const data = await linearGraphql(context, "query { viewer { id name displayName email } }");
428
+ const viewer = asRecord(data.viewer) ?? {};
429
+ return identity(viewer, ["id"], ["displayName", "name", "email"], ["email"]);
430
+ },
431
+ actions: [
432
+ action("list_issues", "列出 Issue", "列出分配给当前 Linear 用户的 Issue。", async (ctx) => {
433
+ const first = intParam(ctx.params, "limit", 30, 50);
434
+ const data = await linearGraphql(ctx, "query Issues($first: Int!) { viewer { assignedIssues(first: $first) { nodes { id identifier title description priority url createdAt updatedAt state { name type } team { key name } } } } }", { first });
435
+ const viewer = asRecord(data.viewer);
436
+ const assigned = asRecord(viewer?.assignedIssues);
437
+ return { issues: asArray(assigned?.nodes).slice(0, 50) };
438
+ }),
439
+ action("list_teams", "列出团队", "列出当前 Linear 工作区中的团队。", async (ctx) => {
440
+ const data = await linearGraphql(ctx, "query { teams(first: 50) { nodes { id key name description } } }");
441
+ return { teams: asArray(asRecord(data.teams)?.nodes).slice(0, 50) };
442
+ }),
443
+ ],
444
+ };
445
+ async function slackRequest(context, endpoint, body) {
446
+ const data = asRecord(await request(context, `https://slack.com/api/${endpoint}`, {
447
+ method: "POST",
448
+ body: body ?? {},
449
+ })) ?? {};
450
+ if (data.ok !== true)
451
+ throw new Error(`Slack API request failed: ${firstString(data.error) ?? "unknown_error"}`);
452
+ return data;
453
+ }
454
+ const slack = {
455
+ id: "slack",
456
+ displayName: "Slack",
457
+ tokenLabel: "Bot or user token",
458
+ tokenPlaceholder: "xoxb-… / xoxp-…",
459
+ async validate(context) {
460
+ const data = await slackRequest(context, "auth.test");
461
+ return {
462
+ externalAccountId: firstString(data.user_id, data.bot_id, data.team_id) ?? "slack",
463
+ label: firstString(data.user, data.team) ?? "Slack",
464
+ detail: firstString(data.team, data.url),
465
+ };
466
+ },
467
+ actions: [
468
+ action("list_channels", "列出频道", "列出 Token 可访问的 Slack 频道。", async (ctx) => {
469
+ const data = await slackRequest(ctx, "conversations.list", {
470
+ limit: String(intParam(ctx.params, "limit", 50, 200)),
471
+ exclude_archived: "true",
472
+ });
473
+ return {
474
+ channels: compactList(data.channels, ["id", "name", "is_private", "is_member", "topic", "purpose", "num_members"], 200),
475
+ next_cursor: asRecord(data.response_metadata)?.next_cursor,
476
+ };
477
+ }),
478
+ action("get_channel_history", "读取频道消息", "读取 Slack 频道最近消息;params: channel, 可选 limit(最多 15)。", async (ctx) => {
479
+ const channel = stringParam(ctx.params, "channel", { required: true, maxLength: 100 });
480
+ const data = await slackRequest(ctx, "conversations.history", {
481
+ channel,
482
+ limit: String(intParam(ctx.params, "limit", 15, 15)),
483
+ });
484
+ return {
485
+ messages: compactList(data.messages, ["type", "user", "text", "ts", "thread_ts", "reply_count", "files"], 100),
486
+ has_more: data.has_more,
487
+ };
488
+ }),
489
+ ],
490
+ };
491
+ const sentry = {
492
+ id: "sentry",
493
+ displayName: "Sentry",
494
+ tokenLabel: "User auth token",
495
+ tokenPlaceholder: "sntrys_…",
496
+ async validate(context) {
497
+ const data = await request(context, "https://sentry.io/api/0/organizations/");
498
+ const organizations = asArray(data);
499
+ const first = asRecord(organizations[0]);
500
+ return {
501
+ externalAccountId: firstString(first?.id, first?.slug) ?? "sentry-token",
502
+ label: organizations.length > 0
503
+ ? `${firstString(first?.name, first?.slug) ?? "Sentry"} · ${organizations.length} org`
504
+ : "Sentry token",
505
+ };
506
+ },
507
+ actions: [
508
+ action("list_organizations", "列出组织", "列出当前 Sentry Token 可访问的组织。", async (ctx) => ({
509
+ organizations: compactList(await request(ctx, "https://sentry.io/api/0/organizations/"), ["id", "slug", "name", "status", "dateCreated", "isEarlyAdopter"], 100),
510
+ })),
511
+ action("list_projects", "列出项目", "列出 Sentry 组织项目;params: organization。", async (ctx) => {
512
+ const org = pathSegmentParam(ctx.params, "organization", {
513
+ required: true,
514
+ maxLength: 100,
515
+ });
516
+ return {
517
+ projects: compactList(await request(ctx, `https://sentry.io/api/0/organizations/${encodeURIComponent(org)}/projects/`), ["id", "slug", "name", "platform", "dateCreated", "isBookmarked"], 100),
518
+ };
519
+ }),
520
+ ],
521
+ };
522
+ const airtable = {
523
+ id: "airtable",
524
+ displayName: "Airtable",
525
+ tokenLabel: "Personal access token",
526
+ tokenPlaceholder: "pat…",
527
+ async validate(context) {
528
+ const root = asRecord(await request(context, "https://api.airtable.com/v0/meta/bases")) ?? {};
529
+ const bases = asArray(root.bases);
530
+ const first = asRecord(bases[0]);
531
+ return {
532
+ externalAccountId: firstString(first?.id) ?? "airtable-token",
533
+ label: bases.length > 0
534
+ ? `Airtable · ${bases.length} base${bases.length === 1 ? "" : "s"}`
535
+ : "Airtable token",
536
+ };
537
+ },
538
+ actions: [
539
+ action("list_bases", "列出 Base", "列出当前 Airtable PAT 可访问的 Base。", async (ctx) => {
540
+ const data = asRecord(await request(ctx, "https://api.airtable.com/v0/meta/bases")) ?? {};
541
+ return {
542
+ bases: compactList(data.bases, ["id", "name", "permissionLevel"], 100),
543
+ offset: data.offset,
544
+ };
545
+ }),
546
+ action("list_tables", "列出数据表", "列出 Airtable 表与字段;params: base_id。", async (ctx) => {
547
+ const baseId = pathSegmentParam(ctx.params, "base_id", { required: true, maxLength: 100 });
548
+ const data = asRecord(await request(ctx, `https://api.airtable.com/v0/meta/bases/${encodeURIComponent(baseId)}/tables`)) ?? {};
549
+ return {
550
+ tables: asArray(data.tables)
551
+ .slice(0, 100)
552
+ .map((value) => pick(value, ["id", "name", "primaryFieldId", "fields", "views"])),
553
+ };
554
+ }),
555
+ ],
556
+ };
557
+ const todoist = {
558
+ id: "todoist",
559
+ displayName: "Todoist",
560
+ tokenLabel: "Developer API token",
561
+ tokenPlaceholder: "Todoist API token",
562
+ async validate(context) {
563
+ const data = await request(context, "https://api.todoist.com/api/v1/user");
564
+ return identity(data, ["id"], ["full_name", "email"], ["email"]);
565
+ },
566
+ actions: [
567
+ action("list_projects", "列出项目", "列出当前 Todoist Token 可访问的项目。", async (ctx) => {
568
+ const root = asRecord(await request(ctx, "https://api.todoist.com/api/v1/projects"));
569
+ const data = root?.results ?? root ?? [];
570
+ return {
571
+ projects: compactList(data, ["id", "name", "color", "is_shared", "is_favorite", "is_archived", "url"], 100),
572
+ };
573
+ }),
574
+ action("list_tasks", "列出任务", "列出当前 Todoist 用户的未完成任务。", async (ctx) => {
575
+ const url = new URL("https://api.todoist.com/api/v1/tasks");
576
+ url.searchParams.set("limit", String(intParam(ctx.params, "limit", 50, 100)));
577
+ const root = asRecord(await request(ctx, url));
578
+ const data = root?.results ?? root ?? [];
579
+ return {
580
+ tasks: compactList(data, ["id", "content", "description", "project_id", "priority", "due", "labels", "url"], 100),
581
+ next_cursor: root?.next_cursor,
582
+ };
583
+ }),
584
+ ],
585
+ };
586
+ const vercel = {
587
+ id: "vercel",
588
+ displayName: "Vercel",
589
+ tokenLabel: "Access token",
590
+ tokenPlaceholder: "Vercel access token",
591
+ async validate(context) {
592
+ const root = asRecord(await request(context, "https://api.vercel.com/v2/user")) ?? {};
593
+ return identity(root.user, ["id", "uid"], ["name", "username", "email"], ["email"]);
594
+ },
595
+ actions: [
596
+ action("list_projects", "列出项目", "列出当前 Vercel Token 可访问的项目。", async (ctx) => {
597
+ const url = new URL("https://api.vercel.com/v10/projects");
598
+ url.searchParams.set("limit", String(intParam(ctx.params, "limit", 50, 100)));
599
+ const teamId = stringParam(ctx.params, "team_id", { maxLength: 100 });
600
+ if (teamId)
601
+ url.searchParams.set("teamId", teamId);
602
+ const root = asRecord(await request(ctx, url)) ?? {};
603
+ return {
604
+ projects: compactList(root.projects, ["id", "name", "framework", "updatedAt", "createdAt", "latestDeployments"], 100),
605
+ pagination: root.pagination,
606
+ };
607
+ }),
608
+ action("list_deployments", "列出部署", "列出当前 Vercel Token 可访问的部署。", async (ctx) => {
609
+ const url = new URL("https://api.vercel.com/v7/deployments");
610
+ url.searchParams.set("limit", String(intParam(ctx.params, "limit", 50, 100)));
611
+ const teamId = stringParam(ctx.params, "team_id", { maxLength: 100 });
612
+ if (teamId)
613
+ url.searchParams.set("teamId", teamId);
614
+ const root = asRecord(await request(ctx, url)) ?? {};
615
+ return {
616
+ deployments: compactList(root.deployments, ["uid", "name", "url", "state", "target", "created", "ready", "meta"], 100),
617
+ pagination: root.pagination,
618
+ };
619
+ }),
620
+ ],
621
+ };
622
+ export const LOCAL_LINK_PROVIDERS = [
623
+ github,
624
+ gitlab,
625
+ figma,
626
+ notion,
627
+ linear,
628
+ slack,
629
+ sentry,
630
+ airtable,
631
+ todoist,
632
+ vercel,
633
+ ];
634
+ export function getLocalLinkProvider(providerId) {
635
+ return LOCAL_LINK_PROVIDERS.find((provider) => provider.id === providerId);
636
+ }
637
+ export function listLocalLinkProviders() {
638
+ return LOCAL_LINK_PROVIDERS.map((provider) => ({
639
+ id: provider.id,
640
+ displayName: provider.displayName,
641
+ tokenLabel: provider.tokenLabel,
642
+ tokenPlaceholder: provider.tokenPlaceholder,
643
+ actions: provider.actions.map(({ id, title, description, risk }) => ({
644
+ id,
645
+ title,
646
+ description,
647
+ risk,
648
+ })),
649
+ }));
650
+ }
651
+ export async function validateLocalLinkToken(providerId, token, options = {}) {
652
+ const provider = getLocalLinkProvider(providerId);
653
+ if (!provider)
654
+ throw new Error(`Unknown local Link provider: ${providerId}`);
655
+ const trimmed = token.trim();
656
+ if (!trimmed)
657
+ throw new Error("Token is required");
658
+ const identity = await provider.validate({ token: trimmed, ...options });
659
+ return {
660
+ providerId,
661
+ identity,
662
+ capabilityIds: provider.actions.map((actionSpec) => `${providerId}.${actionSpec.id}`),
663
+ verifiedAt: new Date().toISOString(),
664
+ };
665
+ }