stable-harness 0.0.124 → 0.0.125

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/docs/guides/operator-runbook.md +42 -0
  2. package/docs/product/harness-engineering-roadmap.md +137 -0
  3. package/docs/product/market-positioning.md +12 -0
  4. package/node_modules/@stable-harness/adapter-deepagents/package.json +2 -2
  5. package/node_modules/@stable-harness/adapter-langgraph/package.json +2 -2
  6. package/node_modules/@stable-harness/core/dist/index.d.ts +1 -0
  7. package/node_modules/@stable-harness/core/dist/index.js +1 -1
  8. package/node_modules/@stable-harness/core/dist/recovery/raw-args.d.ts +9 -0
  9. package/node_modules/@stable-harness/core/dist/recovery/raw-args.js +1 -1
  10. package/node_modules/@stable-harness/core/dist/runtime/events.d.ts +61 -0
  11. package/node_modules/@stable-harness/core/dist/runtime/improvement/admin.d.ts +15 -0
  12. package/node_modules/@stable-harness/core/dist/runtime/improvement/admin.js +1 -0
  13. package/node_modules/@stable-harness/core/dist/runtime/improvement/evidence-admin.d.ts +11 -0
  14. package/node_modules/@stable-harness/core/dist/runtime/improvement/evidence-admin.js +1 -0
  15. package/node_modules/@stable-harness/core/dist/runtime/improvement/store.d.ts +2 -0
  16. package/node_modules/@stable-harness/core/dist/runtime/improvement/store.js +1 -0
  17. package/node_modules/@stable-harness/core/dist/runtime/improvement/types.d.ts +120 -0
  18. package/node_modules/@stable-harness/core/dist/runtime/improvement/types.js +1 -0
  19. package/node_modules/@stable-harness/core/dist/runtime/recovery/adapter-result.js +1 -1
  20. package/node_modules/@stable-harness/core/dist/runtime.d.ts +2 -1
  21. package/node_modules/@stable-harness/core/dist/runtime.js +1 -1
  22. package/node_modules/@stable-harness/core/dist/trace.d.ts +1 -1
  23. package/node_modules/@stable-harness/core/dist/trace.js +1 -1
  24. package/node_modules/@stable-harness/core/dist/types.d.ts +12 -1
  25. package/node_modules/@stable-harness/core/package.json +3 -3
  26. package/node_modules/@stable-harness/governance/package.json +1 -1
  27. package/node_modules/@stable-harness/memory/package.json +1 -1
  28. package/node_modules/@stable-harness/protocols/dist/src/in-process-client.js +1 -1
  29. package/node_modules/@stable-harness/protocols/package.json +2 -2
  30. package/node_modules/@stable-harness/tool-gateway/package.json +1 -1
  31. package/node_modules/@stable-harness/workspace-yaml/package.json +2 -2
  32. package/package.json +9 -9
  33. package/packages/adapter-deepagents/package.json +2 -2
  34. package/packages/adapter-langgraph/package.json +2 -2
  35. package/packages/cli/package.json +8 -8
  36. package/packages/core/dist/index.d.ts +1 -0
  37. package/packages/core/dist/index.js +1 -1
  38. package/packages/core/dist/recovery/raw-args.d.ts +9 -0
  39. package/packages/core/dist/recovery/raw-args.js +1 -1
  40. package/packages/core/dist/runtime/events.d.ts +61 -0
  41. package/packages/core/dist/runtime/improvement/admin.d.ts +15 -0
  42. package/packages/core/dist/runtime/improvement/admin.js +1 -0
  43. package/packages/core/dist/runtime/improvement/evidence-admin.d.ts +11 -0
  44. package/packages/core/dist/runtime/improvement/evidence-admin.js +1 -0
  45. package/packages/core/dist/runtime/improvement/store.d.ts +2 -0
  46. package/packages/core/dist/runtime/improvement/store.js +1 -0
  47. package/packages/core/dist/runtime/improvement/types.d.ts +120 -0
  48. package/packages/core/dist/runtime/improvement/types.js +1 -0
  49. package/packages/core/dist/runtime/recovery/adapter-result.js +1 -1
  50. package/packages/core/dist/runtime.d.ts +2 -1
  51. package/packages/core/dist/runtime.js +1 -1
  52. package/packages/core/dist/trace.d.ts +1 -1
  53. package/packages/core/dist/trace.js +1 -1
  54. package/packages/core/dist/types.d.ts +12 -1
  55. package/packages/core/package.json +3 -3
  56. package/packages/evaluation/package.json +2 -2
  57. package/packages/governance/package.json +1 -1
  58. package/packages/memory/package.json +1 -1
  59. package/packages/protocols/dist/src/in-process-client.js +1 -1
  60. package/packages/protocols/package.json +2 -2
  61. package/packages/tool-gateway/package.json +1 -1
  62. package/packages/workspace-yaml/package.json +2 -2
@@ -1 +1 @@
1
- import{randomUUID as e}from"node:crypto";import{assertExecutionContract as t}from"./execution-contract.js";import{buildExecutionContractRecoveryRequest as r}from"./recovery/execution-contract.js";import{buildAdapterErrorRecoveryPrompt as a,isRecoverableAdapterError as o}from"./recovery/tool-call.js";import{recoverQualityReview as s,resolveQualityPolicy as n}from"./quality/index.js";import{recoverAdapterResultOutput as i}from"./runtime/recovery/adapter-result.js";import{completeRun as u,failRun as c}from"./runtime/completion.js";import{createRuntimeAdministrationMethods as p}from"./runtime/admin/administration.js";import{runDirectToolCall as d}from"./runtime/direct-tool-call.js";import{createApprovalGatedToolGateway as l}from"./runtime/governance/approval-gate.js";import{createSandboxedToolGateway as m}from"./runtime/governance/sandbox.js";import{createRuntimeInspectionMethods as w}from"./runtime/inspection/methods.js";import{createRuntimeCapabilityRegistry as g,normalizeAdapterResult as y}from"./runtime/capabilities.js";import{createMemoryRuntimeCapability as I}from"./runtime/memory.js";import{resolveToolCallRecoveryPolicy as f}from"./runtime/recovery/tool-call-policy.js";import{createRuntimeMemoryAdministration as q}from"./runtime/admin/memory.js";import{createInMemoryRuntimeStore as R}from"./runtime/persistence/stores.js";import{createProgressNarrationCapability as v}from"./runtime/progress-narration.js";import{repairRuntimeSelection as k}from"./runtime/selection-repair.js";import{createLangSmithTracingCapability as b}from"./runtime/tracing/langsmith.js";import{createToolFailureTracker as A}from"./runtime/tool-failure.js";import{runWorkflowRequest as C}from"./workflows/runtime.js";export function createStableHarnessRuntime(t){const y=new Set,x=t.store??R(),j=g([I(t),v({options:t.progressNarration,policy:t.workspace.runtime}),b({policy:t.workspace.runtime,store:x,options:t.langSmithTracing}),...t.capabilities??[]]),emitBase=t=>{const r=function enrichRuntimeEvent(t){return{...t,eventId:t.eventId??e(),emittedAt:t.emittedAt??(new Date).toISOString()}}(t);x.appendEvent(r);for(const e of y)e(r)},emit=e=>{emitBase(e),j.emitSideEffects(e,emitBase)},E=m({gateway:l({gateway:t.toolGateway,approvals:t.approvals,workspace:t.workspace,emit:emit}),workspace:t.workspace,sandbox:t.sandbox,emit:emit}),G={...t,toolGateway:E},T=A(function readToolFailurePolicy(e){if("object"!=typeof e||null===e||Array.isArray(e))return;const t=e.failurePolicy;return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t}(t.workspace.runtime.toolGateway));return{request:async t=>async function runRuntimeRequest(t){const p=t.request.requestId??e(),l=t.request.sessionId??e(),m=[],{agent:w,adapter:g}=await async function resolveExecution(e,t,r){const a=t.agentId?await async function resolveRequestedAgentId(e,t,r){if(e.agents.has(t))return t;const a=await k({id:t,candidates:[...e.agents.values()].map(e=>({id:e.id,description:e.description})),trace:{...r,agentId:t,layer:"agent",owner:"stable_runtime_policy"}});return a.ok?a.id:t}(e.workspace,t.agentId,r):e.workspace.runtime.defaultAgentId,o=e.workspace.agents.get(a);if(!o)throw new Error(`Agent ${a} is not defined in the workspace`);if(t.toolCall||t.workflow)return{agent:o,adapter:void 0};const s=e.adapters.find(e=>e.canRun(o));if(!s)throw new Error(`No runtime adapter can run backend ${o.backend} for agent ${o.id}`);return{agent:o,adapter:s}}(t.input,t.request,{requestId:p,sessionId:l,emit:e=>m.push(e)});t.store.createRun(function createRunRecord(e,t,r,a){return{requestId:t,sessionId:r,agentId:a.id,input:e.input,state:"running",parentRunId:e.parentRunId,metadata:e.metadata,artifacts:[],startedAt:(new Date).toISOString(),events:[]}}(t.request,p,l,w)),m.forEach(t.emit),t.emit({type:"runtime.request.started",requestId:p,sessionId:l,agentId:w.id,input:t.request.input});try{if(t.request.workflow){const e=await C({workspace:t.input.workspace,adapters:t.input.workflowAdapters??[],toolGateway:t.input.toolGateway,request:{input:t.request.input,...t.request.workflow},requestId:p,sessionId:l,agentId:w.id,emit:t.emit});return u({store:t.store,emit:t.emit,requestId:p,sessionId:l,agent:w,result:e,artifacts:t.input.artifacts})}if(t.request.toolCall){const e=await d({gateway:t.input.toolGateway,workspace:t.input.workspace,emit:t.emit,request:t.request,requestId:p,sessionId:l,agent:w,toolFailureTracker:t.toolFailureTracker,toolGuardrails:t.input.toolGuardrails,events:t.store.getRun(p)?.events??[]});return u({store:t.store,emit:t.emit,requestId:p,sessionId:l,agent:w,result:e,artifacts:t.input.artifacts})}return await async function runAdapterRequest(e){if(!e.adapter)throw new Error(`No runtime adapter can run backend ${e.agent.backend} for agent ${e.agent.id}`);const t=e.adapter,c=await e.capabilities.beforeAdapterRun(createCapabilityContext(e)),p=c.memory,d=c.pluginMemories??[],l=f({workspace:e.input.workspace,agent:e.agent}),m=n(e.input.workspace.runtime,e.agent),w=new Map;let g;try{g=await runAdapterOnce(e,t,e.request,p,d,w,l)}catch(r){if(!o(r,l))throw r;e.emit(repairStarted(e,"adapter_error",1,errorMessage(r))),g=await runAdapterOnce(e,t,a(e.request,r,l),p,d,w,l),e.emit(repairCompleted(e,"adapter_error","retried",1,errorMessage(r)))}g=await i({...e,request:e.request,result:g,recoveryPolicy:l,workspace:e.input.workspace,toolGateway:e.input.toolGateway,runAdapter:r=>runAdapterOnce(e,t,r,p,d,w,l),runRecoveredToolCall:(t,r)=>runRecoveredToolCall(e,t,r)}),g=await s(createQualityRuntimeInput(e,p,d,w,l),e.request,g,m),await e.capabilities.beforeAdapterResultContract({...createCapabilityContext(e),result:g});try{assertRequestExecutionContract(e,g)}catch(a){const o=r({request:e.request,events:e.store.getRun(e.requestId)?.events??[],policy:l});if(!o)throw a;e.emit(repairStarted(e,"execution_contract",1,errorMessage(a))),g=await runAdapterOnce(e,t,o,p,d,w,l),g=await i({...e,request:o,result:g,recoveryPolicy:l,workspace:e.input.workspace,toolGateway:e.input.toolGateway,runAdapter:r=>runAdapterOnce(e,t,r,p,d,w,l),runRecoveredToolCall:(t,r)=>runRecoveredToolCall(e,t,r)}),g=await s(createQualityRuntimeInput(e,p,d,w,l),o,g,m),assertRequestExecutionContract(e,g),e.emit(repairCompleted(e,"execution_contract","retried",1,errorMessage(a)))}const y=u({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,result:g,artifacts:e.input.artifacts});return await e.capabilities.afterAdapterResponse({...createCapabilityContext(e),result:g,response:y}),y}({...t,adapter:g,requestId:p,sessionId:l,agent:w})}catch(e){return c({store:t.store,emit:t.emit,requestId:p,sessionId:l,agent:w,error:e})}}({input:G,capabilities:j,store:x,emit:emit,request:t,toolFailureTracker:T}),subscribe:e=>(y.add(e),()=>y.delete(e)),...w({workspace:t.workspace,store:x,artifacts:t.artifacts,approvals:t.approvals,emit:emit}),...p({store:x,emit:emit}),...q({memory:t.memory}),cancel(e,t){const r=x.getRun(e);r&&"running"===r.state&&(x.updateRun(e,{state:"cancelled",completedAt:(new Date).toISOString()}),emit({type:"runtime.request.cancelled",requestId:e,sessionId:r.sessionId,agentId:r.agentId,reason:t}))},async stop(){await j.stop(),y.clear()}}}function runRecoveredToolCall(e,t,r){return d({gateway:e.input.toolGateway,workspace:e.input.workspace,emit:e.emit,request:{...e.request,toolCall:{toolId:t,args:r}},requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,toolFailureTracker:e.input.toolFailureTracker,toolGuardrails:e.input.toolGuardrails,events:e.store.getRun(e.requestId)?.events??[]})}function createCapabilityContext(e){return{workspace:e.input.workspace,store:e.store,emit:e.emit,request:e.request,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent}}function createQualityRuntimeInput(e,t,r,a,o){return{workspace:e.input.workspace,agent:e.agent,request:e.request,requestId:e.requestId,sessionId:e.sessionId,events:e.store.getRun(e.requestId)?.events??[],emit:e.emit,getEvents:()=>e.store.getRun(e.requestId)?.events??[],runAdapter:s=>runAdapterOnce(e,e.adapter,s,t,r,a,o),reviewModel:e.input.qualityReviewModel,executionEvaluatorRules:e.input.executionEvaluatorRules,memory:t,pluginMemories:r}}function assertRequestExecutionContract(e,r){t({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,output:r.text,metadata:e.request.metadata})}async function runAdapterOnce(e,t,r,a,o,s,n){return y(await t.run({workspace:{...e.input.workspace,runtime:n},agent:e.agent,request:r,requestId:e.requestId,sessionId:e.sessionId,memory:a,pluginMemories:o,toolGateway:e.input.toolGateway,toolFailureTracker:e.input.toolFailureTracker,toolGuardrails:e.input.toolGuardrails,executionEvaluatorRules:e.input.executionEvaluatorRules,requestState:s,getEvents:()=>e.store.getRun(e.requestId)?.events??[],emit:e.emit}))}function repairStarted(e,t,r,a){return{type:"runtime.repair.started",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,layer:t,attempt:r,reason:a}}function repairCompleted(e,t,r,a,o){return{type:"runtime.repair.completed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,layer:t,outcome:r,attempt:a,reason:o}}function errorMessage(e){return e instanceof Error?e.message:String(e)}
1
+ import{randomUUID as e}from"node:crypto";import{assertExecutionContract as t}from"./execution-contract.js";import{buildExecutionContractRecoveryRequest as r}from"./recovery/execution-contract.js";import{buildAdapterErrorRecoveryPrompt as a,isRecoverableAdapterError as o}from"./recovery/tool-call.js";import{recoverQualityReview as s,resolveQualityPolicy as n}from"./quality/index.js";import{recoverAdapterResultOutput as i}from"./runtime/recovery/adapter-result.js";import{completeRun as u,failRun as c}from"./runtime/completion.js";import{createRuntimeAdministrationMethods as p}from"./runtime/admin/administration.js";import{runDirectToolCall as m}from"./runtime/direct-tool-call.js";import{createApprovalGatedToolGateway as d}from"./runtime/governance/approval-gate.js";import{createSandboxedToolGateway as l}from"./runtime/governance/sandbox.js";import{createRuntimeImprovementAdministration as w}from"./runtime/improvement/admin.js";import{createRuntimeEvidenceAdministration as y}from"./runtime/improvement/evidence-admin.js";import{createInMemoryRuntimeImprovementStore as g}from"./runtime/improvement/store.js";import{createRuntimeInspectionMethods as I}from"./runtime/inspection/methods.js";import{createRuntimeCapabilityRegistry as f,normalizeAdapterResult as q}from"./runtime/capabilities.js";import{createMemoryRuntimeCapability as v}from"./runtime/memory.js";import{resolveToolCallRecoveryPolicy as R}from"./runtime/recovery/tool-call-policy.js";import{createRuntimeMemoryAdministration as k}from"./runtime/admin/memory.js";import{createInMemoryRuntimeStore as A}from"./runtime/persistence/stores.js";import{createProgressNarrationCapability as b}from"./runtime/progress-narration.js";import{repairRuntimeSelection as C}from"./runtime/selection-repair.js";import{createLangSmithTracingCapability as j}from"./runtime/tracing/langsmith.js";import{createToolFailureTracker as x}from"./runtime/tool-failure.js";import{runWorkflowRequest as E}from"./workflows/runtime.js";export function createStableHarnessRuntime(t){const q=new Set,G=t.store??A(),S=t.improvements??g(),T=f([v(t),b({options:t.progressNarration,policy:t.workspace.runtime}),j({policy:t.workspace.runtime,store:G,options:t.langSmithTracing}),...t.capabilities??[]]),emitBase=t=>{const r=function enrichRuntimeEvent(t){return{...t,eventId:t.eventId??e(),emittedAt:t.emittedAt??(new Date).toISOString()}}(t);G.appendEvent(r);for(const e of q)e(r)},emit=e=>{emitBase(e),T.emitSideEffects(e,emitBase)},h=l({gateway:d({gateway:t.toolGateway,approvals:t.approvals,workspace:t.workspace,emit:emit}),workspace:t.workspace,sandbox:t.sandbox,emit:emit}),M={...t,toolGateway:h},O=x(function readToolFailurePolicy(e){if("object"!=typeof e||null===e||Array.isArray(e))return;const t=e.failurePolicy;return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t}(t.workspace.runtime.toolGateway));return{request:async t=>async function runRuntimeRequest(t){const p=t.request.requestId??e(),d=t.request.sessionId??e(),l=[],{agent:w,adapter:y}=await async function resolveExecution(e,t,r){const a=t.agentId?await async function resolveRequestedAgentId(e,t,r){if(e.agents.has(t))return t;const a=await C({id:t,candidates:[...e.agents.values()].map(e=>({id:e.id,description:e.description})),trace:{...r,agentId:t,layer:"agent",owner:"stable_runtime_policy"}});return a.ok?a.id:t}(e.workspace,t.agentId,r):e.workspace.runtime.defaultAgentId,o=e.workspace.agents.get(a);if(!o)throw new Error(`Agent ${a} is not defined in the workspace`);if(t.toolCall||t.workflow)return{agent:o,adapter:void 0};const s=e.adapters.find(e=>e.canRun(o));if(!s)throw new Error(`No runtime adapter can run backend ${o.backend} for agent ${o.id}`);return{agent:o,adapter:s}}(t.input,t.request,{requestId:p,sessionId:d,emit:e=>l.push(e)});t.store.createRun(function createRunRecord(e,t,r,a){return{requestId:t,sessionId:r,agentId:a.id,input:e.input,state:"running",parentRunId:e.parentRunId,metadata:e.metadata,artifacts:[],startedAt:(new Date).toISOString(),events:[]}}(t.request,p,d,w)),l.forEach(t.emit),t.emit({type:"runtime.request.started",requestId:p,sessionId:d,agentId:w.id,input:t.request.input});try{if(t.request.workflow){const e=await E({workspace:t.input.workspace,adapters:t.input.workflowAdapters??[],toolGateway:t.input.toolGateway,request:{input:t.request.input,...t.request.workflow},requestId:p,sessionId:d,agentId:w.id,emit:t.emit});return u({store:t.store,emit:t.emit,requestId:p,sessionId:d,agent:w,result:e,artifacts:t.input.artifacts})}if(t.request.toolCall){const e=await m({gateway:t.input.toolGateway,workspace:t.input.workspace,emit:t.emit,request:t.request,requestId:p,sessionId:d,agent:w,toolFailureTracker:t.toolFailureTracker,toolGuardrails:t.input.toolGuardrails,events:t.store.getRun(p)?.events??[]});return u({store:t.store,emit:t.emit,requestId:p,sessionId:d,agent:w,result:e,artifacts:t.input.artifacts})}return await async function runAdapterRequest(e){if(!e.adapter)throw new Error(`No runtime adapter can run backend ${e.agent.backend} for agent ${e.agent.id}`);const t=e.adapter,c=await e.capabilities.beforeAdapterRun(createCapabilityContext(e)),p=c.memory,m=c.pluginMemories??[],d=R({workspace:e.input.workspace,agent:e.agent}),l=n(e.input.workspace.runtime,e.agent),w=new Map;let y;try{y=await runAdapterOnce(e,t,e.request,p,m,w,d)}catch(r){if(!o(r,d))throw r;e.emit(repairStarted(e,"adapter_error",1,errorMessage(r))),y=await runAdapterOnce(e,t,a(e.request,r,d),p,m,w,d),e.emit(repairCompleted(e,"adapter_error","retried",1,errorMessage(r)))}y=await i({...e,request:e.request,result:y,recoveryPolicy:d,workspace:e.input.workspace,toolGateway:e.input.toolGateway,runAdapter:r=>runAdapterOnce(e,t,r,p,m,w,d),runRecoveredToolCall:(t,r)=>runRecoveredToolCall(e,t,r)}),y=await s(createQualityRuntimeInput(e,p,m,w,d),e.request,y,l),await e.capabilities.beforeAdapterResultContract({...createCapabilityContext(e),result:y});try{assertRequestExecutionContract(e,y)}catch(a){const o=r({request:e.request,events:e.store.getRun(e.requestId)?.events??[],policy:d});if(!o)throw a;e.emit(repairStarted(e,"execution_contract",1,errorMessage(a))),y=await runAdapterOnce(e,t,o,p,m,w,d),y=await i({...e,request:o,result:y,recoveryPolicy:d,workspace:e.input.workspace,toolGateway:e.input.toolGateway,runAdapter:r=>runAdapterOnce(e,t,r,p,m,w,d),runRecoveredToolCall:(t,r)=>runRecoveredToolCall(e,t,r)}),y=await s(createQualityRuntimeInput(e,p,m,w,d),o,y,l),assertRequestExecutionContract(e,y),e.emit(repairCompleted(e,"execution_contract","retried",1,errorMessage(a)))}const g=u({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,result:y,artifacts:e.input.artifacts});return await e.capabilities.afterAdapterResponse({...createCapabilityContext(e),result:y,response:g}),g}({...t,adapter:y,requestId:p,sessionId:d,agent:w})}catch(e){return c({store:t.store,emit:t.emit,requestId:p,sessionId:d,agent:w,error:e})}}({input:M,capabilities:T,store:G,emit:emit,request:t,toolFailureTracker:O}),subscribe:e=>(q.add(e),()=>q.delete(e)),...I({workspace:t.workspace,store:G,artifacts:t.artifacts,approvals:t.approvals,emit:emit}),...p({store:G,emit:emit}),...w({runtimeStore:G,store:S,emit:emit}),...y({runtimeStore:G,emit:emit}),...k({memory:t.memory}),cancel(e,t){const r=G.getRun(e);r&&"running"===r.state&&(G.updateRun(e,{state:"cancelled",completedAt:(new Date).toISOString()}),emit({type:"runtime.request.cancelled",requestId:e,sessionId:r.sessionId,agentId:r.agentId,reason:t}))},async stop(){await T.stop(),q.clear()}}}function runRecoveredToolCall(e,t,r){return m({gateway:e.input.toolGateway,workspace:e.input.workspace,emit:e.emit,request:{...e.request,toolCall:{toolId:t,args:r}},requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,toolFailureTracker:e.input.toolFailureTracker,toolGuardrails:e.input.toolGuardrails,events:e.store.getRun(e.requestId)?.events??[]})}function createCapabilityContext(e){return{workspace:e.input.workspace,store:e.store,emit:e.emit,request:e.request,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent}}function createQualityRuntimeInput(e,t,r,a,o){return{workspace:e.input.workspace,agent:e.agent,request:e.request,requestId:e.requestId,sessionId:e.sessionId,events:e.store.getRun(e.requestId)?.events??[],emit:e.emit,getEvents:()=>e.store.getRun(e.requestId)?.events??[],runAdapter:s=>runAdapterOnce(e,e.adapter,s,t,r,a,o),reviewModel:e.input.qualityReviewModel,executionEvaluatorRules:e.input.executionEvaluatorRules,memory:t,pluginMemories:r}}function assertRequestExecutionContract(e,r){t({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,output:r.text,metadata:e.request.metadata})}async function runAdapterOnce(e,t,r,a,o,s,n){return q(await t.run({workspace:{...e.input.workspace,runtime:n},agent:e.agent,request:r,requestId:e.requestId,sessionId:e.sessionId,memory:a,pluginMemories:o,toolGateway:e.input.toolGateway,toolFailureTracker:e.input.toolFailureTracker,toolGuardrails:e.input.toolGuardrails,executionEvaluatorRules:e.input.executionEvaluatorRules,requestState:s,getEvents:()=>e.store.getRun(e.requestId)?.events??[],emit:e.emit}))}function repairStarted(e,t,r,a){return{type:"runtime.repair.started",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,layer:t,attempt:r,reason:a}}function repairCompleted(e,t,r,a,o){return{type:"runtime.repair.completed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,layer:t,outcome:r,attempt:a,reason:o}}function errorMessage(e){return e instanceof Error?e.message:String(e)}
@@ -4,7 +4,7 @@ export type PlanTodoItem = {
4
4
  status: string;
5
5
  };
6
6
  export type RuntimeTraceEntry = {
7
- type: "request" | "tool" | "workflow" | "spec" | "adapter" | "memory" | "artifact" | "progress" | "plan" | "delegation";
7
+ type: "request" | "tool" | "workflow" | "spec" | "adapter" | "memory" | "artifact" | "progress" | "plan" | "delegation" | "quality";
8
8
  label: string;
9
9
  agentId: string;
10
10
  requestId: string;
@@ -1 +1 @@
1
- export function createDelegationTraceProjection(t,e={}){return{traceType:"delegation",traceLabel:t,...e}}export function createPlanTraceProjection(t,e={}){return{traceType:"plan",traceLabel:t,...e}}export function projectRuntimeTrace(t){return t.events.map(projectEvent).filter(isTraceEntry)}export function projectRuntimeTraceSpans(t){const e=function createSpanBuilder(t){const e=`run:${t.requestId}`,r=[],o=new Map;return{ensureRoot(){if(o.has(e))return;const n={spanId:e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,kind:"run",name:t.agentId,status:(a=t.state,"completed"===a?"completed":"failed"===a?"failed":"cancelled"===a?"blocked":"running"),startedAt:t.startedAt,completedAt:t.completedAt,startEventIndex:0,...t.parentRunId?{parentSpanId:`run:${t.parentRunId}`}:{},events:[]};var a;r.push(n),o.set(e,n)},markRoot(t,r,n,a){const i=o.get(e);i&&(addEvent(i,t,r),i.status=n,i.attributes=merge(i.attributes,a),"running"!==n&&close(i,t,r))},start(t,n,a,i,s,d){const p=createSpan(`${e}/${t}:${s}`,e,n,a,i,s,d);r.push(p),o.set(t,p)},complete(t,n,a,i){const s=o.get(t)??createSpan(`${e}/${t}:${a}`,e,"adapter",t,n,a);return o.has(t)||r.push(s),addEvent(s,n,a),s.attributes=merge(s.attributes,i),close(s,n,a),o.delete(t),s},fail(t,e,r,o){this.complete(t,e,r,o).status="failed"},event(t,o,n,a,i){const s=createSpan(`${e}/event:${a}`,e,t,o,n,a,i);s.status=function readBlockedStatus(t){return t.type.endsWith(".blocked")||t.type.includes(".approval.")?"blocked":void 0}(n)??"event",close(s,n,a),r.push(s)},closeRoot(){const r=o.get(e);r&&t.completedAt&&(r.completedAt=t.completedAt)},spans:()=>r}}(t);return e.ensureRoot(),t.events.forEach((t,r)=>function projectSpanEvent(t,e,r){return e.type.startsWith("runtime.request.")?function projectRequestSpanEvent(t,e,r){return"runtime.request.started"===e.type?t.markRoot(e,r,"running",{input:e.input}):"runtime.request.completed"===e.type?t.markRoot(e,r,"completed",{output:e.output}):"runtime.request.failed"===e.type?t.markRoot(e,r,"failed",{error:e.error}):"runtime.request.cancelled"===e.type?t.markRoot(e,r,"blocked",{reason:e.reason}):"runtime.execution.contract.failed"===e.type?projectSingleSpan(t,e,r,"quality",e.type,{reason:e.reason,missingEvidenceTools:e.missingEvidenceTools}):void 0}(t,e,r):"runtime.tool.direct.started"===e.type?t.start(`tool:${e.toolId}`,"tool",e.toolId,e,r,{toolId:e.toolId}):"runtime.tool.direct.completed"===e.type?t.complete(`tool:${e.toolId}`,e,r,{toolId:e.toolId,output:e.output}):"runtime.workflow.started"===e.type?t.start(`workflow:${e.workflowId}`,"workflow",e.workflowId,e,r,{workflowId:e.workflowId,adapter:e.adapter}):"runtime.workflow.completed"===e.type?t.complete(`workflow:${e.workflowId}`,e,r,{workflowId:e.workflowId,adapter:e.adapter}):e.type.startsWith("runtime.approval.")||e.type.startsWith("runtime.memory.approval.")?projectSingleSpan(t,e,r,"approval",e.type):e.type.startsWith("runtime.specDriven.phase.")?projectSingleSpan(t,e,r,"spec",function readPhaseName(t,e){return"phaseId"in t&&"string"==typeof t.phaseId?t.phaseId:e}(e,"phase")):e.type.startsWith("runtime.memory.")?projectSingleSpan(t,e,r,"memory",e.type):e.type.startsWith("runtime.quality.")?projectSingleSpan(t,e,r,"quality",e.type):e.type.startsWith("runtime.repair.")?projectSingleSpan(t,e,r,"adapter",e.type):"runtime.artifact.created"===e.type?projectSingleSpan(t,e,r,"artifact",e.artifact.id,{artifact:e.artifact}):"runtime.progress.narration"===e.type?projectSingleSpan(t,e,r,"progress",e.message,{provider:e.provider}):"runtime.adapter.event"===e.type?function projectAdapterSpanEvent(t,e,r){const o=isRecord(e.event)?e.event:void 0,n=readString(o?.phase)??"runtime.adapter.event",a=readTraceType(o?.traceType),i=readString(o?.traceLabel);return"delegation"===a&&i?.endsWith(".start")?t.start(delegationKey(o),"delegation",readString(o?.subagentType)??i,e,r,o):"delegation"===a&&i?.endsWith(".completed")?t.complete(delegationKey(o),e,r,o):"plan"===a&&i?projectSingleSpan(t,e,r,"plan",i,o):function isToolStartEvent(t){return"deepagents.tool_execution.start"===t?.eventType||"agent.tool.start"===t?.phase}(o)?t.start(`agent-tool:${readString(o?.toolId)??"unknown"}`,"tool",readString(o?.toolId)??n,e,r,o):function isToolResultEvent(t){return"deepagents.tool_execution.result"===t?.eventType||"agent.tool.result"===t?.phase}(o)?t.complete(`agent-tool:${readString(o?.toolId)??"unknown"}`,e,r,o):projectSingleSpan(t,e,r,"adapter",n,o)}(t,e,r):"runtime.inventory.repair"===e.type?projectSingleSpan(t,e,r,"adapter","runtime.inventory.repair",{status:e.status,...e.diagnostic}):"runtime.sandbox.decision"===e.type?projectSingleSpan(t,e,r,"tool",`sandbox:${e.toolId}`,{toolId:e.toolId,...e.decision}):"runtime.tool.failure"===e.type?t.fail(`tool:${e.toolId}`,e,r,{toolId:e.toolId,...e.failure}):"runtime.tool.circuit.opened"===e.type?projectSingleSpan(t,e,r,"tool",`circuit:${e.toolId}`,{toolId:e.toolId,reason:e.reason}):void 0}(e,t,r)),e.closeRoot(),e.spans()}export function projectEvent(t){return"runtime.request.started"===t.type||"runtime.request.completed"===t.type||"runtime.request.failed"===t.type?base(t,"request",t.type):"runtime.request.cancelled"===t.type?base(t,"request",t.type,{reason:t.reason}):"runtime.execution.contract.failed"===t.type?base(t,"request",t.type,{reason:t.reason,missingEvidenceTools:t.missingEvidenceTools}):"runtime.inventory.repair"===t.type?base(t,"adapter","runtime.inventory.repair",{status:t.status,...t.diagnostic}):"runtime.repair.started"===t.type||"runtime.repair.completed"===t.type?base(t,"adapter",t.type,{layer:t.layer,..."outcome"in t?{outcome:t.outcome}:{},..."attempt"in t?{attempt:t.attempt}:{},..."reason"in t?{reason:t.reason}:{},...t.diagnostics?{diagnostics:t.diagnostics}:{}}):"runtime.tool.direct.started"===t.type?base(t,"tool","runtime.tool.direct.started",{toolId:t.toolId}):"runtime.tool.direct.completed"===t.type?base(t,"tool","runtime.tool.direct.completed",{toolId:t.toolId,...outputTraceDetail(t.output)}):"runtime.sandbox.decision"===t.type?base(t,"tool","runtime.sandbox.decision",{toolId:t.toolId,...t.decision}):"runtime.tool.failure"===t.type?base(t,"tool","runtime.tool.failure",{toolId:t.toolId,...t.failure}):"runtime.tool.circuit.opened"===t.type?base(t,"tool","runtime.tool.circuit.opened",{toolId:t.toolId,reason:t.reason}):"runtime.workflow.started"===t.type||"runtime.workflow.completed"===t.type?base(t,"workflow",t.type,{workflowId:t.workflowId,adapter:t.adapter}):function isSpecDrivenPhaseEvent(t){return t.type.startsWith("runtime.specDriven.phase.")}(t)?base(t,"spec",t.type,{phaseId:t.phaseId,..."workflowId"in t&&t.workflowId?{workflowId:t.workflowId}:{},..."reason"in t?{reason:t.reason}:{},..."artifact"in t&&t.artifact?{artifact:t.artifact}:{}}):"runtime.adapter.event"===t.type?function adapterTrace(t){const e=t.event;if(isRecord(e)&&"string"==typeof e.phase){const r=function semanticAdapterTrace(t,e){if("inventory.repair"===e.phase)return base(t,"adapter","runtime.inventory.repair",{status:e.status,...isRecord(e.diagnostic)?e.diagnostic:{}});const r=readTraceType(e.traceType),o=readString(e.traceLabel);return r&&o?base(t,r,o,e):void 0}(t,e);return r||base(t,"adapter",e.phase.startsWith("agent.")?e.phase:`adapter.${e.phase}`,e)}return base(t,"adapter","runtime.adapter.event",{event:e})}(t):"runtime.artifact.created"===t.type?base(t,"artifact","runtime.artifact.created",{artifact:t.artifact}):t.type.startsWith("runtime.memory.")?base(t,"memory",t.type):"runtime.progress.narration"===t.type?base(t,"progress",t.type,{message:t.message,provider:t.provider,sourceEventTypes:t.sourceEventTypes}):void 0}export function readPlanTodos(t){const e=function readPlanRecord(t){if(isRecord(t))return t;if("string"==typeof t)try{const e=JSON.parse(t);return isRecord(e)?e:void 0}catch{return}}(t),r=function readTodosArray(t){const e=isRecord(t?.args)?t.args:void 0;return Array.isArray(t?.todos)?t.todos:Array.isArray(e?.todos)?e.todos:[]}(e);return r.map(readTodo).filter(isPlanTodoItem)}function readTodo(t){if(isRecord(t)&&"string"==typeof t.content)return{content:t.content,status:"string"==typeof t.status?t.status:"pending"}}function isPlanTodoItem(t){return void 0!==t}function base(t,e,r,o){return{type:e,label:r,agentId:t.agentId,requestId:t.requestId,detail:o}}function isTraceEntry(t){return void 0!==t}function outputTraceDetail(t){const e="string"==typeof t?t:function serializeOutput(t){try{return void 0===t?"":JSON.stringify(t)}catch{return String(t)}}(t),r=e.slice(0,1200);return{outputType:Array.isArray(t)?"array":null===t?"null":typeof t,outputLength:e.length,outputPreview:r,...e.length>r.length?{outputTail:e.slice(-1200)}:{}}}function projectSingleSpan(t,e,r,o,n,a){return t.event(o,n,e,r,a)}function delegationKey(t){return`delegation:${readString(t?.subagentType)??readString(t?.toolId)??"task"}`}function createSpan(t,e,r,o,n,a,i){const s={spanId:t,parentSpanId:e,requestId:n.requestId,sessionId:n.sessionId,agentId:n.agentId,kind:r,name:o,status:"running",startedAt:n.emittedAt,startEventIndex:a,attributes:i,events:[]};return addEvent(s,n,a),s}function addEvent(t,e,r){t.events.push({index:r,eventId:e.eventId??`${e.requestId}:${r}`,type:e.type,emittedAt:e.emittedAt})}function close(t,e,r){t.status="failed"===t.status||"blocked"===t.status?t.status:"completed",t.completedAt=e.emittedAt,t.endEventIndex=r,t.durationMs=function durationMs(t,e){if(!t||!e)return;const r=Date.parse(e)-Date.parse(t);return Number.isFinite(r)&&r>=0?r:void 0}(t.startedAt,t.completedAt)}function merge(t,e){return e?{...t,...e}:t}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readTraceType(t){const e=readString(t);return"request"===e||"tool"===e||"workflow"===e||"spec"===e||"adapter"===e||"memory"===e||"artifact"===e||"progress"===e||"plan"===e||"delegation"===e?e:void 0}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}
1
+ export function createDelegationTraceProjection(t,e={}){return{traceType:"delegation",traceLabel:t,...e}}export function createPlanTraceProjection(t,e={}){return{traceType:"plan",traceLabel:t,...e}}export function projectRuntimeTrace(t){return t.events.map(projectEvent).filter(isTraceEntry)}export function projectRuntimeTraceSpans(t){const e=function createSpanBuilder(t){const e=`run:${t.requestId}`,r=[],n=new Map;return{ensureRoot(){if(n.has(e))return;const o={spanId:e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,kind:"run",name:t.agentId,status:(a=t.state,"completed"===a?"completed":"failed"===a?"failed":"cancelled"===a?"blocked":"running"),startedAt:t.startedAt,completedAt:t.completedAt,startEventIndex:0,...t.parentRunId?{parentSpanId:`run:${t.parentRunId}`}:{},events:[]};var a;r.push(o),n.set(e,o)},markRoot(t,r,o,a){const i=n.get(e);i&&(addEvent(i,t,r),i.status=o,i.attributes=merge(i.attributes,a),"running"!==o&&close(i,t,r))},start(t,o,a,i,s,p){const d=createSpan(`${e}/${t}:${s}`,e,o,a,i,s,p);r.push(d),n.set(t,d)},complete(t,o,a,i){const s=n.get(t)??createSpan(`${e}/${t}:${a}`,e,"adapter",t,o,a);return n.has(t)||r.push(s),addEvent(s,o,a),s.attributes=merge(s.attributes,i),close(s,o,a),n.delete(t),s},fail(t,e,r,n){this.complete(t,e,r,n).status="failed"},event(t,n,o,a,i){const s=createSpan(`${e}/event:${a}`,e,t,n,o,a,i);s.status=function readBlockedStatus(t){return t.type.endsWith(".blocked")||t.type.includes(".approval.")?"blocked":void 0}(o)??"event",close(s,o,a),r.push(s)},closeRoot(){const r=n.get(e);r&&t.completedAt&&(r.completedAt=t.completedAt)},spans:()=>r}}(t);return e.ensureRoot(),t.events.forEach((t,r)=>function projectSpanEvent(t,e,r){return e.type.startsWith("runtime.request.")?function projectRequestSpanEvent(t,e,r){return"runtime.request.started"===e.type?t.markRoot(e,r,"running",{input:e.input}):"runtime.request.completed"===e.type?t.markRoot(e,r,"completed",{output:e.output}):"runtime.request.failed"===e.type?t.markRoot(e,r,"failed",{error:e.error}):"runtime.request.cancelled"===e.type?t.markRoot(e,r,"blocked",{reason:e.reason}):"runtime.execution.contract.failed"===e.type?projectSingleSpan(t,e,r,"quality",e.type,{reason:e.reason,missingEvidenceTools:e.missingEvidenceTools}):void 0}(t,e,r):"runtime.tool.direct.started"===e.type?t.start(`tool:${e.toolId}`,"tool",e.toolId,e,r,{toolId:e.toolId}):"runtime.tool.direct.completed"===e.type?t.complete(`tool:${e.toolId}`,e,r,{toolId:e.toolId,output:e.output}):"runtime.workflow.started"===e.type?t.start(`workflow:${e.workflowId}`,"workflow",e.workflowId,e,r,{workflowId:e.workflowId,adapter:e.adapter}):"runtime.workflow.completed"===e.type?t.complete(`workflow:${e.workflowId}`,e,r,{workflowId:e.workflowId,adapter:e.adapter}):e.type.startsWith("runtime.approval.")||e.type.startsWith("runtime.memory.approval.")?projectSingleSpan(t,e,r,"approval",e.type):e.type.startsWith("runtime.specDriven.phase.")?projectSingleSpan(t,e,r,"spec",function readPhaseName(t,e){return"phaseId"in t&&"string"==typeof t.phaseId?t.phaseId:e}(e,"phase")):e.type.startsWith("runtime.memory.")?projectSingleSpan(t,e,r,"memory",e.type):e.type.startsWith("runtime.quality.")?projectSingleSpan(t,e,r,"quality",e.type):"runtime.failure.classified"===e.type?projectSingleSpan(t,e,r,"quality",e.type,e.classification):e.type.startsWith("runtime.improvement.")||e.type.startsWith("runtime.verification.")?projectSingleSpan(t,e,r,"quality",e.type):e.type.startsWith("runtime.context.")?projectSingleSpan(t,e,r,"artifact",e.type):e.type.startsWith("runtime.repair.")?projectSingleSpan(t,e,r,"adapter",e.type):"runtime.artifact.created"===e.type?projectSingleSpan(t,e,r,"artifact",e.artifact.id,{artifact:e.artifact}):"runtime.progress.narration"===e.type?projectSingleSpan(t,e,r,"progress",e.message,{provider:e.provider}):"runtime.adapter.event"===e.type?function projectAdapterSpanEvent(t,e,r){const n=isRecord(e.event)?e.event:void 0,o=readString(n?.phase)??"runtime.adapter.event",a=readTraceType(n?.traceType),i=readString(n?.traceLabel);return"delegation"===a&&i?.endsWith(".start")?t.start(delegationKey(n),"delegation",readString(n?.subagentType)??i,e,r,n):"delegation"===a&&i?.endsWith(".completed")?t.complete(delegationKey(n),e,r,n):"plan"===a&&i?projectSingleSpan(t,e,r,"plan",i,n):function isToolStartEvent(t){return"deepagents.tool_execution.start"===t?.eventType||"agent.tool.start"===t?.phase}(n)?t.start(`agent-tool:${readString(n?.toolId)??"unknown"}`,"tool",readString(n?.toolId)??o,e,r,n):function isToolResultEvent(t){return"deepagents.tool_execution.result"===t?.eventType||"agent.tool.result"===t?.phase}(n)?t.complete(`agent-tool:${readString(n?.toolId)??"unknown"}`,e,r,n):projectSingleSpan(t,e,r,"adapter",o,n)}(t,e,r):"runtime.inventory.repair"===e.type?projectSingleSpan(t,e,r,"adapter","runtime.inventory.repair",{status:e.status,...e.diagnostic}):"runtime.sandbox.decision"===e.type?projectSingleSpan(t,e,r,"tool",`sandbox:${e.toolId}`,{toolId:e.toolId,...e.decision}):"runtime.tool.failure"===e.type?t.fail(`tool:${e.toolId}`,e,r,{toolId:e.toolId,...e.failure}):"runtime.tool.circuit.opened"===e.type?projectSingleSpan(t,e,r,"tool",`circuit:${e.toolId}`,{toolId:e.toolId,reason:e.reason}):void 0}(e,t,r)),e.closeRoot(),e.spans()}export function projectEvent(t){return"runtime.request.started"===t.type||"runtime.request.completed"===t.type||"runtime.request.failed"===t.type?base(t,"request",t.type):"runtime.request.cancelled"===t.type?base(t,"request",t.type,{reason:t.reason}):"runtime.failure.classified"===t.type?base(t,"quality",t.type,t.classification):"runtime.execution.contract.failed"===t.type?base(t,"request",t.type,{reason:t.reason,missingEvidenceTools:t.missingEvidenceTools}):"runtime.inventory.repair"===t.type?base(t,"adapter","runtime.inventory.repair",{status:t.status,...t.diagnostic}):"runtime.repair.started"===t.type||"runtime.repair.completed"===t.type?base(t,"adapter",t.type,{layer:t.layer,..."outcome"in t?{outcome:t.outcome}:{},..."attempt"in t?{attempt:t.attempt}:{},..."reason"in t?{reason:t.reason}:{},...t.diagnostics?{diagnostics:t.diagnostics}:{}}):"runtime.tool.direct.started"===t.type?base(t,"tool","runtime.tool.direct.started",{toolId:t.toolId}):"runtime.tool.direct.completed"===t.type?base(t,"tool","runtime.tool.direct.completed",{toolId:t.toolId,...outputTraceDetail(t.output)}):"runtime.sandbox.decision"===t.type?base(t,"tool","runtime.sandbox.decision",{toolId:t.toolId,...t.decision}):"runtime.tool.failure"===t.type?base(t,"tool","runtime.tool.failure",{toolId:t.toolId,...t.failure}):"runtime.tool.circuit.opened"===t.type?base(t,"tool","runtime.tool.circuit.opened",{toolId:t.toolId,reason:t.reason}):"runtime.workflow.started"===t.type||"runtime.workflow.completed"===t.type?base(t,"workflow",t.type,{workflowId:t.workflowId,adapter:t.adapter}):function isSpecDrivenPhaseEvent(t){return t.type.startsWith("runtime.specDriven.phase.")}(t)?base(t,"spec",t.type,{phaseId:t.phaseId,..."workflowId"in t&&t.workflowId?{workflowId:t.workflowId}:{},..."reason"in t?{reason:t.reason}:{},..."artifact"in t&&t.artifact?{artifact:t.artifact}:{}}):"runtime.adapter.event"===t.type?function adapterTrace(t){const e=t.event;if(isRecord(e)&&"string"==typeof e.phase){const r=function semanticAdapterTrace(t,e){if("inventory.repair"===e.phase)return base(t,"adapter","runtime.inventory.repair",{status:e.status,...isRecord(e.diagnostic)?e.diagnostic:{}});const r=readTraceType(e.traceType),n=readString(e.traceLabel);return r&&n?base(t,r,n,e):void 0}(t,e);return r||base(t,"adapter",e.phase.startsWith("agent.")?e.phase:`adapter.${e.phase}`,e)}return base(t,"adapter","runtime.adapter.event",{event:e})}(t):"runtime.artifact.created"===t.type?base(t,"artifact","runtime.artifact.created",{artifact:t.artifact}):t.type.startsWith("runtime.memory.")?base(t,"memory",t.type):t.type.startsWith("runtime.improvement.")||t.type.startsWith("runtime.verification.")?base(t,"quality",t.type):t.type.startsWith("runtime.context.")?base(t,"artifact",t.type):"runtime.progress.narration"===t.type?base(t,"progress",t.type,{message:t.message,provider:t.provider,sourceEventTypes:t.sourceEventTypes}):void 0}export function readPlanTodos(t){const e=function readPlanRecord(t){if(isRecord(t))return t;if("string"==typeof t)try{const e=JSON.parse(t);return isRecord(e)?e:void 0}catch{return}}(t),r=function readTodosArray(t){const e=isRecord(t?.args)?t.args:void 0;return Array.isArray(t?.todos)?t.todos:Array.isArray(e?.todos)?e.todos:[]}(e);return r.map(readTodo).filter(isPlanTodoItem)}function readTodo(t){if(isRecord(t)&&"string"==typeof t.content)return{content:t.content,status:"string"==typeof t.status?t.status:"pending"}}function isPlanTodoItem(t){return void 0!==t}function base(t,e,r,n){return{type:e,label:r,agentId:t.agentId,requestId:t.requestId,detail:n}}function isTraceEntry(t){return void 0!==t}function outputTraceDetail(t){const e="string"==typeof t?t:function serializeOutput(t){try{return void 0===t?"":JSON.stringify(t)}catch{return String(t)}}(t),r=e.slice(0,1200);return{outputType:Array.isArray(t)?"array":null===t?"null":typeof t,outputLength:e.length,outputPreview:r,...e.length>r.length?{outputTail:e.slice(-1200)}:{}}}function projectSingleSpan(t,e,r,n,o,a){return t.event(n,o,e,r,a)}function delegationKey(t){return`delegation:${readString(t?.subagentType)??readString(t?.toolId)??"task"}`}function createSpan(t,e,r,n,o,a,i){const s={spanId:t,parentSpanId:e,requestId:o.requestId,sessionId:o.sessionId,agentId:o.agentId,kind:r,name:n,status:"running",startedAt:o.emittedAt,startEventIndex:a,attributes:i,events:[]};return addEvent(s,o,a),s}function addEvent(t,e,r){t.events.push({index:r,eventId:e.eventId??`${e.requestId}:${r}`,type:e.type,emittedAt:e.emittedAt})}function close(t,e,r){t.status="failed"===t.status||"blocked"===t.status?t.status:"completed",t.completedAt=e.emittedAt,t.endEventIndex=r,t.durationMs=function durationMs(t,e){if(!t||!e)return;const r=Date.parse(e)-Date.parse(t);return Number.isFinite(r)&&r>=0?r:void 0}(t.startedAt,t.completedAt)}function merge(t,e){return e?{...t,...e}:t}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readTraceType(t){const e=readString(t);return"request"===e||"tool"===e||"workflow"===e||"spec"===e||"adapter"===e||"memory"===e||"artifact"===e||"progress"===e||"plan"===e||"delegation"===e?e:void 0}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}
@@ -6,10 +6,11 @@ import type { RuntimeEvent, RuntimeEventListener, RuntimeEmit } from "./runtime/
6
6
  import type { RuntimeToolFailureTracker } from "./runtime/tool-failure.js";
7
7
  import type { ToolGuardrail } from "./runtime/policy/tool-invocation.js";
8
8
  import type { ExecutionEvaluatorRule } from "./quality/execution-review.js";
9
+ import type { RuntimeImprovementProposal, RuntimeImprovementProposalFilter, RuntimeImprovementProposalInput, RuntimeImprovementReviewInput, RuntimeFailureClassificationInput, RuntimeVerificationHookResultInput, RuntimeContextOffloadInput, RuntimeContextCompactionInput } from "./runtime/improvement/types.js";
9
10
  import type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactImportInput, RuntimeArtifactRecord, RuntimeOutput, RuntimeRecordState, RuntimeRequest, RuntimeResponse, RuntimeReplayBundle, RuntimeDeletionResult, RuntimeRunFilter, RuntimeRunRecord } from "./runtime/types.js";
10
11
  import type { RuntimeToolGateway } from "./runtime/tool-gateway.js";
11
12
  import type { CompiledWorkspace, WorkspaceAgent, WorkspaceRuntimePolicy } from "./workspace/types.js";
12
- export type { RuntimeEvent, RuntimeMemoryHook, RuntimeEventListener, RuntimeEmit } from "./runtime/events.js";
13
+ export type { RuntimeEmit, RuntimeEvent, RuntimeEventListener, RuntimeFailureCategory, RuntimeFailureClassification, RuntimeFailureEvidenceReference, RuntimeMemoryHook, } from "./runtime/events.js";
13
14
  export type { BoundaryScanFinding, BoundaryScanLayer, BoundaryScanLayerResult, BoundaryScanResource, BoundaryScanResult } from "./boundary-scan.js";
14
15
  export type { RuntimeCapabilityContext, RuntimeCapabilityModule, RuntimeCapabilityRegistry, RuntimeCapabilityState } from "./runtime/capabilities.js";
15
16
  export type { RuntimeProgressNarrationOptions, RuntimeProgressNarrationProvider } from "./runtime/progress-narration.js";
@@ -20,6 +21,7 @@ export type { WorkspaceEvaluation, WorkspaceEvaluationCase, } from "./evaluation
20
21
  export type { SpecDrivenPhaseId, SpecDrivenPhaseRecord, SpecDrivenPhaseStatus, SpecDrivenPhaseTransition, SpecDrivenWorkflowState, WorkspaceSpecDrivenPhase, WorkspaceSpecDrivenWorkflowPolicy, } from "./spec-driven/index.js";
21
22
  export type { RuntimeToolCallRequest, RuntimeToolGateway, RuntimeToolGatewayContext, RuntimeToolRepairModel, RuntimeToolGatewayTool, RuntimeSandboxDecision, RuntimeSandboxPolicy, RuntimeSandboxPolicyInput, } from "./runtime/tool-gateway.js";
22
23
  export type { RuntimeToolFailureClassification, RuntimeToolFailureKind, RuntimeToolFailurePolicy, RuntimeToolFailureReason, RuntimeToolFailureTracker, } from "./runtime/tool-failure.js";
24
+ export type { RuntimeContextImprovement, RuntimeContextCompactionInput, RuntimeContextOffloadInput, RuntimeFailureClassificationInput, RuntimeImprovementApplication, RuntimeImprovementOwner, RuntimeImprovementProposal, RuntimeImprovementProposalFilter, RuntimeImprovementProposalInput, RuntimeImprovementReviewInput, RuntimeImprovementStatus, RuntimeImprovementStore, RuntimeImprovementTarget, RuntimeMemoryImprovement, RuntimePolicyImprovement, RuntimeVerificationImprovement, RuntimeVerificationHookResultInput, } from "./runtime/improvement/types.js";
23
25
  export type RuntimeAdapterContext = {
24
26
  workspace: CompiledWorkspace;
25
27
  agent: WorkspaceAgent;
@@ -142,6 +144,15 @@ export type RuntimeInspector = {
142
144
  listApprovals(status?: ApprovalRequestStatus): Promise<ApprovalRequest[]>;
143
145
  getApproval(id: string): Promise<ApprovalRequest | undefined>;
144
146
  resolveApproval(id: string, status: Exclude<ApprovalRequestStatus, "pending">): Promise<ApprovalRequest | undefined>;
147
+ classifyRunFailure(input: RuntimeFailureClassificationInput): RuntimeImprovementProposal | undefined;
148
+ createImprovementProposal(input: RuntimeImprovementProposalInput): RuntimeImprovementProposal;
149
+ listImprovementProposals(filter?: RuntimeImprovementProposalFilter): RuntimeImprovementProposal[];
150
+ getImprovementProposal(id: string): RuntimeImprovementProposal | undefined;
151
+ reviewImprovementProposal(input: RuntimeImprovementReviewInput): RuntimeImprovementProposal | undefined;
152
+ applyImprovementProposal(id: string): RuntimeImprovementProposal | undefined;
153
+ recordVerificationHookResult(input: RuntimeVerificationHookResultInput): boolean;
154
+ recordContextOffload(input: RuntimeContextOffloadInput): boolean;
155
+ recordContextCompaction(input: RuntimeContextCompactionInput): boolean;
145
156
  };
146
157
  export type RuntimeLifecycle = {
147
158
  cancel(requestId: string, reason?: string): void;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/core",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -12,7 +12,7 @@
12
12
  ".": "./dist/index.js"
13
13
  },
14
14
  "peerDependencies": {
15
- "@stable-harness/governance": "0.0.124",
16
- "@stable-harness/memory": "0.0.124"
15
+ "@stable-harness/governance": "0.0.125",
16
+ "@stable-harness/memory": "0.0.125"
17
17
  }
18
18
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/governance",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/memory",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -1 +1 @@
1
- export function createInProcessClient(e){return{request:t=>e.request(t),subscribe:t=>e.subscribe(t),inspect:()=>e.inspect(),getRuntimePolicy:()=>e.getRuntimePolicy(),getWorkflow:t=>e.getWorkflow(t),getRun:t=>e.getRun(t),listArtifacts:t=>e.listArtifacts(t),getArtifact:t=>e.getArtifact(t),readArtifact:t=>e.readArtifact(t),importArtifact:t=>e.importArtifact(t),exportReplayBundle:t=>e.exportReplayBundle(t),listRequests:t=>e.listRequests(t),listSessions:()=>e.listSessions(),inspectRequest:t=>e.inspectRequest(t),memorize:t=>e.memorize(t),recallMemories:t=>e.recallMemories(t),listMemories:t=>e.listMemories(t),updateMemory:t=>e.updateMemory(t),archiveMemory:(t,s)=>e.archiveMemory(t,s),listApprovals:t=>e.listApprovals(t),getApproval:t=>e.getApproval(t),resolveApproval:(t,s)=>e.resolveApproval(t,s),cancel:(t,s)=>e.cancel(t,s),deleteRequest:t=>e.deleteRequest(t),deleteSession:t=>e.deleteSession(t),stop:()=>e.stop()}}
1
+ export function createInProcessClient(e){return{request:t=>e.request(t),subscribe:t=>e.subscribe(t),inspect:()=>e.inspect(),getRuntimePolicy:()=>e.getRuntimePolicy(),getWorkflow:t=>e.getWorkflow(t),getRun:t=>e.getRun(t),listArtifacts:t=>e.listArtifacts(t),getArtifact:t=>e.getArtifact(t),readArtifact:t=>e.readArtifact(t),importArtifact:t=>e.importArtifact(t),exportReplayBundle:t=>e.exportReplayBundle(t),listRequests:t=>e.listRequests(t),listSessions:()=>e.listSessions(),inspectRequest:t=>e.inspectRequest(t),memorize:t=>e.memorize(t),recallMemories:t=>e.recallMemories(t),listMemories:t=>e.listMemories(t),updateMemory:t=>e.updateMemory(t),archiveMemory:(t,r)=>e.archiveMemory(t,r),listApprovals:t=>e.listApprovals(t),getApproval:t=>e.getApproval(t),resolveApproval:(t,r)=>e.resolveApproval(t,r),...createImprovementClient(e),cancel:(t,r)=>e.cancel(t,r),deleteRequest:t=>e.deleteRequest(t),deleteSession:t=>e.deleteSession(t),stop:()=>e.stop()}}function createImprovementClient(e){return{classifyRunFailure:t=>e.classifyRunFailure(t),createImprovementProposal:t=>e.createImprovementProposal(t),listImprovementProposals:t=>e.listImprovementProposals(t),getImprovementProposal:t=>e.getImprovementProposal(t),reviewImprovementProposal:t=>e.reviewImprovementProposal(t),applyImprovementProposal:t=>e.applyImprovementProposal(t),recordVerificationHookResult:t=>e.recordVerificationHookResult(t),recordContextOffload:t=>e.recordContextOffload(t),recordContextCompaction:t=>e.recordContextCompaction(t)}}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/protocols",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -11,6 +11,6 @@
11
11
  "main": "dist/src/index.js",
12
12
  "types": "dist/src/index.d.ts",
13
13
  "peerDependencies": {
14
- "@stable-harness/core": "0.0.124"
14
+ "@stable-harness/core": "0.0.125"
15
15
  }
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/tool-gateway",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/workspace-yaml",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -12,6 +12,6 @@
12
12
  ".": "./dist/index.js"
13
13
  },
14
14
  "peerDependencies": {
15
- "@stable-harness/core": "0.0.124"
15
+ "@stable-harness/core": "0.0.125"
16
16
  }
17
17
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stable-harness",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "type": "module",
5
5
  "description": "Stable application runtime and operator control plane for agent workspaces.",
6
6
  "license": "Apache-2.0",
@@ -82,14 +82,14 @@
82
82
  "@langchain/node-vfs": "^0.1.4",
83
83
  "@langchain/ollama": "^1.2.7",
84
84
  "@langchain/openai": "^1.4.5",
85
- "@stable-harness/adapter-deepagents": "0.0.124",
86
- "@stable-harness/adapter-langgraph": "0.0.124",
87
- "@stable-harness/core": "0.0.124",
88
- "@stable-harness/governance": "0.0.124",
89
- "@stable-harness/memory": "0.0.124",
90
- "@stable-harness/protocols": "0.0.124",
91
- "@stable-harness/tool-gateway": "0.0.124",
92
- "@stable-harness/workspace-yaml": "0.0.124",
85
+ "@stable-harness/adapter-deepagents": "0.0.125",
86
+ "@stable-harness/adapter-langgraph": "0.0.125",
87
+ "@stable-harness/core": "0.0.125",
88
+ "@stable-harness/governance": "0.0.125",
89
+ "@stable-harness/memory": "0.0.125",
90
+ "@stable-harness/protocols": "0.0.125",
91
+ "@stable-harness/tool-gateway": "0.0.125",
92
+ "@stable-harness/workspace-yaml": "0.0.125",
93
93
  "deepagents": "^1.10.1",
94
94
  "langchain": "^1.4.0",
95
95
  "yaml": "^2.8.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/adapter-deepagents",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -16,7 +16,7 @@
16
16
  "@langchain/node-vfs": "^0.1.4",
17
17
  "@langchain/ollama": "^1.2.7",
18
18
  "@langchain/openai": "^1.4.5",
19
- "@stable-harness/core": "0.0.124",
19
+ "@stable-harness/core": "0.0.125",
20
20
  "deepagents": "^1.10.1",
21
21
  "langchain": "^1.4.0"
22
22
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/adapter-langgraph",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -12,6 +12,6 @@
12
12
  "types": "dist/src/index.d.ts",
13
13
  "peerDependencies": {
14
14
  "@langchain/langgraph": "^1.3.0",
15
- "@stable-harness/core": "0.0.124"
15
+ "@stable-harness/core": "0.0.125"
16
16
  }
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/cli",
3
- "version": "0.0.124",
3
+ "version": "0.0.125",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -15,12 +15,12 @@
15
15
  "types": "dist/src/index.d.ts",
16
16
  "peerDependencies": {
17
17
  "@langchain/langgraph-api": "^1.2.1",
18
- "@stable-harness/adapter-deepagents": "0.0.124",
19
- "@stable-harness/adapter-langgraph": "0.0.124",
20
- "@stable-harness/core": "0.0.124",
21
- "@stable-harness/memory": "0.0.124",
22
- "@stable-harness/protocols": "0.0.124",
23
- "@stable-harness/tool-gateway": "0.0.124",
24
- "@stable-harness/workspace-yaml": "0.0.124"
18
+ "@stable-harness/adapter-deepagents": "0.0.125",
19
+ "@stable-harness/adapter-langgraph": "0.0.125",
20
+ "@stable-harness/core": "0.0.125",
21
+ "@stable-harness/memory": "0.0.125",
22
+ "@stable-harness/protocols": "0.0.125",
23
+ "@stable-harness/tool-gateway": "0.0.125",
24
+ "@stable-harness/workspace-yaml": "0.0.125"
25
25
  }
26
26
  }
@@ -16,6 +16,7 @@ export * from "./runtime/tool-failure.js";
16
16
  export * from "./runtime/tracing/langsmith.js";
17
17
  export * from "./runtime/policy/tool-invocation.js";
18
18
  export * from "./runtime/persistence/stores.js";
19
+ export * from "./runtime/improvement/store.js";
19
20
  export * from "./trace.js";
20
21
  export * from "./types.js";
21
22
  export * from "./workspace/tool-quality.js";
@@ -1 +1 @@
1
- export*from"./runtime/persistence/artifacts.js";export*from"./boundary-scan.js";export*from"./execution-contract.js";export*from"./recovery/tool-call.js";export*from"./runtime/persistence/inspection.js";export*from"./runtime/metrics/prometheus.js";export{createWorkspaceSandboxPolicy}from"./runtime/governance/sandbox.js";export*from"./memory-plugins.js";export{resolveEnabledMemories}from"./memory-plugins/shared.js";export*from"./runtime/persistence/queue.js";export*from"./runtime/policy/projection.js";export*from"./runtime.js";export*from"./runtime/selection-repair.js";export*from"./runtime/tool-failure.js";export*from"./runtime/tracing/langsmith.js";export*from"./runtime/policy/tool-invocation.js";export*from"./runtime/persistence/stores.js";export*from"./trace.js";export*from"./types.js";export*from"./workspace/tool-quality.js";export*from"./evaluations/index.js";export*from"./quality/index.js";export*from"./spec-driven/index.js";export*from"./workflows/index.js";
1
+ export*from"./runtime/persistence/artifacts.js";export*from"./boundary-scan.js";export*from"./execution-contract.js";export*from"./recovery/tool-call.js";export*from"./runtime/persistence/inspection.js";export*from"./runtime/metrics/prometheus.js";export{createWorkspaceSandboxPolicy}from"./runtime/governance/sandbox.js";export*from"./memory-plugins.js";export{resolveEnabledMemories}from"./memory-plugins/shared.js";export*from"./runtime/persistence/queue.js";export*from"./runtime/policy/projection.js";export*from"./runtime.js";export*from"./runtime/selection-repair.js";export*from"./runtime/tool-failure.js";export*from"./runtime/tracing/langsmith.js";export*from"./runtime/policy/tool-invocation.js";export*from"./runtime/persistence/stores.js";export*from"./runtime/improvement/store.js";export*from"./trace.js";export*from"./types.js";export*from"./workspace/tool-quality.js";export*from"./evaluations/index.js";export*from"./quality/index.js";export*from"./spec-driven/index.js";export*from"./workflows/index.js";
@@ -21,4 +21,13 @@ export type RawArgsToolMatch = {
21
21
  toolId: string;
22
22
  args: Record<string, unknown>;
23
23
  };
24
+ export type RawArgsToolEvidence = {
25
+ match: RawArgsToolMatch;
26
+ toolOutput: string;
27
+ };
28
+ export declare function buildRawArgsToolSequenceEvidenceRecoveryRequest(input: {
29
+ request: RuntimeRequest;
30
+ evidences: RawArgsToolEvidence[];
31
+ }): RuntimeRequest;
24
32
  export declare function matchUniqueRawArgsTool(input: Omit<RawArgsRecoveryInput, "request">): RawArgsToolMatch | undefined;
33
+ export declare function matchRawArgsToolSequence(input: Omit<RawArgsRecoveryInput, "request">): RawArgsToolMatch[];
@@ -1 +1 @@
1
- import{selectCallCandidateByArgsSchema as e}from"@easynet/better-call";export function buildRawArgsRecoveryRequest(e){if(!toolCallRecoveryEnabled(e.policy))return;const t=matchUniqueRawArgsTool(e);return t?function buildRawArgsRecoveryPrompt(e,t){return{...e,input:[e.input,"","Stable runtime recovery: your previous final answer was a JSON argument object for a declared tool, not the final answer.",`Matched configured tool: ${t.toolId}`,"Continue the same user request by calling that tool through the backend's normal structured tool-calling mechanism with the JSON arguments below.","If the tool call succeeds, synthesize the final user-facing answer from the executed evidence.","Do not print JSON argument objects, raw tool-call markup, plans, or future-intent text as the final answer.","","Previous JSON arguments:",JSON.stringify(t.args)].join("\n"),metadata:{...e.metadata,stableHarnessRecovery:"tool_call"}}}(e.request,t):void 0}export function buildRawArgsToolEvidenceRecoveryRequest(e){return{...e.request,input:[e.request.input,"","Stable runtime recovery: your previous final answer repeated a JSON argument object for a declared tool after a structured tool-call recovery request.",`Matched configured tool: ${e.match.toolId}`,"Stable runtime executed that matched declared tool through the governed tool gateway.","Continue the same user request from the executed evidence below.","If another declared tool is needed, call it through the backend's normal structured tool-calling mechanism.","Otherwise, synthesize the final user-facing answer from the executed evidence.","Do not print JSON argument objects, raw tool-call markup, plans, or future-intent text as the final answer.","","Executed JSON arguments:",JSON.stringify(e.match.args),"","Executed tool output:",e.toolOutput].join("\n"),metadata:{...e.request.metadata,stableHarnessRecovery:"tool_call"}}}export function hasUniqueRawArgsTool(e){return toolCallRecoveryEnabled(e.policy)&&Boolean(matchUniqueRawArgsTool(e))}export function matchUniqueRawArgsTool(t){const o=function parseStandaloneJsonObject(e){const t=e.trim(),o=t.match(/^```(?:json)?\s*\n([\s\S]*?)\n```$/iu)?.[1]?.trim(),r=o??t;if(r.startsWith("{")&&r.endsWith("}")&&!(r.length>6e3))try{const e=JSON.parse(r);return!isRecord(e)||function isToolCallEnvelope(e){const t=["tool","tool_name","name","type","subagent_type"].some(t=>"string"==typeof e[t]),o=["args","arguments","parameters","kwargs"].some(t=>t in e);return t&&o}(e)||function isRuntimeControlObject(e){return"string"==typeof e.status||"string"==typeof e.error||"string"==typeof e.controlStatus}(e)?void 0:e}catch{return}}(t.output);if(!o)return;const r=e({args:o,candidates:buildCallCandidates(t)});if(r.ok)return{toolId:r.candidateId,args:r.args};const n=function latestSingleToolCandidate(e,t){for(let o=(e?.length??0)-1;o>=0;o-=1){const r=e[o];if(!r||!("diagnostics"in r)||!isRecord(r.diagnostics))continue;const n=readStringArray(r.diagnostics.toolCandidateIds).filter(e=>t.has(e));if(1===n.length)return n[0];if(n.length>1)return}}(t.events,new Set(candidateToolIds(t)));return n?{toolId:n,args:o}:void 0}function buildCallCandidates(e){return candidateToolIds(e).map(t=>({id:t,schema:e.workspace.tools.get(t)?.schema??e.toolGateway?.get(t)?.schema}))}function candidateToolIds(e){const t=new Set(e.agent.tools),o=(e.candidateToolIds??[]).filter(e=>t.has(e));return o.length>0?o:e.agent.tools}function toolCallRecoveryEnabled(e){return!!(isRecord(e)&&isRecord(e.recovery)&&isRecord(e.recovery.toolCall))&&!0===e.recovery.toolCall.enabled}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
1
+ import{selectCallCandidateByArgsSchema as e}from"@easynet/better-call";export function buildRawArgsRecoveryRequest(e){if(!toolCallRecoveryEnabled(e.policy))return;const t=matchUniqueRawArgsTool(e);return t?function buildRawArgsRecoveryPrompt(e,t){return{...e,input:[e.input,"","Stable runtime recovery: your previous final answer was a JSON argument object for a declared tool, not the final answer.",`Matched configured tool: ${t.toolId}`,"Continue the same user request by calling that tool through the backend's normal structured tool-calling mechanism with the JSON arguments below.","If the tool call succeeds, synthesize the final user-facing answer from the executed evidence.","Do not print JSON argument objects, raw tool-call markup, plans, or future-intent text as the final answer.","","Previous JSON arguments:",JSON.stringify(t.args)].join("\n"),metadata:{...e.metadata,stableHarnessRecovery:"tool_call"}}}(e.request,t):void 0}export function buildRawArgsToolEvidenceRecoveryRequest(e){return{...e.request,input:[e.request.input,"","Stable runtime recovery: your previous final answer repeated a JSON argument object for a declared tool after a structured tool-call recovery request.",`Matched configured tool: ${e.match.toolId}`,"Stable runtime executed that matched declared tool through the governed tool gateway.","Continue the same user request from the executed evidence below.","If another declared tool is needed, call it through the backend's normal structured tool-calling mechanism.","Otherwise, synthesize the final user-facing answer from the executed evidence.","Do not print JSON argument objects, raw tool-call markup, plans, or future-intent text as the final answer.","","Executed JSON arguments:",JSON.stringify(e.match.args),"","Executed tool output:",e.toolOutput].join("\n"),metadata:{...e.request.metadata,stableHarnessRecovery:"tool_call"}}}export function hasUniqueRawArgsTool(e){return toolCallRecoveryEnabled(e.policy)&&Boolean(matchUniqueRawArgsTool(e))}export function buildRawArgsToolSequenceEvidenceRecoveryRequest(e){return{...e.request,input:[e.request.input,"","Stable runtime recovery: your previous final answer printed multiple JSON argument objects for declared tools after a recovery request.","Stable runtime matched and executed those declared tools through the governed tool gateway.","Continue the same user request from the executed evidence below.","If another declared tool is needed, call it through the backend's normal structured tool-calling mechanism.","Otherwise, synthesize the final user-facing answer from the executed evidence.","Do not print JSON argument objects, raw tool-call markup, plans, or future-intent text as the final answer.","",...e.evidences.flatMap((e,t)=>[`Executed tool ${t+1}: ${e.match.toolId}`,"Executed JSON arguments:",JSON.stringify(e.match.args),"Executed tool output:",e.toolOutput,""])].join("\n"),metadata:{...e.request.metadata,stableHarnessRecovery:"tool_call"}}}export function matchUniqueRawArgsTool(t){const r=parseStandaloneJsonRecords(t.output,{allowArray:!1})[0];if(!r)return;const o=e({args:r,candidates:buildCallCandidates(t)});if(o.ok)return{toolId:o.candidateId,args:o.args};const a=function latestSingleToolCandidate(e,t){for(let r=(e?.length??0)-1;r>=0;r-=1){const o=e[r];if(!o||!("diagnostics"in o)||!isRecord(o.diagnostics))continue;const a=readStringArray(o.diagnostics.toolCandidateIds).filter(e=>t.has(e));if(1===a.length)return a[0];if(a.length>1)return}}(t.events,new Set(candidateToolIds(t)));return a?{toolId:a,args:r}:void 0}export function matchRawArgsToolSequence(t){if(!toolCallRecoveryEnabled(t.policy))return[];const r=parseStandaloneJsonRecords(t.output,{allowArray:!0});if(r.length<2)return[];const o=buildCallCandidates(t),a=[];for(const t of r){const r=e({args:t,candidates:o});if(!r.ok)return[];a.push({toolId:r.candidateId,args:r.args})}return a}function buildCallCandidates(e){return candidateToolIds(e).map(t=>({id:t,schema:e.workspace.tools.get(t)?.schema??e.toolGateway?.get(t)?.schema}))}function candidateToolIds(e){const t=new Set(e.agent.tools),r=(e.candidateToolIds??[]).filter(e=>t.has(e));return r.length>0?r:e.agent.tools}function parseStandaloneJsonRecords(e,t){const r=e.trim(),o=r.match(/^```(?:json)?\s*\n([\s\S]*?)\n```$/iu)?.[1]?.trim(),a=o??r;if(a.length>6e3)return[];if(!(t.allowArray||a.startsWith("{")&&a.endsWith("}")))return[];if(t.allowArray&&!(a.startsWith("{")&&a.endsWith("}")||a.startsWith("[")&&a.endsWith("]")))return[];try{const e=JSON.parse(a),r=Array.isArray(e)&&t.allowArray?e:[e];return r.some(e=>!function isRawArgsRecord(e){return isRecord(e)&&!function isToolCallEnvelope(e){const t=["tool","tool_name","name","type","subagent_type"].some(t=>"string"==typeof e[t]),r=["args","arguments","parameters","kwargs"].some(t=>t in e);return t&&r}(e)&&!function isRuntimeControlObject(e){return"string"==typeof e.status||"string"==typeof e.error||"string"==typeof e.controlStatus}(e)}(e))?[]:r}catch{return[]}}function toolCallRecoveryEnabled(e){return!!(isRecord(e)&&isRecord(e.recovery)&&isRecord(e.recovery.toolCall))&&!0===e.recovery.toolCall.enabled}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
@@ -3,10 +3,25 @@ import type { ApprovalRequest } from "@stable-harness/governance";
3
3
  import type { RuntimeArtifact } from "../types.js";
4
4
  import type { RuntimeSandboxDecision } from "./tool-gateway.js";
5
5
  import type { RuntimeToolFailureClassification, RuntimeToolFailureReason } from "./tool-failure.js";
6
+ import type { RuntimeImprovementProposal } from "./improvement/types.js";
6
7
  export type RuntimeInventoryRepairLayer = "agent" | "workflow_route" | "workflow" | "tool" | "task" | "skill";
7
8
  export type RuntimeInventoryRepairStatus = "repaired" | "blocked";
8
9
  export type RuntimeRepairLayer = "adapter_error" | "result_output" | "execution_contract" | "evidence_synthesis";
9
10
  export type RuntimeRepairOutcome = "retried" | "synthesized" | "blocked";
11
+ export type RuntimeFailureCategory = "upstream_backend" | "workspace_config" | "runtime_policy" | "tool_gateway" | "memory_lifecycle" | "verification_gap" | "protocol_projection" | "downstream_application" | "unclassified";
12
+ export type RuntimeFailureEvidenceReference = {
13
+ kind: "runtime_event" | "trace" | "tool_result" | "approval" | "sandbox_decision" | "memory_record" | "verification_result" | "adapter_state" | "protocol_response";
14
+ id?: string;
15
+ eventType?: string;
16
+ summary?: string;
17
+ };
18
+ export type RuntimeFailureClassification = {
19
+ category: RuntimeFailureCategory;
20
+ owner: "upstream_backend" | "stable_runtime" | "protocol_adapter" | "governance_policy" | "workspace_config" | "downstream_application" | "unknown";
21
+ confidence: number;
22
+ reason: string;
23
+ evidence: RuntimeFailureEvidenceReference[];
24
+ };
10
25
  export type RuntimeRepairDiagnostics = {
11
26
  outputPreview?: string;
12
27
  toolCandidateIds?: string[];
@@ -43,6 +58,52 @@ export type RuntimeEvent = RuntimeEventMetadata & ({
43
58
  sessionId: string;
44
59
  agentId: string;
45
60
  error: string;
61
+ } | {
62
+ type: "runtime.failure.classified";
63
+ requestId: string;
64
+ sessionId: string;
65
+ agentId: string;
66
+ classification: RuntimeFailureClassification;
67
+ } | {
68
+ type: "runtime.improvement.proposed";
69
+ requestId: string;
70
+ sessionId: string;
71
+ agentId: string;
72
+ proposal: RuntimeImprovementProposal;
73
+ } | {
74
+ type: "runtime.improvement.reviewed";
75
+ requestId: string;
76
+ sessionId: string;
77
+ agentId: string;
78
+ proposal: RuntimeImprovementProposal;
79
+ } | {
80
+ type: "runtime.improvement.applied";
81
+ requestId: string;
82
+ sessionId: string;
83
+ agentId: string;
84
+ proposal: RuntimeImprovementProposal;
85
+ } | {
86
+ type: "runtime.verification.hook.completed";
87
+ requestId: string;
88
+ sessionId: string;
89
+ agentId: string;
90
+ hookId: string;
91
+ status: "passed" | "failed" | "blocked";
92
+ evidence?: RuntimeFailureEvidenceReference[];
93
+ } | {
94
+ type: "runtime.context.offloaded";
95
+ requestId: string;
96
+ sessionId: string;
97
+ agentId: string;
98
+ artifact: RuntimeArtifact;
99
+ retainedPreview?: string;
100
+ } | {
101
+ type: "runtime.context.compacted";
102
+ requestId: string;
103
+ sessionId: string;
104
+ agentId: string;
105
+ artifact?: RuntimeArtifact;
106
+ summary: string;
46
107
  } | {
47
108
  type: "runtime.request.cancelled";
48
109
  requestId: string;
@@ -0,0 +1,15 @@
1
+ import type { RuntimeEmit } from "../events.js";
2
+ import type { RuntimeStore } from "../types.js";
3
+ import type { RuntimeFailureClassificationInput, RuntimeImprovementProposalInput, RuntimeImprovementProposalFilter, RuntimeImprovementReviewInput, RuntimeImprovementStore } from "./types.js";
4
+ export declare function createRuntimeImprovementAdministration(input: {
5
+ runtimeStore: RuntimeStore;
6
+ store: RuntimeImprovementStore;
7
+ emit: RuntimeEmit;
8
+ }): {
9
+ classifyRunFailure(classification: RuntimeFailureClassificationInput): import("./types.js").RuntimeImprovementProposal | undefined;
10
+ createImprovementProposal(proposal: RuntimeImprovementProposalInput): import("./types.js").RuntimeImprovementProposal;
11
+ listImprovementProposals(filter?: RuntimeImprovementProposalFilter): import("./types.js").RuntimeImprovementProposal[];
12
+ getImprovementProposal(id: string): import("./types.js").RuntimeImprovementProposal | undefined;
13
+ reviewImprovementProposal(review: RuntimeImprovementReviewInput): import("./types.js").RuntimeImprovementProposal | undefined;
14
+ applyImprovementProposal(id: string): import("./types.js").RuntimeImprovementProposal | undefined;
15
+ };
@@ -0,0 +1 @@
1
+ export function createRuntimeImprovementAdministration(e){const createProposal=s=>{const t=e.store.createProposal(s);return e.emit({type:"runtime.improvement.proposed",requestId:t.requestId??t.sourceRunId??"",sessionId:t.sessionId??"",agentId:t.agentId??"",proposal:t}),t};return{classifyRunFailure(s){const t=e.runtimeStore.getRun(s.requestId);if(t)return e.emit({type:"runtime.failure.classified",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,classification:s.classification}),s.proposal?createProposal({...s.proposal,requestId:s.proposal.requestId??t.requestId,sessionId:s.proposal.sessionId??t.sessionId,agentId:s.proposal.agentId??t.agentId,classification:s.proposal.classification??s.classification}):void 0},createImprovementProposal:e=>createProposal(e),listImprovementProposals:s=>e.store.listProposals(s),getImprovementProposal:s=>e.store.getProposal(s),reviewImprovementProposal(s){const t=e.store.updateProposal(s.id,{status:s.status,reviewedAt:(new Date).toISOString(),reviewReason:s.reason,supersededBy:s.supersededBy});return t&&e.emit({type:"runtime.improvement.reviewed",requestId:t.requestId??t.sourceRunId??"",sessionId:t.sessionId??"",agentId:t.agentId??"",proposal:t}),t},applyImprovementProposal(s){const t=e.store.getProposal(s);if(!t||"accepted"!==t.status)return;const o=e.store.updateProposal(s,{status:"applied",appliedAt:(new Date).toISOString()});return o&&e.emit({type:"runtime.improvement.applied",requestId:o.requestId??o.sourceRunId??"",sessionId:o.sessionId??"",agentId:o.agentId??"",proposal:o}),o}}}
@@ -0,0 +1,11 @@
1
+ import type { RuntimeEmit } from "../events.js";
2
+ import type { RuntimeStore } from "../types.js";
3
+ import type { RuntimeContextCompactionInput, RuntimeContextOffloadInput, RuntimeVerificationHookResultInput } from "./types.js";
4
+ export declare function createRuntimeEvidenceAdministration(input: {
5
+ runtimeStore: RuntimeStore;
6
+ emit: RuntimeEmit;
7
+ }): {
8
+ recordVerificationHookResult(result: RuntimeVerificationHookResultInput): boolean;
9
+ recordContextOffload(offload: RuntimeContextOffloadInput): boolean;
10
+ recordContextCompaction(compaction: RuntimeContextCompactionInput): boolean;
11
+ };
@@ -0,0 +1 @@
1
+ export function createRuntimeEvidenceAdministration(e){return{recordVerificationHookResult(t){const r=e.runtimeStore.getRun(t.requestId);return!!r&&(e.emit({type:"runtime.verification.hook.completed",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agentId,hookId:t.hookId,status:t.status,evidence:t.evidence}),!0)},recordContextOffload(t){const r=e.runtimeStore.getRun(t.requestId);return!!r&&(e.emit({type:"runtime.context.offloaded",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agentId,artifact:{id:t.artifactId,kind:t.kind,uri:t.uri,metadata:t.metadata},retainedPreview:t.retainedPreview}),!0)},recordContextCompaction(t){const r=e.runtimeStore.getRun(t.requestId);return!!r&&(e.emit({type:"runtime.context.compacted",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agentId,summary:t.summary,artifact:t.artifactId?{id:t.artifactId,kind:t.kind??"context-compaction",uri:t.uri,metadata:t.metadata}:void 0}),!0)}}}
@@ -0,0 +1,2 @@
1
+ import type { RuntimeImprovementProposal, RuntimeImprovementStore } from "./types.js";
2
+ export declare function createInMemoryRuntimeImprovementStore(initial?: RuntimeImprovementProposal[]): RuntimeImprovementStore;
@@ -0,0 +1 @@
1
+ import{randomUUID as t}from"node:crypto";export function createInMemoryRuntimeImprovementStore(e=[]){const o=new Map(e.map(t=>[t.id,cloneProposal(t)]));return{createProposal(e){const r=(new Date).toISOString(),n={...e,id:e.id??t(),status:e.status??"proposed",createdAt:e.createdAt??r,updatedAt:e.updatedAt??r};return o.set(n.id,cloneProposal(n)),cloneProposal(n)},listProposals:t=>[...o.values()].filter(e=>function matchesFilter(t,e){return!e||!(e.status&&e.status!==t.status||e.target&&e.target!==t.target||e.owner&&e.owner!==t.owner||e.requestId&&e.requestId!==t.requestId||e.sessionId&&e.sessionId!==t.sessionId||e.agentId&&e.agentId!==t.agentId)}(e,t)).map(cloneProposal),getProposal(t){const e=o.get(t);return e?cloneProposal(e):void 0},updateProposal(t,e){const r=o.get(t);if(r)return Object.assign(r,function clonePatch(t){return structuredClone(t)}(e),{updatedAt:(new Date).toISOString()}),cloneProposal(r)}}}function cloneProposal(t){return structuredClone(t)}