@astralyn/pi 0.85.1 → 0.85.2

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 (248) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/cli.js +94 -91
  3. package/dist/core/agent-session.js +2 -2
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/background/history.d.ts.map +1 -1
  6. package/dist/core/background/history.js +6 -0
  7. package/dist/core/background/history.js.map +1 -1
  8. package/dist/core/background/presentation.d.ts.map +1 -1
  9. package/dist/core/background/presentation.js +41 -4
  10. package/dist/core/background/presentation.js.map +1 -1
  11. package/dist/core/background/service.d.ts +2 -2
  12. package/dist/core/background/service.d.ts.map +1 -1
  13. package/dist/core/background/service.js +38 -15
  14. package/dist/core/background/service.js.map +1 -1
  15. package/dist/core/background/types.d.ts +9 -0
  16. package/dist/core/background/types.d.ts.map +1 -1
  17. package/dist/core/background/types.js +4 -0
  18. package/dist/core/background/types.js.map +1 -1
  19. package/dist/core/compaction/compaction.d.ts +5 -12
  20. package/dist/core/compaction/compaction.d.ts.map +1 -1
  21. package/dist/core/compaction/compaction.js +11 -19
  22. package/dist/core/compaction/compaction.js.map +1 -1
  23. package/dist/core/compaction/settings.d.ts +27 -0
  24. package/dist/core/compaction/settings.d.ts.map +1 -0
  25. package/dist/core/compaction/settings.js +40 -0
  26. package/dist/core/compaction/settings.js.map +1 -0
  27. package/dist/core/keybindings.d.ts +15 -0
  28. package/dist/core/keybindings.d.ts.map +1 -1
  29. package/dist/core/keybindings.js +12 -0
  30. package/dist/core/keybindings.js.map +1 -1
  31. package/dist/core/model-config.d.ts +32 -10
  32. package/dist/core/model-config.d.ts.map +1 -1
  33. package/dist/core/model-config.js +38 -1
  34. package/dist/core/model-config.js.map +1 -1
  35. package/dist/core/model-runtime.d.ts +2 -0
  36. package/dist/core/model-runtime.d.ts.map +1 -1
  37. package/dist/core/model-runtime.js +4 -0
  38. package/dist/core/model-runtime.js.map +1 -1
  39. package/dist/core/settings-manager.d.ts +4 -7
  40. package/dist/core/settings-manager.d.ts.map +1 -1
  41. package/dist/core/settings-manager.js +7 -6
  42. package/dist/core/settings-manager.js.map +1 -1
  43. package/dist/core/tools/bash.js +1 -1
  44. package/dist/core/tools/bash.js.map +1 -1
  45. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  46. package/dist/core/tools/shell-execution.js +3 -1
  47. package/dist/core/tools/shell-execution.js.map +1 -1
  48. package/dist/extensions/background/manager.d.ts +8 -5
  49. package/dist/extensions/background/manager.d.ts.map +1 -1
  50. package/dist/extensions/background/manager.js +115 -39
  51. package/dist/extensions/background/manager.js.map +1 -1
  52. package/dist/extensions/background/task-view.d.ts +5 -0
  53. package/dist/extensions/background/task-view.d.ts.map +1 -1
  54. package/dist/extensions/background/task-view.js +4 -0
  55. package/dist/extensions/background/task-view.js.map +1 -1
  56. package/dist/extensions/btw/controller.d.ts +1 -1
  57. package/dist/extensions/btw/controller.d.ts.map +1 -1
  58. package/dist/extensions/btw/controller.js +4 -4
  59. package/dist/extensions/btw/controller.js.map +1 -1
  60. package/dist/extensions/btw/index.js +3 -3
  61. package/dist/extensions/btw/index.js.map +1 -1
  62. package/dist/extensions/index.js +2 -2
  63. package/dist/extensions/index.js.map +1 -1
  64. package/dist/extensions/provider/catalog.d.ts +57 -0
  65. package/dist/extensions/provider/catalog.d.ts.map +1 -0
  66. package/dist/extensions/provider/catalog.js +181 -0
  67. package/dist/extensions/provider/catalog.js.map +1 -0
  68. package/dist/extensions/provider/compat-fields.d.ts +25 -0
  69. package/dist/extensions/provider/compat-fields.d.ts.map +1 -0
  70. package/dist/extensions/provider/compat-fields.js +148 -0
  71. package/dist/extensions/provider/compat-fields.js.map +1 -0
  72. package/dist/extensions/provider/configuration.d.ts +8 -0
  73. package/dist/extensions/provider/configuration.d.ts.map +1 -0
  74. package/dist/extensions/provider/configuration.js +21 -0
  75. package/dist/extensions/provider/configuration.js.map +1 -0
  76. package/dist/extensions/provider/connection.d.ts +14 -0
  77. package/dist/extensions/provider/connection.d.ts.map +1 -0
  78. package/dist/extensions/provider/connection.js +86 -0
  79. package/dist/extensions/provider/connection.js.map +1 -0
  80. package/dist/extensions/provider/constants.d.ts +38 -0
  81. package/dist/extensions/provider/constants.d.ts.map +1 -0
  82. package/dist/extensions/provider/constants.js +75 -0
  83. package/dist/extensions/provider/constants.js.map +1 -0
  84. package/dist/extensions/provider/index.d.ts +4 -0
  85. package/dist/extensions/provider/index.d.ts.map +1 -0
  86. package/dist/extensions/provider/index.js +65 -0
  87. package/dist/extensions/provider/index.js.map +1 -0
  88. package/dist/extensions/provider/probe.d.ts +34 -0
  89. package/dist/extensions/provider/probe.d.ts.map +1 -0
  90. package/dist/extensions/provider/probe.js +178 -0
  91. package/dist/extensions/provider/probe.js.map +1 -0
  92. package/dist/extensions/provider/refresh.d.ts +30 -0
  93. package/dist/extensions/provider/refresh.d.ts.map +1 -0
  94. package/dist/extensions/provider/refresh.js +66 -0
  95. package/dist/extensions/provider/refresh.js.map +1 -0
  96. package/dist/extensions/provider/store.d.ts +131 -0
  97. package/dist/extensions/provider/store.d.ts.map +1 -0
  98. package/dist/extensions/provider/store.js +503 -0
  99. package/dist/extensions/provider/store.js.map +1 -0
  100. package/dist/extensions/provider/ui/app.d.ts +25 -0
  101. package/dist/extensions/provider/ui/app.d.ts.map +1 -0
  102. package/dist/extensions/provider/ui/app.js +153 -0
  103. package/dist/extensions/provider/ui/app.js.map +1 -0
  104. package/dist/extensions/provider/ui/builtin-data.d.ts +53 -0
  105. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -0
  106. package/dist/extensions/provider/ui/builtin-data.js +315 -0
  107. package/dist/extensions/provider/ui/builtin-data.js.map +1 -0
  108. package/dist/extensions/provider/ui/compat.d.ts +57 -0
  109. package/dist/extensions/provider/ui/compat.d.ts.map +1 -0
  110. package/dist/extensions/provider/ui/compat.js +427 -0
  111. package/dist/extensions/provider/ui/compat.js.map +1 -0
  112. package/dist/extensions/provider/ui/dialogs.d.ts +30 -0
  113. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -0
  114. package/dist/extensions/provider/ui/dialogs.js +89 -0
  115. package/dist/extensions/provider/ui/dialogs.js.map +1 -0
  116. package/dist/extensions/provider/ui/dictionary.d.ts +29 -0
  117. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -0
  118. package/dist/extensions/provider/ui/dictionary.js +385 -0
  119. package/dist/extensions/provider/ui/dictionary.js.map +1 -0
  120. package/dist/extensions/provider/ui/editor.d.ts +91 -0
  121. package/dist/extensions/provider/ui/editor.d.ts.map +1 -0
  122. package/dist/extensions/provider/ui/editor.js +667 -0
  123. package/dist/extensions/provider/ui/editor.js.map +1 -0
  124. package/dist/extensions/provider/ui/fetch-models.d.ts +39 -0
  125. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -0
  126. package/dist/extensions/provider/ui/fetch-models.js +320 -0
  127. package/dist/extensions/provider/ui/fetch-models.js.map +1 -0
  128. package/dist/extensions/provider/ui/model-fields.d.ts +43 -0
  129. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -0
  130. package/dist/extensions/provider/ui/model-fields.js +441 -0
  131. package/dist/extensions/provider/ui/model-fields.js.map +1 -0
  132. package/dist/extensions/provider/ui/model-options.d.ts +93 -0
  133. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -0
  134. package/dist/extensions/provider/ui/model-options.js +529 -0
  135. package/dist/extensions/provider/ui/model-options.js.map +1 -0
  136. package/dist/extensions/provider/ui/pane.d.ts +81 -0
  137. package/dist/extensions/provider/ui/pane.d.ts.map +1 -0
  138. package/dist/extensions/provider/ui/pane.js +3 -0
  139. package/dist/extensions/provider/ui/pane.js.map +1 -0
  140. package/dist/extensions/provider/ui/provider-fields.d.ts +60 -0
  141. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -0
  142. package/dist/extensions/provider/ui/provider-fields.js +326 -0
  143. package/dist/extensions/provider/ui/provider-fields.js.map +1 -0
  144. package/dist/extensions/provider/ui/provider-list.d.ts +34 -0
  145. package/dist/extensions/provider/ui/provider-list.d.ts.map +1 -0
  146. package/dist/extensions/provider/ui/provider-list.js +162 -0
  147. package/dist/extensions/provider/ui/provider-list.js.map +1 -0
  148. package/dist/extensions/provider/ui/session.d.ts +20 -0
  149. package/dist/extensions/provider/ui/session.d.ts.map +1 -0
  150. package/dist/extensions/provider/ui/session.js +52 -0
  151. package/dist/extensions/provider/ui/session.js.map +1 -0
  152. package/dist/extensions/provider/ui/thinking-map.d.ts +20 -0
  153. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -0
  154. package/dist/extensions/provider/ui/thinking-map.js +166 -0
  155. package/dist/extensions/provider/ui/thinking-map.js.map +1 -0
  156. package/dist/extensions/provider/ui/value-row.d.ts +88 -0
  157. package/dist/extensions/provider/ui/value-row.d.ts.map +1 -0
  158. package/dist/extensions/provider/ui/value-row.js +158 -0
  159. package/dist/extensions/provider/ui/value-row.js.map +1 -0
  160. package/dist/extensions/statusline/index.js +2 -2
  161. package/dist/extensions/statusline/index.js.map +1 -1
  162. package/dist/extensions/subagent/index.d.ts.map +1 -1
  163. package/dist/extensions/subagent/index.js +4 -2
  164. package/dist/extensions/subagent/index.js.map +1 -1
  165. package/dist/extensions/subagent/resolve.d.ts +5 -0
  166. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  167. package/dist/extensions/subagent/resolve.js +15 -7
  168. package/dist/extensions/subagent/resolve.js.map +1 -1
  169. package/dist/extensions/subagent/schema.d.ts +2 -0
  170. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  171. package/dist/extensions/subagent/schema.js +1 -0
  172. package/dist/extensions/subagent/schema.js.map +1 -1
  173. package/dist/modes/interactive/components/tool-execution.d.ts +10 -0
  174. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  175. package/dist/modes/interactive/components/tool-execution.js +20 -2
  176. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  177. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  178. package/dist/modes/interactive/interactive-mode.js +6 -1
  179. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  180. package/dist/rpc-entry.js +94 -91
  181. package/docs/bundled/README.md +1 -1
  182. package/docs/bundled/extensions/background.md +5 -5
  183. package/docs/bundled/extensions/provider.md +117 -0
  184. package/docs/bundled/extensions/statusline.md +1 -1
  185. package/docs/bundled/extensions/subagent.md +7 -3
  186. package/docs/compaction.md +16 -6
  187. package/docs/docs.json +2 -2
  188. package/docs/keybindings.md +3 -0
  189. package/docs/settings.md +11 -7
  190. package/npm-shrinkwrap.json +2 -2
  191. package/package.json +1 -1
  192. package/dist/extensions/router/constants.d.ts +0 -23
  193. package/dist/extensions/router/constants.d.ts.map +0 -1
  194. package/dist/extensions/router/constants.js +0 -30
  195. package/dist/extensions/router/constants.js.map +0 -1
  196. package/dist/extensions/router/dialog-host.d.ts +0 -60
  197. package/dist/extensions/router/dialog-host.d.ts.map +0 -1
  198. package/dist/extensions/router/dialog-host.js +0 -196
  199. package/dist/extensions/router/dialog-host.js.map +0 -1
  200. package/dist/extensions/router/dialog.d.ts +0 -45
  201. package/dist/extensions/router/dialog.d.ts.map +0 -1
  202. package/dist/extensions/router/dialog.js +0 -378
  203. package/dist/extensions/router/dialog.js.map +0 -1
  204. package/dist/extensions/router/identity.d.ts +0 -15
  205. package/dist/extensions/router/identity.d.ts.map +0 -1
  206. package/dist/extensions/router/identity.js +0 -173
  207. package/dist/extensions/router/identity.js.map +0 -1
  208. package/dist/extensions/router/index.d.ts +0 -15
  209. package/dist/extensions/router/index.d.ts.map +0 -1
  210. package/dist/extensions/router/index.js +0 -70
  211. package/dist/extensions/router/index.js.map +0 -1
  212. package/dist/extensions/router/presets.d.ts +0 -51
  213. package/dist/extensions/router/presets.d.ts.map +0 -1
  214. package/dist/extensions/router/presets.js +0 -108
  215. package/dist/extensions/router/presets.js.map +0 -1
  216. package/dist/extensions/router/probe.d.ts +0 -26
  217. package/dist/extensions/router/probe.d.ts.map +0 -1
  218. package/dist/extensions/router/probe.js +0 -216
  219. package/dist/extensions/router/probe.js.map +0 -1
  220. package/dist/extensions/router/register.d.ts +0 -12
  221. package/dist/extensions/router/register.d.ts.map +0 -1
  222. package/dist/extensions/router/register.js +0 -90
  223. package/dist/extensions/router/register.js.map +0 -1
  224. package/dist/extensions/router/state.d.ts +0 -20
  225. package/dist/extensions/router/state.d.ts.map +0 -1
  226. package/dist/extensions/router/state.js +0 -169
  227. package/dist/extensions/router/state.js.map +0 -1
  228. package/dist/extensions/router/store.d.ts +0 -12
  229. package/dist/extensions/router/store.d.ts.map +0 -1
  230. package/dist/extensions/router/store.js +0 -266
  231. package/dist/extensions/router/store.js.map +0 -1
  232. package/dist/extensions/router/stream.d.ts +0 -12
  233. package/dist/extensions/router/stream.d.ts.map +0 -1
  234. package/dist/extensions/router/stream.js +0 -233
  235. package/dist/extensions/router/stream.js.map +0 -1
  236. package/dist/extensions/router/transport.d.ts +0 -9
  237. package/dist/extensions/router/transport.d.ts.map +0 -1
  238. package/dist/extensions/router/transport.js +0 -81
  239. package/dist/extensions/router/transport.js.map +0 -1
  240. package/dist/extensions/router/types.d.ts +0 -39
  241. package/dist/extensions/router/types.d.ts.map +0 -1
  242. package/dist/extensions/router/types.js +0 -2
  243. package/dist/extensions/router/types.js.map +0 -1
  244. package/dist/extensions/router/ui.d.ts +0 -26
  245. package/dist/extensions/router/ui.d.ts.map +0 -1
  246. package/dist/extensions/router/ui.js +0 -897
  247. package/dist/extensions/router/ui.js.map +0 -1
  248. package/docs/bundled/extensions/router.md +0 -197
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../src/extensions/router/dialog.ts"],"names":[],"mappings":"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","sourcesContent":["/** Private TUI primitives for /router. */\n\nimport {\n\tContainer,\n\tfuzzyFilter,\n\tInput,\n\ttype KeybindingsManager,\n\tSpacer,\n\tText,\n\tTruncatedText,\n\ttype TUI,\n} from \"@earendil-works/pi-tui\";\nimport { DynamicBorder } from \"../../modes/interactive/components/dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { ROUTER_THINKING_LEVELS, type ThinkingLevel, truncate } from \"./constants.ts\";\nimport { resolveRouterThinkingMap } from \"./presets.ts\";\nimport type { ThinkingLevelMap } from \"./types.ts\";\n\nexport interface SelectItem<T extends string = string> {\n\tvalue: T;\n\tlabel: string;\n\tdescription?: string;\n\tsearchText?: string;\n}\n\nexport function createSearchableSelector<T extends string>(opts: {\n\ttitle: string;\n\tsubtitle?: string;\n\titems: ReadonlyArray<SelectItem<T>>;\n\tinitialValue?: T;\n\tinitialQuery?: string;\n\tmaxVisible?: number;\n\temptyMessage?: string;\n}): (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: T | undefined) => void) => Container {\n\treturn (tui, theme, keybindings, done) => {\n\t\tconst allItems = [...opts.items];\n\t\tlet filteredItems = allItems;\n\t\tlet selectedIndex = Math.max(\n\t\t\t0,\n\t\t\tallItems.findIndex((item) => item.value === opts.initialValue),\n\t\t);\n\t\tconst maxVisible = Math.max(1, opts.maxVisible ?? 10);\n\t\tconst input = new Input();\n\t\tif (opts.initialQuery) input.setValue(opts.initialQuery);\n\t\tconst list = new Container();\n\t\tconst footer = new Text(\"\", 1, 0);\n\t\tconst container = new Container() as Container & {\n\t\t\thandleInput: (data: string) => void;\n\t\t\tfocused: boolean;\n\t\t};\n\n\t\tconst refresh = () => {\n\t\t\tlist.clear();\n\t\t\tconst start = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(selectedIndex - Math.floor(maxVisible / 2), Math.max(0, filteredItems.length - maxVisible)),\n\t\t\t);\n\t\t\tconst end = Math.min(start + maxVisible, filteredItems.length);\n\t\t\tfor (let index = start; index < end; index++) {\n\t\t\t\tconst item = filteredItems[index];\n\t\t\t\tif (!item) continue;\n\t\t\t\tconst active = index === selectedIndex;\n\t\t\t\tconst prefix = active ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\t\tconst label = theme.fg(active ? \"accent\" : \"text\", item.label);\n\t\t\t\tconst description = item.description ? theme.fg(\"muted\", ` ${truncate(item.description, 48)}`) : \"\";\n\t\t\t\tlist.addChild(new TruncatedText(prefix + label + description, 1, 0));\n\t\t\t}\n\t\t\tif (filteredItems.length === 0) {\n\t\t\t\tlist.addChild(new Text(theme.fg(\"muted\", ` ${opts.emptyMessage ?? \"No matching items\"}`), 1, 0));\n\t\t\t} else if (start > 0 || end < filteredItems.length) {\n\t\t\t\tlist.addChild(new Text(theme.fg(\"muted\", ` (${selectedIndex + 1}/${filteredItems.length})`), 1, 0));\n\t\t\t}\n\t\t\tconst hints = [\n\t\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\t\trawKeyHint(\"↑↓\", \"navigate\"),\n\t\t\t\tkeyHint(\"tui.select.confirm\", \"select\"),\n\t\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t\t];\n\t\t\tfooter.setText(hints.join(\" \"));\n\t\t\tcontainer.invalidate();\n\t\t\ttui.requestRender();\n\t\t};\n\n\t\tconst applyFilter = (query: string, preferred?: T) => {\n\t\t\tfilteredItems = query\n\t\t\t\t? fuzzyFilter(\n\t\t\t\t\t\tallItems,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\t(item) => item.searchText ?? `${item.label} ${item.description ?? \"\"} ${item.value}`,\n\t\t\t\t\t)\n\t\t\t\t: allItems;\n\t\t\tconst preferredIndex = preferred ? filteredItems.findIndex((item) => item.value === preferred) : -1;\n\t\t\tselectedIndex = preferredIndex >= 0 ? preferredIndex : 0;\n\t\t\trefresh();\n\t\t};\n\n\t\tcontainer.addChild(new DynamicBorder((text) => theme.fg(\"border\", text)));\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new TruncatedText(theme.fg(\"accent\", theme.bold(opts.title)), 1, 0));\n\t\tif (opts.subtitle) container.addChild(new TruncatedText(theme.fg(\"muted\", opts.subtitle), 1, 0));\n\t\tcontainer.addChild(new Spacer(1));\n\t\t// Keep the search row mounted even when empty, matching /model and\n\t\t// preventing the list from jumping when the first character is typed.\n\t\tcontainer.addChild(input);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(footer);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder((text) => theme.fg(\"border\", text)));\n\n\t\tObject.defineProperty(container, \"focused\", {\n\t\t\tget: () => input.focused,\n\t\t\tset: (focused: boolean) => {\n\t\t\t\tinput.focused = focused;\n\t\t\t},\n\t\t});\n\n\t\tcontainer.handleInput = (data: string) => {\n\t\t\tif (keybindings.matches(data, \"tui.select.up\")) {\n\t\t\t\tif (filteredItems.length > 0) {\n\t\t\t\t\tselectedIndex = selectedIndex === 0 ? filteredItems.length - 1 : selectedIndex - 1;\n\t\t\t\t\trefresh();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"tui.select.down\")) {\n\t\t\t\tif (filteredItems.length > 0) {\n\t\t\t\t\tselectedIndex = selectedIndex === filteredItems.length - 1 ? 0 : selectedIndex + 1;\n\t\t\t\t\trefresh();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"tui.select.confirm\")) {\n\t\t\t\tconst item = filteredItems[selectedIndex];\n\t\t\t\tif (item) done(item.value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\t\tdone(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst before = input.getValue();\n\t\t\tinput.handleInput(data);\n\t\t\tconst after = input.getValue();\n\t\t\tif (after !== before) applyFilter(after);\n\t\t};\n\n\t\tapplyFilter(opts.initialQuery ?? \"\", opts.initialValue);\n\t\treturn container;\n\t};\n}\n\nexport interface ModelChecklistItem {\n\tid: string;\n\tname?: string;\n\tunavailable?: boolean;\n}\n\nexport function createModelChecklist(opts: {\n\ttitle: string;\n\tsubtitle?: string;\n\tmodels: ReadonlyArray<ModelChecklistItem>;\n\tinitiallySelected?: ReadonlySet<string>;\n\t/** Models that must remain selected while the checklist is open. */\n\tprotectedIds?: ReadonlySet<string>;\n\tonChange?: (selectedIds: string[]) => void;\n\tonProtectedToggle?: (id: string) => void;\n}): (\n\ttui: TUI,\n\ttheme: Theme,\n\tkeybindings: KeybindingsManager,\n\tdone: (result: { kind: \"close\"; selectedIds: string[] }) => void,\n) => Container {\n\treturn (tui, theme, keybindings, done) => {\n\t\tconst items = opts.models.map((model) => ({\n\t\t\tid: model.id,\n\t\t\tlabel: model.name && model.name !== model.id ? `${model.id} · ${model.name}` : model.id,\n\t\t\tunavailable: model.unavailable ?? false,\n\t\t\tprotected: opts.protectedIds?.has(model.id) ?? false,\n\t\t\tsearchText: `${model.id} ${model.name ?? \"\"} ${model.unavailable ? \"not returned unavailable\" : \"\"}`,\n\t\t}));\n\t\tconst selected = new Set(opts.initiallySelected ?? []);\n\t\tlet filter = \"\";\n\t\tlet selectedIndex = 0;\n\t\tconst maxVisible = 10;\n\t\tconst input = new Input();\n\t\tconst list = new Container();\n\t\tconst footer = new Text(\"\", 1, 0);\n\t\tconst container = new Container() as Container & {\n\t\t\thandleInput: (data: string) => void;\n\t\t\tfocused: boolean;\n\t\t};\n\n\t\tconst filtered = () => {\n\t\t\tconst query = filter.trim();\n\t\t\treturn query ? fuzzyFilter(items, query, (item) => item.searchText) : items;\n\t\t};\n\n\t\tconst notifyChange = () => opts.onChange?.([...selected]);\n\t\tconst selectionChanged = (before: ReadonlySet<string>): boolean =>\n\t\t\tbefore.size !== selected.size || [...before].some((id) => !selected.has(id));\n\n\t\tconst refresh = () => {\n\t\t\tconst rows = filtered();\n\t\t\tif (selectedIndex >= rows.length) selectedIndex = Math.max(0, rows.length - 1);\n\t\t\tlist.clear();\n\t\t\tconst start = Math.max(\n\t\t\t\t0,\n\t\t\t\tMath.min(selectedIndex - Math.floor(maxVisible / 2), Math.max(0, rows.length - maxVisible)),\n\t\t\t);\n\t\t\tconst end = Math.min(start + maxVisible, rows.length);\n\t\t\tfor (let index = start; index < end; index++) {\n\t\t\t\tconst item = rows[index]!;\n\t\t\t\tconst active = index === selectedIndex;\n\t\t\t\tconst mark = selected.has(item.id) ? theme.fg(\"success\", \"[x]\") : theme.fg(\"muted\", \"[ ]\");\n\t\t\t\tconst prefix = active ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\t\tconst label = theme.fg(active ? \"accent\" : \"text\", item.label);\n\t\t\t\tconst availability = item.unavailable ? theme.fg(\"warning\", \" (not returned)\") : \"\";\n\t\t\t\tconst current = item.protected ? theme.fg(\"success\", \" (current)\") : \"\";\n\t\t\t\tlist.addChild(new TruncatedText(`${prefix}${mark} ${label}${availability}${current}`, 1, 0));\n\t\t\t}\n\t\t\tif (rows.length === 0) {\n\t\t\t\tlist.addChild(new Text(theme.fg(\"muted\", \" No matching models\"), 1, 0));\n\t\t\t} else if (start > 0 || end < rows.length) {\n\t\t\t\tlist.addChild(new Text(theme.fg(\"muted\", ` (${selectedIndex + 1}/${rows.length})`), 1, 0));\n\t\t\t}\n\n\t\t\tconst statusLine = theme.fg(\"muted\", `${selected.size} selected · ${rows.length} shown`);\n\t\t\tconst hints = [\n\t\t\t\tkeyHint(\"app.list.toggle\", \"toggle\"),\n\t\t\t\tkeyHint(\"app.models.enableAll\", \"all\"),\n\t\t\t\tkeyHint(\"app.models.clearAll\", \"none\"),\n\t\t\t\trawKeyHint(\"type\", \"filter\"),\n\t\t\t\tkeyHint(\"tui.select.confirm\", \"done\"),\n\t\t\t\tkeyHint(\"tui.select.cancel\", \"back\"),\n\t\t\t];\n\t\t\tfooter.setText(`${statusLine}\\n${hints.join(\" \")}`);\n\t\t\tcontainer.invalidate();\n\t\t\ttui.requestRender();\n\t\t};\n\n\t\tcontainer.addChild(new DynamicBorder((text) => theme.fg(\"border\", text)));\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new TruncatedText(theme.fg(\"accent\", theme.bold(opts.title)), 1, 0));\n\t\tif (opts.subtitle) container.addChild(new TruncatedText(theme.fg(\"muted\", opts.subtitle), 1, 0));\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(input);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(list);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(footer);\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new DynamicBorder((text) => theme.fg(\"border\", text)));\n\n\t\tObject.defineProperty(container, \"focused\", {\n\t\t\tget: () => input.focused,\n\t\t\tset: (focused: boolean) => {\n\t\t\t\tinput.focused = focused;\n\t\t\t},\n\t\t});\n\n\t\tcontainer.handleInput = (data: string) => {\n\t\t\tconst rows = filtered();\n\t\t\tif (keybindings.matches(data, \"app.list.toggle\")) {\n\t\t\t\tconst item = rows[selectedIndex];\n\t\t\t\tif (item) {\n\t\t\t\t\tif (item.protected) {\n\t\t\t\t\t\topts.onProtectedToggle?.(item.id);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (selected.has(item.id)) selected.delete(item.id);\n\t\t\t\t\telse selected.add(item.id);\n\t\t\t\t\tnotifyChange();\n\t\t\t\t\trefresh();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"app.models.enableAll\")) {\n\t\t\t\tconst before = new Set(selected);\n\t\t\t\tfor (const item of rows) selected.add(item.id);\n\t\t\t\tif (selectionChanged(before)) notifyChange();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"app.models.clearAll\")) {\n\t\t\t\tconst before = new Set(selected);\n\t\t\t\tlet protectedId: string | undefined;\n\t\t\t\tfor (const item of rows) {\n\t\t\t\t\tif (item.protected) {\n\t\t\t\t\t\tprotectedId ??= item.id;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tselected.delete(item.id);\n\t\t\t\t}\n\t\t\t\tif (protectedId) opts.onProtectedToggle?.(protectedId);\n\t\t\t\tif (selectionChanged(before)) notifyChange();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"tui.select.up\")) {\n\t\t\t\tif (rows.length > 0) {\n\t\t\t\t\tselectedIndex = selectedIndex === 0 ? rows.length - 1 : selectedIndex - 1;\n\t\t\t\t\trefresh();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"tui.select.down\")) {\n\t\t\t\tif (rows.length > 0) {\n\t\t\t\t\tselectedIndex = selectedIndex === rows.length - 1 ? 0 : selectedIndex + 1;\n\t\t\t\t\trefresh();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"tui.select.confirm\") || keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\t\tdone({ kind: \"close\", selectedIds: [...selected] });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst before = input.getValue();\n\t\t\tinput.handleInput(data);\n\t\t\tconst after = input.getValue();\n\t\t\tif (after !== before) {\n\t\t\t\tfilter = after;\n\t\t\t\tselectedIndex = 0;\n\t\t\t\trefresh();\n\t\t\t}\n\t\t};\n\n\t\trefresh();\n\t\treturn container;\n\t};\n}\n\nexport function createThinkingMapEditor(opts: {\n\ttitle: string;\n\tmap: ThinkingLevelMap;\n\tlevels?: ReadonlyArray<ThinkingLevel>;\n\tonChange?: (map: ThinkingLevelMap) => void;\n}): (\n\ttui: TUI,\n\ttheme: Theme,\n\tkeybindings: KeybindingsManager,\n\tdone: (result: ThinkingLevelMap | undefined) => void,\n) => Container {\n\treturn (tui, theme, keybindings, done) => {\n\t\tconst levels = [...(opts.levels ?? ROUTER_THINKING_LEVELS)];\n\t\tconst working = resolveRouterThinkingMap(opts.map);\n\t\tlet index = 0;\n\t\tlet mode: \"levels\" | \"choice\" | \"target\" = \"levels\";\n\t\tlet choice = 0;\n\t\tconst input = new Input();\n\t\tconst container = new Container() as Container & { handleInput(data: string): void; focused: boolean };\n\t\tlet focused = false;\n\t\tconst refresh = () => {\n\t\t\tcontainer.clear();\n\t\t\tcontainer.addChild(new DynamicBorder((text) => theme.fg(\"border\", text)));\n\t\t\tcontainer.addChild(new Text(theme.fg(\"accent\", opts.title), 1, 1));\n\t\t\tif (mode === \"levels\") {\n\t\t\t\tfor (const [i, level] of levels.entries()) {\n\t\t\t\t\tconst value = working[level];\n\t\t\t\t\tconst status = value === undefined ? \"Inherit\" : value === null ? \"Hidden\" : `→ ${value}`;\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew TruncatedText(\n\t\t\t\t\t\t\ttheme.fg(i === index ? \"accent\" : \"text\", `${i === index ? \"→\" : \" \"} ${level} · ${status}`),\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (mode === \"choice\") {\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", `${levels[index]} · mapping`), 1, 0));\n\t\t\t\tfor (const [i, label] of [\n\t\t\t\t\t\"Inherit (Pi default)\",\n\t\t\t\t\t\"String target (provider effort)\",\n\t\t\t\t\t\"Hidden (null)\",\n\t\t\t\t].entries()) {\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(i === choice ? \"accent\" : \"text\", `${i === choice ? \"→\" : \" \"} ${label}`), 1, 0),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", `${levels[index]} · non-empty provider effort`), 1, 0));\n\t\t\t\tcontainer.addChild(input);\n\t\t\t}\n\t\t\tinput.focused = focused && mode === \"target\";\n\t\t\tcontainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`${keyHint(\"tui.select.confirm\", mode === \"target\" ? \"save\" : \"edit\")} ${keyHint(\"tui.select.cancel\", \"back\")}`,\n\t\t\t\t\t1,\n\t\t\t\t\t1,\n\t\t\t\t),\n\t\t\t);\n\t\t\tcontainer.addChild(new DynamicBorder((text) => theme.fg(\"border\", text)));\n\t\t\tcontainer.invalidate();\n\t\t\ttui.requestRender();\n\t\t};\n\t\tconst save = (value: string | null | undefined) => {\n\t\t\tconst level = levels[index]!;\n\t\t\tif (value === undefined) delete working[level];\n\t\t\telse working[level] = value;\n\t\t\topts.onChange?.({ ...working });\n\t\t\tmode = \"levels\";\n\t\t\trefresh();\n\t\t};\n\t\tObject.defineProperty(container, \"focused\", {\n\t\t\tget: () => focused,\n\t\t\tset: (value: boolean) => {\n\t\t\t\tfocused = value;\n\t\t\t\tinput.focused = value && mode === \"target\";\n\t\t\t},\n\t\t});\n\t\tcontainer.handleInput = (data) => {\n\t\t\tif (keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\t\tif (mode === \"levels\") done(undefined);\n\t\t\t\telse {\n\t\t\t\t\tmode = mode === \"target\" ? \"choice\" : \"levels\";\n\t\t\t\t\trefresh();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keybindings.matches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (mode === \"levels\") {\n\t\t\t\t\tmode = \"choice\";\n\t\t\t\t\tchoice = 0;\n\t\t\t\t} else if (mode === \"choice\") {\n\t\t\t\t\tif (choice === 0) return save(undefined);\n\t\t\t\t\tif (choice === 2) return save(null);\n\t\t\t\t\tmode = \"target\";\n\t\t\t\t\tinput.setValue(working[levels[index]!] ?? \"\");\n\t\t\t\t} else {\n\t\t\t\t\tconst value = input.getValue().trim();\n\t\t\t\t\tif (value) save(value);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mode === \"target\") {\n\t\t\t\tinput.handleInput(data);\n\t\t\t\ttui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst delta = keybindings.matches(data, \"tui.select.up\")\n\t\t\t\t? -1\n\t\t\t\t: keybindings.matches(data, \"tui.select.down\")\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0;\n\t\t\tif (delta) {\n\t\t\t\tif (mode === \"levels\") index = (index + delta + levels.length) % levels.length;\n\t\t\t\telse choice = (choice + delta + 3) % 3;\n\t\t\t\trefresh();\n\t\t\t}\n\t\t};\n\t\trefresh();\n\t\treturn container;\n\t};\n}\n"]}
@@ -1,15 +0,0 @@
1
- import type { FetchFunction, ProviderHeaders } from "@earendil-works/pi-ai";
2
- export declare const CODEX_VERSION = "0.153.4";
3
- export declare const CODEX_ORIGINATOR = "codex_cli_rs";
4
- type Environment = Readonly<Record<string, string | undefined>>;
5
- /** Environment-only Codex terminal detection. Deliberately does not query tmux clients or spawn zellij. */
6
- export declare function getCodexTerminal(env: Environment): string;
7
- /** Pure formatter; osType/version/architecture are os_info display values, not Node platform/arch identifiers. */
8
- export declare function formatCodexUserAgent(osType: string, osVersion: string, architecture: string, env: Environment): string;
9
- export declare function getCodexUserAgent(): string;
10
- /** SDK defaults are nullable. Normalize names before merging so casing cannot resurrect a removed default. */
11
- export declare function buildCodexHeaders(headers?: ProviderHeaders): ProviderHeaders;
12
- /** Per-provider, post-SDK cleanup only; this does not emulate Codex's TLS/HTTP transport fingerprint. */
13
- export declare function createCodexFetch(fetch?: FetchFunction): FetchFunction;
14
- export {};
15
- //# sourceMappingURL=identity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/extensions/router/identity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE5E,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAEhE,2GAA2G;AAC3G,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAkBzD;AAED,kHAAkH;AAClH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,GACd,MAAM,CAKR;AAkED,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAeD,8GAA8G;AAC9G,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,eAAe,CAuB5E;AAED,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,aAAiD,GAAG,aAAa,CA4BxG"}
@@ -1,173 +0,0 @@
1
- import { execFileSync } from "node:child_process";
2
- import { readFileSync } from "node:fs";
3
- import { machine, platform, release } from "node:os";
4
- export const CODEX_VERSION = "0.153.4";
5
- export const CODEX_ORIGINATOR = "codex_cli_rs";
6
- /** Environment-only Codex terminal detection. Deliberately does not query tmux clients or spawn zellij. */
7
- export function getCodexTerminal(env) {
8
- const nonEmpty = (key) => (env[key]?.trim() ? env[key] : undefined);
9
- const has = (key) => env[key] !== undefined;
10
- const versioned = (name, version) => (version ? `${name}/${version}` : name);
11
- let token;
12
- const program = nonEmpty("TERM_PROGRAM");
13
- if (program)
14
- token = versioned(program, nonEmpty("TERM_PROGRAM_VERSION"));
15
- else if (has("WEZTERM_VERSION"))
16
- token = versioned("WezTerm", nonEmpty("WEZTERM_VERSION"));
17
- else if (["ITERM_SESSION_ID", "ITERM_PROFILE", "ITERM_PROFILE_NAME"].some(has))
18
- token = "iTerm.app";
19
- else if (has("TERM_SESSION_ID"))
20
- token = "Apple_Terminal";
21
- else if (has("KITTY_WINDOW_ID") || env.TERM?.includes("kitty"))
22
- token = "kitty";
23
- else if (has("ALACRITTY_SOCKET") || env.TERM === "alacritty")
24
- token = "Alacritty";
25
- else if (has("KONSOLE_VERSION"))
26
- token = versioned("Konsole", nonEmpty("KONSOLE_VERSION"));
27
- else if (has("GNOME_TERMINAL_SCREEN"))
28
- token = "gnome-terminal";
29
- else if (has("VTE_VERSION"))
30
- token = versioned("VTE", nonEmpty("VTE_VERSION"));
31
- else if (has("WT_SESSION"))
32
- token = "WindowsTerminal";
33
- else
34
- token = nonEmpty("TERM") ?? "unknown";
35
- return Array.from(token, (char) => (/^[a-zA-Z0-9_./-]$/.test(char) ? char : "_")).join("");
36
- }
37
- /** Pure formatter; osType/version/architecture are os_info display values, not Node platform/arch identifiers. */
38
- export function formatCodexUserAgent(osType, osVersion, architecture, env) {
39
- return `${CODEX_ORIGINATOR}/${CODEX_VERSION} (${osType} ${osVersion}; ${architecture}) ${getCodexTerminal(env)}`.replace(/[^\x20-\x7e]/gu, "_");
40
- }
41
- function commandOutput(command, args) {
42
- try {
43
- return (execFileSync(command, args, {
44
- encoding: "utf8",
45
- timeout: 500,
46
- maxBuffer: 4096,
47
- windowsHide: true,
48
- stdio: ["ignore", "pipe", "ignore"],
49
- }).trim() || undefined);
50
- }
51
- catch {
52
- return undefined;
53
- }
54
- }
55
- function getOsIdentity() {
56
- const host = platform();
57
- let architecture = machine();
58
- // os_info windows/winapi.rs uses GetNativeSystemInfo: x86_64, aarch64, i386 (not x64/arm64/x86).
59
- architecture =
60
- { AMD64: "x86_64", x64: "x86_64", ARM64: "aarch64", arm64: "aarch64", x86: "i386" }[architecture] ?? architecture;
61
- if (host === "win32")
62
- return ["Windows", release(), architecture];
63
- if (host === "darwin")
64
- return ["Mac OS", commandOutput("/usr/bin/sw_vers", ["-productVersion"]) ?? "Unknown", architecture];
65
- if (host === "linux") {
66
- try {
67
- const fields = new Map(readFileSync("/etc/os-release", "utf8")
68
- .split("\n")
69
- .map((line) => {
70
- const separator = line.indexOf("=");
71
- return [line.slice(0, separator), line.slice(separator + 1).replace(/^"|"$/g, "")];
72
- }));
73
- // Common distributions only: os_info's full distro/lsb_release fallback matrix is not reproduced.
74
- const names = {
75
- ubuntu: "Ubuntu",
76
- debian: "Debian",
77
- fedora: "Fedora",
78
- arch: "Arch Linux",
79
- alpine: "Alpine Linux",
80
- linuxmint: "Linux Mint",
81
- nixos: "NixOS",
82
- centos: "CentOS",
83
- rocky: "Rocky Linux",
84
- rhel: "Red Hat Enterprise Linux",
85
- };
86
- return [names[fields.get("ID") ?? ""] ?? "Linux", fields.get("VERSION_ID") || "Unknown", architecture];
87
- }
88
- catch {
89
- return ["Linux", "Unknown", architecture];
90
- }
91
- }
92
- return [
93
- { freebsd: "FreeBSD", openbsd: "OpenBSD", netbsd: "NetBSD", aix: "AIX" }[host] ??
94
- "Unknown",
95
- release(),
96
- architecture,
97
- ];
98
- }
99
- let userAgent;
100
- export function getCodexUserAgent() {
101
- userAgent ??= formatCodexUserAgent(...getOsIdentity(), process.env);
102
- return userAgent;
103
- }
104
- const STAINLESS_HEADERS = [
105
- "x-stainless-lang",
106
- "x-stainless-package-version",
107
- "x-stainless-os",
108
- "x-stainless-arch",
109
- "x-stainless-runtime",
110
- "x-stainless-runtime-version",
111
- "x-stainless-retry-count",
112
- "x-stainless-timeout",
113
- "x-stainless-helper-method",
114
- "x-stainless-async",
115
- ];
116
- /** SDK defaults are nullable. Normalize names before merging so casing cannot resurrect a removed default. */
117
- export function buildCodexHeaders(headers) {
118
- const result = {
119
- "user-agent": getCodexUserAgent(),
120
- originator: CODEX_ORIGINATOR,
121
- accept: "text/event-stream",
122
- "content-type": "application/json",
123
- "x-session-affinity": null,
124
- "openai-organization": null,
125
- "openai-project": null,
126
- };
127
- // SDK process defaults belong to its OpenAI client, not to an unrelated configured relay.
128
- // Suppress their names without logging values; explicit provider/header hooks still win below.
129
- for (const line of (process.env.OPENAI_CUSTOM_HEADERS ?? "").split("\n")) {
130
- const colon = line.indexOf(":");
131
- if (colon < 0)
132
- continue;
133
- const name = line.slice(0, colon).trim().toLowerCase();
134
- if (/^[!#$%&'*+.^_`|~0-9a-z-]+$/.test(name) && !Object.hasOwn(result, name))
135
- result[name] = null;
136
- }
137
- for (const key of STAINLESS_HEADERS)
138
- result[key] = null;
139
- for (const [key, value] of Object.entries(headers ?? {}))
140
- result[key.toLowerCase()] = value;
141
- // Lifecycle owns hyphenated session-id/thread-id; never emit Pi's underscore affinity header.
142
- result.session_id = null;
143
- return result;
144
- }
145
- /** Per-provider, post-SDK cleanup only; this does not emulate Codex's TLS/HTTP transport fingerprint. */
146
- export function createCodexFetch(fetch = globalThis.fetch.bind(globalThis)) {
147
- return async (input, init) => {
148
- // Fetch replaces (does not overlay) Request headers when init.headers is supplied.
149
- // Forward the original Request and all init options: body streams, duplex, signal and dispatcher stay intact.
150
- const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));
151
- const names = [];
152
- headers.forEach((_value, name) => {
153
- names.push(name);
154
- });
155
- for (const key of names) {
156
- if (key.startsWith("x-stainless-") ||
157
- key.startsWith("x-pi-") ||
158
- key === "x-session-affinity" ||
159
- key === "session_id") {
160
- headers.delete(key);
161
- }
162
- }
163
- const url = new URL(input instanceof Request ? input.url : String(input));
164
- const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
165
- // SDK's JSON Accept is wrong for normal Responses SSE. An absent Accept may be an explicit null;
166
- // do not resurrect it (nor UA/originator/content-type) after SDK nullable-header assembly.
167
- if (method === "POST" && /\/responses\/?$/.test(url.pathname) && headers.has("accept")) {
168
- headers.set("accept", "text/event-stream");
169
- }
170
- return fetch(input, { ...init, headers });
171
- };
172
- }
173
- //# sourceMappingURL=identity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/extensions/router/identity.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { machine, platform, release } from \"node:os\";\nimport type { FetchFunction, ProviderHeaders } from \"@earendil-works/pi-ai\";\n\nexport const CODEX_VERSION = \"0.153.4\";\nexport const CODEX_ORIGINATOR = \"codex_cli_rs\";\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\n/** Environment-only Codex terminal detection. Deliberately does not query tmux clients or spawn zellij. */\nexport function getCodexTerminal(env: Environment): string {\n\tconst nonEmpty = (key: string) => (env[key]?.trim() ? env[key] : undefined);\n\tconst has = (key: string) => env[key] !== undefined;\n\tconst versioned = (name: string, version?: string) => (version ? `${name}/${version}` : name);\n\tlet token: string;\n\tconst program = nonEmpty(\"TERM_PROGRAM\");\n\tif (program) token = versioned(program, nonEmpty(\"TERM_PROGRAM_VERSION\"));\n\telse if (has(\"WEZTERM_VERSION\")) token = versioned(\"WezTerm\", nonEmpty(\"WEZTERM_VERSION\"));\n\telse if ([\"ITERM_SESSION_ID\", \"ITERM_PROFILE\", \"ITERM_PROFILE_NAME\"].some(has)) token = \"iTerm.app\";\n\telse if (has(\"TERM_SESSION_ID\")) token = \"Apple_Terminal\";\n\telse if (has(\"KITTY_WINDOW_ID\") || env.TERM?.includes(\"kitty\")) token = \"kitty\";\n\telse if (has(\"ALACRITTY_SOCKET\") || env.TERM === \"alacritty\") token = \"Alacritty\";\n\telse if (has(\"KONSOLE_VERSION\")) token = versioned(\"Konsole\", nonEmpty(\"KONSOLE_VERSION\"));\n\telse if (has(\"GNOME_TERMINAL_SCREEN\")) token = \"gnome-terminal\";\n\telse if (has(\"VTE_VERSION\")) token = versioned(\"VTE\", nonEmpty(\"VTE_VERSION\"));\n\telse if (has(\"WT_SESSION\")) token = \"WindowsTerminal\";\n\telse token = nonEmpty(\"TERM\") ?? \"unknown\";\n\treturn Array.from(token, (char) => (/^[a-zA-Z0-9_./-]$/.test(char) ? char : \"_\")).join(\"\");\n}\n\n/** Pure formatter; osType/version/architecture are os_info display values, not Node platform/arch identifiers. */\nexport function formatCodexUserAgent(\n\tosType: string,\n\tosVersion: string,\n\tarchitecture: string,\n\tenv: Environment,\n): string {\n\treturn `${CODEX_ORIGINATOR}/${CODEX_VERSION} (${osType} ${osVersion}; ${architecture}) ${getCodexTerminal(env)}`.replace(\n\t\t/[^\\x20-\\x7e]/gu,\n\t\t\"_\",\n\t);\n}\n\nfunction commandOutput(command: string, args: string[]): string | undefined {\n\ttry {\n\t\treturn (\n\t\t\texecFileSync(command, args, {\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\ttimeout: 500,\n\t\t\t\tmaxBuffer: 4096,\n\t\t\t\twindowsHide: true,\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\t}).trim() || undefined\n\t\t);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction getOsIdentity(): [string, string, string] {\n\tconst host = platform();\n\tlet architecture = machine();\n\t// os_info windows/winapi.rs uses GetNativeSystemInfo: x86_64, aarch64, i386 (not x64/arm64/x86).\n\tarchitecture =\n\t\t({ AMD64: \"x86_64\", x64: \"x86_64\", ARM64: \"aarch64\", arm64: \"aarch64\", x86: \"i386\" } as Record<string, string>)[\n\t\t\tarchitecture\n\t\t] ?? architecture;\n\tif (host === \"win32\") return [\"Windows\", release(), architecture];\n\tif (host === \"darwin\")\n\t\treturn [\"Mac OS\", commandOutput(\"/usr/bin/sw_vers\", [\"-productVersion\"]) ?? \"Unknown\", architecture];\n\tif (host === \"linux\") {\n\t\ttry {\n\t\t\tconst fields = new Map(\n\t\t\t\treadFileSync(\"/etc/os-release\", \"utf8\")\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.map((line) => {\n\t\t\t\t\t\tconst separator = line.indexOf(\"=\");\n\t\t\t\t\t\treturn [line.slice(0, separator), line.slice(separator + 1).replace(/^\"|\"$/g, \"\")];\n\t\t\t\t\t}),\n\t\t\t);\n\t\t\t// Common distributions only: os_info's full distro/lsb_release fallback matrix is not reproduced.\n\t\t\tconst names: Record<string, string> = {\n\t\t\t\tubuntu: \"Ubuntu\",\n\t\t\t\tdebian: \"Debian\",\n\t\t\t\tfedora: \"Fedora\",\n\t\t\t\tarch: \"Arch Linux\",\n\t\t\t\talpine: \"Alpine Linux\",\n\t\t\t\tlinuxmint: \"Linux Mint\",\n\t\t\t\tnixos: \"NixOS\",\n\t\t\t\tcentos: \"CentOS\",\n\t\t\t\trocky: \"Rocky Linux\",\n\t\t\t\trhel: \"Red Hat Enterprise Linux\",\n\t\t\t};\n\t\t\treturn [names[fields.get(\"ID\") ?? \"\"] ?? \"Linux\", fields.get(\"VERSION_ID\") || \"Unknown\", architecture];\n\t\t} catch {\n\t\t\treturn [\"Linux\", \"Unknown\", architecture];\n\t\t}\n\t}\n\treturn [\n\t\t({ freebsd: \"FreeBSD\", openbsd: \"OpenBSD\", netbsd: \"NetBSD\", aix: \"AIX\" } as Record<string, string>)[host] ??\n\t\t\t\"Unknown\",\n\t\trelease(),\n\t\tarchitecture,\n\t];\n}\n\nlet userAgent: string | undefined;\nexport function getCodexUserAgent(): string {\n\tuserAgent ??= formatCodexUserAgent(...getOsIdentity(), process.env);\n\treturn userAgent;\n}\n\nconst STAINLESS_HEADERS = [\n\t\"x-stainless-lang\",\n\t\"x-stainless-package-version\",\n\t\"x-stainless-os\",\n\t\"x-stainless-arch\",\n\t\"x-stainless-runtime\",\n\t\"x-stainless-runtime-version\",\n\t\"x-stainless-retry-count\",\n\t\"x-stainless-timeout\",\n\t\"x-stainless-helper-method\",\n\t\"x-stainless-async\",\n];\n\n/** SDK defaults are nullable. Normalize names before merging so casing cannot resurrect a removed default. */\nexport function buildCodexHeaders(headers?: ProviderHeaders): ProviderHeaders {\n\tconst result: ProviderHeaders = {\n\t\t\"user-agent\": getCodexUserAgent(),\n\t\toriginator: CODEX_ORIGINATOR,\n\t\taccept: \"text/event-stream\",\n\t\t\"content-type\": \"application/json\",\n\t\t\"x-session-affinity\": null,\n\t\t\"openai-organization\": null,\n\t\t\"openai-project\": null,\n\t};\n\t// SDK process defaults belong to its OpenAI client, not to an unrelated configured relay.\n\t// Suppress their names without logging values; explicit provider/header hooks still win below.\n\tfor (const line of (process.env.OPENAI_CUSTOM_HEADERS ?? \"\").split(\"\\n\")) {\n\t\tconst colon = line.indexOf(\":\");\n\t\tif (colon < 0) continue;\n\t\tconst name = line.slice(0, colon).trim().toLowerCase();\n\t\tif (/^[!#$%&'*+.^_`|~0-9a-z-]+$/.test(name) && !Object.hasOwn(result, name)) result[name] = null;\n\t}\n\tfor (const key of STAINLESS_HEADERS) result[key] = null;\n\tfor (const [key, value] of Object.entries(headers ?? {})) result[key.toLowerCase()] = value;\n\t// Lifecycle owns hyphenated session-id/thread-id; never emit Pi's underscore affinity header.\n\tresult.session_id = null;\n\treturn result;\n}\n\n/** Per-provider, post-SDK cleanup only; this does not emulate Codex's TLS/HTTP transport fingerprint. */\nexport function createCodexFetch(fetch: FetchFunction = globalThis.fetch.bind(globalThis)): FetchFunction {\n\treturn async (input, init) => {\n\t\t// Fetch replaces (does not overlay) Request headers when init.headers is supplied.\n\t\t// Forward the original Request and all init options: body streams, duplex, signal and dispatcher stay intact.\n\t\tconst headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));\n\t\tconst names: string[] = [];\n\t\theaders.forEach((_value, name) => {\n\t\t\tnames.push(name);\n\t\t});\n\t\tfor (const key of names) {\n\t\t\tif (\n\t\t\t\tkey.startsWith(\"x-stainless-\") ||\n\t\t\t\tkey.startsWith(\"x-pi-\") ||\n\t\t\t\tkey === \"x-session-affinity\" ||\n\t\t\t\tkey === \"session_id\"\n\t\t\t) {\n\t\t\t\theaders.delete(key);\n\t\t\t}\n\t\t}\n\t\tconst url = new URL(input instanceof Request ? input.url : String(input));\n\t\tconst method = (init?.method ?? (input instanceof Request ? input.method : \"GET\")).toUpperCase();\n\t\t// SDK's JSON Accept is wrong for normal Responses SSE. An absent Accept may be an explicit null;\n\t\t// do not resurrect it (nor UA/originator/content-type) after SDK nullable-header assembly.\n\t\tif (method === \"POST\" && /\\/responses\\/?$/.test(url.pathname) && headers.has(\"accept\")) {\n\t\t\theaders.set(\"accept\", \"text/event-stream\");\n\t\t}\n\t\treturn fetch(input, { ...init, headers });\n\t};\n}\n"]}
@@ -1,15 +0,0 @@
1
- /**
2
- * router — Codex-style API relays for Pi.
3
- *
4
- * Manages ~/.pi/agent/router.json. Each relay is registered with
5
- * pi.registerProvider (legacy config form + streamSimple), following Pi's
6
- * custom-provider docs: streamSimple wraps openAIResponsesApi from
7
- * @earendil-works/pi-ai/compat and reshapes the payload for Codex-style relays.
8
- *
9
- * /router: relay/catalog/model configuration. Normal API-key SSE requests follow
10
- * the pinned Codex client profile; pi-ai continues to own the Responses protocol.
11
- */
12
- import type { ExtensionAPI } from "../../core/extensions/types.ts";
13
- /** Async factory so relays are registered before interactive startup / --list-models. */
14
- export default function routerExtension(pi: ExtensionAPI): Promise<void>;
15
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAMnE,yFAAyF;AACzF,wBAA8B,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD7E"}
@@ -1,70 +0,0 @@
1
- /**
2
- * router — Codex-style API relays for Pi.
3
- *
4
- * Manages ~/.pi/agent/router.json. Each relay is registered with
5
- * pi.registerProvider (legacy config form + streamSimple), following Pi's
6
- * custom-provider docs: streamSimple wraps openAIResponsesApi from
7
- * @earendil-works/pi-ai/compat and reshapes the payload for Codex-style relays.
8
- *
9
- * /router: relay/catalog/model configuration. Normal API-key SSE requests follow
10
- * the pinned Codex client profile; pi-ai continues to own the Responses protocol.
11
- */
12
- import { COMMAND_DESCRIPTION, COMMAND_NAME, formatError } from "./constants.js";
13
- import { applyRouterFile, initializeRouterState, routerStateFor } from "./register.js";
14
- import { loadRouterFile } from "./store.js";
15
- import { runRouterCommand } from "./ui.js";
16
- /** Async factory so relays are registered before interactive startup / --list-models. */
17
- export default async function routerExtension(pi) {
18
- const reset = () => routerStateFor(pi).reset();
19
- pi.on("before_agent_start", reset);
20
- pi.on("session_start", reset);
21
- pi.on("session_tree", reset);
22
- pi.on("model_select", reset);
23
- pi.on("session_shutdown", reset);
24
- try {
25
- const file = await loadRouterFile();
26
- // Factory invocations without relays should have no filesystem side effects.
27
- if (file.relays.length > 0)
28
- await initializeRouterState(pi);
29
- applyRouterFile(pi, file);
30
- }
31
- catch (error) {
32
- console.error(`[router] failed to load config: ${formatError(error)}`);
33
- }
34
- pi.registerCommand(COMMAND_NAME, {
35
- description: COMMAND_DESCRIPTION,
36
- getArgumentCompletions: async (prefix) => {
37
- const first = prefix.trim().toLowerCase();
38
- const commands = [
39
- { value: "add", label: "add", description: "Add a relay" },
40
- { value: "list", label: "list", description: "Browse relays" },
41
- { value: "reload", label: "reload", description: "Re-register from disk" },
42
- ].filter((item) => !first || item.value.startsWith(first));
43
- try {
44
- const file = await loadRouterFile();
45
- const relays = file.relays
46
- .filter((relay) => !first || relay.id.toLowerCase().startsWith(first))
47
- .map((relay) => ({
48
- value: relay.id,
49
- label: relay.id,
50
- description: `${relay.models.length} model(s)`,
51
- }));
52
- const combined = [...commands, ...relays];
53
- return combined.length > 0 ? combined : null;
54
- }
55
- catch {
56
- return commands.length > 0 ? commands : null;
57
- }
58
- },
59
- handler: async (args, ctx) => {
60
- try {
61
- await runRouterCommand(args, ctx, pi);
62
- }
63
- catch (error) {
64
- if (ctx.hasUI)
65
- ctx.ui.notify(formatError(error), "error");
66
- }
67
- },
68
- });
69
- }
70
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/router/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * router — Codex-style API relays for Pi.\n *\n * Manages ~/.pi/agent/router.json. Each relay is registered with\n * pi.registerProvider (legacy config form + streamSimple), following Pi's\n * custom-provider docs: streamSimple wraps openAIResponsesApi from\n * @earendil-works/pi-ai/compat and reshapes the payload for Codex-style relays.\n *\n * /router: relay/catalog/model configuration. Normal API-key SSE requests follow\n * the pinned Codex client profile; pi-ai continues to own the Responses protocol.\n */\n\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { COMMAND_DESCRIPTION, COMMAND_NAME, formatError } from \"./constants.ts\";\nimport { applyRouterFile, initializeRouterState, routerStateFor } from \"./register.ts\";\nimport { loadRouterFile } from \"./store.ts\";\nimport { runRouterCommand } from \"./ui.ts\";\n\n/** Async factory so relays are registered before interactive startup / --list-models. */\nexport default async function routerExtension(pi: ExtensionAPI): Promise<void> {\n\tconst reset = () => routerStateFor(pi).reset();\n\tpi.on(\"before_agent_start\", reset);\n\tpi.on(\"session_start\", reset);\n\tpi.on(\"session_tree\", reset);\n\tpi.on(\"model_select\", reset);\n\tpi.on(\"session_shutdown\", reset);\n\ttry {\n\t\tconst file = await loadRouterFile();\n\t\t// Factory invocations without relays should have no filesystem side effects.\n\t\tif (file.relays.length > 0) await initializeRouterState(pi);\n\t\tapplyRouterFile(pi, file);\n\t} catch (error) {\n\t\tconsole.error(`[router] failed to load config: ${formatError(error)}`);\n\t}\n\n\tpi.registerCommand(COMMAND_NAME, {\n\t\tdescription: COMMAND_DESCRIPTION,\n\t\tgetArgumentCompletions: async (prefix) => {\n\t\t\tconst first = prefix.trim().toLowerCase();\n\t\t\tconst commands = [\n\t\t\t\t{ value: \"add\", label: \"add\", description: \"Add a relay\" },\n\t\t\t\t{ value: \"list\", label: \"list\", description: \"Browse relays\" },\n\t\t\t\t{ value: \"reload\", label: \"reload\", description: \"Re-register from disk\" },\n\t\t\t].filter((item) => !first || item.value.startsWith(first));\n\t\t\ttry {\n\t\t\t\tconst file = await loadRouterFile();\n\t\t\t\tconst relays = file.relays\n\t\t\t\t\t.filter((relay) => !first || relay.id.toLowerCase().startsWith(first))\n\t\t\t\t\t.map((relay) => ({\n\t\t\t\t\t\tvalue: relay.id,\n\t\t\t\t\t\tlabel: relay.id,\n\t\t\t\t\t\tdescription: `${relay.models.length} model(s)`,\n\t\t\t\t\t}));\n\t\t\t\tconst combined = [...commands, ...relays];\n\t\t\t\treturn combined.length > 0 ? combined : null;\n\t\t\t} catch {\n\t\t\t\treturn commands.length > 0 ? commands : null;\n\t\t\t}\n\t\t},\n\t\thandler: async (args, ctx) => {\n\t\t\ttry {\n\t\t\t\tawait runRouterCommand(args, ctx, pi);\n\t\t\t} catch (error) {\n\t\t\t\tif (ctx.hasUI) ctx.ui.notify(formatError(error), \"error\");\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
@@ -1,51 +0,0 @@
1
- /**
2
- * Default model metadata for Codex-style relays (272k context tier).
3
- * Matches the common GPT-5.6 Sol/Luna/Terra configuration used with transparent
4
- * sub2api / CPA / codex2api gateways after the product-side 372k rollback.
5
- *
6
- * Display name (`name`) is optional: omit it to show the model id in /model.
7
- */
8
- import { type ThinkingLevel } from "./constants.ts";
9
- import type { RelayModelConfig, ThinkingLevelMap } from "./types.ts";
10
- /** Conservative defaults for newly added models only. */
11
- export declare const DEFAULT_THINKING_LEVEL_MAP: ThinkingLevelMap;
12
- /** Optional custom label only — never invent a default name; empty means show id. */
13
- export declare function createDefaultModelConfig(id: string, name?: string): RelayModelConfig;
14
- /** Label for UI lists: custom name if set, otherwise id. */
15
- export declare function displayModelLabel(entry: Pick<RelayModelConfig, "id" | "name">): string;
16
- /** Merge stored model entry with defaults so partial saves stay complete. */
17
- export declare function resolveModelConfig(entry: RelayModelConfig): {
18
- id: string;
19
- name?: string;
20
- reasoning: boolean;
21
- input: Array<"text" | "image">;
22
- contextWindow: number;
23
- maxTokens: number;
24
- thinkingLevelMap: ThinkingLevelMap;
25
- };
26
- export declare function normalizeThinkingMap(map: ThinkingLevelMap | undefined): ThinkingLevelMap;
27
- /** Preserve Pi omitted semantics; do not impose new-model defaults on existing maps. */
28
- export declare function resolveRouterThinkingMap(map: ThinkingLevelMap | undefined): ThinkingLevelMap;
29
- export declare function summarizeThinkingMap(map: ThinkingLevelMap | undefined): string;
30
- export declare function toggleThinkingLevel(map: ThinkingLevelMap, level: ThinkingLevel): ThinkingLevelMap;
31
- /**
32
- * ProviderConfig model entry required by registerProvider.
33
- * Pi requires a `name` string; when the user left it empty we pass the id so /model shows the id.
34
- */
35
- export declare function toRegisterModel(entry: RelayModelConfig): {
36
- headers?: Record<string, string> | undefined;
37
- id: string;
38
- name: string;
39
- reasoning: boolean;
40
- input: ("text" | "image")[];
41
- contextWindow: number;
42
- maxTokens: number;
43
- thinkingLevelMap: Partial<Record<"off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", string | null>>;
44
- cost: {
45
- input: number;
46
- output: number;
47
- cacheRead: number;
48
- cacheWrite: number;
49
- };
50
- };
51
- //# sourceMappingURL=presets.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/extensions/router/presets.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAqD,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvG,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAErE,yDAAyD;AACzD,eAAO,MAAM,0BAA0B,EAAE,gBAQxC,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAYpF;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,CAAC,GAAG,MAAM,CAGtF;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,gBAAgB,CAAC;CACnC,CAYA;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,CASxF;AAED,wFAAwF;AACxF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,CAE5F;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAY9E;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,GAAG,gBAAgB,CAKjG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;;;;;;EAatD"}
@@ -1,108 +0,0 @@
1
- /**
2
- * Default model metadata for Codex-style relays (272k context tier).
3
- * Matches the common GPT-5.6 Sol/Luna/Terra configuration used with transparent
4
- * sub2api / CPA / codex2api gateways after the product-side 372k rollback.
5
- *
6
- * Display name (`name`) is optional: omit it to show the model id in /model.
7
- */
8
- import { DEFAULTS, ROUTER_THINKING_LEVELS, THINKING_LEVELS } from "./constants.js";
9
- /** Conservative defaults for newly added models only. */
10
- export const DEFAULT_THINKING_LEVEL_MAP = {
11
- off: null,
12
- minimal: null,
13
- low: "low",
14
- medium: "medium",
15
- high: "high",
16
- xhigh: null,
17
- max: null,
18
- };
19
- /** Optional custom label only — never invent a default name; empty means show id. */
20
- export function createDefaultModelConfig(id, name) {
21
- const trimmed = name?.trim();
22
- const config = {
23
- id,
24
- reasoning: true,
25
- input: ["text", "image"],
26
- contextWindow: DEFAULTS.contextWindow,
27
- maxTokens: DEFAULTS.maxTokens,
28
- thinkingLevelMap: { ...DEFAULT_THINKING_LEVEL_MAP },
29
- };
30
- if (trimmed && trimmed !== id)
31
- config.name = trimmed;
32
- return config;
33
- }
34
- /** Label for UI lists: custom name if set, otherwise id. */
35
- export function displayModelLabel(entry) {
36
- const name = entry.name?.trim();
37
- return name && name !== entry.id ? name : entry.id;
38
- }
39
- /** Merge stored model entry with defaults so partial saves stay complete. */
40
- export function resolveModelConfig(entry) {
41
- const base = createDefaultModelConfig(entry.id);
42
- const name = entry.name?.trim();
43
- return {
44
- id: entry.id,
45
- ...(name && name !== entry.id ? { name } : {}),
46
- reasoning: entry.reasoning ?? base.reasoning,
47
- input: entry.input ?? base.input,
48
- contextWindow: entry.contextWindow ?? base.contextWindow,
49
- maxTokens: entry.maxTokens ?? Math.min(base.maxTokens, entry.contextWindow ?? base.contextWindow),
50
- thinkingLevelMap: resolveRouterThinkingMap(entry.thinkingLevelMap),
51
- };
52
- }
53
- export function normalizeThinkingMap(map) {
54
- const result = {};
55
- for (const level of THINKING_LEVELS) {
56
- if (map && level in map) {
57
- const value = map[level];
58
- result[level] = value === undefined ? undefined : value;
59
- }
60
- }
61
- return result;
62
- }
63
- /** Preserve Pi omitted semantics; do not impose new-model defaults on existing maps. */
64
- export function resolveRouterThinkingMap(map) {
65
- return normalizeThinkingMap(map);
66
- }
67
- export function summarizeThinkingMap(map) {
68
- const resolved = resolveRouterThinkingMap(map);
69
- const enabled = [];
70
- const hidden = [];
71
- for (const level of ROUTER_THINKING_LEVELS) {
72
- const value = resolved[level];
73
- if (value === null || (value === undefined && (level === "xhigh" || level === "max")))
74
- hidden.push(level);
75
- else if (value === undefined)
76
- enabled.push(level);
77
- else
78
- enabled.push(level === value ? level : `${level}→${value}`);
79
- }
80
- const on = enabled.length > 0 ? enabled.join(", ") : "none";
81
- return hidden.length > 0 ? `${on} · hide ${hidden.join(",")}` : on;
82
- }
83
- export function toggleThinkingLevel(map, level) {
84
- const next = resolveRouterThinkingMap(map);
85
- if (!ROUTER_THINKING_LEVELS.includes(level))
86
- return next;
87
- next[level] = next[level] === null ? level : null;
88
- return next;
89
- }
90
- /**
91
- * ProviderConfig model entry required by registerProvider.
92
- * Pi requires a `name` string; when the user left it empty we pass the id so /model shows the id.
93
- */
94
- export function toRegisterModel(entry) {
95
- const resolved = resolveModelConfig(entry);
96
- return {
97
- id: resolved.id,
98
- name: resolved.name ?? resolved.id,
99
- reasoning: resolved.reasoning,
100
- input: resolved.input,
101
- contextWindow: resolved.contextWindow,
102
- maxTokens: resolved.maxTokens,
103
- thinkingLevelMap: resolved.thinkingLevelMap,
104
- cost: entry.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
105
- ...(entry.headers ? { headers: entry.headers } : {}),
106
- };
107
- }
108
- //# sourceMappingURL=presets.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/extensions/router/presets.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Default model metadata for Codex-style relays (272k context tier).\n * Matches the common GPT-5.6 Sol/Luna/Terra configuration used with transparent\n * sub2api / CPA / codex2api gateways after the product-side 372k rollback.\n *\n * Display name (`name`) is optional: omit it to show the model id in /model.\n */\n\nimport { DEFAULTS, ROUTER_THINKING_LEVELS, THINKING_LEVELS, type ThinkingLevel } from \"./constants.ts\";\nimport type { RelayModelConfig, ThinkingLevelMap } from \"./types.ts\";\n\n/** Conservative defaults for newly added models only. */\nexport const DEFAULT_THINKING_LEVEL_MAP: ThinkingLevelMap = {\n\toff: null,\n\tminimal: null,\n\tlow: \"low\",\n\tmedium: \"medium\",\n\thigh: \"high\",\n\txhigh: null,\n\tmax: null,\n};\n\n/** Optional custom label only — never invent a default name; empty means show id. */\nexport function createDefaultModelConfig(id: string, name?: string): RelayModelConfig {\n\tconst trimmed = name?.trim();\n\tconst config: RelayModelConfig = {\n\t\tid,\n\t\treasoning: true,\n\t\tinput: [\"text\", \"image\"],\n\t\tcontextWindow: DEFAULTS.contextWindow,\n\t\tmaxTokens: DEFAULTS.maxTokens,\n\t\tthinkingLevelMap: { ...DEFAULT_THINKING_LEVEL_MAP },\n\t};\n\tif (trimmed && trimmed !== id) config.name = trimmed;\n\treturn config;\n}\n\n/** Label for UI lists: custom name if set, otherwise id. */\nexport function displayModelLabel(entry: Pick<RelayModelConfig, \"id\" | \"name\">): string {\n\tconst name = entry.name?.trim();\n\treturn name && name !== entry.id ? name : entry.id;\n}\n\n/** Merge stored model entry with defaults so partial saves stay complete. */\nexport function resolveModelConfig(entry: RelayModelConfig): {\n\tid: string;\n\tname?: string;\n\treasoning: boolean;\n\tinput: Array<\"text\" | \"image\">;\n\tcontextWindow: number;\n\tmaxTokens: number;\n\tthinkingLevelMap: ThinkingLevelMap;\n} {\n\tconst base = createDefaultModelConfig(entry.id);\n\tconst name = entry.name?.trim();\n\treturn {\n\t\tid: entry.id,\n\t\t...(name && name !== entry.id ? { name } : {}),\n\t\treasoning: entry.reasoning ?? base.reasoning!,\n\t\tinput: entry.input ?? base.input!,\n\t\tcontextWindow: entry.contextWindow ?? base.contextWindow!,\n\t\tmaxTokens: entry.maxTokens ?? Math.min(base.maxTokens!, entry.contextWindow ?? base.contextWindow!),\n\t\tthinkingLevelMap: resolveRouterThinkingMap(entry.thinkingLevelMap),\n\t};\n}\n\nexport function normalizeThinkingMap(map: ThinkingLevelMap | undefined): ThinkingLevelMap {\n\tconst result: ThinkingLevelMap = {};\n\tfor (const level of THINKING_LEVELS) {\n\t\tif (map && level in map) {\n\t\t\tconst value = map[level];\n\t\t\tresult[level] = value === undefined ? undefined : value;\n\t\t}\n\t}\n\treturn result;\n}\n\n/** Preserve Pi omitted semantics; do not impose new-model defaults on existing maps. */\nexport function resolveRouterThinkingMap(map: ThinkingLevelMap | undefined): ThinkingLevelMap {\n\treturn normalizeThinkingMap(map);\n}\n\nexport function summarizeThinkingMap(map: ThinkingLevelMap | undefined): string {\n\tconst resolved = resolveRouterThinkingMap(map);\n\tconst enabled: string[] = [];\n\tconst hidden: string[] = [];\n\tfor (const level of ROUTER_THINKING_LEVELS) {\n\t\tconst value = resolved[level];\n\t\tif (value === null || (value === undefined && (level === \"xhigh\" || level === \"max\"))) hidden.push(level);\n\t\telse if (value === undefined) enabled.push(level);\n\t\telse enabled.push(level === value ? level : `${level}→${value}`);\n\t}\n\tconst on = enabled.length > 0 ? enabled.join(\", \") : \"none\";\n\treturn hidden.length > 0 ? `${on} · hide ${hidden.join(\",\")}` : on;\n}\n\nexport function toggleThinkingLevel(map: ThinkingLevelMap, level: ThinkingLevel): ThinkingLevelMap {\n\tconst next = resolveRouterThinkingMap(map);\n\tif (!ROUTER_THINKING_LEVELS.includes(level as (typeof ROUTER_THINKING_LEVELS)[number])) return next;\n\tnext[level] = next[level] === null ? level : null;\n\treturn next;\n}\n\n/**\n * ProviderConfig model entry required by registerProvider.\n * Pi requires a `name` string; when the user left it empty we pass the id so /model shows the id.\n */\nexport function toRegisterModel(entry: RelayModelConfig) {\n\tconst resolved = resolveModelConfig(entry);\n\treturn {\n\t\tid: resolved.id,\n\t\tname: resolved.name ?? resolved.id,\n\t\treasoning: resolved.reasoning,\n\t\tinput: resolved.input,\n\t\tcontextWindow: resolved.contextWindow,\n\t\tmaxTokens: resolved.maxTokens,\n\t\tthinkingLevelMap: resolved.thinkingLevelMap,\n\t\tcost: entry.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\t...(entry.headers ? { headers: entry.headers } : {}),\n\t};\n}\n"]}
@@ -1,26 +0,0 @@
1
- /** Fetch a bounded OpenAI or Codex model catalog from a relay baseUrl. */
2
- import type { FetchFunction, ProviderHeaders } from "@earendil-works/pi-ai";
3
- import type { RelayModelConfig } from "./types.ts";
4
- export interface ProbeModel extends Pick<RelayModelConfig, "id" | "name"> {
5
- /** Merge into local defaults, then cap default maxTokens to the resulting contextWindow. */
6
- metadata?: Partial<Omit<RelayModelConfig, "id" | "name">>;
7
- }
8
- export type ProbeResult = {
9
- ok: true;
10
- models: ProbeModel[];
11
- truncated: boolean;
12
- } | {
13
- ok: false;
14
- error: string;
15
- };
16
- export declare function probeRelayModels(opts: {
17
- baseUrl: string;
18
- apiKey?: string;
19
- /** Resolved values only: config/env/command resolution belongs to the caller. */
20
- headers?: ProviderHeaders;
21
- catalog?: "openai" | "codex";
22
- fetch?: FetchFunction;
23
- signal?: AbortSignal;
24
- timeoutMs?: number;
25
- }): Promise<ProbeResult>;
26
- //# sourceMappingURL=probe.d.ts.map