@astralyn/pi 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/bundle/chunks/anthropic-messages-NVP5OPIM.js +6 -0
  3. package/dist/bundle/chunks/{azure-openai-responses-CH74HGP4.js → azure-openai-responses-IBTOZ5MH.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-H35KWBT5.js → chunk-4XZYHGVN.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-3MMB5I7J.js → chunk-7HJ6CHUB.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-MAC4N3BW.js → chunk-7UBIBLPN.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-D3XW5X3Z.js → chunk-A5HU4TE6.js} +160 -229
  8. package/dist/bundle/chunks/{chunk-C2ARIVS3.js → chunk-B2UOWO4A.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-KAC2YPTW.js → chunk-J75WV3FL.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-TEAAYBTS.js → chunk-LHSPN2IO.js} +1 -1
  11. package/dist/bundle/chunks/chunk-Q74S7ILH.js +2 -0
  12. package/dist/bundle/chunks/{chunk-QLU3LESZ.js → chunk-QDDSFJ35.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-EJEOEBSJ.js → chunk-UQECUCUH.js} +1 -1
  14. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-XO45ZT3V.js → cloudflare-workers-ai-system-one-HGOVFZDC.js} +1 -1
  15. package/dist/bundle/chunks/codemode-worker.js +17 -9
  16. package/dist/bundle/chunks/github-copilot.js +1 -1
  17. package/dist/bundle/chunks/{google-generative-ai-VVO64ZRQ.js → google-generative-ai-M44TSMAN.js} +1 -1
  18. package/dist/bundle/chunks/{google-vertex-LKS5NUHA.js → google-vertex-3C4OWLFX.js} +1 -1
  19. package/dist/bundle/chunks/{mistral-conversations-NJUOG4ET.js → mistral-conversations-I5PL4VCZ.js} +1 -1
  20. package/dist/bundle/chunks/openai-codex-responses-O5EUDL54.js +10 -0
  21. package/dist/bundle/chunks/{openai-completions-7HTTU6FH.js → openai-completions-X3SSG5BQ.js} +1 -1
  22. package/dist/bundle/chunks/{openai-decisions-776H4VDZ.js → openai-decisions-TVCDIPZX.js} +1 -1
  23. package/dist/bundle/chunks/{openai-responses-7A6BAQ5X.js → openai-responses-NYPNKVDV.js} +1 -1
  24. package/dist/bundle/chunks/{typesafe-system-one-2DQLG4R2.js → typesafe-system-one-LWPJYTJP.js} +1 -1
  25. package/dist/bundle/chunks/{virtual-modules-2NHGQRS6.js → virtual-modules-OZTPKGU7.js} +1 -1
  26. package/dist/bundle/cli.js +1 -1
  27. package/dist/bundle/index.js +1 -1
  28. package/dist/bundle/rpc-entry.js +1 -1
  29. package/dist/core/agent-session.d.ts +14 -1
  30. package/dist/core/agent-session.d.ts.map +1 -1
  31. package/dist/core/agent-session.js +93 -58
  32. package/dist/core/agent-session.js.map +1 -1
  33. package/dist/core/auth-storage.d.ts.map +1 -1
  34. package/dist/core/auth-storage.js +20 -13
  35. package/dist/core/auth-storage.js.map +1 -1
  36. package/dist/core/bug-report.d.ts +9 -1
  37. package/dist/core/bug-report.d.ts.map +1 -1
  38. package/dist/core/compaction/utils.d.ts +6 -0
  39. package/dist/core/compaction/utils.d.ts.map +1 -1
  40. package/dist/core/compaction/utils.js +7 -8
  41. package/dist/core/compaction/utils.js.map +1 -1
  42. package/dist/core/extensions/index.d.ts +1 -1
  43. package/dist/core/extensions/index.d.ts.map +1 -1
  44. package/dist/core/extensions/index.js.map +1 -1
  45. package/dist/core/extensions/runner.d.ts +4 -2
  46. package/dist/core/extensions/runner.d.ts.map +1 -1
  47. package/dist/core/extensions/runner.js +2 -3
  48. package/dist/core/extensions/runner.js.map +1 -1
  49. package/dist/core/extensions/types.d.ts +31 -7
  50. package/dist/core/extensions/types.d.ts.map +1 -1
  51. package/dist/core/extensions/types.js.map +1 -1
  52. package/dist/core/key-id-schema.d.ts +6 -0
  53. package/dist/core/key-id-schema.d.ts.map +1 -0
  54. package/dist/core/key-id-schema.js +16 -0
  55. package/dist/core/key-id-schema.js.map +1 -0
  56. package/dist/core/keybinding-registry.d.ts +4 -3
  57. package/dist/core/keybinding-registry.d.ts.map +1 -1
  58. package/dist/core/keybinding-registry.js +4 -3
  59. package/dist/core/keybinding-registry.js.map +1 -1
  60. package/dist/core/keybindings-schema.d.ts +4 -0
  61. package/dist/core/keybindings-schema.d.ts.map +1 -0
  62. package/dist/core/keybindings-schema.js +16 -0
  63. package/dist/core/keybindings-schema.js.map +1 -0
  64. package/dist/core/keybindings.d.ts +258 -81
  65. package/dist/core/keybindings.d.ts.map +1 -1
  66. package/dist/core/keybindings.js +27 -24
  67. package/dist/core/keybindings.js.map +1 -1
  68. package/dist/core/model-config.d.ts +713 -180
  69. package/dist/core/model-config.d.ts.map +1 -1
  70. package/dist/core/model-config.js +18 -179
  71. package/dist/core/model-config.js.map +1 -1
  72. package/dist/core/model-runtime.d.ts.map +1 -1
  73. package/dist/core/model-runtime.js +11 -6
  74. package/dist/core/model-runtime.js.map +1 -1
  75. package/dist/core/package-manager.d.ts.map +1 -1
  76. package/dist/core/package-manager.js +3 -3
  77. package/dist/core/package-manager.js.map +1 -1
  78. package/dist/core/project-trust.d.ts.map +1 -1
  79. package/dist/core/project-trust.js +2 -1
  80. package/dist/core/project-trust.js.map +1 -1
  81. package/dist/core/remote-catalog-provider.d.ts +12 -1
  82. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  83. package/dist/core/remote-catalog-provider.js +82 -24
  84. package/dist/core/remote-catalog-provider.js.map +1 -1
  85. package/dist/core/resource-loader.d.ts.map +1 -1
  86. package/dist/core/resource-loader.js +7 -2
  87. package/dist/core/resource-loader.js.map +1 -1
  88. package/dist/core/settings-defaults.d.ts +65 -0
  89. package/dist/core/settings-defaults.d.ts.map +1 -0
  90. package/dist/core/settings-defaults.js +66 -0
  91. package/dist/core/settings-defaults.js.map +1 -0
  92. package/dist/core/settings-manager.d.ts +4 -149
  93. package/dist/core/settings-manager.d.ts.map +1 -1
  94. package/dist/core/settings-manager.js +48 -44
  95. package/dist/core/settings-manager.js.map +1 -1
  96. package/dist/core/settings-schema.d.ts +231 -0
  97. package/dist/core/settings-schema.d.ts.map +1 -0
  98. package/dist/core/settings-schema.js +294 -0
  99. package/dist/core/settings-schema.js.map +1 -0
  100. package/dist/core/tools/render-utils.d.ts +18 -0
  101. package/dist/core/tools/render-utils.d.ts.map +1 -1
  102. package/dist/core/tools/render-utils.js +46 -0
  103. package/dist/core/tools/render-utils.js.map +1 -1
  104. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  105. package/dist/core/tools/renderers/bash.js +21 -50
  106. package/dist/core/tools/renderers/bash.js.map +1 -1
  107. package/dist/extensions/btw/keybindings.d.ts +2 -2
  108. package/dist/extensions/btw/keybindings.d.ts.map +1 -1
  109. package/dist/extensions/btw/keybindings.js.map +1 -1
  110. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  111. package/dist/extensions/codemode/execute.js +64 -45
  112. package/dist/extensions/codemode/execute.js.map +1 -1
  113. package/dist/extensions/codemode/index.d.ts.map +1 -1
  114. package/dist/extensions/codemode/index.js +3 -7
  115. package/dist/extensions/codemode/index.js.map +1 -1
  116. package/dist/extensions/codemode/renderer.d.ts +2 -2
  117. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  118. package/dist/extensions/codemode/renderer.js +9 -3
  119. package/dist/extensions/codemode/renderer.js.map +1 -1
  120. package/dist/extensions/codemode/tool.d.ts +6 -12
  121. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  122. package/dist/extensions/codemode/tool.js +44 -32
  123. package/dist/extensions/codemode/tool.js.map +1 -1
  124. package/dist/extensions/list-keybindings.d.ts +2 -2
  125. package/dist/extensions/list-keybindings.d.ts.map +1 -1
  126. package/dist/extensions/list-keybindings.js.map +1 -1
  127. package/dist/extensions/mcp/cli.js +5 -8
  128. package/dist/extensions/mcp/cli.js.map +1 -1
  129. package/dist/extensions/mcp/index.d.ts.map +1 -1
  130. package/dist/extensions/mcp/index.js +25 -34
  131. package/dist/extensions/mcp/index.js.map +1 -1
  132. package/dist/extensions/mcp/resources.d.ts +0 -6
  133. package/dist/extensions/mcp/resources.d.ts.map +1 -1
  134. package/dist/extensions/mcp/resources.js +1 -1
  135. package/dist/extensions/mcp/resources.js.map +1 -1
  136. package/dist/extensions/mcp/runtime.d.ts +3 -6
  137. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  138. package/dist/extensions/mcp/runtime.js +4 -39
  139. package/dist/extensions/mcp/runtime.js.map +1 -1
  140. package/dist/extensions/mcp/tools.d.ts +2 -3
  141. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  142. package/dist/extensions/mcp/tools.js +62 -6
  143. package/dist/extensions/mcp/tools.js.map +1 -1
  144. package/dist/extensions/provider/keybindings.d.ts +2 -2
  145. package/dist/extensions/provider/keybindings.d.ts.map +1 -1
  146. package/dist/extensions/provider/keybindings.js.map +1 -1
  147. package/dist/extensions/search/code-search.d.ts +0 -2
  148. package/dist/extensions/search/code-search.d.ts.map +1 -1
  149. package/dist/extensions/search/code-search.js +2 -2
  150. package/dist/extensions/search/code-search.js.map +1 -1
  151. package/dist/extensions/search/command.js +2 -2
  152. package/dist/extensions/search/command.js.map +1 -1
  153. package/dist/extensions/search/index.d.ts.map +1 -1
  154. package/dist/extensions/search/index.js +14 -11
  155. package/dist/extensions/search/index.js.map +1 -1
  156. package/dist/extensions/search/workspace.d.ts +11 -10
  157. package/dist/extensions/search/workspace.d.ts.map +1 -1
  158. package/dist/extensions/search/workspace.js +259 -141
  159. package/dist/extensions/search/workspace.js.map +1 -1
  160. package/dist/extensions/tool-search/index.d.ts.map +1 -1
  161. package/dist/extensions/tool-search/index.js +1 -6
  162. package/dist/extensions/tool-search/index.js.map +1 -1
  163. package/dist/extensions/tool-search/tool.d.ts +0 -2
  164. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  165. package/dist/extensions/tool-search/tool.js +2 -4
  166. package/dist/extensions/tool-search/tool.js.map +1 -1
  167. package/dist/index.d.ts +1 -1
  168. package/dist/index.d.ts.map +1 -1
  169. package/dist/index.js.map +1 -1
  170. package/dist/main.js +3 -3
  171. package/dist/main.js.map +1 -1
  172. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  173. package/dist/modes/interactive/components/settings-selector.js +3 -2
  174. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  175. package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
  176. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  177. package/dist/modes/interactive/components/status-indicator.js +2 -2
  178. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  179. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  180. package/dist/modes/interactive/interactive-mode.js +11 -5
  181. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  182. package/dist/modes/interactive/theme/dark.json +1 -1
  183. package/dist/modes/interactive/theme/light.json +1 -1
  184. package/dist/modes/interactive/theme/theme-schema.d.ts +28 -0
  185. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  186. package/dist/modes/interactive/theme/theme-schema.js +105 -0
  187. package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  188. package/dist/modes/interactive/theme/theme-tokens.d.ts +257 -0
  189. package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -0
  190. package/dist/modes/interactive/theme/theme-tokens.js +94 -0
  191. package/dist/modes/interactive/theme/theme-tokens.js.map +1 -0
  192. package/dist/modes/interactive/theme/theme.d.ts +13 -16
  193. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  194. package/dist/modes/interactive/theme/theme.js +23 -31
  195. package/dist/modes/interactive/theme/theme.js.map +1 -1
  196. package/dist/modes/print-mode.d.ts.map +1 -1
  197. package/dist/modes/print-mode.js +4 -0
  198. package/dist/modes/print-mode.js.map +1 -1
  199. package/dist/utils/clipboard.d.ts.map +1 -1
  200. package/dist/utils/clipboard.js +6 -1
  201. package/dist/utils/clipboard.js.map +1 -1
  202. package/docs/bundled/extensions/search.md +2 -1
  203. package/docs/codemode.md +1 -1
  204. package/docs/compaction.md +2 -2
  205. package/docs/environment-variables.md +2 -1
  206. package/docs/extensions.md +10 -4
  207. package/docs/keybindings.md +1 -0
  208. package/docs/mcp.md +1 -1
  209. package/docs/models.md +1 -0
  210. package/docs/providers.md +16 -0
  211. package/docs/settings.md +2 -2
  212. package/docs/themes.md +4 -2
  213. package/docs/tui.md +1 -1
  214. package/docs/usage.md +2 -0
  215. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  216. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  217. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  218. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  219. package/examples/extensions/gondolin/package-lock.json +2 -2
  220. package/examples/extensions/gondolin/package.json +1 -1
  221. package/examples/extensions/overlay-test.ts +2 -2
  222. package/examples/extensions/plan-mode/index.ts +6 -2
  223. package/examples/extensions/sandbox/package-lock.json +2 -2
  224. package/examples/extensions/sandbox/package.json +1 -1
  225. package/examples/extensions/with-deps/package-lock.json +2 -2
  226. package/examples/extensions/with-deps/package.json +1 -1
  227. package/npm-shrinkwrap.json +54 -102
  228. package/package.json +8 -20
  229. package/schemas/keybindings.schema.json +453 -0
  230. package/schemas/models.schema.json +1157 -0
  231. package/schemas/settings.schema.json +782 -0
  232. package/schemas/theme.schema.json +365 -0
  233. package/dist/bundle/chunks/anthropic-messages-3K3DWVY6.js +0 -6
  234. package/dist/bundle/chunks/openai-codex-responses-TZWBTTYM.js +0 -10
  235. package/dist/modes/interactive/theme/theme-json.d.ts +0 -85
  236. package/dist/modes/interactive/theme/theme-json.d.ts.map +0 -1
  237. package/dist/modes/interactive/theme/theme-json.js +0 -132
  238. package/dist/modes/interactive/theme/theme-json.js.map +0 -1
  239. package/dist/modes/interactive/theme/theme-schema.json +0 -361
  240. package/examples/plugins/pi-example-plugin/README.md +0 -38
  241. package/examples/plugins/pi-example-plugin/package.json +0 -10
  242. package/examples/plugins/pi-example-plugin/src/contract.ts +0 -13
  243. package/examples/plugins/pi-example-plugin/src/session.ts +0 -24
  244. package/examples/plugins/pi-example-plugin/src/tui.ts +0 -31
@@ -0,0 +1,365 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://pi.dev/schemas/theme.schema.json",
4
+ "$comment": "This file is generated from TypeScript source. Do not edit it manually; run npm run generate:schemas.",
5
+ "type": "object",
6
+ "required": [
7
+ "name",
8
+ "colors"
9
+ ],
10
+ "properties": {
11
+ "$schema": {
12
+ "type": "string",
13
+ "description": "JSON schema reference"
14
+ },
15
+ "name": {
16
+ "type": "string",
17
+ "pattern": "^[^/]+$",
18
+ "description": "Theme name. Must not contain '/' because it is reserved for automatic light/dark theme settings."
19
+ },
20
+ "appearance": {
21
+ "anyOf": [
22
+ {
23
+ "type": "string",
24
+ "const": "dark"
25
+ },
26
+ {
27
+ "type": "string",
28
+ "const": "light"
29
+ }
30
+ ],
31
+ "description": "Background the theme is designed for. Detected from the theme colors when omitted."
32
+ },
33
+ "vars": {
34
+ "type": "object",
35
+ "patternProperties": {
36
+ "^.*$": {
37
+ "$ref": "#/$defs/ColorValue"
38
+ }
39
+ },
40
+ "description": "Reusable color variables"
41
+ },
42
+ "colors": {
43
+ "type": "object",
44
+ "required": [
45
+ "accent",
46
+ "border",
47
+ "borderAccent",
48
+ "borderMuted",
49
+ "success",
50
+ "error",
51
+ "warning",
52
+ "muted",
53
+ "dim",
54
+ "text",
55
+ "thinkingText",
56
+ "selectedBg",
57
+ "userMessageBg",
58
+ "userMessageText",
59
+ "customMessageBg",
60
+ "customMessageText",
61
+ "customMessageLabel",
62
+ "toolPendingBg",
63
+ "toolSuccessBg",
64
+ "toolErrorBg",
65
+ "toolTitle",
66
+ "toolOutput",
67
+ "mdHeading",
68
+ "mdLink",
69
+ "mdLinkUrl",
70
+ "mdCode",
71
+ "mdCodeBlock",
72
+ "mdCodeBlockBorder",
73
+ "mdQuote",
74
+ "mdQuoteBorder",
75
+ "mdHr",
76
+ "mdListBullet",
77
+ "toolDiffAdded",
78
+ "toolDiffRemoved",
79
+ "toolDiffContext",
80
+ "syntaxComment",
81
+ "syntaxKeyword",
82
+ "syntaxFunction",
83
+ "syntaxVariable",
84
+ "syntaxString",
85
+ "syntaxNumber",
86
+ "syntaxType",
87
+ "syntaxOperator",
88
+ "syntaxPunctuation",
89
+ "thinkingOff",
90
+ "thinkingMinimal",
91
+ "thinkingLow",
92
+ "thinkingMedium",
93
+ "thinkingHigh",
94
+ "thinkingXhigh",
95
+ "bashMode"
96
+ ],
97
+ "properties": {
98
+ "accent": {
99
+ "$ref": "#/$defs/ColorValue",
100
+ "description": "Primary accent color (logo, selected items, cursor)"
101
+ },
102
+ "border": {
103
+ "$ref": "#/$defs/ColorValue",
104
+ "description": "Normal borders"
105
+ },
106
+ "borderAccent": {
107
+ "$ref": "#/$defs/ColorValue",
108
+ "description": "Highlighted borders"
109
+ },
110
+ "borderMuted": {
111
+ "$ref": "#/$defs/ColorValue",
112
+ "description": "Subtle borders"
113
+ },
114
+ "success": {
115
+ "$ref": "#/$defs/ColorValue",
116
+ "description": "Success states"
117
+ },
118
+ "error": {
119
+ "$ref": "#/$defs/ColorValue",
120
+ "description": "Error states"
121
+ },
122
+ "warning": {
123
+ "$ref": "#/$defs/ColorValue",
124
+ "description": "Warning states"
125
+ },
126
+ "muted": {
127
+ "$ref": "#/$defs/ColorValue",
128
+ "description": "Secondary/dimmed text"
129
+ },
130
+ "dim": {
131
+ "$ref": "#/$defs/ColorValue",
132
+ "description": "Very dimmed text (more subtle than muted)"
133
+ },
134
+ "text": {
135
+ "$ref": "#/$defs/ColorValue",
136
+ "description": "Default text color (usually empty string)"
137
+ },
138
+ "thinkingText": {
139
+ "$ref": "#/$defs/ColorValue",
140
+ "description": "Thinking block text color"
141
+ },
142
+ "scrollbarTrack": {
143
+ "$ref": "#/$defs/ColorValue",
144
+ "description": "Fullscreen scrollbar track foreground (falls back to muted when omitted)"
145
+ },
146
+ "scrollbarThumb": {
147
+ "$ref": "#/$defs/ColorValue",
148
+ "description": "Fullscreen scrollbar thumb foreground (falls back to text when omitted)"
149
+ },
150
+ "selectedBg": {
151
+ "$ref": "#/$defs/ColorValue",
152
+ "description": "Selected item background"
153
+ },
154
+ "searchMatchBg": {
155
+ "$ref": "#/$defs/ColorValue",
156
+ "description": "Transcript search match background and current-match text (falls back to selectedBg when omitted)"
157
+ },
158
+ "searchMatchText": {
159
+ "$ref": "#/$defs/ColorValue",
160
+ "description": "Transcript search match text and current-match background (falls back to text when omitted)"
161
+ },
162
+ "userMessageBg": {
163
+ "$ref": "#/$defs/ColorValue",
164
+ "description": "User message background"
165
+ },
166
+ "userMessageText": {
167
+ "$ref": "#/$defs/ColorValue",
168
+ "description": "User message text color"
169
+ },
170
+ "customMessageBg": {
171
+ "$ref": "#/$defs/ColorValue",
172
+ "description": "Custom message background (hook-injected messages)"
173
+ },
174
+ "customMessageText": {
175
+ "$ref": "#/$defs/ColorValue",
176
+ "description": "Custom message text color"
177
+ },
178
+ "customMessageLabel": {
179
+ "$ref": "#/$defs/ColorValue",
180
+ "description": "Custom message type label color"
181
+ },
182
+ "toolPendingBg": {
183
+ "$ref": "#/$defs/ColorValue",
184
+ "description": "Tool execution box (pending state)"
185
+ },
186
+ "toolSuccessBg": {
187
+ "$ref": "#/$defs/ColorValue",
188
+ "description": "Tool execution box (success state)"
189
+ },
190
+ "toolErrorBg": {
191
+ "$ref": "#/$defs/ColorValue",
192
+ "description": "Tool execution box (error state)"
193
+ },
194
+ "toolTitle": {
195
+ "$ref": "#/$defs/ColorValue",
196
+ "description": "Tool execution box title color"
197
+ },
198
+ "toolOutput": {
199
+ "$ref": "#/$defs/ColorValue",
200
+ "description": "Tool execution box output text color"
201
+ },
202
+ "mdHeading": {
203
+ "$ref": "#/$defs/ColorValue",
204
+ "description": "Markdown heading text"
205
+ },
206
+ "mdLink": {
207
+ "$ref": "#/$defs/ColorValue",
208
+ "description": "Markdown link text"
209
+ },
210
+ "mdLinkUrl": {
211
+ "$ref": "#/$defs/ColorValue",
212
+ "description": "Markdown link URL"
213
+ },
214
+ "mdCode": {
215
+ "$ref": "#/$defs/ColorValue",
216
+ "description": "Markdown inline code"
217
+ },
218
+ "mdCodeBlock": {
219
+ "$ref": "#/$defs/ColorValue",
220
+ "description": "Markdown code block content"
221
+ },
222
+ "mdCodeBlockBorder": {
223
+ "$ref": "#/$defs/ColorValue",
224
+ "description": "Markdown code block fences"
225
+ },
226
+ "mdQuote": {
227
+ "$ref": "#/$defs/ColorValue",
228
+ "description": "Markdown blockquote text"
229
+ },
230
+ "mdQuoteBorder": {
231
+ "$ref": "#/$defs/ColorValue",
232
+ "description": "Markdown blockquote border"
233
+ },
234
+ "mdHr": {
235
+ "$ref": "#/$defs/ColorValue",
236
+ "description": "Markdown horizontal rule"
237
+ },
238
+ "mdListBullet": {
239
+ "$ref": "#/$defs/ColorValue",
240
+ "description": "Markdown list bullets/numbers"
241
+ },
242
+ "toolDiffAdded": {
243
+ "$ref": "#/$defs/ColorValue",
244
+ "description": "Added lines in tool diffs"
245
+ },
246
+ "toolDiffRemoved": {
247
+ "$ref": "#/$defs/ColorValue",
248
+ "description": "Removed lines in tool diffs"
249
+ },
250
+ "toolDiffContext": {
251
+ "$ref": "#/$defs/ColorValue",
252
+ "description": "Context lines in tool diffs"
253
+ },
254
+ "syntaxComment": {
255
+ "$ref": "#/$defs/ColorValue",
256
+ "description": "Syntax highlighting: comments"
257
+ },
258
+ "syntaxKeyword": {
259
+ "$ref": "#/$defs/ColorValue",
260
+ "description": "Syntax highlighting: keywords"
261
+ },
262
+ "syntaxFunction": {
263
+ "$ref": "#/$defs/ColorValue",
264
+ "description": "Syntax highlighting: function names"
265
+ },
266
+ "syntaxVariable": {
267
+ "$ref": "#/$defs/ColorValue",
268
+ "description": "Syntax highlighting: variable names"
269
+ },
270
+ "syntaxString": {
271
+ "$ref": "#/$defs/ColorValue",
272
+ "description": "Syntax highlighting: string literals"
273
+ },
274
+ "syntaxNumber": {
275
+ "$ref": "#/$defs/ColorValue",
276
+ "description": "Syntax highlighting: number literals"
277
+ },
278
+ "syntaxType": {
279
+ "$ref": "#/$defs/ColorValue",
280
+ "description": "Syntax highlighting: type names"
281
+ },
282
+ "syntaxOperator": {
283
+ "$ref": "#/$defs/ColorValue",
284
+ "description": "Syntax highlighting: operators"
285
+ },
286
+ "syntaxPunctuation": {
287
+ "$ref": "#/$defs/ColorValue",
288
+ "description": "Syntax highlighting: punctuation"
289
+ },
290
+ "thinkingOff": {
291
+ "$ref": "#/$defs/ColorValue",
292
+ "description": "Thinking level border: off"
293
+ },
294
+ "thinkingMinimal": {
295
+ "$ref": "#/$defs/ColorValue",
296
+ "description": "Thinking level border: minimal"
297
+ },
298
+ "thinkingLow": {
299
+ "$ref": "#/$defs/ColorValue",
300
+ "description": "Thinking level border: low"
301
+ },
302
+ "thinkingMedium": {
303
+ "$ref": "#/$defs/ColorValue",
304
+ "description": "Thinking level border: medium"
305
+ },
306
+ "thinkingHigh": {
307
+ "$ref": "#/$defs/ColorValue",
308
+ "description": "Thinking level border: high"
309
+ },
310
+ "thinkingXhigh": {
311
+ "$ref": "#/$defs/ColorValue",
312
+ "description": "Thinking level border: xhigh"
313
+ },
314
+ "thinkingMax": {
315
+ "$ref": "#/$defs/ColorValue",
316
+ "description": "Thinking level border: max (falls back to thinkingXhigh when omitted)"
317
+ },
318
+ "bashMode": {
319
+ "$ref": "#/$defs/ColorValue",
320
+ "description": "Editor border color in bash mode"
321
+ }
322
+ },
323
+ "description": "Theme color definitions (scrollbar, thinkingMax, and search highlight colors are optional and use compatible fallbacks)",
324
+ "additionalProperties": false
325
+ },
326
+ "export": {
327
+ "type": "object",
328
+ "properties": {
329
+ "pageBg": {
330
+ "$ref": "#/$defs/ColorValue",
331
+ "description": "Page background color"
332
+ },
333
+ "cardBg": {
334
+ "$ref": "#/$defs/ColorValue",
335
+ "description": "Card/container background color"
336
+ },
337
+ "infoBg": {
338
+ "$ref": "#/$defs/ColorValue",
339
+ "description": "Info sections background (system prompt, notices)"
340
+ }
341
+ },
342
+ "description": "Optional colors for HTML export (defaults derived from userMessageBg if not specified)",
343
+ "additionalProperties": false
344
+ }
345
+ },
346
+ "title": "Pi Coding Agent Theme",
347
+ "description": "Theme schema for Pi coding agent",
348
+ "additionalProperties": false,
349
+ "$defs": {
350
+ "ColorValue": {
351
+ "anyOf": [
352
+ {
353
+ "type": "string",
354
+ "description": "Hex color (#RGB or #RRGGBB), OKLCH or OKHSL color, variable reference, or empty string for terminal default"
355
+ },
356
+ {
357
+ "type": "integer",
358
+ "minimum": 0,
359
+ "maximum": 255,
360
+ "description": "256-color palette index (0-255)"
361
+ }
362
+ ]
363
+ }
364
+ }
365
+ }
@@ -1,6 +0,0 @@
1
- import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{ANTHROPIC_FEDERATION_RULE_ID_ENV,ANTHROPIC_IDENTITY_TOKEN_FILE_ENV,ANTHROPIC_ORGANIZATION_ID_ENV,ANTHROPIC_SERVICE_ACCOUNT_ID_ENV,ANTHROPIC_WORKSPACE_ID_ENV}from"./chunk-D3ZCGC4T.js";import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-37ATLPRE.js";import{Anthropic}from"./chunk-XDYM2567.js";import{retryProviderRequest}from"./chunk-5KJH3GGH.js";import{adjustMaxTokensForThinking,buildBaseOptions,clampMaxTokensToContext,getJsonSchemaToolParameters,getPiUserAgent,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-TEAAYBTS.js";import{sanitizeSurrogates}from"./chunk-UP6RLTHQ.js";import{headersToRecord}from"./chunk-GCKVOFWP.js";import{getProviderEnvValue}from"./chunk-5FDOJRDS.js";import{parseJsonWithRepair,parseStreamingJson}from"./chunk-5B3S5DVL.js";import"./chunk-KAC2YPTW.js";import{calculateCost,getCurrentTools,getInitialSystemMessage,getSystemMessageText,renderSystemMessageUpdate,resolveTranscript}from"./chunk-H35KWBT5.js";import{AssistantMessageEventStream,appendAssistantMessageDiagnostic}from"./chunk-6VYRLG5F.js";import"./chunk-4L3WN2XY.js";function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}function getCacheControl(model,cacheRetention,env){let retention=resolveCacheRetention(cacheRetention,env);if(retention==="none")return{retention};let ttl=retention==="long"&&getAnthropicCompat(model).supportsLongCacheRetention?"1h":void 0;return{retention,cacheControl:{type:"ephemeral",...ttl&&{ttl}}}}var claudeCodeVersion="2.1.280",claudeCodeTools=["Read","Write","Edit","Bash","Grep","Glob","AskUserQuestion","EnterPlanMode","ExitPlanMode","KillShell","NotebookEdit","Skill","Task","TaskOutput","TodoWrite","WebFetch","WebSearch"],ccToolLookup=new Map(claudeCodeTools.map(t=>[t.toLowerCase(),t])),toClaudeCodeName=name=>ccToolLookup.get(name.toLowerCase())??name,fromClaudeCodeName=(name,tools)=>{if(tools&&tools.length>0){let lowerName=name.toLowerCase(),matchedTool=tools.find(tool=>tool.name.toLowerCase()===lowerName);if(matchedTool)return matchedTool.name}return name};function convertContentBlocks(content){if(!content.some(c=>c.type==="image"))return sanitizeSurrogates(content.map(c=>c.text).join(`
3
- `));let blocks=content.map(block=>block.type==="text"?{type:"text",text:sanitizeSurrogates(block.text)}:{type:"image",source:{type:"base64",media_type:block.mimeType,data:block.data}});return blocks.some(b=>b.type==="text")||blocks.unshift({type:"text",text:"(see attached image)"}),blocks}var FINE_GRAINED_TOOL_STREAMING_BETA="fine-grained-tool-streaming-2025-05-14",INTERLEAVED_THINKING_BETA="interleaved-thinking-2025-05-14",SERVER_SIDE_FALLBACK_BETA="server-side-fallback-2026-07-01",MID_CONVERSATION_OUTPUT_CONFIG_BETA="mid-conversation-output-config-2026-07-01",THINKING_BINDING_CONTROLS_BETA="thinking-binding-controls-2026-08-01",INLINE_TOOLS_BETA="inline-tools-2026-09-15",DEFERRED_TOOL_PLACEHOLDER={name:"__pi_deferred_placeholder__",description:"Reserved placeholder. Never available. Never call this.",input_schema:{type:"object",properties:{},required:[]},defer_loading:!0};function shouldUseServerSideFallbackBeta(model){return(model.compat?.allowedFallbackModels?.length??0)>0}function getAnthropicCompat(model){let isOpenRouter=model.provider==="openrouter"||model.baseUrl.includes("openrouter.ai");return{supportsEagerToolInputStreaming:model.compat?.supportsEagerToolInputStreaming??!0,supportsLongCacheRetention:model.compat?.supportsLongCacheRetention??!0,sendSessionAffinityHeaders:model.compat?.sendSessionAffinityHeaders??isOpenRouter,sessionAffinityFormat:model.compat?.sessionAffinityFormat??(isOpenRouter?"openrouter":void 0),supportsCacheControlOnTools:model.compat?.supportsCacheControlOnTools??!0,supportsTemperature:model.compat?.supportsTemperature??!0,allowEmptySignature:model.compat?.allowEmptySignature??!1,supportsStrictTools:model.compat?.supportsStrictTools??!1,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,supportsMidConvoToolChanges:model.compat?.supportsMidConvoToolChanges??!1}}function mergeHeaders(...headerSources){let merged={};for(let headers of headerSources)headers&&Object.assign(merged,headers);return merged}function mergeClientHeaders(...headerSources){return mergeHeaders({"User-Agent":getPiUserAgent()},...headerSources)}function hasHeader(headers,name){if(!headers)return!1;let expected=name.toLowerCase();for(let[key,value]of Object.entries(headers))if(key.toLowerCase()===expected&&value!==null&&value.trim().length>0)return!0;return!1}function hasRequestAuth(apiKey,headers){return!!apiKey||hasHeader(headers,"authorization")||hasHeader(headers,"x-api-key")||hasHeader(headers,"cf-aig-authorization")}function assertRequestAuth(provider,apiKey,headers){if(!hasRequestAuth(apiKey,headers))throw new Error(`No API key for provider: ${provider}`)}var PiAnthropic=class extends Anthropic{_shouldResolveDefaultCredentials(){return!1}};function getAnthropicFederation(model,apiKey,headers,env){if(model.provider!=="anthropic"||hasRequestAuth(apiKey,headers))return;let federationRuleId=getProviderEnvValue(ANTHROPIC_FEDERATION_RULE_ID_ENV,env),organizationId=getProviderEnvValue(ANTHROPIC_ORGANIZATION_ID_ENV,env),identityTokenFile=getProviderEnvValue(ANTHROPIC_IDENTITY_TOKEN_FILE_ENV,env);if(!(!federationRuleId||!organizationId||!identityTokenFile))return{organization_id:organizationId,workspace_id:getProviderEnvValue(ANTHROPIC_WORKSPACE_ID_ENV,env),authentication:{type:"oidc_federation",federation_rule_id:federationRuleId,service_account_id:getProviderEnvValue(ANTHROPIC_SERVICE_ACCOUNT_ID_ENV,env),identity_token:{source:"file",path:identityTokenFile}}}}var federationClient,ANTHROPIC_MESSAGE_EVENTS=new Set(["message_start","message_delta","message_stop","content_block_start","content_block_delta","content_block_stop"]);function flushSseEvent(state){if(!state.event&&state.data.length===0)return null;let event={event:state.event,data:state.data.join(`
4
- `),raw:[...state.raw]};return state.event=null,state.data=[],state.raw=[],event}function decodeSseLine(line,state){if(line==="")return flushSseEvent(state);if(state.raw.push(line),line.startsWith(":"))return null;let delimiterIndex=line.indexOf(":"),fieldName=delimiterIndex===-1?line:line.slice(0,delimiterIndex),value=delimiterIndex===-1?"":line.slice(delimiterIndex+1);return value.startsWith(" ")&&(value=value.slice(1)),fieldName==="event"?state.event=value:fieldName==="data"&&state.data.push(value),null}function nextLineBreakIndex(text){let carriageReturnIndex=text.indexOf("\r"),newlineIndex=text.indexOf(`
5
- `);return carriageReturnIndex===-1?newlineIndex:newlineIndex===-1?carriageReturnIndex:Math.min(carriageReturnIndex,newlineIndex)}function consumeLine(text){let lineBreakIndex=nextLineBreakIndex(text);if(lineBreakIndex===-1)return null;let nextIndex=lineBreakIndex+1;return text[lineBreakIndex]==="\r"&&text[nextIndex]===`
6
- `&&(nextIndex+=1),{line:text.slice(0,lineBreakIndex),rest:text.slice(nextIndex)}}async function*iterateSseMessages(body,signal){let reader=body.getReader(),decoder=new TextDecoder,state={event:null,data:[],raw:[]},buffer="";try{for(;;){if(signal?.aborted)throw new Error("Request was aborted");let{value,done}=await reader.read();if(done)break;buffer+=decoder.decode(value,{stream:!0});let consumed2=consumeLine(buffer);for(;consumed2;){buffer=consumed2.rest;let event=decodeSseLine(consumed2.line,state);event&&(yield event),consumed2=consumeLine(buffer)}}buffer+=decoder.decode();let consumed=consumeLine(buffer);for(;consumed;){buffer=consumed.rest;let event=decodeSseLine(consumed.line,state);event&&(yield event),consumed=consumeLine(buffer)}if(buffer.length>0){let event=decodeSseLine(buffer,state);event&&(yield event)}let trailingEvent=flushSseEvent(state);trailingEvent&&(yield trailingEvent)}finally{reader.releaseLock()}}async function*iterateAnthropicEvents(response,signal){if(!response.body)throw new Error("Attempted to iterate over an Anthropic response with no body");let sawMessageStart=!1,sawMessageEnd=!1;for await(let sse of iterateSseMessages(response.body,signal)){if(sse.event==="error")throw new Error(sse.data);if(ANTHROPIC_MESSAGE_EVENTS.has(sse.event??""))try{let event=parseJsonWithRepair(sse.data);event.type==="message_start"?sawMessageStart=!0:event.type==="message_stop"&&(sawMessageEnd=!0),yield event}catch(error){let message=error instanceof Error?error.message:String(error);throw new Error(`Could not parse Anthropic SSE event ${sse.event}: ${message}; data=${sse.data}; raw=${sse.raw.join("\\n")}`)}}if(sawMessageStart&&!sawMessageEnd)throw new Error("Anthropic stream ended before message_stop")}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream,normalizedContext=resolveTranscript(context,getAnthropicCompat(model).supportsMidConvoSystemMessages),currentTools=getCurrentTools(normalizedContext.messages);return(async()=>{let providerThinkingLevel=model.compat?.supportsMidConvoEffort?options?.effort??"high":void 0,output={role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,...providerThinkingLevel===void 0?{}:{providerThinkingLevel},usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let client,isOAuth,usageModel=model,inputTransformations;if(options?.client)client=options.client,isOAuth=!1;else{let apiKey=options?.apiKey,federation=getAnthropicFederation(model,apiKey,options?.headers,options?.env);federation||assertRequestAuth(model.provider,apiKey,options?.headers);let copilotDynamicHeaders;if(model.provider==="github-copilot"){let hasImages=hasCopilotVisionInput(normalizedContext.messages);copilotDynamicHeaders=buildCopilotDynamicHeaders({messages:normalizedContext.messages,hasImages})}let cacheSessionId=resolveCacheRetention(options?.cacheRetention,options?.env)==="none"?void 0:options?.sessionId,created=createClient(model,apiKey,options?.headers,options?.fetch,copilotDynamicHeaders,cacheSessionId,federation);client=created.client,isOAuth=created.isOAuthToken}let params=buildParams(model,normalizedContext,isOAuth,options),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params={...nextParams,stream:!0});let requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},response=await retryProviderRequest(()=>client.beta.messages.create(params,requestOptions).asResponse(),{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),stream2.push({type:"start",partial:output});let blocks=output.content;for await(let event of iterateAnthropicEvents(response,options?.signal))if(await options?.onProviderStreamEvent?.(event,model),event.type==="message_start"){output.responseId=event.message.id;let transformations=event.message.input_transformations;Array.isArray(transformations)&&(inputTransformations=transformations);let responseModel=event.message.model;responseModel!==model.id&&(output.responseModel=responseModel);let fallbackCost=responseModel===model.id?void 0:model.compat?.allowedFallbackModels?.find(fallback=>fallback.provider===model.provider&&fallback.model===responseModel)?.cost;usageModel=fallbackCost?{...model,id:responseModel,cost:fallbackCost}:model,output.usage.input=event.message.usage.input_tokens||0,output.usage.output=event.message.usage.output_tokens||0,output.usage.cacheRead=event.message.usage.cache_read_input_tokens||0,output.usage.cacheWrite=event.message.usage.cache_creation_input_tokens||0,output.usage.cacheWrite1h=event.message.usage.cache_creation?.ephemeral_1h_input_tokens||0,output.usage.totalTokens=output.usage.input+output.usage.output+output.usage.cacheRead+output.usage.cacheWrite,calculateCost(usageModel,output.usage)}else if(event.type==="content_block_start"){if(event.content_block.type==="fallback"){if(output.content.length>0)throw new Error("Anthropic performed an unsupported mid-output model fallback");continue}if(event.content_block.type==="text"){let block={type:"text",text:event.content_block.text??"",index:event.index};output.content.push(block),stream2.push({type:"text_start",contentIndex:output.content.length-1,partial:output})}else if(event.content_block.type==="thinking"){let block={type:"thinking",thinking:event.content_block.thinking??"",thinkingSignature:event.content_block.signature??"",index:event.index};output.content.push(block),stream2.push({type:"thinking_start",contentIndex:output.content.length-1,partial:output})}else if(event.content_block.type==="redacted_thinking"){let block={type:"thinking",thinking:"[Reasoning redacted]",thinkingSignature:event.content_block.data,redacted:!0,index:event.index};output.content.push(block),stream2.push({type:"thinking_start",contentIndex:output.content.length-1,partial:output})}else if(event.content_block.type==="tool_use"){let block={type:"toolCall",id:event.content_block.id,name:isOAuth?fromClaudeCodeName(event.content_block.name,currentTools):event.content_block.name,arguments:event.content_block.input??{},partialJson:"",index:event.index};output.content.push(block),stream2.push({type:"toolcall_start",contentIndex:output.content.length-1,partial:output})}}else if(event.type==="content_block_delta"){if(event.delta.type==="text_delta"){let index=blocks.findIndex(b=>b.index===event.index),block=blocks[index];block&&block.type==="text"&&(block.text+=event.delta.text,stream2.push({type:"text_delta",contentIndex:index,delta:event.delta.text,partial:output}))}else if(event.delta.type==="thinking_delta"){let index=blocks.findIndex(b=>b.index===event.index),block=blocks[index];block&&block.type==="thinking"&&(block.thinking+=event.delta.thinking,stream2.push({type:"thinking_delta",contentIndex:index,delta:event.delta.thinking,partial:output}))}else if(event.delta.type==="input_json_delta"){let index=blocks.findIndex(b=>b.index===event.index),block=blocks[index];block&&block.type==="toolCall"&&(block.partialJson+=event.delta.partial_json,block.arguments=parseStreamingJson(block.partialJson),stream2.push({type:"toolcall_delta",contentIndex:index,delta:event.delta.partial_json,partial:output}))}else if(event.delta.type==="signature_delta"){let index=blocks.findIndex(b=>b.index===event.index),block=blocks[index];block&&block.type==="thinking"&&(block.thinkingSignature=block.thinkingSignature||"",block.thinkingSignature+=event.delta.signature)}}else if(event.type==="content_block_stop"){let index=blocks.findIndex(b=>b.index===event.index),block=blocks[index];block&&(delete block.index,block.type==="text"?stream2.push({type:"text_end",contentIndex:index,content:block.text,partial:output}):block.type==="thinking"?stream2.push({type:"thinking_end",contentIndex:index,content:block.thinking,partial:output}):block.type==="toolCall"&&(block.arguments=parseStreamingJson(block.partialJson),delete block.partialJson,stream2.push({type:"toolcall_end",contentIndex:index,toolCall:block,partial:output})))}else if(event.type==="message_delta"){let transformations=event.input_transformations;if(Array.isArray(transformations)&&(inputTransformations=transformations),event.delta.stop_reason){output.rawStopReason=event.delta.stop_reason;let stopReasonResult=mapStopReason(event.delta.stop_reason,event.delta.stop_details);output.stopReason=stopReasonResult.stopReason,stopReasonResult.errorMessage&&(output.errorMessage=stopReasonResult.errorMessage)}if(event.usage){event.usage.input_tokens!=null&&(output.usage.input=event.usage.input_tokens),event.usage.output_tokens!=null&&(output.usage.output=event.usage.output_tokens),event.usage.cache_read_input_tokens!=null&&(output.usage.cacheRead=event.usage.cache_read_input_tokens),event.usage.cache_creation_input_tokens!=null&&(output.usage.cacheWrite=event.usage.cache_creation_input_tokens);let cacheCreation=event.usage.cache_creation;cacheCreation?.ephemeral_1h_input_tokens!=null&&(output.usage.cacheWrite1h=cacheCreation.ephemeral_1h_input_tokens);let thinkingTokens=event.usage.output_tokens_details?.thinking_tokens;thinkingTokens!=null&&(output.usage.reasoning=thinkingTokens)}output.usage.totalTokens=output.usage.input+output.usage.output+output.usage.cacheRead+output.usage.cacheWrite,calculateCost(usageModel,output.usage)}if(options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="pending")throw new Error("Anthropic stream ended without a stop reason");if(output.stopReason==="aborted"||output.stopReason==="error")throw new Error(output.errorMessage||"An unknown error occurred");inputTransformations&&inputTransformations.length>0&&appendAssistantMessageDiagnostic(output,{type:"anthropic_input_transformations",timestamp:Date.now(),details:{transformations:inputTransformations.map(transformation=>({type:transformation.type??void 0,path:transformation.path??void 0,reason:transformation.reason??void 0}))}}),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)delete block.index,delete block.partialJson;output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=error instanceof Error?error.message:JSON.stringify(error),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2};function mapThinkingLevelToEffort(model,level){let mapped=level?model.thinkingLevelMap?.[level]:void 0;if(typeof mapped=="string")return mapped;switch(level){case"minimal":case"low":return"low";case"medium":return"medium";case"high":return"high";default:return"high"}}var streamSimple=(model,context,options)=>{getAnthropicFederation(model,options?.apiKey,options?.headers,options?.env)||assertRequestAuth(model.provider,options?.apiKey,options?.headers);let base={...buildBaseOptions(model,context,options,options?.apiKey),toolChoice:options?.toolChoice};if(!options?.reasoning)return stream(model,context,{...base,thinkingEnabled:!1});if(model.compat?.forceAdaptiveThinking===!0){let effort=mapThinkingLevelToEffort(model,options.reasoning);return stream(model,context,{...base,thinkingEnabled:!0,effort})}let adjusted=adjustMaxTokensForThinking(base.maxTokens,model.maxTokens,options.reasoning,options.thinkingBudgets),maxTokens=clampMaxTokensToContext(model,context,adjusted.maxTokens);return stream(model,context,{...base,maxTokens,thinkingEnabled:!0,thinkingBudgetTokens:Math.min(adjusted.thinkingBudget,Math.max(0,maxTokens-1024))})};function isOAuthToken(apiKey){return apiKey.includes("sk-ant-oat")}function createClient(model,apiKey,optionsHeaders,fetch,dynamicHeaders,sessionId,federation){if(model.provider==="github-copilot")return{client:new PiAnthropic({apiKey:null,authToken:apiKey??null,baseURL:model.baseUrl,dangerouslyAllowBrowser:!0,fetch,defaultHeaders:mergeClientHeaders({accept:"application/json","anthropic-dangerous-direct-browser-access":"true"},model.headers,dynamicHeaders,optionsHeaders)}),isOAuthToken:!1};if(apiKey&&isOAuthToken(apiKey))return{client:new PiAnthropic({apiKey:null,authToken:apiKey,baseURL:model.baseUrl,dangerouslyAllowBrowser:!0,fetch,defaultHeaders:mergeClientHeaders({accept:"application/json","anthropic-dangerous-direct-browser-access":"true","user-agent":`claude-cli/${claudeCodeVersion}`,"x-app":"cli"},model.headers,optionsHeaders)}),isOAuthToken:!0};let compat=getAnthropicCompat(model),sessionAffinityHeaders={};if(sessionId&&compat.sendSessionAffinityHeaders){let header=compat.sessionAffinityFormat==="openrouter"?"x-session-id":"x-session-affinity";sessionAffinityHeaders[header]=sessionId}let defaultHeaders=mergeClientHeaders({accept:"application/json","anthropic-dangerous-direct-browser-access":"true"},sessionAffinityHeaders,model.headers,optionsHeaders);if(federation){let key=JSON.stringify([model.baseUrl,federation]);if(federationClient?.key!==key||federationClient.fetch!==fetch){let client2=new PiAnthropic({apiKey:null,authToken:null,config:federation,baseURL:model.baseUrl,dangerouslyAllowBrowser:!0,fetch});federationClient={key,fetch,client:client2}}return{client:federationClient.client.withOptions({defaultHeaders}),isOAuthToken:!1}}return{client:new PiAnthropic({apiKey:apiKey??null,authToken:null,baseURL:model.baseUrl,dangerouslyAllowBrowser:!0,fetch,defaultHeaders}),isOAuthToken:!1}}function getBetaFeatures(model,context,isOAuthToken2,nativeToolChanges,options){let configuredFeatures;for(let headers of[model.headers,options?.headers])for(let[name,value]of Object.entries(headers??{}))name.toLowerCase()==="anthropic-beta"&&(configuredFeatures=value);if(configuredFeatures===null)return[];if(configuredFeatures!==void 0)return[...new Set(configuredFeatures.split(",").map(feature=>feature.trim()).filter(feature=>feature.length>0))];let features=[];return isOAuthToken2&&features.push("claude-code-20250219","oauth-2025-04-20"),shouldUseFineGrainedToolStreamingBeta(model,context)&&features.push(FINE_GRAINED_TOOL_STREAMING_BETA),model.reasoning&&options?.thinkingEnabled===!0&&(options.interleavedThinking??!0)&&model.compat?.forceAdaptiveThinking!==!0&&features.push(INTERLEAVED_THINKING_BETA),shouldUseServerSideFallbackBeta(model)&&features.push(SERVER_SIDE_FALLBACK_BETA),model.compat?.supportsMidConvoEffort===!0&&features.push(MID_CONVERSATION_OUTPUT_CONFIG_BETA,THINKING_BINDING_CONTROLS_BETA),nativeToolChanges&&features.push(INLINE_TOOLS_BETA),[...new Set(features)]}function buildParams(model,context,isOAuthToken2,options){let{cacheControl}=getCacheControl(model,options?.cacheRetention,options?.env),compat=getAnthropicCompat(model),initialSystemMessage=getInitialSystemMessage(context.messages),initialSystemText=initialSystemMessage?getSystemMessageText(initialSystemMessage):"",transformedMessages=transformMessages(context.messages,model,normalizeToolCallId),conversationMessages=initialSystemMessage?transformedMessages.slice(1):transformedMessages,initialTools=initialSystemMessage?.toolsAdded??[],nativeToolChanges=compat.supportsMidConvoSystemMessages&&compat.supportsMidConvoToolChanges&&initialTools.length>0,converted=convertMessages(conversationMessages,isOAuthToken2,cacheControl,compat.allowEmptySignature,model.compat?.supportsMidConvoEffort===!0?model.provider:void 0,nativeToolChanges?tools=>convertTools(tools,isOAuthToken2,compat.supportsEagerToolInputStreaming,compat.supportsStrictTools):void 0),activeEffort=options?.effort??"high",betaFeatures=getBetaFeatures(model,context,isOAuthToken2,nativeToolChanges,options),params={model:model.id,messages:model.compat?.supportsMidConvoEffort===!0?insertThinkingLevelMessages(converted,activeEffort):converted.messages,max_tokens:options?.maxTokens??model.maxTokens,stream:!0,...betaFeatures.length>0?{betas:betaFeatures}:{}};isOAuthToken2?(params.system=[{type:"text",text:"You are Claude Code, Anthropic's official CLI for Claude.",...cacheControl?{cache_control:cacheControl}:{}}],initialSystemText&&params.system.push({type:"text",text:sanitizeSurrogates(initialSystemText),...cacheControl?{cache_control:cacheControl}:{}})):initialSystemText&&(params.system=[{type:"text",text:sanitizeSurrogates(initialSystemText),...cacheControl?{cache_control:cacheControl}:{}}]),options?.temperature!==void 0&&!options?.thinkingEnabled&&model.compat?.supportsMidConvoEffort!==!0&&compat.supportsTemperature&&(params.temperature=options.temperature);let toolCacheControl=compat.supportsCacheControlOnTools?cacheControl:void 0;if(nativeToolChanges)params.tools=[...convertTools(initialTools,isOAuthToken2,compat.supportsEagerToolInputStreaming,compat.supportsStrictTools,toolCacheControl),DEFERRED_TOOL_PLACEHOLDER];else{let tools=getCurrentTools(context.messages);tools.length>0&&(params.tools=convertTools(tools,isOAuthToken2,compat.supportsEagerToolInputStreaming,compat.supportsStrictTools,toolCacheControl))}if(model.compat?.supportsMidConvoEffort===!0)params.thinking={type:"adaptive",display:options?.thinkingDisplay??"summarized",block_binding:{prefix_mismatch_behavior:"drop_block"}},params.output_config={effort:"high"};else if(model.reasoning)if(options?.thinkingEnabled){let display=options.thinkingDisplay??"summarized";model.compat?.forceAdaptiveThinking===!0?(params.thinking={type:"adaptive",display},options.effort&&(params.output_config={effort:options.effort})):params.thinking={type:"enabled",budget_tokens:options.thinkingBudgetTokens||1024,display}}else options?.thinkingEnabled===!1&&model.thinkingLevelMap?.off!==null&&(params.thinking={type:"disabled"});if(options?.metadata){let userId=options.metadata.user_id;typeof userId=="string"&&(params.metadata={user_id:userId})}options?.toolChoice&&(typeof options.toolChoice=="string"?params.tool_choice={type:options.toolChoice}:params.tool_choice=options.toolChoice);let allowedFallbackModels=model.compat?.allowedFallbackModels;return allowedFallbackModels&&allowedFallbackModels.length>0&&(params.fallbacks=allowedFallbackModels.map(fallback=>({model:fallback.model}))),params}function normalizeToolCallId(id){return id.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,64)}function convertToolResult(msg){return{type:"tool_result",tool_use_id:msg.toolCallId,content:convertContentBlocks(msg.content),is_error:msg.isError}}function convertMessages(transformedMessages,isOAuthToken2,cacheControl,allowEmptySignature=!1,managedProvider,convertToolDefinitions){let params=[],assistantLevels=new Map,pendingSystemMessages=[],flushPendingSystemMessages=()=>{params.push(...pendingSystemMessages),pendingSystemMessages.length=0};for(let i=0;i<transformedMessages.length;i++){let msg=transformedMessages[i];if(msg.role==="system"){let text=renderSystemMessageUpdate(msg),blocks=[];if(text.length>0&&blocks.push({type:"text",text:sanitizeSurrogates(text)}),convertToolDefinitions){let added=msg.toolsAdded??[],redefined=new Set(added.map(tool=>tool.name));for(let tool of msg.toolsRemoved??[])redefined.has(tool.name)||blocks.push({type:"tool_removal",tool:{type:"tool_reference",name:isOAuthToken2?toClaudeCodeName(tool.name):tool.name}});for(let definition of convertToolDefinitions(added))blocks.push({type:"tool_addition",tool:{type:"tool_definition",definition}})}blocks.length>0&&pendingSystemMessages.push({role:"system",content:blocks})}else if(msg.role==="user")if(typeof msg.content=="string")msg.content.trim().length>0&&params.push({role:"user",content:sanitizeSurrogates(msg.content)});else{let filteredBlocks=msg.content.map(item=>item.type==="text"?{type:"text",text:sanitizeSurrogates(item.text)}:{type:"image",source:{type:"base64",media_type:item.mimeType,data:item.data}}).filter(b=>b.type==="text"?b.text.trim().length>0:!0);if(filteredBlocks.length===0)continue;params.push({role:"user",content:filteredBlocks})}else if(msg.role==="assistant"){flushPendingSystemMessages();let blocks=[];for(let block of msg.content)if(block.type==="text"){if(block.text.trim().length===0)continue;blocks.push({type:"text",text:sanitizeSurrogates(block.text)})}else if(block.type==="thinking"){if(block.redacted){blocks.push({type:"redacted_thinking",data:block.thinkingSignature});continue}let thinkingSignature=block.thinkingSignature,hasThinkingSignature=!!thinkingSignature&&thinkingSignature.trim().length>0;if(block.thinking.trim().length===0&&!hasThinkingSignature)continue;hasThinkingSignature?blocks.push({type:"thinking",thinking:sanitizeSurrogates(block.thinking),signature:thinkingSignature}):blocks.push(allowEmptySignature?{type:"thinking",thinking:sanitizeSurrogates(block.thinking),signature:""}:{type:"text",text:sanitizeSurrogates(block.thinking)})}else block.type==="toolCall"&&blocks.push({type:"tool_use",id:block.id,name:isOAuthToken2?toClaudeCodeName(block.name):block.name,input:block.arguments??{}});if(blocks.length===0)continue;let messageIndex=params.length;params.push({role:"assistant",content:blocks}),managedProvider!==void 0&&msg.api==="anthropic-messages"&&msg.provider===managedProvider&&isAnthropicEffort(msg.providerThinkingLevel)&&assistantLevels.set(messageIndex,msg.providerThinkingLevel)}else if(msg.role==="toolResult"){let toolResults=[],j=i;for(;j<transformedMessages.length&&transformedMessages[j].role==="toolResult";)toolResults.push(convertToolResult(transformedMessages[j])),j++;i=j-1,params.push({role:"user",content:toolResults})}}if(flushPendingSystemMessages(),cacheControl&&params.length>0){let lastMessage=params[params.length-1];if(lastMessage.role==="user"||lastMessage.role==="system")if(Array.isArray(lastMessage.content)){let lastBlock=lastMessage.content[lastMessage.content.length-1];lastBlock&&(lastBlock.type==="text"||lastBlock.type==="image"||lastBlock.type==="tool_result"||lastBlock.type==="tool_addition"||lastBlock.type==="tool_removal")&&(lastBlock.cache_control=cacheControl)}else typeof lastMessage.content=="string"&&(lastMessage.content=[{type:"text",text:lastMessage.content,cache_control:cacheControl}])}return{messages:params,assistantLevels}}function isAnthropicEffort(value){return value==="low"||value==="medium"||value==="high"||value==="xhigh"||value==="max"}function insertThinkingLevelMessages(converted,activeEffort){let messages=[];for(let index=0;index<converted.messages.length;index++){let historicalEffort=converted.assistantLevels.get(index);historicalEffort!==void 0&&messages.push({role:"system",content:[],output_config:{effort:historicalEffort}}),messages.push(converted.messages[index])}return messages.push({role:"system",content:[],output_config:{effort:activeEffort}}),messages}function shouldUseFineGrainedToolStreamingBeta(model,context){return getCurrentTools(context.messages).length>0&&!getAnthropicCompat(model).supportsEagerToolInputStreaming}var ANTHROPIC_STRICT_UNSUPPORTED_KEYWORDS=new Set(["minimum","maximum","exclusiveMinimum","exclusiveMaximum","multipleOf","maxItems","uniqueItems","minContains","maxContains","minProperties","maxProperties"]),ANTHROPIC_STRICT_STRING_FORMATS=new Set(["date-time","time","date","duration","email","hostname","uri","ipv4","ipv6","uuid"]),isAnthropicStrictUnsupportedKeyword=(key,value)=>ANTHROPIC_STRICT_UNSUPPORTED_KEYWORDS.has(key)?!0:key==="minItems"?value!==0&&value!==1:key==="format"?typeof value!="string"||!ANTHROPIC_STRICT_STRING_FORMATS.has(value):!1;function convertTools(tools,isOAuthToken2,supportsEagerToolInputStreaming,supportsStrictTools,cacheControl){return tools?tools.map((tool,index)=>{let strict=resolveJsonSchemaStrictSampling(tool,supportsStrictTools,isAnthropicStrictUnsupportedKeyword),parameters=getJsonSchemaToolParameters(tool,strict),schema=parameters,legacyInputSchema={type:"object",properties:schema.properties??{},required:schema.required??[]},inputSchema=strict===!0?{...parameters,...legacyInputSchema}:legacyInputSchema;return{name:isOAuthToken2?toClaudeCodeName(tool.name):tool.name,description:tool.description,...supportsEagerToolInputStreaming?{eager_input_streaming:!0}:{},...strict===!0?{strict:!0}:{},input_schema:inputSchema,...cacheControl&&index===tools.length-1?{cache_control:cacheControl}:{}}}):[]}function mapStopReason(reason,stopDetails){switch(reason){case"end_turn":return{stopReason:"stop"};case"max_tokens":return{stopReason:"length"};case"tool_use":return{stopReason:"toolUse"};case"refusal":return{stopReason:"error",errorMessage:stopDetails?.explanation||"The model refused to complete the request"};case"pause_turn":return{stopReason:"stop"};case"stop_sequence":return{stopReason:"stop"};case"sensitive":return{stopReason:"error",errorMessage:"Provider stopped with: sensitive"};default:throw new Error(`Unhandled stop reason: ${reason}`)}}export{stream,streamSimple};
@@ -1,10 +0,0 @@
1
- import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{registerSessionResourceCleanup,uuidv7}from"./chunk-JEIV47WR.js";import{convertResponsesMessages,convertResponsesTools,processResponsesStream}from"./chunk-3MMB5I7J.js";import{clampOpenAIPromptCacheKey}from"./chunk-APKJ4JGA.js";import{formatProviderError,normalizeProviderError}from"./chunk-FEZ5RM2B.js";import"./chunk-WWBSZG5V.js";import{buildBaseOptions,createGrammarToolInputProperties,getPiUserAgent}from"./chunk-TEAAYBTS.js";import"./chunk-UP6RLTHQ.js";import{headersToRecord}from"./chunk-GCKVOFWP.js";import{getProviderEnvValue}from"./chunk-5FDOJRDS.js";import"./chunk-5B3S5DVL.js";import"./chunk-KAC2YPTW.js";import{clampThinkingLevel,getDeclaredTools,getInitialSystemMessage,getSystemMessageText,normalizeContext,resolveTranscript,resolveTranscriptTools}from"./chunk-H35KWBT5.js";import{AssistantMessageEventStream,appendAssistantMessageDiagnostic,createAssistantMessageDiagnostic,formatThrownValue}from"./chunk-6VYRLG5F.js";import"./chunk-4L3WN2XY.js";function combineAbortSignals(signals){let activeSignals=signals.filter(signal=>signal!==void 0);if(activeSignals.length===0)return{cleanup:()=>{}};if(activeSignals.length===1)return{signal:activeSignals[0],cleanup:()=>{}};let controller=new AbortController,listeners=[],abort=signal=>{controller.signal.aborted||controller.abort(signal.reason)};for(let signal of activeSignals){if(signal.aborted){abort(signal);break}let listener=()=>abort(signal);signal.addEventListener("abort",listener,{once:!0}),listeners.push({signal,listener})}return{signal:controller.signal,cleanup:()=>{for(let{signal,listener}of listeners)signal.removeEventListener("abort",listener)}}}var DEFAULT_PROXY_PORTS={ftp:21,gopher:70,http:80,https:443,ws:80,wss:443};function getProxyEnv(key,env){let lowercaseKey=key.toLowerCase(),uppercaseKey=key.toUpperCase();return env?.[lowercaseKey]||env?.[uppercaseKey]||getProviderEnvValue(lowercaseKey)||getProviderEnvValue(uppercaseKey)||""}function parseProxyTargetUrl(targetUrl){if(targetUrl instanceof URL)return targetUrl;try{return new URL(targetUrl)}catch{return}}function stripBrackets(host){return host.startsWith("[")&&host.endsWith("]")?host.slice(1,-1):host}function parseNoProxyEntry(entry){let trimmed=entry.trim().toLowerCase();if(!trimmed)return;if(trimmed.startsWith("[")){let closingBracket=trimmed.indexOf("]");if(closingBracket!==-1){let host=trimmed.slice(1,closingBracket),rest=trimmed.slice(closingBracket+1);if(rest.startsWith(":")){let port=Number.parseInt(rest.slice(1),10);return{host,port:Number.isNaN(port)?0:port}}return{host,port:0}}}if(trimmed.includes(":")&&trimmed.split(":").length>2)return{host:trimmed,port:0};let colonIndex=trimmed.lastIndexOf(":");if(colonIndex!==-1&&colonIndex===trimmed.indexOf(":")){let host=trimmed.slice(0,colonIndex),port=Number.parseInt(trimmed.slice(colonIndex+1),10);if(!Number.isNaN(port))return{host,port}}return{host:trimmed,port:0}}function shouldProxyHostname(hostname,port,env){let noProxy=getProxyEnv("no_proxy",env).toLowerCase();if(!noProxy)return!0;if(noProxy==="*")return!1;let normalizedTargetHost=stripBrackets(hostname.toLowerCase());return noProxy.split(/[,\s]/).every(entry=>{let parsed=parseNoProxyEntry(entry);if(!parsed||parsed.port&&parsed.port!==port)return!0;let domain=stripBrackets(parsed.host);return domain.startsWith("*.")?domain=domain.slice(2):(domain.startsWith(".")||domain.startsWith("*"))&&(domain=domain.slice(1)),domain?!(normalizedTargetHost===domain||normalizedTargetHost.endsWith(`.${domain}`)):!0})}function getProxyForUrl(targetUrl,env){let parsedUrl=parseProxyTargetUrl(targetUrl);if(!parsedUrl?.protocol||!parsedUrl.host)return"";let protocol=parsedUrl.protocol.split(":",1)[0],hostname=stripBrackets(parsedUrl.hostname||parsedUrl.host.replace(/:\d*$/,"")),port=Number.parseInt(parsedUrl.port,10)||DEFAULT_PROXY_PORTS[protocol]||0;if(!shouldProxyHostname(hostname,port,env))return"";let proxy=getProxyEnv(`${protocol}_proxy`,env)||getProxyEnv("all_proxy",env);return proxy&&!proxy.includes("://")&&(proxy=`${protocol}://${proxy}`),proxy}var UNSUPPORTED_PROXY_PROTOCOL_MESSAGE="Unsupported proxy protocol. SOCKS and PAC proxy URLs are not supported; use an HTTP or HTTPS proxy URL.";function resolveHttpProxyUrlForTarget(targetUrl,env){let proxy=getProxyForUrl(targetUrl,env);if(!proxy)return;let proxyUrl;try{proxyUrl=new URL(proxy)}catch(error){throw new Error(`Invalid proxy URL ${JSON.stringify(proxy)}: ${error instanceof Error?error.message:String(error)}`)}if(proxyUrl.protocol!=="http:"&&proxyUrl.protocol!=="https:")throw new Error(`${UNSUPPORTED_PROXY_PROTOCOL_MESSAGE} Got ${proxyUrl.protocol}`);return proxyUrl}var DEFAULT_CODEX_BASE_URL="https://chatgpt.com/backend-api",JWT_CLAIM_PATH="https://api.openai.com/auth",DEFAULT_MAX_RETRIES=0,BASE_DELAY_MS=1e3,DEFAULT_MAX_RETRY_DELAY_MS=6e4,DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS=15e3,REQUEST_COMPRESSION_ZSTD_LEVEL=3,CODEX_TOOL_CALL_PROVIDERS=new Set(["openai","openai-codex","opencode"]),WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE=1009,WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE="websocket_connection_limit_reached",PREVIOUS_RESPONSE_NOT_FOUND_CODE="previous_response_not_found",CODEX_RESPONSE_STATUSES=new Set(["completed","incomplete","failed","cancelled","queued","in_progress"]);function assertSuccessfulOutput(output){if(output.stopReason==="pending")throw new Error("Codex stream ended without a stop reason");if(output.stopReason==="error"||output.stopReason==="aborted")throw new Error(output.errorMessage||"An unknown error occurred")}function isTerminalRateLimitError(errorText){return/GoUsageLimitError|FreeUsageLimitError|Monthly usage limit reached|available balance|insufficient_quota|out of budget|quota exceeded|billing/i.test(errorText)}function isRetryableError(status,errorText){return status===429&&isTerminalRateLimitError(errorText)?!1:status===429||status===500||status===502||status===503||status===504?!0:/rate.?limit|overloaded|service.?unavailable|upstream.?connect|connection.?refused/i.test(errorText)}function getRetryAfterDelayMs(headers){let retryAfterMs=headers.get("retry-after-ms");if(retryAfterMs!==null){let millis=Number(retryAfterMs);if(Number.isFinite(millis))return Math.max(0,millis)}let retryAfter=headers.get("retry-after");if(!retryAfter)return;let seconds=Number(retryAfter);if(Number.isFinite(seconds))return Math.max(0,seconds*1e3);let date=Date.parse(retryAfter);if(!Number.isNaN(date))return Math.max(0,date-Date.now())}var RetryDelayExceededError=class extends Error{};function validateRetryDelayMs(delayMs,options){let maxRetryDelayMs=options?.maxRetryDelayMs??DEFAULT_MAX_RETRY_DELAY_MS;if(maxRetryDelayMs>0&&delayMs>maxRetryDelayMs)throw new RetryDelayExceededError(`Server requested ${Math.ceil(delayMs/1e3)}s retry delay (max: ${Math.ceil(maxRetryDelayMs/1e3)}s)`);return delayMs}function sleep(ms,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(new Error("Request was aborted"));return}let timeout=setTimeout(resolve,ms);signal?.addEventListener("abort",()=>{clearTimeout(timeout),reject(new Error("Request was aborted"))})})}function normalizeTimeoutMs(value){if(value!==void 0){if(!Number.isFinite(value)||value<0)throw new Error(`Invalid timeoutMs: ${String(value)}`);return Math.floor(value)}}function loadNodeZlib(){return typeof process>"u"||!(process.versions?.node||process.versions?.bun)?null:process.getBuiltinModule?.("node:zlib")??null}function compressRequestBodyZstd(bodyJson){let zlib=loadNodeZlib();if(!zlib||typeof zlib.zstdCompressSync!="function")return null;try{let compressed=zlib.zstdCompressSync(bodyJson,{params:{[zlib.constants.ZSTD_c_compressionLevel]:REQUEST_COMPRESSION_ZSTD_LEVEL}});return new Uint8Array(compressed.buffer,compressed.byteOffset,compressed.byteLength)}catch{return null}}var stream=(model,context,options)=>{let stream2=new AssistantMessageEventStream,normalizedContext=resolveTranscript(context,model.compat?.supportsMidConvoSystemMessages);return(async()=>{let output={role:"assistant",content:[],api:"openai-codex-responses",provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let accountId=extractAccountId(apiKey),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),model.compat?.supportsOpenAIGrammarTools??!1),cacheSessionId=options?.cacheRetention==="none"?void 0:options?.sessionId,codexSessionId=clampOpenAIPromptCacheKey(cacheSessionId),body=buildRequestBody(model,normalizedContext,options,codexSessionId,grammarToolInputProperties),nextBody=await options?.onPayload?.(body,model);nextBody!==void 0&&(body=nextBody);let websocketRequestId=codexSessionId||uuidv7(),sseHeaders=buildSSEHeaders(model.headers,options?.headers,accountId,apiKey,codexSessionId),websocketHeaders=buildWebSocketHeaders(model.headers,options?.headers,accountId,apiKey,websocketRequestId),bodyJson=JSON.stringify(body),httpTimeoutMs=normalizeTimeoutMs(options?.timeoutMs),websocketConnectTimeoutMs=normalizeTimeoutMs(options?.websocketConnectTimeoutMs),transport=options?.transport||"auto",startEmitted=!1,websocketDisabledForSession=transport!=="sse"&&isWebSocketSseFallbackActive(cacheSessionId);if(websocketDisabledForSession&&recordWebSocketSseFallback(cacheSessionId),transport!=="sse"&&!websocketDisabledForSession){let websocketStarted=!1,retriedWebSocketConnectionLimit=!1,retriedMissingWebSocketContinuation=!1;for(;;){websocketStarted=!1;try{if(await processWebSocketStream(resolveCodexWebSocketUrl(model.baseUrl),body,websocketHeaders,output,stream2,model,()=>{websocketStarted=!0,startEmitted||(startEmitted=!0,stream2.push({type:"start",partial:output}))},httpTimeoutMs,websocketConnectTimeoutMs,cacheSessionId,accountId,grammarToolInputProperties,options),options?.signal?.aborted)throw new Error("Request was aborted");assertSuccessfulOutput(output),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end();return}catch(error){let aborted=options?.signal?.aborted,connectionLimitBeforeStart=!websocketStarted&&isWebSocketConnectionLimitReachedError(error),previousResponseNotFound=isPreviousResponseNotFoundError(error);if(!aborted&&previousResponseNotFound&&!retriedMissingWebSocketContinuation){retriedMissingWebSocketContinuation=!0;continue}if(!aborted&&connectionLimitBeforeStart&&!retriedWebSocketConnectionLimit){retriedWebSocketConnectionLimit=!0;continue}if(aborted||isCodexNonTransportError(error)&&!connectionLimitBeforeStart||(appendAssistantMessageDiagnostic(output,createAssistantMessageDiagnostic("provider_transport_failure",error,{configuredTransport:transport,...websocketStarted?{}:{fallbackTransport:"sse"},eventsEmitted:websocketStarted,phase:websocketStarted?"after_message_stream_start":"before_message_stream_start",requestBytes:new TextEncoder().encode(bodyJson).byteLength})),recordWebSocketFailure(cacheSessionId,error),websocketStarted))throw error;recordWebSocketSseFallback(cacheSessionId);break}}}let compressedBody=compressRequestBodyZstd(bodyJson);compressedBody&&sseHeaders.set("content-encoding","zstd");let sseBody=compressedBody??bodyJson,response,lastError,maxRetries=options?.maxRetries??DEFAULT_MAX_RETRIES;for(let attempt=0;attempt<=maxRetries;attempt++){if(options?.signal?.aborted)throw new Error("Request was aborted");try{let headerTimeoutSignal=httpTimeoutMs!==void 0&&httpTimeoutMs>0?AbortSignal.timeout(httpTimeoutMs):void 0,combinedSignal=combineAbortSignals([options?.signal,headerTimeoutSignal]);try{response=await(options?.fetch??globalThis.fetch)(resolveCodexUrl(model.baseUrl),{method:"POST",headers:sseHeaders,body:sseBody,signal:combinedSignal.signal})}catch(error){throw headerTimeoutSignal?.aborted&&!options?.signal?.aborted?new Error(`Codex SSE response headers timed out after ${httpTimeoutMs}ms`):error}finally{combinedSignal.cleanup()}if(await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),response.ok)break;let errorText=await response.text();if(attempt<maxRetries&&isRetryableError(response.status,errorText)){let retryAfterDelayMs=getRetryAfterDelayMs(response.headers),delayMs=retryAfterDelayMs===void 0?BASE_DELAY_MS*2**attempt:validateRetryDelayMs(retryAfterDelayMs,options);await sleep(delayMs,options?.signal);continue}let fakeResponse=new Response(errorText,{status:response.status,statusText:response.statusText}),info=await parseErrorResponse(fakeResponse);throw new Error(info.friendlyMessage||info.message)}catch(error){if(error instanceof Error&&(error.name==="AbortError"||error.message==="Request was aborted"))throw new Error("Request was aborted");if(lastError=error instanceof Error?error:new Error(String(error)),attempt<maxRetries&&!(lastError instanceof RetryDelayExceededError)&&!lastError.message.includes("usage limit")){let delayMs=BASE_DELAY_MS*2**attempt;await sleep(delayMs,options?.signal);continue}throw lastError}}if(!response?.ok)throw lastError??new Error("Failed after retries");if(!response.body)throw new Error("No response body");if(startEmitted||(startEmitted=!0,stream2.push({type:"start",partial:output})),await processStream(response,output,stream2,model,grammarToolInputProperties,options),options?.signal?.aborted)throw new Error("Request was aborted");assertSuccessfulOutput(output),stream2.push({type:"done",reason:output.stopReason,message:output}),stream2.end()}catch(error){for(let block of output.content)delete block.partialJson,delete block.customInput;output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error)),stream2.push({type:"error",reason:output.stopReason,error:output}),stream2.end()}})(),stream2},streamSimple=(model,context,options)=>{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let base={...buildBaseOptions(model,context,options,apiKey),toolChoice:options?.toolChoice},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0;return stream(model,context,{...base,reasoningEffort:clampedReasoning==="off"?void 0:clampedReasoning})};function buildRequestBody(model,context,options,cacheSessionId,grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(context.messages),model.compat?.supportsOpenAIGrammarTools??!1)){let supportsStrictMode=model.compat?.supportsStrictMode??!0,supportsOpenAIGrammarTools=model.compat?.supportsOpenAIGrammarTools??!1,supportsAdditionalTools=model.compat?.supportsAdditionalTools??!1,supportsToolSearch=model.compat?.supportsToolSearch??!1,transcriptTools=resolveTranscriptTools(context.messages,supportsAdditionalTools||supportsToolSearch),messages=convertResponsesMessages(model,context,CODEX_TOOL_CALL_PROVIDERS,{includeSystemPrompt:!1,grammarToolInputProperties,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,supportsAdditionalTools,supportsToolSearch,toolOptions:{strict:null,supportsStrictMode,supportsOpenAIGrammarTools}}),initialSystemMessage=getInitialSystemMessage(context.messages),instructions=initialSystemMessage?getSystemMessageText(initialSystemMessage):"",body={model:model.id,store:!1,stream:!0,instructions:instructions||"You are a helpful assistant.",input:messages,text:{verbosity:options?.textVerbosity||"low"},include:["reasoning.encrypted_content"],prompt_cache_key:cacheSessionId,tool_choice:options?.toolChoice??"auto",parallel_tool_calls:!0};if(options?.temperature!==void 0&&(body.temperature=options.temperature),options?.serviceTier!==void 0&&(body.service_tier=options.serviceTier),transcriptTools.requestTools.length>0&&(body.tools=convertResponsesTools(transcriptTools.requestTools,{strict:null,supportsStrictMode,supportsOpenAIGrammarTools})),options?.reasoningEffort!==void 0){let effort=options.reasoningEffort==="none"?model.thinkingLevelMap?.off===void 0?"none":model.thinkingLevelMap.off:model.thinkingLevelMap?.[options.reasoningEffort]??options.reasoningEffort;effort!==null&&(body.reasoning={effort,summary:options.reasoningSummary??"auto"})}else model.reasoning&&model.thinkingLevelMap?.off!==null&&(body.reasoning={effort:model.thinkingLevelMap?.off??"none"});return body}function getServiceTierCostMultiplier(model,serviceTier){switch(serviceTier){case"flex":return .5;case"priority":return model.id==="gpt-5.5"?2.5:2;default:return 1}}function applyServiceTierPricing(usage,serviceTier,model){let multiplier=getServiceTierCostMultiplier(model,serviceTier);multiplier!==1&&(usage.cost.input*=multiplier,usage.cost.output*=multiplier,usage.cost.cacheRead*=multiplier,usage.cost.cacheWrite*=multiplier,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite)}function resolveCodexServiceTier(responseServiceTier,requestServiceTier){return responseServiceTier==="default"&&(requestServiceTier==="flex"||requestServiceTier==="priority")?requestServiceTier:responseServiceTier??requestServiceTier}function resolveCodexUrl(baseUrl){let normalized=(baseUrl&&baseUrl.trim().length>0?baseUrl:DEFAULT_CODEX_BASE_URL).replace(/\/+$/,"");return normalized.endsWith("/codex/responses")?normalized:normalized.endsWith("/codex")?`${normalized}/responses`:`${normalized}/codex/responses`}function resolveCodexWebSocketUrl(baseUrl){let url=new URL(resolveCodexUrl(baseUrl));return url.protocol==="https:"&&(url.protocol="wss:"),url.protocol==="http:"&&(url.protocol="ws:"),url.toString()}async function processStream(response,output,stream2,model,grammarToolInputProperties,options){await processResponsesStream(mapCodexEvents(parseSSE(response,options?.signal),output,model,options?.onProviderStreamEvent),output,stream2,model,{serviceTier:options?.serviceTier,grammarToolInputProperties,resolveServiceTier:resolveCodexServiceTier,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)})}var CodexApiError=class extends Error{code;payload;constructor(message,options){super(message),this.name="CodexApiError",this.code=options?.code,this.payload=options?.payload,this.cause=options?.cause}},CodexProtocolError=class extends Error{payload;constructor(message,options){super(message),this.name="CodexProtocolError",this.payload=options?.payload,this.cause=options?.cause}},ProviderStreamEventCallbackError=class extends Error{constructor(cause){super(formatThrownValue(cause)),this.name="ProviderStreamEventCallbackError",this.cause=cause}};function isCodexNonTransportError(error){return error instanceof CodexApiError||error instanceof CodexProtocolError||error instanceof ProviderStreamEventCallbackError}function isWebSocketConnectionLimitReachedError(error){return error instanceof CodexApiError&&error.code===WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE}function isPreviousResponseNotFoundError(error){return error instanceof CodexApiError&&error.code===PREVIOUS_RESPONSE_NOT_FOUND_CODE}function extractCodexEventError(event){let nested=event.error&&typeof event.error=="object"?event.error:void 0;return{code:typeof event.code=="string"?event.code:typeof nested?.code=="string"?nested.code:void 0,message:typeof event.message=="string"?event.message:typeof nested?.message=="string"?nested.message:void 0}}async function*mapCodexEvents(events,output,model,onProviderStreamEvent){for await(let event of events){try{await onProviderStreamEvent?.(event,model)}catch(error){throw new ProviderStreamEventCallbackError(error)}let type=typeof event.type=="string"?event.type:void 0;if(type){if(type==="error"){let{code,message}=extractCodexEventError(event);throw new CodexApiError(`Codex error: ${message||code||JSON.stringify(event)}`,{code,payload:event})}if(type==="response.failed"){let response=event.response,code=response?.error?.code,message=response?.error?.message;throw new CodexApiError(message||"Codex response failed",{code,payload:event})}if(type==="response.done"||type==="response.completed"||type==="response.incomplete"){let response=event.response;typeof response?.end_turn=="boolean"&&(output.endTurn=response.end_turn);let normalizedResponse=response&&{...response,status:normalizeCodexStatus(response.status)};yield{...event,type:"response.completed",response:normalizedResponse};return}yield event}}}function normalizeCodexStatus(status){if(typeof status=="string")return CODEX_RESPONSE_STATUSES.has(status)?status:void 0}async function*parseSSE(response,signal){if(!response.body)return;let reader=response.body.getReader(),decoder=new TextDecoder,buffer="",onAbort=()=>{reader.cancel().catch(()=>{})};signal?.addEventListener("abort",onAbort,{once:!0});try{for(;;){if(signal?.aborted)throw new Error("Request was aborted");let{done,value}=await reader.read();if(signal?.aborted)throw new Error("Request was aborted");buffer+=done?decoder.decode():decoder.decode(value,{stream:!0}),done&&buffer.trim()&&(buffer+=`
3
-
4
- `);let idx=buffer.indexOf(`
5
-
6
- `);for(;idx!==-1;){let chunk=buffer.slice(0,idx);buffer=buffer.slice(idx+2);let dataLines=chunk.split(`
7
- `).filter(l=>l.startsWith("data:")).map(l=>l.slice(5).trim());if(dataLines.length>0){let data=dataLines.join(`
8
- `).trim();if(data&&data!=="[DONE]")try{yield JSON.parse(data)}catch(cause){throw new CodexProtocolError(`Invalid Codex SSE JSON: ${formatThrownValue(cause)}`,{cause,payload:data})}}idx=buffer.indexOf(`
9
-
10
- `)}if(done)break}}finally{signal?.removeEventListener("abort",onAbort);try{await reader.cancel()}catch{}try{reader.releaseLock()}catch{}}}var OPENAI_BETA_RESPONSES_WEBSOCKETS="responses_websockets=2026-02-06",SESSION_WEBSOCKET_CACHE_TTL_MS=300*1e3,SESSION_WEBSOCKET_MAX_AGE_MS=3300*1e3,websocketSessionCache=new Map,websocketDebugStats=new Map,websocketSseFallbackSessions=new Set;function getOrCreateWebSocketDebugStats(sessionId){let stats=websocketDebugStats.get(sessionId);return stats||(stats={requests:0,connectionsCreated:0,connectionsReused:0,cachedContextRequests:0,storeTrueRequests:0,fullContextRequests:0,deltaRequests:0,lastInputItems:0,websocketFailures:0,sseFallbacks:0},websocketDebugStats.set(sessionId,stats)),stats}function getOpenAICodexWebSocketDebugStats(sessionId){let stats=websocketDebugStats.get(sessionId);return stats?{...stats}:void 0}function resetOpenAICodexWebSocketDebugStats(sessionId){if(sessionId){websocketDebugStats.delete(sessionId),websocketSseFallbackSessions.delete(sessionId);return}websocketDebugStats.clear(),websocketSseFallbackSessions.clear()}function closeOpenAICodexWebSocketSessions(sessionId){let closeEntry=entry=>{entry.idleTimer&&clearTimeout(entry.idleTimer),closeWebSocketSilently(entry.socket,1e3,"debug_close")};if(sessionId){for(let entry of websocketSessionCache.get(sessionId)?.values()??[])closeEntry(entry);websocketSessionCache.delete(sessionId);return}for(let accountEntries of websocketSessionCache.values())for(let entry of accountEntries.values())closeEntry(entry);websocketSessionCache.clear()}registerSessionResourceCleanup(closeOpenAICodexWebSocketSessions);function isWebSocketSseFallbackActive(sessionId){return sessionId?websocketSseFallbackSessions.has(sessionId):!1}function recordWebSocketSseFallback(sessionId){if(!sessionId)return;let stats=getOrCreateWebSocketDebugStats(sessionId);stats.sseFallbacks++,stats.websocketFallbackActive=isWebSocketSseFallbackActive(sessionId)}function recordWebSocketFailure(sessionId,error){if(!sessionId)return;websocketSseFallbackSessions.add(sessionId);let stats=getOrCreateWebSocketDebugStats(sessionId);stats.websocketFailures++,stats.lastWebSocketError=formatThrownValue(error),stats.websocketFallbackActive=!0}var _cachedWebsocket=null;async function getWebSocketConstructor(env){if(!env&&_cachedWebsocket)return _cachedWebsocket;if(typeof process<"u"&&process.versions?.bun){let WebSocketWithProxy=class extends WebSocket{constructor(url,options){let _opts={};Array.isArray(options)||typeof options=="string"?_opts={protocols:options}:_opts={...options};let proxyUrl=resolveHttpProxyUrlForTarget(url.toString().replace(/^wss:/,"https:").replace(/^ws:/,"http:"),env);super(url,{..._opts,...proxyUrl?{proxy:proxyUrl.toString()}:{}})}};return env||(_cachedWebsocket=WebSocketWithProxy),WebSocketWithProxy}let ctor=globalThis.WebSocket;return typeof ctor!="function"?null:ctor}var WebSocketCloseError=class extends Error{code;reason;wasClean;constructor(message,options){super(message),this.name="WebSocketCloseError",this.code=options?.code,this.reason=options?.reason,this.wasClean=options?.wasClean}};function getWebSocketReadyState(socket){let readyState=socket.readyState;return typeof readyState=="number"?readyState:void 0}function isWebSocketReusable(socket){let readyState=getWebSocketReadyState(socket);return readyState===void 0||readyState===1}function isWebSocketSessionExpired(entry){return Date.now()-entry.createdAt>=SESSION_WEBSOCKET_MAX_AGE_MS}function closeWebSocketSilently(socket,code=1e3,reason="done"){try{socket.close(code,reason)}catch{}}function scheduleSessionWebSocketExpiry(sessionId,accountId,entry){entry.idleTimer&&clearTimeout(entry.idleTimer),entry.idleTimer=setTimeout(()=>{if(entry.busy)return;closeWebSocketSilently(entry.socket,1e3,"idle_timeout");let accountEntries=websocketSessionCache.get(sessionId);accountEntries?.get(accountId)===entry&&accountEntries.delete(accountId),accountEntries?.size===0&&websocketSessionCache.delete(sessionId)},SESSION_WEBSOCKET_CACHE_TTL_MS)}async function connectWebSocket(url,headers,signal,connectTimeoutMs=DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS,env){let WebSocketCtor=await getWebSocketConstructor(env);if(!WebSocketCtor)throw new Error("WebSocket transport is not available in this runtime");let wsHeaders=headersToRecord(headers);return delete wsHeaders["OpenAI-Beta"],new Promise((resolve,reject)=>{let settled=!1,timeout,socket;try{socket=new WebSocketCtor(url,{headers:wsHeaders})}catch(error){reject(error instanceof Error?error:new Error(String(error)));return}let cleanup=()=>{timeout&&(clearTimeout(timeout),timeout=void 0),socket.removeEventListener("open",onOpen),socket.removeEventListener("error",onError),socket.removeEventListener("close",onClose),signal?.removeEventListener("abort",onAbort)},fail=(error,closeReason)=>{settled||(settled=!0,cleanup(),closeReason&&closeWebSocketSilently(socket,1e3,closeReason),reject(error))},onOpen=()=>{settled||(settled=!0,cleanup(),resolve(socket))},onError=event=>{fail(extractWebSocketError(event))},onClose=event=>{fail(extractWebSocketCloseError(event))},onAbort=()=>{fail(new Error("Request was aborted"),"aborted")};socket.addEventListener("open",onOpen),socket.addEventListener("error",onError),socket.addEventListener("close",onClose),signal?.addEventListener("abort",onAbort),connectTimeoutMs>0&&(timeout=setTimeout(()=>{fail(new Error(`WebSocket connect timeout after ${connectTimeoutMs}ms`),"connect_timeout")},connectTimeoutMs)),signal?.aborted&&onAbort()})}async function acquireWebSocket(url,headers,sessionId,accountId,signal,connectTimeoutMs,env){if(!sessionId){let socket2=await connectWebSocket(url,headers,signal,connectTimeoutMs,env);return{socket:socket2,reused:!1,release:()=>closeWebSocketSilently(socket2)}}let accountEntries=websocketSessionCache.get(sessionId),cached=accountEntries?.get(accountId);if(cached){if(cached.idleTimer&&(clearTimeout(cached.idleTimer),cached.idleTimer=void 0),!cached.busy&&isWebSocketSessionExpired(cached))closeWebSocketSilently(cached.socket,1e3,"connection_age_limit"),accountEntries?.delete(accountId),accountEntries?.size===0&&websocketSessionCache.delete(sessionId);else if(!cached.busy&&isWebSocketReusable(cached.socket))return cached.busy=!0,{socket:cached.socket,entry:cached,reused:!0,release:({keep}={})=>{if(!keep||!isWebSocketReusable(cached.socket)){closeWebSocketSilently(cached.socket);let currentEntries=websocketSessionCache.get(sessionId);currentEntries?.get(accountId)===cached&&currentEntries.delete(accountId),currentEntries?.size===0&&websocketSessionCache.delete(sessionId);return}cached.busy=!1,scheduleSessionWebSocketExpiry(sessionId,accountId,cached)}};if(cached.busy){let socket2=await connectWebSocket(url,headers,signal,connectTimeoutMs,env);return{socket:socket2,reused:!1,release:()=>{closeWebSocketSilently(socket2)}}}isWebSocketReusable(cached.socket)||(closeWebSocketSilently(cached.socket),accountEntries?.delete(accountId),accountEntries?.size===0&&websocketSessionCache.delete(sessionId))}let socket=await connectWebSocket(url,headers,signal,connectTimeoutMs,env),entry={socket,busy:!0,createdAt:Date.now()};return accountEntries=websocketSessionCache.get(sessionId),accountEntries||(accountEntries=new Map,websocketSessionCache.set(sessionId,accountEntries)),accountEntries.set(accountId,entry),{socket,entry,reused:!1,release:({keep}={})=>{if(!keep||!isWebSocketReusable(entry.socket)){closeWebSocketSilently(entry.socket),entry.idleTimer&&clearTimeout(entry.idleTimer);let currentEntries=websocketSessionCache.get(sessionId);currentEntries?.get(accountId)===entry&&currentEntries.delete(accountId),currentEntries?.size===0&&websocketSessionCache.delete(sessionId);return}entry.busy=!1,scheduleSessionWebSocketExpiry(sessionId,accountId,entry)}}}function extractWebSocketError(event){if(event&&typeof event=="object"){let message="message"in event?event.message:void 0;if(typeof message=="string"&&message.length>0)return new Error(message);let nestedError="error"in event?event.error:void 0;if(nestedError instanceof Error&&nestedError.message.length>0)return nestedError;if(nestedError&&typeof nestedError=="object"&&"message"in nestedError){let nestedMessage=nestedError.message;if(typeof nestedMessage=="string"&&nestedMessage.length>0)return new Error(nestedMessage)}}return new Error("WebSocket error")}function extractWebSocketCloseError(event){if(event&&typeof event=="object"){let code="code"in event?event.code:void 0,reason="reason"in event?event.reason:void 0,wasClean="wasClean"in event?event.wasClean:void 0,codeText=typeof code=="number"?` ${code}`:"",reasonText=typeof reason=="string"&&reason.length>0?` ${reason}`:"";return!reasonText&&code===WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE&&(reasonText=" message too big"),new WebSocketCloseError(`WebSocket closed${codeText}${reasonText}`.trim(),{code:typeof code=="number"?code:void 0,reason:typeof reason=="string"&&reason.length>0?reason:void 0,wasClean:typeof wasClean=="boolean"?wasClean:void 0})}return new Error("WebSocket closed")}async function decodeWebSocketData(data){if(typeof data=="string")return data;if(data instanceof ArrayBuffer)return new TextDecoder().decode(new Uint8Array(data));if(ArrayBuffer.isView(data)){let view=data;return new TextDecoder().decode(new Uint8Array(view.buffer,view.byteOffset,view.byteLength))}if(data&&typeof data=="object"&&"arrayBuffer"in data){let arrayBuffer=await data.arrayBuffer();return new TextDecoder().decode(new Uint8Array(arrayBuffer))}return null}async function*parseWebSocket(socket,signal,idleTimeoutMs){let queue=[],pending=null,done=!1,failed=null,sawCompletion=!1,wake=()=>{if(!pending)return;let resolve=pending;pending=null,resolve()},onMessage=event=>{(async()=>{let text=null;try{if(!event||typeof event!="object"||!("data"in event)||(text=await decodeWebSocketData(event.data),!text))return;let parsed=JSON.parse(text),type=typeof parsed.type=="string"?parsed.type:"";(type==="response.completed"||type==="response.done"||type==="response.incomplete")&&(sawCompletion=!0,done=!0),queue.push(parsed),wake()}catch(cause){failed=new CodexProtocolError(`Invalid Codex WebSocket JSON: ${formatThrownValue(cause)}`,{cause,payload:text}),done=!0,wake()}})()},onError=event=>{failed=extractWebSocketError(event),done=!0,wake()},onClose=event=>{if(sawCompletion){done=!0,wake();return}failed||(failed=extractWebSocketCloseError(event)),done=!0,wake()},onAbort=()=>{failed=new Error("Request was aborted"),done=!0,wake()};socket.addEventListener("message",onMessage),socket.addEventListener("error",onError),socket.addEventListener("close",onClose),signal?.addEventListener("abort",onAbort);try{for(;;){if(signal?.aborted)throw new Error("Request was aborted");if(queue.length>0){yield queue.shift();continue}if(done)break;let timeout;await new Promise((resolve,reject)=>{pending=resolve,idleTimeoutMs!==void 0&&idleTimeoutMs>0&&(timeout=setTimeout(()=>{let error=new Error(`WebSocket idle timeout after ${idleTimeoutMs}ms`);failed=error,done=!0,pending=null,closeWebSocketSilently(socket,1e3,"idle_timeout"),reject(error)},idleTimeoutMs))}).finally(()=>{timeout&&clearTimeout(timeout)})}if(failed)throw failed;if(!sawCompletion)throw new Error("WebSocket stream closed before response.completed")}finally{socket.removeEventListener("message",onMessage),socket.removeEventListener("error",onError),socket.removeEventListener("close",onClose),signal?.removeEventListener("abort",onAbort)}}function requestBodyWithoutInput(body){let{input:_input,previous_response_id:_previousResponseId,...rest}=body;return rest}function responseInputsEqual(a,b){return JSON.stringify(a??[])===JSON.stringify(b??[])}function requestBodiesMatchExceptInput(a,b){return JSON.stringify(requestBodyWithoutInput(a))===JSON.stringify(requestBodyWithoutInput(b))}function getCachedWebSocketInputDelta(body,continuation){if(!requestBodiesMatchExceptInput(body,continuation.lastRequestBody))return;let currentInput=body.input??[],baseline=[...continuation.lastRequestBody.input??[],...continuation.lastResponseItems];if(currentInput.length<baseline.length)return;let prefix=currentInput.slice(0,baseline.length);if(responseInputsEqual(prefix,baseline))return currentInput.slice(baseline.length)}function buildCachedWebSocketRequestBody(entry,body){let continuation=entry.continuation;if(!continuation)return body;let delta=getCachedWebSocketInputDelta(body,continuation);return!delta||!continuation.lastResponseId?(entry.continuation=void 0,body):{...body,previous_response_id:continuation.lastResponseId,input:delta}}async function*startWebSocketOutputOnFirstEvent(events,onStart){let started=!1;for await(let event of events)started||(started=!0,onStart()),yield event}async function processWebSocketStream(url,body,headers,output,stream2,model,onStart,idleTimeoutMs,websocketConnectTimeoutMs,cacheSessionId,accountId,grammarToolInputProperties,options){let{socket,entry,reused,release}=await acquireWebSocket(url,headers,cacheSessionId,accountId,options?.signal,websocketConnectTimeoutMs,options?.env),keepConnection=!0,useCachedContext=options?.transport==="websocket-cached"||options?.transport==="auto",fullBody=body,requestBody=useCachedContext&&entry?buildCachedWebSocketRequestBody(entry,fullBody):fullBody,stats=cacheSessionId?getOrCreateWebSocketDebugStats(cacheSessionId):void 0;stats&&(stats.requests++,reused?stats.connectionsReused++:stats.connectionsCreated++,useCachedContext&&stats.cachedContextRequests++,requestBody.store===!0&&stats.storeTrueRequests++,stats.lastInputItems=requestBody.input?.length??0,requestBody.previous_response_id?(stats.deltaRequests++,stats.lastDeltaInputItems=requestBody.input?.length??0,stats.lastPreviousResponseId=requestBody.previous_response_id):(stats.fullContextRequests++,stats.lastDeltaInputItems=void 0,stats.lastPreviousResponseId=void 0));try{if(socket.send(JSON.stringify({type:"response.create",...requestBody})),await processResponsesStream(startWebSocketOutputOnFirstEvent(mapCodexEvents(parseWebSocket(socket,options?.signal,idleTimeoutMs),output,model,options?.onProviderStreamEvent),onStart),output,stream2,model,{serviceTier:options?.serviceTier,grammarToolInputProperties,resolveServiceTier:resolveCodexServiceTier,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)}),options?.signal?.aborted)keepConnection=!1;else if(useCachedContext&&entry&&output.responseId){let responseItems=convertResponsesMessages(model,normalizeContext({messages:[output]}),CODEX_TOOL_CALL_PROVIDERS,{includeSystemPrompt:!1,grammarToolInputProperties}).filter(item=>item.type!=="function_call_output"&&item.type!=="custom_tool_call_output");entry.continuation={lastRequestBody:fullBody,lastResponseId:output.responseId,lastResponseItems:responseItems}}}catch(error){throw entry&&(entry.continuation=void 0),keepConnection=!1,error}finally{release({keep:keepConnection})}}async function parseErrorResponse(response){let raw=await response.text(),message=raw||response.statusText||"Request failed",friendlyMessage;try{let err=JSON.parse(raw)?.error;if(err){let code=err.code||err.type||"";if(/usage_limit_reached|usage_not_included|rate_limit_exceeded/i.test(code)||response.status===429){let plan=err.plan_type?` (${err.plan_type.toLowerCase()} plan)`:"",mins=err.resets_at?Math.max(0,Math.round((err.resets_at*1e3-Date.now())/6e4)):void 0,when=mins!==void 0?` Try again in ~${mins} min.`:"";friendlyMessage=`You have hit your ChatGPT usage limit${plan}.${when}`.trim()}message=err.message||friendlyMessage||message}}catch{}return{message,friendlyMessage}}function extractAccountId(token){try{let parts=token.split(".");if(parts.length!==3)throw new Error("Invalid token");let accountId=JSON.parse(atob(parts[1]))?.[JWT_CLAIM_PATH]?.chatgpt_account_id;if(!accountId)throw new Error("No account ID in token");return accountId}catch{throw new Error("Failed to extract accountId from token")}}function buildBaseCodexHeaders(initHeaders,additionalHeaders,accountId,token){let headers=new Headers({originator:"pi","User-Agent":getPiUserAgent()});for(let[key,value]of Object.entries(initHeaders||{}))headers.set(key,value);for(let[key,value]of Object.entries(additionalHeaders||{}))value===null?headers.delete(key):headers.set(key,value);return headers.set("Authorization",`Bearer ${token}`),headers.set("chatgpt-account-id",accountId),headers}function buildSSEHeaders(initHeaders,additionalHeaders,accountId,token,sessionId){let headers=buildBaseCodexHeaders(initHeaders,additionalHeaders,accountId,token);return headers.set("OpenAI-Beta","responses=experimental"),headers.set("accept","text/event-stream"),headers.set("content-type","application/json"),sessionId&&(headers.set("session-id",sessionId),headers.set("x-client-request-id",sessionId)),headers}function buildWebSocketHeaders(initHeaders,additionalHeaders,accountId,token,requestId){let headers=buildBaseCodexHeaders(initHeaders,additionalHeaders,accountId,token);return headers.delete("accept"),headers.delete("content-type"),headers.delete("OpenAI-Beta"),headers.delete("openai-beta"),headers.set("OpenAI-Beta",OPENAI_BETA_RESPONSES_WEBSOCKETS),headers.set("x-client-request-id",requestId),headers.set("session-id",requestId),headers}export{closeOpenAICodexWebSocketSessions,getOpenAICodexWebSocketDebugStats,resetOpenAICodexWebSocketDebugStats,stream,streamSimple};
@@ -1,85 +0,0 @@
1
- /**
2
- * Theme JSON validation, kept out of `theme.ts` on purpose.
3
- *
4
- * Validating user-authored theme files needs typebox, which costs ~17 MB of module graph to import.
5
- * Palette lookup does not, so a presentation that only uses built-in themes should never pay for it.
6
- * `interactive-mode.ts` installs this validator; anything that does not simply skips validation, as
7
- * built-in themes already do.
8
- */
9
- import { type Static, Type } from "typebox";
10
- declare const ColorValueSchema: Type.TUnion<[Type.TString, Type.TInteger]>;
11
- declare const ThemeJsonSchema: Type.TObject<{
12
- $schema: Type.TOptional<Type.TString>;
13
- name: Type.TString;
14
- appearance: Type.TOptional<Type.TUnion<[Type.TLiteral<"dark">, Type.TLiteral<"light">]>>;
15
- vars: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TString, Type.TInteger]>>>;
16
- colors: Type.TObject<{
17
- accent: Type.TUnion<[Type.TString, Type.TInteger]>;
18
- border: Type.TUnion<[Type.TString, Type.TInteger]>;
19
- borderAccent: Type.TUnion<[Type.TString, Type.TInteger]>;
20
- borderMuted: Type.TUnion<[Type.TString, Type.TInteger]>;
21
- success: Type.TUnion<[Type.TString, Type.TInteger]>;
22
- error: Type.TUnion<[Type.TString, Type.TInteger]>;
23
- warning: Type.TUnion<[Type.TString, Type.TInteger]>;
24
- muted: Type.TUnion<[Type.TString, Type.TInteger]>;
25
- dim: Type.TUnion<[Type.TString, Type.TInteger]>;
26
- text: Type.TUnion<[Type.TString, Type.TInteger]>;
27
- thinkingText: Type.TUnion<[Type.TString, Type.TInteger]>;
28
- scrollbarTrack: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
29
- scrollbarThumb: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
30
- selectedBg: Type.TUnion<[Type.TString, Type.TInteger]>;
31
- searchMatchBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
32
- searchMatchText: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
33
- userMessageBg: Type.TUnion<[Type.TString, Type.TInteger]>;
34
- userMessageText: Type.TUnion<[Type.TString, Type.TInteger]>;
35
- customMessageBg: Type.TUnion<[Type.TString, Type.TInteger]>;
36
- customMessageText: Type.TUnion<[Type.TString, Type.TInteger]>;
37
- customMessageLabel: Type.TUnion<[Type.TString, Type.TInteger]>;
38
- toolPendingBg: Type.TUnion<[Type.TString, Type.TInteger]>;
39
- toolSuccessBg: Type.TUnion<[Type.TString, Type.TInteger]>;
40
- toolErrorBg: Type.TUnion<[Type.TString, Type.TInteger]>;
41
- toolTitle: Type.TUnion<[Type.TString, Type.TInteger]>;
42
- toolOutput: Type.TUnion<[Type.TString, Type.TInteger]>;
43
- mdHeading: Type.TUnion<[Type.TString, Type.TInteger]>;
44
- mdLink: Type.TUnion<[Type.TString, Type.TInteger]>;
45
- mdLinkUrl: Type.TUnion<[Type.TString, Type.TInteger]>;
46
- mdCode: Type.TUnion<[Type.TString, Type.TInteger]>;
47
- mdCodeBlock: Type.TUnion<[Type.TString, Type.TInteger]>;
48
- mdCodeBlockBorder: Type.TUnion<[Type.TString, Type.TInteger]>;
49
- mdQuote: Type.TUnion<[Type.TString, Type.TInteger]>;
50
- mdQuoteBorder: Type.TUnion<[Type.TString, Type.TInteger]>;
51
- mdHr: Type.TUnion<[Type.TString, Type.TInteger]>;
52
- mdListBullet: Type.TUnion<[Type.TString, Type.TInteger]>;
53
- toolDiffAdded: Type.TUnion<[Type.TString, Type.TInteger]>;
54
- toolDiffRemoved: Type.TUnion<[Type.TString, Type.TInteger]>;
55
- toolDiffContext: Type.TUnion<[Type.TString, Type.TInteger]>;
56
- syntaxComment: Type.TUnion<[Type.TString, Type.TInteger]>;
57
- syntaxKeyword: Type.TUnion<[Type.TString, Type.TInteger]>;
58
- syntaxFunction: Type.TUnion<[Type.TString, Type.TInteger]>;
59
- syntaxVariable: Type.TUnion<[Type.TString, Type.TInteger]>;
60
- syntaxString: Type.TUnion<[Type.TString, Type.TInteger]>;
61
- syntaxNumber: Type.TUnion<[Type.TString, Type.TInteger]>;
62
- syntaxType: Type.TUnion<[Type.TString, Type.TInteger]>;
63
- syntaxOperator: Type.TUnion<[Type.TString, Type.TInteger]>;
64
- syntaxPunctuation: Type.TUnion<[Type.TString, Type.TInteger]>;
65
- thinkingOff: Type.TUnion<[Type.TString, Type.TInteger]>;
66
- thinkingMinimal: Type.TUnion<[Type.TString, Type.TInteger]>;
67
- thinkingLow: Type.TUnion<[Type.TString, Type.TInteger]>;
68
- thinkingMedium: Type.TUnion<[Type.TString, Type.TInteger]>;
69
- thinkingHigh: Type.TUnion<[Type.TString, Type.TInteger]>;
70
- thinkingXhigh: Type.TUnion<[Type.TString, Type.TInteger]>;
71
- thinkingMax: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
72
- bashMode: Type.TUnion<[Type.TString, Type.TInteger]>;
73
- }>;
74
- export: Type.TOptional<Type.TObject<{
75
- pageBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
76
- cardBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
77
- infoBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
78
- }>>;
79
- }>;
80
- export type ThemeColorValue = Static<typeof ColorValueSchema>;
81
- export type ValidatedThemeJson = Static<typeof ThemeJsonSchema>;
82
- /** Validate one theme document, throwing a message that names the offending tokens. */
83
- export declare function validateThemeJson(label: string, json: unknown): ValidatedThemeJson;
84
- export {};
85
- //# sourceMappingURL=theme-json.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-json.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-json.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,QAAA,MAAM,gBAAgB,4CAGpB,CAAC;AAEH,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+EnB,CAAC;AAIH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAEhE,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,kBAAkB,CA2ClF"}