@pen.dev/cli 0.3.3 → 0.3.5

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 (70) hide show
  1. package/README.md +13 -6
  2. package/dist/anthropic-messages-xcJLXjiT.mjs +40 -0
  3. package/dist/azure-openai-responses-CoA9_5_J.mjs +2 -0
  4. package/dist/dist-Dmu1Pp1Y.mjs +1580 -0
  5. package/dist/{dist-BY6vOcMF.mjs → dist-L3CkgNK3.mjs} +2 -2
  6. package/dist/{error-body-D2Mrqb4g.mjs → error-body-BBlqjbe7.mjs} +1 -1
  7. package/dist/google-generative-ai-CFHCNDEQ.mjs +2 -0
  8. package/dist/google-shared-DolBdAGX.mjs +318 -0
  9. package/dist/google-vertex-tT_ymu8S.mjs +2 -0
  10. package/dist/index.mjs +2 -2
  11. package/dist/lib-EA7A-_Pc.mjs +9 -0
  12. package/dist/mistral-conversations-CsN5eF3B.mjs +5 -0
  13. package/dist/models-BBd5zwn6.mjs +2 -0
  14. package/dist/node_modules/@highagency/pencil-wasm/package.json +1 -1
  15. package/dist/node_modules/@highagency/pencil-wasm/pencil.d.ts +3 -0
  16. package/dist/node_modules/@highagency/pencil-wasm/pencil.js +1 -1
  17. package/dist/node_modules/@highagency/pencil-wasm/pencil.wasm +0 -0
  18. package/dist/openai-CbFQ5q5I.mjs +18 -0
  19. package/dist/openai-codex-responses-BIh-ZL5a.mjs +8 -0
  20. package/dist/openai-completions-CLJSzdfY.mjs +6 -0
  21. package/dist/openai-responses-DKbl253t.mjs +2 -0
  22. package/dist/openai-responses-shared-Brqyk2bc.mjs +11 -0
  23. package/dist/{openrouter-images-BbBWg9zF.mjs → openrouter-images-C8mOFqx9.mjs} +1 -1
  24. package/dist/out/mcp-server-darwin-arm64 +0 -0
  25. package/dist/out/mcp-server-darwin-x64 +0 -0
  26. package/dist/out/mcp-server-linux-arm64 +0 -0
  27. package/dist/out/mcp-server-linux-x64 +0 -0
  28. package/dist/out/mcp-server-windows-arm64.exe +0 -0
  29. package/dist/out/mcp-server-windows-x64.exe +0 -0
  30. package/dist/out/skills/pen-dev/SKILL.md +204 -0
  31. package/dist/out/skills/pen-dev/execute.md +364 -0
  32. package/dist/out/skills/pen-dev/guide/code.md +198 -0
  33. package/dist/out/skills/pen-dev/guide/components.md +45 -0
  34. package/dist/out/skills/pen-dev/guide/design-system.md +556 -0
  35. package/dist/out/skills/pen-dev/guide/landing-page.md +31 -0
  36. package/dist/out/skills/pen-dev/guide/mobile-app.md +31 -0
  37. package/dist/out/skills/pen-dev/guide/slides.md +222 -0
  38. package/dist/out/skills/pen-dev/guide/table.md +37 -0
  39. package/dist/out/skills/pen-dev/guide/tailwind.md +328 -0
  40. package/dist/out/skills/pen-dev/guide/web-app.md +245 -0
  41. package/dist/out/skills/pen-dev/pen-schema.md +202 -0
  42. package/dist/out/skills/pen-dev/scripts-and-shaders.md +94 -0
  43. package/dist/{pi-messages-CSXUHkjV.mjs → pi-messages-CucvyzBS.mjs} +2 -2
  44. package/dist/transform-messages-1ulTEFY1.mjs +2 -0
  45. package/dist/typescript-D0uAMumm.mjs +6 -0
  46. package/package.json +3 -3
  47. package/dist/anthropic-messages-Bf-fvkNu.mjs +0 -40
  48. package/dist/azure-openai-responses-CzgVqECr.mjs +0 -2
  49. package/dist/completionchunk-BQtPqA8U.mjs +0 -28
  50. package/dist/dist-BEo0Z8Vf.mjs +0 -1558
  51. package/dist/google-generative-ai-DSOqI0LF.mjs +0 -2
  52. package/dist/google-shared-CetPT_Vt.mjs +0 -318
  53. package/dist/google-vertex-CPtOc5oU.mjs +0 -2
  54. package/dist/mistral-conversations-CUsdbDQ8.mjs +0 -10
  55. package/dist/models-CwK5xZH9.mjs +0 -2
  56. package/dist/openai-Brr_V-tF.mjs +0 -17
  57. package/dist/openai-codex-responses-Cb5pfH5S.mjs +0 -8
  58. package/dist/openai-completions-BvTlcCeP.mjs +0 -6
  59. package/dist/openai-responses-IuaLTEHh.mjs +0 -2
  60. package/dist/openai-responses-shared-D4d0NbBE.mjs +0 -11
  61. package/dist/otel-CaADOqYZ.mjs +0 -4
  62. package/dist/transform-messages-CSBQpmXO.mjs +0 -2
  63. /package/dist/{deferred-tools-D8j2Ra6f.mjs → deferred-tools-CozAnCQL.mjs} +0 -0
  64. /package/dist/{github-copilot-headers-DZOfokGy.mjs → github-copilot-headers-DCj7hJoC.mjs} +0 -0
  65. /package/dist/{hash-Kp92CI9R.mjs → hash-DNYCELl4.mjs} +0 -0
  66. /package/dist/{headers-BvGum5dc.mjs → headers-DlpC0ues.mjs} +0 -0
  67. /package/dist/{openai-prompt-cache-t4kk9puG.mjs → openai-prompt-cache-tVHrB8oW.mjs} +0 -0
  68. /package/dist/{photon_rs-BySSRmP5.mjs → photon_rs-o0nbTM4F.mjs} +0 -0
  69. /package/dist/{provider-retry-BM3ArvaW.mjs → provider-retry-GaV_ioT7.mjs} +0 -0
  70. /package/dist/{sanitize-unicode-CHjuq5rK.mjs → sanitize-unicode-D-15laVS.mjs} +0 -0
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import{a as e}from"./diagnostics-B0j2bfEp.mjs";import{n as t,t as n}from"./models-BBd5zwn6.mjs";import{n as r}from"./json-parse-BzRcyI3e.mjs";import{t as i}from"./headers-DlpC0ues.mjs";import{f as a,p as o,r as s,t as c,u as l}from"./transform-messages-1ulTEFY1.mjs";import{t as u}from"./sanitize-unicode-D-15laVS.mjs";import{t as d}from"./hash-DNYCELl4.mjs";const f=(t,n,r)=>{let i=new e;return(async()=>{let e=m(t);try{let a=r?.apiKey;if(!a)throw Error(`No API key for provider: ${t.provider}`);let o=h(),s=P(t,n,c(n.messages,t,e=>o(e)),r),l=await r?.onPayload?.(s,t);l!==void 0&&(s=l);let u=await b(t,s,a,r);if(i.push({type:`start`,partial:e}),await L(t,e,i,u),r?.signal?.aborted)throw Error(`Request was aborted`);if(e.stopReason===`pending`)throw Error(`Mistral stream ended without a finish reason`);if(e.stopReason===`aborted`||e.stopReason===`error`)throw Error(e.errorMessage||`An unknown error occurred`);i.push({type:`done`,reason:e.stopReason,message:e}),i.end()}catch(t){for(let t of e.content)delete t.partialArgs;e.stopReason=r?.signal?.aborted?`aborted`:`error`,e.errorMessage=_(t),i.push({type:`error`,reason:e.stopReason,error:e}),i.end()}})(),i},p=(e,n,r)=>{let i=r?.apiKey;if(!i)throw Error(`No API key for provider: ${e.provider}`);let a={...s(e,n,r,i),toolChoice:r?.toolChoice},o=r?.reasoning?t(e,r.reasoning):void 0,c=o===`off`?void 0:o,l=e.reasoning&&c!==void 0;return f(e,n,{...a,promptMode:l&&U(e)?`reasoning`:void 0,reasoningEffort:l&&H(e)?W(e,c):void 0})};function m(e){return{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:`pending`,timestamp:Date.now()}}function h(){let e=new Map,t=new Map;return n=>{let r=e.get(n);if(r)return r;let i=0;for(;;){let r=g(n,i),a=t.get(r);if(!a||a===n)return e.set(n,r),t.set(r,n),r;i++}}}function g(e,t){let n=e.replace(/[^a-zA-Z0-9]/g,``);if(t===0&&n.length===9)return n;let r=n||e;return d(t===0?r:`${r}:${t}`).replace(/[^a-zA-Z0-9]/g,``).slice(0,9)}function _(e){if(e instanceof Error){let t=e,n=typeof t.statusCode==`number`?t.statusCode:void 0,r=typeof t.body==`string`?t.body.trim():void 0;return n!==void 0&&r?`Mistral API error (${n}): ${v(r,4e3)}`:n===void 0?e.message:`Mistral API error (${n}): ${e.message}`}return y(e)}function v(e,t){return e.length<=t?e:`${e.slice(0,t)}... [truncated ${e.length-t} chars]`}function y(e){try{let t=JSON.stringify(e);return t===void 0?String(e):t}catch{return String(e)}}async function b(e,t,n,r){let a=new URL(e.baseUrl);a.pathname=`${a.pathname.replace(/\/+$/u,``)}/`;let o=new URL(`v1/chat/completions`,a),s=S(e,n,r),c=AbortSignal.timeout(r?.timeoutMs??6e4),l=r?.signal?AbortSignal.any([r.signal,c]):c,u=await(r?.fetch??globalThis.fetch)(o,{method:`POST`,headers:s,body:JSON.stringify(T(t)),signal:l});if(await r?.onResponse?.({status:u.status,headers:i(u.headers)},e),!u.ok){let e=await u.text();throw new x(u.status,e,u.statusText)}if(!u.body)throw Error(`Mistral response has no body`);return j(u.body,l)}var x=class extends Error{statusCode;body;constructor(e,t,n){super(n||`Request failed with status ${e}`),this.name=`MistralHttpError`,this.statusCode=e,this.body=t}};function S(e,t,n){let r=new Headers({"User-Agent":o(),accept:`text/event-stream`,authorization:`Bearer ${t}`,"content-type":`application/json`});C(r,e.headers),C(r,n?.headers);let i=w(e.headers,`x-affinity`)||w(n?.headers,`x-affinity`);return F(n)&&!i&&r.set(`x-affinity`,n.sessionId),r}function C(e,t){if(t)for(let[n,r]of Object.entries(t))r===null?e.delete(n):e.set(n,r)}function w(e,t){return!!e&&Object.keys(e).some(e=>e.toLowerCase()===t)}function T(e){let t={...e};for(let[e,n]of[[`topP`,`top_p`],[`maxTokens`,`max_tokens`],[`randomSeed`,`random_seed`],[`responseFormat`,`response_format`],[`toolChoice`,`tool_choice`],[`presencePenalty`,`presence_penalty`],[`frequencyPenalty`,`frequency_penalty`],[`parallelToolCalls`,`parallel_tool_calls`],[`reasoningEffort`,`reasoning_effort`],[`promptMode`,`prompt_mode`],[`promptCacheKey`,`prompt_cache_key`],[`safePrompt`,`safe_prompt`]])O(t,e,n);t.messages=e.messages.map(e=>E(e));let n=t.response_format;if(k(n)){let e={...n};O(e,`jsonSchema`,`json_schema`);let r=e.json_schema;if(k(r)){let t={...r};O(t,`schemaDefinition`,`schema`),e.json_schema=t}t.response_format=e}return t}function E(e){let t={...e};return O(t,`toolCalls`,`tool_calls`),O(t,`toolCallId`,`tool_call_id`),Array.isArray(e.content)&&(t.content=e.content.map(e=>D(e))),t}function D(e){let t={...e};for(let[e,n]of[[`imageUrl`,`image_url`],[`documentUrl`,`document_url`],[`documentName`,`document_name`],[`fileId`,`file_id`],[`referenceIds`,`reference_ids`],[`inputAudio`,`input_audio`]])O(t,e,n);return t}function O(e,t,n){t in e&&(e[n]=e[t],delete e[t])}function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const A=Symbol(`mistral-stream-done`);async function*j(e,t){let n=e.getReader(),r=new TextDecoder,i=``,a=()=>{n.cancel().catch(()=>{})};t.addEventListener(`abort`,a,{once:!0});try{for(;;){if(t.aborted)throw t.reason;let{done:e,value:a}=await n.read();if(t.aborted)throw t.reason;i+=e?r.decode():r.decode(a,{stream:!0});let o=M(i);for(;o;){let e=N(i.slice(0,o.index));if(i=i.slice(o.index+o.length),e===A)return;e&&(yield e),o=M(i)}if(e)break}if(i.trim()){let e=N(i);e!==A&&e&&(yield e)}}finally{t.removeEventListener(`abort`,a);try{await n.cancel()}catch{}try{n.releaseLock()}catch{}}}function M(e){let t=/\r\n\r\n|\r\n\r|\r\n\n|\r\r\n|\n\r\n|\r\r|\n\r|\n\n/u.exec(e);return t?.index===void 0?void 0:{index:t.index,length:t[0].length}}function N(e){let t=e.split(/\r\n|\r|\n/u).filter(e=>e.startsWith(`data:`)).map(e=>e.slice(5).trimStart()).join(`
3
+ `).trim();if(!t)return;if(t===`[DONE]`)return A;let n=JSON.parse(t);if(!k(n)||!Array.isArray(n.choices))throw Error(`Invalid Mistral streaming event`);return{data:n}}function P(e,t,n,r){let i={model:e.id,stream:!0,messages:B(n,e.input.includes(`image`))};return t.tools?.length&&(i.tools=R(t.tools)),r?.temperature!==void 0&&(i.temperature=r.temperature),r?.maxTokens!==void 0&&(i.maxTokens=r.maxTokens),r?.toolChoice&&(i.toolChoice=G(r.toolChoice)),r?.promptMode&&(i.promptMode=r.promptMode),r?.reasoningEffort&&(i.reasoningEffort=r.reasoningEffort),F(r)&&(i.promptCacheKey=r.sessionId),t.systemPrompt&&i.messages.unshift({role:`system`,content:u(t.systemPrompt)}),i}function F(e){return e?.cacheRetention!==`none`&&!!e?.sessionId}function I(e,t){let n=e,r=n.promptTokensDetails?.cachedTokens??n.prompt_tokens_details?.cached_tokens??n.promptTokenDetails?.cachedTokens??n.prompt_token_details?.cached_tokens??n.numCachedTokens??n.num_cached_tokens??0,i=typeof r==`number`&&Number.isFinite(r)?r:0;return Math.min(t,Math.max(0,i))}async function L(e,t,i,a){let o=null,s=t.content,c=()=>s.length-1,l=new Map,d=e=>{if(e){if(e.type===`text`){i.push({type:`text_end`,contentIndex:c(),content:e.text,partial:t});return}e.type===`thinking`&&i.push({type:`thinking_end`,contentIndex:c(),content:e.thinking,partial:t})}};for await(let s of a){let a=s.data;if(t.responseId||=a.id,a.usage){let r=a.usage.prompt_tokens||0,i=I(a.usage,r);t.usage.input=Math.max(0,r-i),t.usage.output=a.usage.completion_tokens||0,t.usage.cacheRead=i,t.usage.cacheWrite=0,t.usage.totalTokens=a.usage.total_tokens||t.usage.input+t.usage.output+t.usage.cacheRead+t.usage.cacheWrite,n(e,t.usage)}let f=a.choices[0];if(!f)continue;if(f.finish_reason){t.rawStopReason=f.finish_reason;let e=K(f.finish_reason);t.stopReason=e.stopReason,e.errorMessage&&(t.errorMessage=e.errorMessage)}let p=f.delta;if(p.content!==null&&p.content!==void 0){let e=typeof p.content==`string`?[p.content]:p.content;for(let n of e){if(typeof n==`string`){let e=u(n);(!o||o.type!==`text`)&&(d(o),o={type:`text`,text:``},t.content.push(o),i.push({type:`text_start`,contentIndex:c(),partial:t})),o.text+=e,i.push({type:`text_delta`,contentIndex:c(),delta:e,partial:t});continue}if(n.type===`thinking`){let e=u((n.thinking??[]).map(e=>e.text??``).filter(e=>e.length>0).join(``));if(!e)continue;(!o||o.type!==`thinking`)&&(d(o),o={type:`thinking`,thinking:``},t.content.push(o),i.push({type:`thinking_start`,contentIndex:c(),partial:t})),o.thinking+=e,i.push({type:`thinking_delta`,contentIndex:c(),delta:e,partial:t});continue}if(n.type===`text`){let e=u(n.text??``);(!o||o.type!==`text`)&&(d(o),o={type:`text`,text:``},t.content.push(o),i.push({type:`text_start`,contentIndex:c(),partial:t})),o.text+=e,i.push({type:`text_delta`,contentIndex:c(),delta:e,partial:t})}}}let m=p.tool_calls||[];for(let e of m){o&&=(d(o),null);let n=e.id&&e.id!==`null`?e.id:g(`toolcall:${e.index??0}`,0),a=`${n}:${e.index||0}`,s=l.get(a),c;if(s!==void 0){let e=t.content[s];e?.type===`toolCall`&&(c=e)}c||(c={type:`toolCall`,id:n,name:e.function.name,arguments:{},partialArgs:``},t.content.push(c),l.set(a,t.content.length-1),i.push({type:`toolcall_start`,contentIndex:t.content.length-1,partial:t}));let u=typeof e.function.arguments==`string`?e.function.arguments:JSON.stringify(e.function.arguments||{});c.partialArgs=(c.partialArgs||``)+u,c.arguments=r(c.partialArgs),i.push({type:`toolcall_delta`,contentIndex:l.get(a),delta:u,partial:t})}}d(o);for(let e of l.values()){let n=t.content[e];if(n.type!==`toolCall`)continue;let a=n;a.arguments=r(a.partialArgs),delete a.partialArgs,i.push({type:`toolcall_end`,contentIndex:e,toolCall:a,partial:t})}}function R(e){return e.map(e=>{let t=a(e,!0);return{type:`function`,function:{name:e.name,description:e.description,parameters:z(l(e,t)),strict:t??!1}}})}function z(e){if(Array.isArray(e))return e.map(e=>z(e));if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=z(r);return t}return e}function B(e,t){let n=[];for(let r of e){if(r.role===`user`){if(typeof r.content==`string`){n.push({role:`user`,content:u(r.content)});continue}let e=r.content.some(e=>e.type===`image`),i=r.content.filter(e=>e.type===`text`||t).map(e=>e.type===`text`?{type:`text`,text:u(e.text)}:{type:`image_url`,imageUrl:`data:${e.mimeType};base64,${e.data}`});if(i.length>0){n.push({role:`user`,content:i});continue}e&&!t&&n.push({role:`user`,content:`(image omitted: model does not support images)`});continue}if(r.role===`assistant`){let e=[],t=[];for(let n of r.content){if(n.type===`text`){n.text.trim().length>0&&e.push({type:`text`,text:u(n.text)});continue}if(n.type===`thinking`){n.thinking.trim().length>0&&e.push({type:`thinking`,thinking:[{type:`text`,text:u(n.thinking)}]});continue}t.push({id:n.id,type:`function`,function:{name:n.name,arguments:JSON.stringify(n.arguments||{})},index:0})}let i={role:`assistant`,prefix:!1};e.length>0&&(i.content=e),t.length>0&&(i.toolCalls=t),(e.length>0||t.length>0)&&n.push(i);continue}let e=[],i=V(r.content.filter(e=>e.type===`text`).map(e=>e.type===`text`?u(e.text):``).join(`
4
+ `),r.content.some(e=>e.type===`image`),t,r.isError);e.push({type:`text`,text:i});for(let n of r.content)t&&n.type===`image`&&e.push({type:`image_url`,imageUrl:`data:${n.mimeType};base64,${n.data}`});n.push({role:`tool`,toolCallId:r.toolCallId,name:r.toolName,content:e})}return n}function V(e,t,n,r){let i=e.trim(),a=r?`[tool error] `:``;return i.length>0?`${a}${i}${t&&!n?`
5
+ [tool image omitted: model does not support images]`:``}`:t?n?r?`[tool error] (see attached image)`:`(see attached image)`:r?`[tool error] (image omitted: model does not support images)`:`(image omitted: model does not support images)`:r?`[tool error] (no tool output)`:`(no tool output)`}function H(e){return e.id===`mistral-small-2603`||e.id===`mistral-small-latest`||e.id===`mistral-medium-3.5`}function U(e){return e.reasoning&&!H(e)}function W(e,t){return e.thinkingLevelMap?.[t]??`high`}function G(e){if(e)return e===`auto`||e===`none`||e===`any`||e===`required`?e:{type:`function`,function:{name:e.function.name}}}function K(e){if(e===null)return{stopReason:`stop`};switch(e){case`stop`:return{stopReason:`stop`};case`length`:case`model_length`:return{stopReason:`length`};case`tool_calls`:return{stopReason:`toolUse`};case`error`:return{stopReason:`error`,errorMessage:`Provider stopped with: error`};default:return{stopReason:`error`,errorMessage:`Provider stopped with: ${e}`}}}export{f as stream,p as streamSimple};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{a as e,i as t}from"./diagnostics-B0j2bfEp.mjs";function n(e,t){return{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:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}function r(e){return typeof e.result==`function`}async function i(e,t){for await(let n of t)e.push(n);e.end(r(t)?await t.result():void 0)}function a(t,r){let a=new e;return r().then(e=>i(a,e)).catch(e=>{let r=n(t,e);a.push({type:`error`,reason:`error`,error:r}),a.end(r)}),a}function o(e,t){let n={stream:(t,n,r)=>a(t,async()=>(await e()).stream(t,n,r)),streamSimple:(t,n,r)=>a(t,async()=>(await e()).streamSimple(t,n,r))};return t?.fetchDeferred&&(n.fetchDeferred=(t,n,r)=>a(t,async()=>{let i=await e();if(!i.fetchDeferred)throw Error(`API does not support deferred responses`);return i.fetchDeferred(t,n,r)})),t?.cancelDeferred&&(n.cancelDeferred=async(t,n,r)=>{let i=await e();if(!i.cancelDeferred)throw Error(`API cannot cancel deferred responses`);await i.cancelDeferred(t,n,r)}),n}var s=function(e,t){return typeof e==`string`&&/^\.\.?\//.test(e)?e.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(e,n,r,i,a){return n?t?`.jsx`:`.js`:r&&(!i||!a)?e:r+i+`.`+a.toLowerCase()+`js`}):e};const c=e=>import(s(e));function l(){return globalThis.process?.env}function u(){return{async env(e){let t=l()?.[e];return typeof t==`string`&&t.trim().length>0?t:void 0},async fileExists(e){try{let t=await c(`node:fs/promises`),n=e;return n.startsWith(`~`)&&(n=(await c(`node:os`)).homedir()+n.slice(1)),await t.access(n),!0}catch{return!1}}}}function d(e){if(e.reason!==void 0)return e.reason;let t=Error(`The operation was aborted`);return t.name=`AbortError`,t}function f(e){return e??new AbortController().signal}function p(e,t){return t.aborted?(e.catch(()=>{}),Promise.reject(d(t))):new Promise((n,r)=>{let i=!1,a=()=>t.removeEventListener(`abort`,o),o=()=>{i||(i=!0,a(),r(d(t)))};t.addEventListener(`abort`,o,{once:!0}),e.then(e=>{i||(i=!0,a(),n(e))},e=>{i||(i=!0,a(),r(e))}),t.aborted&&o()})}var m=class{credentials=new Map;chains=new Map;enqueue(e,t,n){let r=f(n?.signal),i=this.chains.get(e)??Promise.resolve(),a=(async()=>(await i.catch(()=>{}),r.throwIfAborted(),t()))(),o=a.catch(()=>{});return this.chains.set(e,o),o.then(()=>{this.chains.get(e)===o&&this.chains.delete(e)}),p(a,r)}async read(e,t){return t?.signal?.throwIfAborted(),this.credentials.get(e)}async list(e){return e?.signal?.throwIfAborted(),[...this.credentials].map(([e,t])=>({providerId:e,type:t.type}))}modify(e,t,n){return this.enqueue(e,async()=>{let r=this.credentials.get(e),i=await t(r);return n?.signal?.throwIfAborted(),i!==void 0&&this.credentials.set(e,i),i??r},n)}delete(e,t){return this.enqueue(e,async()=>{this.credentials.delete(e)},t)}},h=class extends Error{code;constructor(e,t,n){super(g(t,n?.cause),n),this.name=`ModelsError`,this.code=e}};function g(e,n){if(n==null)return e;let r=t(n).trim();return!r||e.includes(r)?e:`${e}: ${r}`}function _(e,t,n,r){let i=f(r?.signal);return p(v(e,t,n,r,i),i)}async function v(e,t,n,r,i){i.throwIfAborted();let a=r?.env?y(n,r.env):n;if(r?.apiKey!==void 0&&e.auth.apiKey)return x(a,e.auth.apiKey,e.id,{type:`api_key`,key:r.apiKey,env:r.env},i);let o=await S(t,e.id,i);if(o){if(o.type===`oauth`&&e.auth.oauth)return b(t,e.id,e.auth.oauth,o,i,r?.minOAuthValidityMs);if(o.type===`api_key`&&e.auth.apiKey){let t=r?.env?{...o,env:{...o.env,...r.env}}:o;return x(a,e.auth.apiKey,e.id,t,i)}return}return e.auth.apiKey?x(a,e.auth.apiKey,e.id,void 0,i):void 0}function y(e,t){return{env:async n=>t[n]||await e.env(n),fileExists:t=>e.fileExists(t)}}async function b(e,t,n,r,i,a){let o=Math.max(3e5,a??0),s=e=>Date.now()+o>=e.expires,c=r;if(s(c)){let r;try{r=await e.modify(t,async e=>{if(e?.type===`oauth`&&s(e))try{let t=AbortSignal.any([i,AbortSignal.timeout(15e3)]);return await n.refresh(e,t)}catch(e){throw new h(`oauth`,`OAuth refresh failed for ${t}`,{cause:e})}},{signal:i})}catch(e){throw e instanceof h?e:new h(`auth`,`Credential store modify failed for ${t}`,{cause:e})}if(r?.type!==`oauth`)return;if(c=r,a!==void 0&&s(c))throw new h(`oauth`,`OAuth refresh returned a token that expires too soon for ${t}`)}try{return{auth:await n.toAuth(c),source:`OAuth`}}catch(e){throw new h(`oauth`,`OAuth auth derivation failed for ${t}`,{cause:e})}}async function x(e,t,n,r,i){try{return await t.resolve({ctx:e,credential:r,signal:i})}catch(e){throw new h(`auth`,`API key auth failed for provider ${n}`,{cause:e})}}async function S(e,t,n){try{return await e.read(t,{signal:n})}catch(e){throw new h(`auth`,`Credential store read failed for ${t}`,{cause:e})}}var C=class{entries=new Map;async read(e,t){t?.signal?.throwIfAborted();let n=this.entries.get(e);return n?structuredClone(n):void 0}async write(e,t,n){n?.signal?.throwIfAborted(),this.entries.set(e,structuredClone(t))}async delete(e,t){t?.signal?.throwIfAborted(),this.entries.delete(e)}};function w(e,t){if(!e&&!t)return;let n={...e};for(let[e,r]of Object.entries(t??{})){let t=e.toLowerCase();for(let e of Object.keys(n))e.toLowerCase()===t&&delete n[e];n[e]=r}return n}var T=class{providers=new Map;credentials;modelsStore;authContext;refreshGenerations=new Map;refreshControllers=new Map;publicationChains=new Map;constructor(e){this.credentials=e?.credentials??new m,this.modelsStore=e?.modelsStore??new C,this.authContext=e?.authContext??u()}setProvider(e){this.supersedeProviderRefresh(e.id),this.providers.set(e.id,e)}deleteProvider(e){this.supersedeProviderRefresh(e),this.providers.delete(e)}clearProviders(){for(let e of new Set([...this.providers.keys(),...this.refreshControllers.keys()]))this.supersedeProviderRefresh(e);this.providers.clear()}getProviders(){return Array.from(this.providers.values())}getProvider(e){return this.providers.get(e)}getModels(e){if(e!==void 0){let t=this.providers.get(e);if(!t)return[];try{return t.getModels()}catch{return[]}}let t=[];for(let e of this.providers.values())try{t.push(...e.getModels())}catch{}return t}getModel(e,t){return this.getModels(e).find(e=>e.id===t)}supersedeProviderRefresh(e){let t=(this.refreshGenerations.get(e)??0)+1;this.refreshGenerations.set(e,t);let n=this.refreshControllers.get(e);return n&&(this.refreshControllers.delete(e),n.abort()),t}beginProviderRefresh(e){let t=this.supersedeProviderRefresh(e),n=new AbortController;return this.refreshControllers.set(e,n),{generation:t,controller:n}}publishProviderModels(e,t,n,r){let i=this.publicationChains.get(e)??Promise.resolve(),a=(async()=>(await i.catch(()=>{}),n.aborted||this.refreshGenerations.get(e)!==t||(r.persist===null?await this.modelsStore.delete(e,{signal:n}):r.persist!==void 0&&await this.modelsStore.write(e,structuredClone(r.persist),{signal:n}),n.aborted||this.refreshGenerations.get(e)!==t)?!1:(r.update?.(),!0)))(),o=a.catch(()=>{});return this.publicationChains.set(e,o),o.then(()=>{this.publicationChains.get(e)===o&&this.publicationChains.delete(e)}),p(a,n)}async runProviderRefreshPhase(e,t,n,r,i,a){let o=await this.modelsStore.read(e.id,{signal:a});await e.refreshModels({credential:t,stored:o?structuredClone(o):void 0,publish:t=>this.publishProviderModels(e.id,i,a,t),allowNetwork:n,force:n?r:void 0,signal:a})}async refresh(e={}){let t=e.allowNetwork??!0,n=f(e.signal),r=new Map;if(n.aborted)return{aborted:!0,errors:r};let i=e.providers?new Set(e.providers):void 0,a=Array.from(this.providers.values()).filter(e=>e.refreshModels!==void 0&&(!i||i.has(e.id))),o=Promise.all(a.map(async i=>{let{generation:a,controller:o}=this.beginProviderRefresh(i.id),s=AbortSignal.any([n,o.signal]),c=(async()=>{let n,r;try{n=await this.readCredential(i.id,s)}catch(e){r=e}if(await this.runProviderRefreshPhase(i,n,!1,void 0,a,s),r!==void 0)throw r;if(!t||s.aborted)return;let o=await this.resolveRefreshCredential(i,n,s);o&&await this.runProviderRefreshPhase(i,o,!0,e.force,a,s)})();try{await p(c,s)}catch(e){s.aborted||r.set(i.id,e instanceof Error?e:new h(`model_source`,`Model refresh failed for ${i.id}`,{cause:e}))}finally{this.refreshControllers.get(i.id)===o&&this.refreshControllers.delete(i.id)}}));try{await p(o,n)}catch(e){if(!n.aborted)throw e}return{aborted:n.aborted,errors:new Map(r)}}async resolveRefreshCredential(e,t,n){if(t?.type===`oauth`){let r=e.auth.oauth;if(!r)return;if(Date.now()<t.expires)return t;if(n.aborted)return;let i=await this.credentials.modify(e.id,async e=>{if(!(e?.type!==`oauth`||Date.now()<e.expires))return r.refresh(e,n)},{signal:n});return i?.type===`oauth`?i:void 0}let r=e.auth.apiKey;if(!r)return;let i=t?.type===`api_key`?t:void 0,a=await r.resolve({ctx:this.authContext,credential:i,signal:n});if(a)return{type:`api_key`,key:a.auth.apiKey,env:a.env}}async readCredential(e,t){try{return await this.credentials.read(e,{signal:t})}catch(t){throw new h(`auth`,`Credential store read failed for ${e}`,{cause:t})}}async checkProviderAuth(e,t,n){if(t?.type===`oauth`)return e.auth.oauth?{source:`OAuth`,type:`oauth`}:void 0;let r=e.auth.apiKey;if(!r)return;if(r.check)try{return await r.check({ctx:this.authContext,credential:t?.type===`api_key`?t:void 0,signal:n})}catch(t){throw new h(`auth`,`API key auth check failed for provider ${e.id}`,{cause:t})}let i=await _(e,this.credentials,this.authContext,{signal:n});return i?{source:i.source,type:`api_key`}:void 0}checkAuth(e,t){let n=f(t?.signal);return p((async()=>{n.throwIfAborted();let t=this.providers.get(e);if(t)return this.checkProviderAuth(t,await this.readCredential(e,n),n)})(),n)}getAvailable(e,t){let n=f(t?.signal);return p((async()=>{n.throwIfAborted();let t=e?[this.providers.get(e)].filter(e=>e!==void 0):this.getProviders();return(await Promise.all(t.map(async e=>{let t=await this.readCredential(e.id,n);return{provider:e,credential:t,auth:await this.checkProviderAuth(e,t,n)}}))).flatMap(({provider:e,credential:t,auth:n})=>{if(!n)return[];let r=e.getModels();return e.filterModels?.(r,t)??r})})(),n)}async getAuth(e,t){let n=f(t?.signal),r=typeof e==`string`?e:e.provider,i=this.providers.get(r);if(!i)return;let a=await _(i,this.credentials,this.authContext,{...t,signal:n});return!a||typeof e==`string`||!e.headers?a:{...a,auth:{...a.auth,headers:w(a.auth.headers,e.headers)}}}async login(e,t,n){let r=f(n.signal);r.throwIfAborted();let i=this.providers.get(e);if(!i)throw new h(`provider`,`Unknown provider: ${e}`);let a=t===`oauth`?i.auth.oauth:i.auth.apiKey;if(!a?.login)throw new h(`auth`,`${i.name} does not support ${t} login`);let o=await p(a.login({...n,signal:r}),r),s=!1,c,l=new Promise(e=>{c=e}),u=this.credentials.modify(e,async()=>(s=!0,c?.(),o),{signal:r});u.catch(()=>{});try{await new Promise((e,t)=>{let n=()=>{s||t(r.reason)};r.addEventListener(`abort`,n,{once:!0}),Promise.race([l,u]).then(()=>{r.removeEventListener(`abort`,n),e()},e=>{r.removeEventListener(`abort`,n),t(e)}),r.aborted&&n()}),await u}catch(t){throw r.throwIfAborted(),new h(`auth`,`Credential store modify failed for ${e}`,{cause:t})}return o}async logout(e,t){let n=f(t?.signal);n.throwIfAborted();try{await this.credentials.delete(e,{signal:n})}catch(t){throw n.throwIfAborted(),new h(`auth`,`Credential store delete failed for ${e}`,{cause:t})}}requireProvider(e){let t=this.providers.get(e.provider);if(!t)throw new h(`provider`,`Unknown provider: ${e.provider}`);return t}async applyAuth(e,t){this.requireProvider(e);let n=await this.getAuth(e,{apiKey:t?.apiKey,env:t?.env,signal:t?.signal});if(!n)throw new h(`auth`,`Provider is not configured: ${e.provider}`);let r=n.auth,i=t?.apiKey??r.apiKey,a=w(r.headers,t?.headers);t?.transformHeaders&&(a=await t.transformHeaders(a??{}));let o=n.env||t?.env?{...n.env??{},...t?.env??{}}:void 0,s=r.baseUrl?{...e,baseUrl:r.baseUrl}:e,{transformHeaders:c,...l}=t??{};return{requestModel:s,requestOptions:{...l,apiKey:i,headers:a,env:o}}}stream(e,t,n){return a(e,async()=>{let r=this.requireProvider(e),{requestModel:i,requestOptions:a}=await this.applyAuth(e,n);return r.stream(i,t,a)})}async complete(e,t,n){return this.stream(e,t,n).result()}streamSimple(e,t,n){return a(e,async()=>{let r=this.requireProvider(e),{requestModel:i,requestOptions:a}=await this.applyAuth(e,n);return r.streamSimple(i,t,a)})}async completeSimple(e,t,n){return this.streamSimple(e,t,n).result()}async fetchDeferred(e,t,n){return a(e,async()=>{let r=this.requireProvider(e);if(!r.fetchDeferred)throw new h(`provider`,`Provider ${e.provider} does not support deferred responses`);let{requestModel:i,requestOptions:a}=await this.applyAuth(e,n);return r.fetchDeferred(i,t,a)}).result()}async cancelDeferred(e,t,n){let r=this.requireProvider(e);if(!r.cancelDeferred)throw new h(`provider`,`Provider ${e.provider} does not support deferred responses`);let{requestModel:i,requestOptions:a}=await this.applyAuth(e,n);await r.cancelDeferred(i,t,a)}};function E(e){return new T(e)}function D(e){let t=e.models,n=[],r=e.fetchModels,i=()=>{let e=[...t];for(let t of n){let n=e.findIndex(e=>e.id===t.id);n>=0?e[n]=t:e.push(t)}return e},o=typeof e.api.stream==`function`?e.api:void 0,s=o?void 0:e.api,c=e=>o??s?.[e.api],l=(t,n)=>{let r=c(t);return r?n(r):a(t,async()=>{throw new h(`stream`,`Provider ${e.id} has no API implementation for "${t.api}"`)})},u={id:e.id,name:e.name??e.id,baseUrl:e.baseUrl,headers:e.headers,auth:e.auth,getModels:i,refreshModels:r?async t=>{if(t.stored){let r=t.stored.models.filter(t=>t.provider===e.id).map(e=>e);if(!await t.publish({update:()=>{n=r}}))return}if(!t.allowNetwork||t.signal.aborted)return;let i=await r(t);t.signal.aborted||await t.publish({persist:{models:i,checkedAt:Date.now()},update:()=>{n=i}})}:void 0,filterModels:e.filterModels,stream:(e,t,n)=>l(e,r=>r.stream(e,t,n)),streamSimple:(e,t,n)=>l(e,r=>r.streamSimple(e,t,n))},d=o?[o]:Object.values(s??{}).filter(e=>e!==void 0);return d.some(e=>e.fetchDeferred!==void 0)&&(u.fetchDeferred=(t,n,r)=>a(t,async()=>{let i=c(t);if(!i?.fetchDeferred)throw new h(`provider`,`Provider ${e.id} does not support deferred responses for "${t.api}"`);return i.fetchDeferred(t,n,r)})),d.some(e=>e.cancelDeferred!==void 0)&&(u.cancelDeferred=async(t,n,r)=>{let i=c(t);if(!i?.cancelDeferred)throw new h(`provider`,`Provider ${e.id} cannot cancel deferred responses for "${t.api}"`);await i.cancelDeferred(t,n,r)}),u}function O(e,t){return e.api===t}function k(e,t){let n=t.input+t.cacheRead+t.cacheWrite,r=e.cost,i=-1;for(let t of e.cost.tiers??[])n>t.inputTokensAbove&&t.inputTokensAbove>i&&(r=t,i=t.inputTokensAbove);let a=t.cacheWrite1h??0,o=t.cacheWrite-a;return t.cost.input=r.input/1e6*t.input,t.cost.output=r.output/1e6*t.output,t.cost.cacheRead=r.cacheRead/1e6*t.cacheRead,t.cost.cacheWrite=(r.cacheWrite*o+r.input*2*a)/1e6,t.cost.total=t.cost.input+t.cost.output+t.cost.cacheRead+t.cost.cacheWrite,t.cost}const A=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];function j(e){return e.reasoning?A.filter(t=>{let n=e.thinkingLevelMap?.[t];return n===null?!1:t===`xhigh`||t===`max`?n!==void 0:!0}):[`off`]}function M(e,t){let n=j(e);if(n.includes(t))return t;let r=A.indexOf(t);if(r===-1)return n[0]??`off`;for(let e=r;e<A.length;e++){let t=A[e];if(n.includes(t))return t}for(let e=r-1;e>=0;e--){let t=A[e];if(n.includes(t))return t}return n[0]??`off`}function N(e,t){return!e||!t?!1:e.id===t.id&&e.provider===t.provider}export{j as a,C as c,m as d,u as f,D as i,h as l,a as m,M as n,O as o,o as p,E as r,N as s,k as t,_ as u};
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@highagency/pencil-wasm",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
4
4
  "description": "WASM rendering library for Pencil",
5
5
  "type": "module",
6
6
  "main": "./pencil.js",
@@ -71,6 +71,9 @@ export declare class Path {
71
71
  contains(x: number, y: number): boolean;
72
72
  computeTightBounds(): Float32Array;
73
73
  getBounds(): Float32Array;
74
+ isRect(): Float32Array | undefined;
75
+ isOval(): Float32Array | undefined;
76
+ isRRect(): Float32Array | undefined;
74
77
  isEmpty(): boolean;
75
78
  countPoints(): number;
76
79
  getPoint(index: number): [number, number];