stable-harness 0.0.130 → 0.0.131

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/adapter-deepagents",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
19
+ "@stable-harness/core": "0.0.131",
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.130",
3
+ "version": "0.0.131",
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.130"
15
+ "@stable-harness/core": "0.0.131"
16
16
  }
17
17
  }
@@ -1 +1 @@
1
- export function hasPlanningEvidence(t){return t.some(t=>{const e=readAdapterEvent(t);return!!e&&("plan"===e.traceType||String(e.traceLabel??"").startsWith("plan.")||"write_todos"===e.toolId&&String(e.phase??"").startsWith("agent.tool."))})}export function successfulEvidenceToolIds(t){const e=t.flatMap(t=>{if("runtime.tool.direct.completed"===t.type)return[t.toolId];const e=readAdapterEvent(t);return isToolResultEvent(e)&&"string"==typeof e.toolId&&isSuccessfulEvidenceEvent(e)?[e.toolId]:[]});return[...new Set(e)]}export function successfulEvidenceOutputs(t){return successfulEvidenceItems(t).map(t=>t.output)}export function successfulEvidenceItems(t){return t.flatMap(t=>{if("runtime.tool.direct.completed"===t.type)return stringifyEvidence(t.output).map(e=>({source:t.toolId,output:e}));const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n?!isSuccessfulEvidenceEvent(e)||function isPlanningTool(t){return"write_todos"===t||"read_todos"===t}(n)?[]:stringifyEvidence(e.evidenceOutput??e.output).filter(t=>function isUsableEvidenceOutput(t,e){return!("task"===t&&function looksLikeUnexecutedToolIntent(t){const e=t.trim();if(e.length>4e3)return!1;const n=function extractJsonSource(t){const e=t.trim();if(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]"))return e;if(!e.startsWith("```"))return;const n=e.indexOf("\n"),r=e.lastIndexOf("```");return n<0||r<=n?void 0:e.slice(n+1,r).trim()}(e);return n?function containsToolEnvelope(t){try{const e=JSON.parse(t);return Array.isArray(e)?e.some(isToolEnvelopeRecord):isToolEnvelopeRecord(e)}catch{return!1}}(n):function containsToolMarkup(t){const e=t.toLowerCase();return e.includes("<tool_call")||e.includes("</tool_call")||e.includes("<tool_code")||e.includes("</tool_code")}(e)||function containsBareToolFence(t){const e=t.trim(),n=e.indexOf("```");if(n<0||e.indexOf("```",n+3)!==e.lastIndexOf("```"))return!1;const r=e.indexOf("\n",n+3),o=e.lastIndexOf("```");return!(r<0||o<=r)&&function isIdentifierPath(t){return t.length>0&&[...t].every((t,e)=>{const n=t>="A"&&t<="Z"||t>="a"&&t<="z"||"_"===t;return 0===e?n:n||t>="0"&&t<="9"||"."===t||"-"===t})}(e.slice(r+1,o).trim())}(e)}(e))}(n,t)).map(t=>({source:n,output:t})):[]})}export function controlBlockers(t){const e=successfulEventIndexesBySource(t);return t.flatMap((t,n)=>{const r=readAdapterEvent(t),o=readControlStatus(r),s=readControlSource(r)??"tool";return o&&isBlockerStatus(o)?isResolvedByLaterCompletion(o)&&completedAfter(e,s,n)||isResolvedByLaterAnyCompletion(o)&&completedAfterAny(e,n)?[]:[`${s}:${o}`]:[]})}export function controlGaps(t){const e=new Set(successfulEvidenceItems(t).map(t=>t.source));return t.flatMap(t=>{const n=readAdapterEvent(t),r=readControlStatus(n),o=readControlSource(n)??"tool";return r&&isGapStatus(r)?e.has(o)&&isResolvedByLaterCompletion(r)?[]:[`${o}:${r}`]:[]})}export function omittedControlGaps(t,e){const n=successfulEventIndexesBySource(t),r=successfulEvidenceItems(t),o=function outputHasUnsupportedEvidenceClaims(t,e,n){const r=function evidenceCorpus(t,e){return[...e.map(t=>t.output),...t.flatMap(t=>"runtime.request.started"===t.type?[t.input??""]:[]),...t.flatMap(t=>"runtime.memory.recall.completed"===t.type?[t.context]:[])].join("\n")}(e,n).toLowerCase();return unsupportedTokens(t,r,/\b[A-Z][A-Z0-9]{1,12}-\d+\b/gu).length>0||unsupportedTokens(t,r,/\b[A-Za-z_$][A-Za-z0-9_$]*[A-Z][A-Za-z0-9_$]*\b/gu).filter(isCodeLikeIdentifier).length>=2}(e,t,r);return t.flatMap((t,s)=>{const u=readAdapterEvent(t),i=readControlStatus(u),a=readControlSource(u)??"tool";return i&&function isOmittedControlStatus(t){return isGapStatus(t)||isBlockerStatus(t)}(i)?isResolvedByLaterCompletion(i)&&completedAfter(n,a,s)||isResolvedByLaterAnyCompletion(i)&&completedAfterAny(n,s)||!o&&outputUsesPriorEvidence(e,a,r)?[]:[`${a}:${i}`]:[]})}function stringifyEvidence(t){return"string"==typeof t?t.trim()?[t]:[]:null==t?[]:[JSON.stringify(t)]}function isToolEnvelopeRecord(t){return!!isRecord(t)&&["tool","toolId","toolName","tool_name","name","type","subagent_type"].some(e=>"string"==typeof t[e])&&["args","arguments","parameters","params","kwargs","task"].some(e=>e in t)}function readAdapterEvent(t){if("runtime.adapter.event"===t.type&&isRecord(t.event))return t.event;const e=t;return isRecord(e)&&isToolResultEvent(e)?e:void 0}function isSuccessfulEvidenceEvent(t){const e=readEventStatus(t);return!e||/^(?:completed|success|ok|recorded)$/iu.test(e)}function isBlockerStatus(t){return/^(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked)$/iu.test(t)}function isGapStatus(t){return/^(?:dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)$/iu.test(t)}function isResolvedByLaterCompletion(t){return isGapStatus(t)||isBlockerStatus(t)}function isResolvedByLaterAnyCompletion(t){return"task_inventory_blocked"===t}function successfulEventIndexesBySource(t){const e=new Map;return t.forEach((t,n)=>{const r=function successfulEventSource(t){if("runtime.tool.direct.completed"===t.type)return t.toolId;const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n&&isSuccessfulEvidenceEvent(e)?n:void 0}(t);r&&e.set(r,[...e.get(r)??[],n])}),e}function isToolResultEvent(t){return"deepagents.tool_execution.result"===t?.eventType||"agent.tool.result"===t?.phase||"agent.tool.result"===t?.type||"deepagents.tool_execution.result"===t?.type}function completedAfter(t,e,n){return(t.get(e)??[]).some(t=>t>n)}function completedAfterAny(t,e){return[...t.values()].some(t=>t.some(t=>t>e))}export function outputUsesPriorEvidence(t,e,n){const r=t.toLowerCase();return n.filter(t=>t.source===e).some(t=>{const e=t.output.trim();return!!e&&(!!r.includes(e.slice(0,500).toLowerCase())||function matchingEvidenceTokens(t,e){const n=new Set(["status","completed","success","recorded"]);return[...new Set(e.toLowerCase().match(/[a-z0-9][a-z0-9_.-]{1,}/gu)??[])].filter(t=>!n.has(t)).filter(e=>t.includes(e)).length}(r,e)>=2)})}function unsupportedTokens(t,e,n){return[...new Set(t.match(n)??[])].filter(t=>!e.includes(t.toLowerCase()))}function isCodeLikeIdentifier(t){return!(t.length<8)&&(/(?:Service|Controller|Repository|Manager|Client|Resolver|Agent|Tool|Async)$/u.test(t)||/[a-z][A-Z]/u.test(t))}function readOutputStatus(t){if(isRecord(t)&&"string"==typeof t.status)return t.status;if("string"==typeof t){const e=parseJsonRecord(t);return"string"==typeof e?.status?e.status:t.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1]}}function parseJsonRecord(t){try{const e=JSON.parse(t);return isRecord(e)?e:void 0}catch{return}}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}function readEventStatus(t){return readString(t?.controlStatus)??readString(t?.status)??readOutputStatus(t?.output)}function readToolSource(t){return readString(t?.toolId)??readString(t?.toolName)??readString(t?.name)}function readControlStatus(t){const e=function readInventoryRepairControlStatus(t){if("inventory.repair"===t?.phase&&"blocked"===t.status)return"task"===readInventoryRepairSource(t)?"task_inventory_blocked":"blocked"}(t);if(e)return e;const n=readEventStatus(t);return n&&isControlStatus(n)?n:findNestedControlStatus(t)}function readControlSource(t){return readToolSource(t)??readInventoryRepairSource(t)??findNestedToolSource(t)}function isControlStatus(t){return isGapStatus(t)||isBlockerStatus(t)}function findNestedControlStatus(t,e=0){if(e>5||null==t)return;if("string"==typeof t)return function readNestedStringStatus(t,e){const n=parseJsonRecord(t);if(n)return findNestedControlStatus(n,e+1);const r=t.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1];return r&&isControlStatus(r)?r:function readControlToken(t){const e=t.match(/\b(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked|dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)\b/iu)?.[0];return e&&isControlStatus(e)?e:void 0}(t)}(t,e);if(Array.isArray(t))return findFirstNested(t,t=>findNestedControlStatus(t,e+1));if(!isRecord(t))return;const n=readString(t.controlStatus)??readString(t.status);if(n&&isControlStatus(n))return n;const r=readOutputStatus(t.output);return r&&isControlStatus(r)?r:findFirstNested(Object.values(t),t=>findNestedControlStatus(t,e+1))}function findNestedToolSource(t,e=0){if(!(e>5||null==t)){if("string"==typeof t)return function readToolSourceFromText(t){const e=t.match(/["'](?:toolId|toolName|name)["']\s*:\s*["']([^"']+)["']/u)?.[1];return readString(e)}(t);if(Array.isArray(t))return findFirstNested(t,t=>findNestedToolSource(t,e+1));if(isRecord(t))return(readString(t.toolId)??readString(t.toolName)??readString(t.name))||findFirstNested(Object.values(t),t=>findNestedToolSource(t,e+1))}}function findFirstNested(t,e){for(const n of t){const t=e(n);if(void 0!==t)return t}}function readInventoryRepairSource(t){const e=isRecord(t?.diagnostic)?t.diagnostic:void 0;return readString(e?.layer)}
1
+ export function hasPlanningEvidence(t){return t.some(t=>{const e=readAdapterEvent(t);return!!e&&("plan"===e.traceType||String(e.traceLabel??"").startsWith("plan.")||"write_todos"===e.toolId&&String(e.phase??"").startsWith("agent.tool."))})}export function successfulEvidenceToolIds(t){const e=t.flatMap(t=>{if("runtime.tool.direct.completed"===t.type)return[t.toolId];const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n&&isSuccessfulEvidenceEvent(e)?[n]:[]});return[...new Set(e)]}export function successfulEvidenceOutputs(t){return successfulEvidenceItems(t).map(t=>t.output)}export function successfulEvidenceItems(t){return t.flatMap(t=>{if("runtime.tool.direct.completed"===t.type)return stringifyEvidence(t.output).map(e=>({source:t.toolId,output:e}));const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n?!isSuccessfulEvidenceEvent(e)||function isPlanningTool(t){return"write_todos"===t||"read_todos"===t}(n)?[]:stringifyEvidence(e.evidenceOutput??e.output).filter(t=>function isUsableEvidenceOutput(t,e){return!("task"===t&&function looksLikeUnexecutedToolIntent(t){const e=t.trim();if(e.length>4e3)return!1;const n=function extractJsonSource(t){const e=t.trim();if(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]"))return e;if(!e.startsWith("```"))return;const n=e.indexOf("\n"),r=e.lastIndexOf("```");return n<0||r<=n?void 0:e.slice(n+1,r).trim()}(e);return n?function containsToolEnvelope(t){try{const e=JSON.parse(t);return Array.isArray(e)?e.some(isToolEnvelopeRecord):isToolEnvelopeRecord(e)}catch{return!1}}(n):function containsToolMarkup(t){const e=t.toLowerCase();return e.includes("<tool_call")||e.includes("</tool_call")||e.includes("<tool_code")||e.includes("</tool_code")}(e)||function containsBareToolFence(t){const e=t.trim(),n=e.indexOf("```");if(n<0||e.indexOf("```",n+3)!==e.lastIndexOf("```"))return!1;const r=e.indexOf("\n",n+3),o=e.lastIndexOf("```");return!(r<0||o<=r)&&function isIdentifierPath(t){return t.length>0&&[...t].every((t,e)=>{const n=t>="A"&&t<="Z"||t>="a"&&t<="z"||"_"===t;return 0===e?n:n||t>="0"&&t<="9"||"."===t||"-"===t})}(e.slice(r+1,o).trim())}(e)}(e))}(n,t)).map(t=>({source:n,output:t})):[]})}export function controlBlockers(t){const e=successfulEventIndexesBySource(t);return t.flatMap((t,n)=>{const r=readAdapterEvent(t),o=readControlStatus(r),s=readControlSource(r)??"tool";return o&&isBlockerStatus(o)?isResolvedByLaterCompletion(o)&&completedAfter(e,s,n)||isResolvedByLaterAnyCompletion(o)&&completedAfterAny(e,n)?[]:[`${s}:${o}`]:[]})}export function controlGaps(t){const e=new Set(successfulEvidenceItems(t).map(t=>t.source));return t.flatMap(t=>{const n=readAdapterEvent(t),r=readControlStatus(n),o=readControlSource(n)??"tool";return r&&isGapStatus(r)?e.has(o)&&isResolvedByLaterCompletion(r)?[]:[`${o}:${r}`]:[]})}export function omittedControlGaps(t,e){const n=successfulEventIndexesBySource(t),r=successfulEvidenceItems(t),o=function outputHasUnsupportedEvidenceClaims(t,e,n){const r=function evidenceCorpus(t,e){return[...e.map(t=>t.output),...t.flatMap(t=>"runtime.request.started"===t.type?[t.input??""]:[]),...t.flatMap(t=>"runtime.memory.recall.completed"===t.type?[t.context]:[])].join("\n")}(e,n).toLowerCase();return unsupportedTokens(t,r,/\b[A-Z][A-Z0-9]{1,12}-\d+\b/gu).length>0||unsupportedTokens(t,r,/\b[A-Za-z_$][A-Za-z0-9_$]*[A-Z][A-Za-z0-9_$]*\b/gu).filter(isCodeLikeIdentifier).length>=2}(e,t,r);return t.flatMap((t,s)=>{const u=readAdapterEvent(t),i=readControlStatus(u),a=readControlSource(u)??"tool";return i&&function isOmittedControlStatus(t){return isGapStatus(t)||isBlockerStatus(t)}(i)?isResolvedByLaterCompletion(i)&&completedAfter(n,a,s)||isResolvedByLaterAnyCompletion(i)&&completedAfterAny(n,s)||!o&&outputUsesPriorEvidence(e,a,r)?[]:[`${a}:${i}`]:[]})}function stringifyEvidence(t){return"string"==typeof t?t.trim()?[t]:[]:null==t?[]:[JSON.stringify(t)]}function isToolEnvelopeRecord(t){return!!isRecord(t)&&["tool","toolId","toolName","tool_name","name","type","subagent_type"].some(e=>"string"==typeof t[e])&&["args","arguments","parameters","params","kwargs","task"].some(e=>e in t)}function readAdapterEvent(t){if("runtime.adapter.event"===t.type&&isRecord(t.event))return t.event;const e=t;return isRecord(e)&&isToolResultEvent(e)?e:void 0}function isSuccessfulEvidenceEvent(t){const e=readEventStatus(t);return!e||/^(?:completed|success|ok|recorded)$/iu.test(e)}function isBlockerStatus(t){return/^(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked)$/iu.test(t)}function isGapStatus(t){return/^(?:dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)$/iu.test(t)}function isResolvedByLaterCompletion(t){return isGapStatus(t)||isBlockerStatus(t)}function isResolvedByLaterAnyCompletion(t){return"task_inventory_blocked"===t}function successfulEventIndexesBySource(t){const e=new Map;return t.forEach((t,n)=>{const r=function successfulEventSource(t){if("runtime.tool.direct.completed"===t.type)return t.toolId;const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n&&isSuccessfulEvidenceEvent(e)?n:void 0}(t);r&&e.set(r,[...e.get(r)??[],n])}),e}function isToolResultEvent(t){return"deepagents.tool_execution.result"===t?.eventType||"agent.tool.result"===t?.phase||"agent.tool.result"===t?.type||"deepagents.tool_execution.result"===t?.type}function completedAfter(t,e,n){return(t.get(e)??[]).some(t=>t>n)}function completedAfterAny(t,e){return[...t.values()].some(t=>t.some(t=>t>e))}export function outputUsesPriorEvidence(t,e,n){const r=t.toLowerCase();return n.filter(t=>t.source===e).some(t=>{const e=t.output.trim();return!!e&&(!!r.includes(e.slice(0,500).toLowerCase())||function matchingEvidenceTokens(t,e){const n=new Set(["status","completed","success","recorded"]);return[...new Set(e.toLowerCase().match(/[a-z0-9][a-z0-9_.-]{1,}/gu)??[])].filter(t=>!n.has(t)).filter(e=>t.includes(e)).length}(r,e)>=2)})}function unsupportedTokens(t,e,n){return[...new Set(t.match(n)??[])].filter(t=>!e.includes(t.toLowerCase()))}function isCodeLikeIdentifier(t){return!(t.length<8)&&(/(?:Service|Controller|Repository|Manager|Client|Resolver|Agent|Tool|Async)$/u.test(t)||/[a-z][A-Z]/u.test(t))}function readOutputStatus(t){if(isRecord(t)&&"string"==typeof t.status)return t.status;if("string"==typeof t){const e=parseJsonRecord(t);return"string"==typeof e?.status?e.status:t.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1]}}function parseJsonRecord(t){try{const e=JSON.parse(t);return isRecord(e)?e:void 0}catch{return}}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}function readEventStatus(t){return readString(t?.controlStatus)??readString(t?.status)??readOutputStatus(t?.output)}function readToolSource(t){return readString(t?.toolId)??readString(t?.toolName)??readString(t?.name)}function readControlStatus(t){const e=function readInventoryRepairControlStatus(t){if("inventory.repair"===t?.phase&&"blocked"===t.status)return"task"===readInventoryRepairSource(t)?"task_inventory_blocked":"blocked"}(t);if(e)return e;const n=readEventStatus(t);return n&&isControlStatus(n)?n:findNestedControlStatus(t)}function readControlSource(t){return readToolSource(t)??readInventoryRepairSource(t)??findNestedToolSource(t)}function isControlStatus(t){return isGapStatus(t)||isBlockerStatus(t)}function findNestedControlStatus(t,e=0){if(e>5||null==t)return;if("string"==typeof t)return function readNestedStringStatus(t,e){const n=parseJsonRecord(t);if(n)return findNestedControlStatus(n,e+1);const r=t.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1];return r&&isControlStatus(r)?r:function readControlToken(t){const e=t.match(/\b(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked|dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)\b/iu)?.[0];return e&&isControlStatus(e)?e:void 0}(t)}(t,e);if(Array.isArray(t))return findFirstNested(t,t=>findNestedControlStatus(t,e+1));if(!isRecord(t))return;const n=readString(t.controlStatus)??readString(t.status);if(n&&isControlStatus(n))return n;const r=readOutputStatus(t.output);return r&&isControlStatus(r)?r:findFirstNested(Object.values(t),t=>findNestedControlStatus(t,e+1))}function findNestedToolSource(t,e=0){if(!(e>5||null==t)){if("string"==typeof t)return function readToolSourceFromText(t){const e=t.match(/["'](?:toolId|toolName|name)["']\s*:\s*["']([^"']+)["']/u)?.[1];return readString(e)}(t);if(Array.isArray(t))return findFirstNested(t,t=>findNestedToolSource(t,e+1));if(isRecord(t))return(readString(t.toolId)??readString(t.toolName)??readString(t.name))||findFirstNested(Object.values(t),t=>findNestedToolSource(t,e+1))}}function findFirstNested(t,e){for(const n of t){const t=e(n);if(void 0!==t)return t}}function readInventoryRepairSource(t){const e=isRecord(t?.diagnostic)?t.diagnostic:void 0;return readString(e?.layer)}
@@ -1 +1 @@
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)}`)}
1
+ import{successfulEvidenceItems as e,successfulEvidenceToolIds as t}from"../quality/event-evidence.js";export function buildExecutionContractRecoveryRequest(e){if(!0!==function readToolCallRecovery(e){if(!isRecord(e))return{};const t=isRecord(e.recovery)?e.recovery:{};return isRecord(t.toolCall)?t.toolCall:{}}(e.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:[]}}(e.events);if(0===n.missing.length)return;if("missing_required_evidence_usage"===n.reason){const t=recentSuccessfulEvidence(e.events);return recoverRequest(e.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.",...t.length>0?["","Prior successful tool evidence:",...t]:[]])}const r=recentSuccessfulEvidence(e.events),o=function recoveryToolTargets(e,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:{}}(e).toolDependencies),i=new Set(t(r)),s=new Set;for(const e of n)s.add(e),collectUnmetDependencies(e,o,i,s,new Set([e]));return[...s].filter(t=>e.tools.includes(t))}(e.agent,n.missing,e.events);return recoverRequest(e.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)}`)}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/core",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
16
- "@stable-harness/memory": "0.0.130"
15
+ "@stable-harness/governance": "0.0.131",
16
+ "@stable-harness/memory": "0.0.131"
17
17
  }
18
18
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/governance",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
3
+ "version": "0.0.131",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/protocols",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130"
14
+ "@stable-harness/core": "0.0.131"
15
15
  }
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/tool-gateway",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
3
+ "version": "0.0.131",
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.130"
15
+ "@stable-harness/core": "0.0.131"
16
16
  }
17
17
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stable-harness",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
86
- "@stable-harness/adapter-langgraph": "0.0.130",
87
- "@stable-harness/core": "0.0.130",
88
- "@stable-harness/governance": "0.0.130",
89
- "@stable-harness/memory": "0.0.130",
90
- "@stable-harness/protocols": "0.0.130",
91
- "@stable-harness/tool-gateway": "0.0.130",
92
- "@stable-harness/workspace-yaml": "0.0.130",
85
+ "@stable-harness/adapter-deepagents": "0.0.131",
86
+ "@stable-harness/adapter-langgraph": "0.0.131",
87
+ "@stable-harness/core": "0.0.131",
88
+ "@stable-harness/governance": "0.0.131",
89
+ "@stable-harness/memory": "0.0.131",
90
+ "@stable-harness/protocols": "0.0.131",
91
+ "@stable-harness/tool-gateway": "0.0.131",
92
+ "@stable-harness/workspace-yaml": "0.0.131",
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.130",
3
+ "version": "0.0.131",
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.130",
19
+ "@stable-harness/core": "0.0.131",
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.130",
3
+ "version": "0.0.131",
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.130"
15
+ "@stable-harness/core": "0.0.131"
16
16
  }
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/cli",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
19
- "@stable-harness/adapter-langgraph": "0.0.130",
20
- "@stable-harness/core": "0.0.130",
21
- "@stable-harness/memory": "0.0.130",
22
- "@stable-harness/protocols": "0.0.130",
23
- "@stable-harness/tool-gateway": "0.0.130",
24
- "@stable-harness/workspace-yaml": "0.0.130"
18
+ "@stable-harness/adapter-deepagents": "0.0.131",
19
+ "@stable-harness/adapter-langgraph": "0.0.131",
20
+ "@stable-harness/core": "0.0.131",
21
+ "@stable-harness/memory": "0.0.131",
22
+ "@stable-harness/protocols": "0.0.131",
23
+ "@stable-harness/tool-gateway": "0.0.131",
24
+ "@stable-harness/workspace-yaml": "0.0.131"
25
25
  }
26
26
  }
@@ -1 +1 @@
1
- export function hasPlanningEvidence(t){return t.some(t=>{const e=readAdapterEvent(t);return!!e&&("plan"===e.traceType||String(e.traceLabel??"").startsWith("plan.")||"write_todos"===e.toolId&&String(e.phase??"").startsWith("agent.tool."))})}export function successfulEvidenceToolIds(t){const e=t.flatMap(t=>{if("runtime.tool.direct.completed"===t.type)return[t.toolId];const e=readAdapterEvent(t);return isToolResultEvent(e)&&"string"==typeof e.toolId&&isSuccessfulEvidenceEvent(e)?[e.toolId]:[]});return[...new Set(e)]}export function successfulEvidenceOutputs(t){return successfulEvidenceItems(t).map(t=>t.output)}export function successfulEvidenceItems(t){return t.flatMap(t=>{if("runtime.tool.direct.completed"===t.type)return stringifyEvidence(t.output).map(e=>({source:t.toolId,output:e}));const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n?!isSuccessfulEvidenceEvent(e)||function isPlanningTool(t){return"write_todos"===t||"read_todos"===t}(n)?[]:stringifyEvidence(e.evidenceOutput??e.output).filter(t=>function isUsableEvidenceOutput(t,e){return!("task"===t&&function looksLikeUnexecutedToolIntent(t){const e=t.trim();if(e.length>4e3)return!1;const n=function extractJsonSource(t){const e=t.trim();if(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]"))return e;if(!e.startsWith("```"))return;const n=e.indexOf("\n"),r=e.lastIndexOf("```");return n<0||r<=n?void 0:e.slice(n+1,r).trim()}(e);return n?function containsToolEnvelope(t){try{const e=JSON.parse(t);return Array.isArray(e)?e.some(isToolEnvelopeRecord):isToolEnvelopeRecord(e)}catch{return!1}}(n):function containsToolMarkup(t){const e=t.toLowerCase();return e.includes("<tool_call")||e.includes("</tool_call")||e.includes("<tool_code")||e.includes("</tool_code")}(e)||function containsBareToolFence(t){const e=t.trim(),n=e.indexOf("```");if(n<0||e.indexOf("```",n+3)!==e.lastIndexOf("```"))return!1;const r=e.indexOf("\n",n+3),o=e.lastIndexOf("```");return!(r<0||o<=r)&&function isIdentifierPath(t){return t.length>0&&[...t].every((t,e)=>{const n=t>="A"&&t<="Z"||t>="a"&&t<="z"||"_"===t;return 0===e?n:n||t>="0"&&t<="9"||"."===t||"-"===t})}(e.slice(r+1,o).trim())}(e)}(e))}(n,t)).map(t=>({source:n,output:t})):[]})}export function controlBlockers(t){const e=successfulEventIndexesBySource(t);return t.flatMap((t,n)=>{const r=readAdapterEvent(t),o=readControlStatus(r),s=readControlSource(r)??"tool";return o&&isBlockerStatus(o)?isResolvedByLaterCompletion(o)&&completedAfter(e,s,n)||isResolvedByLaterAnyCompletion(o)&&completedAfterAny(e,n)?[]:[`${s}:${o}`]:[]})}export function controlGaps(t){const e=new Set(successfulEvidenceItems(t).map(t=>t.source));return t.flatMap(t=>{const n=readAdapterEvent(t),r=readControlStatus(n),o=readControlSource(n)??"tool";return r&&isGapStatus(r)?e.has(o)&&isResolvedByLaterCompletion(r)?[]:[`${o}:${r}`]:[]})}export function omittedControlGaps(t,e){const n=successfulEventIndexesBySource(t),r=successfulEvidenceItems(t),o=function outputHasUnsupportedEvidenceClaims(t,e,n){const r=function evidenceCorpus(t,e){return[...e.map(t=>t.output),...t.flatMap(t=>"runtime.request.started"===t.type?[t.input??""]:[]),...t.flatMap(t=>"runtime.memory.recall.completed"===t.type?[t.context]:[])].join("\n")}(e,n).toLowerCase();return unsupportedTokens(t,r,/\b[A-Z][A-Z0-9]{1,12}-\d+\b/gu).length>0||unsupportedTokens(t,r,/\b[A-Za-z_$][A-Za-z0-9_$]*[A-Z][A-Za-z0-9_$]*\b/gu).filter(isCodeLikeIdentifier).length>=2}(e,t,r);return t.flatMap((t,s)=>{const u=readAdapterEvent(t),i=readControlStatus(u),a=readControlSource(u)??"tool";return i&&function isOmittedControlStatus(t){return isGapStatus(t)||isBlockerStatus(t)}(i)?isResolvedByLaterCompletion(i)&&completedAfter(n,a,s)||isResolvedByLaterAnyCompletion(i)&&completedAfterAny(n,s)||!o&&outputUsesPriorEvidence(e,a,r)?[]:[`${a}:${i}`]:[]})}function stringifyEvidence(t){return"string"==typeof t?t.trim()?[t]:[]:null==t?[]:[JSON.stringify(t)]}function isToolEnvelopeRecord(t){return!!isRecord(t)&&["tool","toolId","toolName","tool_name","name","type","subagent_type"].some(e=>"string"==typeof t[e])&&["args","arguments","parameters","params","kwargs","task"].some(e=>e in t)}function readAdapterEvent(t){if("runtime.adapter.event"===t.type&&isRecord(t.event))return t.event;const e=t;return isRecord(e)&&isToolResultEvent(e)?e:void 0}function isSuccessfulEvidenceEvent(t){const e=readEventStatus(t);return!e||/^(?:completed|success|ok|recorded)$/iu.test(e)}function isBlockerStatus(t){return/^(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked)$/iu.test(t)}function isGapStatus(t){return/^(?:dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)$/iu.test(t)}function isResolvedByLaterCompletion(t){return isGapStatus(t)||isBlockerStatus(t)}function isResolvedByLaterAnyCompletion(t){return"task_inventory_blocked"===t}function successfulEventIndexesBySource(t){const e=new Map;return t.forEach((t,n)=>{const r=function successfulEventSource(t){if("runtime.tool.direct.completed"===t.type)return t.toolId;const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n&&isSuccessfulEvidenceEvent(e)?n:void 0}(t);r&&e.set(r,[...e.get(r)??[],n])}),e}function isToolResultEvent(t){return"deepagents.tool_execution.result"===t?.eventType||"agent.tool.result"===t?.phase||"agent.tool.result"===t?.type||"deepagents.tool_execution.result"===t?.type}function completedAfter(t,e,n){return(t.get(e)??[]).some(t=>t>n)}function completedAfterAny(t,e){return[...t.values()].some(t=>t.some(t=>t>e))}export function outputUsesPriorEvidence(t,e,n){const r=t.toLowerCase();return n.filter(t=>t.source===e).some(t=>{const e=t.output.trim();return!!e&&(!!r.includes(e.slice(0,500).toLowerCase())||function matchingEvidenceTokens(t,e){const n=new Set(["status","completed","success","recorded"]);return[...new Set(e.toLowerCase().match(/[a-z0-9][a-z0-9_.-]{1,}/gu)??[])].filter(t=>!n.has(t)).filter(e=>t.includes(e)).length}(r,e)>=2)})}function unsupportedTokens(t,e,n){return[...new Set(t.match(n)??[])].filter(t=>!e.includes(t.toLowerCase()))}function isCodeLikeIdentifier(t){return!(t.length<8)&&(/(?:Service|Controller|Repository|Manager|Client|Resolver|Agent|Tool|Async)$/u.test(t)||/[a-z][A-Z]/u.test(t))}function readOutputStatus(t){if(isRecord(t)&&"string"==typeof t.status)return t.status;if("string"==typeof t){const e=parseJsonRecord(t);return"string"==typeof e?.status?e.status:t.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1]}}function parseJsonRecord(t){try{const e=JSON.parse(t);return isRecord(e)?e:void 0}catch{return}}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}function readEventStatus(t){return readString(t?.controlStatus)??readString(t?.status)??readOutputStatus(t?.output)}function readToolSource(t){return readString(t?.toolId)??readString(t?.toolName)??readString(t?.name)}function readControlStatus(t){const e=function readInventoryRepairControlStatus(t){if("inventory.repair"===t?.phase&&"blocked"===t.status)return"task"===readInventoryRepairSource(t)?"task_inventory_blocked":"blocked"}(t);if(e)return e;const n=readEventStatus(t);return n&&isControlStatus(n)?n:findNestedControlStatus(t)}function readControlSource(t){return readToolSource(t)??readInventoryRepairSource(t)??findNestedToolSource(t)}function isControlStatus(t){return isGapStatus(t)||isBlockerStatus(t)}function findNestedControlStatus(t,e=0){if(e>5||null==t)return;if("string"==typeof t)return function readNestedStringStatus(t,e){const n=parseJsonRecord(t);if(n)return findNestedControlStatus(n,e+1);const r=t.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1];return r&&isControlStatus(r)?r:function readControlToken(t){const e=t.match(/\b(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked|dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)\b/iu)?.[0];return e&&isControlStatus(e)?e:void 0}(t)}(t,e);if(Array.isArray(t))return findFirstNested(t,t=>findNestedControlStatus(t,e+1));if(!isRecord(t))return;const n=readString(t.controlStatus)??readString(t.status);if(n&&isControlStatus(n))return n;const r=readOutputStatus(t.output);return r&&isControlStatus(r)?r:findFirstNested(Object.values(t),t=>findNestedControlStatus(t,e+1))}function findNestedToolSource(t,e=0){if(!(e>5||null==t)){if("string"==typeof t)return function readToolSourceFromText(t){const e=t.match(/["'](?:toolId|toolName|name)["']\s*:\s*["']([^"']+)["']/u)?.[1];return readString(e)}(t);if(Array.isArray(t))return findFirstNested(t,t=>findNestedToolSource(t,e+1));if(isRecord(t))return(readString(t.toolId)??readString(t.toolName)??readString(t.name))||findFirstNested(Object.values(t),t=>findNestedToolSource(t,e+1))}}function findFirstNested(t,e){for(const n of t){const t=e(n);if(void 0!==t)return t}}function readInventoryRepairSource(t){const e=isRecord(t?.diagnostic)?t.diagnostic:void 0;return readString(e?.layer)}
1
+ export function hasPlanningEvidence(t){return t.some(t=>{const e=readAdapterEvent(t);return!!e&&("plan"===e.traceType||String(e.traceLabel??"").startsWith("plan.")||"write_todos"===e.toolId&&String(e.phase??"").startsWith("agent.tool."))})}export function successfulEvidenceToolIds(t){const e=t.flatMap(t=>{if("runtime.tool.direct.completed"===t.type)return[t.toolId];const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n&&isSuccessfulEvidenceEvent(e)?[n]:[]});return[...new Set(e)]}export function successfulEvidenceOutputs(t){return successfulEvidenceItems(t).map(t=>t.output)}export function successfulEvidenceItems(t){return t.flatMap(t=>{if("runtime.tool.direct.completed"===t.type)return stringifyEvidence(t.output).map(e=>({source:t.toolId,output:e}));const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n?!isSuccessfulEvidenceEvent(e)||function isPlanningTool(t){return"write_todos"===t||"read_todos"===t}(n)?[]:stringifyEvidence(e.evidenceOutput??e.output).filter(t=>function isUsableEvidenceOutput(t,e){return!("task"===t&&function looksLikeUnexecutedToolIntent(t){const e=t.trim();if(e.length>4e3)return!1;const n=function extractJsonSource(t){const e=t.trim();if(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]"))return e;if(!e.startsWith("```"))return;const n=e.indexOf("\n"),r=e.lastIndexOf("```");return n<0||r<=n?void 0:e.slice(n+1,r).trim()}(e);return n?function containsToolEnvelope(t){try{const e=JSON.parse(t);return Array.isArray(e)?e.some(isToolEnvelopeRecord):isToolEnvelopeRecord(e)}catch{return!1}}(n):function containsToolMarkup(t){const e=t.toLowerCase();return e.includes("<tool_call")||e.includes("</tool_call")||e.includes("<tool_code")||e.includes("</tool_code")}(e)||function containsBareToolFence(t){const e=t.trim(),n=e.indexOf("```");if(n<0||e.indexOf("```",n+3)!==e.lastIndexOf("```"))return!1;const r=e.indexOf("\n",n+3),o=e.lastIndexOf("```");return!(r<0||o<=r)&&function isIdentifierPath(t){return t.length>0&&[...t].every((t,e)=>{const n=t>="A"&&t<="Z"||t>="a"&&t<="z"||"_"===t;return 0===e?n:n||t>="0"&&t<="9"||"."===t||"-"===t})}(e.slice(r+1,o).trim())}(e)}(e))}(n,t)).map(t=>({source:n,output:t})):[]})}export function controlBlockers(t){const e=successfulEventIndexesBySource(t);return t.flatMap((t,n)=>{const r=readAdapterEvent(t),o=readControlStatus(r),s=readControlSource(r)??"tool";return o&&isBlockerStatus(o)?isResolvedByLaterCompletion(o)&&completedAfter(e,s,n)||isResolvedByLaterAnyCompletion(o)&&completedAfterAny(e,n)?[]:[`${s}:${o}`]:[]})}export function controlGaps(t){const e=new Set(successfulEvidenceItems(t).map(t=>t.source));return t.flatMap(t=>{const n=readAdapterEvent(t),r=readControlStatus(n),o=readControlSource(n)??"tool";return r&&isGapStatus(r)?e.has(o)&&isResolvedByLaterCompletion(r)?[]:[`${o}:${r}`]:[]})}export function omittedControlGaps(t,e){const n=successfulEventIndexesBySource(t),r=successfulEvidenceItems(t),o=function outputHasUnsupportedEvidenceClaims(t,e,n){const r=function evidenceCorpus(t,e){return[...e.map(t=>t.output),...t.flatMap(t=>"runtime.request.started"===t.type?[t.input??""]:[]),...t.flatMap(t=>"runtime.memory.recall.completed"===t.type?[t.context]:[])].join("\n")}(e,n).toLowerCase();return unsupportedTokens(t,r,/\b[A-Z][A-Z0-9]{1,12}-\d+\b/gu).length>0||unsupportedTokens(t,r,/\b[A-Za-z_$][A-Za-z0-9_$]*[A-Z][A-Za-z0-9_$]*\b/gu).filter(isCodeLikeIdentifier).length>=2}(e,t,r);return t.flatMap((t,s)=>{const u=readAdapterEvent(t),i=readControlStatus(u),a=readControlSource(u)??"tool";return i&&function isOmittedControlStatus(t){return isGapStatus(t)||isBlockerStatus(t)}(i)?isResolvedByLaterCompletion(i)&&completedAfter(n,a,s)||isResolvedByLaterAnyCompletion(i)&&completedAfterAny(n,s)||!o&&outputUsesPriorEvidence(e,a,r)?[]:[`${a}:${i}`]:[]})}function stringifyEvidence(t){return"string"==typeof t?t.trim()?[t]:[]:null==t?[]:[JSON.stringify(t)]}function isToolEnvelopeRecord(t){return!!isRecord(t)&&["tool","toolId","toolName","tool_name","name","type","subagent_type"].some(e=>"string"==typeof t[e])&&["args","arguments","parameters","params","kwargs","task"].some(e=>e in t)}function readAdapterEvent(t){if("runtime.adapter.event"===t.type&&isRecord(t.event))return t.event;const e=t;return isRecord(e)&&isToolResultEvent(e)?e:void 0}function isSuccessfulEvidenceEvent(t){const e=readEventStatus(t);return!e||/^(?:completed|success|ok|recorded)$/iu.test(e)}function isBlockerStatus(t){return/^(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked)$/iu.test(t)}function isGapStatus(t){return/^(?:dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)$/iu.test(t)}function isResolvedByLaterCompletion(t){return isGapStatus(t)||isBlockerStatus(t)}function isResolvedByLaterAnyCompletion(t){return"task_inventory_blocked"===t}function successfulEventIndexesBySource(t){const e=new Map;return t.forEach((t,n)=>{const r=function successfulEventSource(t){if("runtime.tool.direct.completed"===t.type)return t.toolId;const e=readAdapterEvent(t),n=readToolSource(e);return isToolResultEvent(e)&&n&&isSuccessfulEvidenceEvent(e)?n:void 0}(t);r&&e.set(r,[...e.get(r)??[],n])}),e}function isToolResultEvent(t){return"deepagents.tool_execution.result"===t?.eventType||"agent.tool.result"===t?.phase||"agent.tool.result"===t?.type||"deepagents.tool_execution.result"===t?.type}function completedAfter(t,e,n){return(t.get(e)??[]).some(t=>t>n)}function completedAfterAny(t,e){return[...t.values()].some(t=>t.some(t=>t>e))}export function outputUsesPriorEvidence(t,e,n){const r=t.toLowerCase();return n.filter(t=>t.source===e).some(t=>{const e=t.output.trim();return!!e&&(!!r.includes(e.slice(0,500).toLowerCase())||function matchingEvidenceTokens(t,e){const n=new Set(["status","completed","success","recorded"]);return[...new Set(e.toLowerCase().match(/[a-z0-9][a-z0-9_.-]{1,}/gu)??[])].filter(t=>!n.has(t)).filter(e=>t.includes(e)).length}(r,e)>=2)})}function unsupportedTokens(t,e,n){return[...new Set(t.match(n)??[])].filter(t=>!e.includes(t.toLowerCase()))}function isCodeLikeIdentifier(t){return!(t.length<8)&&(/(?:Service|Controller|Repository|Manager|Client|Resolver|Agent|Tool|Async)$/u.test(t)||/[a-z][A-Z]/u.test(t))}function readOutputStatus(t){if(isRecord(t)&&"string"==typeof t.status)return t.status;if("string"==typeof t){const e=parseJsonRecord(t);return"string"==typeof e?.status?e.status:t.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1]}}function parseJsonRecord(t){try{const e=JSON.parse(t);return isRecord(e)?e:void 0}catch{return}}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function readString(t){return"string"==typeof t&&t.trim()?t:void 0}function readEventStatus(t){return readString(t?.controlStatus)??readString(t?.status)??readOutputStatus(t?.output)}function readToolSource(t){return readString(t?.toolId)??readString(t?.toolName)??readString(t?.name)}function readControlStatus(t){const e=function readInventoryRepairControlStatus(t){if("inventory.repair"===t?.phase&&"blocked"===t.status)return"task"===readInventoryRepairSource(t)?"task_inventory_blocked":"blocked"}(t);if(e)return e;const n=readEventStatus(t);return n&&isControlStatus(n)?n:findNestedControlStatus(t)}function readControlSource(t){return readToolSource(t)??readInventoryRepairSource(t)??findNestedToolSource(t)}function isControlStatus(t){return isGapStatus(t)||isBlockerStatus(t)}function findNestedControlStatus(t,e=0){if(e>5||null==t)return;if("string"==typeof t)return function readNestedStringStatus(t,e){const n=parseJsonRecord(t);if(n)return findNestedControlStatus(n,e+1);const r=t.match(/^Status:\s*([A-Za-z0-9_-]+)/imu)?.[1];return r&&isControlStatus(r)?r:function readControlToken(t){const e=t.match(/\b(?:blocked|approval_required|schema_repair_failed|tool_argument_error|invalid_input|task_inventory_blocked|dependency_required|plan_required|repeated_tool_call_limit|duplicate_tool_call)\b/iu)?.[0];return e&&isControlStatus(e)?e:void 0}(t)}(t,e);if(Array.isArray(t))return findFirstNested(t,t=>findNestedControlStatus(t,e+1));if(!isRecord(t))return;const n=readString(t.controlStatus)??readString(t.status);if(n&&isControlStatus(n))return n;const r=readOutputStatus(t.output);return r&&isControlStatus(r)?r:findFirstNested(Object.values(t),t=>findNestedControlStatus(t,e+1))}function findNestedToolSource(t,e=0){if(!(e>5||null==t)){if("string"==typeof t)return function readToolSourceFromText(t){const e=t.match(/["'](?:toolId|toolName|name)["']\s*:\s*["']([^"']+)["']/u)?.[1];return readString(e)}(t);if(Array.isArray(t))return findFirstNested(t,t=>findNestedToolSource(t,e+1));if(isRecord(t))return(readString(t.toolId)??readString(t.toolName)??readString(t.name))||findFirstNested(Object.values(t),t=>findNestedToolSource(t,e+1))}}function findFirstNested(t,e){for(const n of t){const t=e(n);if(void 0!==t)return t}}function readInventoryRepairSource(t){const e=isRecord(t?.diagnostic)?t.diagnostic:void 0;return readString(e?.layer)}
@@ -1 +1 @@
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)}`)}
1
+ import{successfulEvidenceItems as e,successfulEvidenceToolIds as t}from"../quality/event-evidence.js";export function buildExecutionContractRecoveryRequest(e){if(!0!==function readToolCallRecovery(e){if(!isRecord(e))return{};const t=isRecord(e.recovery)?e.recovery:{};return isRecord(t.toolCall)?t.toolCall:{}}(e.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:[]}}(e.events);if(0===n.missing.length)return;if("missing_required_evidence_usage"===n.reason){const t=recentSuccessfulEvidence(e.events);return recoverRequest(e.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.",...t.length>0?["","Prior successful tool evidence:",...t]:[]])}const r=recentSuccessfulEvidence(e.events),o=function recoveryToolTargets(e,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:{}}(e).toolDependencies),i=new Set(t(r)),s=new Set;for(const e of n)s.add(e),collectUnmetDependencies(e,o,i,s,new Set([e]));return[...s].filter(t=>e.tools.includes(t))}(e.agent,n.missing,e.events);return recoverRequest(e.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)}`)}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/core",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
16
- "@stable-harness/memory": "0.0.130"
15
+ "@stable-harness/governance": "0.0.131",
16
+ "@stable-harness/memory": "0.0.131"
17
17
  }
18
18
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/evaluation",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130"
14
+ "@stable-harness/core": "0.0.131"
15
15
  }
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/governance",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
3
+ "version": "0.0.131",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "files": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/protocols",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130"
14
+ "@stable-harness/core": "0.0.131"
15
15
  }
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/tool-gateway",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
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.130",
3
+ "version": "0.0.131",
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.130"
15
+ "@stable-harness/core": "0.0.131"
16
16
  }
17
17
  }