@alma-harness/batch 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -78,3 +78,19 @@ acknowledgement, not terminal cancellation or a refund. A failed/ambiguous reque
78
78
  is never retried automatically; an explicit later call is another cancellation
79
79
  request. Continue explicit status/collection to account for completed items and
80
80
  retain unknown evidence. Closing a connection does not prove dependency termination.
81
+
82
+ ## Tool selection
83
+
84
+ Each item's `execution.controls.toolChoice` must equal its loaded
85
+ `request.toolChoice`. Supported neutral modes are auto, none, required and
86
+ `{type:"tool",name}`; provider/model restrictions remain those documented by the
87
+ providers package. Named choices are validated against the actual authorized
88
+ ToolSpecs before dispatch, including with custom transport validators. Choice is
89
+ part of immutable batch identity; changed choice conflicts without another input
90
+ load or submission. Absence retains the old wire and replay contract.
91
+
92
+ Successful extraction items preserve their `tool_use` stop and ordered `tool_call`
93
+ blocks, alongside original financial receipts. Inspect outcome, stop, expected name
94
+ and validate arguments before using them. Selection invokes no business handler
95
+ or personal-memory write. Read/status/collect/reconcile/cancel never infer authority
96
+ to submit again from missing content, unknown usage or an absent handle.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/index.ts
2
2
  import { createHash } from "crypto";
3
- import { AuditSinkError, BudgetExceededError, equalExecution, ExecutionConflictError, ExecutionResultPolicyError, ExecutionStateError, normalizeSpendTotals, normalizeBudgetCaps, settlementIdentifier, settlementScope } from "@alma-harness/core";
3
+ import { validateToolChoice, AuditSinkError, BudgetExceededError, equalExecution, ExecutionConflictError, ExecutionResultPolicyError, ExecutionStateError, normalizeSpendTotals, normalizeBudgetCaps, settlementIdentifier, settlementScope } from "@alma-harness/core";
4
4
  import { batchUsageQuery, batchUsageSettlement, normalizeBatchRecord, normalizeBatchSubmission, normalizeBatchUsage } from "@alma-harness/execution";
5
5
 
6
6
  // src/output.ts
@@ -297,8 +297,9 @@ function createGovernedBatchRunner(value) {
297
297
  if (!Array.isArray(items) || items.length !== input.items.length || JSON.stringify(items).length > c.maxRequestChars) throw new ExecutionConflictError();
298
298
  for (let n = 0; n < items.length; n++) {
299
299
  const item = items[n], member = input.items[n], r = item.request, e = member.execution;
300
- const controls = { maxTokens: r.maxTokens, ...r.temperature !== void 0 ? { temperature: r.temperature } : {}, ...r.reasoning !== void 0 ? { reasoning: r.reasoning } : {}, ...r.cache !== void 0 ? { cache: r.cache } : {} };
300
+ const controls = { maxTokens: r.maxTokens, ...r.toolChoice !== void 0 ? { toolChoice: r.toolChoice } : {}, ...r.temperature !== void 0 ? { temperature: r.temperature } : {}, ...r.reasoning !== void 0 ? { reasoning: r.reasoning } : {}, ...r.cache !== void 0 ? { cache: r.cache } : {} };
301
301
  if (item.id !== member.id || !equalExecution(r.model, e.model) || r.serviceTier !== "batch" || !equalExecution(controls, e.controls)) throw new ExecutionConflictError();
302
+ validateToolChoice(r);
302
303
  }
303
304
  transport.validate(structuredClone(items));
304
305
  active();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/output.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { AuditSinkError, BudgetExceededError, equalExecution, ExecutionConflictError, ExecutionResultPolicyError, ExecutionStateError, normalizeSpendTotals, normalizeBudgetCaps, settlementIdentifier, settlementScope, type ExecutionResult, type Scope } from '@alma-harness/core';\nimport { batchUsageQuery, batchUsageSettlement, normalizeBatchRecord, normalizeBatchSubmission, normalizeBatchUsage, type BatchFinancialReceipt, type BatchSubmissionRecord, type BatchUsageQuery, type BatchUsageRecord } from '@alma-harness/execution';\nimport { binding, decode, encode, unavailable } from './output';\nimport type { BatchKey, GovernedBatchCollection, GovernedBatchConfig, GovernedBatchItemView, GovernedBatchSubmit, GovernedBatchView } from './types';\nexport type * from './types';\nconst abortError=()=>new DOMException('Batch operation interrupted','AbortError');\nfunction canonical(v:unknown):string {if(v===null||typeof v!=='object')return JSON.stringify(v);if(Array.isArray(v))return `[${v.map(canonical).join(',')}]`;return `{${Object.keys(v).sort().map(k=>JSON.stringify(k)+':'+canonical((v as Record<string,unknown>)[k])).join(',')}}`;}\nexport function createGovernedBatchRunner(value:GovernedBatchConfig) {\n for(const [key,max] of [['runTimeoutMs',300_000],['maxRequestChars',64_000_000],['maxOutputChars',1_000_000],['maxBatchOutputChars',64_000_000]] as const)\n if(!Number.isSafeInteger(value[key])||value[key]<1||value[key]>max)throw new TypeError('Invalid batch limits');\n if(typeof value.onBackgroundError!=='function')throw new TypeError('Missing background observer');\n const c={...value,configRevision:settlementIdentifier(value.configRevision),clients:{...value.clients}};\n const key=(v:BatchKey):BatchKey=>({scope:settlementScope(v.scope),key:settlementIdentifier(v.key)});\n function config(r:BatchSubmissionRecord):void {if(r.input.configRevision!==c.configRevision)throw new ExecutionConflictError();}\n function client(r:BatchSubmissionRecord){config(r);const v=c.clients[r.input.items[0]!.execution.model.provider];if(!v||v.dispatchPolicy!=='single'||typeof v.validate!=='function')throw new TypeError('Single-dispatch batch client required');return v;}\n async function lookup(k:BatchKey){const raw=await c.batches.get(k.scope,k.key);if(!raw)return null;const r=normalizeBatchRecord(raw);if(!equalExecution(r.input.scope,k.scope)||r.input.key!==k.key)throw new ExecutionConflictError();config(r);return r;}\n async function receipts(k:BatchKey){const all:BatchFinancialReceipt[]=[];for(let afterOrdinal=0;afterOrdinal<512;){const page=await c.accounting.list(k.scope,k.key,{afterOrdinal,limit:100});all.push(...page);if(page.length<100)break;afterOrdinal=page.at(-1)!.accountingOrdinal;}return all;}\n async function read(value:BatchKey):Promise<GovernedBatchView|null> {\n const k=key(value),record=await lookup(k);if(!record)return null;\n const financial=await c.accounting.get(k.scope,k.key),rows=await receipts(k),items:GovernedBatchItemView[]=[];\n const incompleteBlock=Object.values(normalizeBudgetCaps(record.input.items[0]!.execution.governance!.caps)).some(cap=>cap.onExceeded==='block')&&rows.length!==record.input.items.length;\n const block=rows.some(r=>r.decisions.some(d=>d.exceeded&&d.onExceeded==='block'));let chars=0;\n for(const member of record.input.items){const e=member.execution,receipt=rows.find(r=>r.itemId===member.id);\n if(receipt&&(receipt.batchId!==record.input.id||receipt.callId!==e.callId||receipt.settlementId!==e.settlementId))throw new ExecutionConflictError();\n let saved;try{saved=await c.results.get(k.scope,e.callId);}catch(err){if(!(err instanceof ExecutionResultPolicyError))throw err;}\n if(saved&&!equalExecution(saved.binding,binding(e)))throw new ExecutionConflictError();\n let result=saved?.state==='available'&&receipt&&saved.result?saved.result:unavailable(),output;\n if(result.outcome==='success'){\n try{if(result.output.format!=='json')throw new TypeError();output=decode(result.output.text,c.maxOutputChars);if(output.stop!==result.stopReason)throw new TypeError();chars+=result.output.text.length;if(chars>c.maxBatchOutputChars)throw new TypeError();}\n catch{result=unavailable();output=undefined;}\n if(incompleteBlock){result=unavailable();output=undefined;}else if(block){result={outcome:'blocked',stopReason:result.stopReason};output=undefined;}\n }\n items.push({id:member.id,state:saved?.state??'unavailable',result,...(receipt?{receipt}:{}),...(output?{output}:{})});\n }\n return {record,financial,items};\n }\n async function required(k:BatchKey){const view=await read(k);if(!view)throw new ExecutionStateError();return view;}\n async function repair(k:BatchKey,row:BatchUsageRecord):Promise<boolean>{\n const request=batchUsageSettlement(row);if(!request)return false;\n await c.settlements.settleGoverned(request);\n const adopted=await c.usage.recordSettlement(k.scope,k.key,row.input.id);if(adopted.status==='pending')return false;\n return (await c.accounting.record(k.scope,k.key,row.input.id)).status!=='pending';\n }\n async function reconcile(value:BatchKey,query?:BatchUsageQuery){const k=key(value),record=await lookup(k);if(!record)return null;\n const rows=await c.usage.list(k.scope,k.key,batchUsageQuery(query));let repaired=0,pending=0;\n for(const row of rows){try{if(await repair(k,row))repaired++;else pending++;}catch{pending++;}}\n return {scanned:rows.length,repaired,pending,...(rows.length?{afterId:rows.at(-1)!.input.id}:{})};\n }\n function bounded<T>(k:BatchKey,external:AbortSignal|undefined,work:(signal:AbortSignal,check:()=>void,stage:(v:string)=>void,deadline:(at:string)=>void)=>Promise<T>):Promise<T>{\n const controller=new AbortController();let stage='lookup',interrupted=false;let deadlineTimer:ReturnType<typeof setTimeout>|undefined;\n const abort=()=>controller.abort();const timer=setTimeout(abort,c.runTimeoutMs);\n const rejected=new Promise<never>((_,reject)=>controller.signal.addEventListener('abort',()=>{interrupted=true;reject(abortError());},{once:true}));\n external?.addEventListener('abort',abort,{once:true});if(external?.aborted)abort();\n const check=()=>{if(controller.signal.aborted)throw abortError();};\n const active=work(controller.signal,check,v=>{stage=v;},at=>{deadlineTimer=setTimeout(abort,Math.max(1,Date.parse(at)-Date.now()));});\n void active.catch(()=>{if(interrupted)try{void Promise.resolve(c.onBackgroundError({...structuredClone(k),stage})).catch(()=>{});}catch{/* Monitoring cannot create an unhandled rejection. */}});\n return Promise.race([active,rejected]).finally(()=>{clearTimeout(timer);clearTimeout(deadlineTimer);external?.removeEventListener('abort',abort);});\n }\n function submit(value:GovernedBatchSubmit):Promise<GovernedBatchView>{\n const input=normalizeBatchSubmission(value.input),k=key(input),load=value.loadItems,rationale=value.rationale;\n if(input.configRevision!==c.configRevision||typeof load!=='function'||typeof rationale!=='string'||rationale.length>1000||input.items.some(i=>! /^[A-Za-z0-9_-]{1,64}$/.test(i.id)))throw new TypeError('Invalid batch submission');\n return bounded(k,value.signal,async(signal,check,stage,armDeadline)=>{\n check();const old=await lookup(k);check();if(old){if(!equalExecution(old.input,input))throw new ExecutionConflictError();return required(k);}\n const active=()=>{check();if(Date.now()>=Date.parse(input.submitDeadlineAt))throw abortError();};active();armDeadline(input.submitDeadlineAt);\n const transport=c.clients[input.items[0]!.execution.model.provider];if(!transport||transport.dispatchPolicy!=='single')throw new TypeError('Single-dispatch batch client required');\n // Each item's original UTC day may differ, so check each relevant projection.\n for(const {execution:e} of input.items){const blocked=Object.entries(e.governance!.caps).filter(([,cap])=>cap.onExceeded==='block');\n const totals=blocked.some(([name])=>name!=='perTurnUsd')?normalizeSpendTotals(await c.spend.peek({scope:k.scope,sessionId:e.sessionId,at:e.occurredAt})):{sessionUsd:0,tenantDayUsd:0};active();\n for(const [name,cap] of blocked){const spent=name==='perTurnUsd'?0:name==='perSessionUsd'?totals.sessionUsd:totals.tenantDayUsd;if(spent>cap.usd)throw new BudgetExceededError(name as 'perTurnUsd',cap.usd,spent);}}\n stage('claim');const claim=await c.batches.claim(input);active();if(claim.status!=='claimed')return required(k);\n try{\n stage('reservation');for(const {execution:e} of input.items){const p=await c.results.prepare(binding(e));active();if(p.state!=='pending'||!equalExecution(p.binding,binding(e)))throw new ExecutionStateError();}\n stage('audit');for(const {execution:e} of input.items){const correlation={scope:k.scope,at:e.occurredAt,sessionId:e.sessionId,operationId:e.operationId,attemptId:e.attemptId,callId:e.callId};\n try{await c.audit.routing({...correlation,...e.intent,model:e.model,rationale,serviceTier:'batch',...(e.controls.reasoning?{reasoning:e.controls.reasoning.effort}:{}),...(e.controls.cache?{cacheTtl:e.controls.cache.ttl}:{})});}catch(err){throw new AuditSinkError('routing',err);}active();\n try{await c.audit.access({...correlation,tool:'governed_batch_input',action:'read',resource:e.inputRevision});}catch(err){throw new AuditSinkError('access',err);}active();}\n stage('input');const items=structuredClone(await load());active();\n if(!Array.isArray(items)||items.length!==input.items.length||JSON.stringify(items).length>c.maxRequestChars)throw new ExecutionConflictError();\n for(let n=0;n<items.length;n++){const item=items[n]!,member=input.items[n]!,r=item.request,e=member.execution;\n const controls={maxTokens:r.maxTokens,...(r.temperature!==undefined?{temperature:r.temperature}:{}),...(r.reasoning!==undefined?{reasoning:r.reasoning}:{}),...(r.cache!==undefined?{cache:r.cache}:{})};\n if(item.id!==member.id||!equalExecution(r.model,e.model)||r.serviceTier!=='batch'||!equalExecution(controls,e.controls))throw new ExecutionConflictError();}\n transport.validate(structuredClone(items));active();\n for(const {execution:e} of input.items){const p=await c.results.get(k.scope,e.callId);active();if(p?.state!=='pending'||!equalExecution(p.binding,binding(e)))throw new ExecutionStateError();}\n stage('dispatch');const dispatched=await c.batches.beginDispatch(claim.fence);active();if(!dispatched.dispatch)return required(k);\n let accepted=false;stage('submission');\n for await(const event of transport.submitEvidence(items,{signal})){\n if(event.type==='accepted'){await c.batches.accept(claim.fence,event.handle);accepted=true;}\n else if(event.type==='input_file'){active();await c.onInputFile?.({...structuredClone(k),fileId:settlementIdentifier(event.fileId)});active();}\n else throw new ExecutionStateError();\n }\n if(!accepted)throw new ExecutionStateError();return required(k);\n }catch(err){try{await c.batches.markUncertain(claim.fence);}catch{/* Original record never grants dispatch again. */}throw err;}\n });\n }\n function operation(value:BatchKey,action:'status'|'cancel',opts:{signal?:AbortSignal}={}) {\n const k=key(value);\n return bounded(k,opts.signal,async(signal,check,stage)=>{\n check();const record=await lookup(k);check();if(!record?.handle)throw new ExecutionStateError();\n const transport=client(record),call=transport[action];\n if(typeof call!=='function')throw new TypeError('Batch cancellation capability required');\n stage(action);const progress=await call.call(transport,structuredClone(record.handle),{signal});check();return progress;\n });\n }\n const status=(value:BatchKey,opts?:{signal?:AbortSignal})=>operation(value,'status',opts);\n async function cancel(value:BatchKey,opts?:{signal?:AbortSignal}) {return {status:'requested' as const,progress:await operation(value,'cancel',opts)};}\n function collect(value:BatchKey,opts:{signal?:AbortSignal}={}):Promise<GovernedBatchCollection>{\n const k=key(value);\n return bounded(k,opts.signal,async(signal,check,stage)=>{\n check();const record=await lookup(k);check();if(!record)throw new ExecutionStateError();\n if(!record.handle)return {eof:false,reconciliationRequired:true,view:await required(k)};\n const transport=client(record);stage('status');const progress=await transport.status(record.handle,{signal});check();\n if(!['done','failed','expired','cancelled'].includes(progress.status))return {eof:false,reconciliationRequired:false,view:await required(k)};\n const expected=record.input.items.map(i=>i.id),seen=new Set<string>(),outputs=new Map<string,ExecutionResult>();let failed=false,eof=false,chars=0;\n stage('evidence');try{\n for await(const raw of transport.resultsEvidence(record.handle,expected,{signal})){\n // Persist a yielded observation even when cancellation races its arrival.\n if(!expected.includes(raw.id)||seen.has(raw.id))throw new ExecutionConflictError();seen.add(raw.id);\n const normalized=normalizeBatchUsage({id:'observation',itemId:raw.id,handle:record.handle,evidence:raw.evidence,outcome:raw.content.outcome,...(raw.providerRequestId===undefined?{}:{providerRequestId:raw.providerRequestId})});\n normalized.id=createHash('sha256').update(canonical(normalized)).digest('hex');\n const itemId=normalized.itemId;let result:ExecutionResult;try{result=encode(structuredClone(raw.content),c.maxOutputChars);}catch{result={outcome:'invalid',stopReason:null};}\n let accounted=false;try{const row=await c.usage.append(k.scope,k.key,normalized);accounted=await repair(k,row);if(!accounted)failed=true;}catch{failed=true;}\n // Content failure cannot terminate the financial drain.\n try{const size=result.outcome==='success'?result.output.text.length:0;chars+=size;\n if(chars>c.maxBatchOutputChars){failed=true;}else if(accounted)outputs.set(itemId,result);\n }catch{failed=true;}\n check();\n }\n check();eof=seen.size===expected.length;if(!eof)failed=true;\n }catch{failed=true;}\n if(eof){stage('results');for(const member of record.input.items){check();const result=outputs.get(member.id);if(!result)continue;\n try{const p=await c.results.get(k.scope,member.execution.callId);check();if(!p||!equalExecution(p.binding,binding(member.execution)))throw new ExecutionConflictError();\n if(p.state==='pending'||p.state==='available')await c.results.put(k.scope,member.execution.callId,result);\n }catch{failed=true;}\n }}\n check();return {eof,reconciliationRequired:failed,view:await required(k)};\n });\n }\n return {submit,collect,read,reconcile,status,cancel};\n}\n","import type { ExecutionInput, ExecutionResult, ExecutionResultBinding } from '@alma-harness/core';\nimport type { BatchContent } from '@alma-harness/execution';\nimport type { GovernedBatchOutput } from './types';\nexport const unavailable = ():ExecutionResult => ({outcome:'unavailable',stopReason:null});\nexport const binding = (e:ExecutionInput):ExecutionResultBinding => ({scope:e.scope,callId:e.callId,sessionId:e.sessionId,sensitivity:e.intent.sensitivity,retentionMs:e.governance!.resultRetentionMs});\nfunction json(value:unknown,depth=0):void {\n if(depth>100)throw new TypeError('Invalid batch output');\n if(value===null||typeof value==='boolean')return;\n if(typeof value==='string'){if(!value.isWellFormed()||value.includes('\\0'))throw new TypeError('Invalid batch output');return;}\n if(typeof value==='number'&&Number.isFinite(value))return;\n if(!value||typeof value!=='object'||(!Array.isArray(value)&&Object.getPrototypeOf(value)!==Object.prototype))throw new TypeError('Invalid batch output');\n if(Array.isArray(value)&&Object.keys(value).length!==value.length)throw new TypeError('Sparse batch output');\n for(const k of Reflect.ownKeys(value)){if(k==='length'&&Array.isArray(value))continue;if(typeof k!=='string')throw new TypeError('Invalid batch output');json(k,depth+1);json((value as Record<string,unknown>)[k],depth+1);}\n}\nexport function decode(text:string,max:number):GovernedBatchOutput {\n if(text.length>max)throw new TypeError('Oversized batch output');const v=JSON.parse(text);json(v);\n if(!v||Object.keys(v).sort().join()!=='blocks,stop,version'||v.version!=='governed-batch-v1'||!Array.isArray(v.blocks)||!['end_turn','tool_use','pause'].includes(v.stop))throw new TypeError('Invalid batch output');\n const ids=new Map<string,string>(),results=new Set<string>();\n const bad=():never=>{throw new TypeError('Invalid batch block');};\n const string=(v:unknown):v is string=>typeof v==='string'&&v.length>0&&v.length<=200;\n const provider=(v:unknown)=>['anthropic','openai','openrouter'].includes(v as string);\n const closed=(b:Record<string,unknown>,keys:string[])=>{if(Object.keys(b).some(k=>!keys.includes(k)))bad();};\n for(const b of v.blocks){\n if(!b||typeof b!=='object'||Array.isArray(b))bad();\n switch(b.type){\n case 'text':closed(b,['type','text','origin']);if(typeof b.text!=='string'||(b.origin!==undefined&&b.origin!=='harness'))bad();break;\n case 'reasoning':closed(b,['type','provider','text','opaque']);if(!provider(b.provider)||(b.text!==undefined&&typeof b.text!=='string'))bad();break;\n case 'tool_call':case 'provider_tool_call':{\n const remote=b.type==='provider_tool_call';closed(b,remote?['type','id','name','provider','input']:['type','id','name','input']);\n if(!string(b.id)||!string(b.name)||!Object.hasOwn(b,'input')||ids.has(b.id)||(remote&&(!provider(b.provider)||b.name!=='web_search')))bad();\n ids.set(b.id,remote?`provider:${b.provider}:${b.name}`:'local');break;\n }\n case 'tool_result':case 'provider_tool_result':{\n const remote=b.type==='provider_tool_result';closed(b,remote?['type','callId','name','provider','results','error','opaque']:['type','callId','output','isError']);\n if(!string(b.callId)||results.has(b.callId)||ids.get(b.callId)!==(remote?`provider:${b.provider}:${b.name}`:'local'))bad();\n results.add(b.callId);\n if(remote){if(!provider(b.provider)||b.name!=='web_search'||!Array.isArray(b.results)||(b.error!==undefined&&typeof b.error!=='string'))bad();\n for(const r of b.results){if(!r||typeof r!=='object'||Array.isArray(r))bad();closed(r,['url','title','pageAge']);if(typeof r.url!=='string'||(r.title!==undefined&&typeof r.title!=='string')||(r.pageAge!==undefined&&typeof r.pageAge!=='string'))bad();}\n }else if(!Object.hasOwn(b,'output')||(b.isError!==undefined&&typeof b.isError!=='boolean'))bad();break;\n }\n default:bad();\n }\n }\n return v;\n}\nexport function encode(content:BatchContent,max:number):ExecutionResult {\n if(content.outcome!=='succeeded')return {outcome:content.outcome==='unusable'?'invalid':content.outcome==='cancelled'?'cancelled':'unavailable',stopReason:null};\n const {stop,blocks}=content.output;\n if(stop==='refusal')return {outcome:'refusal',stopReason:stop};\n if(stop==='max_tokens'||stop==='context_window_exceeded')return {outcome:'truncated',stopReason:stop};\n try{const value={version:'governed-batch-v1',blocks,stop};json(value);const text=JSON.stringify(value);decode(text,max);return {outcome:'success',stopReason:stop,output:{format:'json',text}};}\n catch{return {outcome:'invalid',stopReason:['end_turn','tool_use','pause'].includes(stop)?stop:null};}\n}\n"],"mappings":"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","names":["v","key","value"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/output.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { validateToolChoice, AuditSinkError, BudgetExceededError, equalExecution, ExecutionConflictError, ExecutionResultPolicyError, ExecutionStateError, normalizeSpendTotals, normalizeBudgetCaps, settlementIdentifier, settlementScope, type ExecutionResult, type Scope } from '@alma-harness/core';\nimport { batchUsageQuery, batchUsageSettlement, normalizeBatchRecord, normalizeBatchSubmission, normalizeBatchUsage, type BatchFinancialReceipt, type BatchSubmissionRecord, type BatchUsageQuery, type BatchUsageRecord } from '@alma-harness/execution';\nimport { binding, decode, encode, unavailable } from './output';\nimport type { BatchKey, GovernedBatchCollection, GovernedBatchConfig, GovernedBatchItemView, GovernedBatchSubmit, GovernedBatchView } from './types';\nexport type * from './types';\nconst abortError=()=>new DOMException('Batch operation interrupted','AbortError');\nfunction canonical(v:unknown):string {if(v===null||typeof v!=='object')return JSON.stringify(v);if(Array.isArray(v))return `[${v.map(canonical).join(',')}]`;return `{${Object.keys(v).sort().map(k=>JSON.stringify(k)+':'+canonical((v as Record<string,unknown>)[k])).join(',')}}`;}\nexport function createGovernedBatchRunner(value:GovernedBatchConfig) {\n for(const [key,max] of [['runTimeoutMs',300_000],['maxRequestChars',64_000_000],['maxOutputChars',1_000_000],['maxBatchOutputChars',64_000_000]] as const)\n if(!Number.isSafeInteger(value[key])||value[key]<1||value[key]>max)throw new TypeError('Invalid batch limits');\n if(typeof value.onBackgroundError!=='function')throw new TypeError('Missing background observer');\n const c={...value,configRevision:settlementIdentifier(value.configRevision),clients:{...value.clients}};\n const key=(v:BatchKey):BatchKey=>({scope:settlementScope(v.scope),key:settlementIdentifier(v.key)});\n function config(r:BatchSubmissionRecord):void {if(r.input.configRevision!==c.configRevision)throw new ExecutionConflictError();}\n function client(r:BatchSubmissionRecord){config(r);const v=c.clients[r.input.items[0]!.execution.model.provider];if(!v||v.dispatchPolicy!=='single'||typeof v.validate!=='function')throw new TypeError('Single-dispatch batch client required');return v;}\n async function lookup(k:BatchKey){const raw=await c.batches.get(k.scope,k.key);if(!raw)return null;const r=normalizeBatchRecord(raw);if(!equalExecution(r.input.scope,k.scope)||r.input.key!==k.key)throw new ExecutionConflictError();config(r);return r;}\n async function receipts(k:BatchKey){const all:BatchFinancialReceipt[]=[];for(let afterOrdinal=0;afterOrdinal<512;){const page=await c.accounting.list(k.scope,k.key,{afterOrdinal,limit:100});all.push(...page);if(page.length<100)break;afterOrdinal=page.at(-1)!.accountingOrdinal;}return all;}\n async function read(value:BatchKey):Promise<GovernedBatchView|null> {\n const k=key(value),record=await lookup(k);if(!record)return null;\n const financial=await c.accounting.get(k.scope,k.key),rows=await receipts(k),items:GovernedBatchItemView[]=[];\n const incompleteBlock=Object.values(normalizeBudgetCaps(record.input.items[0]!.execution.governance!.caps)).some(cap=>cap.onExceeded==='block')&&rows.length!==record.input.items.length;\n const block=rows.some(r=>r.decisions.some(d=>d.exceeded&&d.onExceeded==='block'));let chars=0;\n for(const member of record.input.items){const e=member.execution,receipt=rows.find(r=>r.itemId===member.id);\n if(receipt&&(receipt.batchId!==record.input.id||receipt.callId!==e.callId||receipt.settlementId!==e.settlementId))throw new ExecutionConflictError();\n let saved;try{saved=await c.results.get(k.scope,e.callId);}catch(err){if(!(err instanceof ExecutionResultPolicyError))throw err;}\n if(saved&&!equalExecution(saved.binding,binding(e)))throw new ExecutionConflictError();\n let result=saved?.state==='available'&&receipt&&saved.result?saved.result:unavailable(),output;\n if(result.outcome==='success'){\n try{if(result.output.format!=='json')throw new TypeError();output=decode(result.output.text,c.maxOutputChars);if(output.stop!==result.stopReason)throw new TypeError();chars+=result.output.text.length;if(chars>c.maxBatchOutputChars)throw new TypeError();}\n catch{result=unavailable();output=undefined;}\n if(incompleteBlock){result=unavailable();output=undefined;}else if(block){result={outcome:'blocked',stopReason:result.stopReason};output=undefined;}\n }\n items.push({id:member.id,state:saved?.state??'unavailable',result,...(receipt?{receipt}:{}),...(output?{output}:{})});\n }\n return {record,financial,items};\n }\n async function required(k:BatchKey){const view=await read(k);if(!view)throw new ExecutionStateError();return view;}\n async function repair(k:BatchKey,row:BatchUsageRecord):Promise<boolean>{\n const request=batchUsageSettlement(row);if(!request)return false;\n await c.settlements.settleGoverned(request);\n const adopted=await c.usage.recordSettlement(k.scope,k.key,row.input.id);if(adopted.status==='pending')return false;\n return (await c.accounting.record(k.scope,k.key,row.input.id)).status!=='pending';\n }\n async function reconcile(value:BatchKey,query?:BatchUsageQuery){const k=key(value),record=await lookup(k);if(!record)return null;\n const rows=await c.usage.list(k.scope,k.key,batchUsageQuery(query));let repaired=0,pending=0;\n for(const row of rows){try{if(await repair(k,row))repaired++;else pending++;}catch{pending++;}}\n return {scanned:rows.length,repaired,pending,...(rows.length?{afterId:rows.at(-1)!.input.id}:{})};\n }\n function bounded<T>(k:BatchKey,external:AbortSignal|undefined,work:(signal:AbortSignal,check:()=>void,stage:(v:string)=>void,deadline:(at:string)=>void)=>Promise<T>):Promise<T>{\n const controller=new AbortController();let stage='lookup',interrupted=false;let deadlineTimer:ReturnType<typeof setTimeout>|undefined;\n const abort=()=>controller.abort();const timer=setTimeout(abort,c.runTimeoutMs);\n const rejected=new Promise<never>((_,reject)=>controller.signal.addEventListener('abort',()=>{interrupted=true;reject(abortError());},{once:true}));\n external?.addEventListener('abort',abort,{once:true});if(external?.aborted)abort();\n const check=()=>{if(controller.signal.aborted)throw abortError();};\n const active=work(controller.signal,check,v=>{stage=v;},at=>{deadlineTimer=setTimeout(abort,Math.max(1,Date.parse(at)-Date.now()));});\n void active.catch(()=>{if(interrupted)try{void Promise.resolve(c.onBackgroundError({...structuredClone(k),stage})).catch(()=>{});}catch{/* Monitoring cannot create an unhandled rejection. */}});\n return Promise.race([active,rejected]).finally(()=>{clearTimeout(timer);clearTimeout(deadlineTimer);external?.removeEventListener('abort',abort);});\n }\n function submit(value:GovernedBatchSubmit):Promise<GovernedBatchView>{\n const input=normalizeBatchSubmission(value.input),k=key(input),load=value.loadItems,rationale=value.rationale;\n if(input.configRevision!==c.configRevision||typeof load!=='function'||typeof rationale!=='string'||rationale.length>1000||input.items.some(i=>! /^[A-Za-z0-9_-]{1,64}$/.test(i.id)))throw new TypeError('Invalid batch submission');\n return bounded(k,value.signal,async(signal,check,stage,armDeadline)=>{\n check();const old=await lookup(k);check();if(old){if(!equalExecution(old.input,input))throw new ExecutionConflictError();return required(k);}\n const active=()=>{check();if(Date.now()>=Date.parse(input.submitDeadlineAt))throw abortError();};active();armDeadline(input.submitDeadlineAt);\n const transport=c.clients[input.items[0]!.execution.model.provider];if(!transport||transport.dispatchPolicy!=='single')throw new TypeError('Single-dispatch batch client required');\n // Each item's original UTC day may differ, so check each relevant projection.\n for(const {execution:e} of input.items){const blocked=Object.entries(e.governance!.caps).filter(([,cap])=>cap.onExceeded==='block');\n const totals=blocked.some(([name])=>name!=='perTurnUsd')?normalizeSpendTotals(await c.spend.peek({scope:k.scope,sessionId:e.sessionId,at:e.occurredAt})):{sessionUsd:0,tenantDayUsd:0};active();\n for(const [name,cap] of blocked){const spent=name==='perTurnUsd'?0:name==='perSessionUsd'?totals.sessionUsd:totals.tenantDayUsd;if(spent>cap.usd)throw new BudgetExceededError(name as 'perTurnUsd',cap.usd,spent);}}\n stage('claim');const claim=await c.batches.claim(input);active();if(claim.status!=='claimed')return required(k);\n try{\n stage('reservation');for(const {execution:e} of input.items){const p=await c.results.prepare(binding(e));active();if(p.state!=='pending'||!equalExecution(p.binding,binding(e)))throw new ExecutionStateError();}\n stage('audit');for(const {execution:e} of input.items){const correlation={scope:k.scope,at:e.occurredAt,sessionId:e.sessionId,operationId:e.operationId,attemptId:e.attemptId,callId:e.callId};\n try{await c.audit.routing({...correlation,...e.intent,model:e.model,rationale,serviceTier:'batch',...(e.controls.reasoning?{reasoning:e.controls.reasoning.effort}:{}),...(e.controls.cache?{cacheTtl:e.controls.cache.ttl}:{})});}catch(err){throw new AuditSinkError('routing',err);}active();\n try{await c.audit.access({...correlation,tool:'governed_batch_input',action:'read',resource:e.inputRevision});}catch(err){throw new AuditSinkError('access',err);}active();}\n stage('input');const items=structuredClone(await load());active();\n if(!Array.isArray(items)||items.length!==input.items.length||JSON.stringify(items).length>c.maxRequestChars)throw new ExecutionConflictError();\n for(let n=0;n<items.length;n++){const item=items[n]!,member=input.items[n]!,r=item.request,e=member.execution;\n const controls={maxTokens:r.maxTokens,...(r.toolChoice!==undefined?{toolChoice:r.toolChoice}:{}),...(r.temperature!==undefined?{temperature:r.temperature}:{}),...(r.reasoning!==undefined?{reasoning:r.reasoning}:{}),...(r.cache!==undefined?{cache:r.cache}:{})};\n if(item.id!==member.id||!equalExecution(r.model,e.model)||r.serviceTier!=='batch'||!equalExecution(controls,e.controls))throw new ExecutionConflictError();\n validateToolChoice(r);}\n transport.validate(structuredClone(items));active();\n for(const {execution:e} of input.items){const p=await c.results.get(k.scope,e.callId);active();if(p?.state!=='pending'||!equalExecution(p.binding,binding(e)))throw new ExecutionStateError();}\n stage('dispatch');const dispatched=await c.batches.beginDispatch(claim.fence);active();if(!dispatched.dispatch)return required(k);\n let accepted=false;stage('submission');\n for await(const event of transport.submitEvidence(items,{signal})){\n if(event.type==='accepted'){await c.batches.accept(claim.fence,event.handle);accepted=true;}\n else if(event.type==='input_file'){active();await c.onInputFile?.({...structuredClone(k),fileId:settlementIdentifier(event.fileId)});active();}\n else throw new ExecutionStateError();\n }\n if(!accepted)throw new ExecutionStateError();return required(k);\n }catch(err){try{await c.batches.markUncertain(claim.fence);}catch{/* Original record never grants dispatch again. */}throw err;}\n });\n }\n function operation(value:BatchKey,action:'status'|'cancel',opts:{signal?:AbortSignal}={}) {\n const k=key(value);\n return bounded(k,opts.signal,async(signal,check,stage)=>{\n check();const record=await lookup(k);check();if(!record?.handle)throw new ExecutionStateError();\n const transport=client(record),call=transport[action];\n if(typeof call!=='function')throw new TypeError('Batch cancellation capability required');\n stage(action);const progress=await call.call(transport,structuredClone(record.handle),{signal});check();return progress;\n });\n }\n const status=(value:BatchKey,opts?:{signal?:AbortSignal})=>operation(value,'status',opts);\n async function cancel(value:BatchKey,opts?:{signal?:AbortSignal}) {return {status:'requested' as const,progress:await operation(value,'cancel',opts)};}\n function collect(value:BatchKey,opts:{signal?:AbortSignal}={}):Promise<GovernedBatchCollection>{\n const k=key(value);\n return bounded(k,opts.signal,async(signal,check,stage)=>{\n check();const record=await lookup(k);check();if(!record)throw new ExecutionStateError();\n if(!record.handle)return {eof:false,reconciliationRequired:true,view:await required(k)};\n const transport=client(record);stage('status');const progress=await transport.status(record.handle,{signal});check();\n if(!['done','failed','expired','cancelled'].includes(progress.status))return {eof:false,reconciliationRequired:false,view:await required(k)};\n const expected=record.input.items.map(i=>i.id),seen=new Set<string>(),outputs=new Map<string,ExecutionResult>();let failed=false,eof=false,chars=0;\n stage('evidence');try{\n for await(const raw of transport.resultsEvidence(record.handle,expected,{signal})){\n // Persist a yielded observation even when cancellation races its arrival.\n if(!expected.includes(raw.id)||seen.has(raw.id))throw new ExecutionConflictError();seen.add(raw.id);\n const normalized=normalizeBatchUsage({id:'observation',itemId:raw.id,handle:record.handle,evidence:raw.evidence,outcome:raw.content.outcome,...(raw.providerRequestId===undefined?{}:{providerRequestId:raw.providerRequestId})});\n normalized.id=createHash('sha256').update(canonical(normalized)).digest('hex');\n const itemId=normalized.itemId;let result:ExecutionResult;try{result=encode(structuredClone(raw.content),c.maxOutputChars);}catch{result={outcome:'invalid',stopReason:null};}\n let accounted=false;try{const row=await c.usage.append(k.scope,k.key,normalized);accounted=await repair(k,row);if(!accounted)failed=true;}catch{failed=true;}\n // Content failure cannot terminate the financial drain.\n try{const size=result.outcome==='success'?result.output.text.length:0;chars+=size;\n if(chars>c.maxBatchOutputChars){failed=true;}else if(accounted)outputs.set(itemId,result);\n }catch{failed=true;}\n check();\n }\n check();eof=seen.size===expected.length;if(!eof)failed=true;\n }catch{failed=true;}\n if(eof){stage('results');for(const member of record.input.items){check();const result=outputs.get(member.id);if(!result)continue;\n try{const p=await c.results.get(k.scope,member.execution.callId);check();if(!p||!equalExecution(p.binding,binding(member.execution)))throw new ExecutionConflictError();\n if(p.state==='pending'||p.state==='available')await c.results.put(k.scope,member.execution.callId,result);\n }catch{failed=true;}\n }}\n check();return {eof,reconciliationRequired:failed,view:await required(k)};\n });\n }\n return {submit,collect,read,reconcile,status,cancel};\n}\n","import type { ExecutionInput, ExecutionResult, ExecutionResultBinding } from '@alma-harness/core';\nimport type { BatchContent } from '@alma-harness/execution';\nimport type { GovernedBatchOutput } from './types';\nexport const unavailable = ():ExecutionResult => ({outcome:'unavailable',stopReason:null});\nexport const binding = (e:ExecutionInput):ExecutionResultBinding => ({scope:e.scope,callId:e.callId,sessionId:e.sessionId,sensitivity:e.intent.sensitivity,retentionMs:e.governance!.resultRetentionMs});\nfunction json(value:unknown,depth=0):void {\n if(depth>100)throw new TypeError('Invalid batch output');\n if(value===null||typeof value==='boolean')return;\n if(typeof value==='string'){if(!value.isWellFormed()||value.includes('\\0'))throw new TypeError('Invalid batch output');return;}\n if(typeof value==='number'&&Number.isFinite(value))return;\n if(!value||typeof value!=='object'||(!Array.isArray(value)&&Object.getPrototypeOf(value)!==Object.prototype))throw new TypeError('Invalid batch output');\n if(Array.isArray(value)&&Object.keys(value).length!==value.length)throw new TypeError('Sparse batch output');\n for(const k of Reflect.ownKeys(value)){if(k==='length'&&Array.isArray(value))continue;if(typeof k!=='string')throw new TypeError('Invalid batch output');json(k,depth+1);json((value as Record<string,unknown>)[k],depth+1);}\n}\nexport function decode(text:string,max:number):GovernedBatchOutput {\n if(text.length>max)throw new TypeError('Oversized batch output');const v=JSON.parse(text);json(v);\n if(!v||Object.keys(v).sort().join()!=='blocks,stop,version'||v.version!=='governed-batch-v1'||!Array.isArray(v.blocks)||!['end_turn','tool_use','pause'].includes(v.stop))throw new TypeError('Invalid batch output');\n const ids=new Map<string,string>(),results=new Set<string>();\n const bad=():never=>{throw new TypeError('Invalid batch block');};\n const string=(v:unknown):v is string=>typeof v==='string'&&v.length>0&&v.length<=200;\n const provider=(v:unknown)=>['anthropic','openai','openrouter'].includes(v as string);\n const closed=(b:Record<string,unknown>,keys:string[])=>{if(Object.keys(b).some(k=>!keys.includes(k)))bad();};\n for(const b of v.blocks){\n if(!b||typeof b!=='object'||Array.isArray(b))bad();\n switch(b.type){\n case 'text':closed(b,['type','text','origin']);if(typeof b.text!=='string'||(b.origin!==undefined&&b.origin!=='harness'))bad();break;\n case 'reasoning':closed(b,['type','provider','text','opaque']);if(!provider(b.provider)||(b.text!==undefined&&typeof b.text!=='string'))bad();break;\n case 'tool_call':case 'provider_tool_call':{\n const remote=b.type==='provider_tool_call';closed(b,remote?['type','id','name','provider','input']:['type','id','name','input']);\n if(!string(b.id)||!string(b.name)||!Object.hasOwn(b,'input')||ids.has(b.id)||(remote&&(!provider(b.provider)||b.name!=='web_search')))bad();\n ids.set(b.id,remote?`provider:${b.provider}:${b.name}`:'local');break;\n }\n case 'tool_result':case 'provider_tool_result':{\n const remote=b.type==='provider_tool_result';closed(b,remote?['type','callId','name','provider','results','error','opaque']:['type','callId','output','isError']);\n if(!string(b.callId)||results.has(b.callId)||ids.get(b.callId)!==(remote?`provider:${b.provider}:${b.name}`:'local'))bad();\n results.add(b.callId);\n if(remote){if(!provider(b.provider)||b.name!=='web_search'||!Array.isArray(b.results)||(b.error!==undefined&&typeof b.error!=='string'))bad();\n for(const r of b.results){if(!r||typeof r!=='object'||Array.isArray(r))bad();closed(r,['url','title','pageAge']);if(typeof r.url!=='string'||(r.title!==undefined&&typeof r.title!=='string')||(r.pageAge!==undefined&&typeof r.pageAge!=='string'))bad();}\n }else if(!Object.hasOwn(b,'output')||(b.isError!==undefined&&typeof b.isError!=='boolean'))bad();break;\n }\n default:bad();\n }\n }\n return v;\n}\nexport function encode(content:BatchContent,max:number):ExecutionResult {\n if(content.outcome!=='succeeded')return {outcome:content.outcome==='unusable'?'invalid':content.outcome==='cancelled'?'cancelled':'unavailable',stopReason:null};\n const {stop,blocks}=content.output;\n if(stop==='refusal')return {outcome:'refusal',stopReason:stop};\n if(stop==='max_tokens'||stop==='context_window_exceeded')return {outcome:'truncated',stopReason:stop};\n try{const value={version:'governed-batch-v1',blocks,stop};json(value);const text=JSON.stringify(value);decode(text,max);return {outcome:'success',stopReason:stop,output:{format:'json',text}};}\n catch{return {outcome:'invalid',stopReason:['end_turn','tool_use','pause'].includes(stop)?stop:null};}\n}\n"],"mappings":"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","names":["v","key","value"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alma-harness/batch",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "Governed single-dispatch batch execution for Alma.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -19,8 +19,8 @@
19
19
  "directory": "packages/batch"
20
20
  },
21
21
  "peerDependencies": {
22
- "@alma-harness/core": "^0.9.0",
23
- "@alma-harness/execution": "^0.9.0"
22
+ "@alma-harness/core": "^0.10.0",
23
+ "@alma-harness/execution": "^0.10.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^24.1.0",
@@ -28,11 +28,11 @@
28
28
  "vitest": "^3.2.4",
29
29
  "pg": "^8.16.3",
30
30
  "@types/pg": "^8.15.4",
31
- "@alma-harness/core": "^0.9.0",
32
- "@alma-harness/postgres-execution": "^0.9.0",
33
- "@alma-harness/postgres": "^0.9.0",
34
- "@alma-harness/memory": "^0.9.0",
35
- "@alma-harness/execution": "^0.9.0"
31
+ "@alma-harness/execution": "^0.10.0",
32
+ "@alma-harness/core": "^0.10.0",
33
+ "@alma-harness/memory": "^0.10.0",
34
+ "@alma-harness/postgres": "^0.10.0",
35
+ "@alma-harness/postgres-execution": "^0.10.0"
36
36
  },
37
37
  "files": [
38
38
  "dist"