@xopcai/xopc 0.0.103 → 0.0.105

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 (950) hide show
  1. package/README.md +7 -4
  2. package/README.zh-CN.md +7 -4
  3. package/dist/_virtual/_rolldown/runtime.js +2 -3
  4. package/dist/browser-ext/manifest.json +1 -1
  5. package/dist/extensions/feishu/src/adapters/cli-login.d.ts +1 -1
  6. package/dist/extensions/feishu/src/adapters/cli-login.js +1 -1
  7. package/dist/extensions/feishu/src/adapters/cli-login.js.map +1 -1
  8. package/dist/extensions/feishu/src/adapters/gateway-setup.d.ts +2 -0
  9. package/dist/extensions/feishu/src/adapters/gateway-setup.js +225 -0
  10. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -0
  11. package/dist/extensions/feishu/src/index.d.ts +8 -1
  12. package/dist/extensions/feishu/src/index.js +14 -1
  13. package/dist/extensions/feishu/src/index.js.map +1 -0
  14. package/dist/extensions/feishu/src/outbound/outbound-adapter.js +1 -1
  15. package/dist/extensions/feishu/src/plugin.d.ts +2 -1
  16. package/dist/extensions/feishu/src/plugin.js +2 -0
  17. package/dist/extensions/feishu/src/plugin.js.map +1 -1
  18. package/dist/extensions/feishu/src/streaming/streaming-adapter.js +1 -1
  19. package/dist/extensions/feishu/src/transport/webhook/monitor.js +1 -1
  20. package/dist/extensions/feishu/xopc.extension.json +66 -1
  21. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  24. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  25. package/dist/extensions/telegram/src/command-handler.js +1 -2
  26. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  27. package/dist/extensions/telegram/src/config-schema.js +2 -2
  28. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  29. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  30. package/dist/extensions/telegram/src/doctor.js +68 -0
  31. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  32. package/dist/extensions/telegram/src/index.d.ts +8 -1
  33. package/dist/extensions/telegram/src/index.js +15 -2
  34. package/dist/extensions/telegram/src/index.js.map +1 -0
  35. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  36. package/dist/extensions/telegram/src/plugin.js +32 -12
  37. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  38. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  39. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  40. package/dist/extensions/telegram/xopc.extension.json +412 -5
  41. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  42. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  43. package/dist/extensions/weixin/src/api/api.js +1 -1
  44. package/dist/extensions/weixin/src/index.d.ts +8 -0
  45. package/dist/extensions/weixin/src/index.js +12 -1
  46. package/dist/extensions/weixin/src/index.js.map +1 -0
  47. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  48. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  49. package/dist/extensions/weixin/src/plugin.js +77 -2
  50. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  51. package/dist/extensions/weixin/xopc.extension.json +52 -0
  52. package/dist/gateway/static/root/assets/agents-XzgIVKcI.js +396 -0
  53. package/dist/gateway/static/root/assets/{apps-page-C5RmwmTT.js → apps-page-B7Us3RMl.js} +1 -1
  54. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  55. package/dist/gateway/static/root/assets/channels-settings-BgeV6fzw.js +1 -0
  56. package/dist/gateway/static/root/assets/cron-page-DKGHEeAU.js +1 -0
  57. package/dist/gateway/static/root/assets/{dist-CWm8hTXZ.js → dist-DJDkNhu5.js} +1 -1
  58. package/dist/gateway/static/root/assets/{extension-debug-page-BzYgTkS9.js → extension-debug-page-DI1XJTJi.js} +1 -1
  59. package/dist/gateway/static/root/assets/{extension-page-BmTZH6gL.js → extension-page-SuafGTT_.js} +1 -1
  60. package/dist/gateway/static/root/assets/extension-settings-page-cKmGax9v.js +1 -0
  61. package/dist/gateway/static/root/assets/{fetch-CMoWY2Si.js → fetch-CkvRO30i.js} +1 -1
  62. package/dist/gateway/static/root/assets/gateway-startup-retry-BkKyRDrF.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-CRiDcxtt.js +1 -0
  64. package/dist/gateway/static/root/assets/index-50FVtgXU.js +4845 -0
  65. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  66. package/dist/gateway/static/root/assets/{logs-page-BjdQjHwk.js → logs-page-DM8o5-Bm.js} +2 -2
  67. package/dist/gateway/static/root/assets/{note-detail-page-8Er4197b.js → note-detail-page-j53jtvq9.js} +53 -53
  68. package/dist/gateway/static/root/assets/{note-time-CF3vf1jm.js → note-time-Ck2H2Qpw.js} +1 -1
  69. package/dist/gateway/static/root/assets/notes-page-CsWIw35Q.js +1 -0
  70. package/dist/gateway/static/root/assets/schema-form-BvmGNxiJ.js +1 -0
  71. package/dist/gateway/static/root/assets/sessions-page-CLPsbyOW.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-DRdayl8P.js +2 -0
  73. package/dist/gateway/static/root/assets/{settings-form-section-C7qA7y0J.js → settings-form-section-BlIYg2gZ.js} +1 -1
  74. package/dist/gateway/static/root/assets/settings-page-CRGHT_bm.js +3 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-Tvr5Mtq5.js → share-preview-page-BlT6Akvk.js} +1 -1
  76. package/dist/gateway/static/root/assets/skills-page-Ce-RIH2y.js +2 -0
  77. package/dist/gateway/static/root/assets/{theme-store-HTvJlFLL.js → theme-store-DYgVdRB4.js} +1 -1
  78. package/dist/gateway/static/root/assets/url-DPEStU4M.js +3 -0
  79. package/dist/gateway/static/root/assets/voice-api-key-field-CJGTidqc.js +1 -0
  80. package/dist/gateway/static/root/assets/{workflow-page.utils-CeBkAjP7.js → workflow-page.utils-_sjXCMvi.js} +1 -1
  81. package/dist/gateway/static/root/assets/workflows-page-o63aaARK.js +27 -0
  82. package/dist/gateway/static/root/index.html +6 -5
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-manager.d.ts +18 -6
  85. package/dist/src/agent/agent-manager.js +60 -35
  86. package/dist/src/agent/agent-manager.js.map +1 -1
  87. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  88. package/dist/src/agent/builtin-agent-ids.js +17 -0
  89. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  90. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  91. package/dist/src/agent/child-agent-factory.js +28 -8
  92. package/dist/src/agent/child-agent-factory.js.map +1 -1
  93. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  94. package/dist/src/agent/embedded/run-turn.js +8 -2
  95. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  96. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  97. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  98. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  99. package/dist/src/agent/embedded/types.d.ts +36 -35
  100. package/dist/src/agent/fallback/candidates.js +1 -1
  101. package/dist/src/agent/fallback/candidates.js.map +1 -1
  102. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  103. package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -0
  104. package/dist/src/agent/inbound/turn-dispatcher.js +25 -5
  105. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  106. package/dist/src/agent/models/manager.d.ts +1 -1
  107. package/dist/src/agent/models/manager.js +1 -1
  108. package/dist/src/agent/models/manager.js.map +1 -1
  109. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  110. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  111. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  112. package/dist/src/agent/prompt/memory/index.js +30 -2
  113. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  114. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  115. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  116. package/dist/src/agent/service/direct-turn-helpers.d.ts +3 -0
  117. package/dist/src/agent/service/direct-turn-helpers.js +6 -3
  118. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  119. package/dist/src/agent/service/process-direct-streaming.d.ts +3 -0
  120. package/dist/src/agent/service/process-direct-streaming.js +50 -19
  121. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  122. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  123. package/dist/src/agent/service-inbound-utils.js +1 -17
  124. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  125. package/dist/src/agent/service.d.ts +4 -4
  126. package/dist/src/agent/service.js +29 -16
  127. package/dist/src/agent/service.js.map +1 -1
  128. package/dist/src/agent/service.types.d.ts +3 -0
  129. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  130. package/dist/src/agent/session/session-config-service.js +9 -1
  131. package/dist/src/agent/session/session-config-service.js.map +1 -1
  132. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  133. package/dist/src/agent/session/session-inspector.js +4 -0
  134. package/dist/src/agent/session/session-inspector.js.map +1 -1
  135. package/dist/src/agent/skills/config.js +1 -3
  136. package/dist/src/agent/skills/config.js.map +1 -1
  137. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  138. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  139. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  140. package/dist/src/agent/skills/index.js +20 -5
  141. package/dist/src/agent/skills/index.js.map +1 -1
  142. package/dist/src/agent/skills/installer.js +14 -27
  143. package/dist/src/agent/skills/installer.js.map +1 -1
  144. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  145. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  146. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  147. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  148. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  149. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  150. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  151. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  152. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  153. package/dist/src/agent/skills/skill-manager.js +3 -3
  154. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  155. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  156. package/dist/src/agent/skills/skill-view-path.js +3 -66
  157. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  158. package/dist/src/agent/skills/test-framework.js +2 -3
  159. package/dist/src/agent/skills/test-framework.js.map +1 -1
  160. package/dist/src/agent/source-context/index.d.ts +2 -0
  161. package/dist/src/agent/source-context/index.js +3 -0
  162. package/dist/src/agent/source-context/injector.d.ts +3 -0
  163. package/dist/src/agent/source-context/injector.js +36 -0
  164. package/dist/src/agent/source-context/injector.js.map +1 -0
  165. package/dist/src/agent/source-context/types.d.ts +19 -0
  166. package/dist/src/agent/source-context/types.js +10 -0
  167. package/dist/src/agent/source-context/types.js.map +1 -0
  168. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  169. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  170. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  171. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  172. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  173. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  174. package/dist/src/agent/tool-manuals/index.js +28 -0
  175. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  176. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  177. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  178. package/dist/src/agent/tools/factory.js +2 -0
  179. package/dist/src/agent/tools/factory.js.map +1 -1
  180. package/dist/src/agent/tools/index.d.ts +1 -0
  181. package/dist/src/agent/tools/index.js +2 -1
  182. package/dist/src/agent/tools/skills-tools.js +37 -8
  183. package/dist/src/agent/tools/skills-tools.js.map +1 -1
  184. package/dist/src/agent/tools/tool-manual-tool.d.ts +6 -0
  185. package/dist/src/agent/tools/tool-manual-tool.js +34 -0
  186. package/dist/src/agent/tools/tool-manual-tool.js.map +1 -0
  187. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  188. package/dist/src/agent/workflow/catalog.js +66 -25
  189. package/dist/src/agent/workflow/catalog.js.map +1 -1
  190. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  191. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  192. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  193. package/dist/src/agent/workflow/types.d.ts +10 -0
  194. package/dist/src/auth/credentials.js +10 -5
  195. package/dist/src/auth/credentials.js.map +1 -1
  196. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  197. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  198. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  199. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  200. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  201. package/dist/src/channels/dock.d.ts +0 -7
  202. package/dist/src/channels/dock.js +1 -21
  203. package/dist/src/channels/index.d.ts +1 -3
  204. package/dist/src/channels/index.js +1 -5
  205. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  206. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  207. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  208. package/dist/src/channels/manager.d.ts +1 -0
  209. package/dist/src/channels/manager.js +3 -0
  210. package/dist/src/channels/manager.js.map +1 -1
  211. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  212. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  213. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  214. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  215. package/dist/src/channels/pairing/pairing-service.js +8 -27
  216. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  217. package/dist/src/channels/plugin-types.d.ts +3 -1
  218. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  219. package/dist/src/channels/telegram/index.js +1 -1
  220. package/dist/src/chat-commands/builtins/config.js +4 -4
  221. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  222. package/dist/src/chat-commands/config-paths.js +1 -1
  223. package/dist/src/chat-commands/config-paths.js.map +1 -1
  224. package/dist/src/chat-commands/context.js +1 -1
  225. package/dist/src/chat-commands/context.js.map +1 -1
  226. package/dist/src/cli/bin.js +1 -1
  227. package/dist/src/cli/command-manifest.js +1 -1
  228. package/dist/src/cli/command-manifest.js.map +1 -1
  229. package/dist/src/cli/commands/agent.js +2 -2
  230. package/dist/src/cli/commands/agent.js.map +1 -1
  231. package/dist/src/cli/commands/agents.js +2 -4
  232. package/dist/src/cli/commands/agents.js.map +1 -1
  233. package/dist/src/cli/commands/auth.js +1 -1
  234. package/dist/src/cli/commands/channels.d.ts +1 -5
  235. package/dist/src/cli/commands/channels.js +115 -281
  236. package/dist/src/cli/commands/channels.js.map +1 -1
  237. package/dist/src/cli/commands/config.js +2 -2
  238. package/dist/src/cli/commands/config.js.map +1 -1
  239. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  240. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  241. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  242. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  243. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  244. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  246. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  247. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  248. package/dist/src/cli/commands/extension-dev.js +2 -1
  249. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  250. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  251. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  252. package/dist/src/cli/commands/extension-pack.js +2 -1
  253. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  254. package/dist/src/cli/commands/models.js +7 -4
  255. package/dist/src/cli/commands/models.js.map +1 -1
  256. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  257. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  258. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  259. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  260. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  261. package/dist/src/cli/commands/onboard/model.js +8 -5
  262. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  263. package/dist/src/cli/commands/onboard.js +4 -6
  264. package/dist/src/cli/commands/onboard.js.map +1 -1
  265. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  266. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  267. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  268. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  269. package/dist/src/cli/commands/tui.js +13 -5
  270. package/dist/src/cli/commands/tui.js.map +1 -1
  271. package/dist/src/cli/extension-cli-register.js +1 -1
  272. package/dist/src/commands/agents.config.d.ts +3 -3
  273. package/dist/src/commands/agents.config.js +7 -7
  274. package/dist/src/commands/agents.config.js.map +1 -1
  275. package/dist/src/config/agent-profile.d.ts +1 -1
  276. package/dist/src/config/agent-profile.js +6 -2
  277. package/dist/src/config/agent-profile.js.map +1 -1
  278. package/dist/src/config/agent-typed-models.d.ts +2 -2
  279. package/dist/src/config/agent-typed-models.js +13 -2
  280. package/dist/src/config/agent-typed-models.js.map +1 -1
  281. package/dist/src/config/index.js +3 -3
  282. package/dist/src/config/integration.d.ts +1 -1
  283. package/dist/src/config/loader.d.ts +0 -1
  284. package/dist/src/config/loader.js +4 -9
  285. package/dist/src/config/loader.js.map +1 -1
  286. package/dist/src/config/models-json.d.ts +6 -6
  287. package/dist/src/config/paths.d.ts +1 -0
  288. package/dist/src/config/paths.js +5 -1
  289. package/dist/src/config/paths.js.map +1 -1
  290. package/dist/src/config/rules.js +2 -12
  291. package/dist/src/config/rules.js.map +1 -1
  292. package/dist/src/config/schema.d.ts +74 -47
  293. package/dist/src/config/schema.js +28 -66
  294. package/dist/src/config/schema.js.map +1 -1
  295. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  296. package/dist/src/config/validate-channel-configs.js +29 -10
  297. package/dist/src/config/validate-channel-configs.js.map +1 -1
  298. package/dist/src/cron/executor.js +1 -4
  299. package/dist/src/cron/executor.js.map +1 -1
  300. package/dist/src/document-understanding/extract.d.ts +13 -0
  301. package/dist/src/document-understanding/extract.js +63 -0
  302. package/dist/src/document-understanding/extract.js.map +1 -0
  303. package/dist/src/extensions/activation-context.js +3 -1
  304. package/dist/src/extensions/activation-context.js.map +1 -1
  305. package/dist/src/extensions/activation-planner.js +12 -0
  306. package/dist/src/extensions/activation-planner.js.map +1 -1
  307. package/dist/src/extensions/api.d.ts +5 -1
  308. package/dist/src/extensions/api.js +12 -0
  309. package/dist/src/extensions/api.js.map +1 -1
  310. package/dist/src/extensions/discover-extensions.js +17 -13
  311. package/dist/src/extensions/discover-extensions.js.map +1 -1
  312. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  313. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  314. package/dist/src/extensions/index.js +12 -4
  315. package/dist/src/extensions/index.js.map +1 -0
  316. package/dist/src/extensions/loader.d.ts +5 -1
  317. package/dist/src/extensions/loader.js +12 -11
  318. package/dist/src/extensions/loader.js.map +1 -1
  319. package/dist/src/extensions/manifest-registry.js +98 -93
  320. package/dist/src/extensions/manifest-registry.js.map +1 -1
  321. package/dist/src/extensions/normalize-manifest.js +91 -15
  322. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  323. package/dist/src/extensions/sdk/index.js +1 -1
  324. package/dist/src/extensions/sdk/testing.js +4 -0
  325. package/dist/src/extensions/sdk/testing.js.map +1 -1
  326. package/dist/src/extensions/types/core.d.ts +32 -1
  327. package/dist/src/extensions/types/manifest.d.ts +60 -0
  328. package/dist/src/extensions/types/tui.d.ts +414 -5
  329. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  330. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  331. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  332. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  333. package/dist/src/gateway/agent-run-relay.js +10 -3
  334. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  335. package/dist/src/gateway/agents-admin.d.ts +32 -19
  336. package/dist/src/gateway/agents-admin.js +113 -93
  337. package/dist/src/gateway/agents-admin.js.map +1 -1
  338. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  339. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  340. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  341. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  342. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  343. package/dist/src/gateway/heartbeat/service.js +1 -1
  344. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  345. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  346. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  347. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  348. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  349. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/agents.js +83 -48
  351. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  352. package/dist/src/gateway/hono/routes/channels.js +134 -214
  353. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  354. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  355. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  356. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  357. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  359. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  360. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/config.js +5 -2
  362. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  364. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  365. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/notes.js +46 -27
  367. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  368. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  369. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  370. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  371. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  372. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  373. package/dist/src/gateway/hono/routes/tui.js +16 -0
  374. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  375. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  376. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  377. package/dist/src/gateway/hono/sse.d.ts +5 -7
  378. package/dist/src/gateway/hono/sse.js +21 -38
  379. package/dist/src/gateway/hono/sse.js.map +1 -1
  380. package/dist/src/gateway/protocol.js.map +1 -1
  381. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  382. package/dist/src/gateway/service/agent-runner.js +1 -1
  383. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  384. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  385. package/dist/src/gateway/service/marketplace-service.js +7 -4
  386. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  387. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  388. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  389. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  390. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  391. package/dist/src/gateway/service/sessions-api.js +12 -0
  392. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  393. package/dist/src/gateway/service.d.ts +6 -0
  394. package/dist/src/gateway/service.js +84 -57
  395. package/dist/src/gateway/service.js.map +1 -1
  396. package/dist/src/heartbeat/index.js +1 -1
  397. package/dist/src/notes/agent-context.d.ts +40 -0
  398. package/dist/src/notes/agent-context.js +383 -0
  399. package/dist/src/notes/agent-context.js.map +1 -0
  400. package/dist/src/notes/index.d.ts +2 -0
  401. package/dist/src/notes/index.js +2 -1
  402. package/dist/src/notes/service.d.ts +5 -0
  403. package/dist/src/notes/service.js +22 -0
  404. package/dist/src/notes/service.js.map +1 -1
  405. package/dist/src/notes/store.js +2 -0
  406. package/dist/src/notes/store.js.map +1 -1
  407. package/dist/src/project-trust/trust-store.d.ts +30 -0
  408. package/dist/src/project-trust/trust-store.js +194 -0
  409. package/dist/src/project-trust/trust-store.js.map +1 -0
  410. package/dist/src/providers/index.d.ts +1 -1
  411. package/dist/src/providers/index.js +18 -7
  412. package/dist/src/providers/index.js.map +1 -1
  413. package/dist/src/routing/resolve-route.d.ts +0 -3
  414. package/dist/src/routing/resolve-route.js.map +1 -1
  415. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  416. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  417. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  418. package/dist/src/session/client-history.d.ts +32 -0
  419. package/dist/src/session/client-history.js +232 -1
  420. package/dist/src/session/client-history.js.map +1 -1
  421. package/dist/src/session/manager.d.ts +37 -4
  422. package/dist/src/session/manager.js +39 -15
  423. package/dist/src/session/manager.js.map +1 -1
  424. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  425. package/dist/src/session/session-context-for-llm.js +105 -2
  426. package/dist/src/session/session-context-for-llm.js.map +1 -1
  427. package/dist/src/session/store.d.ts +37 -0
  428. package/dist/src/session/store.js +127 -2
  429. package/dist/src/session/store.js.map +1 -1
  430. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  431. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  432. package/dist/src/session/types.d.ts +14 -1
  433. package/dist/src/session/types.js.map +1 -1
  434. package/dist/src/storage/sqlite/index.d.ts +1 -0
  435. package/dist/src/storage/sqlite/index.js +2 -1
  436. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  437. package/dist/src/storage/sqlite/migrations/005_add_note_agent_contexts.sql +10 -0
  438. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  439. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  440. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  441. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  442. package/dist/src/storage/sqlite/note-agent-context-repository.d.ts +10 -0
  443. package/dist/src/storage/sqlite/note-agent-context-repository.js +35 -0
  444. package/dist/src/storage/sqlite/note-agent-context-repository.js.map +1 -0
  445. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  446. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  447. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  448. package/dist/src/storage/sqlite/schema.js +1 -1
  449. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  450. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  451. package/dist/src/storage/sqlite/session-repository.js +52 -25
  452. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  453. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  454. package/dist/src/tui/backends/embedded-backend.js +227 -39
  455. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  456. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  457. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  458. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  459. package/dist/src/tui/chat-history.d.ts +5 -1
  460. package/dist/src/tui/chat-history.js +78 -8
  461. package/dist/src/tui/chat-history.js.map +1 -1
  462. package/dist/src/tui/clipboard-text.d.ts +5 -0
  463. package/dist/src/tui/clipboard-text.js +46 -0
  464. package/dist/src/tui/clipboard-text.js.map +1 -0
  465. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  466. package/dist/src/tui/components/assistant-message.js +115 -9
  467. package/dist/src/tui/components/assistant-message.js.map +1 -1
  468. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  469. package/dist/src/tui/components/bash-execution.js +31 -3
  470. package/dist/src/tui/components/bash-execution.js.map +1 -1
  471. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  472. package/dist/src/tui/components/bash-summary.js +87 -0
  473. package/dist/src/tui/components/bash-summary.js.map +1 -0
  474. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  475. package/dist/src/tui/components/branch-message-summary.js +43 -0
  476. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  477. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  478. package/dist/src/tui/components/branch-summary.js +51 -0
  479. package/dist/src/tui/components/branch-summary.js.map +1 -0
  480. package/dist/src/tui/components/chat-log.d.ts +46 -6
  481. package/dist/src/tui/components/chat-log.js +183 -21
  482. package/dist/src/tui/components/chat-log.js.map +1 -1
  483. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  484. package/dist/src/tui/components/compaction-summary.js +46 -0
  485. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  486. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  487. package/dist/src/tui/components/custom-editor.js +2 -0
  488. package/dist/src/tui/components/custom-editor.js.map +1 -1
  489. package/dist/src/tui/components/custom-message.d.ts +23 -0
  490. package/dist/src/tui/components/custom-message.js +65 -0
  491. package/dist/src/tui/components/custom-message.js.map +1 -0
  492. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  493. package/dist/src/tui/components/extension-dialog.js +127 -0
  494. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  495. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  496. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  497. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  498. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  499. package/dist/src/tui/components/searchable-select-list.js +82 -10
  500. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  501. package/dist/src/tui/components/session-selector.d.ts +18 -4
  502. package/dist/src/tui/components/session-selector.js +207 -40
  503. package/dist/src/tui/components/session-selector.js.map +1 -1
  504. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  505. package/dist/src/tui/components/settings-selector.js +126 -7
  506. package/dist/src/tui/components/settings-selector.js.map +1 -1
  507. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  508. package/dist/src/tui/components/thinking-selector.js +48 -0
  509. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  510. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  511. package/dist/src/tui/components/tool-execution.js +378 -28
  512. package/dist/src/tui/components/tool-execution.js.map +1 -1
  513. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  514. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  515. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  516. package/dist/src/tui/components/tui-header.d.ts +9 -2
  517. package/dist/src/tui/components/tui-header.js +25 -5
  518. package/dist/src/tui/components/tui-header.js.map +1 -1
  519. package/dist/src/tui/components/user-message.d.ts +4 -2
  520. package/dist/src/tui/components/user-message.js +42 -9
  521. package/dist/src/tui/components/user-message.js.map +1 -1
  522. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  523. package/dist/src/tui/components/visual-truncate.js +27 -0
  524. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  525. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  526. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  527. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  528. package/dist/src/tui/extension-host/host.d.ts +31 -1
  529. package/dist/src/tui/extension-host/host.js +123 -6
  530. package/dist/src/tui/extension-host/host.js.map +1 -1
  531. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  532. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  533. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  534. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  535. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  536. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  537. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  538. package/dist/src/tui/extension-host/runtime.js +547 -85
  539. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  540. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  541. package/dist/src/tui/extension-host/surface.js +30 -6
  542. package/dist/src/tui/extension-host/surface.js.map +1 -1
  543. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  544. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  545. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  546. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  547. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  548. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  549. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  550. package/dist/src/tui/tui-agent-events.js +200 -59
  551. package/dist/src/tui/tui-agent-events.js.map +1 -1
  552. package/dist/src/tui/tui-backend.d.ts +169 -3
  553. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  554. package/dist/src/tui/tui-command-formatters.js +594 -0
  555. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  556. package/dist/src/tui/tui-commands.d.ts +57 -7
  557. package/dist/src/tui/tui-commands.js +639 -43
  558. package/dist/src/tui/tui-commands.js.map +1 -1
  559. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  560. package/dist/src/tui/tui-context-usage.js +9 -1
  561. package/dist/src/tui/tui-context-usage.js.map +1 -1
  562. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  563. package/dist/src/tui/tui-extension-user-message.js +32 -0
  564. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  565. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  566. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  567. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  568. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  569. package/dist/src/tui/tui-local-shell.js +50 -8
  570. package/dist/src/tui/tui-local-shell.js.map +1 -1
  571. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  572. package/dist/src/tui/tui-model-picker.js +152 -0
  573. package/dist/src/tui/tui-model-picker.js.map +1 -0
  574. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  575. package/dist/src/tui/tui-oauth-login.js +189 -0
  576. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  577. package/dist/src/tui/tui-overlays.d.ts +3 -3
  578. package/dist/src/tui/tui-overlays.js +6 -7
  579. package/dist/src/tui/tui-overlays.js.map +1 -1
  580. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  581. package/dist/src/tui/tui-picker-overlay.js +340 -30
  582. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  583. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  584. package/dist/src/tui/tui-picker-services.js +1 -0
  585. package/dist/src/tui/tui-run-state.d.ts +11 -0
  586. package/dist/src/tui/tui-run-state.js +114 -0
  587. package/dist/src/tui/tui-run-state.js.map +1 -0
  588. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  589. package/dist/src/tui/tui-runtime-hints.js +18 -0
  590. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  591. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  592. package/dist/src/tui/tui-scoped-models.js +2 -2
  593. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  594. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  595. package/dist/src/tui/tui-session-actions.js +21 -9
  596. package/dist/src/tui/tui-session-actions.js.map +1 -1
  597. package/dist/src/tui/tui-session-format.d.ts +4 -1
  598. package/dist/src/tui/tui-session-format.js +17 -3
  599. package/dist/src/tui/tui-session-format.js.map +1 -1
  600. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  601. package/dist/src/tui/tui-session-snapshot.js +184 -0
  602. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  603. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  604. package/dist/src/tui/tui-session-stats.js +59 -0
  605. package/dist/src/tui/tui-session-stats.js.map +1 -0
  606. package/dist/src/tui/tui-settings.d.ts +21 -0
  607. package/dist/src/tui/tui-settings.js +28 -1
  608. package/dist/src/tui/tui-settings.js.map +1 -1
  609. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  610. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  611. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  612. package/dist/src/tui/tui-startup-resources.js +39 -0
  613. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  614. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  615. package/dist/src/tui/tui-startup-text.js +58 -0
  616. package/dist/src/tui/tui-startup-text.js.map +1 -0
  617. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  618. package/dist/src/tui/tui-stdio-filter.js +11 -7
  619. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  620. package/dist/src/tui/tui-submit.d.ts +2 -0
  621. package/dist/src/tui/tui-submit.js +2 -1
  622. package/dist/src/tui/tui-submit.js.map +1 -1
  623. package/dist/src/tui/tui-tool-diff.js +61 -7
  624. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  625. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  626. package/dist/src/tui/tui-tool-result.js +74 -0
  627. package/dist/src/tui/tui-tool-result.js.map +1 -0
  628. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  629. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  630. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  631. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  632. package/dist/src/tui/tui-transcript-tree.js +316 -0
  633. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  634. package/dist/src/tui/tui-types.d.ts +25 -34
  635. package/dist/src/tui/tui-types.js +12 -0
  636. package/dist/src/tui/tui-types.js.map +1 -1
  637. package/dist/src/tui/tui.js +1288 -112
  638. package/dist/src/tui/tui.js.map +1 -1
  639. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  640. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  641. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  642. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  643. package/dist/src/workflows/domain/definition-utils.js +18 -8
  644. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  645. package/dist/src/workflows/domain/definition.d.ts +25 -0
  646. package/dist/src/workflows/domain/event.d.ts +1 -0
  647. package/dist/src/workflows/domain/result.d.ts +15 -0
  648. package/dist/src/workflows/domain/run.d.ts +2 -0
  649. package/dist/src/workflows/domain/run.js.map +1 -1
  650. package/dist/src/workflows/engine/projector.js +4 -0
  651. package/dist/src/workflows/engine/projector.js.map +1 -1
  652. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  653. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  654. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  655. package/dist/src/workflows/index.d.ts +1 -0
  656. package/dist/src/workflows/index.js +4 -1
  657. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  658. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  659. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  660. package/dist/src/workflows/registry/index.d.ts +2 -0
  661. package/dist/src/workflows/registry/index.js +2 -0
  662. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  663. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  664. package/dist/src/workflows/runtime/index.d.ts +2 -0
  665. package/dist/src/workflows/runtime/index.js +2 -1
  666. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  667. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  668. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  669. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  670. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  671. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  672. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  673. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  674. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  675. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  676. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  677. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  678. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  679. package/package.json +23 -17
  680. package/skills/creative/frontend-design/SKILL.md +1 -1
  681. package/skills/creative/theme-factory/SKILL.md +1 -1
  682. package/skills/documents/xlsx/SKILL.md +1 -1
  683. package/skills/engineering/diagnose/SKILL.md +2 -2
  684. package/skills/engineering/tdd/SKILL.md +1 -1
  685. package/skills/tools/github/SKILL.md +6 -1
  686. package/skills/tools/webapp-testing/SKILL.md +4 -1
  687. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  688. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  689. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  690. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  691. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  692. package/dist/gateway/static/root/assets/agents-BwXkia_W.js +0 -222
  693. package/dist/gateway/static/root/assets/channels-settings-tlOTdaXw.js +0 -1
  694. package/dist/gateway/static/root/assets/channels-status-swr-D4XjqwqC.js +0 -8
  695. package/dist/gateway/static/root/assets/cron-api-DcmfGuj0.js +0 -1
  696. package/dist/gateway/static/root/assets/cron-page-CijJ4G6F.js +0 -1
  697. package/dist/gateway/static/root/assets/extension-settings-page-CyJk_G64.js +0 -1
  698. package/dist/gateway/static/root/assets/field-primitives-C4GpxsDo.js +0 -1
  699. package/dist/gateway/static/root/assets/heartbeat-config-api-CLD0Gpi3.js +0 -1
  700. package/dist/gateway/static/root/assets/index-0HmunJW9.js +0 -4845
  701. package/dist/gateway/static/root/assets/index-Bk75Phrd.css +0 -1
  702. package/dist/gateway/static/root/assets/notes-page-BBnTh0uI.js +0 -1
  703. package/dist/gateway/static/root/assets/sessions-page-B0riYK7j.js +0 -1
  704. package/dist/gateway/static/root/assets/settings-advanced-gate-DiP_WHu_.js +0 -2
  705. package/dist/gateway/static/root/assets/settings-page-1ZPhcCZ9.js +0 -3
  706. package/dist/gateway/static/root/assets/skills-page-BQ1hllKD.js +0 -2
  707. package/dist/gateway/static/root/assets/url-F3_D_6zZ.js +0 -3
  708. package/dist/gateway/static/root/assets/utils-CPr3FBh2.js +0 -1
  709. package/dist/gateway/static/root/assets/voice-api-key-field-BkbDl6dH.js +0 -1
  710. package/dist/gateway/static/root/assets/workflows-page-D059ysoF.js +0 -27
  711. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  712. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  713. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  714. package/dist/src/channels/dock.js.map +0 -1
  715. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  716. package/dist/src/channels/plugins/bundled.js +0 -10
  717. package/dist/src/channels/plugins/bundled.js.map +0 -1
  718. package/dist/src/channels/registry.d.ts +0 -25
  719. package/dist/src/channels/registry.js +0 -82
  720. package/dist/src/channels/registry.js.map +0 -1
  721. package/dist/src/config/localized-text.d.ts +0 -6
  722. package/dist/src/config/localized-text.js +0 -42
  723. package/dist/src/config/localized-text.js.map +0 -1
  724. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  725. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  726. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  727. package/dist/src/tui/stream-assembler.d.ts +0 -22
  728. package/dist/src/tui/stream-assembler.js +0 -63
  729. package/dist/src/tui/stream-assembler.js.map +0 -1
  730. package/skills/browser/SKILL-zh.md +0 -188
  731. package/skills/business/company-values/SKILL-zh.md +0 -80
  732. package/skills/business/company-values/SKILL.md +0 -80
  733. package/skills/business/find-community/SKILL-zh.md +0 -50
  734. package/skills/business/find-community/SKILL.md +0 -50
  735. package/skills/business/first-customers/SKILL-zh.md +0 -76
  736. package/skills/business/first-customers/SKILL.md +0 -76
  737. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  738. package/skills/business/grow-sustainably/SKILL.md +0 -92
  739. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  740. package/skills/business/marketing-plan/SKILL.md +0 -100
  741. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  742. package/skills/business/minimalist-review/SKILL.md +0 -82
  743. package/skills/business/mvp/SKILL-zh.md +0 -81
  744. package/skills/business/mvp/SKILL.md +0 -81
  745. package/skills/business/pricing/SKILL-zh.md +0 -64
  746. package/skills/business/pricing/SKILL.md +0 -64
  747. package/skills/business/processize/SKILL-zh.md +0 -91
  748. package/skills/business/processize/SKILL.md +0 -91
  749. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  750. package/skills/business/validate-idea/SKILL.md +0 -68
  751. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  752. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  753. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  754. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  755. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  756. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  757. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  758. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  759. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  760. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  761. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  762. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  763. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  764. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  765. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  766. package/skills/documents/docx/LICENSE.txt +0 -30
  767. package/skills/documents/docx/SKILL-zh.md +0 -590
  768. package/skills/documents/docx/SKILL.md +0 -590
  769. package/skills/documents/docx/scripts/__init__.py +0 -1
  770. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  771. package/skills/documents/docx/scripts/comment.py +0 -318
  772. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  773. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  774. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  775. package/skills/documents/docx/scripts/office/pack.py +0 -159
  776. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  777. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  778. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  779. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  780. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  781. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  782. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  783. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  784. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  785. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  786. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  787. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  788. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  789. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  790. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  791. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  792. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  793. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  794. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  795. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  796. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  797. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  798. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  799. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  800. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  801. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  802. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  803. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  804. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  805. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  806. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  807. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  808. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  809. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  810. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  811. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  812. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  813. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  814. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  815. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  816. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  817. package/skills/documents/docx/scripts/office/validate.py +0 -111
  818. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  819. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  820. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  821. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  822. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  823. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  824. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  825. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  826. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  827. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  828. package/skills/documents/pdf/LICENSE.txt +0 -30
  829. package/skills/documents/pdf/SKILL-zh.md +0 -314
  830. package/skills/documents/pdf/SKILL.md +0 -314
  831. package/skills/documents/pdf/forms.md +0 -294
  832. package/skills/documents/pdf/reference.md +0 -612
  833. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  834. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  835. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  836. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  837. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  838. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  839. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  840. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  841. package/skills/documents/pptx/LICENSE.txt +0 -30
  842. package/skills/documents/pptx/SKILL-zh.md +0 -232
  843. package/skills/documents/pptx/SKILL.md +0 -232
  844. package/skills/documents/pptx/editing.md +0 -205
  845. package/skills/documents/pptx/pptxgenjs.md +0 -420
  846. package/skills/documents/pptx/scripts/__init__.py +0 -0
  847. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  848. package/skills/documents/pptx/scripts/clean.py +0 -286
  849. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  850. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  851. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  852. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  853. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  854. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  855. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  856. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  857. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  858. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  859. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  860. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  861. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  862. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  863. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  864. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  865. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  866. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  867. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  868. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  869. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  870. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  871. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  872. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  873. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  874. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  875. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  876. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  877. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  878. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  879. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  880. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  881. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  882. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  883. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  884. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  885. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  886. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  887. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  888. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  889. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  890. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  891. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  892. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  893. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  894. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  895. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  896. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  897. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  898. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  899. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  900. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  901. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  902. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  903. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  904. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  905. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  906. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  907. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  908. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  909. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  910. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  911. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  912. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  913. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  914. package/skills/engineering/to-issues/SKILL.md +0 -81
  915. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  916. package/skills/engineering/to-prd/SKILL.md +0 -74
  917. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  918. package/skills/engineering/zoom-out/SKILL.md +0 -7
  919. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  920. package/skills/tools/github/SKILL-zh.md +0 -48
  921. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  922. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  923. package/skills/tools/internal-comms/SKILL.md +0 -32
  924. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  925. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  926. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  927. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  928. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  929. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  930. package/skills/tools/skill-creator/SKILL.md +0 -485
  931. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  932. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  933. package/skills/tools/skill-creator/agents/grader.md +0 -223
  934. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  935. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  936. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  937. package/skills/tools/skill-creator/references/schemas.md +0 -430
  938. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  939. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  940. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  941. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  942. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  943. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  944. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  945. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  946. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  947. package/skills/tools/summarize/SKILL-zh.md +0 -47
  948. package/skills/tools/weather/SKILL-zh.md +0 -46
  949. package/skills/tools/weather/SKILL.md +0 -46
  950. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
@@ -4,6 +4,7 @@ import { init_logger } from "../utils/logger.js";
4
4
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
5
5
  import { buildNoteIndexMeta } from "./note-index-meta.js";
6
6
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "../storage/sqlite/notes-repository.js";
7
+ import { deleteNoteAgentContextRecord } from "../storage/sqlite/note-agent-context-repository.js";
7
8
  import "../storage/sqlite/index.js";
8
9
  import { resolveNoteHistoryDir, resolveNoteMediaDir } from "./paths.js";
9
10
  import { randomUUID } from "node:crypto";
@@ -46,6 +47,7 @@ var NotesStore = class {
46
47
  async deleteNote(id) {
47
48
  requireXopcDatabase();
48
49
  if (!deleteNoteRecord(id)) return false;
50
+ deleteNoteAgentContextRecord(id);
49
51
  await rm(resolveNoteMediaDir(id), {
50
52
  recursive: true,
51
53
  force: true
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","names":[],"sources":["../../../src/notes/store.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { readFile, mkdir, writeFile, rm, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { createLogger } from '../utils/logger.js';\nimport {\n deleteNoteRecord,\n getNoteRecord,\n listNoteRecords,\n requireXopcDatabase,\n upsertNoteRecord,\n} from '../storage/sqlite/index.js';\nimport { buildNoteIndexMeta } from './note-index-meta.js';\nimport { resolveNoteMediaDir, resolveNoteHistoryDir } from './paths.js';\nimport type {\n Note,\n NoteIndexEntry,\n NoteSnapshot,\n NoteSnapshotEntry,\n NotesListQuery,\n SnapshotTrigger,\n} from './types.js';\n\nconst log = createLogger('NotesStore');\n\nexport class NotesStore {\n private initialized = false;\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n requireXopcDatabase();\n this.initialized = true;\n log.debug('NotesStore initialized');\n }\n\n async addNote(note: Note): Promise<void> {\n requireXopcDatabase();\n upsertNoteRecord(note);\n }\n\n async getNote(id: string): Promise<Note | null> {\n requireXopcDatabase();\n return getNoteRecord(id);\n }\n\n async updateNote(id: string, patch: Partial<Note>): Promise<Note | null> {\n const existing = await this.getNote(id);\n if (!existing) return null;\n\n const updated: Note = {\n ...existing,\n ...patch,\n id: existing.id,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n\n requireXopcDatabase();\n upsertNoteRecord(updated);\n return updated;\n }\n\n async deleteNote(id: string): Promise<boolean> {\n requireXopcDatabase();\n const deleted = deleteNoteRecord(id);\n if (!deleted) {\n return false;\n }\n\n const mediaDir = resolveNoteMediaDir(id);\n await rm(mediaDir, { recursive: true, force: true }).catch(() => undefined);\n return true;\n }\n\n async listNotes(query: NotesListQuery = {}): Promise<{\n items: NoteIndexEntry[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n }> {\n requireXopcDatabase();\n return listNoteRecords(query);\n }\n\n async saveAttachment(\n noteId: string,\n fileName: string,\n buffer: Buffer,\n ): Promise<{ relativePath: string; size: number }> {\n const mediaDir = resolveNoteMediaDir(noteId);\n await mkdir(mediaDir, { recursive: true });\n const safeName = `${randomUUID().slice(0, 8)}_${fileName.replace(/[^a-zA-Z0-9._-]/g, '_')}`;\n const filePath = join(mediaDir, safeName);\n await writeFile(filePath, buffer);\n return { relativePath: safeName, size: buffer.length };\n }\n\n resolveAttachmentPath(noteId: string, relativePath: string): string {\n return join(resolveNoteMediaDir(noteId), relativePath);\n }\n\n async deleteAttachmentFile(noteId: string, relativePath: string): Promise<void> {\n const filePath = this.resolveAttachmentPath(noteId, relativePath);\n await rm(filePath, { force: true }).catch((err) => {\n log.warn({ err, noteId, relativePath }, 'Failed to remove note attachment file');\n });\n }\n\n async saveSnapshot(note: Note, trigger: SnapshotTrigger): Promise<void> {\n const historyDir = resolveNoteHistoryDir(note.id);\n await mkdir(historyDir, { recursive: true });\n const snapshot: NoteSnapshot = {\n noteId: note.id,\n timestamp: Date.now(),\n trigger,\n title: note.title,\n markdown: note.markdown,\n tags: note.tags,\n kind: note.kind,\n status: note.status,\n };\n const filePath = join(historyDir, `${snapshot.timestamp}.json`);\n await writeTextAtomic(filePath, JSON.stringify(snapshot, null, 2));\n log.debug({ noteId: note.id, trigger, timestamp: snapshot.timestamp }, 'Snapshot saved');\n }\n\n async listSnapshots(noteId: string): Promise<NoteSnapshotEntry[]> {\n const historyDir = resolveNoteHistoryDir(noteId);\n let files: string[];\n try {\n files = await readdir(historyDir);\n } catch {\n return [];\n }\n const entries: NoteSnapshotEntry[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const timestamp = parseInt(file.slice(0, -'.json'.length), 10);\n if (!Number.isFinite(timestamp)) continue;\n try {\n const content = await readFile(join(historyDir, file), 'utf-8');\n const snapshot = JSON.parse(content) as NoteSnapshot;\n const rawText = snapshot.markdown ?? '';\n entries.push({\n timestamp: snapshot.timestamp,\n trigger: snapshot.trigger,\n snippet: rawText.slice(0, 80) || undefined,\n });\n } catch {\n log.debug({ noteId, file }, 'Skipped unreadable snapshot');\n }\n }\n entries.sort((a, b) => b.timestamp - a.timestamp);\n return entries;\n }\n\n async getSnapshot(noteId: string, timestamp: number): Promise<NoteSnapshot | null> {\n const filePath = join(resolveNoteHistoryDir(noteId), `${timestamp}.json`);\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as NoteSnapshot;\n } catch {\n return null;\n }\n }\n\n async pruneSnapshots(noteId: string, maxCount: number): Promise<void> {\n const historyDir = resolveNoteHistoryDir(noteId);\n let files: string[];\n try {\n files = await readdir(historyDir);\n } catch {\n return;\n }\n const jsonFiles = files.filter((f) => f.endsWith('.json')).sort();\n if (jsonFiles.length <= maxCount) return;\n const toDelete = jsonFiles.slice(0, jsonFiles.length - maxCount);\n for (const file of toDelete) {\n await rm(join(historyDir, file), { force: true }).catch(() => undefined);\n }\n log.debug({ noteId, deleted: toDelete.length }, 'Pruned old snapshots');\n }\n\n async deleteAllSnapshots(noteId: string): Promise<void> {\n const historyDir = resolveNoteHistoryDir(noteId);\n await rm(historyDir, { recursive: true, force: true }).catch(() => undefined);\n }\n\n /** No-op: SQLite writes are synchronous. Kept for API compatibility with tests. */\n async flush(): Promise<void> {}\n}\n\nexport { buildNoteIndexMeta };\n"],"mappings":"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"}
1
+ {"version":3,"file":"store.js","names":[],"sources":["../../../src/notes/store.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { readFile, mkdir, writeFile, rm, readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { createLogger } from '../utils/logger.js';\nimport {\n deleteNoteAgentContextRecord,\n deleteNoteRecord,\n getNoteRecord,\n listNoteRecords,\n requireXopcDatabase,\n upsertNoteRecord,\n} from '../storage/sqlite/index.js';\nimport { buildNoteIndexMeta } from './note-index-meta.js';\nimport { resolveNoteMediaDir, resolveNoteHistoryDir } from './paths.js';\nimport type {\n Note,\n NoteIndexEntry,\n NoteSnapshot,\n NoteSnapshotEntry,\n NotesListQuery,\n SnapshotTrigger,\n} from './types.js';\n\nconst log = createLogger('NotesStore');\n\nexport class NotesStore {\n private initialized = false;\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n requireXopcDatabase();\n this.initialized = true;\n log.debug('NotesStore initialized');\n }\n\n async addNote(note: Note): Promise<void> {\n requireXopcDatabase();\n upsertNoteRecord(note);\n }\n\n async getNote(id: string): Promise<Note | null> {\n requireXopcDatabase();\n return getNoteRecord(id);\n }\n\n async updateNote(id: string, patch: Partial<Note>): Promise<Note | null> {\n const existing = await this.getNote(id);\n if (!existing) return null;\n\n const updated: Note = {\n ...existing,\n ...patch,\n id: existing.id,\n createdAt: existing.createdAt,\n updatedAt: Date.now(),\n };\n\n requireXopcDatabase();\n upsertNoteRecord(updated);\n return updated;\n }\n\n async deleteNote(id: string): Promise<boolean> {\n requireXopcDatabase();\n const deleted = deleteNoteRecord(id);\n if (!deleted) {\n return false;\n }\n\n deleteNoteAgentContextRecord(id);\n const mediaDir = resolveNoteMediaDir(id);\n await rm(mediaDir, { recursive: true, force: true }).catch(() => undefined);\n return true;\n }\n\n async listNotes(query: NotesListQuery = {}): Promise<{\n items: NoteIndexEntry[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n }> {\n requireXopcDatabase();\n return listNoteRecords(query);\n }\n\n async saveAttachment(\n noteId: string,\n fileName: string,\n buffer: Buffer,\n ): Promise<{ relativePath: string; size: number }> {\n const mediaDir = resolveNoteMediaDir(noteId);\n await mkdir(mediaDir, { recursive: true });\n const safeName = `${randomUUID().slice(0, 8)}_${fileName.replace(/[^a-zA-Z0-9._-]/g, '_')}`;\n const filePath = join(mediaDir, safeName);\n await writeFile(filePath, buffer);\n return { relativePath: safeName, size: buffer.length };\n }\n\n resolveAttachmentPath(noteId: string, relativePath: string): string {\n return join(resolveNoteMediaDir(noteId), relativePath);\n }\n\n async deleteAttachmentFile(noteId: string, relativePath: string): Promise<void> {\n const filePath = this.resolveAttachmentPath(noteId, relativePath);\n await rm(filePath, { force: true }).catch((err) => {\n log.warn({ err, noteId, relativePath }, 'Failed to remove note attachment file');\n });\n }\n\n async saveSnapshot(note: Note, trigger: SnapshotTrigger): Promise<void> {\n const historyDir = resolveNoteHistoryDir(note.id);\n await mkdir(historyDir, { recursive: true });\n const snapshot: NoteSnapshot = {\n noteId: note.id,\n timestamp: Date.now(),\n trigger,\n title: note.title,\n markdown: note.markdown,\n tags: note.tags,\n kind: note.kind,\n status: note.status,\n };\n const filePath = join(historyDir, `${snapshot.timestamp}.json`);\n await writeTextAtomic(filePath, JSON.stringify(snapshot, null, 2));\n log.debug({ noteId: note.id, trigger, timestamp: snapshot.timestamp }, 'Snapshot saved');\n }\n\n async listSnapshots(noteId: string): Promise<NoteSnapshotEntry[]> {\n const historyDir = resolveNoteHistoryDir(noteId);\n let files: string[];\n try {\n files = await readdir(historyDir);\n } catch {\n return [];\n }\n const entries: NoteSnapshotEntry[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const timestamp = parseInt(file.slice(0, -'.json'.length), 10);\n if (!Number.isFinite(timestamp)) continue;\n try {\n const content = await readFile(join(historyDir, file), 'utf-8');\n const snapshot = JSON.parse(content) as NoteSnapshot;\n const rawText = snapshot.markdown ?? '';\n entries.push({\n timestamp: snapshot.timestamp,\n trigger: snapshot.trigger,\n snippet: rawText.slice(0, 80) || undefined,\n });\n } catch {\n log.debug({ noteId, file }, 'Skipped unreadable snapshot');\n }\n }\n entries.sort((a, b) => b.timestamp - a.timestamp);\n return entries;\n }\n\n async getSnapshot(noteId: string, timestamp: number): Promise<NoteSnapshot | null> {\n const filePath = join(resolveNoteHistoryDir(noteId), `${timestamp}.json`);\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as NoteSnapshot;\n } catch {\n return null;\n }\n }\n\n async pruneSnapshots(noteId: string, maxCount: number): Promise<void> {\n const historyDir = resolveNoteHistoryDir(noteId);\n let files: string[];\n try {\n files = await readdir(historyDir);\n } catch {\n return;\n }\n const jsonFiles = files.filter((f) => f.endsWith('.json')).sort();\n if (jsonFiles.length <= maxCount) return;\n const toDelete = jsonFiles.slice(0, jsonFiles.length - maxCount);\n for (const file of toDelete) {\n await rm(join(historyDir, file), { force: true }).catch(() => undefined);\n }\n log.debug({ noteId, deleted: toDelete.length }, 'Pruned old snapshots');\n }\n\n async deleteAllSnapshots(noteId: string): Promise<void> {\n const historyDir = resolveNoteHistoryDir(noteId);\n await rm(historyDir, { recursive: true, force: true }).catch(() => undefined);\n }\n\n /** No-op: SQLite writes are synchronous. Kept for API compatibility with tests. */\n async flush(): Promise<void> {}\n}\n\nexport { buildNoteIndexMeta };\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export type ProjectTrustDecision = boolean | null;
2
+ export interface ProjectTrustStoreEntry {
3
+ path: string;
4
+ decision: boolean;
5
+ }
6
+ export interface ProjectTrustUpdate {
7
+ path: string;
8
+ decision: ProjectTrustDecision;
9
+ }
10
+ export interface ProjectTrustOption {
11
+ label: string;
12
+ trusted: boolean;
13
+ updates: ProjectTrustUpdate[];
14
+ savedPath?: string;
15
+ }
16
+ export declare function resolveProjectTrustStorePath(): string;
17
+ export declare function getProjectTrustParentPath(cwd: string): string | undefined;
18
+ export declare function getProjectTrustOptions(cwd: string, options?: {
19
+ includeSessionOnly?: boolean;
20
+ }): ProjectTrustOption[];
21
+ export declare function hasTrustRequiringProjectResources(cwd: string): boolean;
22
+ export declare class ProjectTrustStore {
23
+ private readonly trustPath;
24
+ constructor(trustPath?: string);
25
+ getPath(): string;
26
+ get(cwd: string): ProjectTrustDecision;
27
+ getEntry(cwd: string): ProjectTrustStoreEntry | null;
28
+ set(cwd: string, decision: ProjectTrustDecision): void;
29
+ setMany(decisions: ProjectTrustUpdate[]): void;
30
+ }
@@ -0,0 +1,194 @@
1
+ import { resolveStateDir } from "../config/paths-state.js";
2
+ import { init_paths } from "../config/paths.js";
3
+ import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { homedir } from "node:os";
6
+ import lockfile from "proper-lockfile";
7
+ //#region src/project-trust/trust-store.ts
8
+ init_paths();
9
+ const TRUST_REQUIRING_XOPC_PROJECT_RESOURCES = [
10
+ "settings.json",
11
+ "extensions",
12
+ "skills",
13
+ "prompts",
14
+ "themes",
15
+ "SYSTEM.md",
16
+ "APPEND_SYSTEM.md",
17
+ "workspace.json"
18
+ ];
19
+ function canonicalizePath(path) {
20
+ const resolved = resolve(path);
21
+ try {
22
+ return realpathSync.native(resolved);
23
+ } catch {
24
+ return resolved;
25
+ }
26
+ }
27
+ function normalizeCwd(cwd) {
28
+ return canonicalizePath(cwd);
29
+ }
30
+ function readTrustFile(path) {
31
+ if (!existsSync(path)) return {};
32
+ let parsed;
33
+ try {
34
+ parsed = JSON.parse(readFileSync(path, "utf8"));
35
+ } catch (err) {
36
+ const errorMessage = err instanceof Error ? err.message : String(err);
37
+ throw new Error(`Failed to read project trust store ${path}: ${errorMessage}`);
38
+ }
39
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) throw new Error(`Invalid project trust store ${path}: expected an object`);
40
+ const data = {};
41
+ for (const [key, value] of Object.entries(parsed)) {
42
+ if (value !== true && value !== false && value !== null) throw new Error(`Invalid project trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);
43
+ data[normalizeCwd(key)] = value;
44
+ }
45
+ return data;
46
+ }
47
+ function writeTrustFile(path, data) {
48
+ const sorted = {};
49
+ for (const key of Object.keys(data).sort()) {
50
+ const value = data[key];
51
+ if (value === true || value === false || value === null) sorted[key] = value;
52
+ }
53
+ mkdirSync(dirname(path), { recursive: true });
54
+ writeFileSync(path, `${JSON.stringify(sorted, null, 2)}\n`, "utf8");
55
+ }
56
+ function acquireTrustLockSync(path) {
57
+ const trustDir = dirname(path);
58
+ mkdirSync(trustDir, { recursive: true });
59
+ const maxAttempts = 10;
60
+ const delayMs = 20;
61
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) try {
62
+ return lockfile.lockSync(trustDir, {
63
+ realpath: false,
64
+ lockfilePath: `${path}.lock`
65
+ });
66
+ } catch (err) {
67
+ if ((typeof err === "object" && err !== null && "code" in err ? String(err.code) : void 0) !== "ELOCKED" || attempt === maxAttempts) throw err;
68
+ const startedAt = Date.now();
69
+ while (Date.now() - startedAt < delayMs);
70
+ }
71
+ throw new Error("Failed to acquire project trust store lock");
72
+ }
73
+ function withTrustFileLock(path, fn) {
74
+ const release = acquireTrustLockSync(path);
75
+ try {
76
+ return fn();
77
+ } finally {
78
+ release();
79
+ }
80
+ }
81
+ function findNearestTrustEntry(data, cwd) {
82
+ let currentDir = normalizeCwd(cwd);
83
+ while (true) {
84
+ const value = data[currentDir];
85
+ if (value === true || value === false) return {
86
+ path: currentDir,
87
+ decision: value
88
+ };
89
+ const parentDir = dirname(currentDir);
90
+ if (parentDir === currentDir) return null;
91
+ currentDir = parentDir;
92
+ }
93
+ }
94
+ function resolveProjectTrustStorePath() {
95
+ return join(resolveStateDir(), "trust.json");
96
+ }
97
+ function getProjectTrustParentPath(cwd) {
98
+ const trustPath = normalizeCwd(cwd);
99
+ const parentDir = dirname(trustPath);
100
+ return parentDir === trustPath ? void 0 : parentDir;
101
+ }
102
+ function getProjectTrustOptions(cwd, options = {}) {
103
+ const trustPath = normalizeCwd(cwd);
104
+ const trustOptions = [{
105
+ label: "Trust",
106
+ trusted: true,
107
+ updates: [{
108
+ path: trustPath,
109
+ decision: true
110
+ }],
111
+ savedPath: trustPath
112
+ }];
113
+ const parentPath = getProjectTrustParentPath(cwd);
114
+ if (parentPath) trustOptions.push({
115
+ label: `Trust parent folder (${parentPath})`,
116
+ trusted: true,
117
+ updates: [{
118
+ path: parentPath,
119
+ decision: true
120
+ }, {
121
+ path: trustPath,
122
+ decision: null
123
+ }],
124
+ savedPath: parentPath
125
+ });
126
+ if (options.includeSessionOnly) trustOptions.push({
127
+ label: "Trust (this session only)",
128
+ trusted: true,
129
+ updates: []
130
+ });
131
+ trustOptions.push({
132
+ label: "Do not trust",
133
+ trusted: false,
134
+ updates: [{
135
+ path: trustPath,
136
+ decision: false
137
+ }],
138
+ savedPath: trustPath
139
+ });
140
+ if (options.includeSessionOnly) trustOptions.push({
141
+ label: "Do not trust (this session only)",
142
+ trusted: false,
143
+ updates: []
144
+ });
145
+ return trustOptions;
146
+ }
147
+ function hasTrustRequiringProjectResources(cwd) {
148
+ const userAgentsSkillsDir = join(canonicalizePath(process.env.HOME || homedir()), ".agents", "skills");
149
+ let currentDir = canonicalizePath(cwd);
150
+ const xopcProjectDir = join(currentDir, ".xopc");
151
+ if (TRUST_REQUIRING_XOPC_PROJECT_RESOURCES.some((entry) => existsSync(join(xopcProjectDir, entry)))) return true;
152
+ while (true) {
153
+ const agentsSkillsDir = join(currentDir, ".agents", "skills");
154
+ if (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) return true;
155
+ const parentDir = dirname(currentDir);
156
+ if (parentDir === currentDir) return false;
157
+ currentDir = parentDir;
158
+ }
159
+ }
160
+ var ProjectTrustStore = class {
161
+ constructor(trustPath = resolveProjectTrustStorePath()) {
162
+ this.trustPath = trustPath;
163
+ }
164
+ getPath() {
165
+ return this.trustPath;
166
+ }
167
+ get(cwd) {
168
+ return this.getEntry(cwd)?.decision ?? null;
169
+ }
170
+ getEntry(cwd) {
171
+ return withTrustFileLock(this.trustPath, () => findNearestTrustEntry(readTrustFile(this.trustPath), cwd));
172
+ }
173
+ set(cwd, decision) {
174
+ this.setMany([{
175
+ path: cwd,
176
+ decision
177
+ }]);
178
+ }
179
+ setMany(decisions) {
180
+ withTrustFileLock(this.trustPath, () => {
181
+ const data = readTrustFile(this.trustPath);
182
+ for (const { path, decision } of decisions) {
183
+ const key = normalizeCwd(path);
184
+ if (decision === null) delete data[key];
185
+ else data[key] = decision;
186
+ }
187
+ writeTrustFile(this.trustPath, data);
188
+ });
189
+ }
190
+ };
191
+ //#endregion
192
+ export { ProjectTrustStore, getProjectTrustOptions, getProjectTrustParentPath, hasTrustRequiringProjectResources, resolveProjectTrustStorePath };
193
+
194
+ //# sourceMappingURL=trust-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-store.js","names":["resolvePath"],"sources":["../../../src/project-trust/trust-store.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve as resolvePath } from 'node:path';\n\nimport lockfile from 'proper-lockfile';\n\nimport { resolveStateDir } from '../config/paths.js';\n\nexport type ProjectTrustDecision = boolean | null;\n\nexport interface ProjectTrustStoreEntry {\n path: string;\n decision: boolean;\n}\n\nexport interface ProjectTrustUpdate {\n path: string;\n decision: ProjectTrustDecision;\n}\n\nexport interface ProjectTrustOption {\n label: string;\n trusted: boolean;\n updates: ProjectTrustUpdate[];\n savedPath?: string;\n}\n\ntype TrustFile = Record<string, boolean | null | undefined>;\n\nconst TRUST_REQUIRING_XOPC_PROJECT_RESOURCES = [\n 'settings.json',\n 'extensions',\n 'skills',\n 'prompts',\n 'themes',\n 'SYSTEM.md',\n 'APPEND_SYSTEM.md',\n 'workspace.json',\n] as const;\n\nfunction canonicalizePath(path: string): string {\n const resolved = resolvePath(path);\n try {\n return realpathSync.native(resolved);\n } catch {\n return resolved;\n }\n}\n\nfunction normalizeCwd(cwd: string): string {\n return canonicalizePath(cwd);\n}\n\nfunction readTrustFile(path: string): TrustFile {\n if (!existsSync(path)) return {};\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, 'utf8'));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to read project trust store ${path}: ${errorMessage}`);\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error(`Invalid project trust store ${path}: expected an object`);\n }\n\n const data: TrustFile = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value !== true && value !== false && value !== null) {\n throw new Error(`Invalid project trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);\n }\n data[normalizeCwd(key)] = value;\n }\n return data;\n}\n\nfunction writeTrustFile(path: string, data: TrustFile): void {\n const sorted: TrustFile = {};\n for (const key of Object.keys(data).sort()) {\n const value = data[key];\n if (value === true || value === false || value === null) {\n sorted[key] = value;\n }\n }\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(sorted, null, 2)}\\n`, 'utf8');\n}\n\nfunction acquireTrustLockSync(path: string): () => void {\n const trustDir = dirname(path);\n mkdirSync(trustDir, { recursive: true });\n const maxAttempts = 10;\n const delayMs = 20;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return lockfile.lockSync(trustDir, { realpath: false, lockfilePath: `${path}.lock` });\n } catch (err) {\n const code =\n typeof err === 'object' && err !== null && 'code' in err\n ? String((err as { code?: unknown }).code)\n : undefined;\n if (code !== 'ELOCKED' || attempt === maxAttempts) {\n throw err;\n }\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n // Synchronous callers need a tiny bounded wait while another TUI updates trust.json.\n }\n }\n }\n\n throw new Error('Failed to acquire project trust store lock');\n}\n\nfunction withTrustFileLock<T>(path: string, fn: () => T): T {\n const release = acquireTrustLockSync(path);\n try {\n return fn();\n } finally {\n release();\n }\n}\n\nfunction findNearestTrustEntry(data: TrustFile, cwd: string): ProjectTrustStoreEntry | null {\n let currentDir = normalizeCwd(cwd);\n while (true) {\n const value = data[currentDir];\n if (value === true || value === false) {\n return { path: currentDir, decision: value };\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return null;\n currentDir = parentDir;\n }\n}\n\nexport function resolveProjectTrustStorePath(): string {\n return join(resolveStateDir(), 'trust.json');\n}\n\nexport function getProjectTrustParentPath(cwd: string): string | undefined {\n const trustPath = normalizeCwd(cwd);\n const parentDir = dirname(trustPath);\n return parentDir === trustPath ? undefined : parentDir;\n}\n\nexport function getProjectTrustOptions(\n cwd: string,\n options: { includeSessionOnly?: boolean } = {},\n): ProjectTrustOption[] {\n const trustPath = normalizeCwd(cwd);\n const trustOptions: ProjectTrustOption[] = [\n { label: 'Trust', trusted: true, updates: [{ path: trustPath, decision: true }], savedPath: trustPath },\n ];\n const parentPath = getProjectTrustParentPath(cwd);\n if (parentPath) {\n trustOptions.push({\n label: `Trust parent folder (${parentPath})`,\n trusted: true,\n updates: [\n { path: parentPath, decision: true },\n { path: trustPath, decision: null },\n ],\n savedPath: parentPath,\n });\n }\n if (options.includeSessionOnly) {\n trustOptions.push({ label: 'Trust (this session only)', trusted: true, updates: [] });\n }\n trustOptions.push({\n label: 'Do not trust',\n trusted: false,\n updates: [{ path: trustPath, decision: false }],\n savedPath: trustPath,\n });\n if (options.includeSessionOnly) {\n trustOptions.push({ label: 'Do not trust (this session only)', trusted: false, updates: [] });\n }\n return trustOptions;\n}\n\nexport function hasTrustRequiringProjectResources(cwd: string): boolean {\n const homeDir = canonicalizePath(process.env.HOME || homedir());\n const userAgentsSkillsDir = join(homeDir, '.agents', 'skills');\n let currentDir = canonicalizePath(cwd);\n\n const xopcProjectDir = join(currentDir, '.xopc');\n if (TRUST_REQUIRING_XOPC_PROJECT_RESOURCES.some((entry) => existsSync(join(xopcProjectDir, entry)))) {\n return true;\n }\n\n while (true) {\n const agentsSkillsDir = join(currentDir, '.agents', 'skills');\n if (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) {\n return true;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return false;\n currentDir = parentDir;\n }\n}\n\nexport class ProjectTrustStore {\n constructor(private readonly trustPath: string = resolveProjectTrustStorePath()) {}\n\n getPath(): string {\n return this.trustPath;\n }\n\n get(cwd: string): ProjectTrustDecision {\n return this.getEntry(cwd)?.decision ?? null;\n }\n\n getEntry(cwd: string): ProjectTrustStoreEntry | null {\n return withTrustFileLock(this.trustPath, () => findNearestTrustEntry(readTrustFile(this.trustPath), cwd));\n }\n\n set(cwd: string, decision: ProjectTrustDecision): void {\n this.setMany([{ path: cwd, decision }]);\n }\n\n setMany(decisions: ProjectTrustUpdate[]): void {\n withTrustFileLock(this.trustPath, () => {\n const data = readTrustFile(this.trustPath);\n for (const { path, decision } of decisions) {\n const key = normalizeCwd(path);\n if (decision === null) {\n delete data[key];\n } else {\n data[key] = decision;\n }\n }\n writeTrustFile(this.trustPath, data);\n });\n }\n}\n"],"mappings":"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"}
@@ -60,7 +60,7 @@ export declare function providerSupportsApiKey(provider: string): boolean;
60
60
  /**
61
61
  * Get a default model reference.
62
62
  * Priority:
63
- * 1. Explicitly configured model in agents.defaults.model (if set and available)
63
+ * 1. Explicitly configured model in agents.defaults.models.chat (if set and available)
64
64
  * 2. Default fallback: openai/gpt-5.5
65
65
  */
66
66
  export declare function getDefaultModel(config?: Config | null | undefined): Promise<string>;
@@ -216,8 +216,19 @@ async function getAvailableModels() {
216
216
  const allModels = getAllModels();
217
217
  const pluginRegistry = getProviderRegistry();
218
218
  const available = [];
219
- for (const model of allModels) if (pluginRegistry.has(model.provider)) available.push(model);
220
- else if (await isProviderConfigured(model.provider)) available.push(model);
219
+ const configuredByProvider = /* @__PURE__ */ new Map();
220
+ for (const model of allModels) {
221
+ if (pluginRegistry.has(model.provider)) {
222
+ available.push(model);
223
+ continue;
224
+ }
225
+ let configured = configuredByProvider.get(model.provider);
226
+ if (configured === void 0) {
227
+ configured = await isProviderConfigured(model.provider);
228
+ configuredByProvider.set(model.provider, configured);
229
+ }
230
+ if (configured) available.push(model);
231
+ }
221
232
  return available;
222
233
  }
223
234
  function getSortedProviders() {
@@ -251,13 +262,13 @@ function providerSupportsApiKey(provider) {
251
262
  /**
252
263
  * Get a default model reference.
253
264
  * Priority:
254
- * 1. Explicitly configured model in agents.defaults.model (if set and available)
265
+ * 1. Explicitly configured model in agents.defaults.models.chat (if set and available)
255
266
  * 2. Default fallback: openai/gpt-5.5
256
267
  */
257
268
  async function getDefaultModel(config) {
258
- const defaultModel = config?.agents?.defaults?.model;
269
+ const defaultModel = config?.agents?.defaults?.models?.chat;
259
270
  if (defaultModel) {
260
- const modelRef = typeof defaultModel === "string" ? defaultModel : defaultModel.primary;
271
+ const modelRef = defaultModel.primary;
261
272
  if (modelRef) {
262
273
  const configured = (await getAvailableModels()).find((m) => `${m.provider}/${m.id}` === modelRef || m.id === modelRef);
263
274
  if (configured) return `${configured.provider}/${configured.id}`;
@@ -275,9 +286,9 @@ async function getDefaultModel(config) {
275
286
  * full catalog.
276
287
  */
277
288
  function getDefaultModelSync(config) {
278
- const defaultModel = config?.agents?.defaults?.model;
289
+ const defaultModel = config?.agents?.defaults?.models?.chat;
279
290
  if (defaultModel) {
280
- const modelRef = typeof defaultModel === "string" ? defaultModel : defaultModel.primary;
291
+ const modelRef = defaultModel.primary;
281
292
  if (modelRef) return modelRef;
282
293
  }
283
294
  return DEFAULT_FALLBACK_MODEL;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getPiAiModel","getPiAiProviders","getPiAiModels"],"sources":["../../../src/providers/index.ts"],"sourcesContent":["/**\n * Model provider module - integrates built-in models with custom models from models.json\n */\n\nimport {\n\tgetModel as getPiAiModel,\n\tgetModels as getPiAiModels,\n\tgetProviders as getPiAiProviders,\n\ttype Model,\n\ttype Api,\n} from '@earendil-works/pi-ai';\nimport type { Config } from '../config/schema.js';\nimport { getModelRegistry } from './model-registry.js';\nimport { CredentialResolver, resolveApiKey, hasCredentials } from '../auth/credentials.js';\nimport { hasProviderAuthOnDiskSync } from '../auth/sync-provider-auth.js';\nimport { getApiKeyFromEnv } from './env-keys.js';\nimport { getProviderRegistry } from './plugin-registry.js';\nimport type { ProviderModelDefinition } from '../extensions/types/providers.js';\n\nexport { getApiKeyFromEnv, PROVIDER_ENV_MAP } from './env-keys.js';\n\n/** Sentinel base URL: model is served by an extension {@link ProviderPluginRegistry} provider. */\nexport const EXTENSION_PROVIDER_BASE_URL = 'extension://provider-plugin';\nconst OPENAI_CODEX_CANONICAL_BASE_URL = 'https://chatgpt.com/backend-api/codex';\n\nfunction normalizeProviderModel(model: Model<Api>): Model<Api> {\n\tif (model.provider === 'openai-codex' && model.api === 'openai-codex-responses') {\n\t\treturn { ...model, baseUrl: OPENAI_CODEX_CANONICAL_BASE_URL } as Model<Api>;\n\t}\n\treturn model;\n}\n\n/** Map a plugin registry model to the pi-ai {@link Model} shape. */\nexport function pluginModelToModel(providerId: string, definition: ProviderModelDefinition): Model<Api> {\n\treturn {\n\t\tprovider: providerId,\n\t\tid: definition.id,\n\t\tname: definition.name,\n\t\tapi: 'openai-completions' as Api,\n\t\tbaseUrl: EXTENSION_PROVIDER_BASE_URL,\n\t\treasoning: false,\n\t\tinput: definition.supportsImages ? (['text', 'image'] as ('text' | 'image')[]) : (['text'] as ('text' | 'image')[]),\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxOutputTokens ?? 4096,\n\t\tcost: {\n\t\t\tinput: definition.pricing?.input ?? 0,\n\t\t\toutput: definition.pricing?.output ?? 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t},\n\t} as Model<Api>;\n}\n\n/**\n * Get API key synchronously: checks registry (models.json) first, then environment variables.\n * Use this for Agent's getApiKey callback which must be synchronous.\n */\nexport function getApiKeySync(provider: string): string | undefined {\n const pluginRegistry = getProviderRegistry();\n if (pluginRegistry.has(provider)) return 'extension-managed';\n\n const registry = getModelRegistry();\n const registryKey = registry.getApiKey(provider);\n if (registryKey) {\n return registryKey;\n }\n return getApiKeyFromEnv(provider);\n}\n\n/**\n * Resolve model reference. Supports:\n * - \"provider/modelId\" format\n * - \"modelId\" auto-detection via pi-ai or custom models\n * @throws if model not found\n */\nexport function resolveModel(ref: string): Model<Api> {\n\t// First try ModelRegistry (includes custom models)\n\tconst registry = getModelRegistry();\n\tconst customModel = registry.resolve(ref);\n\tif (customModel) {\n\t\treturn customModel;\n\t}\n\n\tif (ref.includes('/')) {\n\t\tconst [provider, modelId] = ref.split('/');\n\t\tconst piAiModel = getPiAiModel(provider as any, modelId as any);\n\t\tif (piAiModel) return normalizeProviderModel(piAiModel as Model<Api>);\n\n\t\tconst pluginRegistry = getProviderRegistry();\n\t\tconst plugin = pluginRegistry.get(provider);\n\t\tif (plugin) {\n\t\t\tconst pluginModel = plugin.models.find(m => m.id === modelId);\n\t\t\tif (pluginModel) return pluginModelToModel(provider, pluginModel);\n\t\t}\n\t\tthrow new Error(`Model not found: ${ref}`);\n\t}\n\n\tfor (const provider of getPiAiProviders()) {\n\t\ttry {\n\t\t\tconst models = getPiAiModels(provider);\n\t\t\tconst found = models.find(m => m.id === ref);\n\t\t\tif (found) return normalizeProviderModel(found as Model<Api>);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\tconst pluginRegistry = getProviderRegistry();\n\tfor (const plugin of pluginRegistry.listAll()) {\n\t\tconst found = plugin.models.find(m => m.id === ref);\n\t\tif (found) return pluginModelToModel(plugin.id, found);\n\t}\n\n\tthrow new Error(`Model not found: ${ref}. Use format: provider/model-id`);\n}\n\nexport function getModelsByProvider(provider: string): readonly Model<Api>[] {\n\tconst registry = getModelRegistry();\n\tconst fromRegistry = registry.getAll().filter(m => m.provider === provider).map(normalizeProviderModel);\n\tconst plugin = getProviderRegistry().get(provider);\n\tif (!plugin) return fromRegistry;\n\tconst pluginModels = plugin.models.map(m => pluginModelToModel(provider, m));\n\treturn [...fromRegistry, ...pluginModels];\n}\n\nexport function getAllProviders(): string[] {\n\tconst registry = getModelRegistry();\n\tconst providers = new Set<string>();\n\n\t// Add built-in providers\n\tfor (const p of getPiAiProviders()) {\n\t\tproviders.add(p);\n\t}\n\n\t// Add custom providers from registry\n\tfor (const m of registry.getAll()) {\n\t\tproviders.add(m.provider);\n\t}\n\n\tfor (const plugin of getProviderRegistry().listAll()) {\n\t\tproviders.add(plugin.id);\n\t}\n\n\treturn Array.from(providers);\n}\n\nexport async function getApiKey(provider: string): Promise<string | undefined> {\n\tif (getProviderRegistry().has(provider)) return 'extension-managed';\n\n\t// Use new credential resolver first (checks: agent private > global > oauth > env)\n\tconst credentialKey = await resolveApiKey(provider);\n\tif (credentialKey) {\n\t\treturn credentialKey;\n\t}\n\n\t// Check registry for custom providers (from models.json)\n\tconst registry = getModelRegistry();\n\tconst registryKey = registry.getApiKey(provider);\n\tif (registryKey) {\n\t\treturn registryKey;\n\t}\n\n\t// Fallback to environment variables\n\treturn getApiKeyFromEnv(provider);\n}\n\n/**\n * Synchronous version for use in non-async contexts\n * Only checks environment variables and registry, not credential system\n */\nexport function isProviderConfiguredSync(provider: string): boolean {\n\tif (getProviderRegistry().has(provider)) return true;\n\n\t// Check registry for custom providers\n\tconst registry = getModelRegistry();\n\tif (registry.getApiKey(provider)) {\n\t\treturn true;\n\t}\n\t// Check environment variables\n\tif (getApiKeyFromEnv(provider)) {\n\t\treturn true;\n\t}\n\t// Gateway UI / CLI store keys in auth-profiles.json (async CredentialResolver); sync path for fallback list\n\treturn hasProviderAuthOnDiskSync(provider);\n}\n\nexport async function isProviderConfigured(provider: string): Promise<boolean> {\n if (getProviderRegistry().has(provider)) return true;\n\n // Check registry first for custom providers (from models.json)\n const registry = getModelRegistry();\n if (registry.getApiKey(provider)) {\n return true;\n }\n return await hasCredentials(provider);\n}\n\n/** Where runtime {@link getApiKey} resolves the key from (no secret values). */\nexport type ProviderActiveKeySource = 'none' | 'agent' | 'gateway' | 'oauth' | 'env' | 'models_json' | 'extension';\n\nexport type ProviderAuthMode = ProviderActiveKeySource;\nexport type ProviderAuthStatus = 'connected' | 'expired' | 'not_connected';\n\nexport interface ProviderAuthState {\n authMode: ProviderAuthMode;\n authStatus: ProviderAuthStatus;\n expiresAt?: number;\n}\n\nexport async function getProviderActiveKeySource(provider: string): Promise<ProviderActiveKeySource> {\n const authState = await getProviderAuthState(provider);\n return authState.authMode;\n}\n\nexport async function getProviderAuthState(provider: string): Promise<ProviderAuthState> {\n if (getProviderRegistry().has(provider)) {\n return { authMode: 'extension', authStatus: 'connected' };\n }\n\n const resolver = new CredentialResolver();\n const fromCredentials = await resolver.resolveApiKeySource(provider);\n if (fromCredentials === 'agent') return { authMode: 'agent', authStatus: 'connected' };\n if (fromCredentials === 'global') return { authMode: 'gateway', authStatus: 'connected' };\n if (fromCredentials === 'oauth') {\n const token = await resolver.loadOAuthTokenRecord(provider);\n const expired = Boolean(token?.expiresAt && token.expiresAt < Date.now());\n return {\n authMode: 'oauth',\n authStatus: expired ? 'expired' : 'connected',\n ...(token?.expiresAt ? { expiresAt: token.expiresAt } : {}),\n };\n }\n if (fromCredentials === 'env') return { authMode: 'env', authStatus: 'connected' };\n\n const expiredOAuthToken = await resolver.loadOAuthTokenRecord(provider);\n if (expiredOAuthToken?.expiresAt && expiredOAuthToken.expiresAt < Date.now()) {\n return {\n authMode: 'oauth',\n authStatus: 'expired',\n expiresAt: expiredOAuthToken.expiresAt,\n };\n }\n\n const registry = getModelRegistry();\n if (registry.getApiKey(provider)) {\n return { authMode: 'models_json', authStatus: 'connected' };\n }\n\n return { authMode: 'none', authStatus: 'not_connected' };\n}\n\nexport async function getConfiguredProviders(): Promise<string[]> {\n\tconst allProviders = getAllProviders();\n\tconst configured: string[] = [];\n\tfor (const p of allProviders) {\n\t\tif (await isProviderConfigured(p)) {\n\t\t\tconfigured.push(p);\n\t\t}\n\t}\n\treturn configured;\n}\n\nexport function getAllModels(): readonly Model<Api>[] {\n\tconst registry = getModelRegistry();\n\tconst registryModels = registry.getAll().map(normalizeProviderModel);\n\tconst pluginProviders = getProviderRegistry().listAll();\n\tif (pluginProviders.length === 0) return registryModels;\n\n\tconst existingIds = new Set(registryModels.map(m => `${m.provider}/${m.id}`));\n\tconst merged: Model<Api>[] = [...registryModels];\n\tfor (const plugin of pluginProviders) {\n\t\tfor (const model of plugin.models) {\n\t\t\tconst compositeId = `${plugin.id}/${model.id}`;\n\t\t\tif (!existingIds.has(compositeId)) {\n\t\t\t\tmerged.push(pluginModelToModel(plugin.id, model));\n\t\t\t\texistingIds.add(compositeId);\n\t\t\t}\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport async function getAvailableModels(): Promise<readonly Model<Api>[]> {\n\tconst allModels = getAllModels();\n\tconst pluginRegistry = getProviderRegistry();\n\tconst available: Model<Api>[] = [];\n\n\tfor (const model of allModels) {\n\t\tif (pluginRegistry.has(model.provider)) {\n\t\t\tavailable.push(model);\n\t\t} else if (await isProviderConfigured(model.provider)) {\n\t\t\tavailable.push(model);\n\t\t}\n\t}\n\treturn available;\n}\n\nexport type { Model, Api } from '@earendil-works/pi-ai';\n\nexport type ProviderCategory = 'common' | 'specialty' | 'oauth' | 'enterprise' | 'extension';\n\nexport interface ProviderMeta {\n name: string;\n category: ProviderCategory;\n supportsOAuth?: boolean;\n supportsApiKey?: boolean;\n}\n\nexport const PROVIDER_META: Record<string, ProviderMeta> = {\n 'openai': { name: 'OpenAI', category: 'common', supportsApiKey: true },\n 'anthropic': { name: 'Anthropic', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'deepseek': { name: 'DeepSeek', category: 'common', supportsApiKey: true },\n 'google': { name: 'Google AI', category: 'common', supportsApiKey: true },\n 'groq': { name: 'Groq', category: 'common', supportsApiKey: true },\n 'minimax': { name: 'MiniMax', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'minimax-cn': { name: 'MiniMax CN', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'kimi-coding': { name: 'Kimi For Coding', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'xai': { name: 'xAI', category: 'specialty', supportsApiKey: true },\n 'mistral': { name: 'Mistral AI', category: 'specialty', supportsApiKey: true },\n 'cerebras': { name: 'Cerebras', category: 'specialty', supportsApiKey: true },\n 'openrouter': { name: 'OpenRouter', category: 'specialty', supportsApiKey: true },\n 'huggingface': { name: 'Hugging Face', category: 'specialty', supportsApiKey: true },\n moonshotai: { name: 'Moonshot AI (Kimi · International)', category: 'common', supportsApiKey: true },\n 'moonshotai-cn': { name: 'Moonshot AI (Kimi · China)', category: 'common', supportsApiKey: true },\n fireworks: { name: 'Fireworks AI', category: 'specialty', supportsApiKey: true },\n together: { name: 'Together AI', category: 'specialty', supportsApiKey: true },\n 'cloudflare-workers-ai': { name: 'Cloudflare Workers AI', category: 'enterprise', supportsApiKey: true },\n 'cloudflare-ai-gateway': { name: 'Cloudflare AI Gateway', category: 'enterprise', supportsApiKey: true },\n xiaomi: { name: 'Xiaomi Mimo', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-cn': { name: 'Xiaomi Token Plan (CN)', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-ams': { name: 'Xiaomi Token Plan (AMS)', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-sgp': { name: 'Xiaomi Token Plan (SGP)', category: 'specialty', supportsApiKey: true },\n 'opencode': { name: 'OpenCode', category: 'specialty', supportsApiKey: true },\n 'opencode-go': { name: 'OpenCode Go', category: 'specialty', supportsApiKey: true },\n /** DashScope (Alibaba) — image, speech, STT; not an LLM KnownProvider. */\n 'dashscope': { name: 'DashScope (Alibaba)', category: 'specialty', supportsApiKey: true },\n /** International GLM (api.z.ai). Auth: API key (ZAI_API_KEY); no published OAuth for this HTTP API. */\n 'zai': { name: 'Zhipu GLM (International · z.ai)', category: 'common', supportsApiKey: true },\n 'amazon-bedrock': { name: 'Amazon Bedrock', category: 'enterprise', supportsApiKey: true },\n 'azure-openai-responses': { name: 'Azure OpenAI', category: 'enterprise', supportsApiKey: true },\n 'google-vertex': { name: 'Google Vertex AI', category: 'enterprise', supportsApiKey: true },\n 'vercel-ai-gateway': { name: 'Vercel AI Gateway', category: 'enterprise', supportsApiKey: true },\n 'github-copilot': { name: 'GitHub Copilot (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'openai-codex': { name: 'OpenAI Codex (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'google-gemini-cli': { name: 'Google Gemini CLI (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'google-antigravity': { name: 'Google Antigravity (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n};\n\nexport function getSortedProviders(): string[] {\n const all = getAllProviders();\n const catOrder: Record<ProviderCategory, number> = { common: 0, specialty: 1, enterprise: 2, oauth: 3, extension: 4 };\n const pluginRegistry = getProviderRegistry();\n\n return [...all].sort((a, b) => {\n const catA = pluginRegistry.has(a) ? 'extension' : (PROVIDER_META[a]?.category ?? 'specialty');\n const catB = pluginRegistry.has(b) ? 'extension' : (PROVIDER_META[b]?.category ?? 'specialty');\n if (catOrder[catA] !== catOrder[catB]) {\n return catOrder[catA] - catOrder[catB];\n }\n return a.localeCompare(b);\n });\n}\n\nexport function getProviderDisplayName(provider: string): string {\n const plugin = getProviderRegistry().get(provider);\n if (plugin) return plugin.name;\n return PROVIDER_META[provider]?.name || provider;\n}\n\nexport function providerSupportsOAuth(provider: string): boolean {\n return PROVIDER_META[provider]?.supportsOAuth ?? false;\n}\n\nexport function providerSupportsApiKey(provider: string): boolean {\n return PROVIDER_META[provider]?.supportsApiKey ?? true;\n}\n\n// ============================================\n// Dynamic Default Model Resolution\n// ============================================\n\n/** Preferred default model when no explicit model is configured. */\nconst DEFAULT_FALLBACK_MODEL = 'openai/gpt-5.5';\n\n/**\n * Get a default model reference.\n * Priority:\n * 1. Explicitly configured model in agents.defaults.model (if set and available)\n * 2. Default fallback: openai/gpt-5.5\n */\nexport async function getDefaultModel(config?: Config | null | undefined): Promise<string> {\n const defaultModel = config?.agents?.defaults?.model;\n if (defaultModel) {\n const modelRef = typeof defaultModel === 'string' ? defaultModel : defaultModel.primary;\n if (modelRef) {\n const availableModels = await getAvailableModels();\n const configured = availableModels.find(m => \n `${m.provider}/${m.id}` === modelRef ||\n m.id === modelRef\n );\n if (configured) {\n return `${configured.provider}/${configured.id}`;\n }\n return modelRef;\n }\n }\n\n return DEFAULT_FALLBACK_MODEL;\n}\n\n/**\n * Synchronous default model resolution for constructors and sync code paths.\n * Uses catalog/registry only (no async credential checks).\n *\n * When no model is explicitly configured, returns the preferred default\n * (`openai/gpt-5.5`) rather than picking an arbitrary first model from the\n * full catalog.\n */\nexport function getDefaultModelSync(config?: Config | null | undefined): string {\n const defaultModel = config?.agents?.defaults?.model;\n if (defaultModel) {\n const modelRef = typeof defaultModel === 'string' ? defaultModel : defaultModel.primary;\n if (modelRef) {\n return modelRef;\n }\n }\n\n return DEFAULT_FALLBACK_MODEL;\n}\n\n// Re-export ModelRegistry for advanced use cases\nexport { ModelRegistry, getModelRegistry, resetModelRegistry, prewarmModelRegistry } from './model-registry.js';\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["getPiAiModel","getPiAiProviders","getPiAiModels"],"sources":["../../../src/providers/index.ts"],"sourcesContent":["/**\n * Model provider module - integrates built-in models with custom models from models.json\n */\n\nimport {\n\tgetModel as getPiAiModel,\n\tgetModels as getPiAiModels,\n\tgetProviders as getPiAiProviders,\n\ttype Model,\n\ttype Api,\n} from '@earendil-works/pi-ai';\nimport type { Config } from '../config/schema.js';\nimport { getModelRegistry } from './model-registry.js';\nimport { CredentialResolver, resolveApiKey, hasCredentials } from '../auth/credentials.js';\nimport { hasProviderAuthOnDiskSync } from '../auth/sync-provider-auth.js';\nimport { getApiKeyFromEnv } from './env-keys.js';\nimport { getProviderRegistry } from './plugin-registry.js';\nimport type { ProviderModelDefinition } from '../extensions/types/providers.js';\n\nexport { getApiKeyFromEnv, PROVIDER_ENV_MAP } from './env-keys.js';\n\n/** Sentinel base URL: model is served by an extension {@link ProviderPluginRegistry} provider. */\nexport const EXTENSION_PROVIDER_BASE_URL = 'extension://provider-plugin';\nconst OPENAI_CODEX_CANONICAL_BASE_URL = 'https://chatgpt.com/backend-api/codex';\n\nfunction normalizeProviderModel(model: Model<Api>): Model<Api> {\n\tif (model.provider === 'openai-codex' && model.api === 'openai-codex-responses') {\n\t\treturn { ...model, baseUrl: OPENAI_CODEX_CANONICAL_BASE_URL } as Model<Api>;\n\t}\n\treturn model;\n}\n\n/** Map a plugin registry model to the pi-ai {@link Model} shape. */\nexport function pluginModelToModel(providerId: string, definition: ProviderModelDefinition): Model<Api> {\n\treturn {\n\t\tprovider: providerId,\n\t\tid: definition.id,\n\t\tname: definition.name,\n\t\tapi: 'openai-completions' as Api,\n\t\tbaseUrl: EXTENSION_PROVIDER_BASE_URL,\n\t\treasoning: false,\n\t\tinput: definition.supportsImages ? (['text', 'image'] as ('text' | 'image')[]) : (['text'] as ('text' | 'image')[]),\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxOutputTokens ?? 4096,\n\t\tcost: {\n\t\t\tinput: definition.pricing?.input ?? 0,\n\t\t\toutput: definition.pricing?.output ?? 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t},\n\t} as Model<Api>;\n}\n\n/**\n * Get API key synchronously: checks registry (models.json) first, then environment variables.\n * Use this for Agent's getApiKey callback which must be synchronous.\n */\nexport function getApiKeySync(provider: string): string | undefined {\n const pluginRegistry = getProviderRegistry();\n if (pluginRegistry.has(provider)) return 'extension-managed';\n\n const registry = getModelRegistry();\n const registryKey = registry.getApiKey(provider);\n if (registryKey) {\n return registryKey;\n }\n return getApiKeyFromEnv(provider);\n}\n\n/**\n * Resolve model reference. Supports:\n * - \"provider/modelId\" format\n * - \"modelId\" auto-detection via pi-ai or custom models\n * @throws if model not found\n */\nexport function resolveModel(ref: string): Model<Api> {\n\t// First try ModelRegistry (includes custom models)\n\tconst registry = getModelRegistry();\n\tconst customModel = registry.resolve(ref);\n\tif (customModel) {\n\t\treturn customModel;\n\t}\n\n\tif (ref.includes('/')) {\n\t\tconst [provider, modelId] = ref.split('/');\n\t\tconst piAiModel = getPiAiModel(provider as any, modelId as any);\n\t\tif (piAiModel) return normalizeProviderModel(piAiModel as Model<Api>);\n\n\t\tconst pluginRegistry = getProviderRegistry();\n\t\tconst plugin = pluginRegistry.get(provider);\n\t\tif (plugin) {\n\t\t\tconst pluginModel = plugin.models.find(m => m.id === modelId);\n\t\t\tif (pluginModel) return pluginModelToModel(provider, pluginModel);\n\t\t}\n\t\tthrow new Error(`Model not found: ${ref}`);\n\t}\n\n\tfor (const provider of getPiAiProviders()) {\n\t\ttry {\n\t\t\tconst models = getPiAiModels(provider);\n\t\t\tconst found = models.find(m => m.id === ref);\n\t\t\tif (found) return normalizeProviderModel(found as Model<Api>);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\tconst pluginRegistry = getProviderRegistry();\n\tfor (const plugin of pluginRegistry.listAll()) {\n\t\tconst found = plugin.models.find(m => m.id === ref);\n\t\tif (found) return pluginModelToModel(plugin.id, found);\n\t}\n\n\tthrow new Error(`Model not found: ${ref}. Use format: provider/model-id`);\n}\n\nexport function getModelsByProvider(provider: string): readonly Model<Api>[] {\n\tconst registry = getModelRegistry();\n\tconst fromRegistry = registry.getAll().filter(m => m.provider === provider).map(normalizeProviderModel);\n\tconst plugin = getProviderRegistry().get(provider);\n\tif (!plugin) return fromRegistry;\n\tconst pluginModels = plugin.models.map(m => pluginModelToModel(provider, m));\n\treturn [...fromRegistry, ...pluginModels];\n}\n\nexport function getAllProviders(): string[] {\n\tconst registry = getModelRegistry();\n\tconst providers = new Set<string>();\n\n\t// Add built-in providers\n\tfor (const p of getPiAiProviders()) {\n\t\tproviders.add(p);\n\t}\n\n\t// Add custom providers from registry\n\tfor (const m of registry.getAll()) {\n\t\tproviders.add(m.provider);\n\t}\n\n\tfor (const plugin of getProviderRegistry().listAll()) {\n\t\tproviders.add(plugin.id);\n\t}\n\n\treturn Array.from(providers);\n}\n\nexport async function getApiKey(provider: string): Promise<string | undefined> {\n\tif (getProviderRegistry().has(provider)) return 'extension-managed';\n\n\t// Use new credential resolver first (checks: agent private > global > oauth > env)\n\tconst credentialKey = await resolveApiKey(provider);\n\tif (credentialKey) {\n\t\treturn credentialKey;\n\t}\n\n\t// Check registry for custom providers (from models.json)\n\tconst registry = getModelRegistry();\n\tconst registryKey = registry.getApiKey(provider);\n\tif (registryKey) {\n\t\treturn registryKey;\n\t}\n\n\t// Fallback to environment variables\n\treturn getApiKeyFromEnv(provider);\n}\n\n/**\n * Synchronous version for use in non-async contexts\n * Only checks environment variables and registry, not credential system\n */\nexport function isProviderConfiguredSync(provider: string): boolean {\n\tif (getProviderRegistry().has(provider)) return true;\n\n\t// Check registry for custom providers\n\tconst registry = getModelRegistry();\n\tif (registry.getApiKey(provider)) {\n\t\treturn true;\n\t}\n\t// Check environment variables\n\tif (getApiKeyFromEnv(provider)) {\n\t\treturn true;\n\t}\n\t// Gateway UI / CLI store keys in auth-profiles.json (async CredentialResolver); sync path for fallback list\n\treturn hasProviderAuthOnDiskSync(provider);\n}\n\nexport async function isProviderConfigured(provider: string): Promise<boolean> {\n if (getProviderRegistry().has(provider)) return true;\n\n // Check registry first for custom providers (from models.json)\n const registry = getModelRegistry();\n if (registry.getApiKey(provider)) {\n return true;\n }\n return await hasCredentials(provider);\n}\n\n/** Where runtime {@link getApiKey} resolves the key from (no secret values). */\nexport type ProviderActiveKeySource = 'none' | 'agent' | 'gateway' | 'oauth' | 'env' | 'models_json' | 'extension';\n\nexport type ProviderAuthMode = ProviderActiveKeySource;\nexport type ProviderAuthStatus = 'connected' | 'expired' | 'not_connected';\n\nexport interface ProviderAuthState {\n authMode: ProviderAuthMode;\n authStatus: ProviderAuthStatus;\n expiresAt?: number;\n}\n\nexport async function getProviderActiveKeySource(provider: string): Promise<ProviderActiveKeySource> {\n const authState = await getProviderAuthState(provider);\n return authState.authMode;\n}\n\nexport async function getProviderAuthState(provider: string): Promise<ProviderAuthState> {\n if (getProviderRegistry().has(provider)) {\n return { authMode: 'extension', authStatus: 'connected' };\n }\n\n const resolver = new CredentialResolver();\n const fromCredentials = await resolver.resolveApiKeySource(provider);\n if (fromCredentials === 'agent') return { authMode: 'agent', authStatus: 'connected' };\n if (fromCredentials === 'global') return { authMode: 'gateway', authStatus: 'connected' };\n if (fromCredentials === 'oauth') {\n const token = await resolver.loadOAuthTokenRecord(provider);\n const expired = Boolean(token?.expiresAt && token.expiresAt < Date.now());\n return {\n authMode: 'oauth',\n authStatus: expired ? 'expired' : 'connected',\n ...(token?.expiresAt ? { expiresAt: token.expiresAt } : {}),\n };\n }\n if (fromCredentials === 'env') return { authMode: 'env', authStatus: 'connected' };\n\n const expiredOAuthToken = await resolver.loadOAuthTokenRecord(provider);\n if (expiredOAuthToken?.expiresAt && expiredOAuthToken.expiresAt < Date.now()) {\n return {\n authMode: 'oauth',\n authStatus: 'expired',\n expiresAt: expiredOAuthToken.expiresAt,\n };\n }\n\n const registry = getModelRegistry();\n if (registry.getApiKey(provider)) {\n return { authMode: 'models_json', authStatus: 'connected' };\n }\n\n return { authMode: 'none', authStatus: 'not_connected' };\n}\n\nexport async function getConfiguredProviders(): Promise<string[]> {\n\tconst allProviders = getAllProviders();\n\tconst configured: string[] = [];\n\tfor (const p of allProviders) {\n\t\tif (await isProviderConfigured(p)) {\n\t\t\tconfigured.push(p);\n\t\t}\n\t}\n\treturn configured;\n}\n\nexport function getAllModels(): readonly Model<Api>[] {\n\tconst registry = getModelRegistry();\n\tconst registryModels = registry.getAll().map(normalizeProviderModel);\n\tconst pluginProviders = getProviderRegistry().listAll();\n\tif (pluginProviders.length === 0) return registryModels;\n\n\tconst existingIds = new Set(registryModels.map(m => `${m.provider}/${m.id}`));\n\tconst merged: Model<Api>[] = [...registryModels];\n\tfor (const plugin of pluginProviders) {\n\t\tfor (const model of plugin.models) {\n\t\t\tconst compositeId = `${plugin.id}/${model.id}`;\n\t\t\tif (!existingIds.has(compositeId)) {\n\t\t\t\tmerged.push(pluginModelToModel(plugin.id, model));\n\t\t\t\texistingIds.add(compositeId);\n\t\t\t}\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport async function getAvailableModels(): Promise<readonly Model<Api>[]> {\n\tconst allModels = getAllModels();\n\tconst pluginRegistry = getProviderRegistry();\n\tconst available: Model<Api>[] = [];\n\tconst configuredByProvider = new Map<string, boolean>();\n\n\tfor (const model of allModels) {\n\t\tif (pluginRegistry.has(model.provider)) {\n\t\t\tavailable.push(model);\n\t\t\tcontinue;\n\t\t}\n\t\tlet configured = configuredByProvider.get(model.provider);\n\t\tif (configured === undefined) {\n\t\t\tconfigured = await isProviderConfigured(model.provider);\n\t\t\tconfiguredByProvider.set(model.provider, configured);\n\t\t}\n\t\tif (configured) {\n\t\t\tavailable.push(model);\n\t\t}\n\t}\n\treturn available;\n}\n\nexport type { Model, Api } from '@earendil-works/pi-ai';\n\nexport type ProviderCategory = 'common' | 'specialty' | 'oauth' | 'enterprise' | 'extension';\n\nexport interface ProviderMeta {\n name: string;\n category: ProviderCategory;\n supportsOAuth?: boolean;\n supportsApiKey?: boolean;\n}\n\nexport const PROVIDER_META: Record<string, ProviderMeta> = {\n 'openai': { name: 'OpenAI', category: 'common', supportsApiKey: true },\n 'anthropic': { name: 'Anthropic', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'deepseek': { name: 'DeepSeek', category: 'common', supportsApiKey: true },\n 'google': { name: 'Google AI', category: 'common', supportsApiKey: true },\n 'groq': { name: 'Groq', category: 'common', supportsApiKey: true },\n 'minimax': { name: 'MiniMax', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'minimax-cn': { name: 'MiniMax CN', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'kimi-coding': { name: 'Kimi For Coding', category: 'common', supportsApiKey: true, supportsOAuth: true },\n 'xai': { name: 'xAI', category: 'specialty', supportsApiKey: true },\n 'mistral': { name: 'Mistral AI', category: 'specialty', supportsApiKey: true },\n 'cerebras': { name: 'Cerebras', category: 'specialty', supportsApiKey: true },\n 'openrouter': { name: 'OpenRouter', category: 'specialty', supportsApiKey: true },\n 'huggingface': { name: 'Hugging Face', category: 'specialty', supportsApiKey: true },\n moonshotai: { name: 'Moonshot AI (Kimi · International)', category: 'common', supportsApiKey: true },\n 'moonshotai-cn': { name: 'Moonshot AI (Kimi · China)', category: 'common', supportsApiKey: true },\n fireworks: { name: 'Fireworks AI', category: 'specialty', supportsApiKey: true },\n together: { name: 'Together AI', category: 'specialty', supportsApiKey: true },\n 'cloudflare-workers-ai': { name: 'Cloudflare Workers AI', category: 'enterprise', supportsApiKey: true },\n 'cloudflare-ai-gateway': { name: 'Cloudflare AI Gateway', category: 'enterprise', supportsApiKey: true },\n xiaomi: { name: 'Xiaomi Mimo', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-cn': { name: 'Xiaomi Token Plan (CN)', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-ams': { name: 'Xiaomi Token Plan (AMS)', category: 'specialty', supportsApiKey: true },\n 'xiaomi-token-plan-sgp': { name: 'Xiaomi Token Plan (SGP)', category: 'specialty', supportsApiKey: true },\n 'opencode': { name: 'OpenCode', category: 'specialty', supportsApiKey: true },\n 'opencode-go': { name: 'OpenCode Go', category: 'specialty', supportsApiKey: true },\n /** DashScope (Alibaba) — image, speech, STT; not an LLM KnownProvider. */\n 'dashscope': { name: 'DashScope (Alibaba)', category: 'specialty', supportsApiKey: true },\n /** International GLM (api.z.ai). Auth: API key (ZAI_API_KEY); no published OAuth for this HTTP API. */\n 'zai': { name: 'Zhipu GLM (International · z.ai)', category: 'common', supportsApiKey: true },\n 'amazon-bedrock': { name: 'Amazon Bedrock', category: 'enterprise', supportsApiKey: true },\n 'azure-openai-responses': { name: 'Azure OpenAI', category: 'enterprise', supportsApiKey: true },\n 'google-vertex': { name: 'Google Vertex AI', category: 'enterprise', supportsApiKey: true },\n 'vercel-ai-gateway': { name: 'Vercel AI Gateway', category: 'enterprise', supportsApiKey: true },\n 'github-copilot': { name: 'GitHub Copilot (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'openai-codex': { name: 'OpenAI Codex (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'google-gemini-cli': { name: 'Google Gemini CLI (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n 'google-antigravity': { name: 'Google Antigravity (OAuth)', category: 'oauth', supportsOAuth: true, supportsApiKey: false },\n};\n\nexport function getSortedProviders(): string[] {\n const all = getAllProviders();\n const catOrder: Record<ProviderCategory, number> = { common: 0, specialty: 1, enterprise: 2, oauth: 3, extension: 4 };\n const pluginRegistry = getProviderRegistry();\n\n return [...all].sort((a, b) => {\n const catA = pluginRegistry.has(a) ? 'extension' : (PROVIDER_META[a]?.category ?? 'specialty');\n const catB = pluginRegistry.has(b) ? 'extension' : (PROVIDER_META[b]?.category ?? 'specialty');\n if (catOrder[catA] !== catOrder[catB]) {\n return catOrder[catA] - catOrder[catB];\n }\n return a.localeCompare(b);\n });\n}\n\nexport function getProviderDisplayName(provider: string): string {\n const plugin = getProviderRegistry().get(provider);\n if (plugin) return plugin.name;\n return PROVIDER_META[provider]?.name || provider;\n}\n\nexport function providerSupportsOAuth(provider: string): boolean {\n return PROVIDER_META[provider]?.supportsOAuth ?? false;\n}\n\nexport function providerSupportsApiKey(provider: string): boolean {\n return PROVIDER_META[provider]?.supportsApiKey ?? true;\n}\n\n// ============================================\n// Dynamic Default Model Resolution\n// ============================================\n\n/** Preferred default model when no explicit model is configured. */\nconst DEFAULT_FALLBACK_MODEL = 'openai/gpt-5.5';\n\n/**\n * Get a default model reference.\n * Priority:\n * 1. Explicitly configured model in agents.defaults.models.chat (if set and available)\n * 2. Default fallback: openai/gpt-5.5\n */\nexport async function getDefaultModel(config?: Config | null | undefined): Promise<string> {\n const defaultModel = config?.agents?.defaults?.models?.chat;\n if (defaultModel) {\n const modelRef = defaultModel.primary;\n if (modelRef) {\n const availableModels = await getAvailableModels();\n const configured = availableModels.find(m => \n `${m.provider}/${m.id}` === modelRef ||\n m.id === modelRef\n );\n if (configured) {\n return `${configured.provider}/${configured.id}`;\n }\n return modelRef;\n }\n }\n\n return DEFAULT_FALLBACK_MODEL;\n}\n\n/**\n * Synchronous default model resolution for constructors and sync code paths.\n * Uses catalog/registry only (no async credential checks).\n *\n * When no model is explicitly configured, returns the preferred default\n * (`openai/gpt-5.5`) rather than picking an arbitrary first model from the\n * full catalog.\n */\nexport function getDefaultModelSync(config?: Config | null | undefined): string {\n const defaultModel = config?.agents?.defaults?.models?.chat;\n if (defaultModel) {\n const modelRef = defaultModel.primary;\n if (modelRef) {\n return modelRef;\n }\n }\n\n return DEFAULT_FALLBACK_MODEL;\n}\n\n// Re-export ModelRegistry for advanced use cases\nexport { ModelRegistry, getModelRegistry, resetModelRegistry, prewarmModelRegistry } from './model-registry.js';\n"],"mappings":"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"}
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * Combines binding rules, identity links, and config to pick an agent and session keys.
5
5
  */
6
- import type { LocalizedText } from '../config/localized-text.js';
7
6
  import type { BindingRule, RouteInput, RouteResult } from './bindings.js';
8
7
  /**
9
8
  * Route context type (alias for RouteInput)
@@ -53,8 +52,6 @@ export interface AgentConfig {
53
52
  /** Registered agents */
54
53
  list?: Array<{
55
54
  id: string;
56
- name?: LocalizedText;
57
- description?: LocalizedText;
58
55
  enabled?: boolean;
59
56
  [key: string]: unknown;
60
57
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-route.js","names":["resolveDefaultAgentIdFromConfig","resolveBindingRoute"],"sources":["../../../src/routing/resolve-route.ts"],"sourcesContent":["/**\n * Route resolution\n *\n * Combines binding rules, identity links, and config to pick an agent and session keys.\n */\n\nimport { resolveDefaultAgentId as resolveDefaultAgentIdFromConfig } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport type { LocalizedText } from '../config/localized-text.js';\nimport type { BindingRule, RouteInput, RouteResult } from './bindings.js';\n\n/**\n * Route context type (alias for RouteInput)\n */\nexport type RouteContext = RouteInput;\nimport { parseBindingRules, resolveRoute as resolveBindingRoute } from './bindings.js';\nimport { buildSessionKey, normalizeSessionKey, parseSessionKey } from './session-key.js';\nimport {\n buildAgentMainSessionKey,\n buildAgentPeerSessionKey,\n} from './agent-session-key.js';\nimport { normalizeAccountId } from './account-id.js';\n\n/**\n * Identity link map: canonical peer id -> aliases across channels.\n *\n * Shape: `{ canonicalName: [alias1, alias2, ...] }`\n */\nexport type IdentityLinks = Record<string, string[]>;\n\n/**\n * Session-related routing options.\n */\nexport interface SessionConfig {\n scope?: 'per-sender' | 'global';\n mainKey?: string;\n /** How DM sessions are scoped / merged */\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n /** Cross-channel identity aliases */\n identityLinks?: IdentityLinks;\n resetTriggers?: string[];\n idleMinutes?: number;\n reset?: {\n mode?: 'daily' | 'idle';\n atHour?: number;\n idleMinutes?: number;\n };\n resetByType?: {\n direct?: SessionConfig['reset'];\n group?: SessionConfig['reset'];\n thread?: SessionConfig['reset'];\n };\n resetByChannel?: Record<string, NonNullable<SessionConfig['reset']>>;\n /** Optional session store tuning */\n storage?: {\n pruneAfterMs?: number;\n maxEntries?: number;\n };\n}\n\n/**\n * Agent list and default id from config.\n */\nexport interface AgentConfig {\n /** Default agent id */\n default?: string;\n /** Registered agents */\n list?: Array<{\n id: string;\n name?: LocalizedText;\n description?: LocalizedText;\n enabled?: boolean;\n [key: string]: unknown;\n }>;\n}\n\n/**\n * Subset of app config used for routing.\n */\nexport interface RoutingConfig {\n agents?: AgentConfig;\n bindings?: BindingRule[] | any[];\n session?: SessionConfig;\n}\n\n/**\n * Input to `resolveRoute`.\n */\nexport interface ResolveRouteInput extends RouteInput {\n /** Routing config snapshot */\n config: RoutingConfig;\n /** Optional thread id for threaded channels */\n threadId?: string | null;\n}\n\n/**\n * Resolved route including session keys.\n */\nexport interface ResolveRouteResult extends RouteResult {\n /** Active session key for this turn */\n sessionKey: string;\n /** Main session key (DM merge target) */\n mainSessionKey: string;\n /** Whether routing used the main or a per-session key */\n lastRoutePolicy: 'main' | 'session';\n}\n\n/**\n * Apply identity links and return a canonical lowercased peer id.\n */\nexport function applyIdentityLinks(\n peerId: string,\n channel: string,\n identityLinks?: IdentityLinks\n): string {\n if (!identityLinks) {\n return peerId.toLowerCase();\n }\n \n const normalizedPeerId = peerId.trim().toLowerCase();\n if (!normalizedPeerId) {\n return normalizedPeerId;\n }\n \n const candidates = new Set<string>();\n candidates.add(normalizedPeerId);\n \n const channelPrefix = channel.trim().toLowerCase();\n if (channelPrefix) {\n candidates.add(`${channelPrefix}:${normalizedPeerId}`);\n }\n \n // Match any alias to its canonical id\n for (const [canonical, aliases] of Object.entries(identityLinks)) {\n if (!Array.isArray(aliases)) {\n continue;\n }\n \n for (const alias of aliases) {\n const normalizedAlias = alias.trim().toLowerCase();\n if (candidates.has(normalizedAlias)) {\n return canonical.trim().toLowerCase();\n }\n }\n }\n \n return normalizedPeerId;\n}\n\n/**\n * Default agent id from config (`agents.default`, `list[].default`, or `main`).\n */\nexport function getDefaultAgentId(config: RoutingConfig): string {\n return resolveDefaultAgentIdFromConfig(config as Config);\n}\n\n/**\n * Whether `agentId` appears in the enabled agent list (or list is absent).\n */\nexport function agentExists(agentId: string, config: RoutingConfig): boolean {\n if (!config.agents?.list) {\n return true; // No list: treat every id as valid\n }\n \n return config.agents.list.some(\n (agent) => agent.enabled !== false && agent.id.toLowerCase() === agentId.toLowerCase()\n );\n}\n\n/**\n * Return `agentId` if listed, otherwise the default agent id.\n */\nexport function pickFirstExistingAgentId(agentId: string, config: RoutingConfig): string {\n if (!agentId) {\n return getDefaultAgentId(config);\n }\n \n if (agentExists(agentId, config)) {\n return agentId.toLowerCase();\n }\n \n return getDefaultAgentId(config);\n}\n\n/**\n * Thin wrapper around `buildSessionKey` for route inputs.\n */\nexport function buildRouteSessionKey(\n agentId: string,\n channel: string,\n accountId: string,\n peerKind: string,\n peerId: string,\n threadId?: string | null,\n scopeId?: string | null,\n): string {\n return buildSessionKey({\n agentId,\n source: channel,\n accountId,\n peerKind,\n peerId,\n threadId: threadId || undefined,\n scopeId: scopeId || undefined,\n dmScope: peerKind === 'dm' || peerKind === 'direct' ? 'per-account-channel-peer' : undefined,\n });\n}\n\n/**\n * Map session vs main key to policy label.\n */\nexport function deriveLastRoutePolicy(\n sessionKey: string,\n mainSessionKey: string\n): 'main' | 'session' {\n return sessionKey === mainSessionKey ? 'main' : 'session';\n}\n\n/**\n * Resolve agent and session keys from channel context and config.\n */\nexport function resolveRoute(input: ResolveRouteInput): ResolveRouteResult {\n const { config, threadId } = input;\n \n const channel = (input.channel ?? '').trim().toLowerCase() || 'unknown';\n const accountId = normalizeAccountId(input.accountId);\n const peerKind = (input.peerKind ?? 'dm').toLowerCase();\n const rawPeerId = (input.peerId ?? '').trim();\n \n const peerId = applyIdentityLinks(rawPeerId, channel, config.session?.identityLinks ?? {});\n \n const rules = Array.isArray(config.bindings)\n ? parseBindingRules({ bindings: config.bindings })\n : [];\n \n const bindingResult = resolveBindingRoute(\n {\n channel,\n accountId,\n peerKind: input.peerKind,\n peerId: rawPeerId,\n guildId: input.guildId,\n teamId: input.teamId,\n memberRoleIds: input.memberRoleIds,\n },\n rules,\n getDefaultAgentId(config)\n );\n \n const agentId = pickFirstExistingAgentId(bindingResult.agentId, config);\n \n const dmScope = config.session?.dmScope ?? 'main';\n\n let sessionKey: string;\n let mainSessionKey: string;\n\n const identityLinks = config.session?.identityLinks;\n const mainKey = undefined;\n\n if (peerKind === 'dm' || peerKind === 'direct') {\n mainSessionKey = buildAgentMainSessionKey({ agentId, mainKey });\n\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: 'direct',\n peerId,\n identityLinks,\n dmScope,\n });\n } else {\n const mappedKind = peerKind === 'group' || peerKind === 'channel' ? peerKind : peerKind;\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId,\n identityLinks,\n });\n mainSessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId: 'main',\n identityLinks,\n });\n }\n\n if (threadId && !sessionKey.includes(':thread:')) {\n sessionKey = `${sessionKey}:thread:${threadId.toLowerCase()}`;\n }\n \n sessionKey = normalizeSessionKey(sessionKey);\n mainSessionKey = normalizeSessionKey(mainSessionKey);\n \n return {\n ...bindingResult,\n agentId,\n sessionKey,\n mainSessionKey,\n lastRoutePolicy: deriveLastRoutePolicy(sessionKey, mainSessionKey),\n };\n}\n\n/**\n * Parse basic routing fields from a session key string.\n */\nexport function resolveRouteFromSessionKey(\n sessionKey: string,\n _config: RoutingConfig\n): { agentId: string; source: string; accountId: string; peerKind: string; peerId: string } | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n return {\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolve-route.js","names":["resolveDefaultAgentIdFromConfig","resolveBindingRoute"],"sources":["../../../src/routing/resolve-route.ts"],"sourcesContent":["/**\n * Route resolution\n *\n * Combines binding rules, identity links, and config to pick an agent and session keys.\n */\n\nimport { resolveDefaultAgentId as resolveDefaultAgentIdFromConfig } from '../agent/agent-scope.js';\nimport type { Config } from '../config/schema.js';\nimport type { BindingRule, RouteInput, RouteResult } from './bindings.js';\n\n/**\n * Route context type (alias for RouteInput)\n */\nexport type RouteContext = RouteInput;\nimport { parseBindingRules, resolveRoute as resolveBindingRoute } from './bindings.js';\nimport { buildSessionKey, normalizeSessionKey, parseSessionKey } from './session-key.js';\nimport {\n buildAgentMainSessionKey,\n buildAgentPeerSessionKey,\n} from './agent-session-key.js';\nimport { normalizeAccountId } from './account-id.js';\n\n/**\n * Identity link map: canonical peer id -> aliases across channels.\n *\n * Shape: `{ canonicalName: [alias1, alias2, ...] }`\n */\nexport type IdentityLinks = Record<string, string[]>;\n\n/**\n * Session-related routing options.\n */\nexport interface SessionConfig {\n scope?: 'per-sender' | 'global';\n mainKey?: string;\n /** How DM sessions are scoped / merged */\n dmScope?: 'main' | 'per-peer' | 'per-channel-peer' | 'per-account-channel-peer';\n /** Cross-channel identity aliases */\n identityLinks?: IdentityLinks;\n resetTriggers?: string[];\n idleMinutes?: number;\n reset?: {\n mode?: 'daily' | 'idle';\n atHour?: number;\n idleMinutes?: number;\n };\n resetByType?: {\n direct?: SessionConfig['reset'];\n group?: SessionConfig['reset'];\n thread?: SessionConfig['reset'];\n };\n resetByChannel?: Record<string, NonNullable<SessionConfig['reset']>>;\n /** Optional session store tuning */\n storage?: {\n pruneAfterMs?: number;\n maxEntries?: number;\n };\n}\n\n/**\n * Agent list and default id from config.\n */\nexport interface AgentConfig {\n /** Default agent id */\n default?: string;\n /** Registered agents */\n list?: Array<{\n id: string;\n enabled?: boolean;\n [key: string]: unknown;\n }>;\n}\n\n/**\n * Subset of app config used for routing.\n */\nexport interface RoutingConfig {\n agents?: AgentConfig;\n bindings?: BindingRule[] | any[];\n session?: SessionConfig;\n}\n\n/**\n * Input to `resolveRoute`.\n */\nexport interface ResolveRouteInput extends RouteInput {\n /** Routing config snapshot */\n config: RoutingConfig;\n /** Optional thread id for threaded channels */\n threadId?: string | null;\n}\n\n/**\n * Resolved route including session keys.\n */\nexport interface ResolveRouteResult extends RouteResult {\n /** Active session key for this turn */\n sessionKey: string;\n /** Main session key (DM merge target) */\n mainSessionKey: string;\n /** Whether routing used the main or a per-session key */\n lastRoutePolicy: 'main' | 'session';\n}\n\n/**\n * Apply identity links and return a canonical lowercased peer id.\n */\nexport function applyIdentityLinks(\n peerId: string,\n channel: string,\n identityLinks?: IdentityLinks\n): string {\n if (!identityLinks) {\n return peerId.toLowerCase();\n }\n \n const normalizedPeerId = peerId.trim().toLowerCase();\n if (!normalizedPeerId) {\n return normalizedPeerId;\n }\n \n const candidates = new Set<string>();\n candidates.add(normalizedPeerId);\n \n const channelPrefix = channel.trim().toLowerCase();\n if (channelPrefix) {\n candidates.add(`${channelPrefix}:${normalizedPeerId}`);\n }\n \n // Match any alias to its canonical id\n for (const [canonical, aliases] of Object.entries(identityLinks)) {\n if (!Array.isArray(aliases)) {\n continue;\n }\n \n for (const alias of aliases) {\n const normalizedAlias = alias.trim().toLowerCase();\n if (candidates.has(normalizedAlias)) {\n return canonical.trim().toLowerCase();\n }\n }\n }\n \n return normalizedPeerId;\n}\n\n/**\n * Default agent id from config (`agents.default`, `list[].default`, or `main`).\n */\nexport function getDefaultAgentId(config: RoutingConfig): string {\n return resolveDefaultAgentIdFromConfig(config as Config);\n}\n\n/**\n * Whether `agentId` appears in the enabled agent list (or list is absent).\n */\nexport function agentExists(agentId: string, config: RoutingConfig): boolean {\n if (!config.agents?.list) {\n return true; // No list: treat every id as valid\n }\n \n return config.agents.list.some(\n (agent) => agent.enabled !== false && agent.id.toLowerCase() === agentId.toLowerCase()\n );\n}\n\n/**\n * Return `agentId` if listed, otherwise the default agent id.\n */\nexport function pickFirstExistingAgentId(agentId: string, config: RoutingConfig): string {\n if (!agentId) {\n return getDefaultAgentId(config);\n }\n \n if (agentExists(agentId, config)) {\n return agentId.toLowerCase();\n }\n \n return getDefaultAgentId(config);\n}\n\n/**\n * Thin wrapper around `buildSessionKey` for route inputs.\n */\nexport function buildRouteSessionKey(\n agentId: string,\n channel: string,\n accountId: string,\n peerKind: string,\n peerId: string,\n threadId?: string | null,\n scopeId?: string | null,\n): string {\n return buildSessionKey({\n agentId,\n source: channel,\n accountId,\n peerKind,\n peerId,\n threadId: threadId || undefined,\n scopeId: scopeId || undefined,\n dmScope: peerKind === 'dm' || peerKind === 'direct' ? 'per-account-channel-peer' : undefined,\n });\n}\n\n/**\n * Map session vs main key to policy label.\n */\nexport function deriveLastRoutePolicy(\n sessionKey: string,\n mainSessionKey: string\n): 'main' | 'session' {\n return sessionKey === mainSessionKey ? 'main' : 'session';\n}\n\n/**\n * Resolve agent and session keys from channel context and config.\n */\nexport function resolveRoute(input: ResolveRouteInput): ResolveRouteResult {\n const { config, threadId } = input;\n \n const channel = (input.channel ?? '').trim().toLowerCase() || 'unknown';\n const accountId = normalizeAccountId(input.accountId);\n const peerKind = (input.peerKind ?? 'dm').toLowerCase();\n const rawPeerId = (input.peerId ?? '').trim();\n \n const peerId = applyIdentityLinks(rawPeerId, channel, config.session?.identityLinks ?? {});\n \n const rules = Array.isArray(config.bindings)\n ? parseBindingRules({ bindings: config.bindings })\n : [];\n \n const bindingResult = resolveBindingRoute(\n {\n channel,\n accountId,\n peerKind: input.peerKind,\n peerId: rawPeerId,\n guildId: input.guildId,\n teamId: input.teamId,\n memberRoleIds: input.memberRoleIds,\n },\n rules,\n getDefaultAgentId(config)\n );\n \n const agentId = pickFirstExistingAgentId(bindingResult.agentId, config);\n \n const dmScope = config.session?.dmScope ?? 'main';\n\n let sessionKey: string;\n let mainSessionKey: string;\n\n const identityLinks = config.session?.identityLinks;\n const mainKey = undefined;\n\n if (peerKind === 'dm' || peerKind === 'direct') {\n mainSessionKey = buildAgentMainSessionKey({ agentId, mainKey });\n\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: 'direct',\n peerId,\n identityLinks,\n dmScope,\n });\n } else {\n const mappedKind = peerKind === 'group' || peerKind === 'channel' ? peerKind : peerKind;\n sessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId,\n identityLinks,\n });\n mainSessionKey = buildAgentPeerSessionKey({\n agentId,\n mainKey,\n channel,\n accountId,\n peerKind: mappedKind as 'group' | 'channel',\n peerId: 'main',\n identityLinks,\n });\n }\n\n if (threadId && !sessionKey.includes(':thread:')) {\n sessionKey = `${sessionKey}:thread:${threadId.toLowerCase()}`;\n }\n \n sessionKey = normalizeSessionKey(sessionKey);\n mainSessionKey = normalizeSessionKey(mainSessionKey);\n \n return {\n ...bindingResult,\n agentId,\n sessionKey,\n mainSessionKey,\n lastRoutePolicy: deriveLastRoutePolicy(sessionKey, mainSessionKey),\n };\n}\n\n/**\n * Parse basic routing fields from a session key string.\n */\nexport function resolveRouteFromSessionKey(\n sessionKey: string,\n _config: RoutingConfig\n): { agentId: string; source: string; accountId: string; peerKind: string; peerId: string } | null {\n const parsed = parseSessionKey(sessionKey);\n if (!parsed) {\n return null;\n }\n \n return {\n agentId: parsed.agentId,\n source: parsed.source,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n };\n}\n"],"mappings":"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"}
@@ -12,11 +12,13 @@ export declare function resolveInitialTuiAgentId(params: {
12
12
  initialSessionInput?: string;
13
13
  cwd?: string;
14
14
  }): string;
15
+ export declare function createDefaultTuiSessionKeySuffix(): string;
15
16
  /** Resolve TUI startup session key from CLI options and config. */
16
17
  export declare function resolveTuiStartupSessionKey(params: {
17
18
  cfg: Config;
18
19
  sessionOption?: string;
19
20
  cwd?: string;
21
+ createSessionKeySuffix?: () => string;
20
22
  }): {
21
23
  sessionKey: string;
22
24
  agentId: string;
@@ -2,6 +2,7 @@ import { init_agent_scope, resolveAgentIdByWorkspacePath, resolveDefaultAgentId
2
2
  import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../utils/string-coerce.js";
3
3
  import { parseAgentSessionKey } from "./session-key-utils.js";
4
4
  import { buildAgentMainSessionKey, init_agent_session_key, normalizeAgentId, normalizeMainKey } from "./agent-session-key.js";
5
+ import { randomUUID } from "node:crypto";
5
6
  //#region src/routing/resolve-tui-session-key.ts
6
7
  init_agent_scope();
7
8
  init_agent_session_key();
@@ -26,19 +27,23 @@ function resolveInitialTuiAgentId(params) {
26
27
  if (inferredFromWorkspace) return inferredFromWorkspace;
27
28
  return normalizeAgentId(params.fallbackAgentId);
28
29
  }
30
+ function createDefaultTuiSessionKeySuffix() {
31
+ return `tui-${randomUUID()}`;
32
+ }
29
33
  /** Resolve TUI startup session key from CLI options and config. */
30
34
  function resolveTuiStartupSessionKey(params) {
31
35
  const sessionScope = params.cfg.session?.scope ?? "per-sender";
32
36
  const sessionMainKey = normalizeMainKey(params.cfg.session?.mainKey);
37
+ const sessionOption = (params.sessionOption ?? "").trim();
33
38
  const agentId = resolveInitialTuiAgentId({
34
39
  cfg: params.cfg,
35
40
  fallbackAgentId: resolveDefaultAgentId(params.cfg),
36
- initialSessionInput: (params.sessionOption ?? "").trim(),
41
+ initialSessionInput: sessionOption,
37
42
  cwd: params.cwd ?? process.cwd()
38
43
  });
39
44
  return {
40
45
  sessionKey: resolveTuiSessionKey({
41
- raw: params.sessionOption,
46
+ raw: sessionOption || (params.createSessionKeySuffix ?? createDefaultTuiSessionKeySuffix)(),
42
47
  sessionScope,
43
48
  currentAgentId: agentId,
44
49
  sessionMainKey
@@ -49,6 +54,6 @@ function resolveTuiStartupSessionKey(params) {
49
54
  };
50
55
  }
51
56
  //#endregion
52
- export { resolveInitialTuiAgentId, resolveTuiSessionKey, resolveTuiStartupSessionKey };
57
+ export { createDefaultTuiSessionKeySuffix, resolveInitialTuiAgentId, resolveTuiSessionKey, resolveTuiStartupSessionKey };
53
58
 
54
59
  //# sourceMappingURL=resolve-tui-session-key.js.map