@pencil-agent/nano-pencil 2.0.0-beta.8 → 2.0.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 (241) hide show
  1. package/README.md +267 -267
  2. package/dist/build-meta.json +3 -3
  3. package/dist/core/export-html/AGENT.md +11 -11
  4. package/dist/core/export-html/template.css +971 -971
  5. package/dist/core/export-html/template.html +54 -54
  6. package/dist/core/extensions-host/index.d.ts +1 -1
  7. package/dist/core/extensions-host/loader.js +1 -1
  8. package/dist/core/extensions-host/runner.d.ts +1 -0
  9. package/dist/core/extensions-host/runner.js +2 -2
  10. package/dist/core/extensions-host/types.d.ts +17 -22
  11. package/dist/core/lib/ai/src/types.d.ts +12 -2
  12. package/dist/core/persona/persona-manager.js +5 -2
  13. package/dist/core/runtime/agent-session.js +3 -3
  14. package/dist/core/runtime/extension-core-bindings.d.ts +1 -0
  15. package/dist/core/runtime/extension-core-bindings.js +2 -2
  16. package/dist/extensions/builtin/AGENT.md +115 -115
  17. package/dist/extensions/builtin/browser/AGENT.md +17 -17
  18. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
  19. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
  20. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
  21. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
  22. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
  23. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
  24. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
  25. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
  26. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
  27. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
  28. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
  29. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
  30. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
  31. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
  32. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
  33. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
  34. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
  35. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
  36. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
  37. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
  38. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
  39. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
  40. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
  41. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
  42. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
  43. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
  44. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
  45. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
  46. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
  47. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
  48. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
  49. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
  50. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
  51. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
  52. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
  53. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
  54. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
  55. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
  56. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
  57. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
  58. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
  59. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
  60. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
  61. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
  62. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
  63. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
  64. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
  65. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
  66. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
  67. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
  68. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
  69. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
  70. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
  71. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
  72. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
  73. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
  74. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
  75. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
  76. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
  77. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
  78. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
  79. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
  80. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
  81. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
  82. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
  83. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
  84. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
  85. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
  86. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
  87. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
  88. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
  89. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
  90. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
  91. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
  92. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
  93. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
  94. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
  95. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
  96. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
  97. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
  98. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
  99. package/dist/extensions/builtin/browser/browser.md +73 -73
  100. package/dist/extensions/builtin/browser/install.md +142 -142
  101. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
  102. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
  103. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
  104. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
  105. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
  106. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
  107. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
  108. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
  109. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
  110. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
  111. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
  112. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
  113. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
  114. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
  115. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
  116. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
  117. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
  118. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
  119. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
  120. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
  121. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
  122. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
  123. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
  124. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
  125. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
  126. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  127. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  128. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  129. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  130. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  131. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  132. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  133. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  134. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  135. package/dist/extensions/builtin/goal/README.md +67 -67
  136. package/dist/extensions/builtin/goal/goal-controller.d.ts +39 -10
  137. package/dist/extensions/builtin/goal/goal-controller.js +1 -1
  138. package/dist/extensions/builtin/goal/goal-format.js +1 -1
  139. package/dist/extensions/builtin/goal/goal-prompts.d.ts +2 -0
  140. package/dist/extensions/builtin/goal/goal-prompts.js +5 -4
  141. package/dist/extensions/builtin/goal/goal-store.js +1 -1
  142. package/dist/extensions/builtin/goal/index.d.ts +1 -1
  143. package/dist/extensions/builtin/goal/index.js +10 -7
  144. package/dist/extensions/builtin/grub/README.md +112 -112
  145. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  146. package/dist/extensions/builtin/link-world/index.js +6 -6
  147. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  148. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  149. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  150. package/dist/extensions/builtin/link-world/{network-routing.md → network-routing/network-routing.md} +67 -67
  151. package/dist/extensions/builtin/loop/README.md +92 -92
  152. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  153. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  154. package/dist/extensions/builtin/plan/index.js +1 -1
  155. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  156. package/dist/extensions/builtin/sal/README.md +72 -72
  157. package/dist/extensions/builtin/security-audit/README.md +289 -289
  158. package/dist/extensions/builtin/task/task-store.d.ts +4 -0
  159. package/dist/extensions/builtin/task/task-store.js +1 -1
  160. package/dist/extensions/builtin/team/AGENT.md +112 -112
  161. package/dist/extensions/builtin/team/TESTING.md +299 -299
  162. package/dist/extensions/builtin/token-save/README.md +56 -56
  163. package/dist/extensions/optional/AGENT.md +10 -10
  164. package/dist/index.d.ts +5 -30
  165. package/dist/index.js +1 -1
  166. package/dist/models.d.ts +7 -0
  167. package/dist/models.js +1 -0
  168. package/dist/modes/interactive/components/footer.js +1 -1
  169. package/dist/modes/interactive/components/task-status-panel.d.ts +36 -0
  170. package/dist/modes/interactive/components/task-status-panel.js +1 -0
  171. package/dist/modes/interactive/controllers/stream-render-controller.d.ts +7 -0
  172. package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
  173. package/dist/modes/interactive/interactive-mode.js +40 -40
  174. package/dist/modes/interactive/state/interactive-state.d.ts +2 -0
  175. package/dist/modes/interactive/state/interactive-state.js +1 -1
  176. package/dist/modes/interactive/theme/dark.json +85 -85
  177. package/dist/modes/interactive/theme/light.json +84 -84
  178. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  179. package/dist/modes/interactive/theme/warm.json +81 -81
  180. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  181. package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
  182. package/dist/node_modules/@pencil-agent/ai/dist/providers/anthropic.js +2 -2
  183. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-completions.js +5 -5
  184. package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-responses.js +1 -1
  185. package/dist/node_modules/@pencil-agent/ai/dist/stream.js +1 -1
  186. package/dist/packages/protocol/src/commands.d.ts +33 -0
  187. package/dist/packages/protocol/src/flags.d.ts +20 -0
  188. package/dist/packages/protocol/src/hooks.d.ts +17 -0
  189. package/dist/packages/protocol/src/hooks.js +0 -0
  190. package/dist/packages/{extension-sdk → protocol}/src/index.d.ts +7 -4
  191. package/dist/packages/protocol/src/index.js +1 -0
  192. package/dist/packages/{extension-sdk → protocol}/src/lifecycle.d.ts +15 -27
  193. package/dist/packages/protocol/src/lifecycle.js +0 -0
  194. package/dist/packages/{extension-sdk → protocol}/src/tools.d.ts +1 -1
  195. package/dist/packages/protocol/src/tools.js +0 -0
  196. package/dist/public-config.d.ts +12 -0
  197. package/dist/public-config.js +1 -0
  198. package/dist/runtime.d.ts +9 -0
  199. package/dist/runtime.js +1 -0
  200. package/dist/session-compaction.d.ts +7 -0
  201. package/dist/session-compaction.js +1 -0
  202. package/dist/session.d.ts +7 -0
  203. package/dist/session.js +1 -0
  204. package/dist/skills.d.ts +7 -0
  205. package/dist/skills.js +1 -0
  206. package/dist/tools.d.ts +7 -0
  207. package/dist/tools.js +1 -0
  208. package/docs/ACP/345/215/217/350/256/256/351/233/206/346/210/220/345/274/200/345/217/221/346/226/207/346/241/243.md +851 -0
  209. package/docs/SDK-TESTING.md +364 -0
  210. package/docs/codex-goal-command-impl.md +1055 -1055
  211. package/docs/codex-goal-vs-grub.md +500 -500
  212. package/docs/custom-provider.md +27 -27
  213. package/docs/extensions.md +27 -27
  214. package/docs/keybindings.md +27 -27
  215. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  216. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  217. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  218. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/256/236/347/216/260/346/212/245/345/221/212.md" +158 -158
  219. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/257/271/346/257/224/345/210/206/346/236/220.md" +128 -128
  220. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  221. package/docs/loop-usage-examples.md +214 -214
  222. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
  223. package/docs/models.md +27 -27
  224. package/docs/packages.md +27 -27
  225. package/docs/pi-design-philosophy.md +457 -457
  226. package/docs/planmode.md +1987 -1987
  227. package/docs/prompt-templates.md +27 -27
  228. package/docs/providers.md +27 -27
  229. package/docs/sdk.md +27 -27
  230. package/docs/skills.md +27 -27
  231. package/docs/startup-performance-optimization.md +301 -0
  232. package/docs/themes.md +27 -27
  233. package/docs/tui.md +27 -27
  234. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
  235. package/package.json +190 -162
  236. package/dist/packages/extension-sdk/src/index.js +0 -1
  237. package/docs/cc-agent-design.md +0 -1297
  238. package/docs/cc-tui-design.md +0 -1333
  239. package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
  240. /package/dist/packages/{extension-sdk/src/lifecycle.js → protocol/src/commands.js} +0 -0
  241. /package/dist/packages/{extension-sdk/src/tools.js → protocol/src/flags.js} +0 -0
@@ -1,2 +1,2 @@
1
- var E=Object.defineProperty;var h=(t,o)=>E(t,"name",{value:o,configurable:!0});import m from"@anthropic-ai/sdk";import{getEnvApiKey as C}from"../env-api-keys.js";import{calculateCost as T}from"../models.js";import{AssistantMessageEventStream as I}from"../utils/event-stream.js";import{parseStreamingJson as w}from"../utils/json-parse.js";import{sanitizeSurrogates as y}from"../utils/sanitize-unicode.js";import{buildCopilotDynamicHeaders as A,hasCopilotVisionInput as S}from"./github-copilot-headers.js";import{adjustMaxTokensForThinking as j,buildBaseOptions as B}from"./simple-options.js";import{transformMessages as N}from"./transform-messages.js";function L(t){return t||(typeof process<"u"&&process.env.NANOPENCIL_CACHE_RETENTION==="long"?"long":"short")}h(L,"resolveCacheRetention");function M(t,o){const s=L(o);if(s==="none")return{retention:s};const n=s==="long"&&t.includes("api.anthropic.com")?"1h":void 0;return{retention:s,cacheControl:{type:"ephemeral",...n&&{ttl:n}}}}h(M,"getCacheControl");const P="2.1.62",U=["Read","Write","Edit","Bash","Grep","Glob","AskUserQuestion","EnterPlanMode","ExitPlanMode","KillShell","NotebookEdit","Skill","Task","TaskOutput","TodoWrite","WebFetch","WebSearch"],W=new Map(U.map(t=>[t.toLowerCase(),t])),R=h(t=>W.get(t.toLowerCase())??t,"toClaudeCodeName"),O=h((t,o)=>{if(o&&o.length>0){const s=t.toLowerCase(),n=o.find(e=>e.name.toLowerCase()===s);if(n)return n.name}return t},"fromClaudeCodeName");function v(t){if(!t.some(e=>e.type!=="text"))return y(t.map(e=>e.text).join(`
2
- `));const s=t.map(e=>e.type==="text"?{type:"text",text:y(e.text)}:e.type==="document"?{type:"document",source:{type:"base64",media_type:"application/pdf",data:e.source.data}}:{type:"image",source:{type:"base64",media_type:e.mimeType,data:e.data}});return s.some(e=>e.type==="text")||s.unshift({type:"text",text:"(see attached document)"}),s}h(v,"convertContentBlocks");function _(...t){const o={};for(const s of t)s&&Object.assign(o,s);return o}h(_,"mergeHeaders");const x=h((t,o,s)=>{const n=new I;return(async()=>{const e={role:"assistant",content:[],api:t.api,provider:t.provider,model:t.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const r=s?.apiKey??C(t.provider)??"";let u;if(t.provider==="github-copilot"){const a=S(o.messages);u=A({messages:o.messages,hasImages:a})}const{client:p,isOAuthToken:d}=K(t,r,s?.interleavedThinking??!0,s?.headers,u),i=q(t,o,d,s);s?.onPayload?.(i);const g=p.messages.stream({...i,stream:!0},{signal:s?.signal});n.push({type:"start",partial:e});const f=e.content;for await(const a of g)if(a.type==="message_start")e.usage.input=a.message.usage.input_tokens||0,e.usage.output=a.message.usage.output_tokens||0,e.usage.cacheRead=a.message.usage.cache_read_input_tokens||0,e.usage.cacheWrite=a.message.usage.cache_creation_input_tokens||0,e.usage.totalTokens=e.usage.input+e.usage.output+e.usage.cacheRead+e.usage.cacheWrite,T(t,e.usage);else if(a.type==="content_block_start"){if(a.content_block.type==="text"){const l={type:"text",text:"",index:a.index};e.content.push(l),n.push({type:"text_start",contentIndex:e.content.length-1,partial:e})}else if(a.content_block.type==="thinking"){const l={type:"thinking",thinking:"",thinkingSignature:"",index:a.index};e.content.push(l),n.push({type:"thinking_start",contentIndex:e.content.length-1,partial:e})}else if(a.content_block.type==="redacted_thinking"){const l={type:"thinking",thinking:"[Reasoning redacted]",thinkingSignature:a.content_block.data,redacted:!0,index:a.index};e.content.push(l),n.push({type:"thinking_start",contentIndex:e.content.length-1,partial:e})}else if(a.content_block.type==="tool_use"){const l={type:"toolCall",id:a.content_block.id,name:d?O(a.content_block.name,o.tools):a.content_block.name,arguments:a.content_block.input??{},partialJson:"",index:a.index};e.content.push(l),n.push({type:"toolcall_start",contentIndex:e.content.length-1,partial:e})}}else if(a.type==="content_block_delta"){if(a.delta.type==="text_delta"){const l=f.findIndex(k=>k.index===a.index),c=f[l];c&&c.type==="text"&&(c.text+=a.delta.text,n.push({type:"text_delta",contentIndex:l,delta:a.delta.text,partial:e}))}else if(a.delta.type==="thinking_delta"){const l=f.findIndex(k=>k.index===a.index),c=f[l];c&&c.type==="thinking"&&(c.thinking+=a.delta.thinking,n.push({type:"thinking_delta",contentIndex:l,delta:a.delta.thinking,partial:e}))}else if(a.delta.type==="input_json_delta"){const l=f.findIndex(k=>k.index===a.index),c=f[l];c&&c.type==="toolCall"&&(c.partialJson+=a.delta.partial_json,c.arguments=w(c.partialJson),n.push({type:"toolcall_delta",contentIndex:l,delta:a.delta.partial_json,partial:e}))}else if(a.delta.type==="signature_delta"){const l=f.findIndex(k=>k.index===a.index),c=f[l];c&&c.type==="thinking"&&(c.thinkingSignature=c.thinkingSignature||"",c.thinkingSignature+=a.delta.signature)}}else if(a.type==="content_block_stop"){const l=f.findIndex(k=>k.index===a.index),c=f[l];c&&(delete c.index,c.type==="text"?n.push({type:"text_end",contentIndex:l,content:c.text,partial:e}):c.type==="thinking"?n.push({type:"thinking_end",contentIndex:l,content:c.thinking,partial:e}):c.type==="toolCall"&&(c.arguments=w(c.partialJson),delete c.partialJson,n.push({type:"toolcall_end",contentIndex:l,toolCall:c,partial:e})))}else a.type==="message_delta"&&(a.delta.stop_reason&&(e.stopReason=D(a.delta.stop_reason)),a.usage.input_tokens!=null&&(e.usage.input=a.usage.input_tokens),a.usage.output_tokens!=null&&(e.usage.output=a.usage.output_tokens),a.usage.cache_read_input_tokens!=null&&(e.usage.cacheRead=a.usage.cache_read_input_tokens),a.usage.cache_creation_input_tokens!=null&&(e.usage.cacheWrite=a.usage.cache_creation_input_tokens),e.usage.totalTokens=e.usage.input+e.usage.output+e.usage.cacheRead+e.usage.cacheWrite,T(t,e.usage));if(s?.signal?.aborted)throw new Error("Request was aborted");if(e.stopReason==="aborted"||e.stopReason==="error")throw new Error("An unknown error occurred");n.push({type:"done",reason:e.stopReason,message:e}),n.end()}catch(r){for(const u of e.content)delete u.index;e.stopReason=s?.signal?.aborted?"aborted":"error",e.errorMessage=r instanceof Error?r.message:JSON.stringify(r),n.push({type:"error",reason:e.stopReason,error:e}),n.end()}})(),n},"streamAnthropic");function b(t){return t.includes("opus-4-6")||t.includes("opus-4.6")||t.includes("sonnet-4-6")||t.includes("sonnet-4.6")}h(b,"supportsAdaptiveThinking");function J(t,o){switch(t){case"minimal":return"low";case"low":return"low";case"medium":return"medium";case"high":return"high";case"xhigh":return o.includes("opus-4-6")||o.includes("opus-4.6")?"max":"high";default:return"high"}}h(J,"mapThinkingLevelToEffort");const se=h((t,o,s)=>{const n=s?.apiKey||C(t.provider);if(!n)throw new Error(`No API key for provider: ${t.provider}`);const e=B(t,s,n),r=s?.toolChoice;if(!s?.reasoning)return x(t,o,{...e,toolChoice:r,thinkingEnabled:!1});if(b(t.id)){const p=J(s.reasoning,t.id);return x(t,o,{...e,toolChoice:r,thinkingEnabled:!0,effort:p})}const u=j(e.maxTokens||0,t.maxTokens,s.reasoning,s.thinkingBudgets);return x(t,o,{...e,toolChoice:r,maxTokens:u.maxTokens,thinkingEnabled:!0,thinkingBudgetTokens:u.thinkingBudget})},"streamSimpleAnthropic");function H(t){return t.includes("sk-ant-oat")}h(H,"isOAuthToken");function K(t,o,s,n,e){const r=s&&!b(t.id);if(t.provider==="github-copilot"){const d=[];return r&&d.push("interleaved-thinking-2025-05-14"),{client:new m({apiKey:null,authToken:o,baseURL:t.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:_({accept:"application/json","anthropic-dangerous-direct-browser-access":"true",...d.length>0?{"anthropic-beta":d.join(",")}:{}},t.headers,e,n)}),isOAuthToken:!1}}const u=["fine-grained-tool-streaming-2025-05-14"];return r&&u.push("interleaved-thinking-2025-05-14"),H(o)?{client:new m({apiKey:null,authToken:o,baseURL:t.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:_({accept:"application/json","anthropic-dangerous-direct-browser-access":"true","anthropic-beta":`claude-code-20250219,oauth-2025-04-20,${u.join(",")}`,"user-agent":`claude-cli/${P}`,"x-app":"cli"},t.headers,n)}),isOAuthToken:!0}:{client:new m({apiKey:o,baseURL:t.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:_({accept:"application/json","anthropic-dangerous-direct-browser-access":"true","anthropic-beta":u.join(",")},t.headers,n)}),isOAuthToken:!1}}h(K,"createClient");function q(t,o,s,n){const{cacheControl:e}=M(t.baseUrl,n?.cacheRetention),r={model:t.id,messages:$(o.messages,t,s,e),max_tokens:n?.maxTokens||t.maxTokens/3|0,stream:!0};if(s?(r.system=[{type:"text",text:"You are Claude Code, Anthropic's official CLI for Claude.",...e?{cache_control:e}:{}}],o.systemPrompt&&r.system.push({type:"text",text:y(o.systemPrompt),...e?{cache_control:e}:{}})):o.systemPrompt&&(r.system=[{type:"text",text:y(o.systemPrompt),...e?{cache_control:e}:{}}]),n?.temperature!==void 0&&!n?.thinkingEnabled&&(r.temperature=n.temperature),o.tools&&(r.tools=z(o.tools,s)),n?.thinkingEnabled&&t.reasoning&&(b(t.id)?(r.thinking={type:"adaptive"},n.effort&&(r.output_config={effort:n.effort})):r.thinking={type:"enabled",budget_tokens:n.thinkingBudgetTokens||1024}),n?.metadata){const u=n.metadata.user_id;typeof u=="string"&&(r.metadata={user_id:u})}return n?.toolChoice&&(typeof n.toolChoice=="string"?r.tool_choice={type:n.toolChoice}:r.tool_choice=n.toolChoice),r}h(q,"buildParams");function F(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,64)}h(F,"normalizeToolCallId");function $(t,o,s,n){const e=[],r=N(t,o,F);for(let u=0;u<r.length;u++){const p=r[u];if(p.role==="user")if(typeof p.content=="string")p.content.trim().length>0&&e.push({role:"user",content:y(p.content)});else{const d=p.content.map(g=>g.type==="text"?{type:"text",text:y(g.text)}:g.type==="document"?{type:"document",source:{type:"base64",media_type:"application/pdf",data:g.source.data}}:{type:"image",source:{type:"base64",media_type:g.mimeType,data:g.data}});let i=o?.input.includes("image")?d:d.filter(g=>g.type!=="image");if(i=i.filter(g=>g.type==="text"?g.text.trim().length>0:!0),i.length===0)continue;e.push({role:"user",content:i})}else if(p.role==="assistant"){const d=[];for(const i of p.content)if(i.type==="text"){if(i.text.trim().length===0)continue;d.push({type:"text",text:y(i.text)})}else if(i.type==="thinking"){if(i.redacted){d.push({type:"redacted_thinking",data:i.thinkingSignature});continue}if(i.thinking.trim().length===0)continue;!i.thinkingSignature||i.thinkingSignature.trim().length===0?d.push({type:"text",text:y(i.thinking)}):d.push({type:"thinking",thinking:y(i.thinking),signature:i.thinkingSignature})}else i.type==="toolCall"&&d.push({type:"tool_use",id:i.id,name:s?R(i.name):i.name,input:i.arguments??{}});if(d.length===0)continue;e.push({role:"assistant",content:d})}else if(p.role==="toolResult"){const d=[];d.push({type:"tool_result",tool_use_id:p.toolCallId,content:v(p.content),is_error:p.isError});let i=u+1;for(;i<r.length&&r[i].role==="toolResult";){const g=r[i];d.push({type:"tool_result",tool_use_id:g.toolCallId,content:v(g.content),is_error:g.isError}),i++}u=i-1,e.push({role:"user",content:d})}}if(n&&e.length>0){const u=e[e.length-1];if(u.role==="user")if(Array.isArray(u.content)){const p=u.content[u.content.length-1];p&&(p.type==="text"||p.type==="image"||p.type==="tool_result")&&(p.cache_control=n)}else typeof u.content=="string"&&(u.content=[{type:"text",text:u.content,cache_control:n}])}return e}h($,"convertMessages");function z(t,o){return t?t.map(s=>{const n=s.parameters;return{name:o?R(s.name):s.name,description:s.description,input_schema:{type:"object",properties:n.properties||{},required:n.required||[]}}}):[]}h(z,"convertTools");function D(t){switch(t){case"end_turn":return"stop";case"max_tokens":return"length";case"tool_use":return"toolUse";case"refusal":return"error";case"pause_turn":return"stop";case"stop_sequence":return"stop";case"sensitive":return"error";default:throw new Error(`Unhandled stop reason: ${t}`)}}h(D,"mapStopReason");export{x as streamAnthropic,se as streamSimpleAnthropic};
1
+ var E=Object.defineProperty;var h=(t,o)=>E(t,"name",{value:o,configurable:!0});import m from"@anthropic-ai/sdk";import{getEnvApiKey as C}from"../env-api-keys.js";import{calculateCost as w}from"../models.js";import{AssistantMessageEventStream as I}from"../utils/event-stream.js";import{parseStreamingJson as T}from"../utils/json-parse.js";import{sanitizeSurrogates as y}from"../utils/sanitize-unicode.js";import{buildCopilotDynamicHeaders as A,hasCopilotVisionInput as S}from"./github-copilot-headers.js";import{adjustMaxTokensForThinking as j,buildBaseOptions as B}from"./simple-options.js";import{transformMessages as N}from"./transform-messages.js";function L(t){return t||(typeof process<"u"&&process.env.NANOPENCIL_CACHE_RETENTION==="long"?"long":"short")}h(L,"resolveCacheRetention");function M(t,o){const s=L(o);if(s==="none")return{retention:s};const n=s==="long"&&t.includes("api.anthropic.com")?"1h":void 0;return{retention:s,cacheControl:{type:"ephemeral",...n&&{ttl:n}}}}h(M,"getCacheControl");const O="2.1.62",P=["Read","Write","Edit","Bash","Grep","Glob","AskUserQuestion","EnterPlanMode","ExitPlanMode","KillShell","NotebookEdit","Skill","Task","TaskOutput","TodoWrite","WebFetch","WebSearch"],U=new Map(P.map(t=>[t.toLowerCase(),t])),R=h(t=>U.get(t.toLowerCase())??t,"toClaudeCodeName"),W=h((t,o)=>{if(o&&o.length>0){const s=t.toLowerCase(),n=o.find(e=>e.name.toLowerCase()===s);if(n)return n.name}return t},"fromClaudeCodeName");function v(t){if(!t.some(e=>e.type!=="text"))return y(t.map(e=>e.text).join(`
2
+ `));const s=t.map(e=>e.type==="text"?{type:"text",text:y(e.text)}:e.type==="document"?{type:"document",source:{type:"base64",media_type:"application/pdf",data:e.source.data}}:{type:"image",source:{type:"base64",media_type:e.mimeType,data:e.data}});return s.some(e=>e.type==="text")||s.unshift({type:"text",text:"(see attached document)"}),s}h(v,"convertContentBlocks");function _(...t){const o={};for(const s of t)s&&Object.assign(o,s);return o}h(_,"mergeHeaders");const x=h((t,o,s)=>{const n=new I;return(async()=>{const e={role:"assistant",content:[],api:t.api,provider:t.provider,model:t.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const r=s?.apiKey??C(t.provider)??"";let i;if(t.provider==="github-copilot"){const a=S(o.messages);i=A({messages:o.messages,hasImages:a})}const{client:l,isOAuthToken:p}=K(t,r,s?.interleavedThinking??!0,s?.headers,i),c=q(t,o,p,s);s?.onPayload?.(c);const g=l.messages.stream({...c,stream:!0},{signal:s?.signal});n.push({type:"start",partial:e});const f=e.content;for await(const a of g)if(a.type==="message_start")e.usage.input=a.message.usage.input_tokens||0,e.usage.output=a.message.usage.output_tokens||0,e.usage.cacheRead=a.message.usage.cache_read_input_tokens||0,e.usage.cacheWrite=a.message.usage.cache_creation_input_tokens||0,e.usage.totalTokens=e.usage.input+e.usage.output+e.usage.cacheRead+e.usage.cacheWrite,w(t,e.usage);else if(a.type==="content_block_start"){if(a.content_block.type==="text"){const d={type:"text",text:"",index:a.index};e.content.push(d),n.push({type:"text_start",contentIndex:e.content.length-1,partial:e})}else if(a.content_block.type==="thinking"){const d={type:"thinking",thinking:"",thinkingSignature:"",index:a.index};e.content.push(d),n.push({type:"thinking_start",contentIndex:e.content.length-1,partial:e})}else if(a.content_block.type==="redacted_thinking"){const d={type:"thinking",thinking:"[Reasoning redacted]",thinkingSignature:a.content_block.data,redacted:!0,index:a.index};e.content.push(d),n.push({type:"thinking_start",contentIndex:e.content.length-1,partial:e})}else if(a.content_block.type==="tool_use"){const d={type:"toolCall",id:a.content_block.id,name:p?W(a.content_block.name,o.tools):a.content_block.name,arguments:a.content_block.input??{},partialJson:"",index:a.index};e.content.push(d),n.push({type:"toolcall_start",contentIndex:e.content.length-1,partial:e})}}else if(a.type==="content_block_delta"){if(a.delta.type==="text_delta"){const d=f.findIndex(k=>k.index===a.index),u=f[d];u&&u.type==="text"&&(u.text+=a.delta.text,n.push({type:"text_delta",contentIndex:d,delta:a.delta.text,partial:e}))}else if(a.delta.type==="thinking_delta"){const d=f.findIndex(k=>k.index===a.index),u=f[d];u&&u.type==="thinking"&&(u.thinking+=a.delta.thinking,n.push({type:"thinking_delta",contentIndex:d,delta:a.delta.thinking,partial:e}))}else if(a.delta.type==="input_json_delta"){const d=f.findIndex(k=>k.index===a.index),u=f[d];u&&u.type==="toolCall"&&(u.partialJson+=a.delta.partial_json,u.arguments=T(u.partialJson),n.push({type:"toolcall_delta",contentIndex:d,delta:a.delta.partial_json,partial:e}))}else if(a.delta.type==="signature_delta"){const d=f.findIndex(k=>k.index===a.index),u=f[d];u&&u.type==="thinking"&&(u.thinkingSignature=u.thinkingSignature||"",u.thinkingSignature+=a.delta.signature)}}else if(a.type==="content_block_stop"){const d=f.findIndex(k=>k.index===a.index),u=f[d];u&&(delete u.index,u.type==="text"?n.push({type:"text_end",contentIndex:d,content:u.text,partial:e}):u.type==="thinking"?n.push({type:"thinking_end",contentIndex:d,content:u.thinking,partial:e}):u.type==="toolCall"&&(u.arguments=T(u.partialJson),delete u.partialJson,n.push({type:"toolcall_end",contentIndex:d,toolCall:u,partial:e})))}else a.type==="message_delta"&&(a.delta.stop_reason&&(e.stopReason=D(a.delta.stop_reason)),a.usage.input_tokens!=null&&(e.usage.input=a.usage.input_tokens),a.usage.output_tokens!=null&&(e.usage.output=a.usage.output_tokens),a.usage.cache_read_input_tokens!=null&&(e.usage.cacheRead=a.usage.cache_read_input_tokens),a.usage.cache_creation_input_tokens!=null&&(e.usage.cacheWrite=a.usage.cache_creation_input_tokens),e.usage.totalTokens=e.usage.input+e.usage.output+e.usage.cacheRead+e.usage.cacheWrite,w(t,e.usage));if(s?.signal?.aborted)throw new Error("Request was aborted");if(e.stopReason==="aborted"||e.stopReason==="error")throw new Error("An unknown error occurred");n.push({type:"done",reason:e.stopReason,message:e}),n.end()}catch(r){for(const i of e.content)delete i.index;if(e.stopReason=s?.signal?.aborted?"aborted":"error",e.errorMessage=r instanceof Error?r.message:JSON.stringify(r),r&&typeof r=="object"&&"headers"in r){const i=r.headers;i&&typeof i=="object"&&(e.errorHeaders=Object.fromEntries(Object.entries(i).map(([l,p])=>[l.toLowerCase(),String(p)])))}n.push({type:"error",reason:e.stopReason,error:e}),n.end()}})(),n},"streamAnthropic");function b(t){return t.includes("opus-4-6")||t.includes("opus-4.6")||t.includes("sonnet-4-6")||t.includes("sonnet-4.6")}h(b,"supportsAdaptiveThinking");function J(t,o){switch(t){case"minimal":return"low";case"low":return"low";case"medium":return"medium";case"high":return"high";case"xhigh":return o.includes("opus-4-6")||o.includes("opus-4.6")?"max":"high";default:return"high"}}h(J,"mapThinkingLevelToEffort");const se=h((t,o,s)=>{const n=s?.apiKey||C(t.provider);if(!n)throw new Error(`No API key for provider: ${t.provider}`);const e=B(t,s,n),r=s?.toolChoice;if(!s?.reasoning)return x(t,o,{...e,toolChoice:r,thinkingEnabled:!1});if(b(t.id)){const l=J(s.reasoning,t.id);return x(t,o,{...e,toolChoice:r,thinkingEnabled:!0,effort:l})}const i=j(e.maxTokens||0,t.maxTokens,s.reasoning,s.thinkingBudgets);return x(t,o,{...e,toolChoice:r,maxTokens:i.maxTokens,thinkingEnabled:!0,thinkingBudgetTokens:i.thinkingBudget})},"streamSimpleAnthropic");function H(t){return t.includes("sk-ant-oat")}h(H,"isOAuthToken");function K(t,o,s,n,e){const r=s&&!b(t.id);if(t.provider==="github-copilot"){const p=[];return r&&p.push("interleaved-thinking-2025-05-14"),{client:new m({apiKey:null,authToken:o,baseURL:t.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:_({accept:"application/json","anthropic-dangerous-direct-browser-access":"true",...p.length>0?{"anthropic-beta":p.join(",")}:{}},t.headers,e,n)}),isOAuthToken:!1}}const i=["fine-grained-tool-streaming-2025-05-14"];return r&&i.push("interleaved-thinking-2025-05-14"),H(o)?{client:new m({apiKey:null,authToken:o,baseURL:t.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:_({accept:"application/json","anthropic-dangerous-direct-browser-access":"true","anthropic-beta":`claude-code-20250219,oauth-2025-04-20,${i.join(",")}`,"user-agent":`claude-cli/${O}`,"x-app":"cli"},t.headers,n)}),isOAuthToken:!0}:{client:new m({apiKey:o,baseURL:t.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:_({accept:"application/json","anthropic-dangerous-direct-browser-access":"true","anthropic-beta":i.join(",")},t.headers,n)}),isOAuthToken:!1}}h(K,"createClient");function q(t,o,s,n){const{cacheControl:e}=M(t.baseUrl,n?.cacheRetention),r={model:t.id,messages:$(o.messages,t,s,e),max_tokens:n?.maxTokens||t.maxTokens/3|0,stream:!0};if(s?(r.system=[{type:"text",text:"You are Claude Code, Anthropic's official CLI for Claude.",...e?{cache_control:e}:{}}],o.systemPrompt&&r.system.push({type:"text",text:y(o.systemPrompt),...e?{cache_control:e}:{}})):o.systemPrompt&&(r.system=[{type:"text",text:y(o.systemPrompt),...e?{cache_control:e}:{}}]),n?.temperature!==void 0&&!n?.thinkingEnabled&&(r.temperature=n.temperature),o.tools&&(r.tools=z(o.tools,s)),n?.thinkingEnabled&&t.reasoning&&(b(t.id)?(r.thinking={type:"adaptive"},n.effort&&(r.output_config={effort:n.effort})):r.thinking={type:"enabled",budget_tokens:n.thinkingBudgetTokens||1024}),n?.metadata){const i=n.metadata.user_id;typeof i=="string"&&(r.metadata={user_id:i})}return n?.toolChoice&&(typeof n.toolChoice=="string"?r.tool_choice={type:n.toolChoice}:r.tool_choice=n.toolChoice),r}h(q,"buildParams");function F(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,64)}h(F,"normalizeToolCallId");function $(t,o,s,n){const e=[],r=N(t,o,F);for(let i=0;i<r.length;i++){const l=r[i];if(l.role==="user")if(typeof l.content=="string")l.content.trim().length>0&&e.push({role:"user",content:y(l.content)});else{const p=l.content.map(g=>g.type==="text"?{type:"text",text:y(g.text)}:g.type==="document"?{type:"document",source:{type:"base64",media_type:"application/pdf",data:g.source.data}}:{type:"image",source:{type:"base64",media_type:g.mimeType,data:g.data}});let c=o?.input.includes("image")?p:p.filter(g=>g.type!=="image");if(c=c.filter(g=>g.type==="text"?g.text.trim().length>0:!0),c.length===0)continue;e.push({role:"user",content:c})}else if(l.role==="assistant"){const p=[];for(const c of l.content)if(c.type==="text"){if(c.text.trim().length===0)continue;p.push({type:"text",text:y(c.text)})}else if(c.type==="thinking"){if(c.redacted){p.push({type:"redacted_thinking",data:c.thinkingSignature});continue}if(c.thinking.trim().length===0)continue;!c.thinkingSignature||c.thinkingSignature.trim().length===0?p.push({type:"text",text:y(c.thinking)}):p.push({type:"thinking",thinking:y(c.thinking),signature:c.thinkingSignature})}else c.type==="toolCall"&&p.push({type:"tool_use",id:c.id,name:s?R(c.name):c.name,input:c.arguments??{}});if(p.length===0)continue;e.push({role:"assistant",content:p})}else if(l.role==="toolResult"){const p=[];p.push({type:"tool_result",tool_use_id:l.toolCallId,content:v(l.content),is_error:l.isError});let c=i+1;for(;c<r.length&&r[c].role==="toolResult";){const g=r[c];p.push({type:"tool_result",tool_use_id:g.toolCallId,content:v(g.content),is_error:g.isError}),c++}i=c-1,e.push({role:"user",content:p})}}if(n&&e.length>0){const i=e[e.length-1];if(i.role==="user")if(Array.isArray(i.content)){const l=i.content[i.content.length-1];l&&(l.type==="text"||l.type==="image"||l.type==="tool_result")&&(l.cache_control=n)}else typeof i.content=="string"&&(i.content=[{type:"text",text:i.content,cache_control:n}])}return e}h($,"convertMessages");function z(t,o){return t?t.map(s=>{const n=s.parameters;return{name:o?R(s.name):s.name,description:s.description,input_schema:{type:"object",properties:n.properties||{},required:n.required||[]}}}):[]}h(z,"convertTools");function D(t){switch(t){case"end_turn":return"stop";case"max_tokens":return"length";case"tool_use":return"toolUse";case"refusal":return"error";case"pause_turn":return"stop";case"stop_sequence":return"stop";case"sensitive":return"error";default:throw new Error(`Unhandled stop reason: ${t}`)}}h(D,"mapStopReason");export{x as streamAnthropic,se as streamSimpleAnthropic};
@@ -1,6 +1,6 @@
1
- var b=Object.defineProperty;var _=(t,e)=>b(t,"name",{value:e,configurable:!0});import O from"openai";import{getEnvApiKey as q}from"../env-api-keys.js";import{calculateCost as N,supportsXhigh as P}from"../models.js";import{AssistantMessageEventStream as B}from"../utils/event-stream.js";import{parseStreamingJson as M}from"../utils/json-parse.js";import{sanitizeSurrogates as S}from"../utils/sanitize-unicode.js";import{buildCopilotDynamicHeaders as F,hasCopilotVisionInput as D}from"./github-copilot-headers.js";import{buildBaseOptions as U,clampReasoning as j}from"./simple-options.js";import{transformMessages as z}from"./transform-messages.js";import{getDebugLogger as G}from"../debug-logger.js";function $(t){let e=t.replace(/[^a-zA-Z0-9]/g,"");return e.length<9?e=e+"ABCDEFGHI".slice(0,9-e.length):e.length>9&&(e=e.slice(0,9)),e}_($,"normalizeMistralToolId");function K(t){for(const e of t)if(e.role==="toolResult"||e.role==="assistant"&&e.content.some(o=>o.type==="toolCall"))return!0;return!1}_(K,"hasToolHistory");const J=_((t,e,o)=>{const i=new B;return(async()=>{const s={role:"assistant",content:[],api:t.api,provider:t.provider,model:t.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const r=o?.apiKey||q(t.provider)||"",u=L(t,e,r,o?.headers),c=W(t,e,o);o?.onPayload?.(c);const g=G();g.logProviderRequest(t.provider||"unknown",t.id||"unknown",c);const h=await u.chat.completions.create(c,{signal:o?.signal});i.push({type:"start",partial:s});let n=null;const d=s.content,y=_(()=>d.length-1,"blockIndex"),R=_(l=>{l&&(l.type==="text"?i.push({type:"text_end",contentIndex:y(),content:l.text,partial:s}):l.type==="thinking"?i.push({type:"thinking_end",contentIndex:y(),content:l.thinking,partial:s}):l.type==="toolCall"&&(l.arguments=M(l.partialArgs),delete l.partialArgs,i.push({type:"toolcall_end",contentIndex:y(),toolCall:l,partial:s})))},"finishCurrentBlock");let m="",T=!1;const A=t.provider||"unknown",p=t.id||"unknown";for await(const l of h){if(g.logProviderChunk(A,p,l),l.usage){const E=l.usage.prompt_tokens_details?.cached_tokens||0,v=l.usage.completion_tokens_details?.reasoning_tokens||0,C=(l.usage.prompt_tokens||0)-E,a=(l.usage.completion_tokens||0)+v;s.usage={input:C,output:a,cacheRead:E,cacheWrite:0,totalTokens:C+a+E,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},N(t,s.usage)}const f=l.choices?.[0];if(f&&(f.finish_reason&&(s.stopReason=X(f.finish_reason)),f.delta)){if((f.delta.content!==void 0||f.delta.tool_calls!==void 0)&&g.logContentParse("choice.delta",{content:f.delta.content,tool_calls:f.delta.tool_calls,reasoning_content:f.delta.reasoning_content,reasoning:f.delta.reasoning}),f.delta.content!==null&&f.delta.content!==void 0&&f.delta.content.length>0)for(m+=f.delta.content;m.length>0;)if(T){const a=["</thinking>","</think>"];let k=-1,I=0;for(const x of a){const w=m.indexOf(x);w!==-1&&(k===-1||w<k)&&(k=w,I=x.length)}if(k!==-1){const x=m.slice(0,k);x&&((!n||n.type!=="thinking")&&(R(n),n={type:"thinking",thinking:"",thinkingSignature:"minimax-thinking-tag"},s.content.push(n),i.push({type:"thinking_start",contentIndex:y(),partial:s})),n.type==="thinking"&&(n.thinking+=x,i.push({type:"thinking_delta",contentIndex:y(),delta:x,partial:s}))),m=m.slice(k+I),T=!1,n&&n.type==="thinking"&&(R(n),n=null)}else{const x=m;m="",(!n||n.type!=="thinking")&&(R(n),n={type:"thinking",thinking:"",thinkingSignature:"minimax-thinking-tag"},s.content.push(n),i.push({type:"thinking_start",contentIndex:y(),partial:s})),n.type==="thinking"&&(n.thinking+=x,i.push({type:"thinking_delta",contentIndex:y(),delta:x,partial:s}))}}else{const a=["<thinking>","<think>"];let k=-1,I=0;for(const x of a){const w=m.indexOf(x);w!==-1&&(k===-1||w<k)&&(k=w,I=x.length)}if(k!==-1){const x=m.slice(0,k);m=m.slice(k+I),T=!0,x&&((!n||n.type!=="text")&&(R(n),n={type:"text",text:""},s.content.push(n),i.push({type:"text_start",contentIndex:y(),partial:s})),n.type==="text"&&(n.text+=x,i.push({type:"text_delta",contentIndex:y(),delta:x,partial:s})))}else{const x=m;m="",(!n||n.type!=="text")&&(R(n),n={type:"text",text:""},s.content.push(n),i.push({type:"text_start",contentIndex:y(),partial:s})),n.type==="text"&&(n.text+=x,i.push({type:"text_delta",contentIndex:y(),delta:x,partial:s}))}}const E=["reasoning_content","reasoning","reasoning_text"];let v=null;for(const a of E)if(f.delta[a]!==null&&f.delta[a]!==void 0&&f.delta[a].length>0&&!v){v=a;break}if(v&&((!n||n.type!=="thinking")&&(R(n),n={type:"thinking",thinking:"",thinkingSignature:v},s.content.push(n),i.push({type:"thinking_start",contentIndex:y(),partial:s})),n.type==="thinking")){const a=f.delta[v];n.thinking+=a,i.push({type:"thinking_delta",contentIndex:y(),delta:a,partial:s})}if(f?.delta?.tool_calls){for(const a of f.delta.tool_calls)if((!n||n.type!=="toolCall"||a.id&&n.id!==a.id)&&(R(n),n={type:"toolCall",id:a.id||"",name:a.function?.name||"",arguments:{},partialArgs:""},s.content.push(n),i.push({type:"toolcall_start",contentIndex:y(),partial:s})),n.type==="toolCall"){a.id&&(n.id=a.id),a.function?.name&&(n.name=a.function.name);let k="";a.function?.arguments&&(k=a.function.arguments,n.partialArgs+=a.function.arguments,n.arguments=M(n.partialArgs)),i.push({type:"toolcall_delta",contentIndex:y(),delta:k,partial:s})}}const C=f.delta.reasoning_details;if(C&&Array.isArray(C)){for(const a of C)if(a.type==="reasoning.encrypted"&&a.id&&a.data){const k=s.content.find(I=>I.type==="toolCall"&&I.id===a.id);k&&(k.thoughtSignature=JSON.stringify(a))}}}}if(R(n),o?.signal?.aborted)throw new Error("Request was aborted");if(s.stopReason==="aborted"||s.stopReason==="error")throw new Error("An unknown error occurred");i.push({type:"done",reason:s.stopReason,message:s}),i.end()}catch(r){for(const c of s.content)delete c.index;s.stopReason=o?.signal?.aborted?"aborted":"error",s.errorMessage=r instanceof Error?r.message:JSON.stringify(r);const u=r?.error?.metadata?.raw;u&&(s.errorMessage+=`
2
- ${u}`),i.push({type:"error",reason:s.stopReason,error:s}),i.end()}})(),i},"streamOpenAICompletions"),gt=_((t,e,o)=>{const i=o?.apiKey||q(t.provider);if(!i)throw new Error(`No API key for provider: ${t.provider}`);const s=U(t,o,i),r=P(t)?o?.reasoning:j(o?.reasoning),u=o?.toolChoice;return J(t,e,{...s,reasoningEffort:r,toolChoice:u})},"streamSimpleOpenAICompletions");function L(t,e,o,i){if(!o){if(!process.env.OPENAI_API_KEY)throw new Error("OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.");o=process.env.OPENAI_API_KEY}const s={...t.headers};if(t.provider==="github-copilot"){const r=D(e.messages),u=F({messages:e.messages,hasImages:r});Object.assign(s,u)}return i&&Object.assign(s,i),new O({apiKey:o,baseURL:t.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:s})}_(L,"createClient");function W(t,e,o){const i=tt(t),s=Z(t,e,i);Y(t,s);const r={model:t.id,messages:s,stream:!0};if(i.supportsUsageInStreaming!==!1&&(r.stream_options={include_usage:!0}),i.supportsStore&&(r.store=!1),o?.maxTokens&&(i.maxTokensField==="max_tokens"?r.max_tokens=o.maxTokens:r.max_completion_tokens=o.maxTokens),o?.temperature!==void 0&&(r.temperature=o.temperature),e.tools?r.tools=V(e.tools,i):K(e.messages)&&(r.tools=[]),o?.toolChoice&&(r.tool_choice=o.toolChoice),(i.thinkingFormat==="zai"||i.thinkingFormat==="qwen")&&t.reasoning?r.enable_thinking=!!o?.reasoningEffort:o?.reasoningEffort&&t.reasoning&&i.supportsReasoningEffort&&(r.reasoning_effort=H(o.reasoningEffort,i.reasoningEffortMap)),t.baseUrl.includes("openrouter.ai")&&t.compat?.openRouterRouting&&(r.provider=t.compat.openRouterRouting),t.baseUrl.includes("ai-gateway.vercel.sh")&&t.compat?.vercelGatewayRouting){const u=t.compat.vercelGatewayRouting;if(u.only||u.order){const c={};u.only&&(c.only=u.only),u.order&&(c.order=u.order),r.providerOptions={gateway:c}}}return r}_(W,"buildParams");function H(t,e){return e[t]??t}_(H,"mapReasoningEffort");function Y(t,e){if(!(t.provider!=="openrouter"||!t.id.startsWith("anthropic/")))for(let o=e.length-1;o>=0;o--){const i=e[o];if(i.role!=="user"&&i.role!=="assistant")continue;const s=i.content;if(typeof s=="string"){i.content=[Object.assign({type:"text",text:s},{cache_control:{type:"ephemeral"}})];return}if(Array.isArray(s))for(let r=s.length-1;r>=0;r--){const u=s[r];if(u?.type==="text"){Object.assign(u,{cache_control:{type:"ephemeral"}});return}}}}_(Y,"maybeAddOpenRouterAnthropicCacheControl");function Z(t,e,o){const i=[],s=_(c=>{if(o.requiresMistralToolIds)return $(c);if(c.includes("|")){const[g]=c.split("|");return g.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,40)}return t.provider==="openai"&&c.length>40?c.slice(0,40):c},"normalizeToolCallId"),r=z(e.messages,t,c=>s(c));if(e.systemPrompt){const g=t.reasoning&&o.supportsDeveloperRole?"developer":"system";i.push({role:g,content:S(e.systemPrompt)})}let u=null;for(let c=0;c<r.length;c++){const g=r[c];if(o.requiresAssistantAfterToolResult&&u==="toolResult"&&g.role==="user"&&i.push({role:"assistant",content:"I have processed the tool results."}),g.role==="user")if(typeof g.content=="string")i.push({role:"user",content:S(g.content)});else{const h=g.content.map(d=>d.type==="text"?{type:"text",text:S(d.text)}:d.type==="document"?{type:"text",text:"[PDF document - content not available in OpenAI format]"}:{type:"image_url",image_url:{url:`data:${d.mimeType};base64,${d.data}`}}),n=t.input.includes("image")?h:h.filter(d=>d.type!=="image_url");if(n.length===0)continue;i.push({role:"user",content:n})}else if(g.role==="assistant"){const h={role:"assistant",content:o.requiresAssistantAfterToolResult?"":null},d=g.content.filter(p=>p.type==="text").filter(p=>p.text&&p.text.trim().length>0);d.length>0&&(t.provider==="github-copilot"?h.content=d.map(p=>S(p.text)).join(""):h.content=d.map(p=>({type:"text",text:S(p.text)})));const R=g.content.filter(p=>p.type==="thinking").filter(p=>p.thinking&&p.thinking.trim().length>0);if(R.length>0)if(o.requiresThinkingAsText){const p=R.map(f=>f.thinking).join(`
1
+ var M=Object.defineProperty;var _=(t,e)=>M(t,"name",{value:e,configurable:!0});import O from"openai";import{getEnvApiKey as q}from"../env-api-keys.js";import{calculateCost as N,supportsXhigh as P}from"../models.js";import{AssistantMessageEventStream as B}from"../utils/event-stream.js";import{parseStreamingJson as b}from"../utils/json-parse.js";import{sanitizeSurrogates as S}from"../utils/sanitize-unicode.js";import{buildCopilotDynamicHeaders as F,hasCopilotVisionInput as j}from"./github-copilot-headers.js";import{buildBaseOptions as D,clampReasoning as U}from"./simple-options.js";import{transformMessages as z}from"./transform-messages.js";import{getDebugLogger as G}from"../debug-logger.js";function $(t){let e=t.replace(/[^a-zA-Z0-9]/g,"");return e.length<9?e=e+"ABCDEFGHI".slice(0,9-e.length):e.length>9&&(e=e.slice(0,9)),e}_($,"normalizeMistralToolId");function K(t){for(const e of t)if(e.role==="toolResult"||e.role==="assistant"&&e.content.some(o=>o.type==="toolCall"))return!0;return!1}_(K,"hasToolHistory");const L=_((t,e,o)=>{const i=new B;return(async()=>{const s={role:"assistant",content:[],api:t.api,provider:t.provider,model:t.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const r=o?.apiKey||q(t.provider)||"",u=H(t,e,r,o?.headers),a=J(t,e,o);o?.onPayload?.(a);const g=G();g.logProviderRequest(t.provider||"unknown",t.id||"unknown",a);const f=await u.chat.completions.create(a,{signal:o?.signal});i.push({type:"start",partial:s});let n=null;const d=s.content,y=_(()=>d.length-1,"blockIndex"),R=_(c=>{c&&(c.type==="text"?i.push({type:"text_end",contentIndex:y(),content:c.text,partial:s}):c.type==="thinking"?i.push({type:"thinking_end",contentIndex:y(),content:c.thinking,partial:s}):c.type==="toolCall"&&(c.arguments=b(c.partialArgs),delete c.partialArgs,i.push({type:"toolcall_end",contentIndex:y(),toolCall:c,partial:s})))},"finishCurrentBlock");let m="",T=!1;const A=t.provider||"unknown",p=t.id||"unknown";for await(const c of f){if(g.logProviderChunk(A,p,c),c.usage){const E=c.usage.prompt_tokens_details?.cached_tokens||0,v=c.usage.completion_tokens_details?.reasoning_tokens||0,C=(c.usage.prompt_tokens||0)-E,l=(c.usage.completion_tokens||0)+v;s.usage={input:C,output:l,cacheRead:E,cacheWrite:0,totalTokens:C+l+E,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},N(t,s.usage)}const h=c.choices?.[0];if(h&&(h.finish_reason&&(s.stopReason=X(h.finish_reason)),h.delta)){if((h.delta.content!==void 0||h.delta.tool_calls!==void 0)&&g.logContentParse("choice.delta",{content:h.delta.content,tool_calls:h.delta.tool_calls,reasoning_content:h.delta.reasoning_content,reasoning:h.delta.reasoning}),h.delta.content!==null&&h.delta.content!==void 0&&h.delta.content.length>0)for(m+=h.delta.content;m.length>0;)if(T){const l=["</thinking>","</think>"];let k=-1,I=0;for(const x of l){const w=m.indexOf(x);w!==-1&&(k===-1||w<k)&&(k=w,I=x.length)}if(k!==-1){const x=m.slice(0,k);x&&((!n||n.type!=="thinking")&&(R(n),n={type:"thinking",thinking:"",thinkingSignature:"minimax-thinking-tag"},s.content.push(n),i.push({type:"thinking_start",contentIndex:y(),partial:s})),n.type==="thinking"&&(n.thinking+=x,i.push({type:"thinking_delta",contentIndex:y(),delta:x,partial:s}))),m=m.slice(k+I),T=!1,n&&n.type==="thinking"&&(R(n),n=null)}else{const x=m;m="",(!n||n.type!=="thinking")&&(R(n),n={type:"thinking",thinking:"",thinkingSignature:"minimax-thinking-tag"},s.content.push(n),i.push({type:"thinking_start",contentIndex:y(),partial:s})),n.type==="thinking"&&(n.thinking+=x,i.push({type:"thinking_delta",contentIndex:y(),delta:x,partial:s}))}}else{const l=["<thinking>","<think>"];let k=-1,I=0;for(const x of l){const w=m.indexOf(x);w!==-1&&(k===-1||w<k)&&(k=w,I=x.length)}if(k!==-1){const x=m.slice(0,k);m=m.slice(k+I),T=!0,x&&((!n||n.type!=="text")&&(R(n),n={type:"text",text:""},s.content.push(n),i.push({type:"text_start",contentIndex:y(),partial:s})),n.type==="text"&&(n.text+=x,i.push({type:"text_delta",contentIndex:y(),delta:x,partial:s})))}else{const x=m;m="",(!n||n.type!=="text")&&(R(n),n={type:"text",text:""},s.content.push(n),i.push({type:"text_start",contentIndex:y(),partial:s})),n.type==="text"&&(n.text+=x,i.push({type:"text_delta",contentIndex:y(),delta:x,partial:s}))}}const E=["reasoning_content","reasoning","reasoning_text"];let v=null;for(const l of E)if(h.delta[l]!==null&&h.delta[l]!==void 0&&h.delta[l].length>0&&!v){v=l;break}if(v&&((!n||n.type!=="thinking")&&(R(n),n={type:"thinking",thinking:"",thinkingSignature:v},s.content.push(n),i.push({type:"thinking_start",contentIndex:y(),partial:s})),n.type==="thinking")){const l=h.delta[v];n.thinking+=l,i.push({type:"thinking_delta",contentIndex:y(),delta:l,partial:s})}if(h?.delta?.tool_calls){for(const l of h.delta.tool_calls)if((!n||n.type!=="toolCall"||l.id&&n.id!==l.id)&&(R(n),n={type:"toolCall",id:l.id||"",name:l.function?.name||"",arguments:{},partialArgs:""},s.content.push(n),i.push({type:"toolcall_start",contentIndex:y(),partial:s})),n.type==="toolCall"){l.id&&(n.id=l.id),l.function?.name&&(n.name=l.function.name);let k="";l.function?.arguments&&(k=l.function.arguments,n.partialArgs+=l.function.arguments,n.arguments=b(n.partialArgs)),i.push({type:"toolcall_delta",contentIndex:y(),delta:k,partial:s})}}const C=h.delta.reasoning_details;if(C&&Array.isArray(C)){for(const l of C)if(l.type==="reasoning.encrypted"&&l.id&&l.data){const k=s.content.find(I=>I.type==="toolCall"&&I.id===l.id);k&&(k.thoughtSignature=JSON.stringify(l))}}}}if(R(n),o?.signal?.aborted)throw new Error("Request was aborted");if(s.stopReason==="aborted"||s.stopReason==="error")throw new Error("An unknown error occurred");i.push({type:"done",reason:s.stopReason,message:s}),i.end()}catch(r){for(const a of s.content)delete a.index;s.stopReason=o?.signal?.aborted?"aborted":"error",s.errorMessage=r instanceof Error?r.message:JSON.stringify(r);const u=r?.error?.metadata?.raw;if(u&&(s.errorMessage+=`
2
+ ${u}`),r&&typeof r=="object"&&"headers"in r){const a=r.headers;a&&typeof a=="object"&&(s.errorHeaders=Object.fromEntries(Object.entries(a).map(([g,f])=>[g.toLowerCase(),String(f)])))}i.push({type:"error",reason:s.stopReason,error:s}),i.end()}})(),i},"streamOpenAICompletions"),gt=_((t,e,o)=>{const i=o?.apiKey||q(t.provider);if(!i)throw new Error(`No API key for provider: ${t.provider}`);const s=D(t,o,i),r=P(t)?o?.reasoning:U(o?.reasoning),u=o?.toolChoice;return L(t,e,{...s,reasoningEffort:r,toolChoice:u})},"streamSimpleOpenAICompletions");function H(t,e,o,i){if(!o){if(!process.env.OPENAI_API_KEY)throw new Error("OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.");o=process.env.OPENAI_API_KEY}const s={...t.headers};if(t.provider==="github-copilot"){const r=j(e.messages),u=F({messages:e.messages,hasImages:r});Object.assign(s,u)}return i&&Object.assign(s,i),new O({apiKey:o,baseURL:t.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:s})}_(H,"createClient");function J(t,e,o){const i=tt(t),s=Z(t,e,i);Y(t,s);const r={model:t.id,messages:s,stream:!0};if(i.supportsUsageInStreaming!==!1&&(r.stream_options={include_usage:!0}),i.supportsStore&&(r.store=!1),o?.maxTokens&&(i.maxTokensField==="max_tokens"?r.max_tokens=o.maxTokens:r.max_completion_tokens=o.maxTokens),o?.temperature!==void 0&&(r.temperature=o.temperature),e.tools?r.tools=V(e.tools,i):K(e.messages)&&(r.tools=[]),o?.toolChoice&&(r.tool_choice=o.toolChoice),(i.thinkingFormat==="zai"||i.thinkingFormat==="qwen")&&t.reasoning?r.enable_thinking=!!o?.reasoningEffort:o?.reasoningEffort&&t.reasoning&&i.supportsReasoningEffort&&(r.reasoning_effort=W(o.reasoningEffort,i.reasoningEffortMap)),t.baseUrl.includes("openrouter.ai")&&t.compat?.openRouterRouting&&(r.provider=t.compat.openRouterRouting),t.baseUrl.includes("ai-gateway.vercel.sh")&&t.compat?.vercelGatewayRouting){const u=t.compat.vercelGatewayRouting;if(u.only||u.order){const a={};u.only&&(a.only=u.only),u.order&&(a.order=u.order),r.providerOptions={gateway:a}}}return r}_(J,"buildParams");function W(t,e){return e[t]??t}_(W,"mapReasoningEffort");function Y(t,e){if(!(t.provider!=="openrouter"||!t.id.startsWith("anthropic/")))for(let o=e.length-1;o>=0;o--){const i=e[o];if(i.role!=="user"&&i.role!=="assistant")continue;const s=i.content;if(typeof s=="string"){i.content=[Object.assign({type:"text",text:s},{cache_control:{type:"ephemeral"}})];return}if(Array.isArray(s))for(let r=s.length-1;r>=0;r--){const u=s[r];if(u?.type==="text"){Object.assign(u,{cache_control:{type:"ephemeral"}});return}}}}_(Y,"maybeAddOpenRouterAnthropicCacheControl");function Z(t,e,o){const i=[],s=_(a=>{if(o.requiresMistralToolIds)return $(a);if(a.includes("|")){const[g]=a.split("|");return g.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,40)}return t.provider==="openai"&&a.length>40?a.slice(0,40):a},"normalizeToolCallId"),r=z(e.messages,t,a=>s(a));if(e.systemPrompt){const g=t.reasoning&&o.supportsDeveloperRole?"developer":"system";i.push({role:g,content:S(e.systemPrompt)})}let u=null;for(let a=0;a<r.length;a++){const g=r[a];if(o.requiresAssistantAfterToolResult&&u==="toolResult"&&g.role==="user"&&i.push({role:"assistant",content:"I have processed the tool results."}),g.role==="user")if(typeof g.content=="string")i.push({role:"user",content:S(g.content)});else{const f=g.content.map(d=>d.type==="text"?{type:"text",text:S(d.text)}:d.type==="document"?{type:"text",text:"[PDF document - content not available in OpenAI format]"}:{type:"image_url",image_url:{url:`data:${d.mimeType};base64,${d.data}`}}),n=t.input.includes("image")?f:f.filter(d=>d.type!=="image_url");if(n.length===0)continue;i.push({role:"user",content:n})}else if(g.role==="assistant"){const f={role:"assistant",content:o.requiresAssistantAfterToolResult?"":null},d=g.content.filter(p=>p.type==="text").filter(p=>p.text&&p.text.trim().length>0);d.length>0&&(t.provider==="github-copilot"?f.content=d.map(p=>S(p.text)).join(""):f.content=d.map(p=>({type:"text",text:S(p.text)})));const R=g.content.filter(p=>p.type==="thinking").filter(p=>p.thinking&&p.thinking.trim().length>0);if(R.length>0)if(o.requiresThinkingAsText){const p=R.map(h=>h.thinking).join(`
3
3
 
4
- `),l=h.content;l?l.unshift({type:"text",text:p}):h.content=[{type:"text",text:p}]}else{const p=R[0].thinkingSignature;p&&p.length>0&&(h[p]=R.map(l=>l.thinking).join(`
5
- `))}const m=g.content.filter(p=>p.type==="toolCall");if(m.length>0){h.tool_calls=m.map(l=>({id:l.id,type:"function",function:{name:l.name,arguments:JSON.stringify(l.arguments)}}));const p=m.filter(l=>l.thoughtSignature).map(l=>{try{return JSON.parse(l.thoughtSignature)}catch{return null}}).filter(Boolean);p.length>0&&(h.reasoning_details=p)}const T=h.content;if(!(T!=null&&T.length>0)&&!h.tool_calls)continue;i.push(h)}else if(g.role==="toolResult"){const h=[];let n=c;for(;n<r.length&&r[n].role==="toolResult";n++){const d=r[n],y=d.content.filter(A=>A.type==="text").map(A=>A.text).join(`
6
- `),R=d.content.some(A=>A.type==="image"),m=y.length>0,T={role:"tool",content:S(m?y:"(see attached image)"),tool_call_id:d.toolCallId};if(o.requiresToolResultName&&d.toolName&&(T.name=d.toolName),i.push(T),R&&t.input.includes("image"))for(const A of d.content)A.type==="image"&&h.push({type:"image_url",image_url:{url:`data:${A.mimeType};base64,${A.data}`}})}c=n-1,h.length>0?(o.requiresAssistantAfterToolResult&&i.push({role:"assistant",content:"I have processed the tool results."}),i.push({role:"user",content:[{type:"text",text:"Attached image(s) from tool result:"},...h]}),u="user"):u="toolResult";continue}u=g.role}return i}_(Z,"convertMessages");function V(t,e){return t.map(o=>({type:"function",function:{name:o.name,description:o.description,parameters:o.parameters,...e.supportsStrictMode!==!1&&{strict:!1}}}))}_(V,"convertTools");function X(t){if(t===null)return"stop";switch(t){case"stop":return"stop";case"length":return"length";case"function_call":case"tool_calls":return"toolUse";case"content_filter":return"error";default:{const e=t;throw new Error(`Unhandled stop reason: ${e}`)}}}_(X,"mapStopReason");function Q(t){const e=t.provider,o=t.baseUrl,i=e==="zai"||o.includes("api.z.ai"),s=e==="cerebras"||o.includes("cerebras.ai")||e==="xai"||o.includes("api.x.ai")||e==="mistral"||o.includes("mistral.ai")||o.includes("chutes.ai")||o.includes("deepseek.com")||i||e==="opencode"||o.includes("opencode.ai"),r=e==="mistral"||o.includes("mistral.ai")||o.includes("chutes.ai"),u=e==="xai"||o.includes("api.x.ai"),c=e==="groq"||o.includes("groq.com"),g=e==="mistral"||o.includes("mistral.ai"),h=c&&t.id==="qwen/qwen3-32b"?{minimal:"default",low:"default",medium:"default",high:"default",xhigh:"default"}:{};return{supportsStore:!s,supportsDeveloperRole:!s,supportsReasoningEffort:!u&&!i,reasoningEffortMap:h,supportsUsageInStreaming:!0,maxTokensField:r?"max_tokens":"max_completion_tokens",requiresToolResultName:g,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:g,requiresMistralToolIds:g,thinkingFormat:i?"zai":"openai",openRouterRouting:{},vercelGatewayRouting:{},supportsStrictMode:!0}}_(Q,"detectCompat");function tt(t){const e=Q(t);return t.compat?{supportsStore:t.compat.supportsStore??e.supportsStore,supportsDeveloperRole:t.compat.supportsDeveloperRole??e.supportsDeveloperRole,supportsReasoningEffort:t.compat.supportsReasoningEffort??e.supportsReasoningEffort,reasoningEffortMap:t.compat.reasoningEffortMap??e.reasoningEffortMap,supportsUsageInStreaming:t.compat.supportsUsageInStreaming??e.supportsUsageInStreaming,maxTokensField:t.compat.maxTokensField??e.maxTokensField,requiresToolResultName:t.compat.requiresToolResultName??e.requiresToolResultName,requiresAssistantAfterToolResult:t.compat.requiresAssistantAfterToolResult??e.requiresAssistantAfterToolResult,requiresThinkingAsText:t.compat.requiresThinkingAsText??e.requiresThinkingAsText,requiresMistralToolIds:t.compat.requiresMistralToolIds??e.requiresMistralToolIds,thinkingFormat:t.compat.thinkingFormat??e.thinkingFormat,openRouterRouting:t.compat.openRouterRouting??{},vercelGatewayRouting:t.compat.vercelGatewayRouting??e.vercelGatewayRouting,supportsStrictMode:t.compat.supportsStrictMode??e.supportsStrictMode}:e}_(tt,"getCompat");export{Z as convertMessages,J as streamOpenAICompletions,gt as streamSimpleOpenAICompletions};
4
+ `),c=f.content;c?c.unshift({type:"text",text:p}):f.content=[{type:"text",text:p}]}else{const p=R[0].thinkingSignature;p&&p.length>0&&(f[p]=R.map(c=>c.thinking).join(`
5
+ `))}const m=g.content.filter(p=>p.type==="toolCall");if(m.length>0){f.tool_calls=m.map(c=>({id:c.id,type:"function",function:{name:c.name,arguments:JSON.stringify(c.arguments)}}));const p=m.filter(c=>c.thoughtSignature).map(c=>{try{return JSON.parse(c.thoughtSignature)}catch{return null}}).filter(Boolean);p.length>0&&(f.reasoning_details=p)}const T=f.content;if(!(T!=null&&T.length>0)&&!f.tool_calls)continue;i.push(f)}else if(g.role==="toolResult"){const f=[];let n=a;for(;n<r.length&&r[n].role==="toolResult";n++){const d=r[n],y=d.content.filter(A=>A.type==="text").map(A=>A.text).join(`
6
+ `),R=d.content.some(A=>A.type==="image"),m=y.length>0,T={role:"tool",content:S(m?y:"(see attached image)"),tool_call_id:d.toolCallId};if(o.requiresToolResultName&&d.toolName&&(T.name=d.toolName),i.push(T),R&&t.input.includes("image"))for(const A of d.content)A.type==="image"&&f.push({type:"image_url",image_url:{url:`data:${A.mimeType};base64,${A.data}`}})}a=n-1,f.length>0?(o.requiresAssistantAfterToolResult&&i.push({role:"assistant",content:"I have processed the tool results."}),i.push({role:"user",content:[{type:"text",text:"Attached image(s) from tool result:"},...f]}),u="user"):u="toolResult";continue}u=g.role}return i}_(Z,"convertMessages");function V(t,e){return t.map(o=>({type:"function",function:{name:o.name,description:o.description,parameters:o.parameters,...e.supportsStrictMode!==!1&&{strict:!1}}}))}_(V,"convertTools");function X(t){if(t===null)return"stop";switch(t){case"stop":return"stop";case"length":return"length";case"function_call":case"tool_calls":return"toolUse";case"content_filter":return"error";default:{const e=t;throw new Error(`Unhandled stop reason: ${e}`)}}}_(X,"mapStopReason");function Q(t){const e=t.provider,o=t.baseUrl,i=e==="zai"||o.includes("api.z.ai"),s=e==="cerebras"||o.includes("cerebras.ai")||e==="xai"||o.includes("api.x.ai")||e==="mistral"||o.includes("mistral.ai")||o.includes("chutes.ai")||o.includes("deepseek.com")||i||e==="opencode"||o.includes("opencode.ai"),r=e==="mistral"||o.includes("mistral.ai")||o.includes("chutes.ai"),u=e==="xai"||o.includes("api.x.ai"),a=e==="groq"||o.includes("groq.com"),g=e==="mistral"||o.includes("mistral.ai"),f=a&&t.id==="qwen/qwen3-32b"?{minimal:"default",low:"default",medium:"default",high:"default",xhigh:"default"}:{};return{supportsStore:!s,supportsDeveloperRole:!s,supportsReasoningEffort:!u&&!i,reasoningEffortMap:f,supportsUsageInStreaming:!0,maxTokensField:r?"max_tokens":"max_completion_tokens",requiresToolResultName:g,requiresAssistantAfterToolResult:!1,requiresThinkingAsText:g,requiresMistralToolIds:g,thinkingFormat:i?"zai":"openai",openRouterRouting:{},vercelGatewayRouting:{},supportsStrictMode:!0}}_(Q,"detectCompat");function tt(t){const e=Q(t);return t.compat?{supportsStore:t.compat.supportsStore??e.supportsStore,supportsDeveloperRole:t.compat.supportsDeveloperRole??e.supportsDeveloperRole,supportsReasoningEffort:t.compat.supportsReasoningEffort??e.supportsReasoningEffort,reasoningEffortMap:t.compat.reasoningEffortMap??e.reasoningEffortMap,supportsUsageInStreaming:t.compat.supportsUsageInStreaming??e.supportsUsageInStreaming,maxTokensField:t.compat.maxTokensField??e.maxTokensField,requiresToolResultName:t.compat.requiresToolResultName??e.requiresToolResultName,requiresAssistantAfterToolResult:t.compat.requiresAssistantAfterToolResult??e.requiresAssistantAfterToolResult,requiresThinkingAsText:t.compat.requiresThinkingAsText??e.requiresThinkingAsText,requiresMistralToolIds:t.compat.requiresMistralToolIds??e.requiresMistralToolIds,thinkingFormat:t.compat.thinkingFormat??e.thinkingFormat,openRouterRouting:t.compat.openRouterRouting??{},vercelGatewayRouting:t.compat.vercelGatewayRouting??e.vercelGatewayRouting,supportsStrictMode:t.compat.supportsStrictMode??e.supportsStrictMode}:e}_(tt,"getCompat");export{Z as convertMessages,L as streamOpenAICompletions,gt as streamSimpleOpenAICompletions};
@@ -1 +1 @@
1
- var f=Object.defineProperty;var a=(e,s)=>f(e,"name",{value:s,configurable:!0});import d from"openai";import{getEnvApiKey as p}from"../env-api-keys.js";import{supportsXhigh as m}from"../models.js";import{AssistantMessageEventStream as l}from"../utils/event-stream.js";import{buildCopilotDynamicHeaders as h,hasCopilotVisionInput as g}from"./github-copilot-headers.js";import{convertResponsesMessages as v,convertResponsesTools as R,processResponsesStream as y}from"./openai-responses-shared.js";import{buildBaseOptions as E,clampReasoning as _}from"./simple-options.js";const A=new Set(["openai","openai-codex","opencode"]);function w(e){return e||(typeof process<"u"&&process.env.NANOPENCIL_CACHE_RETENTION==="long"?"long":"short")}a(w,"resolveCacheRetention");function I(e,s){if(s==="long"&&e.includes("api.openai.com"))return"24h"}a(I,"getPromptCacheRetention");const b=a((e,s,r)=>{const o=new l;return(async()=>{const t={role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const n=r?.apiKey||p(e.provider)||"",i=O(e,s,n,r?.headers),c=P(e,s,r);r?.onPayload?.(c);const u=await i.responses.create(c,r?.signal?{signal:r.signal}:void 0);if(o.push({type:"start",partial:t}),await y(u,t,o,e,{serviceTier:r?.serviceTier,applyServiceTierPricing:T}),r?.signal?.aborted)throw new Error("Request was aborted");if(t.stopReason==="aborted"||t.stopReason==="error")throw new Error("An unknown error occurred");o.push({type:"done",reason:t.stopReason,message:t}),o.end()}catch(n){for(const i of t.content)delete i.index;t.stopReason=r?.signal?.aborted?"aborted":"error",t.errorMessage=n instanceof Error?n.message:JSON.stringify(n),o.push({type:"error",reason:t.stopReason,error:t}),o.end()}})(),o},"streamOpenAIResponses"),D=a((e,s,r)=>{const o=r?.apiKey||p(e.provider);if(!o)throw new Error(`No API key for provider: ${e.provider}`);const t=E(e,r,o),n=m(e)?r?.reasoning:_(r?.reasoning);return b(e,s,{...t,reasoningEffort:n,toolChoice:r?.toolChoice})},"streamSimpleOpenAIResponses");function O(e,s,r,o){if(!r){if(!process.env.OPENAI_API_KEY)throw new Error("OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.");r=process.env.OPENAI_API_KEY}const t={...e.headers};if(e.provider==="github-copilot"){const n=g(s.messages),i=h({messages:s.messages,hasImages:n});Object.assign(t,i)}return o&&Object.assign(t,o),new d({apiKey:r,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:t})}a(O,"createClient");function P(e,s,r){const o=v(e,s,A),t=w(r?.cacheRetention),n={model:e.id,input:o,stream:!0,prompt_cache_key:t==="none"?void 0:r?.sessionId,prompt_cache_retention:I(e.baseUrl,t),store:!1};return r?.maxTokens&&(n.max_output_tokens=r?.maxTokens),r?.temperature!==void 0&&(n.temperature=r?.temperature),r?.serviceTier!==void 0&&(n.service_tier=r.serviceTier),s.tools&&(n.tools=R(s.tools)),r?.toolChoice!==void 0&&(n.tool_choice=r.toolChoice),e.reasoning&&(r?.reasoningEffort||r?.reasoningSummary?(n.reasoning={effort:r?.reasoningEffort||"medium",summary:r?.reasoningSummary||"auto"},n.include=["reasoning.encrypted_content"]):e.name.startsWith("gpt-5")&&o.push({role:"developer",content:[{type:"input_text",text:"# Juice: 0 !important"}]})),n}a(P,"buildParams");function C(e){switch(e){case"flex":return .5;case"priority":return 2;default:return 1}}a(C,"getServiceTierCostMultiplier");function T(e,s){const r=C(s);r!==1&&(e.cost.input*=r,e.cost.output*=r,e.cost.cacheRead*=r,e.cost.cacheWrite*=r,e.cost.total=e.cost.input+e.cost.output+e.cost.cacheRead+e.cost.cacheWrite)}a(T,"applyServiceTierPricing");export{b as streamOpenAIResponses,D as streamSimpleOpenAIResponses};
1
+ var f=Object.defineProperty;var i=(e,s)=>f(e,"name",{value:s,configurable:!0});import d from"openai";import{getEnvApiKey as u}from"../env-api-keys.js";import{supportsXhigh as m}from"../models.js";import{AssistantMessageEventStream as l}from"../utils/event-stream.js";import{buildCopilotDynamicHeaders as h,hasCopilotVisionInput as g}from"./github-copilot-headers.js";import{convertResponsesMessages as v,convertResponsesTools as y,processResponsesStream as R}from"./openai-responses-shared.js";import{buildBaseOptions as E,clampReasoning as b}from"./simple-options.js";const _=new Set(["openai","openai-codex","opencode"]);function w(e){return e||(typeof process<"u"&&process.env.NANOPENCIL_CACHE_RETENTION==="long"?"long":"short")}i(w,"resolveCacheRetention");function A(e,s){if(s==="long"&&e.includes("api.openai.com"))return"24h"}i(A,"getPromptCacheRetention");const I=i((e,s,r)=>{const o=new l;return(async()=>{const n={role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:Date.now()};try{const t=r?.apiKey||u(e.provider)||"",a=O(e,s,t,r?.headers),c=C(e,s,r);r?.onPayload?.(c);const p=await a.responses.create(c,r?.signal?{signal:r.signal}:void 0);if(o.push({type:"start",partial:n}),await R(p,n,o,e,{serviceTier:r?.serviceTier,applyServiceTierPricing:S}),r?.signal?.aborted)throw new Error("Request was aborted");if(n.stopReason==="aborted"||n.stopReason==="error")throw new Error("An unknown error occurred");o.push({type:"done",reason:n.stopReason,message:n}),o.end()}catch(t){for(const a of n.content)delete a.index;if(n.stopReason=r?.signal?.aborted?"aborted":"error",n.errorMessage=t instanceof Error?t.message:JSON.stringify(t),t&&typeof t=="object"&&"headers"in t){const a=t.headers;a&&typeof a=="object"&&(n.errorHeaders=Object.fromEntries(Object.entries(a).map(([c,p])=>[c.toLowerCase(),String(p)])))}o.push({type:"error",reason:n.stopReason,error:n}),o.end()}})(),o},"streamOpenAIResponses"),H=i((e,s,r)=>{const o=r?.apiKey||u(e.provider);if(!o)throw new Error(`No API key for provider: ${e.provider}`);const n=E(e,r,o),t=m(e)?r?.reasoning:b(r?.reasoning);return I(e,s,{...n,reasoningEffort:t,toolChoice:r?.toolChoice})},"streamSimpleOpenAIResponses");function O(e,s,r,o){if(!r){if(!process.env.OPENAI_API_KEY)throw new Error("OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass it as an argument.");r=process.env.OPENAI_API_KEY}const n={...e.headers};if(e.provider==="github-copilot"){const t=g(s.messages),a=h({messages:s.messages,hasImages:t});Object.assign(n,a)}return o&&Object.assign(n,o),new d({apiKey:r,baseURL:e.baseUrl,dangerouslyAllowBrowser:!0,defaultHeaders:n})}i(O,"createClient");function C(e,s,r){const o=v(e,s,_),n=w(r?.cacheRetention),t={model:e.id,input:o,stream:!0,prompt_cache_key:n==="none"?void 0:r?.sessionId,prompt_cache_retention:A(e.baseUrl,n),store:!1};return r?.maxTokens&&(t.max_output_tokens=r?.maxTokens),r?.temperature!==void 0&&(t.temperature=r?.temperature),r?.serviceTier!==void 0&&(t.service_tier=r.serviceTier),s.tools&&(t.tools=y(s.tools)),r?.toolChoice!==void 0&&(t.tool_choice=r.toolChoice),e.reasoning&&(r?.reasoningEffort||r?.reasoningSummary?(t.reasoning={effort:r?.reasoningEffort||"medium",summary:r?.reasoningSummary||"auto"},t.include=["reasoning.encrypted_content"]):e.name.startsWith("gpt-5")&&o.push({role:"developer",content:[{type:"input_text",text:"# Juice: 0 !important"}]})),t}i(C,"buildParams");function P(e){switch(e){case"flex":return .5;case"priority":return 2;default:return 1}}i(P,"getServiceTierCostMultiplier");function S(e,s){const r=P(s);r!==1&&(e.cost.input*=r,e.cost.output*=r,e.cost.cacheRead*=r,e.cost.cacheWrite*=r,e.cost.total=e.cost.input+e.cost.output+e.cost.cacheRead+e.cost.cacheWrite)}i(S,"applyServiceTierPricing");export{I as streamOpenAIResponses,H as streamSimpleOpenAIResponses};
@@ -1 +1 @@
1
- var v=Object.defineProperty;var o=(e,r)=>v(e,"name",{value:r,configurable:!0});import"./providers/register-builtins.js";import"./utils/http-proxy.js";import{ensureApiProvider as S}from"./api-registry.js";import{AssistantMessageEventStream as g}from"./utils/event-stream.js";import{isContextOverflow as x}from"./utils/overflow.js";import{getEnvApiKey as z}from"./env-api-keys.js";const h={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4,jitter:!0};function A(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}o(A,"emptyUsage");const T=new Set([429,500,502,503,504]),D=[/ECONNRESET/i,/ETIMEDOUT/i,/ECONNREFUSED/i,/socket hang up/i,/fetch failed/i,/network/i,/aborted/i,/without a final assistant message/i];function I(e){if(e.stopReason!=="error"||!e.errorMessage||x(e))return!1;const r=e.errorMessage,t=r.match(/^([45]\d\d)\b/);if(t){const n=parseInt(t[1],10);return T.has(n)}return D.some(n=>n.test(r))}o(I,"isRetriableStreamError");function R(e,r){const t=r.baseDelayMs*Math.pow(2,e),n=Math.min(t,r.maxDelayMs);return r.jitter?Math.floor(Math.random()*n):n}o(R,"calculateDelay");function P(e){const r=e.match(/retry[_-]after[:\s]+(\d+)/i);if(r)return parseInt(r[1],10)*1e3}o(P,"extractRetryAfterMs");function m(e,r,t){if(!(r>=t.maxRetries||!I(e)))return/^429\b/.test(e.errorMessage??"")?P(e.errorMessage??"")??R(r,t):R(r,t)}o(m,"getRetryDelayMs");function N(e){return e instanceof Error?e.message:typeof e=="string"?e:JSON.stringify(e)??String(e)}o(N,"getErrorMessage");function y(e,r){return{role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,stopReason:"error",errorMessage:N(r),usage:A(),timestamp:Date.now()}}o(y,"createStreamErrorMessage");function k(e){return y(e,new Error("Provider stream ended without a final assistant message"))}o(k,"createMissingStreamResultMessage");function L(e){return y(e,new Error("Request was aborted"))}o(L,"createAbortMessage");function d(e,r){e.push({type:"error",reason:"error",error:L(r)})}o(d,"emitAbortError");function l(e,r){return r?.aborted?Promise.resolve("aborted"):new Promise(t=>{let n;const a=o(()=>{n!==void 0&&clearTimeout(n),r?.removeEventListener("abort",i)},"cleanup"),i=o(()=>{a(),t("aborted")},"onAbort");n=setTimeout(()=>{a(),t("elapsed")},e),r?.addEventListener("abort",i,{once:!0})})}o(l,"waitForRetryDelay");function _(e,r){return r?.aborted?Promise.resolve("aborted"):new Promise((t,n)=>{const a=o(()=>{r?.removeEventListener("abort",i)},"cleanup"),i=o(()=>{a(),t("aborted")},"onAbort");r?.addEventListener("abort",i,{once:!0}),e.next().then(f=>{a(),t(f)},f=>{a(),n(f)})})}o(_,"waitForStreamEvent");async function M(e){const r=await S(e);if(!r)throw new Error(`No API provider registered for api: ${e}`);return r}o(M,"resolveApiProvider");function C(e,r,t){const n={...h,...t?.retry};return w(e,async()=>(await M(e.api)).stream(e,r,t),n,t?.signal)}o(C,"stream");async function J(e,r,t){return C(e,r,t).result()}o(J,"complete");function O(e,r,t){const n={...h,...t?.retry};return w(e,async()=>(await M(e.api)).streamSimple(e,r,t),n,t?.signal)}o(O,"streamSimple");async function K(e,r,t){return O(e,r,t).result()}o(K,"completeSimple");function w(e,r,t,n){const a=new g;return(async()=>{let i=0;for(;i<=t.maxRetries;){if(n?.aborted){d(a,e);return}let f;try{f=await r()}catch(c){const u=y(e,c),p=m(u,i,t);if(p!==void 0){if(i++,await l(p,n)==="aborted"){d(a,e);return}continue}a.push({type:"error",reason:"error",error:u});return}let s=null;const b=f[Symbol.asyncIterator]();for(;;){let c;try{c=await _(b,n)}catch(p){s=y(e,p);const E=m(s,i,t);if(E!==void 0){if(i++,await l(E,n)==="aborted"){d(a,e);return}break}a.push({type:"error",reason:"error",error:s});return}if(c==="aborted"){b.return?.(),d(a,e);return}if(c.done)break;const u=c.value;if(u.type==="done"){s=u.message,a.push(u);break}else if(u.type==="error"){s=u.error;const p=m(s,i,t);if(p!==void 0){if(i++,await l(p,n)==="aborted"){d(a,e);return}break}a.push(u);return}else i===0&&a.push(u)}if(!s){s=f.resultIfResolved()??k(e);const c=m(s,i,t);if(c!==void 0){if(i++,await l(c,n)==="aborted"){d(a,e);return}continue}if(s.stopReason==="error"||s.stopReason==="aborted"){a.push({type:"error",reason:s.stopReason,error:s});return}a.push({type:"done",reason:s.stopReason,message:s});return}if(s&&s.stopReason!=="error")return}})(),a}o(w,"wrapWithRetry");export{J as complete,K as completeSimple,z as getEnvApiKey,C as stream,O as streamSimple};
1
+ var D=Object.defineProperty;var o=(e,t)=>D(e,"name",{value:t,configurable:!0});import"./providers/register-builtins.js";import"./utils/http-proxy.js";import{ensureApiProvider as g}from"./api-registry.js";import{AssistantMessageEventStream as A}from"./utils/event-stream.js";import{isContextOverflow as I}from"./utils/overflow.js";import{getEnvApiKey as H}from"./env-api-keys.js";const v={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4,jitter:!0,persistentRetry:!1,heartbeatMs:3e4};function E(){return{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}}}o(E,"emptyUsage");const T=new Set([429,500,502,503,504,529]),N=[/ECONNRESET/i,/ETIMEDOUT/i,/ECONNREFUSED/i,/socket hang up/i,/fetch failed/i,/network/i,/aborted/i,/without a final assistant message/i];function P(e){if(e.stopReason!=="error"||!e.errorMessage||I(e))return!1;const t=e.errorMessage,r=t.match(/^([45]\d\d)\b/);if(r){const n=parseInt(r[1],10);return T.has(n)}return N.some(n=>n.test(t))}o(P,"isRetriableStreamError");function m(e,t){const r=t.baseDelayMs*Math.pow(2,e),n=Math.min(r,t.maxDelayMs);return t.jitter?Math.floor(Math.random()*n):n}o(m,"calculateDelay");function w(e,t){if(t){const n=t["retry-after"]??t["Retry-After"];if(n){const a=parseInt(n,10);if(!isNaN(a))return a*1e3}}const r=e.match(/retry[_-]after[:\s]+(\d+)/i);if(r)return parseInt(r[1],10)*1e3}o(w,"extractRetryAfterMs");function _(e){return/^[45]29\b/.test(e.errorMessage??"")}o(_,"isOverloadError");function h(e,t,r){if(!P(e))return;const n=_(e);if(n&&r.persistentRetry){const a={...r,maxDelayMs:Math.max(r.maxDelayMs,3e5)};return w(e.errorMessage??"",e.errorHeaders)??m(t,a)}if(!(t>=r.maxRetries))return n?w(e.errorMessage??"",e.errorHeaders)??m(t,r):m(t,r)}o(h,"getRetryDelayMs");function k(e){return e instanceof Error?e.message:typeof e=="string"?e:JSON.stringify(e)??String(e)}o(k,"getErrorMessage");function R(e,t,r){return{role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,stopReason:"error",errorMessage:k(t),errorHeaders:r,usage:E(),timestamp:Date.now()}}o(R,"createStreamErrorMessage");function L(e){return R(e,new Error("Provider stream ended without a final assistant message"))}o(L,"createMissingStreamResultMessage");function C(e){return R(e,new Error("Request was aborted"))}o(C,"createAbortMessage");function l(e,t){e.push({type:"error",reason:"error",error:C(t)})}o(l,"emitAbortError");function b(e,t,r,n){return t?.aborted?Promise.resolve("aborted"):new Promise(a=>{let i,u;const p=o(()=>{i!==void 0&&clearTimeout(i),u!==void 0&&clearInterval(u),t?.removeEventListener("abort",s)},"cleanup"),s=o(()=>{p(),a("aborted")},"onAbort");r&&r>0&&r<e&&n&&(u=setInterval(n,r)),i=setTimeout(()=>{p(),a("elapsed")},e),t?.addEventListener("abort",s,{once:!0})})}o(b,"waitForRetryDelay");function U(e,t){return t?.aborted?Promise.resolve("aborted"):new Promise((r,n)=>{const a=o(()=>{t?.removeEventListener("abort",i)},"cleanup"),i=o(()=>{a(),r("aborted")},"onAbort");t?.addEventListener("abort",i,{once:!0}),e.next().then(u=>{a(),r(u)},u=>{a(),n(u)})})}o(U,"waitForStreamEvent");async function S(e){const t=await g(e);if(!t)throw new Error(`No API provider registered for api: ${e}`);return t}o(S,"resolveApiProvider");function F(e,t,r){const n={...v,...r?.retry};return x(e,async()=>(await S(e.api)).stream(e,t,r),n,r?.signal)}o(F,"stream");async function Y(e,t,r){return F(e,t,r).result()}o(Y,"complete");function W(e,t,r){const n={...v,...r?.retry};return x(e,async()=>(await S(e.api)).streamSimple(e,t,r),n,r?.signal)}o(W,"streamSimple");async function $(e,t,r){return W(e,t,r).result()}o($,"completeSimple");function x(e,t,r,n){const a=new A;return(async()=>{let i=0;const u=r.persistentRetry?()=>{a.push({type:"text_delta",contentIndex:0,delta:"",partial:{role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,usage:E(),stopReason:"error",timestamp:Date.now()}})}:void 0;for(;i<=r.maxRetries||r.persistentRetry;){if(n?.aborted){l(a,e);return}let p;try{p=await t()}catch(f){const c=R(e,f),d=h(c,i,r);if(d!==void 0){if(i++,await b(d,n,r.heartbeatMs,u)==="aborted"){l(a,e);return}continue}a.push({type:"error",reason:"error",error:c});return}let s=null;const y=p[Symbol.asyncIterator]();for(;;){let f;try{f=await U(y,n)}catch(d){s=R(e,d);const M=h(s,i,r);if(M!==void 0){if(i++,await b(M,n,r.heartbeatMs,u)==="aborted"){l(a,e);return}break}a.push({type:"error",reason:"error",error:s});return}if(f==="aborted"){y.return?.(),l(a,e);return}if(f.done)break;const c=f.value;if(c.type==="done"){s=c.message,a.push(c);break}else if(c.type==="error"){s=c.error;const d=h(s,i,r);if(d!==void 0){if(i++,await b(d,n,r.heartbeatMs,u)==="aborted"){l(a,e);return}break}a.push(c);return}else i===0&&a.push(c)}if(!s){s=p.resultIfResolved()??L(e);const f=h(s,i,r);if(f!==void 0){if(i++,await b(f,n,r.heartbeatMs,u)==="aborted"){l(a,e);return}continue}if(s.stopReason==="error"||s.stopReason==="aborted"){a.push({type:"error",reason:s.stopReason,error:s});return}a.push({type:"done",reason:s.stopReason,message:s});return}if(s&&s.stopReason!=="error")return}})(),a}o(x,"wrapWithRetry");export{Y as complete,$ as completeSimple,H as getEnvApiKey,F as stream,W as streamSimple};
@@ -0,0 +1,33 @@
1
+ /**
2
+ * [WHO]: Provides ExtensionCommand, ArgumentCompletionContext, CommandCompletionItem
3
+ * [FROM]: No dependencies — context is generic so lifecycle/host can supply their own context type
4
+ * [TO]: Consumed by extensions registering slash commands and by the host command registry
5
+ * [HERE]: packages/protocol/src/commands.ts - stable command registration contract
6
+ *
7
+ * Host note: the host may pass a richer command context to handlers, but the protocol
8
+ * contract stays minimal so published packages and third-party extensions do not depend
9
+ * on host-only session controls.
10
+ */
11
+ /** Structured context supplied while completing command arguments. */
12
+ export interface ArgumentCompletionContext {
13
+ commandName: string;
14
+ argumentText: string;
15
+ argumentPrefix: string;
16
+ tokenIndex: number;
17
+ previousTokens: string[];
18
+ }
19
+ /** A single command-completion candidate. */
20
+ export interface CommandCompletionItem {
21
+ value: string;
22
+ label: string;
23
+ description?: string;
24
+ }
25
+ /** A slash command an extension registers via `api.registerCommand(...)`. */
26
+ export interface ExtensionCommand<TContext = unknown> {
27
+ /** Help text shown in command lists. */
28
+ description?: string;
29
+ /** Optional argument-completion provider. */
30
+ getArgumentCompletions?: (argumentPrefix: string, context?: ArgumentCompletionContext) => CommandCompletionItem[] | null;
31
+ /** Command body. `args` is the raw argument string (may be empty). */
32
+ handler: (args: string, ctx: TContext) => void | Promise<void>;
33
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * [WHO]: Provides ExtensionFlag, ExtensionFlagOptions, ExtensionFlagValue
3
+ * [FROM]: No dependencies — flags are portable extension metadata
4
+ * [TO]: Consumed by protocol ExtensionAPI and the host extension loader/runner
5
+ * [HERE]: packages/protocol/src/flags.ts - stable CLI/config flag declaration contract
6
+ */
7
+ /** Supported values for extension-declared flags. */
8
+ export type ExtensionFlagValue = boolean | string;
9
+ /** Options an extension passes to `api.registerFlag(...)`. */
10
+ export interface ExtensionFlagOptions {
11
+ description?: string;
12
+ type: "boolean" | "string";
13
+ default?: ExtensionFlagValue;
14
+ }
15
+ /** A runtime flag an extension declares (parsed from CLI/config by the host). */
16
+ export interface ExtensionFlag extends ExtensionFlagOptions {
17
+ name: string;
18
+ /** Absolute path of the declaring extension (filled by the host loader). */
19
+ extensionPath: string;
20
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * [WHO]: Provides HookEventName and HookHandler — public lifecycle hook vocabulary
3
+ * [FROM]: No dependencies — context is generic so lifecycle/host can supply their own context type
4
+ * [TO]: Consumed by protocol ExtensionAPI and host extension event overloads
5
+ * [HERE]: packages/protocol/src/hooks.ts - stable hook-name contract without payload freezing
6
+ *
7
+ * Payload types intentionally stay out of protocol for now. The host keeps rich typed
8
+ * overloads; protocol only publishes the event-name vocabulary that external extensions
9
+ * may subscribe to.
10
+ */
11
+ /** Lifecycle hook names an extension may subscribe to via `api.on(...)`. */
12
+ export type HookEventName = "resources_discover" | "session_start" | "session_ready" | "session_before_switch" | "session_switch" | "session_before_fork" | "session_fork" | "session_before_compact" | "session_compact" | "session_shutdown" | "session_before_tree" | "session_tree" | "context" | "before_agent_start" | "agent_start" | "agent_result" | "agent_abort" | "agent_end" | "turn_start" | "turn_end" | "message_start" | "message_update" | "message_end" | "tool_execution_start" | "tool_execution_update" | "tool_execution_end" | "model_select" | "tool_call" | "tool_result" | "user_bash" | "input";
13
+ /**
14
+ * Hook callback. The event payload is intentionally `any` this round so host-agnostic
15
+ * extensions compile without per-event payload types; typed payloads remain host-owned.
16
+ */
17
+ export type HookHandler<TContext = unknown> = (event: any, ctx: TContext) => void | Promise<void>;
File without changes
@@ -1,12 +1,15 @@
1
1
  /**
2
- * [WHO]: Barrel for @pencil-agent/extension-sdk — the stable protocol surface for extensions
3
- * [FROM]: Re-exports the per-protocol modules (tools + lifecycle today; themes/hooks/commands/permissions in later P3 checkpoints)
2
+ * [WHO]: Barrel for @pencil-agent/protocol — the stable protocol surface for extensions
3
+ * [FROM]: Re-exports the per-protocol modules (tools + lifecycle + commands + hooks + flags today; themes/permissions in later P3 checkpoints)
4
4
  * [TO]: Consumed by third-party extensions, packages/mem-core, packages/soul-core, and the host (adopting these contracts)
5
- * [HERE]: packages/extension-sdk/src/index.ts - extension-sdk public entry
5
+ * [HERE]: packages/protocol/src/index.ts - protocol public entry
6
6
  *
7
7
  * Scope (this round / P3): tools (S1), lifecycle (ExtensionAPI/ExtensionContext/SessionManagerContract, S3),
8
- * then themes/hooks/commands/permissions. Explicitly NOT here (EVOLUTION-RESERVED): agent-profile,
8
+ * commands, hooks, flags, then themes/permissions. Explicitly NOT here (EVOLUTION-RESERVED): agent-profile,
9
9
  * host-adapter, tool-runtime, a2a-bridge, memory/soul providers — see evolution/PARP.md.
10
10
  */
11
11
  export * from "./tools.js";
12
12
  export * from "./lifecycle.js";
13
+ export * from "./commands.js";
14
+ export * from "./hooks.js";
15
+ export * from "./flags.js";
@@ -0,0 +1 @@
1
+ export*from"./tools.js";export*from"./lifecycle.js";export*from"./commands.js";export*from"./hooks.js";export*from"./flags.js";
@@ -1,16 +1,19 @@
1
1
  /**
2
- * [WHO]: Provides ExtensionAPI, ExtensionContext, ExtensionFactory, ExtensionUi, ExtensionCommand,
3
- * SessionManagerContract, HookEventName, HookHandler — the extension lifecycle protocol
4
- * [FROM]: No dependencies minimal structural protocol owned by extension-sdk (S3 dependency-inversion target)
2
+ * [WHO]: Provides ExtensionAPI, ExtensionContext, ExtensionFactory, ExtensionUi,
3
+ * SessionManagerContract — the extension lifecycle protocol
4
+ * [FROM]: Depends on ./commands, ./flags, ./hooks, and ./tools for registration contracts
5
5
  * [TO]: Consumed by packages/mem-core (extension adapter) and third-party extensions; the host's
6
6
  * richer ExtensionContext/ExtensionAPI satisfy these structurally (extensions load dynamically)
7
- * [HERE]: packages/extension-sdk/src/lifecycle.ts - the stable extension entry contract
7
+ * [HERE]: packages/protocol/src/lifecycle.ts - the stable extension entry contract
8
8
  *
9
- * Scope note: event payloads are intentionally loose (HookHandler's event is `unknown`) this round;
10
- * per-event typed payloads land in hooks.ts during P3.1. This file carries only the surface that
9
+ * Scope note: event payloads are intentionally loose (HookHandler's event is `any`) this round;
10
+ * per-event typed payloads remain host-owned. This file carries only the surface that
11
11
  * lets a host-agnostic extension (e.g. mem-core) compile against the SDK instead of the host package.
12
12
  */
13
13
  import type { TSchema } from "@sinclair/typebox";
14
+ import type { ExtensionCommand } from "./commands.js";
15
+ import type { ExtensionFlagOptions, ExtensionFlagValue } from "./flags.js";
16
+ import type { HookEventName, HookHandler } from "./hooks.js";
14
17
  import type { ToolContract } from "./tools.js";
15
18
  /** Read-only session info an extension may consult via `ctx.sessionManager`. */
16
19
  export interface SessionManagerContract {
@@ -41,31 +44,16 @@ export interface ExtensionContext {
41
44
  /** User-facing UI affordances. */
42
45
  ui: ExtensionUi;
43
46
  }
44
- /** Lifecycle hook names an extension may subscribe to via `api.on(...)`. */
45
- export type HookEventName = "session_start" | "session_ready" | "session_shutdown" | "before_agent_start" | "agent_start" | "agent_end" | "agent_result" | "turn_start" | "turn_end" | "tool_execution_start" | "tool_execution_end";
46
- /**
47
- * Hook callback. The event payload is intentionally `any` this round so host-agnostic
48
- * extensions compile without per-event payload types; typed payloads land in hooks.ts (P3.1).
49
- */
50
- export type HookHandler = (event: any, ctx: ExtensionContext) => void | Promise<void>;
51
- /** A slash command an extension registers via `api.registerCommand(...)`. */
52
- export interface ExtensionCommand {
53
- /** Help text shown in command lists. */
54
- description?: string;
55
- /** Optional argument-completion provider. */
56
- getArgumentCompletions?: (argumentPrefix: string) => Array<{
57
- value: string;
58
- label: string;
59
- }> | null;
60
- /** Command body. `args` is the raw argument string (may be empty/undefined). */
61
- handler: (args: string | undefined, ctx: ExtensionContext) => void | Promise<void>;
62
- }
63
47
  /** The registration surface a host passes to an extension factory. */
64
48
  export interface ExtensionAPI {
65
49
  /** Subscribe to a lifecycle hook. */
66
- on(event: HookEventName, handler: HookHandler): void;
50
+ on(event: HookEventName, handler: HookHandler<ExtensionContext>): void;
67
51
  /** Register a slash command. */
68
- registerCommand(name: string, command: ExtensionCommand): void;
52
+ registerCommand(name: string, command: ExtensionCommand<ExtensionContext>): void;
53
+ /** Register a CLI/config flag declared by this extension. */
54
+ registerFlag(name: string, options: ExtensionFlagOptions): void;
55
+ /** Get the value of a registered CLI/config flag. */
56
+ getFlag(name: string): ExtensionFlagValue | undefined;
69
57
  /** Register a model-facing tool. Generic so each call infers its own parameter schema. */
70
58
  registerTool<TParams extends TSchema = TSchema, TDetails = unknown>(tool: ToolContract<TParams, TDetails>): void;
71
59
  }
File without changes
@@ -2,7 +2,7 @@
2
2
  * [WHO]: Provides ToolRuntime, ToolPermissions, ToolRuntimeDescriptor (S1 seam) + ToolResult, ToolContract
3
3
  * [FROM]: Depends on @sinclair/typebox (schema) and ./lifecycle (ExtensionContext, type-only)
4
4
  * [TO]: Consumed by the host ToolDefinition (adopts the S1 fields) and by extensions registering tools
5
- * [HERE]: packages/extension-sdk/src/tools.ts - tool runtime seam (S1) + the stable tool contract
5
+ * [HERE]: packages/protocol/src/tools.ts - tool runtime seam (S1) + the stable tool contract
6
6
  *
7
7
  * S1 seam (refactor-plan §接缝预留): a tool may optionally declare its execution runtime and
8
8
  * permission needs. Omitting both keeps today's behavior (local, host-policy). The host
File without changes
@@ -0,0 +1,12 @@
1
+ /**
2
+ * [WHO]: Public config subpath exports for auth, settings, resource, and package managers
3
+ * [FROM]: Re-exports selected core/platform config and package-manager modules
4
+ * [TO]: Consumed by advanced SDK users importing @pencil-agent/nano-pencil/config
5
+ * [HERE]: public-config.ts - package subpath entry for configuration APIs
6
+ */
7
+ export { type ApiKeyCredential, type AuthCredential, AuthStorage, type AuthStorageBackend, FileAuthStorageBackend, InMemoryAuthStorageBackend, type OAuthCredential, } from "./core/platform/config/auth-storage.js";
8
+ export { type CompactionSettings, type ImageSettings, type PackageSource, type RetrySettings, SettingsManager, } from "./core/platform/config/settings-manager.js";
9
+ export type { ResourceCollision, ResourceDiagnostic, ResourceLoader } from "./core/platform/config/resource-loader.js";
10
+ export { DefaultResourceLoader } from "./core/platform/config/resource-loader.js";
11
+ export type { PackageManager, PathMetadata, ProgressCallback, ProgressEvent, ResolvedPaths, ResolvedResource, } from "./core/package-manager.js";
12
+ export { DefaultPackageManager } from "./core/package-manager.js";
@@ -0,0 +1 @@
1
+ import{AuthStorage as a,FileAuthStorageBackend as o,InMemoryAuthStorageBackend as t}from"./core/platform/config/auth-storage.js";import{SettingsManager as f}from"./core/platform/config/settings-manager.js";import{DefaultResourceLoader as u}from"./core/platform/config/resource-loader.js";import{DefaultPackageManager as c}from"./core/package-manager.js";export{a as AuthStorage,c as DefaultPackageManager,u as DefaultResourceLoader,o as FileAuthStorageBackend,t as InMemoryAuthStorageBackend,f as SettingsManager};
@@ -0,0 +1,9 @@
1
+ /**
2
+ * [WHO]: Public runtime subpath exports for advanced AgentSession embedding
3
+ * [FROM]: Re-exports selected runtime/message modules
4
+ * [TO]: Consumed by advanced SDK users importing @pencil-agent/nano-pencil/runtime
5
+ * [HERE]: runtime.ts - package subpath entry for runtime APIs
6
+ */
7
+ export { AgentSession, type AgentSessionConfig, type AgentSessionEvent, type AgentSessionEventListener, type ModelCycleResult, type ParsedSkillBlock, parseSkillBlock, type PromptOptions, type SessionStats, } from "./core/runtime/agent-session.js";
8
+ export { createEventBus, type EventBus, type EventBusController } from "./core/runtime/event-bus.js";
9
+ export { convertToLlm } from "./core/messages.js";
@@ -0,0 +1 @@
1
+ import{AgentSession as r,parseSkillBlock as t}from"./core/runtime/agent-session.js";import{createEventBus as m}from"./core/runtime/event-bus.js";import{convertToLlm as p}from"./core/messages.js";export{r as AgentSession,p as convertToLlm,m as createEventBus,t as parseSkillBlock};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * [WHO]: Public session/compaction subpath exports for context compaction helpers
3
+ * [FROM]: Re-exports core/session/compaction/index.js
4
+ * [TO]: Consumed by advanced SDK users importing @pencil-agent/nano-pencil/session/compaction
5
+ * [HERE]: session-compaction.ts - package subpath entry for compaction APIs
6
+ */
7
+ export * from "./core/session/compaction/index.js";
@@ -0,0 +1 @@
1
+ export*from"./core/session/compaction/index.js";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * [WHO]: Public session subpath exports for session persistence and entry types
3
+ * [FROM]: Re-exports core/session/session-manager.js
4
+ * [TO]: Consumed by advanced SDK users importing @pencil-agent/nano-pencil/session
5
+ * [HERE]: session.ts - package subpath entry for session APIs
6
+ */
7
+ export { type BranchSummaryEntry, buildSessionContext, type CompactionEntry, CURRENT_SESSION_VERSION, type CustomEntry, type CustomMessageEntry, type FileEntry, getLatestCompactionEntry, type ModelChangeEntry, migrateSessionEntries, type NewSessionOptions, parseSessionEntries, type SessionContext, type SessionEntry, type SessionEntryBase, type SessionHeader, type SessionInfo, type SessionInfoEntry, SessionManager, type SessionMessageEntry, type ThinkingLevelChangeEntry, } from "./core/session/session-manager.js";
@@ -0,0 +1 @@
1
+ import{buildSessionContext as t,CURRENT_SESSION_VERSION as n,getLatestCompactionEntry as i,migrateSessionEntries as o,parseSessionEntries as r,SessionManager as S}from"./core/session/session-manager.js";export{n as CURRENT_SESSION_VERSION,S as SessionManager,t as buildSessionContext,i as getLatestCompactionEntry,o as migrateSessionEntries,r as parseSessionEntries};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * [WHO]: Public skills subpath exports for skill discovery and prompt formatting
3
+ * [FROM]: Re-exports core/skills.js
4
+ * [TO]: Consumed by advanced SDK users importing @pencil-agent/nano-pencil/skills
5
+ * [HERE]: skills.ts - package subpath entry for skill APIs
6
+ */
7
+ export { formatSkillsForPrompt, type LoadSkillsFromDirOptions, type LoadSkillsResult, loadSkills, loadSkillsFromDir, type Skill, type SkillFrontmatter, } from "./core/skills.js";
package/dist/skills.js ADDED
@@ -0,0 +1 @@
1
+ import{formatSkillsForPrompt as r,loadSkills as i,loadSkillsFromDir as m}from"./core/skills.js";export{r as formatSkillsForPrompt,i as loadSkills,m as loadSkillsFromDir};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * [WHO]: Public tools subpath exports for built-in tool implementations and types
3
+ * [FROM]: Re-exports core/tools/index.js
4
+ * [TO]: Consumed by advanced SDK users importing @pencil-agent/nano-pencil/tools
5
+ * [HERE]: tools.ts - package subpath entry for tool APIs
6
+ */
7
+ export * from "./core/tools/index.js";
package/dist/tools.js ADDED
@@ -0,0 +1 @@
1
+ export*from"./core/tools/index.js";