stable-harness 0.0.98 → 0.0.99

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.98",
3
+ "version": "0.0.99",
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.98",
18
+ "@stable-harness/core": "0.0.99",
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.98",
3
+ "version": "0.0.99",
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.98"
14
+ "@stable-harness/core": "0.0.99"
15
15
  }
16
16
  }
@@ -1 +1 @@
1
- export function buildRawArgsRecoveryRequest(e){if(!toolCallRecoveryEnabled(e.policy))return;const t=findUniqueRawArgsTool(e);return t?{...e.request,input:[e.request.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.request.metadata,stableHarnessRecovery:"tool_call"}}:void 0}export function hasUniqueRawArgsTool(e){return toolCallRecoveryEnabled(e.policy)&&Boolean(findUniqueRawArgsTool(e))}function findUniqueRawArgsTool(e){const t=function parseStandaloneJsonObject(e){const t=e.trim(),r=t.match(/^```(?:json)?\s*\n([\s\S]*?)\n```$/iu)?.[1]?.trim(),o=r??t;if(o.startsWith("{")&&o.endsWith("}")&&!(o.length>6e3))try{const e=JSON.parse(o);return!isRecord(e)||function isToolCallEnvelope(e){const t=["tool","tool_name","name","type","subagent_type"].some(t=>"string"==typeof e[t]),r=["args","arguments","parameters","kwargs"].some(t=>t in e);return t&&r}(e)||function isRuntimeControlObject(e){return"string"==typeof e.status||"string"==typeof e.error||"string"==typeof e.controlStatus}(e)?void 0:e}catch{return}}(e.output);if(!t)return;const r=e.agent.tools.filter(r=>function schemaMatchesArgs(e,t){if(!isRecord(e)||"object"!==e.type||!isRecord(e.properties))return!1;if(readStringArray(e.required).some(e=>!(e in t)))return!1;const r=e.properties;return(!1!==e.additionalProperties||!Object.keys(t).some(e=>!(e in r)))&&Object.entries(t).every(([e,t])=>function propertyAcceptsValue(e,t){return!isRecord(e)||"string"!=typeof e.type||("string"===e.type?"string"==typeof t:"number"===e.type?"number"==typeof t:"integer"===e.type?Number.isInteger(t):"boolean"===e.type?"boolean"==typeof t:"array"===e.type?Array.isArray(t):"object"!==e.type||isRecord(t))}(r[e],t))}(e.workspace.tools.get(r)?.schema??e.toolGateway?.get(r)?.schema,t));if(1===r.length)return{toolId:r[0],args:t};const o=function latestSingleToolCandidate(e,t){for(let r=(e?.length??0)-1;r>=0;r-=1){const o=e[r];if(!o||!("diagnostics"in o)||!isRecord(o.diagnostics))continue;const n=readStringArray(o.diagnostics.toolCandidateIds).filter(e=>t.has(e));if(1===n.length)return n[0];if(n.length>1)return}}(e.events,new Set(e.agent.tools));return o?{toolId:o,args:t}:void 0}function toolCallRecoveryEnabled(e){return!!(isRecord(e)&&isRecord(e.recovery)&&isRecord(e.recovery.toolCall))&&!0===e.recovery.toolCall.enabled}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
1
+ import{selectCallCandidateByArgsSchema as e}from"@easynet/better-call";export function buildRawArgsRecoveryRequest(e){if(!toolCallRecoveryEnabled(e.policy))return;const t=findUniqueRawArgsTool(e);return t?{...e.request,input:[e.request.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.request.metadata,stableHarnessRecovery:"tool_call"}}:void 0}export function hasUniqueRawArgsTool(e){return toolCallRecoveryEnabled(e.policy)&&Boolean(findUniqueRawArgsTool(e))}function findUniqueRawArgsTool(t){const o=function parseStandaloneJsonObject(e){const t=e.trim(),o=t.match(/^```(?:json)?\s*\n([\s\S]*?)\n```$/iu)?.[1]?.trim(),n=o??t;if(n.startsWith("{")&&n.endsWith("}")&&!(n.length>6e3))try{const e=JSON.parse(n);return!isRecord(e)||function isToolCallEnvelope(e){const t=["tool","tool_name","name","type","subagent_type"].some(t=>"string"==typeof e[t]),o=["args","arguments","parameters","kwargs"].some(t=>t in e);return t&&o}(e)||function isRuntimeControlObject(e){return"string"==typeof e.status||"string"==typeof e.error||"string"==typeof e.controlStatus}(e)?void 0:e}catch{return}}(t.output);if(!o)return;const n=e({args:o,candidates:buildCallCandidates(t)});if(n.ok)return{toolId:n.candidateId,args:n.args};const r=function latestSingleToolCandidate(e,t){for(let o=(e?.length??0)-1;o>=0;o-=1){const n=e[o];if(!n||!("diagnostics"in n)||!isRecord(n.diagnostics))continue;const r=readStringArray(n.diagnostics.toolCandidateIds).filter(e=>t.has(e));if(1===r.length)return r[0];if(r.length>1)return}}(t.events,new Set(t.agent.tools));return r?{toolId:r,args:o}:void 0}function buildCallCandidates(e){return e.agent.tools.map(t=>({id:t,schema:e.workspace.tools.get(t)?.schema??e.toolGateway?.get(t)?.schema}))}function toolCallRecoveryEnabled(e){return!!(isRecord(e)&&isRecord(e.recovery)&&isRecord(e.recovery.toolCall))&&!0===e.recovery.toolCall.enabled}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/core",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
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.98",
15
- "@stable-harness/memory": "0.0.98"
14
+ "@stable-harness/governance": "0.0.99",
15
+ "@stable-harness/memory": "0.0.99"
16
16
  }
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/governance",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/memory",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/protocols",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
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.98"
13
+ "@stable-harness/core": "0.0.99"
14
14
  }
15
15
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/tool-gateway",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/workspace-yaml",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
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.98"
14
+ "@stable-harness/core": "0.0.99"
15
15
  }
16
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stable-harness",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
4
4
  "type": "module",
5
5
  "description": "Stable application runtime and operator control plane for agent workspaces.",
6
6
  "license": "Apache-2.0",
@@ -75,21 +75,21 @@
75
75
  "packages/*"
76
76
  ],
77
77
  "dependencies": {
78
- "@easynet/better-call": "^0.1.70",
78
+ "@easynet/better-call": "^0.1.72",
79
79
  "@langchain/core": "^1.1.46",
80
80
  "@langchain/langgraph": "^1.3.0",
81
81
  "@langchain/langgraph-api": "^1.2.1",
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.98",
86
- "@stable-harness/adapter-langgraph": "0.0.98",
87
- "@stable-harness/core": "0.0.98",
88
- "@stable-harness/governance": "0.0.98",
89
- "@stable-harness/memory": "0.0.98",
90
- "@stable-harness/protocols": "0.0.98",
91
- "@stable-harness/tool-gateway": "0.0.98",
92
- "@stable-harness/workspace-yaml": "0.0.98",
85
+ "@stable-harness/adapter-deepagents": "0.0.99",
86
+ "@stable-harness/adapter-langgraph": "0.0.99",
87
+ "@stable-harness/core": "0.0.99",
88
+ "@stable-harness/governance": "0.0.99",
89
+ "@stable-harness/memory": "0.0.99",
90
+ "@stable-harness/protocols": "0.0.99",
91
+ "@stable-harness/tool-gateway": "0.0.99",
92
+ "@stable-harness/workspace-yaml": "0.0.99",
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.98",
3
+ "version": "0.0.99",
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.98",
18
+ "@stable-harness/core": "0.0.99",
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.98",
3
+ "version": "0.0.99",
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.98"
14
+ "@stable-harness/core": "0.0.99"
15
15
  }
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/cli",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
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.98",
18
- "@stable-harness/adapter-langgraph": "0.0.98",
19
- "@stable-harness/core": "0.0.98",
20
- "@stable-harness/memory": "0.0.98",
21
- "@stable-harness/protocols": "0.0.98",
22
- "@stable-harness/tool-gateway": "0.0.98",
23
- "@stable-harness/workspace-yaml": "0.0.98"
17
+ "@stable-harness/adapter-deepagents": "0.0.99",
18
+ "@stable-harness/adapter-langgraph": "0.0.99",
19
+ "@stable-harness/core": "0.0.99",
20
+ "@stable-harness/memory": "0.0.99",
21
+ "@stable-harness/protocols": "0.0.99",
22
+ "@stable-harness/tool-gateway": "0.0.99",
23
+ "@stable-harness/workspace-yaml": "0.0.99"
24
24
  }
25
25
  }
@@ -1 +1 @@
1
- export function buildRawArgsRecoveryRequest(e){if(!toolCallRecoveryEnabled(e.policy))return;const t=findUniqueRawArgsTool(e);return t?{...e.request,input:[e.request.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.request.metadata,stableHarnessRecovery:"tool_call"}}:void 0}export function hasUniqueRawArgsTool(e){return toolCallRecoveryEnabled(e.policy)&&Boolean(findUniqueRawArgsTool(e))}function findUniqueRawArgsTool(e){const t=function parseStandaloneJsonObject(e){const t=e.trim(),r=t.match(/^```(?:json)?\s*\n([\s\S]*?)\n```$/iu)?.[1]?.trim(),o=r??t;if(o.startsWith("{")&&o.endsWith("}")&&!(o.length>6e3))try{const e=JSON.parse(o);return!isRecord(e)||function isToolCallEnvelope(e){const t=["tool","tool_name","name","type","subagent_type"].some(t=>"string"==typeof e[t]),r=["args","arguments","parameters","kwargs"].some(t=>t in e);return t&&r}(e)||function isRuntimeControlObject(e){return"string"==typeof e.status||"string"==typeof e.error||"string"==typeof e.controlStatus}(e)?void 0:e}catch{return}}(e.output);if(!t)return;const r=e.agent.tools.filter(r=>function schemaMatchesArgs(e,t){if(!isRecord(e)||"object"!==e.type||!isRecord(e.properties))return!1;if(readStringArray(e.required).some(e=>!(e in t)))return!1;const r=e.properties;return(!1!==e.additionalProperties||!Object.keys(t).some(e=>!(e in r)))&&Object.entries(t).every(([e,t])=>function propertyAcceptsValue(e,t){return!isRecord(e)||"string"!=typeof e.type||("string"===e.type?"string"==typeof t:"number"===e.type?"number"==typeof t:"integer"===e.type?Number.isInteger(t):"boolean"===e.type?"boolean"==typeof t:"array"===e.type?Array.isArray(t):"object"!==e.type||isRecord(t))}(r[e],t))}(e.workspace.tools.get(r)?.schema??e.toolGateway?.get(r)?.schema,t));if(1===r.length)return{toolId:r[0],args:t};const o=function latestSingleToolCandidate(e,t){for(let r=(e?.length??0)-1;r>=0;r-=1){const o=e[r];if(!o||!("diagnostics"in o)||!isRecord(o.diagnostics))continue;const n=readStringArray(o.diagnostics.toolCandidateIds).filter(e=>t.has(e));if(1===n.length)return n[0];if(n.length>1)return}}(e.events,new Set(e.agent.tools));return o?{toolId:o,args:t}:void 0}function toolCallRecoveryEnabled(e){return!!(isRecord(e)&&isRecord(e.recovery)&&isRecord(e.recovery.toolCall))&&!0===e.recovery.toolCall.enabled}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
1
+ import{selectCallCandidateByArgsSchema as e}from"@easynet/better-call";export function buildRawArgsRecoveryRequest(e){if(!toolCallRecoveryEnabled(e.policy))return;const t=findUniqueRawArgsTool(e);return t?{...e.request,input:[e.request.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.request.metadata,stableHarnessRecovery:"tool_call"}}:void 0}export function hasUniqueRawArgsTool(e){return toolCallRecoveryEnabled(e.policy)&&Boolean(findUniqueRawArgsTool(e))}function findUniqueRawArgsTool(t){const o=function parseStandaloneJsonObject(e){const t=e.trim(),o=t.match(/^```(?:json)?\s*\n([\s\S]*?)\n```$/iu)?.[1]?.trim(),n=o??t;if(n.startsWith("{")&&n.endsWith("}")&&!(n.length>6e3))try{const e=JSON.parse(n);return!isRecord(e)||function isToolCallEnvelope(e){const t=["tool","tool_name","name","type","subagent_type"].some(t=>"string"==typeof e[t]),o=["args","arguments","parameters","kwargs"].some(t=>t in e);return t&&o}(e)||function isRuntimeControlObject(e){return"string"==typeof e.status||"string"==typeof e.error||"string"==typeof e.controlStatus}(e)?void 0:e}catch{return}}(t.output);if(!o)return;const n=e({args:o,candidates:buildCallCandidates(t)});if(n.ok)return{toolId:n.candidateId,args:n.args};const r=function latestSingleToolCandidate(e,t){for(let o=(e?.length??0)-1;o>=0;o-=1){const n=e[o];if(!n||!("diagnostics"in n)||!isRecord(n.diagnostics))continue;const r=readStringArray(n.diagnostics.toolCandidateIds).filter(e=>t.has(e));if(1===r.length)return r[0];if(r.length>1)return}}(t.events,new Set(t.agent.tools));return r?{toolId:r,args:o}:void 0}function buildCallCandidates(e){return e.agent.tools.map(t=>({id:t,schema:e.workspace.tools.get(t)?.schema??e.toolGateway?.get(t)?.schema}))}function toolCallRecoveryEnabled(e){return!!(isRecord(e)&&isRecord(e.recovery)&&isRecord(e.recovery.toolCall))&&!0===e.recovery.toolCall.enabled}function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.length>0):[]}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/core",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
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.98",
15
- "@stable-harness/memory": "0.0.98"
14
+ "@stable-harness/governance": "0.0.99",
15
+ "@stable-harness/memory": "0.0.99"
16
16
  }
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/evaluation",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
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.98"
13
+ "@stable-harness/core": "0.0.99"
14
14
  }
15
15
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/governance",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/memory",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/protocols",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
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.98"
13
+ "@stable-harness/core": "0.0.99"
14
14
  }
15
15
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/tool-gateway",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/workspace-yaml",
3
- "version": "0.0.98",
3
+ "version": "0.0.99",
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.98"
14
+ "@stable-harness/core": "0.0.99"
15
15
  }
16
16
  }