stable-harness 0.0.1 → 0.0.3

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 (102) hide show
  1. package/dist/index.d.ts +28 -6
  2. package/dist/index.js +1 -1
  3. package/package.json +14 -9
  4. package/packages/adapter-deepagents/dist/src/adapter.d.ts +1 -0
  5. package/packages/adapter-deepagents/dist/src/adapter.js +1 -1
  6. package/packages/adapter-deepagents/dist/src/index.d.ts +1 -0
  7. package/packages/adapter-deepagents/dist/src/index.js +1 -1
  8. package/packages/adapter-deepagents/dist/src/{builtin-tool-policy.d.ts → internal/builtin-tool-policy.d.ts} +16 -0
  9. package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -0
  10. package/packages/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +4 -0
  11. package/packages/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -0
  12. package/packages/adapter-deepagents/dist/src/internal/trace-projection.d.ts +16 -0
  13. package/packages/adapter-deepagents/dist/src/internal/trace-projection.js +1 -0
  14. package/packages/adapter-deepagents/dist/src/memory.d.ts +5 -0
  15. package/packages/adapter-deepagents/dist/src/memory.js +1 -0
  16. package/packages/adapter-deepagents/dist/src/retry-policy.js +1 -1
  17. package/packages/adapter-langgraph/dist/src/graph.d.ts +3 -0
  18. package/packages/adapter-langgraph/dist/src/graph.js +1 -0
  19. package/packages/adapter-langgraph/dist/src/index.d.ts +8 -0
  20. package/packages/adapter-langgraph/dist/src/index.js +1 -0
  21. package/packages/adapter-langgraph/dist/src/runtime.d.ts +3 -0
  22. package/packages/adapter-langgraph/dist/src/runtime.js +1 -0
  23. package/packages/adapter-langgraph/dist/src/skill-providers.d.ts +29 -0
  24. package/packages/adapter-langgraph/dist/src/skill-providers.js +1 -0
  25. package/packages/adapter-langgraph/dist/src/types.d.ts +60 -0
  26. package/packages/adapter-langgraph/dist/src/types.js +1 -0
  27. package/packages/adapter-langgraph/package.json +16 -0
  28. package/packages/cli/dist/src/args.d.ts +22 -0
  29. package/packages/cli/dist/src/args.js +1 -0
  30. package/packages/cli/dist/src/cli.js +1 -1
  31. package/packages/cli/dist/src/langgraph-official.d.ts +11 -0
  32. package/packages/cli/dist/src/langgraph-official.js +1 -0
  33. package/packages/cli/dist/src/output.d.ts +8 -0
  34. package/packages/cli/dist/src/output.js +1 -0
  35. package/packages/cli/dist/src/server.d.ts +3 -0
  36. package/packages/cli/dist/src/server.js +1 -0
  37. package/packages/cli/package.json +1 -0
  38. package/packages/core/dist/execution-contract.d.ts +1 -0
  39. package/packages/core/dist/execution-contract.js +1 -1
  40. package/packages/core/dist/index.d.ts +5 -4
  41. package/packages/core/dist/index.js +1 -1
  42. package/packages/core/dist/memory-plugins/maintenance.d.ts +42 -0
  43. package/packages/core/dist/memory-plugins/maintenance.js +1 -0
  44. package/packages/core/dist/memory-plugins/shared.d.ts +8 -0
  45. package/packages/core/dist/memory-plugins/shared.js +1 -0
  46. package/packages/core/dist/memory-plugins.d.ts +5 -48
  47. package/packages/core/dist/memory-plugins.js +1 -1
  48. package/packages/core/dist/recovery/tool-call.d.ts +13 -0
  49. package/packages/core/dist/recovery/tool-call.js +1 -0
  50. package/packages/core/dist/runtime/completion.d.ts +17 -0
  51. package/packages/core/dist/runtime/completion.js +1 -0
  52. package/packages/core/dist/runtime/direct-tool-call.d.ts +10 -0
  53. package/packages/core/dist/runtime/direct-tool-call.js +1 -0
  54. package/packages/core/dist/runtime/events.d.ts +147 -0
  55. package/packages/core/dist/runtime/events.js +1 -0
  56. package/packages/core/dist/runtime/memory.d.ts +23 -0
  57. package/packages/core/dist/runtime/memory.js +1 -0
  58. package/packages/core/dist/{artifacts.d.ts → runtime/persistence/artifacts.d.ts} +1 -1
  59. package/packages/core/dist/{inspection.d.ts → runtime/persistence/inspection.d.ts} +1 -1
  60. package/packages/core/dist/{queue.d.ts → runtime/persistence/queue.d.ts} +1 -1
  61. package/packages/core/dist/{stores.d.ts → runtime/persistence/stores.d.ts} +1 -1
  62. package/packages/core/dist/runtime/tool-gateway.d.ts +35 -0
  63. package/packages/core/dist/runtime/tool-gateway.js +1 -0
  64. package/packages/core/dist/runtime/types.d.ts +168 -0
  65. package/packages/core/dist/runtime/types.js +1 -0
  66. package/packages/core/dist/runtime.d.ts +6 -3
  67. package/packages/core/dist/runtime.js +1 -1
  68. package/packages/core/dist/trace.js +1 -1
  69. package/packages/core/dist/types.d.ts +17 -426
  70. package/packages/core/dist/workflows/index.d.ts +70 -0
  71. package/packages/core/dist/workflows/index.js +1 -0
  72. package/packages/core/dist/workflows/runtime.d.ts +12 -0
  73. package/packages/core/dist/workflows/runtime.js +1 -0
  74. package/packages/core/dist/workspace/types.d.ts +92 -0
  75. package/packages/core/dist/workspace/types.js +1 -0
  76. package/packages/governance/dist/src/types.d.ts +1 -1
  77. package/packages/protocols/dist/src/http-server.js +1 -1
  78. package/packages/protocols/dist/src/in-process-client.js +1 -1
  79. package/packages/protocols/dist/src/openai-compatible.js +1 -1
  80. package/packages/protocols/dist/src/openai-payload.d.ts +74 -0
  81. package/packages/protocols/dist/src/openai-payload.js +1 -0
  82. package/packages/protocols/dist/src/openai-stream.d.ts +39 -0
  83. package/packages/protocols/dist/src/openai-stream.js +1 -0
  84. package/packages/tool-gateway/dist/src/argument-guard.js +1 -1
  85. package/packages/tool-gateway/dist/src/schema-validation.d.ts +3 -0
  86. package/packages/tool-gateway/dist/src/schema-validation.js +1 -0
  87. package/packages/workspace-yaml/dist/discovery.d.ts +4 -0
  88. package/packages/workspace-yaml/dist/discovery.js +1 -0
  89. package/packages/workspace-yaml/dist/documents.d.ts +16 -0
  90. package/packages/workspace-yaml/dist/documents.js +1 -0
  91. package/packages/workspace-yaml/dist/loader.js +1 -1
  92. package/packages/workspace-yaml/dist/workflows.d.ts +16 -0
  93. package/packages/workspace-yaml/dist/workflows.js +1 -0
  94. package/packages/adapter-deepagents/dist/src/builtin-tool-policy.js +0 -1
  95. /package/packages/adapter-deepagents/dist/src/{messages.d.ts → internal/messages.d.ts} +0 -0
  96. /package/packages/adapter-deepagents/dist/src/{messages.js → internal/messages.js} +0 -0
  97. /package/packages/adapter-deepagents/dist/src/{stream-events.d.ts → internal/stream-events.d.ts} +0 -0
  98. /package/packages/adapter-deepagents/dist/src/{stream-events.js → internal/stream-events.js} +0 -0
  99. /package/packages/core/dist/{artifacts.js → runtime/persistence/artifacts.js} +0 -0
  100. /package/packages/core/dist/{inspection.js → runtime/persistence/inspection.js} +0 -0
  101. /package/packages/core/dist/{queue.js → runtime/persistence/queue.js} +0 -0
  102. /package/packages/core/dist/{stores.js → runtime/persistence/stores.js} +0 -0
@@ -0,0 +1,42 @@
1
+ import type { MemoryMaintenanceOperation, MemoryProvider } from "@stable-harness/memory";
2
+ import type { ApprovalQueue, SkillCandidateStore } from "@stable-harness/governance";
3
+ import type { CompiledWorkspace, RuntimeEmit, WorkspaceAgent } from "../types.js";
4
+ export type MemoryMaintenanceTarget = {
5
+ name: string;
6
+ run(input: MemoryMaintenanceTargetInput): Promise<MemoryMaintenanceResult>;
7
+ };
8
+ export type MemoryMaintenanceTargetInput = {
9
+ emit: RuntimeEmit;
10
+ requestId: string;
11
+ sessionId: string;
12
+ agent: WorkspaceAgent;
13
+ workspace: CompiledWorkspace;
14
+ prompt: string;
15
+ };
16
+ export type MemoryMaintenanceResult = {
17
+ operations?: MemoryMaintenanceOperation[];
18
+ metadata?: Record<string, unknown>;
19
+ };
20
+ export type MemoryMaintenanceDaemon = {
21
+ runOnce(input?: Partial<Pick<MemoryMaintenanceTargetInput, "requestId" | "sessionId" | "agent">>): Promise<MemoryMaintenanceResult[]>;
22
+ start(): void;
23
+ stop(): void;
24
+ };
25
+ export declare function createMemoryMaintenanceDaemon(input: {
26
+ workspace: CompiledWorkspace;
27
+ emit?: RuntimeEmit;
28
+ targets: MemoryMaintenanceTarget[];
29
+ intervalMs?: number;
30
+ prompt?: string;
31
+ defaultAgentId?: string;
32
+ }): MemoryMaintenanceDaemon;
33
+ export declare function createLangMemMaintenanceTarget(input: {
34
+ providers: MemoryProvider[] | undefined;
35
+ limit?: number;
36
+ }): MemoryMaintenanceTarget;
37
+ export declare function createSkillCandidateMinerTarget(input: {
38
+ providers: MemoryProvider[] | undefined;
39
+ store: SkillCandidateStore;
40
+ approvals?: ApprovalQueue;
41
+ minEvidenceCount?: number;
42
+ }): MemoryMaintenanceTarget;
@@ -0,0 +1 @@
1
+ import{formatError as e,readRecord as t,readWorkspaceId as n,resolveEnabledMemories as a,resolveMemoryProvider as r,resolvePluginNamespace as s}from"./shared.js";export function createMemoryMaintenanceDaemon(e){let t;const n=e.emit??(()=>{});return{async runOnce(t={}){const a=t.agent??function(e,t){const n=e.agents.get(t??e.runtime.defaultAgentId);if(!n)throw new Error("Memory maintenance requires a configured default agent");return n}(e.workspace,e.defaultAgentId),r={emit:n,requestId:t.requestId??`memory-maintenance-${Date.now()}`,sessionId:t.sessionId??"memory-maintenance",agent:a,workspace:e.workspace,prompt:e.prompt??u(e.workspace)},s=[];for(const t of e.targets)s.push(await o(r,t));return s},start(){e.intervalMs&&!t&&(t=setInterval(()=>{this.runOnce()},e.intervalMs))},stop(){t&&(clearInterval(t),t=void 0)}}}export function createLangMemMaintenanceTarget(e){return{name:"LangMem",async run(t){const n=[];for(const o of a(t.workspace,"write")){const a=r(e.providers??[],o.provider);if(!a)continue;const c=s(t.workspace,t.agent,{input:"",sessionId:t.sessionId},o),d=i(await a.search({namespace:c,query:t.prompt,limit:e.limit??100}),await a.search({namespace:c,query:"",limit:e.limit??100}));n.push(...await a.consolidate({records:d}))}return{operations:n}}}}export function createSkillCandidateMinerTarget(e){return{name:"skillCandidateMiner",async run(t){const n=await async function(e,t){const n=[];for(const o of a(t.workspace,"all")){const a=r(e??[],o.provider);if(!a)continue;const c=s(t.workspace,t.agent,{input:"",sessionId:t.sessionId},o);n.push(...i(await a.search({namespace:c,query:t.prompt,limit:100}),await a.search({namespace:c,query:"",limit:100})))}return i(n,[])}(e.providers,t),o=function(e){const t=new Map;for(const n of e){const e=c(n);e&&t.set(e,[...t.get(e)??[],n])}return t}(n),m=[];for(const[n,a]of o){if(a.length<(e.minEvidenceCount??3))continue;const r=await e.store.upsert(d(t.workspace,n,a));m.push(r),t.emit({type:"skill.candidate.created",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,candidateId:r.id,name:r.name,confidence:r.confidence,evidenceCount:r.evidenceCount,status:r.status,proposedPath:r.proposedPath}),await(e.approvals?.create({kind:"skill_candidate",reason:`Review mined skill candidate ${r.name}`,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,subject:{candidate:r}}))}return{operations:[],metadata:{candidateCount:m.length}}}}}async function o(t,n){t.emit({type:"memory.maintenance.started",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,target:n.name});try{const e=await n.run(t);return t.emit({type:"memory.maintenance.completed",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,target:n.name,operationCount:e.operations?.length??0}),e}catch(a){return t.emit({type:"memory.maintenance.failed",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,target:n.name,error:e(a)}),{operations:[],metadata:{error:e(a)}}}}function i(e,t){const n=new Map;for(const a of[...e,...t])n.set(a.id,a);return[...n.values()]}function c(e){const n=t(e.metadata?.skillCandidate),a=t(t(e.metadata?.requestMetadata)?.skillCandidate),r=n?.name??a?.name;return"string"==typeof r&&r.trim()?function(e){return e.toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}(r):void 0}function d(e,t,a){const r=function(e){return e.split("-").filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}(t);return{workspaceId:n(e),name:t,status:"review_required",confidence:Math.min(.95,.55+.1*a.length),proposedPath:`resources/skills/${t}/SKILL.md`,title:r,summary:`Repeated stable workflow mined from ${a.length} memory records.`,draftMarkdown:m(r,a),evidence:a.map(e=>({evidenceType:"memory_record",evidenceRef:e.id,summary:e.summary??e.content.slice(0,160),weight:e.confidence}))}}function m(e,t){return[`# ${e}`,"","## Purpose","","Apply this stable workflow when the task matches the evidence.","","## Evidence","",t.map(e=>`- ${e.summary??e.content}`).join("\n")].join("\n")}function u(e){const n=t(e.runtime.memory?.maintenance);return"string"==typeof n?.prompt?n.prompt:"durable preferences workspace facts reusable procedures prior corrections stale duplicated contradicted memories"}
@@ -0,0 +1,8 @@
1
+ import type { MemoryProvider } from "@stable-harness/memory";
2
+ import type { CompiledWorkspace, RuntimeRequest, WorkspaceAgent, WorkspaceMemory } from "../types.js";
3
+ export declare function resolveEnabledMemories(workspace: CompiledWorkspace, phase?: "all" | "recall" | "write"): WorkspaceMemory[];
4
+ export declare function resolvePluginNamespace(workspace: CompiledWorkspace, agent: WorkspaceAgent, request: RuntimeRequest, memory: WorkspaceMemory): string;
5
+ export declare function resolveMemoryProvider(providers: MemoryProvider[], configuredProvider: string): MemoryProvider | undefined;
6
+ export declare function readRecord(value: unknown): Record<string, unknown> | undefined;
7
+ export declare function readWorkspaceId(workspace: CompiledWorkspace): string;
8
+ export declare function formatError(error: unknown): string;
@@ -0,0 +1 @@
1
+ export function resolveEnabledMemories(r,o="all"){const n=r.runtime.memory??{};if(!function(r,o){return!1!==r.enabled&&("recall"!==o||!1!==r.recall&&!1!==r.read&&!1!==e(r,"LangMem","read"))&&("write"!==o||!1!==r.write&&!1!==e(r,"LangMem","write"))}(n,o))return[];const t=Array.isArray(n.refs)?n.refs.filter(e=>"string"==typeof e):[];return(t.length>0?t:[...r.memories.keys()]).map(e=>r.memories.get(e)).filter(e=>Boolean(e?.enabled))}export function resolvePluginNamespace(e,r,o,n){const t=readWorkspaceId(e),i=n.profile??n.id;return"agent"===i?`${t}:agent:${r.id}:${n.id}`:"user"===i?`${t}:user:${function(e){return e.metadata?.userId??"local"}(o)}:${n.id}`:"session"===i?`${t}:session:${o.sessionId??"default"}:${n.id}`:`${t}:${i}:${n.id}`}export function resolveMemoryProvider(e,r){return e.find(e=>e.name===r||e.name===`${r}-service`)}export function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}export function readWorkspaceId(e){return e.runtime.workspaceId??e.runtime.profile??e.root}export function formatError(e){return e instanceof Error?e.message:String(e)}function e(e,r,o){const n=readRecord(e[r])??readRecord(e[r.toLowerCase()]);return"boolean"==typeof n?.[o]?n[o]:void 0}
@@ -1,27 +1,8 @@
1
- import type { MemoryMaintenanceOperation, MemoryProvider, MemoryRecord } from "@stable-harness/memory";
2
- import type { ApprovalQueue, SkillCandidateStore } from "@stable-harness/governance";
3
- import type { CompiledWorkspace, RuntimeEmit, RuntimeOutput, RuntimeRequest, WorkspaceAgent, WorkspaceMemory } from "./types.js";
4
- export type MemoryMaintenanceTarget = {
5
- name: string;
6
- run(input: MemoryMaintenanceTargetInput): Promise<MemoryMaintenanceResult>;
7
- };
8
- export type MemoryMaintenanceTargetInput = {
9
- emit: RuntimeEmit;
10
- requestId: string;
11
- sessionId: string;
12
- agent: WorkspaceAgent;
13
- workspace: CompiledWorkspace;
14
- prompt: string;
15
- };
16
- export type MemoryMaintenanceResult = {
17
- operations?: MemoryMaintenanceOperation[];
18
- metadata?: Record<string, unknown>;
19
- };
20
- export type MemoryMaintenanceDaemon = {
21
- runOnce(input?: Partial<Pick<MemoryMaintenanceTargetInput, "requestId" | "sessionId" | "agent">>): Promise<MemoryMaintenanceResult[]>;
22
- start(): void;
23
- stop(): void;
24
- };
1
+ import type { MemoryProvider, MemoryRecord } from "@stable-harness/memory";
2
+ import type { CompiledWorkspace, RuntimeEmit, RuntimeOutput, RuntimeRequest, WorkspaceAgent } from "./types.js";
3
+ export { resolveEnabledMemories, resolvePluginNamespace, } from "./memory-plugins/shared.js";
4
+ export type { MemoryMaintenanceDaemon, MemoryMaintenanceResult, MemoryMaintenanceTarget, MemoryMaintenanceTargetInput, } from "./memory-plugins/maintenance.js";
5
+ export { createLangMemMaintenanceTarget, createMemoryMaintenanceDaemon, createSkillCandidateMinerTarget, } from "./memory-plugins/maintenance.js";
25
6
  export declare function runMemoryPlugins(input: {
26
7
  providers: MemoryProvider[] | undefined;
27
8
  emit: RuntimeEmit;
@@ -42,27 +23,3 @@ export declare function recallMemoryPlugins(input: {
42
23
  records: MemoryRecord[];
43
24
  context: string;
44
25
  }>>;
45
- export declare function resolveEnabledMemories(workspace: CompiledWorkspace, phase?: "all" | "recall" | "write"): WorkspaceMemory[];
46
- export declare function resolveDeepAgentsNativeMemories(workspace: CompiledWorkspace): WorkspaceMemory[];
47
- export declare function createMemoryMaintenanceDaemon(input: {
48
- workspace: CompiledWorkspace;
49
- emit?: RuntimeEmit;
50
- targets: MemoryMaintenanceTarget[];
51
- intervalMs?: number;
52
- prompt?: string;
53
- defaultAgentId?: string;
54
- }): MemoryMaintenanceDaemon;
55
- export declare function createLangMemMaintenanceTarget(input: {
56
- providers: MemoryProvider[] | undefined;
57
- limit?: number;
58
- }): MemoryMaintenanceTarget;
59
- export declare function createDeepAgentsMemoryMaintenanceTarget(input?: {
60
- run?: (context: MemoryMaintenanceTargetInput) => Promise<MemoryMaintenanceResult>;
61
- }): MemoryMaintenanceTarget;
62
- export declare function createSkillCandidateMinerTarget(input: {
63
- providers: MemoryProvider[] | undefined;
64
- store: SkillCandidateStore;
65
- approvals?: ApprovalQueue;
66
- minEvidenceCount?: number;
67
- }): MemoryMaintenanceTarget;
68
- export declare function resolvePluginNamespace(workspace: CompiledWorkspace, agent: WorkspaceAgent, request: RuntimeRequest, memory: WorkspaceMemory): string;
@@ -1 +1 @@
1
- export async function runMemoryPlugins(n){const t=resolveEnabledMemories(n.workspace,"write");if(n.providers?.length&&0!==t.length&&!1!==n.request.metadata?.memoryWrite)for(const r of t)await e(n,r)}export async function recallMemoryPlugins(e){const t=resolveEnabledMemories(e.workspace,"recall");if(!e.providers?.length||0===t.length)return[];const o=await Promise.all(t.map(async t=>async function(e,t){const o=n(e.providers??[],t.provider);if(!o)return;const s=resolvePluginNamespace(e.workspace,e.agent,e.request,t),i=await o.search({namespace:s,query:r(e),limit:a(e.workspace)});return{namespace:s,records:i,context:i.map(e=>`- ${e.summary??e.content}\n ${e.content}`).join("\n")}}(e,t)));return o.filter(e=>Boolean(e?.context))}export function resolveEnabledMemories(e,n="all"){const t=e.runtime.memory??{};if(!function(e,n){return!1!==e.enabled&&("recall"!==n||!1!==e.recall&&!1!==e.read&&!1!==m(e,"LangMem","read"))&&("write"!==n||!1!==e.write&&!1!==m(e,"LangMem","write"))}(t,n))return[];const r=Array.isArray(t.refs)?t.refs.filter(e=>"string"==typeof e):[];return(r.length>0?r:[...e.memories.keys()]).map(n=>e.memories.get(n)).filter(e=>Boolean(e?.enabled))}export function resolveDeepAgentsNativeMemories(e){return!1===m(e.runtime.memory??{},"deepagentsMem","read")?[]:resolveEnabledMemories(e,"all")}export function createMemoryMaintenanceDaemon(e){let n;const r=e.emit??(()=>{});return{async runOnce(n={}){const a=n.agent??function(e,n){const t=e.agents.get(n??e.runtime.defaultAgentId);if(!t)throw new Error("Memory maintenance requires a configured default agent");return t}(e.workspace,e.defaultAgentId),o={emit:r,requestId:n.requestId??`memory-maintenance-${Date.now()}`,sessionId:n.sessionId??"memory-maintenance",agent:a,workspace:e.workspace,prompt:e.prompt??d(e.workspace)},s=[];for(const n of e.targets)s.push(await t(o,n));return s},start(){e.intervalMs&&!n&&(n=setInterval(()=>{this.runOnce()},e.intervalMs))},stop(){n&&(clearInterval(n),n=void 0)}}}export function createLangMemMaintenanceTarget(e){return{name:"LangMem",async run(t){const r=[];for(const a of resolveEnabledMemories(t.workspace,"write")){const s=n(e.providers??[],a.provider);if(!s)continue;const i=resolvePluginNamespace(t.workspace,t.agent,{input:"",sessionId:t.sessionId},a),c=o(await s.search({namespace:i,query:t.prompt,limit:e.limit??100}),await s.search({namespace:i,query:"",limit:e.limit??100}));r.push(...await s.consolidate({records:c}))}return{operations:r}}}}export function createDeepAgentsMemoryMaintenanceTarget(e={}){return{name:"deepagentsMem",run:async n=>e.run?e.run(n):{operations:[],metadata:{skipped:!0,reason:"No DeepAgents memory maintainer configured"}}}}export function createSkillCandidateMinerTarget(e){return{name:"skillCandidateMiner",async run(t){const r=await async function(e,t){const r=[];for(const a of resolveEnabledMemories(t.workspace,"all")){const s=n(e??[],a.provider);if(!s)continue;const i=resolvePluginNamespace(t.workspace,t.agent,{input:"",sessionId:t.sessionId},a);r.push(...o(await s.search({namespace:i,query:t.prompt,limit:100}),await s.search({namespace:i,query:"",limit:100})))}return o(r,[])}(e.providers,t),a=function(e){const n=new Map;for(const t of e){const e=s(t);e&&n.set(e,[...n.get(e)??[],t])}return n}(r),c=[];for(const[n,r]of a){if(r.length<(e.minEvidenceCount??3))continue;const a=await e.store.upsert(i(t.workspace,n,r));c.push(a),t.emit({type:"skill.candidate.created",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,candidateId:a.id,name:a.name,confidence:a.confidence,evidenceCount:a.evidenceCount,status:a.status,proposedPath:a.proposedPath}),await(e.approvals?.create({kind:"skill_candidate",reason:`Review mined skill candidate ${a.name}`,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,subject:{candidate:a}}))}return{operations:[],metadata:{candidateCount:c.length}}}}}export function resolvePluginNamespace(e,n,t,r){const a=p(e),o=r.profile??r.id;return"agent"===o?`${a}:agent:${n.id}:${r.id}`:"user"===o?`${a}:user:${function(e){return e.metadata?.userId??"local"}(t)}:${r.id}`:"session"===o?`${a}:session:${t.sessionId??"default"}:${r.id}`:`${a}:${o}:${r.id}`}async function e(e,t){const r=n(e.providers??[],t.provider);if(!r)return;const a=resolvePluginNamespace(e.workspace,e.agent,e.request,t);e.emit({type:"memory.plugin.started",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,memoryId:t.id,provider:r.name,namespace:a});try{const n=await r.propose(function(e,n,t){return{namespace:t,content:[`User input:\n${e.request.input}`,`Agent output:\n${e.result.text}`].join("\n\n"),sourceType:"runtime-run",sourceRef:e.requestId,metadata:{memoryId:n.id,provider:n.provider,profile:n.profile,mode:n.mode,prompts:n.prompts,workspaceRoot:e.workspace.root,agentId:e.agent.id,sessionId:e.sessionId,requestMetadata:e.request.metadata}}}(e,t,a));e.emit({type:"memory.plugin.completed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,memoryId:t.id,provider:r.name,namespace:a,candidateCount:n.length})}catch(n){e.emit({type:"memory.plugin.failed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,memoryId:t.id,provider:r.name,namespace:a,error:l(n)})}}function n(e,n){return e.find(e=>e.name===n||e.name===`${n}-service`)}async function t(e,n){e.emit({type:"memory.maintenance.started",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,target:n.name});try{const t=await n.run(e);return e.emit({type:"memory.maintenance.completed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,target:n.name,operationCount:t.operations?.length??0}),t}catch(t){return e.emit({type:"memory.maintenance.failed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,target:n.name,error:l(t)}),{operations:[],metadata:{error:l(t)}}}}function r(e){const n=[`task: ${e.request.input}`,`workspace: ${p(e.workspace)}`,`agent: ${e.agent.id}`,"memory_needed: durable preferences, workspace facts, reusable procedures, prior corrections"],t=(r=e.request.metadata,"string"==typeof r?.recentContext?r.recentContext.slice(0,3e3):Array.isArray(r?.recentTurns)?r.recentTurns.filter(e=>"string"==typeof e).slice(-6).join("\n").slice(0,3e3):void 0);var r;return t?[...n,`recent_context: ${t}`].join("\n"):n.join("\n")}function a(e){const n=u(e.runtime.memory?.LangMem),t=u(n?.recall),r=t?.topK??t?.limit;return"number"==typeof r&&Number.isFinite(r)?r:10}function o(e,n){const t=new Map;for(const r of[...e,...n])t.set(r.id,r);return[...t.values()]}function s(e){const n=u(e.metadata?.skillCandidate),t=u(u(e.metadata?.requestMetadata)?.skillCandidate),r=n?.name??t?.name;return"string"==typeof r&&r.trim()?function(e){return e.toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")}(r):void 0}function i(e,n,t){const r=function(e){return e.split("-").filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}(n);return{workspaceId:p(e),name:n,status:"review_required",confidence:Math.min(.95,.55+.1*t.length),proposedPath:`resources/skills/${n}/SKILL.md`,title:r,summary:`Repeated stable workflow mined from ${t.length} memory records.`,draftMarkdown:c(r,t),evidence:t.map(e=>({evidenceType:"memory_record",evidenceRef:e.id,summary:e.summary??e.content.slice(0,160),weight:e.confidence}))}}function c(e,n){return[`# ${e}`,"","## Purpose","","Apply this stable workflow when the task matches the evidence.","","## Evidence","",n.map(e=>`- ${e.summary??e.content}`).join("\n")].join("\n")}function d(e){const n=u(e.runtime.memory?.maintenance);return"string"==typeof n?.prompt?n.prompt:"durable preferences workspace facts reusable procedures prior corrections stale duplicated contradicted memories"}function u(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}function m(e,n,t){const r=u(e[n])??u(e[n.toLowerCase()]);return"boolean"==typeof r?.[t]?r[t]:void 0}function p(e){return e.runtime.workspaceId??e.runtime.profile??e.root}function l(e){return e instanceof Error?e.message:String(e)}
1
+ import{formatError as e,readRecord as r,readWorkspaceId as t,resolveEnabledMemories as n,resolveMemoryProvider as o,resolvePluginNamespace as s}from"./memory-plugins/shared.js";export{resolveEnabledMemories,resolvePluginNamespace}from"./memory-plugins/shared.js";export{createLangMemMaintenanceTarget,createMemoryMaintenanceDaemon,createSkillCandidateMinerTarget}from"./memory-plugins/maintenance.js";export async function runMemoryPlugins(e){const r=n(e.workspace,"write");if(e.providers?.length&&0!==r.length&&!1!==e.request.metadata?.memoryWrite)for(const t of r)await a(e,t)}export async function recallMemoryPlugins(e){const r=n(e.workspace,"recall");if(!e.providers?.length||0===r.length)return[];const t=await Promise.all(r.map(async r=>async function(e,r){const t=o(e.providers??[],r.provider);if(!t)return;const n=s(e.workspace,e.agent,e.request,r),a=await t.search({namespace:n,query:i(e),limit:c(e.workspace)});return{namespace:n,records:a,context:a.map(e=>`- ${e.summary??e.content}\n ${e.content}`).join("\n")}}(e,r)));return t.filter(e=>Boolean(e?.context))}async function a(r,t){const n=o(r.providers??[],t.provider);if(!n)return;const a=s(r.workspace,r.agent,r.request,t);r.emit({type:"memory.plugin.started",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agent.id,memoryId:t.id,provider:n.name,namespace:a});try{const e=await n.propose(function(e,r,t){return{namespace:t,content:[`User input:\n${e.request.input}`,`Agent output:\n${e.result.text}`].join("\n\n"),sourceType:"runtime-run",sourceRef:e.requestId,metadata:{memoryId:r.id,provider:r.provider,profile:r.profile,mode:r.mode,prompts:r.prompts,workspaceRoot:e.workspace.root,agentId:e.agent.id,sessionId:e.sessionId,requestMetadata:e.request.metadata}}}(r,t,a));r.emit({type:"memory.plugin.completed",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agent.id,memoryId:t.id,provider:n.name,namespace:a,candidateCount:e.length})}catch(o){r.emit({type:"memory.plugin.failed",requestId:r.requestId,sessionId:r.sessionId,agentId:r.agent.id,memoryId:t.id,provider:n.name,namespace:a,error:e(o)})}}function i(e){const r=[`task: ${e.request.input}`,`workspace: ${t(e.workspace)}`,`agent: ${e.agent.id}`,"memory_needed: durable preferences, workspace facts, reusable procedures, prior corrections"],n=(o=e.request.metadata,"string"==typeof o?.recentContext?o.recentContext.slice(0,3e3):Array.isArray(o?.recentTurns)?o.recentTurns.filter(e=>"string"==typeof e).slice(-6).join("\n").slice(0,3e3):void 0);var o;return n?[...r,`recent_context: ${n}`].join("\n"):r.join("\n")}function c(e){const t=r(e.runtime.memory?.LangMem),n=r(t?.recall),o=n?.topK??n?.limit;return"number"==typeof o&&Number.isFinite(o)?o:10}
@@ -0,0 +1,13 @@
1
+ import type { RuntimeEvent, RuntimeRequest } from "../types.js";
2
+ export declare function toolCallRecoveryEnabled(policy: unknown): boolean;
3
+ export declare function isRecoverableAdapterError(error: unknown, policy: unknown): boolean;
4
+ export declare function buildAdapterErrorRecoveryPrompt(request: RuntimeRequest, error: unknown, policy: unknown): RuntimeRequest;
5
+ export declare function buildResultRecoveryRequest(input: {
6
+ request: RuntimeRequest;
7
+ output: string;
8
+ events: RuntimeEvent[];
9
+ policy: unknown;
10
+ }): RuntimeRequest | undefined;
11
+ export declare function assertNoRawToolCallOutput(output: string, policy: unknown): void;
12
+ export declare function containsRawToolCallOutput(output: string, policy: unknown): boolean;
13
+ export declare function rawToolCallFailureMessage(): string;
@@ -0,0 +1 @@
1
+ export function toolCallRecoveryEnabled(t){return!0===o(t).enabled}export function isRecoverableAdapterError(t,e){const n=o(e);if(!0!==n.enabled)return!1;const a=t instanceof Error?t.message:String(t);return r(n.adapterErrorPatterns,[/XML syntax error|tool.?call.*syntax|malformed.*(?:XML|tool)|Non string tool message content/iu]).some(t=>t.test(a))}export function buildAdapterErrorRecoveryPrompt(e,r,n){const a=r instanceof Error?r.message:String(r),l=o(n).instruction;return t(e,["Stable runtime recovery: the backend failed while parsing a tool call.",`Parser error: ${a}`,"string"==typeof l?l:"Continue the same user request using the backend's normal tool-calling mechanism, then return a final human-readable answer.","Do not print raw tool-call markup, JSON tool-call envelopes, or pseudo tool-call text in the final answer."])}export function buildResultRecoveryRequest(r){const a=o(r.policy);if(!0!==a.enabled)return;if(e(r.output,a))return t(r.request,["Stable runtime recovery: your previous final answer printed raw tool-call markup instead of executing the tool.","Continue the same user request by calling the available upstream tool normally, then return a final human-readable answer. Do not print XML, JSON, or pseudo tool-call text in the final answer.","","Previous invalid final answer:",r.output]);const l=function(t,e){const o=(r=e.eventRecoveryHints,(Array.isArray(r)?r:[]).flatMap(t=>n(t)&&"string"==typeof t.instruction?[{..."string"==typeof t.toolId?{toolId:t.toolId}:{},..."string"==typeof t.phase?{phase:t.phase}:{},..."string"==typeof t.outputIncludes?{outputIncludes:t.outputIncludes}:{},instruction:t.instruction}]:[]));var r;if(0!==o.length)return t.flatMap(t=>function(t,e){const o="adapter.event"===t.type&&n(t.event)?t.event:void 0;return o?e.filter(t=>function(t,e){return(!e.toolId||t.toolId===e.toolId)&&(!e.phase||t.phase===e.phase)&&(!e.outputIncludes||"string"==typeof t.output&&t.output.includes(e.outputIncludes))}(o,t)).map(t=>({output:"string"==typeof o.output?o.output:"Adapter event matched configured recovery hint.",instruction:t.instruction})):[]}(t,o)).at(-1)}(r.events,a);return l?t(r.request,["Stable runtime recovery: a previous adapter event matched a configured recovery hint.",l.output,l.instruction]):void 0}export function assertNoRawToolCallOutput(t,e){if(containsRawToolCallOutput(t,e))throw new Error("Adapter returned raw tool-call text as the final answer after recovery. The backend must execute tools instead of printing tool-call markup.")}export function containsRawToolCallOutput(t,r){const n=o(r);return!0===n.enabled&&e(t,n)}export function rawToolCallFailureMessage(){return["The model attempted to call a tool but returned the tool call as text instead of executing it.","Please retry the request or use a model/backend configuration with reliable tool calling for this workspace."].join(" ")}function t(t,e){return{...t,input:[t.input,"",...e].join("\n"),metadata:{...t.metadata,stableHarnessRecovery:"tool_call"}}}function e(t,e){return r(e.rawOutputPatterns,[/<\s*(?:tool_call|task)\b[^>]*>/iu,/<\s*\/\s*(?:tool_call|task)\s*>/iu]).some(e=>e.test(t))}function o(t){if(!n(t))return{};const e=n(t.recovery)?t.recovery:{};return n(e.toolCall)?e.toolCall:{}}function r(t,e){const o=(Array.isArray(t)?t:[]).filter(t=>"string"==typeof t&&t.length>0).map(t=>new RegExp(t,"iu"));return o.length>0?o:e}function n(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}
@@ -0,0 +1,17 @@
1
+ import type { RuntimeEvent, RuntimeOutput, RuntimeResponse, RuntimeStore, WorkspaceAgent } from "../types.js";
2
+ export declare function completeRun(input: {
3
+ store: RuntimeStore;
4
+ emit: (event: RuntimeEvent) => void;
5
+ requestId: string;
6
+ sessionId: string;
7
+ agent: WorkspaceAgent;
8
+ result: RuntimeOutput;
9
+ }): RuntimeResponse;
10
+ export declare function failRun(input: {
11
+ store: RuntimeStore;
12
+ emit: (event: RuntimeEvent) => void;
13
+ requestId: string;
14
+ sessionId: string;
15
+ agent: WorkspaceAgent;
16
+ error: unknown;
17
+ }): RuntimeResponse;
@@ -0,0 +1 @@
1
+ export function completeRun(e){const s=e.store.getRun(e.requestId);if("cancelled"===s?.state)return t(e,"cancelled");s&&e.store.updateRun(e.requestId,{state:"completed",output:e.result.text,metadata:{...s.metadata,...e.result.metadata},artifacts:[...s.artifacts,...e.result.artifacts??[]],completedAt:(new Date).toISOString()});for(const t of e.result.artifacts??[])e.emit({type:"artifact.created",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,artifact:t});return e.emit({type:"request.completed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,output:e.result.text}),t(e,"completed")}export function failRun(t){const e=t.error instanceof Error?t.error.message:String(t.error);return t.store.getRun(t.requestId)&&t.store.updateRun(t.requestId,{state:"failed",error:e,completedAt:(new Date).toISOString()}),t.emit({type:"request.failed",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,error:e}),{requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,state:"failed",output:e}}function t(t,e){return{requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,state:e,output:t.result.text,metadata:t.result.metadata,artifacts:t.result.artifacts}}
@@ -0,0 +1,10 @@
1
+ import type { CompiledWorkspace, RuntimeEvent, RuntimeOutput, RuntimeRequest, RuntimeToolGateway, WorkspaceAgent } from "../types.js";
2
+ export declare function runDirectToolCall(input: {
3
+ gateway: RuntimeToolGateway | undefined;
4
+ workspace: CompiledWorkspace;
5
+ emit: (event: RuntimeEvent) => void;
6
+ request: RuntimeRequest;
7
+ requestId: string;
8
+ sessionId: string;
9
+ agent: WorkspaceAgent;
10
+ }): Promise<RuntimeOutput>;
@@ -0,0 +1 @@
1
+ export async function runDirectToolCall(o){const t=o.request.toolCall;if(!t)throw new Error("Direct tool call request is missing");if(!o.gateway)throw new Error("Runtime tool gateway is not configured");const e=await async function(o){if(o.agent.tools.includes(o.toolId)&&o.gateway.get(o.toolId))return{toolId:o.toolId,args:o.args};const t=await(o.gateway.repairToolCall?.({toolId:o.toolId,args:o.args,allowedToolIds:o.agent.tools,context:{workspaceRoot:o.workspace.root,requestId:o.requestId,sessionId:o.sessionId,agentId:o.agent.id}}));if(t&&o.agent.tools.includes(t.toolId)&&o.gateway.get(t.toolId))return t;if(!o.agent.tools.includes(o.toolId))throw new Error(`Tool ${o.toolId} is not assigned to agent ${o.agent.id}`);throw new Error(`Tool is not registered: ${o.toolId}`)}({gateway:o.gateway,workspace:o.workspace,requestId:o.requestId,sessionId:o.sessionId,agent:o.agent,toolId:t.toolId,args:t.args});o.emit({type:"tool.started",requestId:o.requestId,sessionId:o.sessionId,agentId:o.agent.id,toolId:e.toolId});const s=await o.gateway.invoke({toolId:e.toolId,args:e.args,context:{workspaceRoot:o.workspace.root,requestId:o.requestId,sessionId:o.sessionId,agentId:o.agent.id}});return o.emit({type:"tool.completed",requestId:o.requestId,sessionId:o.sessionId,agentId:o.agent.id,toolId:s.toolId,output:s.output}),{text:(a=s.output,"string"==typeof a?a:JSON.stringify(a)),metadata:{toolCall:{toolId:s.toolId}}};var a}
@@ -0,0 +1,147 @@
1
+ import type { MemoryCandidate, MemoryDecision, MemoryRecord } from "@stable-harness/memory";
2
+ import type { ApprovalRequest } from "@stable-harness/governance";
3
+ import type { RuntimeArtifact } from "../types.js";
4
+ export type RuntimeEvent = {
5
+ type: "request.started";
6
+ requestId: string;
7
+ sessionId: string;
8
+ agentId: string;
9
+ } | {
10
+ type: "request.completed";
11
+ requestId: string;
12
+ sessionId: string;
13
+ agentId: string;
14
+ output: string;
15
+ } | {
16
+ type: "request.failed";
17
+ requestId: string;
18
+ sessionId: string;
19
+ agentId: string;
20
+ error: string;
21
+ } | {
22
+ type: "request.cancelled";
23
+ requestId: string;
24
+ sessionId: string;
25
+ agentId: string;
26
+ reason?: string;
27
+ } | {
28
+ type: "artifact.created";
29
+ requestId: string;
30
+ sessionId: string;
31
+ agentId: string;
32
+ artifact: RuntimeArtifact;
33
+ } | {
34
+ type: "execution.contract.failed";
35
+ requestId: string;
36
+ sessionId: string;
37
+ agentId: string;
38
+ reason: string;
39
+ missingEvidenceTools?: string[];
40
+ } | {
41
+ type: "tool.started";
42
+ requestId: string;
43
+ sessionId: string;
44
+ agentId: string;
45
+ toolId: string;
46
+ } | {
47
+ type: "tool.completed";
48
+ requestId: string;
49
+ sessionId: string;
50
+ agentId: string;
51
+ toolId: string;
52
+ output: unknown;
53
+ } | {
54
+ type: "memory.lifecycle";
55
+ requestId: string;
56
+ sessionId: string;
57
+ agentId: string;
58
+ hook: RuntimeMemoryHook;
59
+ } | {
60
+ type: "memory.recall.completed";
61
+ requestId: string;
62
+ sessionId: string;
63
+ agentId: string;
64
+ namespace: string;
65
+ recordIds: string[];
66
+ context: string;
67
+ } | {
68
+ type: "memory.candidate.submitted";
69
+ requestId: string;
70
+ sessionId: string;
71
+ agentId: string;
72
+ candidate: MemoryCandidate;
73
+ decision: MemoryDecision;
74
+ record?: MemoryRecord;
75
+ } | {
76
+ type: "memory.approval.requested";
77
+ requestId: string;
78
+ sessionId: string;
79
+ agentId: string;
80
+ approval: ApprovalRequest;
81
+ } | {
82
+ type: "memory.plugin.started";
83
+ requestId: string;
84
+ sessionId: string;
85
+ agentId: string;
86
+ memoryId: string;
87
+ provider: string;
88
+ namespace: string;
89
+ } | {
90
+ type: "memory.plugin.completed";
91
+ requestId: string;
92
+ sessionId: string;
93
+ agentId: string;
94
+ memoryId: string;
95
+ provider: string;
96
+ namespace: string;
97
+ candidateCount: number;
98
+ } | {
99
+ type: "memory.plugin.failed";
100
+ requestId: string;
101
+ sessionId: string;
102
+ agentId: string;
103
+ memoryId: string;
104
+ provider: string;
105
+ namespace: string;
106
+ error: string;
107
+ } | {
108
+ type: "memory.maintenance.started";
109
+ requestId: string;
110
+ sessionId: string;
111
+ agentId: string;
112
+ target: string;
113
+ } | {
114
+ type: "memory.maintenance.completed";
115
+ requestId: string;
116
+ sessionId: string;
117
+ agentId: string;
118
+ target: string;
119
+ operationCount: number;
120
+ } | {
121
+ type: "memory.maintenance.failed";
122
+ requestId: string;
123
+ sessionId: string;
124
+ agentId: string;
125
+ target: string;
126
+ error: string;
127
+ } | {
128
+ type: "skill.candidate.created";
129
+ requestId: string;
130
+ sessionId: string;
131
+ agentId: string;
132
+ candidateId: string;
133
+ name: string;
134
+ confidence: number;
135
+ evidenceCount: number;
136
+ status: string;
137
+ proposedPath?: string;
138
+ } | {
139
+ type: "adapter.event";
140
+ requestId: string;
141
+ sessionId: string;
142
+ agentId: string;
143
+ event: unknown;
144
+ };
145
+ export type RuntimeMemoryHook = "read-before-plan" | "read-before-finalize" | "write-after-run";
146
+ export type RuntimeEventListener = (event: RuntimeEvent) => void;
147
+ export type RuntimeEmit = (event: RuntimeEvent) => void;
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1,23 @@
1
+ import type { ApprovalQueue } from "@stable-harness/governance";
2
+ import type { RuntimeMemoryStore } from "@stable-harness/memory";
3
+ import type { CompiledWorkspace, RuntimeEvent, RuntimeMemoryContext, RuntimeRequest, WorkspaceAgent } from "../types.js";
4
+ export declare function emitMemoryLifecycle(memory: RuntimeMemoryStore | undefined, emit: (event: RuntimeEvent) => void, requestId: string, sessionId: string, agentId: string, hook: "read-before-plan" | "read-before-finalize" | "write-after-run"): void;
5
+ export declare function runMemoryRecall(input: {
6
+ memory: RuntimeMemoryStore | undefined;
7
+ emit: (event: RuntimeEvent) => void;
8
+ request: RuntimeRequest;
9
+ requestId: string;
10
+ sessionId: string;
11
+ agent: WorkspaceAgent;
12
+ workspace: CompiledWorkspace;
13
+ }): Promise<RuntimeMemoryContext | undefined>;
14
+ export declare function submitMemoryCandidates(input: {
15
+ memory: RuntimeMemoryStore | undefined;
16
+ approvals: ApprovalQueue | undefined;
17
+ emit: (event: RuntimeEvent) => void;
18
+ request: RuntimeRequest;
19
+ requestId: string;
20
+ sessionId: string;
21
+ agent: WorkspaceAgent;
22
+ workspace: CompiledWorkspace;
23
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ export function emitMemoryLifecycle(e,t,r,s,n,o){e&&t({type:"memory.lifecycle",requestId:r,sessionId:s,agentId:n,hook:o})}export async function runMemoryRecall(t){if(!t.memory)return;if(emitMemoryLifecycle(t.memory,t.emit,t.requestId,t.sessionId,t.agent.id,"read-before-plan"),!1===t.request.memory?.recall)return;const r=e(t.workspace,t.agent,t.request),s=t.request.memory?.recall?.query??t.request.input,n=await t.memory.recall({namespace:r,query:s,limit:t.request.memory?.recall?.limit});return t.emit({type:"memory.recall.completed",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,namespace:r,recordIds:n.records.map(e=>e.id),context:n.context}),{namespace:r,records:n.records,context:n.context}}export async function submitMemoryCandidates(t){if(!t.memory||!t.request.memory?.candidates?.length)return;emitMemoryLifecycle(t.memory,t.emit,t.requestId,t.sessionId,t.agent.id,"write-after-run");const r=e(t.workspace,t.agent,t.request);for(const e of t.request.memory.candidates){const s={...e,namespace:e.namespace??r},n=await t.memory.submitCandidate(s);if(t.emit({type:"memory.candidate.submitted",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,candidate:n.candidate,decision:n.decision,record:n.record}),"review"===n.decision.action&&t.approvals){const e=await t.approvals.create({kind:"memory_write",reason:n.decision.reason,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,subject:{candidate:n.candidate,decision:n.decision}});t.emit({type:"memory.approval.requested",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,approval:e})}}}function e(e,t,r){return r.memory?.namespace??`${e.root}:${t.id}`}
@@ -1,4 +1,4 @@
1
- import type { RuntimeArtifactRecord, RuntimeArtifactStore } from "./types.js";
1
+ import type { RuntimeArtifactRecord, RuntimeArtifactStore } from "../types.js";
2
2
  type ArtifactState = {
3
3
  records: RuntimeArtifactRecord[];
4
4
  contents: Record<string, unknown>;
@@ -1,4 +1,4 @@
1
- import type { CompiledWorkspace, RuntimeRequestInspection, RuntimeRequestSummary, RuntimeRunRecord, RuntimeSessionSummary } from "./types.js";
1
+ import type { CompiledWorkspace, RuntimeRequestInspection, RuntimeRequestSummary, RuntimeRunRecord, RuntimeSessionSummary } from "../../types.js";
2
2
  export declare function projectRequestSummary(run: RuntimeRunRecord): RuntimeRequestSummary;
3
3
  export declare function projectSessionSummaries(runs: RuntimeRunRecord[]): RuntimeSessionSummary[];
4
4
  export declare function projectRequestInspection(workspace: CompiledWorkspace, run: RuntimeRunRecord): RuntimeRequestInspection;
@@ -1,2 +1,2 @@
1
- import type { RuntimeQueueStore } from "./types.js";
1
+ import type { RuntimeQueueStore } from "../types.js";
2
2
  export declare function createInMemoryRuntimeQueueStore(): RuntimeQueueStore;
@@ -1,3 +1,3 @@
1
- import type { RuntimeRunRecord, RuntimeStore } from "./types.js";
1
+ import type { RuntimeRunRecord, RuntimeStore } from "../types.js";
2
2
  export declare function createInMemoryRuntimeStore(initialRuns?: RuntimeRunRecord[]): RuntimeStore;
3
3
  export declare function createJsonFileRuntimeStore(filePath: string): RuntimeStore;
@@ -0,0 +1,35 @@
1
+ export type RuntimeToolCallRequest = {
2
+ toolId: string;
3
+ args?: unknown;
4
+ };
5
+ export type RuntimeToolGatewayContext = {
6
+ workspaceRoot: string;
7
+ requestId: string;
8
+ sessionId: string;
9
+ agentId: string;
10
+ };
11
+ export type RuntimeToolGatewayTool = {
12
+ id: string;
13
+ description?: string;
14
+ schema?: unknown;
15
+ };
16
+ export type RuntimeToolGateway = {
17
+ get(toolId: string): RuntimeToolGatewayTool | undefined;
18
+ repairToolCall?(request: {
19
+ toolId: string;
20
+ args?: unknown;
21
+ allowedToolIds?: string[];
22
+ context: RuntimeToolGatewayContext;
23
+ }): Promise<{
24
+ toolId: string;
25
+ args: unknown;
26
+ } | undefined>;
27
+ invoke(request: {
28
+ toolId: string;
29
+ args?: unknown;
30
+ context: RuntimeToolGatewayContext;
31
+ }): Promise<{
32
+ toolId: string;
33
+ output: unknown;
34
+ }>;
35
+ };
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1,168 @@
1
+ import type { MemoryCandidate } from "@stable-harness/memory";
2
+ import type { RuntimeWorkflowRequest } from "../workflows/index.js";
3
+ import type { RuntimeEvent } from "./events.js";
4
+ import type { RuntimeToolCallRequest } from "./tool-gateway.js";
5
+ export type RuntimeRecordState = "queued" | "running" | "completed" | "failed" | "cancelled";
6
+ export type RuntimeOutput = {
7
+ text: string;
8
+ metadata?: Record<string, unknown>;
9
+ artifacts?: RuntimeArtifact[];
10
+ };
11
+ export type RuntimeArtifact = {
12
+ id: string;
13
+ kind: string;
14
+ uri?: string;
15
+ metadata?: Record<string, unknown>;
16
+ };
17
+ export type RuntimeArtifactRecord = RuntimeArtifact & {
18
+ requestId: string;
19
+ sessionId: string;
20
+ agentId: string;
21
+ createdAt: string;
22
+ contentType?: string;
23
+ size?: number;
24
+ };
25
+ export type RuntimeArtifactInput = RuntimeArtifact & {
26
+ requestId: string;
27
+ sessionId: string;
28
+ agentId: string;
29
+ content?: unknown;
30
+ contentType?: string;
31
+ createdAt?: string;
32
+ };
33
+ export type RuntimeArtifactStore = {
34
+ createArtifact(input: RuntimeArtifactInput): RuntimeArtifactRecord;
35
+ listArtifacts(filter?: RuntimeArtifactFilter): RuntimeArtifactRecord[];
36
+ readArtifact(id: string): unknown;
37
+ };
38
+ export type RuntimeArtifactFilter = {
39
+ requestId?: string;
40
+ sessionId?: string;
41
+ agentId?: string;
42
+ };
43
+ export type RuntimeRequest = {
44
+ input: string;
45
+ agentId?: string;
46
+ sessionId?: string;
47
+ requestId?: string;
48
+ parentRunId?: string;
49
+ toolCall?: RuntimeToolCallRequest;
50
+ workflow?: RuntimeWorkflowRequest;
51
+ memory?: RuntimeRequestMemory;
52
+ metadata?: Record<string, unknown>;
53
+ };
54
+ export type RuntimeRequestMemory = {
55
+ namespace?: string;
56
+ recall?: false | {
57
+ query?: string;
58
+ limit?: number;
59
+ };
60
+ candidates?: RuntimeMemoryCandidateInput[];
61
+ };
62
+ export type RuntimeMemoryCandidateInput = Omit<MemoryCandidate, "namespace"> & {
63
+ namespace?: string;
64
+ };
65
+ export type RuntimeResponse = {
66
+ requestId: string;
67
+ sessionId: string;
68
+ agentId: string;
69
+ state: RuntimeRecordState;
70
+ output: string;
71
+ metadata?: Record<string, unknown>;
72
+ artifacts?: RuntimeArtifact[];
73
+ };
74
+ export type RuntimeRunRecord = {
75
+ requestId: string;
76
+ sessionId: string;
77
+ agentId: string;
78
+ input: string;
79
+ state: RuntimeRecordState;
80
+ output?: string;
81
+ error?: string;
82
+ parentRunId?: string;
83
+ metadata?: Record<string, unknown>;
84
+ artifacts: RuntimeArtifact[];
85
+ startedAt: string;
86
+ completedAt?: string;
87
+ events: RuntimeEvent[];
88
+ };
89
+ export type RuntimeStoreRunPatch = Partial<Pick<RuntimeRunRecord, "state" | "output" | "error" | "metadata" | "artifacts" | "completedAt">>;
90
+ export type RuntimeRunFilter = {
91
+ agentId?: string;
92
+ sessionId?: string;
93
+ state?: RuntimeRecordState;
94
+ };
95
+ export type RuntimeStore = {
96
+ createRun(record: RuntimeRunRecord): void;
97
+ updateRun(requestId: string, patch: RuntimeStoreRunPatch): RuntimeRunRecord | undefined;
98
+ appendEvent(event: RuntimeEvent): RuntimeRunRecord | undefined;
99
+ getRun(requestId: string): RuntimeRunRecord | undefined;
100
+ listRuns(filter?: RuntimeRunFilter): RuntimeRunRecord[];
101
+ };
102
+ export type RuntimeQueueRecord = {
103
+ requestId: string;
104
+ sessionId: string;
105
+ priority: number;
106
+ queueKey?: string;
107
+ enqueuedAt: string;
108
+ availableAt: string;
109
+ claimedBy?: string;
110
+ claimedAt?: string;
111
+ leaseExpiresAt?: string;
112
+ attemptCount: number;
113
+ lastError?: string;
114
+ };
115
+ export type RuntimeRequestControlRecord = {
116
+ requestId: string;
117
+ cancelRequested: boolean;
118
+ cancelReason?: string;
119
+ cancelRequestedAt?: string;
120
+ heartbeatAt?: string;
121
+ workerId?: string;
122
+ workerStartedAt?: string;
123
+ };
124
+ export type RuntimeRecoveryIntent = {
125
+ requestId: string;
126
+ sessionId: string;
127
+ kind: "approval-decision" | "restart-request";
128
+ savedAt: string;
129
+ checkpointRef?: string;
130
+ resumePayload?: unknown;
131
+ attempts: number;
132
+ };
133
+ export type RuntimeQueueStore = {
134
+ enqueue(record: Omit<RuntimeQueueRecord, "attemptCount" | "enqueuedAt"> & {
135
+ attemptCount?: number;
136
+ enqueuedAt?: string;
137
+ }): RuntimeQueueRecord;
138
+ listQueue(): RuntimeQueueRecord[];
139
+ getQueuedRequest(requestId: string): RuntimeQueueRecord | undefined;
140
+ claimNext(input: RuntimeQueueClaimInput): RuntimeQueueRecord | undefined;
141
+ heartbeat(input: RuntimeHeartbeatInput): RuntimeRequestControlRecord | undefined;
142
+ requestCancel(input: RuntimeCancelIntentInput): RuntimeRequestControlRecord;
143
+ getControl(requestId: string): RuntimeRequestControlRecord | undefined;
144
+ listStuck(input: RuntimeStuckRequestInput): RuntimeQueueRecord[];
145
+ saveRecoveryIntent(intent: RuntimeRecoveryIntent): RuntimeRecoveryIntent;
146
+ getRecoveryIntent(requestId: string): RuntimeRecoveryIntent | undefined;
147
+ clearRecoveryIntent(requestId: string): boolean;
148
+ };
149
+ export type RuntimeQueueClaimInput = {
150
+ workerId: string;
151
+ now?: string;
152
+ leaseMs: number;
153
+ queueKey?: string;
154
+ };
155
+ export type RuntimeHeartbeatInput = {
156
+ requestId: string;
157
+ workerId: string;
158
+ now?: string;
159
+ };
160
+ export type RuntimeCancelIntentInput = {
161
+ requestId: string;
162
+ reason?: string;
163
+ now?: string;
164
+ };
165
+ export type RuntimeStuckRequestInput = {
166
+ now?: string;
167
+ staleAfterMs: number;
168
+ };
@@ -0,0 +1 @@
1
+ export{};