@bastani/atomic 0.9.3 → 0.9.4-alpha.10

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 (312) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/dist/builtin/cursor/CHANGELOG.md +30 -0
  3. package/dist/builtin/cursor/package.json +4 -4
  4. package/dist/builtin/intercom/CHANGELOG.md +30 -0
  5. package/dist/builtin/intercom/package.json +2 -2
  6. package/dist/builtin/mcp/CHANGELOG.md +30 -0
  7. package/dist/builtin/mcp/package.json +4 -4
  8. package/dist/builtin/subagents/CHANGELOG.md +51 -0
  9. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  10. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  11. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  12. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  13. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  14. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  15. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  16. package/dist/builtin/subagents/agents/debugger.md +1 -1
  17. package/dist/builtin/subagents/agents/worker.md +2 -2
  18. package/dist/builtin/subagents/package.json +4 -4
  19. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +11 -1
  20. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +11 -1
  21. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +2 -0
  22. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +27 -4
  23. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +25 -0
  24. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
  25. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
  26. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  27. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +1 -0
  28. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +2 -0
  29. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +3 -1
  30. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +22 -0
  31. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +15 -5
  32. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +5 -1
  33. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
  34. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +4 -1
  35. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +4 -1
  36. package/dist/builtin/subagents/src/runs/shared/attempt-watchdog.ts +126 -0
  37. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +53 -0
  38. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +52 -53
  39. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +2 -0
  40. package/dist/builtin/subagents/src/shared/model-info.ts +16 -0
  41. package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
  42. package/dist/builtin/web-access/CHANGELOG.md +30 -0
  43. package/dist/builtin/web-access/package.json +2 -2
  44. package/dist/builtin/workflows/CHANGELOG.md +54 -0
  45. package/dist/builtin/workflows/README.md +4 -4
  46. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +24 -22
  47. package/dist/builtin/workflows/builtin/goal-runner.ts +12 -23
  48. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +4 -4
  49. package/dist/builtin/workflows/builtin/ralph-models.ts +53 -75
  50. package/dist/builtin/workflows/package.json +2 -2
  51. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +4 -2
  52. package/dist/builtin/workflows/src/engine/run-returned-status.ts +41 -0
  53. package/dist/builtin/workflows/src/engine/run.ts +6 -4
  54. package/dist/builtin/workflows/src/extension/config-file-loader.ts +1 -1
  55. package/dist/builtin/workflows/src/extension/config-loader.ts +1 -1
  56. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +37 -12
  57. package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +59 -1
  58. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +1 -1
  59. package/dist/builtin/workflows/src/shared/store-public-types.ts +3 -2
  60. package/dist/builtin/workflows/src/shared/store-run-methods.ts +6 -1
  61. package/dist/bun/cli.d.ts.map +1 -1
  62. package/dist/bun/cli.js +3 -2
  63. package/dist/bun/cli.js.map +1 -1
  64. package/dist/cli/file-processor.d.ts.map +1 -1
  65. package/dist/cli/file-processor.js +13 -25
  66. package/dist/cli/file-processor.js.map +1 -1
  67. package/dist/cli.d.ts.map +1 -1
  68. package/dist/cli.js +15 -5
  69. package/dist/cli.js.map +1 -1
  70. package/dist/config.d.ts +10 -3
  71. package/dist/config.d.ts.map +1 -1
  72. package/dist/config.js +18 -1
  73. package/dist/config.js.map +1 -1
  74. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  75. package/dist/core/agent-session-auto-compaction.js +8 -1
  76. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  77. package/dist/core/agent-session-events.d.ts.map +1 -1
  78. package/dist/core/agent-session-events.js +14 -8
  79. package/dist/core/agent-session-events.js.map +1 -1
  80. package/dist/core/agent-session-export.d.ts.map +1 -1
  81. package/dist/core/agent-session-export.js +4 -2
  82. package/dist/core/agent-session-export.js.map +1 -1
  83. package/dist/core/agent-session-extension-bindings.d.ts +5 -1
  84. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  85. package/dist/core/agent-session-extension-bindings.js +18 -7
  86. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  87. package/dist/core/agent-session-methods.d.ts +9 -2
  88. package/dist/core/agent-session-methods.d.ts.map +1 -1
  89. package/dist/core/agent-session-methods.js.map +1 -1
  90. package/dist/core/agent-session-prompt.d.ts +2 -0
  91. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  92. package/dist/core/agent-session-prompt.js +15 -2
  93. package/dist/core/agent-session-prompt.js.map +1 -1
  94. package/dist/core/agent-session-retry.d.ts +2 -0
  95. package/dist/core/agent-session-retry.d.ts.map +1 -1
  96. package/dist/core/agent-session-retry.js +66 -7
  97. package/dist/core/agent-session-retry.js.map +1 -1
  98. package/dist/core/agent-session-state.d.ts.map +1 -1
  99. package/dist/core/agent-session-state.js +2 -2
  100. package/dist/core/agent-session-state.js.map +1 -1
  101. package/dist/core/agent-session-tool-hooks.d.ts +7 -1
  102. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  103. package/dist/core/agent-session-tool-hooks.js +26 -4
  104. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  105. package/dist/core/agent-session-tree.d.ts.map +1 -1
  106. package/dist/core/agent-session-tree.js +3 -1
  107. package/dist/core/agent-session-tree.js.map +1 -1
  108. package/dist/core/agent-session-types.d.ts +4 -0
  109. package/dist/core/agent-session-types.d.ts.map +1 -1
  110. package/dist/core/agent-session-types.js.map +1 -1
  111. package/dist/core/agent-session.d.ts +1 -0
  112. package/dist/core/agent-session.d.ts.map +1 -1
  113. package/dist/core/agent-session.js +1 -0
  114. package/dist/core/agent-session.js.map +1 -1
  115. package/dist/core/copilot-model-catalog.d.ts +38 -74
  116. package/dist/core/copilot-model-catalog.d.ts.map +1 -1
  117. package/dist/core/copilot-model-catalog.js +177 -68
  118. package/dist/core/copilot-model-catalog.js.map +1 -1
  119. package/dist/core/copilot-model-static-fallbacks.d.ts +43 -0
  120. package/dist/core/copilot-model-static-fallbacks.d.ts.map +1 -0
  121. package/dist/core/copilot-model-static-fallbacks.js +50 -0
  122. package/dist/core/copilot-model-static-fallbacks.js.map +1 -0
  123. package/dist/core/copilot-model-synthesis.d.ts +10 -0
  124. package/dist/core/copilot-model-synthesis.d.ts.map +1 -0
  125. package/dist/core/copilot-model-synthesis.js +89 -0
  126. package/dist/core/copilot-model-synthesis.js.map +1 -0
  127. package/dist/core/extensions/api-types.d.ts +2 -1
  128. package/dist/core/extensions/api-types.d.ts.map +1 -1
  129. package/dist/core/extensions/api-types.js.map +1 -1
  130. package/dist/core/extensions/index.d.ts +1 -1
  131. package/dist/core/extensions/index.d.ts.map +1 -1
  132. package/dist/core/extensions/index.js.map +1 -1
  133. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  134. package/dist/core/extensions/loader-core.js +3 -3
  135. package/dist/core/extensions/loader-core.js.map +1 -1
  136. package/dist/core/extensions/loader-virtual-modules.d.ts +11 -0
  137. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  138. package/dist/core/extensions/loader-virtual-modules.js +79 -11
  139. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  140. package/dist/core/extensions/session-events.d.ts +7 -1
  141. package/dist/core/extensions/session-events.d.ts.map +1 -1
  142. package/dist/core/extensions/session-events.js.map +1 -1
  143. package/dist/core/http-dispatcher.d.ts +5 -3
  144. package/dist/core/http-dispatcher.d.ts.map +1 -1
  145. package/dist/core/http-dispatcher.js +56 -10
  146. package/dist/core/http-dispatcher.js.map +1 -1
  147. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  148. package/dist/core/model-registry-builtins.js +40 -6
  149. package/dist/core/model-registry-builtins.js.map +1 -1
  150. package/dist/core/model-registry.d.ts.map +1 -1
  151. package/dist/core/model-registry.js +4 -3
  152. package/dist/core/model-registry.js.map +1 -1
  153. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  154. package/dist/core/model-resolver-defaults.js +1 -1
  155. package/dist/core/model-resolver-defaults.js.map +1 -1
  156. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  157. package/dist/core/resource-loader-reload.js +6 -3
  158. package/dist/core/resource-loader-reload.js.map +1 -1
  159. package/dist/core/resource-loader-types.d.ts +6 -0
  160. package/dist/core/resource-loader-types.d.ts.map +1 -1
  161. package/dist/core/resource-loader-types.js.map +1 -1
  162. package/dist/core/session-manager-core.d.ts +2 -12
  163. package/dist/core/session-manager-core.d.ts.map +1 -1
  164. package/dist/core/session-manager-core.js +8 -16
  165. package/dist/core/session-manager-core.js.map +1 -1
  166. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  167. package/dist/core/settings-manager-basic-accessors.js +1 -1
  168. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  169. package/dist/core/settings-manager-resource-accessors.d.ts +1 -0
  170. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  171. package/dist/core/settings-manager-resource-accessors.js +11 -0
  172. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  173. package/dist/core/settings-manager-ui-accessors.d.ts +2 -0
  174. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  175. package/dist/core/settings-manager-ui-accessors.js +9 -0
  176. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  177. package/dist/core/settings-types.d.ts +2 -0
  178. package/dist/core/settings-types.d.ts.map +1 -1
  179. package/dist/core/settings-types.js.map +1 -1
  180. package/dist/core/timings.d.ts +7 -5
  181. package/dist/core/timings.d.ts.map +1 -1
  182. package/dist/core/timings.js +42 -24
  183. package/dist/core/timings.js.map +1 -1
  184. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  185. package/dist/core/tools/bash-pty-native.js +2 -2
  186. package/dist/core/tools/bash-pty-native.js.map +1 -1
  187. package/dist/core/tools/read-selectors.d.ts.map +1 -1
  188. package/dist/core/tools/read-selectors.js +19 -1
  189. package/dist/core/tools/read-selectors.js.map +1 -1
  190. package/dist/core/tools/read.d.ts.map +1 -1
  191. package/dist/core/tools/read.js +12 -23
  192. package/dist/core/tools/read.js.map +1 -1
  193. package/dist/core/tools/search-native.d.ts.map +1 -1
  194. package/dist/core/tools/search-native.js +2 -2
  195. package/dist/core/tools/search-native.js.map +1 -1
  196. package/dist/index-extensions.d.ts +1 -1
  197. package/dist/index-extensions.d.ts.map +1 -1
  198. package/dist/index-extensions.js.map +1 -1
  199. package/dist/index.d.ts +1 -1
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js.map +1 -1
  202. package/dist/main-session.d.ts.map +1 -1
  203. package/dist/main-session.js +14 -5
  204. package/dist/main-session.js.map +1 -1
  205. package/dist/main.d.ts.map +1 -1
  206. package/dist/main.js +56 -32
  207. package/dist/main.js.map +1 -1
  208. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  209. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  210. package/dist/modes/interactive/components/assistant-message.js +22 -15
  211. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  212. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
  213. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  214. package/dist/modes/interactive/components/chat-message-renderer.js +5 -5
  215. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  216. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  217. package/dist/modes/interactive/components/chat-session-host-events.js +8 -0
  218. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  219. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  220. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -0
  221. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  222. package/dist/modes/interactive/components/user-message.d.ts +6 -2
  223. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  224. package/dist/modes/interactive/components/user-message.js +16 -5
  225. package/dist/modes/interactive/components/user-message.js.map +1 -1
  226. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  227. package/dist/modes/interactive/interactive-agent-events.js +6 -1
  228. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  229. package/dist/modes/interactive/interactive-deferred-startup.d.ts +2 -0
  230. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -0
  231. package/dist/modes/interactive/interactive-deferred-startup.js +59 -0
  232. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -0
  233. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
  234. package/dist/modes/interactive/interactive-editor-actions.js +1 -0
  235. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  236. package/dist/modes/interactive/interactive-extension-context.d.ts.map +1 -1
  237. package/dist/modes/interactive/interactive-extension-context.js +1 -0
  238. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  239. package/dist/modes/interactive/interactive-mode-base.d.ts +3 -0
  240. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  241. package/dist/modes/interactive/interactive-mode-base.js +6 -0
  242. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  243. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  244. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  245. package/dist/modes/interactive/interactive-mode-deps.js +1 -1
  246. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  247. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -0
  248. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  249. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  250. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  251. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  252. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  253. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  254. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/dist/modes/interactive/interactive-mode.js +1 -0
  256. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  258. package/dist/modes/interactive/interactive-model-routing.js +2 -4
  259. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  260. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  261. package/dist/modes/interactive/interactive-render-chat.js +4 -3
  262. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  263. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  264. package/dist/modes/interactive/interactive-session-runtime.js +5 -2
  265. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  266. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  267. package/dist/modes/interactive/interactive-startup.js +11 -1
  268. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  269. package/dist/modes/print-mode.d.ts.map +1 -1
  270. package/dist/modes/print-mode.js +15 -13
  271. package/dist/modes/print-mode.js.map +1 -1
  272. package/dist/modes/rpc/rpc-client.d.ts +28 -51
  273. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  274. package/dist/modes/rpc/rpc-client.js +27 -51
  275. package/dist/modes/rpc/rpc-client.js.map +1 -1
  276. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  277. package/dist/modes/rpc/rpc-command-handler.js +19 -0
  278. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  279. package/dist/modes/rpc/rpc-types.d.ts +26 -0
  280. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  281. package/dist/modes/rpc/rpc-types.js.map +1 -1
  282. package/dist/rpc-entry.d.ts +3 -0
  283. package/dist/rpc-entry.d.ts.map +1 -0
  284. package/dist/rpc-entry.js +12 -0
  285. package/dist/rpc-entry.js.map +1 -0
  286. package/dist/utils/image-convert.d.ts +1 -0
  287. package/dist/utils/image-convert.d.ts.map +1 -1
  288. package/dist/utils/image-convert.js +21 -15
  289. package/dist/utils/image-convert.js.map +1 -1
  290. package/dist/utils/image-process.d.ts +18 -0
  291. package/dist/utils/image-process.d.ts.map +1 -0
  292. package/dist/utils/image-process.js +83 -0
  293. package/dist/utils/image-process.js.map +1 -0
  294. package/dist/utils/mime.d.ts.map +1 -1
  295. package/dist/utils/mime.js +41 -0
  296. package/dist/utils/mime.js.map +1 -1
  297. package/dist/utils/module-require.d.ts +11 -0
  298. package/dist/utils/module-require.d.ts.map +1 -0
  299. package/dist/utils/module-require.js +16 -0
  300. package/dist/utils/module-require.js.map +1 -0
  301. package/docs/compaction.md +2 -0
  302. package/docs/development.md +10 -0
  303. package/docs/extensions.md +11 -0
  304. package/docs/models.md +3 -3
  305. package/docs/providers.md +2 -1
  306. package/docs/rpc.md +60 -2
  307. package/docs/sdk.md +1 -1
  308. package/docs/settings.md +8 -5
  309. package/docs/subagents.md +6 -0
  310. package/docs/workflows.md +9 -5
  311. package/npm-shrinkwrap.json +4266 -0
  312. package/package.json +23 -13
@@ -1 +1 @@
1
- {"version":3,"file":"copilot-model-catalog.js","sourceRoot":"","sources":["../../src/core/copilot-model-catalog.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * GitHub Copilot model catalog (CAPI) — dynamic prompt-token budgets.\n *\n * GitHub's Copilot API (CAPI) exposes distinct model limits via `GET {baseUrl}/models`:\n *\n * - `capabilities.limits.max_context_window_tokens` is the model's total context capacity\n * (prompt + completion reserve).\n * - `capabilities.limits.max_prompt_tokens` is the maximum prompt/input budget Atomic can safely\n * fill before the provider must reserve output tokens.\n * - `billing.token_prices.<tier>.context_max` is a prompt-token billing/selection threshold. The\n * `default` tier is the short prompt budget (e.g. gpt-5.5 272k, Claude 200k); a\n * `long_context` tier adds a selectable larger prompt budget (e.g. gpt-5.5 922k, Claude 936k).\n *\n * Atomic shows the model's full context window for the selectable long tier (the\n * `max_context_window_tokens` total, e.g. 1_000_000/1_050_000), matching how the native `openai/*`\n * and `anthropic/*` providers advertise these models. Because GitHub enforces a lower server-side\n * prompt cap (`max_prompt_tokens`, e.g. 936k/922k) below that total, the prompt cap is retained as\n * an internal effective input budget (`CopilotModelContext.maxInputTokens`) that drives compaction\n * thresholds and the overflow-recovery guard, so the branded total can be displayed without\n * overrunning the server limit. The default (short) tier stays at the `default` billing tier's\n * prompt budget.\n *\n * This data is intentionally NOT baked into a static map: GitHub adds/removes models and retiers\n * windows over time (e.g. a model that disappears from the catalog), so a hardcoded snapshot goes\n * stale. Instead the catalog is fetched live (gated on the user actually having the GitHub Copilot\n * provider) and cached on disk for a short TTL, exactly like the Copilot CLI.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\n/** Resolved input-token context window(s) for a single Copilot model. */\nexport interface CopilotModelContext {\n\t/**\n\t * Base/displayed context window — shown in the footer. The default tier's `context_max`, or the\n\t * model-level `max_prompt_tokens` fallback otherwise.\n\t */\n\tcontextWindow: number;\n\t/**\n\t * Selectable windows (`[default, long]`) when the model exposes a `long_context` tier larger than\n\t * its default; absent for single-window models. The long entry is the model's full\n\t * `max_context_window_tokens` (total capacity) when advertised, matching `openai/*` and\n\t * `anthropic/*`.\n\t */\n\tcontextWindowOptions?: readonly number[];\n\t/**\n\t * Hard prompt/input cap (`max_prompt_tokens`) when it sits below the displayed long window. Used\n\t * as the effective input budget for compaction thresholds and overflow recovery so the branded\n\t * total can be shown without overrunning GitHub's server-side prompt limit. Absent when the\n\t * displayed window already equals the input cap.\n\t */\n\tmaxInputTokens?: number;\n}\n\n/** Map of model id → resolved input-token context window(s). */\nexport type CopilotModelCatalog = ReadonlyMap<string, CopilotModelContext>;\n\n/** Safety fallback when a model reports neither `max_prompt_tokens` nor `max_context_window_tokens`. */\nexport const COPILOT_CONTEXT_WINDOW_FALLBACK = 128_000;\n\nexport const COPILOT_CATALOG_API_VERSION = \"2026-06-01\";\n\n/**\n * Headers GitHub's CAPI expects for catalog reads. Mirrors the editor headers pi-ai already sends\n * for Copilot token refresh and model-policy calls, plus the dated API version.\n */\nexport const COPILOT_CATALOG_HEADERS: Readonly<Record<string, string>> = {\n\t\"User-Agent\": \"GitHubCopilotChat/0.35.0\",\n\t\"Editor-Version\": \"vscode/1.107.0\",\n\t\"Editor-Plugin-Version\": \"copilot-chat/0.35.0\",\n\t\"Copilot-Integration-Id\": \"vscode-chat\",\n\t\"X-GitHub-Api-Version\": COPILOT_CATALOG_API_VERSION,\n};\n\n/** Default (non-enterprise) Copilot CAPI base URL when the token has no resolvable `proxy-ep`. */\nexport const DEFAULT_COPILOT_API_BASE_URL = \"https://api.individual.githubcopilot.com\";\n\n/** Disk-cache freshness window, matching the Copilot CLI's list-models cache TTL. */\nexport const COPILOT_CATALOG_CACHE_TTL_MS = 30 * 60 * 1000;\n\n/** Current on-disk cache schema version. */\nexport const COPILOT_CATALOG_CACHE_VERSION = 3 as const;\n\n/**\n * Resolve the Copilot CAPI base URL.\n *\n * Copilot access tokens embed a `proxy-ep=proxy.<host>` segment; the API host is the same host with\n * `proxy.` swapped for `api.`. Falls back to the enterprise host or the individual default. (pi-ai\n * exposes an equivalent helper, but its published `dist` mangles the export name, so the small,\n * stable parsing logic is reimplemented here.)\n */\nexport function copilotApiBaseUrlFromToken(token: string | undefined, enterpriseDomain?: string): string {\n\tif (token) {\n\t\tconst match = token.match(/proxy-ep=([^;]+)/);\n\t\tif (match) {\n\t\t\treturn `https://${match[1].replace(/^proxy\\./, \"api.\")}`;\n\t\t}\n\t}\n\tif (enterpriseDomain) return `https://copilot-api.${enterpriseDomain}`;\n\treturn DEFAULT_COPILOT_API_BASE_URL;\n}\n\nfunction trimTrailingSlash(url: string): string {\n\treturn url.replace(/\\/+$/, \"\");\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value && typeof value === \"object\" ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction toPositiveInt(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isInteger(value) && value > 0 ? value : undefined;\n}\n\n/** Raw token limits parsed from a CAPI model entry. */\nexport interface CopilotModelLimits {\n\t/** `capabilities.limits.max_prompt_tokens` — maximum prompt/input budget (the hard input cap). */\n\tmaxPromptTokens?: number;\n\t/** `capabilities.limits.max_context_window_tokens` — total context capacity (the displayed long tier). */\n\tmaxContextWindowTokens?: number;\n\t/** `capabilities.limits.max_output_tokens` — output reserve; derives the input cap when `max_prompt_tokens` is absent. */\n\tmaxOutputTokens?: number;\n\t/** `billing.token_prices.default.context_max` — default-tier prompt threshold. */\n\tdefaultContextMax?: number;\n\t/** `billing.token_prices.long_context.context_max` — long-context prompt threshold. */\n\tlongContextMax?: number;\n}\n\n/**\n * Resolve a model's input-token context window(s) from its CAPI limits.\n *\n * `contextWindow` is the model's base input budget — the default tier's `context_max` when tiered,\n * otherwise `max_prompt_tokens ?? max_context_window_tokens ?? 128_000`. A `long_context` tier that\n * is larger than the base adds a second selectable window. Returns `undefined` when the entry\n * carries no usable limit signal at all.\n */\nexport function resolveCopilotModelContext(limits: CopilotModelLimits): CopilotModelContext | undefined {\n\tconst hasSignal =\n\t\tlimits.maxPromptTokens !== undefined ||\n\t\tlimits.maxContextWindowTokens !== undefined ||\n\t\tlimits.defaultContextMax !== undefined ||\n\t\tlimits.longContextMax !== undefined;\n\tif (!hasSignal) return undefined;\n\n\tconst maxInput = limits.maxPromptTokens ?? limits.maxContextWindowTokens ?? COPILOT_CONTEXT_WINDOW_FALLBACK;\n\tconst base = limits.defaultContextMax ?? maxInput;\n\tif (limits.longContextMax !== undefined && limits.longContextMax > base) {\n\t\t// Display the model's full context window as the long tier (matching openai/* and anthropic/*)\n\t\t// when CAPI advertises it; otherwise fall back to the long-context prompt threshold for\n\t\t// older/sparse payloads.\n\t\tconst longWindow = limits.maxContextWindowTokens ?? limits.longContextMax;\n\t\t// The hard prompt/input cap GitHub enforces server-side: prefer max_prompt_tokens, else derive\n\t\t// it from total − output reserve, else fall back to the long-context prompt threshold.\n\t\tconst derivedInputCap =\n\t\t\tlimits.maxContextWindowTokens !== undefined && limits.maxOutputTokens !== undefined\n\t\t\t\t? limits.maxContextWindowTokens - limits.maxOutputTokens\n\t\t\t\t: undefined;\n\t\tconst inputCap =\n\t\t\tlimits.maxPromptTokens ??\n\t\t\t(derivedInputCap !== undefined && derivedInputCap > 0 ? derivedInputCap : undefined) ??\n\t\t\tlimits.longContextMax;\n\t\t// Only carry the cap when the displayed long window actually exceeds it (the branded-total\n\t\t// case); when they coincide there is no gap and the input budget is just the window.\n\t\treturn longWindow > inputCap\n\t\t\t? { contextWindow: base, contextWindowOptions: [base, longWindow], maxInputTokens: inputCap }\n\t\t\t: { contextWindow: base, contextWindowOptions: [base, longWindow] };\n\t}\n\treturn { contextWindow: base };\n}\n\n/**\n * Parse a raw CAPI `/models` response body into an input-token context-window catalog.\n */\nexport function parseCopilotModelCatalog(body: unknown): CopilotModelCatalog {\n\tconst catalog = new Map<string, CopilotModelContext>();\n\tconst data = asRecord(body)?.data;\n\tif (!Array.isArray(data)) return catalog;\n\n\tfor (const entry of data) {\n\t\tconst record = asRecord(entry);\n\t\tif (!record) continue;\n\t\tconst id = record.id;\n\t\tif (typeof id !== \"string\" || id.length === 0) continue;\n\n\t\tconst limits = asRecord(asRecord(record.capabilities)?.limits);\n\t\tconst prices = asRecord(asRecord(record.billing)?.token_prices);\n\t\tconst context = resolveCopilotModelContext({\n\t\t\tmaxPromptTokens: toPositiveInt(limits?.max_prompt_tokens),\n\t\t\tmaxContextWindowTokens: toPositiveInt(limits?.max_context_window_tokens),\n\t\t\tmaxOutputTokens: toPositiveInt(limits?.max_output_tokens),\n\t\t\tdefaultContextMax: toPositiveInt(asRecord(prices?.default)?.context_max),\n\t\t\tlongContextMax: toPositiveInt(asRecord(prices?.long_context)?.context_max),\n\t\t});\n\t\tif (context) catalog.set(id, context);\n\t}\n\n\treturn catalog;\n}\n\nexport interface FetchCopilotModelCatalogOptions {\n\t/** Valid Copilot CAPI bearer token (e.g. from `modelRegistry.getApiKeyForProvider`). */\n\ttoken: string;\n\t/** Override the resolved base URL; defaults to one derived from the token. */\n\tbaseUrl?: string;\n\t/** Enterprise domain, used for base-URL resolution when the token lacks a `proxy-ep`. */\n\tenterpriseDomain?: string;\n\t/** Extra/override request headers. */\n\theaders?: Record<string, string>;\n\t/** Injectable `fetch` for testing. */\n\tfetchImpl?: typeof fetch;\n\t/** Abort signal. */\n\tsignal?: AbortSignal;\n}\n\n/** Fetch and parse the live Copilot model catalog from CAPI `GET {baseUrl}/models`. */\nexport async function fetchCopilotModelCatalog(options: FetchCopilotModelCatalogOptions): Promise<CopilotModelCatalog> {\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\tconst baseUrl = options.baseUrl ?? copilotApiBaseUrlFromToken(options.token, options.enterpriseDomain);\n\tconst response = await fetchImpl(`${trimTrailingSlash(baseUrl)}/models`, {\n\t\tmethod: \"GET\",\n\t\theaders: {\n\t\t\tAccept: \"application/json\",\n\t\t\tAuthorization: `Bearer ${options.token}`,\n\t\t\t...COPILOT_CATALOG_HEADERS,\n\t\t\t...options.headers,\n\t\t},\n\t\t...(options.signal ? { signal: options.signal } : {}),\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(`GitHub Copilot /models request failed: ${response.status} ${response.statusText}`);\n\t}\n\treturn parseCopilotModelCatalog(await response.json());\n}\n\n// ----------------------------------------------------------------------------\n// Active in-memory catalog (consulted by the model registry).\n//\n// Empty by default, so with no Copilot auth / no successful fetch the registry leaves Copilot\n// model context windows untouched and the picker never appears.\n// ----------------------------------------------------------------------------\n\nlet activeCatalog: CopilotModelCatalog = new Map();\n\n/** Replace the active catalog the registry derives context windows from. */\nexport function setActiveCopilotModelCatalog(catalog: CopilotModelCatalog): void {\n\tactiveCatalog = catalog;\n}\n\n/** The active catalog (empty until a successful auth-gated fetch/cache load). */\nexport function getActiveCopilotModelCatalog(): CopilotModelCatalog {\n\treturn activeCatalog;\n}\n\n/** Reset the active catalog (primarily for tests). */\nexport function clearActiveCopilotModelCatalog(): void {\n\tactiveCatalog = new Map();\n}\n\n// ----------------------------------------------------------------------------\n// Disk cache.\n// ----------------------------------------------------------------------------\n\ninterface CopilotCatalogCacheFile {\n\tversion: typeof COPILOT_CATALOG_CACHE_VERSION;\n\t/** CAPI host the catalog was fetched from; cache misses on host change (e.g. enterprise switch). */\n\thost: string;\n\t/** Epoch ms the catalog was fetched. */\n\tfetchedAt: number;\n\tmodels: Record<string, CopilotModelContext>;\n}\n\nfunction hostFromBaseUrl(baseUrl: string): string {\n\ttry {\n\t\treturn new URL(baseUrl).host;\n\t} catch {\n\t\treturn baseUrl;\n\t}\n}\n\nexport interface ReadCopilotCatalogCacheOptions {\n\t/** Expected CAPI host; a cached file from a different host is ignored. */\n\thost: string;\n\t/** Current epoch ms (injectable for tests). */\n\tnow?: number;\n\t/** Freshness window; defaults to {@link COPILOT_CATALOG_CACHE_TTL_MS}. */\n\tttlMs?: number;\n}\n\nfunction sanitizeCachedContext(value: unknown): CopilotModelContext | undefined {\n\tconst record = asRecord(value);\n\tconst contextWindow = toPositiveInt(record?.contextWindow);\n\tif (contextWindow === undefined) return undefined;\n\tconst maxInputTokens = toPositiveInt(record?.maxInputTokens);\n\tconst rawOptions = record?.contextWindowOptions;\n\tif (Array.isArray(rawOptions)) {\n\t\tconst options = rawOptions.map(toPositiveInt).filter((n): n is number => n !== undefined);\n\t\tif (options.length > 1) {\n\t\t\treturn maxInputTokens !== undefined\n\t\t\t\t? { contextWindow, contextWindowOptions: options, maxInputTokens }\n\t\t\t\t: { contextWindow, contextWindowOptions: options };\n\t\t}\n\t}\n\treturn maxInputTokens !== undefined ? { contextWindow, maxInputTokens } : { contextWindow };\n}\n\n/** Read a fresh, host-matching catalog from the cache file, or `undefined` if missing/stale/invalid. */\nexport function readCopilotCatalogCache(\n\tpath: string,\n\toptions: ReadCopilotCatalogCacheOptions,\n): CopilotModelCatalog | undefined {\n\tlet parsed: CopilotCatalogCacheFile;\n\ttry {\n\t\tif (!existsSync(path)) return undefined;\n\t\tparsed = JSON.parse(readFileSync(path, \"utf8\")) as CopilotCatalogCacheFile;\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!parsed || parsed.version !== COPILOT_CATALOG_CACHE_VERSION) return undefined;\n\tif (parsed.host !== options.host) return undefined;\n\tconst now = options.now ?? Date.now();\n\tconst ttlMs = options.ttlMs ?? COPILOT_CATALOG_CACHE_TTL_MS;\n\tif (typeof parsed.fetchedAt !== \"number\" || now - parsed.fetchedAt >= ttlMs) return undefined;\n\tconst models = asRecord(parsed.models);\n\tif (!models) return undefined;\n\n\tconst catalog = new Map<string, CopilotModelContext>();\n\tfor (const [id, value] of Object.entries(models)) {\n\t\tconst context = sanitizeCachedContext(value);\n\t\tif (context) catalog.set(id, context);\n\t}\n\treturn catalog;\n}\n\n/** Write the catalog to the cache file (creating parent dirs). Best-effort; never throws. */\nexport function writeCopilotCatalogCache(\n\tpath: string,\n\tbaseUrl: string,\n\tcatalog: CopilotModelCatalog,\n\tnow?: number,\n): void {\n\tconst payload: CopilotCatalogCacheFile = {\n\t\tversion: COPILOT_CATALOG_CACHE_VERSION,\n\t\thost: hostFromBaseUrl(baseUrl),\n\t\tfetchedAt: now ?? Date.now(),\n\t\tmodels: Object.fromEntries(catalog),\n\t};\n\ttry {\n\t\tmkdirSync(dirname(path), { recursive: true });\n\t\twriteFileSync(path, JSON.stringify(payload), \"utf8\");\n\t} catch {\n\t\t// best-effort cache; ignore write failures\n\t}\n}\n\n/** Host component of a base URL, for matching {@link readCopilotCatalogCache} `host`. */\nexport function copilotCatalogCacheHost(baseUrl: string): string {\n\treturn hostFromBaseUrl(baseUrl);\n}\n\n/** Standard on-disk cache path for the Copilot model catalog under an agent directory. */\nexport function copilotCatalogCachePath(agentDir: string): string {\n\treturn join(agentDir, \"cache\", \"copilot-models.json\");\n}\n\n/**\n * Seed the active catalog synchronously from the on-disk cache, gated on a Copilot access token.\n *\n * Called at model-registry construction so a returning user's previously selected long-context\n * window is recognized before startup validation runs — otherwise the persisted choice would warn\n * (\"context window 936k is not supported…\") and reset until the async refresh completes. The cache\n * TTL is intentionally ignored here: stale-but-present windows are still valid for selection, and\n * the async loader independently refetches on its own freshness window. Returns true when a catalog\n * was applied. No-op (returns false) without a token or a host-matching cached catalog.\n */\nexport function seedActiveCopilotModelCatalogFromCache(\n\taccessToken: string | undefined,\n\tcachePath: string,\n\tnow?: number,\n): boolean {\n\tif (typeof accessToken !== \"string\" || accessToken.length === 0) return false;\n\tconst host = copilotCatalogCacheHost(copilotApiBaseUrlFromToken(accessToken));\n\tconst cached = readCopilotCatalogCache(cachePath, { host, now, ttlMs: Number.POSITIVE_INFINITY });\n\tif (!cached) return false;\n\tsetActiveCopilotModelCatalog(cached);\n\treturn true;\n}\n"]}
1
+ {"version":3,"file":"copilot-model-catalog.js","sourceRoot":"","sources":["../../src/core/copilot-model-catalog.ts"],"names":[],"mappings":"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","sourcesContent":["/** GitHub Copilot CAPI model catalog parsing, active state, and disk cache. */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\n/** Resolved input-token context window(s) and optional synthesis metadata for a single Copilot model. */\nexport interface CopilotModelContext {\n\tcontextWindow: number;\n\tcontextWindowOptions?: readonly number[];\n\tmaxInputTokens?: number;\n\tmaxTokens?: number;\n\tdisplayName?: string;\n\tvendor?: string;\n\tsupportedEndpoints?: readonly string[];\n\tsupports?: CopilotModelSupports;\n\tlimits?: CopilotModelLimits;\n\tmodelPickerEnabled?: boolean;\n\tpolicyState?: string;\n\ttype?: string;\n}\n\nexport interface CopilotModelSupports {\n\tadaptiveThinking?: boolean;\n\tmaxThinkingBudget?: boolean;\n\tminThinkingBudget?: boolean;\n\tparallelToolCalls?: boolean;\n\treasoningEffort?: boolean;\n\treasoningEffortLevels?: readonly string[];\n\tstreaming?: boolean;\n\tstructuredOutputs?: boolean;\n\ttoolCalls?: boolean;\n\tvision?: boolean;\n}\n\n/** Map of model id → resolved context window(s) plus optional synthesis metadata. */\nexport type CopilotModelCatalog = ReadonlyMap<string, CopilotModelContext>;\n\n/** Safety fallback when a model reports neither `max_prompt_tokens` nor `max_context_window_tokens`. */\nexport const COPILOT_CONTEXT_WINDOW_FALLBACK = 128_000;\n\nexport const COPILOT_CATALOG_API_VERSION = \"2026-06-01\";\n\n/**\n * Headers GitHub's CAPI expects for catalog reads. Mirrors the editor headers pi-ai already sends\n * for Copilot token refresh and model-policy calls, plus the dated API version.\n */\nexport const COPILOT_CATALOG_HEADERS: Readonly<Record<string, string>> = {\n\t\"User-Agent\": \"GitHubCopilotChat/0.35.0\",\n\t\"Editor-Version\": \"vscode/1.107.0\",\n\t\"Editor-Plugin-Version\": \"copilot-chat/0.35.0\",\n\t\"Copilot-Integration-Id\": \"vscode-chat\",\n\t\"X-GitHub-Api-Version\": COPILOT_CATALOG_API_VERSION,\n};\n\n/** Default Copilot CAPI base URL for OAuth tokens when no route can be resolved. */\nexport const DEFAULT_COPILOT_API_BASE_URL = \"https://api.individual.githubcopilot.com\";\n\n/** GitHub Copilot public routing hub for PAT-based `COPILOT_GITHUB_TOKEN` auth. */\nexport const COPILOT_PUBLIC_API_BASE_URL = \"https://api.githubcopilot.com\";\n\n/** Enterprise Copilot CAPI host for GHES/non-github.com server URLs. */\nexport const COPILOT_ENTERPRISE_API_BASE_URL = \"https://api.enterprise.githubcopilot.com\";\n\nexport const COPILOT_GITHUB_TOKEN_ENV = \"COPILOT_GITHUB_TOKEN\";\nexport const COPILOT_API_TARGET_ENV = \"COPILOT_API_TARGET\";\nexport const GITHUB_COPILOT_BASE_URL_ENV = \"GITHUB_COPILOT_BASE_URL\";\nexport const GITHUB_SERVER_URL_ENV = \"GITHUB_SERVER_URL\";\n\ntype CopilotEnvironment = Record<string, string | undefined>;\n\nfunction normalizeCopilotApiBaseUrl(value: string | undefined): string | undefined {\n\tconst trimmed = value?.trim();\n\tif (!trimmed) return undefined;\n\tconst withScheme = /^https?:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n\ttry {\n\t\tnew URL(withScheme);\n\t} catch {\n\t\treturn undefined;\n\t}\n\treturn withScheme.replace(/\\/+$/, \"\");\n}\n\nfunction explicitCopilotApiBaseUrlFromEnvironment(env: CopilotEnvironment): string | undefined {\n\treturn normalizeCopilotApiBaseUrl(env[COPILOT_API_TARGET_ENV]) ?? normalizeCopilotApiBaseUrl(env[GITHUB_COPILOT_BASE_URL_ENV]);\n}\n\nfunction copilotApiBaseUrlFromServerUrl(serverUrl: string | undefined): string | undefined {\n\tconst trimmed = serverUrl?.trim();\n\tif (!trimmed) return undefined;\n\ttry {\n\t\tconst parsed = new URL(trimmed.includes(\"://\") ? trimmed : `https://${trimmed}`);\n\t\tconst host = parsed.hostname.toLowerCase();\n\t\tif (!host || host === \"github.com\") return undefined;\n\t\tif (host.endsWith(\".ghe.com\")) return `https://copilot-api.${host}`;\n\t\treturn COPILOT_ENTERPRISE_API_BASE_URL;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction isCopilotEnvironmentToken(token: string | undefined, env: CopilotEnvironment): boolean {\n\tconst environmentToken = copilotTokenFromEnvironment(env);\n\treturn environmentToken !== undefined && token === environmentToken;\n}\n\nexport function copilotTokenFromEnvironment(env: CopilotEnvironment = process.env): string | undefined {\n\tconst token = env[COPILOT_GITHUB_TOKEN_ENV]?.trim();\n\treturn token ? token : undefined;\n}\n\n/** Disk-cache freshness window, matching the Copilot CLI's list-models cache TTL. */\nexport const COPILOT_CATALOG_CACHE_TTL_MS = 30 * 60 * 1000;\n\n/** Current on-disk cache schema version. */\nexport const COPILOT_CATALOG_CACHE_VERSION = 5 as const;\n\nexport function copilotApiBaseUrlFromToken(\n\ttoken: string | undefined,\n\tenterpriseDomain?: string,\n\tenv: CopilotEnvironment = process.env,\n): string {\n\tconst explicitOverride = explicitCopilotApiBaseUrlFromEnvironment(env);\n\tif (explicitOverride) return explicitOverride;\n\tif (token) {\n\t\tconst match = token.match(/proxy-ep=([^;]+)/);\n\t\tif (match) {\n\t\t\treturn `https://${match[1].replace(/^proxy\\./, \"api.\")}`;\n\t\t}\n\t}\n\tif (enterpriseDomain) return `https://copilot-api.${enterpriseDomain}`;\n\tconst serverUrlOverride = copilotApiBaseUrlFromServerUrl(env[GITHUB_SERVER_URL_ENV]);\n\tif (serverUrlOverride) return serverUrlOverride;\n\tif (isCopilotEnvironmentToken(token, env)) return COPILOT_PUBLIC_API_BASE_URL;\n\treturn DEFAULT_COPILOT_API_BASE_URL;\n}\n\nfunction trimTrailingSlash(url: string): string {\n\treturn url.replace(/\\/+$/, \"\");\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value && typeof value === \"object\" ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction toPositiveInt(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isInteger(value) && value > 0 ? value : undefined;\n}\n\nexport interface CopilotModelLimits {\n\tmaxPromptTokens?: number;\n\tmaxContextWindowTokens?: number;\n\tmaxOutputTokens?: number;\n\tdefaultContextMax?: number;\n\tlongContextMax?: number;\n}\n\nfunction stringArray(value: unknown): readonly string[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst strings = value.filter((item): item is string => typeof item === \"string\" && item.length > 0);\n\treturn strings.length > 0 ? strings : undefined;\n}\n\nfunction supportedFlag(record: Record<string, unknown> | undefined, key: string): boolean | undefined {\n\tconst value = record?.[key];\n\tif (typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\") return Number.isFinite(value) && value > 0;\n\tif (Array.isArray(value)) return value.length > 0;\n\treturn undefined;\n}\n\nfunction parseCopilotSupports(value: unknown): CopilotModelSupports | undefined {\n\tconst record = asRecord(value);\n\tif (!record) return undefined;\n\tconst supports: CopilotModelSupports = {\n\t\tadaptiveThinking: supportedFlag(record, \"adaptive_thinking\"),\n\t\tmaxThinkingBudget: supportedFlag(record, \"max_thinking_budget\"),\n\t\tminThinkingBudget: supportedFlag(record, \"min_thinking_budget\"),\n\t\tparallelToolCalls: supportedFlag(record, \"parallel_tool_calls\"),\n\t\treasoningEffort: supportedFlag(record, \"reasoning_effort\"),\n\t\treasoningEffortLevels: stringArray(record.reasoning_effort),\n\t\tstreaming: supportedFlag(record, \"streaming\"),\n\t\tstructuredOutputs: supportedFlag(record, \"structured_outputs\"),\n\t\ttoolCalls: supportedFlag(record, \"tool_calls\"),\n\t\tvision: supportedFlag(record, \"vision\"),\n\t};\n\treturn Object.values(supports).some((flag) => flag !== undefined) ? supports : undefined;\n}\n\nfunction parseCopilotLimits(limits: Record<string, unknown> | undefined, prices: Record<string, unknown> | undefined): CopilotModelLimits {\n\treturn {\n\t\tmaxPromptTokens: toPositiveInt(limits?.max_prompt_tokens),\n\t\tmaxContextWindowTokens: toPositiveInt(limits?.max_context_window_tokens),\n\t\tmaxOutputTokens: toPositiveInt(limits?.max_output_tokens),\n\t\tdefaultContextMax: toPositiveInt(asRecord(prices?.default)?.context_max),\n\t\tlongContextMax: toPositiveInt(asRecord(prices?.long_context)?.context_max),\n\t};\n}\n\nexport function resolveCopilotModelContext(limits: CopilotModelLimits): CopilotModelContext | undefined {\n\tconst hasSignal =\n\t\tlimits.maxPromptTokens !== undefined ||\n\t\tlimits.maxContextWindowTokens !== undefined ||\n\t\tlimits.defaultContextMax !== undefined ||\n\t\tlimits.longContextMax !== undefined;\n\tif (!hasSignal) return undefined;\n\n\tconst maxInput = limits.maxPromptTokens ?? limits.maxContextWindowTokens ?? COPILOT_CONTEXT_WINDOW_FALLBACK;\n\tconst base = limits.defaultContextMax ?? maxInput;\n\tif (limits.longContextMax !== undefined && limits.longContextMax > base) {\n\t\t// Display the model's full context window as the long tier (matching openai/* and anthropic/*)\n\t\t// when CAPI advertises it; otherwise fall back to the long-context prompt threshold for\n\t\t// older/sparse payloads.\n\t\tconst longWindow = limits.maxContextWindowTokens ?? limits.longContextMax;\n\t\t// The hard prompt/input cap GitHub enforces server-side: prefer max_prompt_tokens, else derive\n\t\t// it from total − output reserve, else fall back to the long-context prompt threshold.\n\t\tconst derivedInputCap =\n\t\t\tlimits.maxContextWindowTokens !== undefined && limits.maxOutputTokens !== undefined\n\t\t\t\t? limits.maxContextWindowTokens - limits.maxOutputTokens\n\t\t\t\t: undefined;\n\t\tconst inputCap =\n\t\t\tlimits.maxPromptTokens ??\n\t\t\t(derivedInputCap !== undefined && derivedInputCap > 0 ? derivedInputCap : undefined) ??\n\t\t\tlimits.longContextMax;\n\t\t// Only carry the cap when the displayed long window actually exceeds it (the branded-total\n\t\t// case); when they coincide there is no gap and the input budget is just the window.\n\t\tconst resolved: CopilotModelContext = longWindow > inputCap\n\t\t\t? { contextWindow: base, contextWindowOptions: [base, longWindow], maxInputTokens: inputCap }\n\t\t\t: { contextWindow: base, contextWindowOptions: [base, longWindow] };\n\t\treturn limits.maxOutputTokens !== undefined ? { ...resolved, maxTokens: limits.maxOutputTokens } : resolved;\n\t}\n\treturn limits.maxOutputTokens !== undefined ? { contextWindow: base, maxTokens: limits.maxOutputTokens } : { contextWindow: base };\n}\n\n/**\n * Parse a raw CAPI `/models` response body into an input-token context-window catalog.\n */\nexport function parseCopilotModelCatalog(body: unknown): CopilotModelCatalog {\n\tconst catalog = new Map<string, CopilotModelContext>();\n\tconst data = asRecord(body)?.data;\n\tif (!Array.isArray(data)) return catalog;\n\n\tfor (const entry of data) {\n\t\tconst record = asRecord(entry);\n\t\tif (!record) continue;\n\t\tconst id = record.id;\n\t\tif (typeof id !== \"string\" || id.length === 0) continue;\n\n\t\tconst capabilities = asRecord(record.capabilities);\n\t\tconst limitsRecord = asRecord(capabilities?.limits);\n\t\tconst prices = asRecord(asRecord(record.billing)?.token_prices);\n\t\tconst limits = parseCopilotLimits(limitsRecord, prices);\n\t\tconst context = resolveCopilotModelContext(limits);\n\t\tif (context) {\n\t\t\tconst policy = asRecord(record.policy);\n\t\t\tcatalog.set(id, {\n\t\t\t\t...context,\n\t\t\t\tdisplayName: typeof record.name === \"string\" && record.name.length > 0 ? record.name : undefined,\n\t\t\t\tvendor: typeof record.vendor === \"string\" && record.vendor.length > 0 ? record.vendor : undefined,\n\t\t\t\tsupportedEndpoints: stringArray(record.supported_endpoints),\n\t\t\t\tsupports: parseCopilotSupports(capabilities?.supports),\n\t\t\t\tlimits,\n\t\t\t\tmodelPickerEnabled: typeof record.model_picker_enabled === \"boolean\" ? record.model_picker_enabled : undefined,\n\t\t\t\tpolicyState: typeof policy?.state === \"string\" ? policy.state : undefined,\n\t\t\t\ttype: typeof capabilities?.type === \"string\" ? capabilities.type : undefined,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn catalog;\n}\n\nexport interface FetchCopilotModelCatalogOptions {\n\t/** Valid Copilot CAPI bearer token (e.g. from `modelRegistry.getApiKeyForProvider`). */\n\ttoken: string;\n\t/** Override the resolved base URL; defaults to one derived from the token. */\n\tbaseUrl?: string;\n\t/** Enterprise domain, used for base-URL resolution when the token lacks a `proxy-ep`. */\n\tenterpriseDomain?: string;\n\t/** Extra/override request headers. */\n\theaders?: Record<string, string>;\n\t/** Injectable `fetch` for testing. */\n\tfetchImpl?: typeof fetch;\n\t/** Abort signal. */\n\tsignal?: AbortSignal;\n}\n\n/** Fetch and parse the live Copilot model catalog from CAPI `GET {baseUrl}/models`. */\nexport async function fetchCopilotModelCatalog(options: FetchCopilotModelCatalogOptions): Promise<CopilotModelCatalog> {\n\tconst fetchImpl = options.fetchImpl ?? fetch;\n\tconst baseUrl = options.baseUrl ?? copilotApiBaseUrlFromToken(options.token, options.enterpriseDomain);\n\tconst response = await fetchImpl(`${trimTrailingSlash(baseUrl)}/models`, {\n\t\tmethod: \"GET\",\n\t\theaders: {\n\t\t\tAccept: \"application/json\",\n\t\t\tAuthorization: `Bearer ${options.token}`,\n\t\t\t...COPILOT_CATALOG_HEADERS,\n\t\t\t...options.headers,\n\t\t},\n\t\t...(options.signal ? { signal: options.signal } : {}),\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(`GitHub Copilot /models request failed: ${response.status} ${response.statusText}`);\n\t}\n\treturn parseCopilotModelCatalog(await response.json());\n}\n\n// ----------------------------------------------------------------------------\n// Active in-memory catalog (consulted by the model registry).\n//\n// Empty by default, so with no Copilot auth / no successful fetch the registry leaves Copilot\n// model context windows untouched and the picker never appears.\n// ----------------------------------------------------------------------------\n\nlet activeCatalog: CopilotModelCatalog = new Map();\n\n/** Replace the active catalog the registry derives context windows from. */\nexport function setActiveCopilotModelCatalog(catalog: CopilotModelCatalog): void {\n\tactiveCatalog = catalog;\n}\n\n/** The active catalog (empty until a successful auth-gated fetch/cache load). */\nexport function getActiveCopilotModelCatalog(): CopilotModelCatalog {\n\treturn activeCatalog;\n}\n\n/** Reset the active catalog (primarily for tests). */\nexport function clearActiveCopilotModelCatalog(): void {\n\tactiveCatalog = new Map();\n}\n\n// ----------------------------------------------------------------------------\n// Disk cache.\n// ----------------------------------------------------------------------------\n\ninterface CopilotCatalogCacheFile {\n\tversion: typeof COPILOT_CATALOG_CACHE_VERSION;\n\t/** CAPI host the catalog was fetched from; cache misses on host change (e.g. enterprise switch). */\n\thost: string;\n\t/** Epoch ms the catalog was fetched. */\n\tfetchedAt: number;\n\tmodels: Record<string, CopilotModelContext>;\n}\n\nfunction hostFromBaseUrl(baseUrl: string): string {\n\ttry {\n\t\treturn new URL(baseUrl).host;\n\t} catch {\n\t\treturn baseUrl;\n\t}\n}\n\nexport interface ReadCopilotCatalogCacheOptions {\n\t/** Expected CAPI host; a cached file from a different host is ignored. */\n\thost: string;\n\t/** Current epoch ms (injectable for tests). */\n\tnow?: number;\n\t/** Freshness window; defaults to {@link COPILOT_CATALOG_CACHE_TTL_MS}. */\n\tttlMs?: number;\n}\n\nfunction sanitizeCachedSupports(value: unknown): CopilotModelSupports | undefined {\n\tconst record = asRecord(value);\n\tif (!record) return undefined;\n\tconst supports: CopilotModelSupports = {\n\t\tadaptiveThinking: supportedFlag(record, \"adaptiveThinking\"),\n\t\tmaxThinkingBudget: supportedFlag(record, \"maxThinkingBudget\"),\n\t\tminThinkingBudget: supportedFlag(record, \"minThinkingBudget\"),\n\t\tparallelToolCalls: supportedFlag(record, \"parallelToolCalls\"),\n\t\treasoningEffort: supportedFlag(record, \"reasoningEffort\"),\n\t\treasoningEffortLevels: stringArray(record.reasoningEffortLevels),\n\t\tstreaming: supportedFlag(record, \"streaming\"),\n\t\tstructuredOutputs: supportedFlag(record, \"structuredOutputs\"),\n\t\ttoolCalls: supportedFlag(record, \"toolCalls\"),\n\t\tvision: supportedFlag(record, \"vision\"),\n\t};\n\treturn Object.values(supports).some((flag) => flag !== undefined) ? supports : undefined;\n}\n\nfunction sanitizeCachedLimits(value: unknown): CopilotModelLimits | undefined {\n\tconst record = asRecord(value);\n\tif (!record) return undefined;\n\tconst limits: CopilotModelLimits = {\n\t\tmaxPromptTokens: toPositiveInt(record.maxPromptTokens),\n\t\tmaxContextWindowTokens: toPositiveInt(record.maxContextWindowTokens),\n\t\tmaxOutputTokens: toPositiveInt(record.maxOutputTokens),\n\t\tdefaultContextMax: toPositiveInt(record.defaultContextMax),\n\t\tlongContextMax: toPositiveInt(record.longContextMax),\n\t};\n\treturn Object.values(limits).some((limit) => limit !== undefined) ? limits : undefined;\n}\n\nfunction sanitizeCachedContext(value: unknown): CopilotModelContext | undefined {\n\tconst record = asRecord(value);\n\tconst contextWindow = toPositiveInt(record?.contextWindow);\n\tif (contextWindow === undefined) return undefined;\n\tconst maxInputTokens = toPositiveInt(record?.maxInputTokens);\n\tconst maxTokens = toPositiveInt(record?.maxTokens);\n\tconst rawOptions = record?.contextWindowOptions;\n\tconst base: CopilotModelContext = maxInputTokens !== undefined ? { contextWindow, maxInputTokens } : { contextWindow };\n\tif (maxTokens !== undefined) base.maxTokens = maxTokens;\n\tif (Array.isArray(rawOptions)) {\n\t\tconst options = rawOptions.map(toPositiveInt).filter((n): n is number => n !== undefined);\n\t\tif (options.length > 1) base.contextWindowOptions = options;\n\t}\n\tconst displayName = record && typeof record.displayName === \"string\" && record.displayName.length > 0 ? record.displayName : undefined;\n\tconst vendor = record && typeof record.vendor === \"string\" && record.vendor.length > 0 ? record.vendor : undefined;\n\tconst policyState = record && typeof record.policyState === \"string\" ? record.policyState : undefined;\n\tconst type = record && typeof record.type === \"string\" ? record.type : undefined;\n\treturn {\n\t\t...base,\n\t\tdisplayName,\n\t\tvendor,\n\t\tsupportedEndpoints: stringArray(record?.supportedEndpoints),\n\t\tsupports: sanitizeCachedSupports(record?.supports),\n\t\tlimits: sanitizeCachedLimits(record?.limits),\n\t\tmodelPickerEnabled: typeof record?.modelPickerEnabled === \"boolean\" ? record.modelPickerEnabled : undefined,\n\t\tpolicyState,\n\t\ttype,\n\t};\n}\n\nexport function readCopilotCatalogCache(\n\tpath: string,\n\toptions: ReadCopilotCatalogCacheOptions,\n): CopilotModelCatalog | undefined {\n\tlet parsed: CopilotCatalogCacheFile;\n\ttry {\n\t\tif (!existsSync(path)) return undefined;\n\t\tparsed = JSON.parse(readFileSync(path, \"utf8\")) as CopilotCatalogCacheFile;\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!parsed || parsed.version !== COPILOT_CATALOG_CACHE_VERSION) return undefined;\n\tif (parsed.host !== options.host) return undefined;\n\tconst now = options.now ?? Date.now();\n\tconst ttlMs = options.ttlMs ?? COPILOT_CATALOG_CACHE_TTL_MS;\n\tif (typeof parsed.fetchedAt !== \"number\" || now - parsed.fetchedAt >= ttlMs) return undefined;\n\tconst models = asRecord(parsed.models);\n\tif (!models) return undefined;\n\n\tconst catalog = new Map<string, CopilotModelContext>();\n\tfor (const [id, value] of Object.entries(models)) {\n\t\tconst context = sanitizeCachedContext(value);\n\t\tif (context) catalog.set(id, context);\n\t}\n\treturn catalog;\n}\n\nexport function writeCopilotCatalogCache(\n\tpath: string,\n\tbaseUrl: string,\n\tcatalog: CopilotModelCatalog,\n\tnow?: number,\n): void {\n\tconst payload: CopilotCatalogCacheFile = {\n\t\tversion: COPILOT_CATALOG_CACHE_VERSION,\n\t\thost: hostFromBaseUrl(baseUrl),\n\t\tfetchedAt: now ?? Date.now(),\n\t\tmodels: Object.fromEntries(catalog),\n\t};\n\ttry {\n\t\tmkdirSync(dirname(path), { recursive: true });\n\t\twriteFileSync(path, JSON.stringify(payload), \"utf8\");\n\t} catch {\n\t\t// best-effort cache; ignore write failures\n\t}\n}\n\nexport function copilotCatalogCacheHost(baseUrl: string): string {\n\treturn hostFromBaseUrl(baseUrl);\n}\n\nexport function copilotCatalogCachePath(agentDir: string): string {\n\treturn join(agentDir, \"cache\", \"copilot-models.json\");\n}\n\n/**\n * Seed the active catalog synchronously from the on-disk cache, gated on a Copilot access token.\n *\n * Called at model-registry construction so a returning user's previously selected long-context\n * window is recognized before startup validation runs — otherwise the persisted choice would warn\n * (\"context window 936k is not supported…\") and reset until the async refresh completes. The cache\n * TTL is intentionally ignored here: stale-but-present windows are still valid for selection, and\n * the async loader independently refetches on its own freshness window. Returns true when a catalog\n * was applied. No-op (returns false) without a token or a host-matching cached catalog.\n */\nexport function seedActiveCopilotModelCatalogFromCache(\n\taccessToken: string | undefined,\n\tcachePath: string,\n\tnow?: number,\n): boolean {\n\tif (typeof accessToken !== \"string\" || accessToken.length === 0) return false;\n\tconst host = copilotCatalogCacheHost(copilotApiBaseUrlFromToken(accessToken));\n\tconst cached = readCopilotCatalogCache(cachePath, { host, now, ttlMs: Number.POSITIVE_INFINITY });\n\tif (!cached) return false;\n\tsetActiveCopilotModelCatalog(cached);\n\treturn true;\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import type { CopilotModelContext } from "./copilot-model-catalog.ts";
2
+ /**
3
+ * Static CAPI-derived limit snapshot for bundled GitHub Copilot models.
4
+ *
5
+ * CAPI is the source of truth for what GitHub actually enforces, and the live
6
+ * `/models` catalog (or its disk cache) is always authoritative when
7
+ * available — this table is consulted **only when the active catalog has no
8
+ * entry for the model** (cold start without cache, catalog fetch failure,
9
+ * network-restricted environments such as eval containers or CI). Without it,
10
+ * the bundled pi-ai metadata wins, and several bundled entries disagree with
11
+ * CAPI (snapshotted 2026-07-02): the gpt-5.x family claims a 400k window vs
12
+ * CAPI's enforced 272k default tier, claude-opus-4.6/claude-sonnet-4.6 claim
13
+ * the branded 1M window as their base tier vs CAPI's 200k default, and
14
+ * claude-opus-4.6/4.7 ship a 32k output cap vs CAPI's real 64k.
15
+ *
16
+ * Why this matters (issue #1608): auto-compaction thresholds and overflow
17
+ * recovery are driven by `model.contextWindow`, and request output caps by
18
+ * `model.maxTokens`. With an overstated window a session never compacts,
19
+ * sails past the server-side cap, and CAPI starts intercepting requests with
20
+ * canned zero-usage refusals ("I'm sorry, but I cannot assist with that
21
+ * request.") reported as `stopReason: "length"`. Understated output caps
22
+ * instead truncate long responses below the real limit.
23
+ *
24
+ * Entries mirror the shape `resolveCopilotModelContext` derives from CAPI
25
+ * `capabilities.limits` / `billing.token_prices`, including the long-context
26
+ * tier where CAPI advertises one (`contextWindowOptions` with the branded
27
+ * window plus the hard `maxInputTokens` prompt cap, e.g. 922k input + 128k
28
+ * output for gpt-5.5's 1.05M tier). This keeps a returning user's persisted
29
+ * long-context selection valid on a cold start without a catalog; actual long
30
+ * tier use is still gated server-side by entitlement, with the existing
31
+ * friendly-error handling on rejection. The snapshot covers every bundled
32
+ * model present in the CAPI catalog — also the currently-agreeing ones — so
33
+ * upstream metadata drift cannot silently reintroduce the failure. Bundled
34
+ * models absent from the CAPI catalog (retired or not-yet-listed ids) are
35
+ * intentionally omitted — there is no CAPI ground truth to snapshot for them.
36
+ */
37
+ export type StaticCopilotModelFallback = Pick<CopilotModelContext, "contextWindow" | "contextWindowOptions" | "maxInputTokens" | "maxTokens">;
38
+ /**
39
+ * Look up the static CAPI-derived limits for a bundled Copilot model. Returns
40
+ * undefined for models with no CAPI catalog presence to snapshot.
41
+ */
42
+ export declare function getStaticCopilotModelFallback(modelId: string): StaticCopilotModelFallback | undefined;
43
+ //# sourceMappingURL=copilot-model-static-fallbacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-model-static-fallbacks.d.ts","sourceRoot":"","sources":["../../src/core/copilot-model-static-fallbacks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC5C,mBAAmB,EACnB,eAAe,GAAG,sBAAsB,GAAG,gBAAgB,GAAG,WAAW,CACzE,CAAC;AA+CF;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS,CAErG","sourcesContent":["import type { CopilotModelContext } from \"./copilot-model-catalog.ts\";\n\n/**\n * Static CAPI-derived limit snapshot for bundled GitHub Copilot models.\n *\n * CAPI is the source of truth for what GitHub actually enforces, and the live\n * `/models` catalog (or its disk cache) is always authoritative when\n * available — this table is consulted **only when the active catalog has no\n * entry for the model** (cold start without cache, catalog fetch failure,\n * network-restricted environments such as eval containers or CI). Without it,\n * the bundled pi-ai metadata wins, and several bundled entries disagree with\n * CAPI (snapshotted 2026-07-02): the gpt-5.x family claims a 400k window vs\n * CAPI's enforced 272k default tier, claude-opus-4.6/claude-sonnet-4.6 claim\n * the branded 1M window as their base tier vs CAPI's 200k default, and\n * claude-opus-4.6/4.7 ship a 32k output cap vs CAPI's real 64k.\n *\n * Why this matters (issue #1608): auto-compaction thresholds and overflow\n * recovery are driven by `model.contextWindow`, and request output caps by\n * `model.maxTokens`. With an overstated window a session never compacts,\n * sails past the server-side cap, and CAPI starts intercepting requests with\n * canned zero-usage refusals (\"I'm sorry, but I cannot assist with that\n * request.\") reported as `stopReason: \"length\"`. Understated output caps\n * instead truncate long responses below the real limit.\n *\n * Entries mirror the shape `resolveCopilotModelContext` derives from CAPI\n * `capabilities.limits` / `billing.token_prices`, including the long-context\n * tier where CAPI advertises one (`contextWindowOptions` with the branded\n * window plus the hard `maxInputTokens` prompt cap, e.g. 922k input + 128k\n * output for gpt-5.5's 1.05M tier). This keeps a returning user's persisted\n * long-context selection valid on a cold start without a catalog; actual long\n * tier use is still gated server-side by entitlement, with the existing\n * friendly-error handling on rejection. The snapshot covers every bundled\n * model present in the CAPI catalog — also the currently-agreeing ones — so\n * upstream metadata drift cannot silently reintroduce the failure. Bundled\n * models absent from the CAPI catalog (retired or not-yet-listed ids) are\n * intentionally omitted — there is no CAPI ground truth to snapshot for them.\n */\n\nexport type StaticCopilotModelFallback = Pick<\n\tCopilotModelContext,\n\t\"contextWindow\" | \"contextWindowOptions\" | \"maxInputTokens\" | \"maxTokens\"\n>;\n\n/** CAPI 1.05M long-context tier shared by the tiered OpenAI gpt-5.x models. */\nconst OPENAI_LONG_TIER: StaticCopilotModelFallback = {\n\tcontextWindow: 272_000,\n\tcontextWindowOptions: [272_000, 1_050_000],\n\tmaxInputTokens: 922_000,\n\tmaxTokens: 128_000,\n};\n\n/** CAPI 1M long-context tier shared by tiered Anthropic/Google models. */\nconst BRANDED_1M_TIER: StaticCopilotModelFallback = {\n\tcontextWindow: 200_000,\n\tcontextWindowOptions: [200_000, 1_000_000],\n\tmaxInputTokens: 936_000,\n\tmaxTokens: 64_000,\n};\n\nconst STATIC_COPILOT_MODEL_FALLBACKS: ReadonlyMap<string, StaticCopilotModelFallback> = new Map<string, StaticCopilotModelFallback>([\n\t// OpenAI: bundled metadata claims a 400k base window; CAPI's default tier is\n\t// 272k, with a 1.05M long tier (922k input cap) on gpt-5.5/gpt-5.4.\n\t[\"gpt-5.5\", OPENAI_LONG_TIER],\n\t[\"gpt-5.4\", OPENAI_LONG_TIER],\n\t[\"gpt-5.4-mini\", { contextWindow: 272_000, maxTokens: 128_000 }],\n\t[\"gpt-5.3-codex\", { contextWindow: 272_000, maxTokens: 128_000 }],\n\t// Bundled metadata claims 264k; CAPI enforces 128k.\n\t[\"gpt-5-mini\", { contextWindow: 128_000, maxTokens: 64_000 }],\n\t[\"gpt-4.1\", { contextWindow: 128_000, maxTokens: 16_384 }],\n\t// Anthropic: CAPI's default tier is 200k with a 1M long tier (936k input\n\t// cap). Bundled claude-opus-4.6/claude-sonnet-4.6 wrongly claim the branded\n\t// 1M window as the base tier, and bundled opus-4.6/4.7 output caps are half\n\t// of CAPI's real 64k.\n\t[\"claude-opus-4.6\", BRANDED_1M_TIER],\n\t[\"claude-opus-4.7\", BRANDED_1M_TIER],\n\t[\"claude-opus-4.8\", BRANDED_1M_TIER],\n\t[\"claude-sonnet-4.6\", BRANDED_1M_TIER],\n\t// Bundled metadata claims 200k; CAPI enforces smaller default windows, with\n\t// no long tier.\n\t[\"claude-haiku-4.5\", { contextWindow: 136_000, maxTokens: 64_000 }],\n\t[\"claude-sonnet-4.5\", { contextWindow: 168_000, maxTokens: 32_000 }],\n\t// Google: the pro/3.5 models share the branded 1M tier structure.\n\t[\"gemini-3.1-pro-preview\", BRANDED_1M_TIER],\n\t[\"gemini-3.5-flash\", BRANDED_1M_TIER],\n\t[\"gemini-2.5-pro\", { contextWindow: 128_000, maxTokens: 64_000 }],\n\t[\"gemini-3-flash-preview\", { contextWindow: 128_000, maxTokens: 64_000 }],\n]);\n\n/**\n * Look up the static CAPI-derived limits for a bundled Copilot model. Returns\n * undefined for models with no CAPI catalog presence to snapshot.\n */\nexport function getStaticCopilotModelFallback(modelId: string): StaticCopilotModelFallback | undefined {\n\treturn STATIC_COPILOT_MODEL_FALLBACKS.get(modelId);\n}\n"]}
@@ -0,0 +1,50 @@
1
+ /** CAPI 1.05M long-context tier shared by the tiered OpenAI gpt-5.x models. */
2
+ const OPENAI_LONG_TIER = {
3
+ contextWindow: 272_000,
4
+ contextWindowOptions: [272_000, 1_050_000],
5
+ maxInputTokens: 922_000,
6
+ maxTokens: 128_000,
7
+ };
8
+ /** CAPI 1M long-context tier shared by tiered Anthropic/Google models. */
9
+ const BRANDED_1M_TIER = {
10
+ contextWindow: 200_000,
11
+ contextWindowOptions: [200_000, 1_000_000],
12
+ maxInputTokens: 936_000,
13
+ maxTokens: 64_000,
14
+ };
15
+ const STATIC_COPILOT_MODEL_FALLBACKS = new Map([
16
+ // OpenAI: bundled metadata claims a 400k base window; CAPI's default tier is
17
+ // 272k, with a 1.05M long tier (922k input cap) on gpt-5.5/gpt-5.4.
18
+ ["gpt-5.5", OPENAI_LONG_TIER],
19
+ ["gpt-5.4", OPENAI_LONG_TIER],
20
+ ["gpt-5.4-mini", { contextWindow: 272_000, maxTokens: 128_000 }],
21
+ ["gpt-5.3-codex", { contextWindow: 272_000, maxTokens: 128_000 }],
22
+ // Bundled metadata claims 264k; CAPI enforces 128k.
23
+ ["gpt-5-mini", { contextWindow: 128_000, maxTokens: 64_000 }],
24
+ ["gpt-4.1", { contextWindow: 128_000, maxTokens: 16_384 }],
25
+ // Anthropic: CAPI's default tier is 200k with a 1M long tier (936k input
26
+ // cap). Bundled claude-opus-4.6/claude-sonnet-4.6 wrongly claim the branded
27
+ // 1M window as the base tier, and bundled opus-4.6/4.7 output caps are half
28
+ // of CAPI's real 64k.
29
+ ["claude-opus-4.6", BRANDED_1M_TIER],
30
+ ["claude-opus-4.7", BRANDED_1M_TIER],
31
+ ["claude-opus-4.8", BRANDED_1M_TIER],
32
+ ["claude-sonnet-4.6", BRANDED_1M_TIER],
33
+ // Bundled metadata claims 200k; CAPI enforces smaller default windows, with
34
+ // no long tier.
35
+ ["claude-haiku-4.5", { contextWindow: 136_000, maxTokens: 64_000 }],
36
+ ["claude-sonnet-4.5", { contextWindow: 168_000, maxTokens: 32_000 }],
37
+ // Google: the pro/3.5 models share the branded 1M tier structure.
38
+ ["gemini-3.1-pro-preview", BRANDED_1M_TIER],
39
+ ["gemini-3.5-flash", BRANDED_1M_TIER],
40
+ ["gemini-2.5-pro", { contextWindow: 128_000, maxTokens: 64_000 }],
41
+ ["gemini-3-flash-preview", { contextWindow: 128_000, maxTokens: 64_000 }],
42
+ ]);
43
+ /**
44
+ * Look up the static CAPI-derived limits for a bundled Copilot model. Returns
45
+ * undefined for models with no CAPI catalog presence to snapshot.
46
+ */
47
+ export function getStaticCopilotModelFallback(modelId) {
48
+ return STATIC_COPILOT_MODEL_FALLBACKS.get(modelId);
49
+ }
50
+ //# sourceMappingURL=copilot-model-static-fallbacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-model-static-fallbacks.js","sourceRoot":"","sources":["../../src/core/copilot-model-static-fallbacks.ts"],"names":[],"mappings":"AA2CA,+EAA+E;AAC/E,MAAM,gBAAgB,GAA+B;IACpD,aAAa,EAAE,OAAO;IACtB,oBAAoB,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;IAC1C,cAAc,EAAE,OAAO;IACvB,SAAS,EAAE,OAAO;CAClB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,eAAe,GAA+B;IACnD,aAAa,EAAE,OAAO;IACtB,oBAAoB,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;IAC1C,cAAc,EAAE,OAAO;IACvB,SAAS,EAAE,MAAM;CACjB,CAAC;AAEF,MAAM,8BAA8B,GAAoD,IAAI,GAAG,CAAqC;IACnI,6EAA6E;IAC7E,oEAAoE;IACpE,CAAC,SAAS,EAAE,gBAAgB,CAAC;IAC7B,CAAC,SAAS,EAAE,gBAAgB,CAAC;IAC7B,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAChE,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACjE,oDAAoD;IACpD,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC7D,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC1D,yEAAyE;IACzE,4EAA4E;IAC5E,4EAA4E;IAC5E,sBAAsB;IACtB,CAAC,iBAAiB,EAAE,eAAe,CAAC;IACpC,CAAC,iBAAiB,EAAE,eAAe,CAAC;IACpC,CAAC,iBAAiB,EAAE,eAAe,CAAC;IACpC,CAAC,mBAAmB,EAAE,eAAe,CAAC;IACtC,4EAA4E;IAC5E,gBAAgB;IAChB,CAAC,kBAAkB,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACnE,CAAC,mBAAmB,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpE,kEAAkE;IAClE,CAAC,wBAAwB,EAAE,eAAe,CAAC;IAC3C,CAAC,kBAAkB,EAAE,eAAe,CAAC;IACrC,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACjE,CAAC,wBAAwB,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;CACzE,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAAC,OAAe;IAC5D,OAAO,8BAA8B,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC","sourcesContent":["import type { CopilotModelContext } from \"./copilot-model-catalog.ts\";\n\n/**\n * Static CAPI-derived limit snapshot for bundled GitHub Copilot models.\n *\n * CAPI is the source of truth for what GitHub actually enforces, and the live\n * `/models` catalog (or its disk cache) is always authoritative when\n * available — this table is consulted **only when the active catalog has no\n * entry for the model** (cold start without cache, catalog fetch failure,\n * network-restricted environments such as eval containers or CI). Without it,\n * the bundled pi-ai metadata wins, and several bundled entries disagree with\n * CAPI (snapshotted 2026-07-02): the gpt-5.x family claims a 400k window vs\n * CAPI's enforced 272k default tier, claude-opus-4.6/claude-sonnet-4.6 claim\n * the branded 1M window as their base tier vs CAPI's 200k default, and\n * claude-opus-4.6/4.7 ship a 32k output cap vs CAPI's real 64k.\n *\n * Why this matters (issue #1608): auto-compaction thresholds and overflow\n * recovery are driven by `model.contextWindow`, and request output caps by\n * `model.maxTokens`. With an overstated window a session never compacts,\n * sails past the server-side cap, and CAPI starts intercepting requests with\n * canned zero-usage refusals (\"I'm sorry, but I cannot assist with that\n * request.\") reported as `stopReason: \"length\"`. Understated output caps\n * instead truncate long responses below the real limit.\n *\n * Entries mirror the shape `resolveCopilotModelContext` derives from CAPI\n * `capabilities.limits` / `billing.token_prices`, including the long-context\n * tier where CAPI advertises one (`contextWindowOptions` with the branded\n * window plus the hard `maxInputTokens` prompt cap, e.g. 922k input + 128k\n * output for gpt-5.5's 1.05M tier). This keeps a returning user's persisted\n * long-context selection valid on a cold start without a catalog; actual long\n * tier use is still gated server-side by entitlement, with the existing\n * friendly-error handling on rejection. The snapshot covers every bundled\n * model present in the CAPI catalog — also the currently-agreeing ones — so\n * upstream metadata drift cannot silently reintroduce the failure. Bundled\n * models absent from the CAPI catalog (retired or not-yet-listed ids) are\n * intentionally omitted — there is no CAPI ground truth to snapshot for them.\n */\n\nexport type StaticCopilotModelFallback = Pick<\n\tCopilotModelContext,\n\t\"contextWindow\" | \"contextWindowOptions\" | \"maxInputTokens\" | \"maxTokens\"\n>;\n\n/** CAPI 1.05M long-context tier shared by the tiered OpenAI gpt-5.x models. */\nconst OPENAI_LONG_TIER: StaticCopilotModelFallback = {\n\tcontextWindow: 272_000,\n\tcontextWindowOptions: [272_000, 1_050_000],\n\tmaxInputTokens: 922_000,\n\tmaxTokens: 128_000,\n};\n\n/** CAPI 1M long-context tier shared by tiered Anthropic/Google models. */\nconst BRANDED_1M_TIER: StaticCopilotModelFallback = {\n\tcontextWindow: 200_000,\n\tcontextWindowOptions: [200_000, 1_000_000],\n\tmaxInputTokens: 936_000,\n\tmaxTokens: 64_000,\n};\n\nconst STATIC_COPILOT_MODEL_FALLBACKS: ReadonlyMap<string, StaticCopilotModelFallback> = new Map<string, StaticCopilotModelFallback>([\n\t// OpenAI: bundled metadata claims a 400k base window; CAPI's default tier is\n\t// 272k, with a 1.05M long tier (922k input cap) on gpt-5.5/gpt-5.4.\n\t[\"gpt-5.5\", OPENAI_LONG_TIER],\n\t[\"gpt-5.4\", OPENAI_LONG_TIER],\n\t[\"gpt-5.4-mini\", { contextWindow: 272_000, maxTokens: 128_000 }],\n\t[\"gpt-5.3-codex\", { contextWindow: 272_000, maxTokens: 128_000 }],\n\t// Bundled metadata claims 264k; CAPI enforces 128k.\n\t[\"gpt-5-mini\", { contextWindow: 128_000, maxTokens: 64_000 }],\n\t[\"gpt-4.1\", { contextWindow: 128_000, maxTokens: 16_384 }],\n\t// Anthropic: CAPI's default tier is 200k with a 1M long tier (936k input\n\t// cap). Bundled claude-opus-4.6/claude-sonnet-4.6 wrongly claim the branded\n\t// 1M window as the base tier, and bundled opus-4.6/4.7 output caps are half\n\t// of CAPI's real 64k.\n\t[\"claude-opus-4.6\", BRANDED_1M_TIER],\n\t[\"claude-opus-4.7\", BRANDED_1M_TIER],\n\t[\"claude-opus-4.8\", BRANDED_1M_TIER],\n\t[\"claude-sonnet-4.6\", BRANDED_1M_TIER],\n\t// Bundled metadata claims 200k; CAPI enforces smaller default windows, with\n\t// no long tier.\n\t[\"claude-haiku-4.5\", { contextWindow: 136_000, maxTokens: 64_000 }],\n\t[\"claude-sonnet-4.5\", { contextWindow: 168_000, maxTokens: 32_000 }],\n\t// Google: the pro/3.5 models share the branded 1M tier structure.\n\t[\"gemini-3.1-pro-preview\", BRANDED_1M_TIER],\n\t[\"gemini-3.5-flash\", BRANDED_1M_TIER],\n\t[\"gemini-2.5-pro\", { contextWindow: 128_000, maxTokens: 64_000 }],\n\t[\"gemini-3-flash-preview\", { contextWindow: 128_000, maxTokens: 64_000 }],\n]);\n\n/**\n * Look up the static CAPI-derived limits for a bundled Copilot model. Returns\n * undefined for models with no CAPI catalog presence to snapshot.\n */\nexport function getStaticCopilotModelFallback(modelId: string): StaticCopilotModelFallback | undefined {\n\treturn STATIC_COPILOT_MODEL_FALLBACKS.get(modelId);\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { Api, Model } from "@earendil-works/pi-ai/compat";
2
+ import { type CopilotModelContext } from "./copilot-model-catalog.ts";
3
+ export interface CopilotModelTemplate {
4
+ baseUrl: string;
5
+ headers?: Record<string, string>;
6
+ }
7
+ export declare function copilotThinkingLevelMapFor(entry: CopilotModelContext, api: Api): Model<Api>["thinkingLevelMap"] | undefined;
8
+ export declare function copilotTemplateFromModels(models: readonly Model<Api>[]): CopilotModelTemplate;
9
+ export declare function synthesizeCopilotCatalogModels(catalog: ReadonlyMap<string, CopilotModelContext>, existingIds: ReadonlySet<string>, template: CopilotModelTemplate): Model<Api>[];
10
+ //# sourceMappingURL=copilot-model-synthesis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-model-synthesis.d.ts","sourceRoot":"","sources":["../../src/core/copilot-model-synthesis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAyD,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAa7H,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAkB3H;AAqBD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,oBAAoB,CAM7F;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,EACjD,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAChC,QAAQ,EAAE,oBAAoB,GAC5B,KAAK,CAAC,GAAG,CAAC,EAAE,CA4Bd","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { COPILOT_CATALOG_HEADERS, DEFAULT_COPILOT_API_BASE_URL, type CopilotModelContext } from \"./copilot-model-catalog.ts\";\nimport { withContextWindowOptions } from \"./context-window.ts\";\n\nconst GITHUB_COPILOT_PROVIDER = \"github-copilot\";\nconst ENDPOINT_API_PREFERENCE = [\n\t[\"/v1/messages\", \"anthropic-messages\"],\n\t[\"/responses\", \"openai-responses\"],\n\t[\"/chat/completions\", \"openai-completions\"],\n] as const satisfies readonly (readonly [string, Api])[];\n\nconst ZERO_COST: Model<Api>[\"cost\"] = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst ADAPTIVE_THINKING_LEVEL_MAP: Model<Api>[\"thinkingLevelMap\"] = { minimal: \"low\", xhigh: \"max\" };\n\nexport interface CopilotModelTemplate {\n\tbaseUrl: string;\n\theaders?: Record<string, string>;\n}\n\nexport function copilotThinkingLevelMapFor(entry: CopilotModelContext, api: Api): Model<Api>[\"thinkingLevelMap\"] | undefined {\n\tconst advertised = entry.supports?.reasoningEffortLevels;\n\tif (!advertised || advertised.length === 0) {\n\t\treturn entry.supports?.adaptiveThinking ? ADAPTIVE_THINKING_LEVEL_MAP : undefined;\n\t}\n\n\tconst levels = new Set(advertised);\n\tconst map: Model<Api>[\"thinkingLevelMap\"] = {\n\t\tminimal: levels.has(\"minimal\") ? \"minimal\" : null,\n\t\tlow: levels.has(\"low\") ? \"low\" : null,\n\t\tmedium: levels.has(\"medium\") ? \"medium\" : null,\n\t\thigh: levels.has(\"high\") ? \"high\" : null,\n\t};\n\tif (levels.has(\"none\")) map.off = \"none\";\n\telse if (api !== \"anthropic-messages\" || !entry.supports?.adaptiveThinking) map.off = null;\n\tif (levels.has(\"xhigh\")) map.xhigh = \"xhigh\";\n\telse if (levels.has(\"max\") && entry.supports?.adaptiveThinking) map.xhigh = \"max\";\n\treturn map;\n}\n\nfunction mapCopilotApi(entry: CopilotModelContext): Api | undefined {\n\tconst endpoints = new Set(entry.supportedEndpoints ?? []);\n\treturn ENDPOINT_API_PREFERENCE.find(([endpoint]) => endpoints.has(endpoint))?.[1];\n}\n\nfunction hasReasoning(entry: CopilotModelContext): boolean {\n\treturn Boolean(\n\t\tentry.supports?.reasoningEffort || entry.supports?.adaptiveThinking || entry.supports?.minThinkingBudget || entry.supports?.maxThinkingBudget,\n\t);\n}\n\nfunction canSynthesizeCopilotModel(id: string, entry: CopilotModelContext): boolean {\n\tif (id.includes(\"/\")) return false;\n\tif (entry.modelPickerEnabled !== true) return false;\n\tif (entry.type !== \"chat\") return false;\n\tif (entry.policyState?.toLowerCase() === \"disabled\") return false;\n\treturn mapCopilotApi(entry) !== undefined;\n}\n\nexport function copilotTemplateFromModels(models: readonly Model<Api>[]): CopilotModelTemplate {\n\tconst sibling = models.find((model) => model.provider === GITHUB_COPILOT_PROVIDER);\n\treturn {\n\t\tbaseUrl: sibling?.baseUrl ?? DEFAULT_COPILOT_API_BASE_URL,\n\t\theaders: sibling?.headers ?? COPILOT_CATALOG_HEADERS,\n\t};\n}\n\nexport function synthesizeCopilotCatalogModels(\n\tcatalog: ReadonlyMap<string, CopilotModelContext>,\n\texistingIds: ReadonlySet<string>,\n\ttemplate: CopilotModelTemplate,\n): Model<Api>[] {\n\tconst synthesized: Model<Api>[] = [];\n\tfor (const [id, entry] of catalog) {\n\t\tif (existingIds.has(id) || !canSynthesizeCopilotModel(id, entry)) continue;\n\t\tconst api = mapCopilotApi(entry);\n\t\tif (!api) continue;\n\t\tlet model: Model<Api> = {\n\t\t\tid,\n\t\t\tname: entry.displayName ?? id,\n\t\t\tapi,\n\t\t\tprovider: GITHUB_COPILOT_PROVIDER,\n\t\t\tbaseUrl: template.baseUrl,\n\t\t\theaders: template.headers,\n\t\t\treasoning: hasReasoning(entry),\n\t\t\tthinkingLevelMap: copilotThinkingLevelMapFor(entry, api),\n\t\t\tcompat: entry.supports?.adaptiveThinking ? ({ forceAdaptiveThinking: true } as Model<Api>[\"compat\"]) : undefined,\n\t\t\tinput: entry.supports?.vision ? [\"text\", \"image\"] : [\"text\"],\n\t\t\tcost: ZERO_COST,\n\t\t\tmaxInputTokens: entry.maxInputTokens,\n\t\t\tcontextWindow: entry.contextWindow,\n\t\t\tmaxTokens: entry.maxTokens ?? entry.limits?.maxOutputTokens ?? entry.maxInputTokens ?? entry.contextWindow,\n\t\t};\n\t\tif (entry.contextWindowOptions && entry.contextWindowOptions.length > 1) {\n\t\t\tmodel = withContextWindowOptions(model, entry.contextWindowOptions);\n\t\t}\n\t\tsynthesized.push(model);\n\t}\n\treturn synthesized;\n}\n"]}
@@ -0,0 +1,89 @@
1
+ import { COPILOT_CATALOG_HEADERS, DEFAULT_COPILOT_API_BASE_URL } from "./copilot-model-catalog.js";
2
+ import { withContextWindowOptions } from "./context-window.js";
3
+ const GITHUB_COPILOT_PROVIDER = "github-copilot";
4
+ const ENDPOINT_API_PREFERENCE = [
5
+ ["/v1/messages", "anthropic-messages"],
6
+ ["/responses", "openai-responses"],
7
+ ["/chat/completions", "openai-completions"],
8
+ ];
9
+ const ZERO_COST = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
10
+ const ADAPTIVE_THINKING_LEVEL_MAP = { minimal: "low", xhigh: "max" };
11
+ export function copilotThinkingLevelMapFor(entry, api) {
12
+ const advertised = entry.supports?.reasoningEffortLevels;
13
+ if (!advertised || advertised.length === 0) {
14
+ return entry.supports?.adaptiveThinking ? ADAPTIVE_THINKING_LEVEL_MAP : undefined;
15
+ }
16
+ const levels = new Set(advertised);
17
+ const map = {
18
+ minimal: levels.has("minimal") ? "minimal" : null,
19
+ low: levels.has("low") ? "low" : null,
20
+ medium: levels.has("medium") ? "medium" : null,
21
+ high: levels.has("high") ? "high" : null,
22
+ };
23
+ if (levels.has("none"))
24
+ map.off = "none";
25
+ else if (api !== "anthropic-messages" || !entry.supports?.adaptiveThinking)
26
+ map.off = null;
27
+ if (levels.has("xhigh"))
28
+ map.xhigh = "xhigh";
29
+ else if (levels.has("max") && entry.supports?.adaptiveThinking)
30
+ map.xhigh = "max";
31
+ return map;
32
+ }
33
+ function mapCopilotApi(entry) {
34
+ const endpoints = new Set(entry.supportedEndpoints ?? []);
35
+ return ENDPOINT_API_PREFERENCE.find(([endpoint]) => endpoints.has(endpoint))?.[1];
36
+ }
37
+ function hasReasoning(entry) {
38
+ return Boolean(entry.supports?.reasoningEffort || entry.supports?.adaptiveThinking || entry.supports?.minThinkingBudget || entry.supports?.maxThinkingBudget);
39
+ }
40
+ function canSynthesizeCopilotModel(id, entry) {
41
+ if (id.includes("/"))
42
+ return false;
43
+ if (entry.modelPickerEnabled !== true)
44
+ return false;
45
+ if (entry.type !== "chat")
46
+ return false;
47
+ if (entry.policyState?.toLowerCase() === "disabled")
48
+ return false;
49
+ return mapCopilotApi(entry) !== undefined;
50
+ }
51
+ export function copilotTemplateFromModels(models) {
52
+ const sibling = models.find((model) => model.provider === GITHUB_COPILOT_PROVIDER);
53
+ return {
54
+ baseUrl: sibling?.baseUrl ?? DEFAULT_COPILOT_API_BASE_URL,
55
+ headers: sibling?.headers ?? COPILOT_CATALOG_HEADERS,
56
+ };
57
+ }
58
+ export function synthesizeCopilotCatalogModels(catalog, existingIds, template) {
59
+ const synthesized = [];
60
+ for (const [id, entry] of catalog) {
61
+ if (existingIds.has(id) || !canSynthesizeCopilotModel(id, entry))
62
+ continue;
63
+ const api = mapCopilotApi(entry);
64
+ if (!api)
65
+ continue;
66
+ let model = {
67
+ id,
68
+ name: entry.displayName ?? id,
69
+ api,
70
+ provider: GITHUB_COPILOT_PROVIDER,
71
+ baseUrl: template.baseUrl,
72
+ headers: template.headers,
73
+ reasoning: hasReasoning(entry),
74
+ thinkingLevelMap: copilotThinkingLevelMapFor(entry, api),
75
+ compat: entry.supports?.adaptiveThinking ? { forceAdaptiveThinking: true } : undefined,
76
+ input: entry.supports?.vision ? ["text", "image"] : ["text"],
77
+ cost: ZERO_COST,
78
+ maxInputTokens: entry.maxInputTokens,
79
+ contextWindow: entry.contextWindow,
80
+ maxTokens: entry.maxTokens ?? entry.limits?.maxOutputTokens ?? entry.maxInputTokens ?? entry.contextWindow,
81
+ };
82
+ if (entry.contextWindowOptions && entry.contextWindowOptions.length > 1) {
83
+ model = withContextWindowOptions(model, entry.contextWindowOptions);
84
+ }
85
+ synthesized.push(model);
86
+ }
87
+ return synthesized;
88
+ }
89
+ //# sourceMappingURL=copilot-model-synthesis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-model-synthesis.js","sourceRoot":"","sources":["../../src/core/copilot-model-synthesis.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { COPILOT_CATALOG_HEADERS, DEFAULT_COPILOT_API_BASE_URL, type CopilotModelContext } from \"./copilot-model-catalog.ts\";\nimport { withContextWindowOptions } from \"./context-window.ts\";\n\nconst GITHUB_COPILOT_PROVIDER = \"github-copilot\";\nconst ENDPOINT_API_PREFERENCE = [\n\t[\"/v1/messages\", \"anthropic-messages\"],\n\t[\"/responses\", \"openai-responses\"],\n\t[\"/chat/completions\", \"openai-completions\"],\n] as const satisfies readonly (readonly [string, Api])[];\n\nconst ZERO_COST: Model<Api>[\"cost\"] = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\nconst ADAPTIVE_THINKING_LEVEL_MAP: Model<Api>[\"thinkingLevelMap\"] = { minimal: \"low\", xhigh: \"max\" };\n\nexport interface CopilotModelTemplate {\n\tbaseUrl: string;\n\theaders?: Record<string, string>;\n}\n\nexport function copilotThinkingLevelMapFor(entry: CopilotModelContext, api: Api): Model<Api>[\"thinkingLevelMap\"] | undefined {\n\tconst advertised = entry.supports?.reasoningEffortLevels;\n\tif (!advertised || advertised.length === 0) {\n\t\treturn entry.supports?.adaptiveThinking ? ADAPTIVE_THINKING_LEVEL_MAP : undefined;\n\t}\n\n\tconst levels = new Set(advertised);\n\tconst map: Model<Api>[\"thinkingLevelMap\"] = {\n\t\tminimal: levels.has(\"minimal\") ? \"minimal\" : null,\n\t\tlow: levels.has(\"low\") ? \"low\" : null,\n\t\tmedium: levels.has(\"medium\") ? \"medium\" : null,\n\t\thigh: levels.has(\"high\") ? \"high\" : null,\n\t};\n\tif (levels.has(\"none\")) map.off = \"none\";\n\telse if (api !== \"anthropic-messages\" || !entry.supports?.adaptiveThinking) map.off = null;\n\tif (levels.has(\"xhigh\")) map.xhigh = \"xhigh\";\n\telse if (levels.has(\"max\") && entry.supports?.adaptiveThinking) map.xhigh = \"max\";\n\treturn map;\n}\n\nfunction mapCopilotApi(entry: CopilotModelContext): Api | undefined {\n\tconst endpoints = new Set(entry.supportedEndpoints ?? []);\n\treturn ENDPOINT_API_PREFERENCE.find(([endpoint]) => endpoints.has(endpoint))?.[1];\n}\n\nfunction hasReasoning(entry: CopilotModelContext): boolean {\n\treturn Boolean(\n\t\tentry.supports?.reasoningEffort || entry.supports?.adaptiveThinking || entry.supports?.minThinkingBudget || entry.supports?.maxThinkingBudget,\n\t);\n}\n\nfunction canSynthesizeCopilotModel(id: string, entry: CopilotModelContext): boolean {\n\tif (id.includes(\"/\")) return false;\n\tif (entry.modelPickerEnabled !== true) return false;\n\tif (entry.type !== \"chat\") return false;\n\tif (entry.policyState?.toLowerCase() === \"disabled\") return false;\n\treturn mapCopilotApi(entry) !== undefined;\n}\n\nexport function copilotTemplateFromModels(models: readonly Model<Api>[]): CopilotModelTemplate {\n\tconst sibling = models.find((model) => model.provider === GITHUB_COPILOT_PROVIDER);\n\treturn {\n\t\tbaseUrl: sibling?.baseUrl ?? DEFAULT_COPILOT_API_BASE_URL,\n\t\theaders: sibling?.headers ?? COPILOT_CATALOG_HEADERS,\n\t};\n}\n\nexport function synthesizeCopilotCatalogModels(\n\tcatalog: ReadonlyMap<string, CopilotModelContext>,\n\texistingIds: ReadonlySet<string>,\n\ttemplate: CopilotModelTemplate,\n): Model<Api>[] {\n\tconst synthesized: Model<Api>[] = [];\n\tfor (const [id, entry] of catalog) {\n\t\tif (existingIds.has(id) || !canSynthesizeCopilotModel(id, entry)) continue;\n\t\tconst api = mapCopilotApi(entry);\n\t\tif (!api) continue;\n\t\tlet model: Model<Api> = {\n\t\t\tid,\n\t\t\tname: entry.displayName ?? id,\n\t\t\tapi,\n\t\t\tprovider: GITHUB_COPILOT_PROVIDER,\n\t\t\tbaseUrl: template.baseUrl,\n\t\t\theaders: template.headers,\n\t\t\treasoning: hasReasoning(entry),\n\t\t\tthinkingLevelMap: copilotThinkingLevelMapFor(entry, api),\n\t\t\tcompat: entry.supports?.adaptiveThinking ? ({ forceAdaptiveThinking: true } as Model<Api>[\"compat\"]) : undefined,\n\t\t\tinput: entry.supports?.vision ? [\"text\", \"image\"] : [\"text\"],\n\t\t\tcost: ZERO_COST,\n\t\t\tmaxInputTokens: entry.maxInputTokens,\n\t\t\tcontextWindow: entry.contextWindow,\n\t\t\tmaxTokens: entry.maxTokens ?? entry.limits?.maxOutputTokens ?? entry.maxInputTokens ?? entry.contextWindow,\n\t\t};\n\t\tif (entry.contextWindowOptions && entry.contextWindowOptions.length > 1) {\n\t\t\tmodel = withContextWindowOptions(model, entry.contextWindowOptions);\n\t\t}\n\t\tsynthesized.push(model);\n\t}\n\treturn synthesized;\n}\n"]}
@@ -14,7 +14,7 @@ import type { ExtensionContext } from "./context-types.ts";
14
14
  import type { BeforeAgentStartEventResult, BeforeProviderRequestEventResult, ContextEventResult, MessageEndEventResult, SessionBeforeCompactResult, SessionBeforeForkResult, SessionBeforeSwitchResult, SessionBeforeTreeResult, ToolCallEventResult, ToolResultEventResult, UserBashEventResult } from "./event-results.ts";
15
15
  import type { MessageRenderer, SendMessageOptions } from "./message-types.ts";
16
16
  import type { ProviderConfig } from "./provider-types.ts";
17
- import type { ResourcesDiscoverEvent, ResourcesDiscoverResult, SessionBeforeCompactEvent, SessionBeforeForkEvent, SessionBeforeSwitchEvent, SessionBeforeTreeEvent, SessionCompactEvent, SessionShutdownEvent, SessionStartEvent, SessionTreeEvent } from "./session-events.ts";
17
+ import type { ResourcesDiscoverEvent, ResourcesDiscoverResult, SessionBeforeCompactEvent, SessionBeforeForkEvent, SessionBeforeSwitchEvent, SessionBeforeTreeEvent, SessionCompactEvent, SessionInfoChangedEvent, SessionShutdownEvent, SessionStartEvent, SessionTreeEvent } from "./session-events.ts";
18
18
  import type { ToolDefinition, ToolInfo } from "./tool-types.ts";
19
19
  import type { ToolCallEvent, ToolResultEvent } from "./tool-events.ts";
20
20
  /** Handler function type for events */
@@ -24,6 +24,7 @@ export type ExtensionHandler<E, R = undefined> = (event: E, ctx: ExtensionContex
24
24
  */
25
25
  export interface ExtensionAPI {
26
26
  on(event: "resources_discover", handler: ExtensionHandler<ResourcesDiscoverEvent, ResourcesDiscoverResult>): void;
27
+ on(event: "session_info_changed", handler: ExtensionHandler<SessionInfoChangedEvent>): void;
27
28
  on(event: "session_start", handler: ExtensionHandler<SessionStartEvent>): void;
28
29
  on(event: "session_before_switch", handler: ExtensionHandler<SessionBeforeSwitchEvent, SessionBeforeSwitchResult>): void;
29
30
  on(event: "session_before_fork", handler: ExtensionHandler<SessionBeforeForkEvent, SessionBeforeForkResult>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"api-types.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/api-types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"@earendil-works/pi-ai/compat\";\nimport type { KeyId } from \"@earendil-works/pi-tui\";\nimport type { TSchema } from \"typebox\";\nimport type { EventBus } from \"../event-bus.ts\";\nimport type { ExecOptions, ExecResult } from \"../exec.ts\";\nimport type { CustomMessage } from \"../messages.ts\";\nimport type { ResolvedResource } from \"../package-manager.ts\";\nimport type { DefaultResourceLoaderInheritanceSnapshot } from \"../resource-loader.ts\";\nimport type { SlashCommandInfo } from \"../slash-commands.ts\";\nimport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentStartEvent,\n\tBeforeAgentStartEvent,\n\tBeforeProviderRequestEvent,\n\tContextEvent,\n\tInputEvent,\n\tInputEventResult,\n\tMessageEndEvent,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tProjectTrustHandler,\n\tThinkingLevelSelectEvent,\n\tToolExecutionEndEvent,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\tUserBashEvent,\n} from \"./agent-events.ts\";\nimport type { RegisteredCommand } from \"./command-types.ts\";\nimport type { ExtensionContext } from \"./context-types.ts\";\nimport type {\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEventResult,\n\tContextEventResult,\n\tMessageEndEventResult,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeResult,\n\tToolCallEventResult,\n\tToolResultEventResult,\n\tUserBashEventResult,\n} from \"./event-results.ts\";\nimport type { MessageRenderer, SendMessageOptions } from \"./message-types.ts\";\nimport type { ProviderConfig } from \"./provider-types.ts\";\nimport type {\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeForkEvent,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeTreeEvent,\n\tSessionCompactEvent,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tSessionTreeEvent,\n} from \"./session-events.ts\";\nimport type { ToolDefinition, ToolInfo } from \"./tool-types.ts\";\nimport type { ToolCallEvent, ToolResultEvent } from \"./tool-events.ts\";\n\n/** Handler function type for events */\n// biome-ignore lint/suspicious/noConfusingVoidType: void allows bare return statements\nexport type ExtensionHandler<E, R = undefined> = (event: E, ctx: ExtensionContext) => Promise<R | void> | R | void;\n\n/**\n * ExtensionAPI passed to extension factory functions.\n */\nexport interface ExtensionAPI {\n\t// =========================================================================\n\t// Event Subscription\n\t// =========================================================================\n\n\ton(event: \"resources_discover\", handler: ExtensionHandler<ResourcesDiscoverEvent, ResourcesDiscoverResult>): void;\n\ton(event: \"session_start\", handler: ExtensionHandler<SessionStartEvent>): void;\n\ton(\n\t\tevent: \"session_before_switch\",\n\t\thandler: ExtensionHandler<SessionBeforeSwitchEvent, SessionBeforeSwitchResult>,\n\t): void;\n\ton(event: \"session_before_fork\", handler: ExtensionHandler<SessionBeforeForkEvent, SessionBeforeForkResult>): void;\n\ton(\n\t\tevent: \"session_before_compact\",\n\t\thandler: ExtensionHandler<SessionBeforeCompactEvent, SessionBeforeCompactResult>,\n\t): void;\n\ton(event: \"session_compact\", handler: ExtensionHandler<SessionCompactEvent>): void;\n\ton(event: \"session_shutdown\", handler: ExtensionHandler<SessionShutdownEvent>): void;\n\ton(event: \"session_before_tree\", handler: ExtensionHandler<SessionBeforeTreeEvent, SessionBeforeTreeResult>): void;\n\ton(event: \"session_tree\", handler: ExtensionHandler<SessionTreeEvent>): void;\n\ton(event: \"context\", handler: ExtensionHandler<ContextEvent, ContextEventResult>): void;\n\ton(\n\t\tevent: \"before_provider_request\",\n\t\thandler: ExtensionHandler<BeforeProviderRequestEvent, BeforeProviderRequestEventResult>,\n\t): void;\n\ton(event: \"after_provider_response\", handler: ExtensionHandler<AfterProviderResponseEvent>): void;\n\ton(event: \"before_agent_start\", handler: ExtensionHandler<BeforeAgentStartEvent, BeforeAgentStartEventResult>): void;\n\ton(event: \"agent_start\", handler: ExtensionHandler<AgentStartEvent>): void;\n\ton(event: \"agent_end\", handler: ExtensionHandler<AgentEndEvent>): void;\n\ton(event: \"turn_start\", handler: ExtensionHandler<TurnStartEvent>): void;\n\ton(event: \"turn_end\", handler: ExtensionHandler<TurnEndEvent>): void;\n\ton(event: \"message_start\", handler: ExtensionHandler<MessageStartEvent>): void;\n\ton(event: \"message_update\", handler: ExtensionHandler<MessageUpdateEvent>): void;\n\ton(event: \"message_end\", handler: ExtensionHandler<MessageEndEvent, MessageEndEventResult>): void;\n\ton(event: \"tool_execution_start\", handler: ExtensionHandler<ToolExecutionStartEvent>): void;\n\ton(event: \"tool_execution_update\", handler: ExtensionHandler<ToolExecutionUpdateEvent>): void;\n\ton(event: \"tool_execution_end\", handler: ExtensionHandler<ToolExecutionEndEvent>): void;\n\ton(event: \"model_select\", handler: ExtensionHandler<ModelSelectEvent>): void;\n\ton(event: \"thinking_level_select\", handler: ExtensionHandler<ThinkingLevelSelectEvent>): void;\n\ton(event: \"tool_call\", handler: ExtensionHandler<ToolCallEvent, ToolCallEventResult>): void;\n\ton(event: \"tool_result\", handler: ExtensionHandler<ToolResultEvent, ToolResultEventResult>): void;\n\ton(event: \"user_bash\", handler: ExtensionHandler<UserBashEvent, UserBashEventResult>): void;\n\ton(event: \"project_trust\", handler: ProjectTrustHandler): void;\n\ton(event: \"input\", handler: ExtensionHandler<InputEvent, InputEventResult>): void;\n\n\t// =========================================================================\n\t// Tool Registration\n\t// =========================================================================\n\n\t/** Register a tool that the LLM can call. */\n\tregisterTool<TParams extends TSchema = TSchema, TDetails = unknown, TState = unknown>(\n\t\ttool: ToolDefinition<TParams, TDetails, TState>,\n\t): void;\n\n\t// =========================================================================\n\t// Command, Shortcut, Flag Registration\n\t// =========================================================================\n\n\t/** Register a custom command. */\n\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\" | \"sourceInfo\">): void;\n\n\t/** Register a keyboard shortcut. */\n\tregisterShortcut(\n\t\tshortcut: KeyId,\n\t\toptions: {\n\t\t\tdescription?: string;\n\t\t\thandler: (ctx: ExtensionContext) => Promise<void> | void;\n\t\t},\n\t): void;\n\n\t/** Register a CLI flag. */\n\tregisterFlag(\n\t\tname: string,\n\t\toptions: {\n\t\t\tdescription?: string;\n\t\t\ttype: \"boolean\" | \"string\";\n\t\t\tdefault?: boolean | string;\n\t\t},\n\t): void;\n\n\t/** Get the value of a registered CLI flag. */\n\tgetFlag(name: string): boolean | string | undefined;\n\n\t/** Return package-provided workflow files discovered for this session. */\n\tgetWorkflowResources(): ResolvedResource[];\n\n\t/**\n\t * Re-read package/settings workflow resources and return the updated snapshot when supported by the host.\n\t * Does not reload extensions, skills, prompts, themes, or context files.\n\t */\n\trefreshWorkflowResources?: () => Promise<ResolvedResource[]>;\n\n\t/**\n\t * Return the resource-loader options that child Atomic sessions should inherit without sharing this loader instance.\n\t */\n\tgetResourceLoaderInheritanceSnapshot?: () => DefaultResourceLoaderInheritanceSnapshot;\n\n\t// =========================================================================\n\t// Message Rendering\n\t// =========================================================================\n\n\t/** Register a custom renderer for CustomMessageEntry. */\n\tregisterMessageRenderer<T = unknown>(customType: string, renderer: MessageRenderer<T>): void;\n\n\t// =========================================================================\n\t// Actions\n\t// =========================================================================\n\n\t/** Send a custom message to the session. */\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: SendMessageOptions,\n\t): void;\n\n\t/**\n\t * Send a user message to the agent. Always triggers a turn.\n\t * When the agent is streaming, use deliverAs to specify how to queue the message.\n\t */\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\" },\n\t): void;\n\n\t/** Append a custom entry to the session for state persistence (not sent to LLM). */\n\tappendEntry<T = unknown>(customType: string, data?: T): void;\n\n\t// =========================================================================\n\t// Session Metadata\n\t// =========================================================================\n\n\t/** Set the session display name (shown in session selector). */\n\tsetSessionName(name: string): void;\n\n\t/** Get the current session name, if set. */\n\tgetSessionName(): string | undefined;\n\n\t/** Set or clear a label on an entry. Labels are user-defined markers for bookmarking/navigation. */\n\tsetLabel(entryId: string, label: string | undefined): void;\n\n\t/** Execute a shell command. */\n\texec(command: string, args: string[], options?: ExecOptions): Promise<ExecResult>;\n\n\t/** Get the list of currently active tool names. */\n\tgetActiveTools(): string[];\n\n\t/** Get all configured tools with parameter schema and source metadata. */\n\tgetAllTools(): ToolInfo[];\n\n\t/** Set the active tools by name. */\n\tsetActiveTools(toolNames: string[]): void;\n\n\t/** Get available slash commands in the current session. */\n\tgetCommands(): SlashCommandInfo[];\n\n\t// =========================================================================\n\t// Model and Thinking Level\n\t// =========================================================================\n\n\t/** Set the current model. Returns false if no API key available. */\n\tsetModel(model: Model<Api>): Promise<boolean>;\n\n\t/** Get current thinking level. */\n\tgetThinkingLevel(): ThinkingLevel;\n\n\t/** Set thinking level (clamped to model capabilities). */\n\tsetThinkingLevel(level: ThinkingLevel): void;\n\n\t// =========================================================================\n\t// Provider Registration\n\t// =========================================================================\n\n\t/**\n\t * Register or override a model provider.\n\t *\n\t * If `models` is provided: replaces all existing models for this provider.\n\t * If only `baseUrl` is provided: overrides the URL for existing models.\n\t * If `oauth` is provided: registers OAuth provider for /login support.\n\t * If `streamSimple` is provided: registers a custom API stream handler.\n\t *\n\t * During initial extension load this call is queued and applied once the\n\t * runner has bound its context. After that it takes effect immediately, so\n\t * it is safe to call from command handlers or event callbacks without\n\t * requiring a `/reload`.\n\t *\n\t * @example\n\t * // Register a new provider with custom models\n\t * pi.registerProvider(\"my-proxy\", {\n\t * baseUrl: \"https://proxy.example.com\",\n\t * apiKey: \"$PROXY_API_KEY\",\n\t * api: \"anthropic-messages\",\n\t * models: [\n\t * {\n\t * id: \"claude-sonnet-4-20250514\",\n\t * name: \"Claude 4 Sonnet (proxy)\",\n\t * reasoning: false,\n\t * input: [\"text\", \"image\"],\n\t * cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t * contextWindow: 200000,\n\t * maxTokens: 16384\n\t * }\n\t * ]\n\t * });\n\t *\n\t * @example\n\t * // Override baseUrl for an existing provider\n\t * pi.registerProvider(\"anthropic\", {\n\t * baseUrl: \"https://proxy.example.com\"\n\t * });\n\t *\n\t * @example\n\t * // Register provider with OAuth support\n\t * pi.registerProvider(\"corporate-ai\", {\n\t * baseUrl: \"https://ai.corp.com\",\n\t * api: \"openai-responses\",\n\t * models: [...],\n\t * oauth: {\n\t * name: \"Corporate AI (SSO)\",\n\t * async login(callbacks) { ... },\n\t * async refreshToken(credentials) { ... },\n\t * getApiKey(credentials) { return credentials.access; }\n\t * }\n\t * });\n\t */\n\tregisterProvider(name: string, config: ProviderConfig): void;\n\n\t/**\n\t * Unregister a previously registered provider.\n\t *\n\t * Removes all models belonging to the named provider and restores any\n\t * built-in models that were overridden by it. Has no effect if the provider\n\t * is not currently registered.\n\t *\n\t * Like `registerProvider`, this takes effect immediately when called after\n\t * the initial load phase.\n\t *\n\t * @example\n\t * pi.unregisterProvider(\"my-proxy\");\n\t */\n\tunregisterProvider(name: string): void;\n\n\t/** Shared event bus for extension communication. */\n\tevents: EventBus;\n}\n"]}
1
+ {"version":3,"file":"api-types.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/api-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,wCAAwC,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EACX,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EACX,2BAA2B,EAC3B,gCAAgC,EAChC,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EACX,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEvE,uCAAuC;AAEvC,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AAEnH;;GAEG;AACH,MAAM,WAAW,YAAY;IAK5B,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,GAAG,IAAI,CAAC;IAClH,EAAE,CAAC,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;IAC5F,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAC/E,EAAE,CACD,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,gBAAgB,CAAC,wBAAwB,EAAE,yBAAyB,CAAC,GAC5E,IAAI,CAAC;IACR,EAAE,CAAC,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,GAAG,IAAI,CAAC;IACnH,EAAE,CACD,KAAK,EAAE,wBAAwB,EAC/B,OAAO,EAAE,gBAAgB,CAAC,yBAAyB,EAAE,0BAA0B,CAAC,GAC9E,IAAI,CAAC;IACR,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC;IACnF,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC;IACrF,EAAE,CAAC,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,gBAAgB,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,GAAG,IAAI,CAAC;IACnH,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAC7E,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,YAAY,EAAE,kBAAkB,CAAC,GAAG,IAAI,CAAC;IACxF,EAAE,CACD,KAAK,EAAE,yBAAyB,EAChC,OAAO,EAAE,gBAAgB,CAAC,0BAA0B,EAAE,gCAAgC,CAAC,GACrF,IAAI,CAAC;IACR,EAAE,CAAC,KAAK,EAAE,yBAAyB,EAAE,OAAO,EAAE,gBAAgB,CAAC,0BAA0B,CAAC,GAAG,IAAI,CAAC;IAClG,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,CAAC,qBAAqB,EAAE,2BAA2B,CAAC,GAAG,IAAI,CAAC;IACrH,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAC3E,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IACvE,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IACzE,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IACrE,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;IAC/E,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IACjF,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,CAAC,eAAe,EAAE,qBAAqB,CAAC,GAAG,IAAI,CAAC;IAClG,EAAE,CAAC,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC;IAC5F,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC;IAC9F,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;IACxF,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAC7E,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC;IAC9F,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,CAAC,GAAG,IAAI,CAAC;IAC5F,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,CAAC,eAAe,EAAE,qBAAqB,CAAC,GAAG,IAAI,CAAC;IAClG,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,CAAC,GAAG,IAAI,CAAC;IAC5F,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC/D,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAMlF,6CAA6C;IAC7C,YAAY,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EACnF,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,GAC7C,IAAI,CAAC;IAMR,iCAAiC;IACjC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC;IAE7F,oCAAoC;IACpC,gBAAgB,CACf,QAAQ,EAAE,KAAK,EACf,OAAO,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KACzD,GACC,IAAI,CAAC;IAER,2BAA2B;IAC3B,YAAY,CACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;QAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;KAC3B,GACC,IAAI,CAAC;IAER,8CAA8C;IAC9C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAEpD,0EAA0E;IAC1E,oBAAoB,IAAI,gBAAgB,EAAE,CAAC;IAE3C;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAE7D;;OAEG;IACH,oCAAoC,CAAC,EAAE,MAAM,wCAAwC,CAAC;IAMtF,yDAAyD;IACzD,uBAAuB,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAM7F,4CAA4C;IAC5C,WAAW,CAAC,CAAC,GAAG,OAAO,EACtB,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC,EACjF,OAAO,CAAC,EAAE,kBAAkB,GAC1B,IAAI,CAAC;IAER;;;OAGG;IACH,eAAe,CACd,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,GAC5C,IAAI,CAAC;IAER,oFAAoF;IACpF,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IAM7D,gEAAgE;IAChE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,4CAA4C;IAC5C,cAAc,IAAI,MAAM,GAAG,SAAS,CAAC;IAErC,oGAAoG;IACpG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAE3D,+BAA+B;IAC/B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAElF,mDAAmD;IACnD,cAAc,IAAI,MAAM,EAAE,CAAC;IAE3B,0EAA0E;IAC1E,WAAW,IAAI,QAAQ,EAAE,CAAC;IAE1B,oCAAoC;IACpC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE1C,2DAA2D;IAC3D,WAAW,IAAI,gBAAgB,EAAE,CAAC;IAMlC,oEAAoE;IACpE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9C,kCAAkC;IAClC,gBAAgB,IAAI,aAAa,CAAC;IAElC,0DAA0D;IAC1D,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAM7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmDG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAE7D;;;;;;;;;;;;OAYG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvC,oDAAoD;IACpD,MAAM,EAAE,QAAQ,CAAC;CACjB","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"@earendil-works/pi-ai/compat\";\nimport type { KeyId } from \"@earendil-works/pi-tui\";\nimport type { TSchema } from \"typebox\";\nimport type { EventBus } from \"../event-bus.ts\";\nimport type { ExecOptions, ExecResult } from \"../exec.ts\";\nimport type { CustomMessage } from \"../messages.ts\";\nimport type { ResolvedResource } from \"../package-manager.ts\";\nimport type { DefaultResourceLoaderInheritanceSnapshot } from \"../resource-loader.ts\";\nimport type { SlashCommandInfo } from \"../slash-commands.ts\";\nimport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentStartEvent,\n\tBeforeAgentStartEvent,\n\tBeforeProviderRequestEvent,\n\tContextEvent,\n\tInputEvent,\n\tInputEventResult,\n\tMessageEndEvent,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tProjectTrustHandler,\n\tThinkingLevelSelectEvent,\n\tToolExecutionEndEvent,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\tUserBashEvent,\n} from \"./agent-events.ts\";\nimport type { RegisteredCommand } from \"./command-types.ts\";\nimport type { ExtensionContext } from \"./context-types.ts\";\nimport type {\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEventResult,\n\tContextEventResult,\n\tMessageEndEventResult,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeResult,\n\tToolCallEventResult,\n\tToolResultEventResult,\n\tUserBashEventResult,\n} from \"./event-results.ts\";\nimport type { MessageRenderer, SendMessageOptions } from \"./message-types.ts\";\nimport type { ProviderConfig } from \"./provider-types.ts\";\nimport type {\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeForkEvent,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeTreeEvent,\n\tSessionCompactEvent,\n\tSessionInfoChangedEvent,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tSessionTreeEvent,\n} from \"./session-events.ts\";\nimport type { ToolDefinition, ToolInfo } from \"./tool-types.ts\";\nimport type { ToolCallEvent, ToolResultEvent } from \"./tool-events.ts\";\n\n/** Handler function type for events */\n// biome-ignore lint/suspicious/noConfusingVoidType: void allows bare return statements\nexport type ExtensionHandler<E, R = undefined> = (event: E, ctx: ExtensionContext) => Promise<R | void> | R | void;\n\n/**\n * ExtensionAPI passed to extension factory functions.\n */\nexport interface ExtensionAPI {\n\t// =========================================================================\n\t// Event Subscription\n\t// =========================================================================\n\n\ton(event: \"resources_discover\", handler: ExtensionHandler<ResourcesDiscoverEvent, ResourcesDiscoverResult>): void;\n\ton(event: \"session_info_changed\", handler: ExtensionHandler<SessionInfoChangedEvent>): void;\n\ton(event: \"session_start\", handler: ExtensionHandler<SessionStartEvent>): void;\n\ton(\n\t\tevent: \"session_before_switch\",\n\t\thandler: ExtensionHandler<SessionBeforeSwitchEvent, SessionBeforeSwitchResult>,\n\t): void;\n\ton(event: \"session_before_fork\", handler: ExtensionHandler<SessionBeforeForkEvent, SessionBeforeForkResult>): void;\n\ton(\n\t\tevent: \"session_before_compact\",\n\t\thandler: ExtensionHandler<SessionBeforeCompactEvent, SessionBeforeCompactResult>,\n\t): void;\n\ton(event: \"session_compact\", handler: ExtensionHandler<SessionCompactEvent>): void;\n\ton(event: \"session_shutdown\", handler: ExtensionHandler<SessionShutdownEvent>): void;\n\ton(event: \"session_before_tree\", handler: ExtensionHandler<SessionBeforeTreeEvent, SessionBeforeTreeResult>): void;\n\ton(event: \"session_tree\", handler: ExtensionHandler<SessionTreeEvent>): void;\n\ton(event: \"context\", handler: ExtensionHandler<ContextEvent, ContextEventResult>): void;\n\ton(\n\t\tevent: \"before_provider_request\",\n\t\thandler: ExtensionHandler<BeforeProviderRequestEvent, BeforeProviderRequestEventResult>,\n\t): void;\n\ton(event: \"after_provider_response\", handler: ExtensionHandler<AfterProviderResponseEvent>): void;\n\ton(event: \"before_agent_start\", handler: ExtensionHandler<BeforeAgentStartEvent, BeforeAgentStartEventResult>): void;\n\ton(event: \"agent_start\", handler: ExtensionHandler<AgentStartEvent>): void;\n\ton(event: \"agent_end\", handler: ExtensionHandler<AgentEndEvent>): void;\n\ton(event: \"turn_start\", handler: ExtensionHandler<TurnStartEvent>): void;\n\ton(event: \"turn_end\", handler: ExtensionHandler<TurnEndEvent>): void;\n\ton(event: \"message_start\", handler: ExtensionHandler<MessageStartEvent>): void;\n\ton(event: \"message_update\", handler: ExtensionHandler<MessageUpdateEvent>): void;\n\ton(event: \"message_end\", handler: ExtensionHandler<MessageEndEvent, MessageEndEventResult>): void;\n\ton(event: \"tool_execution_start\", handler: ExtensionHandler<ToolExecutionStartEvent>): void;\n\ton(event: \"tool_execution_update\", handler: ExtensionHandler<ToolExecutionUpdateEvent>): void;\n\ton(event: \"tool_execution_end\", handler: ExtensionHandler<ToolExecutionEndEvent>): void;\n\ton(event: \"model_select\", handler: ExtensionHandler<ModelSelectEvent>): void;\n\ton(event: \"thinking_level_select\", handler: ExtensionHandler<ThinkingLevelSelectEvent>): void;\n\ton(event: \"tool_call\", handler: ExtensionHandler<ToolCallEvent, ToolCallEventResult>): void;\n\ton(event: \"tool_result\", handler: ExtensionHandler<ToolResultEvent, ToolResultEventResult>): void;\n\ton(event: \"user_bash\", handler: ExtensionHandler<UserBashEvent, UserBashEventResult>): void;\n\ton(event: \"project_trust\", handler: ProjectTrustHandler): void;\n\ton(event: \"input\", handler: ExtensionHandler<InputEvent, InputEventResult>): void;\n\n\t// =========================================================================\n\t// Tool Registration\n\t// =========================================================================\n\n\t/** Register a tool that the LLM can call. */\n\tregisterTool<TParams extends TSchema = TSchema, TDetails = unknown, TState = unknown>(\n\t\ttool: ToolDefinition<TParams, TDetails, TState>,\n\t): void;\n\n\t// =========================================================================\n\t// Command, Shortcut, Flag Registration\n\t// =========================================================================\n\n\t/** Register a custom command. */\n\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\" | \"sourceInfo\">): void;\n\n\t/** Register a keyboard shortcut. */\n\tregisterShortcut(\n\t\tshortcut: KeyId,\n\t\toptions: {\n\t\t\tdescription?: string;\n\t\t\thandler: (ctx: ExtensionContext) => Promise<void> | void;\n\t\t},\n\t): void;\n\n\t/** Register a CLI flag. */\n\tregisterFlag(\n\t\tname: string,\n\t\toptions: {\n\t\t\tdescription?: string;\n\t\t\ttype: \"boolean\" | \"string\";\n\t\t\tdefault?: boolean | string;\n\t\t},\n\t): void;\n\n\t/** Get the value of a registered CLI flag. */\n\tgetFlag(name: string): boolean | string | undefined;\n\n\t/** Return package-provided workflow files discovered for this session. */\n\tgetWorkflowResources(): ResolvedResource[];\n\n\t/**\n\t * Re-read package/settings workflow resources and return the updated snapshot when supported by the host.\n\t * Does not reload extensions, skills, prompts, themes, or context files.\n\t */\n\trefreshWorkflowResources?: () => Promise<ResolvedResource[]>;\n\n\t/**\n\t * Return the resource-loader options that child Atomic sessions should inherit without sharing this loader instance.\n\t */\n\tgetResourceLoaderInheritanceSnapshot?: () => DefaultResourceLoaderInheritanceSnapshot;\n\n\t// =========================================================================\n\t// Message Rendering\n\t// =========================================================================\n\n\t/** Register a custom renderer for CustomMessageEntry. */\n\tregisterMessageRenderer<T = unknown>(customType: string, renderer: MessageRenderer<T>): void;\n\n\t// =========================================================================\n\t// Actions\n\t// =========================================================================\n\n\t/** Send a custom message to the session. */\n\tsendMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: SendMessageOptions,\n\t): void;\n\n\t/**\n\t * Send a user message to the agent. Always triggers a turn.\n\t * When the agent is streaming, use deliverAs to specify how to queue the message.\n\t */\n\tsendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\" },\n\t): void;\n\n\t/** Append a custom entry to the session for state persistence (not sent to LLM). */\n\tappendEntry<T = unknown>(customType: string, data?: T): void;\n\n\t// =========================================================================\n\t// Session Metadata\n\t// =========================================================================\n\n\t/** Set the session display name (shown in session selector). */\n\tsetSessionName(name: string): void;\n\n\t/** Get the current session name, if set. */\n\tgetSessionName(): string | undefined;\n\n\t/** Set or clear a label on an entry. Labels are user-defined markers for bookmarking/navigation. */\n\tsetLabel(entryId: string, label: string | undefined): void;\n\n\t/** Execute a shell command. */\n\texec(command: string, args: string[], options?: ExecOptions): Promise<ExecResult>;\n\n\t/** Get the list of currently active tool names. */\n\tgetActiveTools(): string[];\n\n\t/** Get all configured tools with parameter schema and source metadata. */\n\tgetAllTools(): ToolInfo[];\n\n\t/** Set the active tools by name. */\n\tsetActiveTools(toolNames: string[]): void;\n\n\t/** Get available slash commands in the current session. */\n\tgetCommands(): SlashCommandInfo[];\n\n\t// =========================================================================\n\t// Model and Thinking Level\n\t// =========================================================================\n\n\t/** Set the current model. Returns false if no API key available. */\n\tsetModel(model: Model<Api>): Promise<boolean>;\n\n\t/** Get current thinking level. */\n\tgetThinkingLevel(): ThinkingLevel;\n\n\t/** Set thinking level (clamped to model capabilities). */\n\tsetThinkingLevel(level: ThinkingLevel): void;\n\n\t// =========================================================================\n\t// Provider Registration\n\t// =========================================================================\n\n\t/**\n\t * Register or override a model provider.\n\t *\n\t * If `models` is provided: replaces all existing models for this provider.\n\t * If only `baseUrl` is provided: overrides the URL for existing models.\n\t * If `oauth` is provided: registers OAuth provider for /login support.\n\t * If `streamSimple` is provided: registers a custom API stream handler.\n\t *\n\t * During initial extension load this call is queued and applied once the\n\t * runner has bound its context. After that it takes effect immediately, so\n\t * it is safe to call from command handlers or event callbacks without\n\t * requiring a `/reload`.\n\t *\n\t * @example\n\t * // Register a new provider with custom models\n\t * pi.registerProvider(\"my-proxy\", {\n\t * baseUrl: \"https://proxy.example.com\",\n\t * apiKey: \"$PROXY_API_KEY\",\n\t * api: \"anthropic-messages\",\n\t * models: [\n\t * {\n\t * id: \"claude-sonnet-4-20250514\",\n\t * name: \"Claude 4 Sonnet (proxy)\",\n\t * reasoning: false,\n\t * input: [\"text\", \"image\"],\n\t * cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t * contextWindow: 200000,\n\t * maxTokens: 16384\n\t * }\n\t * ]\n\t * });\n\t *\n\t * @example\n\t * // Override baseUrl for an existing provider\n\t * pi.registerProvider(\"anthropic\", {\n\t * baseUrl: \"https://proxy.example.com\"\n\t * });\n\t *\n\t * @example\n\t * // Register provider with OAuth support\n\t * pi.registerProvider(\"corporate-ai\", {\n\t * baseUrl: \"https://ai.corp.com\",\n\t * api: \"openai-responses\",\n\t * models: [...],\n\t * oauth: {\n\t * name: \"Corporate AI (SSO)\",\n\t * async login(callbacks) { ... },\n\t * async refreshToken(credentials) { ... },\n\t * getApiKey(credentials) { return credentials.access; }\n\t * }\n\t * });\n\t */\n\tregisterProvider(name: string, config: ProviderConfig): void;\n\n\t/**\n\t * Unregister a previously registered provider.\n\t *\n\t * Removes all models belonging to the named provider and restores any\n\t * built-in models that were overridden by it. Has no effect if the provider\n\t * is not currently registered.\n\t *\n\t * Like `registerProvider`, this takes effect immediately when called after\n\t * the initial load phase.\n\t *\n\t * @example\n\t * pi.unregisterProvider(\"my-proxy\");\n\t */\n\tunregisterProvider(name: string): void;\n\n\t/** Shared event bus for extension communication. */\n\tevents: EventBus;\n}\n"]}