@xopcai/xopc 0.0.102 → 0.0.104

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 (995) hide show
  1. package/README.md +8 -5
  2. package/README.zh-CN.md +8 -5
  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 +2 -2
  20. package/dist/extensions/feishu/src/transport/webhook/monitor.js.map +1 -1
  21. package/dist/extensions/feishu/xopc.extension.json +66 -1
  22. package/dist/extensions/telegram/src/adapters/gateway-setup.d.ts +2 -0
  23. package/dist/extensions/telegram/src/adapters/gateway-setup.js +146 -0
  24. package/dist/extensions/telegram/src/adapters/gateway-setup.js.map +1 -0
  25. package/dist/extensions/telegram/src/adapters/security-adapter.js +1 -1
  26. package/dist/extensions/telegram/src/command-handler.js +1 -2
  27. package/dist/extensions/telegram/src/command-handler.js.map +1 -1
  28. package/dist/extensions/telegram/src/config-schema.js +2 -2
  29. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  30. package/dist/extensions/telegram/src/doctor.d.ts +1 -0
  31. package/dist/extensions/telegram/src/doctor.js +68 -0
  32. package/dist/extensions/telegram/src/doctor.js.map +1 -1
  33. package/dist/extensions/telegram/src/index.d.ts +8 -1
  34. package/dist/extensions/telegram/src/index.js +15 -2
  35. package/dist/extensions/telegram/src/index.js.map +1 -0
  36. package/dist/extensions/telegram/src/plugin.d.ts +13 -5
  37. package/dist/extensions/telegram/src/plugin.js +32 -12
  38. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  39. package/dist/extensions/telegram/src/proxy-fetch.js +22 -5
  40. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -1
  41. package/dist/extensions/telegram/src/send-options.js +8 -5
  42. package/dist/extensions/telegram/src/send-options.js.map +1 -1
  43. package/dist/extensions/telegram/xopc.extension.json +412 -5
  44. package/dist/extensions/weixin/src/adapters/onboard-cli.js +2 -2
  45. package/dist/extensions/weixin/src/adapters/onboard-cli.js.map +1 -1
  46. package/dist/extensions/weixin/src/api/api.js +1 -1
  47. package/dist/extensions/weixin/src/index.d.ts +8 -0
  48. package/dist/extensions/weixin/src/index.js +12 -1
  49. package/dist/extensions/weixin/src/index.js.map +1 -0
  50. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  51. package/dist/extensions/weixin/src/plugin.d.ts +2 -1
  52. package/dist/extensions/weixin/src/plugin.js +77 -2
  53. package/dist/extensions/weixin/src/plugin.js.map +1 -1
  54. package/dist/extensions/weixin/xopc.extension.json +52 -0
  55. package/dist/gateway/static/root/assets/agents-CvsBrBfi.js +396 -0
  56. package/dist/gateway/static/root/assets/{apps-page-Uv4kOmDE.js → apps-page-L-IwQTe0.js} +1 -1
  57. package/dist/gateway/static/root/assets/browser-BLJWD7WI.js +8 -0
  58. package/dist/gateway/static/root/assets/channels-settings-D95KuPeP.js +1 -0
  59. package/dist/gateway/static/root/assets/cron-page-CfkWXDAI.js +1 -0
  60. package/dist/gateway/static/root/assets/{dist-DH4IuRV0.js → dist-C6vclgEL.js} +1 -1
  61. package/dist/gateway/static/root/assets/{extension-debug-page-BNkhvRQW.js → extension-debug-page-D4JYAbsX.js} +1 -1
  62. package/dist/gateway/static/root/assets/{extension-page-CcIGQah2.js → extension-page-_T62gi6e.js} +1 -1
  63. package/dist/gateway/static/root/assets/extension-settings-page-CkJbjyM-.js +1 -0
  64. package/dist/gateway/static/root/assets/{fetch-drJUxxKP.js → fetch-B5aiIguv.js} +1 -1
  65. package/dist/gateway/static/root/assets/gateway-startup-retry-DqmLXhs6.js +1 -0
  66. package/dist/gateway/static/root/assets/heartbeat-config-api-HwJV1K_Y.js +1 -0
  67. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +1 -0
  68. package/dist/gateway/static/root/assets/index-DvTb6wNR.js +4845 -0
  69. package/dist/gateway/static/root/assets/{logs-page-CiG0m81R.js → logs-page-DsjtTjBy.js} +2 -2
  70. package/dist/gateway/static/root/assets/{note-detail-page-DG3DVFTf.js → note-detail-page-B2V7RhgD.js} +43 -43
  71. package/dist/gateway/static/root/assets/{note-time-DjlllCF3.js → note-time-BG8GCTr4.js} +1 -1
  72. package/dist/gateway/static/root/assets/notes-page-xrcVBQ6Z.js +1 -0
  73. package/dist/gateway/static/root/assets/schema-form-S-QUvhul.js +1 -0
  74. package/dist/gateway/static/root/assets/sessions-page-CrQer6Au.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-DujQl9c7.js +2 -0
  76. package/dist/gateway/static/root/assets/{settings-form-section-C3_sEFfD.js → settings-form-section-r1V7dRV6.js} +1 -1
  77. package/dist/gateway/static/root/assets/settings-page-C9nrONQ2.js +3 -0
  78. package/dist/gateway/static/root/assets/share-preview-page-DOFy0FNt.js +2 -0
  79. package/dist/gateway/static/root/assets/skills-page-DmTsrs_a.js +2 -0
  80. package/dist/gateway/static/root/assets/{theme-store-B6KXPHgK.js → theme-store-Bo3j5Ovv.js} +1 -1
  81. package/dist/gateway/static/root/assets/url-WgQIjFZu.js +3 -0
  82. package/dist/gateway/static/root/assets/voice-api-key-field-AjmUAlEQ.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-page.utils-g57BRfEd.js → workflow-page.utils-DLEJ92gK.js} +1 -1
  84. package/dist/gateway/static/root/assets/workflows-page-BnjjKrM1.js +27 -0
  85. package/dist/gateway/static/root/index.html +6 -5
  86. package/dist/package.js +1 -1
  87. package/dist/src/agent/agent-manager.d.ts +18 -6
  88. package/dist/src/agent/agent-manager.js +60 -35
  89. package/dist/src/agent/agent-manager.js.map +1 -1
  90. package/dist/src/agent/builtin-agent-ids.d.ts +2 -0
  91. package/dist/src/agent/builtin-agent-ids.js +17 -0
  92. package/dist/src/agent/builtin-agent-ids.js.map +1 -0
  93. package/dist/src/agent/child-agent-factory.d.ts +4 -0
  94. package/dist/src/agent/child-agent-factory.js +28 -8
  95. package/dist/src/agent/child-agent-factory.js.map +1 -1
  96. package/dist/src/agent/context/workspace-seed.js +1 -1
  97. package/dist/src/agent/context/workspace-templates/AGENTS.md +23 -184
  98. package/dist/src/agent/embedded/run-turn.js +8 -2
  99. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  100. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  101. package/dist/src/agent/embedded/subscribe-session.js +33 -51
  102. package/dist/src/agent/embedded/subscribe-session.js.map +1 -1
  103. package/dist/src/agent/embedded/types.d.ts +36 -35
  104. package/dist/src/agent/fallback/candidates.js +1 -1
  105. package/dist/src/agent/fallback/candidates.js.map +1 -1
  106. package/dist/src/agent/inbound/attachment-pipeline.js +2 -2
  107. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -1
  108. package/dist/src/agent/inbound/inbound-loop.js +1 -1
  109. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
  110. package/dist/src/agent/inbound/turn-dispatcher.js +24 -5
  111. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  112. package/dist/src/agent/models/manager.d.ts +1 -1
  113. package/dist/src/agent/models/manager.js +1 -1
  114. package/dist/src/agent/models/manager.js.map +1 -1
  115. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +1 -1
  116. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
  117. package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
  118. package/dist/src/agent/prompt/sections/tooling.js +4 -0
  119. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  120. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -0
  121. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  122. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  123. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  124. package/dist/src/agent/service/process-direct-streaming.js +35 -18
  125. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  126. package/dist/src/agent/service-inbound-utils.d.ts +0 -1
  127. package/dist/src/agent/service-inbound-utils.js +1 -17
  128. package/dist/src/agent/service-inbound-utils.js.map +1 -1
  129. package/dist/src/agent/service.d.ts +4 -4
  130. package/dist/src/agent/service.js +27 -15
  131. package/dist/src/agent/service.js.map +1 -1
  132. package/dist/src/agent/session/session-config-service.d.ts +1 -0
  133. package/dist/src/agent/session/session-config-service.js +9 -1
  134. package/dist/src/agent/session/session-config-service.js.map +1 -1
  135. package/dist/src/agent/session/session-inspector.d.ts +2 -1
  136. package/dist/src/agent/session/session-inspector.js +4 -0
  137. package/dist/src/agent/session/session-inspector.js.map +1 -1
  138. package/dist/src/agent/skills/config.js +1 -3
  139. package/dist/src/agent/skills/config.js.map +1 -1
  140. package/dist/src/agent/skills/format-skills-prompt.d.ts +1 -0
  141. package/dist/src/agent/skills/format-skills-prompt.js +3 -2
  142. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  143. package/dist/src/agent/skills/hub-pull.js +1 -1
  144. package/dist/src/agent/skills/index.js +20 -5
  145. package/dist/src/agent/skills/index.js.map +1 -1
  146. package/dist/src/agent/skills/installer.js +14 -27
  147. package/dist/src/agent/skills/installer.js.map +1 -1
  148. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -1
  149. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  150. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +18 -4
  151. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  152. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +11 -2
  153. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  154. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -2
  155. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  156. package/dist/src/agent/skills/skill-manager.d.ts +4 -1
  157. package/dist/src/agent/skills/skill-manager.js +3 -3
  158. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  159. package/dist/src/agent/skills/skill-view-path.d.ts +1 -17
  160. package/dist/src/agent/skills/skill-view-path.js +3 -66
  161. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  162. package/dist/src/agent/skills/test-framework.js +2 -3
  163. package/dist/src/agent/skills/test-framework.js.map +1 -1
  164. package/dist/src/agent/streaming/reasoning-visibility-sse.js +1 -0
  165. package/dist/src/agent/streaming/reasoning-visibility-sse.js.map +1 -1
  166. package/dist/src/agent/tool-manuals/browser.d.ts +1 -0
  167. package/{skills/browser/SKILL.md → dist/src/agent/tool-manuals/browser.js} +51 -54
  168. package/dist/src/agent/tool-manuals/browser.js.map +1 -0
  169. package/dist/src/agent/tool-manuals/index.d.ts +10 -0
  170. package/dist/src/agent/tool-manuals/index.js +28 -0
  171. package/dist/src/agent/tool-manuals/index.js.map +1 -0
  172. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  173. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  174. package/dist/src/agent/tools/factory.js +7 -5
  175. package/dist/src/agent/tools/factory.js.map +1 -1
  176. package/dist/src/agent/tools/index.d.ts +1 -0
  177. package/dist/src/agent/tools/index.js +5 -4
  178. package/dist/src/agent/tools/send-media.js +1 -2
  179. package/dist/src/agent/tools/send-media.js.map +1 -1
  180. package/dist/src/agent/tools/session-search-tool.js +1 -1
  181. package/dist/src/agent/tools/shell.js +1 -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/tools/web-extract.js +2 -2
  188. package/dist/src/agent/tools/web.js +1 -1
  189. package/dist/src/agent/workflow/catalog.d.ts +7 -2
  190. package/dist/src/agent/workflow/catalog.js +66 -25
  191. package/dist/src/agent/workflow/catalog.js.map +1 -1
  192. package/dist/src/agent/workflow/subagent-runner.d.ts +3 -0
  193. package/dist/src/agent/workflow/subagent-runner.js +50 -4
  194. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  195. package/dist/src/agent/workflow/types.d.ts +10 -0
  196. package/dist/src/auth/credentials.d.ts +7 -0
  197. package/dist/src/auth/credentials.js +45 -7
  198. package/dist/src/auth/credentials.js.map +1 -1
  199. package/dist/src/auth/index.d.ts +1 -1
  200. package/dist/src/auth/index.js.map +1 -1
  201. package/dist/src/auth/oauth/github-copilot.d.ts +1 -1
  202. package/dist/src/auth/oauth/google-antigravity.d.ts +1 -3
  203. package/dist/src/auth/oauth/google-antigravity.js +1 -1
  204. package/dist/src/auth/oauth/google-gemini-cli.d.ts +1 -3
  205. package/dist/src/auth/oauth/google-gemini-cli.js +1 -1
  206. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.js +3 -5
  207. package/dist/src/auth/oauth/google-oauth/google-antigravity.js.map +1 -0
  208. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.js +4 -5
  209. package/dist/src/auth/oauth/google-oauth/google-gemini-cli.js.map +1 -0
  210. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.js +12 -4
  211. package/dist/src/auth/oauth/google-oauth/oauth-page.js.map +1 -0
  212. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.d.ts +1 -1
  213. package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/pkce.js +2 -2
  214. package/dist/src/auth/oauth/google-oauth/pkce.js.map +1 -0
  215. package/dist/src/auth/oauth/index.js +2 -2
  216. package/dist/src/auth/oauth/kimi-coding.d.ts +1 -1
  217. package/dist/src/auth/oauth/kimi-coding.js +1 -1
  218. package/dist/src/auth/oauth/kimi-coding.js.map +1 -1
  219. package/dist/src/auth/oauth/minimax-cn.js +1 -1
  220. package/dist/src/auth/oauth/minimax-cn.js.map +1 -1
  221. package/dist/src/auth/oauth/minimax.js +1 -1
  222. package/dist/src/auth/oauth/minimax.js.map +1 -1
  223. package/dist/src/auth/oauth/openai-codex.d.ts +7 -2
  224. package/dist/src/auth/oauth/openai-codex.js +318 -1
  225. package/dist/src/auth/oauth/openai-codex.js.map +1 -0
  226. package/dist/src/auth/profiles/store.js +3 -2
  227. package/dist/src/auth/profiles/store.js.map +1 -1
  228. package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
  229. package/dist/src/browser/actions/registry.js +2 -2
  230. package/dist/src/browser/cdp-local-launcher.js +1 -1
  231. package/dist/src/browser/index.js +3 -3
  232. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  233. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  234. package/dist/src/channels/attachments/attachment-classifiers.d.ts +1 -0
  235. package/dist/src/channels/attachments/attachment-classifiers.js +13 -2
  236. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -1
  237. package/dist/src/channels/catalog/channel-catalog-service.d.ts +11 -0
  238. package/dist/src/channels/catalog/channel-catalog-service.js +168 -0
  239. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -0
  240. package/dist/src/channels/catalog/channel-catalog-types.d.ts +22 -0
  241. package/dist/src/channels/catalog/channel-catalog-types.js +1 -0
  242. package/dist/src/channels/dock.d.ts +0 -7
  243. package/dist/src/channels/dock.js +1 -21
  244. package/dist/src/channels/index.d.ts +1 -3
  245. package/dist/src/channels/index.js +1 -5
  246. package/dist/src/channels/lifecycle-supervisor.d.ts +1 -0
  247. package/dist/src/channels/lifecycle-supervisor.js +11 -0
  248. package/dist/src/channels/lifecycle-supervisor.js.map +1 -1
  249. package/dist/src/channels/manager.d.ts +1 -0
  250. package/dist/src/channels/manager.js +3 -0
  251. package/dist/src/channels/manager.js.map +1 -1
  252. package/dist/src/channels/pairing/pairing-channel.d.ts +2 -3
  253. package/dist/src/channels/pairing/pairing-messages.js +1 -1
  254. package/dist/src/channels/pairing/pairing-messages.js.map +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +1 -1
  256. package/dist/src/channels/pairing/pairing-service.js +8 -27
  257. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  258. package/dist/src/channels/plugin-types.d.ts +3 -1
  259. package/dist/src/channels/plugins/types.adapters.d.ts +55 -2
  260. package/dist/src/channels/telegram/index.js +1 -1
  261. package/dist/src/chat-commands/builtins/config.js +4 -4
  262. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  263. package/dist/src/chat-commands/builtins/model.js +2 -2
  264. package/dist/src/chat-commands/builtins/model.js.map +1 -1
  265. package/dist/src/chat-commands/config-paths.js +1 -1
  266. package/dist/src/chat-commands/config-paths.js.map +1 -1
  267. package/dist/src/chat-commands/context.js +1 -1
  268. package/dist/src/chat-commands/context.js.map +1 -1
  269. package/dist/src/cli/bin.js +1 -1
  270. package/dist/src/cli/command-manifest.js +2 -2
  271. package/dist/src/cli/command-manifest.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +2 -2
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/agents.js +2 -4
  275. package/dist/src/cli/commands/agents.js.map +1 -1
  276. package/dist/src/cli/commands/auth.js +40 -52
  277. package/dist/src/cli/commands/auth.js.map +1 -1
  278. package/dist/src/cli/commands/browser-cli-helpers.js +1 -1
  279. package/dist/src/cli/commands/channels.d.ts +1 -5
  280. package/dist/src/cli/commands/channels.js +115 -281
  281. package/dist/src/cli/commands/channels.js.map +1 -1
  282. package/dist/src/cli/commands/config.js +2 -2
  283. package/dist/src/cli/commands/config.js.map +1 -1
  284. package/dist/src/cli/commands/doctor/checks/channel-config.js +16 -69
  285. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  286. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js +6 -4
  287. package/dist/src/cli/commands/doctor/checks/channel-pairing-pending.js.map +1 -1
  288. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +2 -2
  289. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -1
  290. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  291. package/dist/src/cli/commands/doctor/checks/provider-auth.js +13 -9
  292. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
  293. package/dist/src/cli/commands/extension-dev.js +2 -1
  294. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  295. package/dist/src/cli/commands/extension-marketplace.js +2 -1
  296. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  297. package/dist/src/cli/commands/extension-pack.js +2 -1
  298. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  299. package/dist/src/cli/commands/models.js +192 -54
  300. package/dist/src/cli/commands/models.js.map +1 -1
  301. package/dist/src/cli/commands/onboard/channels/index.js +1 -1
  302. package/dist/src/cli/commands/onboard/channels/index.js.map +1 -1
  303. package/dist/src/cli/commands/onboard/channels/registry.d.ts +2 -1
  304. package/dist/src/cli/commands/onboard/channels/registry.js +32 -8
  305. package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
  306. package/dist/src/cli/commands/onboard/model.d.ts +1 -4
  307. package/dist/src/cli/commands/onboard/model.js +257 -184
  308. package/dist/src/cli/commands/onboard/model.js.map +1 -1
  309. package/dist/src/cli/commands/onboard.js +4 -6
  310. package/dist/src/cli/commands/onboard.js.map +1 -1
  311. package/dist/src/cli/commands/setup-shared/runner.d.ts +1 -1
  312. package/dist/src/cli/commands/setup-shared/runner.js.map +1 -1
  313. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  314. package/dist/src/cli/commands/setup-shared/types.js.map +1 -1
  315. package/dist/src/cli/commands/tui.js +13 -5
  316. package/dist/src/cli/commands/tui.js.map +1 -1
  317. package/dist/src/cli/extension-cli-register.js +1 -1
  318. package/dist/src/cli/utils/oauth-login.d.ts +17 -0
  319. package/dist/src/cli/utils/oauth-login.js +93 -0
  320. package/dist/src/cli/utils/oauth-login.js.map +1 -0
  321. package/dist/src/cli/utils/oauth-providers.js +2 -2
  322. package/dist/src/commands/agents.config.d.ts +3 -3
  323. package/dist/src/commands/agents.config.js +7 -7
  324. package/dist/src/commands/agents.config.js.map +1 -1
  325. package/dist/src/config/agent-profile.d.ts +1 -1
  326. package/dist/src/config/agent-profile.js +6 -2
  327. package/dist/src/config/agent-profile.js.map +1 -1
  328. package/dist/src/config/agent-typed-models.d.ts +2 -2
  329. package/dist/src/config/agent-typed-models.js +13 -2
  330. package/dist/src/config/agent-typed-models.js.map +1 -1
  331. package/dist/src/config/index.js +3 -3
  332. package/dist/src/config/integration.d.ts +1 -1
  333. package/dist/src/config/loader.d.ts +0 -1
  334. package/dist/src/config/loader.js +4 -9
  335. package/dist/src/config/loader.js.map +1 -1
  336. package/dist/src/config/models-json.d.ts +6 -6
  337. package/dist/src/config/rules.js +2 -12
  338. package/dist/src/config/rules.js.map +1 -1
  339. package/dist/src/config/schema.d.ts +74 -47
  340. package/dist/src/config/schema.js +28 -66
  341. package/dist/src/config/schema.js.map +1 -1
  342. package/dist/src/config/validate-channel-configs.d.ts +0 -3
  343. package/dist/src/config/validate-channel-configs.js +29 -10
  344. package/dist/src/config/validate-channel-configs.js.map +1 -1
  345. package/dist/src/cron/executor.js +1 -4
  346. package/dist/src/cron/executor.js.map +1 -1
  347. package/dist/src/extensions/activation-context.js +3 -1
  348. package/dist/src/extensions/activation-context.js.map +1 -1
  349. package/dist/src/extensions/activation-planner.js +12 -0
  350. package/dist/src/extensions/activation-planner.js.map +1 -1
  351. package/dist/src/extensions/api.d.ts +5 -1
  352. package/dist/src/extensions/api.js +12 -0
  353. package/dist/src/extensions/api.js.map +1 -1
  354. package/dist/src/extensions/discover-extensions.js +17 -13
  355. package/dist/src/extensions/discover-extensions.js.map +1 -1
  356. package/dist/src/extensions/extension-metadata-snapshot.js +11 -5
  357. package/dist/src/extensions/extension-metadata-snapshot.js.map +1 -1
  358. package/dist/src/extensions/index.js +12 -4
  359. package/dist/src/extensions/index.js.map +1 -0
  360. package/dist/src/extensions/loader.d.ts +5 -1
  361. package/dist/src/extensions/loader.js +12 -11
  362. package/dist/src/extensions/loader.js.map +1 -1
  363. package/dist/src/extensions/manifest-registry.js +98 -93
  364. package/dist/src/extensions/manifest-registry.js.map +1 -1
  365. package/dist/src/extensions/normalize-manifest.js +91 -15
  366. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  367. package/dist/src/extensions/sdk/index.js +1 -1
  368. package/dist/src/extensions/sdk/testing.js +4 -0
  369. package/dist/src/extensions/sdk/testing.js.map +1 -1
  370. package/dist/src/extensions/types/core.d.ts +32 -1
  371. package/dist/src/extensions/types/manifest.d.ts +60 -0
  372. package/dist/src/extensions/types/tui.d.ts +414 -5
  373. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  374. package/dist/src/gateway/agent-builtin-tools.js +16 -0
  375. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  376. package/dist/src/gateway/agent-run-relay.d.ts +2 -3
  377. package/dist/src/gateway/agent-run-relay.js +10 -3
  378. package/dist/src/gateway/agent-run-relay.js.map +1 -1
  379. package/dist/src/gateway/agents-admin.d.ts +32 -19
  380. package/dist/src/gateway/agents-admin.js +113 -93
  381. package/dist/src/gateway/agents-admin.js.map +1 -1
  382. package/dist/src/gateway/chat-stream/mapper.d.ts +34 -0
  383. package/dist/src/gateway/chat-stream/mapper.js +244 -0
  384. package/dist/src/gateway/chat-stream/mapper.js.map +1 -0
  385. package/dist/src/gateway/chat-stream/protocol.d.ts +100 -0
  386. package/dist/src/gateway/chat-stream/protocol.js +1 -0
  387. package/dist/src/gateway/hono/lib/agent-model.d.ts +4 -4
  388. package/dist/src/gateway/hono/lib/agent-model.js +13 -11
  389. package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
  390. package/dist/src/gateway/hono/lib/config-payload.d.ts +19 -7
  391. package/dist/src/gateway/hono/lib/config-payload.js +16 -15
  392. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  393. package/dist/src/gateway/hono/oauth-async.js +2 -2
  394. package/dist/src/gateway/hono/oauth.js +2 -2
  395. package/dist/src/gateway/hono/routes/agents.js +83 -48
  396. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  397. package/dist/src/gateway/hono/routes/channels.js +134 -214
  398. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  399. package/dist/src/gateway/hono/routes/commands-skills.js +10 -4
  400. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  401. package/dist/src/gateway/hono/routes/config-patch/agents.js +26 -13
  402. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
  403. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +1 -11
  404. package/dist/src/gateway/hono/routes/config-patch/channels.js +18 -165
  405. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  406. package/dist/src/gateway/hono/routes/config.js +5 -2
  407. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  408. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  409. package/dist/src/gateway/hono/routes/lazy-bundles.js +13 -1
  410. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  411. package/dist/src/gateway/hono/routes/models.js +25 -5
  412. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  413. package/dist/src/gateway/hono/routes/public-gateway.js +2 -4
  414. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  415. package/dist/src/gateway/hono/routes/sessions.js +179 -0
  416. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  417. package/dist/src/gateway/hono/routes/tui.d.ts +3 -0
  418. package/dist/src/gateway/hono/routes/tui.js +16 -0
  419. package/dist/src/gateway/hono/routes/tui.js.map +1 -0
  420. package/dist/src/gateway/hono/routes/workflows.js +25 -1
  421. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  422. package/dist/src/gateway/hono/sse.d.ts +5 -7
  423. package/dist/src/gateway/hono/sse.js +21 -38
  424. package/dist/src/gateway/hono/sse.js.map +1 -1
  425. package/dist/src/gateway/protocol.js.map +1 -1
  426. package/dist/src/gateway/service/agent-runner.d.ts +2 -4
  427. package/dist/src/gateway/service/agent-runner.js +1 -1
  428. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  429. package/dist/src/gateway/service/marketplace-service.d.ts +4 -3
  430. package/dist/src/gateway/service/marketplace-service.js +7 -4
  431. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  432. package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -6
  433. package/dist/src/gateway/service/run-gateway-agent.js +63 -36
  434. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  435. package/dist/src/gateway/service/sessions-api.d.ts +19 -0
  436. package/dist/src/gateway/service/sessions-api.js +12 -0
  437. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  438. package/dist/src/gateway/service.d.ts +6 -0
  439. package/dist/src/gateway/service.js +73 -57
  440. package/dist/src/gateway/service.js.map +1 -1
  441. package/dist/src/mcp/channel-bridge.js +1 -1
  442. package/dist/src/media/store.js +3 -0
  443. package/dist/src/media/store.js.map +1 -1
  444. package/dist/src/notes/service.js +1 -1
  445. package/dist/src/notes/service.js.map +1 -1
  446. package/dist/src/project-trust/trust-store.d.ts +30 -0
  447. package/dist/src/project-trust/trust-store.js +194 -0
  448. package/dist/src/project-trust/trust-store.js.map +1 -0
  449. package/dist/src/providers/index.d.ts +4 -4
  450. package/dist/src/providers/index.js +41 -22
  451. package/dist/src/providers/index.js.map +1 -1
  452. package/dist/src/providers/presentation.d.ts +34 -0
  453. package/dist/src/providers/presentation.js +162 -0
  454. package/dist/src/providers/presentation.js.map +1 -0
  455. package/dist/src/routing/resolve-route.d.ts +0 -3
  456. package/dist/src/routing/resolve-route.js.map +1 -1
  457. package/dist/src/routing/resolve-tui-session-key.d.ts +2 -0
  458. package/dist/src/routing/resolve-tui-session-key.js +8 -3
  459. package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
  460. package/dist/src/session/client-history.d.ts +32 -0
  461. package/dist/src/session/client-history.js +232 -1
  462. package/dist/src/session/client-history.js.map +1 -1
  463. package/dist/src/session/manager.d.ts +37 -4
  464. package/dist/src/session/manager.js +39 -15
  465. package/dist/src/session/manager.js.map +1 -1
  466. package/dist/src/session/session-context-for-llm.d.ts +93 -1
  467. package/dist/src/session/session-context-for-llm.js +105 -2
  468. package/dist/src/session/session-context-for-llm.js.map +1 -1
  469. package/dist/src/session/store.d.ts +37 -0
  470. package/dist/src/session/store.js +127 -2
  471. package/dist/src/session/store.js.map +1 -1
  472. package/dist/src/session/stored-rows-to-file-entries.js +37 -1
  473. package/dist/src/session/stored-rows-to-file-entries.js.map +1 -1
  474. package/dist/src/session/types.d.ts +14 -1
  475. package/dist/src/session/types.js.map +1 -1
  476. package/dist/src/share/share-thumbnail.js +1 -1
  477. package/dist/src/storage/sqlite/migrations/004_add_session_type_metadata.sql +15 -0
  478. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  479. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  480. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  481. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  482. package/dist/src/storage/sqlite/row-mappers.d.ts +14 -1
  483. package/dist/src/storage/sqlite/row-mappers.js +14 -1
  484. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  485. package/dist/src/storage/sqlite/schema.js +1 -1
  486. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  487. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  488. package/dist/src/storage/sqlite/session-repository.js +52 -25
  489. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  490. package/dist/src/tui/backends/embedded-backend.d.ts +53 -4
  491. package/dist/src/tui/backends/embedded-backend.js +227 -39
  492. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  493. package/dist/src/tui/backends/gateway-sse-backend.d.ts +59 -3
  494. package/dist/src/tui/backends/gateway-sse-backend.js +416 -26
  495. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  496. package/dist/src/tui/chat-history.d.ts +5 -1
  497. package/dist/src/tui/chat-history.js +78 -8
  498. package/dist/src/tui/chat-history.js.map +1 -1
  499. package/dist/src/tui/clipboard-text.d.ts +5 -0
  500. package/dist/src/tui/clipboard-text.js +46 -0
  501. package/dist/src/tui/clipboard-text.js.map +1 -0
  502. package/dist/src/tui/components/assistant-message.d.ts +19 -3
  503. package/dist/src/tui/components/assistant-message.js +115 -9
  504. package/dist/src/tui/components/assistant-message.js.map +1 -1
  505. package/dist/src/tui/components/bash-execution.d.ts +3 -2
  506. package/dist/src/tui/components/bash-execution.js +31 -3
  507. package/dist/src/tui/components/bash-execution.js.map +1 -1
  508. package/dist/src/tui/components/bash-summary.d.ts +23 -0
  509. package/dist/src/tui/components/bash-summary.js +87 -0
  510. package/dist/src/tui/components/bash-summary.js.map +1 -0
  511. package/dist/src/tui/components/branch-message-summary.d.ts +17 -0
  512. package/dist/src/tui/components/branch-message-summary.js +43 -0
  513. package/dist/src/tui/components/branch-message-summary.js.map +1 -0
  514. package/dist/src/tui/components/branch-summary.d.ts +13 -0
  515. package/dist/src/tui/components/branch-summary.js +51 -0
  516. package/dist/src/tui/components/branch-summary.js.map +1 -0
  517. package/dist/src/tui/components/chat-log.d.ts +46 -6
  518. package/dist/src/tui/components/chat-log.js +183 -21
  519. package/dist/src/tui/components/chat-log.js.map +1 -1
  520. package/dist/src/tui/components/compaction-summary.d.ts +13 -0
  521. package/dist/src/tui/components/compaction-summary.js +46 -0
  522. package/dist/src/tui/components/compaction-summary.js.map +1 -0
  523. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  524. package/dist/src/tui/components/custom-editor.js +2 -0
  525. package/dist/src/tui/components/custom-editor.js.map +1 -1
  526. package/dist/src/tui/components/custom-message.d.ts +23 -0
  527. package/dist/src/tui/components/custom-message.js +65 -0
  528. package/dist/src/tui/components/custom-message.js.map +1 -0
  529. package/dist/src/tui/components/extension-dialog.d.ts +42 -0
  530. package/dist/src/tui/components/extension-dialog.js +127 -0
  531. package/dist/src/tui/components/extension-dialog.js.map +1 -0
  532. package/dist/src/tui/components/scoped-models-selector.d.ts +7 -2
  533. package/dist/src/tui/components/scoped-models-selector.js +89 -16
  534. package/dist/src/tui/components/scoped-models-selector.js.map +1 -1
  535. package/dist/src/tui/components/searchable-select-list.d.ts +30 -3
  536. package/dist/src/tui/components/searchable-select-list.js +82 -10
  537. package/dist/src/tui/components/searchable-select-list.js.map +1 -1
  538. package/dist/src/tui/components/session-selector.d.ts +18 -4
  539. package/dist/src/tui/components/session-selector.js +207 -40
  540. package/dist/src/tui/components/session-selector.js.map +1 -1
  541. package/dist/src/tui/components/settings-selector.d.ts +6 -2
  542. package/dist/src/tui/components/settings-selector.js +126 -7
  543. package/dist/src/tui/components/settings-selector.js.map +1 -1
  544. package/dist/src/tui/components/thinking-selector.d.ts +12 -0
  545. package/dist/src/tui/components/thinking-selector.js +48 -0
  546. package/dist/src/tui/components/thinking-selector.js.map +1 -0
  547. package/dist/src/tui/components/tool-execution.d.ts +57 -3
  548. package/dist/src/tui/components/tool-execution.js +378 -28
  549. package/dist/src/tui/components/tool-execution.js.map +1 -1
  550. package/dist/src/tui/components/tui-bottom-bar.d.ts +9 -1
  551. package/dist/src/tui/components/tui-bottom-bar.js +56 -11
  552. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  553. package/dist/src/tui/components/tui-header.d.ts +9 -2
  554. package/dist/src/tui/components/tui-header.js +25 -5
  555. package/dist/src/tui/components/tui-header.js.map +1 -1
  556. package/dist/src/tui/components/user-message.d.ts +4 -2
  557. package/dist/src/tui/components/user-message.js +42 -9
  558. package/dist/src/tui/components/user-message.js.map +1 -1
  559. package/dist/src/tui/components/visual-truncate.d.ts +11 -0
  560. package/dist/src/tui/components/visual-truncate.js +27 -0
  561. package/dist/src/tui/components/visual-truncate.js.map +1 -0
  562. package/dist/src/tui/extension-host/autocomplete.d.ts +43 -0
  563. package/dist/src/tui/extension-host/autocomplete.js +116 -0
  564. package/dist/src/tui/extension-host/autocomplete.js.map +1 -0
  565. package/dist/src/tui/extension-host/host.d.ts +31 -1
  566. package/dist/src/tui/extension-host/host.js +123 -6
  567. package/dist/src/tui/extension-host/host.js.map +1 -1
  568. package/dist/src/tui/extension-host/load-extensions.d.ts +6 -1
  569. package/dist/src/tui/extension-host/load-extensions.js +4 -3
  570. package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
  571. package/dist/src/tui/extension-host/runtime-context.d.ts +21 -0
  572. package/dist/src/tui/extension-host/runtime-context.js +152 -0
  573. package/dist/src/tui/extension-host/runtime-context.js.map +1 -0
  574. package/dist/src/tui/extension-host/runtime.d.ts +52 -4
  575. package/dist/src/tui/extension-host/runtime.js +547 -85
  576. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  577. package/dist/src/tui/extension-host/surface.d.ts +20 -0
  578. package/dist/src/tui/extension-host/surface.js +30 -6
  579. package/dist/src/tui/extension-host/surface.js.map +1 -1
  580. package/dist/src/tui/extension-host/tool-renderers.d.ts +6 -3
  581. package/dist/src/tui/extension-host/tool-renderers.js +43 -5
  582. package/dist/src/tui/extension-host/tool-renderers.js.map +1 -1
  583. package/dist/src/tui/format-tui-hotkeys.d.ts +12 -2
  584. package/dist/src/tui/format-tui-hotkeys.js +22 -5
  585. package/dist/src/tui/format-tui-hotkeys.js.map +1 -1
  586. package/dist/src/tui/tui-agent-events.d.ts +8 -6
  587. package/dist/src/tui/tui-agent-events.js +200 -59
  588. package/dist/src/tui/tui-agent-events.js.map +1 -1
  589. package/dist/src/tui/tui-backend.d.ts +169 -3
  590. package/dist/src/tui/tui-command-formatters.d.ts +76 -0
  591. package/dist/src/tui/tui-command-formatters.js +594 -0
  592. package/dist/src/tui/tui-command-formatters.js.map +1 -0
  593. package/dist/src/tui/tui-commands.d.ts +57 -7
  594. package/dist/src/tui/tui-commands.js +639 -43
  595. package/dist/src/tui/tui-commands.js.map +1 -1
  596. package/dist/src/tui/tui-context-usage.d.ts +1 -1
  597. package/dist/src/tui/tui-context-usage.js +9 -1
  598. package/dist/src/tui/tui-context-usage.js.map +1 -1
  599. package/dist/src/tui/tui-extension-user-message.d.ts +8 -0
  600. package/dist/src/tui/tui-extension-user-message.js +32 -0
  601. package/dist/src/tui/tui-extension-user-message.js.map +1 -0
  602. package/dist/src/tui/tui-follow-up-queue.d.ts +9 -0
  603. package/dist/src/tui/tui-follow-up-queue.js +18 -0
  604. package/dist/src/tui/tui-follow-up-queue.js.map +1 -0
  605. package/dist/src/tui/tui-local-shell.d.ts +11 -1
  606. package/dist/src/tui/tui-local-shell.js +50 -8
  607. package/dist/src/tui/tui-local-shell.js.map +1 -1
  608. package/dist/src/tui/tui-model-picker.d.ts +26 -0
  609. package/dist/src/tui/tui-model-picker.js +152 -0
  610. package/dist/src/tui/tui-model-picker.js.map +1 -0
  611. package/dist/src/tui/tui-oauth-login.d.ts +16 -0
  612. package/dist/src/tui/tui-oauth-login.js +189 -0
  613. package/dist/src/tui/tui-oauth-login.js.map +1 -0
  614. package/dist/src/tui/tui-overlays.d.ts +3 -3
  615. package/dist/src/tui/tui-overlays.js +6 -7
  616. package/dist/src/tui/tui-overlays.js.map +1 -1
  617. package/dist/src/tui/tui-picker-overlay.d.ts +27 -32
  618. package/dist/src/tui/tui-picker-overlay.js +340 -30
  619. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  620. package/dist/src/tui/tui-picker-services.d.ts +41 -0
  621. package/dist/src/tui/tui-picker-services.js +1 -0
  622. package/dist/src/tui/tui-run-state.d.ts +11 -0
  623. package/dist/src/tui/tui-run-state.js +114 -0
  624. package/dist/src/tui/tui-run-state.js.map +1 -0
  625. package/dist/src/tui/tui-runtime-hints.d.ts +4 -0
  626. package/dist/src/tui/tui-runtime-hints.js +18 -0
  627. package/dist/src/tui/tui-runtime-hints.js.map +1 -0
  628. package/dist/src/tui/tui-scoped-models.d.ts +1 -1
  629. package/dist/src/tui/tui-scoped-models.js +2 -2
  630. package/dist/src/tui/tui-scoped-models.js.map +1 -1
  631. package/dist/src/tui/tui-session-actions.d.ts +5 -3
  632. package/dist/src/tui/tui-session-actions.js +21 -9
  633. package/dist/src/tui/tui-session-actions.js.map +1 -1
  634. package/dist/src/tui/tui-session-format.d.ts +4 -1
  635. package/dist/src/tui/tui-session-format.js +17 -3
  636. package/dist/src/tui/tui-session-format.js.map +1 -1
  637. package/dist/src/tui/tui-session-snapshot.d.ts +82 -0
  638. package/dist/src/tui/tui-session-snapshot.js +184 -0
  639. package/dist/src/tui/tui-session-snapshot.js.map +1 -0
  640. package/dist/src/tui/tui-session-stats.d.ts +3 -0
  641. package/dist/src/tui/tui-session-stats.js +59 -0
  642. package/dist/src/tui/tui-session-stats.js.map +1 -0
  643. package/dist/src/tui/tui-settings.d.ts +21 -0
  644. package/dist/src/tui/tui-settings.js +28 -1
  645. package/dist/src/tui/tui-settings.js.map +1 -1
  646. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  647. package/dist/src/tui/tui-skills-autocomplete.js.map +1 -1
  648. package/dist/src/tui/tui-startup-resources.d.ts +3 -0
  649. package/dist/src/tui/tui-startup-resources.js +39 -0
  650. package/dist/src/tui/tui-startup-resources.js.map +1 -0
  651. package/dist/src/tui/tui-startup-text.d.ts +10 -0
  652. package/dist/src/tui/tui-startup-text.js +58 -0
  653. package/dist/src/tui/tui-startup-text.js.map +1 -0
  654. package/dist/src/tui/tui-stdio-filter.d.ts +1 -0
  655. package/dist/src/tui/tui-stdio-filter.js +11 -7
  656. package/dist/src/tui/tui-stdio-filter.js.map +1 -1
  657. package/dist/src/tui/tui-submit.d.ts +2 -0
  658. package/dist/src/tui/tui-submit.js +2 -1
  659. package/dist/src/tui/tui-submit.js.map +1 -1
  660. package/dist/src/tui/tui-tool-diff.js +61 -7
  661. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  662. package/dist/src/tui/tui-tool-result.d.ts +17 -0
  663. package/dist/src/tui/tui-tool-result.js +74 -0
  664. package/dist/src/tui/tui-tool-result.js.map +1 -0
  665. package/dist/src/tui/tui-transcript-tree-picker.d.ts +57 -0
  666. package/dist/src/tui/tui-transcript-tree-picker.js +604 -0
  667. package/dist/src/tui/tui-transcript-tree-picker.js.map +1 -0
  668. package/dist/src/tui/tui-transcript-tree.d.ts +7 -0
  669. package/dist/src/tui/tui-transcript-tree.js +316 -0
  670. package/dist/src/tui/tui-transcript-tree.js.map +1 -0
  671. package/dist/src/tui/tui-types.d.ts +25 -34
  672. package/dist/src/tui/tui-types.js +12 -0
  673. package/dist/src/tui/tui-types.js.map +1 -1
  674. package/dist/src/tui/tui.js +1288 -112
  675. package/dist/src/tui/tui.js.map +1 -1
  676. package/dist/src/tui/xopc-tui-keybindings.d.ts +127 -2
  677. package/dist/src/tui/xopc-tui-keybindings.js +127 -2
  678. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  679. package/dist/src/workflows/domain/definition-utils.d.ts +2 -1
  680. package/dist/src/workflows/domain/definition-utils.js +18 -8
  681. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  682. package/dist/src/workflows/domain/definition.d.ts +25 -0
  683. package/dist/src/workflows/domain/event.d.ts +1 -0
  684. package/dist/src/workflows/domain/result.d.ts +15 -0
  685. package/dist/src/workflows/domain/run.d.ts +2 -0
  686. package/dist/src/workflows/domain/run.js.map +1 -1
  687. package/dist/src/workflows/engine/projector.js +4 -0
  688. package/dist/src/workflows/engine/projector.js.map +1 -1
  689. package/dist/src/workflows/engine/workflow-engine.d.ts +37 -1
  690. package/dist/src/workflows/engine/workflow-engine.js +75 -11
  691. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  692. package/dist/src/workflows/index.d.ts +1 -0
  693. package/dist/src/workflows/index.js +4 -1
  694. package/dist/src/workflows/registry/catalog-workflow-definition-registry.d.ts +9 -0
  695. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +40 -0
  696. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -0
  697. package/dist/src/workflows/registry/index.d.ts +2 -0
  698. package/dist/src/workflows/registry/index.js +2 -0
  699. package/dist/src/workflows/registry/workflow-definition-registry.d.ts +15 -0
  700. package/dist/src/workflows/registry/workflow-definition-registry.js +1 -0
  701. package/dist/src/workflows/runtime/index.d.ts +2 -0
  702. package/dist/src/workflows/runtime/index.js +2 -1
  703. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +5 -0
  704. package/dist/src/workflows/runtime/script-workflow-runtime.js +15 -0
  705. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +1 -0
  706. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +16 -0
  707. package/dist/src/workflows/runtime/workflow-runtime-port.js +1 -0
  708. package/dist/src/workflows/service/run-view-to-snapshot.js +3 -0
  709. package/dist/src/workflows/service/run-view-to-snapshot.js.map +1 -1
  710. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  711. package/dist/src/workflows/service/workflow-run-service.js +10 -15
  712. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  713. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -1
  714. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  715. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  716. package/package.json +21 -15
  717. package/skills/creative/frontend-design/SKILL.md +1 -1
  718. package/skills/creative/theme-factory/SKILL.md +1 -1
  719. package/skills/documents/xlsx/SKILL.md +1 -1
  720. package/skills/engineering/diagnose/SKILL.md +2 -2
  721. package/skills/engineering/tdd/SKILL.md +1 -1
  722. package/skills/tools/github/SKILL.md +6 -1
  723. package/skills/tools/webapp-testing/SKILL.md +4 -1
  724. package/dist/extensions/telegram/src/adapters/config-surface.d.ts +0 -2
  725. package/dist/extensions/telegram/src/adapters/config-surface.js +0 -26
  726. package/dist/extensions/telegram/src/adapters/config-surface.js.map +0 -1
  727. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js +0 -158
  728. package/dist/extensions/weixin/src/__tests__/workflow-progress.test.js.map +0 -1
  729. package/dist/gateway/static/root/assets/agents-DQ0mQxIA.js +0 -222
  730. package/dist/gateway/static/root/assets/channels-settings-BEtP53V6.js +0 -1
  731. package/dist/gateway/static/root/assets/channels-status-swr-CxTtS1hI.js +0 -8
  732. package/dist/gateway/static/root/assets/cron-api-CznlPIZT.js +0 -1
  733. package/dist/gateway/static/root/assets/cron-page-Dx6dE3eD.js +0 -1
  734. package/dist/gateway/static/root/assets/extension-settings-page-DuDCSb3J.js +0 -1
  735. package/dist/gateway/static/root/assets/field-primitives-BUwUiDf5.js +0 -1
  736. package/dist/gateway/static/root/assets/heartbeat-config-api-BjFW1cl-.js +0 -1
  737. package/dist/gateway/static/root/assets/index-DKgHC1Ta.js +0 -4840
  738. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +0 -1
  739. package/dist/gateway/static/root/assets/notes-page-D40ZpS0Y.js +0 -1
  740. package/dist/gateway/static/root/assets/sessions-page-BvtdbmW8.js +0 -1
  741. package/dist/gateway/static/root/assets/settings-advanced-gate-BQamRjkV.js +0 -2
  742. package/dist/gateway/static/root/assets/settings-page-D972_jaS.js +0 -3
  743. package/dist/gateway/static/root/assets/share-preview-page-CKCTMo0_.js +0 -2
  744. package/dist/gateway/static/root/assets/skills-page-QwFCB4yV.js +0 -2
  745. package/dist/gateway/static/root/assets/url-q28QhI7l.js +0 -3
  746. package/dist/gateway/static/root/assets/utils-DCm11_KW.js +0 -1
  747. package/dist/gateway/static/root/assets/voice-api-key-field-CywiB7Dw.js +0 -1
  748. package/dist/gateway/static/root/assets/workflows-page-Be7l_SWw.js +0 -27
  749. package/dist/src/agent/embedded/map-stream-events.d.ts +0 -9
  750. package/dist/src/agent/embedded/map-stream-events.js +0 -63
  751. package/dist/src/agent/embedded/map-stream-events.js.map +0 -1
  752. package/dist/src/auth/oauth/vendor-pi-google/google-antigravity.js.map +0 -1
  753. package/dist/src/auth/oauth/vendor-pi-google/google-gemini-cli.js.map +0 -1
  754. package/dist/src/auth/oauth/vendor-pi-google/oauth-page.js.map +0 -1
  755. package/dist/src/auth/oauth/vendor-pi-google/pkce.js.map +0 -1
  756. package/dist/src/channels/dock.js.map +0 -1
  757. package/dist/src/channels/plugins/bundled.d.ts +0 -11
  758. package/dist/src/channels/plugins/bundled.js +0 -10
  759. package/dist/src/channels/plugins/bundled.js.map +0 -1
  760. package/dist/src/channels/registry.d.ts +0 -25
  761. package/dist/src/channels/registry.js +0 -82
  762. package/dist/src/channels/registry.js.map +0 -1
  763. package/dist/src/config/localized-text.d.ts +0 -6
  764. package/dist/src/config/localized-text.js +0 -42
  765. package/dist/src/config/localized-text.js.map +0 -1
  766. package/dist/src/generated/bundled-channel-plugins.d.ts +0 -10
  767. package/dist/src/generated/bundled-channel-plugins.js +0 -16
  768. package/dist/src/generated/bundled-channel-plugins.js.map +0 -1
  769. package/dist/src/tui/stream-assembler.d.ts +0 -22
  770. package/dist/src/tui/stream-assembler.js +0 -63
  771. package/dist/src/tui/stream-assembler.js.map +0 -1
  772. package/skills/browser/SKILL-zh.md +0 -188
  773. package/skills/business/company-values/SKILL-zh.md +0 -80
  774. package/skills/business/company-values/SKILL.md +0 -80
  775. package/skills/business/find-community/SKILL-zh.md +0 -50
  776. package/skills/business/find-community/SKILL.md +0 -50
  777. package/skills/business/first-customers/SKILL-zh.md +0 -76
  778. package/skills/business/first-customers/SKILL.md +0 -76
  779. package/skills/business/grow-sustainably/SKILL-zh.md +0 -92
  780. package/skills/business/grow-sustainably/SKILL.md +0 -92
  781. package/skills/business/marketing-plan/SKILL-zh.md +0 -100
  782. package/skills/business/marketing-plan/SKILL.md +0 -100
  783. package/skills/business/minimalist-review/SKILL-zh.md +0 -82
  784. package/skills/business/minimalist-review/SKILL.md +0 -82
  785. package/skills/business/mvp/SKILL-zh.md +0 -81
  786. package/skills/business/mvp/SKILL.md +0 -81
  787. package/skills/business/pricing/SKILL-zh.md +0 -64
  788. package/skills/business/pricing/SKILL.md +0 -64
  789. package/skills/business/processize/SKILL-zh.md +0 -91
  790. package/skills/business/processize/SKILL.md +0 -91
  791. package/skills/business/validate-idea/SKILL-zh.md +0 -68
  792. package/skills/business/validate-idea/SKILL.md +0 -68
  793. package/skills/creative/algorithmic-art/LICENSE.txt +0 -202
  794. package/skills/creative/algorithmic-art/SKILL-zh.md +0 -405
  795. package/skills/creative/algorithmic-art/SKILL.md +0 -405
  796. package/skills/creative/algorithmic-art/templates/generator_template.js +0 -223
  797. package/skills/creative/algorithmic-art/templates/viewer.html +0 -599
  798. package/skills/creative/frontend-design/SKILL-zh.md +0 -42
  799. package/skills/creative/theme-factory/SKILL-zh.md +0 -59
  800. package/skills/creative/web-artifacts-builder/LICENSE.txt +0 -202
  801. package/skills/creative/web-artifacts-builder/SKILL-zh.md +0 -74
  802. package/skills/creative/web-artifacts-builder/SKILL.md +0 -74
  803. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +0 -54
  804. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +0 -322
  805. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  806. package/skills/documents/doc-coauthoring/SKILL-zh.md +0 -375
  807. package/skills/documents/doc-coauthoring/SKILL.md +0 -375
  808. package/skills/documents/docx/LICENSE.txt +0 -30
  809. package/skills/documents/docx/SKILL-zh.md +0 -590
  810. package/skills/documents/docx/SKILL.md +0 -590
  811. package/skills/documents/docx/scripts/__init__.py +0 -1
  812. package/skills/documents/docx/scripts/accept_changes.py +0 -135
  813. package/skills/documents/docx/scripts/comment.py +0 -318
  814. package/skills/documents/docx/scripts/office/helpers/__init__.py +0 -0
  815. package/skills/documents/docx/scripts/office/helpers/merge_runs.py +0 -199
  816. package/skills/documents/docx/scripts/office/helpers/simplify_redlines.py +0 -197
  817. package/skills/documents/docx/scripts/office/pack.py +0 -159
  818. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  819. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  820. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  821. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  822. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  823. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  824. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  825. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  826. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  827. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  828. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  829. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  830. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  831. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  832. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  833. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  834. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  835. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  836. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  837. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  838. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  839. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  840. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  841. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  842. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  843. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  844. package/skills/documents/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  845. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  846. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  847. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  848. package/skills/documents/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  849. package/skills/documents/docx/scripts/office/schemas/mce/mc.xsd +0 -75
  850. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  851. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  852. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  853. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  854. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  855. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  856. package/skills/documents/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  857. package/skills/documents/docx/scripts/office/soffice.py +0 -183
  858. package/skills/documents/docx/scripts/office/unpack.py +0 -132
  859. package/skills/documents/docx/scripts/office/validate.py +0 -111
  860. package/skills/documents/docx/scripts/office/validators/__init__.py +0 -15
  861. package/skills/documents/docx/scripts/office/validators/base.py +0 -847
  862. package/skills/documents/docx/scripts/office/validators/docx.py +0 -446
  863. package/skills/documents/docx/scripts/office/validators/pptx.py +0 -275
  864. package/skills/documents/docx/scripts/office/validators/redlining.py +0 -247
  865. package/skills/documents/docx/scripts/templates/comments.xml +0 -3
  866. package/skills/documents/docx/scripts/templates/commentsExtended.xml +0 -3
  867. package/skills/documents/docx/scripts/templates/commentsExtensible.xml +0 -3
  868. package/skills/documents/docx/scripts/templates/commentsIds.xml +0 -3
  869. package/skills/documents/docx/scripts/templates/people.xml +0 -3
  870. package/skills/documents/pdf/LICENSE.txt +0 -30
  871. package/skills/documents/pdf/SKILL-zh.md +0 -314
  872. package/skills/documents/pdf/SKILL.md +0 -314
  873. package/skills/documents/pdf/forms.md +0 -294
  874. package/skills/documents/pdf/reference.md +0 -612
  875. package/skills/documents/pdf/scripts/check_bounding_boxes.py +0 -65
  876. package/skills/documents/pdf/scripts/check_fillable_fields.py +0 -11
  877. package/skills/documents/pdf/scripts/convert_pdf_to_images.py +0 -33
  878. package/skills/documents/pdf/scripts/create_validation_image.py +0 -37
  879. package/skills/documents/pdf/scripts/extract_form_field_info.py +0 -122
  880. package/skills/documents/pdf/scripts/extract_form_structure.py +0 -115
  881. package/skills/documents/pdf/scripts/fill_fillable_fields.py +0 -98
  882. package/skills/documents/pdf/scripts/fill_pdf_form_with_annotations.py +0 -107
  883. package/skills/documents/pptx/LICENSE.txt +0 -30
  884. package/skills/documents/pptx/SKILL-zh.md +0 -232
  885. package/skills/documents/pptx/SKILL.md +0 -232
  886. package/skills/documents/pptx/editing.md +0 -205
  887. package/skills/documents/pptx/pptxgenjs.md +0 -420
  888. package/skills/documents/pptx/scripts/__init__.py +0 -0
  889. package/skills/documents/pptx/scripts/add_slide.py +0 -195
  890. package/skills/documents/pptx/scripts/clean.py +0 -286
  891. package/skills/documents/pptx/scripts/office/helpers/__init__.py +0 -0
  892. package/skills/documents/pptx/scripts/office/helpers/merge_runs.py +0 -199
  893. package/skills/documents/pptx/scripts/office/helpers/simplify_redlines.py +0 -197
  894. package/skills/documents/pptx/scripts/office/pack.py +0 -159
  895. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -1499
  896. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -146
  897. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -1085
  898. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -11
  899. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -3081
  900. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -23
  901. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -185
  902. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -287
  903. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -1676
  904. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -28
  905. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -144
  906. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -174
  907. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -25
  908. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -18
  909. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -59
  910. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -56
  911. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -195
  912. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -582
  913. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -25
  914. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -4439
  915. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -570
  916. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -509
  917. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -12
  918. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -108
  919. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -96
  920. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -3646
  921. package/skills/documents/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -116
  922. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -42
  923. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -50
  924. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -49
  925. package/skills/documents/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -33
  926. package/skills/documents/pptx/scripts/office/schemas/mce/mc.xsd +0 -75
  927. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +0 -560
  928. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +0 -67
  929. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +0 -14
  930. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -20
  931. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -13
  932. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -4
  933. package/skills/documents/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -8
  934. package/skills/documents/pptx/scripts/office/soffice.py +0 -183
  935. package/skills/documents/pptx/scripts/office/unpack.py +0 -132
  936. package/skills/documents/pptx/scripts/office/validate.py +0 -111
  937. package/skills/documents/pptx/scripts/office/validators/__init__.py +0 -15
  938. package/skills/documents/pptx/scripts/office/validators/base.py +0 -847
  939. package/skills/documents/pptx/scripts/office/validators/docx.py +0 -446
  940. package/skills/documents/pptx/scripts/office/validators/pptx.py +0 -275
  941. package/skills/documents/pptx/scripts/office/validators/redlining.py +0 -247
  942. package/skills/documents/pptx/scripts/thumbnail.py +0 -289
  943. package/skills/documents/xlsx/SKILL-zh.md +0 -292
  944. package/skills/engineering/diagnose/SKILL-zh.md +0 -117
  945. package/skills/engineering/grill-with-docs/ADR-FORMAT.md +0 -47
  946. package/skills/engineering/grill-with-docs/CONTEXT-FORMAT.md +0 -77
  947. package/skills/engineering/grill-with-docs/SKILL-zh.md +0 -88
  948. package/skills/engineering/grill-with-docs/SKILL.md +0 -88
  949. package/skills/engineering/improve-codebase-architecture/DEEPENING.md +0 -37
  950. package/skills/engineering/improve-codebase-architecture/INTERFACE-DESIGN.md +0 -44
  951. package/skills/engineering/improve-codebase-architecture/LANGUAGE.md +0 -53
  952. package/skills/engineering/improve-codebase-architecture/SKILL-zh.md +0 -71
  953. package/skills/engineering/improve-codebase-architecture/SKILL.md +0 -71
  954. package/skills/engineering/tdd/SKILL-zh.md +0 -109
  955. package/skills/engineering/to-issues/SKILL-zh.md +0 -81
  956. package/skills/engineering/to-issues/SKILL.md +0 -81
  957. package/skills/engineering/to-prd/SKILL-zh.md +0 -76
  958. package/skills/engineering/to-prd/SKILL.md +0 -74
  959. package/skills/engineering/zoom-out/SKILL-zh.md +0 -7
  960. package/skills/engineering/zoom-out/SKILL.md +0 -7
  961. package/skills/tools/find-skills/SKILL-zh.md +0 -440
  962. package/skills/tools/github/SKILL-zh.md +0 -48
  963. package/skills/tools/internal-comms/LICENSE.txt +0 -202
  964. package/skills/tools/internal-comms/SKILL-zh.md +0 -32
  965. package/skills/tools/internal-comms/SKILL.md +0 -32
  966. package/skills/tools/internal-comms/examples/3p-updates.md +0 -47
  967. package/skills/tools/internal-comms/examples/company-newsletter.md +0 -65
  968. package/skills/tools/internal-comms/examples/faq-answers.md +0 -30
  969. package/skills/tools/internal-comms/examples/general-comms.md +0 -16
  970. package/skills/tools/skill-creator/LICENSE.txt +0 -202
  971. package/skills/tools/skill-creator/SKILL-zh.md +0 -483
  972. package/skills/tools/skill-creator/SKILL.md +0 -485
  973. package/skills/tools/skill-creator/agents/analyzer.md +0 -274
  974. package/skills/tools/skill-creator/agents/comparator.md +0 -202
  975. package/skills/tools/skill-creator/agents/grader.md +0 -223
  976. package/skills/tools/skill-creator/assets/eval_review.html +0 -146
  977. package/skills/tools/skill-creator/eval-viewer/generate_review.py +0 -471
  978. package/skills/tools/skill-creator/eval-viewer/viewer.html +0 -1325
  979. package/skills/tools/skill-creator/references/schemas.md +0 -430
  980. package/skills/tools/skill-creator/scripts/__init__.py +0 -0
  981. package/skills/tools/skill-creator/scripts/aggregate_benchmark.py +0 -401
  982. package/skills/tools/skill-creator/scripts/generate_report.py +0 -326
  983. package/skills/tools/skill-creator/scripts/improve_description.py +0 -247
  984. package/skills/tools/skill-creator/scripts/package_skill.py +0 -136
  985. package/skills/tools/skill-creator/scripts/quick_validate.py +0 -103
  986. package/skills/tools/skill-creator/scripts/run_eval.py +0 -310
  987. package/skills/tools/skill-creator/scripts/run_loop.py +0 -328
  988. package/skills/tools/skill-creator/scripts/utils.py +0 -47
  989. package/skills/tools/summarize/SKILL-zh.md +0 -47
  990. package/skills/tools/weather/SKILL-zh.md +0 -46
  991. package/skills/tools/weather/SKILL.md +0 -46
  992. package/skills/tools/webapp-testing/SKILL-zh.md +0 -96
  993. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-antigravity.d.ts +0 -0
  994. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/google-gemini-cli.d.ts +0 -0
  995. /package/dist/src/auth/oauth/{vendor-pi-google → google-oauth}/oauth-page.d.ts +0 -0
@@ -1,4 +1,4 @@
1
- //#region src/auth/oauth/vendor-pi-google/pkce.ts
1
+ //#region src/auth/oauth/google-oauth/pkce.ts
2
2
  /**
3
3
  * PKCE utilities using Web Crypto API.
4
4
  * Works in both Node.js 20+ and browsers.
@@ -13,7 +13,7 @@ function base64urlEncode(bytes) {
13
13
  }
14
14
  /**
15
15
  * Generate PKCE code verifier and challenge.
16
- * Uses Web Crypto API for cross-platform compatibility.
16
+ * Uses Web Crypto API.
17
17
  */
18
18
  async function generatePKCE() {
19
19
  const verifierBytes = new Uint8Array(32);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","names":[],"sources":["../../../../../src/auth/oauth/google-oauth/pkce.ts"],"sourcesContent":["/**\n * PKCE utilities using Web Crypto API.\n * Works in both Node.js 20+ and browsers.\n */\n\n/**\n * Encode bytes as base64url string.\n */\nfunction base64urlEncode(bytes: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (const byte of bytes) {\n\t\tbinary += String.fromCharCode(byte);\n\t}\n\treturn btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n\n/**\n * Generate PKCE code verifier and challenge.\n * Uses Web Crypto API.\n */\nexport async function generatePKCE(): Promise<{ verifier: string; challenge: string }> {\n\t// Generate random verifier\n\tconst verifierBytes = new Uint8Array(32);\n\tcrypto.getRandomValues(verifierBytes);\n\tconst verifier = base64urlEncode(verifierBytes);\n\n\t// Compute SHA-256 challenge\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n\tconst challenge = base64urlEncode(new Uint8Array(hashBuffer));\n\n\treturn { verifier, challenge };\n}\n"],"mappings":";;;;;;;;AAQA,SAAS,gBAAgB,OAA2B;CACnD,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,MAClB,WAAU,OAAO,aAAa,KAAK;AAEpC,QAAO,KAAK,OAAO,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,MAAM,GAAG;;;;;;AAO9E,eAAsB,eAAiE;CAEtF,MAAM,gBAAgB,IAAI,WAAW,GAAG;AACxC,QAAO,gBAAgB,cAAc;CACrC,MAAM,WAAW,gBAAgB,cAAc;CAI/C,MAAM,OAAO,IADO,aACA,CAAC,OAAO,SAAS;CACrC,MAAM,aAAa,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAG9D,QAAO;EAAE;EAAU,WAFD,gBAAgB,IAAI,WAAW,WAAW,CAEhC;EAAE"}
@@ -3,9 +3,9 @@ import { minimaxOAuthProvider } from "./minimax.js";
3
3
  import { minimaxCnOAuthProvider } from "./minimax-cn.js";
4
4
  import { kimiCodingOAuthProvider } from "./kimi-coding.js";
5
5
  import { getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, loginGitHubCopilot, normalizeDomain, refreshGitHubCopilotToken } from "./github-copilot.js";
6
- import { geminiCliOAuthProvider, loginGeminiCli, refreshGoogleCloudToken } from "./vendor-pi-google/google-gemini-cli.js";
6
+ import { geminiCliOAuthProvider, loginGeminiCli, refreshGoogleCloudToken } from "./google-oauth/google-gemini-cli.js";
7
7
  import "./google-gemini-cli.js";
8
- import { antigravityOAuthProvider, loginAntigravity, refreshAntigravityToken } from "./vendor-pi-google/google-antigravity.js";
8
+ import { antigravityOAuthProvider, loginAntigravity, refreshAntigravityToken } from "./google-oauth/google-antigravity.js";
9
9
  import "./google-antigravity.js";
10
10
  import { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from "./openai-codex.js";
11
11
  export { anthropicOAuthProvider, getGitHubCopilotBaseUrl, githubCopilotOAuthProvider, antigravityOAuthProvider as googleAntigravityOAuthProvider, geminiCliOAuthProvider as googleGeminiCliOAuthProvider, kimiCodingOAuthProvider, loginAnthropic, loginAntigravity, loginGeminiCli, loginGitHubCopilot, loginOpenAICodex, minimaxCnOAuthProvider, minimaxOAuthProvider, normalizeDomain, openaiCodexOAuthProvider, refreshAnthropicToken, refreshAntigravityToken, refreshGitHubCopilotToken, refreshGoogleCloudToken, refreshOpenAICodexToken };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Kimi Coding (Moonshot AI) OAuth device code flow for pi-ai `kimi-coding` provider.
2
+ * Kimi Coding (Moonshot AI) OAuth device code flow.
3
3
  * @see https://auth.kimi.com
4
4
  */
5
5
  import type { OAuthProviderInterface } from './types.js';
@@ -6,7 +6,7 @@ const KIMI_OAUTH_CLIENT_ID = "17e5f671-d194-4dfb-9706-5516cb48c098";
6
6
  const kimiCodingOAuthProvider = {
7
7
  id: "kimi-coding",
8
8
  name: "Kimi For Coding (月之暗面)",
9
- usesCallbackServer: true,
9
+ usesCallbackServer: false,
10
10
  async login(callbacks) {
11
11
  const deviceResponse = await fetch(KIMI_OAUTH_DEVICE_URL, {
12
12
  method: "POST",
@@ -1 +1 @@
1
- {"version":3,"file":"kimi-coding.js","names":[],"sources":["../../../../src/auth/oauth/kimi-coding.ts"],"sourcesContent":["/**\n * Kimi Coding (Moonshot AI) OAuth device code flow for pi-ai `kimi-coding` provider.\n * @see https://auth.kimi.com\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst KIMI_OAUTH_BASE_URL = 'https://auth.kimi.com';\nconst KIMI_OAUTH_DEVICE_URL = `${KIMI_OAUTH_BASE_URL}/api/oauth/device_authorization`;\nconst KIMI_OAUTH_TOKEN_URL = `${KIMI_OAUTH_BASE_URL}/api/oauth/token`;\nconst KIMI_OAUTH_CLIENT_ID = '17e5f671-d194-4dfb-9706-5516cb48c098';\n\nexport const kimiCodingOAuthProvider: OAuthProviderInterface = {\n\tid: 'kimi-coding',\n\tname: 'Kimi For Coding (月之暗面)',\n\tusesCallbackServer: true,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\tconst deviceResponse = await fetch(KIMI_OAUTH_DEVICE_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\tscope: 'kimi-code',\n\t\t\t}),\n\t\t});\n\n\t\tif (!deviceResponse.ok) {\n\t\t\tconst error = await deviceResponse.text();\n\t\t\tthrow new Error(`Device code request failed: ${error}`);\n\t\t}\n\n\t\tconst deviceData = (await deviceResponse.json()) as {\n\t\t\tdevice_code: string;\n\t\t\tuser_code: string;\n\t\t\tverification_uri: string;\n\t\t\tverification_uri_complete: string;\n\t\t\tinterval: number;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\tcallbacks.onAuth({\n\t\t\turl: deviceData.verification_uri_complete || deviceData.verification_uri,\n\t\t\tinstructions: `Please visit ${deviceData.verification_uri} and enter code: ${deviceData.user_code}`,\n\t\t});\n\n\t\tconst expiresAt = Date.now() + deviceData.expires_in * 1000;\n\t\tconst pollInterval = (deviceData.interval || 5) * 1000;\n\n\t\twhile (Date.now() < expiresAt) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, pollInterval));\n\n\t\t\tconst tokenResponse = await fetch(KIMI_OAUTH_TOKEN_URL, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t\t},\n\t\t\t\tbody: new URLSearchParams({\n\t\t\t\t\tgrant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n\t\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\t\tdevice_code: deviceData.device_code,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tif (tokenResponse.ok) {\n\t\t\t\tconst tokenData = (await tokenResponse.json()) as {\n\t\t\t\t\taccess_token: string;\n\t\t\t\t\trefresh_token: string;\n\t\t\t\t\texpires_in: number;\n\t\t\t\t};\n\n\t\t\t\treturn {\n\t\t\t\t\taccess: tokenData.access_token,\n\t\t\t\t\trefresh: tokenData.refresh_token,\n\t\t\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst errorData = (await tokenResponse.json()) as { error?: string };\n\t\t\tif (errorData.error === 'expired_token') {\n\t\t\t\tthrow new Error('Device code expired. Please try again.');\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error('Device code expired. Please try again.');\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('Kimi OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(KIMI_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`Kimi OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = (await response.json()) as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n"],"mappings":";AAOA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB,GAAG,oBAAoB;AACrD,MAAM,uBAAuB,GAAG,oBAAoB;AACpD,MAAM,uBAAuB;AAE7B,MAAa,0BAAkD;CAC9D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EACtE,MAAM,iBAAiB,MAAM,MAAM,uBAAuB;GACzD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,WAAW;IACX,OAAO;IACP,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,eAAe,IAAI;GACvB,MAAM,QAAQ,MAAM,eAAe,MAAM;AACzC,SAAM,IAAI,MAAM,+BAA+B,QAAQ;;EAGxD,MAAM,aAAc,MAAM,eAAe,MAAM;AAS/C,YAAU,OAAO;GAChB,KAAK,WAAW,6BAA6B,WAAW;GACxD,cAAc,gBAAgB,WAAW,iBAAiB,mBAAmB,WAAW;GACxF,CAAC;EAEF,MAAM,YAAY,KAAK,KAAK,GAAG,WAAW,aAAa;EACvD,MAAM,gBAAgB,WAAW,YAAY,KAAK;AAElD,SAAO,KAAK,KAAK,GAAG,WAAW;AAC9B,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,aAAa,CAAC;GAEjE,MAAM,gBAAgB,MAAM,MAAM,sBAAsB;IACvD,QAAQ;IACR,SAAS,EACR,gBAAgB,qCAChB;IACD,MAAM,IAAI,gBAAgB;KACzB,YAAY;KACZ,WAAW;KACX,aAAa,WAAW;KACxB,CAAC;IACF,CAAC;AAEF,OAAI,cAAc,IAAI;IACrB,MAAM,YAAa,MAAM,cAAc,MAAM;AAM7C,WAAO;KACN,QAAQ,UAAU;KAClB,SAAS,UAAU;KACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;KAC7C;;AAIF,QAAI,MADqB,cAAc,MAAM,EAC/B,UAAU,gBACvB,OAAM,IAAI,MAAM,yCAAyC;;AAI3D,QAAM,IAAI,MAAM,yCAAyC;;CAG1D,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,qDAAqD;EAGtE,MAAM,WAAW,MAAM,MAAM,sBAAsB;GAClD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,8BAA8B,OAAO;;EAGtD,MAAM,UAAW,MAAM,SAAS,MAAM;AAMtC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB"}
1
+ {"version":3,"file":"kimi-coding.js","names":[],"sources":["../../../../src/auth/oauth/kimi-coding.ts"],"sourcesContent":["/**\n * Kimi Coding (Moonshot AI) OAuth device code flow.\n * @see https://auth.kimi.com\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst KIMI_OAUTH_BASE_URL = 'https://auth.kimi.com';\nconst KIMI_OAUTH_DEVICE_URL = `${KIMI_OAUTH_BASE_URL}/api/oauth/device_authorization`;\nconst KIMI_OAUTH_TOKEN_URL = `${KIMI_OAUTH_BASE_URL}/api/oauth/token`;\nconst KIMI_OAUTH_CLIENT_ID = '17e5f671-d194-4dfb-9706-5516cb48c098';\n\nexport const kimiCodingOAuthProvider: OAuthProviderInterface = {\n\tid: 'kimi-coding',\n\tname: 'Kimi For Coding (月之暗面)',\n\tusesCallbackServer: false,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\tconst deviceResponse = await fetch(KIMI_OAUTH_DEVICE_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\tscope: 'kimi-code',\n\t\t\t}),\n\t\t});\n\n\t\tif (!deviceResponse.ok) {\n\t\t\tconst error = await deviceResponse.text();\n\t\t\tthrow new Error(`Device code request failed: ${error}`);\n\t\t}\n\n\t\tconst deviceData = (await deviceResponse.json()) as {\n\t\t\tdevice_code: string;\n\t\t\tuser_code: string;\n\t\t\tverification_uri: string;\n\t\t\tverification_uri_complete: string;\n\t\t\tinterval: number;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\tcallbacks.onAuth({\n\t\t\turl: deviceData.verification_uri_complete || deviceData.verification_uri,\n\t\t\tinstructions: `Please visit ${deviceData.verification_uri} and enter code: ${deviceData.user_code}`,\n\t\t});\n\n\t\tconst expiresAt = Date.now() + deviceData.expires_in * 1000;\n\t\tconst pollInterval = (deviceData.interval || 5) * 1000;\n\n\t\twhile (Date.now() < expiresAt) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, pollInterval));\n\n\t\t\tconst tokenResponse = await fetch(KIMI_OAUTH_TOKEN_URL, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t\t},\n\t\t\t\tbody: new URLSearchParams({\n\t\t\t\t\tgrant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n\t\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\t\tdevice_code: deviceData.device_code,\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tif (tokenResponse.ok) {\n\t\t\t\tconst tokenData = (await tokenResponse.json()) as {\n\t\t\t\t\taccess_token: string;\n\t\t\t\t\trefresh_token: string;\n\t\t\t\t\texpires_in: number;\n\t\t\t\t};\n\n\t\t\t\treturn {\n\t\t\t\t\taccess: tokenData.access_token,\n\t\t\t\t\trefresh: tokenData.refresh_token,\n\t\t\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst errorData = (await tokenResponse.json()) as { error?: string };\n\t\t\tif (errorData.error === 'expired_token') {\n\t\t\t\tthrow new Error('Device code expired. Please try again.');\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error('Device code expired. Please try again.');\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('Kimi OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(KIMI_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: KIMI_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`Kimi OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = (await response.json()) as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n"],"mappings":";AAOA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB,GAAG,oBAAoB;AACrD,MAAM,uBAAuB,GAAG,oBAAoB;AACpD,MAAM,uBAAuB;AAE7B,MAAa,0BAAkD;CAC9D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EACtE,MAAM,iBAAiB,MAAM,MAAM,uBAAuB;GACzD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,WAAW;IACX,OAAO;IACP,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,eAAe,IAAI;GACvB,MAAM,QAAQ,MAAM,eAAe,MAAM;AACzC,SAAM,IAAI,MAAM,+BAA+B,QAAQ;;EAGxD,MAAM,aAAc,MAAM,eAAe,MAAM;AAS/C,YAAU,OAAO;GAChB,KAAK,WAAW,6BAA6B,WAAW;GACxD,cAAc,gBAAgB,WAAW,iBAAiB,mBAAmB,WAAW;GACxF,CAAC;EAEF,MAAM,YAAY,KAAK,KAAK,GAAG,WAAW,aAAa;EACvD,MAAM,gBAAgB,WAAW,YAAY,KAAK;AAElD,SAAO,KAAK,KAAK,GAAG,WAAW;AAC9B,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,aAAa,CAAC;GAEjE,MAAM,gBAAgB,MAAM,MAAM,sBAAsB;IACvD,QAAQ;IACR,SAAS,EACR,gBAAgB,qCAChB;IACD,MAAM,IAAI,gBAAgB;KACzB,YAAY;KACZ,WAAW;KACX,aAAa,WAAW;KACxB,CAAC;IACF,CAAC;AAEF,OAAI,cAAc,IAAI;IACrB,MAAM,YAAa,MAAM,cAAc,MAAM;AAM7C,WAAO;KACN,QAAQ,UAAU;KAClB,SAAS,UAAU;KACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;KAC7C;;AAIF,QAAI,MADqB,cAAc,MAAM,EAC/B,UAAU,gBACvB,OAAM,IAAI,MAAM,yCAAyC;;AAI3D,QAAM,IAAI,MAAM,yCAAyC;;CAG1D,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,qDAAqD;EAGtE,MAAM,WAAW,MAAM,MAAM,sBAAsB;GAClD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,8BAA8B,OAAO;;EAGtD,MAAM,UAAW,MAAM,SAAS,MAAM;AAMtC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB"}
@@ -6,7 +6,7 @@ const MINIMAX_CN_OAUTH_CLIENT_ID = "your_client_id";
6
6
  const minimaxCnOAuthProvider = {
7
7
  id: "minimax-cn",
8
8
  name: "MiniMax 国内版",
9
- usesCallbackServer: true,
9
+ usesCallbackServer: false,
10
10
  async login(callbacks) {
11
11
  const codeVerifier = generateCodeVerifier();
12
12
  const codeChallenge = await generateCodeChallenge(codeVerifier);
@@ -1 +1 @@
1
- {"version":3,"file":"minimax-cn.js","names":[],"sources":["../../../../src/auth/oauth/minimax-cn.ts"],"sourcesContent":["/**\n * MiniMax CN (China region) OAuth provider\n *\n * OAuth 2.0 for the MiniMax China platform: https://platform.minimax.chat/\n *\n * Endpoints differ from the international product:\n * - International: platform.minimaxi.com\n * - China: platform.minimax.chat\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst MINIMAX_CN_OAUTH_BASE_URL = 'https://platform.minimax.chat';\nconst MINIMAX_CN_OAUTH_AUTHORIZE_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/authorize`;\nconst MINIMAX_CN_OAUTH_TOKEN_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/token`;\nconst MINIMAX_CN_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app\n\nexport const minimaxCnOAuthProvider: OAuthProviderInterface = {\n\tid: 'minimax-cn',\n\tname: 'MiniMax 国内版',\n\tusesCallbackServer: true,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\t// MiniMax CN uses authorization code flow\n\t\tconst codeVerifier = generateCodeVerifier();\n\t\tconst codeChallenge = await generateCodeChallenge(codeVerifier);\n\t\t\n\t\tconst authUrl = new URL(MINIMAX_CN_OAUTH_AUTHORIZE_URL);\n\t\tauthUrl.searchParams.set('client_id', MINIMAX_CN_OAUTH_CLIENT_ID);\n\t\tauthUrl.searchParams.set('redirect_uri', 'http://localhost:3000/callback');\n\t\tauthUrl.searchParams.set('response_type', 'code');\n\t\tauthUrl.searchParams.set('scope', 'api');\n\t\tauthUrl.searchParams.set('code_challenge', codeChallenge);\n\t\tauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n\t\t// Show user the auth URL\n\t\tcallbacks.onAuth({\n\t\t\turl: authUrl.toString(),\n\t\t\tinstructions: '请在浏览器中授权应用,然后输入返回的授权码。',\n\t\t});\n\n\t\t// Prompt for the authorization code\n\t\tconst code = await callbacks.onPrompt({\n\t\t\tmessage: '请输入授权码:',\n\t\t});\n\n\t\t// Exchange code for token\n\t\tconst tokenResponse = await fetch(MINIMAX_CN_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\tclient_id: MINIMAX_CN_OAUTH_CLIENT_ID,\n\t\t\t\tcode,\n\t\t\t\tredirect_uri: 'http://localhost:3000/callback',\n\t\t\t\tcode_verifier: codeVerifier,\n\t\t\t}),\n\t\t});\n\n\t\tif (!tokenResponse.ok) {\n\t\t\tconst error = await tokenResponse.text();\n\t\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t\t}\n\n\t\tconst tokenData = await tokenResponse.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\taccess: tokenData.access_token,\n\t\t\trefresh: tokenData.refresh_token,\n\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t};\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('MiniMax CN OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(MINIMAX_CN_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: MINIMAX_CN_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`MiniMax CN OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = await response.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n\nfunction generateCodeVerifier(): string {\n\tconst array = new Uint8Array(32);\n\tcrypto.getRandomValues(array);\n\treturn base64UrlEncode(array);\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst digest = await crypto.subtle.digest('SHA-256', data);\n\treturn base64UrlEncode(new Uint8Array(digest));\n}\n\nfunction base64UrlEncode(buffer: Uint8Array): string {\n\tlet str = '';\n\tbuffer.forEach(b => str += String.fromCharCode(b));\n\treturn btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n"],"mappings":";AAYA,MAAM,4BAA4B;AAClC,MAAM,iCAAiC,GAAG,0BAA0B;AACpE,MAAM,6BAA6B,GAAG,0BAA0B;AAChE,MAAM,6BAA6B;AAEnC,MAAa,yBAAiD;CAC7D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EAEtE,MAAM,eAAe,sBAAsB;EAC3C,MAAM,gBAAgB,MAAM,sBAAsB,aAAa;EAE/D,MAAM,UAAU,IAAI,IAAI,+BAA+B;AACvD,UAAQ,aAAa,IAAI,aAAa,2BAA2B;AACjE,UAAQ,aAAa,IAAI,gBAAgB,iCAAiC;AAC1E,UAAQ,aAAa,IAAI,iBAAiB,OAAO;AACjD,UAAQ,aAAa,IAAI,SAAS,MAAM;AACxC,UAAQ,aAAa,IAAI,kBAAkB,cAAc;AACzD,UAAQ,aAAa,IAAI,yBAAyB,OAAO;AAGzD,YAAU,OAAO;GAChB,KAAK,QAAQ,UAAU;GACvB,cAAc;GACd,CAAC;EAGF,MAAM,OAAO,MAAM,UAAU,SAAS,EACrC,SAAS,WACT,CAAC;EAGF,MAAM,gBAAgB,MAAM,MAAM,4BAA4B;GAC7D,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX;IACA,cAAc;IACd,eAAe;IACf,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,cAAc,IAAI;GACtB,MAAM,QAAQ,MAAM,cAAc,MAAM;AACxC,SAAM,IAAI,MAAM,0BAA0B,QAAQ;;EAGnD,MAAM,YAAY,MAAM,cAAc,MAAM;AAM5C,SAAO;GACN,QAAQ,UAAU;GAClB,SAAS,UAAU;GACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;GAC7C;;CAGF,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,2DAA2D;EAG5E,MAAM,WAAW,MAAM,MAAM,4BAA4B;GACxD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,oCAAoC,OAAO;;EAG5D,MAAM,UAAU,MAAM,SAAS,MAAM;AAMrC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB;AAED,SAAS,uBAA+B;CACvC,MAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,QAAO,gBAAgB,MAAM;AAC7B,QAAO,gBAAgB,MAAM;;AAG9B,eAAe,sBAAsB,UAAmC;CAEvE,MAAM,OAAO,IADO,aACA,CAAC,OAAO,SAAS;CACrC,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAC1D,QAAO,gBAAgB,IAAI,WAAW,OAAO,CAAC;;AAG/C,SAAS,gBAAgB,QAA4B;CACpD,IAAI,MAAM;AACV,QAAO,SAAQ,MAAK,OAAO,OAAO,aAAa,EAAE,CAAC;AAClD,QAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,MAAM,GAAG"}
1
+ {"version":3,"file":"minimax-cn.js","names":[],"sources":["../../../../src/auth/oauth/minimax-cn.ts"],"sourcesContent":["/**\n * MiniMax CN (China region) OAuth provider\n *\n * OAuth 2.0 for the MiniMax China platform: https://platform.minimax.chat/\n *\n * Endpoints differ from the international product:\n * - International: platform.minimaxi.com\n * - China: platform.minimax.chat\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst MINIMAX_CN_OAUTH_BASE_URL = 'https://platform.minimax.chat';\nconst MINIMAX_CN_OAUTH_AUTHORIZE_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/authorize`;\nconst MINIMAX_CN_OAUTH_TOKEN_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/token`;\nconst MINIMAX_CN_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app\n\nexport const minimaxCnOAuthProvider: OAuthProviderInterface = {\n\tid: 'minimax-cn',\n\tname: 'MiniMax 国内版',\n\tusesCallbackServer: false,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\t// MiniMax CN uses authorization code flow\n\t\tconst codeVerifier = generateCodeVerifier();\n\t\tconst codeChallenge = await generateCodeChallenge(codeVerifier);\n\t\t\n\t\tconst authUrl = new URL(MINIMAX_CN_OAUTH_AUTHORIZE_URL);\n\t\tauthUrl.searchParams.set('client_id', MINIMAX_CN_OAUTH_CLIENT_ID);\n\t\tauthUrl.searchParams.set('redirect_uri', 'http://localhost:3000/callback');\n\t\tauthUrl.searchParams.set('response_type', 'code');\n\t\tauthUrl.searchParams.set('scope', 'api');\n\t\tauthUrl.searchParams.set('code_challenge', codeChallenge);\n\t\tauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n\t\t// Show user the auth URL\n\t\tcallbacks.onAuth({\n\t\t\turl: authUrl.toString(),\n\t\t\tinstructions: '请在浏览器中授权应用,然后输入返回的授权码。',\n\t\t});\n\n\t\t// Prompt for the authorization code\n\t\tconst code = await callbacks.onPrompt({\n\t\t\tmessage: '请输入授权码:',\n\t\t});\n\n\t\t// Exchange code for token\n\t\tconst tokenResponse = await fetch(MINIMAX_CN_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\tclient_id: MINIMAX_CN_OAUTH_CLIENT_ID,\n\t\t\t\tcode,\n\t\t\t\tredirect_uri: 'http://localhost:3000/callback',\n\t\t\t\tcode_verifier: codeVerifier,\n\t\t\t}),\n\t\t});\n\n\t\tif (!tokenResponse.ok) {\n\t\t\tconst error = await tokenResponse.text();\n\t\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t\t}\n\n\t\tconst tokenData = await tokenResponse.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\taccess: tokenData.access_token,\n\t\t\trefresh: tokenData.refresh_token,\n\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t};\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('MiniMax CN OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(MINIMAX_CN_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: MINIMAX_CN_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`MiniMax CN OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = await response.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n\nfunction generateCodeVerifier(): string {\n\tconst array = new Uint8Array(32);\n\tcrypto.getRandomValues(array);\n\treturn base64UrlEncode(array);\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst digest = await crypto.subtle.digest('SHA-256', data);\n\treturn base64UrlEncode(new Uint8Array(digest));\n}\n\nfunction base64UrlEncode(buffer: Uint8Array): string {\n\tlet str = '';\n\tbuffer.forEach(b => str += String.fromCharCode(b));\n\treturn btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n"],"mappings":";AAYA,MAAM,4BAA4B;AAClC,MAAM,iCAAiC,GAAG,0BAA0B;AACpE,MAAM,6BAA6B,GAAG,0BAA0B;AAChE,MAAM,6BAA6B;AAEnC,MAAa,yBAAiD;CAC7D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EAEtE,MAAM,eAAe,sBAAsB;EAC3C,MAAM,gBAAgB,MAAM,sBAAsB,aAAa;EAE/D,MAAM,UAAU,IAAI,IAAI,+BAA+B;AACvD,UAAQ,aAAa,IAAI,aAAa,2BAA2B;AACjE,UAAQ,aAAa,IAAI,gBAAgB,iCAAiC;AAC1E,UAAQ,aAAa,IAAI,iBAAiB,OAAO;AACjD,UAAQ,aAAa,IAAI,SAAS,MAAM;AACxC,UAAQ,aAAa,IAAI,kBAAkB,cAAc;AACzD,UAAQ,aAAa,IAAI,yBAAyB,OAAO;AAGzD,YAAU,OAAO;GAChB,KAAK,QAAQ,UAAU;GACvB,cAAc;GACd,CAAC;EAGF,MAAM,OAAO,MAAM,UAAU,SAAS,EACrC,SAAS,WACT,CAAC;EAGF,MAAM,gBAAgB,MAAM,MAAM,4BAA4B;GAC7D,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX;IACA,cAAc;IACd,eAAe;IACf,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,cAAc,IAAI;GACtB,MAAM,QAAQ,MAAM,cAAc,MAAM;AACxC,SAAM,IAAI,MAAM,0BAA0B,QAAQ;;EAGnD,MAAM,YAAY,MAAM,cAAc,MAAM;AAM5C,SAAO;GACN,QAAQ,UAAU;GAClB,SAAS,UAAU;GACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;GAC7C;;CAGF,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,2DAA2D;EAG5E,MAAM,WAAW,MAAM,MAAM,4BAA4B;GACxD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,oCAAoC,OAAO;;EAG5D,MAAM,UAAU,MAAM,SAAS,MAAM;AAMrC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB;AAED,SAAS,uBAA+B;CACvC,MAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,QAAO,gBAAgB,MAAM;AAC7B,QAAO,gBAAgB,MAAM;;AAG9B,eAAe,sBAAsB,UAAmC;CAEvE,MAAM,OAAO,IADO,aACA,CAAC,OAAO,SAAS;CACrC,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAC1D,QAAO,gBAAgB,IAAI,WAAW,OAAO,CAAC;;AAG/C,SAAS,gBAAgB,QAA4B;CACpD,IAAI,MAAM;AACV,QAAO,SAAQ,MAAK,OAAO,OAAO,aAAa,EAAE,CAAC;AAClD,QAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,MAAM,GAAG"}
@@ -6,7 +6,7 @@ const MINIMAX_OAUTH_CLIENT_ID = "your_client_id";
6
6
  const minimaxOAuthProvider = {
7
7
  id: "minimax",
8
8
  name: "MiniMax",
9
- usesCallbackServer: true,
9
+ usesCallbackServer: false,
10
10
  async login(callbacks) {
11
11
  const codeVerifier = generateCodeVerifier();
12
12
  const codeChallenge = await generateCodeChallenge(codeVerifier);
@@ -1 +1 @@
1
- {"version":3,"file":"minimax.js","names":[],"sources":["../../../../src/auth/oauth/minimax.ts"],"sourcesContent":["/**\n * MiniMax OAuth Provider\n * \n * OAuth 2.0 authentication for MiniMax Platform.\n * https://platform.minimaxi.com/\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst MINIMAX_OAUTH_BASE_URL = 'https://platform.minimaxi.com';\nconst MINIMAX_OAUTH_AUTHORIZE_URL = `${MINIMAX_OAUTH_BASE_URL}/oauth/authorize`;\nconst MINIMAX_OAUTH_TOKEN_URL = `${MINIMAX_OAUTH_BASE_URL}/oauth/token`;\nconst MINIMAX_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app\n\nexport const minimaxOAuthProvider: OAuthProviderInterface = {\n\tid: 'minimax',\n\tname: 'MiniMax',\n\tusesCallbackServer: true,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\t// MiniMax uses authorization code flow\n\t\t// First, generate a device code or authorization URL\n\t\t\n\t\t// For simplicity, we'll use a manual code flow\n\t\tconst codeVerifier = generateCodeVerifier();\n\t\tconst codeChallenge = await generateCodeChallenge(codeVerifier);\n\t\t\n\t\tconst authUrl = new URL(MINIMAX_OAUTH_AUTHORIZE_URL);\n\t\tauthUrl.searchParams.set('client_id', MINIMAX_OAUTH_CLIENT_ID);\n\t\tauthUrl.searchParams.set('redirect_uri', 'http://localhost:3000/callback');\n\t\tauthUrl.searchParams.set('response_type', 'code');\n\t\tauthUrl.searchParams.set('scope', 'api');\n\t\tauthUrl.searchParams.set('code_challenge', codeChallenge);\n\t\tauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n\t\t// Show user the auth URL\n\t\tcallbacks.onAuth({\n\t\t\turl: authUrl.toString(),\n\t\t\tinstructions: 'Please authorize the application and enter the code shown.',\n\t\t});\n\n\t\t// Prompt for the authorization code\n\t\tconst code = await callbacks.onPrompt({\n\t\t\tmessage: 'Enter the authorization code:',\n\t\t});\n\n\t\t// Exchange code for token\n\t\tconst tokenResponse = await fetch(MINIMAX_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\tclient_id: MINIMAX_OAUTH_CLIENT_ID,\n\t\t\t\tcode,\n\t\t\t\tredirect_uri: 'http://localhost:3000/callback',\n\t\t\t\tcode_verifier: codeVerifier,\n\t\t\t}),\n\t\t});\n\n\t\tif (!tokenResponse.ok) {\n\t\t\tconst error = await tokenResponse.text();\n\t\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t\t}\n\n\t\tconst tokenData = await tokenResponse.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\taccess: tokenData.access_token,\n\t\t\trefresh: tokenData.refresh_token,\n\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t};\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('MiniMax OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(MINIMAX_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: MINIMAX_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`MiniMax OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = await response.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n\nfunction generateCodeVerifier(): string {\n\tconst array = new Uint8Array(32);\n\tcrypto.getRandomValues(array);\n\treturn base64UrlEncode(array);\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst digest = await crypto.subtle.digest('SHA-256', data);\n\treturn base64UrlEncode(new Uint8Array(digest));\n}\n\nfunction base64UrlEncode(buffer: Uint8Array): string {\n\tlet str = '';\n\tbuffer.forEach(b => str += String.fromCharCode(b));\n\treturn btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n"],"mappings":";AASA,MAAM,yBAAyB;AAC/B,MAAM,8BAA8B,GAAG,uBAAuB;AAC9D,MAAM,0BAA0B,GAAG,uBAAuB;AAC1D,MAAM,0BAA0B;AAEhC,MAAa,uBAA+C;CAC3D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EAKtE,MAAM,eAAe,sBAAsB;EAC3C,MAAM,gBAAgB,MAAM,sBAAsB,aAAa;EAE/D,MAAM,UAAU,IAAI,IAAI,4BAA4B;AACpD,UAAQ,aAAa,IAAI,aAAa,wBAAwB;AAC9D,UAAQ,aAAa,IAAI,gBAAgB,iCAAiC;AAC1E,UAAQ,aAAa,IAAI,iBAAiB,OAAO;AACjD,UAAQ,aAAa,IAAI,SAAS,MAAM;AACxC,UAAQ,aAAa,IAAI,kBAAkB,cAAc;AACzD,UAAQ,aAAa,IAAI,yBAAyB,OAAO;AAGzD,YAAU,OAAO;GAChB,KAAK,QAAQ,UAAU;GACvB,cAAc;GACd,CAAC;EAGF,MAAM,OAAO,MAAM,UAAU,SAAS,EACrC,SAAS,iCACT,CAAC;EAGF,MAAM,gBAAgB,MAAM,MAAM,yBAAyB;GAC1D,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX;IACA,cAAc;IACd,eAAe;IACf,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,cAAc,IAAI;GACtB,MAAM,QAAQ,MAAM,cAAc,MAAM;AACxC,SAAM,IAAI,MAAM,0BAA0B,QAAQ;;EAGnD,MAAM,YAAY,MAAM,cAAc,MAAM;AAM5C,SAAO;GACN,QAAQ,UAAU;GAClB,SAAS,UAAU;GACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;GAC7C;;CAGF,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,wDAAwD;EAGzE,MAAM,WAAW,MAAM,MAAM,yBAAyB;GACrD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,iCAAiC,OAAO;;EAGzD,MAAM,UAAU,MAAM,SAAS,MAAM;AAMrC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB;AAED,SAAS,uBAA+B;CACvC,MAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,QAAO,gBAAgB,MAAM;AAC7B,QAAO,gBAAgB,MAAM;;AAG9B,eAAe,sBAAsB,UAAmC;CAEvE,MAAM,OAAO,IADO,aACA,CAAC,OAAO,SAAS;CACrC,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAC1D,QAAO,gBAAgB,IAAI,WAAW,OAAO,CAAC;;AAG/C,SAAS,gBAAgB,QAA4B;CACpD,IAAI,MAAM;AACV,QAAO,SAAQ,MAAK,OAAO,OAAO,aAAa,EAAE,CAAC;AAClD,QAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,MAAM,GAAG"}
1
+ {"version":3,"file":"minimax.js","names":[],"sources":["../../../../src/auth/oauth/minimax.ts"],"sourcesContent":["/**\n * MiniMax OAuth Provider\n * \n * OAuth 2.0 authentication for MiniMax Platform.\n * https://platform.minimaxi.com/\n */\n\nimport type { OAuthCredentials, OAuthProviderInterface, OAuthLoginCallbacks } from './types.js';\n\nconst MINIMAX_OAUTH_BASE_URL = 'https://platform.minimaxi.com';\nconst MINIMAX_OAUTH_AUTHORIZE_URL = `${MINIMAX_OAUTH_BASE_URL}/oauth/authorize`;\nconst MINIMAX_OAUTH_TOKEN_URL = `${MINIMAX_OAUTH_BASE_URL}/oauth/token`;\nconst MINIMAX_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app\n\nexport const minimaxOAuthProvider: OAuthProviderInterface = {\n\tid: 'minimax',\n\tname: 'MiniMax',\n\tusesCallbackServer: false,\n\n\tasync login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n\t\t// MiniMax uses authorization code flow\n\t\t// First, generate a device code or authorization URL\n\t\t\n\t\t// For simplicity, we'll use a manual code flow\n\t\tconst codeVerifier = generateCodeVerifier();\n\t\tconst codeChallenge = await generateCodeChallenge(codeVerifier);\n\t\t\n\t\tconst authUrl = new URL(MINIMAX_OAUTH_AUTHORIZE_URL);\n\t\tauthUrl.searchParams.set('client_id', MINIMAX_OAUTH_CLIENT_ID);\n\t\tauthUrl.searchParams.set('redirect_uri', 'http://localhost:3000/callback');\n\t\tauthUrl.searchParams.set('response_type', 'code');\n\t\tauthUrl.searchParams.set('scope', 'api');\n\t\tauthUrl.searchParams.set('code_challenge', codeChallenge);\n\t\tauthUrl.searchParams.set('code_challenge_method', 'S256');\n\n\t\t// Show user the auth URL\n\t\tcallbacks.onAuth({\n\t\t\turl: authUrl.toString(),\n\t\t\tinstructions: 'Please authorize the application and enter the code shown.',\n\t\t});\n\n\t\t// Prompt for the authorization code\n\t\tconst code = await callbacks.onPrompt({\n\t\t\tmessage: 'Enter the authorization code:',\n\t\t});\n\n\t\t// Exchange code for token\n\t\tconst tokenResponse = await fetch(MINIMAX_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'authorization_code',\n\t\t\t\tclient_id: MINIMAX_OAUTH_CLIENT_ID,\n\t\t\t\tcode,\n\t\t\t\tredirect_uri: 'http://localhost:3000/callback',\n\t\t\t\tcode_verifier: codeVerifier,\n\t\t\t}),\n\t\t});\n\n\t\tif (!tokenResponse.ok) {\n\t\t\tconst error = await tokenResponse.text();\n\t\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t\t}\n\n\t\tconst tokenData = await tokenResponse.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\taccess: tokenData.access_token,\n\t\t\trefresh: tokenData.refresh_token,\n\t\t\texpires: Date.now() + tokenData.expires_in * 1000,\n\t\t};\n\t},\n\n\tasync refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n\t\tif (!credentials.refresh) {\n\t\t\tthrow new Error('MiniMax OAuth refresh token missing. Re-authenticate.');\n\t\t}\n\n\t\tconst response = await fetch(MINIMAX_OAUTH_TOKEN_URL, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tgrant_type: 'refresh_token',\n\t\t\t\tclient_id: MINIMAX_OAUTH_CLIENT_ID,\n\t\t\t\trefresh_token: credentials.refresh,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text();\n\t\t\tthrow new Error(`MiniMax OAuth refresh failed: ${text}`);\n\t\t}\n\n\t\tconst payload = await response.json() as {\n\t\t\taccess_token: string;\n\t\t\trefresh_token: string;\n\t\t\texpires_in: number;\n\t\t};\n\n\t\treturn {\n\t\t\t...credentials,\n\t\t\taccess: payload.access_token,\n\t\t\trefresh: payload.refresh_token || credentials.refresh,\n\t\t\texpires: Date.now() + payload.expires_in * 1000,\n\t\t};\n\t},\n\n\tgetApiKey(credentials: OAuthCredentials): string {\n\t\treturn credentials.access;\n\t},\n};\n\nfunction generateCodeVerifier(): string {\n\tconst array = new Uint8Array(32);\n\tcrypto.getRandomValues(array);\n\treturn base64UrlEncode(array);\n}\n\nasync function generateCodeChallenge(verifier: string): Promise<string> {\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(verifier);\n\tconst digest = await crypto.subtle.digest('SHA-256', data);\n\treturn base64UrlEncode(new Uint8Array(digest));\n}\n\nfunction base64UrlEncode(buffer: Uint8Array): string {\n\tlet str = '';\n\tbuffer.forEach(b => str += String.fromCharCode(b));\n\treturn btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n"],"mappings":";AASA,MAAM,yBAAyB;AAC/B,MAAM,8BAA8B,GAAG,uBAAuB;AAC9D,MAAM,0BAA0B,GAAG,uBAAuB;AAC1D,MAAM,0BAA0B;AAEhC,MAAa,uBAA+C;CAC3D,IAAI;CACJ,MAAM;CACN,oBAAoB;CAEpB,MAAM,MAAM,WAA2D;EAKtE,MAAM,eAAe,sBAAsB;EAC3C,MAAM,gBAAgB,MAAM,sBAAsB,aAAa;EAE/D,MAAM,UAAU,IAAI,IAAI,4BAA4B;AACpD,UAAQ,aAAa,IAAI,aAAa,wBAAwB;AAC9D,UAAQ,aAAa,IAAI,gBAAgB,iCAAiC;AAC1E,UAAQ,aAAa,IAAI,iBAAiB,OAAO;AACjD,UAAQ,aAAa,IAAI,SAAS,MAAM;AACxC,UAAQ,aAAa,IAAI,kBAAkB,cAAc;AACzD,UAAQ,aAAa,IAAI,yBAAyB,OAAO;AAGzD,YAAU,OAAO;GAChB,KAAK,QAAQ,UAAU;GACvB,cAAc;GACd,CAAC;EAGF,MAAM,OAAO,MAAM,UAAU,SAAS,EACrC,SAAS,iCACT,CAAC;EAGF,MAAM,gBAAgB,MAAM,MAAM,yBAAyB;GAC1D,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX;IACA,cAAc;IACd,eAAe;IACf,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,cAAc,IAAI;GACtB,MAAM,QAAQ,MAAM,cAAc,MAAM;AACxC,SAAM,IAAI,MAAM,0BAA0B,QAAQ;;EAGnD,MAAM,YAAY,MAAM,cAAc,MAAM;AAM5C,SAAO;GACN,QAAQ,UAAU;GAClB,SAAS,UAAU;GACnB,SAAS,KAAK,KAAK,GAAG,UAAU,aAAa;GAC7C;;CAGF,MAAM,aAAa,aAA0D;AAC5E,MAAI,CAAC,YAAY,QAChB,OAAM,IAAI,MAAM,wDAAwD;EAGzE,MAAM,WAAW,MAAM,MAAM,yBAAyB;GACrD,QAAQ;GACR,SAAS,EACR,gBAAgB,qCAChB;GACD,MAAM,IAAI,gBAAgB;IACzB,YAAY;IACZ,WAAW;IACX,eAAe,YAAY;IAC3B,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAM,IAAI,MAAM,iCAAiC,OAAO;;EAGzD,MAAM,UAAU,MAAM,SAAS,MAAM;AAMrC,SAAO;GACN,GAAG;GACH,QAAQ,QAAQ;GAChB,SAAS,QAAQ,iBAAiB,YAAY;GAC9C,SAAS,KAAK,KAAK,GAAG,QAAQ,aAAa;GAC3C;;CAGF,UAAU,aAAuC;AAChD,SAAO,YAAY;;CAEpB;AAED,SAAS,uBAA+B;CACvC,MAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,QAAO,gBAAgB,MAAM;AAC7B,QAAO,gBAAgB,MAAM;;AAG9B,eAAe,sBAAsB,UAAmC;CAEvE,MAAM,OAAO,IADO,aACA,CAAC,OAAO,SAAS;CACrC,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,KAAK;AAC1D,QAAO,gBAAgB,IAAI,WAAW,OAAO,CAAC;;AAG/C,SAAS,gBAAgB,QAA4B;CACpD,IAAI,MAAM;AACV,QAAO,SAAQ,MAAK,OAAO,OAAO,aAAa,EAAE,CAAC;AAClD,QAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,MAAM,GAAG"}
@@ -1,4 +1,9 @@
1
1
  /**
2
- * OpenAI Codex (ChatGPT) OAuth — delegated to @earendil-works/pi-ai.
2
+ * OpenAI Codex (ChatGPT) OAuth.
3
+ *
4
+ * Owns callback validation, manual prompt handling, and success/error pages.
3
5
  */
4
- export { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from '@earendil-works/pi-ai/oauth';
6
+ import type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface } from './types.js';
7
+ export declare function loginOpenAICodex(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;
8
+ export declare function refreshOpenAICodexToken(refreshToken: string): Promise<OAuthCredentials>;
9
+ export declare const openaiCodexOAuthProvider: OAuthProviderInterface;
@@ -1,2 +1,319 @@
1
- import { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken } from "@earendil-works/pi-ai/oauth";
1
+ import { generatePKCE } from "./pkce.js";
2
+ import { randomBytes } from "node:crypto";
3
+ import http from "node:http";
4
+ //#region src/auth/oauth/openai-codex.ts
5
+ /**
6
+ * OpenAI Codex (ChatGPT) OAuth.
7
+ *
8
+ * Owns callback validation, manual prompt handling, and success/error pages.
9
+ */
10
+ const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
11
+ const AUTHORIZE_URL = "https://auth.openai.com/oauth/authorize";
12
+ const TOKEN_URL = "https://auth.openai.com/oauth/token";
13
+ const CALLBACK_PORT = 1455;
14
+ const CALLBACK_PATH = "/auth/callback";
15
+ const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
16
+ const SCOPE = "openid profile email offline_access";
17
+ const MANUAL_PROMPT_DELAY_MS = 15e3;
18
+ const TOKEN_REQUEST_TIMEOUT_MS = 3e4;
19
+ function xopcOAuthHtml(params) {
20
+ const color = params.tone === "success" ? "#2563eb" : "#dc2626";
21
+ const escapedTitle = escapeHtml(params.title);
22
+ return `<!doctype html>
23
+ <html lang="en">
24
+ <head>
25
+ <meta charset="utf-8" />
26
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
27
+ <title>${escapedTitle}</title>
28
+ <style>
29
+ :root { color-scheme: light dark; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
30
+ body { margin: 0; min-height: 100vh; display: grid; place-items: center; background: #f8fafc; color: #0f172a; }
31
+ @media (prefers-color-scheme: dark) { body { background: #020617; color: #e2e8f0; } .card { background: #0f172a !important; border-color: #1e293b !important; } .muted { color: #94a3b8 !important; } }
32
+ .card { width: min(520px, calc(100vw - 32px)); background: white; border: 1px solid #e2e8f0; border-radius: 20px; padding: 28px; box-sizing: border-box; }
33
+ .brand { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; font-weight: 700; }
34
+ .logo { width: 36px; height: 36px; border-radius: 12px; display: grid; place-items: center; color: white; background: ${color}; font-weight: 800; letter-spacing: -0.04em; }
35
+ h1 { font-size: 22px; margin: 0 0 10px; }
36
+ p { margin: 0; line-height: 1.6; }
37
+ .muted { color: #64748b; margin-top: 14px; font-size: 14px; }
38
+ </style>
39
+ </head>
40
+ <body>
41
+ <main class="card">
42
+ <div class="brand"><div class="logo">x</div><div>xopc</div></div>
43
+ <h1>${escapedTitle}</h1>
44
+ <p>${escapeHtml(params.message)}</p>
45
+ <p class="muted">You can close this window and return to the terminal.</p>
46
+ </main>
47
+ </body>
48
+ </html>`;
49
+ }
50
+ function escapeHtml(value) {
51
+ return value.replace(/[&<>"]/g, (char) => ({
52
+ "&": "&amp;",
53
+ "<": "&lt;",
54
+ ">": "&gt;",
55
+ "\"": "&quot;"
56
+ })[char] ?? char);
57
+ }
58
+ function createState() {
59
+ return randomBytes(16).toString("hex");
60
+ }
61
+ function waitForManualPromptDelay(signal) {
62
+ return new Promise((resolve, reject) => {
63
+ if (signal?.aborted) {
64
+ reject(/* @__PURE__ */ new Error("Login cancelled"));
65
+ return;
66
+ }
67
+ const timeout = setTimeout(() => resolve({ type: "unavailable" }), MANUAL_PROMPT_DELAY_MS);
68
+ timeout.unref?.();
69
+ const abort = () => {
70
+ clearTimeout(timeout);
71
+ reject(/* @__PURE__ */ new Error("Login cancelled"));
72
+ };
73
+ signal?.addEventListener("abort", abort, { once: true });
74
+ });
75
+ }
76
+ function parseOAuthAuthorizationInput(input) {
77
+ const trimmed = input.trim();
78
+ if (!trimmed) return {};
79
+ try {
80
+ const url = new URL(trimmed);
81
+ return {
82
+ code: url.searchParams.get("code") ?? void 0,
83
+ state: url.searchParams.get("state") ?? void 0
84
+ };
85
+ } catch {}
86
+ if (trimmed.includes("=")) {
87
+ const params = new URLSearchParams(trimmed.startsWith("?") ? trimmed.slice(1) : trimmed);
88
+ return {
89
+ code: params.get("code") ?? void 0,
90
+ state: params.get("state") ?? void 0
91
+ };
92
+ }
93
+ return { code: trimmed };
94
+ }
95
+ async function parsePromptedAuthorizationCode(inputPromise, state) {
96
+ const parsed = parseOAuthAuthorizationInput(await inputPromise);
97
+ if (parsed.state && parsed.state !== state) throw new Error("State mismatch. Paste the redirect URL from the most recent xopc OAuth login.");
98
+ if (!parsed.code) throw new Error("Missing authorization code");
99
+ return parsed.code;
100
+ }
101
+ async function createAuthorizationFlow() {
102
+ const { verifier, challenge } = await generatePKCE();
103
+ const state = createState();
104
+ const url = new URL(AUTHORIZE_URL);
105
+ url.searchParams.set("response_type", "code");
106
+ url.searchParams.set("client_id", CLIENT_ID);
107
+ url.searchParams.set("redirect_uri", REDIRECT_URI);
108
+ url.searchParams.set("scope", SCOPE);
109
+ url.searchParams.set("code_challenge", challenge);
110
+ url.searchParams.set("code_challenge_method", "S256");
111
+ url.searchParams.set("state", state);
112
+ url.searchParams.set("id_token_add_organizations", "true");
113
+ url.searchParams.set("codex_cli_simplified_flow", "true");
114
+ url.searchParams.set("originator", "xopc");
115
+ return {
116
+ verifier,
117
+ state,
118
+ url: url.toString()
119
+ };
120
+ }
121
+ async function startLocalOAuthServer(state) {
122
+ let settleWait;
123
+ const waitForCodePromise = new Promise((resolve) => {
124
+ let settled = false;
125
+ settleWait = (value) => {
126
+ if (settled) return;
127
+ settled = true;
128
+ resolve(value);
129
+ };
130
+ });
131
+ const server = http.createServer((req, res) => {
132
+ try {
133
+ const url = new URL(req.url || "", "http://localhost");
134
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
135
+ if (url.pathname !== CALLBACK_PATH) {
136
+ res.statusCode = 404;
137
+ res.end(xopcOAuthHtml({
138
+ title: "Callback route not found",
139
+ message: "This xopc OAuth callback URL is not valid.",
140
+ tone: "error"
141
+ }));
142
+ return;
143
+ }
144
+ const code = url.searchParams.get("code");
145
+ if (!code) {
146
+ res.statusCode = 400;
147
+ res.end(xopcOAuthHtml({
148
+ title: "Authentication failed",
149
+ message: "OpenAI did not return an authorization code.",
150
+ tone: "error"
151
+ }));
152
+ return;
153
+ }
154
+ if (url.searchParams.get("state") !== state) {
155
+ res.statusCode = 400;
156
+ res.end(xopcOAuthHtml({
157
+ title: "Authentication needs manual confirmation",
158
+ message: "This callback belongs to a different xopc OAuth attempt. Copy the full URL from the address bar and paste it in the terminal prompt for the latest login.",
159
+ tone: "error"
160
+ }));
161
+ settleWait?.({ type: "unavailable" });
162
+ return;
163
+ }
164
+ res.statusCode = 200;
165
+ res.end(xopcOAuthHtml({
166
+ title: "OpenAI authentication complete",
167
+ message: "xopc received the authorization callback successfully.",
168
+ tone: "success"
169
+ }));
170
+ settleWait?.({
171
+ type: "code",
172
+ code
173
+ });
174
+ } catch {
175
+ res.statusCode = 500;
176
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
177
+ res.end(xopcOAuthHtml({
178
+ title: "Authentication failed",
179
+ message: "xopc could not process the OAuth callback.",
180
+ tone: "error"
181
+ }));
182
+ }
183
+ });
184
+ return new Promise((resolve) => {
185
+ server.listen(CALLBACK_PORT, () => {
186
+ resolve({
187
+ available: true,
188
+ close: () => server.close(),
189
+ cancelWait: () => settleWait?.({ type: "unavailable" }),
190
+ waitForCode: () => waitForCodePromise
191
+ });
192
+ }).on("error", () => {
193
+ resolve({
194
+ available: false,
195
+ close: () => {},
196
+ cancelWait: () => settleWait?.({ type: "unavailable" }),
197
+ waitForCode: async () => ({ type: "unavailable" })
198
+ });
199
+ });
200
+ });
201
+ }
202
+ async function postTokenForm(body, signal) {
203
+ const response = await fetch(TOKEN_URL, {
204
+ method: "POST",
205
+ headers: {
206
+ "Content-Type": "application/x-www-form-urlencoded",
207
+ Accept: "application/json"
208
+ },
209
+ body,
210
+ signal: signal ?? AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS)
211
+ });
212
+ const contentType = response.headers.get("content-type") ?? "";
213
+ const text = await response.text();
214
+ if (!response.ok) throw new Error(`OpenAI Codex token request failed (${response.status}): ${text || response.statusText}`);
215
+ if (!contentType.toLowerCase().includes("application/json")) throw new Error(`OpenAI Codex token response was not JSON: ${contentType || "missing content-type"}`);
216
+ return JSON.parse(text);
217
+ }
218
+ async function exchangeAuthorizationCode(code, verifier, signal) {
219
+ return normalizeTokenResponse(await postTokenForm(new URLSearchParams({
220
+ grant_type: "authorization_code",
221
+ client_id: CLIENT_ID,
222
+ code,
223
+ code_verifier: verifier,
224
+ redirect_uri: REDIRECT_URI
225
+ }), signal));
226
+ }
227
+ async function refreshAccessToken(refreshToken) {
228
+ return normalizeTokenResponse(await postTokenForm(new URLSearchParams({
229
+ grant_type: "refresh_token",
230
+ client_id: CLIENT_ID,
231
+ refresh_token: refreshToken
232
+ })));
233
+ }
234
+ function normalizeTokenResponse(json) {
235
+ if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
236
+ const missing = [
237
+ !json.access_token ? "access_token" : "",
238
+ !json.refresh_token ? "refresh_token" : "",
239
+ typeof json.expires_in !== "number" ? "expires_in" : ""
240
+ ].filter(Boolean).join(", ");
241
+ throw new Error(`OpenAI Codex token response missing fields: ${missing}`);
242
+ }
243
+ const accountId = getAccountId(json.access_token);
244
+ if (!accountId) throw new Error("Failed to extract accountId from token");
245
+ return {
246
+ access: json.access_token,
247
+ refresh: json.refresh_token,
248
+ expires: Date.now() + json.expires_in * 1e3,
249
+ accountId
250
+ };
251
+ }
252
+ function getAccountId(accessToken) {
253
+ const [, payload] = accessToken.split(".");
254
+ if (!payload) return null;
255
+ try {
256
+ const normalized = payload.replace(/-/g, "+").replace(/_/g, "/");
257
+ const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, "=");
258
+ const json = JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
259
+ const authClaim = json["https://api.openai.com/auth"];
260
+ if (authClaim && typeof authClaim === "object") {
261
+ const accountId = authClaim.chatgpt_account_id;
262
+ if (typeof accountId === "string" && accountId.length > 0) return accountId;
263
+ }
264
+ return typeof json.sub === "string" && json.sub.length > 0 ? json.sub : null;
265
+ } catch {
266
+ return null;
267
+ }
268
+ }
269
+ async function loginOpenAICodex(callbacks) {
270
+ const { verifier, state, url } = await createAuthorizationFlow();
271
+ const server = await startLocalOAuthServer(state);
272
+ try {
273
+ callbacks.onAuth({
274
+ url,
275
+ instructions: server.available ? "A browser window should open. Complete login to finish. If it does not complete automatically, paste the final redirect URL in the terminal." : "Open this URL and paste the final redirect URL in the terminal. xopc could not bind localhost:1455 for the automatic callback."
276
+ });
277
+ let code;
278
+ if (server.available) {
279
+ const callback = await Promise.race([server.waitForCode(), waitForManualPromptDelay(callbacks.signal)]);
280
+ if (callback.type === "code") code = callback.code;
281
+ }
282
+ if (!code) {
283
+ const manualCode = parsePromptedAuthorizationCode(callbacks.onManualCodeInput ? callbacks.onManualCodeInput() : callbacks.onPrompt({ message: "Paste the authorization code (or full redirect URL):" }), state).then((value) => {
284
+ server.cancelWait();
285
+ return {
286
+ type: "code",
287
+ code: value
288
+ };
289
+ });
290
+ const callback = await Promise.race([server.waitForCode(), manualCode]);
291
+ if (callback.type === "code") code = callback.code;
292
+ }
293
+ if (!code) throw new Error("Missing authorization code");
294
+ return await exchangeAuthorizationCode(code, verifier, callbacks.signal);
295
+ } finally {
296
+ server.close();
297
+ }
298
+ }
299
+ async function refreshOpenAICodexToken(refreshToken) {
300
+ return refreshAccessToken(refreshToken);
301
+ }
302
+ const openaiCodexOAuthProvider = {
303
+ id: "openai-codex",
304
+ name: "OpenAI Codex",
305
+ usesCallbackServer: true,
306
+ async login(callbacks) {
307
+ return loginOpenAICodex(callbacks);
308
+ },
309
+ async refreshToken(credentials) {
310
+ return refreshOpenAICodexToken(credentials.refresh);
311
+ },
312
+ getApiKey(credentials) {
313
+ return credentials.access;
314
+ }
315
+ };
316
+ //#endregion
2
317
  export { loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken };
318
+
319
+ //# sourceMappingURL=openai-codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-codex.js","names":[],"sources":["../../../../src/auth/oauth/openai-codex.ts"],"sourcesContent":["/**\n * OpenAI Codex (ChatGPT) OAuth.\n *\n * Owns callback validation, manual prompt handling, and success/error pages.\n */\n\nimport { randomBytes } from 'node:crypto';\nimport http from 'node:http';\n\nimport { generatePKCE } from './pkce.js';\nimport type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface } from './types.js';\n\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst AUTHORIZE_URL = 'https://auth.openai.com/oauth/authorize';\nconst TOKEN_URL = 'https://auth.openai.com/oauth/token';\nconst CALLBACK_PORT = 1455;\nconst CALLBACK_PATH = '/auth/callback';\nconst REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;\nconst SCOPE = 'openid profile email offline_access';\nconst MANUAL_PROMPT_DELAY_MS = 15_000;\nconst TOKEN_REQUEST_TIMEOUT_MS = 30_000;\n\ntype TokenResponseJson = {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n error?: string;\n error_description?: string;\n};\n\ntype CallbackResult =\n | { type: 'code'; code: string }\n | { type: 'unavailable' };\n\ntype LocalOAuthServer = {\n close: () => void;\n cancelWait: () => void;\n waitForCode: () => Promise<CallbackResult>;\n available: boolean;\n};\n\nfunction xopcOAuthHtml(params: { title: string; message: string; tone: 'success' | 'error' }): string {\n const color = params.tone === 'success' ? '#2563eb' : '#dc2626';\n const escapedTitle = escapeHtml(params.title);\n const escapedMessage = escapeHtml(params.message);\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapedTitle}</title>\n <style>\n :root { color-scheme: light dark; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; }\n body { margin: 0; min-height: 100vh; display: grid; place-items: center; background: #f8fafc; color: #0f172a; }\n @media (prefers-color-scheme: dark) { body { background: #020617; color: #e2e8f0; } .card { background: #0f172a !important; border-color: #1e293b !important; } .muted { color: #94a3b8 !important; } }\n .card { width: min(520px, calc(100vw - 32px)); background: white; border: 1px solid #e2e8f0; border-radius: 20px; padding: 28px; box-sizing: border-box; }\n .brand { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; font-weight: 700; }\n .logo { width: 36px; height: 36px; border-radius: 12px; display: grid; place-items: center; color: white; background: ${color}; font-weight: 800; letter-spacing: -0.04em; }\n h1 { font-size: 22px; margin: 0 0 10px; }\n p { margin: 0; line-height: 1.6; }\n .muted { color: #64748b; margin-top: 14px; font-size: 14px; }\n </style>\n</head>\n<body>\n <main class=\"card\">\n <div class=\"brand\"><div class=\"logo\">x</div><div>xopc</div></div>\n <h1>${escapedTitle}</h1>\n <p>${escapedMessage}</p>\n <p class=\"muted\">You can close this window and return to the terminal.</p>\n </main>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"]/g, (char) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' })[char] ?? char);\n}\n\nfunction createState(): string {\n return randomBytes(16).toString('hex');\n}\n\nfunction waitForManualPromptDelay(signal?: AbortSignal): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Login cancelled'));\n return;\n }\n const timeout = setTimeout(() => resolve({ type: 'unavailable' }), MANUAL_PROMPT_DELAY_MS);\n timeout.unref?.();\n const abort = () => {\n clearTimeout(timeout);\n reject(new Error('Login cancelled'));\n };\n signal?.addEventListener('abort', abort, { once: true });\n });\n}\n\nfunction parseOAuthAuthorizationInput(input: string): { code?: string; state?: string } {\n const trimmed = input.trim();\n if (!trimmed) return {};\n\n try {\n const url = new URL(trimmed);\n return {\n code: url.searchParams.get('code') ?? undefined,\n state: url.searchParams.get('state') ?? undefined,\n };\n } catch {\n // Continue: raw code or query-string paste.\n }\n\n if (trimmed.includes('=')) {\n const params = new URLSearchParams(trimmed.startsWith('?') ? trimmed.slice(1) : trimmed);\n return {\n code: params.get('code') ?? undefined,\n state: params.get('state') ?? undefined,\n };\n }\n\n return { code: trimmed };\n}\n\nasync function parsePromptedAuthorizationCode(inputPromise: Promise<string>, state: string): Promise<string> {\n const input = await inputPromise;\n const parsed = parseOAuthAuthorizationInput(input);\n if (parsed.state && parsed.state !== state) {\n throw new Error('State mismatch. Paste the redirect URL from the most recent xopc OAuth login.');\n }\n if (!parsed.code) {\n throw new Error('Missing authorization code');\n }\n return parsed.code;\n}\n\nasync function createAuthorizationFlow(): Promise<{ verifier: string; state: string; url: string }> {\n const { verifier, challenge } = await generatePKCE();\n const state = createState();\n const url = new URL(AUTHORIZE_URL);\n url.searchParams.set('response_type', 'code');\n url.searchParams.set('client_id', CLIENT_ID);\n url.searchParams.set('redirect_uri', REDIRECT_URI);\n url.searchParams.set('scope', SCOPE);\n url.searchParams.set('code_challenge', challenge);\n url.searchParams.set('code_challenge_method', 'S256');\n url.searchParams.set('state', state);\n url.searchParams.set('id_token_add_organizations', 'true');\n url.searchParams.set('codex_cli_simplified_flow', 'true');\n url.searchParams.set('originator', 'xopc');\n return { verifier, state, url: url.toString() };\n}\n\nasync function startLocalOAuthServer(state: string): Promise<LocalOAuthServer> {\n let settleWait: ((value: CallbackResult) => void) | undefined;\n const waitForCodePromise = new Promise<CallbackResult>((resolve) => {\n let settled = false;\n settleWait = (value) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n });\n\n const server = http.createServer((req, res) => {\n try {\n const url = new URL(req.url || '', 'http://localhost');\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n if (url.pathname !== CALLBACK_PATH) {\n res.statusCode = 404;\n res.end(xopcOAuthHtml({ title: 'Callback route not found', message: 'This xopc OAuth callback URL is not valid.', tone: 'error' }));\n return;\n }\n\n const code = url.searchParams.get('code');\n if (!code) {\n res.statusCode = 400;\n res.end(xopcOAuthHtml({ title: 'Authentication failed', message: 'OpenAI did not return an authorization code.', tone: 'error' }));\n return;\n }\n\n if (url.searchParams.get('state') !== state) {\n res.statusCode = 400;\n res.end(\n xopcOAuthHtml({\n title: 'Authentication needs manual confirmation',\n message: 'This callback belongs to a different xopc OAuth attempt. Copy the full URL from the address bar and paste it in the terminal prompt for the latest login.',\n tone: 'error',\n }),\n );\n settleWait?.({ type: 'unavailable' });\n return;\n }\n\n res.statusCode = 200;\n res.end(xopcOAuthHtml({ title: 'OpenAI authentication complete', message: 'xopc received the authorization callback successfully.', tone: 'success' }));\n settleWait?.({ type: 'code', code });\n } catch {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(xopcOAuthHtml({ title: 'Authentication failed', message: 'xopc could not process the OAuth callback.', tone: 'error' }));\n }\n });\n\n return new Promise((resolve) => {\n server\n .listen(CALLBACK_PORT, () => {\n resolve({\n available: true,\n close: () => server.close(),\n cancelWait: () => settleWait?.({ type: 'unavailable' }),\n waitForCode: () => waitForCodePromise,\n });\n })\n .on('error', () => {\n resolve({\n available: false,\n close: () => {},\n cancelWait: () => settleWait?.({ type: 'unavailable' }),\n waitForCode: async () => ({ type: 'unavailable' }),\n });\n });\n });\n}\n\nasync function postTokenForm(body: URLSearchParams, signal?: AbortSignal): Promise<TokenResponseJson> {\n const response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n },\n body,\n signal: signal ?? AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS),\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n const text = await response.text();\n if (!response.ok) {\n throw new Error(`OpenAI Codex token request failed (${response.status}): ${text || response.statusText}`);\n }\n if (!contentType.toLowerCase().includes('application/json')) {\n throw new Error(`OpenAI Codex token response was not JSON: ${contentType || 'missing content-type'}`);\n }\n return JSON.parse(text) as TokenResponseJson;\n}\n\nasync function exchangeAuthorizationCode(code: string, verifier: string, signal?: AbortSignal): Promise<OAuthCredentials> {\n const json = await postTokenForm(\n new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: CLIENT_ID,\n code,\n code_verifier: verifier,\n redirect_uri: REDIRECT_URI,\n }),\n signal,\n );\n return normalizeTokenResponse(json);\n}\n\nasync function refreshAccessToken(refreshToken: string): Promise<OAuthCredentials> {\n const json = await postTokenForm(\n new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n }),\n );\n return normalizeTokenResponse(json);\n}\n\nfunction normalizeTokenResponse(json: TokenResponseJson): OAuthCredentials {\n if (!json.access_token || !json.refresh_token || typeof json.expires_in !== 'number') {\n const missing = [\n !json.access_token ? 'access_token' : '',\n !json.refresh_token ? 'refresh_token' : '',\n typeof json.expires_in !== 'number' ? 'expires_in' : '',\n ].filter(Boolean).join(', ');\n throw new Error(`OpenAI Codex token response missing fields: ${missing}`);\n }\n const accountId = getAccountId(json.access_token);\n if (!accountId) {\n throw new Error('Failed to extract accountId from token');\n }\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n accountId,\n };\n}\n\nfunction getAccountId(accessToken: string): string | null {\n const [, payload] = accessToken.split('.');\n if (!payload) return null;\n try {\n const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=');\n const json = JSON.parse(Buffer.from(padded, 'base64').toString('utf8')) as Record<string, unknown>;\n const authClaim = json['https://api.openai.com/auth'];\n if (authClaim && typeof authClaim === 'object') {\n const accountId = (authClaim as Record<string, unknown>).chatgpt_account_id;\n if (typeof accountId === 'string' && accountId.length > 0) return accountId;\n }\n return typeof json.sub === 'string' && json.sub.length > 0 ? json.sub : null;\n } catch {\n return null;\n }\n}\n\nexport async function loginOpenAICodex(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n const { verifier, state, url } = await createAuthorizationFlow();\n const server = await startLocalOAuthServer(state);\n\n try {\n callbacks.onAuth({\n url,\n instructions: server.available\n ? 'A browser window should open. Complete login to finish. If it does not complete automatically, paste the final redirect URL in the terminal.'\n : 'Open this URL and paste the final redirect URL in the terminal. xopc could not bind localhost:1455 for the automatic callback.',\n });\n\n let code: string | undefined;\n if (server.available) {\n const callback = await Promise.race([server.waitForCode(), waitForManualPromptDelay(callbacks.signal)]);\n if (callback.type === 'code') {\n code = callback.code;\n }\n }\n\n if (!code) {\n const manualInput = callbacks.onManualCodeInput\n ? callbacks.onManualCodeInput()\n : callbacks.onPrompt({ message: 'Paste the authorization code (or full redirect URL):' });\n const manualCode = parsePromptedAuthorizationCode(manualInput, state).then((value) => {\n server.cancelWait();\n return { type: 'code' as const, code: value };\n });\n const callback = await Promise.race([server.waitForCode(), manualCode]);\n if (callback.type === 'code') {\n code = callback.code;\n }\n }\n\n if (!code) {\n throw new Error('Missing authorization code');\n }\n\n return await exchangeAuthorizationCode(code, verifier, callbacks.signal);\n } finally {\n server.close();\n }\n}\n\nexport async function refreshOpenAICodexToken(refreshToken: string): Promise<OAuthCredentials> {\n return refreshAccessToken(refreshToken);\n}\n\nexport const openaiCodexOAuthProvider: OAuthProviderInterface = {\n id: 'openai-codex',\n name: 'OpenAI Codex',\n usesCallbackServer: true,\n\n async login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n return loginOpenAICodex(callbacks);\n },\n\n async refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials> {\n return refreshOpenAICodexToken(credentials.refresh);\n },\n\n getApiKey(credentials: OAuthCredentials): string {\n return credentials.access;\n },\n};\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
+ import { init_paths, resolveCredentialsDir } from "../../config/paths.js";
2
3
  import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
3
4
  import path from "node:path";
4
- import { homedir } from "os";
5
5
  //#region src/auth/profiles/store.ts
6
6
  /**
7
7
  * Auth Profile Store
@@ -10,11 +10,12 @@ import { homedir } from "os";
10
10
  * Handles loading and saving auth credentials.
11
11
  */
12
12
  init_write_file_atomic();
13
+ init_paths();
13
14
  const AUTH_STORE_VERSION = 1;
14
15
  const AUTH_STORE_FILENAME = "auth-profiles.json";
15
16
  /** Get the auth profiles file path */
16
17
  function resolveAuthStorePath(dataDir) {
17
- const dir = dataDir ?? path.join(homedir(), ".xopc");
18
+ const dir = dataDir ?? resolveCredentialsDir();
18
19
  return path.join(dir, AUTH_STORE_FILENAME);
19
20
  }
20
21
  /** Ensure auth store file exists */
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","names":[],"sources":["../../../../src/auth/profiles/store.ts"],"sourcesContent":["/**\n * Auth Profile Store\n * \n * Persistent storage for auth profiles.\n * Handles loading and saving auth credentials.\n */\n\nimport { chmodSync, existsSync, mkdirSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeTextAtomicSync } from '../../infra/write-file-atomic.js';\nimport { homedir } from 'os';\nimport type { AuthProfileCredential, AuthProfileStore, ProfileUsageStats } from './types.js';\n\nconst AUTH_STORE_VERSION = 1;\nconst AUTH_STORE_FILENAME = 'auth-profiles.json';\n\n/** Get the auth profiles file path */\nexport function resolveAuthStorePath(dataDir?: string): string {\n\tconst dir = dataDir ?? path.join(homedir(), '.xopc');\n\treturn path.join(dir, AUTH_STORE_FILENAME);\n}\n\n/** Ensure auth store file exists */\nexport function ensureAuthStoreFile(authPath: string): void {\n\tconst dir = path.dirname(authPath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\tif (!existsSync(authPath)) {\n\t\twriteTextAtomicSync(\n\t\t\tauthPath,\n\t\t\tJSON.stringify({ version: AUTH_STORE_VERSION, profiles: {} }, null, 2),\n\t\t);\n\t\tchmodSync(authPath, 0o600);\n\t}\n}\n\nfunction loadJsonFile(filePath: string): unknown {\n\tif (!existsSync(filePath)) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst content = readFileSync(filePath, 'utf-8');\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction saveJsonFile(filePath: string, data: unknown): void {\n\tconst dir = path.dirname(filePath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\twriteTextAtomicSync(filePath, JSON.stringify(data, null, 2));\n\tchmodSync(filePath, 0o600);\n}\n\nfunction coerceAuthStore(raw: unknown): AuthProfileStore | null {\n\tif (!raw || typeof raw !== 'object') {\n\t\treturn null;\n\t}\n\tconst record = raw as Record<string, unknown>;\n\tif (!record.profiles || typeof record.profiles !== 'object') {\n\t\treturn null;\n\t}\n\tconst profiles = record.profiles as Record<string, unknown>;\n\tconst normalized: Record<string, AuthProfileCredential> = {};\n\tfor (const [key, value] of Object.entries(profiles)) {\n\t\tif (!value || typeof value !== 'object') {\n\t\t\tcontinue;\n\t\t}\n\t\tconst typed = value as Partial<AuthProfileCredential>;\n\t\tif (typed.type !== 'api_key' && typed.type !== 'oauth' && typed.type !== 'token') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!typed.provider) {\n\t\t\tcontinue;\n\t\t}\n\t\tnormalized[key] = typed as AuthProfileCredential;\n\t}\n\tconst order =\n\t\trecord.order && typeof record.order === 'object'\n\t\t\t? Object.entries(record.order as Record<string, unknown>).reduce(\n\t\t\t\t(acc, [provider, value]) => {\n\t\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}\n\t\t\t\t\tconst list = value\n\t\t\t\t\t\t.map((entry) => (typeof entry === 'string' ? entry.trim() : ''))\n\t\t\t\t\t\t.filter(Boolean);\n\t\t\t\t\tif (list.length === 0) {\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}\n\t\t\t\t\tacc[provider] = list;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, string[]>,\n\t\t\t)\n\t\t\t: undefined;\n\treturn {\n\t\tversion: Number(record.version ?? AUTH_STORE_VERSION),\n\t\tprofiles: normalized,\n\t\torder,\n\t\tlastGood:\n\t\t\trecord.lastGood && typeof record.lastGood === 'object'\n\t\t\t\t? (record.lastGood as Record<string, string>)\n\t\t\t\t: undefined,\n\t\tusageStats:\n\t\t\trecord.usageStats && typeof record.usageStats === 'object'\n\t\t\t\t? (record.usageStats as Record<string, ProfileUsageStats>)\n\t\t\t\t: undefined,\n\t};\n}\n\nfunction mergeRecord<T>(\n\tbase?: Record<string, T>,\n\toverride?: Record<string, T>,\n): Record<string, T> | undefined {\n\tif (!base && !override) {\n\t\treturn undefined;\n\t}\n\tif (!base) {\n\t\treturn { ...override };\n\t}\n\tif (!override) {\n\t\treturn { ...base };\n\t}\n\treturn { ...base, ...override };\n}\n\nfunction _mergeAuthProfileStores(\n\tbase: AuthProfileStore,\n\toverride: AuthProfileStore,\n): AuthProfileStore {\n\tif (\n\t\tObject.keys(override.profiles).length === 0 &&\n\t\t!override.order &&\n\t\t!override.lastGood &&\n\t\t!override.usageStats\n\t) {\n\t\treturn base;\n\t}\n\treturn {\n\t\tversion: Math.max(base.version, override.version ?? base.version),\n\t\tprofiles: { ...base.profiles, ...override.profiles },\n\t\torder: mergeRecord(base.order, override.order),\n\t\tlastGood: mergeRecord(base.lastGood, override.lastGood),\n\t\tusageStats: mergeRecord(base.usageStats, override.usageStats),\n\t};\n}\n\n/** Load auth profile store from disk */\nexport function loadAuthProfileStore(dataDir?: string): AuthProfileStore {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tconst raw = loadJsonFile(authPath);\n\tconst asStore = coerceAuthStore(raw);\n\tif (asStore) {\n\t\treturn asStore;\n\t}\n\n\treturn { version: AUTH_STORE_VERSION, profiles: {} };\n}\n\n/** Ensure auth profile store exists */\nexport function ensureAuthProfileStore(dataDir?: string): AuthProfileStore {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tensureAuthStoreFile(authPath);\n\treturn loadAuthProfileStore(dataDir);\n}\n\n/** Save auth profile store to disk */\nexport function saveAuthProfileStore(store: AuthProfileStore, dataDir?: string): void {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tconst payload = {\n\t\tversion: AUTH_STORE_VERSION,\n\t\tprofiles: store.profiles,\n\t\torder: store.order ?? undefined,\n\t\tlastGood: store.lastGood ?? undefined,\n\t\tusageStats: store.usageStats ?? undefined,\n\t} satisfies AuthProfileStore;\n\tsaveJsonFile(authPath, payload);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"store.js","names":[],"sources":["../../../../src/auth/profiles/store.ts"],"sourcesContent":["/**\n * Auth Profile Store\n * \n * Persistent storage for auth profiles.\n * Handles loading and saving auth credentials.\n */\n\nimport { chmodSync, existsSync, mkdirSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeTextAtomicSync } from '../../infra/write-file-atomic.js';\nimport { resolveCredentialsDir } from '../../config/paths.js';\nimport type { AuthProfileCredential, AuthProfileStore, ProfileUsageStats } from './types.js';\n\nconst AUTH_STORE_VERSION = 1;\nconst AUTH_STORE_FILENAME = 'auth-profiles.json';\n\n/** Get the auth profiles file path */\nexport function resolveAuthStorePath(dataDir?: string): string {\n\tconst dir = dataDir ?? resolveCredentialsDir();\n\treturn path.join(dir, AUTH_STORE_FILENAME);\n}\n\n/** Ensure auth store file exists */\nexport function ensureAuthStoreFile(authPath: string): void {\n\tconst dir = path.dirname(authPath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\tif (!existsSync(authPath)) {\n\t\twriteTextAtomicSync(\n\t\t\tauthPath,\n\t\t\tJSON.stringify({ version: AUTH_STORE_VERSION, profiles: {} }, null, 2),\n\t\t);\n\t\tchmodSync(authPath, 0o600);\n\t}\n}\n\nfunction loadJsonFile(filePath: string): unknown {\n\tif (!existsSync(filePath)) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst content = readFileSync(filePath, 'utf-8');\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction saveJsonFile(filePath: string, data: unknown): void {\n\tconst dir = path.dirname(filePath);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true, mode: 0o700 });\n\t}\n\twriteTextAtomicSync(filePath, JSON.stringify(data, null, 2));\n\tchmodSync(filePath, 0o600);\n}\n\nfunction coerceAuthStore(raw: unknown): AuthProfileStore | null {\n\tif (!raw || typeof raw !== 'object') {\n\t\treturn null;\n\t}\n\tconst record = raw as Record<string, unknown>;\n\tif (!record.profiles || typeof record.profiles !== 'object') {\n\t\treturn null;\n\t}\n\tconst profiles = record.profiles as Record<string, unknown>;\n\tconst normalized: Record<string, AuthProfileCredential> = {};\n\tfor (const [key, value] of Object.entries(profiles)) {\n\t\tif (!value || typeof value !== 'object') {\n\t\t\tcontinue;\n\t\t}\n\t\tconst typed = value as Partial<AuthProfileCredential>;\n\t\tif (typed.type !== 'api_key' && typed.type !== 'oauth' && typed.type !== 'token') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!typed.provider) {\n\t\t\tcontinue;\n\t\t}\n\t\tnormalized[key] = typed as AuthProfileCredential;\n\t}\n\tconst order =\n\t\trecord.order && typeof record.order === 'object'\n\t\t\t? Object.entries(record.order as Record<string, unknown>).reduce(\n\t\t\t\t(acc, [provider, value]) => {\n\t\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}\n\t\t\t\t\tconst list = value\n\t\t\t\t\t\t.map((entry) => (typeof entry === 'string' ? entry.trim() : ''))\n\t\t\t\t\t\t.filter(Boolean);\n\t\t\t\t\tif (list.length === 0) {\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}\n\t\t\t\t\tacc[provider] = list;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, string[]>,\n\t\t\t)\n\t\t\t: undefined;\n\treturn {\n\t\tversion: Number(record.version ?? AUTH_STORE_VERSION),\n\t\tprofiles: normalized,\n\t\torder,\n\t\tlastGood:\n\t\t\trecord.lastGood && typeof record.lastGood === 'object'\n\t\t\t\t? (record.lastGood as Record<string, string>)\n\t\t\t\t: undefined,\n\t\tusageStats:\n\t\t\trecord.usageStats && typeof record.usageStats === 'object'\n\t\t\t\t? (record.usageStats as Record<string, ProfileUsageStats>)\n\t\t\t\t: undefined,\n\t};\n}\n\nfunction mergeRecord<T>(\n\tbase?: Record<string, T>,\n\toverride?: Record<string, T>,\n): Record<string, T> | undefined {\n\tif (!base && !override) {\n\t\treturn undefined;\n\t}\n\tif (!base) {\n\t\treturn { ...override };\n\t}\n\tif (!override) {\n\t\treturn { ...base };\n\t}\n\treturn { ...base, ...override };\n}\n\nfunction _mergeAuthProfileStores(\n\tbase: AuthProfileStore,\n\toverride: AuthProfileStore,\n): AuthProfileStore {\n\tif (\n\t\tObject.keys(override.profiles).length === 0 &&\n\t\t!override.order &&\n\t\t!override.lastGood &&\n\t\t!override.usageStats\n\t) {\n\t\treturn base;\n\t}\n\treturn {\n\t\tversion: Math.max(base.version, override.version ?? base.version),\n\t\tprofiles: { ...base.profiles, ...override.profiles },\n\t\torder: mergeRecord(base.order, override.order),\n\t\tlastGood: mergeRecord(base.lastGood, override.lastGood),\n\t\tusageStats: mergeRecord(base.usageStats, override.usageStats),\n\t};\n}\n\n/** Load auth profile store from disk */\nexport function loadAuthProfileStore(dataDir?: string): AuthProfileStore {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tconst raw = loadJsonFile(authPath);\n\tconst asStore = coerceAuthStore(raw);\n\tif (asStore) {\n\t\treturn asStore;\n\t}\n\n\treturn { version: AUTH_STORE_VERSION, profiles: {} };\n}\n\n/** Ensure auth profile store exists */\nexport function ensureAuthProfileStore(dataDir?: string): AuthProfileStore {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tensureAuthStoreFile(authPath);\n\treturn loadAuthProfileStore(dataDir);\n}\n\n/** Save auth profile store to disk */\nexport function saveAuthProfileStore(store: AuthProfileStore, dataDir?: string): void {\n\tconst authPath = resolveAuthStorePath(dataDir);\n\tconst payload = {\n\t\tversion: AUTH_STORE_VERSION,\n\t\tprofiles: store.profiles,\n\t\torder: store.order ?? undefined,\n\t\tlastGood: store.lastGood ?? undefined,\n\t\tusageStats: store.usageStats ?? undefined,\n\t} satisfies AuthProfileStore;\n\tsaveJsonFile(authPath, payload);\n}\n"],"mappings":";;;;;;;;;;;wBASuE;YACT;AAG9D,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;;AAG5B,SAAgB,qBAAqB,SAA0B;CAC9D,MAAM,MAAM,WAAW,uBAAuB;AAC9C,QAAO,KAAK,KAAK,KAAK,oBAAoB;;;AAI3C,SAAgB,oBAAoB,UAAwB;CAC3D,MAAM,MAAM,KAAK,QAAQ,SAAS;AAClC,KAAI,CAAC,WAAW,IAAI,CACnB,WAAU,KAAK;EAAE,WAAW;EAAM,MAAM;EAAO,CAAC;AAEjD,KAAI,CAAC,WAAW,SAAS,EAAE;AAC1B,sBACC,UACA,KAAK,UAAU;GAAE,SAAS;GAAoB,UAAU,EAAE;GAAE,EAAE,MAAM,EAAE,CACtE;AACD,YAAU,UAAU,IAAM;;;AAI5B,SAAS,aAAa,UAA2B;AAChD,KAAI,CAAC,WAAW,SAAS,CACxB,QAAO;AAER,KAAI;EACH,MAAM,UAAU,aAAa,UAAU,QAAQ;AAC/C,SAAO,KAAK,MAAM,QAAQ;SACnB;AACP,SAAO;;;AAIT,SAAS,aAAa,UAAkB,MAAqB;CAC5D,MAAM,MAAM,KAAK,QAAQ,SAAS;AAClC,KAAI,CAAC,WAAW,IAAI,CACnB,WAAU,KAAK;EAAE,WAAW;EAAM,MAAM;EAAO,CAAC;AAEjD,qBAAoB,UAAU,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;AAC5D,WAAU,UAAU,IAAM;;AAG3B,SAAS,gBAAgB,KAAuC;AAC/D,KAAI,CAAC,OAAO,OAAO,QAAQ,SAC1B,QAAO;CAER,MAAM,SAAS;AACf,KAAI,CAAC,OAAO,YAAY,OAAO,OAAO,aAAa,SAClD,QAAO;CAER,MAAM,WAAW,OAAO;CACxB,MAAM,aAAoD,EAAE;AAC5D,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,MAAI,CAAC,SAAS,OAAO,UAAU,SAC9B;EAED,MAAM,QAAQ;AACd,MAAI,MAAM,SAAS,aAAa,MAAM,SAAS,WAAW,MAAM,SAAS,QACxE;AAED,MAAI,CAAC,MAAM,SACV;AAED,aAAW,OAAO;;CAEnB,MAAM,QACL,OAAO,SAAS,OAAO,OAAO,UAAU,WACrC,OAAO,QAAQ,OAAO,MAAiC,CAAC,QACxD,KAAK,CAAC,UAAU,WAAW;AAC3B,MAAI,CAAC,MAAM,QAAQ,MAAM,CACxB,QAAO;EAER,MAAM,OAAO,MACX,KAAK,UAAW,OAAO,UAAU,WAAW,MAAM,MAAM,GAAG,GAAI,CAC/D,OAAO,QAAQ;AACjB,MAAI,KAAK,WAAW,EACnB,QAAO;AAER,MAAI,YAAY;AAChB,SAAO;IAER,EAAE,CACF,GACC,KAAA;AACJ,QAAO;EACN,SAAS,OAAO,OAAO,WAAW,mBAAmB;EACrD,UAAU;EACV;EACA,UACC,OAAO,YAAY,OAAO,OAAO,aAAa,WAC1C,OAAO,WACR,KAAA;EACJ,YACC,OAAO,cAAc,OAAO,OAAO,eAAe,WAC9C,OAAO,aACR,KAAA;EACJ;;;AAyCF,SAAgB,qBAAqB,SAAoC;CAGxE,MAAM,UAAU,gBADJ,aADK,qBAAqB,QACL,CACE,CAAC;AACpC,KAAI,QACH,QAAO;AAGR,QAAO;EAAE,SAAS;EAAoB,UAAU,EAAE;EAAE;;;AAIrD,SAAgB,uBAAuB,SAAoC;AAE1E,qBADiB,qBAAqB,QACV,CAAC;AAC7B,QAAO,qBAAqB,QAAQ;;;AAIrC,SAAgB,qBAAqB,OAAyB,SAAwB;AASrF,cARiB,qBAAqB,QAQjB,EAAE;EANtB,SAAS;EACT,UAAU,MAAM;EAChB,OAAO,MAAM,SAAS,KAAA;EACtB,UAAU,MAAM,YAAY,KAAA;EAC5B,YAAY,MAAM,cAAc,KAAA;EAEH,CAAC"}
@@ -1,7 +1,7 @@
1
- import { checkWebsiteBlocklist } from "../../agent/tools/url-safety.js";
2
1
  import { resolveBrowserCommandTimeoutMs } from "../browser-command-timeout.js";
3
2
  import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from "../url-policy.js";
4
3
  import { truncateSnapshotAtBoundary } from "../snapshot-helpers.js";
4
+ import { checkWebsiteBlocklist } from "../../agent/tools/url-safety.js";
5
5
  //#region src/browser/actions/extension-registry-bridge.ts
6
6
  /**
7
7
  * Runs browser registry actions against the Chrome Extension bridge (no Playwright page).