stable-harness 0.0.92 → 0.0.94
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/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js +1 -1
- 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/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/package.json +2 -2
- package/node_modules/@stable-harness/tool-gateway/dist/src/argument-guard.js +1 -1
- 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/dist/src/internal/raw-tool-call-parser.js +1 -1
- 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/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/package.json +2 -2
- package/packages/tool-gateway/dist/src/argument-guard.js +1 -1
- package/packages/tool-gateway/package.json +1 -1
- package/packages/workspace-yaml/package.json +2 -2
package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AIMessage as t}from"@langchain/core/messages";import{parseToolIntent as e,repairCallSelection as o}from"@easynet/better-call";const
|
|
1
|
+
import{AIMessage as t}from"@langchain/core/messages";import{parseToolIntent as e,repairCallSelection as o}from"@easynet/better-call";const n=new Set(["edit_file","glob","ls","read_file"]);export function createRawToolCallParserMiddleware(e){return{name:"StableHarnessRawToolCallParser",async wrapModelCall(o,n){const s=await n(o);if(!function rawToolCallParsingEnabled(t){const e=isRecord(t.workspace.runtime.recovery)?t.workspace.runtime.recovery:{};return!0===(isRecord(e.toolCall)?e.toolCall:{}).enabled}(e))return s;const r=await async function parseRawToolCallResponse(e,o){if(0===o.length||!function isModelResponse(t){return isRecord(t)}(e)||function hasToolCalls(t){return Array.isArray(t.tool_calls)&&t.tool_calls.length>0}(e))return;const n=function readContentText(t){return"string"==typeof t?t.trim()?t:void 0:Array.isArray(t)&&t.map(t=>isRecord(t)&&"string"==typeof t.text?t.text:"").join("\n").trim()||void 0}(e.content);if(!n)return;const s=await async function readRawToolCalls(t,e){const o=[],n=new Set,s=new Set(e.map(t=>t.id));for(const r of function rawToolIntentCandidates(t,e){const o=[t.trim()];for(const e of t.matchAll(/```[a-zA-Z0-9_-]*\s*\n([\s\S]*?)\n```/gu))o.push(e[1].trim());for(const n of t.split(/\r?\n/u)){const t=n.trim();e.has(t)&&o.push(t)}for(const e of t.matchAll(/<\s*(?:tool_call|tool_code)\b[^>]*>(?:[\s\S]*?<\s*\/\s*(?:tool_call|tool_code)\s*>)?/giu))o.push(e[0]);for(const e of t.matchAll(/<\s*call_tool\b[^>]*>[\s\S]*?<\s*\/\s*call_tool\s*>/giu)){o.push(e[0]);const t=parseCallToolTags(e[0]);t&&o.push(t)}for(const n of e){const e=new RegExp(`(?:^|[\\s<])${escapeRegexp(n)}\\s*\\([^)]*\\)\\s*>?`,"giu");for(const n of t.matchAll(e))o.push(n[0].trim())}return o.push(...function parseJsonObjects(t){const e=[];let o=t.indexOf("{");for(;o>=0;){const n=readBalancedJsonObject(t,o);if(n){try{const t=JSON.parse(n);isRecord(t)&&e.push(t)}catch{}o=t.indexOf("{",o+n.length)}else o=t.indexOf("{",o+1)}return e}(t)),o}(t,s)){const t=await parseCandidate(r,e);if(!t||!s.has(t.tool))continue;const a=normalizeToolArgs(t.args),i=`${t.tool}:${JSON.stringify(a)}`;n.has(i)||(n.add(i),o.push({id:`stable-harness-${t.tool}-${Date.now().toString(36)}`,name:t.tool,args:a}))}return o}(n,o);return 0!==s.length?new t({content:"",id:"string"==typeof e.id?e.id:void 0,name:"string"==typeof e.name?e.name:void 0,additional_kwargs:isRecord(e.additional_kwargs)?e.additional_kwargs:{},response_metadata:isRecord(e.response_metadata)?e.response_metadata:{},tool_calls:s.map(t=>({id:t.id,name:t.name,args:t.args,type:"tool_call"}))}):void 0}(s,function visibleToolCandidates(t,e){return(e.tools??[]).flatMap(readToolName).map(e=>{const o=t.workspace.tools.get(e),n=t.toolGateway?.get(e);return{id:e,description:o?.description??n?.description,schema:o?.schema??n?.schema}})}(e,o));return r??s}}}async function parseCandidate(t,s){const r=new Set(s.map(t=>t.id));if("string"==typeof t){const e=function parseExecuteToolWrapper(t,e){const o=t.trim().match(/^<?\s*execute\s*\(([\s\S]*)\)\s*>?$/iu);if(!o)return;const n=function parseFunctionKwargs(t){const e={};for(const o of function splitTopLevelCommas(t){const e=[];let o,n=0,s=0,r=!1;for(let a=0;a<t.length;a+=1){const i=t[a];o?(r="\\"===i&&!r,i!==o||r||(o=void 0),"\\"!==i&&(r=!1)):'"'!==i&&"'"!==i?("("!==i&&"["!==i&&"{"!==i||(s+=1),")"!==i&&"]"!==i&&"}"!==i||(s-=1),","===i&&0===s&&(e.push(t.slice(n,a).trim()),n=a+1)):o=i}const a=t.slice(n).trim();return a&&e.push(a),e}(t)){const t=o.indexOf("=");if(t<=0)continue;const n=o.slice(0,t).trim();/^[a-zA-Z_][a-zA-Z0-9_]*$/u.test(n)&&(e[n]=parseFunctionValue(o.slice(t+1).trim()))}return e}(o[1]??""),s=n.tool??n.tool_name??n.name;if("string"!=typeof s||!e.has(s))return;const r={...n};return delete r.tool,delete r.tool_name,delete r.name,isRecord(r.args)&&1===Object.keys(r).length?{tool:s,args:r.args}:{tool:s,args:r}}(t,r);if(e)return e}const a=e(t);if(a)return a;const i=function singleToolName(t){return 1===t.size?[...t][0]:void 0}(r);if(i&&isRecord(t))return e({tool:i,args:t});const c=isRecord(t)?await o({call:{name:"__stable_harness_raw_args__",args:t},candidates:s,mode:"repair"}):void 0;if(c?.ok)return{tool:c.candidateId,args:c.args};const l=isRecord(t)?await async function selectUniqueToolByArgs(t,e){const n=[];for(const s of e){const r=await o({call:{name:s.id,args:t},candidates:e,mode:"guard"});r.ok&&r.candidateId===s.id&&n.push({tool:r.candidateId,args:r.args})}return 1===n.length?n[0]:void 0}(t,s):void 0;if(l)return l;if("string"!=typeof t)return;const u=await o({candidates:s,rawIntent:t,mode:"guard"});if(u.ok)return{tool:u.candidateId,args:u.args??{}};const d=function parseFunctionStyleToolName(t,e){const o=t.trim();for(const t of e)if(!n.has(t)&&new RegExp(`^<?\\s*${escapeRegexp(t)}\\s*\\([\\s\\S]*\\)\\s*>?$`,"iu").test(o))return t}(t,r);return d?{tool:d,args:{}}:void 0}function parseFunctionValue(t){if(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))return t.slice(1,-1).replace(/\\(["'\\])/gu,"$1");if(/^-?\d+(?:\.\d+)?$/u.test(t))return Number(t);if("true"===t)return!0;if("false"===t)return!1;if("null"===t)return null;try{return JSON.parse(t)}catch{return t}}function normalizeToolArgs(t){return isRecord(t)?t:{}}function parseCallToolTags(t){const e=t.match(/<\s*tool\s*>([\s\S]*?)<\s*\/\s*tool\s*>/iu)?.[1]?.trim(),o=t.match(/<\s*tool_args\s*>([\s\S]*?)<\s*\/\s*tool_args\s*>/iu)?.[1]?.trim();if(e&&o)try{const t=JSON.parse(o);return isRecord(t)?{tool:e,args:t}:{tool:e,args:{}}}catch{return{tool:e,args:{}}}}function readBalancedJsonObject(t,e){let o=0,n=!1,s=!1;for(let r=e;r<t.length;r+=1){const a=t[r];if(n)s="\\"===a&&!s,'"'!==a||s||(n=!1),"\\"!==a&&(s=!1);else if('"'===a&&(n=!0),"{"===a&&(o+=1),"}"===a&&(o-=1),0===o)return t.slice(e,r+1)}}function escapeRegexp(t){return t.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function readToolName(t){const e="string"==typeof t.name&&t.name.length>0?t.name:void 0;if(e)return[e];const o=t,n=isRecord(o.function)&&"string"==typeof o.function.name?o.function.name:void 0;return n&&n.length>0?[n]:[]}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/adapter-deepagents",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"@langchain/node-vfs": "^0.1.4",
|
|
16
16
|
"@langchain/ollama": "^1.2.7",
|
|
17
17
|
"@langchain/openai": "^1.4.5",
|
|
18
|
-
"@stable-harness/core": "0.0.
|
|
18
|
+
"@stable-harness/core": "0.0.94",
|
|
19
19
|
"deepagents": "^1.10.1",
|
|
20
20
|
"langchain": "^1.4.0"
|
|
21
21
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/adapter-langgraph",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
"types": "dist/src/index.d.ts",
|
|
12
12
|
"peerDependencies": {
|
|
13
13
|
"@langchain/langgraph": "^1.3.0",
|
|
14
|
-
"@stable-harness/core": "0.0.
|
|
14
|
+
"@stable-harness/core": "0.0.94"
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
".": "./dist/index.js"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@stable-harness/governance": "0.0.
|
|
15
|
-
"@stable-harness/memory": "0.0.
|
|
14
|
+
"@stable-harness/governance": "0.0.94",
|
|
15
|
+
"@stable-harness/memory": "0.0.94"
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/protocols",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
"main": "dist/src/index.js",
|
|
11
11
|
"types": "dist/src/index.d.ts",
|
|
12
12
|
"peerDependencies": {
|
|
13
|
-
"@stable-harness/core": "0.0.
|
|
13
|
+
"@stable-harness/core": "0.0.94"
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{BetterToolValidationError as o,betterTools as t,defaultRepair as
|
|
1
|
+
import{BetterToolValidationError as o,betterTools as t,defaultRepair as a,reliableToolCalls as r,repairCallSelection as e}from"@easynet/better-call";import{isRecord as l,validateWithZodSchema as i}from"./schema-validation.js";export class ToolArgumentValidationError extends Error{toolId;issues;constructor(o,t){super(`Tool argument validation failed for ${o}: ${t.map(o=>`${o.path} ${o.message}`).join("; ")}`),this.toolId=o,this.issues=t,this.name="ToolArgumentValidationError"}}export function createDefaultArgumentGuard(t={}){return{async validate(a){const r=a.tool.validateArgs?await a.tool.validateArgs({args:a.args,context:a.context}):{action:"allow",args:a.args};if("reject"===r.action)return r;const e=await async function validateWithBetterCall(t,a,r){const e=i(t.schema,a);if(void 0===t.schema)return e??{action:"allow",args:a};const l=await async function invokeBetterCallValidation(t,a,r){try{return{action:"allow",args:await createBetterCallValidationTool(t,r).invoke(a)}}catch(t){if(t instanceof o)return{action:"reject",reason:"BetterCall validation failed",issues:t.issues.map(toToolArgumentIssue)};throw t}}(t,"allow"===e?.action?e.args:a,r);return e?"allow"===e.action?l:"reject"===l.action?e:i(t.schema,l.args)||l:l}(a.tool,r.args,t.betterCall);return"reject"===e.action?e:"repair"===r.action?{...r,args:e.args}:e}}}export function assertToolArguments(o,t,a,r){return Promise.resolve(r.validate({tool:o,args:t,context:a})).then(t=>{if("reject"===t.action)throw new ToolArgumentValidationError(o.id,t.issues);return t.args})}export function prepareBetterCallTools(o,a){const r=t(o.map(toBetterCallTool),toBetterToolsOptions(a));return o.map((o,t)=>({...o,validationTool:r[t]}))}export async function repairBetterCallToolSelection(o){if(0===o.tools.length)return;const t=function resolveRepair(o){return o?.repair??(o?.repairModel?a(o.repairModel):void 0)}(o.options);if(t){const a=await r({userInput:JSON.stringify({tool:o.toolId,args:o.args}),tools:o.tools.map(toToolDefinition),calls:[{tool:o.toolId,args:toToolCallArgs(o.args)}],repair:t,repairPolicy:o.options?.repairPolicy??{allowCoercion:!0,allowClamp:!0,allowArrayStringSplit:!0,allowModelRepair:!0},mode:o.options?.mode??"repair"}),e=a.ok?a.calls.find(t=>o.tools.some(o=>o.id===t.tool)):void 0;return e?{toolId:e.tool,args:e.args}:void 0}const l=await e({userInput:JSON.stringify({tool:o.toolId,args:o.args}),call:{name:o.toolId,args:toToolCallArgs(o.args)},candidates:o.tools.map(toCallCandidate),repair:o.options?.repair,repairModel:o.options?.repairModel,repairPolicy:o.options?.repairPolicy??{allowCoercion:!0,allowClamp:!0,allowArrayStringSplit:!0,allowModelRepair:!0},mode:o.options?.mode??"repair"});return l.ok?{toolId:l.candidateId,args:l.args}:void 0}function createBetterCallValidationTool(o,a){return o.validationTool??t([toBetterCallTool(o)],toBetterToolsOptions(a))[0]}function toBetterCallTool(o){return{name:o.id,description:o.description,schema:o.schema,invoke:o=>o}}function toToolDefinition(o){return{name:o.id,description:o.description,schema:o.schema}}function toCallCandidate(o){return{id:o.id,description:o.description,schema:o.schema}}function toToolArgumentIssue(o){return{path:o.path.replace(/^\$\.calls\[\d+\]\.args/u,"$"),message:o.message,expected:void 0===o.expected?void 0:String(o.expected),actual:o.actual}}function toBetterToolsOptions(o){const t=Boolean(o?.repair||o?.repairModel);return{mode:o?.mode??(t?"repair":"guard"),repair:o?.repair,repairModel:o?.repairModel,repairPolicy:o?.repairPolicy??(t?{allowCoercion:!0,allowClamp:!0,allowArrayStringSplit:!0,allowModelRepair:!0}:{allowCoercion:!1,allowClamp:!1,allowArrayStringSplit:!1,allowModelRepair:!1})}}function toToolCallArgs(o){return l(o)?o:{input:o}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/workspace-yaml",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
".": "./dist/index.js"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@stable-harness/core": "0.0.
|
|
14
|
+
"@stable-harness/core": "0.0.94"
|
|
15
15
|
}
|
|
16
16
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stable-harness",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
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.94",
|
|
86
|
+
"@stable-harness/adapter-langgraph": "0.0.94",
|
|
87
|
+
"@stable-harness/core": "0.0.94",
|
|
88
|
+
"@stable-harness/governance": "0.0.94",
|
|
89
|
+
"@stable-harness/memory": "0.0.94",
|
|
90
|
+
"@stable-harness/protocols": "0.0.94",
|
|
91
|
+
"@stable-harness/tool-gateway": "0.0.94",
|
|
92
|
+
"@stable-harness/workspace-yaml": "0.0.94",
|
|
93
93
|
"deepagents": "^1.10.1",
|
|
94
94
|
"langchain": "^1.4.0",
|
|
95
95
|
"yaml": "^2.8.2",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AIMessage as t}from"@langchain/core/messages";import{parseToolIntent as e,repairCallSelection as o}from"@easynet/better-call";const
|
|
1
|
+
import{AIMessage as t}from"@langchain/core/messages";import{parseToolIntent as e,repairCallSelection as o}from"@easynet/better-call";const n=new Set(["edit_file","glob","ls","read_file"]);export function createRawToolCallParserMiddleware(e){return{name:"StableHarnessRawToolCallParser",async wrapModelCall(o,n){const s=await n(o);if(!function rawToolCallParsingEnabled(t){const e=isRecord(t.workspace.runtime.recovery)?t.workspace.runtime.recovery:{};return!0===(isRecord(e.toolCall)?e.toolCall:{}).enabled}(e))return s;const r=await async function parseRawToolCallResponse(e,o){if(0===o.length||!function isModelResponse(t){return isRecord(t)}(e)||function hasToolCalls(t){return Array.isArray(t.tool_calls)&&t.tool_calls.length>0}(e))return;const n=function readContentText(t){return"string"==typeof t?t.trim()?t:void 0:Array.isArray(t)&&t.map(t=>isRecord(t)&&"string"==typeof t.text?t.text:"").join("\n").trim()||void 0}(e.content);if(!n)return;const s=await async function readRawToolCalls(t,e){const o=[],n=new Set,s=new Set(e.map(t=>t.id));for(const r of function rawToolIntentCandidates(t,e){const o=[t.trim()];for(const e of t.matchAll(/```[a-zA-Z0-9_-]*\s*\n([\s\S]*?)\n```/gu))o.push(e[1].trim());for(const n of t.split(/\r?\n/u)){const t=n.trim();e.has(t)&&o.push(t)}for(const e of t.matchAll(/<\s*(?:tool_call|tool_code)\b[^>]*>(?:[\s\S]*?<\s*\/\s*(?:tool_call|tool_code)\s*>)?/giu))o.push(e[0]);for(const e of t.matchAll(/<\s*call_tool\b[^>]*>[\s\S]*?<\s*\/\s*call_tool\s*>/giu)){o.push(e[0]);const t=parseCallToolTags(e[0]);t&&o.push(t)}for(const n of e){const e=new RegExp(`(?:^|[\\s<])${escapeRegexp(n)}\\s*\\([^)]*\\)\\s*>?`,"giu");for(const n of t.matchAll(e))o.push(n[0].trim())}return o.push(...function parseJsonObjects(t){const e=[];let o=t.indexOf("{");for(;o>=0;){const n=readBalancedJsonObject(t,o);if(n){try{const t=JSON.parse(n);isRecord(t)&&e.push(t)}catch{}o=t.indexOf("{",o+n.length)}else o=t.indexOf("{",o+1)}return e}(t)),o}(t,s)){const t=await parseCandidate(r,e);if(!t||!s.has(t.tool))continue;const a=normalizeToolArgs(t.args),i=`${t.tool}:${JSON.stringify(a)}`;n.has(i)||(n.add(i),o.push({id:`stable-harness-${t.tool}-${Date.now().toString(36)}`,name:t.tool,args:a}))}return o}(n,o);return 0!==s.length?new t({content:"",id:"string"==typeof e.id?e.id:void 0,name:"string"==typeof e.name?e.name:void 0,additional_kwargs:isRecord(e.additional_kwargs)?e.additional_kwargs:{},response_metadata:isRecord(e.response_metadata)?e.response_metadata:{},tool_calls:s.map(t=>({id:t.id,name:t.name,args:t.args,type:"tool_call"}))}):void 0}(s,function visibleToolCandidates(t,e){return(e.tools??[]).flatMap(readToolName).map(e=>{const o=t.workspace.tools.get(e),n=t.toolGateway?.get(e);return{id:e,description:o?.description??n?.description,schema:o?.schema??n?.schema}})}(e,o));return r??s}}}async function parseCandidate(t,s){const r=new Set(s.map(t=>t.id));if("string"==typeof t){const e=function parseExecuteToolWrapper(t,e){const o=t.trim().match(/^<?\s*execute\s*\(([\s\S]*)\)\s*>?$/iu);if(!o)return;const n=function parseFunctionKwargs(t){const e={};for(const o of function splitTopLevelCommas(t){const e=[];let o,n=0,s=0,r=!1;for(let a=0;a<t.length;a+=1){const i=t[a];o?(r="\\"===i&&!r,i!==o||r||(o=void 0),"\\"!==i&&(r=!1)):'"'!==i&&"'"!==i?("("!==i&&"["!==i&&"{"!==i||(s+=1),")"!==i&&"]"!==i&&"}"!==i||(s-=1),","===i&&0===s&&(e.push(t.slice(n,a).trim()),n=a+1)):o=i}const a=t.slice(n).trim();return a&&e.push(a),e}(t)){const t=o.indexOf("=");if(t<=0)continue;const n=o.slice(0,t).trim();/^[a-zA-Z_][a-zA-Z0-9_]*$/u.test(n)&&(e[n]=parseFunctionValue(o.slice(t+1).trim()))}return e}(o[1]??""),s=n.tool??n.tool_name??n.name;if("string"!=typeof s||!e.has(s))return;const r={...n};return delete r.tool,delete r.tool_name,delete r.name,isRecord(r.args)&&1===Object.keys(r).length?{tool:s,args:r.args}:{tool:s,args:r}}(t,r);if(e)return e}const a=e(t);if(a)return a;const i=function singleToolName(t){return 1===t.size?[...t][0]:void 0}(r);if(i&&isRecord(t))return e({tool:i,args:t});const c=isRecord(t)?await o({call:{name:"__stable_harness_raw_args__",args:t},candidates:s,mode:"repair"}):void 0;if(c?.ok)return{tool:c.candidateId,args:c.args};const l=isRecord(t)?await async function selectUniqueToolByArgs(t,e){const n=[];for(const s of e){const r=await o({call:{name:s.id,args:t},candidates:e,mode:"guard"});r.ok&&r.candidateId===s.id&&n.push({tool:r.candidateId,args:r.args})}return 1===n.length?n[0]:void 0}(t,s):void 0;if(l)return l;if("string"!=typeof t)return;const u=await o({candidates:s,rawIntent:t,mode:"guard"});if(u.ok)return{tool:u.candidateId,args:u.args??{}};const d=function parseFunctionStyleToolName(t,e){const o=t.trim();for(const t of e)if(!n.has(t)&&new RegExp(`^<?\\s*${escapeRegexp(t)}\\s*\\([\\s\\S]*\\)\\s*>?$`,"iu").test(o))return t}(t,r);return d?{tool:d,args:{}}:void 0}function parseFunctionValue(t){if(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))return t.slice(1,-1).replace(/\\(["'\\])/gu,"$1");if(/^-?\d+(?:\.\d+)?$/u.test(t))return Number(t);if("true"===t)return!0;if("false"===t)return!1;if("null"===t)return null;try{return JSON.parse(t)}catch{return t}}function normalizeToolArgs(t){return isRecord(t)?t:{}}function parseCallToolTags(t){const e=t.match(/<\s*tool\s*>([\s\S]*?)<\s*\/\s*tool\s*>/iu)?.[1]?.trim(),o=t.match(/<\s*tool_args\s*>([\s\S]*?)<\s*\/\s*tool_args\s*>/iu)?.[1]?.trim();if(e&&o)try{const t=JSON.parse(o);return isRecord(t)?{tool:e,args:t}:{tool:e,args:{}}}catch{return{tool:e,args:{}}}}function readBalancedJsonObject(t,e){let o=0,n=!1,s=!1;for(let r=e;r<t.length;r+=1){const a=t[r];if(n)s="\\"===a&&!s,'"'!==a||s||(n=!1),"\\"!==a&&(s=!1);else if('"'===a&&(n=!0),"{"===a&&(o+=1),"}"===a&&(o-=1),0===o)return t.slice(e,r+1)}}function escapeRegexp(t){return t.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function readToolName(t){const e="string"==typeof t.name&&t.name.length>0?t.name:void 0;if(e)return[e];const o=t,n=isRecord(o.function)&&"string"==typeof o.function.name?o.function.name:void 0;return n&&n.length>0?[n]:[]}function isRecord(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/adapter-deepagents",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"@langchain/node-vfs": "^0.1.4",
|
|
16
16
|
"@langchain/ollama": "^1.2.7",
|
|
17
17
|
"@langchain/openai": "^1.4.5",
|
|
18
|
-
"@stable-harness/core": "0.0.
|
|
18
|
+
"@stable-harness/core": "0.0.94",
|
|
19
19
|
"deepagents": "^1.10.1",
|
|
20
20
|
"langchain": "^1.4.0"
|
|
21
21
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/adapter-langgraph",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
"types": "dist/src/index.d.ts",
|
|
12
12
|
"peerDependencies": {
|
|
13
13
|
"@langchain/langgraph": "^1.3.0",
|
|
14
|
-
"@stable-harness/core": "0.0.
|
|
14
|
+
"@stable-harness/core": "0.0.94"
|
|
15
15
|
}
|
|
16
16
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
"types": "dist/src/index.d.ts",
|
|
15
15
|
"peerDependencies": {
|
|
16
16
|
"@langchain/langgraph-api": "^1.2.1",
|
|
17
|
-
"@stable-harness/adapter-deepagents": "0.0.
|
|
18
|
-
"@stable-harness/adapter-langgraph": "0.0.
|
|
19
|
-
"@stable-harness/core": "0.0.
|
|
20
|
-
"@stable-harness/memory": "0.0.
|
|
21
|
-
"@stable-harness/protocols": "0.0.
|
|
22
|
-
"@stable-harness/tool-gateway": "0.0.
|
|
23
|
-
"@stable-harness/workspace-yaml": "0.0.
|
|
17
|
+
"@stable-harness/adapter-deepagents": "0.0.94",
|
|
18
|
+
"@stable-harness/adapter-langgraph": "0.0.94",
|
|
19
|
+
"@stable-harness/core": "0.0.94",
|
|
20
|
+
"@stable-harness/memory": "0.0.94",
|
|
21
|
+
"@stable-harness/protocols": "0.0.94",
|
|
22
|
+
"@stable-harness/tool-gateway": "0.0.94",
|
|
23
|
+
"@stable-harness/workspace-yaml": "0.0.94"
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
".": "./dist/index.js"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@stable-harness/governance": "0.0.
|
|
15
|
-
"@stable-harness/memory": "0.0.
|
|
14
|
+
"@stable-harness/governance": "0.0.94",
|
|
15
|
+
"@stable-harness/memory": "0.0.94"
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/evaluation",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
"main": "dist/src/index.js",
|
|
11
11
|
"types": "dist/src/index.d.ts",
|
|
12
12
|
"peerDependencies": {
|
|
13
|
-
"@stable-harness/core": "0.0.
|
|
13
|
+
"@stable-harness/core": "0.0.94"
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/protocols",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
"main": "dist/src/index.js",
|
|
11
11
|
"types": "dist/src/index.d.ts",
|
|
12
12
|
"peerDependencies": {
|
|
13
|
-
"@stable-harness/core": "0.0.
|
|
13
|
+
"@stable-harness/core": "0.0.94"
|
|
14
14
|
}
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{BetterToolValidationError as o,betterTools as t,defaultRepair as
|
|
1
|
+
import{BetterToolValidationError as o,betterTools as t,defaultRepair as a,reliableToolCalls as r,repairCallSelection as e}from"@easynet/better-call";import{isRecord as l,validateWithZodSchema as i}from"./schema-validation.js";export class ToolArgumentValidationError extends Error{toolId;issues;constructor(o,t){super(`Tool argument validation failed for ${o}: ${t.map(o=>`${o.path} ${o.message}`).join("; ")}`),this.toolId=o,this.issues=t,this.name="ToolArgumentValidationError"}}export function createDefaultArgumentGuard(t={}){return{async validate(a){const r=a.tool.validateArgs?await a.tool.validateArgs({args:a.args,context:a.context}):{action:"allow",args:a.args};if("reject"===r.action)return r;const e=await async function validateWithBetterCall(t,a,r){const e=i(t.schema,a);if(void 0===t.schema)return e??{action:"allow",args:a};const l=await async function invokeBetterCallValidation(t,a,r){try{return{action:"allow",args:await createBetterCallValidationTool(t,r).invoke(a)}}catch(t){if(t instanceof o)return{action:"reject",reason:"BetterCall validation failed",issues:t.issues.map(toToolArgumentIssue)};throw t}}(t,"allow"===e?.action?e.args:a,r);return e?"allow"===e.action?l:"reject"===l.action?e:i(t.schema,l.args)||l:l}(a.tool,r.args,t.betterCall);return"reject"===e.action?e:"repair"===r.action?{...r,args:e.args}:e}}}export function assertToolArguments(o,t,a,r){return Promise.resolve(r.validate({tool:o,args:t,context:a})).then(t=>{if("reject"===t.action)throw new ToolArgumentValidationError(o.id,t.issues);return t.args})}export function prepareBetterCallTools(o,a){const r=t(o.map(toBetterCallTool),toBetterToolsOptions(a));return o.map((o,t)=>({...o,validationTool:r[t]}))}export async function repairBetterCallToolSelection(o){if(0===o.tools.length)return;const t=function resolveRepair(o){return o?.repair??(o?.repairModel?a(o.repairModel):void 0)}(o.options);if(t){const a=await r({userInput:JSON.stringify({tool:o.toolId,args:o.args}),tools:o.tools.map(toToolDefinition),calls:[{tool:o.toolId,args:toToolCallArgs(o.args)}],repair:t,repairPolicy:o.options?.repairPolicy??{allowCoercion:!0,allowClamp:!0,allowArrayStringSplit:!0,allowModelRepair:!0},mode:o.options?.mode??"repair"}),e=a.ok?a.calls.find(t=>o.tools.some(o=>o.id===t.tool)):void 0;return e?{toolId:e.tool,args:e.args}:void 0}const l=await e({userInput:JSON.stringify({tool:o.toolId,args:o.args}),call:{name:o.toolId,args:toToolCallArgs(o.args)},candidates:o.tools.map(toCallCandidate),repair:o.options?.repair,repairModel:o.options?.repairModel,repairPolicy:o.options?.repairPolicy??{allowCoercion:!0,allowClamp:!0,allowArrayStringSplit:!0,allowModelRepair:!0},mode:o.options?.mode??"repair"});return l.ok?{toolId:l.candidateId,args:l.args}:void 0}function createBetterCallValidationTool(o,a){return o.validationTool??t([toBetterCallTool(o)],toBetterToolsOptions(a))[0]}function toBetterCallTool(o){return{name:o.id,description:o.description,schema:o.schema,invoke:o=>o}}function toToolDefinition(o){return{name:o.id,description:o.description,schema:o.schema}}function toCallCandidate(o){return{id:o.id,description:o.description,schema:o.schema}}function toToolArgumentIssue(o){return{path:o.path.replace(/^\$\.calls\[\d+\]\.args/u,"$"),message:o.message,expected:void 0===o.expected?void 0:String(o.expected),actual:o.actual}}function toBetterToolsOptions(o){const t=Boolean(o?.repair||o?.repairModel);return{mode:o?.mode??(t?"repair":"guard"),repair:o?.repair,repairModel:o?.repairModel,repairPolicy:o?.repairPolicy??(t?{allowCoercion:!0,allowClamp:!0,allowArrayStringSplit:!0,allowModelRepair:!0}:{allowCoercion:!1,allowClamp:!1,allowArrayStringSplit:!1,allowModelRepair:!1})}}function toToolCallArgs(o){return l(o)?o:{input:o}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stable-harness/workspace-yaml",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.94",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*.js",
|
|
@@ -11,6 +11,6 @@
|
|
|
11
11
|
".": "./dist/index.js"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@stable-harness/core": "0.0.
|
|
14
|
+
"@stable-harness/core": "0.0.94"
|
|
15
15
|
}
|
|
16
16
|
}
|