@bastani/atomic 0.9.18-alpha.4 → 0.9.18-alpha.6

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 (409) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +3 -3
  3. package/dist/builtin/intercom/CHANGELOG.md +41 -0
  4. package/dist/builtin/intercom/README.md +18 -3
  5. package/dist/builtin/intercom/broker/broker.ts +670 -127
  6. package/dist/builtin/intercom/broker/client.ts +149 -35
  7. package/dist/builtin/intercom/broker/delivered-message-cache.ts +497 -37
  8. package/dist/builtin/intercom/broker/framing.ts +4 -2
  9. package/dist/builtin/intercom/broker/paths.ts +10 -0
  10. package/dist/builtin/intercom/broker/pending-send-registry.ts +1 -2
  11. package/dist/builtin/intercom/broker/send-handler.ts +311 -52
  12. package/dist/builtin/intercom/broker/send-signature.ts +4 -2
  13. package/dist/builtin/intercom/broker/socket-writes.ts +103 -0
  14. package/dist/builtin/intercom/broker/spawn.ts +9 -4
  15. package/dist/builtin/intercom/index.bundle.mjs +1419 -213
  16. package/dist/builtin/intercom/package.json +2 -2
  17. package/dist/builtin/intercom/recoverable-disconnect.ts +52 -0
  18. package/dist/builtin/intercom/retry-policy.ts +8 -0
  19. package/dist/builtin/intercom/skills/intercom/SKILL.md +17 -9
  20. package/dist/builtin/intercom/types.ts +25 -8
  21. package/dist/builtin/intercom/workflow-stage-path-matching.ts +90 -0
  22. package/dist/builtin/intercom/workflow-stage-target.ts +57 -0
  23. package/dist/builtin/mcp/index.bundle.mjs +427 -126
  24. package/dist/builtin/mcp/package.json +2 -2
  25. package/dist/builtin/subagents/CHANGELOG.md +19 -0
  26. package/dist/builtin/subagents/README.md +3 -3
  27. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  28. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  29. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  30. package/dist/builtin/subagents/agents/codebase-online-researcher.md +11 -11
  31. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  32. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  33. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  34. package/dist/builtin/subagents/agents/debugger.md +3 -3
  35. package/dist/builtin/subagents/agents/worker.md +2 -2
  36. package/dist/builtin/subagents/package.json +3 -3
  37. package/dist/builtin/subagents/skills/qlty/SKILL.md +29 -101
  38. package/dist/builtin/subagents/skills/qlty/references/manual-configuration.md +52 -0
  39. package/dist/builtin/subagents/skills/subagent/SKILL.md +11 -11
  40. package/dist/builtin/subagents/src/extension/index.bundle.mjs +49 -132
  41. package/dist/builtin/web-access/package.json +2 -2
  42. package/dist/builtin/workflows/CHANGELOG.md +44 -0
  43. package/dist/builtin/workflows/README.md +7 -7
  44. package/dist/builtin/workflows/builtin/adversarial-verification.js +2 -2
  45. package/dist/builtin/workflows/builtin/{chunk-szz1ajz9.js → chunk-42s7sw0b.js} +9 -2
  46. package/dist/builtin/workflows/builtin/{chunk-2dqb5s2q.js → chunk-79fjkcvh.js} +1 -1
  47. package/dist/builtin/workflows/builtin/{chunk-n58a7v26.js → chunk-b0v2xab1.js} +181 -10
  48. package/dist/builtin/workflows/builtin/{chunk-fghhy2a5.js → chunk-ed4jfn5t.js} +23 -5
  49. package/dist/builtin/workflows/builtin/{chunk-h3r2vkzc.js → chunk-hqpe2cyx.js} +60 -21
  50. package/dist/builtin/workflows/builtin/{chunk-hzzn6adg.js → chunk-k3w87x8y.js} +1 -1
  51. package/dist/builtin/workflows/builtin/{chunk-82ha8p41.js → chunk-n8h4yyew.js} +1 -1
  52. package/dist/builtin/workflows/builtin/{chunk-qwzvgxnq.js → chunk-reqr3sr3.js} +1 -1
  53. package/dist/builtin/workflows/builtin/{chunk-c53y8bdh.js → chunk-wgccch41.js} +1 -1
  54. package/dist/builtin/workflows/builtin/{chunk-0x6e303p.js → chunk-zbekjqew.js} +20 -7
  55. package/dist/builtin/workflows/builtin/{chunk-29wrp38a.js → chunk-ze5x3d1r.js} +1 -1
  56. package/dist/builtin/workflows/builtin/classify-and-act.js +2 -2
  57. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +2 -2
  58. package/dist/builtin/workflows/builtin/generate-and-filter.js +2 -2
  59. package/dist/builtin/workflows/builtin/goal.js +3 -3
  60. package/dist/builtin/workflows/builtin/index.js +11 -11
  61. package/dist/builtin/workflows/builtin/loop-until-done.js +2 -2
  62. package/dist/builtin/workflows/builtin/open-claude-design.js +2 -2
  63. package/dist/builtin/workflows/builtin/ralph.js +3 -3
  64. package/dist/builtin/workflows/builtin/steering-context.js +1 -1
  65. package/dist/builtin/workflows/builtin/tournament.js +2 -2
  66. package/dist/builtin/workflows/package.json +2 -2
  67. package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +39 -52
  68. package/dist/builtin/workflows/skills/prompt-engineer/references/advanced_patterns.md +9 -37
  69. package/dist/builtin/workflows/skills/prompt-engineer/references/claude_fable_5.md +49 -0
  70. package/dist/builtin/workflows/skills/prompt-engineer/references/claude_fable_5_1.md +57 -0
  71. package/dist/builtin/workflows/skills/prompt-engineer/references/claude_opus_4_8.md +57 -0
  72. package/dist/builtin/workflows/skills/prompt-engineer/references/claude_opus_5.md +47 -0
  73. package/dist/builtin/workflows/skills/prompt-engineer/references/claude_sonnet_5.md +57 -0
  74. package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_5_5.md +60 -0
  75. package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_5_6.md +58 -0
  76. package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_6_astra.md +58 -0
  77. package/dist/builtin/workflows/skills/prompt-engineer/references/quality_improvement.md +18 -4
  78. package/dist/builtin/workflows/src/extension/index.bundle.mjs +3194 -737
  79. package/dist/builtin/workflows/src/index.js +899 -436
  80. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +0 -10
  81. package/dist/cli/list-models.d.ts.map +1 -1
  82. package/dist/cli/list-models.js +4 -0
  83. package/dist/cli/list-models.js.map +1 -1
  84. package/dist/client/index.d.ts +1 -2
  85. package/dist/client/index.d.ts.map +1 -1
  86. package/dist/client/index.js +1 -2
  87. package/dist/client/index.js.map +1 -1
  88. package/dist/config.d.ts +0 -9
  89. package/dist/config.d.ts.map +1 -1
  90. package/dist/config.js +0 -45
  91. package/dist/config.js.map +1 -1
  92. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  93. package/dist/core/agent-session-compaction.js +8 -6
  94. package/dist/core/agent-session-compaction.js.map +1 -1
  95. package/dist/core/agent-session-methods.d.ts +1 -0
  96. package/dist/core/agent-session-methods.d.ts.map +1 -1
  97. package/dist/core/agent-session-methods.js.map +1 -1
  98. package/dist/core/agent-session-models.d.ts.map +1 -1
  99. package/dist/core/agent-session-models.js +3 -4
  100. package/dist/core/agent-session-models.js.map +1 -1
  101. package/dist/core/agent-session-queue-pause.d.ts.map +1 -1
  102. package/dist/core/agent-session-queue-pause.js +6 -0
  103. package/dist/core/agent-session-queue-pause.js.map +1 -1
  104. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  105. package/dist/core/agent-session-runtime.js +15 -7
  106. package/dist/core/agent-session-runtime.js.map +1 -1
  107. package/dist/core/agent-session-tool-hooks.js +1 -1
  108. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  109. package/dist/core/agent-session-tree.d.ts.map +1 -1
  110. package/dist/core/agent-session-tree.js +8 -0
  111. package/dist/core/agent-session-tree.js.map +1 -1
  112. package/dist/core/agent-session.d.ts +2 -0
  113. package/dist/core/agent-session.d.ts.map +1 -1
  114. package/dist/core/agent-session.js +2 -0
  115. package/dist/core/agent-session.js.map +1 -1
  116. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  117. package/dist/core/anthropic-thinking-guard.js +71 -5
  118. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  119. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  120. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  121. package/dist/core/compaction/branch-summarization.js +4 -4
  122. package/dist/core/compaction/branch-summarization.js.map +1 -1
  123. package/dist/core/extensions/api-types.d.ts +8 -2
  124. package/dist/core/extensions/api-types.d.ts.map +1 -1
  125. package/dist/core/extensions/api-types.js.map +1 -1
  126. package/dist/core/extensions/context-types.d.ts +12 -0
  127. package/dist/core/extensions/context-types.d.ts.map +1 -1
  128. package/dist/core/extensions/context-types.js.map +1 -1
  129. package/dist/core/extensions/provider-types.d.ts +2 -2
  130. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  131. package/dist/core/extensions/provider-types.js.map +1 -1
  132. package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -1
  133. package/dist/core/extensions/runner-shortcuts.js +0 -1
  134. package/dist/core/extensions/runner-shortcuts.js.map +1 -1
  135. package/dist/core/fast-model-routing-transport.d.ts +12 -0
  136. package/dist/core/fast-model-routing-transport.d.ts.map +1 -0
  137. package/dist/core/{codex-fast-mode-transport.js → fast-model-routing-transport.js} +29 -29
  138. package/dist/core/fast-model-routing-transport.js.map +1 -0
  139. package/dist/core/fast-model-routing.d.ts +57 -0
  140. package/dist/core/fast-model-routing.d.ts.map +1 -0
  141. package/dist/core/fast-model-routing.js +201 -0
  142. package/dist/core/fast-model-routing.js.map +1 -0
  143. package/dist/core/fast-model-variants.d.ts +98 -0
  144. package/dist/core/fast-model-variants.d.ts.map +1 -0
  145. package/dist/core/fast-model-variants.js +148 -0
  146. package/dist/core/fast-model-variants.js.map +1 -0
  147. package/dist/core/http-dispatcher.d.ts.map +1 -1
  148. package/dist/core/http-dispatcher.js +4 -2
  149. package/dist/core/http-dispatcher.js.map +1 -1
  150. package/dist/core/keybindings.d.ts +0 -10
  151. package/dist/core/keybindings.d.ts.map +1 -1
  152. package/dist/core/keybindings.js +0 -8
  153. package/dist/core/keybindings.js.map +1 -1
  154. package/dist/core/messages.d.ts +1 -1
  155. package/dist/core/messages.d.ts.map +1 -1
  156. package/dist/core/messages.js.map +1 -1
  157. package/dist/core/model-config.d.ts +24 -4
  158. package/dist/core/model-config.d.ts.map +1 -1
  159. package/dist/core/model-config.js +6 -2
  160. package/dist/core/model-config.js.map +1 -1
  161. package/dist/core/model-resolver-initial.js +1 -1
  162. package/dist/core/model-resolver-initial.js.map +1 -1
  163. package/dist/core/model-runtime-streaming.d.ts +14 -1
  164. package/dist/core/model-runtime-streaming.d.ts.map +1 -1
  165. package/dist/core/model-runtime-streaming.js +25 -3
  166. package/dist/core/model-runtime-streaming.js.map +1 -1
  167. package/dist/core/model-runtime.d.ts +39 -2
  168. package/dist/core/model-runtime.d.ts.map +1 -1
  169. package/dist/core/model-runtime.js +91 -7
  170. package/dist/core/model-runtime.js.map +1 -1
  171. package/dist/core/provider-composer-internal.d.ts +1 -1
  172. package/dist/core/provider-composer-internal.d.ts.map +1 -1
  173. package/dist/core/provider-composer-internal.js +8 -2
  174. package/dist/core/provider-composer-internal.js.map +1 -1
  175. package/dist/core/sdk.d.ts.map +1 -1
  176. package/dist/core/sdk.js +21 -18
  177. package/dist/core/sdk.js.map +1 -1
  178. package/dist/core/session-manager-archive.d.ts.map +1 -1
  179. package/dist/core/session-manager-archive.js +25 -2
  180. package/dist/core/session-manager-archive.js.map +1 -1
  181. package/dist/core/settings-manager-core.d.ts +0 -2
  182. package/dist/core/settings-manager-core.d.ts.map +1 -1
  183. package/dist/core/settings-manager-core.js +2 -9
  184. package/dist/core/settings-manager-core.js.map +1 -1
  185. package/dist/core/settings-manager-internals.d.ts +0 -1
  186. package/dist/core/settings-manager-internals.d.ts.map +1 -1
  187. package/dist/core/settings-manager-internals.js.map +1 -1
  188. package/dist/core/settings-manager-ui-accessors.d.ts +0 -8
  189. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  190. package/dist/core/settings-manager-ui-accessors.js +0 -53
  191. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  192. package/dist/core/settings-manager.d.ts +1 -1
  193. package/dist/core/settings-manager.d.ts.map +1 -1
  194. package/dist/core/settings-manager.js.map +1 -1
  195. package/dist/core/settings-types.d.ts +0 -5
  196. package/dist/core/settings-types.d.ts.map +1 -1
  197. package/dist/core/settings-types.js.map +1 -1
  198. package/dist/core/skills.d.ts +1 -1
  199. package/dist/core/skills.d.ts.map +1 -1
  200. package/dist/core/skills.js +4 -2
  201. package/dist/core/skills.js.map +1 -1
  202. package/dist/core/slash-commands.d.ts.map +1 -1
  203. package/dist/core/slash-commands.js +0 -1
  204. package/dist/core/slash-commands.js.map +1 -1
  205. package/dist/core/system-prompt.js +7 -7
  206. package/dist/core/system-prompt.js.map +1 -1
  207. package/dist/core/tools/bash.d.ts.map +1 -1
  208. package/dist/core/tools/bash.js +10 -7
  209. package/dist/core/tools/bash.js.map +1 -1
  210. package/dist/core/tools/edit.d.ts +1 -1
  211. package/dist/core/tools/edit.d.ts.map +1 -1
  212. package/dist/core/tools/edit.js +153 -8
  213. package/dist/core/tools/edit.js.map +1 -1
  214. package/dist/core/tools/find.d.ts.map +1 -1
  215. package/dist/core/tools/find.js +9 -8
  216. package/dist/core/tools/find.js.map +1 -1
  217. package/dist/core/tools/grep.d.ts.map +1 -1
  218. package/dist/core/tools/grep.js +4 -3
  219. package/dist/core/tools/grep.js.map +1 -1
  220. package/dist/core/tools/hashline.d.ts +2 -2
  221. package/dist/core/tools/hashline.d.ts.map +1 -1
  222. package/dist/core/tools/hashline.js +40 -10
  223. package/dist/core/tools/hashline.js.map +1 -1
  224. package/dist/core/tools/ls.d.ts.map +1 -1
  225. package/dist/core/tools/ls.js +2 -2
  226. package/dist/core/tools/ls.js.map +1 -1
  227. package/dist/core/tools/read.d.ts.map +1 -1
  228. package/dist/core/tools/read.js +12 -11
  229. package/dist/core/tools/read.js.map +1 -1
  230. package/dist/core/tools/search.d.ts.map +1 -1
  231. package/dist/core/tools/search.js +20 -19
  232. package/dist/core/tools/search.js.map +1 -1
  233. package/dist/core/tools/write.d.ts.map +1 -1
  234. package/dist/core/tools/write.js +22 -21
  235. package/dist/core/tools/write.js.map +1 -1
  236. package/dist/core/workflow-stage-admission.d.ts +6 -0
  237. package/dist/core/workflow-stage-admission.d.ts.map +1 -1
  238. package/dist/core/workflow-stage-admission.js +14 -0
  239. package/dist/core/workflow-stage-admission.js.map +1 -1
  240. package/dist/index-extensions.d.ts +1 -1
  241. package/dist/index-extensions.d.ts.map +1 -1
  242. package/dist/index-extensions.js.map +1 -1
  243. package/dist/index.d.ts +5 -5
  244. package/dist/index.d.ts.map +1 -1
  245. package/dist/index.js +4 -5
  246. package/dist/index.js.map +1 -1
  247. package/dist/modes/interactive/components/atomic-working-status.d.ts +4 -0
  248. package/dist/modes/interactive/components/atomic-working-status.d.ts.map +1 -1
  249. package/dist/modes/interactive/components/atomic-working-status.js +26 -1
  250. package/dist/modes/interactive/components/atomic-working-status.js.map +1 -1
  251. package/dist/modes/interactive/components/custom-editor.d.ts +7 -0
  252. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  253. package/dist/modes/interactive/components/custom-editor.js +43 -0
  254. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  255. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/footer.js +0 -6
  257. package/dist/modes/interactive/components/footer.js.map +1 -1
  258. package/dist/modes/interactive/components/index.d.ts +1 -2
  259. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  260. package/dist/modes/interactive/components/index.js +0 -1
  261. package/dist/modes/interactive/components/index.js.map +1 -1
  262. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  263. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  264. package/dist/modes/interactive/components/model-selector.js +12 -25
  265. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  266. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -5
  267. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  268. package/dist/modes/interactive/components/scoped-models-selector.js +16 -34
  269. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  270. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  271. package/dist/modes/interactive/components/settings-selector-items.js +10 -5
  272. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  273. package/dist/modes/interactive/components/settings-selector-submenus.d.ts +1 -1
  274. package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
  275. package/dist/modes/interactive/components/settings-selector-submenus.js +10 -7
  276. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  277. package/dist/modes/interactive/components/thinking-selector.d.ts +1 -2
  278. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  279. package/dist/modes/interactive/components/thinking-selector.js +6 -13
  280. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  281. package/dist/modes/interactive/components/transcript-follow-indicator.js +3 -3
  282. package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -1
  283. package/dist/modes/interactive/components/trust-selector.js +2 -2
  284. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  285. package/dist/modes/interactive/interactive-agent-events.js +8 -8
  286. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  287. package/dist/modes/interactive/interactive-autocomplete.js +5 -16
  288. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  289. package/dist/modes/interactive/interactive-bash-compact.js +2 -9
  290. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  291. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  292. package/dist/modes/interactive/interactive-deferred-startup.js +3 -0
  293. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  294. package/dist/modes/interactive/interactive-editor-actions.js +2 -2
  295. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  296. package/dist/modes/interactive/interactive-extension-custom-ui.js +1 -0
  297. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  298. package/dist/modes/interactive/interactive-extension-dialogs.js +7 -0
  299. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  300. package/dist/modes/interactive/interactive-extension-runtime.js +20 -10
  301. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  302. package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -5
  303. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  304. package/dist/modes/interactive/interactive-initial-session-binding.d.ts.map +1 -1
  305. package/dist/modes/interactive/interactive-initial-session-binding.js +3 -0
  306. package/dist/modes/interactive/interactive-initial-session-binding.js.map +1 -1
  307. package/dist/modes/interactive/interactive-input-handling.js +0 -8
  308. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  309. package/dist/modes/interactive/interactive-mode-base.d.ts +5 -1
  310. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  311. package/dist/modes/interactive/interactive-mode-base.js +15 -9
  312. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  313. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -3
  314. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  315. package/dist/modes/interactive/interactive-mode-deps.js +1 -3
  316. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  317. package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -12
  318. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  319. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  320. package/dist/modes/interactive/interactive-model-routing.js +10 -13
  321. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  322. package/dist/modes/interactive/interactive-render-chat.js +29 -0
  323. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  324. package/dist/modes/interactive/interactive-selectors.js +2 -32
  325. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  326. package/dist/modes/interactive/interactive-session-routing.js +1 -5
  327. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  328. package/dist/modes/interactive/interactive-session-runtime.js +1 -5
  329. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  330. package/dist/modes/interactive/interactive-slash-commands.js +6 -13
  331. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  332. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  333. package/dist/modes/interactive/interactive-startup.js +19 -13
  334. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  335. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  336. package/dist/modes/interactive/interactive-tui.js +27 -3
  337. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  338. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  339. package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
  340. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  341. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  342. package/dist/modes/interactive-engine/isolated-runtime.js +4 -1
  343. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  344. package/dist/utils/child-process.d.ts.map +1 -1
  345. package/dist/utils/child-process.js +13 -6
  346. package/dist/utils/child-process.js.map +1 -1
  347. package/dist/utils/exif-orientation.d.ts.map +1 -1
  348. package/dist/utils/exif-orientation.js +2 -3
  349. package/dist/utils/exif-orientation.js.map +1 -1
  350. package/dist/utils/tools-manager.d.ts +1 -0
  351. package/dist/utils/tools-manager.d.ts.map +1 -1
  352. package/dist/utils/tools-manager.js +33 -18
  353. package/dist/utils/tools-manager.js.map +1 -1
  354. package/docs/compaction.md +2 -0
  355. package/docs/custom-provider.md +4 -1
  356. package/docs/docs.json +14 -2
  357. package/docs/extensions.md +11 -4
  358. package/docs/intercom.md +33 -8
  359. package/docs/keybindings.md +8 -6
  360. package/docs/models/evals.md +394 -0
  361. package/docs/models/model-selection.md +60 -25
  362. package/docs/models/pareto-efficiency.md +33 -15
  363. package/docs/models.md +80 -1
  364. package/docs/packages.md +2 -2
  365. package/docs/providers.md +44 -20
  366. package/docs/quickstart.md +8 -6
  367. package/docs/rpc.md +3 -3
  368. package/docs/sdk.md +2 -16
  369. package/docs/settings.md +19 -22
  370. package/docs/skills.md +4 -2
  371. package/docs/subagents.md +9 -3
  372. package/docs/terminal-setup.md +15 -0
  373. package/docs/tools/edit.md +373 -0
  374. package/docs/tools.md +3 -7
  375. package/docs/tui.md +2 -1
  376. package/docs/usage.md +3 -5
  377. package/docs/workflows/api-reference.md +1395 -0
  378. package/docs/workflows/authoring.md +678 -0
  379. package/docs/workflows/builtins.md +245 -0
  380. package/docs/workflows/operations.md +811 -0
  381. package/docs/workflows/reliable-design.md +2099 -0
  382. package/docs/workflows/verification.md +62 -0
  383. package/docs/workflows.md +15 -5183
  384. package/npm-shrinkwrap.json +584 -69
  385. package/package.json +7 -7
  386. package/dist/client/remote-session.d.ts +0 -64
  387. package/dist/client/remote-session.d.ts.map +0 -1
  388. package/dist/client/remote-session.js +0 -351
  389. package/dist/client/remote-session.js.map +0 -1
  390. package/dist/client/transcript.d.ts +0 -12
  391. package/dist/client/transcript.d.ts.map +0 -1
  392. package/dist/client/transcript.js +0 -98
  393. package/dist/client/transcript.js.map +0 -1
  394. package/dist/core/codex-fast-mode-transport.d.ts +0 -12
  395. package/dist/core/codex-fast-mode-transport.d.ts.map +0 -1
  396. package/dist/core/codex-fast-mode-transport.js.map +0 -1
  397. package/dist/core/codex-fast-mode.d.ts +0 -53
  398. package/dist/core/codex-fast-mode.d.ts.map +0 -1
  399. package/dist/core/codex-fast-mode.js +0 -249
  400. package/dist/core/codex-fast-mode.js.map +0 -1
  401. package/dist/modes/interactive/components/fast-mode-selector.d.ts +0 -27
  402. package/dist/modes/interactive/components/fast-mode-selector.d.ts.map +0 -1
  403. package/dist/modes/interactive/components/fast-mode-selector.js +0 -107
  404. package/dist/modes/interactive/components/fast-mode-selector.js.map +0 -1
  405. package/dist/server/create-harness.d.ts +0 -53
  406. package/dist/server/create-harness.d.ts.map +0 -1
  407. package/dist/server/create-harness.js +0 -360
  408. package/dist/server/create-harness.js.map +0 -1
  409. package/docs/models/artificial-analysis-index.md +0 -83
@@ -1 +1 @@
1
- {"version":3,"file":"context-types.js","sourceRoot":"","sources":["../../../src/core/extensions/context-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Api, ImageContent, Model, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { VerbatimCompactionResult } from \"../compaction/index.ts\";\nimport type { CustomMessage } from \"../messages.ts\";\nimport type { ModelRegistry } from \"../model-registry.ts\";\nimport type { ScopedModel } from \"../model-resolver.ts\";\nimport type { ReadonlySessionManager, SessionManager } from \"../session-manager.ts\";\nimport type { SkillCatalog } from \"../skill-catalog.ts\";\nimport type { BuildSystemPromptOptions } from \"../system-prompt.ts\";\nimport type { WorkflowStageAdmissionBoundary } from \"../workflow-stage-admission.ts\";\nimport type { SendMessageOptions, SendMessagesOptions } from \"./message-types.ts\";\nimport type { ExtensionUIContext } from \"./ui-types.ts\";\n\nexport interface ContextUsage {\n\t/** Estimated context tokens, or null if unknown (e.g. right after compaction, before next LLM response). */\n\ttokens: number | null;\n\tcontextWindow: number;\n\t/** Context usage as percentage of context window, or null if tokens is unknown. */\n\tpercent: number | null;\n}\n\nexport interface CompactOptions {\n\t/** Fraction of compactable context to keep. 0.3 is aggressive, 0.7 is light. */\n\tcompression_ratio?: number;\n\t/** Number of recent context-eligible messages to keep uncompressed. */\n\tpreserve_recent?: number;\n\t/** Focus query for relevance-based pruning. Defaults to auto-detected session context. */\n\tquery?: string;\n\tonComplete?: (result: VerbatimCompactionResult) => void;\n\tonError?: (error: Error) => void;\n}\n\n/**\n * Late routes settle as delivery acknowledgements: resolution means the route\n * accepted delivery, while rejection means delivery was not fully accepted. A\n * sequential batch may have delivered a prefix before it rejects; stale-context\n * rejection identifies the dropped route, and other failures reject unchanged.\n */\nexport interface WorkflowStageLateMessageRouter {\n\trouteMessage<T>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: SendMessageOptions,\n\t): void | Promise<void>;\n\trouteMessages<T>(\n\t\tmessages: Array<Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">>,\n\t\toptions?: SendMessagesOptions,\n\t): void | Promise<void>;\n}\n\nexport interface WorkflowStageMessageAdmission {\n\t/** Internal generation-owned boundary shared by every model-fallback session. */\n\treadonly boundary: WorkflowStageAdmissionBoundary;\n\t/** Internal extension state that must survive model-fallback session replacement. */\n\treadonly extensionState: Map<string, object>;\n\tisOpen(): boolean;\n}\n\nexport interface WorkflowPendingStageSender {\n\treadonly id: string;\n\treadonly name?: string;\n\treadonly cwd: string;\n\treadonly model: string;\n\treadonly pid: number;\n\treadonly startedAt: number;\n\treadonly lastActivity: number;\n\treadonly status?: string;\n\treadonly group?: string;\n}\n\nexport interface WorkflowPendingStageMessage {\n\treadonly id: string;\n\treadonly timestamp: number;\n\treadonly replyTo?: string;\n\treadonly expectsReply?: boolean;\n\treadonly replyError?: string;\n\treadonly content: {\n\t\treadonly text: string;\n\t\treadonly attachments?: readonly {\n\t\t\treadonly type: \"file\" | \"snippet\" | \"context\";\n\t\t\treadonly name: string;\n\t\t\treadonly content: string;\n\t\t\treadonly language?: string;\n\t\t}[];\n\t};\n}\n\nexport interface WorkflowPendingStageDelivery {\n\t/** Process-private authority proving this stage belongs to the workflow run route. */\n\treadonly routeCapability: string;\n\tdeliverPending(\n\t\tdeliver: (from: WorkflowPendingStageSender, message: WorkflowPendingStageMessage) => void | Promise<void>,\n\t): Promise<void>;\n\tready(): Promise<void> | undefined;\n}\n\nexport interface WorkflowStageOrchestrationContext {\n\treadonly kind: \"workflow-stage\";\n\treadonly workflowRunId: string;\n\treadonly workflowStageId: string;\n\treadonly workflowStageName: string;\n\treadonly constraints: {\n\t\treadonly disableWorkflowTool: true;\n\t};\n\t/** Internal lifecycle seam for surfacing detached results after this stage closes. */\n\treadonly lateMessageRouter?: WorkflowStageLateMessageRouter;\n\t/** Internal synchronous boundary used before producer reply/turn side effects. */\n\treadonly messageAdmission?: WorkflowStageMessageAdmission;\n\t/**\n\t * Resolved per-session intercom home group for this stage. Concrete, already\n\t * normalized upstream. Read by the intercom extension (buildRegistration) and\n\t * inherited by subagents this stage spawns. Absent => no group override.\n\t */\n\treadonly intercomGroup?: string;\n\t/** Durable pre-start intercom delivery, drained by the intercom extension before the first turn. */\n\treadonly pendingStageDelivery?: WorkflowPendingStageDelivery;\n}\n/** Typed child intercom identity and supervisor capability issued at admission. */\nexport interface SubagentIntercomIdentity {\n\treadonly orchestratorTarget: string;\n\treadonly runId: string;\n\treadonly agent: string;\n\treadonly index: number;\n\treadonly sessionName?: string;\n\treadonly supervisor?: {\n\t\treadonly capability: string;\n\t\treadonly supervisorSessionId: string;\n\t};\n}\n\n/** Typed child capability policy supplied by an in-process subagent admission. */\nexport interface SubagentChildPolicy {\n\treadonly managementActions: \"full\" | \"restricted\";\n\treadonly fanoutAuthorized: boolean;\n\treadonly inheritProjectContext: boolean;\n\treadonly inheritSkills: boolean;\n\t/** Current admitted in-process nesting depth; absent for top-level sessions. */\n\treadonly depth?: number;\n\t/** Undefined preserves MCP configuration defaults; [] explicitly disables direct tools. */\n\treadonly mcpDirectTools?: readonly string[];\n\t/** Admission-issued identity/capability; never inherited through process environment. */\n\treadonly intercom?: SubagentIntercomIdentity;\n\t/** Resolved intercom group for this admitted child, when one was assigned. */\n\treadonly intercomGroup?: string;\n}\n// Union alias kept for forward-compatible orchestration context variants.\nexport type OrchestrationContext = WorkflowStageOrchestrationContext;\n\n/**\n * Context passed to extension event handlers.\n */\nexport type ExtensionMode = \"tui\" | \"rpc\" | \"json\" | \"print\";\n\nexport interface ExtensionContext {\n\t/** Session-scoped orchestration policy for child runtimes such as workflow stages. */\n\treadonly orchestrationContext?: OrchestrationContext;\n\t/** Typed capability policy for an in-process subagent child, when this session is one. */\n\treadonly subagentPolicy?: SubagentChildPolicy;\n\t/** UI methods for user interaction */\n\tui: ExtensionUIContext;\n\t/** Current run mode. Use \"tui\" to guard terminal-only UI such as custom components. */\n\tmode: ExtensionMode;\n\t/** Whether dialog-capable UI is available (true in TUI and RPC modes) */\n\thasUI: boolean;\n\t/** Current working directory */\n\tcwd: string;\n\t/** Session manager (read-only) */\n\tsessionManager: ReadonlySessionManager;\n\t/** Model registry for API key resolution */\n\tmodelRegistry: ModelRegistry;\n\t/** Current model (may be undefined) */\n\tmodel: Model<Api> | undefined;\n\t/** Models scoped to this session (resolved from `--models` / `enabledModels`\n\t * settings against the available catalogue). Same set the `/scoped-models`\n\t * command shows. Empty when no scoping is configured (all available models\n\t * are usable). Read-only snapshot, resolved at access time. */\n\tscopedModels: readonly ScopedModel[];\n\t/** Current thinking level, resolved from the active session at access time. */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Session-scoped internal resource router (e.g. artifact:// resolver). */\n\treadonly internalResourceRouter?: import(\"../tools/resource-selectors.ts\").InternalResourceRouter;\n\t/** Whether the agent is idle (not streaming) */\n\tisIdle(): boolean;\n\t/** Whether project-local trust is active for this context. */\n\tisProjectTrusted(): boolean;\n\t/** The current abort signal, or undefined when the agent is not streaming. */\n\tsignal: AbortSignal | undefined;\n\t/** Abort the current agent operation */\n\tabort(): void;\n\t/** Whether there are queued messages waiting */\n\thasPendingMessages(): boolean;\n\t/** Gracefully shutdown pi and exit. Available in all contexts. */\n\tshutdown(): void;\n\t/** Get current context usage for the active model. */\n\tgetContextUsage(): ContextUsage | undefined;\n\t/** Trigger compaction without awaiting completion. */\n\tcompact(options?: CompactOptions): void;\n\t/** Get the current effective system prompt. */\n\tgetSystemPrompt(): string;\n\t/** Current loader-owned skill candidates and exact selector resolver. */\n\tgetSkillCatalog?(): SkillCatalog;\n}\n\n/**\n * Extended context for command handlers.\n * Includes session control methods only safe in user-initiated commands.\n */\nexport interface ExtensionCommandContext extends ExtensionContext {\n\t/** Get the current base system-prompt construction options. */\n\tgetSystemPromptOptions(): BuildSystemPromptOptions;\n\n\t/** Wait for the agent to finish streaming */\n\twaitForIdle(): Promise<void>;\n\n\t/** Start a new session, optionally with initialization. */\n\tnewSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }>;\n\n\t/** Fork from a specific entry, creating a new session file. */\n\tfork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\n\t/** Navigate to a different point in the session tree. */\n\tnavigateTree(\n\t\ttargetId: string,\n\t\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n\t): Promise<{ cancelled: boolean }>;\n\n\t/** Switch to a different session file. */\n\tswitchSession(\n\t\tsessionPath: string,\n\t\toptions?: { withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\n\t/** Reload extensions, skills, prompts, and themes. */\n\treload(): Promise<void>;\n}\n\n/**\n * Fresh command-capable context bound to the replacement session after a session switch.\n *\n * This is passed to `withSession()` callbacks on `newSession()`, `fork()`, and `switchSession()`.\n */\nexport interface ReplacedSessionContext extends ExtensionCommandContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: SendMessageOptions,\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"context-types.js","sourceRoot":"","sources":["../../../src/core/extensions/context-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Api, ImageContent, Model, TextContent } from \"@bastani/pi-ai/compat\";\nimport type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { VerbatimCompactionResult } from \"../compaction/index.ts\";\nimport type { CustomMessage } from \"../messages.ts\";\nimport type { ModelRegistry } from \"../model-registry.ts\";\nimport type { ScopedModel } from \"../model-resolver.ts\";\nimport type { ReadonlySessionManager, SessionManager } from \"../session-manager.ts\";\nimport type { SkillCatalog } from \"../skill-catalog.ts\";\nimport type { BuildSystemPromptOptions } from \"../system-prompt.ts\";\nimport type { WorkflowStageAdmissionBoundary } from \"../workflow-stage-admission.ts\";\nimport type { SendMessageOptions, SendMessagesOptions } from \"./message-types.ts\";\nimport type { ExtensionUIContext } from \"./ui-types.ts\";\n\nexport interface ContextUsage {\n\t/** Estimated context tokens, or null if unknown (e.g. right after compaction, before next LLM response). */\n\ttokens: number | null;\n\tcontextWindow: number;\n\t/** Context usage as percentage of context window, or null if tokens is unknown. */\n\tpercent: number | null;\n}\n\nexport interface CompactOptions {\n\t/** Fraction of compactable context to keep. 0.3 is aggressive, 0.7 is light. */\n\tcompression_ratio?: number;\n\t/** Number of recent context-eligible messages to keep uncompressed. */\n\tpreserve_recent?: number;\n\t/** Focus query for relevance-based pruning. Defaults to auto-detected session context. */\n\tquery?: string;\n\tonComplete?: (result: VerbatimCompactionResult) => void;\n\tonError?: (error: Error) => void;\n}\n\n/**\n * Late routes settle as delivery acknowledgements: resolution means the route\n * accepted delivery, while rejection means delivery was not fully accepted. A\n * sequential batch may have delivered a prefix before it rejects; stale-context\n * rejection identifies the dropped route, and other failures reject unchanged.\n */\nexport interface WorkflowStageLateMessageRouter {\n\trouteMessage<T>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: SendMessageOptions,\n\t): void | Promise<void>;\n\trouteMessages<T>(\n\t\tmessages: Array<Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">>,\n\t\toptions?: SendMessagesOptions,\n\t): void | Promise<void>;\n}\n\nexport interface WorkflowStageMessageAdmission {\n\t/** Internal generation-owned boundary shared by every model-fallback session. */\n\treadonly boundary: WorkflowStageAdmissionBoundary;\n\t/** Internal extension state that must survive model-fallback session replacement. */\n\treadonly extensionState: Map<string, object>;\n\tisOpen(): boolean;\n}\n\nexport interface WorkflowPendingStageSender {\n\treadonly id: string;\n\treadonly name?: string;\n\treadonly cwd: string;\n\treadonly model: string;\n\treadonly pid: number;\n\treadonly startedAt: number;\n\treadonly lastActivity: number;\n\treadonly status?: string;\n\treadonly group?: string;\n}\n\nexport interface WorkflowPendingStageMessage {\n\treadonly id: string;\n\treadonly timestamp: number;\n\treadonly replyTo?: string;\n\treadonly expectsReply?: boolean;\n\treadonly replyError?: string;\n\treadonly content: {\n\t\treadonly text: string;\n\t\treadonly attachments?: readonly {\n\t\t\treadonly type: \"file\" | \"snippet\" | \"context\";\n\t\t\treadonly name: string;\n\t\t\treadonly content: string;\n\t\t\treadonly language?: string;\n\t\t}[];\n\t};\n}\n\nexport interface WorkflowPendingStageDelivery {\n\t/** Process-private authority proving this stage belongs to the workflow run route. */\n\treadonly routeCapability: string;\n\tdeliverPending(\n\t\tdeliver: (from: WorkflowPendingStageSender, message: WorkflowPendingStageMessage) => void | Promise<void>,\n\t): Promise<void>;\n\tready(): Promise<void> | undefined;\n\t/**\n\t * Terminal signal from a delivery owner that has run out of recovery: the\n\t * queued messages can no longer be drained, so the stage must fail at its own\n\t * lifecycle boundary rather than run without the instructions it was given.\n\t * Idempotent — the first reason wins, and `ready()` then settles with a\n\t * stage-scoped error instead of waiting for a delivery that will not come.\n\t *\n\t * Required, not optional: `ready()` has no timeout, so a delivery that cannot\n\t * be settled leaves its stage parked forever. Every implementer must be able\n\t * to answer that no delivery is coming.\n\t */\n\tfail(reason: Error): void;\n}\n\nexport interface WorkflowStageOrchestrationContext {\n\treadonly kind: \"workflow-stage\";\n\treadonly workflowRunId: string;\n\treadonly workflowStageId: string;\n\treadonly workflowStageName: string;\n\treadonly constraints: {\n\t\treadonly disableWorkflowTool: true;\n\t};\n\t/** Internal lifecycle seam for surfacing detached results after this stage closes. */\n\treadonly lateMessageRouter?: WorkflowStageLateMessageRouter;\n\t/** Internal synchronous boundary used before producer reply/turn side effects. */\n\treadonly messageAdmission?: WorkflowStageMessageAdmission;\n\t/**\n\t * Resolved per-session intercom home group for this stage. Concrete, already\n\t * normalized upstream. Read by the intercom extension (buildRegistration) and\n\t * inherited by subagents this stage spawns. Absent => no group override.\n\t */\n\treadonly intercomGroup?: string;\n\t/** Durable pre-start intercom delivery, drained by the intercom extension before the first turn. */\n\treadonly pendingStageDelivery?: WorkflowPendingStageDelivery;\n}\n/** Typed child intercom identity and supervisor capability issued at admission. */\nexport interface SubagentIntercomIdentity {\n\treadonly orchestratorTarget: string;\n\treadonly runId: string;\n\treadonly agent: string;\n\treadonly index: number;\n\treadonly sessionName?: string;\n\treadonly supervisor?: {\n\t\treadonly capability: string;\n\t\treadonly supervisorSessionId: string;\n\t};\n}\n\n/** Typed child capability policy supplied by an in-process subagent admission. */\nexport interface SubagentChildPolicy {\n\treadonly managementActions: \"full\" | \"restricted\";\n\treadonly fanoutAuthorized: boolean;\n\treadonly inheritProjectContext: boolean;\n\treadonly inheritSkills: boolean;\n\t/** Current admitted in-process nesting depth; absent for top-level sessions. */\n\treadonly depth?: number;\n\t/** Undefined preserves MCP configuration defaults; [] explicitly disables direct tools. */\n\treadonly mcpDirectTools?: readonly string[];\n\t/** Admission-issued identity/capability; never inherited through process environment. */\n\treadonly intercom?: SubagentIntercomIdentity;\n\t/** Resolved intercom group for this admitted child, when one was assigned. */\n\treadonly intercomGroup?: string;\n}\n// Union alias kept for forward-compatible orchestration context variants.\nexport type OrchestrationContext = WorkflowStageOrchestrationContext;\n\n/**\n * Context passed to extension event handlers.\n */\nexport type ExtensionMode = \"tui\" | \"rpc\" | \"json\" | \"print\";\n\nexport interface ExtensionContext {\n\t/** Session-scoped orchestration policy for child runtimes such as workflow stages. */\n\treadonly orchestrationContext?: OrchestrationContext;\n\t/** Typed capability policy for an in-process subagent child, when this session is one. */\n\treadonly subagentPolicy?: SubagentChildPolicy;\n\t/** UI methods for user interaction */\n\tui: ExtensionUIContext;\n\t/** Current run mode. Use \"tui\" to guard terminal-only UI such as custom components. */\n\tmode: ExtensionMode;\n\t/** Whether dialog-capable UI is available (true in TUI and RPC modes) */\n\thasUI: boolean;\n\t/** Current working directory */\n\tcwd: string;\n\t/** Session manager (read-only) */\n\tsessionManager: ReadonlySessionManager;\n\t/** Model registry for API key resolution */\n\tmodelRegistry: ModelRegistry;\n\t/** Current model (may be undefined) */\n\tmodel: Model<Api> | undefined;\n\t/** Models scoped to this session (resolved from `--models` / `enabledModels`\n\t * settings against the available catalogue). Same set the `/scoped-models`\n\t * command shows. Empty when no scoping is configured (all available models\n\t * are usable). Read-only snapshot, resolved at access time. */\n\tscopedModels: readonly ScopedModel[];\n\t/** Current thinking level, resolved from the active session at access time. */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Session-scoped internal resource router (e.g. artifact:// resolver). */\n\treadonly internalResourceRouter?: import(\"../tools/resource-selectors.ts\").InternalResourceRouter;\n\t/** Whether the agent is idle (not streaming) */\n\tisIdle(): boolean;\n\t/** Whether project-local trust is active for this context. */\n\tisProjectTrusted(): boolean;\n\t/** The current abort signal, or undefined when the agent is not streaming. */\n\tsignal: AbortSignal | undefined;\n\t/** Abort the current agent operation */\n\tabort(): void;\n\t/** Whether there are queued messages waiting */\n\thasPendingMessages(): boolean;\n\t/** Gracefully shutdown pi and exit. Available in all contexts. */\n\tshutdown(): void;\n\t/** Get current context usage for the active model. */\n\tgetContextUsage(): ContextUsage | undefined;\n\t/** Trigger compaction without awaiting completion. */\n\tcompact(options?: CompactOptions): void;\n\t/** Get the current effective system prompt. */\n\tgetSystemPrompt(): string;\n\t/** Current loader-owned skill candidates and exact selector resolver. */\n\tgetSkillCatalog?(): SkillCatalog;\n}\n\n/**\n * Extended context for command handlers.\n * Includes session control methods only safe in user-initiated commands.\n */\nexport interface ExtensionCommandContext extends ExtensionContext {\n\t/** Get the current base system-prompt construction options. */\n\tgetSystemPromptOptions(): BuildSystemPromptOptions;\n\n\t/** Wait for the agent to finish streaming */\n\twaitForIdle(): Promise<void>;\n\n\t/** Start a new session, optionally with initialization. */\n\tnewSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }>;\n\n\t/** Fork from a specific entry, creating a new session file. */\n\tfork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\n\t/** Navigate to a different point in the session tree. */\n\tnavigateTree(\n\t\ttargetId: string,\n\t\toptions?: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string },\n\t): Promise<{ cancelled: boolean }>;\n\n\t/** Switch to a different session file. */\n\tswitchSession(\n\t\tsessionPath: string,\n\t\toptions?: { withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\n\t/** Reload extensions, skills, prompts, and themes. */\n\treload(): Promise<void>;\n}\n\n/**\n * Fresh command-capable context bound to the replacement session after a session switch.\n *\n * This is passed to `withSession()` callbacks on `newSession()`, `fork()`, and `switchSession()`.\n */\nexport interface ReplacedSessionContext extends ExtensionCommandContext {\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: SendMessageOptions,\n\t): Promise<void>;\n\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\"; expandPromptTemplates?: boolean },\n\t): Promise<void>;\n}\n"]}
@@ -59,8 +59,8 @@ export interface ProviderModelConfig {
59
59
  reasoning: boolean;
60
60
  /** Maps pi thinking levels to provider/model-specific values; null marks a level unsupported. */
61
61
  thinkingLevelMap?: Model<Api>["thinkingLevelMap"];
62
- /** Supported input types. */
63
- input: ("text" | "image")[];
62
+ /** Supported input types. `"pdf"` only on runtimes that can serialize a document block. */
63
+ input: Model<Api>["input"];
64
64
  /** Request pricing, including optional request-wide long-context tiers. */
65
65
  cost: Model<Api>["cost"];
66
66
  /** Default/effective context window size in tokens. */
@@ -1 +1 @@
1
- {"version":3,"file":"provider-types.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/provider-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-types.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/provider-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-types.js","sourceRoot":"","sources":["../../../src/core/extensions/provider-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { RefreshModelsContext } from \"@bastani/pi-ai\";\nimport type {\n\tApi,\n\tAssistantMessageEventStream,\n\tContext,\n\tModel,\n\tOAuthCredentials,\n\tOAuthLoginCallbacks,\n\tSimpleStreamOptions,\n} from \"@bastani/pi-ai/compat\";\nimport type { AtomicProviderCompat } from \"../model-capabilities.ts\";\nimport type { ExtensionAPI } from \"./api-types.ts\";\n\nexport type { AtomicProviderCompat } from \"../model-capabilities.ts\";\n\n/** Configuration for registering a provider via pi.registerProvider(). */\nexport interface ProviderConfig {\n\t/** Display name for the provider in UI. */\n\tname?: string;\n\t/** Base URL for the API endpoint. Required when defining models. */\n\tbaseUrl?: string;\n\t/** API key or environment variable name. Required when defining models (unless oauth provided). */\n\tapiKey?: string;\n\t/** API type. Required at provider or model level when defining models. */\n\tapi?: Api;\n\t/** Optional streamSimple handler for custom APIs. */\n\tstreamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\t/** Custom headers to include in requests. */\n\theaders?: Record<string, string>;\n\t/** If true, adds Authorization: Bearer header with the resolved API key. */\n\tauthHeader?: boolean;\n\t/** Models to register. If provided, replaces all existing models for this provider. */\n\tmodels?: ProviderModelConfig[];\n\t/** Refresh this provider's catalog. Successful results replace its extension-provided models. */\n\trefreshModels?(context: RefreshModelsContext): Promise<ProviderModelConfig[]>;\n\t/** OAuth provider for /login support. The `id` is set automatically from the provider name. */\n\toauth?: {\n\t\t/** Display name for the provider in login UI. */\n\t\tname: string;\n\t\t/** Optional provider-specific login label. */\n\t\tloginLabel?: string;\n\t\t/** Whether the flow accepts a browser callback/manual redirect. */\n\t\tusesCallbackServer?: boolean;\n\t\t/** Run the login flow, return credentials to persist. */\n\t\tlogin(callbacks: OAuthLoginCallbacks, signal: AbortSignal): Promise<OAuthCredentials>;\n\t\t/**\n\t\t * Refresh expired credentials, return updated credentials to persist.\n\t\t * `signal` is the caller's cancellation signal — forward it into the\n\t\t * network call so an aborted refresh is actually abandoned.\n\t\t */\n\t\trefreshToken(credentials: OAuthCredentials, signal: AbortSignal): Promise<OAuthCredentials>;\n\t\t/** Convert credentials to API key string for the provider. */\n\t\tgetApiKey(credentials: OAuthCredentials): string;\n\t\t/** Optional: modify models for this provider (e.g., update baseUrl based on credentials). */\n\t\tmodifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];\n\t};\n}\n\n/** Configuration for a model within a provider. */\nexport interface ProviderModelConfig {\n\t/** Model ID (e.g., \"claude-sonnet-4-20250514\"). */\n\tid: string;\n\t/** Display name (e.g., \"Claude 4 Sonnet\"). */\n\tname: string;\n\t/** API type override for this model. */\n\tapi?: Api;\n\t/** API endpoint URL override for this model. */\n\tbaseUrl?: string;\n\t/** Whether the model supports extended thinking. */\n\treasoning: boolean;\n\t/** Maps pi thinking levels to provider/model-specific values; null marks a level unsupported. */\n\tthinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n\t/** Supported input types. */\n\tinput: (\"text\" | \"image\")[];\n\t/** Request pricing, including optional request-wide long-context tiers. */\n\tcost: Model<Api>[\"cost\"];\n\t/** Default/effective context window size in tokens. */\n\tcontextWindow: number;\n\t/** Maximum output tokens. */\n\tmaxTokens: number;\n\t/** Default sampling parameters merged into OpenAI-compatible request bodies. */\n\tsamplingParams?: Record<string, unknown>;\n\t/** Custom headers for this model. */\n\theaders?: Record<string, string>;\n\t/** Provider capability settings, including Atomic's `supportsGrammarTools` alias. */\n\tcompat?: AtomicProviderCompat;\n}\n\n/** Extension factory function type. Supports both sync and async initialization. */\nexport type ExtensionFactory = (pi: ExtensionAPI) => void | Promise<void>;\n\n/** Inline extension factory, optionally carrying a stable name and display visibility. */\nexport type InlineExtension =\n\t| ExtensionFactory\n\t| { name: string; factory: ExtensionFactory; hidden?: boolean; bundled?: boolean };\n"]}
1
+ {"version":3,"file":"provider-types.js","sourceRoot":"","sources":["../../../src/core/extensions/provider-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { RefreshModelsContext } from \"@bastani/pi-ai\";\nimport type {\n\tApi,\n\tAssistantMessageEventStream,\n\tContext,\n\tModel,\n\tOAuthCredentials,\n\tOAuthLoginCallbacks,\n\tSimpleStreamOptions,\n} from \"@bastani/pi-ai/compat\";\nimport type { AtomicProviderCompat } from \"../model-capabilities.ts\";\nimport type { ExtensionAPI } from \"./api-types.ts\";\n\nexport type { AtomicProviderCompat } from \"../model-capabilities.ts\";\n\n/** Configuration for registering a provider via pi.registerProvider(). */\nexport interface ProviderConfig {\n\t/** Display name for the provider in UI. */\n\tname?: string;\n\t/** Base URL for the API endpoint. Required when defining models. */\n\tbaseUrl?: string;\n\t/** API key or environment variable name. Required when defining models (unless oauth provided). */\n\tapiKey?: string;\n\t/** API type. Required at provider or model level when defining models. */\n\tapi?: Api;\n\t/** Optional streamSimple handler for custom APIs. */\n\tstreamSimple?: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\t/** Custom headers to include in requests. */\n\theaders?: Record<string, string>;\n\t/** If true, adds Authorization: Bearer header with the resolved API key. */\n\tauthHeader?: boolean;\n\t/** Models to register. If provided, replaces all existing models for this provider. */\n\tmodels?: ProviderModelConfig[];\n\t/** Refresh this provider's catalog. Successful results replace its extension-provided models. */\n\trefreshModels?(context: RefreshModelsContext): Promise<ProviderModelConfig[]>;\n\t/** OAuth provider for /login support. The `id` is set automatically from the provider name. */\n\toauth?: {\n\t\t/** Display name for the provider in login UI. */\n\t\tname: string;\n\t\t/** Optional provider-specific login label. */\n\t\tloginLabel?: string;\n\t\t/** Whether the flow accepts a browser callback/manual redirect. */\n\t\tusesCallbackServer?: boolean;\n\t\t/** Run the login flow, return credentials to persist. */\n\t\tlogin(callbacks: OAuthLoginCallbacks, signal: AbortSignal): Promise<OAuthCredentials>;\n\t\t/**\n\t\t * Refresh expired credentials, return updated credentials to persist.\n\t\t * `signal` is the caller's cancellation signal — forward it into the\n\t\t * network call so an aborted refresh is actually abandoned.\n\t\t */\n\t\trefreshToken(credentials: OAuthCredentials, signal: AbortSignal): Promise<OAuthCredentials>;\n\t\t/** Convert credentials to API key string for the provider. */\n\t\tgetApiKey(credentials: OAuthCredentials): string;\n\t\t/** Optional: modify models for this provider (e.g., update baseUrl based on credentials). */\n\t\tmodifyModels?(models: Model<Api>[], credentials: OAuthCredentials): Model<Api>[];\n\t};\n}\n\n/** Configuration for a model within a provider. */\nexport interface ProviderModelConfig {\n\t/** Model ID (e.g., \"claude-sonnet-4-20250514\"). */\n\tid: string;\n\t/** Display name (e.g., \"Claude 4 Sonnet\"). */\n\tname: string;\n\t/** API type override for this model. */\n\tapi?: Api;\n\t/** API endpoint URL override for this model. */\n\tbaseUrl?: string;\n\t/** Whether the model supports extended thinking. */\n\treasoning: boolean;\n\t/** Maps pi thinking levels to provider/model-specific values; null marks a level unsupported. */\n\tthinkingLevelMap?: Model<Api>[\"thinkingLevelMap\"];\n\t/** Supported input types. `\"pdf\"` only on runtimes that can serialize a document block. */\n\tinput: Model<Api>[\"input\"];\n\t/** Request pricing, including optional request-wide long-context tiers. */\n\tcost: Model<Api>[\"cost\"];\n\t/** Default/effective context window size in tokens. */\n\tcontextWindow: number;\n\t/** Maximum output tokens. */\n\tmaxTokens: number;\n\t/** Default sampling parameters merged into OpenAI-compatible request bodies. */\n\tsamplingParams?: Record<string, unknown>;\n\t/** Custom headers for this model. */\n\theaders?: Record<string, string>;\n\t/** Provider capability settings, including Atomic's `supportsGrammarTools` alias. */\n\tcompat?: AtomicProviderCompat;\n}\n\n/** Extension factory function type. Supports both sync and async initialization. */\nexport type ExtensionFactory = (pi: ExtensionAPI) => void | Promise<void>;\n\n/** Inline extension factory, optionally carrying a stable name and display visibility. */\nexport type InlineExtension =\n\t| ExtensionFactory\n\t| { name: string; factory: ExtensionFactory; hidden?: boolean; bundled?: boolean };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runner-shortcuts.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/runner-shortcuts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA6C/D,MAAM,WAAW,2BAA2B;IAC3C,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACzC,WAAW,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED,wBAAgB,yBAAyB,CACxC,UAAU,EAAE,SAAS,EAAE,EACvB,mBAAmB,EAAE,iBAAiB,EACtC,KAAK,EAAE,OAAO,GACZ,2BAA2B,CA0C7B"}
1
+ {"version":3,"file":"runner-shortcuts.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/runner-shortcuts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA4C/D,MAAM,WAAW,2BAA2B;IAC3C,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACzC,WAAW,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED,wBAAgB,yBAAyB,CACxC,UAAU,EAAE,SAAS,EAAE,EACvB,mBAAmB,EAAE,iBAAiB,EACtC,KAAK,EAAE,OAAO,GACZ,2BAA2B,CA0C7B"}
@@ -13,7 +13,6 @@ const RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS = [
13
13
  "app.thinking.toggle",
14
14
  "app.editor.external",
15
15
  "app.message.followUp",
16
- "app.message.copy",
17
16
  "tui.input.submit",
18
17
  "tui.select.confirm",
19
18
  "tui.select.cancel",
@@ -1 +1 @@
1
- {"version":3,"file":"runner-shortcuts.js","sourceRoot":"","sources":["../../../src/core/extensions/runner-shortcuts.ts"],"names":[],"mappings":"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","sourcesContent":["import type { KeyId } from \"@earendil-works/pi-tui\";\nimport type { ResourceDiagnostic } from \"../diagnostics.ts\";\nimport type { KeybindingsConfig } from \"../keybindings.ts\";\nimport type { Extension, ExtensionShortcut } from \"./types.ts\";\n\n// Extension shortcuts compete with canonical keybinding ids from keybindings.json.\n// Only editor-global shortcuts are reserved here. Picker-specific bindings are not.\nconst RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS = [\n\t\"app.interrupt\",\n\t\"app.clear\",\n\t\"app.exit\",\n\t\"app.suspend\",\n\t\"app.thinking.cycle\",\n\t\"app.model.cycleForward\",\n\t\"app.model.cycleBackward\",\n\t\"app.model.select\",\n\t\"app.tools.expand\",\n\t\"app.thinking.toggle\",\n\t\"app.editor.external\",\n\t\"app.message.followUp\",\n\t\"app.message.copy\",\n\t\"tui.input.submit\",\n\t\"tui.select.confirm\",\n\t\"tui.select.cancel\",\n\t\"tui.input.copy\",\n\t\"tui.editor.deleteToLineEnd\",\n] as const;\n\ntype BuiltInKeyBindings = Partial<Record<KeyId, { keybinding: string; restrictOverride: boolean }>>;\n\nconst buildBuiltinKeybindings = (resolvedKeybindings: KeybindingsConfig): BuiltInKeyBindings => {\n\tconst builtinKeybindings = {} as BuiltInKeyBindings;\n\tfor (const [keybinding, keys] of Object.entries(resolvedKeybindings)) {\n\t\tif (keys === undefined) continue;\n\t\tconst keyList = Array.isArray(keys) ? keys : [keys];\n\t\tconst restrictOverride = (RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS as readonly string[]).includes(keybinding);\n\t\tfor (const key of keyList) {\n\t\t\tconst normalizedKey = key.toLowerCase() as KeyId;\n\t\t\t// If multiple actions bind the same key, the reserved action wins so extensions\n\t\t\t// remain blocked by reserved shortcuts regardless of iteration order.\n\t\t\tconst existing = builtinKeybindings[normalizedKey];\n\t\t\tif (existing?.restrictOverride && !restrictOverride) continue;\n\t\t\tbuiltinKeybindings[normalizedKey] = { keybinding, restrictOverride };\n\t\t}\n\t}\n\treturn builtinKeybindings;\n};\n\nexport interface ExtensionShortcutResolution {\n\tshortcuts: Map<KeyId, ExtensionShortcut>;\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nexport function resolveExtensionShortcuts(\n\textensions: Extension[],\n\tresolvedKeybindings: KeybindingsConfig,\n\thasUI: boolean,\n): ExtensionShortcutResolution {\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tconst builtinKeybindings = buildBuiltinKeybindings(resolvedKeybindings);\n\tconst extensionShortcuts = new Map<KeyId, ExtensionShortcut>();\n\n\tconst addDiagnostic = (message: string, extensionPath: string) => {\n\t\tdiagnostics.push({ type: \"warning\", message, path: extensionPath });\n\t\tif (!hasUI) {\n\t\t\tconsole.warn(message);\n\t\t}\n\t};\n\n\tfor (const ext of extensions) {\n\t\tfor (const [key, shortcut] of ext.shortcuts) {\n\t\t\tconst normalizedKey = key.toLowerCase() as KeyId;\n\t\t\tconst builtInKeybinding = builtinKeybindings[normalizedKey];\n\t\t\tif (builtInKeybinding?.restrictOverride === true) {\n\t\t\t\taddDiagnostic(\n\t\t\t\t\t`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,\n\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (builtInKeybinding?.restrictOverride === false) {\n\t\t\t\taddDiagnostic(\n\t\t\t\t\t`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,\n\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst existingExtensionShortcut = extensionShortcuts.get(normalizedKey);\n\t\t\tif (existingExtensionShortcut) {\n\t\t\t\taddDiagnostic(\n\t\t\t\t\t`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,\n\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t);\n\t\t\t}\n\t\t\textensionShortcuts.set(normalizedKey, shortcut);\n\t\t}\n\t}\n\treturn { shortcuts: extensionShortcuts, diagnostics };\n}\n"]}
1
+ {"version":3,"file":"runner-shortcuts.js","sourceRoot":"","sources":["../../../src/core/extensions/runner-shortcuts.ts"],"names":[],"mappings":"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","sourcesContent":["import type { KeyId } from \"@earendil-works/pi-tui\";\nimport type { ResourceDiagnostic } from \"../diagnostics.ts\";\nimport type { KeybindingsConfig } from \"../keybindings.ts\";\nimport type { Extension, ExtensionShortcut } from \"./types.ts\";\n\n// Extension shortcuts compete with canonical keybinding ids from keybindings.json.\n// Only editor-global shortcuts are reserved here. Picker-specific bindings are not.\nconst RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS = [\n\t\"app.interrupt\",\n\t\"app.clear\",\n\t\"app.exit\",\n\t\"app.suspend\",\n\t\"app.thinking.cycle\",\n\t\"app.model.cycleForward\",\n\t\"app.model.cycleBackward\",\n\t\"app.model.select\",\n\t\"app.tools.expand\",\n\t\"app.thinking.toggle\",\n\t\"app.editor.external\",\n\t\"app.message.followUp\",\n\t\"tui.input.submit\",\n\t\"tui.select.confirm\",\n\t\"tui.select.cancel\",\n\t\"tui.input.copy\",\n\t\"tui.editor.deleteToLineEnd\",\n] as const;\n\ntype BuiltInKeyBindings = Partial<Record<KeyId, { keybinding: string; restrictOverride: boolean }>>;\n\nconst buildBuiltinKeybindings = (resolvedKeybindings: KeybindingsConfig): BuiltInKeyBindings => {\n\tconst builtinKeybindings = {} as BuiltInKeyBindings;\n\tfor (const [keybinding, keys] of Object.entries(resolvedKeybindings)) {\n\t\tif (keys === undefined) continue;\n\t\tconst keyList = Array.isArray(keys) ? keys : [keys];\n\t\tconst restrictOverride = (RESERVED_KEYBINDINGS_FOR_EXTENSION_CONFLICTS as readonly string[]).includes(keybinding);\n\t\tfor (const key of keyList) {\n\t\t\tconst normalizedKey = key.toLowerCase() as KeyId;\n\t\t\t// If multiple actions bind the same key, the reserved action wins so extensions\n\t\t\t// remain blocked by reserved shortcuts regardless of iteration order.\n\t\t\tconst existing = builtinKeybindings[normalizedKey];\n\t\t\tif (existing?.restrictOverride && !restrictOverride) continue;\n\t\t\tbuiltinKeybindings[normalizedKey] = { keybinding, restrictOverride };\n\t\t}\n\t}\n\treturn builtinKeybindings;\n};\n\nexport interface ExtensionShortcutResolution {\n\tshortcuts: Map<KeyId, ExtensionShortcut>;\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nexport function resolveExtensionShortcuts(\n\textensions: Extension[],\n\tresolvedKeybindings: KeybindingsConfig,\n\thasUI: boolean,\n): ExtensionShortcutResolution {\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\tconst builtinKeybindings = buildBuiltinKeybindings(resolvedKeybindings);\n\tconst extensionShortcuts = new Map<KeyId, ExtensionShortcut>();\n\n\tconst addDiagnostic = (message: string, extensionPath: string) => {\n\t\tdiagnostics.push({ type: \"warning\", message, path: extensionPath });\n\t\tif (!hasUI) {\n\t\t\tconsole.warn(message);\n\t\t}\n\t};\n\n\tfor (const ext of extensions) {\n\t\tfor (const [key, shortcut] of ext.shortcuts) {\n\t\t\tconst normalizedKey = key.toLowerCase() as KeyId;\n\t\t\tconst builtInKeybinding = builtinKeybindings[normalizedKey];\n\t\t\tif (builtInKeybinding?.restrictOverride === true) {\n\t\t\t\taddDiagnostic(\n\t\t\t\t\t`Extension shortcut '${key}' from ${shortcut.extensionPath} conflicts with built-in shortcut. Skipping.`,\n\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (builtInKeybinding?.restrictOverride === false) {\n\t\t\t\taddDiagnostic(\n\t\t\t\t\t`Extension shortcut conflict: '${key}' is built-in shortcut for ${builtInKeybinding.keybinding} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,\n\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst existingExtensionShortcut = extensionShortcuts.get(normalizedKey);\n\t\t\tif (existingExtensionShortcut) {\n\t\t\t\taddDiagnostic(\n\t\t\t\t\t`Extension shortcut conflict: '${key}' registered by both ${existingExtensionShortcut.extensionPath} and ${shortcut.extensionPath}. Using ${shortcut.extensionPath}.`,\n\t\t\t\t\tshortcut.extensionPath,\n\t\t\t\t);\n\t\t\t}\n\t\t\textensionShortcuts.set(normalizedKey, shortcut);\n\t\t}\n\t}\n\treturn { shortcuts: extensionShortcuts, diagnostics };\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export declare const CODEX_FAST_ROUTE_ORIGINATOR = "codex_cli_rs";
2
+ export declare const CODEX_FAST_ROUTE_HEADER = "x-codex-routing-hint";
3
+ export declare function isFirstPartyCodexHost(input: string | URL | Request): boolean;
4
+ export declare function isFirstPartyCodexBaseUrl(input: string | URL | Request): boolean;
5
+ export declare function isFirstPartyCodexEndpoint(input: string | URL | Request): boolean;
6
+ export declare function markCodexFastRouteRequest(headers: Record<string, string | null>, priority: boolean): void;
7
+ export declare function clearCodexFastRouteRequestMarker(headers: Record<string, string | null>): void;
8
+ export declare function forceCodexFastRouteOriginator(_endpoint: string | URL | Request, headersInit: HeadersInit | undefined): Headers;
9
+ export declare function wrapCodexFastRouteFetch(fetchImplementation: typeof globalThis.fetch): typeof globalThis.fetch;
10
+ export declare function wrapCodexFastRouteWebSocket(WebSocketImplementation: typeof globalThis.WebSocket): typeof globalThis.WebSocket;
11
+ export declare function installCodexFastRouteWebSocketIdentity(): void;
12
+ //# sourceMappingURL=fast-model-routing-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-model-routing-transport.d.ts","sourceRoot":"","sources":["../../src/core/fast-model-routing-transport.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAC1D,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAkB9D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAG5E;AACD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAK/E;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,CAOhF;AAaD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAIzG;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAI7F;AAED,wBAAgB,6BAA6B,CAC5C,SAAS,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EACjC,WAAW,EAAE,WAAW,GAAG,SAAS,GAClC,OAAO,CAWT;AAED,wBAAgB,uBAAuB,CAAC,mBAAmB,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,OAAO,UAAU,CAAC,KAAK,CAc7G;AAUD,wBAAgB,2BAA2B,CAC1C,uBAAuB,EAAE,OAAO,UAAU,CAAC,SAAS,GAClD,OAAO,UAAU,CAAC,SAAS,CA6B7B;AAED,wBAAgB,sCAAsC,IAAI,IAAI,CAG7D"}
@@ -1,8 +1,8 @@
1
- export const CODEX_FAST_MODE_ORIGINATOR = "codex_cli_rs";
2
- export const CODEX_FAST_MODE_ROUTING_HEADER = "x-codex-routing-hint";
3
- const CODEX_FAST_MODE_REQUEST_MARKER_HEADER = "x-atomic-codex-fast-mode";
4
- const CODEX_FAST_MODE_PRIORITY_MARKER_VALUE = "priority";
5
- const CODEX_FAST_MODE_NORMAL_MARKER_VALUE = "normal";
1
+ export const CODEX_FAST_ROUTE_ORIGINATOR = "codex_cli_rs";
2
+ export const CODEX_FAST_ROUTE_HEADER = "x-codex-routing-hint";
3
+ const CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER = "x-atomic-codex-fast-route";
4
+ const CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE = "priority";
5
+ const CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE = "normal";
6
6
  const CODEX_BACKEND_HOSTS = new Set(["chatgpt.com", "chat.openai.com"]);
7
7
  const wrappedWebSockets = new WeakMap();
8
8
  const installedWebSocketWrappers = new WeakSet();
@@ -34,40 +34,40 @@ export function isFirstPartyCodexEndpoint(input) {
34
34
  url.pathname.replace(/\/+$/u, "") === "/backend-api/codex/responses");
35
35
  }
36
36
  function hasCodexPriorityRoutingHint(headers) {
37
- return headers.get(CODEX_FAST_MODE_ROUTING_HEADER)?.endsWith(";tier=priority") === true;
37
+ return headers.get(CODEX_FAST_ROUTE_HEADER)?.endsWith(";tier=priority") === true;
38
38
  }
39
- function codexFastModeRequestMarker(headers) {
40
- const marker = headers.get(CODEX_FAST_MODE_REQUEST_MARKER_HEADER);
41
- return marker === CODEX_FAST_MODE_PRIORITY_MARKER_VALUE || marker === CODEX_FAST_MODE_NORMAL_MARKER_VALUE
39
+ function codexFastRouteRequestMarker(headers) {
40
+ const marker = headers.get(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);
41
+ return marker === CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE || marker === CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE
42
42
  ? marker
43
43
  : undefined;
44
44
  }
45
- export function markCodexFastModeRequest(headers, priority) {
46
- headers[CODEX_FAST_MODE_REQUEST_MARKER_HEADER] = priority
47
- ? CODEX_FAST_MODE_PRIORITY_MARKER_VALUE
48
- : CODEX_FAST_MODE_NORMAL_MARKER_VALUE;
45
+ export function markCodexFastRouteRequest(headers, priority) {
46
+ headers[CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER] = priority
47
+ ? CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE
48
+ : CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE;
49
49
  }
50
- export function clearCodexFastModeRequestMarker(headers) {
50
+ export function clearCodexFastRouteRequestMarker(headers) {
51
51
  for (const name of Object.keys(headers)) {
52
- if (name.toLowerCase() === CODEX_FAST_MODE_REQUEST_MARKER_HEADER)
52
+ if (name.toLowerCase() === CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER)
53
53
  delete headers[name];
54
54
  }
55
55
  }
56
- export function forceCodexFastModeOriginator(_endpoint, headersInit) {
56
+ export function forceCodexFastRouteOriginator(_endpoint, headersInit) {
57
57
  const headers = new Headers(headersInit);
58
- const marker = codexFastModeRequestMarker(headers);
59
- headers.delete(CODEX_FAST_MODE_REQUEST_MARKER_HEADER);
58
+ const marker = codexFastRouteRequestMarker(headers);
59
+ headers.delete(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);
60
60
  if (marker === "priority" && hasCodexPriorityRoutingHint(headers)) {
61
- headers.set("originator", CODEX_FAST_MODE_ORIGINATOR);
61
+ headers.set("originator", CODEX_FAST_ROUTE_ORIGINATOR);
62
62
  }
63
63
  else if (marker !== undefined) {
64
- headers.delete(CODEX_FAST_MODE_ROUTING_HEADER);
65
- if (headers.get("originator") === CODEX_FAST_MODE_ORIGINATOR)
64
+ headers.delete(CODEX_FAST_ROUTE_HEADER);
65
+ if (headers.get("originator") === CODEX_FAST_ROUTE_ORIGINATOR)
66
66
  headers.set("originator", "pi");
67
67
  }
68
68
  return headers;
69
69
  }
70
- export function wrapCodexFastModeFetch(fetchImplementation) {
70
+ export function wrapCodexFastRouteFetch(fetchImplementation) {
71
71
  return new Proxy(fetchImplementation, {
72
72
  apply(target, thisArg, args) {
73
73
  const [input, init] = args;
@@ -77,7 +77,7 @@ export function wrapCodexFastModeFetch(fetchImplementation) {
77
77
  input,
78
78
  {
79
79
  ...init,
80
- headers: forceCodexFastModeOriginator(input, init.headers),
80
+ headers: forceCodexFastRouteOriginator(input, init.headers),
81
81
  },
82
82
  ]);
83
83
  },
@@ -91,7 +91,7 @@ function findWebSocketOptionsIndex(args) {
91
91
  }
92
92
  return undefined;
93
93
  }
94
- export function wrapCodexFastModeWebSocket(WebSocketImplementation) {
94
+ export function wrapCodexFastRouteWebSocket(WebSocketImplementation) {
95
95
  if (installedWebSocketWrappers.has(WebSocketImplementation))
96
96
  return WebSocketImplementation;
97
97
  const existing = wrappedWebSockets.get(WebSocketImplementation);
@@ -106,14 +106,14 @@ export function wrapCodexFastModeWebSocket(WebSocketImplementation) {
106
106
  }
107
107
  const candidateOptions = args[optionsIndex];
108
108
  const candidateHeaders = new Headers(candidateOptions.headers);
109
- if (codexFastModeRequestMarker(candidateHeaders) === undefined) {
109
+ if (codexFastRouteRequestMarker(candidateHeaders) === undefined) {
110
110
  return Reflect.construct(target, args, newTarget);
111
111
  }
112
112
  const options = candidateOptions;
113
113
  const nextArgs = [...args];
114
114
  nextArgs[optionsIndex] = {
115
115
  ...options,
116
- headers: forceCodexFastModeOriginator(endpoint, options.headers),
116
+ headers: forceCodexFastRouteOriginator(endpoint, options.headers),
117
117
  };
118
118
  return Reflect.construct(target, nextArgs, newTarget);
119
119
  },
@@ -122,9 +122,9 @@ export function wrapCodexFastModeWebSocket(WebSocketImplementation) {
122
122
  installedWebSocketWrappers.add(wrapped);
123
123
  return wrapped;
124
124
  }
125
- export function installCodexFastModeWebSocketIdentity() {
125
+ export function installCodexFastRouteWebSocketIdentity() {
126
126
  if (typeof globalThis.WebSocket !== "function")
127
127
  return;
128
- globalThis.WebSocket = wrapCodexFastModeWebSocket(globalThis.WebSocket);
128
+ globalThis.WebSocket = wrapCodexFastRouteWebSocket(globalThis.WebSocket);
129
129
  }
130
- //# sourceMappingURL=codex-fast-mode-transport.js.map
130
+ //# sourceMappingURL=fast-model-routing-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-model-routing-transport.js","sourceRoot":"","sources":["../../src/core/fast-model-routing-transport.ts"],"names":[],"mappings":"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","sourcesContent":["export const CODEX_FAST_ROUTE_ORIGINATOR = \"codex_cli_rs\";\nexport const CODEX_FAST_ROUTE_HEADER = \"x-codex-routing-hint\";\nconst CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER = \"x-atomic-codex-fast-route\";\nconst CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE = \"priority\";\nconst CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE = \"normal\";\n\nconst CODEX_BACKEND_HOSTS = new Set([\"chatgpt.com\", \"chat.openai.com\"]);\nconst wrappedWebSockets = new WeakMap<typeof globalThis.WebSocket, typeof globalThis.WebSocket>();\nconst installedWebSocketWrappers = new WeakSet<typeof globalThis.WebSocket>();\n\nfunction requestUrl(input: string | URL | Request): URL | undefined {\n\ttry {\n\t\tif (typeof input === \"string\" || input instanceof URL) return new URL(input);\n\t\treturn new URL(input.url);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function isFirstPartyCodexHost(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\treturn url !== undefined && CODEX_BACKEND_HOSTS.has(url.hostname.toLowerCase());\n}\nexport function isFirstPartyCodexBaseUrl(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\tif (url === undefined || !isFirstPartyCodexHost(url)) return false;\n\tconst path = url.pathname.replace(/\\/+$/u, \"\");\n\treturn path === \"/backend-api\" || path === \"/backend-api/codex\" || path === \"/backend-api/codex/responses\";\n}\n\nexport function isFirstPartyCodexEndpoint(input: string | URL | Request): boolean {\n\tconst url = requestUrl(input);\n\treturn (\n\t\turl !== undefined &&\n\t\tisFirstPartyCodexHost(url) &&\n\t\turl.pathname.replace(/\\/+$/u, \"\") === \"/backend-api/codex/responses\"\n\t);\n}\n\nfunction hasCodexPriorityRoutingHint(headers: Headers): boolean {\n\treturn headers.get(CODEX_FAST_ROUTE_HEADER)?.endsWith(\";tier=priority\") === true;\n}\n\nfunction codexFastRouteRequestMarker(headers: Headers): \"normal\" | \"priority\" | undefined {\n\tconst marker = headers.get(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);\n\treturn marker === CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE || marker === CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE\n\t\t? marker\n\t\t: undefined;\n}\n\nexport function markCodexFastRouteRequest(headers: Record<string, string | null>, priority: boolean): void {\n\theaders[CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER] = priority\n\t\t? CODEX_FAST_ROUTE_PRIORITY_MARKER_VALUE\n\t\t: CODEX_FAST_ROUTE_NORMAL_MARKER_VALUE;\n}\n\nexport function clearCodexFastRouteRequestMarker(headers: Record<string, string | null>): void {\n\tfor (const name of Object.keys(headers)) {\n\t\tif (name.toLowerCase() === CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER) delete headers[name];\n\t}\n}\n\nexport function forceCodexFastRouteOriginator(\n\t_endpoint: string | URL | Request,\n\theadersInit: HeadersInit | undefined,\n): Headers {\n\tconst headers = new Headers(headersInit);\n\tconst marker = codexFastRouteRequestMarker(headers);\n\theaders.delete(CODEX_FAST_ROUTE_REQUEST_MARKER_HEADER);\n\tif (marker === \"priority\" && hasCodexPriorityRoutingHint(headers)) {\n\t\theaders.set(\"originator\", CODEX_FAST_ROUTE_ORIGINATOR);\n\t} else if (marker !== undefined) {\n\t\theaders.delete(CODEX_FAST_ROUTE_HEADER);\n\t\tif (headers.get(\"originator\") === CODEX_FAST_ROUTE_ORIGINATOR) headers.set(\"originator\", \"pi\");\n\t}\n\treturn headers;\n}\n\nexport function wrapCodexFastRouteFetch(fetchImplementation: typeof globalThis.fetch): typeof globalThis.fetch {\n\treturn new Proxy(fetchImplementation, {\n\t\tapply(target, thisArg, args: Parameters<typeof globalThis.fetch>) {\n\t\t\tconst [input, init] = args;\n\t\t\tif (!init?.headers) return Reflect.apply(target, thisArg, args);\n\t\t\treturn Reflect.apply(target, thisArg, [\n\t\t\t\tinput,\n\t\t\t\t{\n\t\t\t\t\t...init,\n\t\t\t\t\theaders: forceCodexFastRouteOriginator(input, init.headers),\n\t\t\t\t},\n\t\t\t]);\n\t\t},\n\t});\n}\n\nfunction findWebSocketOptionsIndex(args: readonly unknown[]): number | undefined {\n\tfor (let index = 1; index < args.length; index += 1) {\n\t\tconst value = args[index];\n\t\tif (typeof value === \"object\" && value !== null && \"headers\" in value) return index;\n\t}\n\treturn undefined;\n}\n\nexport function wrapCodexFastRouteWebSocket(\n\tWebSocketImplementation: typeof globalThis.WebSocket,\n): typeof globalThis.WebSocket {\n\tif (installedWebSocketWrappers.has(WebSocketImplementation)) return WebSocketImplementation;\n\tconst existing = wrappedWebSockets.get(WebSocketImplementation);\n\tif (existing !== undefined) return existing;\n\n\tconst wrapped = new Proxy(WebSocketImplementation, {\n\t\tconstruct(target, args, newTarget) {\n\t\t\tconst endpoint = args[0];\n\t\t\tconst optionsIndex = findWebSocketOptionsIndex(args);\n\t\t\tif ((typeof endpoint !== \"string\" && !(endpoint instanceof URL)) || optionsIndex === undefined) {\n\t\t\t\treturn Reflect.construct(target, args, newTarget);\n\t\t\t}\n\t\t\tconst candidateOptions = args[optionsIndex] as { headers?: HeadersInit };\n\t\t\tconst candidateHeaders = new Headers(candidateOptions.headers);\n\t\t\tif (codexFastRouteRequestMarker(candidateHeaders) === undefined) {\n\t\t\t\treturn Reflect.construct(target, args, newTarget);\n\t\t\t}\n\t\t\tconst options = candidateOptions;\n\t\t\tconst nextArgs = [...args];\n\t\t\tnextArgs[optionsIndex] = {\n\t\t\t\t...options,\n\t\t\t\theaders: forceCodexFastRouteOriginator(endpoint, options.headers),\n\t\t\t};\n\t\t\treturn Reflect.construct(target, nextArgs, newTarget);\n\t\t},\n\t}) as typeof globalThis.WebSocket;\n\twrappedWebSockets.set(WebSocketImplementation, wrapped);\n\tinstalledWebSocketWrappers.add(wrapped);\n\treturn wrapped;\n}\n\nexport function installCodexFastRouteWebSocketIdentity(): void {\n\tif (typeof globalThis.WebSocket !== \"function\") return;\n\tglobalThis.WebSocket = wrapCodexFastRouteWebSocket(globalThis.WebSocket);\n}\n"]}
@@ -0,0 +1,57 @@
1
+ import { closeOpenAICodexWebSocketSessions } from "@bastani/pi-ai/api/openai-codex-responses";
2
+ import { type Api, type AssistantMessageEventStream, type Context, type Model, type ModelFastRoute, type OpenAICodexResponsesOptions, type OpenAIResponsesOptions, type ProviderHeaders, type SimpleStreamOptions, type StreamOptions, type ThinkingLevel } from "@bastani/pi-ai/compat";
3
+ import { FAST_MODEL_SERVICE_TIER } from "./fast-model-variants.ts";
4
+ export interface FastRouteStreamOptions extends SimpleStreamOptions {
5
+ serviceTier?: typeof FAST_MODEL_SERVICE_TIER;
6
+ }
7
+ export interface FastRouteStreamers {
8
+ streamSimple: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;
9
+ streamOpenAIResponses: (model: Model<"openai-responses">, context: Context, options?: OpenAIResponsesOptions) => AssistantMessageEventStream;
10
+ streamOpenAICodexResponses: (model: Model<"openai-codex-responses">, context: Context, options?: OpenAICodexResponsesOptions) => AssistantMessageEventStream;
11
+ }
12
+ /**
13
+ * Explicit route metadata is the only source of fast semantics. A model whose ID merely ends in
14
+ * `-fast` — a provider, `models.json`, or extension model that owns that exact ID — routes normally.
15
+ */
16
+ export declare function getModelFastRoute(model: Pick<Model<Api>, "fastRoute">): ModelFastRoute | undefined;
17
+ /**
18
+ * The model ID this request sends upstream. An OpenAI-style fast route sends the base model and
19
+ * carries a priority service tier instead; a provider with real fast siblings sends its own
20
+ * advertised ID, which is already the canonical one. The canonical `-fast` identity always stays on
21
+ * the model object Atomic selected, persisted, and records — only the serialized request differs.
22
+ */
23
+ export declare function resolveUpstreamModelId(model: Pick<Model<Api>, "fastRoute" | "id">): string;
24
+ /**
25
+ * Whether a model uses the first-party OpenAI Codex provider identity and endpoint.
26
+ * A renamed provider on the same protocol remains non-first-party.
27
+ */
28
+ export declare function usesFirstPartyCodexRouting(model: Pick<Model<Api>, "baseUrl" | "provider">): boolean;
29
+ /** A provider alias or proxy still uses the shared ChatGPT Codex protocol when its API does. */
30
+ export declare function usesChatGptCodexTransport(model: Pick<Model<Api>, "api">): boolean;
31
+ /**
32
+ * Eager first-party routing headers for a model that carries an OpenAI-style fast route.
33
+ *
34
+ * Derived entirely from the model: the headers are added only when the model's own `fastRoute`
35
+ * declares the priority tier and the model uses first-party Codex routing, and the hint names the
36
+ * route's upstream model ID — the same value the request serializes and
37
+ * `withChatGptCodexTransportRouting` reads from route metadata. There is no caller-supplied enable
38
+ * flag, so a model without a route can never be granted this identity.
39
+ */
40
+ export declare function withCodexFastRouteHeaders(model: Pick<Model<Api>, "baseUrl" | "fastRoute" | "id" | "provider">, headers: ProviderHeaders | undefined): ProviderHeaders | undefined;
41
+ /** Attach the route's service tier to the outgoing stream options. */
42
+ export declare function withFastRouteStreamOptions(fastRoute: ModelFastRoute | undefined, options: SimpleStreamOptions | undefined): FastRouteStreamOptions | undefined;
43
+ /** A service-tier route needs pi-ai's native adapters; `streamSimple` drops `serviceTier`. */
44
+ export declare function shouldUseNativeFastRoute(model: Pick<Model<Api>, "api">, options: FastRouteStreamOptions | undefined): boolean;
45
+ type CloseCodexWebSocketSessions = typeof closeOpenAICodexWebSocketSessions;
46
+ export declare function withChatGptCodexTransportRouting<TOptions extends StreamOptions>(model: Model<Api>, options: TOptions, closeWebSocketSessions?: CloseCodexWebSocketSessions): TOptions;
47
+ export declare function mapFastRouteReasoningEffort(model: Model<Api>, reasoning: ThinkingLevel | undefined): ThinkingLevel | undefined;
48
+ export declare function buildOpenAIResponsesFastRouteOptions(model: Model<Api>, options: FastRouteStreamOptions | undefined): OpenAIResponsesOptions;
49
+ export declare function buildOpenAICodexResponsesFastRouteOptions(model: Model<Api>, options: FastRouteStreamOptions | undefined): OpenAICodexResponsesOptions;
50
+ /**
51
+ * Stream a request whose canonical selected model carries fast-route metadata. The provider adapter
52
+ * translates only the serialized request to the route's upstream ID; the model object keeps its
53
+ * canonical `-fast` identity.
54
+ */
55
+ export declare function streamWithFastRoute(model: Model<Api>, context: Context, options: FastRouteStreamOptions | undefined, streamers?: FastRouteStreamers): AssistantMessageEventStream;
56
+ export {};
57
+ //# sourceMappingURL=fast-model-routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-model-routing.d.ts","sourceRoot":"","sources":["../../src/core/fast-model-routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ import { closeOpenAICodexWebSocketSessions } from "@bastani/pi-ai/api/openai-codex-responses";
2
+ import { clampThinkingLevel, streamOpenAICodexResponses, streamOpenAIResponses, streamSimple, } from "@bastani/pi-ai/compat";
3
+ import { CODEX_FAST_ROUTE_HEADER, CODEX_FAST_ROUTE_ORIGINATOR, clearCodexFastRouteRequestMarker, installCodexFastRouteWebSocketIdentity, isFirstPartyCodexBaseUrl, markCodexFastRouteRequest, wrapCodexFastRouteFetch, } from "./fast-model-routing-transport.js";
4
+ import { FAST_MODEL_SERVICE_TIER, isNativeFastRouteApi } from "./fast-model-variants.js";
5
+ const DEFAULT_FAST_ROUTE_STREAMERS = {
6
+ streamSimple,
7
+ streamOpenAIResponses,
8
+ streamOpenAICodexResponses,
9
+ };
10
+ const CODEX_WEBSOCKET_ROUTING_STATE_IDLE_MS = 6 * 60 * 1000;
11
+ const codexWebSocketRoutingState = new Map();
12
+ /**
13
+ * Explicit route metadata is the only source of fast semantics. A model whose ID merely ends in
14
+ * `-fast` — a provider, `models.json`, or extension model that owns that exact ID — routes normally.
15
+ */
16
+ export function getModelFastRoute(model) {
17
+ return model.fastRoute;
18
+ }
19
+ /**
20
+ * The model ID this request sends upstream. An OpenAI-style fast route sends the base model and
21
+ * carries a priority service tier instead; a provider with real fast siblings sends its own
22
+ * advertised ID, which is already the canonical one. The canonical `-fast` identity always stays on
23
+ * the model object Atomic selected, persisted, and records — only the serialized request differs.
24
+ */
25
+ export function resolveUpstreamModelId(model) {
26
+ return model.fastRoute?.upstreamModelId ?? model.id;
27
+ }
28
+ /**
29
+ * Whether a model uses the first-party OpenAI Codex provider identity and endpoint.
30
+ * A renamed provider on the same protocol remains non-first-party.
31
+ */
32
+ export function usesFirstPartyCodexRouting(model) {
33
+ return model.provider === "openai-codex" && isFirstPartyCodexBaseUrl(model.baseUrl);
34
+ }
35
+ /** A provider alias or proxy still uses the shared ChatGPT Codex protocol when its API does. */
36
+ export function usesChatGptCodexTransport(model) {
37
+ return model.api === "openai-codex-responses";
38
+ }
39
+ function deleteHeader(headers, name) {
40
+ for (const existingName of Object.keys(headers)) {
41
+ if (existingName.toLowerCase() === name.toLowerCase())
42
+ delete headers[existingName];
43
+ }
44
+ }
45
+ function setHeader(headers, name, value) {
46
+ deleteHeader(headers, name);
47
+ headers[name] = value;
48
+ }
49
+ /**
50
+ * Eager first-party routing headers for a model that carries an OpenAI-style fast route.
51
+ *
52
+ * Derived entirely from the model: the headers are added only when the model's own `fastRoute`
53
+ * declares the priority tier and the model uses first-party Codex routing, and the hint names the
54
+ * route's upstream model ID — the same value the request serializes and
55
+ * `withChatGptCodexTransportRouting` reads from route metadata. There is no caller-supplied enable
56
+ * flag, so a model without a route can never be granted this identity.
57
+ */
58
+ export function withCodexFastRouteHeaders(model, headers) {
59
+ if (getModelFastRoute(model)?.serviceTier !== FAST_MODEL_SERVICE_TIER || !usesFirstPartyCodexRouting(model)) {
60
+ return headers;
61
+ }
62
+ const fastHeaders = { ...(headers ?? {}) };
63
+ setHeader(fastHeaders, "originator", CODEX_FAST_ROUTE_ORIGINATOR);
64
+ setHeader(fastHeaders, CODEX_FAST_ROUTE_HEADER, `model=${resolveUpstreamModelId(model)};tier=${FAST_MODEL_SERVICE_TIER}`);
65
+ return fastHeaders;
66
+ }
67
+ /** Attach the route's service tier to the outgoing stream options. */
68
+ export function withFastRouteStreamOptions(fastRoute, options) {
69
+ if (fastRoute?.serviceTier === undefined)
70
+ return options;
71
+ return { ...(options ?? {}), headers: options?.headers, serviceTier: fastRoute.serviceTier };
72
+ }
73
+ /** A service-tier route needs pi-ai's native adapters; `streamSimple` drops `serviceTier`. */
74
+ export function shouldUseNativeFastRoute(model, options) {
75
+ return isNativeFastRouteApi(model.api) && options?.serviceTier === FAST_MODEL_SERVICE_TIER;
76
+ }
77
+ function codexEnvironmentScope(env) {
78
+ if (!env)
79
+ return "none";
80
+ const serialized = JSON.stringify(Object.entries(env).sort(([left], [right]) => left.localeCompare(right)));
81
+ let hash = 2166136261;
82
+ for (let index = 0; index < serialized.length; index += 1) {
83
+ hash = Math.imul(hash ^ serialized.charCodeAt(index), 16777619);
84
+ }
85
+ return (hash >>> 0).toString(16);
86
+ }
87
+ function updateCodexWebSocketRoutingState(model, routedModel, options, priority, closeWebSocketSessions) {
88
+ if (options.transport === "sse" || !options.sessionId)
89
+ return;
90
+ const signature = `${model.provider}\0${model.baseUrl}\0${codexEnvironmentScope(options.env)}\0${priority ? `priority:${routedModel}` : "normal"}`;
91
+ const previous = codexWebSocketRoutingState.get(options.sessionId);
92
+ if (previous?.signature !== undefined && previous.signature !== signature) {
93
+ closeWebSocketSessions(options.sessionId);
94
+ }
95
+ if (previous)
96
+ clearTimeout(previous.expiry);
97
+ const expiry = setTimeout(() => {
98
+ if (codexWebSocketRoutingState.get(options.sessionId)?.signature === signature) {
99
+ codexWebSocketRoutingState.delete(options.sessionId);
100
+ }
101
+ }, CODEX_WEBSOCKET_ROUTING_STATE_IDLE_MS);
102
+ expiry.unref?.();
103
+ codexWebSocketRoutingState.set(options.sessionId, { signature, expiry });
104
+ }
105
+ export function withChatGptCodexTransportRouting(model, options, closeWebSocketSessions = closeOpenAICodexWebSocketSessions) {
106
+ const headers = { ...(options.headers ?? {}) };
107
+ const onPayload = options.onPayload;
108
+ const priority = getModelFastRoute(model)?.serviceTier === FAST_MODEL_SERVICE_TIER && usesFirstPartyCodexRouting(model);
109
+ const routedModel = resolveUpstreamModelId(model);
110
+ return {
111
+ ...options,
112
+ headers,
113
+ fetch: wrapCodexFastRouteFetch(options.fetch ?? globalThis.fetch),
114
+ onPayload: async (payload, requestModel) => {
115
+ const replacement = await onPayload?.(payload, requestModel);
116
+ const finalPayload = replacement === undefined ? payload : replacement;
117
+ deleteHeader(headers, CODEX_FAST_ROUTE_HEADER);
118
+ clearCodexFastRouteRequestMarker(headers);
119
+ if (priority) {
120
+ setHeader(headers, CODEX_FAST_ROUTE_HEADER, `model=${routedModel};tier=${FAST_MODEL_SERVICE_TIER}`);
121
+ }
122
+ else {
123
+ for (const [name, value] of Object.entries(headers)) {
124
+ if (name.toLowerCase() === "originator" && value === CODEX_FAST_ROUTE_ORIGINATOR)
125
+ delete headers[name];
126
+ }
127
+ }
128
+ markCodexFastRouteRequest(headers, priority);
129
+ updateCodexWebSocketRoutingState(model, routedModel, options, priority, closeWebSocketSessions);
130
+ return finalPayload;
131
+ },
132
+ };
133
+ }
134
+ function buildFastRouteBaseProviderOptions(model, options) {
135
+ // Native fast-route streams bypass pi-ai's streamSimple base-options merge.
136
+ const samplingParams = model.samplingParams || options?.samplingParams
137
+ ? { ...model.samplingParams, ...options?.samplingParams }
138
+ : undefined;
139
+ const providerOptions = {
140
+ samplingParams,
141
+ temperature: options?.temperature,
142
+ maxTokens: options?.maxTokens,
143
+ signal: options?.signal,
144
+ apiKey: options?.apiKey,
145
+ fetch: options?.fetch,
146
+ env: options?.env,
147
+ telemetryContext: options?.telemetryContext,
148
+ transport: options?.transport,
149
+ cacheRetention: options?.cacheRetention,
150
+ sessionId: options?.sessionId,
151
+ onPayload: options?.onPayload,
152
+ onResponse: options?.onResponse,
153
+ headers: options?.headers,
154
+ timeoutMs: options?.timeoutMs,
155
+ websocketConnectTimeoutMs: options?.websocketConnectTimeoutMs,
156
+ streamDeadlineMs: options?.streamDeadlineMs,
157
+ maxRetries: options?.maxRetries,
158
+ maxRetryDelayMs: options?.maxRetryDelayMs,
159
+ metadata: options?.metadata,
160
+ };
161
+ return usesChatGptCodexTransport(model) ? withChatGptCodexTransportRouting(model, providerOptions) : providerOptions;
162
+ }
163
+ export function mapFastRouteReasoningEffort(model, reasoning) {
164
+ const clampedReasoning = reasoning ? clampThinkingLevel(model, reasoning) : undefined;
165
+ return clampedReasoning === "off" ? undefined : clampedReasoning;
166
+ }
167
+ export function buildOpenAIResponsesFastRouteOptions(model, options) {
168
+ return {
169
+ ...buildFastRouteBaseProviderOptions(model, options),
170
+ reasoningEffort: mapFastRouteReasoningEffort(model, options?.reasoning),
171
+ serviceTier: options?.serviceTier,
172
+ };
173
+ }
174
+ export function buildOpenAICodexResponsesFastRouteOptions(model, options) {
175
+ return {
176
+ ...buildFastRouteBaseProviderOptions(model, options),
177
+ reasoningEffort: mapFastRouteReasoningEffort(model, options?.reasoning),
178
+ serviceTier: options?.serviceTier,
179
+ };
180
+ }
181
+ /**
182
+ * Stream a request whose canonical selected model carries fast-route metadata. The provider adapter
183
+ * translates only the serialized request to the route's upstream ID; the model object keeps its
184
+ * canonical `-fast` identity.
185
+ */
186
+ export function streamWithFastRoute(model, context, options, streamers = DEFAULT_FAST_ROUTE_STREAMERS) {
187
+ if (shouldUseNativeFastRoute(model, options)) {
188
+ if (model.api === "openai-responses") {
189
+ return streamers.streamOpenAIResponses(model, context, buildOpenAIResponsesFastRouteOptions(model, options));
190
+ }
191
+ // The WebSocket handshake builds its headers inside pi-ai, and the runtime
192
+ // constructor can be cached before the first turn, so repair the identity
193
+ // through the global constructor rather than per-request options.
194
+ if (options?.transport !== "sse" && usesChatGptCodexTransport(model)) {
195
+ installCodexFastRouteWebSocketIdentity();
196
+ }
197
+ return streamers.streamOpenAICodexResponses(model, context, buildOpenAICodexResponsesFastRouteOptions(model, options));
198
+ }
199
+ return streamers.streamSimple(model, context, options);
200
+ }
201
+ //# sourceMappingURL=fast-model-routing.js.map