@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.
- package/README.md +267 -267
- package/dist/build-meta.json +3 -3
- package/dist/core/export-html/AGENT.md +11 -11
- package/dist/core/export-html/template.css +971 -971
- package/dist/core/export-html/template.html +54 -54
- package/dist/core/extensions-host/index.d.ts +1 -1
- package/dist/core/extensions-host/loader.js +1 -1
- package/dist/core/extensions-host/runner.d.ts +1 -0
- package/dist/core/extensions-host/runner.js +2 -2
- package/dist/core/extensions-host/types.d.ts +17 -22
- package/dist/core/lib/ai/src/types.d.ts +12 -2
- package/dist/core/persona/persona-manager.js +5 -2
- package/dist/core/runtime/agent-session.js +3 -3
- package/dist/core/runtime/extension-core-bindings.d.ts +1 -0
- package/dist/core/runtime/extension-core-bindings.js +2 -2
- package/dist/extensions/builtin/AGENT.md +115 -115
- package/dist/extensions/builtin/browser/AGENT.md +17 -17
- package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
- package/dist/extensions/builtin/browser/browser.md +73 -73
- package/dist/extensions/builtin/browser/install.md +142 -142
- package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
- package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
- package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
- package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
- package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
- package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
- package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
- package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
- package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
- package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
- package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
- package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
- package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
- package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
- package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
- package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
- package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
- package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
- package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
- package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
- package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
- package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
- package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
- package/dist/extensions/builtin/goal/README.md +67 -67
- package/dist/extensions/builtin/goal/goal-controller.d.ts +39 -10
- package/dist/extensions/builtin/goal/goal-controller.js +1 -1
- package/dist/extensions/builtin/goal/goal-format.js +1 -1
- package/dist/extensions/builtin/goal/goal-prompts.d.ts +2 -0
- package/dist/extensions/builtin/goal/goal-prompts.js +5 -4
- package/dist/extensions/builtin/goal/goal-store.js +1 -1
- package/dist/extensions/builtin/goal/index.d.ts +1 -1
- package/dist/extensions/builtin/goal/index.js +10 -7
- package/dist/extensions/builtin/grub/README.md +112 -112
- package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
- package/dist/extensions/builtin/link-world/index.js +6 -6
- package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
- package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
- package/dist/extensions/builtin/link-world/linkworld.md +313 -313
- package/dist/extensions/builtin/link-world/{network-routing.md → network-routing/network-routing.md} +67 -67
- package/dist/extensions/builtin/loop/README.md +92 -92
- package/dist/extensions/builtin/mcp/figma-design.md +68 -68
- package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
- package/dist/extensions/builtin/plan/index.js +1 -1
- package/dist/extensions/builtin/recap/AGENT.md +15 -15
- package/dist/extensions/builtin/sal/README.md +72 -72
- package/dist/extensions/builtin/security-audit/README.md +289 -289
- package/dist/extensions/builtin/task/task-store.d.ts +4 -0
- package/dist/extensions/builtin/task/task-store.js +1 -1
- package/dist/extensions/builtin/team/AGENT.md +112 -112
- package/dist/extensions/builtin/team/TESTING.md +299 -299
- package/dist/extensions/builtin/token-save/README.md +56 -56
- package/dist/extensions/optional/AGENT.md +10 -10
- package/dist/index.d.ts +5 -30
- package/dist/index.js +1 -1
- package/dist/models.d.ts +7 -0
- package/dist/models.js +1 -0
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/task-status-panel.d.ts +36 -0
- package/dist/modes/interactive/components/task-status-panel.js +1 -0
- package/dist/modes/interactive/controllers/stream-render-controller.d.ts +7 -0
- package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
- package/dist/modes/interactive/interactive-mode.js +40 -40
- package/dist/modes/interactive/state/interactive-state.d.ts +2 -0
- package/dist/modes/interactive/state/interactive-state.js +1 -1
- package/dist/modes/interactive/theme/dark.json +85 -85
- package/dist/modes/interactive/theme/light.json +84 -84
- package/dist/modes/interactive/theme/theme-schema.json +335 -335
- package/dist/modes/interactive/theme/warm.json +81 -81
- package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
- package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
- package/dist/node_modules/@pencil-agent/ai/dist/providers/anthropic.js +2 -2
- package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-completions.js +5 -5
- package/dist/node_modules/@pencil-agent/ai/dist/providers/openai-responses.js +1 -1
- package/dist/node_modules/@pencil-agent/ai/dist/stream.js +1 -1
- package/dist/packages/protocol/src/commands.d.ts +33 -0
- package/dist/packages/protocol/src/flags.d.ts +20 -0
- package/dist/packages/protocol/src/hooks.d.ts +17 -0
- package/dist/packages/protocol/src/hooks.js +0 -0
- package/dist/packages/{extension-sdk → protocol}/src/index.d.ts +7 -4
- package/dist/packages/protocol/src/index.js +1 -0
- package/dist/packages/{extension-sdk → protocol}/src/lifecycle.d.ts +15 -27
- package/dist/packages/protocol/src/lifecycle.js +0 -0
- package/dist/packages/{extension-sdk → protocol}/src/tools.d.ts +1 -1
- package/dist/packages/protocol/src/tools.js +0 -0
- package/dist/public-config.d.ts +12 -0
- package/dist/public-config.js +1 -0
- package/dist/runtime.d.ts +9 -0
- package/dist/runtime.js +1 -0
- package/dist/session-compaction.d.ts +7 -0
- package/dist/session-compaction.js +1 -0
- package/dist/session.d.ts +7 -0
- package/dist/session.js +1 -0
- package/dist/skills.d.ts +7 -0
- package/dist/skills.js +1 -0
- package/dist/tools.d.ts +7 -0
- package/dist/tools.js +1 -0
- 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
- package/docs/SDK-TESTING.md +364 -0
- package/docs/codex-goal-command-impl.md +1055 -1055
- package/docs/codex-goal-vs-grub.md +500 -500
- package/docs/custom-provider.md +27 -27
- package/docs/extensions.md +27 -27
- package/docs/keybindings.md +27 -27
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
- 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
- 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
- package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
- package/docs/loop-usage-examples.md +214 -214
- package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
- package/docs/models.md +27 -27
- package/docs/packages.md +27 -27
- package/docs/pi-design-philosophy.md +457 -457
- package/docs/planmode.md +1987 -1987
- package/docs/prompt-templates.md +27 -27
- package/docs/providers.md +27 -27
- package/docs/sdk.md +27 -27
- package/docs/skills.md +27 -27
- package/docs/startup-performance-optimization.md +301 -0
- package/docs/themes.md +27 -27
- package/docs/tui.md +27 -27
- package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
- package/package.json +190 -162
- package/dist/packages/extension-sdk/src/index.js +0 -1
- package/docs/cc-agent-design.md +0 -1297
- package/docs/cc-tui-design.md +0 -1333
- package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
- /package/dist/packages/{extension-sdk/src/lifecycle.js → protocol/src/commands.js} +0 -0
- /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
|
|
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
|
|
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=
|
|
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
|
-
`),
|
|
5
|
-
`))}const m=g.content.filter(p=>p.type==="toolCall");if(m.length>0){
|
|
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"&&
|
|
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
|
|
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
|
|
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/
|
|
3
|
-
* [FROM]: Re-exports the per-protocol modules (tools + lifecycle today; themes/
|
|
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/
|
|
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/
|
|
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,
|
|
3
|
-
* SessionManagerContract
|
|
4
|
-
* [FROM]:
|
|
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/
|
|
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 `
|
|
10
|
-
* per-event typed payloads
|
|
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/
|
|
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";
|
package/dist/runtime.js
ADDED
|
@@ -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";
|
package/dist/session.js
ADDED
|
@@ -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};
|
package/dist/skills.d.ts
ADDED
|
@@ -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};
|
package/dist/tools.d.ts
ADDED
|
@@ -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";
|