stable-harness 0.0.112 → 0.0.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/node_modules/@stable-harness/adapter-deepagents/package.json +2 -2
  2. package/node_modules/@stable-harness/adapter-langgraph/package.json +2 -2
  3. package/node_modules/@stable-harness/core/dist/runtime/inspection/artifacts.d.ts +8 -1
  4. package/node_modules/@stable-harness/core/dist/runtime/inspection/artifacts.js +1 -1
  5. package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.d.ts +1 -1
  6. package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.js +1 -1
  7. package/node_modules/@stable-harness/core/dist/runtime/types.d.ts +8 -0
  8. package/node_modules/@stable-harness/core/dist/types.d.ts +3 -2
  9. package/node_modules/@stable-harness/core/package.json +3 -3
  10. package/node_modules/@stable-harness/governance/package.json +1 -1
  11. package/node_modules/@stable-harness/memory/package.json +1 -1
  12. package/node_modules/@stable-harness/protocols/dist/src/http-server.js +1 -1
  13. package/node_modules/@stable-harness/protocols/dist/src/in-process-client.js +1 -1
  14. package/node_modules/@stable-harness/protocols/package.json +2 -2
  15. package/node_modules/@stable-harness/tool-gateway/package.json +1 -1
  16. package/node_modules/@stable-harness/workspace-yaml/package.json +2 -2
  17. package/package.json +9 -9
  18. package/packages/adapter-deepagents/package.json +2 -2
  19. package/packages/adapter-langgraph/package.json +2 -2
  20. package/packages/cli/package.json +8 -8
  21. package/packages/core/dist/runtime/inspection/artifacts.d.ts +8 -1
  22. package/packages/core/dist/runtime/inspection/artifacts.js +1 -1
  23. package/packages/core/dist/runtime/inspection/methods.d.ts +1 -1
  24. package/packages/core/dist/runtime/inspection/methods.js +1 -1
  25. package/packages/core/dist/runtime/types.d.ts +8 -0
  26. package/packages/core/dist/types.d.ts +3 -2
  27. package/packages/core/package.json +3 -3
  28. package/packages/evaluation/package.json +2 -2
  29. package/packages/governance/package.json +1 -1
  30. package/packages/memory/package.json +1 -1
  31. package/packages/protocols/dist/src/http-server.js +1 -1
  32. package/packages/protocols/dist/src/in-process-client.js +1 -1
  33. package/packages/protocols/package.json +2 -2
  34. package/packages/tool-gateway/package.json +1 -1
  35. package/packages/workspace-yaml/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/adapter-deepagents",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
18
+ "@stable-harness/core": "0.0.114",
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.112",
3
+ "version": "0.0.114",
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.112"
14
+ "@stable-harness/core": "0.0.114"
15
15
  }
16
16
  }
@@ -1,4 +1,5 @@
1
- import type { RuntimeArtifactFilter, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeStore } from "../types.js";
1
+ import type { RuntimeArtifactFilter, RuntimeArtifactImportInput, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeStore } from "../types.js";
2
+ import type { RuntimeEvent } from "../events.js";
2
3
  export declare function listRuntimeArtifacts(input: {
3
4
  store: RuntimeStore;
4
5
  artifacts?: RuntimeArtifactStore;
@@ -13,3 +14,9 @@ export declare function readRuntimeArtifact(input: {
13
14
  artifacts?: RuntimeArtifactStore;
14
15
  id: string;
15
16
  }): unknown | undefined;
17
+ export declare function importRuntimeArtifact(input: {
18
+ artifacts?: RuntimeArtifactStore;
19
+ emit: (event: RuntimeEvent) => void;
20
+ artifact: RuntimeArtifactImportInput;
21
+ store: RuntimeStore;
22
+ }): RuntimeArtifactRecord | undefined;
@@ -1 +1 @@
1
- export function listRuntimeArtifacts(t){return t.artifacts?t.artifacts.listArtifacts(t.filter):t.store.listRuns().flatMap(e=>function projectRunArtifacts(t,e){return function matchesFilter(t,e){return!(e&&(e.requestId&&e.requestId!==t.requestId||e.sessionId&&e.sessionId!==t.sessionId||e.agentId&&e.agentId!==t.agentId))}(t,e)?t.artifacts.map(e=>({...e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,createdAt:t.completedAt??t.startedAt})):[]}(e,t.filter))}export function getRuntimeArtifact(t){return listRuntimeArtifacts(t).find(e=>e.id===t.id)}export function readRuntimeArtifact(t){try{return t.artifacts?.readArtifact(t.id)}catch{return}}
1
+ export function listRuntimeArtifacts(t){return t.artifacts?t.artifacts.listArtifacts(t.filter):t.store.listRuns().flatMap(e=>function projectRunArtifacts(t,e){return function matchesFilter(t,e){return!(e&&(e.requestId&&e.requestId!==t.requestId||e.sessionId&&e.sessionId!==t.sessionId||e.agentId&&e.agentId!==t.agentId))}(t,e)?t.artifacts.map(e=>({...e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,createdAt:t.completedAt??t.startedAt})):[]}(e,t.filter))}export function getRuntimeArtifact(t){return listRuntimeArtifacts(t).find(e=>e.id===t.id)}export function readRuntimeArtifact(t){try{return t.artifacts?.readArtifact(t.id)}catch{return}}export function importRuntimeArtifact(t){if(!hasText(t.artifact.id)||!hasText(t.artifact.kind)||!hasText(t.artifact.requestId))return;const e=t.store.getRun(t.artifact.requestId);if(!e)return;if(t.artifact.sessionId&&t.artifact.sessionId!==e.sessionId)return;if(t.artifact.agentId&&t.artifact.agentId!==e.agentId)return;const r={...t.artifact,agentId:e.agentId,requestId:e.requestId,sessionId:e.sessionId},a=t.artifacts?.createArtifact(r)??function localRecord(t){return{id:t.id,kind:t.kind,...t.uri?{uri:t.uri}:{},...t.metadata?{metadata:t.metadata}:{},requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,createdAt:t.createdAt??(new Date).toISOString(),...t.contentType?{contentType:t.contentType}:{},size:Buffer.byteLength(JSON.stringify(t.content??null),"utf8")}}(r);return t.emit({type:"runtime.artifact.created",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,artifact:{id:r.id,kind:r.kind,...r.uri?{uri:r.uri}:{},...r.metadata?{metadata:r.metadata}:{}}}),a}function hasText(t){return"string"==typeof t&&t.trim().length>0}
@@ -1,6 +1,6 @@
1
1
  import type { ApprovalQueue } from "@stable-harness/governance";
2
2
  import type { CompiledWorkspace, RuntimeArtifactStore, RuntimeEvent, RuntimeStore, StableHarnessRuntime } from "../../types.js";
3
- type RuntimeInspectionMethods = Pick<StableHarnessRuntime, "inspect" | "getRuntimePolicy" | "getWorkflow" | "getRun" | "listArtifacts" | "getArtifact" | "readArtifact" | "exportReplayBundle" | "listRequests" | "listSessions" | "inspectRequest" | "listApprovals" | "getApproval" | "resolveApproval">;
3
+ type RuntimeInspectionMethods = Pick<StableHarnessRuntime, "inspect" | "getRuntimePolicy" | "getWorkflow" | "getRun" | "listArtifacts" | "getArtifact" | "readArtifact" | "importArtifact" | "exportReplayBundle" | "listRequests" | "listSessions" | "inspectRequest" | "listApprovals" | "getApproval" | "resolveApproval">;
4
4
  export declare function createRuntimeInspectionMethods(input: {
5
5
  workspace: CompiledWorkspace;
6
6
  store: RuntimeStore;
@@ -1 +1 @@
1
- import{projectRequestInspection as t,projectRequestSummary as e,projectSessionSummaries as s}from"../persistence/inspection.js";import{getRuntimeArtifact as r,listRuntimeArtifacts as o,readRuntimeArtifact as a}from"./artifacts.js";import{exportRuntimeReplayBundle as i}from"./replay.js";export function createRuntimeInspectionMethods(n){return{inspect:()=>{return{workspaceRoot:n.workspace.root,agents:[...n.workspace.agents.keys()].sort(),workflows:[...n.workspace.workflows.keys()].sort(),...n.workspace.runtime.specDrivenWorkflow?{specDrivenWorkflow:(t=n.workspace.runtime.specDrivenWorkflow,{enabled:t.enabled,artifactsDir:t.artifactsDir,...t.constitution?{constitution:t.constitution}:{},phases:t.phases.map(t=>t.id)})}:{},evaluations:[...n.workspace.evaluations?.keys()??[]].sort(),...n.workspace.runtime.workflowRouting?.defaultWorkflowId?{defaultWorkflowId:n.workspace.runtime.workflowRouting.defaultWorkflowId}:{},workflowRoutes:(n.workspace.runtime.workflowRouting?.routes??[]).map(t=>t.id).sort(),models:[...n.workspace.models.keys()].sort(),tools:[...n.workspace.tools.keys()].sort(),runs:n.store.listRuns()};var t},getRuntimePolicy:()=>n.workspace.runtime,getWorkflow:t=>n.workspace.workflows.get(t),getRun:t=>n.store.getRun(t),listArtifacts:t=>o({store:n.store,artifacts:n.artifacts,filter:t}),getArtifact:t=>r({store:n.store,artifacts:n.artifacts,id:t}),readArtifact:t=>a({artifacts:n.artifacts,id:t}),exportReplayBundle:t=>i({store:n.store,artifacts:n.artifacts,requestId:t}),listRequests:t=>n.store.listRuns(t).map(e),listSessions:()=>s(n.store.listRuns()),inspectRequest:e=>{const s=n.store.getRun(e);return s?t(n.workspace,s):void 0},listApprovals:t=>n.approvals?.list(t)??Promise.resolve([]),getApproval:t=>n.approvals?.get(t)??Promise.resolve(void 0),resolveApproval:async(t,e)=>{const s=await(n.approvals?.resolve(t,e));return s&&n.emit({type:"runtime.approval.resolved",requestId:s.requestId??"",sessionId:s.sessionId??"",agentId:s.agentId??"",approval:s}),s}}}
1
+ import{projectRequestInspection as t,projectRequestSummary as e,projectSessionSummaries as s}from"../persistence/inspection.js";import{getRuntimeArtifact as r,importRuntimeArtifact as o,listRuntimeArtifacts as a,readRuntimeArtifact as i}from"./artifacts.js";import{exportRuntimeReplayBundle as n}from"./replay.js";export function createRuntimeInspectionMethods(p){return{inspect:()=>{return{workspaceRoot:p.workspace.root,agents:[...p.workspace.agents.keys()].sort(),workflows:[...p.workspace.workflows.keys()].sort(),...p.workspace.runtime.specDrivenWorkflow?{specDrivenWorkflow:(t=p.workspace.runtime.specDrivenWorkflow,{enabled:t.enabled,artifactsDir:t.artifactsDir,...t.constitution?{constitution:t.constitution}:{},phases:t.phases.map(t=>t.id)})}:{},evaluations:[...p.workspace.evaluations?.keys()??[]].sort(),...p.workspace.runtime.workflowRouting?.defaultWorkflowId?{defaultWorkflowId:p.workspace.runtime.workflowRouting.defaultWorkflowId}:{},workflowRoutes:(p.workspace.runtime.workflowRouting?.routes??[]).map(t=>t.id).sort(),models:[...p.workspace.models.keys()].sort(),tools:[...p.workspace.tools.keys()].sort(),runs:p.store.listRuns()};var t},getRuntimePolicy:()=>p.workspace.runtime,getWorkflow:t=>p.workspace.workflows.get(t),getRun:t=>p.store.getRun(t),listArtifacts:t=>a({store:p.store,artifacts:p.artifacts,filter:t}),getArtifact:t=>r({store:p.store,artifacts:p.artifacts,id:t}),readArtifact:t=>i({artifacts:p.artifacts,id:t}),importArtifact:t=>o({store:p.store,artifacts:p.artifacts,emit:p.emit,artifact:t}),exportReplayBundle:t=>n({store:p.store,artifacts:p.artifacts,requestId:t}),listRequests:t=>p.store.listRuns(t).map(e),listSessions:()=>s(p.store.listRuns()),inspectRequest:e=>{const s=p.store.getRun(e);return s?t(p.workspace,s):void 0},listApprovals:t=>p.approvals?.list(t)??Promise.resolve([]),getApproval:t=>p.approvals?.get(t)??Promise.resolve(void 0),resolveApproval:async(t,e)=>{const s=await(p.approvals?.resolve(t,e));return s&&p.emit({type:"runtime.approval.resolved",requestId:s.requestId??"",sessionId:s.sessionId??"",agentId:s.agentId??"",approval:s}),s}}}
@@ -34,6 +34,14 @@ export type RuntimeArtifactInput = RuntimeArtifact & {
34
34
  contentType?: string;
35
35
  createdAt?: string;
36
36
  };
37
+ export type RuntimeArtifactImportInput = RuntimeArtifact & {
38
+ requestId: string;
39
+ sessionId?: string;
40
+ agentId?: string;
41
+ content?: unknown;
42
+ contentType?: string;
43
+ createdAt?: string;
44
+ };
37
45
  export type RuntimeArtifactStore = {
38
46
  createArtifact(input: RuntimeArtifactInput): RuntimeArtifactRecord;
39
47
  listArtifacts(filter?: RuntimeArtifactFilter): RuntimeArtifactRecord[];
@@ -6,14 +6,14 @@ import type { RuntimeEvent, RuntimeEventListener, RuntimeEmit } from "./runtime/
6
6
  import type { RuntimeToolFailureTracker } from "./runtime/tool-failure.js";
7
7
  import type { ToolGuardrail } from "./runtime/policy/tool-invocation.js";
8
8
  import type { ExecutionEvaluatorRule } from "./quality/execution-review.js";
9
- import type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactRecord, RuntimeOutput, RuntimeRecordState, RuntimeRequest, RuntimeResponse, RuntimeReplayBundle, RuntimeDeletionResult, RuntimeRunFilter, RuntimeRunRecord } from "./runtime/types.js";
9
+ import type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactImportInput, RuntimeArtifactRecord, RuntimeOutput, RuntimeRecordState, RuntimeRequest, RuntimeResponse, RuntimeReplayBundle, RuntimeDeletionResult, RuntimeRunFilter, RuntimeRunRecord } from "./runtime/types.js";
10
10
  import type { RuntimeToolGateway } from "./runtime/tool-gateway.js";
11
11
  import type { CompiledWorkspace, WorkspaceAgent, WorkspaceRuntimePolicy } from "./workspace/types.js";
12
12
  export type { RuntimeEvent, RuntimeMemoryHook, RuntimeEventListener, RuntimeEmit } from "./runtime/events.js";
13
13
  export type { BoundaryScanFinding, BoundaryScanLayer, BoundaryScanLayerResult, BoundaryScanResource, BoundaryScanResult } from "./boundary-scan.js";
14
14
  export type { RuntimeCapabilityContext, RuntimeCapabilityModule, RuntimeCapabilityRegistry, RuntimeCapabilityState } from "./runtime/capabilities.js";
15
15
  export type { RuntimeProgressNarrationOptions, RuntimeProgressNarrationProvider } from "./runtime/progress-narration.js";
16
- export type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactInput, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeOutputArtifact, RuntimeCancelIntentInput, RuntimeHeartbeatInput, RuntimeMemoryCandidateInput, RuntimeOutput, RuntimeQueueClaimInput, RuntimeQueueRecord, RuntimeQueueStore, RuntimeRecoveryIntent, RuntimeRecordState, RuntimeRequest, RuntimeRequestControlRecord, RuntimeRequestMemory, RuntimeResponse, RuntimeDeletionResult, RuntimeReplayBundle, RuntimeReplayBundleIntegrity, RuntimeRunFilter, RuntimeRunRecord, RuntimeStore, RuntimeStoreRunPatch, RuntimeStuckRequestInput, } from "./runtime/types.js";
16
+ export type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactImportInput, RuntimeArtifactInput, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeOutputArtifact, RuntimeCancelIntentInput, RuntimeHeartbeatInput, RuntimeMemoryCandidateInput, RuntimeOutput, RuntimeQueueClaimInput, RuntimeQueueRecord, RuntimeQueueStore, RuntimeRecoveryIntent, RuntimeRecordState, RuntimeRequest, RuntimeRequestControlRecord, RuntimeRequestMemory, RuntimeResponse, RuntimeDeletionResult, RuntimeReplayBundle, RuntimeReplayBundleIntegrity, RuntimeRunFilter, RuntimeRunRecord, RuntimeStore, RuntimeStoreRunPatch, RuntimeStuckRequestInput, } from "./runtime/types.js";
17
17
  export type { CompiledWorkspace, WorkspaceAdapterPolicy, WorkspaceAgent, WorkspaceBoundaryDiagnostic, WorkspaceBoundaryDiagnosticCode, WorkspaceBoundaryScanPolicy, WorkspaceMemory, WorkspaceModel, WorkspaceRetryPolicy, WorkspaceRetryReason, WorkspaceRetryTargetPolicy, WorkspaceRuntimePolicy, WorkspaceSkill, WorkspaceTool, WorkspaceToolRetryPolicy, WorkspaceValidationPolicy, } from "./workspace/types.js";
18
18
  export type { WorkspaceToolQualityDiagnostic, WorkspaceToolQualityDiagnosticCode, WorkspaceToolQualityPolicy, } from "./workspace/tool-quality.js";
19
19
  export type { WorkspaceEvaluation, WorkspaceEvaluationCase, } from "./evaluations/index.js";
@@ -134,6 +134,7 @@ export type RuntimeInspector = {
134
134
  listArtifacts(filter?: RuntimeArtifactFilter): RuntimeArtifactRecord[];
135
135
  getArtifact(id: string): RuntimeArtifactRecord | undefined;
136
136
  readArtifact(id: string): unknown | undefined;
137
+ importArtifact(input: RuntimeArtifactImportInput): RuntimeArtifactRecord | undefined;
137
138
  exportReplayBundle(requestId: string): RuntimeReplayBundle | undefined;
138
139
  listRequests(filter?: RuntimeRunFilter): RuntimeRequestSummary[];
139
140
  listSessions(): RuntimeSessionSummary[];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/core",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
15
- "@stable-harness/memory": "0.0.112"
14
+ "@stable-harness/governance": "0.0.114",
15
+ "@stable-harness/memory": "0.0.114"
16
16
  }
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/governance",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
3
+ "version": "0.0.114",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",
@@ -1 +1 @@
1
- import{createServer as e}from"node:http";import{compileWorkflowPlan as t,projectRuntimeTrace as n,projectRuntimeTraceSpans as r,renderStableHarnessPrometheusMetrics as o,renderWorkflowMermaid as s}from"@stable-harness/core";import{readRuntimeEventFilter as a,streamRuntimeEvents as d}from"./http-events.js";export function createHttpServer(u){return e((e,i)=>{!async function handleHttpRequest(e,u,i){try{await async function routeHttpRequest(e,u,i){(function handleSystemRoutes(e,t,n){return"GET"===t.method&&"/health"===t.url?(sendJson(n,200,{ok:!0}),!0):"GET"===t.method&&"/metrics"===t.url?(function sendText(e,t,n,r="text/plain; charset=utf-8"){e.writeHead(t,{"content-type":r}),e.end(n)}(n,200,o({runtime:e}),"text/plain; version=0.0.4; charset=utf-8"),!0):"GET"===t.method&&"/inspect"===t.url&&(sendJson(n,200,e.inspect()),!0)})(e,u,i)||function handleEventRoutes(e,t,n){const r=a(t.url);return!("GET"!==t.method||!r||(d({runtime:e,request:t,response:n,filter:r}),0))}(e,u,i)||await async function handleAdministrationRoutes(e){const{runtime:t,request:n,response:r}=e;if("GET"===n.method&&"/sessions"===n.url)return sendJson(r,200,t.listSessions()),!0;const o=function readSessionDeleteId(e){const t=(e??"").match(/^\/sessions\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("DELETE"===n.method&&o)return sendJson(r,200,t.deleteSession(o)),!0;const s=function readRequestDeleteId(e){const t=(e??"").match(/^\/requests\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("DELETE"===n.method&&s)return sendJson(r,200,t.deleteRequest(s)),!0;if("GET"===n.method&&n.url?.startsWith("/memories"))return sendJson(r,200,await t.listMemories(function readMemoryList(e){const t=new URL(e??"/memories","http://stable-harness.local"),n=t.searchParams.getAll("status").filter(e=>"active"===e||"stale"===e||"conflicted"===e||"archived"===e||"pending_review"===e);return{...t.searchParams.get("namespace")?{namespace:t.searchParams.get("namespace")}:{},...n.length>0?{statuses:n}:{}}}(n.url))),!0;if("POST"===n.method&&"/memories"===n.url){const e=await readJson(n);return sendJson(r,200,await t.memorize(e)),!0}if("POST"===n.method&&"/memories/recall"===n.url){const e=await readJson(n);return sendJson(r,200,await t.recallMemories(e)),!0}const a=function readMemoryArchiveId(e){const t=(e??"").match(/^\/memories\/([^/]+)\/archive$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("POST"===n.method&&a){const e=await readJson(n);return sendJson(r,200,await t.archiveMemory(a,"string"==typeof e.reason?e.reason:void 0)),!0}const d=function readMemoryUpdateId(e){const t=(e??"").match(/^\/memories\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);return!("PATCH"!==n.method||!d||(sendJson(r,200,await t.updateMemory({id:d,...await readJson(n)})),0))}({runtime:e,request:u,response:i})||function handleArtifactRoutes(e,t,n){const r=function readArtifactList(e){if(!e?.startsWith("/artifacts"))return;const t=new URL(e,"http://stable-harness.local");return"/artifacts"===t.pathname?{...t.searchParams.get("requestId")?{requestId:t.searchParams.get("requestId")}:{},...t.searchParams.get("sessionId")?{sessionId:t.searchParams.get("sessionId")}:{},...t.searchParams.get("agentId")?{agentId:t.searchParams.get("agentId")}:{}}:void 0}(t.url);if("GET"===t.method&&r)return sendJson(n,200,e.listArtifacts(r)),!0;const o=function readArtifactContentId(e){const t=(e??"").match(/^\/artifacts\/([^/]+)\/content$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&o){const t=e.getArtifact(o),r=e.readArtifact(o);return sendJson(n,t&&void 0!==r?200:404,t&&void 0!==r?{artifact:t,content:r}:{error:"artifact_content_not_found"}),!0}const s=function readArtifactId(e){const t=(e??"").match(/^\/artifacts\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&s){const t=e.getArtifact(s);return sendJson(n,t?200:404,t??{error:"artifact_not_found"}),!0}return!1}(e,u,i)||await async function handleApprovalRoutes(e,t,n){const r=function readApprovalList(e){if(!e?.startsWith("/approvals"))return;const t=new URL(e,"http://stable-harness.local");if("/approvals"!==t.pathname)return;const n=t.searchParams.get("status");return{status:"pending"===n||"approved"===n||"rejected"===n?n:void 0}}(t.url);if("GET"===t.method&&r)return sendJson(n,200,await e.listApprovals(r.status)),!0;const o=function readApprovalDecision(e){const t=(e??"").match(/^\/approvals\/([^/]+)\/(approve|reject)$/u);if(t?.[1]&&t[2])return{id:decodeURIComponent(t[1]),status:"approve"===t[2]?"approved":"rejected"}}(t.url);if("POST"===t.method&&o){const t=await e.resolveApproval(o.id,o.status);return sendJson(n,t?200:404,t??{error:"approval_not_found"}),!0}return!1}(e,u,i)||await async function handleRequestRoutes(e,t,n){if("GET"===t.method&&"/requests"===t.url)return sendJson(n,200,e.listRequests()),!0;const r=function readRequestList(e){if(!e?.startsWith("/requests"))return;const t=new URL(e,"http://stable-harness.local");return"/requests"===t.pathname?{...t.searchParams.get("agentId")?{agentId:t.searchParams.get("agentId")}:{},...t.searchParams.get("sessionId")?{sessionId:t.searchParams.get("sessionId")}:{},...readRunState(t.searchParams.get("state"))?{state:readRunState(t.searchParams.get("state"))}:{}}:void 0}(t.url);if("GET"===t.method&&r)return sendJson(n,200,e.listRequests(r)),!0;const o=function readRequestCancelId(e){const t=(e??"").match(/^\/requests\/([^/]+)\/cancel$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("POST"===t.method&&o){const r=await readJson(t);return e.cancel(o,"string"==typeof r.reason?r.reason:void 0),sendJson(n,200,e.inspectRequest(o)??{error:"request_not_found"}),!0}if("POST"===t.method&&"/requests"===t.url){const r=await readJson(t);return sendJson(n,200,await e.request(function readRuntimeRequest(e){const t=function readToolCall(e){if("object"!=typeof e||null===e)return;const t=e;return"string"==typeof t.toolId?{toolId:t.toolId,args:t.args}:void 0}(e.toolCall),n=function readWorkflow(e){const t=readRecord(e);if(t)return{..."string"==typeof t.workflowId?{workflowId:t.workflowId}:{},..."string"==typeof t.routeId?{routeId:t.routeId}:{},...void 0!==t.input?{input:t.input}:{},..."object"==typeof t.metadata&&t.metadata?{metadata:t.metadata}:{}}}(e.workflow),r=function readMemory(e){const t=readRecord(e);if(t)return{..."string"==typeof t.namespace?{namespace:t.namespace}:{},...!1===t.recall||readRecord(t.recall)?{recall:t.recall}:{},...Array.isArray(t.candidates)?{candidates:t.candidates}:{}}}(e.memory),o=readRecord(e.metadata);return{input:"string"==typeof e.input?e.input:"",..."string"==typeof e.agentId?{agentId:e.agentId}:{},..."string"==typeof e.sessionId?{sessionId:e.sessionId}:{},..."string"==typeof e.requestId?{requestId:e.requestId}:{},..."string"==typeof e.parentRunId?{parentRunId:e.parentRunId}:{},...t?{toolCall:t}:{},...n?{workflow:n}:{},...r?{memory:r}:{},...o?{metadata:o}:{}}}(r))),!0}return!1}(e,u,i)||function handleWorkflowRoutes(e,n,r){if("GET"===n.method&&"/workflows"===n.url)return sendJson(r,200,e.inspect().workflows),!0;const o=function readWorkflowMermaidId(e){const t=(e??"").match(/^\/workflows\/([^/]+)\/mermaid$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("GET"===n.method&&o){const t=e.getWorkflow(o);return sendJson(r,t?200:404,t?{mermaid:s(t)}:{error:"workflow_not_found"}),!0}const a=function readWorkflowPlanId(e){const t=(e??"").match(/^\/workflows\/([^/]+)\/plan$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("GET"===n.method&&a){const n=e.getWorkflow(a);return sendJson(r,n?200:404,n?t(n):{error:"workflow_not_found"}),!0}return!1}(e,u,i)||function handleRunInspectionRoutes(e,t,o){const s=function readRequestInspectionId(e){const t=(e??"").match(/^\/requests\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&s){const t=e.inspectRequest(s);return sendJson(o,t?200:404,t??{error:"request_not_found"}),!0}const a=function readTraceRequestId(e){const t=(e??"").match(/^\/runs\/([^/]+)\/trace$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&a){const t=e.getRun(a);return sendJson(o,t?200:404,t?n(t):{error:"run_not_found"}),!0}const d=function readSpanRequestId(e){const t=(e??"").match(/^\/runs\/([^/]+)\/spans$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&d){const t=e.getRun(d);return sendJson(o,t?200:404,t?r(t):{error:"run_not_found"}),!0}const u=function readReplayRequestId(e){const t=(e??"").match(/^\/requests\/([^/]+)\/replay$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&u){const t=e.exportReplayBundle(u);return sendJson(o,t?200:404,t??{error:"run_not_found"}),!0}return!1}(e,u,i)||sendJson(i,404,{error:"not_found"})}(e,u,i)}catch(e){sendJson(i,500,{error:e instanceof Error?e.message:String(e)})}}(u,e,i)})}function readRunState(e){return"queued"===e||"running"===e||"completed"===e||"failed"===e||"cancelled"===e?e:void 0}function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}function sendJson(e,t,n){e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))}async function readJson(e){const t=[];for await(const n of e)t.push(Buffer.isBuffer(n)?n:Buffer.from(n));return 0===t.length?{}:JSON.parse(Buffer.concat(t).toString("utf8"))}
1
+ import{createServer as e}from"node:http";import{compileWorkflowPlan as t,projectRuntimeTrace as n,projectRuntimeTraceSpans as r,renderStableHarnessPrometheusMetrics as o,renderWorkflowMermaid as s}from"@stable-harness/core";import{readRuntimeEventFilter as a,streamRuntimeEvents as d}from"./http-events.js";export function createHttpServer(i){return e((e,u)=>{!async function handleHttpRequest(e,i,u){try{await async function routeHttpRequest(e,i,u){(function handleSystemRoutes(e,t,n){return"GET"===t.method&&"/health"===t.url?(sendJson(n,200,{ok:!0}),!0):"GET"===t.method&&"/metrics"===t.url?(function sendText(e,t,n,r="text/plain; charset=utf-8"){e.writeHead(t,{"content-type":r}),e.end(n)}(n,200,o({runtime:e}),"text/plain; version=0.0.4; charset=utf-8"),!0):"GET"===t.method&&"/inspect"===t.url&&(sendJson(n,200,e.inspect()),!0)})(e,i,u)||function handleEventRoutes(e,t,n){const r=a(t.url);return!("GET"!==t.method||!r||(d({runtime:e,request:t,response:n,filter:r}),0))}(e,i,u)||await async function handleAdministrationRoutes(e){const{runtime:t,request:n,response:r}=e;if("GET"===n.method&&"/sessions"===n.url)return sendJson(r,200,t.listSessions()),!0;const o=function readSessionDeleteId(e){const t=(e??"").match(/^\/sessions\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("DELETE"===n.method&&o)return sendJson(r,200,t.deleteSession(o)),!0;const s=function readRequestDeleteId(e){const t=(e??"").match(/^\/requests\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("DELETE"===n.method&&s)return sendJson(r,200,t.deleteRequest(s)),!0;if("GET"===n.method&&n.url?.startsWith("/memories"))return sendJson(r,200,await t.listMemories(function readMemoryList(e){const t=new URL(e??"/memories","http://stable-harness.local"),n=t.searchParams.getAll("status").filter(e=>"active"===e||"stale"===e||"conflicted"===e||"archived"===e||"pending_review"===e);return{...t.searchParams.get("namespace")?{namespace:t.searchParams.get("namespace")}:{},...n.length>0?{statuses:n}:{}}}(n.url))),!0;if("POST"===n.method&&"/memories"===n.url){const e=await readJson(n);return sendJson(r,200,await t.memorize(e)),!0}if("POST"===n.method&&"/memories/recall"===n.url){const e=await readJson(n);return sendJson(r,200,await t.recallMemories(e)),!0}const a=function readMemoryArchiveId(e){const t=(e??"").match(/^\/memories\/([^/]+)\/archive$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("POST"===n.method&&a){const e=await readJson(n);return sendJson(r,200,await t.archiveMemory(a,"string"==typeof e.reason?e.reason:void 0)),!0}const d=function readMemoryUpdateId(e){const t=(e??"").match(/^\/memories\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);return!("PATCH"!==n.method||!d||(sendJson(r,200,await t.updateMemory({id:d,...await readJson(n)})),0))}({runtime:e,request:i,response:u})||await async function handleArtifactRoutes(e,t,n){const r=function readArtifactList(e){if(!e?.startsWith("/artifacts"))return;const t=new URL(e,"http://stable-harness.local");return"/artifacts"===t.pathname?{...t.searchParams.get("requestId")?{requestId:t.searchParams.get("requestId")}:{},...t.searchParams.get("sessionId")?{sessionId:t.searchParams.get("sessionId")}:{},...t.searchParams.get("agentId")?{agentId:t.searchParams.get("agentId")}:{}}:void 0}(t.url);if("POST"===t.method&&r){const r=function readArtifactImport(e){const t=readRecord(e.metadata);return{id:"string"==typeof e.id?e.id:"",kind:"string"==typeof e.kind?e.kind:"artifact",requestId:"string"==typeof e.requestId?e.requestId:"",..."string"==typeof e.sessionId?{sessionId:e.sessionId}:{},..."string"==typeof e.agentId?{agentId:e.agentId}:{},..."string"==typeof e.uri?{uri:e.uri}:{},...t?{metadata:t}:{},...void 0!==e.content?{content:e.content}:{},..."string"==typeof e.contentType?{contentType:e.contentType}:{},..."string"==typeof e.createdAt?{createdAt:e.createdAt}:{}}}(await readJson(t)),o=function validateArtifactImport(e){const t=[];return hasText(e.id)||t.push("id is required"),hasText(e.kind)||t.push("kind is required"),hasText(e.requestId)||t.push("requestId is required"),t}(r);if(o.length>0)return sendJson(n,400,{error:"artifact_import_invalid",issues:o}),!0;const s=e.importArtifact(r);return sendJson(n,s?201:404,s??{error:"artifact_import_target_not_found"}),!0}if("GET"===t.method&&r)return sendJson(n,200,e.listArtifacts(r)),!0;const o=function readArtifactContentId(e){const t=(e??"").match(/^\/artifacts\/([^/]+)\/content$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&o){const t=e.getArtifact(o),r=e.readArtifact(o);return sendJson(n,t&&void 0!==r?200:404,t&&void 0!==r?{artifact:t,content:r}:{error:"artifact_content_not_found"}),!0}const s=function readArtifactId(e){const t=(e??"").match(/^\/artifacts\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&s){const t=e.getArtifact(s);return sendJson(n,t?200:404,t??{error:"artifact_not_found"}),!0}return!1}(e,i,u)||await async function handleApprovalRoutes(e,t,n){const r=function readApprovalList(e){if(!e?.startsWith("/approvals"))return;const t=new URL(e,"http://stable-harness.local");if("/approvals"!==t.pathname)return;const n=t.searchParams.get("status");return{status:"pending"===n||"approved"===n||"rejected"===n?n:void 0}}(t.url);if("GET"===t.method&&r)return sendJson(n,200,await e.listApprovals(r.status)),!0;const o=function readApprovalDecision(e){const t=(e??"").match(/^\/approvals\/([^/]+)\/(approve|reject)$/u);if(t?.[1]&&t[2])return{id:decodeURIComponent(t[1]),status:"approve"===t[2]?"approved":"rejected"}}(t.url);if("POST"===t.method&&o){const t=await e.resolveApproval(o.id,o.status);return sendJson(n,t?200:404,t??{error:"approval_not_found"}),!0}return!1}(e,i,u)||await async function handleRequestRoutes(e,t,n){if("GET"===t.method&&"/requests"===t.url)return sendJson(n,200,e.listRequests()),!0;const r=function readRequestList(e){if(!e?.startsWith("/requests"))return;const t=new URL(e,"http://stable-harness.local");return"/requests"===t.pathname?{...t.searchParams.get("agentId")?{agentId:t.searchParams.get("agentId")}:{},...t.searchParams.get("sessionId")?{sessionId:t.searchParams.get("sessionId")}:{},...readRunState(t.searchParams.get("state"))?{state:readRunState(t.searchParams.get("state"))}:{}}:void 0}(t.url);if("GET"===t.method&&r)return sendJson(n,200,e.listRequests(r)),!0;const o=function readRequestCancelId(e){const t=(e??"").match(/^\/requests\/([^/]+)\/cancel$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("POST"===t.method&&o){const r=await readJson(t);return e.cancel(o,"string"==typeof r.reason?r.reason:void 0),sendJson(n,200,e.inspectRequest(o)??{error:"request_not_found"}),!0}if("POST"===t.method&&"/requests"===t.url){const r=await readJson(t);return sendJson(n,200,await e.request(function readRuntimeRequest(e){const t=function readToolCall(e){if("object"!=typeof e||null===e)return;const t=e;return"string"==typeof t.toolId?{toolId:t.toolId,args:t.args}:void 0}(e.toolCall),n=function readWorkflow(e){const t=readRecord(e);if(t)return{..."string"==typeof t.workflowId?{workflowId:t.workflowId}:{},..."string"==typeof t.routeId?{routeId:t.routeId}:{},...void 0!==t.input?{input:t.input}:{},..."object"==typeof t.metadata&&t.metadata?{metadata:t.metadata}:{}}}(e.workflow),r=function readMemory(e){const t=readRecord(e);if(t)return{..."string"==typeof t.namespace?{namespace:t.namespace}:{},...!1===t.recall||readRecord(t.recall)?{recall:t.recall}:{},...Array.isArray(t.candidates)?{candidates:t.candidates}:{}}}(e.memory),o=readRecord(e.metadata);return{input:"string"==typeof e.input?e.input:"",..."string"==typeof e.agentId?{agentId:e.agentId}:{},..."string"==typeof e.sessionId?{sessionId:e.sessionId}:{},..."string"==typeof e.requestId?{requestId:e.requestId}:{},..."string"==typeof e.parentRunId?{parentRunId:e.parentRunId}:{},...t?{toolCall:t}:{},...n?{workflow:n}:{},...r?{memory:r}:{},...o?{metadata:o}:{}}}(r))),!0}return!1}(e,i,u)||function handleWorkflowRoutes(e,n,r){if("GET"===n.method&&"/workflows"===n.url)return sendJson(r,200,e.inspect().workflows),!0;const o=function readWorkflowMermaidId(e){const t=(e??"").match(/^\/workflows\/([^/]+)\/mermaid$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("GET"===n.method&&o){const t=e.getWorkflow(o);return sendJson(r,t?200:404,t?{mermaid:s(t)}:{error:"workflow_not_found"}),!0}const a=function readWorkflowPlanId(e){const t=(e??"").match(/^\/workflows\/([^/]+)\/plan$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("GET"===n.method&&a){const n=e.getWorkflow(a);return sendJson(r,n?200:404,n?t(n):{error:"workflow_not_found"}),!0}return!1}(e,i,u)||function handleRunInspectionRoutes(e,t,o){const s=function readRequestInspectionId(e){const t=(e??"").match(/^\/requests\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&s){const t=e.inspectRequest(s);return sendJson(o,t?200:404,t??{error:"request_not_found"}),!0}const a=function readTraceRequestId(e){const t=(e??"").match(/^\/runs\/([^/]+)\/trace$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&a){const t=e.getRun(a);return sendJson(o,t?200:404,t?n(t):{error:"run_not_found"}),!0}const d=function readSpanRequestId(e){const t=(e??"").match(/^\/runs\/([^/]+)\/spans$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&d){const t=e.getRun(d);return sendJson(o,t?200:404,t?r(t):{error:"run_not_found"}),!0}const i=function readReplayRequestId(e){const t=(e??"").match(/^\/requests\/([^/]+)\/replay$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&i){const t=e.exportReplayBundle(i);return sendJson(o,t?200:404,t??{error:"run_not_found"}),!0}return!1}(e,i,u)||sendJson(u,404,{error:"not_found"})}(e,i,u)}catch(e){sendJson(u,500,{error:e instanceof Error?e.message:String(e)})}}(i,e,u)})}function readRunState(e){return"queued"===e||"running"===e||"completed"===e||"failed"===e||"cancelled"===e?e:void 0}function hasText(e){return"string"==typeof e&&e.trim().length>0}function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}function sendJson(e,t,n){e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))}async function readJson(e){const t=[];for await(const n of e)t.push(Buffer.isBuffer(n)?n:Buffer.from(n));return 0===t.length?{}:JSON.parse(Buffer.concat(t).toString("utf8"))}
@@ -1 +1 @@
1
- export function createInProcessClient(e){return{request:t=>e.request(t),subscribe:t=>e.subscribe(t),inspect:()=>e.inspect(),getRuntimePolicy:()=>e.getRuntimePolicy(),getWorkflow:t=>e.getWorkflow(t),getRun:t=>e.getRun(t),listArtifacts:t=>e.listArtifacts(t),getArtifact:t=>e.getArtifact(t),readArtifact:t=>e.readArtifact(t),exportReplayBundle:t=>e.exportReplayBundle(t),listRequests:t=>e.listRequests(t),listSessions:()=>e.listSessions(),inspectRequest:t=>e.inspectRequest(t),memorize:t=>e.memorize(t),recallMemories:t=>e.recallMemories(t),listMemories:t=>e.listMemories(t),updateMemory:t=>e.updateMemory(t),archiveMemory:(t,s)=>e.archiveMemory(t,s),listApprovals:t=>e.listApprovals(t),getApproval:t=>e.getApproval(t),resolveApproval:(t,s)=>e.resolveApproval(t,s),cancel:(t,s)=>e.cancel(t,s),deleteRequest:t=>e.deleteRequest(t),deleteSession:t=>e.deleteSession(t),stop:()=>e.stop()}}
1
+ export function createInProcessClient(e){return{request:t=>e.request(t),subscribe:t=>e.subscribe(t),inspect:()=>e.inspect(),getRuntimePolicy:()=>e.getRuntimePolicy(),getWorkflow:t=>e.getWorkflow(t),getRun:t=>e.getRun(t),listArtifacts:t=>e.listArtifacts(t),getArtifact:t=>e.getArtifact(t),readArtifact:t=>e.readArtifact(t),importArtifact:t=>e.importArtifact(t),exportReplayBundle:t=>e.exportReplayBundle(t),listRequests:t=>e.listRequests(t),listSessions:()=>e.listSessions(),inspectRequest:t=>e.inspectRequest(t),memorize:t=>e.memorize(t),recallMemories:t=>e.recallMemories(t),listMemories:t=>e.listMemories(t),updateMemory:t=>e.updateMemory(t),archiveMemory:(t,s)=>e.archiveMemory(t,s),listApprovals:t=>e.listApprovals(t),getApproval:t=>e.getApproval(t),resolveApproval:(t,s)=>e.resolveApproval(t,s),cancel:(t,s)=>e.cancel(t,s),deleteRequest:t=>e.deleteRequest(t),deleteSession:t=>e.deleteSession(t),stop:()=>e.stop()}}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/protocols",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112"
13
+ "@stable-harness/core": "0.0.114"
14
14
  }
15
15
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/tool-gateway",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
3
+ "version": "0.0.114",
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.112"
14
+ "@stable-harness/core": "0.0.114"
15
15
  }
16
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stable-harness",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
86
- "@stable-harness/adapter-langgraph": "0.0.112",
87
- "@stable-harness/core": "0.0.112",
88
- "@stable-harness/governance": "0.0.112",
89
- "@stable-harness/memory": "0.0.112",
90
- "@stable-harness/protocols": "0.0.112",
91
- "@stable-harness/tool-gateway": "0.0.112",
92
- "@stable-harness/workspace-yaml": "0.0.112",
85
+ "@stable-harness/adapter-deepagents": "0.0.114",
86
+ "@stable-harness/adapter-langgraph": "0.0.114",
87
+ "@stable-harness/core": "0.0.114",
88
+ "@stable-harness/governance": "0.0.114",
89
+ "@stable-harness/memory": "0.0.114",
90
+ "@stable-harness/protocols": "0.0.114",
91
+ "@stable-harness/tool-gateway": "0.0.114",
92
+ "@stable-harness/workspace-yaml": "0.0.114",
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.112",
3
+ "version": "0.0.114",
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.112",
18
+ "@stable-harness/core": "0.0.114",
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.112",
3
+ "version": "0.0.114",
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.112"
14
+ "@stable-harness/core": "0.0.114"
15
15
  }
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/cli",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
18
- "@stable-harness/adapter-langgraph": "0.0.112",
19
- "@stable-harness/core": "0.0.112",
20
- "@stable-harness/memory": "0.0.112",
21
- "@stable-harness/protocols": "0.0.112",
22
- "@stable-harness/tool-gateway": "0.0.112",
23
- "@stable-harness/workspace-yaml": "0.0.112"
17
+ "@stable-harness/adapter-deepagents": "0.0.114",
18
+ "@stable-harness/adapter-langgraph": "0.0.114",
19
+ "@stable-harness/core": "0.0.114",
20
+ "@stable-harness/memory": "0.0.114",
21
+ "@stable-harness/protocols": "0.0.114",
22
+ "@stable-harness/tool-gateway": "0.0.114",
23
+ "@stable-harness/workspace-yaml": "0.0.114"
24
24
  }
25
25
  }
@@ -1,4 +1,5 @@
1
- import type { RuntimeArtifactFilter, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeStore } from "../types.js";
1
+ import type { RuntimeArtifactFilter, RuntimeArtifactImportInput, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeStore } from "../types.js";
2
+ import type { RuntimeEvent } from "../events.js";
2
3
  export declare function listRuntimeArtifacts(input: {
3
4
  store: RuntimeStore;
4
5
  artifacts?: RuntimeArtifactStore;
@@ -13,3 +14,9 @@ export declare function readRuntimeArtifact(input: {
13
14
  artifacts?: RuntimeArtifactStore;
14
15
  id: string;
15
16
  }): unknown | undefined;
17
+ export declare function importRuntimeArtifact(input: {
18
+ artifacts?: RuntimeArtifactStore;
19
+ emit: (event: RuntimeEvent) => void;
20
+ artifact: RuntimeArtifactImportInput;
21
+ store: RuntimeStore;
22
+ }): RuntimeArtifactRecord | undefined;
@@ -1 +1 @@
1
- export function listRuntimeArtifacts(t){return t.artifacts?t.artifacts.listArtifacts(t.filter):t.store.listRuns().flatMap(e=>function projectRunArtifacts(t,e){return function matchesFilter(t,e){return!(e&&(e.requestId&&e.requestId!==t.requestId||e.sessionId&&e.sessionId!==t.sessionId||e.agentId&&e.agentId!==t.agentId))}(t,e)?t.artifacts.map(e=>({...e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,createdAt:t.completedAt??t.startedAt})):[]}(e,t.filter))}export function getRuntimeArtifact(t){return listRuntimeArtifacts(t).find(e=>e.id===t.id)}export function readRuntimeArtifact(t){try{return t.artifacts?.readArtifact(t.id)}catch{return}}
1
+ export function listRuntimeArtifacts(t){return t.artifacts?t.artifacts.listArtifacts(t.filter):t.store.listRuns().flatMap(e=>function projectRunArtifacts(t,e){return function matchesFilter(t,e){return!(e&&(e.requestId&&e.requestId!==t.requestId||e.sessionId&&e.sessionId!==t.sessionId||e.agentId&&e.agentId!==t.agentId))}(t,e)?t.artifacts.map(e=>({...e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,createdAt:t.completedAt??t.startedAt})):[]}(e,t.filter))}export function getRuntimeArtifact(t){return listRuntimeArtifacts(t).find(e=>e.id===t.id)}export function readRuntimeArtifact(t){try{return t.artifacts?.readArtifact(t.id)}catch{return}}export function importRuntimeArtifact(t){if(!hasText(t.artifact.id)||!hasText(t.artifact.kind)||!hasText(t.artifact.requestId))return;const e=t.store.getRun(t.artifact.requestId);if(!e)return;if(t.artifact.sessionId&&t.artifact.sessionId!==e.sessionId)return;if(t.artifact.agentId&&t.artifact.agentId!==e.agentId)return;const r={...t.artifact,agentId:e.agentId,requestId:e.requestId,sessionId:e.sessionId},a=t.artifacts?.createArtifact(r)??function localRecord(t){return{id:t.id,kind:t.kind,...t.uri?{uri:t.uri}:{},...t.metadata?{metadata:t.metadata}:{},requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,createdAt:t.createdAt??(new Date).toISOString(),...t.contentType?{contentType:t.contentType}:{},size:Buffer.byteLength(JSON.stringify(t.content??null),"utf8")}}(r);return t.emit({type:"runtime.artifact.created",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,artifact:{id:r.id,kind:r.kind,...r.uri?{uri:r.uri}:{},...r.metadata?{metadata:r.metadata}:{}}}),a}function hasText(t){return"string"==typeof t&&t.trim().length>0}
@@ -1,6 +1,6 @@
1
1
  import type { ApprovalQueue } from "@stable-harness/governance";
2
2
  import type { CompiledWorkspace, RuntimeArtifactStore, RuntimeEvent, RuntimeStore, StableHarnessRuntime } from "../../types.js";
3
- type RuntimeInspectionMethods = Pick<StableHarnessRuntime, "inspect" | "getRuntimePolicy" | "getWorkflow" | "getRun" | "listArtifacts" | "getArtifact" | "readArtifact" | "exportReplayBundle" | "listRequests" | "listSessions" | "inspectRequest" | "listApprovals" | "getApproval" | "resolveApproval">;
3
+ type RuntimeInspectionMethods = Pick<StableHarnessRuntime, "inspect" | "getRuntimePolicy" | "getWorkflow" | "getRun" | "listArtifacts" | "getArtifact" | "readArtifact" | "importArtifact" | "exportReplayBundle" | "listRequests" | "listSessions" | "inspectRequest" | "listApprovals" | "getApproval" | "resolveApproval">;
4
4
  export declare function createRuntimeInspectionMethods(input: {
5
5
  workspace: CompiledWorkspace;
6
6
  store: RuntimeStore;
@@ -1 +1 @@
1
- import{projectRequestInspection as t,projectRequestSummary as e,projectSessionSummaries as s}from"../persistence/inspection.js";import{getRuntimeArtifact as r,listRuntimeArtifacts as o,readRuntimeArtifact as a}from"./artifacts.js";import{exportRuntimeReplayBundle as i}from"./replay.js";export function createRuntimeInspectionMethods(n){return{inspect:()=>{return{workspaceRoot:n.workspace.root,agents:[...n.workspace.agents.keys()].sort(),workflows:[...n.workspace.workflows.keys()].sort(),...n.workspace.runtime.specDrivenWorkflow?{specDrivenWorkflow:(t=n.workspace.runtime.specDrivenWorkflow,{enabled:t.enabled,artifactsDir:t.artifactsDir,...t.constitution?{constitution:t.constitution}:{},phases:t.phases.map(t=>t.id)})}:{},evaluations:[...n.workspace.evaluations?.keys()??[]].sort(),...n.workspace.runtime.workflowRouting?.defaultWorkflowId?{defaultWorkflowId:n.workspace.runtime.workflowRouting.defaultWorkflowId}:{},workflowRoutes:(n.workspace.runtime.workflowRouting?.routes??[]).map(t=>t.id).sort(),models:[...n.workspace.models.keys()].sort(),tools:[...n.workspace.tools.keys()].sort(),runs:n.store.listRuns()};var t},getRuntimePolicy:()=>n.workspace.runtime,getWorkflow:t=>n.workspace.workflows.get(t),getRun:t=>n.store.getRun(t),listArtifacts:t=>o({store:n.store,artifacts:n.artifacts,filter:t}),getArtifact:t=>r({store:n.store,artifacts:n.artifacts,id:t}),readArtifact:t=>a({artifacts:n.artifacts,id:t}),exportReplayBundle:t=>i({store:n.store,artifacts:n.artifacts,requestId:t}),listRequests:t=>n.store.listRuns(t).map(e),listSessions:()=>s(n.store.listRuns()),inspectRequest:e=>{const s=n.store.getRun(e);return s?t(n.workspace,s):void 0},listApprovals:t=>n.approvals?.list(t)??Promise.resolve([]),getApproval:t=>n.approvals?.get(t)??Promise.resolve(void 0),resolveApproval:async(t,e)=>{const s=await(n.approvals?.resolve(t,e));return s&&n.emit({type:"runtime.approval.resolved",requestId:s.requestId??"",sessionId:s.sessionId??"",agentId:s.agentId??"",approval:s}),s}}}
1
+ import{projectRequestInspection as t,projectRequestSummary as e,projectSessionSummaries as s}from"../persistence/inspection.js";import{getRuntimeArtifact as r,importRuntimeArtifact as o,listRuntimeArtifacts as a,readRuntimeArtifact as i}from"./artifacts.js";import{exportRuntimeReplayBundle as n}from"./replay.js";export function createRuntimeInspectionMethods(p){return{inspect:()=>{return{workspaceRoot:p.workspace.root,agents:[...p.workspace.agents.keys()].sort(),workflows:[...p.workspace.workflows.keys()].sort(),...p.workspace.runtime.specDrivenWorkflow?{specDrivenWorkflow:(t=p.workspace.runtime.specDrivenWorkflow,{enabled:t.enabled,artifactsDir:t.artifactsDir,...t.constitution?{constitution:t.constitution}:{},phases:t.phases.map(t=>t.id)})}:{},evaluations:[...p.workspace.evaluations?.keys()??[]].sort(),...p.workspace.runtime.workflowRouting?.defaultWorkflowId?{defaultWorkflowId:p.workspace.runtime.workflowRouting.defaultWorkflowId}:{},workflowRoutes:(p.workspace.runtime.workflowRouting?.routes??[]).map(t=>t.id).sort(),models:[...p.workspace.models.keys()].sort(),tools:[...p.workspace.tools.keys()].sort(),runs:p.store.listRuns()};var t},getRuntimePolicy:()=>p.workspace.runtime,getWorkflow:t=>p.workspace.workflows.get(t),getRun:t=>p.store.getRun(t),listArtifacts:t=>a({store:p.store,artifacts:p.artifacts,filter:t}),getArtifact:t=>r({store:p.store,artifacts:p.artifacts,id:t}),readArtifact:t=>i({artifacts:p.artifacts,id:t}),importArtifact:t=>o({store:p.store,artifacts:p.artifacts,emit:p.emit,artifact:t}),exportReplayBundle:t=>n({store:p.store,artifacts:p.artifacts,requestId:t}),listRequests:t=>p.store.listRuns(t).map(e),listSessions:()=>s(p.store.listRuns()),inspectRequest:e=>{const s=p.store.getRun(e);return s?t(p.workspace,s):void 0},listApprovals:t=>p.approvals?.list(t)??Promise.resolve([]),getApproval:t=>p.approvals?.get(t)??Promise.resolve(void 0),resolveApproval:async(t,e)=>{const s=await(p.approvals?.resolve(t,e));return s&&p.emit({type:"runtime.approval.resolved",requestId:s.requestId??"",sessionId:s.sessionId??"",agentId:s.agentId??"",approval:s}),s}}}
@@ -34,6 +34,14 @@ export type RuntimeArtifactInput = RuntimeArtifact & {
34
34
  contentType?: string;
35
35
  createdAt?: string;
36
36
  };
37
+ export type RuntimeArtifactImportInput = RuntimeArtifact & {
38
+ requestId: string;
39
+ sessionId?: string;
40
+ agentId?: string;
41
+ content?: unknown;
42
+ contentType?: string;
43
+ createdAt?: string;
44
+ };
37
45
  export type RuntimeArtifactStore = {
38
46
  createArtifact(input: RuntimeArtifactInput): RuntimeArtifactRecord;
39
47
  listArtifacts(filter?: RuntimeArtifactFilter): RuntimeArtifactRecord[];
@@ -6,14 +6,14 @@ import type { RuntimeEvent, RuntimeEventListener, RuntimeEmit } from "./runtime/
6
6
  import type { RuntimeToolFailureTracker } from "./runtime/tool-failure.js";
7
7
  import type { ToolGuardrail } from "./runtime/policy/tool-invocation.js";
8
8
  import type { ExecutionEvaluatorRule } from "./quality/execution-review.js";
9
- import type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactRecord, RuntimeOutput, RuntimeRecordState, RuntimeRequest, RuntimeResponse, RuntimeReplayBundle, RuntimeDeletionResult, RuntimeRunFilter, RuntimeRunRecord } from "./runtime/types.js";
9
+ import type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactImportInput, RuntimeArtifactRecord, RuntimeOutput, RuntimeRecordState, RuntimeRequest, RuntimeResponse, RuntimeReplayBundle, RuntimeDeletionResult, RuntimeRunFilter, RuntimeRunRecord } from "./runtime/types.js";
10
10
  import type { RuntimeToolGateway } from "./runtime/tool-gateway.js";
11
11
  import type { CompiledWorkspace, WorkspaceAgent, WorkspaceRuntimePolicy } from "./workspace/types.js";
12
12
  export type { RuntimeEvent, RuntimeMemoryHook, RuntimeEventListener, RuntimeEmit } from "./runtime/events.js";
13
13
  export type { BoundaryScanFinding, BoundaryScanLayer, BoundaryScanLayerResult, BoundaryScanResource, BoundaryScanResult } from "./boundary-scan.js";
14
14
  export type { RuntimeCapabilityContext, RuntimeCapabilityModule, RuntimeCapabilityRegistry, RuntimeCapabilityState } from "./runtime/capabilities.js";
15
15
  export type { RuntimeProgressNarrationOptions, RuntimeProgressNarrationProvider } from "./runtime/progress-narration.js";
16
- export type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactInput, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeOutputArtifact, RuntimeCancelIntentInput, RuntimeHeartbeatInput, RuntimeMemoryCandidateInput, RuntimeOutput, RuntimeQueueClaimInput, RuntimeQueueRecord, RuntimeQueueStore, RuntimeRecoveryIntent, RuntimeRecordState, RuntimeRequest, RuntimeRequestControlRecord, RuntimeRequestMemory, RuntimeResponse, RuntimeDeletionResult, RuntimeReplayBundle, RuntimeReplayBundleIntegrity, RuntimeRunFilter, RuntimeRunRecord, RuntimeStore, RuntimeStoreRunPatch, RuntimeStuckRequestInput, } from "./runtime/types.js";
16
+ export type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactImportInput, RuntimeArtifactInput, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeOutputArtifact, RuntimeCancelIntentInput, RuntimeHeartbeatInput, RuntimeMemoryCandidateInput, RuntimeOutput, RuntimeQueueClaimInput, RuntimeQueueRecord, RuntimeQueueStore, RuntimeRecoveryIntent, RuntimeRecordState, RuntimeRequest, RuntimeRequestControlRecord, RuntimeRequestMemory, RuntimeResponse, RuntimeDeletionResult, RuntimeReplayBundle, RuntimeReplayBundleIntegrity, RuntimeRunFilter, RuntimeRunRecord, RuntimeStore, RuntimeStoreRunPatch, RuntimeStuckRequestInput, } from "./runtime/types.js";
17
17
  export type { CompiledWorkspace, WorkspaceAdapterPolicy, WorkspaceAgent, WorkspaceBoundaryDiagnostic, WorkspaceBoundaryDiagnosticCode, WorkspaceBoundaryScanPolicy, WorkspaceMemory, WorkspaceModel, WorkspaceRetryPolicy, WorkspaceRetryReason, WorkspaceRetryTargetPolicy, WorkspaceRuntimePolicy, WorkspaceSkill, WorkspaceTool, WorkspaceToolRetryPolicy, WorkspaceValidationPolicy, } from "./workspace/types.js";
18
18
  export type { WorkspaceToolQualityDiagnostic, WorkspaceToolQualityDiagnosticCode, WorkspaceToolQualityPolicy, } from "./workspace/tool-quality.js";
19
19
  export type { WorkspaceEvaluation, WorkspaceEvaluationCase, } from "./evaluations/index.js";
@@ -134,6 +134,7 @@ export type RuntimeInspector = {
134
134
  listArtifacts(filter?: RuntimeArtifactFilter): RuntimeArtifactRecord[];
135
135
  getArtifact(id: string): RuntimeArtifactRecord | undefined;
136
136
  readArtifact(id: string): unknown | undefined;
137
+ importArtifact(input: RuntimeArtifactImportInput): RuntimeArtifactRecord | undefined;
137
138
  exportReplayBundle(requestId: string): RuntimeReplayBundle | undefined;
138
139
  listRequests(filter?: RuntimeRunFilter): RuntimeRequestSummary[];
139
140
  listSessions(): RuntimeSessionSummary[];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/core",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
15
- "@stable-harness/memory": "0.0.112"
14
+ "@stable-harness/governance": "0.0.114",
15
+ "@stable-harness/memory": "0.0.114"
16
16
  }
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/evaluation",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112"
13
+ "@stable-harness/core": "0.0.114"
14
14
  }
15
15
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/governance",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
3
+ "version": "0.0.114",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist/**/*.js",
@@ -1 +1 @@
1
- import{createServer as e}from"node:http";import{compileWorkflowPlan as t,projectRuntimeTrace as n,projectRuntimeTraceSpans as r,renderStableHarnessPrometheusMetrics as o,renderWorkflowMermaid as s}from"@stable-harness/core";import{readRuntimeEventFilter as a,streamRuntimeEvents as d}from"./http-events.js";export function createHttpServer(u){return e((e,i)=>{!async function handleHttpRequest(e,u,i){try{await async function routeHttpRequest(e,u,i){(function handleSystemRoutes(e,t,n){return"GET"===t.method&&"/health"===t.url?(sendJson(n,200,{ok:!0}),!0):"GET"===t.method&&"/metrics"===t.url?(function sendText(e,t,n,r="text/plain; charset=utf-8"){e.writeHead(t,{"content-type":r}),e.end(n)}(n,200,o({runtime:e}),"text/plain; version=0.0.4; charset=utf-8"),!0):"GET"===t.method&&"/inspect"===t.url&&(sendJson(n,200,e.inspect()),!0)})(e,u,i)||function handleEventRoutes(e,t,n){const r=a(t.url);return!("GET"!==t.method||!r||(d({runtime:e,request:t,response:n,filter:r}),0))}(e,u,i)||await async function handleAdministrationRoutes(e){const{runtime:t,request:n,response:r}=e;if("GET"===n.method&&"/sessions"===n.url)return sendJson(r,200,t.listSessions()),!0;const o=function readSessionDeleteId(e){const t=(e??"").match(/^\/sessions\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("DELETE"===n.method&&o)return sendJson(r,200,t.deleteSession(o)),!0;const s=function readRequestDeleteId(e){const t=(e??"").match(/^\/requests\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("DELETE"===n.method&&s)return sendJson(r,200,t.deleteRequest(s)),!0;if("GET"===n.method&&n.url?.startsWith("/memories"))return sendJson(r,200,await t.listMemories(function readMemoryList(e){const t=new URL(e??"/memories","http://stable-harness.local"),n=t.searchParams.getAll("status").filter(e=>"active"===e||"stale"===e||"conflicted"===e||"archived"===e||"pending_review"===e);return{...t.searchParams.get("namespace")?{namespace:t.searchParams.get("namespace")}:{},...n.length>0?{statuses:n}:{}}}(n.url))),!0;if("POST"===n.method&&"/memories"===n.url){const e=await readJson(n);return sendJson(r,200,await t.memorize(e)),!0}if("POST"===n.method&&"/memories/recall"===n.url){const e=await readJson(n);return sendJson(r,200,await t.recallMemories(e)),!0}const a=function readMemoryArchiveId(e){const t=(e??"").match(/^\/memories\/([^/]+)\/archive$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("POST"===n.method&&a){const e=await readJson(n);return sendJson(r,200,await t.archiveMemory(a,"string"==typeof e.reason?e.reason:void 0)),!0}const d=function readMemoryUpdateId(e){const t=(e??"").match(/^\/memories\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);return!("PATCH"!==n.method||!d||(sendJson(r,200,await t.updateMemory({id:d,...await readJson(n)})),0))}({runtime:e,request:u,response:i})||function handleArtifactRoutes(e,t,n){const r=function readArtifactList(e){if(!e?.startsWith("/artifacts"))return;const t=new URL(e,"http://stable-harness.local");return"/artifacts"===t.pathname?{...t.searchParams.get("requestId")?{requestId:t.searchParams.get("requestId")}:{},...t.searchParams.get("sessionId")?{sessionId:t.searchParams.get("sessionId")}:{},...t.searchParams.get("agentId")?{agentId:t.searchParams.get("agentId")}:{}}:void 0}(t.url);if("GET"===t.method&&r)return sendJson(n,200,e.listArtifacts(r)),!0;const o=function readArtifactContentId(e){const t=(e??"").match(/^\/artifacts\/([^/]+)\/content$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&o){const t=e.getArtifact(o),r=e.readArtifact(o);return sendJson(n,t&&void 0!==r?200:404,t&&void 0!==r?{artifact:t,content:r}:{error:"artifact_content_not_found"}),!0}const s=function readArtifactId(e){const t=(e??"").match(/^\/artifacts\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&s){const t=e.getArtifact(s);return sendJson(n,t?200:404,t??{error:"artifact_not_found"}),!0}return!1}(e,u,i)||await async function handleApprovalRoutes(e,t,n){const r=function readApprovalList(e){if(!e?.startsWith("/approvals"))return;const t=new URL(e,"http://stable-harness.local");if("/approvals"!==t.pathname)return;const n=t.searchParams.get("status");return{status:"pending"===n||"approved"===n||"rejected"===n?n:void 0}}(t.url);if("GET"===t.method&&r)return sendJson(n,200,await e.listApprovals(r.status)),!0;const o=function readApprovalDecision(e){const t=(e??"").match(/^\/approvals\/([^/]+)\/(approve|reject)$/u);if(t?.[1]&&t[2])return{id:decodeURIComponent(t[1]),status:"approve"===t[2]?"approved":"rejected"}}(t.url);if("POST"===t.method&&o){const t=await e.resolveApproval(o.id,o.status);return sendJson(n,t?200:404,t??{error:"approval_not_found"}),!0}return!1}(e,u,i)||await async function handleRequestRoutes(e,t,n){if("GET"===t.method&&"/requests"===t.url)return sendJson(n,200,e.listRequests()),!0;const r=function readRequestList(e){if(!e?.startsWith("/requests"))return;const t=new URL(e,"http://stable-harness.local");return"/requests"===t.pathname?{...t.searchParams.get("agentId")?{agentId:t.searchParams.get("agentId")}:{},...t.searchParams.get("sessionId")?{sessionId:t.searchParams.get("sessionId")}:{},...readRunState(t.searchParams.get("state"))?{state:readRunState(t.searchParams.get("state"))}:{}}:void 0}(t.url);if("GET"===t.method&&r)return sendJson(n,200,e.listRequests(r)),!0;const o=function readRequestCancelId(e){const t=(e??"").match(/^\/requests\/([^/]+)\/cancel$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("POST"===t.method&&o){const r=await readJson(t);return e.cancel(o,"string"==typeof r.reason?r.reason:void 0),sendJson(n,200,e.inspectRequest(o)??{error:"request_not_found"}),!0}if("POST"===t.method&&"/requests"===t.url){const r=await readJson(t);return sendJson(n,200,await e.request(function readRuntimeRequest(e){const t=function readToolCall(e){if("object"!=typeof e||null===e)return;const t=e;return"string"==typeof t.toolId?{toolId:t.toolId,args:t.args}:void 0}(e.toolCall),n=function readWorkflow(e){const t=readRecord(e);if(t)return{..."string"==typeof t.workflowId?{workflowId:t.workflowId}:{},..."string"==typeof t.routeId?{routeId:t.routeId}:{},...void 0!==t.input?{input:t.input}:{},..."object"==typeof t.metadata&&t.metadata?{metadata:t.metadata}:{}}}(e.workflow),r=function readMemory(e){const t=readRecord(e);if(t)return{..."string"==typeof t.namespace?{namespace:t.namespace}:{},...!1===t.recall||readRecord(t.recall)?{recall:t.recall}:{},...Array.isArray(t.candidates)?{candidates:t.candidates}:{}}}(e.memory),o=readRecord(e.metadata);return{input:"string"==typeof e.input?e.input:"",..."string"==typeof e.agentId?{agentId:e.agentId}:{},..."string"==typeof e.sessionId?{sessionId:e.sessionId}:{},..."string"==typeof e.requestId?{requestId:e.requestId}:{},..."string"==typeof e.parentRunId?{parentRunId:e.parentRunId}:{},...t?{toolCall:t}:{},...n?{workflow:n}:{},...r?{memory:r}:{},...o?{metadata:o}:{}}}(r))),!0}return!1}(e,u,i)||function handleWorkflowRoutes(e,n,r){if("GET"===n.method&&"/workflows"===n.url)return sendJson(r,200,e.inspect().workflows),!0;const o=function readWorkflowMermaidId(e){const t=(e??"").match(/^\/workflows\/([^/]+)\/mermaid$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("GET"===n.method&&o){const t=e.getWorkflow(o);return sendJson(r,t?200:404,t?{mermaid:s(t)}:{error:"workflow_not_found"}),!0}const a=function readWorkflowPlanId(e){const t=(e??"").match(/^\/workflows\/([^/]+)\/plan$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("GET"===n.method&&a){const n=e.getWorkflow(a);return sendJson(r,n?200:404,n?t(n):{error:"workflow_not_found"}),!0}return!1}(e,u,i)||function handleRunInspectionRoutes(e,t,o){const s=function readRequestInspectionId(e){const t=(e??"").match(/^\/requests\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&s){const t=e.inspectRequest(s);return sendJson(o,t?200:404,t??{error:"request_not_found"}),!0}const a=function readTraceRequestId(e){const t=(e??"").match(/^\/runs\/([^/]+)\/trace$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&a){const t=e.getRun(a);return sendJson(o,t?200:404,t?n(t):{error:"run_not_found"}),!0}const d=function readSpanRequestId(e){const t=(e??"").match(/^\/runs\/([^/]+)\/spans$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&d){const t=e.getRun(d);return sendJson(o,t?200:404,t?r(t):{error:"run_not_found"}),!0}const u=function readReplayRequestId(e){const t=(e??"").match(/^\/requests\/([^/]+)\/replay$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&u){const t=e.exportReplayBundle(u);return sendJson(o,t?200:404,t??{error:"run_not_found"}),!0}return!1}(e,u,i)||sendJson(i,404,{error:"not_found"})}(e,u,i)}catch(e){sendJson(i,500,{error:e instanceof Error?e.message:String(e)})}}(u,e,i)})}function readRunState(e){return"queued"===e||"running"===e||"completed"===e||"failed"===e||"cancelled"===e?e:void 0}function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}function sendJson(e,t,n){e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))}async function readJson(e){const t=[];for await(const n of e)t.push(Buffer.isBuffer(n)?n:Buffer.from(n));return 0===t.length?{}:JSON.parse(Buffer.concat(t).toString("utf8"))}
1
+ import{createServer as e}from"node:http";import{compileWorkflowPlan as t,projectRuntimeTrace as n,projectRuntimeTraceSpans as r,renderStableHarnessPrometheusMetrics as o,renderWorkflowMermaid as s}from"@stable-harness/core";import{readRuntimeEventFilter as a,streamRuntimeEvents as d}from"./http-events.js";export function createHttpServer(i){return e((e,u)=>{!async function handleHttpRequest(e,i,u){try{await async function routeHttpRequest(e,i,u){(function handleSystemRoutes(e,t,n){return"GET"===t.method&&"/health"===t.url?(sendJson(n,200,{ok:!0}),!0):"GET"===t.method&&"/metrics"===t.url?(function sendText(e,t,n,r="text/plain; charset=utf-8"){e.writeHead(t,{"content-type":r}),e.end(n)}(n,200,o({runtime:e}),"text/plain; version=0.0.4; charset=utf-8"),!0):"GET"===t.method&&"/inspect"===t.url&&(sendJson(n,200,e.inspect()),!0)})(e,i,u)||function handleEventRoutes(e,t,n){const r=a(t.url);return!("GET"!==t.method||!r||(d({runtime:e,request:t,response:n,filter:r}),0))}(e,i,u)||await async function handleAdministrationRoutes(e){const{runtime:t,request:n,response:r}=e;if("GET"===n.method&&"/sessions"===n.url)return sendJson(r,200,t.listSessions()),!0;const o=function readSessionDeleteId(e){const t=(e??"").match(/^\/sessions\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("DELETE"===n.method&&o)return sendJson(r,200,t.deleteSession(o)),!0;const s=function readRequestDeleteId(e){const t=(e??"").match(/^\/requests\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("DELETE"===n.method&&s)return sendJson(r,200,t.deleteRequest(s)),!0;if("GET"===n.method&&n.url?.startsWith("/memories"))return sendJson(r,200,await t.listMemories(function readMemoryList(e){const t=new URL(e??"/memories","http://stable-harness.local"),n=t.searchParams.getAll("status").filter(e=>"active"===e||"stale"===e||"conflicted"===e||"archived"===e||"pending_review"===e);return{...t.searchParams.get("namespace")?{namespace:t.searchParams.get("namespace")}:{},...n.length>0?{statuses:n}:{}}}(n.url))),!0;if("POST"===n.method&&"/memories"===n.url){const e=await readJson(n);return sendJson(r,200,await t.memorize(e)),!0}if("POST"===n.method&&"/memories/recall"===n.url){const e=await readJson(n);return sendJson(r,200,await t.recallMemories(e)),!0}const a=function readMemoryArchiveId(e){const t=(e??"").match(/^\/memories\/([^/]+)\/archive$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("POST"===n.method&&a){const e=await readJson(n);return sendJson(r,200,await t.archiveMemory(a,"string"==typeof e.reason?e.reason:void 0)),!0}const d=function readMemoryUpdateId(e){const t=(e??"").match(/^\/memories\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);return!("PATCH"!==n.method||!d||(sendJson(r,200,await t.updateMemory({id:d,...await readJson(n)})),0))}({runtime:e,request:i,response:u})||await async function handleArtifactRoutes(e,t,n){const r=function readArtifactList(e){if(!e?.startsWith("/artifacts"))return;const t=new URL(e,"http://stable-harness.local");return"/artifacts"===t.pathname?{...t.searchParams.get("requestId")?{requestId:t.searchParams.get("requestId")}:{},...t.searchParams.get("sessionId")?{sessionId:t.searchParams.get("sessionId")}:{},...t.searchParams.get("agentId")?{agentId:t.searchParams.get("agentId")}:{}}:void 0}(t.url);if("POST"===t.method&&r){const r=function readArtifactImport(e){const t=readRecord(e.metadata);return{id:"string"==typeof e.id?e.id:"",kind:"string"==typeof e.kind?e.kind:"artifact",requestId:"string"==typeof e.requestId?e.requestId:"",..."string"==typeof e.sessionId?{sessionId:e.sessionId}:{},..."string"==typeof e.agentId?{agentId:e.agentId}:{},..."string"==typeof e.uri?{uri:e.uri}:{},...t?{metadata:t}:{},...void 0!==e.content?{content:e.content}:{},..."string"==typeof e.contentType?{contentType:e.contentType}:{},..."string"==typeof e.createdAt?{createdAt:e.createdAt}:{}}}(await readJson(t)),o=function validateArtifactImport(e){const t=[];return hasText(e.id)||t.push("id is required"),hasText(e.kind)||t.push("kind is required"),hasText(e.requestId)||t.push("requestId is required"),t}(r);if(o.length>0)return sendJson(n,400,{error:"artifact_import_invalid",issues:o}),!0;const s=e.importArtifact(r);return sendJson(n,s?201:404,s??{error:"artifact_import_target_not_found"}),!0}if("GET"===t.method&&r)return sendJson(n,200,e.listArtifacts(r)),!0;const o=function readArtifactContentId(e){const t=(e??"").match(/^\/artifacts\/([^/]+)\/content$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&o){const t=e.getArtifact(o),r=e.readArtifact(o);return sendJson(n,t&&void 0!==r?200:404,t&&void 0!==r?{artifact:t,content:r}:{error:"artifact_content_not_found"}),!0}const s=function readArtifactId(e){const t=(e??"").match(/^\/artifacts\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&s){const t=e.getArtifact(s);return sendJson(n,t?200:404,t??{error:"artifact_not_found"}),!0}return!1}(e,i,u)||await async function handleApprovalRoutes(e,t,n){const r=function readApprovalList(e){if(!e?.startsWith("/approvals"))return;const t=new URL(e,"http://stable-harness.local");if("/approvals"!==t.pathname)return;const n=t.searchParams.get("status");return{status:"pending"===n||"approved"===n||"rejected"===n?n:void 0}}(t.url);if("GET"===t.method&&r)return sendJson(n,200,await e.listApprovals(r.status)),!0;const o=function readApprovalDecision(e){const t=(e??"").match(/^\/approvals\/([^/]+)\/(approve|reject)$/u);if(t?.[1]&&t[2])return{id:decodeURIComponent(t[1]),status:"approve"===t[2]?"approved":"rejected"}}(t.url);if("POST"===t.method&&o){const t=await e.resolveApproval(o.id,o.status);return sendJson(n,t?200:404,t??{error:"approval_not_found"}),!0}return!1}(e,i,u)||await async function handleRequestRoutes(e,t,n){if("GET"===t.method&&"/requests"===t.url)return sendJson(n,200,e.listRequests()),!0;const r=function readRequestList(e){if(!e?.startsWith("/requests"))return;const t=new URL(e,"http://stable-harness.local");return"/requests"===t.pathname?{...t.searchParams.get("agentId")?{agentId:t.searchParams.get("agentId")}:{},...t.searchParams.get("sessionId")?{sessionId:t.searchParams.get("sessionId")}:{},...readRunState(t.searchParams.get("state"))?{state:readRunState(t.searchParams.get("state"))}:{}}:void 0}(t.url);if("GET"===t.method&&r)return sendJson(n,200,e.listRequests(r)),!0;const o=function readRequestCancelId(e){const t=(e??"").match(/^\/requests\/([^/]+)\/cancel$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("POST"===t.method&&o){const r=await readJson(t);return e.cancel(o,"string"==typeof r.reason?r.reason:void 0),sendJson(n,200,e.inspectRequest(o)??{error:"request_not_found"}),!0}if("POST"===t.method&&"/requests"===t.url){const r=await readJson(t);return sendJson(n,200,await e.request(function readRuntimeRequest(e){const t=function readToolCall(e){if("object"!=typeof e||null===e)return;const t=e;return"string"==typeof t.toolId?{toolId:t.toolId,args:t.args}:void 0}(e.toolCall),n=function readWorkflow(e){const t=readRecord(e);if(t)return{..."string"==typeof t.workflowId?{workflowId:t.workflowId}:{},..."string"==typeof t.routeId?{routeId:t.routeId}:{},...void 0!==t.input?{input:t.input}:{},..."object"==typeof t.metadata&&t.metadata?{metadata:t.metadata}:{}}}(e.workflow),r=function readMemory(e){const t=readRecord(e);if(t)return{..."string"==typeof t.namespace?{namespace:t.namespace}:{},...!1===t.recall||readRecord(t.recall)?{recall:t.recall}:{},...Array.isArray(t.candidates)?{candidates:t.candidates}:{}}}(e.memory),o=readRecord(e.metadata);return{input:"string"==typeof e.input?e.input:"",..."string"==typeof e.agentId?{agentId:e.agentId}:{},..."string"==typeof e.sessionId?{sessionId:e.sessionId}:{},..."string"==typeof e.requestId?{requestId:e.requestId}:{},..."string"==typeof e.parentRunId?{parentRunId:e.parentRunId}:{},...t?{toolCall:t}:{},...n?{workflow:n}:{},...r?{memory:r}:{},...o?{metadata:o}:{}}}(r))),!0}return!1}(e,i,u)||function handleWorkflowRoutes(e,n,r){if("GET"===n.method&&"/workflows"===n.url)return sendJson(r,200,e.inspect().workflows),!0;const o=function readWorkflowMermaidId(e){const t=(e??"").match(/^\/workflows\/([^/]+)\/mermaid$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("GET"===n.method&&o){const t=e.getWorkflow(o);return sendJson(r,t?200:404,t?{mermaid:s(t)}:{error:"workflow_not_found"}),!0}const a=function readWorkflowPlanId(e){const t=(e??"").match(/^\/workflows\/([^/]+)\/plan$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(n.url);if("GET"===n.method&&a){const n=e.getWorkflow(a);return sendJson(r,n?200:404,n?t(n):{error:"workflow_not_found"}),!0}return!1}(e,i,u)||function handleRunInspectionRoutes(e,t,o){const s=function readRequestInspectionId(e){const t=(e??"").match(/^\/requests\/([^/]+)$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&s){const t=e.inspectRequest(s);return sendJson(o,t?200:404,t??{error:"request_not_found"}),!0}const a=function readTraceRequestId(e){const t=(e??"").match(/^\/runs\/([^/]+)\/trace$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&a){const t=e.getRun(a);return sendJson(o,t?200:404,t?n(t):{error:"run_not_found"}),!0}const d=function readSpanRequestId(e){const t=(e??"").match(/^\/runs\/([^/]+)\/spans$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&d){const t=e.getRun(d);return sendJson(o,t?200:404,t?r(t):{error:"run_not_found"}),!0}const i=function readReplayRequestId(e){const t=(e??"").match(/^\/requests\/([^/]+)\/replay$/u);return t?.[1]?decodeURIComponent(t[1]):void 0}(t.url);if("GET"===t.method&&i){const t=e.exportReplayBundle(i);return sendJson(o,t?200:404,t??{error:"run_not_found"}),!0}return!1}(e,i,u)||sendJson(u,404,{error:"not_found"})}(e,i,u)}catch(e){sendJson(u,500,{error:e instanceof Error?e.message:String(e)})}}(i,e,u)})}function readRunState(e){return"queued"===e||"running"===e||"completed"===e||"failed"===e||"cancelled"===e?e:void 0}function hasText(e){return"string"==typeof e&&e.trim().length>0}function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}function sendJson(e,t,n){e.writeHead(t,{"content-type":"application/json"}),e.end(JSON.stringify(n))}async function readJson(e){const t=[];for await(const n of e)t.push(Buffer.isBuffer(n)?n:Buffer.from(n));return 0===t.length?{}:JSON.parse(Buffer.concat(t).toString("utf8"))}
@@ -1 +1 @@
1
- export function createInProcessClient(e){return{request:t=>e.request(t),subscribe:t=>e.subscribe(t),inspect:()=>e.inspect(),getRuntimePolicy:()=>e.getRuntimePolicy(),getWorkflow:t=>e.getWorkflow(t),getRun:t=>e.getRun(t),listArtifacts:t=>e.listArtifacts(t),getArtifact:t=>e.getArtifact(t),readArtifact:t=>e.readArtifact(t),exportReplayBundle:t=>e.exportReplayBundle(t),listRequests:t=>e.listRequests(t),listSessions:()=>e.listSessions(),inspectRequest:t=>e.inspectRequest(t),memorize:t=>e.memorize(t),recallMemories:t=>e.recallMemories(t),listMemories:t=>e.listMemories(t),updateMemory:t=>e.updateMemory(t),archiveMemory:(t,s)=>e.archiveMemory(t,s),listApprovals:t=>e.listApprovals(t),getApproval:t=>e.getApproval(t),resolveApproval:(t,s)=>e.resolveApproval(t,s),cancel:(t,s)=>e.cancel(t,s),deleteRequest:t=>e.deleteRequest(t),deleteSession:t=>e.deleteSession(t),stop:()=>e.stop()}}
1
+ export function createInProcessClient(e){return{request:t=>e.request(t),subscribe:t=>e.subscribe(t),inspect:()=>e.inspect(),getRuntimePolicy:()=>e.getRuntimePolicy(),getWorkflow:t=>e.getWorkflow(t),getRun:t=>e.getRun(t),listArtifacts:t=>e.listArtifacts(t),getArtifact:t=>e.getArtifact(t),readArtifact:t=>e.readArtifact(t),importArtifact:t=>e.importArtifact(t),exportReplayBundle:t=>e.exportReplayBundle(t),listRequests:t=>e.listRequests(t),listSessions:()=>e.listSessions(),inspectRequest:t=>e.inspectRequest(t),memorize:t=>e.memorize(t),recallMemories:t=>e.recallMemories(t),listMemories:t=>e.listMemories(t),updateMemory:t=>e.updateMemory(t),archiveMemory:(t,s)=>e.archiveMemory(t,s),listApprovals:t=>e.listApprovals(t),getApproval:t=>e.getApproval(t),resolveApproval:(t,s)=>e.resolveApproval(t,s),cancel:(t,s)=>e.cancel(t,s),deleteRequest:t=>e.deleteRequest(t),deleteSession:t=>e.deleteSession(t),stop:()=>e.stop()}}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/protocols",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112"
13
+ "@stable-harness/core": "0.0.114"
14
14
  }
15
15
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stable-harness/tool-gateway",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
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.112",
3
+ "version": "0.0.114",
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.112"
14
+ "@stable-harness/core": "0.0.114"
15
15
  }
16
16
  }