mixdog 0.7.18 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (844) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/smoke-loop-report.mjs +221 -0
  10. package/scripts/smoke-loop.mjs +201 -0
  11. package/scripts/smoke.mjs +113 -0
  12. package/scripts/tool-failures.mjs +143 -0
  13. package/scripts/tool-smoke.mjs +456 -0
  14. package/src/agents/debugger/AGENT.md +3 -0
  15. package/src/agents/debugger/agent.json +6 -0
  16. package/src/agents/explore/AGENT.md +4 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/agents/heavy-worker/AGENT.md +3 -0
  19. package/src/agents/heavy-worker/agent.json +6 -0
  20. package/src/agents/maintainer/AGENT.md +3 -0
  21. package/src/agents/maintainer/agent.json +6 -0
  22. package/src/agents/reviewer/AGENT.md +3 -0
  23. package/src/agents/reviewer/agent.json +6 -0
  24. package/src/agents/scheduler-task.md +3 -0
  25. package/src/agents/web-researcher/AGENT.md +3 -0
  26. package/src/agents/web-researcher/agent.json +6 -0
  27. package/src/agents/webhook-handler.md +3 -0
  28. package/src/agents/worker/AGENT.md +3 -0
  29. package/src/agents/worker/agent.json +6 -0
  30. package/src/app.mjs +90 -0
  31. package/src/cli.mjs +11 -0
  32. package/src/defaults/hidden-roles.json +72 -0
  33. package/src/defaults/mixdog-config.template.json +15 -0
  34. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  35. package/src/hooks/lib/settings-loader.cjs +112 -0
  36. package/src/lib/keychain-cjs.cjs +332 -0
  37. package/src/lib/plugin-paths.cjs +28 -0
  38. package/src/lib/rules-builder.cjs +315 -0
  39. package/src/mixdog-session-runtime.mjs +3704 -0
  40. package/src/output-styles/default.md +38 -0
  41. package/src/output-styles/extreme-simple.md +17 -0
  42. package/src/output-styles/simple.md +17 -0
  43. package/src/repl.mjs +322 -0
  44. package/src/rules/bridge/00-common.md +5 -0
  45. package/src/rules/bridge/20-skip-protocol.md +11 -0
  46. package/src/rules/bridge/30-explorer.md +4 -0
  47. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  48. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  49. package/src/rules/lead/00-tool-lead.md +5 -0
  50. package/src/rules/lead/01-general.md +5 -0
  51. package/src/rules/lead/02-channels.md +3 -0
  52. package/src/rules/lead/04-workflow.md +12 -0
  53. package/src/rules/shared/00-language.md +3 -0
  54. package/src/rules/shared/01-tool.md +3 -0
  55. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  56. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  57. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  58. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  59. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  60. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  63. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  65. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  66. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  67. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  68. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  69. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  70. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  77. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  79. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  80. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  81. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  82. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  83. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  84. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  85. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  86. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  88. package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
  89. package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
  90. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  91. package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
  92. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  93. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  94. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  95. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  96. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  97. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  99. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  118. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  119. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  120. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  121. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  122. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  123. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  124. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  125. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  126. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  127. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  129. package/src/runtime/channels/backends/discord.mjs +781 -0
  130. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  131. package/src/runtime/channels/index.mjs +3309 -0
  132. package/src/runtime/channels/lib/config.mjs +285 -0
  133. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  134. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  135. package/src/runtime/channels/lib/holidays.mjs +138 -0
  136. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  137. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  138. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  139. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  140. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  141. package/src/runtime/channels/lib/state-file.mjs +68 -0
  142. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  143. package/src/runtime/channels/lib/tool-format.mjs +124 -0
  144. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  145. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  146. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  147. package/src/runtime/channels/tool-defs.mjs +177 -0
  148. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  149. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  150. package/src/runtime/memory/index.mjs +3600 -0
  151. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  152. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  153. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  154. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  155. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  156. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  157. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  158. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  159. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  160. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  161. package/src/runtime/memory/lib/memory.mjs +418 -0
  162. package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
  163. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  164. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  165. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  166. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  167. package/src/runtime/memory/tool-defs.mjs +79 -0
  168. package/src/runtime/search/index.mjs +925 -0
  169. package/src/runtime/search/lib/config.mjs +61 -0
  170. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  171. package/src/runtime/search/tool-defs.mjs +64 -0
  172. package/src/runtime/shared/atomic-file.mjs +435 -0
  173. package/src/runtime/shared/background-tasks.mjs +376 -0
  174. package/src/runtime/shared/child-guardian.mjs +98 -0
  175. package/src/runtime/shared/config.mjs +393 -0
  176. package/src/runtime/shared/err-text.mjs +121 -0
  177. package/src/runtime/shared/launcher-control.mjs +259 -0
  178. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  179. package/src/runtime/shared/open-url.mjs +37 -0
  180. package/src/runtime/shared/plugin-paths.mjs +25 -0
  181. package/src/runtime/shared/process-shutdown.mjs +147 -0
  182. package/src/runtime/shared/schedules-store.mjs +70 -0
  183. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  184. package/src/runtime/shared/tool-surface.mjs +950 -0
  185. package/src/runtime/shared/user-cwd.mjs +221 -0
  186. package/src/runtime/shared/user-data-guard.mjs +232 -0
  187. package/src/runtime/shared/workspace-router.mjs +259 -0
  188. package/src/standalone/bridge-tool.mjs +1414 -0
  189. package/src/standalone/channel-admin.mjs +366 -0
  190. package/src/standalone/channel-worker-preload.cjs +3 -0
  191. package/src/standalone/channel-worker.mjs +353 -0
  192. package/src/standalone/explore-tool.mjs +233 -0
  193. package/src/standalone/hook-bus.mjs +246 -0
  194. package/src/standalone/plugin-admin.mjs +247 -0
  195. package/src/standalone/provider-admin.mjs +338 -0
  196. package/src/standalone/seeds.mjs +94 -0
  197. package/src/standalone/usage-dashboard.mjs +510 -0
  198. package/src/tui/App.jsx +5438 -0
  199. package/src/tui/components/AnsiText.jsx +199 -0
  200. package/src/tui/components/ContextPanel.jsx +217 -0
  201. package/src/tui/components/Markdown.jsx +205 -0
  202. package/src/tui/components/MarkdownTable.jsx +204 -0
  203. package/src/tui/components/Message.jsx +103 -0
  204. package/src/tui/components/Picker.jsx +317 -0
  205. package/src/tui/components/PromptInput.jsx +584 -0
  206. package/src/tui/components/QueuedCommands.jsx +47 -0
  207. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  208. package/src/tui/components/Spinner.jsx +317 -0
  209. package/src/tui/components/StatusLine.jsx +87 -0
  210. package/src/tui/components/TextEntryPanel.jsx +323 -0
  211. package/src/tui/components/ToolExecution.jsx +772 -0
  212. package/src/tui/components/TurnDone.jsx +78 -0
  213. package/src/tui/components/UsagePanel.jsx +331 -0
  214. package/src/tui/dist/index.mjs +12359 -0
  215. package/src/tui/engine.mjs +2410 -0
  216. package/src/tui/figures.mjs +50 -0
  217. package/src/tui/hooks/useEngine.mjs +16 -0
  218. package/src/tui/index.jsx +254 -0
  219. package/src/tui/input-editing.mjs +242 -0
  220. package/src/tui/markdown/format-token.mjs +194 -0
  221. package/src/tui/paste-attachments.mjs +198 -0
  222. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  223. package/src/tui/spinner-verbs.mjs +45 -0
  224. package/src/tui/theme.mjs +67 -0
  225. package/src/tui/time-format.mjs +53 -0
  226. package/src/ui/ansi.mjs +115 -0
  227. package/src/ui/markdown.mjs +195 -0
  228. package/src/ui/statusline.mjs +730 -0
  229. package/src/ui/tool-card.mjs +101 -0
  230. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  231. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  232. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  233. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  234. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  235. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  236. package/src/workflows/default/WORKFLOW.md +7 -0
  237. package/src/workflows/default/workflow.json +14 -0
  238. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  239. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  240. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  241. package/vendor/ink/build/colorize.d.ts +3 -0
  242. package/vendor/ink/build/colorize.js +48 -0
  243. package/vendor/ink/build/colorize.js.map +1 -0
  244. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  245. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  246. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  247. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  248. package/vendor/ink/build/components/AnimationContext.js +13 -0
  249. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  250. package/vendor/ink/build/components/App.d.ts +24 -0
  251. package/vendor/ink/build/components/App.js +554 -0
  252. package/vendor/ink/build/components/App.js.map +1 -0
  253. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  254. package/vendor/ink/build/components/AppContext.js +25 -0
  255. package/vendor/ink/build/components/AppContext.js.map +1 -0
  256. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  257. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  258. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  259. package/vendor/ink/build/components/Box.d.ts +130 -0
  260. package/vendor/ink/build/components/Box.js +34 -0
  261. package/vendor/ink/build/components/Box.js.map +1 -0
  262. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  263. package/vendor/ink/build/components/CursorContext.js +8 -0
  264. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  265. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  266. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  267. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  269. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  270. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  271. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  272. package/vendor/ink/build/components/FocusContext.js +17 -0
  273. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  274. package/vendor/ink/build/components/Newline.d.ts +13 -0
  275. package/vendor/ink/build/components/Newline.js +8 -0
  276. package/vendor/ink/build/components/Newline.js.map +1 -0
  277. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  278. package/vendor/ink/build/components/Spacer.js +11 -0
  279. package/vendor/ink/build/components/Spacer.js.map +1 -0
  280. package/vendor/ink/build/components/Static.d.ts +24 -0
  281. package/vendor/ink/build/components/Static.js +28 -0
  282. package/vendor/ink/build/components/Static.js.map +1 -0
  283. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  284. package/vendor/ink/build/components/StderrContext.js +13 -0
  285. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  286. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  287. package/vendor/ink/build/components/StdinContext.js +20 -0
  288. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  290. package/vendor/ink/build/components/StdoutContext.js +13 -0
  291. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  292. package/vendor/ink/build/components/Text.d.ts +55 -0
  293. package/vendor/ink/build/components/Text.js +50 -0
  294. package/vendor/ink/build/components/Text.js.map +1 -0
  295. package/vendor/ink/build/components/Transform.d.ts +16 -0
  296. package/vendor/ink/build/components/Transform.js +15 -0
  297. package/vendor/ink/build/components/Transform.js.map +1 -0
  298. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  299. package/vendor/ink/build/cursor-helpers.js +62 -0
  300. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  301. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  302. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  303. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  304. package/vendor/ink/build/devtools.d.ts +1 -0
  305. package/vendor/ink/build/devtools.js +36 -0
  306. package/vendor/ink/build/devtools.js.map +1 -0
  307. package/vendor/ink/build/dom.d.ts +62 -0
  308. package/vendor/ink/build/dom.js +143 -0
  309. package/vendor/ink/build/dom.js.map +1 -0
  310. package/vendor/ink/build/get-max-width.d.ts +3 -0
  311. package/vendor/ink/build/get-max-width.js +10 -0
  312. package/vendor/ink/build/get-max-width.js.map +1 -0
  313. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  314. package/vendor/ink/build/hooks/use-animation.js +87 -0
  315. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  317. package/vendor/ink/build/hooks/use-app.js +8 -0
  318. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  320. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  321. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  323. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  324. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  326. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  327. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  329. package/vendor/ink/build/hooks/use-focus.js +43 -0
  330. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  332. package/vendor/ink/build/hooks/use-input.js +126 -0
  333. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  335. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  336. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  338. package/vendor/ink/build/hooks/use-paste.js +62 -0
  339. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  341. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  342. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  344. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  345. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  347. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  348. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  350. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  351. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  352. package/vendor/ink/build/index.d.ts +42 -0
  353. package/vendor/ink/build/index.js +24 -0
  354. package/vendor/ink/build/index.js.map +1 -0
  355. package/vendor/ink/build/ink.d.ts +146 -0
  356. package/vendor/ink/build/ink.js +1022 -0
  357. package/vendor/ink/build/ink.js.map +1 -0
  358. package/vendor/ink/build/input-parser.d.ts +10 -0
  359. package/vendor/ink/build/input-parser.js +194 -0
  360. package/vendor/ink/build/input-parser.js.map +1 -0
  361. package/vendor/ink/build/instances.d.ts +3 -0
  362. package/vendor/ink/build/instances.js +8 -0
  363. package/vendor/ink/build/instances.js.map +1 -0
  364. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  365. package/vendor/ink/build/kitty-keyboard.js +32 -0
  366. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  367. package/vendor/ink/build/log-update.d.ts +20 -0
  368. package/vendor/ink/build/log-update.js +261 -0
  369. package/vendor/ink/build/log-update.js.map +1 -0
  370. package/vendor/ink/build/measure-element.d.ts +20 -0
  371. package/vendor/ink/build/measure-element.js +13 -0
  372. package/vendor/ink/build/measure-element.js.map +1 -0
  373. package/vendor/ink/build/measure-text.d.ts +6 -0
  374. package/vendor/ink/build/measure-text.js +21 -0
  375. package/vendor/ink/build/measure-text.js.map +1 -0
  376. package/vendor/ink/build/output.d.ts +35 -0
  377. package/vendor/ink/build/output.js +328 -0
  378. package/vendor/ink/build/output.js.map +1 -0
  379. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  380. package/vendor/ink/build/parse-keypress.js +495 -0
  381. package/vendor/ink/build/parse-keypress.js.map +1 -0
  382. package/vendor/ink/build/reconciler.d.ts +4 -0
  383. package/vendor/ink/build/reconciler.js +306 -0
  384. package/vendor/ink/build/reconciler.js.map +1 -0
  385. package/vendor/ink/build/render-background.d.ts +4 -0
  386. package/vendor/ink/build/render-background.js +25 -0
  387. package/vendor/ink/build/render-background.js.map +1 -0
  388. package/vendor/ink/build/render-border.d.ts +4 -0
  389. package/vendor/ink/build/render-border.js +84 -0
  390. package/vendor/ink/build/render-border.js.map +1 -0
  391. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  392. package/vendor/ink/build/render-node-to-output.js +162 -0
  393. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  394. package/vendor/ink/build/render-to-string.d.ts +38 -0
  395. package/vendor/ink/build/render-to-string.js +116 -0
  396. package/vendor/ink/build/render-to-string.js.map +1 -0
  397. package/vendor/ink/build/render.d.ts +176 -0
  398. package/vendor/ink/build/render.js +71 -0
  399. package/vendor/ink/build/render.js.map +1 -0
  400. package/vendor/ink/build/renderer.d.ts +8 -0
  401. package/vendor/ink/build/renderer.js +64 -0
  402. package/vendor/ink/build/renderer.js.map +1 -0
  403. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  404. package/vendor/ink/build/sanitize-ansi.js +27 -0
  405. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  406. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  407. package/vendor/ink/build/squash-text-nodes.js +36 -0
  408. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  409. package/vendor/ink/build/styles.d.ts +302 -0
  410. package/vendor/ink/build/styles.js +303 -0
  411. package/vendor/ink/build/styles.js.map +1 -0
  412. package/vendor/ink/build/utils.d.ts +9 -0
  413. package/vendor/ink/build/utils.js +19 -0
  414. package/vendor/ink/build/utils.js.map +1 -0
  415. package/vendor/ink/build/wrap-text.d.ts +3 -0
  416. package/vendor/ink/build/wrap-text.js +38 -0
  417. package/vendor/ink/build/wrap-text.js.map +1 -0
  418. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  419. package/vendor/ink/build/write-synchronized.js +9 -0
  420. package/vendor/ink/build/write-synchronized.js.map +1 -0
  421. package/vendor/ink/license +10 -0
  422. package/vendor/ink/package.json +137 -0
  423. package/.claude-plugin/marketplace.json +0 -34
  424. package/.claude-plugin/plugin.json +0 -20
  425. package/.gitattributes +0 -34
  426. package/.mcp.json +0 -14
  427. package/ARCHITECTURE.md +0 -77
  428. package/CHANGELOG.md +0 -30
  429. package/CONTRIBUTING.md +0 -45
  430. package/DATA-FLOW.md +0 -79
  431. package/LICENSE +0 -21
  432. package/SECURITY.md +0 -138
  433. package/UNINSTALL.md +0 -115
  434. package/agents/maintenance.md +0 -5
  435. package/agents/memory-classification.md +0 -30
  436. package/agents/scheduler-task.md +0 -18
  437. package/agents/webhook-handler.md +0 -27
  438. package/agents/worker.md +0 -24
  439. package/bin/bridge +0 -133
  440. package/bin/statusline-launcher.mjs +0 -82
  441. package/bin/statusline-lib.mjs +0 -581
  442. package/bin/statusline-route.mjs +0 -273
  443. package/bin/statusline.mjs +0 -638
  444. package/bun.lock +0 -927
  445. package/commands/config.md +0 -16
  446. package/commands/doctor.md +0 -13
  447. package/commands/model.md +0 -61
  448. package/commands/setup.md +0 -17
  449. package/defaults/hidden-roles.json +0 -68
  450. package/defaults/memory-chunk-prompt.md +0 -63
  451. package/defaults/mixdog-config.template.json +0 -27
  452. package/defaults/user-workflow.json +0 -8
  453. package/defaults/user-workflow.md +0 -17
  454. package/hooks/hooks.json +0 -73
  455. package/hooks/lib/active-instance.cjs +0 -77
  456. package/hooks/lib/permission-evaluator.cjs +0 -411
  457. package/hooks/lib/permission-route.cjs +0 -63
  458. package/hooks/lib/settings-loader.cjs +0 -117
  459. package/hooks/post-tool-use.cjs +0 -84
  460. package/hooks/pre-mcp-sandbox.cjs +0 -158
  461. package/hooks/pre-tool-subagent.cjs +0 -258
  462. package/hooks/session-start.cjs +0 -1493
  463. package/hooks/shim-launcher.cjs +0 -65
  464. package/hooks/turn-timer.cjs +0 -82
  465. package/lib/claude-md-writer.cjs +0 -386
  466. package/lib/keychain-cjs.cjs +0 -290
  467. package/lib/plugin-paths.cjs +0 -69
  468. package/lib/rules-builder.cjs +0 -241
  469. package/native/README.md +0 -117
  470. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  471. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  472. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  473. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  474. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  475. package/prompts/code-review.txt +0 -16
  476. package/prompts/security-audit.txt +0 -17
  477. package/rules/bridge/00-common.md +0 -39
  478. package/rules/bridge/20-skip-protocol.md +0 -18
  479. package/rules/bridge/30-explorer.md +0 -33
  480. package/rules/bridge/40-cycle1-agent.md +0 -52
  481. package/rules/bridge/41-cycle2-agent.md +0 -62
  482. package/rules/lead/00-tool-lead.md +0 -61
  483. package/rules/lead/01-general.md +0 -26
  484. package/rules/lead/02-channels.md +0 -49
  485. package/rules/lead/03-team.md +0 -27
  486. package/rules/lead/04-workflow.md +0 -20
  487. package/rules/shared/00-language.md +0 -14
  488. package/rules/shared/01-tool.md +0 -138
  489. package/scripts/bootstrap.mjs +0 -130
  490. package/scripts/bridge-unify-smoke.mjs +0 -308
  491. package/scripts/build-runtime-linux.sh +0 -348
  492. package/scripts/build-runtime-macos.sh +0 -217
  493. package/scripts/build-runtime-windows.ps1 +0 -242
  494. package/scripts/builtin-utils-smoke.mjs +0 -398
  495. package/scripts/bump.mjs +0 -80
  496. package/scripts/check-json.mjs +0 -45
  497. package/scripts/check-syntax-changed.mjs +0 -102
  498. package/scripts/check-syntax.mjs +0 -58
  499. package/scripts/code-graph-batch.test.mjs +0 -33
  500. package/scripts/config-preserve-smoke.mjs +0 -180
  501. package/scripts/doctor.mjs +0 -489
  502. package/scripts/edit-normalize-fuzz.mjs +0 -130
  503. package/scripts/edit-normalize-smoke.mjs +0 -401
  504. package/scripts/edit-operation-smoke.mjs +0 -369
  505. package/scripts/edit2-smoke.mjs +0 -63
  506. package/scripts/ensure-deps.mjs +0 -259
  507. package/scripts/fuzzy-e2e.mjs +0 -28
  508. package/scripts/fuzzy-smoke.mjs +0 -26
  509. package/scripts/gateway-model.mjs +0 -596
  510. package/scripts/generate-runtime-manifest.mjs +0 -166
  511. package/scripts/guard-smoke.mjs +0 -66
  512. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  513. package/scripts/hook-routing-smoke.mjs +0 -29
  514. package/scripts/inject-input.ps1 +0 -204
  515. package/scripts/io-complex-smoke.mjs +0 -667
  516. package/scripts/io-explore-bench.mjs +0 -424
  517. package/scripts/io-guardrails-smoke.mjs +0 -205
  518. package/scripts/io-mini-bench-baseline.json +0 -11
  519. package/scripts/io-mini-bench.mjs +0 -216
  520. package/scripts/io-route-harness.mjs +0 -933
  521. package/scripts/io-telemetry-report.mjs +0 -691
  522. package/scripts/lib/gateway-inventory.mjs +0 -178
  523. package/scripts/lib/gateway-settings.mjs +0 -78
  524. package/scripts/mutation-bench.mjs +0 -564
  525. package/scripts/mutation-io-smoke.mjs +0 -1097
  526. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  527. package/scripts/native-patch-smoke.mjs +0 -304
  528. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  529. package/scripts/patch-interior-context-smoke.mjs +0 -49
  530. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  531. package/scripts/perf-hook-smoke.mjs +0 -71
  532. package/scripts/permission-eval-smoke.mjs +0 -443
  533. package/scripts/prep-patch.mjs +0 -53
  534. package/scripts/prep-shim.mjs +0 -96
  535. package/scripts/provider-cache-smoke.mjs +0 -687
  536. package/scripts/report-runtime-health.mjs +0 -132
  537. package/scripts/resolve-bun.mjs +0 -60
  538. package/scripts/run-mcp.mjs +0 -1473
  539. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  540. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  541. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  542. package/scripts/smoke-runtime-negative.ps1 +0 -100
  543. package/scripts/smoke-runtime-negative.sh +0 -95
  544. package/scripts/stall-policy-smoke.mjs +0 -50
  545. package/scripts/start-memory-worker.mjs +0 -23
  546. package/scripts/statusline-launcher-smoke.mjs +0 -235
  547. package/scripts/stress-atomic-write.mjs +0 -1028
  548. package/scripts/test-fault-inject.mjs +0 -164
  549. package/scripts/test-large-file.mjs +0 -174
  550. package/scripts/tool-edge-smoke.mjs +0 -209
  551. package/scripts/uninstall.mjs +0 -238
  552. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  553. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  554. package/server-main.mjs +0 -3350
  555. package/server.mjs +0 -468
  556. package/setup/config-merge.mjs +0 -246
  557. package/setup/install.mjs +0 -574
  558. package/setup/launch-core.mjs +0 -617
  559. package/setup/launch.mjs +0 -101
  560. package/setup/locate-claude.mjs +0 -56
  561. package/setup/mixdog-cli.mjs +0 -122
  562. package/setup/setup-server.mjs +0 -3305
  563. package/setup/setup.html +0 -3740
  564. package/setup/tui.mjs +0 -325
  565. package/skills/retro-skill-proposer/SKILL.md +0 -92
  566. package/skills/schedule-add/SKILL.md +0 -77
  567. package/skills/setup/SKILL.md +0 -356
  568. package/skills/webhook-add/SKILL.md +0 -81
  569. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  570. package/src/agent/index.mjs +0 -2229
  571. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  572. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  573. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  574. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  575. package/src/agent/orchestrator/config.mjs +0 -405
  576. package/src/agent/orchestrator/context/collect.mjs +0 -651
  577. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  578. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  579. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  580. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  581. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  582. package/src/agent/orchestrator/jobs.mjs +0 -116
  583. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  584. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  585. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  586. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  587. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  588. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  589. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  590. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  591. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  592. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  593. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  594. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  595. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  596. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  597. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  598. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  599. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  600. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  601. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  602. package/src/agent/orchestrator/session/store.mjs +0 -632
  603. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  604. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  605. package/src/agent/orchestrator/session/trim.mjs +0 -491
  606. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  607. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  608. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  609. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  610. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  611. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  612. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  613. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  614. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  615. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  616. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  617. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  618. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  619. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  620. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  621. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  622. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  623. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  624. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  625. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  626. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  627. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  628. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  629. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  630. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  631. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  632. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  633. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  634. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  635. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  636. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  637. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  638. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  639. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  640. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  641. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  642. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  643. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  644. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  645. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  646. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  647. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  648. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  649. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  650. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  651. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  652. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  653. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  654. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  655. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  656. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  657. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  658. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  659. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  660. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  661. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  662. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  663. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  664. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  665. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  666. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  667. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  668. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  669. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  670. package/src/agent/tool-defs.mjs +0 -110
  671. package/src/channels/backends/discord.mjs +0 -784
  672. package/src/channels/data/voice-runtime-manifest.json +0 -138
  673. package/src/channels/index.mjs +0 -3268
  674. package/src/channels/lib/config.mjs +0 -292
  675. package/src/channels/lib/drop-trace.mjs +0 -71
  676. package/src/channels/lib/event-pipeline.mjs +0 -81
  677. package/src/channels/lib/holidays.mjs +0 -138
  678. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  679. package/src/channels/lib/output-forwarder.mjs +0 -765
  680. package/src/channels/lib/runtime-paths.mjs +0 -552
  681. package/src/channels/lib/scheduler.mjs +0 -723
  682. package/src/channels/lib/session-discovery.mjs +0 -103
  683. package/src/channels/lib/state-file.mjs +0 -68
  684. package/src/channels/lib/status-snapshot.mjs +0 -219
  685. package/src/channels/lib/tool-format.mjs +0 -140
  686. package/src/channels/lib/transcript-discovery.mjs +0 -195
  687. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  688. package/src/channels/lib/webhook.mjs +0 -1318
  689. package/src/channels/tool-defs.mjs +0 -170
  690. package/src/daemon/host.mjs +0 -118
  691. package/src/daemon/mcp-transport.mjs +0 -47
  692. package/src/daemon/session.mjs +0 -100
  693. package/src/daemon/thin-client.mjs +0 -71
  694. package/src/daemon/transport.mjs +0 -163
  695. package/src/gateway/claude-current.mjs +0 -255
  696. package/src/gateway/oauth-usage.mjs +0 -598
  697. package/src/gateway/route-meta.mjs +0 -629
  698. package/src/gateway/server.mjs +0 -713
  699. package/src/memory/data/runtime-manifest.json +0 -40
  700. package/src/memory/index.mjs +0 -3332
  701. package/src/memory/lib/core-memory-store.mjs +0 -330
  702. package/src/memory/lib/embedding-provider.mjs +0 -269
  703. package/src/memory/lib/embedding-worker.mjs +0 -323
  704. package/src/memory/lib/memory-cycle1.mjs +0 -645
  705. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  706. package/src/memory/lib/memory-cycle3.mjs +0 -540
  707. package/src/memory/lib/memory-embed.mjs +0 -299
  708. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  709. package/src/memory/lib/memory-recall-store.mjs +0 -638
  710. package/src/memory/lib/memory.mjs +0 -412
  711. package/src/memory/lib/pg/adapter.mjs +0 -308
  712. package/src/memory/lib/pg/process.mjs +0 -360
  713. package/src/memory/lib/pg/supervisor.mjs +0 -396
  714. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  715. package/src/memory/lib/trace-store.mjs +0 -728
  716. package/src/memory/tool-defs.mjs +0 -79
  717. package/src/search/index.mjs +0 -1173
  718. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  719. package/src/search/lib/backends/exa.mjs +0 -50
  720. package/src/search/lib/backends/firecrawl.mjs +0 -61
  721. package/src/search/lib/backends/gemini-api.mjs +0 -83
  722. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  723. package/src/search/lib/backends/index.mjs +0 -150
  724. package/src/search/lib/backends/openai-api.mjs +0 -144
  725. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  726. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  727. package/src/search/lib/backends/tavily.mjs +0 -55
  728. package/src/search/lib/backends/xai-api.mjs +0 -113
  729. package/src/search/lib/config.mjs +0 -192
  730. package/src/search/lib/provider-usage.mjs +0 -67
  731. package/src/search/lib/providers.mjs +0 -47
  732. package/src/search/lib/search-intent.mjs +0 -109
  733. package/src/search/lib/setup-handler.mjs +0 -261
  734. package/src/search/lib/web-tools.mjs +0 -1219
  735. package/src/search/tool-defs.mjs +0 -83
  736. package/src/setup/defender-exclusion.mjs +0 -183
  737. package/src/shared/atomic-file.mjs +0 -436
  738. package/src/shared/config.mjs +0 -372
  739. package/src/shared/daemon-recycle.mjs +0 -108
  740. package/src/shared/disable-claude-builtins.mjs +0 -91
  741. package/src/shared/err-text.mjs +0 -12
  742. package/src/shared/llm/http-agent.mjs +0 -123
  743. package/src/shared/open-url.mjs +0 -62
  744. package/src/shared/plugin-paths.mjs +0 -58
  745. package/src/shared/schedules-store.mjs +0 -70
  746. package/src/shared/seed.mjs +0 -161
  747. package/src/shared/user-cwd.mjs +0 -225
  748. package/src/shared/user-data-guard.mjs +0 -244
  749. package/src/status/aggregator.mjs +0 -584
  750. package/src/status/server.mjs +0 -413
  751. package/tools.json +0 -1671
  752. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  753. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  754. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  755. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  756. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  757. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  758. /package/{lib → src/lib}/text-utils.cjs +0 -0
  759. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  760. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  761. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  762. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  763. /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
  764. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  812. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  813. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  814. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  822. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  823. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  824. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  836. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  837. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  838. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  839. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  840. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  841. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -1,779 +0,0 @@
1
- /**
2
- * Grok CLI OAuth provider ("Grok Build").
3
- *
4
- * Authenticates against xAI's shared OAuth client via PKCE (discovery at
5
- * https://auth.x.ai/.well-known/openid-configuration). Credentials come from
6
- * either mixdog's own token store (grok-oauth.json) OR the Grok CLI's
7
- * ~/.grok/auth.json — the same dual-source pattern openai-oauth uses with
8
- * ~/.codex/auth.json — so an existing `grok` CLI login is picked up without a
9
- * second sign-in.
10
- *
11
- * Inference + catalog merge two sources, routed per model:
12
- * - api.x.ai/v1 (default): grok-4.x chat models and the web_search backend.
13
- * - cli-chat-proxy.grok.com/v1 (the grok-build proxy): proxy-only models
14
- * grok-build and grok-composer-2.5-fast, which api.x.ai does not publish.
15
- * The proxy version-gates /responses (HTTP 426); we clear it with the Grok
16
- * CLI client headers (proxyHeaders, real local version from version.json).
17
- *
18
- * Inference is delegated to an inner OpenAICompatProvider('xai') — the only
19
- * preset wired for the Responses API — with the base URL + (for proxy models)
20
- * the CLI headers injected via config.extraHeaders, bearer swapped for the
21
- * OAuth access token. The model catalog is the union of both endpoints.
22
- */
23
- import { createServer } from 'http';
24
- import { randomBytes, createHash } from 'crypto';
25
- import { readFileSync, existsSync, mkdirSync, statSync } from 'fs';
26
- import { join } from 'path';
27
- import { homedir } from 'os';
28
- import { getPluginData } from '../config.mjs';
29
- import { writeJsonAtomicSync } from '../../../shared/atomic-file.mjs';
30
- import { enrichModels } from './model-catalog.mjs';
31
- import { OpenAICompatProvider } from './openai-compat.mjs';
32
- import { createTimeoutSignal } from '../stall-policy.mjs';
33
- import { populateHttpStatusFromMessage } from './retry-classifier.mjs';
34
- import { getLlmDispatcher, preconnect } from '../../../shared/llm/http-agent.mjs';
35
-
36
- // --- Constants ---
37
- // xAI's shared OAuth client. The consent screen renders this as "Grok Build".
38
- const CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828';
39
- const ISSUER = 'https://auth.x.ai';
40
- const DISCOVERY_URL = `${ISSUER}/.well-known/openid-configuration`;
41
- const SCOPE = 'openid profile email offline_access grok-cli:access api:access';
42
- const CALLBACK_HOST = '127.0.0.1';
43
- const CALLBACK_PORT = 56121;
44
- const CALLBACK_PATH = '/callback';
45
- const REDIRECT_URI = `http://${CALLBACK_HOST}:${CALLBACK_PORT}${CALLBACK_PATH}`;
46
- // Primary inference + search target. The OAuth token's `api:access` scope works
47
- // against the STANDARD xAI API (GET /models 200, POST /responses 200, web_search
48
- // 200 with citations). grok-4.x and web search live here. Proxy-only models
49
- // (grok-build, grok-composer-2.5-fast) are NOT published on api.x.ai — they route
50
- // to PROXY_BASE_URL below, which is version-gated and needs the Grok CLI client
51
- // headers (see proxyHeaders).
52
- const INFERENCE_BASE_URL = 'https://api.x.ai/v1';
53
- const DEFAULT_MODEL = 'grok-4.3';
54
- const TOKEN_REFRESH_SKEW_MS = 5 * 60_000;
55
-
56
- // --- grok-build CLI proxy (Composer 2.5, grok-build) ---
57
- // These models live ONLY on the grok-build proxy, not api.x.ai. /models is
58
- // readable with the bare OAuth bearer; /responses is version-gated (HTTP 426)
59
- // and requires the Grok CLI's client headers. We route only proxy-only models
60
- // here and keep grok-4.x + search on api.x.ai.
61
- const PROXY_BASE_URL = 'https://cli-chat-proxy.grok.com/v1';
62
- const GROK_CLIENT_IDENTIFIER = 'grok-shell';
63
- const GROK_CLI_VERSION_FALLBACK = '0.2.16';
64
-
65
- // Route to the proxy: any grok-composer* model, plus the bare `grok-build`
66
- // coding agent. NOT grok-build-0.1 — that is a real api.x.ai model and must stay
67
- // on api.x.ai, so we match grok-build exactly rather than by prefix.
68
- const PROXY_EXACT_MODELS = new Set(['grok-build']);
69
- function isProxyOnlyModel(model) {
70
- const m = String(model || '');
71
- return /^grok-composer/i.test(m) || PROXY_EXACT_MODELS.has(m);
72
- }
73
-
74
- // Use the REAL installed Grok CLI version for the proxy version gate
75
- // (x-grok-client-version), read from ~/.grok/version.json (or the version
76
- // stamped into models_cache.json). Cached; only falls back to a known-good
77
- // constant when neither local file is readable.
78
- let _grokCliVersionCache = null;
79
- function grokCliVersion() {
80
- if (_grokCliVersionCache) return _grokCliVersionCache;
81
- const grokDir = join(homedir(), '.grok');
82
- for (const [file, field] of [['version.json', 'version'], ['models_cache.json', 'grok_version']]) {
83
- try {
84
- const raw = JSON.parse(readFileSync(join(grokDir, file), 'utf-8'));
85
- const v = String(raw?.[field] || raw?.stable_version || '').trim();
86
- if (v) { _grokCliVersionCache = v; return v; }
87
- } catch { /* try next source */ }
88
- }
89
- _grokCliVersionCache = GROK_CLI_VERSION_FALLBACK;
90
- return _grokCliVersionCache;
91
- }
92
-
93
- // Headers the Grok CLI sends to clear the proxy version gate — extracted from
94
- // the grok binary: x-grok-client-version (the actual 426 gate),
95
- // x-grok-client-identifier, and a matching User-Agent.
96
- function proxyHeaders() {
97
- const v = grokCliVersion();
98
- return {
99
- 'x-grok-client-version': v,
100
- 'x-grok-client-identifier': GROK_CLIENT_IDENTIFIER,
101
- 'User-Agent': `xai-grok-build/${v}`,
102
- };
103
- }
104
-
105
- // Retired model aliases xAI no longer exposes by their old ids. The live
106
- // catalog surfaces the coding model as grok-build-0.1; map the legacy ids to
107
- // it so a stale config selection doesn't hit a model-not-found. Exact table,
108
- // not a heuristic. Mirrors openclaw extensions/xai/model-definitions.ts.
109
- const RETIRED_MODEL_ALIASES = Object.freeze({
110
- 'grok-code-fast-1': 'grok-build-0.1',
111
- 'grok-code-fast': 'grok-build-0.1',
112
- 'grok-code-fast-1-0825': 'grok-build-0.1',
113
- });
114
- export function normalizeGrokModelId(id) {
115
- return (id && RETIRED_MODEL_ALIASES[id]) || id;
116
- }
117
- const MODEL_CACHE_TTL_MS = 24 * 60 * 60_000;
118
- const DISCOVERY_TIMEOUT_MS = 15_000;
119
- const TOKEN_TIMEOUT_MS = 30_000;
120
- const LOGIN_TIMEOUT_MS = 5 * 60_000;
121
-
122
- // Grok CLI credential file. Composite top-level key is "<issuer>::<client_id>".
123
- function grokCliAuthPath() {
124
- return join(homedir(), '.grok', 'auth.json');
125
- }
126
-
127
- // SSRF guard for any endpoint pulled from the discovery document or saved
128
- // tokens. xAI OAuth endpoints must be https on x.ai / *.x.ai — reject
129
- // anything else outright so a hostile discovery response can't redirect the
130
- // token / refresh request. Mirrors openclaw's isTrustedXaiOAuthEndpoint.
131
- function assertTrustedXaiEndpoint(endpoint, label) {
132
- let url;
133
- try {
134
- url = new URL(String(endpoint));
135
- } catch {
136
- throw new Error(`[grok-oauth] invalid ${label}: ${endpoint}`);
137
- }
138
- const host = url.hostname.toLowerCase();
139
- if (url.protocol !== 'https:' || (host !== 'x.ai' && !host.endsWith('.x.ai'))) {
140
- throw new Error(`[grok-oauth] untrusted ${label}: ${endpoint}`);
141
- }
142
- return url.toString();
143
- }
144
-
145
- let _discoveryCache = null;
146
- async function fetchDiscovery() {
147
- if (_discoveryCache) return _discoveryCache;
148
- const timeout = createTimeoutSignal(null, DISCOVERY_TIMEOUT_MS, 'grok-oauth discovery');
149
- try {
150
- const res = await fetch(DISCOVERY_URL, {
151
- headers: { Accept: 'application/json' },
152
- // No redirect-following: the discovery doc is a fixed well-known URL.
153
- // A 3xx could bounce the request to an untrusted host before the
154
- // endpoint trust checks below ever run.
155
- redirect: 'error',
156
- signal: timeout.signal,
157
- dispatcher: getLlmDispatcher(),
158
- });
159
- if (!res.ok) throw new Error(`discovery ${res.status}`);
160
- const j = await res.json();
161
- const discovery = {
162
- authorization_endpoint: assertTrustedXaiEndpoint(j?.authorization_endpoint, 'authorization endpoint'),
163
- token_endpoint: assertTrustedXaiEndpoint(j?.token_endpoint, 'token endpoint'),
164
- };
165
- _discoveryCache = discovery;
166
- return discovery;
167
- } finally {
168
- timeout.cleanup();
169
- }
170
- }
171
-
172
- // --- Token store ---
173
- function getOwnTokenPath() {
174
- const dir = getPluginData();
175
- if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
176
- return join(dir, 'grok-oauth.json');
177
- }
178
-
179
- // expires_at may arrive as a unix number (own store) or an ISO-8601 string
180
- // (Grok CLI auth.json). Normalize both to epoch milliseconds; 0 means unknown.
181
- function _normalizeExpiresAt(value) {
182
- if (typeof value === 'string') {
183
- const ms = Date.parse(value);
184
- return Number.isFinite(ms) ? ms : 0;
185
- }
186
- const n = Number(value || 0);
187
- if (!Number.isFinite(n) || n <= 0) return 0;
188
- return n < 1e12 ? n * 1000 : n;
189
- }
190
-
191
- // Fallback expiry from the access_token's JWT `exp` claim (epoch ms) when the
192
- // store carries no explicit expires_at — without it expires_at stays 0, which
193
- // ensureAuth reads as "never expires", disabling proactive refresh. Returns 0
194
- // for opaque (non-JWT) tokens. JWT `exp` is epoch SECONDS (RFC 7519).
195
- function _expiryFromAccessToken(token) {
196
- try {
197
- const parts = String(token || '').split('.');
198
- if (parts.length !== 3) return 0;
199
- const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString('utf-8'));
200
- const exp = Number(payload?.exp);
201
- return Number.isFinite(exp) && exp > 0 ? exp * 1000 : 0;
202
- } catch { return 0; }
203
- }
204
-
205
- function _mtimeMs(path) {
206
- try { return statSync(path).mtimeMs; } catch { return 0; }
207
- }
208
-
209
- // mixdog's own login store (grok-oauth.json). Single writer, accurate
210
- // numeric expires_at from refresh.
211
- function _loadOwnTokens() {
212
- const path = getOwnTokenPath();
213
- if (!existsSync(path)) return null;
214
- try {
215
- const raw = JSON.parse(readFileSync(path, 'utf-8'));
216
- if (!raw?.access_token || !raw?.refresh_token) return null;
217
- return {
218
- access_token: raw.access_token,
219
- refresh_token: raw.refresh_token,
220
- expires_at: _normalizeExpiresAt(raw.expires_at ?? raw.expiresAt) || _expiryFromAccessToken(raw.access_token),
221
- token_endpoint: raw.token_endpoint || null,
222
- source: 'own',
223
- mtimeMs: _mtimeMs(path),
224
- };
225
- } catch { return null; }
226
- }
227
-
228
- // Grok CLI store (~/.grok/auth.json). Read-only seed: the access token lives
229
- // under `key`, keyed by "<issuer>::<client_id>". We never write back here —
230
- // after the first refresh mixdog manages its own copy, mirroring how
231
- // openai-oauth treats ~/.codex/auth.json.
232
- function _loadGrokCliTokens() {
233
- const path = grokCliAuthPath();
234
- if (!existsSync(path)) return null;
235
- try {
236
- const raw = JSON.parse(readFileSync(path, 'utf-8'));
237
- if (!raw || typeof raw !== 'object') return null;
238
- // The Grok CLI keys every entry by "<issuer>::<client_id>" — look up
239
- // exactly that. No scan-for-matching-client_id fallback: a different
240
- // issuer under the same client_id is a different account/endpoint and
241
- // must not be silently selected.
242
- const entry = raw[`${ISSUER}::${CLIENT_ID}`];
243
- if (!entry?.key || !entry?.refresh_token) return null;
244
- return {
245
- access_token: entry.key,
246
- refresh_token: entry.refresh_token,
247
- expires_at: _normalizeExpiresAt(entry.expires_at) || _expiryFromAccessToken(entry.key),
248
- token_endpoint: null,
249
- source: 'grok-cli',
250
- mtimeMs: _mtimeMs(path),
251
- };
252
- } catch { return null; }
253
- }
254
-
255
- // Own store first (accurate expires_at). Fall back to the Grok CLI login.
256
- function loadTokens() {
257
- return _loadOwnTokens() || _loadGrokCliTokens();
258
- }
259
-
260
- function saveTokens(tokens) {
261
- writeJsonAtomicSync(getOwnTokenPath(), {
262
- access_token: tokens.access_token,
263
- refresh_token: tokens.refresh_token,
264
- expires_at: tokens.expires_at || 0,
265
- token_endpoint: tokens.token_endpoint || null,
266
- }, { lock: true, fsyncDir: true });
267
- }
268
-
269
- function _scrubTokens(text) {
270
- return String(text || '')
271
- .replace(/Bearer [A-Za-z0-9._\-]+/g, 'Bearer [REDACTED]')
272
- .replace(/"access_token"\s*:\s*"[^"]+"/g, '"access_token":"[REDACTED]"')
273
- .replace(/"refresh_token"\s*:\s*"[^"]+"/g, '"refresh_token":"[REDACTED]"')
274
- .replace(/"key"\s*:\s*"[^"]+"/g, '"key":"[REDACTED]"');
275
- }
276
-
277
- // Public predicate used by config.buildDefaultConfig — enabled when either
278
- // token source carries credentials. Single truth: same loader the runtime uses.
279
- export function hasGrokOAuthCredentials() {
280
- try {
281
- const tokens = loadTokens();
282
- return !!(tokens?.access_token && tokens?.refresh_token);
283
- } catch { return false; }
284
- }
285
-
286
- // Write rotated tokens back to the Grok CLI store (~/.grok/auth.json) so the
287
- // CLI — and any other reader of this single-use refresh-token lineage — picks
288
- // up the rotation instead of replaying a now-consumed token. Mirrors
289
- // anthropic-oauth's write-back to ~/.claude/.credentials.json. Best-effort:
290
- // the own store is the authority, so a failed write-back never breaks a
291
- // successful refresh. Host-owned file: no secret/mode so we don't re-permission it.
292
- function _writeBackGrokCliTokens(refreshed) {
293
- const path = grokCliAuthPath();
294
- if (!existsSync(path)) return;
295
- try {
296
- const raw = JSON.parse(readFileSync(path, 'utf-8'));
297
- const entry = raw?.[`${ISSUER}::${CLIENT_ID}`];
298
- if (!entry || typeof entry !== 'object') return;
299
- entry.key = refreshed.access_token;
300
- entry.refresh_token = refreshed.refresh_token;
301
- entry.expires_at = new Date(refreshed.expires_at || Date.now()).toISOString();
302
- // Preserve the host file's existing POSIX mode — writeJsonAtomicSync
303
- // otherwise defaults the replacement to 0o600, re-permissioning a file
304
- // the Grok CLI owns.
305
- let mode;
306
- try { mode = statSync(path).mode & 0o777; } catch { /* keep helper default */ }
307
- writeJsonAtomicSync(path, raw, { lock: true, fsyncDir: true, mode });
308
- } catch (err) {
309
- process.stderr.write(`[grok-oauth] CLI store write-back failed: ${_scrubTokens(err?.message || String(err)).slice(0, 200)}\n`);
310
- }
311
- }
312
-
313
- let _refreshInFlight = null;
314
- async function refreshTokens(tokens) {
315
- if (!tokens?.refresh_token) {
316
- throw new Error('[grok-oauth] refresh token not available — run the Grok CLI login or the Setup login again');
317
- }
318
- const tokenEndpoint = tokens.token_endpoint
319
- ? assertTrustedXaiEndpoint(tokens.token_endpoint, 'token endpoint')
320
- : (await fetchDiscovery()).token_endpoint;
321
- const timeout = createTimeoutSignal(null, TOKEN_TIMEOUT_MS, 'grok-oauth refresh');
322
- try {
323
- const res = await fetch(tokenEndpoint, {
324
- method: 'POST',
325
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
326
- body: new URLSearchParams({
327
- grant_type: 'refresh_token',
328
- client_id: CLIENT_ID,
329
- refresh_token: tokens.refresh_token,
330
- }),
331
- // Never follow a redirect on a secret-bearing request: a trusted
332
- // token endpoint that 307/308-redirects would replay the
333
- // refresh_token to the redirect target. Fail loud instead.
334
- redirect: 'error',
335
- signal: timeout.signal,
336
- dispatcher: getLlmDispatcher(),
337
- });
338
- const text = await res.text();
339
- let json = null;
340
- try { json = text ? JSON.parse(text) : null; } catch { /* handled below */ }
341
- if (!res.ok) {
342
- // 400/401 (or an explicit invalid_grant/revoked/reused body) means
343
- // this refresh_token was already consumed by the CLI's single-use
344
- // lineage. Tag it so refreshTokensWithFallback can adopt the CLI's
345
- // newer token and retry instead of dead-ending.
346
- const isInvalidGrant = res.status === 400 || res.status === 401
347
- || /invalid_grant|revoked|reused/i.test(text);
348
- throw Object.assign(
349
- new Error(`[grok-oauth] token refresh ${res.status}: ${_scrubTokens(text).slice(0, 200)}`),
350
- { isInvalidGrant },
351
- );
352
- }
353
- const accessToken = json?.access_token;
354
- if (!accessToken) throw new Error('[grok-oauth] token refresh returned no access token');
355
- const refreshed = {
356
- access_token: accessToken,
357
- // xAI rotates refresh tokens; reuse the prior one only when the
358
- // response omits it (RFC 6749 permits reuse).
359
- refresh_token: json?.refresh_token || tokens.refresh_token,
360
- expires_at: typeof json?.expires_in === 'number'
361
- ? Date.now() + json.expires_in * 1000
362
- : _normalizeExpiresAt(json?.expires_at),
363
- token_endpoint: tokenEndpoint,
364
- };
365
- // Write the CLI store first, own store last: the own store then carries
366
- // the newest mtime, so ensureAuth's freshest-wins resync treats our own
367
- // refresh as authoritative and doesn't needlessly flip back to the CLI.
368
- _writeBackGrokCliTokens(refreshed);
369
- saveTokens(refreshed);
370
- return { ...refreshed, source: 'own', mtimeMs: _mtimeMs(getOwnTokenPath()) };
371
- } finally {
372
- timeout.cleanup();
373
- }
374
- }
375
-
376
- // invalid_grant means our refresh_token was already consumed/rotated elsewhere
377
- // (the Grok CLI shares this single-use lineage). Re-read BOTH on-disk stores
378
- // and retry once with whichever carries a different (newer) refresh_token —
379
- // own-store still holds the dead one, so the CLI store is the likely source of
380
- // the rotation. Mirrors anthropic-oauth's refreshOAuthCredentialsWithFallback.
381
- async function refreshTokensWithFallback(tokens) {
382
- try {
383
- return await refreshTokens(tokens);
384
- } catch (firstErr) {
385
- if (!firstErr?.isInvalidGrant) throw firstErr;
386
- process.stderr.write('[grok-oauth] invalid_grant — re-reading disk, retrying refresh\n');
387
- // Prefer the freshest store first so we adopt the most recent CLI
388
- // rotation and never replay an even older stale lineage before it.
389
- const candidates = [_loadOwnTokens(), _loadGrokCliTokens()].filter(Boolean)
390
- .sort((a, b) => (b.mtimeMs || 0) - (a.mtimeMs || 0));
391
- const fresh = candidates.find(c => c.refresh_token && c.refresh_token !== tokens.refresh_token);
392
- if (!fresh) {
393
- throw new Error('[grok-oauth] refresh token revoked and no newer token on disk — run the Grok CLI login or the Setup login again');
394
- }
395
- return await refreshTokens(fresh);
396
- }
397
- }
398
-
399
- // --- Model catalog cache (24h disk TTL) ---
400
- function _modelCachePath() {
401
- return join(getPluginData(), 'grok-oauth-models.json');
402
- }
403
-
404
- function _loadModelCache() {
405
- const path = _modelCachePath();
406
- if (!existsSync(path)) return null;
407
- try {
408
- const raw = JSON.parse(readFileSync(path, 'utf-8'));
409
- if (!raw?.fetchedAt || !Array.isArray(raw.models)) return null;
410
- if (Date.now() - raw.fetchedAt > MODEL_CACHE_TTL_MS) return null;
411
- return raw.models;
412
- } catch { return null; }
413
- }
414
-
415
- function _saveModelCache(models) {
416
- try {
417
- writeJsonAtomicSync(_modelCachePath(), { fetchedAt: Date.now(), models }, { lock: true, fsyncDir: true });
418
- } catch { /* best-effort */ }
419
- }
420
-
421
- function _normalizeGrokModel(m) {
422
- const id = m?.id;
423
- if (!id) return null;
424
- return {
425
- id,
426
- name: id,
427
- display: id,
428
- provider: 'grok-oauth',
429
- family: 'grok',
430
- tier: 'version',
431
- latest: false,
432
- contextWindow: m?.context_window || 0,
433
- created: typeof m?.created === 'number' ? m.created : null,
434
- };
435
- }
436
-
437
- // Image/video generation ids — excluded from "latest chat model" resolution.
438
- const NON_CHAT_MODEL_RE = /imagine|image|video/i;
439
-
440
- function _markLatestGrok(models) {
441
- let best = null;
442
- for (const m of models) {
443
- if (!m?.id || NON_CHAT_MODEL_RE.test(m.id) || isProxyOnlyModel(m.id)) continue;
444
- if (!best || (Number(m.created) || 0) > (Number(best.created) || 0)) best = m;
445
- }
446
- if (best) best.latest = true;
447
- }
448
-
449
- // Newest chat model by RELEASE DATE (the catalog's `created`), read from the
450
- // on-disk catalog cache. Deterministic — no version-string guessing (xAI's
451
- // grok-4.20 actually predates grok-4.3 despite the higher-looking number).
452
- // Returns null until the catalog is cached; use ensureLatestGrokModel when null.
453
- export function resolveLatestGrokModel() {
454
- const cached = _loadModelCache();
455
- if (!Array.isArray(cached)) return null;
456
- let best = null;
457
- for (const m of cached) {
458
- if (!m?.id || NON_CHAT_MODEL_RE.test(m.id) || isProxyOnlyModel(m.id) || !(Number(m.created) > 0)) continue;
459
- if (!best || Number(m.created) > Number(best.created)) best = m;
460
- }
461
- return best?.id || null;
462
- }
463
-
464
- export async function ensureLatestGrokModel(provider) {
465
- let m = resolveLatestGrokModel();
466
- if (m) return m;
467
- await provider._refreshModelCache();
468
- m = resolveLatestGrokModel();
469
- if (m) return m;
470
- throw new Error('[grok-oauth] model catalog unavailable after warmup — cannot resolve default model');
471
- }
472
-
473
- let _modelRefreshInFlight = null;
474
-
475
- export class GrokOAuthProvider {
476
- // OpenAI-compatible usage: prompt_tokens includes cached. See registry.mjs.
477
- static inputExcludesCache = false;
478
- name = 'grok-oauth';
479
- config;
480
- tokens = null;
481
- _inner = null;
482
- _innerKey = null;
483
-
484
- constructor(config) {
485
- this.config = config || {};
486
- this.tokens = loadTokens();
487
- // Warm a kept-alive socket to the xAI inference API so the first
488
- // request skips the cold TLS handshake. Best-effort; never throws.
489
- preconnect(INFERENCE_BASE_URL);
490
- }
491
-
492
- async ensureAuth({ forceRefresh = false } = {}) {
493
- if (!this.tokens) this.tokens = loadTokens();
494
- if (!this.tokens) {
495
- throw new Error('[grok-oauth] credentials not found — run the Grok CLI login or the Setup login first');
496
- }
497
- // Freshest-wins resync across BOTH stores. The single-use refresh-token
498
- // lineage is shared with the Grok CLI, so an independent CLI refresh must
499
- // be adopted proactively — not only reactively on invalid_grant. A disk
500
- // scan watermark guarantees termination: if the newest file isn't
501
- // loadable (e.g. a logged-out host file beside a valid own store) we
502
- // still record the scanned mtime so the same check can't re-fire forever.
503
- const ownM = _mtimeMs(getOwnTokenPath());
504
- const cliM = _mtimeMs(grokCliAuthPath());
505
- const maxM = Math.max(ownM, cliM);
506
- if (maxM > (this._lastDiskScan || 0) && maxM > (this.tokens.mtimeMs || 0)) {
507
- const disk = (ownM >= cliM ? _loadOwnTokens() : _loadGrokCliTokens()) || loadTokens();
508
- if (disk?.access_token) this.tokens = disk;
509
- this._lastDiskScan = maxM;
510
- }
511
- const expiring = this.tokens.expires_at
512
- && this.tokens.expires_at < Date.now() + TOKEN_REFRESH_SKEW_MS;
513
- if (forceRefresh || expiring) {
514
- if (_refreshInFlight) {
515
- this.tokens = await _refreshInFlight;
516
- } else {
517
- _refreshInFlight = refreshTokensWithFallback(this.tokens)
518
- .finally(() => { _refreshInFlight = null; });
519
- this.tokens = await _refreshInFlight;
520
- }
521
- }
522
- return this.tokens;
523
- }
524
-
525
- // Build (or rebuild on token change) the inner OpenAI-compatible provider
526
- // that owns request shaping. name 'xai' selects the Responses API path the
527
- // Grok CLI proxy speaks; baseURL + bearer are overridden for grok-build.
528
- _ensureInner(token, model) {
529
- // Proxy-only models (grok-composer*, grok-build) live on the grok-build
530
- // CLI proxy: different baseURL + the Grok CLI client headers. Everything
531
- // else stays on api.x.ai. The cache key includes the route so an
532
- // interleaved sequence of api/proxy calls each get the right inner.
533
- const proxy = isProxyOnlyModel(model);
534
- const key = `${proxy ? 'proxy' : 'api'}:${token}`;
535
- if (this._inner && this._innerKey === key) return this._inner;
536
- this._inner = new OpenAICompatProvider('xai', {
537
- ...this.config,
538
- apiKey: token,
539
- baseURL: proxy ? PROXY_BASE_URL : INFERENCE_BASE_URL,
540
- // Force the HTTP Responses transport. The default WebSocket path
541
- // (openai-oauth-ws) is built for the Codex bearer and is unverified
542
- // with an xAI OAuth token; the HTTP path is proven to work with this
543
- // token and honors this.client's baseURL.
544
- responsesTransport: 'http',
545
- // Proxy-only models additionally need the Grok CLI client headers to
546
- // clear the proxy version gate (HTTP 426 otherwise).
547
- ...(proxy ? { extraHeaders: proxyHeaders() } : {}),
548
- });
549
- this._innerKey = key;
550
- return this._inner;
551
- }
552
-
553
- async send(messages, model, tools, sendOpts) {
554
- const useModel = normalizeGrokModelId(
555
- model || await ensureLatestGrokModel(this),
556
- );
557
- const tokens = await this.ensureAuth();
558
- const inner = this._ensureInner(tokens.access_token, useModel);
559
- try {
560
- // Call _doSend directly, bypassing OpenAICompatProvider.send()'s
561
- // own 401 handler — that one reloads a static apiKey from config,
562
- // which is wrong for OAuth. We own the refresh-and-retry below.
563
- // Caller's model passes through (or catalog-top default), with
564
- // retired aliases normalized. api.x.ai exposes the full grok-4.x
565
- // catalog to this token — no single-model lock.
566
- return await inner._doSend(messages, useModel, tools, sendOpts);
567
- } catch (err) {
568
- // Refresh-and-retry only on 401 (stale/expired access token).
569
- // Resolve the status from the structured field (falling back to the
570
- // shared classifier that derives it from the error text) rather than
571
- // ad-hoc string matching. A 403 is an entitlement signal (the
572
- // account's tier lacks the model) — refreshing the same grant can't
573
- // fix it, so it must surface unretried.
574
- populateHttpStatusFromMessage(err);
575
- if (Number(err?.httpStatus || err?.status) === 401) {
576
- process.stderr.write('[grok-oauth] 401, force-refreshing token...\n');
577
- const fresh = await this.ensureAuth({ forceRefresh: true });
578
- const retryInner = this._ensureInner(fresh.access_token, useModel);
579
- return await retryInner._doSend(messages, useModel, tools, sendOpts);
580
- }
581
- throw err;
582
- }
583
- }
584
-
585
- async _fetchModelItems() {
586
- const tokens = await this.ensureAuth();
587
- const timeout = createTimeoutSignal(null, 10_000, 'grok-oauth model list');
588
- try {
589
- const res = await fetch(`${INFERENCE_BASE_URL}/models`, {
590
- method: 'GET',
591
- headers: { Authorization: `Bearer ${tokens.access_token}` },
592
- // Bearer-bearing request — refuse redirects so the access token
593
- // is never replayed to a redirect target.
594
- redirect: 'error',
595
- signal: timeout.signal,
596
- dispatcher: getLlmDispatcher(),
597
- });
598
- if (!res.ok) throw new Error(`models ${res.status}`);
599
- const data = await res.json();
600
- if (!Array.isArray(data?.data)) {
601
- throw new Error('[grok-oauth] unexpected /models response shape (no data[])');
602
- }
603
- return data.data;
604
- } finally {
605
- timeout.cleanup();
606
- }
607
- }
608
-
609
- // The grok-build proxy catalog (grok-build, grok-composer-2.5-fast). /models
610
- // is readable with the bare bearer + the Grok CLI client headers. Best-effort:
611
- // a proxy hiccup must NOT break the api.x.ai catalog, so failures return [].
612
- async _fetchProxyModelItems() {
613
- let tokens;
614
- try { tokens = await this.ensureAuth(); } catch { return []; }
615
- const timeout = createTimeoutSignal(null, 10_000, 'grok-oauth proxy model list');
616
- try {
617
- const res = await fetch(`${PROXY_BASE_URL}/models`, {
618
- method: 'GET',
619
- headers: { Authorization: `Bearer ${tokens.access_token}`, ...proxyHeaders() },
620
- redirect: 'error',
621
- signal: timeout.signal,
622
- dispatcher: getLlmDispatcher(),
623
- });
624
- if (!res.ok) return [];
625
- const data = await res.json();
626
- return Array.isArray(data?.data) ? data.data : [];
627
- } catch {
628
- return [];
629
- } finally {
630
- timeout.cleanup();
631
- }
632
- }
633
-
634
- // Merge api.x.ai ∪ grok-build proxy catalogs, deduped by id (api wins on
635
- // overlap). The proxy contributes grok-build and grok-composer-2.5-fast,
636
- // which api.x.ai does not publish. api.x.ai failures still propagate (the
637
- // primary catalog); proxy failures are swallowed best-effort above.
638
- async _fetchAllModelItems() {
639
- const [apiItems, proxyItems] = await Promise.all([
640
- this._fetchModelItems(),
641
- this._fetchProxyModelItems(),
642
- ]);
643
- const byId = new Map();
644
- for (const m of proxyItems) if (m?.id) byId.set(m.id, m);
645
- for (const m of apiItems) if (m?.id) byId.set(m.id, m);
646
- return [...byId.values()];
647
- }
648
-
649
- async listModels() {
650
- const cached = _loadModelCache();
651
- if (cached) return cached;
652
- // No swallow-to-[] fallback. Catalog/auth failures propagate to the
653
- // caller (registry warmup + setup model listing), both of which already
654
- // wrap this in their own catch.
655
- const items = await this._fetchAllModelItems();
656
- const normalized = items.map(_normalizeGrokModel).filter(Boolean);
657
- _markLatestGrok(normalized);
658
- const enriched = await enrichModels(normalized);
659
- _saveModelCache(enriched);
660
- return enriched;
661
- }
662
-
663
- async _refreshModelCache() {
664
- if (_modelRefreshInFlight) return _modelRefreshInFlight;
665
- _modelRefreshInFlight = (async () => {
666
- try {
667
- const items = await this._fetchAllModelItems();
668
- const normalized = items.map(_normalizeGrokModel).filter(Boolean);
669
- _markLatestGrok(normalized);
670
- const enriched = await enrichModels(normalized);
671
- _saveModelCache(enriched);
672
- process.stderr.write(`[grok-oauth] catalog refreshed (${enriched.length} models)\n`);
673
- return enriched;
674
- } catch (err) {
675
- process.stderr.write(`[grok-oauth] catalog refresh failed (${err.message})\n`);
676
- return null;
677
- } finally {
678
- _modelRefreshInFlight = null;
679
- }
680
- })();
681
- return _modelRefreshInFlight;
682
- }
683
-
684
- async isAvailable() {
685
- return this.tokens !== null || loadTokens() !== null;
686
- }
687
- }
688
-
689
- // --- Login flow (PKCE, export for CLI / setup use) ---
690
- function generatePKCE() {
691
- const verifier = randomBytes(32).toString('base64url');
692
- const challenge = createHash('sha256').update(verifier).digest('base64url');
693
- return { verifier, challenge };
694
- }
695
-
696
- export async function loginOAuth() {
697
- const discovery = await fetchDiscovery();
698
- const pkce = generatePKCE();
699
- const state = randomBytes(16).toString('hex');
700
- const nonce = randomBytes(16).toString('hex');
701
- const url = new URL(discovery.authorization_endpoint);
702
- url.searchParams.set('response_type', 'code');
703
- url.searchParams.set('client_id', CLIENT_ID);
704
- url.searchParams.set('redirect_uri', REDIRECT_URI);
705
- url.searchParams.set('scope', SCOPE);
706
- url.searchParams.set('state', state);
707
- url.searchParams.set('nonce', nonce);
708
- url.searchParams.set('code_challenge', pkce.challenge);
709
- url.searchParams.set('code_challenge_method', 'S256');
710
- url.searchParams.set('plan', 'generic');
711
- url.searchParams.set('referrer', 'mixdog');
712
- process.stderr.write(`\n[grok-oauth] Open this URL to log in (consent shows as "Grok Build"):\n${url.toString()}\n\n`);
713
- const { openInBrowser } = await import('../../../shared/open-url.mjs');
714
- openInBrowser(url.toString());
715
-
716
- return new Promise((resolve) => {
717
- const timeout = setTimeout(() => { server.close(); resolve(null); }, LOGIN_TIMEOUT_MS);
718
- const server = createServer(async (req, res) => {
719
- const u = new URL(req.url || '/', `http://${CALLBACK_HOST}:${CALLBACK_PORT}`);
720
- if (u.pathname !== CALLBACK_PATH) {
721
- res.writeHead(404);
722
- res.end();
723
- return;
724
- }
725
- const code = u.searchParams.get('code');
726
- if (!code || u.searchParams.get('state') !== state) {
727
- res.writeHead(400);
728
- res.end('Invalid');
729
- clearTimeout(timeout);
730
- server.close();
731
- resolve(null);
732
- return;
733
- }
734
- res.writeHead(200, { 'Content-Type': 'text/html' });
735
- res.end('<html><body><h2>Grok login successful! You can close this tab.</h2></body></html>');
736
- clearTimeout(timeout);
737
- server.close();
738
- try {
739
- const tokenRes = await fetch(discovery.token_endpoint, {
740
- method: 'POST',
741
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
742
- body: new URLSearchParams({
743
- grant_type: 'authorization_code',
744
- client_id: CLIENT_ID,
745
- code,
746
- code_verifier: pkce.verifier,
747
- redirect_uri: REDIRECT_URI,
748
- // xAI re-validates the PKCE challenge at token exchange
749
- // (not just the verifier), so echo it back. Omitting
750
- // these makes the exchange fail. Matches the Grok CLI.
751
- code_challenge: pkce.challenge,
752
- code_challenge_method: 'S256',
753
- }),
754
- // Secret-bearing (authorization code + verifier): refuse
755
- // redirects so they can't be replayed to an untrusted host.
756
- redirect: 'error',
757
- signal: AbortSignal.timeout(TOKEN_TIMEOUT_MS),
758
- });
759
- if (!tokenRes.ok) { resolve(null); return; }
760
- const json = await tokenRes.json();
761
- if (!json.access_token || !json.refresh_token) { resolve(null); return; }
762
- const tokens = {
763
- access_token: json.access_token,
764
- refresh_token: json.refresh_token,
765
- expires_at: typeof json.expires_in === 'number'
766
- ? Date.now() + json.expires_in * 1000
767
- : _normalizeExpiresAt(json.expires_at),
768
- token_endpoint: discovery.token_endpoint,
769
- };
770
- saveTokens(tokens);
771
- resolve(tokens);
772
- } catch {
773
- resolve(null);
774
- }
775
- });
776
- server.listen(CALLBACK_PORT, CALLBACK_HOST);
777
- server.on('error', () => { clearTimeout(timeout); resolve(null); });
778
- });
779
- }