@alvin0/ai-agent-sdk-core 0.1.3 → 0.1.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.
- package/README.md +13 -1
- package/dist/agent/accounting/ledger.js +1 -1
- package/dist/agent/accounting/ledger.js.map +1 -1
- package/dist/agent/accounting/report.d.ts +1 -1
- package/dist/agent/define/definition.d.ts +27 -6
- package/dist/agent/define/definition.d.ts.map +1 -1
- package/dist/agent/define/definition.js +1 -1
- package/dist/agent/define/definition.js.map +1 -1
- package/dist/agent/define/session/accounting.js +1 -1
- package/dist/agent/define/session/accounting.js.map +1 -1
- package/dist/agent/define/session/model-config.js +1 -1
- package/dist/agent/define/session/model-config.js.map +1 -1
- package/dist/agent/define/session/types.d.ts +6 -3
- package/dist/agent/define/session/types.d.ts.map +1 -1
- package/dist/agent/define/session.d.ts +25 -2
- package/dist/agent/define/session.d.ts.map +1 -1
- package/dist/agent/define/session.js +1 -1
- package/dist/agent/define/session.js.map +1 -1
- package/dist/agent/loop/admission.js +2 -0
- package/dist/agent/loop/admission.js.map +1 -0
- package/dist/agent/loop/events.d.ts +4 -0
- package/dist/agent/loop/events.d.ts.map +1 -1
- package/dist/agent/loop/program.js +2 -0
- package/dist/agent/loop/program.js.map +1 -0
- package/dist/agent/loop/run-turn.d.ts.map +1 -1
- package/dist/agent/loop/run-turn.js +1 -1
- package/dist/agent/loop/run-turn.js.map +1 -1
- package/dist/agent/loop/schedule.d.ts.map +1 -1
- package/dist/agent/loop/schedule.js +2 -2
- package/dist/agent/loop/schedule.js.map +1 -1
- package/dist/agent/loop/tool-call-support.js +2 -0
- package/dist/agent/loop/tool-call-support.js.map +1 -0
- package/dist/agent/loop/turn/config.js +1 -1
- package/dist/agent/loop/turn/config.js.map +1 -1
- package/dist/agent/loop/turn/hooks.js +1 -1
- package/dist/agent/loop/turn/hooks.js.map +1 -1
- package/dist/agent/loop/turn/model-request-boundary.js +2 -0
- package/dist/agent/loop/turn/model-request-boundary.js.map +1 -0
- package/dist/agent/loop/turn/model-round.js +1 -1
- package/dist/agent/loop/turn/model-round.js.map +1 -1
- package/dist/agent/loop/turn/step-projection.js +2 -0
- package/dist/agent/loop/turn/step-projection.js.map +1 -0
- package/dist/agent/loop/turn/types.d.ts +6 -0
- package/dist/agent/loop/turn/types.d.ts.map +1 -1
- package/dist/agent/memory/compaction.d.ts.map +1 -1
- package/dist/agent/memory/compaction.js +1 -1
- package/dist/agent/memory/compaction.js.map +1 -1
- package/dist/agent/memory/context-optimizer.d.ts +61 -0
- package/dist/agent/memory/context-optimizer.d.ts.map +1 -0
- package/dist/agent/memory/context-optimizer.js +4 -0
- package/dist/agent/memory/context-optimizer.js.map +1 -0
- package/dist/agent/memory/memory.js +1 -1
- package/dist/agent/memory/memory.js.map +1 -1
- package/dist/agent/mode/run-agent.d.ts +15 -1
- package/dist/agent/mode/run-agent.d.ts.map +1 -1
- package/dist/agent/mode/run-agent.js +2 -2
- package/dist/agent/mode/run-agent.js.map +1 -1
- package/dist/agent/skill/provider/snapshot.js +1 -1
- package/dist/agent/team/managed.d.ts +33 -64
- package/dist/agent/team/managed.d.ts.map +1 -1
- package/dist/agent/team/managed.js +6 -3
- package/dist/agent/team/managed.js.map +1 -1
- package/dist/agent/team/team.d.ts +2 -0
- package/dist/agent/team/team.d.ts.map +1 -1
- package/dist/agent/team/team.js +1 -1
- package/dist/agent/team/team.js.map +1 -1
- package/dist/agent/team/types.d.ts +1 -0
- package/dist/agent/team/types.d.ts.map +1 -1
- package/dist/agent/tool/action-fusion.d.ts +30 -0
- package/dist/agent/tool/action-fusion.d.ts.map +1 -0
- package/dist/agent/tool/action-fusion.js +2 -0
- package/dist/agent/tool/action-fusion.js.map +1 -0
- package/dist/agent/tool/capture.js +1 -1
- package/dist/agent/tool/capture.js.map +1 -1
- package/dist/agent/tool/definition.d.ts +8 -0
- package/dist/agent/tool/definition.d.ts.map +1 -1
- package/dist/agent/tool/definition.js.map +1 -1
- package/dist/agent/tool/evidence-reducer.d.ts +41 -0
- package/dist/agent/tool/evidence-reducer.d.ts.map +1 -0
- package/dist/agent/tool/evidence-reducer.js +7 -0
- package/dist/agent/tool/evidence-reducer.js.map +1 -0
- package/dist/agent/tool/nested.d.ts +117 -0
- package/dist/agent/tool/nested.d.ts.map +1 -0
- package/dist/agent/tool/nested.js +2 -0
- package/dist/agent/tool/nested.js.map +1 -0
- package/dist/agent/tool/output-budget.d.ts.map +1 -1
- package/dist/agent/tool/output-budget.js +2 -2
- package/dist/agent/tool/output-budget.js.map +1 -1
- package/dist/agent/tool/output-schema.js +2 -0
- package/dist/agent/tool/output-schema.js.map +1 -0
- package/dist/agent/tool/pipeline.d.ts +7 -0
- package/dist/agent/tool/pipeline.d.ts.map +1 -1
- package/dist/agent/tool/pipeline.js +2 -2
- package/dist/agent/tool/pipeline.js.map +1 -1
- package/dist/agent/tool/program-results.js +2 -0
- package/dist/agent/tool/program-results.js.map +1 -0
- package/dist/agent.d.ts +6 -2
- package/dist/agent.js +1 -1
- package/dist/composition/agent/definition.js +1 -1
- package/dist/composition/agent/definition.js.map +1 -1
- package/dist/composition/agent/options.js +1 -1
- package/dist/composition/agent/options.js.map +1 -1
- package/dist/composition/agent/session.js +1 -1
- package/dist/composition/agent/session.js.map +1 -1
- package/dist/composition/agent/types.d.ts +17 -10
- package/dist/composition/agent/types.d.ts.map +1 -1
- package/dist/composition/runtime/owner.js +1 -1
- package/dist/composition/runtime/owner.js.map +1 -1
- package/dist/composition/runtime/types.d.ts +7 -1
- package/dist/composition/runtime/types.d.ts.map +1 -1
- package/dist/composition/tool-source/snapshot.js +1 -1
- package/dist/contract/adapter.d.ts +1 -1
- package/dist/contract/call-config.d.ts +8 -1
- package/dist/contract/call-config.d.ts.map +1 -1
- package/dist/contract/call-config.js +1 -1
- package/dist/contract/call-config.js.map +1 -1
- package/dist/contract/generate-options.d.ts +5 -0
- package/dist/contract/generate-options.d.ts.map +1 -1
- package/dist/contract/model-info.d.ts +26 -7
- package/dist/contract/model-info.d.ts.map +1 -1
- package/dist/errors/model-error.d.ts +0 -1
- package/dist/errors/model-error.d.ts.map +1 -1
- package/dist/errors/model-error.js +1 -1
- package/dist/errors/model-error.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +1 -1
- package/dist/memory.d.ts +2 -1
- package/dist/memory.js +1 -1
- package/dist/observability/bus.js +1 -1
- package/dist/observation/report.d.ts +11 -0
- package/dist/observation/report.d.ts.map +1 -1
- package/dist/observation/report.js.map +1 -1
- package/dist/primitives/version.d.ts +1 -1
- package/dist/primitives/version.js +1 -1
- package/dist/primitives/version.js.map +1 -1
- package/dist/provider.d.ts +1 -1
- package/dist/runtime/model-call-handle.js +1 -1
- package/dist/runtime/model-call-handle.js.map +1 -1
- package/dist/runtime/model-metadata.js +1 -1
- package/dist/runtime/model-metadata.js.map +1 -1
- package/dist/runtime/model-stream.js +1 -1
- package/dist/runtime/model-stream.js.map +1 -1
- package/dist/runtime/registry.d.ts +7 -1
- package/dist/runtime/registry.d.ts.map +1 -1
- package/dist/runtime/registry.js +1 -1
- package/dist/runtime/registry.js.map +1 -1
- package/dist/tools.d.ts +4 -1
- package/dist/tools.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,5 +48,17 @@ const report = await call.report
|
|
|
48
48
|
The package includes message and stream contracts, model registry and retry primitives, normalized errors, usage accounting, explicit observation/correlation ports, and transactional provider-plugin registration. Provider HTTP/SSE transport, concrete exporters, filesystem skills, environment credentials, and protocol implementations belong to separate capability packages.
|
|
49
49
|
|
|
50
50
|
The documented root plus `/agent`, `/memory`, `/observability`, `/provider`,
|
|
51
|
-
`/skills`, `/tools`, and `./package.json` are public. Internal source paths are
|
|
51
|
+
`/skills`, `/tools`, `/embedding`, and `./package.json` are public. Internal source paths are
|
|
52
52
|
not compatibility contracts.
|
|
53
|
+
|
|
54
|
+
Opt-in optimization helpers added in 0.1.5 (currently unreleased) include `defineActionFusion` and
|
|
55
|
+
`createModelEvidenceReducer` from `/tools`, and `createContextOptimizer` from
|
|
56
|
+
`/memory`. Applications select pipeline steps, milestone summaries, log storage,
|
|
57
|
+
and reducer models. See the [application guide](https://github.com/alvin0/ai-agent-sdk/blob/main/docs/context-optimization.md)
|
|
58
|
+
for configuration, exact-evidence fallback, and runnable validation.
|
|
59
|
+
|
|
60
|
+
Existing agent, tool, and session imports remain available. Review the
|
|
61
|
+
[upgrade guide](https://github.com/alvin0/ai-agent-sdk/blob/main/docs/upgrading-from-0.1.4.md)
|
|
62
|
+
for narration defaults, queued steering receipts, and managed-team validation
|
|
63
|
+
changes after the published 0.1.4 release. Program tools additionally require
|
|
64
|
+
session-level `experimentalPrograms` grants; ordinary tools do not.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{deepFreeze as e}from"../../primitives/freeze.js";import{SDK_VERSION as t}from"../../primitives/version.js";import{createObservationRunScope as n,createOperationId as r}from"../../observation/context.js";import{safeErrorRecord as i}from"../../observation/event.js";import{NOOP_OBSERVATION_PORT as a,createCoreSpan as o,disabledDeliverySummary as s,snapshotObservationSpan as c,validateCaptureReceipt as l}from"../../observation/port.js";import{AgentSdkError as u}from"../../errors/agent-sdk-error.js";import{OBSERVATION_ERROR_CODES as d}from"../../observation/report.js";import{hasUsageCounters as f,validateUsageCounters as p}from"../../observation/usage.js";import{OPERATION_KINDS as m}from"./config.js";import{accountingError as h}from"./common.js";import{aggregateUsage as g,authoritativeTokenUsage as _,budgetTokenTotal as v,missingCounters as y,summarizeModelCallUsage as b}from"./usage.js";import{AGENT_ACCOUNTING_ERROR_CODES as x}from"./error.js";import{estimateUsage as S}from"./estimate.js";const C=Object.freeze({turn:`sdk.agent.turn`,"model-call":`sdk.model.call`,"provider-attempt":`sdk.provider.attempt`,tool:`sdk.tool.call`,compaction:`sdk.compaction`,hook:`sdk.hook.call`,"user-input":`sdk.user.input.wait`,skill:`sdk.skill.operation`,memory:`sdk.memory.operation`,credential:`sdk.credential.operation`,integration:`sdk.integration.request`}),w=Object.freeze({turn:`sdk.agent.turn`,"model-call":`sdk.model.call`,"provider-attempt":`sdk.provider.attempt`,tool:`sdk.tool.call`,compaction:`sdk.compaction`,hook:`sdk.hook.call`,"user-input":`sdk.user.input.wait`,skill:`sdk.skill.operation`,memory:`sdk.memory.operation`,credential:`sdk.credential.operation`,integration:`sdk.integration.request`});var T=class{runId;traceId;modelInvocation;mode;terminalAuditFailure=!1;stoppedUsage;get usageStop(){return this.stoppedUsage}port;resource;scope=n();runSpan;startedAt=new Date().toISOString();startedMonotonic=this.scope.monotonicMs();tracker={accepted:0,rejected:0,pending:0,reached:`none`};limits;usagePolicy;estimationClosed=new AbortController;cumulativeTokenBudget;defectMode;operations=new Map;modelCalls=new Map;errors=[];serializedBytes=0;toolCalls=0;integrityUnknown=!1;closed=!1;finalReport;finalizing;constructor(n){if(typeof n.agentId!=`string`||n.agentId.trim().length===0)throw TypeError(`run ledger agentId must be non-empty`);if(n.maxTurns!==`auto`&&(!Number.isSafeInteger(n.maxTurns)||n.maxTurns<1))throw RangeError(`run ledger maxTurns must be a positive safe integer or 'auto'`);if(this.runId=n.runId??r(),this.runId.length===0)throw TypeError(`run ledger runId must be non-empty`);this.port=n.observation??a,this.resource=e(n.resource===void 0?{sdkName:`ai-agent-sdk`,sdkVersion:t,runtime:`unknown`}:{...n.resource}),this.mode=O(this.port,this.tracker),this.limits=E(n.limits),this.usagePolicy=D(n.usagePolicy),this.cumulativeTokenBudget=n.cumulativeTokenBudget??!1,this.defectMode=n.defectMode??`production`,this.runSpan=k(this.port,{name:`sdk.agent.run`,runId:this.runId,...n.parent===void 0?{}:{parent:n.parent},correlation:{...n.conversationId===void 0?{}:{conversationId:n.conversationId},...n.sessionId===void 0?{}:{sessionId:n.sessionId}},startedAt:this.startedAt,monotonicMs:this.startedMonotonic},this.tracker),this.traceId=this.runSpan.correlation.traceId;let i=n.logger?.(this.runSpan.correlation);this.modelInvocation=Object.freeze({observation:this.port,correlation:this.runSpan.correlation,terminalCheckpointOwner:`agent-run`,scope:this.scope,...i===void 0?{}:{logger:i}}),this.capture(this.event(`sdk.agent.run`,`start`,this.runSpan.correlation,{agentId:n.agentId,mode:n.mode,maxTurns:n.maxTurns}))}startOperation(t,n={}){if(this.assertOpen(`operation start`),!m.includes(t))throw TypeError(`unknown tracked operation kind '${String(t)}'`);let i=n.operationId??r();if(this.operations.has(i))return this.defect(`duplicate ${t} operation start '${i}'`),i;t===`tool`&&(this.toolCalls>=this.limits.maxToolCalls&&this.limit(`run exceeded ${this.limits.maxToolCalls} tool calls`),this.toolCalls++);let a=new Date().toISOString(),o=this.scope.monotonicMs(),s=k(this.port,{name:w[t],runId:this.runId,parent:this.runSpan.correlation,correlation:n.toolCallId===void 0?{}:{toolCallId:n.toolCallId},startedAt:a,monotonicMs:o},this.tracker),c=e({...n.data??{}});return this.charge({id:i,kind:t,data:c}),this.operations.set(i,{id:i,kind:t,span:s,startedAt:a,startedMonotonic:o,data:c}),this.capture(this.event(C[t],`start`,s.correlation,c)),i}endOperation(t,n,r={}){let a=this.operations.get(t);if(a===void 0){this.defect(`orphan operation terminal '${t}'`);return}if(a.status!==void 0){this.defect(`duplicate operation terminal '${t}'`),a.status=`unknown`;return}if(!L(n))throw TypeError(`invalid operation status '${String(n)}'`);let o=new Date().toISOString(),s=this.scope.monotonicMs();a.status=n,r.error!==void 0&&(a.error=i(r.error)),a.span.end(n,o,s),a.error!==void 0&&this.errors.push(a.error);let c=e({...r.data??{},status:n,durationMs:Math.max(0,s-a.startedMonotonic),...a.error===void 0?{}:{error:I(a.error)}});this.charge(c),this.capture(this.event(C[a.kind],`end`,a.span.correlation,c))}async recordModelCall(t,n){if(this.assertOpen(`model-call usage`),this.modelCalls.has(t.modelCallId)){this.defect(`duplicate model-call terminal '${t.modelCallId}'`);let e=Object.freeze({report:this.modelCalls.get(t.modelCallId)??t,usageRequired:!0,usageUnavailable:!1});return this.stoppedUsage??=e,e}this.modelCalls.size>=this.limits.maxModelCalls&&this.limit(`run exceeded ${this.limits.maxModelCalls} logical model calls`),t.attempts.length>this.limits.maxAttemptsPerCall&&this.limit(`model call '${t.modelCallId}' exceeded ${this.limits.maxAttemptsPerCall} attempts`),this.charge(t),this.modelCalls.set(t.modelCallId,t),j(this.tracker,t.delivery);let r=this.errors.length;t.error!==void 0&&this.errors.push(t.error);for(let e of t.attempts)e.error!==void 0&&this.errors.push(e.error);let i=t,a=!1,o=t.coverage===`missing`||t.coverage===`partial`;if(o&&this.usagePolicy.onMissing===`estimate`)try{let r=this.usagePolicy.estimator;if(r===void 0)throw TypeError(`estimate usage policy requires an estimator`);let a=await S(r,{runId:this.runId,modelCallId:t.modelCallId,provider:t.provider,model:t.model,request:n,report:t},this.estimationClosed.signal,this.usagePolicy.estimateTimeoutMs);if(this.closed)return{report:t,usageRequired:!0,usageUnavailable:!1};let o=p(a);if(o.invalidFields.length>0||o.overflow||!f(o.reported))throw TypeError(`usage estimator returned invalid or empty counters`);let s=y(o.reported,t.reported);if(!f(s))throw TypeError(`usage estimator did not cover a missing counter`);i=e({...t,coverage:f(t.reported)?`partial`:`estimated`,estimated:s,authoritative:!1})}catch(e){if(this.closed)return{report:t,usageRequired:!0,usageUnavailable:!1};a=!0,this.errors.splice(r,0,h(`usage estimation failed after a provider response`,d.USAGE_REQUIRED,e))}else o&&this.usagePolicy.onMissing===`fail`?(a=!0,this.errors.splice(r,0,h(`provider usage is required by the configured run policy`,d.USAGE_REQUIRED))):o&&t.error?.code!==d.USAGE_MISSING&&this.errors.splice(r,0,h(`model call completed without authoritative provider usage`,d.USAGE_MISSING));i!==t&&this.charge({estimated:i.estimated,coverage:i.coverage,authoritative:!1}),this.modelCalls.set(i.modelCallId,i);let s=Object.freeze({report:i,usageRequired:a,usageUnavailable:!a&&o&&this.usagePolicy.onMissing===`warn`&&this.cumulativeTokenBudget&&i.possiblyBilledAttemptsWithoutUsage>0});return(s.usageRequired||s.usageUnavailable)&&(this.stoppedUsage??=s),s}recordError(e){this.errors.push(i(e))}finalize(e,t,n){return this.finalReport===void 0?(this.finalizing===void 0&&(this.finalizing=this.finalizeOnce(e,t,n)),this.finalizing):Promise.resolve(this.finalReport)}async finalizeOnce(t,n,r){this.closed=!0,this.estimationClosed.abort(Error(`run ledger closed`)),r!==void 0&&this.errors.push(i(r)),this.closeOpenOperations();let a=this.integrityUnknown?`unknown`:t,o=new Date().toISOString(),s=this.scope.monotonicMs(),c=Math.max(0,s-this.startedMonotonic),l=g([...this.modelCalls.values()],this.errors),u=N(this.operations.values(),this.modelCalls.values());this.runSpan.end(a,o,s);let d=this.event(`sdk.agent.run`,`end`,this.runSpan.correlation,{status:a,durationMs:c,completed:n,usage:l,operationCounts:u,errorCount:this.errors.length});this.mode===`operational`?this.capture(d):await this.checkpoint(d);let f=M(this.port,this.mode,this.tracker),p=[...this.modelCalls.values()].map(t=>e({...t,delivery:f})),m=e({runId:this.runId,traceId:this.traceId,startedAt:this.startedAt,endedAt:o,durationMs:c,status:a,usage:l,modelCalls:p,operationCounts:u,errors:Object.freeze([...this.errors]),delivery:f});return this.finalReport=m,m}closeOpenOperations(){for(let e of this.operations.values()){if(e.status!==void 0)continue;this.integrityUnknown=!0;let t=h(`${e.kind} operation '${e.id}' closed without a terminal event`,d.OPERATION_TERMINAL_MISSING);this.errors.push(t);let n=new Date().toISOString(),r=this.scope.monotonicMs();e.status=`unknown`,e.error=t,e.span.end(`unknown`,n,r),this.capture(this.event(C[e.kind],`end`,e.span.correlation,{status:`unknown`,durationMs:Math.max(0,r-e.startedMonotonic),error:I(t)}))}}event(t,n,i,a){return e({schemaVersion:1,eventId:r(),sequence:this.scope.nextSequence(),name:t,phase:n,occurredAt:new Date().toISOString(),monotonicMs:this.scope.monotonicMs(),priority:`critical`,resource:this.resource,correlation:i,data:a})}capture(e){try{let t=l(this.port.capture(e),e.eventId);A(this.tracker,t)}catch(e){this.tracker.rejected++,this.tracker.lastFailure=i(e)}}async checkpoint(e){this.tracker.pending++;try{let t=this.port.checkpoint===void 0?{eventId:e.eventId,status:`rejected`,durable:!1,boundary:`none`,reason:`exporter-unavailable`}:await this.port.checkpoint(e);this.tracker.pending--;let n=l(t,e.eventId);A(this.tracker,n),(n.status!==`accepted`||!n.durable)&&(this.tracker.lastFailure=h(`run terminal checkpoint was ${n.status}`,d.CAPTURE_REJECTED),this.terminalAuditFailure=this.mode===`audit`)}catch(e){this.tracker.pending--,this.tracker.rejected++,this.tracker.lastFailure=i(e),this.terminalAuditFailure=this.mode===`audit`}}defect(e){let t=new u(e,x.LEDGER_STATE_INVALID);if(this.defectMode===`test`)throw t;this.integrityUnknown=!0,this.errors.push(i(t)),this.capture(this.event(`sdk.observer.failure`,`point`,this.runSpan.correlation,{observerId:`agent-run-ledger`,failureKind:`state-machine`,counter:this.errors.length,error:I(i(t))}))}limit(e){throw new u(e,d.LEDGER_LIMIT_EXCEEDED)}assertOpen(e){if(this.closed)throw this.defect(`${e} occurred after run ledger closure`),new u(`${e} occurred after run ledger closure`,x.LEDGER_STATE_INVALID)}charge(e){let t;try{let n=JSON.stringify(e);t=n===void 0?0:new TextEncoder().encode(n).byteLength}catch{this.limit(`run ledger state could not be represented as JSON`)}this.serializedBytes+t>this.limits.maxSerializedBytes&&this.limit(`run ledger exceeded ${this.limits.maxSerializedBytes} serialized bytes`),this.serializedBytes+=t}};function E(e){return Object.freeze({maxModelCalls:R(e?.maxModelCalls??1024,`maxModelCalls`),maxAttemptsPerCall:R(e?.maxAttemptsPerCall??16,`maxAttemptsPerCall`),maxToolCalls:R(e?.maxToolCalls??1e4,`maxToolCalls`),maxSerializedBytes:R(e?.maxSerializedBytes??16777216,`maxSerializedBytes`)})}function D(e){let t=e?.onMissing??`warn`;if(![`warn`,`estimate`,`fail`].includes(t))throw TypeError(`usage policy onMissing is invalid`);if(t===`estimate`&&(typeof e?.estimator?.id!=`string`||e.estimator.id.trim().length===0||typeof e.estimator.estimate!=`function`))throw TypeError(`estimate usage policy requires an estimator with a non-empty id`);let n=R(e?.estimateTimeoutMs??3e4,`estimateTimeoutMs`);if(n>2147483647)throw RangeError(`estimateTimeoutMs exceeds the timer range`);return Object.freeze({onMissing:t,estimateTimeoutMs:n,...e?.estimator===void 0?{}:{estimator:e.estimator}})}function O(e,t){try{let t=e.mode;if(t===`operational`||t===`reliable`||t===`audit`)return t;throw TypeError(`observation delivery mode is invalid`)}catch(e){return t.lastFailure=i(e),`operational`}}function k(e,t,n){try{let n=c(e.openSpan(t));if(n!==void 0&&n.correlation.runId===t.runId)return n;throw TypeError(`observation backend returned an invalid run span`)}catch(e){return n.lastFailure=i(e),o(t)}}function A(e,t){t.status===`accepted`?e.accepted++:e.rejected++,t.status===`accepted`&&z(t.boundary)>z(e.reached)&&(e.reached=t.boundary)}function j(e,t){e.accepted+=t.acceptedCritical,e.rejected+=t.rejectedCritical,e.pending+=t.pendingCritical,z(t.reachedBoundary)>z(e.reached)&&(e.reached=t.reachedBoundary),t.lastFailure!==void 0&&(e.lastFailure=t.lastFailure)}function M(t,n,r){if(t===a)return s();let i=n===`operational`?`none`:z(r.reached)>0?r.reached:`local-durable`;return e({mode:n,requiredBoundary:i,reachedBoundary:r.reached,complete:r.rejected===0&&r.pending===0&&z(r.reached)>=z(i),acceptedCritical:r.accepted,rejectedCritical:r.rejected,pendingCritical:r.pending,...r.lastFailure===void 0?{}:{lastFailure:r.lastFailure}})}function N(t,n){let r=Object.fromEntries(m.map(e=>[e,P()]));for(let e of t)F(r[e.kind],e.status??`unknown`);for(let e of n){F(r[`model-call`],e.status);for(let t of e.attempts)F(r[`provider-attempt`],t.status)}return e(Object.fromEntries(m.map(e=>[e,{...r[e]}])))}function P(){return{total:0,success:0,error:0,aborted:0,rejected:0,unknown:0}}function F(e,t){e.total++,e[t]++}function I(e){return{type:e.type,message:e.message,...e.code===void 0?{}:{code:e.code},...e.retryable===void 0?{}:{retryable:e.retryable},...e.status===void 0?{}:{status:e.status},...e.causeTypes===void 0?{}:{causeTypes:[...e.causeTypes]}}}function L(e){return e===`success`||e===`error`||e===`aborted`||e===`rejected`||e===`unknown`}function R(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`${t} must be a positive safe integer`);return e}function z(e){return e===`remote-acknowledged`?2:+(e===`local-durable`)}export{T as RunLedger,_ as authoritativeTokenUsage,v as budgetTokenTotal,b as summarizeModelCallUsage};
|
|
1
|
+
import{deepFreeze as e}from"../../primitives/freeze.js";import{SDK_VERSION as t}from"../../primitives/version.js";import{createObservationRunScope as n,createOperationId as r}from"../../observation/context.js";import{safeErrorRecord as i}from"../../observation/event.js";import{NOOP_OBSERVATION_PORT as a,createCoreSpan as o,disabledDeliverySummary as s,snapshotObservationSpan as c,validateCaptureReceipt as l}from"../../observation/port.js";import{AgentSdkError as u}from"../../errors/agent-sdk-error.js";import{OBSERVATION_ERROR_CODES as d}from"../../observation/report.js";import{hasUsageCounters as f,validateUsageCounters as p}from"../../observation/usage.js";import{OPERATION_KINDS as m}from"./config.js";import{accountingError as h}from"./common.js";import{aggregateUsage as g,authoritativeTokenUsage as _,budgetTokenTotal as v,missingCounters as y,summarizeModelCallUsage as b}from"./usage.js";import{AGENT_ACCOUNTING_ERROR_CODES as x}from"./error.js";import{estimateUsage as S}from"./estimate.js";const C=Object.freeze({turn:`sdk.agent.turn`,"model-call":`sdk.model.call`,"provider-attempt":`sdk.provider.attempt`,tool:`sdk.tool.call`,compaction:`sdk.compaction`,hook:`sdk.hook.call`,"user-input":`sdk.user.input.wait`,skill:`sdk.skill.operation`,memory:`sdk.memory.operation`,credential:`sdk.credential.operation`,integration:`sdk.integration.request`}),w=Object.freeze({turn:`sdk.agent.turn`,"model-call":`sdk.model.call`,"provider-attempt":`sdk.provider.attempt`,tool:`sdk.tool.call`,compaction:`sdk.compaction`,hook:`sdk.hook.call`,"user-input":`sdk.user.input.wait`,skill:`sdk.skill.operation`,memory:`sdk.memory.operation`,credential:`sdk.credential.operation`,integration:`sdk.integration.request`});var T=class{runId;traceId;modelInvocation;mode;terminalAuditFailure=!1;stoppedUsage;get usageStop(){return this.stoppedUsage}port;resource;scope=n();runSpan;startedAt=new Date().toISOString();startedMonotonic=this.scope.monotonicMs();tracker={accepted:0,rejected:0,pending:0,reached:`none`};limits;usagePolicy;estimationClosed=new AbortController;cumulativeTokenBudget;defectMode;operations=new Map;modelCalls=new Map;errors=[];serializedBytes=0;toolCalls=0;integrityUnknown=!1;closed=!1;finalReport;finalizing;constructor(n){if(typeof n.agentId!=`string`||n.agentId.trim().length===0)throw TypeError(`run ledger agentId must be non-empty`);if(n.maxTurns!==`auto`&&(!Number.isSafeInteger(n.maxTurns)||n.maxTurns<1))throw RangeError(`run ledger maxTurns must be a positive safe integer or 'auto'`);if(this.runId=n.runId??r(),this.runId.length===0)throw TypeError(`run ledger runId must be non-empty`);this.port=n.observation??a,this.resource=e(n.resource===void 0?{sdkName:`ai-agent-sdk`,sdkVersion:t,runtime:`unknown`}:{...n.resource}),this.mode=O(this.port,this.tracker),this.limits=E(n.limits),this.usagePolicy=D(n.usagePolicy),this.cumulativeTokenBudget=n.cumulativeTokenBudget??!1,this.defectMode=n.defectMode??`production`,this.runSpan=k(this.port,{name:`sdk.agent.run`,runId:this.runId,...n.parent===void 0?{}:{parent:n.parent},correlation:{...n.conversationId===void 0?{}:{conversationId:n.conversationId},...n.sessionId===void 0?{}:{sessionId:n.sessionId}},startedAt:this.startedAt,monotonicMs:this.startedMonotonic},this.tracker),this.traceId=this.runSpan.correlation.traceId;let i=n.logger?.(this.runSpan.correlation);this.modelInvocation=Object.freeze({observation:this.port,agentId:n.agentId,correlation:this.runSpan.correlation,terminalCheckpointOwner:`agent-run`,scope:this.scope,...i===void 0?{}:{logger:i},...n.providerOptions===void 0?{}:{providerOptions:n.providerOptions}}),this.capture(this.event(`sdk.agent.run`,`start`,this.runSpan.correlation,{agentId:n.agentId,mode:n.mode,maxTurns:n.maxTurns}))}startOperation(t,n={}){if(this.assertOpen(`operation start`),!m.includes(t))throw TypeError(`unknown tracked operation kind '${String(t)}'`);let i=n.operationId??r();if(this.operations.has(i))return this.defect(`duplicate ${t} operation start '${i}'`),i;t===`tool`&&(this.toolCalls>=this.limits.maxToolCalls&&this.limit(`run exceeded ${this.limits.maxToolCalls} tool calls`),this.toolCalls++);let a=new Date().toISOString(),o=this.scope.monotonicMs(),s=k(this.port,{name:w[t],runId:this.runId,parent:this.runSpan.correlation,correlation:n.toolCallId===void 0?{}:{toolCallId:n.toolCallId},startedAt:a,monotonicMs:o},this.tracker),c=e({...n.data??{}});return this.charge({id:i,kind:t,data:c}),this.operations.set(i,{id:i,kind:t,span:s,startedAt:a,startedMonotonic:o,data:c}),this.capture(this.event(C[t],`start`,s.correlation,c)),i}endOperation(t,n,r={}){let a=this.operations.get(t);if(a===void 0){this.defect(`orphan operation terminal '${t}'`);return}if(a.status!==void 0){this.defect(`duplicate operation terminal '${t}'`),a.status=`unknown`;return}if(!L(n))throw TypeError(`invalid operation status '${String(n)}'`);let o=new Date().toISOString(),s=this.scope.monotonicMs();a.status=n,r.error!==void 0&&(a.error=i(r.error)),a.span.end(n,o,s),a.error!==void 0&&this.errors.push(a.error);let c=e({...r.data??{},status:n,durationMs:Math.max(0,s-a.startedMonotonic),...a.error===void 0?{}:{error:I(a.error)}});this.charge(c),this.capture(this.event(C[a.kind],`end`,a.span.correlation,c))}async recordModelCall(t,n){if(this.assertOpen(`model-call usage`),this.modelCalls.has(t.modelCallId)){this.defect(`duplicate model-call terminal '${t.modelCallId}'`);let e=Object.freeze({report:this.modelCalls.get(t.modelCallId)??t,usageRequired:!0,usageUnavailable:!1});return this.stoppedUsage??=e,e}this.modelCalls.size>=this.limits.maxModelCalls&&this.limit(`run exceeded ${this.limits.maxModelCalls} logical model calls`),t.attempts.length>this.limits.maxAttemptsPerCall&&this.limit(`model call '${t.modelCallId}' exceeded ${this.limits.maxAttemptsPerCall} attempts`),this.charge(t),this.modelCalls.set(t.modelCallId,t),j(this.tracker,t.delivery);let r=this.errors.length;t.error!==void 0&&this.errors.push(t.error);for(let e of t.attempts)e.error!==void 0&&this.errors.push(e.error);let i=t,a=!1,o=t.coverage===`missing`||t.coverage===`partial`;if(o&&this.usagePolicy.onMissing===`estimate`)try{let r=this.usagePolicy.estimator;if(r===void 0)throw TypeError(`estimate usage policy requires an estimator`);let a=await S(r,{runId:this.runId,modelCallId:t.modelCallId,provider:t.provider,model:t.model,request:n,report:t},this.estimationClosed.signal,this.usagePolicy.estimateTimeoutMs);if(this.closed)return{report:t,usageRequired:!0,usageUnavailable:!1};let o=p(a);if(o.invalidFields.length>0||o.overflow||!f(o.reported))throw TypeError(`usage estimator returned invalid or empty counters`);let s=y(o.reported,t.reported);if(!f(s))throw TypeError(`usage estimator did not cover a missing counter`);i=e({...t,coverage:f(t.reported)?`partial`:`estimated`,estimated:s,authoritative:!1})}catch(e){if(this.closed)return{report:t,usageRequired:!0,usageUnavailable:!1};a=!0,this.errors.splice(r,0,h(`usage estimation failed after a provider response`,d.USAGE_REQUIRED,e))}else o&&this.usagePolicy.onMissing===`fail`?(a=!0,this.errors.splice(r,0,h(`provider usage is required by the configured run policy`,d.USAGE_REQUIRED))):o&&t.error?.code!==d.USAGE_MISSING&&this.errors.splice(r,0,h(`model call completed without authoritative provider usage`,d.USAGE_MISSING));i!==t&&this.charge({estimated:i.estimated,coverage:i.coverage,authoritative:!1}),this.modelCalls.set(i.modelCallId,i);let s=Object.freeze({report:i,usageRequired:a,usageUnavailable:!a&&o&&this.usagePolicy.onMissing===`warn`&&this.cumulativeTokenBudget&&i.possiblyBilledAttemptsWithoutUsage>0});return(s.usageRequired||s.usageUnavailable)&&(this.stoppedUsage??=s),s}recordError(e){this.errors.push(i(e))}finalize(e,t,n){return this.finalReport===void 0?(this.finalizing===void 0&&(this.finalizing=this.finalizeOnce(e,t,n)),this.finalizing):Promise.resolve(this.finalReport)}async finalizeOnce(t,n,r){this.closed=!0,this.estimationClosed.abort(Error(`run ledger closed`)),r!==void 0&&this.errors.push(i(r)),this.closeOpenOperations();let a=this.integrityUnknown?`unknown`:t,o=new Date().toISOString(),s=this.scope.monotonicMs(),c=Math.max(0,s-this.startedMonotonic),l=g([...this.modelCalls.values()],this.errors),u=N(this.operations.values(),this.modelCalls.values());this.runSpan.end(a,o,s);let d=this.event(`sdk.agent.run`,`end`,this.runSpan.correlation,{status:a,durationMs:c,completed:n,usage:l,operationCounts:u,errorCount:this.errors.length});this.mode===`operational`?this.capture(d):await this.checkpoint(d);let f=M(this.port,this.mode,this.tracker),p=[...this.modelCalls.values()].map(t=>e({...t,delivery:f})),m=e({runId:this.runId,traceId:this.traceId,startedAt:this.startedAt,endedAt:o,durationMs:c,status:a,usage:l,modelCalls:p,operationCounts:u,errors:Object.freeze([...this.errors]),delivery:f});return this.finalReport=m,m}closeOpenOperations(){for(let e of this.operations.values()){if(e.status!==void 0)continue;this.integrityUnknown=!0;let t=h(`${e.kind} operation '${e.id}' closed without a terminal event`,d.OPERATION_TERMINAL_MISSING);this.errors.push(t);let n=new Date().toISOString(),r=this.scope.monotonicMs();e.status=`unknown`,e.error=t,e.span.end(`unknown`,n,r),this.capture(this.event(C[e.kind],`end`,e.span.correlation,{status:`unknown`,durationMs:Math.max(0,r-e.startedMonotonic),error:I(t)}))}}event(t,n,i,a){return e({schemaVersion:1,eventId:r(),sequence:this.scope.nextSequence(),name:t,phase:n,occurredAt:new Date().toISOString(),monotonicMs:this.scope.monotonicMs(),priority:`critical`,resource:this.resource,correlation:i,data:a})}capture(e){try{let t=l(this.port.capture(e),e.eventId);A(this.tracker,t)}catch(e){this.tracker.rejected++,this.tracker.lastFailure=i(e)}}async checkpoint(e){this.tracker.pending++;try{let t=this.port.checkpoint===void 0?{eventId:e.eventId,status:`rejected`,durable:!1,boundary:`none`,reason:`exporter-unavailable`}:await this.port.checkpoint(e);this.tracker.pending--;let n=l(t,e.eventId);A(this.tracker,n),(n.status!==`accepted`||!n.durable)&&(this.tracker.lastFailure=h(`run terminal checkpoint was ${n.status}`,d.CAPTURE_REJECTED),this.terminalAuditFailure=this.mode===`audit`)}catch(e){this.tracker.pending--,this.tracker.rejected++,this.tracker.lastFailure=i(e),this.terminalAuditFailure=this.mode===`audit`}}defect(e){let t=new u(e,x.LEDGER_STATE_INVALID);if(this.defectMode===`test`)throw t;this.integrityUnknown=!0,this.errors.push(i(t)),this.capture(this.event(`sdk.observer.failure`,`point`,this.runSpan.correlation,{observerId:`agent-run-ledger`,failureKind:`state-machine`,counter:this.errors.length,error:I(i(t))}))}limit(e){throw new u(e,d.LEDGER_LIMIT_EXCEEDED)}assertOpen(e){if(this.closed)throw this.defect(`${e} occurred after run ledger closure`),new u(`${e} occurred after run ledger closure`,x.LEDGER_STATE_INVALID)}charge(e){let t;try{let n=JSON.stringify(e);t=n===void 0?0:new TextEncoder().encode(n).byteLength}catch{this.limit(`run ledger state could not be represented as JSON`)}this.serializedBytes+t>this.limits.maxSerializedBytes&&this.limit(`run ledger exceeded ${this.limits.maxSerializedBytes} serialized bytes`),this.serializedBytes+=t}};function E(e){return Object.freeze({maxModelCalls:R(e?.maxModelCalls??1024,`maxModelCalls`),maxAttemptsPerCall:R(e?.maxAttemptsPerCall??16,`maxAttemptsPerCall`),maxToolCalls:R(e?.maxToolCalls??1e4,`maxToolCalls`),maxSerializedBytes:R(e?.maxSerializedBytes??16777216,`maxSerializedBytes`)})}function D(e){let t=e?.onMissing??`warn`;if(![`warn`,`estimate`,`fail`].includes(t))throw TypeError(`usage policy onMissing is invalid`);if(t===`estimate`&&(typeof e?.estimator?.id!=`string`||e.estimator.id.trim().length===0||typeof e.estimator.estimate!=`function`))throw TypeError(`estimate usage policy requires an estimator with a non-empty id`);let n=R(e?.estimateTimeoutMs??3e4,`estimateTimeoutMs`);if(n>2147483647)throw RangeError(`estimateTimeoutMs exceeds the timer range`);return Object.freeze({onMissing:t,estimateTimeoutMs:n,...e?.estimator===void 0?{}:{estimator:e.estimator}})}function O(e,t){try{let t=e.mode;if(t===`operational`||t===`reliable`||t===`audit`)return t;throw TypeError(`observation delivery mode is invalid`)}catch(e){return t.lastFailure=i(e),`operational`}}function k(e,t,n){try{let n=c(e.openSpan(t));if(n!==void 0&&n.correlation.runId===t.runId)return n;throw TypeError(`observation backend returned an invalid run span`)}catch(e){return n.lastFailure=i(e),o(t)}}function A(e,t){t.status===`accepted`?e.accepted++:e.rejected++,t.status===`accepted`&&z(t.boundary)>z(e.reached)&&(e.reached=t.boundary)}function j(e,t){e.accepted+=t.acceptedCritical,e.rejected+=t.rejectedCritical,e.pending+=t.pendingCritical,z(t.reachedBoundary)>z(e.reached)&&(e.reached=t.reachedBoundary),t.lastFailure!==void 0&&(e.lastFailure=t.lastFailure)}function M(t,n,r){if(t===a)return s();let i=n===`operational`?`none`:z(r.reached)>0?r.reached:`local-durable`;return e({mode:n,requiredBoundary:i,reachedBoundary:r.reached,complete:r.rejected===0&&r.pending===0&&z(r.reached)>=z(i),acceptedCritical:r.accepted,rejectedCritical:r.rejected,pendingCritical:r.pending,...r.lastFailure===void 0?{}:{lastFailure:r.lastFailure}})}function N(t,n){let r=Object.fromEntries(m.map(e=>[e,P()]));for(let e of t)F(r[e.kind],e.status??`unknown`);for(let e of n){F(r[`model-call`],e.status);for(let t of e.attempts)F(r[`provider-attempt`],t.status)}return e(Object.fromEntries(m.map(e=>[e,{...r[e]}])))}function P(){return{total:0,success:0,error:0,aborted:0,rejected:0,unknown:0}}function F(e,t){e.total++,e[t]++}function I(e){return{type:e.type,message:e.message,...e.code===void 0?{}:{code:e.code},...e.retryable===void 0?{}:{retryable:e.retryable},...e.status===void 0?{}:{status:e.status},...e.causeTypes===void 0?{}:{causeTypes:[...e.causeTypes]}}}function L(e){return e===`success`||e===`error`||e===`aborted`||e===`rejected`||e===`unknown`}function R(e,t){if(!Number.isSafeInteger(e)||e<1)throw RangeError(`${t} must be a positive safe integer`);return e}function z(e){return e===`remote-acknowledged`?2:+(e===`local-durable`)}export{T as RunLedger,_ as authoritativeTokenUsage,v as budgetTokenTotal,b as summarizeModelCallUsage};
|
|
2
2
|
//# sourceMappingURL=ledger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","names":[],"sources":["../../../src/agent/accounting/ledger.ts"],"sourcesContent":["import { AgentSdkError } from '../../errors/index.ts'\nimport {\n NOOP_OBSERVATION_PORT, OBSERVATION_ERROR_CODES, createCoreSpan, createObservationRunScope,\n createOperationId, disabledDeliverySummary, hasUsageCounters, safeErrorRecord,\n snapshotObservationSpan, validateCaptureReceipt, validateUsageCounters, type CaptureReceipt,\n type CorrelationContext, type DeliveryMode, type ModelCallReport, type ModelInvocationContext,\n type ObservationBoundary, type ObservationDeliverySummary, type ObservationEvent,\n type ObservationEventName, type ObservationPort, type ObservationResource, type ObservationSpan,\n type OperationStatus, type SafeErrorRecord,\n} from '../../observation/index.ts'\nimport { SDK_VERSION, deepFreeze, type JsonObject } from '../../primitives/index.ts'\nimport { type GenerateOptions } from '../../contract/index.ts'\nimport { AGENT_ACCOUNTING_ERROR_CODES } from './error.ts'\nimport type {\n EndRunOperationInput, ModelCallPolicyDecision, RunAccountingPort, StartRunOperationInput,\n} from './contracts.ts'\nimport type {\n LegacyRunReport, RunLedgerLimits, RunOperationCounts, TrackedOperationKind, UsagePolicy,\n} from './report.ts'\nimport { aggregateUsage, missingCounters } from './usage.ts'\nimport { estimateUsage } from './estimate.ts'\nimport { accountingError } from './common.ts'\nimport { OPERATION_KINDS } from './config.ts'\nimport type { SdkLogger } from '../../logging/types.ts'\n\nconst OPERATION_EVENT: Readonly<Record<TrackedOperationKind, ObservationEventName>> = Object.freeze({\n turn: 'sdk.agent.turn',\n 'model-call': 'sdk.model.call',\n 'provider-attempt': 'sdk.provider.attempt',\n tool: 'sdk.tool.call',\n compaction: 'sdk.compaction',\n hook: 'sdk.hook.call',\n 'user-input': 'sdk.user.input.wait',\n skill: 'sdk.skill.operation',\n memory: 'sdk.memory.operation',\n credential: 'sdk.credential.operation',\n integration: 'sdk.integration.request',\n})\n\nconst OPERATION_SPAN: Readonly<Record<TrackedOperationKind, Parameters<ObservationPort['openSpan']>[0]['name']>> = Object.freeze({\n turn: 'sdk.agent.turn',\n 'model-call': 'sdk.model.call',\n 'provider-attempt': 'sdk.provider.attempt',\n tool: 'sdk.tool.call',\n compaction: 'sdk.compaction',\n hook: 'sdk.hook.call',\n 'user-input': 'sdk.user.input.wait',\n skill: 'sdk.skill.operation',\n memory: 'sdk.memory.operation',\n credential: 'sdk.credential.operation',\n integration: 'sdk.integration.request',\n})\n\ninterface ResolvedLimits {\n readonly maxModelCalls: number\n readonly maxAttemptsPerCall: number\n readonly maxToolCalls: number\n readonly maxSerializedBytes: number\n}\n\ninterface DeliveryTracker {\n accepted: number\n rejected: number\n pending: number\n reached: ObservationBoundary\n lastFailure?: SafeErrorRecord\n}\n\ninterface MutableOperation {\n readonly id: string\n readonly kind: TrackedOperationKind\n readonly span: ObservationSpan\n readonly startedAt: string\n readonly startedMonotonic: number\n readonly data: JsonObject\n status?: OperationStatus\n error?: SafeErrorRecord\n}\n\nexport interface RunLedgerOptions {\n readonly runId?: string\n readonly observation?: ObservationPort\n readonly resource?: ObservationResource\n readonly parent?: CorrelationContext\n readonly conversationId?: string\n readonly sessionId?: string\n readonly agentId: string\n readonly mode: string\n readonly maxTurns: number | 'auto'\n readonly usagePolicy?: UsagePolicy\n readonly cumulativeTokenBudget?: boolean\n readonly limits?: RunLedgerLimits\n readonly logger?: (correlation: CorrelationContext) => SdkLogger\n /** Contract tests throw immediately; production records health and finalizes unknown. */\n readonly defectMode?: 'production' | 'test'\n}\n\n/** Canonical append-only accounting state for one agent invocation. */\nexport class RunLedger implements RunAccountingPort {\n readonly runId: string\n readonly traceId: CorrelationContext['traceId']\n readonly modelInvocation: ModelInvocationContext\n readonly mode: DeliveryMode\n terminalAuditFailure = false\n private stoppedUsage: ModelCallPolicyDecision | undefined\n get usageStop(): ModelCallPolicyDecision | undefined { return this.stoppedUsage }\n\n private readonly port: ObservationPort\n private readonly resource: ObservationResource\n private readonly scope = createObservationRunScope()\n private readonly runSpan: ObservationSpan\n private readonly startedAt = new Date().toISOString()\n private readonly startedMonotonic = this.scope.monotonicMs()\n private readonly tracker: DeliveryTracker = { accepted: 0, rejected: 0, pending: 0, reached: 'none' }\n private readonly limits: ResolvedLimits\n private readonly usagePolicy: Required<Pick<UsagePolicy, 'onMissing' | 'estimateTimeoutMs'>> & Pick<UsagePolicy, 'estimator'>\n private readonly estimationClosed = new AbortController()\n private readonly cumulativeTokenBudget: boolean\n private readonly defectMode: 'production' | 'test'\n private readonly operations = new Map<string, MutableOperation>()\n private readonly modelCalls = new Map<string, ModelCallReport>()\n private readonly errors: SafeErrorRecord[] = []\n private serializedBytes = 0\n private toolCalls = 0\n private integrityUnknown = false\n private closed = false\n private finalReport: LegacyRunReport | undefined\n private finalizing: Promise<LegacyRunReport> | undefined\n\n constructor(options: RunLedgerOptions) {\n if (typeof options.agentId !== 'string' || options.agentId.trim().length === 0) {\n throw new TypeError('run ledger agentId must be non-empty')\n }\n if (options.maxTurns !== 'auto' && (!Number.isSafeInteger(options.maxTurns) || options.maxTurns < 1)) {\n throw new RangeError(\"run ledger maxTurns must be a positive safe integer or 'auto'\")\n }\n this.runId = options.runId ?? createOperationId()\n if (this.runId.length === 0) throw new TypeError('run ledger runId must be non-empty')\n this.port = options.observation ?? NOOP_OBSERVATION_PORT\n this.resource = deepFreeze(options.resource === undefined\n ? { sdkName: 'ai-agent-sdk', sdkVersion: SDK_VERSION, runtime: 'unknown' }\n : { ...options.resource })\n this.mode = observationMode(this.port, this.tracker)\n this.limits = resolveLimits(options.limits)\n this.usagePolicy = resolveUsagePolicy(options.usagePolicy)\n this.cumulativeTokenBudget = options.cumulativeTokenBudget ?? false\n this.defectMode = options.defectMode ?? 'production'\n this.runSpan = openSpan(this.port, {\n name: 'sdk.agent.run',\n runId: this.runId,\n ...(options.parent === undefined ? {} : { parent: options.parent }),\n correlation: {\n ...(options.conversationId === undefined ? {} : { conversationId: options.conversationId }),\n ...(options.sessionId === undefined ? {} : { sessionId: options.sessionId }),\n },\n startedAt: this.startedAt,\n monotonicMs: this.startedMonotonic,\n }, this.tracker)\n this.traceId = this.runSpan.correlation.traceId\n const logger = options.logger?.(this.runSpan.correlation)\n this.modelInvocation = Object.freeze({\n observation: this.port,\n correlation: this.runSpan.correlation,\n terminalCheckpointOwner: 'agent-run' as const,\n scope: this.scope,\n ...(logger === undefined ? {} : { logger }),\n })\n this.capture(this.event('sdk.agent.run', 'start', this.runSpan.correlation, {\n agentId: options.agentId,\n mode: options.mode,\n maxTurns: options.maxTurns,\n }))\n }\n\n startOperation(kind: TrackedOperationKind, input: StartRunOperationInput = {}): string {\n this.assertOpen('operation start')\n if (!OPERATION_KINDS.includes(kind)) throw new TypeError(`unknown tracked operation kind '${String(kind)}'`)\n const id = input.operationId ?? createOperationId()\n if (this.operations.has(id)) {\n this.defect(`duplicate ${kind} operation start '${id}'`)\n return id\n }\n if (kind === 'tool') {\n if (this.toolCalls >= this.limits.maxToolCalls) this.limit(`run exceeded ${this.limits.maxToolCalls} tool calls`)\n this.toolCalls++\n }\n const startedAt = new Date().toISOString()\n const startedMonotonic = this.scope.monotonicMs()\n const span = openSpan(this.port, {\n name: OPERATION_SPAN[kind],\n runId: this.runId,\n parent: this.runSpan.correlation,\n correlation: input.toolCallId === undefined ? {} : { toolCallId: input.toolCallId },\n startedAt,\n monotonicMs: startedMonotonic,\n }, this.tracker)\n const data = deepFreeze({ ...(input.data ?? {}) })\n this.charge({ id, kind, data })\n this.operations.set(id, { id, kind, span, startedAt, startedMonotonic, data })\n this.capture(this.event(OPERATION_EVENT[kind], 'start', span.correlation, data))\n return id\n }\n\n endOperation(operationId: string, status: OperationStatus, input: EndRunOperationInput = {}): void {\n const operation = this.operations.get(operationId)\n if (operation === undefined) {\n this.defect(`orphan operation terminal '${operationId}'`)\n return\n }\n if (operation.status !== undefined) {\n this.defect(`duplicate operation terminal '${operationId}'`)\n operation.status = 'unknown'\n return\n }\n if (!isOperationStatus(status)) throw new TypeError(`invalid operation status '${String(status)}'`)\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n operation.status = status\n if (input.error !== undefined) operation.error = safeErrorRecord(input.error)\n operation.span.end(status, endedAt, endedMonotonic)\n if (operation.error !== undefined) this.errors.push(operation.error)\n const data = deepFreeze({\n ...(input.data ?? {}),\n status,\n durationMs: Math.max(0, endedMonotonic - operation.startedMonotonic),\n ...(operation.error === undefined ? {} : { error: errorData(operation.error) }),\n })\n this.charge(data)\n this.capture(this.event(OPERATION_EVENT[operation.kind], 'end', operation.span.correlation, data))\n }\n\n async recordModelCall(report: ModelCallReport, request: GenerateOptions): Promise<ModelCallPolicyDecision> {\n this.assertOpen('model-call usage')\n if (this.modelCalls.has(report.modelCallId)) {\n this.defect(`duplicate model-call terminal '${report.modelCallId}'`)\n const decision = Object.freeze({ report: this.modelCalls.get(report.modelCallId) ?? report, usageRequired: true, usageUnavailable: false })\n this.stoppedUsage ??= decision\n return decision\n }\n if (this.modelCalls.size >= this.limits.maxModelCalls) {\n this.limit(`run exceeded ${this.limits.maxModelCalls} logical model calls`)\n }\n if (report.attempts.length > this.limits.maxAttemptsPerCall) {\n this.limit(`model call '${report.modelCallId}' exceeded ${this.limits.maxAttemptsPerCall} attempts`)\n }\n\n // Reserve identity and retain provider evidence before calling user code.\n this.charge(report)\n this.modelCalls.set(report.modelCallId, report)\n mergeDelivery(this.tracker, report.delivery)\n const policyErrorIndex = this.errors.length\n if (report.error !== undefined) this.errors.push(report.error)\n for (const attempt of report.attempts) if (attempt.error !== undefined) this.errors.push(attempt.error)\n let accepted = report\n let usageRequired = false\n const incomplete = report.coverage === 'missing' || report.coverage === 'partial'\n if (incomplete && this.usagePolicy.onMissing === 'estimate') {\n try {\n const estimator = this.usagePolicy.estimator\n if (estimator === undefined) throw new TypeError('estimate usage policy requires an estimator')\n const raw = await estimateUsage(estimator, {\n runId: this.runId,\n modelCallId: report.modelCallId,\n provider: report.provider,\n model: report.model,\n request,\n report,\n }, this.estimationClosed.signal, this.usagePolicy.estimateTimeoutMs)\n if (this.closed) return { report, usageRequired: true, usageUnavailable: false }\n const validation = validateUsageCounters(raw)\n if (validation.invalidFields.length > 0 || validation.overflow || !hasUsageCounters(validation.reported)) {\n throw new TypeError('usage estimator returned invalid or empty counters')\n }\n const estimated = missingCounters(validation.reported, report.reported)\n if (!hasUsageCounters(estimated)) throw new TypeError('usage estimator did not cover a missing counter')\n accepted = deepFreeze({\n ...report,\n coverage: hasUsageCounters(report.reported) ? 'partial' as const : 'estimated' as const,\n estimated,\n authoritative: false,\n })\n } catch (estimatorError) {\n if (this.closed) return { report, usageRequired: true, usageUnavailable: false }\n usageRequired = true\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'usage estimation failed after a provider response',\n OBSERVATION_ERROR_CODES.USAGE_REQUIRED,\n estimatorError,\n ))\n }\n } else if (incomplete && this.usagePolicy.onMissing === 'fail') {\n usageRequired = true\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'provider usage is required by the configured run policy',\n OBSERVATION_ERROR_CODES.USAGE_REQUIRED,\n ))\n } else if (incomplete && report.error?.code !== OBSERVATION_ERROR_CODES.USAGE_MISSING) {\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'model call completed without authoritative provider usage',\n OBSERVATION_ERROR_CODES.USAGE_MISSING,\n ))\n }\n\n // Conservatively charge the added projection including its field names and\n // changed coverage, not just the counter values inside `estimated`.\n if (accepted !== report) this.charge({\n estimated: accepted.estimated, coverage: accepted.coverage, authoritative: false,\n })\n this.modelCalls.set(accepted.modelCallId, accepted)\n const decision = Object.freeze({\n report: accepted,\n usageRequired,\n usageUnavailable: !usageRequired\n && incomplete\n && this.usagePolicy.onMissing === 'warn'\n && this.cumulativeTokenBudget\n && accepted.possiblyBilledAttemptsWithoutUsage > 0,\n })\n if (decision.usageRequired || decision.usageUnavailable) this.stoppedUsage ??= decision\n return decision\n }\n\n recordError(error: unknown): void {\n this.errors.push(safeErrorRecord(error))\n }\n\n finalize(status: OperationStatus, completed: boolean, error?: unknown): Promise<LegacyRunReport> {\n if (this.finalReport !== undefined) return Promise.resolve(this.finalReport)\n if (this.finalizing !== undefined) return this.finalizing\n this.finalizing = this.finalizeOnce(status, completed, error)\n return this.finalizing\n }\n\n private async finalizeOnce(status: OperationStatus, completed: boolean, error?: unknown): Promise<LegacyRunReport> {\n this.closed = true\n this.estimationClosed.abort(new Error('run ledger closed'))\n if (error !== undefined) this.errors.push(safeErrorRecord(error))\n this.closeOpenOperations()\n const finalStatus: OperationStatus = this.integrityUnknown ? 'unknown' : status\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n const durationMs = Math.max(0, endedMonotonic - this.startedMonotonic)\n const usage = aggregateUsage([...this.modelCalls.values()], this.errors)\n const operationCounts = operationCountsOf(this.operations.values(), this.modelCalls.values())\n this.runSpan.end(finalStatus, endedAt, endedMonotonic)\n const endEvent = this.event('sdk.agent.run', 'end', this.runSpan.correlation, {\n status: finalStatus,\n durationMs,\n completed,\n usage: usage as unknown as JsonObject,\n operationCounts: operationCounts as unknown as JsonObject,\n errorCount: this.errors.length,\n })\n if (this.mode === 'operational') this.capture(endEvent)\n else await this.checkpoint(endEvent)\n\n const delivery = deliverySummary(this.port, this.mode, this.tracker)\n const modelCalls = [...this.modelCalls.values()].map(report => deepFreeze({ ...report, delivery }))\n const final = deepFreeze<LegacyRunReport>({\n runId: this.runId,\n traceId: this.traceId,\n startedAt: this.startedAt,\n endedAt,\n durationMs,\n status: finalStatus,\n usage,\n modelCalls,\n operationCounts,\n errors: Object.freeze([...this.errors]),\n delivery,\n })\n this.finalReport = final\n return final\n }\n\n private closeOpenOperations(): void {\n for (const operation of this.operations.values()) {\n if (operation.status !== undefined) continue\n this.integrityUnknown = true\n const missing = accountingError(\n `${operation.kind} operation '${operation.id}' closed without a terminal event`,\n OBSERVATION_ERROR_CODES.OPERATION_TERMINAL_MISSING,\n )\n this.errors.push(missing)\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n operation.status = 'unknown'\n operation.error = missing\n operation.span.end('unknown', endedAt, endedMonotonic)\n this.capture(this.event(OPERATION_EVENT[operation.kind], 'end', operation.span.correlation, {\n status: 'unknown',\n durationMs: Math.max(0, endedMonotonic - operation.startedMonotonic),\n error: errorData(missing),\n }))\n }\n }\n\n private event(\n name: ObservationEventName,\n phase: ObservationEvent['phase'],\n correlation: CorrelationContext,\n data: JsonObject,\n ): ObservationEvent {\n return deepFreeze({\n schemaVersion: 1 as const,\n eventId: createOperationId(),\n sequence: this.scope.nextSequence(),\n name,\n phase,\n occurredAt: new Date().toISOString(),\n monotonicMs: this.scope.monotonicMs(),\n priority: 'critical' as const,\n resource: this.resource,\n correlation,\n data,\n })\n }\n\n private capture(event: ObservationEvent): void {\n try {\n const receipt = validateCaptureReceipt(this.port.capture(event), event.eventId)\n applyReceipt(this.tracker, receipt)\n } catch (captureError) {\n this.tracker.rejected++\n this.tracker.lastFailure = safeErrorRecord(captureError)\n }\n }\n\n private async checkpoint(event: ObservationEvent): Promise<void> {\n this.tracker.pending++\n try {\n const raw = this.port.checkpoint === undefined\n ? { eventId: event.eventId, status: 'rejected' as const, durable: false, boundary: 'none' as const, reason: 'exporter-unavailable' as const }\n : await this.port.checkpoint(event)\n this.tracker.pending--\n const receipt = validateCaptureReceipt(raw, event.eventId)\n applyReceipt(this.tracker, receipt)\n if (receipt.status !== 'accepted' || !receipt.durable) {\n this.tracker.lastFailure = accountingError(\n `run terminal checkpoint was ${receipt.status}`,\n OBSERVATION_ERROR_CODES.CAPTURE_REJECTED,\n )\n this.terminalAuditFailure = this.mode === 'audit'\n }\n } catch (checkpointError) {\n this.tracker.pending--\n this.tracker.rejected++\n this.tracker.lastFailure = safeErrorRecord(checkpointError)\n this.terminalAuditFailure = this.mode === 'audit'\n }\n }\n\n private defect(message: string): void {\n const error = new AgentSdkError(message, AGENT_ACCOUNTING_ERROR_CODES.LEDGER_STATE_INVALID)\n if (this.defectMode === 'test') throw error\n this.integrityUnknown = true\n this.errors.push(safeErrorRecord(error))\n this.capture(this.event('sdk.observer.failure', 'point', this.runSpan.correlation, {\n observerId: 'agent-run-ledger',\n failureKind: 'state-machine',\n counter: this.errors.length,\n error: errorData(safeErrorRecord(error)),\n }))\n }\n\n private limit(message: string): never {\n throw new AgentSdkError(message, OBSERVATION_ERROR_CODES.LEDGER_LIMIT_EXCEEDED)\n }\n\n private assertOpen(action: string): void {\n if (!this.closed) return\n this.defect(`${action} occurred after run ledger closure`)\n throw new AgentSdkError(`${action} occurred after run ledger closure`, AGENT_ACCOUNTING_ERROR_CODES.LEDGER_STATE_INVALID)\n }\n\n private charge(value: unknown): void {\n let bytes: number\n try {\n const encoded = JSON.stringify(value)\n bytes = encoded === undefined ? 0 : new TextEncoder().encode(encoded).byteLength\n } catch {\n this.limit('run ledger state could not be represented as JSON')\n }\n if (this.serializedBytes + bytes > this.limits.maxSerializedBytes) {\n this.limit(`run ledger exceeded ${this.limits.maxSerializedBytes} serialized bytes`)\n }\n this.serializedBytes += bytes\n }\n}\n\nfunction resolveLimits(input: RunLedgerLimits | undefined): ResolvedLimits {\n return Object.freeze({\n maxModelCalls: positive(input?.maxModelCalls ?? 1_024, 'maxModelCalls'),\n maxAttemptsPerCall: positive(input?.maxAttemptsPerCall ?? 16, 'maxAttemptsPerCall'),\n maxToolCalls: positive(input?.maxToolCalls ?? 10_000, 'maxToolCalls'),\n maxSerializedBytes: positive(input?.maxSerializedBytes ?? 16 * 1024 * 1024, 'maxSerializedBytes'),\n })\n}\n\nfunction resolveUsagePolicy(input: UsagePolicy | undefined): RunLedger['usagePolicy'] {\n const onMissing = input?.onMissing ?? 'warn'\n if (!['warn', 'estimate', 'fail'].includes(onMissing)) throw new TypeError('usage policy onMissing is invalid')\n if (onMissing === 'estimate') {\n if (typeof input?.estimator?.id !== 'string' || input.estimator.id.trim().length === 0\n || typeof input.estimator.estimate !== 'function') {\n throw new TypeError('estimate usage policy requires an estimator with a non-empty id')\n }\n }\n const estimateTimeoutMs = positive(input?.estimateTimeoutMs ?? 30_000, 'estimateTimeoutMs')\n if (estimateTimeoutMs > 2_147_483_647) throw new RangeError('estimateTimeoutMs exceeds the timer range')\n return Object.freeze({ onMissing, estimateTimeoutMs, ...(input?.estimator === undefined ? {} : { estimator: input.estimator }) })\n}\n\nfunction observationMode(port: ObservationPort, tracker: DeliveryTracker): DeliveryMode {\n try {\n const mode = port.mode\n if (mode === 'operational' || mode === 'reliable' || mode === 'audit') return mode\n throw new TypeError('observation delivery mode is invalid')\n } catch (error) {\n tracker.lastFailure = safeErrorRecord(error)\n return 'operational'\n }\n}\n\nfunction openSpan(\n port: ObservationPort,\n input: Parameters<ObservationPort['openSpan']>[0],\n tracker: DeliveryTracker,\n): ObservationSpan {\n try {\n const candidate = snapshotObservationSpan(port.openSpan(input))\n if (candidate !== undefined && candidate.correlation.runId === input.runId) return candidate\n throw new TypeError('observation backend returned an invalid run span')\n } catch (error) {\n tracker.lastFailure = safeErrorRecord(error)\n return createCoreSpan(input)\n }\n}\n\nfunction applyReceipt(tracker: DeliveryTracker, receipt: CaptureReceipt): void {\n if (receipt.status === 'accepted') tracker.accepted++\n else tracker.rejected++\n if (receipt.status === 'accepted' && boundaryRank(receipt.boundary) > boundaryRank(tracker.reached)) {\n tracker.reached = receipt.boundary\n }\n}\n\nfunction mergeDelivery(tracker: DeliveryTracker, summary: ObservationDeliverySummary): void {\n tracker.accepted += summary.acceptedCritical\n tracker.rejected += summary.rejectedCritical\n tracker.pending += summary.pendingCritical\n if (boundaryRank(summary.reachedBoundary) > boundaryRank(tracker.reached)) tracker.reached = summary.reachedBoundary\n if (summary.lastFailure !== undefined) tracker.lastFailure = summary.lastFailure\n}\n\nfunction deliverySummary(port: ObservationPort, mode: DeliveryMode, tracker: DeliveryTracker): ObservationDeliverySummary {\n if (port === NOOP_OBSERVATION_PORT) return disabledDeliverySummary()\n const requiredBoundary: ObservationBoundary = mode === 'operational'\n ? 'none'\n : boundaryRank(tracker.reached) > 0 ? tracker.reached : 'local-durable'\n return deepFreeze({\n mode,\n requiredBoundary,\n reachedBoundary: tracker.reached,\n complete: tracker.rejected === 0 && tracker.pending === 0\n && boundaryRank(tracker.reached) >= boundaryRank(requiredBoundary),\n acceptedCritical: tracker.accepted,\n rejectedCritical: tracker.rejected,\n pendingCritical: tracker.pending,\n ...(tracker.lastFailure === undefined ? {} : { lastFailure: tracker.lastFailure }),\n })\n}\n\nfunction operationCountsOf(\n operations: Iterable<MutableOperation>,\n modelCalls: Iterable<ModelCallReport>,\n): Readonly<Record<TrackedOperationKind, RunOperationCounts>> {\n const counts = Object.fromEntries(OPERATION_KINDS.map(kind => [kind, emptyCounts()])) as Record<TrackedOperationKind, MutableCounts>\n for (const operation of operations) addStatus(counts[operation.kind], operation.status ?? 'unknown')\n for (const report of modelCalls) {\n addStatus(counts['model-call'], report.status)\n for (const attempt of report.attempts) addStatus(counts['provider-attempt'], attempt.status)\n }\n return deepFreeze(Object.fromEntries(OPERATION_KINDS.map(kind => [kind, { ...counts[kind] }])) as Record<TrackedOperationKind, RunOperationCounts>)\n}\n\ninterface MutableCounts { total: number; success: number; error: number; aborted: number; rejected: number; unknown: number }\nfunction emptyCounts(): MutableCounts { return { total: 0, success: 0, error: 0, aborted: 0, rejected: 0, unknown: 0 } }\nfunction addStatus(counts: MutableCounts, status: OperationStatus): void {\n counts.total++\n counts[status]++\n}\n\nfunction errorData(error: SafeErrorRecord): JsonObject {\n return {\n type: error.type,\n message: error.message,\n ...(error.code === undefined ? {} : { code: error.code }),\n ...(error.retryable === undefined ? {} : { retryable: error.retryable }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.causeTypes === undefined ? {} : { causeTypes: [...error.causeTypes] }),\n }\n}\n\nfunction isOperationStatus(value: unknown): value is OperationStatus {\n return value === 'success' || value === 'error' || value === 'aborted' || value === 'rejected' || value === 'unknown'\n}\n\nfunction positive(value: number, label: string): number {\n if (!Number.isSafeInteger(value) || value < 1) throw new RangeError(`${label} must be a positive safe integer`)\n return value\n}\n\nfunction boundaryRank(boundary: ObservationBoundary): number {\n return boundary === 'remote-acknowledged' ? 2 : boundary === 'local-durable' ? 1 : 0\n}\n\nexport { summarizeModelCallUsage, authoritativeTokenUsage, budgetTokenTotal } from './usage.ts'\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ledger.js","names":[],"sources":["../../../src/agent/accounting/ledger.ts"],"sourcesContent":["import { AgentSdkError } from '../../errors/index.ts'\nimport {\n NOOP_OBSERVATION_PORT, OBSERVATION_ERROR_CODES, createCoreSpan, createObservationRunScope,\n createOperationId, disabledDeliverySummary, hasUsageCounters, safeErrorRecord,\n snapshotObservationSpan, validateCaptureReceipt, validateUsageCounters, type CaptureReceipt,\n type CorrelationContext, type DeliveryMode, type ModelCallReport, type ModelInvocationContext,\n type ObservationBoundary, type ObservationDeliverySummary, type ObservationEvent,\n type ObservationEventName, type ObservationPort, type ObservationResource, type ObservationSpan,\n type OperationStatus, type SafeErrorRecord,\n} from '../../observation/index.ts'\nimport { SDK_VERSION, deepFreeze, type JsonObject } from '../../primitives/index.ts'\nimport { type GenerateOptions } from '../../contract/index.ts'\nimport { AGENT_ACCOUNTING_ERROR_CODES } from './error.ts'\nimport type {\n EndRunOperationInput, ModelCallPolicyDecision, RunAccountingPort, StartRunOperationInput,\n} from './contracts.ts'\nimport type {\n LegacyRunReport, RunLedgerLimits, RunOperationCounts, TrackedOperationKind, UsagePolicy,\n} from './report.ts'\nimport { aggregateUsage, missingCounters } from './usage.ts'\nimport { estimateUsage } from './estimate.ts'\nimport { accountingError } from './common.ts'\nimport { OPERATION_KINDS } from './config.ts'\nimport type { SdkLogger } from '../../logging/types.ts'\n\nconst OPERATION_EVENT: Readonly<Record<TrackedOperationKind, ObservationEventName>> = Object.freeze({\n turn: 'sdk.agent.turn',\n 'model-call': 'sdk.model.call',\n 'provider-attempt': 'sdk.provider.attempt',\n tool: 'sdk.tool.call',\n compaction: 'sdk.compaction',\n hook: 'sdk.hook.call',\n 'user-input': 'sdk.user.input.wait',\n skill: 'sdk.skill.operation',\n memory: 'sdk.memory.operation',\n credential: 'sdk.credential.operation',\n integration: 'sdk.integration.request',\n})\n\nconst OPERATION_SPAN: Readonly<Record<TrackedOperationKind, Parameters<ObservationPort['openSpan']>[0]['name']>> = Object.freeze({\n turn: 'sdk.agent.turn',\n 'model-call': 'sdk.model.call',\n 'provider-attempt': 'sdk.provider.attempt',\n tool: 'sdk.tool.call',\n compaction: 'sdk.compaction',\n hook: 'sdk.hook.call',\n 'user-input': 'sdk.user.input.wait',\n skill: 'sdk.skill.operation',\n memory: 'sdk.memory.operation',\n credential: 'sdk.credential.operation',\n integration: 'sdk.integration.request',\n})\n\ninterface ResolvedLimits {\n readonly maxModelCalls: number\n readonly maxAttemptsPerCall: number\n readonly maxToolCalls: number\n readonly maxSerializedBytes: number\n}\n\ninterface DeliveryTracker {\n accepted: number\n rejected: number\n pending: number\n reached: ObservationBoundary\n lastFailure?: SafeErrorRecord\n}\n\ninterface MutableOperation {\n readonly id: string\n readonly kind: TrackedOperationKind\n readonly span: ObservationSpan\n readonly startedAt: string\n readonly startedMonotonic: number\n readonly data: JsonObject\n status?: OperationStatus\n error?: SafeErrorRecord\n}\n\nexport interface RunLedgerOptions {\n readonly runId?: string\n readonly observation?: ObservationPort\n readonly resource?: ObservationResource\n readonly parent?: CorrelationContext\n readonly conversationId?: string\n readonly sessionId?: string\n readonly agentId: string\n /** Extra headers/body fields for this agent's provider requests. */\n readonly providerOptions?: {\n readonly headers?: Readonly<Record<string, string>>\n readonly body?: Readonly<Record<string, unknown>>\n }\n readonly mode: string\n readonly maxTurns: number | 'auto'\n readonly usagePolicy?: UsagePolicy\n readonly cumulativeTokenBudget?: boolean\n readonly limits?: RunLedgerLimits\n readonly logger?: (correlation: CorrelationContext) => SdkLogger\n /** Contract tests throw immediately; production records health and finalizes unknown. */\n readonly defectMode?: 'production' | 'test'\n}\n\n/** Canonical append-only accounting state for one agent invocation. */\nexport class RunLedger implements RunAccountingPort {\n readonly runId: string\n readonly traceId: CorrelationContext['traceId']\n readonly modelInvocation: ModelInvocationContext\n readonly mode: DeliveryMode\n terminalAuditFailure = false\n private stoppedUsage: ModelCallPolicyDecision | undefined\n get usageStop(): ModelCallPolicyDecision | undefined { return this.stoppedUsage }\n\n private readonly port: ObservationPort\n private readonly resource: ObservationResource\n private readonly scope = createObservationRunScope()\n private readonly runSpan: ObservationSpan\n private readonly startedAt = new Date().toISOString()\n private readonly startedMonotonic = this.scope.monotonicMs()\n private readonly tracker: DeliveryTracker = { accepted: 0, rejected: 0, pending: 0, reached: 'none' }\n private readonly limits: ResolvedLimits\n private readonly usagePolicy: Required<Pick<UsagePolicy, 'onMissing' | 'estimateTimeoutMs'>> & Pick<UsagePolicy, 'estimator'>\n private readonly estimationClosed = new AbortController()\n private readonly cumulativeTokenBudget: boolean\n private readonly defectMode: 'production' | 'test'\n private readonly operations = new Map<string, MutableOperation>()\n private readonly modelCalls = new Map<string, ModelCallReport>()\n private readonly errors: SafeErrorRecord[] = []\n private serializedBytes = 0\n private toolCalls = 0\n private integrityUnknown = false\n private closed = false\n private finalReport: LegacyRunReport | undefined\n private finalizing: Promise<LegacyRunReport> | undefined\n\n constructor(options: RunLedgerOptions) {\n if (typeof options.agentId !== 'string' || options.agentId.trim().length === 0) {\n throw new TypeError('run ledger agentId must be non-empty')\n }\n if (options.maxTurns !== 'auto' && (!Number.isSafeInteger(options.maxTurns) || options.maxTurns < 1)) {\n throw new RangeError(\"run ledger maxTurns must be a positive safe integer or 'auto'\")\n }\n this.runId = options.runId ?? createOperationId()\n if (this.runId.length === 0) throw new TypeError('run ledger runId must be non-empty')\n this.port = options.observation ?? NOOP_OBSERVATION_PORT\n this.resource = deepFreeze(options.resource === undefined\n ? { sdkName: 'ai-agent-sdk', sdkVersion: SDK_VERSION, runtime: 'unknown' }\n : { ...options.resource })\n this.mode = observationMode(this.port, this.tracker)\n this.limits = resolveLimits(options.limits)\n this.usagePolicy = resolveUsagePolicy(options.usagePolicy)\n this.cumulativeTokenBudget = options.cumulativeTokenBudget ?? false\n this.defectMode = options.defectMode ?? 'production'\n this.runSpan = openSpan(this.port, {\n name: 'sdk.agent.run',\n runId: this.runId,\n ...(options.parent === undefined ? {} : { parent: options.parent }),\n correlation: {\n ...(options.conversationId === undefined ? {} : { conversationId: options.conversationId }),\n ...(options.sessionId === undefined ? {} : { sessionId: options.sessionId }),\n },\n startedAt: this.startedAt,\n monotonicMs: this.startedMonotonic,\n }, this.tracker)\n this.traceId = this.runSpan.correlation.traceId\n const logger = options.logger?.(this.runSpan.correlation)\n this.modelInvocation = Object.freeze({\n observation: this.port,\n agentId: options.agentId,\n correlation: this.runSpan.correlation,\n terminalCheckpointOwner: 'agent-run' as const,\n scope: this.scope,\n ...(logger === undefined ? {} : { logger }),\n ...(options.providerOptions === undefined ? {} : { providerOptions: options.providerOptions }),\n })\n this.capture(this.event('sdk.agent.run', 'start', this.runSpan.correlation, {\n agentId: options.agentId,\n mode: options.mode,\n maxTurns: options.maxTurns,\n }))\n }\n\n startOperation(kind: TrackedOperationKind, input: StartRunOperationInput = {}): string {\n this.assertOpen('operation start')\n if (!OPERATION_KINDS.includes(kind)) throw new TypeError(`unknown tracked operation kind '${String(kind)}'`)\n const id = input.operationId ?? createOperationId()\n if (this.operations.has(id)) {\n this.defect(`duplicate ${kind} operation start '${id}'`)\n return id\n }\n if (kind === 'tool') {\n if (this.toolCalls >= this.limits.maxToolCalls) this.limit(`run exceeded ${this.limits.maxToolCalls} tool calls`)\n this.toolCalls++\n }\n const startedAt = new Date().toISOString()\n const startedMonotonic = this.scope.monotonicMs()\n const span = openSpan(this.port, {\n name: OPERATION_SPAN[kind],\n runId: this.runId,\n parent: this.runSpan.correlation,\n correlation: input.toolCallId === undefined ? {} : { toolCallId: input.toolCallId },\n startedAt,\n monotonicMs: startedMonotonic,\n }, this.tracker)\n const data = deepFreeze({ ...(input.data ?? {}) })\n this.charge({ id, kind, data })\n this.operations.set(id, { id, kind, span, startedAt, startedMonotonic, data })\n this.capture(this.event(OPERATION_EVENT[kind], 'start', span.correlation, data))\n return id\n }\n\n endOperation(operationId: string, status: OperationStatus, input: EndRunOperationInput = {}): void {\n const operation = this.operations.get(operationId)\n if (operation === undefined) {\n this.defect(`orphan operation terminal '${operationId}'`)\n return\n }\n if (operation.status !== undefined) {\n this.defect(`duplicate operation terminal '${operationId}'`)\n operation.status = 'unknown'\n return\n }\n if (!isOperationStatus(status)) throw new TypeError(`invalid operation status '${String(status)}'`)\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n operation.status = status\n if (input.error !== undefined) operation.error = safeErrorRecord(input.error)\n operation.span.end(status, endedAt, endedMonotonic)\n if (operation.error !== undefined) this.errors.push(operation.error)\n const data = deepFreeze({\n ...(input.data ?? {}),\n status,\n durationMs: Math.max(0, endedMonotonic - operation.startedMonotonic),\n ...(operation.error === undefined ? {} : { error: errorData(operation.error) }),\n })\n this.charge(data)\n this.capture(this.event(OPERATION_EVENT[operation.kind], 'end', operation.span.correlation, data))\n }\n\n async recordModelCall(report: ModelCallReport, request: GenerateOptions): Promise<ModelCallPolicyDecision> {\n this.assertOpen('model-call usage')\n if (this.modelCalls.has(report.modelCallId)) {\n this.defect(`duplicate model-call terminal '${report.modelCallId}'`)\n const decision = Object.freeze({ report: this.modelCalls.get(report.modelCallId) ?? report, usageRequired: true, usageUnavailable: false })\n this.stoppedUsage ??= decision\n return decision\n }\n if (this.modelCalls.size >= this.limits.maxModelCalls) {\n this.limit(`run exceeded ${this.limits.maxModelCalls} logical model calls`)\n }\n if (report.attempts.length > this.limits.maxAttemptsPerCall) {\n this.limit(`model call '${report.modelCallId}' exceeded ${this.limits.maxAttemptsPerCall} attempts`)\n }\n\n // Reserve identity and retain provider evidence before calling user code.\n this.charge(report)\n this.modelCalls.set(report.modelCallId, report)\n mergeDelivery(this.tracker, report.delivery)\n const policyErrorIndex = this.errors.length\n if (report.error !== undefined) this.errors.push(report.error)\n for (const attempt of report.attempts) if (attempt.error !== undefined) this.errors.push(attempt.error)\n let accepted = report\n let usageRequired = false\n const incomplete = report.coverage === 'missing' || report.coverage === 'partial'\n if (incomplete && this.usagePolicy.onMissing === 'estimate') {\n try {\n const estimator = this.usagePolicy.estimator\n if (estimator === undefined) throw new TypeError('estimate usage policy requires an estimator')\n const raw = await estimateUsage(estimator, {\n runId: this.runId,\n modelCallId: report.modelCallId,\n provider: report.provider,\n model: report.model,\n request,\n report,\n }, this.estimationClosed.signal, this.usagePolicy.estimateTimeoutMs)\n if (this.closed) return { report, usageRequired: true, usageUnavailable: false }\n const validation = validateUsageCounters(raw)\n if (validation.invalidFields.length > 0 || validation.overflow || !hasUsageCounters(validation.reported)) {\n throw new TypeError('usage estimator returned invalid or empty counters')\n }\n const estimated = missingCounters(validation.reported, report.reported)\n if (!hasUsageCounters(estimated)) throw new TypeError('usage estimator did not cover a missing counter')\n accepted = deepFreeze({\n ...report,\n coverage: hasUsageCounters(report.reported) ? 'partial' as const : 'estimated' as const,\n estimated,\n authoritative: false,\n })\n } catch (estimatorError) {\n if (this.closed) return { report, usageRequired: true, usageUnavailable: false }\n usageRequired = true\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'usage estimation failed after a provider response',\n OBSERVATION_ERROR_CODES.USAGE_REQUIRED,\n estimatorError,\n ))\n }\n } else if (incomplete && this.usagePolicy.onMissing === 'fail') {\n usageRequired = true\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'provider usage is required by the configured run policy',\n OBSERVATION_ERROR_CODES.USAGE_REQUIRED,\n ))\n } else if (incomplete && report.error?.code !== OBSERVATION_ERROR_CODES.USAGE_MISSING) {\n this.errors.splice(policyErrorIndex, 0, accountingError(\n 'model call completed without authoritative provider usage',\n OBSERVATION_ERROR_CODES.USAGE_MISSING,\n ))\n }\n\n // Conservatively charge the added projection including its field names and\n // changed coverage, not just the counter values inside `estimated`.\n if (accepted !== report) this.charge({\n estimated: accepted.estimated, coverage: accepted.coverage, authoritative: false,\n })\n this.modelCalls.set(accepted.modelCallId, accepted)\n const decision = Object.freeze({\n report: accepted,\n usageRequired,\n usageUnavailable: !usageRequired\n && incomplete\n && this.usagePolicy.onMissing === 'warn'\n && this.cumulativeTokenBudget\n && accepted.possiblyBilledAttemptsWithoutUsage > 0,\n })\n if (decision.usageRequired || decision.usageUnavailable) this.stoppedUsage ??= decision\n return decision\n }\n\n recordError(error: unknown): void {\n this.errors.push(safeErrorRecord(error))\n }\n\n finalize(status: OperationStatus, completed: boolean, error?: unknown): Promise<LegacyRunReport> {\n if (this.finalReport !== undefined) return Promise.resolve(this.finalReport)\n if (this.finalizing !== undefined) return this.finalizing\n this.finalizing = this.finalizeOnce(status, completed, error)\n return this.finalizing\n }\n\n private async finalizeOnce(status: OperationStatus, completed: boolean, error?: unknown): Promise<LegacyRunReport> {\n this.closed = true\n this.estimationClosed.abort(new Error('run ledger closed'))\n if (error !== undefined) this.errors.push(safeErrorRecord(error))\n this.closeOpenOperations()\n const finalStatus: OperationStatus = this.integrityUnknown ? 'unknown' : status\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n const durationMs = Math.max(0, endedMonotonic - this.startedMonotonic)\n const usage = aggregateUsage([...this.modelCalls.values()], this.errors)\n const operationCounts = operationCountsOf(this.operations.values(), this.modelCalls.values())\n this.runSpan.end(finalStatus, endedAt, endedMonotonic)\n const endEvent = this.event('sdk.agent.run', 'end', this.runSpan.correlation, {\n status: finalStatus,\n durationMs,\n completed,\n usage: usage as unknown as JsonObject,\n operationCounts: operationCounts as unknown as JsonObject,\n errorCount: this.errors.length,\n })\n if (this.mode === 'operational') this.capture(endEvent)\n else await this.checkpoint(endEvent)\n\n const delivery = deliverySummary(this.port, this.mode, this.tracker)\n const modelCalls = [...this.modelCalls.values()].map(report => deepFreeze({ ...report, delivery }))\n const final = deepFreeze<LegacyRunReport>({\n runId: this.runId,\n traceId: this.traceId,\n startedAt: this.startedAt,\n endedAt,\n durationMs,\n status: finalStatus,\n usage,\n modelCalls,\n operationCounts,\n errors: Object.freeze([...this.errors]),\n delivery,\n })\n this.finalReport = final\n return final\n }\n\n private closeOpenOperations(): void {\n for (const operation of this.operations.values()) {\n if (operation.status !== undefined) continue\n this.integrityUnknown = true\n const missing = accountingError(\n `${operation.kind} operation '${operation.id}' closed without a terminal event`,\n OBSERVATION_ERROR_CODES.OPERATION_TERMINAL_MISSING,\n )\n this.errors.push(missing)\n const endedAt = new Date().toISOString()\n const endedMonotonic = this.scope.monotonicMs()\n operation.status = 'unknown'\n operation.error = missing\n operation.span.end('unknown', endedAt, endedMonotonic)\n this.capture(this.event(OPERATION_EVENT[operation.kind], 'end', operation.span.correlation, {\n status: 'unknown',\n durationMs: Math.max(0, endedMonotonic - operation.startedMonotonic),\n error: errorData(missing),\n }))\n }\n }\n\n private event(\n name: ObservationEventName,\n phase: ObservationEvent['phase'],\n correlation: CorrelationContext,\n data: JsonObject,\n ): ObservationEvent {\n return deepFreeze({\n schemaVersion: 1 as const,\n eventId: createOperationId(),\n sequence: this.scope.nextSequence(),\n name,\n phase,\n occurredAt: new Date().toISOString(),\n monotonicMs: this.scope.monotonicMs(),\n priority: 'critical' as const,\n resource: this.resource,\n correlation,\n data,\n })\n }\n\n private capture(event: ObservationEvent): void {\n try {\n const receipt = validateCaptureReceipt(this.port.capture(event), event.eventId)\n applyReceipt(this.tracker, receipt)\n } catch (captureError) {\n this.tracker.rejected++\n this.tracker.lastFailure = safeErrorRecord(captureError)\n }\n }\n\n private async checkpoint(event: ObservationEvent): Promise<void> {\n this.tracker.pending++\n try {\n const raw = this.port.checkpoint === undefined\n ? { eventId: event.eventId, status: 'rejected' as const, durable: false, boundary: 'none' as const, reason: 'exporter-unavailable' as const }\n : await this.port.checkpoint(event)\n this.tracker.pending--\n const receipt = validateCaptureReceipt(raw, event.eventId)\n applyReceipt(this.tracker, receipt)\n if (receipt.status !== 'accepted' || !receipt.durable) {\n this.tracker.lastFailure = accountingError(\n `run terminal checkpoint was ${receipt.status}`,\n OBSERVATION_ERROR_CODES.CAPTURE_REJECTED,\n )\n this.terminalAuditFailure = this.mode === 'audit'\n }\n } catch (checkpointError) {\n this.tracker.pending--\n this.tracker.rejected++\n this.tracker.lastFailure = safeErrorRecord(checkpointError)\n this.terminalAuditFailure = this.mode === 'audit'\n }\n }\n\n private defect(message: string): void {\n const error = new AgentSdkError(message, AGENT_ACCOUNTING_ERROR_CODES.LEDGER_STATE_INVALID)\n if (this.defectMode === 'test') throw error\n this.integrityUnknown = true\n this.errors.push(safeErrorRecord(error))\n this.capture(this.event('sdk.observer.failure', 'point', this.runSpan.correlation, {\n observerId: 'agent-run-ledger',\n failureKind: 'state-machine',\n counter: this.errors.length,\n error: errorData(safeErrorRecord(error)),\n }))\n }\n\n private limit(message: string): never {\n throw new AgentSdkError(message, OBSERVATION_ERROR_CODES.LEDGER_LIMIT_EXCEEDED)\n }\n\n private assertOpen(action: string): void {\n if (!this.closed) return\n this.defect(`${action} occurred after run ledger closure`)\n throw new AgentSdkError(`${action} occurred after run ledger closure`, AGENT_ACCOUNTING_ERROR_CODES.LEDGER_STATE_INVALID)\n }\n\n private charge(value: unknown): void {\n let bytes: number\n try {\n const encoded = JSON.stringify(value)\n bytes = encoded === undefined ? 0 : new TextEncoder().encode(encoded).byteLength\n } catch {\n this.limit('run ledger state could not be represented as JSON')\n }\n if (this.serializedBytes + bytes > this.limits.maxSerializedBytes) {\n this.limit(`run ledger exceeded ${this.limits.maxSerializedBytes} serialized bytes`)\n }\n this.serializedBytes += bytes\n }\n}\n\nfunction resolveLimits(input: RunLedgerLimits | undefined): ResolvedLimits {\n return Object.freeze({\n maxModelCalls: positive(input?.maxModelCalls ?? 1_024, 'maxModelCalls'),\n maxAttemptsPerCall: positive(input?.maxAttemptsPerCall ?? 16, 'maxAttemptsPerCall'),\n maxToolCalls: positive(input?.maxToolCalls ?? 10_000, 'maxToolCalls'),\n maxSerializedBytes: positive(input?.maxSerializedBytes ?? 16 * 1024 * 1024, 'maxSerializedBytes'),\n })\n}\n\nfunction resolveUsagePolicy(input: UsagePolicy | undefined): RunLedger['usagePolicy'] {\n const onMissing = input?.onMissing ?? 'warn'\n if (!['warn', 'estimate', 'fail'].includes(onMissing)) throw new TypeError('usage policy onMissing is invalid')\n if (onMissing === 'estimate') {\n if (typeof input?.estimator?.id !== 'string' || input.estimator.id.trim().length === 0\n || typeof input.estimator.estimate !== 'function') {\n throw new TypeError('estimate usage policy requires an estimator with a non-empty id')\n }\n }\n const estimateTimeoutMs = positive(input?.estimateTimeoutMs ?? 30_000, 'estimateTimeoutMs')\n if (estimateTimeoutMs > 2_147_483_647) throw new RangeError('estimateTimeoutMs exceeds the timer range')\n return Object.freeze({ onMissing, estimateTimeoutMs, ...(input?.estimator === undefined ? {} : { estimator: input.estimator }) })\n}\n\nfunction observationMode(port: ObservationPort, tracker: DeliveryTracker): DeliveryMode {\n try {\n const mode = port.mode\n if (mode === 'operational' || mode === 'reliable' || mode === 'audit') return mode\n throw new TypeError('observation delivery mode is invalid')\n } catch (error) {\n tracker.lastFailure = safeErrorRecord(error)\n return 'operational'\n }\n}\n\nfunction openSpan(\n port: ObservationPort,\n input: Parameters<ObservationPort['openSpan']>[0],\n tracker: DeliveryTracker,\n): ObservationSpan {\n try {\n const candidate = snapshotObservationSpan(port.openSpan(input))\n if (candidate !== undefined && candidate.correlation.runId === input.runId) return candidate\n throw new TypeError('observation backend returned an invalid run span')\n } catch (error) {\n tracker.lastFailure = safeErrorRecord(error)\n return createCoreSpan(input)\n }\n}\n\nfunction applyReceipt(tracker: DeliveryTracker, receipt: CaptureReceipt): void {\n if (receipt.status === 'accepted') tracker.accepted++\n else tracker.rejected++\n if (receipt.status === 'accepted' && boundaryRank(receipt.boundary) > boundaryRank(tracker.reached)) {\n tracker.reached = receipt.boundary\n }\n}\n\nfunction mergeDelivery(tracker: DeliveryTracker, summary: ObservationDeliverySummary): void {\n tracker.accepted += summary.acceptedCritical\n tracker.rejected += summary.rejectedCritical\n tracker.pending += summary.pendingCritical\n if (boundaryRank(summary.reachedBoundary) > boundaryRank(tracker.reached)) tracker.reached = summary.reachedBoundary\n if (summary.lastFailure !== undefined) tracker.lastFailure = summary.lastFailure\n}\n\nfunction deliverySummary(port: ObservationPort, mode: DeliveryMode, tracker: DeliveryTracker): ObservationDeliverySummary {\n if (port === NOOP_OBSERVATION_PORT) return disabledDeliverySummary()\n const requiredBoundary: ObservationBoundary = mode === 'operational'\n ? 'none'\n : boundaryRank(tracker.reached) > 0 ? tracker.reached : 'local-durable'\n return deepFreeze({\n mode,\n requiredBoundary,\n reachedBoundary: tracker.reached,\n complete: tracker.rejected === 0 && tracker.pending === 0\n && boundaryRank(tracker.reached) >= boundaryRank(requiredBoundary),\n acceptedCritical: tracker.accepted,\n rejectedCritical: tracker.rejected,\n pendingCritical: tracker.pending,\n ...(tracker.lastFailure === undefined ? {} : { lastFailure: tracker.lastFailure }),\n })\n}\n\nfunction operationCountsOf(\n operations: Iterable<MutableOperation>,\n modelCalls: Iterable<ModelCallReport>,\n): Readonly<Record<TrackedOperationKind, RunOperationCounts>> {\n const counts = Object.fromEntries(OPERATION_KINDS.map(kind => [kind, emptyCounts()])) as Record<TrackedOperationKind, MutableCounts>\n for (const operation of operations) addStatus(counts[operation.kind], operation.status ?? 'unknown')\n for (const report of modelCalls) {\n addStatus(counts['model-call'], report.status)\n for (const attempt of report.attempts) addStatus(counts['provider-attempt'], attempt.status)\n }\n return deepFreeze(Object.fromEntries(OPERATION_KINDS.map(kind => [kind, { ...counts[kind] }])) as Record<TrackedOperationKind, RunOperationCounts>)\n}\n\ninterface MutableCounts { total: number; success: number; error: number; aborted: number; rejected: number; unknown: number }\nfunction emptyCounts(): MutableCounts { return { total: 0, success: 0, error: 0, aborted: 0, rejected: 0, unknown: 0 } }\nfunction addStatus(counts: MutableCounts, status: OperationStatus): void {\n counts.total++\n counts[status]++\n}\n\nfunction errorData(error: SafeErrorRecord): JsonObject {\n return {\n type: error.type,\n message: error.message,\n ...(error.code === undefined ? {} : { code: error.code }),\n ...(error.retryable === undefined ? {} : { retryable: error.retryable }),\n ...(error.status === undefined ? {} : { status: error.status }),\n ...(error.causeTypes === undefined ? {} : { causeTypes: [...error.causeTypes] }),\n }\n}\n\nfunction isOperationStatus(value: unknown): value is OperationStatus {\n return value === 'success' || value === 'error' || value === 'aborted' || value === 'rejected' || value === 'unknown'\n}\n\nfunction positive(value: number, label: string): number {\n if (!Number.isSafeInteger(value) || value < 1) throw new RangeError(`${label} must be a positive safe integer`)\n return value\n}\n\nfunction boundaryRank(boundary: ObservationBoundary): number {\n return boundary === 'remote-acknowledged' ? 2 : boundary === 'local-durable' ? 1 : 0\n}\n\nexport { summarizeModelCallUsage, authoritativeTokenUsage, budgetTokenTotal } from './usage.ts'\n"],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { OperationStatus, SafeErrorRecord } from "../../observation/event.js";
|
|
|
3
3
|
import { ObservationDeliverySummary } from "../../observation/port.js";
|
|
4
4
|
import { UsageCounters } from "../../observation/usage.js";
|
|
5
5
|
import { ModelCallReport } from "../../observation/report.js";
|
|
6
|
-
import { GenerateOptions } from "../../contract/generate-options.js";
|
|
7
6
|
import { UsageCoverageSummary } from "../../support-safe/error.js";
|
|
7
|
+
import { GenerateOptions } from "../../contract/generate-options.js";
|
|
8
8
|
//#region src/agent/accounting/report.d.ts
|
|
9
9
|
interface RunUsageReport {
|
|
10
10
|
readonly reported: UsageCounters;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReasoningEffortId } from "../../primitives/brand.js";
|
|
2
2
|
import { NativeToolSchema, ToolChoice } from "../../contract/tool.js";
|
|
3
3
|
import { ModelOutputFormat } from "../../contract/output-format.js";
|
|
4
|
+
import { ModelModality } from "../../contract/model-info.js";
|
|
4
5
|
import { ToolDefinition } from "../tool/definition.js";
|
|
5
6
|
import { ContextSection } from "../context/types.js";
|
|
6
7
|
import { AgentMode } from "../mode/run-agent.js";
|
|
@@ -11,6 +12,16 @@ import { AgentSkillOptions, ResolvedAgentSkillOptions } from "../skill/tools.js"
|
|
|
11
12
|
import { AgentResumeSessionOptions, AgentSessionOptions } from "./session/types.js";
|
|
12
13
|
import { AgentSession } from "./session.js";
|
|
13
14
|
//#region src/agent/define/definition.d.ts
|
|
15
|
+
/**
|
|
16
|
+
* Fields to hand a provider's HTTP adapter for this agent's calls: extra
|
|
17
|
+
* headers, or fields deep-merged into the serialized request body. The
|
|
18
|
+
* caller's value always wins, even over a field the route itself set;
|
|
19
|
+
* `null` in `body` deletes a field the route set.
|
|
20
|
+
*/
|
|
21
|
+
interface AgentProviderOptions {
|
|
22
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
23
|
+
readonly body?: Readonly<Record<string, unknown>>;
|
|
24
|
+
}
|
|
14
25
|
interface AgentDefinitionInput {
|
|
15
26
|
/** Stable code-owned identity used by traces and catalogs. */
|
|
16
27
|
readonly id: string;
|
|
@@ -24,14 +35,19 @@ interface AgentDefinitionInput {
|
|
|
24
35
|
/**
|
|
25
36
|
* Provider reasoning effort. Omitted means no preference.
|
|
26
37
|
*
|
|
27
|
-
*
|
|
28
|
-
* is
|
|
29
|
-
*
|
|
30
|
-
*
|
|
38
|
+
* Pure pass-through: omitted, no effort field reaches the wire request at
|
|
39
|
+
* all; set, the exact string is forwarded to the provider's own effort
|
|
40
|
+
* field verbatim. The SDK never validates it against a ladder or invents a
|
|
41
|
+
* default — an unsupported value is the provider's rejection to make, in
|
|
42
|
+
* its own error shape, not a guess this package would get stale.
|
|
31
43
|
*/
|
|
32
44
|
readonly effort?: string;
|
|
33
45
|
/** Requested output budget; omission uses the selected model's declared default/cap. */
|
|
34
46
|
readonly maxTokens?: number;
|
|
47
|
+
/** Overrides the model/route/runtime-defaults tiers, same precedence as `maxTokens`. */
|
|
48
|
+
readonly contextWindow?: number;
|
|
49
|
+
/** Overrides the model/route/runtime-defaults tiers, same precedence as `maxTokens`. */
|
|
50
|
+
readonly inputModalities?: readonly ModelModality[];
|
|
35
51
|
/** The agent's stable system instructions. */
|
|
36
52
|
readonly instructions: string;
|
|
37
53
|
/** Execution policy; defaults to `basic`. */
|
|
@@ -62,12 +78,14 @@ interface AgentDefinitionInput {
|
|
|
62
78
|
readonly maxTurns?: number | 'auto';
|
|
63
79
|
/** Maximum host tool calls for one user turn; defaults to 64. */
|
|
64
80
|
readonly maxToolCalls?: number;
|
|
65
|
-
/** Public progress narration policy; defaults to `
|
|
81
|
+
/** Public progress narration policy; defaults to `auto` (caller-defined style). */
|
|
66
82
|
readonly commentary?: 'auto' | 'concise' | 'off';
|
|
67
83
|
/** Durable task facts injected outside compactable conversation history. */
|
|
68
84
|
readonly memory?: AgentMemoryConfigInput;
|
|
69
85
|
/** Automatic context checkpointing; false disables it. Defaults to enabled. */
|
|
70
86
|
readonly compaction?: AgentCompactionOptions | false;
|
|
87
|
+
/** Extra headers/body fields for this agent's provider requests; this agent's value wins where it collides with the route's own. */
|
|
88
|
+
readonly providerOptions?: AgentProviderOptions;
|
|
71
89
|
}
|
|
72
90
|
interface AgentDefinition {
|
|
73
91
|
readonly id: string;
|
|
@@ -77,6 +95,8 @@ interface AgentDefinition {
|
|
|
77
95
|
readonly model: string;
|
|
78
96
|
readonly effort: ReasoningEffortId | undefined;
|
|
79
97
|
readonly maxTokens: number | undefined;
|
|
98
|
+
readonly contextWindow: number | undefined;
|
|
99
|
+
readonly inputModalities: readonly ModelModality[] | undefined;
|
|
80
100
|
readonly instructions: string;
|
|
81
101
|
readonly mode: AgentMode;
|
|
82
102
|
readonly tools: readonly ToolDefinition<any>[];
|
|
@@ -92,6 +112,7 @@ interface AgentDefinition {
|
|
|
92
112
|
readonly commentary: 'auto' | 'concise' | 'off';
|
|
93
113
|
readonly memory: AgentMemoryConfig;
|
|
94
114
|
readonly compaction: AgentCompactionConfig | false;
|
|
115
|
+
readonly providerOptions: AgentProviderOptions | undefined;
|
|
95
116
|
}
|
|
96
117
|
interface DefinedAgent extends AgentDefinition {
|
|
97
118
|
/** Start an isolated, multi-turn conversation for this definition. */
|
|
@@ -106,5 +127,5 @@ type CloneAgentOverrides = AgentDefinitionOverrides & {
|
|
|
106
127
|
readonly id: string;
|
|
107
128
|
};
|
|
108
129
|
//#endregion
|
|
109
|
-
export { AgentDefinition, AgentDefinitionInput, AgentDefinitionOverrides, CloneAgentOverrides, DefinedAgent };
|
|
130
|
+
export { AgentDefinition, AgentDefinitionInput, AgentDefinitionOverrides, AgentProviderOptions, CloneAgentOverrides, DefinedAgent };
|
|
110
131
|
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.d.ts","names":[],"sources":["../../../src/agent/define/definition.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"definition.d.ts","names":[],"sources":["../../../src/agent/define/definition.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;UAwCiB;WACN,UAAU,SAAS;WACnB,OAAO,SAAS;;UAGV;;WAEN;;WAEA;WACA;;WAEA;;WAEA;;;;;;;;;;WAUA;;WAEA;;WAEA;;WAEA,2BAA2B;;WAE3B;;WAEA,OAAO;;WAEP,iBAAiB;;WAEjB,uBAAuB;;WAEvB,kBAAkB;;WAElB;;WAEA,eAAe;;;;;;;;WAQf,2BAA2B;WAC3B,aAAa;;WAEb,eAAe;;;WAGf;;WAEA;;WAEA;;WAEA,SAAS;;WAET,aAAa;;WAEb,kBAAkB;;UAGZ;WACN;WACA;WACA;WACA;WACA;WACA,QAAQ;WACR;WACA;WACA,0BAA0B;WAC1B;WACA,MAAM;WACN,gBAAgB;WAChB,sBAAsB;WACtB,iBAAiB;WACjB;WACA,cAAc;WACd,0BAA0B;WAC1B,YAAY;WACZ,cAAc;WACd;WACA;WACA;WACA,QAAQ;WACR,YAAY;WACZ,iBAAiB;;UAGX,qBAAqB;;EAEpC,cAAc,SAAS,sBAAsB;;EAE7C,cAAc,SAAS,4BAA4B;;EAEnD,KAAK,WAAW,2BAA2B;;KAGjC,2BAA2B,QAAQ,KAAK;KACxC,sBAAsB;WAAsC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ReasoningEffortId as e}from"../../primitives/brand.js";import{resolveMemoryConfig as t}from"../memory/memory.js";import{resolveCompactionConfig as n}from"../memory/compaction-config.js";import{validateSkillId as r,validateSkillSource as i}from"../skill/definition.js";import{SKILL_TOOL_NAMES as a,resolveSkillOptions as o}from"../skill/tools.js";import{captureContextSections as s}from"../context/section.js";import{AgentSession as c}from"./session.js";import{captureOutputFormat as l}from"./output-format.js";const u=/^[a-zA-Z][a-zA-Z0-9_-]*$/;var d=class{id;name;description;provider;model;effort;maxTokens;instructions;mode;tools;nativeTools;skills;skillIds;skillOptions;contextSections;toolChoice;outputFormat;maxTurns;maxToolCalls;commentary;memory;compaction;constructor(r){g(r),this.id=r.id,this.name=r.name??r.id,this.description=r.description,this.provider=r.provider??`codex`,this.model=r.model??`gpt-5.6-luna`,this.effort=r.effort===void 0?void 0:e(r.effort),this.maxTokens=r.maxTokens,this.instructions=r.instructions,this.mode=r.mode??`basic`,this.tools=Object.freeze([...r.tools??[]]),this.nativeTools=Object.freeze((r.nativeTools??[]).map(e=>Object.freeze({...e}))),this.skills=Object.freeze([...r.skills??[]]),this.skillIds=r.skillIds===void 0?void 0:Object.freeze([...r.skillIds]),this.skillOptions=o(r.skillOptions),this.contextSections=s(r.contextSections)??Object.freeze([]),this.toolChoice=r.toolChoice,this.outputFormat=l(r.outputFormat),this.maxTurns=r.maxTurns??16,this.maxToolCalls=r.maxToolCalls??64,this.commentary=r.commentary??`
|
|
1
|
+
import{ReasoningEffortId as e}from"../../primitives/brand.js";import{resolveMemoryConfig as t}from"../memory/memory.js";import{resolveCompactionConfig as n}from"../memory/compaction-config.js";import{validateSkillId as r,validateSkillSource as i}from"../skill/definition.js";import{SKILL_TOOL_NAMES as a,resolveSkillOptions as o}from"../skill/tools.js";import{captureContextSections as s}from"../context/section.js";import{AgentSession as c}from"./session.js";import{captureOutputFormat as l}from"./output-format.js";const u=/^[a-zA-Z][a-zA-Z0-9_-]*$/;var d=class{id;name;description;provider;model;effort;maxTokens;contextWindow;inputModalities;instructions;mode;tools;nativeTools;skills;skillIds;skillOptions;contextSections;toolChoice;outputFormat;maxTurns;maxToolCalls;commentary;memory;compaction;providerOptions;constructor(r){g(r),this.id=r.id,this.name=r.name??r.id,this.description=r.description,this.provider=r.provider??`codex`,this.model=r.model??`gpt-5.6-luna`,this.effort=r.effort===void 0?void 0:e(r.effort),this.maxTokens=r.maxTokens,this.contextWindow=r.contextWindow,this.inputModalities=r.inputModalities===void 0?void 0:Object.freeze([...r.inputModalities]),this.instructions=r.instructions,this.mode=r.mode??`basic`,this.tools=Object.freeze([...r.tools??[]]),this.nativeTools=Object.freeze((r.nativeTools??[]).map(e=>Object.freeze({...e}))),this.skills=Object.freeze([...r.skills??[]]),this.skillIds=r.skillIds===void 0?void 0:Object.freeze([...r.skillIds]),this.skillOptions=o(r.skillOptions),this.contextSections=s(r.contextSections)??Object.freeze([]),this.toolChoice=r.toolChoice,this.outputFormat=l(r.outputFormat),this.maxTurns=r.maxTurns??16,this.maxToolCalls=r.maxToolCalls??64,this.commentary=r.commentary??`auto`,this.memory=t(r.memory),this.compaction=r.compaction!==!1&&n(r.compaction),this.providerOptions=r.providerOptions===void 0?void 0:Object.freeze({...r.providerOptions.headers===void 0?{}:{headers:Object.freeze({...r.providerOptions.headers})},...r.providerOptions.body===void 0?{}:{body:Object.freeze({...r.providerOptions.body})}}),Object.freeze(this)}createSession(e){return new c(this,e)}resumeSession(e){return c.fromSnapshot(this,e)}with(e){return f(m(this,e))}};function f(e){return new d(e)}function p(e,t){return f(m(e,t))}function m(e,t){let n=t.description??e.description,r=t.toolChoice??e.toolChoice,i=t.outputFormat??e.outputFormat,a=t.skillIds??e.skillIds,o=t.maxTokens??e.maxTokens,s=t.contextWindow??e.contextWindow,c=t.inputModalities??e.inputModalities,l=t.providerOptions??e.providerOptions;return{id:t.id??e.id,name:t.name??e.name,...n===void 0?{}:{description:n},provider:t.provider??e.provider,model:t.model??e.model,...(t.effort??e.effort)===void 0?{}:{effort:t.effort??e.effort},...o===void 0?{}:{maxTokens:o},...s===void 0?{}:{contextWindow:s},...c===void 0?{}:{inputModalities:c},instructions:t.instructions??e.instructions,mode:t.mode??e.mode,tools:t.tools??e.tools,nativeTools:t.nativeTools??e.nativeTools,skills:t.skills??e.skills,...a===void 0?{}:{skillIds:a},skillOptions:t.skillOptions??e.skillOptions,contextSections:t.contextSections??e.contextSections,...r===void 0?{}:{toolChoice:r},...i===void 0?{}:{outputFormat:i},maxTurns:t.maxTurns??e.maxTurns,maxToolCalls:t.maxToolCalls??e.maxToolCalls,commentary:t.commentary??e.commentary,memory:t.memory??e.memory,compaction:t.compaction??h(e.compaction),...l===void 0?{}:{providerOptions:l}}}function h(e){return e!==!1&&{auto:e.auto,...e.maxInputTokens===void 0?{}:{maxInputTokens:e.maxInputTokens},thresholdRatio:e.thresholdRatio,...e.retainRatio===void 0?{}:{retainRatio:e.retainRatio},...e.retainTokens===void 0?{}:{retainTokens:e.retainTokens},...e.summarizationProvider===void 0?{}:{summarizationProvider:e.summarizationProvider},...e.summarizationModel===void 0?{}:{summarizationModel:e.summarizationModel},...e.summarizationEffort===void 0?{}:{summarizationEffort:e.summarizationEffort},maxSummaryTokens:e.maxSummaryTokens,compactionRetries:e.compactionRetries,maxOverflowRetries:e.maxOverflowRetries,maxSummaryInputChars:e.maxSummaryInputChars,maxSummaryRequestChars:e.maxSummaryRequestChars,maxSummaryRequestBytes:e.maxSummaryRequestBytes,maxSummaryResponseBytes:e.maxSummaryResponseBytes,maxSummaryStreamEvents:e.maxSummaryStreamEvents,summaryTimeoutMs:e.summaryTimeoutMs,teardownTimeoutMs:e.teardownTimeoutMs,maxToolResultChars:e.maxToolResultChars}}function g(e){if(!u.test(e.id))throw TypeError(`agent id must start with a letter and contain only letters, numbers, _ or -`);for(let[t,n]of[[`name`,e.name],[`description`,e.description],[`provider`,e.provider],[`model`,e.model],[`effort`,e.effort]])if(n!==void 0&&n.trim().length===0)throw TypeError(`agent ${t} must be a non-empty string`);if(e.instructions.trim().length===0)throw TypeError(`agent instructions must be a non-empty string`);if(e.maxTurns!==void 0&&e.maxTurns!==`auto`&&(!Number.isSafeInteger(e.maxTurns)||e.maxTurns<1))throw RangeError(`agent maxTurns must be a positive safe integer or 'auto'`);if(e.maxTokens!==void 0&&(!Number.isSafeInteger(e.maxTokens)||e.maxTokens<1))throw RangeError(`agent maxTokens must be a positive safe integer`);if(e.contextWindow!==void 0&&(!Number.isSafeInteger(e.contextWindow)||e.contextWindow<1))throw RangeError(`agent contextWindow must be a positive safe integer`);if(e.inputModalities!==void 0&&(e.inputModalities.length===0||new Set(e.inputModalities).size!==e.inputModalities.length))throw RangeError(`agent inputModalities must be non-empty and unique`);if(e.maxToolCalls!==void 0&&(!Number.isInteger(e.maxToolCalls)||e.maxToolCalls<1))throw RangeError(`agent maxToolCalls must be a positive integer`);let t=new Set;for(let n of e.tools??[]){if(typeof n.name!=`string`||n.name.trim().length===0)throw TypeError(`agent host tools must have a non-empty name`);if(typeof n.description!=`string`||n.description.trim().length===0)throw TypeError(`agent host tool '${n.name}' must have a non-empty description`);if(typeof n.parameters!=`object`||n.parameters===null)throw TypeError(`agent host tool '${n.name}' must declare JSON Schema parameters`);if(typeof n.execute!=`function`)throw TypeError(`agent host tool '${n.name}' must implement execute()`);if(n.timeoutMs!==void 0&&(!Number.isFinite(n.timeoutMs)||n.timeoutMs<=0))throw RangeError(`agent host tool '${n.name}' must have a positive timeoutMs`);if(t.has(n.name))throw TypeError(`agent has duplicate host tool '${n.name}'`);t.add(n.name)}for(let n of e.nativeTools??[]){if(typeof n.name!=`string`||n.name.trim().length===0)throw TypeError(`agent native tools must have a non-empty name`);if(t.has(n.name))throw TypeError(`agent has duplicate tool '${n.name}'`);t.add(n.name)}if((e.skills?.length??0)>0||(e.skillIds?.length??0)>0){for(let e of a)if(t.has(e))throw TypeError(`agent tool '${e}' collides with the skill runtime`)}let n=new Set,o=new Set,s=new Set;for(let t of e.skillIds??[]){if(r(t,`agent skill`),s.has(t))throw TypeError(`agent has duplicate allowed skill '${t}'`);s.add(t)}for(let t of e.skills??[])if(i(t),t.kind===`skill`){if(n.has(t.id))throw TypeError(`agent has duplicate inline skill '${t.id}'`);n.add(t.id)}else{if(o.has(t.id))throw TypeError(`agent has duplicate skill provider '${t.id}'`);o.add(t.id)}}export{p as cloneAgent,f as defineAgent};
|
|
2
2
|
//# sourceMappingURL=definition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition.js","names":[],"sources":["../../../src/agent/define/definition.ts"],"sourcesContent":["/** Declarative, code-first agent definitions. */\n\nimport type { ModelOutputFormat, ToolChoice, NativeToolSchema } from '../../contract/index.ts'\nimport { ReasoningEffortId, type ReasoningEffortId as ReasoningEffort } from '../../primitives/index.ts'\nimport type { AgentMode } from '../mode/run-agent.ts'\nimport type { ToolDefinition } from '../tool/definition.ts'\nimport { captureContextSections } from '../context/section.ts'\nimport type { ContextSection } from '../context/types.ts'\nimport {\n SKILL_TOOL_NAMES,\n resolveSkillOptions,\n validateSkillId,\n validateSkillSource,\n type AgentSkillOptions,\n type ResolvedAgentSkillOptions,\n type SkillSource,\n} from '../skill/index.ts'\nimport {\n resolveCompactionConfig,\n type AgentCompactionConfig,\n type AgentCompactionOptions,\n} from '../memory/compaction-config.ts'\nimport {\n resolveMemoryConfig,\n type AgentMemoryConfig,\n type AgentMemoryConfigInput,\n} from '../memory/memory.ts'\nimport {\n AgentSession,\n type AgentResumeSessionOptions,\n type AgentSessionOptions,\n} from './session.ts'\nimport { captureOutputFormat } from './output-format.ts'\n\nexport interface AgentDefinitionInput {\n /** Stable code-owned identity used by traces and catalogs. */\n readonly id: string\n /** Human-readable display name; defaults to `id`. */\n readonly name?: string\n readonly description?: string\n /** Provider route; defaults to `codex`. */\n readonly provider?: string\n /** Provider model id; defaults to `gpt-5.6-luna`. */\n readonly model?: string\n /**\n * Provider reasoning effort. Omitted means no preference.\n *\n * An agent that never asked for a level should not be given one: the value\n * is validated against the model's own ladder, so an invented default makes\n * the agent unrunnable on every provider that declares no efforts — and\n * silently overrides the provider's own default everywhere else.\n */\n readonly effort?: string\n /** Requested output budget; omission uses the selected model's declared default/cap. */\n readonly maxTokens?: number\n /** The agent's stable system instructions. */\n readonly instructions: string\n /** Execution policy; defaults to `basic`. */\n readonly mode?: AgentMode\n /** Host-executed tools owned by this definition. */\n readonly tools?: readonly ToolDefinition<any>[]\n /** Provider-executed tools such as web search or image generation. */\n readonly nativeTools?: readonly NativeToolSchema[]\n /** Inline web skills and/or lazy providers such as filesystem discovery. */\n readonly skills?: readonly SkillSource[]\n /** Optional allowlist resolved across definition and per-session skill sources. */\n readonly skillIds?: readonly string[]\n /** Progressive-disclosure catalog and resource limits. */\n readonly skillOptions?: AgentSkillOptions\n /**\n * Model-visible context this agent always recomputes before a model round.\n *\n * Sections are platform-neutral callbacks. A filesystem-backed one (project\n * instruction files, working-tree state) is built by a platform package and\n * mounted here or per session.\n */\n readonly contextSections?: readonly ContextSection[]\n readonly toolChoice?: ToolChoice\n /** Constrain visible model output to plain text or a named JSON Schema. */\n readonly outputFormat?: ModelOutputFormat\n /** Maximum model iterations for one user turn; defaults to 16. */\n /** Model steps per prompt; 'auto' continues without a fixed step ceiling. */\n readonly maxTurns?: number | 'auto'\n /** Maximum host tool calls for one user turn; defaults to 64. */\n readonly maxToolCalls?: number\n /** Public progress narration policy; defaults to `concise`. */\n readonly commentary?: 'auto' | 'concise' | 'off'\n /** Durable task facts injected outside compactable conversation history. */\n readonly memory?: AgentMemoryConfigInput\n /** Automatic context checkpointing; false disables it. Defaults to enabled. */\n readonly compaction?: AgentCompactionOptions | false\n}\n\nexport interface AgentDefinition {\n readonly id: string\n readonly name: string\n readonly description: string | undefined\n readonly provider: string\n readonly model: string\n readonly effort: ReasoningEffort | undefined\n readonly maxTokens: number | undefined\n readonly instructions: string\n readonly mode: AgentMode\n readonly tools: readonly ToolDefinition<any>[]\n readonly nativeTools: readonly NativeToolSchema[]\n readonly skills: readonly SkillSource[]\n readonly skillIds: readonly string[] | undefined\n readonly skillOptions: ResolvedAgentSkillOptions\n readonly contextSections: readonly ContextSection[]\n readonly toolChoice: ToolChoice | undefined\n readonly outputFormat: ModelOutputFormat | undefined\n readonly maxTurns: number | 'auto'\n readonly maxToolCalls: number\n readonly commentary: 'auto' | 'concise' | 'off'\n readonly memory: AgentMemoryConfig\n readonly compaction: AgentCompactionConfig | false\n}\n\nexport interface DefinedAgent extends AgentDefinition {\n /** Start an isolated, multi-turn conversation for this definition. */\n createSession(options: AgentSessionOptions): AgentSession\n /** Resume a snapshot without manually hydrating history and memory. */\n resumeSession(options: AgentResumeSessionOptions): AgentSession\n /** Derive a definition while preserving all unspecified settings. */\n with(overrides: AgentDefinitionOverrides): DefinedAgent\n}\n\nexport type AgentDefinitionOverrides = Partial<Omit<AgentDefinitionInput, 'id'>>\nexport type CloneAgentOverrides = AgentDefinitionOverrides & { readonly id: string }\ntype MergeAgentOverrides = AgentDefinitionOverrides & { readonly id?: string }\n\nconst ID_PATTERN = /^[a-zA-Z][a-zA-Z0-9_-]*$/\n\nclass DefinedAgentValue implements DefinedAgent {\n readonly id: string\n readonly name: string\n readonly description: string | undefined\n readonly provider: string\n readonly model: string\n readonly effort: ReasoningEffort | undefined\n readonly maxTokens: number | undefined\n readonly instructions: string\n readonly mode: AgentMode\n readonly tools: readonly ToolDefinition<any>[]\n readonly nativeTools: readonly NativeToolSchema[]\n readonly skills: readonly SkillSource[]\n readonly skillIds: readonly string[] | undefined\n readonly skillOptions: ResolvedAgentSkillOptions\n readonly contextSections: readonly ContextSection[]\n readonly toolChoice: ToolChoice | undefined\n readonly outputFormat: ModelOutputFormat | undefined\n readonly maxTurns: number | 'auto'\n readonly maxToolCalls: number\n readonly commentary: 'auto' | 'concise' | 'off'\n readonly memory: AgentMemoryConfig\n readonly compaction: AgentCompactionConfig | false\n\n constructor(input: AgentDefinitionInput) {\n validate(input)\n this.id = input.id\n this.name = input.name ?? input.id\n this.description = input.description\n this.provider = input.provider ?? 'codex'\n this.model = input.model ?? 'gpt-5.6-luna'\n this.effort = input.effort === undefined ? undefined : ReasoningEffortId(input.effort)\n this.maxTokens = input.maxTokens\n this.instructions = input.instructions\n this.mode = input.mode ?? 'basic'\n this.tools = Object.freeze([...(input.tools ?? [])])\n this.nativeTools = Object.freeze((input.nativeTools ?? []).map(tool => Object.freeze({ ...tool })))\n this.skills = Object.freeze([...(input.skills ?? [])])\n this.skillIds = input.skillIds === undefined ? undefined : Object.freeze([...input.skillIds])\n this.skillOptions = resolveSkillOptions(input.skillOptions)\n this.contextSections = captureContextSections(input.contextSections) ?? Object.freeze([])\n this.toolChoice = input.toolChoice\n this.outputFormat = captureOutputFormat(input.outputFormat)\n this.maxTurns = input.maxTurns ?? 16\n this.maxToolCalls = input.maxToolCalls ?? 64\n this.commentary = input.commentary ?? 'concise'\n this.memory = resolveMemoryConfig(input.memory)\n this.compaction = input.compaction === false ? false : resolveCompactionConfig(input.compaction)\n Object.freeze(this)\n }\n\n createSession(options: AgentSessionOptions): AgentSession {\n return new AgentSession(this, options)\n }\n\n resumeSession(options: AgentResumeSessionOptions): AgentSession {\n return AgentSession.fromSnapshot(this, options)\n }\n\n with(overrides: AgentDefinitionOverrides): DefinedAgent {\n return defineAgent(mergedInput(this, overrides))\n }\n}\n\n/** Define and validate one reusable agent. */\nexport function defineAgent(input: AgentDefinitionInput): DefinedAgent {\n return new DefinedAgentValue(input)\n}\n\n/** Clone an agent under a new stable id. */\nexport function cloneAgent(source: AgentDefinition, overrides: CloneAgentOverrides): DefinedAgent {\n return defineAgent(mergedInput(source, overrides))\n}\n\nfunction mergedInput(\n source: AgentDefinition,\n overrides: MergeAgentOverrides,\n): AgentDefinitionInput {\n const description = overrides.description ?? source.description\n const toolChoice = overrides.toolChoice ?? source.toolChoice\n const outputFormat = overrides.outputFormat ?? source.outputFormat\n const skillIds = overrides.skillIds ?? source.skillIds\n const maxTokens = overrides.maxTokens ?? source.maxTokens\n return {\n id: overrides.id ?? source.id,\n name: overrides.name ?? source.name,\n ...(description === undefined ? {} : { description }),\n provider: overrides.provider ?? source.provider,\n model: overrides.model ?? source.model,\n ...(overrides.effort ?? source.effort) === undefined\n ? {}\n : { effort: (overrides.effort ?? source.effort) as string },\n ...(maxTokens === undefined ? {} : { maxTokens }),\n instructions: overrides.instructions ?? source.instructions,\n mode: overrides.mode ?? source.mode,\n tools: overrides.tools ?? source.tools,\n nativeTools: overrides.nativeTools ?? source.nativeTools,\n skills: overrides.skills ?? source.skills,\n ...(skillIds === undefined ? {} : { skillIds }),\n skillOptions: overrides.skillOptions ?? source.skillOptions,\n contextSections: overrides.contextSections ?? source.contextSections,\n ...(toolChoice === undefined ? {} : { toolChoice }),\n ...(outputFormat === undefined ? {} : { outputFormat }),\n maxTurns: overrides.maxTurns ?? source.maxTurns,\n maxToolCalls: overrides.maxToolCalls ?? source.maxToolCalls,\n commentary: overrides.commentary ?? source.commentary,\n memory: overrides.memory ?? source.memory,\n compaction: overrides.compaction ?? compactionInput(source.compaction),\n }\n}\n\nfunction compactionInput(value: AgentCompactionConfig | false): AgentCompactionOptions | false {\n if (value === false) return false\n return {\n auto: value.auto,\n ...(value.maxInputTokens === undefined ? {} : { maxInputTokens: value.maxInputTokens }),\n thresholdRatio: value.thresholdRatio,\n ...(value.retainRatio === undefined ? {} : { retainRatio: value.retainRatio }),\n ...(value.retainTokens === undefined ? {} : { retainTokens: value.retainTokens }),\n ...(value.summarizationProvider === undefined ? {} : { summarizationProvider: value.summarizationProvider }),\n ...(value.summarizationModel === undefined ? {} : { summarizationModel: value.summarizationModel }),\n ...(value.summarizationEffort === undefined ? {} : { summarizationEffort: value.summarizationEffort }),\n maxSummaryTokens: value.maxSummaryTokens,\n compactionRetries: value.compactionRetries,\n maxOverflowRetries: value.maxOverflowRetries,\n maxSummaryInputChars: value.maxSummaryInputChars,\n maxSummaryRequestChars: value.maxSummaryRequestChars,\n maxSummaryRequestBytes: value.maxSummaryRequestBytes,\n maxSummaryResponseBytes: value.maxSummaryResponseBytes,\n maxSummaryStreamEvents: value.maxSummaryStreamEvents,\n summaryTimeoutMs: value.summaryTimeoutMs,\n teardownTimeoutMs: value.teardownTimeoutMs,\n maxToolResultChars: value.maxToolResultChars,\n }\n}\n\nfunction validate(input: AgentDefinitionInput): void {\n if (!ID_PATTERN.test(input.id)) {\n throw new TypeError('agent id must start with a letter and contain only letters, numbers, _ or -')\n }\n for (const [field, value] of [\n ['name', input.name], ['description', input.description], ['provider', input.provider],\n ['model', input.model], ['effort', input.effort],\n ] as const) {\n if (value !== undefined && value.trim().length === 0) {\n throw new TypeError(`agent ${field} must be a non-empty string`)\n }\n }\n if (input.instructions.trim().length === 0) {\n throw new TypeError('agent instructions must be a non-empty string')\n }\n if (input.maxTurns !== undefined && input.maxTurns !== 'auto'\n && (!Number.isSafeInteger(input.maxTurns) || input.maxTurns < 1)) {\n throw new RangeError(\"agent maxTurns must be a positive safe integer or 'auto'\")\n }\n if (input.maxTokens !== undefined\n && (!Number.isSafeInteger(input.maxTokens) || input.maxTokens < 1)) {\n throw new RangeError('agent maxTokens must be a positive safe integer')\n }\n if (input.maxToolCalls !== undefined\n && (!Number.isInteger(input.maxToolCalls) || input.maxToolCalls < 1)) {\n throw new RangeError('agent maxToolCalls must be a positive integer')\n }\n const names = new Set<string>()\n for (const tool of input.tools ?? []) {\n if (typeof tool.name !== 'string' || tool.name.trim().length === 0) {\n throw new TypeError('agent host tools must have a non-empty name')\n }\n if (typeof tool.description !== 'string' || tool.description.trim().length === 0) {\n throw new TypeError(`agent host tool '${tool.name}' must have a non-empty description`)\n }\n if (typeof tool.parameters !== 'object' || tool.parameters === null) {\n throw new TypeError(`agent host tool '${tool.name}' must declare JSON Schema parameters`)\n }\n if (typeof tool.execute !== 'function') {\n throw new TypeError(`agent host tool '${tool.name}' must implement execute()`)\n }\n if (tool.timeoutMs !== undefined && (!Number.isFinite(tool.timeoutMs) || tool.timeoutMs <= 0)) {\n throw new RangeError(`agent host tool '${tool.name}' must have a positive timeoutMs`)\n }\n if (names.has(tool.name)) throw new TypeError(`agent has duplicate host tool '${tool.name}'`)\n names.add(tool.name)\n }\n for (const tool of input.nativeTools ?? []) {\n if (typeof tool.name !== 'string' || tool.name.trim().length === 0) {\n throw new TypeError('agent native tools must have a non-empty name')\n }\n if (names.has(tool.name)) throw new TypeError(`agent has duplicate tool '${tool.name}'`)\n names.add(tool.name)\n }\n if ((input.skills?.length ?? 0) > 0 || (input.skillIds?.length ?? 0) > 0) {\n for (const reserved of SKILL_TOOL_NAMES) {\n if (names.has(reserved)) throw new TypeError(`agent tool '${reserved}' collides with the skill runtime`)\n }\n }\n const directSkills = new Set<string>()\n const providers = new Set<string>()\n const allowedSkills = new Set<string>()\n for (const id of input.skillIds ?? []) {\n validateSkillId(id, 'agent skill')\n if (allowedSkills.has(id)) throw new TypeError(`agent has duplicate allowed skill '${id}'`)\n allowedSkills.add(id)\n }\n for (const source of input.skills ?? []) {\n validateSkillSource(source)\n if (source.kind === 'skill') {\n if (directSkills.has(source.id)) throw new TypeError(`agent has duplicate inline skill '${source.id}'`)\n directSkills.add(source.id)\n } else {\n if (providers.has(source.id)) throw new TypeError(`agent has duplicate skill provider '${source.id}'`)\n providers.add(source.id)\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"definition.js","names":[],"sources":["../../../src/agent/define/definition.ts"],"sourcesContent":["/** Declarative, code-first agent definitions. */\n\nimport type { ModelOutputFormat, ToolChoice, NativeToolSchema, ModelModality } from '../../contract/index.ts'\nimport { ReasoningEffortId, type ReasoningEffortId as ReasoningEffort } from '../../primitives/index.ts'\nimport type { AgentMode } from '../mode/run-agent.ts'\nimport type { ToolDefinition } from '../tool/definition.ts'\nimport { captureContextSections } from '../context/section.ts'\nimport type { ContextSection } from '../context/types.ts'\nimport {\n SKILL_TOOL_NAMES,\n resolveSkillOptions,\n validateSkillId,\n validateSkillSource,\n type AgentSkillOptions,\n type ResolvedAgentSkillOptions,\n type SkillSource,\n} from '../skill/index.ts'\nimport {\n resolveCompactionConfig,\n type AgentCompactionConfig,\n type AgentCompactionOptions,\n} from '../memory/compaction-config.ts'\nimport {\n resolveMemoryConfig,\n type AgentMemoryConfig,\n type AgentMemoryConfigInput,\n} from '../memory/memory.ts'\nimport {\n AgentSession,\n type AgentResumeSessionOptions,\n type AgentSessionOptions,\n} from './session.ts'\nimport { captureOutputFormat } from './output-format.ts'\n\n/**\n * Fields to hand a provider's HTTP adapter for this agent's calls: extra\n * headers, or fields deep-merged into the serialized request body. The\n * caller's value always wins, even over a field the route itself set;\n * `null` in `body` deletes a field the route set.\n */\nexport interface AgentProviderOptions {\n readonly headers?: Readonly<Record<string, string>>\n readonly body?: Readonly<Record<string, unknown>>\n}\n\nexport interface AgentDefinitionInput {\n /** Stable code-owned identity used by traces and catalogs. */\n readonly id: string\n /** Human-readable display name; defaults to `id`. */\n readonly name?: string\n readonly description?: string\n /** Provider route; defaults to `codex`. */\n readonly provider?: string\n /** Provider model id; defaults to `gpt-5.6-luna`. */\n readonly model?: string\n /**\n * Provider reasoning effort. Omitted means no preference.\n *\n * Pure pass-through: omitted, no effort field reaches the wire request at\n * all; set, the exact string is forwarded to the provider's own effort\n * field verbatim. The SDK never validates it against a ladder or invents a\n * default — an unsupported value is the provider's rejection to make, in\n * its own error shape, not a guess this package would get stale.\n */\n readonly effort?: string\n /** Requested output budget; omission uses the selected model's declared default/cap. */\n readonly maxTokens?: number\n /** Overrides the model/route/runtime-defaults tiers, same precedence as `maxTokens`. */\n readonly contextWindow?: number\n /** Overrides the model/route/runtime-defaults tiers, same precedence as `maxTokens`. */\n readonly inputModalities?: readonly ModelModality[]\n /** The agent's stable system instructions. */\n readonly instructions: string\n /** Execution policy; defaults to `basic`. */\n readonly mode?: AgentMode\n /** Host-executed tools owned by this definition. */\n readonly tools?: readonly ToolDefinition<any>[]\n /** Provider-executed tools such as web search or image generation. */\n readonly nativeTools?: readonly NativeToolSchema[]\n /** Inline web skills and/or lazy providers such as filesystem discovery. */\n readonly skills?: readonly SkillSource[]\n /** Optional allowlist resolved across definition and per-session skill sources. */\n readonly skillIds?: readonly string[]\n /** Progressive-disclosure catalog and resource limits. */\n readonly skillOptions?: AgentSkillOptions\n /**\n * Model-visible context this agent always recomputes before a model round.\n *\n * Sections are platform-neutral callbacks. A filesystem-backed one (project\n * instruction files, working-tree state) is built by a platform package and\n * mounted here or per session.\n */\n readonly contextSections?: readonly ContextSection[]\n readonly toolChoice?: ToolChoice\n /** Constrain visible model output to plain text or a named JSON Schema. */\n readonly outputFormat?: ModelOutputFormat\n /** Maximum model iterations for one user turn; defaults to 16. */\n /** Model steps per prompt; 'auto' continues without a fixed step ceiling. */\n readonly maxTurns?: number | 'auto'\n /** Maximum host tool calls for one user turn; defaults to 64. */\n readonly maxToolCalls?: number\n /** Public progress narration policy; defaults to `auto` (caller-defined style). */\n readonly commentary?: 'auto' | 'concise' | 'off'\n /** Durable task facts injected outside compactable conversation history. */\n readonly memory?: AgentMemoryConfigInput\n /** Automatic context checkpointing; false disables it. Defaults to enabled. */\n readonly compaction?: AgentCompactionOptions | false\n /** Extra headers/body fields for this agent's provider requests; this agent's value wins where it collides with the route's own. */\n readonly providerOptions?: AgentProviderOptions\n}\n\nexport interface AgentDefinition {\n readonly id: string\n readonly name: string\n readonly description: string | undefined\n readonly provider: string\n readonly model: string\n readonly effort: ReasoningEffort | undefined\n readonly maxTokens: number | undefined\n readonly contextWindow: number | undefined\n readonly inputModalities: readonly ModelModality[] | undefined\n readonly instructions: string\n readonly mode: AgentMode\n readonly tools: readonly ToolDefinition<any>[]\n readonly nativeTools: readonly NativeToolSchema[]\n readonly skills: readonly SkillSource[]\n readonly skillIds: readonly string[] | undefined\n readonly skillOptions: ResolvedAgentSkillOptions\n readonly contextSections: readonly ContextSection[]\n readonly toolChoice: ToolChoice | undefined\n readonly outputFormat: ModelOutputFormat | undefined\n readonly maxTurns: number | 'auto'\n readonly maxToolCalls: number\n readonly commentary: 'auto' | 'concise' | 'off'\n readonly memory: AgentMemoryConfig\n readonly compaction: AgentCompactionConfig | false\n readonly providerOptions: AgentProviderOptions | undefined\n}\n\nexport interface DefinedAgent extends AgentDefinition {\n /** Start an isolated, multi-turn conversation for this definition. */\n createSession(options: AgentSessionOptions): AgentSession\n /** Resume a snapshot without manually hydrating history and memory. */\n resumeSession(options: AgentResumeSessionOptions): AgentSession\n /** Derive a definition while preserving all unspecified settings. */\n with(overrides: AgentDefinitionOverrides): DefinedAgent\n}\n\nexport type AgentDefinitionOverrides = Partial<Omit<AgentDefinitionInput, 'id'>>\nexport type CloneAgentOverrides = AgentDefinitionOverrides & { readonly id: string }\ntype MergeAgentOverrides = AgentDefinitionOverrides & { readonly id?: string }\n\nconst ID_PATTERN = /^[a-zA-Z][a-zA-Z0-9_-]*$/\n\nclass DefinedAgentValue implements DefinedAgent {\n readonly id: string\n readonly name: string\n readonly description: string | undefined\n readonly provider: string\n readonly model: string\n readonly effort: ReasoningEffort | undefined\n readonly maxTokens: number | undefined\n readonly contextWindow: number | undefined\n readonly inputModalities: readonly ModelModality[] | undefined\n readonly instructions: string\n readonly mode: AgentMode\n readonly tools: readonly ToolDefinition<any>[]\n readonly nativeTools: readonly NativeToolSchema[]\n readonly skills: readonly SkillSource[]\n readonly skillIds: readonly string[] | undefined\n readonly skillOptions: ResolvedAgentSkillOptions\n readonly contextSections: readonly ContextSection[]\n readonly toolChoice: ToolChoice | undefined\n readonly outputFormat: ModelOutputFormat | undefined\n readonly maxTurns: number | 'auto'\n readonly maxToolCalls: number\n readonly commentary: 'auto' | 'concise' | 'off'\n readonly memory: AgentMemoryConfig\n readonly compaction: AgentCompactionConfig | false\n readonly providerOptions: AgentProviderOptions | undefined\n\n constructor(input: AgentDefinitionInput) {\n validate(input)\n this.id = input.id\n this.name = input.name ?? input.id\n this.description = input.description\n this.provider = input.provider ?? 'codex'\n this.model = input.model ?? 'gpt-5.6-luna'\n this.effort = input.effort === undefined ? undefined : ReasoningEffortId(input.effort)\n this.maxTokens = input.maxTokens\n this.contextWindow = input.contextWindow\n this.inputModalities = input.inputModalities === undefined ? undefined : Object.freeze([...input.inputModalities])\n this.instructions = input.instructions\n this.mode = input.mode ?? 'basic'\n this.tools = Object.freeze([...(input.tools ?? [])])\n this.nativeTools = Object.freeze((input.nativeTools ?? []).map(tool => Object.freeze({ ...tool })))\n this.skills = Object.freeze([...(input.skills ?? [])])\n this.skillIds = input.skillIds === undefined ? undefined : Object.freeze([...input.skillIds])\n this.skillOptions = resolveSkillOptions(input.skillOptions)\n this.contextSections = captureContextSections(input.contextSections) ?? Object.freeze([])\n this.toolChoice = input.toolChoice\n this.outputFormat = captureOutputFormat(input.outputFormat)\n this.maxTurns = input.maxTurns ?? 16\n this.maxToolCalls = input.maxToolCalls ?? 64\n this.commentary = input.commentary ?? 'auto'\n this.memory = resolveMemoryConfig(input.memory)\n this.compaction = input.compaction === false ? false : resolveCompactionConfig(input.compaction)\n this.providerOptions = input.providerOptions === undefined ? undefined : Object.freeze({\n ...(input.providerOptions.headers === undefined ? {} : { headers: Object.freeze({ ...input.providerOptions.headers }) }),\n ...(input.providerOptions.body === undefined ? {} : { body: Object.freeze({ ...input.providerOptions.body }) }),\n })\n Object.freeze(this)\n }\n\n createSession(options: AgentSessionOptions): AgentSession {\n return new AgentSession(this, options)\n }\n\n resumeSession(options: AgentResumeSessionOptions): AgentSession {\n return AgentSession.fromSnapshot(this, options)\n }\n\n with(overrides: AgentDefinitionOverrides): DefinedAgent {\n return defineAgent(mergedInput(this, overrides))\n }\n}\n\n/** Define and validate one reusable agent. */\nexport function defineAgent(input: AgentDefinitionInput): DefinedAgent {\n return new DefinedAgentValue(input)\n}\n\n/** Clone an agent under a new stable id. */\nexport function cloneAgent(source: AgentDefinition, overrides: CloneAgentOverrides): DefinedAgent {\n return defineAgent(mergedInput(source, overrides))\n}\n\nfunction mergedInput(\n source: AgentDefinition,\n overrides: MergeAgentOverrides,\n): AgentDefinitionInput {\n const description = overrides.description ?? source.description\n const toolChoice = overrides.toolChoice ?? source.toolChoice\n const outputFormat = overrides.outputFormat ?? source.outputFormat\n const skillIds = overrides.skillIds ?? source.skillIds\n const maxTokens = overrides.maxTokens ?? source.maxTokens\n const contextWindow = overrides.contextWindow ?? source.contextWindow\n const inputModalities = overrides.inputModalities ?? source.inputModalities\n const providerOptions = overrides.providerOptions ?? source.providerOptions\n return {\n id: overrides.id ?? source.id,\n name: overrides.name ?? source.name,\n ...(description === undefined ? {} : { description }),\n provider: overrides.provider ?? source.provider,\n model: overrides.model ?? source.model,\n ...(overrides.effort ?? source.effort) === undefined\n ? {}\n : { effort: (overrides.effort ?? source.effort) as string },\n ...(maxTokens === undefined ? {} : { maxTokens }),\n ...(contextWindow === undefined ? {} : { contextWindow }),\n ...(inputModalities === undefined ? {} : { inputModalities }),\n instructions: overrides.instructions ?? source.instructions,\n mode: overrides.mode ?? source.mode,\n tools: overrides.tools ?? source.tools,\n nativeTools: overrides.nativeTools ?? source.nativeTools,\n skills: overrides.skills ?? source.skills,\n ...(skillIds === undefined ? {} : { skillIds }),\n skillOptions: overrides.skillOptions ?? source.skillOptions,\n contextSections: overrides.contextSections ?? source.contextSections,\n ...(toolChoice === undefined ? {} : { toolChoice }),\n ...(outputFormat === undefined ? {} : { outputFormat }),\n maxTurns: overrides.maxTurns ?? source.maxTurns,\n maxToolCalls: overrides.maxToolCalls ?? source.maxToolCalls,\n commentary: overrides.commentary ?? source.commentary,\n memory: overrides.memory ?? source.memory,\n compaction: overrides.compaction ?? compactionInput(source.compaction),\n ...(providerOptions === undefined ? {} : { providerOptions }),\n }\n}\n\nfunction compactionInput(value: AgentCompactionConfig | false): AgentCompactionOptions | false {\n if (value === false) return false\n return {\n auto: value.auto,\n ...(value.maxInputTokens === undefined ? {} : { maxInputTokens: value.maxInputTokens }),\n thresholdRatio: value.thresholdRatio,\n ...(value.retainRatio === undefined ? {} : { retainRatio: value.retainRatio }),\n ...(value.retainTokens === undefined ? {} : { retainTokens: value.retainTokens }),\n ...(value.summarizationProvider === undefined ? {} : { summarizationProvider: value.summarizationProvider }),\n ...(value.summarizationModel === undefined ? {} : { summarizationModel: value.summarizationModel }),\n ...(value.summarizationEffort === undefined ? {} : { summarizationEffort: value.summarizationEffort }),\n maxSummaryTokens: value.maxSummaryTokens,\n compactionRetries: value.compactionRetries,\n maxOverflowRetries: value.maxOverflowRetries,\n maxSummaryInputChars: value.maxSummaryInputChars,\n maxSummaryRequestChars: value.maxSummaryRequestChars,\n maxSummaryRequestBytes: value.maxSummaryRequestBytes,\n maxSummaryResponseBytes: value.maxSummaryResponseBytes,\n maxSummaryStreamEvents: value.maxSummaryStreamEvents,\n summaryTimeoutMs: value.summaryTimeoutMs,\n teardownTimeoutMs: value.teardownTimeoutMs,\n maxToolResultChars: value.maxToolResultChars,\n }\n}\n\nfunction validate(input: AgentDefinitionInput): void {\n if (!ID_PATTERN.test(input.id)) {\n throw new TypeError('agent id must start with a letter and contain only letters, numbers, _ or -')\n }\n for (const [field, value] of [\n ['name', input.name], ['description', input.description], ['provider', input.provider],\n ['model', input.model], ['effort', input.effort],\n ] as const) {\n if (value !== undefined && value.trim().length === 0) {\n throw new TypeError(`agent ${field} must be a non-empty string`)\n }\n }\n if (input.instructions.trim().length === 0) {\n throw new TypeError('agent instructions must be a non-empty string')\n }\n if (input.maxTurns !== undefined && input.maxTurns !== 'auto'\n && (!Number.isSafeInteger(input.maxTurns) || input.maxTurns < 1)) {\n throw new RangeError(\"agent maxTurns must be a positive safe integer or 'auto'\")\n }\n if (input.maxTokens !== undefined\n && (!Number.isSafeInteger(input.maxTokens) || input.maxTokens < 1)) {\n throw new RangeError('agent maxTokens must be a positive safe integer')\n }\n if (input.contextWindow !== undefined\n && (!Number.isSafeInteger(input.contextWindow) || input.contextWindow < 1)) {\n throw new RangeError('agent contextWindow must be a positive safe integer')\n }\n if (input.inputModalities !== undefined\n && (input.inputModalities.length === 0\n || new Set(input.inputModalities).size !== input.inputModalities.length)) {\n throw new RangeError('agent inputModalities must be non-empty and unique')\n }\n if (input.maxToolCalls !== undefined\n && (!Number.isInteger(input.maxToolCalls) || input.maxToolCalls < 1)) {\n throw new RangeError('agent maxToolCalls must be a positive integer')\n }\n const names = new Set<string>()\n for (const tool of input.tools ?? []) {\n if (typeof tool.name !== 'string' || tool.name.trim().length === 0) {\n throw new TypeError('agent host tools must have a non-empty name')\n }\n if (typeof tool.description !== 'string' || tool.description.trim().length === 0) {\n throw new TypeError(`agent host tool '${tool.name}' must have a non-empty description`)\n }\n if (typeof tool.parameters !== 'object' || tool.parameters === null) {\n throw new TypeError(`agent host tool '${tool.name}' must declare JSON Schema parameters`)\n }\n if (typeof tool.execute !== 'function') {\n throw new TypeError(`agent host tool '${tool.name}' must implement execute()`)\n }\n if (tool.timeoutMs !== undefined && (!Number.isFinite(tool.timeoutMs) || tool.timeoutMs <= 0)) {\n throw new RangeError(`agent host tool '${tool.name}' must have a positive timeoutMs`)\n }\n if (names.has(tool.name)) throw new TypeError(`agent has duplicate host tool '${tool.name}'`)\n names.add(tool.name)\n }\n for (const tool of input.nativeTools ?? []) {\n if (typeof tool.name !== 'string' || tool.name.trim().length === 0) {\n throw new TypeError('agent native tools must have a non-empty name')\n }\n if (names.has(tool.name)) throw new TypeError(`agent has duplicate tool '${tool.name}'`)\n names.add(tool.name)\n }\n if ((input.skills?.length ?? 0) > 0 || (input.skillIds?.length ?? 0) > 0) {\n for (const reserved of SKILL_TOOL_NAMES) {\n if (names.has(reserved)) throw new TypeError(`agent tool '${reserved}' collides with the skill runtime`)\n }\n }\n const directSkills = new Set<string>()\n const providers = new Set<string>()\n const allowedSkills = new Set<string>()\n for (const id of input.skillIds ?? []) {\n validateSkillId(id, 'agent skill')\n if (allowedSkills.has(id)) throw new TypeError(`agent has duplicate allowed skill '${id}'`)\n allowedSkills.add(id)\n }\n for (const source of input.skills ?? []) {\n validateSkillSource(source)\n if (source.kind === 'skill') {\n if (directSkills.has(source.id)) throw new TypeError(`agent has duplicate inline skill '${source.id}'`)\n directSkills.add(source.id)\n } else {\n if (providers.has(source.id)) throw new TypeError(`agent has duplicate skill provider '${source.id}'`)\n providers.add(source.id)\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{RunLedger as e}from"../../accounting/ledger.js";function t(t){let{definition:n,options:r,runtimeLimits:i,conversationId:a,runtime:o}=t;return new e({...r.observation===void 0?{}:{observation:r.observation},...r.observationResource===void 0?{}:{resource:r.observationResource},conversationId:a,sessionId:a,agentId:n.id,mode:n.mode,maxTurns:n.maxTurns,...r.usagePolicy===void 0?{}:{usagePolicy:r.usagePolicy},cumulativeTokenBudget:typeof i.maxTotalTokens==`number`,...o?.logger===void 0?{}:{logger:o.logger},...r.ledgerLimits===void 0?{}:{limits:r.ledgerLimits}})}export{t as createSessionLedger};
|
|
1
|
+
import{RunLedger as e}from"../../accounting/ledger.js";function t(t){let{definition:n,options:r,runtimeLimits:i,conversationId:a,runtime:o}=t;return new e({...r.observation===void 0?{}:{observation:r.observation},...r.observationResource===void 0?{}:{resource:r.observationResource},conversationId:a,sessionId:a,agentId:n.id,...n.providerOptions===void 0?{}:{providerOptions:n.providerOptions},mode:n.mode,maxTurns:n.maxTurns,...r.usagePolicy===void 0?{}:{usagePolicy:r.usagePolicy},cumulativeTokenBudget:typeof i.maxTotalTokens==`number`,...o?.logger===void 0?{}:{logger:o.logger},...r.ledgerLimits===void 0?{}:{limits:r.ledgerLimits}})}export{t as createSessionLedger};
|
|
2
2
|
//# sourceMappingURL=accounting.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounting.js","names":[],"sources":["../../../../src/agent/define/session/accounting.ts"],"sourcesContent":["import type { AgentDefinition } from '../definition.ts'\nimport type { AgentRuntimeLimits, AgentSessionOptions } from './types.ts'\nimport type { RuntimeSessionConfiguration } from './runtime-binding.ts'\nimport { RunLedger } from '../../accounting/ledger.ts'\n\nexport interface SessionLedgerInput {\n readonly definition: AgentDefinition\n readonly options: AgentSessionOptions\n readonly runtimeLimits: Readonly<AgentRuntimeLimits>\n readonly conversationId: string\n readonly runtime?: RuntimeSessionConfiguration\n}\n\nexport function createSessionLedger(input: SessionLedgerInput): RunLedger {\n const { definition, options, runtimeLimits, conversationId, runtime } = input\n return new RunLedger({\n ...options.observation === undefined ? {} : { observation: options.observation },\n ...options.observationResource === undefined ? {} : { resource: options.observationResource },\n conversationId,\n sessionId: conversationId,\n agentId: definition.id,\n mode: definition.mode,\n maxTurns: definition.maxTurns,\n ...options.usagePolicy === undefined ? {} : { usagePolicy: options.usagePolicy },\n cumulativeTokenBudget: typeof runtimeLimits.maxTotalTokens === 'number',\n ...(runtime?.logger === undefined ? {} : { logger: runtime.logger }),\n ...options.ledgerLimits === undefined ? {} : { limits: options.ledgerLimits },\n })\n}\n"],"mappings":"uDAaA,SAAgB,EAAoB,EAAsC,CACxE,GAAM,CAAE,aAAY,UAAS,gBAAe,iBAAgB,WAAY,EACxE,OAAO,IAAI,EAAU,CACnB,GAAG,EAAQ,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAQ,WAAY,EAC/E,GAAG,EAAQ,sBAAwB,IAAA,GAAY,CAAC,EAAI,CAAE,SAAU,EAAQ,mBAAoB,EAC5F,iBACA,UAAW,EACX,QAAS,EAAW,GACpB,KAAM,EAAW,KACjB,SAAU,EAAW,SACrB,GAAG,EAAQ,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAQ,WAAY,EAC/E,sBAAuB,OAAO,EAAc,gBAAmB,SAC/D,GAAI,GAAS,SAAW,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAQ,MAAO,EAClE,GAAG,EAAQ,eAAiB,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAQ,YAAa,CAC9E,CAAC,CACH"}
|
|
1
|
+
{"version":3,"file":"accounting.js","names":[],"sources":["../../../../src/agent/define/session/accounting.ts"],"sourcesContent":["import type { AgentDefinition } from '../definition.ts'\nimport type { AgentRuntimeLimits, AgentSessionOptions } from './types.ts'\nimport type { RuntimeSessionConfiguration } from './runtime-binding.ts'\nimport { RunLedger } from '../../accounting/ledger.ts'\n\nexport interface SessionLedgerInput {\n readonly definition: AgentDefinition\n readonly options: AgentSessionOptions\n readonly runtimeLimits: Readonly<AgentRuntimeLimits>\n readonly conversationId: string\n readonly runtime?: RuntimeSessionConfiguration\n}\n\nexport function createSessionLedger(input: SessionLedgerInput): RunLedger {\n const { definition, options, runtimeLimits, conversationId, runtime } = input\n return new RunLedger({\n ...options.observation === undefined ? {} : { observation: options.observation },\n ...options.observationResource === undefined ? {} : { resource: options.observationResource },\n conversationId,\n sessionId: conversationId,\n agentId: definition.id,\n ...(definition.providerOptions === undefined ? {} : { providerOptions: definition.providerOptions }),\n mode: definition.mode,\n maxTurns: definition.maxTurns,\n ...options.usagePolicy === undefined ? {} : { usagePolicy: options.usagePolicy },\n cumulativeTokenBudget: typeof runtimeLimits.maxTotalTokens === 'number',\n ...(runtime?.logger === undefined ? {} : { logger: runtime.logger }),\n ...options.ledgerLimits === undefined ? {} : { limits: options.ledgerLimits },\n })\n}\n"],"mappings":"uDAaA,SAAgB,EAAoB,EAAsC,CACxE,GAAM,CAAE,aAAY,UAAS,gBAAe,iBAAgB,WAAY,EACxE,OAAO,IAAI,EAAU,CACnB,GAAG,EAAQ,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAQ,WAAY,EAC/E,GAAG,EAAQ,sBAAwB,IAAA,GAAY,CAAC,EAAI,CAAE,SAAU,EAAQ,mBAAoB,EAC5F,iBACA,UAAW,EACX,QAAS,EAAW,GACpB,GAAI,EAAW,kBAAoB,IAAA,GAAY,CAAC,EAAI,CAAE,gBAAiB,EAAW,eAAgB,EAClG,KAAM,EAAW,KACjB,SAAU,EAAW,SACrB,GAAG,EAAQ,cAAgB,IAAA,GAAY,CAAC,EAAI,CAAE,YAAa,EAAQ,WAAY,EAC/E,sBAAuB,OAAO,EAAc,gBAAmB,SAC/D,GAAI,GAAS,SAAW,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAQ,MAAO,EAClE,GAAG,EAAQ,eAAiB,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAQ,YAAa,CAC9E,CAAC,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(e,t,n){let r=t===void 0?{provider:e.provider,model:e.model,...e.effort===void 0?{}:{reasoningEffort:e.effort},...e.maxTokens===void 0?{}:{maxTokens:e.maxTokens}}:{provider:t.provider,model:t.model,...t.reasoningEffort===void 0?{}:{reasoningEffort:t.reasoningEffort},...t.maxTokens===void 0?{}:{maxTokens:t.maxTokens}},
|
|
1
|
+
function e(e,t,n){let r={...e.contextWindow===void 0?{}:{contextWindow:e.contextWindow},...e.inputModalities===void 0?{}:{inputModalities:e.inputModalities}},i=t===void 0?{provider:e.provider,model:e.model,...e.effort===void 0?{}:{reasoningEffort:e.effort},...e.maxTokens===void 0?{}:{maxTokens:e.maxTokens},...r}:{provider:t.provider,model:t.model,...t.reasoningEffort===void 0?{}:{reasoningEffort:t.reasoningEffort},...t.maxTokens===void 0?{}:{maxTokens:t.maxTokens},...r},a=n?.model;if(a===void 0&&n?.maxTokens===void 0)return i;let o=a!==void 0&&(a.provider!==i.provider||a.model!==i.model),s=o?void 0:i.reasoningEffort,c=n?.maxTokens??(o?void 0:i.maxTokens);return{provider:a?.provider??i.provider,model:a?.model??i.model,...s===void 0?{}:{reasoningEffort:s},...c===void 0?{}:{maxTokens:c},...r}}export{e as sessionCallConfig};
|
|
2
2
|
//# sourceMappingURL=model-config.js.map
|