stable-harness 0.0.124 → 0.0.126
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/docs/guides/operator-runbook.md +42 -0
- package/docs/product/harness-engineering-roadmap.md +137 -0
- package/docs/product/market-positioning.md +12 -0
- package/node_modules/@stable-harness/adapter-deepagents/package.json +2 -2
- package/node_modules/@stable-harness/adapter-langgraph/package.json +2 -2
- package/node_modules/@stable-harness/core/dist/index.d.ts +1 -0
- package/node_modules/@stable-harness/core/dist/index.js +1 -1
- package/node_modules/@stable-harness/core/dist/recovery/execution-contract.d.ts +2 -1
- package/node_modules/@stable-harness/core/dist/recovery/execution-contract.js +1 -1
- package/node_modules/@stable-harness/core/dist/recovery/raw-args.d.ts +9 -0
- package/node_modules/@stable-harness/core/dist/recovery/raw-args.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime/events.d.ts +61 -0
- package/node_modules/@stable-harness/core/dist/runtime/improvement/admin.d.ts +15 -0
- package/node_modules/@stable-harness/core/dist/runtime/improvement/admin.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/improvement/evidence-admin.d.ts +11 -0
- package/node_modules/@stable-harness/core/dist/runtime/improvement/evidence-admin.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/improvement/store.d.ts +2 -0
- package/node_modules/@stable-harness/core/dist/runtime/improvement/store.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/improvement/types.d.ts +120 -0
- package/node_modules/@stable-harness/core/dist/runtime/improvement/types.js +1 -0
- package/node_modules/@stable-harness/core/dist/runtime/recovery/adapter-result.js +1 -1
- package/node_modules/@stable-harness/core/dist/runtime.d.ts +2 -1
- package/node_modules/@stable-harness/core/dist/runtime.js +1 -1
- package/node_modules/@stable-harness/core/dist/trace.d.ts +1 -1
- package/node_modules/@stable-harness/core/dist/trace.js +1 -1
- package/node_modules/@stable-harness/core/dist/types.d.ts +12 -1
- package/node_modules/@stable-harness/core/package.json +3 -3
- package/node_modules/@stable-harness/governance/package.json +1 -1
- package/node_modules/@stable-harness/memory/package.json +1 -1
- package/node_modules/@stable-harness/protocols/dist/src/in-process-client.js +1 -1
- package/node_modules/@stable-harness/protocols/package.json +2 -2
- package/node_modules/@stable-harness/tool-gateway/package.json +1 -1
- package/node_modules/@stable-harness/workspace-yaml/package.json +2 -2
- package/package.json +9 -9
- package/packages/adapter-deepagents/package.json +2 -2
- package/packages/adapter-langgraph/package.json +2 -2
- package/packages/cli/package.json +8 -8
- package/packages/core/dist/index.d.ts +1 -0
- package/packages/core/dist/index.js +1 -1
- package/packages/core/dist/recovery/execution-contract.d.ts +2 -1
- package/packages/core/dist/recovery/execution-contract.js +1 -1
- package/packages/core/dist/recovery/raw-args.d.ts +9 -0
- package/packages/core/dist/recovery/raw-args.js +1 -1
- package/packages/core/dist/runtime/events.d.ts +61 -0
- package/packages/core/dist/runtime/improvement/admin.d.ts +15 -0
- package/packages/core/dist/runtime/improvement/admin.js +1 -0
- package/packages/core/dist/runtime/improvement/evidence-admin.d.ts +11 -0
- package/packages/core/dist/runtime/improvement/evidence-admin.js +1 -0
- package/packages/core/dist/runtime/improvement/store.d.ts +2 -0
- package/packages/core/dist/runtime/improvement/store.js +1 -0
- package/packages/core/dist/runtime/improvement/types.d.ts +120 -0
- package/packages/core/dist/runtime/improvement/types.js +1 -0
- package/packages/core/dist/runtime/recovery/adapter-result.js +1 -1
- package/packages/core/dist/runtime.d.ts +2 -1
- package/packages/core/dist/runtime.js +1 -1
- package/packages/core/dist/trace.d.ts +1 -1
- package/packages/core/dist/trace.js +1 -1
- package/packages/core/dist/types.d.ts +12 -1
- package/packages/core/package.json +3 -3
- package/packages/evaluation/package.json +2 -2
- package/packages/governance/package.json +1 -1
- package/packages/memory/package.json +1 -1
- package/packages/protocols/dist/src/in-process-client.js +1 -1
- package/packages/protocols/package.json +2 -2
- package/packages/tool-gateway/package.json +1 -1
- package/packages/workspace-yaml/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{assertNoDeclaredActionOmissionOutput as e}from"../../recovery/control-omission.js";import{containsProgressOnlyToolIntent as t}from"../../recovery/progress-intent.js";import{buildRawArgsRecoveryRequest as o,buildRawArgsToolEvidenceRecoveryRequest as r,
|
|
1
|
+
import{assertNoDeclaredActionOmissionOutput as e}from"../../recovery/control-omission.js";import{containsProgressOnlyToolIntent as t}from"../../recovery/progress-intent.js";import{buildRawArgsRecoveryRequest as o,buildRawArgsToolEvidenceRecoveryRequest as r,buildRawArgsToolSequenceEvidenceRecoveryRequest as a,hasUniqueRawArgsTool as s,matchRawArgsToolSequence as n,matchUniqueRawArgsTool as l}from"../../recovery/raw-args.js";import{assertNoProgressOnlyToolIntentOutput as u,assertNoRawToolCallOutput as c,assertNoRawToolResultOutput as i,assertNoStructurallyIncompleteFinalOutput as d,assertNoToolExecutionErrorOutput as y,buildEvidenceSynthesisOutput as p,buildResultRecoveryRequest as v,containsRawToolCallOutput as g,rawToolCallFailureMessage as m,rawToolCallOutputPreview as w,toolCallRecoveryEnabled as f}from"../../recovery/tool-call.js";import{controlGaps as R}from"../../quality/event-evidence.js";export async function recoverAdapterResultOutput(t){let r=t.result,a=t.request;const n=function resultRecoveryAttempts(e){const t="object"!=typeof e||null===e||Array.isArray(e)?void 0:e.recovery,o="object"!=typeof t||null===t||Array.isArray(t)?void 0:t.toolCall,r="object"!=typeof o||null===o||Array.isArray(o)?void 0:o.maxResultRecoveryAttempts;return"number"==typeof r&&Number.isInteger(r)&&r>0?r:3}(t.recoveryPolicy),R=new Set,_=new Set;for(let e=0;;e+=1){const s=t.store.getRun(t.requestId)?.events??[],u=effectiveRecoveryToolIds(a,t.agent.tools);assertNoNonFocusedRecoveryIntent(r.text,t.recoveryPolicy,t.agent.tools,u);const c=await recoverRawArgsSequenceByToolGateway(t,a,r,_,e+1,u);if(c){a=c.request,r=c.result;continue}const i=l({output:r.text,agent:t.agent,workspace:t.workspace,toolGateway:t.toolGateway,events:s,candidateToolIds:u,policy:t.recoveryPolicy}),d=i?rawArgsToolKey(i):void 0;if(i&&d&&_.size>0&&!_.has(d)){const o=await recoverRawArgsByToolGateway(t,a,r,i,_,e+1);if(o){a=o.request,r=o.result;continue}}const y=d&&!R.has(d)?o({request:a,output:r.text,agent:t.agent,workspace:t.workspace,toolGateway:t.toolGateway,events:s,candidateToolIds:u,policy:t.recoveryPolicy}):void 0,p=e<n?v({request:a,output:r.text,events:s,availableToolIds:u,policy:t.recoveryPolicy}):void 0,g=y??p;if(!g)break;if(g===y&&R.add(d),a=g,emitRepair(t,"runtime.repair.started","result_output",e+1,"recoverable_result_output",void 0,repairDiagnostics(r.text,u)),r=await t.runAdapter(g),emitRepair(t,"runtime.repair.completed","result_output",e+1,"recoverable_result_output","retried",repairDiagnostics(r.text,u)),g===y){const o=await recoverRepeatedRawArgsByToolGateway(t,a,r,R,_,e+1);o&&(a=o.request,r=o.result)}}return function finalizeRecoveredOutput(t,o){if(!f(t.recoveryPolicy))return o;let r=!1;if(g(o.text,t.recoveryPolicy)&&function rawToolCallFailureReturnsMessage(e){return"message"===("object"!=typeof e?.toolCallRecovery||null===e.toolCallRecovery||Array.isArray(e.toolCallRecovery)?{}:e.toolCallRecovery).onFailure}(t.request.metadata)){const e=o.text;o={...o,text:m(),metadata:{...o.metadata,toolCallRecovery:{failed:!0,reason:"raw_tool_call_output"}}},emitRepair(t,"runtime.repair.completed","result_output",void 0,"raw_tool_call_output","blocked",repairDiagnostics(e,t.agent.tools))}const a=p({request:t.request,output:o.text,events:t.store.getRun(t.requestId)?.events??[],policy:t.recoveryPolicy});return a&&(r=!0,o={...o,text:a,metadata:{...o.metadata,toolCallRecovery:{synthesized:!0,reason:"raw_tool_call_output_with_evidence"}}},emitRepair(t,"runtime.repair.completed","evidence_synthesis",void 0,"raw_tool_call_output_with_evidence","synthesized")),r||(g(o.text,t.recoveryPolicy)&&emitRepair(t,"runtime.repair.completed","result_output",void 0,"raw_tool_call_output","blocked",repairDiagnostics(o.text,t.agent.tools)),c(o.text,t.recoveryPolicy),function assertNoRawArgsToolOutput(e,t){if(s({output:t,agent:e.agent,workspace:e.workspace,toolGateway:e.toolGateway,events:e.store.getRun(e.requestId)?.events??[],candidateToolIds:effectiveRecoveryToolIds(e.request,e.agent.tools),policy:e.recoveryPolicy}))throw new Error(`Adapter returned raw tool argument JSON as the final answer after recovery. The backend must execute the matching tool instead. Output preview: ${w(t)}`)}(t,o.text),u(o.text,t.agent.tools,t.recoveryPolicy),i(o.text,t.store.getRun(t.requestId)?.events??[],t.recoveryPolicy),y(o.text,t.recoveryPolicy),d(o.text,t.recoveryPolicy),e({output:o.text,events:t.store.getRun(t.requestId)?.events??[],availableToolIds:t.agent.tools})),o}(t,r)}async function recoverRawArgsSequenceByToolGateway(e,t,o,r,s,l){if(!e.runRecoveredToolCall)return;const u=n({output:o.text,agent:e.agent,workspace:e.workspace,toolGateway:e.toolGateway,events:e.store.getRun(e.requestId)?.events??[],candidateToolIds:l,policy:e.recoveryPolicy});if(u.length<2||u.some(e=>r.has(rawArgsToolKey(e))))return;emitRepair(e,"runtime.repair.started","result_output",s,"raw_args_tool_sequence_gateway_recovery",void 0,repairDiagnostics(o.text,l));const c=[];for(const t of u){r.add(rawArgsToolKey(t));const o=await e.runRecoveredToolCall(t.toolId,t.args);c.push({match:t,toolOutput:visibleRecoveredToolOutput(o)})}const i=a({request:t,evidences:c}),d=await e.runAdapter(i),y=d.text.trim()?d:{...d,text:buildEmptyRecoveredToolSequenceBlocker({evidences:c,events:e.store.getRun(e.requestId)?.events??[]}),metadata:{...d.metadata,toolCallRecovery:{blocked:!0,reason:"empty_output_after_recovered_tool_sequence"}}};return emitRepair(e,"runtime.repair.completed","result_output",s,"raw_args_tool_sequence_gateway_recovery","retried",repairDiagnostics(y.text,l)),{request:i,result:y}}async function recoverRepeatedRawArgsByToolGateway(e,t,o,r,a,s){const n=l({output:o.text,agent:e.agent,workspace:e.workspace,toolGateway:e.toolGateway,events:e.store.getRun(e.requestId)?.events??[],candidateToolIds:effectiveRecoveryToolIds(t,e.agent.tools),policy:e.recoveryPolicy});if(!n||!e.runRecoveredToolCall)return;const u=rawArgsToolKey(n);return r.has(u)&&!a.has(u)?recoverRawArgsByToolGateway(e,t,o,n,a,s):void 0}async function recoverRawArgsByToolGateway(e,t,o,a,s,n){if(!e.runRecoveredToolCall)return;const l=rawArgsToolKey(a);if(s.has(l))return;s.add(l),emitRepair(e,"runtime.repair.started","result_output",n,"raw_args_tool_gateway_recovery",void 0,repairDiagnostics(o.text,e.agent.tools));const u=visibleRecoveredToolOutput(await e.runRecoveredToolCall(a.toolId,a.args)),c=r({request:t,match:a,toolOutput:u}),i=await e.runAdapter(c),d=i.text.trim()?i:{...i,text:buildEmptyRecoveredToolBlocker({match:a,toolOutput:u,events:e.store.getRun(e.requestId)?.events??[]}),metadata:{...i.metadata,toolCallRecovery:{blocked:!0,reason:"empty_output_after_recovered_tool"}}};return emitRepair(e,"runtime.repair.completed","result_output",n,"raw_args_tool_gateway_recovery","retried",repairDiagnostics(d.text,e.agent.tools)),{request:c,result:d}}function assertNoNonFocusedRecoveryIntent(e,o,r,a){if(0===a.length||a.length===r.length)return;const s=new Set(a),n=visibleToolCandidates(e,r).filter(e=>!s.has(e)),l=g(e,o)||t(e,r)||function containsJsonToolEnvelope(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)return!1;try{const e=JSON.parse(r);if(!function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}(e))return!1;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}catch{return!1}}(e);if(n.length>0&&l)throw new Error(`Focused recovery output referenced non-focused tool(s): ${n.join(", ")}. The backend must call one of the focused gateway tools: ${a.join(", ")}.`)}function emitRepair(e,t,o,r,a,s,n){const l={requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,layer:o,attempt:r,reason:a,...n?{diagnostics:n}:{}};e.emit("runtime.repair.started"===t?{type:t,...l}:{type:t,...l,outcome:s??"retried"})}function repairDiagnostics(e,t){return{outputPreview:w(e),toolCandidateIds:visibleToolCandidates(e,t)}}function visibleToolCandidates(e,t){const o=new Set;for(const r of t??[])new RegExp(`(?:^|[^A-Za-z0-9_-])${escapeRegexp(r)}(?:$|[^A-Za-z0-9_-])`,"u").test(e)&&o.add(r);return[...o]}function escapeRegexp(e){return e.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function effectiveRecoveryToolIds(e,t){const o=function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}(e.metadata?.stableHarnessRequiredEvidenceTools).filter(e=>t.includes(e));return o.length>0?o:t}function rawArgsToolKey(e){return`${e.toolId}:${JSON.stringify(e.args)}`}function visibleRecoveredToolOutput(e){return("string"==typeof e.text?e.text.trim():"")||"The recovered tool completed successfully but returned no user-visible output."}function buildEmptyRecoveredToolBlocker(e){const t=R(e.events);return["Stable runtime recovery executed the matched declared tool, but the backend returned no user-facing output after receiving the executed evidence.","",`Executed tool: ${e.match.toolId}`,"","Executed JSON arguments:",JSON.stringify(e.match.args),"","Executed tool evidence:",e.toolOutput,...t.length>0?["","Unresolved control gaps:",...t.map(e=>`- ${e}`)]:[]].join("\n")}function buildEmptyRecoveredToolSequenceBlocker(e){const t=R(e.events);return["Stable runtime recovery executed matched declared tools, but the backend returned no user-facing output after receiving the executed evidence.","",...e.evidences.flatMap((e,t)=>[`Executed tool ${t+1}: ${e.match.toolId}`,"Executed JSON arguments:",JSON.stringify(e.match.args),"Executed tool evidence:",e.toolOutput,""]),...t.length>0?["Unresolved control gaps:",...t.map(e=>`- ${e}`)]:[]].join("\n")}
|
|
@@ -3,7 +3,7 @@ import type { MemoryProvider, RuntimeMemoryStore } from "@stable-harness/memory"
|
|
|
3
3
|
import type { ExecutionEvaluatorRule, QualityReviewModel } from "./quality/index.js";
|
|
4
4
|
import type { ToolGuardrail } from "./runtime/policy/tool-invocation.js";
|
|
5
5
|
import { createLangSmithTracingCapability } from "./runtime/tracing/langsmith.js";
|
|
6
|
-
import type { CompiledWorkspace, RuntimeCapabilityModule, RuntimeToolGateway, RuntimeAdapter, RuntimeArtifactStore, RuntimeSandboxPolicy, RuntimeStore, RuntimeProgressNarrationOptions, RuntimeWorkflowAdapter, StableHarnessRuntime } from "./types.js";
|
|
6
|
+
import type { CompiledWorkspace, RuntimeCapabilityModule, RuntimeToolGateway, RuntimeAdapter, RuntimeArtifactStore, RuntimeImprovementStore, RuntimeSandboxPolicy, RuntimeStore, RuntimeProgressNarrationOptions, RuntimeWorkflowAdapter, StableHarnessRuntime } from "./types.js";
|
|
7
7
|
export type RuntimeFactoryInput = {
|
|
8
8
|
workspace: CompiledWorkspace;
|
|
9
9
|
adapters: RuntimeAdapter[];
|
|
@@ -15,6 +15,7 @@ export type RuntimeFactoryInput = {
|
|
|
15
15
|
sandbox?: RuntimeSandboxPolicy | false;
|
|
16
16
|
store?: RuntimeStore;
|
|
17
17
|
artifacts?: RuntimeArtifactStore;
|
|
18
|
+
improvements?: RuntimeImprovementStore;
|
|
18
19
|
progressNarration?: RuntimeProgressNarrationOptions | false;
|
|
19
20
|
qualityReviewModel?: QualityReviewModel;
|
|
20
21
|
toolGuardrails?: readonly ToolGuardrail[];
|
|
@@ -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
|
|
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 n,resolveQualityPolicy as s}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 g}from"./runtime/improvement/evidence-admin.js";import{createInMemoryRuntimeImprovementStore as y}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??y(),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: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 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 n=e.adapters.find(e=>e.canRun(o));if(!n)throw new Error(`No runtime adapter can run backend ${o.backend} for agent ${o.id}`);return{agent:o,adapter:n}}(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=s(e.input.workspace.runtime,e.agent),w=new Map;let g;try{g=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))),g=await runAdapterOnce(e,t,a(e.request,r,d),p,m,w,d),e.emit(repairCompleted(e,"adapter_error","retried",1,errorMessage(r)))}g=await i({...e,request:e.request,result:g,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)}),g=await n(createQualityRuntimeInput(e,p,m,w,d),e.request,g,l),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??[],agent:e.agent,policy:d});if(!o)throw a;e.emit(repairStarted(e,"execution_contract",1,errorMessage(a))),g=await runAdapterOnce(e,t,o,p,m,w,d),g=await i({...e,request:o,result:g,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)}),g=await n(createQualityRuntimeInput(e,p,m,w,d),o,g,l),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: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}),...g({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:n=>runAdapterOnce(e,e.adapter,n,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,n,s){return q(await t.run({workspace:{...e.input.workspace,runtime:s},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:n,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 {
|
|
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.
|
|
3
|
+
"version": "0.0.126",
|
|
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.
|
|
16
|
-
"@stable-harness/memory": "0.0.
|
|
15
|
+
"@stable-harness/governance": "0.0.126",
|
|
16
|
+
"@stable-harness/memory": "0.0.126"
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -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,
|
|
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.
|
|
3
|
+
"version": "0.0.126",
|
|
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.
|
|
14
|
+
"@stable-harness/core": "0.0.126"
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/workspace-yaml",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.126",
|
|
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.
|
|
15
|
+
"@stable-harness/core": "0.0.126"
|
|
16
16
|
}
|
|
17
17
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stable-harness",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.126",
|
|
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.
|
|
86
|
-
"@stable-harness/adapter-langgraph": "0.0.
|
|
87
|
-
"@stable-harness/core": "0.0.
|
|
88
|
-
"@stable-harness/governance": "0.0.
|
|
89
|
-
"@stable-harness/memory": "0.0.
|
|
90
|
-
"@stable-harness/protocols": "0.0.
|
|
91
|
-
"@stable-harness/tool-gateway": "0.0.
|
|
92
|
-
"@stable-harness/workspace-yaml": "0.0.
|
|
85
|
+
"@stable-harness/adapter-deepagents": "0.0.126",
|
|
86
|
+
"@stable-harness/adapter-langgraph": "0.0.126",
|
|
87
|
+
"@stable-harness/core": "0.0.126",
|
|
88
|
+
"@stable-harness/governance": "0.0.126",
|
|
89
|
+
"@stable-harness/memory": "0.0.126",
|
|
90
|
+
"@stable-harness/protocols": "0.0.126",
|
|
91
|
+
"@stable-harness/tool-gateway": "0.0.126",
|
|
92
|
+
"@stable-harness/workspace-yaml": "0.0.126",
|
|
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.
|
|
3
|
+
"version": "0.0.126",
|
|
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.
|
|
19
|
+
"@stable-harness/core": "0.0.126",
|
|
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.
|
|
3
|
+
"version": "0.0.126",
|
|
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.
|
|
15
|
+
"@stable-harness/core": "0.0.126"
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.126",
|
|
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.
|
|
19
|
-
"@stable-harness/adapter-langgraph": "0.0.
|
|
20
|
-
"@stable-harness/core": "0.0.
|
|
21
|
-
"@stable-harness/memory": "0.0.
|
|
22
|
-
"@stable-harness/protocols": "0.0.
|
|
23
|
-
"@stable-harness/tool-gateway": "0.0.
|
|
24
|
-
"@stable-harness/workspace-yaml": "0.0.
|
|
18
|
+
"@stable-harness/adapter-deepagents": "0.0.126",
|
|
19
|
+
"@stable-harness/adapter-langgraph": "0.0.126",
|
|
20
|
+
"@stable-harness/core": "0.0.126",
|
|
21
|
+
"@stable-harness/memory": "0.0.126",
|
|
22
|
+
"@stable-harness/protocols": "0.0.126",
|
|
23
|
+
"@stable-harness/tool-gateway": "0.0.126",
|
|
24
|
+
"@stable-harness/workspace-yaml": "0.0.126"
|
|
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";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { RuntimeEvent, RuntimeRequest } from "../types.js";
|
|
1
|
+
import type { RuntimeEvent, RuntimeRequest, WorkspaceAgent } from "../types.js";
|
|
2
2
|
export declare function buildExecutionContractRecoveryRequest(input: {
|
|
3
3
|
request: RuntimeRequest;
|
|
4
4
|
events: RuntimeEvent[];
|
|
5
|
+
agent: WorkspaceAgent;
|
|
5
6
|
policy: unknown;
|
|
6
7
|
}): RuntimeRequest | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{successfulEvidenceItems as e}from"../quality/event-evidence.js";export function buildExecutionContractRecoveryRequest(
|
|
1
|
+
import{successfulEvidenceItems as e}from"../quality/event-evidence.js";export function buildExecutionContractRecoveryRequest(t){if(!0!==function readToolCallRecovery(e){if(!isRecord(e))return{};const t=isRecord(e.recovery)?e.recovery:{};return isRecord(t.toolCall)?t.toolCall:{}}(t.policy).enabled)return;const n=function lastExecutionContractFailure(e){for(let t=e.length-1;t>=0;t-=1){const n=e[t];if("runtime.execution.contract.failed"===n?.type)return{reason:n.reason,missing:readStringArray(n.missingEvidenceTools)}}return{missing:[]}}(t.events);if(0===n.missing.length)return;if("missing_required_evidence_usage"===n.reason){const e=recentSuccessfulEvidence(t.events);return recoverRequest(t.request,["Stable runtime recovery: the execution contract was not satisfied.",`The final answer did not use required executed evidence from: ${n.missing.join(", ")}`,"Synthesize from those required source(s), or call them through normal structured tool calling if their evidence is unavailable.","Do not replace required evidence with unrelated intermediate evidence, progress text, or summaries from other tools.",...e.length>0?["","Prior successful tool evidence:",...e]:[]])}const r=recentSuccessfulEvidence(t.events),o=function recoveryToolTargets(t,n,r){const o=function readToolDependencies(e){return isRecord(e)?new Map(Object.entries(e).map(([e,t])=>[e,readStringArray(t)]).filter(e=>e[1].length>0)):new Map}(function readExecutionContract(e){return isRecord(e.config.executionContract)?e.config.executionContract:{}}(t).toolDependencies),i=new Set(e(r).map(e=>e.source)),s=new Set;for(const e of n)s.add(e),collectUnmetDependencies(e,o,i,s,new Set([e]));return[...s].filter(e=>t.tools.includes(e))}(t.agent,n.missing,t.events);return recoverRequest(t.request,["Stable runtime recovery: the execution contract was not satisfied.",`Required evidence tool(s) were missing: ${n.missing.join(", ")}`,`For this recovery turn, the allowed next tool call target(s) are: ${o.join(", ")}`,"Allowed targets include missing required evidence tools and any declared dependency tools that are still needed to build valid arguments.","Reuse exact values from prior successful tool evidence when building the required tool call. Do not invent replacement paths, IDs, handles, URLs, or parameters.","The next assistant action must be the backend's structured tool call for one allowed target, with no prose before it.","Do not call already completed intermediate tools unless they are listed above.","Do not produce a final answer until the required evidence tool call has executed and you have synthesized its result.","Do not print XML, JSON, markdown fences, pseudo tool-call text, plans, or future-intent text in the final answer.",...r.length>0?["","Prior successful tool evidence:",...r]:[]],{stableHarnessRequiredEvidenceTools:o})}function recoverRequest(e,t,n={}){return{...e,input:[e.input,"",...t].join("\n"),metadata:{...e.metadata,stableHarnessRecovery:"tool_call",...n}}}function collectUnmetDependencies(e,t,n,r,o){for(const i of t.get(e)??[])o.has(i)||(o.add(i),n.has(i)||r.add(i),collectUnmetDependencies(i,t,n,r,o))}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}function recentSuccessfulEvidence(t){return e(t).slice(-5).map(e=>`- ${e.source}: ${function previewEvidence(e){const t=e.replace(/\s+/gu," ").trim();return t.length>1500?`${t.slice(0,1497)}...`:t}(e.output)}`)}
|
|
@@ -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
|
|
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 o=parseStandaloneJsonValues(t.output,{allowArray:!1})[0];if(!o)return;const r=matchToolEnvelope(o,t);if(r)return r;const n=isRawArgsRecord(o)?o:void 0;if(!n)return;const a=e({args:n,candidates:buildCallCandidates(t)});if(a.ok)return{toolId:a.candidateId,args:a.args};const s=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 s?{toolId:s,args:n}:void 0}export function matchRawArgsToolSequence(t){if(!toolCallRecoveryEnabled(t.policy))return[];const o=parseStandaloneJsonValues(t.output,{allowArray:!0});if(o.length<2)return[];const r=buildCallCandidates(t),n=[];for(const a of o){const o=matchToolEnvelope(a,t);if(o){n.push(o);continue}if(!isRawArgsRecord(a))return[];const s=e({args:a,candidates:r});if(!s.ok)return[];n.push({toolId:s.candidateId,args:s.args})}return n}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 parseStandaloneJsonValues(e,t){const o=e.trim(),r=o.match(/^```(?:json)?\s*\n([\s\S]*?)\n```$/iu)?.[1]?.trim(),n=r??o;if(n.length>6e3)return[];if(!(t.allowArray||n.startsWith("{")&&n.endsWith("}")))return[];if(t.allowArray&&!(n.startsWith("{")&&n.endsWith("}")||n.startsWith("[")&&n.endsWith("]")))return[];try{const e=JSON.parse(n);return Array.isArray(e)&&t.allowArray?e:[e]}catch{return[]}}function matchToolEnvelope(e,t){if(!isRecord(e))return;const o=function readEnvelopeToolId(e){const t=["toolId","toolName","tool","tool_name","name"].map(t=>e[t]).filter(e=>"string"==typeof e&&e.length>0);return 1===new Set(t).size?t[0]:void 0}(e),r=function readEnvelopeArgs(e){for(const t of["args","arguments","parameters","params","kwargs"]){const o=e[t];if(isRecord(o))return o}}(e),n=candidateToolIds(t);return o&&r&&n.includes(o)?{toolId:o,args:r}:void 0}function isRawArgsRecord(e){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)}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
|
+
};
|