@code-yeongyu/senpi 2026.10.5 → 2026.10.6

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 (115) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/bundle/chunks/{anthropic-messages-G5236QNK.js → anthropic-messages-4MNFPQ66.js} +1 -1
  3. package/dist/bundle/chunks/{app-server-command-3Q5G4CAF.js → app-server-command-GNTX4MZT.js} +1 -1
  4. package/dist/bundle/chunks/{azure-openai-responses-NTA2HGG4.js → azure-openai-responses-A5OEHSJM.js} +1 -1
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
  6. package/dist/bundle/chunks/{chunk-EEOKVSNF.js → chunk-3EE6G4G7.js} +180 -176
  7. package/dist/bundle/chunks/{chunk-2WV426OJ.js → chunk-4MJKBXI3.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-ECDLITEY.js → chunk-6EH7QXOG.js} +2 -2
  9. package/dist/bundle/chunks/chunk-6KQGOVQG.js +2 -0
  10. package/dist/bundle/chunks/{chunk-JVSOW4QU.js → chunk-7A3WRAKP.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-WTJU5B2C.js → chunk-BE66QJ3Z.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-UHRXXTFZ.js → chunk-D2W3MXRF.js} +2 -2
  13. package/dist/bundle/chunks/{chunk-U7CI2JGX.js → chunk-DDEAZX22.js} +1 -1
  14. package/dist/bundle/chunks/{chunk-UXIQK5NQ.js → chunk-ESSQUSRC.js} +1 -1
  15. package/dist/bundle/chunks/{chunk-KLBKUBDV.js → chunk-GQ3YLXVZ.js} +1 -1
  16. package/dist/bundle/chunks/{chunk-CTQU2XNX.js → chunk-MLNJNJFE.js} +1 -1
  17. package/dist/bundle/chunks/{chunk-BPX6QWPD.js → chunk-PELNNWGO.js} +1 -1
  18. package/dist/bundle/chunks/{chunk-UUAKEDVS.js → chunk-QLIW3YMI.js} +1 -1
  19. package/dist/bundle/chunks/{chunk-BBK6SSYT.js → chunk-TAV6QZFM.js} +1 -1
  20. package/dist/bundle/chunks/{chunk-QUROHJLP.js → chunk-TFO5JGLR.js} +1 -1
  21. package/dist/bundle/chunks/{cli-main-VZWSUHFB.js → cli-main-2C3YPHRE.js} +1 -1
  22. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-5ZUHUKMU.js → cloudflare-workers-ai-system-one-TE3OEJEL.js} +1 -1
  23. package/dist/bundle/chunks/{google-generative-ai-OTMG6ZXI.js → google-generative-ai-JBC53AMK.js} +1 -1
  24. package/dist/bundle/chunks/{google-vertex-2LXS3ICC.js → google-vertex-46ODNPM2.js} +1 -1
  25. package/dist/bundle/chunks/{help-fast-path-SHZJ3QWQ.js → help-fast-path-FUMH5NSA.js} +1 -1
  26. package/dist/bundle/chunks/{host-command-7JIGGOWR.js → host-command-N6XS5O67.js} +1 -1
  27. package/dist/bundle/chunks/{interactive-mode-JA7AHYYL.js → interactive-mode-CM4C4ZFY.js} +1 -1
  28. package/dist/bundle/chunks/{llama-cpp-classify-U5XAMKZE.js → llama-cpp-classify-AD6TTKNL.js} +1 -1
  29. package/dist/bundle/chunks/{multi-session-host-34WOINP4.js → multi-session-host-QLLTPWIM.js} +5 -5
  30. package/dist/bundle/chunks/{openai-codex-responses-WNTYIPFZ.js → openai-codex-responses-Q4OWIK7Y.js} +1 -1
  31. package/dist/bundle/chunks/{openai-completions-VSH22FCN.js → openai-completions-6HU7GIGD.js} +1 -1
  32. package/dist/bundle/chunks/{openai-images-XBTUJXPR.js → openai-images-M73YANTR.js} +1 -1
  33. package/dist/bundle/chunks/{openai-responses-WLBHCFYL.js → openai-responses-S4QYZXF3.js} +1 -1
  34. package/dist/bundle/chunks/{openrouter-images-3LVJZY3G.js → openrouter-images-PCJFX2KO.js} +1 -1
  35. package/dist/bundle/chunks/{package-manager-cli-2QLVGQSC.js → package-manager-cli-VRCAO7RV.js} +1 -1
  36. package/dist/bundle/chunks/{rotation-stream-JUCEXHWU.js → rotation-stream-7E37KOCX.js} +1 -1
  37. package/dist/bundle/chunks/{rpc-mode-QEBSN2OH.js → rpc-mode-2OPE6J7P.js} +1 -1
  38. package/dist/bundle/chunks/{session-control-endpoint-UGQIP6ZN.js → session-control-endpoint-SOG4XFF7.js} +1 -1
  39. package/dist/bundle/chunks/{session-picker-HX4LOJZ7.js → session-picker-VTTRFGE7.js} +1 -1
  40. package/dist/bundle/chunks/session-worker.js +370 -366
  41. package/dist/bundle/chunks/{typesafe-system-one-FNI3UASE.js → typesafe-system-one-TF23RUVG.js} +1 -1
  42. package/dist/bundle/cli.js +1 -1
  43. package/dist/bundle/index.js +1 -1
  44. package/dist/bundle/rpc-entry.js +1 -1
  45. package/dist/bundle/runtime-manifest.json +1 -1
  46. package/dist/core/agent-session-runtime.d.ts +12 -0
  47. package/dist/core/agent-session.d.ts +18 -0
  48. package/dist/core/agent-session.js +55 -19
  49. package/dist/core/dynamic-prompt/handoff.d.ts +4 -2
  50. package/dist/core/dynamic-prompt/handoff.js +1 -1
  51. package/dist/core/extensions/builtin/diff.js +14 -9
  52. package/dist/core/extensions/builtin/files.js +6 -2
  53. package/dist/core/extensions/builtin/gpt-apply-patch/parser.js +5 -1
  54. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts +8 -0
  55. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js +26 -2
  56. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.js +82 -11
  57. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +9 -1
  58. package/dist/core/extensions/builtin/permission-system/auto-credentials.d.ts +2 -0
  59. package/dist/core/extensions/builtin/permission-system/auto-credentials.js +17 -0
  60. package/dist/core/extensions/builtin/permission-system/auto-paths.d.ts +14 -0
  61. package/dist/core/extensions/builtin/permission-system/auto-paths.js +93 -0
  62. package/dist/core/extensions/builtin/permission-system/auto-policy.d.ts +20 -0
  63. package/dist/core/extensions/builtin/permission-system/auto-policy.js +126 -0
  64. package/dist/core/extensions/builtin/permission-system/auto-program-rules.d.ts +6 -0
  65. package/dist/core/extensions/builtin/permission-system/auto-program-rules.js +139 -0
  66. package/dist/core/extensions/builtin/permission-system/auto-shell-grammar.d.ts +29 -0
  67. package/dist/core/extensions/builtin/permission-system/auto-shell-grammar.js +74 -0
  68. package/dist/core/extensions/builtin/permission-system/auto-shell-segments.d.ts +13 -0
  69. package/dist/core/extensions/builtin/permission-system/auto-shell-segments.js +23 -0
  70. package/dist/core/extensions/builtin/permission-system/cli.d.ts +1 -0
  71. package/dist/core/extensions/builtin/permission-system/cli.js +9 -10
  72. package/dist/core/extensions/builtin/permission-system/config.d.ts +4 -1
  73. package/dist/core/extensions/builtin/permission-system/config.js +13 -1
  74. package/dist/core/extensions/builtin/permission-system/index.js +20 -12
  75. package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts +11 -6
  76. package/dist/core/extensions/builtin/permission-system/non-interactive.js +8 -33
  77. package/dist/core/extensions/builtin/permission-system/service.d.ts +20 -1
  78. package/dist/core/extensions/builtin/permission-system/service.js +43 -7
  79. package/dist/core/extensions/builtin/permission-system/settings.d.ts +1 -0
  80. package/dist/core/extensions/builtin/permission-system/settings.js +4 -3
  81. package/dist/core/extensions/builtin/permission-system/types.d.ts +1 -1
  82. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +16 -3
  83. package/dist/core/retry-fallback/usage-limit.js +5 -1
  84. package/dist/core/tools/diff-render.d.ts +4 -0
  85. package/dist/core/tools/diff-render.js +13 -0
  86. package/dist/core/tools/renderers/edit.js +6 -4
  87. package/dist/main.js +12 -0
  88. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  89. package/dist/modes/interactive/interactive-mode.js +55 -11
  90. package/dist/modes/interactive/provider-error-presentation.d.ts +25 -0
  91. package/dist/modes/interactive/provider-error-presentation.js +42 -0
  92. package/dist/modes/interactive/theme/dark.json +5 -5
  93. package/dist/modes/interactive/theme/light.json +5 -5
  94. package/dist/modes/rpc/custom-capability.d.ts +6 -0
  95. package/dist/modes/rpc/custom-capability.js +6 -0
  96. package/dist/modes/rpc/rpc-client.d.ts +3 -0
  97. package/dist/modes/rpc/rpc-input-validation.d.ts +7 -0
  98. package/dist/modes/rpc/rpc-input-validation.js +37 -0
  99. package/dist/modes/rpc/rpc-types.d.ts +9 -0
  100. package/dist/modes/rpc/session-command-activity.d.ts +2 -0
  101. package/dist/modes/rpc/session-command-activity.js +25 -0
  102. package/dist/modes/rpc/session-command-router.js +11 -4
  103. package/dist/modes/rpc/session-registry-attach.js +1 -0
  104. package/dist/modes/rpc/session-registry-types.d.ts +7 -0
  105. package/dist/modes/rpc/session-registry-types.js +11 -0
  106. package/dist/modes/rpc/session-registry.js +6 -3
  107. package/dist/modes/rpc/session-sweep.d.ts +12 -2
  108. package/dist/modes/rpc/session-sweep.js +36 -3
  109. package/dist/modes/rpc/session-teardown.d.ts +2 -0
  110. package/dist/modes/rpc/session-teardown.js +1 -0
  111. package/dist/modes/rpc/worker-session-registry.js +5 -1
  112. package/docs/rpc.md +39 -5
  113. package/docs/settings.md +3 -1
  114. package/package.json +6 -6
  115. package/dist/bundle/chunks/chunk-K3BXFPWZ.js +0 -2
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{attachProviderDiagnostic,peekProviderDiagnostic}from"./chunk-45SZOLCU.js";import{appendRetryAfterMsMarker,extract429RetryAfterMs}from"./chunk-BPX6QWPD.js";var DEFAULT_MAX_RETRY_DELAY_MS=6e4,DIGITALOCEAN_STREAM_FAILURE_MESSAGE="Upstream error from DigitalOcean: stream failed";function isProviderError(error){return error instanceof Error?error.message===DIGITALOCEAN_STREAM_FAILURE_MESSAGE?!0:!("status"in error)||!("headers"in error)?!1:(error.status===void 0||typeof error.status=="number")&&(error.headers===void 0||error.headers instanceof Headers):!1}function isRetryableProviderError(error){let shouldRetry=error.headers?.get("x-should-retry");return shouldRetry==="true"?!0:shouldRetry==="false"?!1:error.status===void 0?!0:error.status===408||error.status===409||error.status===429||typeof error.status=="number"&&error.status>=500}function validateServerRetryDelayMs(delayMs,maxRetryDelayMs,providerError){let maxDelayMs=maxRetryDelayMs??DEFAULT_MAX_RETRY_DELAY_MS;if(maxDelayMs>0&&delayMs>maxDelayMs){let message=`Server requested ${Math.ceil(delayMs/1e3)}s retry delay (max: ${Math.ceil(maxDelayMs/1e3)}s). ${providerError.message}`,error=Object.assign(new Error(appendRetryAfterMsMarker(message,delayMs)),{retryAfterMs:delayMs});throw attachProviderDiagnostic(error,peekProviderDiagnostic(providerError))}return delayMs}function getRetryDelayMs(error,retryIndex,maxRetryDelayMs){let hintMs=extract429RetryAfterMs({status:429,headers:error.headers,bodyText:""});return hintMs!==void 0?validateServerRetryDelayMs(hintMs,maxRetryDelayMs,error):Math.min(.5*2**retryIndex,8)*1e3*(1-Math.random()*.25)}function createAbortError(){let error=new Error("Request aborted");return error.name="AbortError",error}function abortableSleep(ms,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(createAbortError());return}let onAbort=()=>{clearTimeout(timeout),reject(createAbortError())},timeout=setTimeout(()=>{signal?.removeEventListener("abort",onAbort),resolve()},Math.max(0,ms));signal?.addEventListener("abort",onAbort,{once:!0})})}async function retryProviderRequest(request,options={}){let maxRetries=options.maxRetries??0,retriesRemaining=maxRetries;for(;;)try{return await request()}catch(error){if(options.signal?.aborted)throw createAbortError();if(retriesRemaining<=0||!isProviderError(error)||!isRetryableProviderError(error))throw error;let retryIndex=maxRetries-retriesRemaining;retriesRemaining--,await abortableSleep(getRetryDelayMs(error,retryIndex,options.maxRetryDelayMs),options.signal)}}async function*replayPrefetchedStream(first,iterator){if(first.done)return;let completed=!1,providerFailed=!1;try{for(yield first.value;;){let next;try{next=await iterator.next()}catch(error){throw providerFailed=!0,error}if(next.done){completed=!0;return}yield next.value}}finally{!completed&&!providerFailed&&await iterator.return?.()}}async function retryProviderStreamRequest(request,options={}){return retryProviderRequest(async()=>{let attempt=await request(),iterator=attempt.stream[Symbol.asyncIterator](),first=await iterator.next();return{stream:replayPrefetchedStream(first,iterator),metadata:attempt.metadata}},options)}export{retryProviderRequest,retryProviderStreamRequest};
2
+ import{attachProviderDiagnostic,peekProviderDiagnostic}from"./chunk-45SZOLCU.js";import{appendRetryAfterMsMarker,extract429RetryAfterMs}from"./chunk-PELNNWGO.js";var DEFAULT_MAX_RETRY_DELAY_MS=6e4,DIGITALOCEAN_STREAM_FAILURE_MESSAGE="Upstream error from DigitalOcean: stream failed";function isProviderError(error){return error instanceof Error?error.message===DIGITALOCEAN_STREAM_FAILURE_MESSAGE?!0:!("status"in error)||!("headers"in error)?!1:(error.status===void 0||typeof error.status=="number")&&(error.headers===void 0||error.headers instanceof Headers):!1}function isRetryableProviderError(error){let shouldRetry=error.headers?.get("x-should-retry");return shouldRetry==="true"?!0:shouldRetry==="false"?!1:error.status===void 0?!0:error.status===408||error.status===409||error.status===429||typeof error.status=="number"&&error.status>=500}function validateServerRetryDelayMs(delayMs,maxRetryDelayMs,providerError){let maxDelayMs=maxRetryDelayMs??DEFAULT_MAX_RETRY_DELAY_MS;if(maxDelayMs>0&&delayMs>maxDelayMs){let message=`Server requested ${Math.ceil(delayMs/1e3)}s retry delay (max: ${Math.ceil(maxDelayMs/1e3)}s). ${providerError.message}`,error=Object.assign(new Error(appendRetryAfterMsMarker(message,delayMs)),{retryAfterMs:delayMs});throw attachProviderDiagnostic(error,peekProviderDiagnostic(providerError))}return delayMs}function getRetryDelayMs(error,retryIndex,maxRetryDelayMs){let hintMs=extract429RetryAfterMs({status:429,headers:error.headers,bodyText:""});return hintMs!==void 0?validateServerRetryDelayMs(hintMs,maxRetryDelayMs,error):Math.min(.5*2**retryIndex,8)*1e3*(1-Math.random()*.25)}function createAbortError(){let error=new Error("Request aborted");return error.name="AbortError",error}function abortableSleep(ms,signal){return new Promise((resolve,reject)=>{if(signal?.aborted){reject(createAbortError());return}let onAbort=()=>{clearTimeout(timeout),reject(createAbortError())},timeout=setTimeout(()=>{signal?.removeEventListener("abort",onAbort),resolve()},Math.max(0,ms));signal?.addEventListener("abort",onAbort,{once:!0})})}async function retryProviderRequest(request,options={}){let maxRetries=options.maxRetries??0,retriesRemaining=maxRetries;for(;;)try{return await request()}catch(error){if(options.signal?.aborted)throw createAbortError();if(retriesRemaining<=0||!isProviderError(error)||!isRetryableProviderError(error))throw error;let retryIndex=maxRetries-retriesRemaining;retriesRemaining--,await abortableSleep(getRetryDelayMs(error,retryIndex,options.maxRetryDelayMs),options.signal)}}async function*replayPrefetchedStream(first,iterator){if(first.done)return;let completed=!1,providerFailed=!1;try{for(yield first.value;;){let next;try{next=await iterator.next()}catch(error){throw providerFailed=!0,error}if(next.done){completed=!0;return}yield next.value}}finally{!completed&&!providerFailed&&await iterator.return?.()}}async function retryProviderStreamRequest(request,options={}){return retryProviderRequest(async()=>{let attempt=await request(),iterator=attempt.stream[Symbol.asyncIterator](),first=await iterator.next();return{stream:replayPrefetchedStream(first,iterator),metadata:attempt.metadata}},options)}export{retryProviderRequest,retryProviderStreamRequest};
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- import{retryProviderRequest}from"./chunk-KLBKUBDV.js";import{formatProviderError,normalizeProviderError}from"./chunk-BBK6SSYT.js";import{calculateCost}from"./chunk-XL5KIYQF.js";import{headersToRecord,providerHeadersToRecord}from"./chunk-PJ34QVL5.js";function httpError(label,response,body){let error=new Error(`${label} returned ${response.status}`);return error.status=response.status,error.headers=response.headers,error.body=body,error}function timeoutError(timeoutMs){let error=new Error(`Request timed out after ${timeoutMs}ms`);return error.name="TimeoutError",error.status=void 0,error.headers=void 0,error.body="",error}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function requiredNumber(label,value,field){if(typeof value!="number"||!Number.isFinite(value))throw new Error(`${label} returned an invalid ${field}`);return value}function probabilities(label,value,id){if(!isRecord(value))throw new Error(`${label} returned invalid probabilities for ${id}`);return Object.fromEntries(Object.entries(value).map(([key,probability])=>[key,requiredNumber(label,probability,`probability for ${id}.${key}`)]))}function parseAnswers(label,value,context){if(!isRecord(value))throw new Error(`${label} returned an unexpected response`);let answers=[];for(let[id,question]of Object.entries(context.questions)){let answer=value[id];if(!isRecord(answer))throw new Error(`${label} did not return an answer for ${id}`);if(question.type==="choice"){if(answer.type!=="choice"||typeof answer.choice!="string")throw new Error(`${label} did not return a choice answer for ${id}`);answers.push([id,{type:"choice",choice:answer.choice,probabilities:probabilities(label,answer.probabilities,id),confidence:requiredNumber(label,answer.confidence,`confidence for ${id}`)}])}else if(question.type==="score"){if(answer.type!=="score")throw new Error(`${label} did not return a score answer for ${id}`);answers.push([id,{type:"score",score:requiredNumber(label,answer.score,`score for ${id}`),confidence:requiredNumber(label,answer.confidence,`confidence for ${id}`)}])}else{if(answer.type!=="noul")throw new Error(`${label} did not return a bool answer for ${id}`);answers.push([id,{type:"bool",probability:requiredNumber(label,answer.noul,`probability for ${id}`)}])}}return Object.fromEntries(answers)}function tokenCount(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?value:0}function parseUsage(value,model){if(!isRecord(value)||value.input_tokens===void 0&&value.output_tokens===void 0)return;let input=tokenCount(value.input_tokens),output=tokenCount(value.output_tokens),usage={input,output,cacheRead:0,cacheWrite:0,totalTokens:input+output,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return calculateCost(model,usage),usage}function wireRequest(context){return{state:context.state,questions:Object.fromEntries(Object.entries(context.questions).map(([id,question])=>[id,question.type==="bool"?{...question,type:"noul"}:question]))}}function requestHeaders(model,apiKey,optionsHeaders){return providerHeadersToRecord({authorization:`Bearer ${apiKey}`,"content-type":"application/json"},model.headers,optionsHeaders)??{}}async function classifySystemOne(transport,model,context,options){let output={api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:"stop",timestamp:Date.now()};try{if(model.api!==transport.api)throw new Error(`Unsupported classifier API: ${model.api}`);if(!options?.apiKey)throw new Error(`No API key for provider: ${model.provider}`);let apiKey=options.apiKey,payload=transport.payload(model,wireRequest(context)),transformed=await options.onPayload?.(payload,model);transformed!==void 0&&(payload=transformed);let requestFetch=options.fetch??globalThis.fetch,{response,body}=await retryProviderRequest(async()=>{let timeoutSignal=options.timeoutMs!==void 0?AbortSignal.timeout(options.timeoutMs):void 0,signal=options.signal&&timeoutSignal?AbortSignal.any([options.signal,timeoutSignal]):options.signal??timeoutSignal;try{let next=await requestFetch(transport.url(model),{method:"POST",headers:requestHeaders(model,apiKey,options.headers),body:JSON.stringify(payload),signal});if(!next.ok)throw httpError(transport.label,next,await next.text());return{response:next,body:await next.json()}}catch(error){throw timeoutSignal?.aborted&&!options.signal?.aborted?timeoutError(options.timeoutMs):error}},{maxRetries:options.maxRetries??2,maxRetryDelayMs:options.maxRetryDelayMs,signal:options.signal});await options.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model);let result=transport.output(body),usage=parseUsage(result.usage,model);return usage&&(output.usage=usage),output.answers=parseAnswers(transport.label,result.answers,context),output}catch(error){return output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error),`${transport.label} error`),output}}export{isRecord,classifySystemOne};
2
+ import{retryProviderRequest}from"./chunk-GQ3YLXVZ.js";import{formatProviderError,normalizeProviderError}from"./chunk-TAV6QZFM.js";import{calculateCost}from"./chunk-XL5KIYQF.js";import{headersToRecord,providerHeadersToRecord}from"./chunk-PJ34QVL5.js";function httpError(label,response,body){let error=new Error(`${label} returned ${response.status}`);return error.status=response.status,error.headers=response.headers,error.body=body,error}function timeoutError(timeoutMs){let error=new Error(`Request timed out after ${timeoutMs}ms`);return error.name="TimeoutError",error.status=void 0,error.headers=void 0,error.body="",error}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function requiredNumber(label,value,field){if(typeof value!="number"||!Number.isFinite(value))throw new Error(`${label} returned an invalid ${field}`);return value}function probabilities(label,value,id){if(!isRecord(value))throw new Error(`${label} returned invalid probabilities for ${id}`);return Object.fromEntries(Object.entries(value).map(([key,probability])=>[key,requiredNumber(label,probability,`probability for ${id}.${key}`)]))}function parseAnswers(label,value,context){if(!isRecord(value))throw new Error(`${label} returned an unexpected response`);let answers=[];for(let[id,question]of Object.entries(context.questions)){let answer=value[id];if(!isRecord(answer))throw new Error(`${label} did not return an answer for ${id}`);if(question.type==="choice"){if(answer.type!=="choice"||typeof answer.choice!="string")throw new Error(`${label} did not return a choice answer for ${id}`);answers.push([id,{type:"choice",choice:answer.choice,probabilities:probabilities(label,answer.probabilities,id),confidence:requiredNumber(label,answer.confidence,`confidence for ${id}`)}])}else if(question.type==="score"){if(answer.type!=="score")throw new Error(`${label} did not return a score answer for ${id}`);answers.push([id,{type:"score",score:requiredNumber(label,answer.score,`score for ${id}`),confidence:requiredNumber(label,answer.confidence,`confidence for ${id}`)}])}else{if(answer.type!=="noul")throw new Error(`${label} did not return a bool answer for ${id}`);answers.push([id,{type:"bool",probability:requiredNumber(label,answer.noul,`probability for ${id}`)}])}}return Object.fromEntries(answers)}function tokenCount(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?value:0}function parseUsage(value,model){if(!isRecord(value)||value.input_tokens===void 0&&value.output_tokens===void 0)return;let input=tokenCount(value.input_tokens),output=tokenCount(value.output_tokens),usage={input,output,cacheRead:0,cacheWrite:0,totalTokens:input+output,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return calculateCost(model,usage),usage}function wireRequest(context){return{state:context.state,questions:Object.fromEntries(Object.entries(context.questions).map(([id,question])=>[id,question.type==="bool"?{...question,type:"noul"}:question]))}}function requestHeaders(model,apiKey,optionsHeaders){return providerHeadersToRecord({authorization:`Bearer ${apiKey}`,"content-type":"application/json"},model.headers,optionsHeaders)??{}}async function classifySystemOne(transport,model,context,options){let output={api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:"stop",timestamp:Date.now()};try{if(model.api!==transport.api)throw new Error(`Unsupported classifier API: ${model.api}`);if(!options?.apiKey)throw new Error(`No API key for provider: ${model.provider}`);let apiKey=options.apiKey,payload=transport.payload(model,wireRequest(context)),transformed=await options.onPayload?.(payload,model);transformed!==void 0&&(payload=transformed);let requestFetch=options.fetch??globalThis.fetch,{response,body}=await retryProviderRequest(async()=>{let timeoutSignal=options.timeoutMs!==void 0?AbortSignal.timeout(options.timeoutMs):void 0,signal=options.signal&&timeoutSignal?AbortSignal.any([options.signal,timeoutSignal]):options.signal??timeoutSignal;try{let next=await requestFetch(transport.url(model),{method:"POST",headers:requestHeaders(model,apiKey,options.headers),body:JSON.stringify(payload),signal});if(!next.ok)throw httpError(transport.label,next,await next.text());return{response:next,body:await next.json()}}catch(error){throw timeoutSignal?.aborted&&!options.signal?.aborted?timeoutError(options.timeoutMs):error}},{maxRetries:options.maxRetries??2,maxRetryDelayMs:options.maxRetryDelayMs,signal:options.signal});await options.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model);let result=transport.output(body),usage=parseUsage(result.usage,model);return usage&&(output.usage=usage),output.answers=parseAnswers(transport.label,result.answers,context),output}catch(error){return output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error),`${transport.label} error`),output}}export{isRecord,classifySystemOne};
@@ -1,2 +1,2 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url); { const __piWorkerThreads = require("node:worker_threads"); if (typeof __piWorkerThreads.markAsUncloneable !== "function") { __piWorkerThreads.markAsUncloneable = () => {}; } }
2
- var MARKER_RE=/\(retry-after-ms: (\d+)\)$/,RATE_LIMIT_BODY_RE=/\b(rate_limit_error|rate_limit_exceeded|too_many_requests|resource_exhausted|rate limit (?:exceeded|hit)|too many requests)\b/i,RATE_LIMIT_JSON_VALUES=new Set(["rate_limit_error","rate_limit_exceeded","too_many_requests","resource_exhausted"]),RETRY_AFTER_MS_RE=/^\d+(?:\.\d+)?$/,DELTA_SECONDS_RE=/^\d+$/;function isRateLimited(status,bodyText){if(status===429||RATE_LIMIT_BODY_RE.test(bodyText))return!0;let json=tryParseJSON(bodyText);return!!(json!==void 0&&scanValue(json,(v,k)=>!!(k!==void 0&&k.toLowerCase()==="retrydelay"&&typeof v=="string"||typeof v=="string"&&RATE_LIMIT_JSON_VALUES.has(v)||v===429)))}function fromRetryAfterMsHeader(h){let raw=h?.get("retry-after-ms");if(raw==null||!RETRY_AFTER_MS_RE.test(raw))return;let val=Number.parseFloat(raw);if(!(!Number.isFinite(val)||val<0))return Math.ceil(val)}function fromRetryAfterHeader(h,nowMs){let raw=h?.get("retry-after");if(raw!=null){if(DELTA_SECONDS_RE.test(raw))return Number.parseInt(raw,10)*1e3;if(/[a-zA-Z]/.test(raw)){let parsed=Date.parse(raw);if(!Number.isNaN(parsed)){let base=dateHeaderMs(h)??nowMs;return clampAbsolute(parsed,base)}}}}function fromXRateLimitReset(h,nowMs){let best;for(let key of["x-ratelimit-reset","x-ratelimit-reset-requests","x-ratelimit-reset-tokens"]){let raw=h?.get(key);if(raw==null)continue;let epoch=Number.parseFloat(raw);if(!Number.isFinite(epoch)||epoch<0||!/^\d+(?:\.\d+)?$/.test(raw))continue;let delta=Math.ceil(epoch*1e3-nowMs),clamped=Math.max(0,delta);(best===void 0||clamped>best)&&(best=clamped)}return best}var RETRY_DELAY_RE=/^(\d+(?:\.\d+)?)\s*(ms|s|m)$/;function fromJsonRetryDelay(bodyText){let json=tryParseJSON(bodyText);if(json===void 0)return;let best;return scanValue(json,v=>{if(typeof v!="string")return!1;let m=v.match(RETRY_DELAY_RE);if(!m)return!1;let num=Number.parseFloat(m[1]),unit=m[2],ms=unit==="ms"?num:unit==="s"?num*1e3:num*6e4,intMs=Math.ceil(ms);return(best===void 0||intMs>best)&&(best=intMs),!1}),best}function fromBodyProse(bodyText,nowMs){let m=bodyText.match(/retry-after-ms:\s*(\d+)/i);if(m)return Number.parseInt(m[1],10);if(m=bodyText.match(/retry-after:\s*(\d+)/i),m)return Number.parseInt(m[1],10)*1e3;if(m=bodyText.match(/(?:try again|retry|wait after).*?(?:in\s+)?(\d+(?:\.\d+)?)\s*(ms|s|sec|seconds?|m|min|minutes?)\b/i),m)return convertUnit(Number.parseFloat(m[1]),m[2]);if(m=bodyText.match(/resets?\s+at\s+(\S+)/i),m){let parsed=Date.parse(m[1]);if(!Number.isNaN(parsed))return clampAbsolute(parsed,nowMs)}}function dateHeaderMs(h){let raw=h?.get("date");if(raw==null)return;let parsed=Date.parse(raw);return Number.isNaN(parsed)?void 0:parsed}function clampAbsolute(targetMs,baseMs){return Math.max(0,targetMs-baseMs)}function convertUnit(num,unit){let u=unit.toLowerCase();return Math.ceil(u==="ms"?num:u==="s"||u==="sec"||u==="second"||u==="seconds"?num*1e3:num*6e4)}function scanValue(value,fn,key){if(value===null)return fn(null,key);if(typeof value=="string"||typeof value=="number"||typeof value=="boolean")return fn(value,key);if(Array.isArray(value)){for(let item of value)if(scanValue(item,fn,key))return!0;return!1}if(typeof value=="object"){for(let[k,v]of Object.entries(value))if(scanValue(v,fn,k))return!0;return!1}return!1}function tryParseJSON(text){let cleaned=text.replace(/^data:\s*/gm,"").trim();if(!(!cleaned.startsWith("{")&&!cleaned.startsWith("[")))try{return JSON.parse(cleaned)}catch{return}}function extract429RetryAfterMs(input,nowMs){let now=nowMs??Date.now();if(!isRateLimited(input.status,input.bodyText))return;let fromMs=fromRetryAfterMsHeader(input.headers);if(fromMs!==void 0)return fromMs;let fromRa=fromRetryAfterHeader(input.headers,now);if(fromRa!==void 0)return fromRa;let fromXrl=fromXRateLimitReset(input.headers,now);if(fromXrl!==void 0)return fromXrl;let fromJson=fromJsonRetryDelay(input.bodyText);return fromJson!==void 0?fromJson:fromBodyProse(input.bodyText,now)}function appendRetryAfterMsMarker(message,hintMs){return`${message} (retry-after-ms: ${hintMs})`}function parseRetryAfterMsMarker(message){let m=message.match(MARKER_RE);if(m)return Number.parseInt(m[1],10)}export{extract429RetryAfterMs,appendRetryAfterMsMarker,parseRetryAfterMsMarker};
2
+ var MARKER_RE=/\(retry-after-ms: (\d+)\)$/,RATE_LIMIT_BODY_RE=/\b(rate_limit_error|rate_limit_exceeded|too_many_requests|resource_exhausted|rate limit (?:exceeded|hit)|too many requests)\b/i,RATE_LIMIT_JSON_VALUES=new Set(["rate_limit_error","rate_limit_exceeded","too_many_requests","resource_exhausted"]),RETRY_AFTER_MS_RE=/^\d+(?:\.\d+)?$/,DELTA_SECONDS_RE=/^\d+$/;function isRateLimited(status,bodyText){if(status===429||RATE_LIMIT_BODY_RE.test(bodyText))return!0;let json=tryParseJSON(bodyText);return!!(json!==void 0&&scanValue(json,(v,k)=>!!(k!==void 0&&k.toLowerCase()==="retrydelay"&&typeof v=="string"||typeof v=="string"&&RATE_LIMIT_JSON_VALUES.has(v)||v===429)))}function fromRetryAfterMsHeader(h){let raw=h?.get("retry-after-ms");if(raw==null||!RETRY_AFTER_MS_RE.test(raw))return;let val=Number.parseFloat(raw);if(!(!Number.isFinite(val)||val<0))return Math.ceil(val)}function fromRetryAfterHeader(h,nowMs){let raw=h?.get("retry-after");if(raw!=null){if(DELTA_SECONDS_RE.test(raw))return Number.parseInt(raw,10)*1e3;if(/[a-zA-Z]/.test(raw)){let parsed=Date.parse(raw);if(!Number.isNaN(parsed)){let base=dateHeaderMs(h)??nowMs;return clampAbsolute(parsed,base)}}}}function fromXRateLimitReset(h,nowMs){let best;for(let key of["x-ratelimit-reset","x-ratelimit-reset-requests","x-ratelimit-reset-tokens"]){let raw=h?.get(key);if(raw==null)continue;let epoch=Number.parseFloat(raw);if(!Number.isFinite(epoch)||epoch<0||!/^\d+(?:\.\d+)?$/.test(raw))continue;let delta=Math.ceil(epoch*1e3-nowMs),clamped=Math.max(0,delta);(best===void 0||clamped>best)&&(best=clamped)}return best}var RETRY_DELAY_RE=/^(\d+(?:\.\d+)?)\s*(ms|s|m)$/;function fromJsonRetryDelay(bodyText){let json=tryParseJSON(bodyText);if(json===void 0)return;let best;return scanValue(json,v=>{if(typeof v!="string")return!1;let m=v.match(RETRY_DELAY_RE);if(!m)return!1;let num=Number.parseFloat(m[1]),unit=m[2],ms=unit==="ms"?num:unit==="s"?num*1e3:num*6e4,intMs=Math.ceil(ms);return(best===void 0||intMs>best)&&(best=intMs),!1}),best}function fromBodyProse(bodyText,nowMs){let m=bodyText.match(/retry-after-ms:\s*(\d+)/i);if(m)return Number.parseInt(m[1],10);if(m=bodyText.match(/retry-after:\s*(\d+)/i),m)return Number.parseInt(m[1],10)*1e3;if(m=bodyText.match(/(?:try again|retry|wait after).*?(?:in\s+)?(\d+(?:\.\d+)?)\s*(ms|s|sec|seconds?|m|min|minutes?)\b/i),m||(m=bodyText.match(/\bresets?\s+in\s+(\d+(?:\.\d+)?)\s*(ms|s|sec|seconds?|m|min|minutes?)\b/i),m))return convertUnit(Number.parseFloat(m[1]),m[2]);if(m=bodyText.match(/resets?\s+at\s+(\S+)/i),m){let parsed=Date.parse(m[1]);if(!Number.isNaN(parsed))return clampAbsolute(parsed,nowMs)}}function dateHeaderMs(h){let raw=h?.get("date");if(raw==null)return;let parsed=Date.parse(raw);return Number.isNaN(parsed)?void 0:parsed}function clampAbsolute(targetMs,baseMs){return Math.max(0,targetMs-baseMs)}function convertUnit(num,unit){let u=unit.toLowerCase();return Math.ceil(u==="ms"?num:u==="s"||u==="sec"||u==="second"||u==="seconds"?num*1e3:num*6e4)}function scanValue(value,fn,key){if(value===null)return fn(null,key);if(typeof value=="string"||typeof value=="number"||typeof value=="boolean")return fn(value,key);if(Array.isArray(value)){for(let item of value)if(scanValue(item,fn,key))return!0;return!1}if(typeof value=="object"){for(let[k,v]of Object.entries(value))if(scanValue(v,fn,k))return!0;return!1}return!1}function tryParseJSON(text){let cleaned=text.replace(/^data:\s*/gm,"").trim();if(!(!cleaned.startsWith("{")&&!cleaned.startsWith("[")))try{return JSON.parse(cleaned)}catch{return}}function extract429RetryAfterMs(input,nowMs){let now=nowMs??Date.now();if(!isRateLimited(input.status,input.bodyText))return;let fromMs=fromRetryAfterMsHeader(input.headers);if(fromMs!==void 0)return fromMs;let fromRa=fromRetryAfterHeader(input.headers,now);if(fromRa!==void 0)return fromRa;let fromXrl=fromXRateLimitReset(input.headers,now);if(fromXrl!==void 0)return fromXrl;let fromJson=fromJsonRetryDelay(input.bodyText);return fromJson!==void 0?fromJson:fromBodyProse(input.bodyText,now)}function appendRetryAfterMsMarker(message,hintMs){return`${message} (retry-after-ms: ${hintMs})`}function parseRetryAfterMsMarker(message){let m=message.match(MARKER_RE);if(m)return Number.parseInt(m[1],10)}export{extract429RetryAfterMs,appendRetryAfterMsMarker,parseRetryAfterMsMarker};