stable-harness 0.0.37 → 0.0.38

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 (231) hide show
  1. package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.d.ts +9 -0
  2. package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.js +1 -0
  3. package/node_modules/@stable-harness/adapter-deepagents/dist/src/index.d.ts +4 -0
  4. package/node_modules/@stable-harness/adapter-deepagents/dist/src/index.js +1 -0
  5. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-args.d.ts +5 -0
  6. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-args.js +1 -0
  7. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-call-repair.d.ts +9 -0
  8. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-call-repair.js +1 -0
  9. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +39 -0
  10. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -0
  11. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-evidence.d.ts +10 -0
  12. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-evidence.js +1 -0
  13. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-failure-events.d.ts +2 -0
  14. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-failure-events.js +1 -0
  15. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +33 -0
  16. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -0
  17. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/messages.d.ts +9 -0
  18. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/messages.js +1 -0
  19. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.d.ts +12 -0
  20. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js +1 -0
  21. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/skill-file-policy.d.ts +10 -0
  22. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/skill-file-policy.js +1 -0
  23. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/stream-events.d.ts +2 -0
  24. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/stream-events.js +1 -0
  25. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.d.ts +4 -0
  26. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -0
  27. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.d.ts +16 -0
  28. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.js +1 -0
  29. package/node_modules/@stable-harness/adapter-deepagents/dist/src/memory.d.ts +5 -0
  30. package/node_modules/@stable-harness/adapter-deepagents/dist/src/memory.js +1 -0
  31. package/node_modules/@stable-harness/adapter-deepagents/dist/src/model-providers.d.ts +4 -0
  32. package/node_modules/@stable-harness/adapter-deepagents/dist/src/model-providers.js +1 -0
  33. package/node_modules/@stable-harness/adapter-deepagents/dist/src/retry-policy.d.ts +2 -0
  34. package/node_modules/@stable-harness/adapter-deepagents/dist/src/retry-policy.js +1 -0
  35. package/node_modules/@stable-harness/adapter-deepagents/dist/src/types.d.ts +12 -0
  36. package/node_modules/@stable-harness/adapter-deepagents/dist/src/types.js +1 -0
  37. package/node_modules/@stable-harness/adapter-deepagents/package.json +26 -0
  38. package/node_modules/@stable-harness/adapter-langgraph/dist/src/graph.d.ts +3 -0
  39. package/node_modules/@stable-harness/adapter-langgraph/dist/src/graph.js +1 -0
  40. package/node_modules/@stable-harness/adapter-langgraph/dist/src/index.d.ts +8 -0
  41. package/node_modules/@stable-harness/adapter-langgraph/dist/src/index.js +1 -0
  42. package/node_modules/@stable-harness/adapter-langgraph/dist/src/runtime.d.ts +3 -0
  43. package/node_modules/@stable-harness/adapter-langgraph/dist/src/runtime.js +1 -0
  44. package/node_modules/@stable-harness/adapter-langgraph/dist/src/skill-providers.d.ts +29 -0
  45. package/node_modules/@stable-harness/adapter-langgraph/dist/src/skill-providers.js +1 -0
  46. package/node_modules/@stable-harness/adapter-langgraph/dist/src/types.d.ts +60 -0
  47. package/node_modules/@stable-harness/adapter-langgraph/dist/src/types.js +1 -0
  48. package/node_modules/@stable-harness/adapter-langgraph/package.json +16 -0
  49. package/node_modules/@stable-harness/core/dist/boundary-scan.d.ts +38 -0
  50. package/node_modules/@stable-harness/core/dist/boundary-scan.js +1 -0
  51. package/node_modules/@stable-harness/core/dist/evaluations/index.d.ts +18 -0
  52. package/node_modules/@stable-harness/core/dist/evaluations/index.js +1 -0
  53. package/node_modules/@stable-harness/core/dist/execution-contract.d.ts +9 -0
  54. package/node_modules/@stable-harness/core/dist/execution-contract.js +1 -0
  55. package/node_modules/@stable-harness/core/dist/index.d.ts +20 -0
  56. package/node_modules/@stable-harness/core/dist/index.js +1 -0
  57. package/node_modules/@stable-harness/core/dist/memory-plugins/maintenance.d.ts +42 -0
  58. package/node_modules/@stable-harness/core/dist/memory-plugins/maintenance.js +1 -0
  59. package/node_modules/@stable-harness/core/dist/memory-plugins/shared.d.ts +8 -0
  60. package/node_modules/@stable-harness/core/dist/memory-plugins/shared.js +1 -0
  61. package/node_modules/@stable-harness/core/dist/memory-plugins.d.ts +25 -0
  62. package/node_modules/@stable-harness/core/dist/memory-plugins.js +1 -0
  63. package/node_modules/@stable-harness/core/dist/quality/event-evidence.d.ts +11 -0
  64. package/node_modules/@stable-harness/core/dist/quality/event-evidence.js +1 -0
  65. package/node_modules/@stable-harness/core/dist/quality/execution-review.d.ts +2 -0
  66. package/node_modules/@stable-harness/core/dist/quality/execution-review.js +1 -0
  67. package/node_modules/@stable-harness/core/dist/quality/index.d.ts +9 -0
  68. package/node_modules/@stable-harness/core/dist/quality/index.js +1 -0
  69. package/node_modules/@stable-harness/core/dist/quality/llm-review.d.ts +7 -0
  70. package/node_modules/@stable-harness/core/dist/quality/llm-review.js +1 -0
  71. package/node_modules/@stable-harness/core/dist/quality/planning-review.d.ts +2 -0
  72. package/node_modules/@stable-harness/core/dist/quality/planning-review.js +1 -0
  73. package/node_modules/@stable-harness/core/dist/quality/profile.d.ts +3 -0
  74. package/node_modules/@stable-harness/core/dist/quality/profile.js +1 -0
  75. package/node_modules/@stable-harness/core/dist/quality/recovery-policy.d.ts +11 -0
  76. package/node_modules/@stable-harness/core/dist/quality/recovery-policy.js +1 -0
  77. package/node_modules/@stable-harness/core/dist/quality/runtime.d.ts +13 -0
  78. package/node_modules/@stable-harness/core/dist/quality/runtime.js +1 -0
  79. package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.d.ts +19 -0
  80. package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.js +1 -0
  81. package/node_modules/@stable-harness/core/dist/quality/synthesis/language.d.ts +3 -0
  82. package/node_modules/@stable-harness/core/dist/quality/synthesis/language.js +1 -0
  83. package/node_modules/@stable-harness/core/dist/quality/synthesis/observed.d.ts +3 -0
  84. package/node_modules/@stable-harness/core/dist/quality/synthesis/observed.js +1 -0
  85. package/node_modules/@stable-harness/core/dist/quality/synthesis.d.ts +2 -0
  86. package/node_modules/@stable-harness/core/dist/quality/synthesis.js +1 -0
  87. package/node_modules/@stable-harness/core/dist/quality/types.d.ts +52 -0
  88. package/node_modules/@stable-harness/core/dist/quality/types.js +1 -0
  89. package/node_modules/@stable-harness/core/dist/recovery/tool-call.d.ts +28 -0
  90. package/node_modules/@stable-harness/core/dist/recovery/tool-call.js +1 -0
  91. package/node_modules/@stable-harness/core/dist/runtime/capabilities.d.ts +47 -0
  92. package/node_modules/@stable-harness/core/dist/runtime/capabilities.js +1 -0
  93. package/node_modules/@stable-harness/core/dist/runtime/completion.d.ts +18 -0
  94. package/node_modules/@stable-harness/core/dist/runtime/completion.js +1 -0
  95. package/node_modules/@stable-harness/core/dist/runtime/direct-tool-call.d.ts +11 -0
  96. package/node_modules/@stable-harness/core/dist/runtime/direct-tool-call.js +1 -0
  97. package/node_modules/@stable-harness/core/dist/runtime/events.d.ts +295 -0
  98. package/node_modules/@stable-harness/core/dist/runtime/events.js +1 -0
  99. package/node_modules/@stable-harness/core/dist/runtime/governance/approval-gate.d.ts +8 -0
  100. package/node_modules/@stable-harness/core/dist/runtime/governance/approval-gate.js +1 -0
  101. package/node_modules/@stable-harness/core/dist/runtime/governance/sandbox.d.ts +9 -0
  102. package/node_modules/@stable-harness/core/dist/runtime/governance/sandbox.js +1 -0
  103. package/node_modules/@stable-harness/core/dist/runtime/inspection/artifacts.d.ts +15 -0
  104. package/node_modules/@stable-harness/core/dist/runtime/inspection/artifacts.js +1 -0
  105. package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.d.ts +11 -0
  106. package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.js +1 -0
  107. package/node_modules/@stable-harness/core/dist/runtime/inspection/replay.d.ts +6 -0
  108. package/node_modules/@stable-harness/core/dist/runtime/inspection/replay.js +1 -0
  109. package/node_modules/@stable-harness/core/dist/runtime/memory.d.ts +29 -0
  110. package/node_modules/@stable-harness/core/dist/runtime/memory.js +1 -0
  111. package/node_modules/@stable-harness/core/dist/runtime/persistence/artifacts.d.ts +8 -0
  112. package/node_modules/@stable-harness/core/dist/runtime/persistence/artifacts.js +1 -0
  113. package/node_modules/@stable-harness/core/dist/runtime/persistence/inspection.d.ts +4 -0
  114. package/node_modules/@stable-harness/core/dist/runtime/persistence/inspection.js +1 -0
  115. package/node_modules/@stable-harness/core/dist/runtime/persistence/queue.d.ts +2 -0
  116. package/node_modules/@stable-harness/core/dist/runtime/persistence/queue.js +1 -0
  117. package/node_modules/@stable-harness/core/dist/runtime/persistence/stores.d.ts +3 -0
  118. package/node_modules/@stable-harness/core/dist/runtime/persistence/stores.js +1 -0
  119. package/node_modules/@stable-harness/core/dist/runtime/progress-narration.d.ts +38 -0
  120. package/node_modules/@stable-harness/core/dist/runtime/progress-narration.js +1 -0
  121. package/node_modules/@stable-harness/core/dist/runtime/selection-repair.d.ts +24 -0
  122. package/node_modules/@stable-harness/core/dist/runtime/selection-repair.js +1 -0
  123. package/node_modules/@stable-harness/core/dist/runtime/tool-failure.d.ts +41 -0
  124. package/node_modules/@stable-harness/core/dist/runtime/tool-failure.js +1 -0
  125. package/node_modules/@stable-harness/core/dist/runtime/tool-gateway.d.ts +59 -0
  126. package/node_modules/@stable-harness/core/dist/runtime/tool-gateway.js +1 -0
  127. package/node_modules/@stable-harness/core/dist/runtime/types.d.ts +191 -0
  128. package/node_modules/@stable-harness/core/dist/runtime/types.js +1 -0
  129. package/node_modules/@stable-harness/core/dist/runtime.d.ts +21 -0
  130. package/node_modules/@stable-harness/core/dist/runtime.js +1 -0
  131. package/node_modules/@stable-harness/core/dist/spec-driven/config.d.ts +4 -0
  132. package/node_modules/@stable-harness/core/dist/spec-driven/config.js +1 -0
  133. package/node_modules/@stable-harness/core/dist/spec-driven/events.d.ts +11 -0
  134. package/node_modules/@stable-harness/core/dist/spec-driven/events.js +1 -0
  135. package/node_modules/@stable-harness/core/dist/spec-driven/index.d.ts +4 -0
  136. package/node_modules/@stable-harness/core/dist/spec-driven/index.js +1 -0
  137. package/node_modules/@stable-harness/core/dist/spec-driven/lifecycle.d.ts +11 -0
  138. package/node_modules/@stable-harness/core/dist/spec-driven/lifecycle.js +1 -0
  139. package/node_modules/@stable-harness/core/dist/spec-driven/types.d.ts +38 -0
  140. package/node_modules/@stable-harness/core/dist/spec-driven/types.js +1 -0
  141. package/node_modules/@stable-harness/core/dist/trace.d.ts +15 -0
  142. package/node_modules/@stable-harness/core/dist/trace.js +1 -0
  143. package/node_modules/@stable-harness/core/dist/types.d.ts +144 -0
  144. package/node_modules/@stable-harness/core/dist/types.js +1 -0
  145. package/node_modules/@stable-harness/core/dist/workflows/index.d.ts +70 -0
  146. package/node_modules/@stable-harness/core/dist/workflows/index.js +1 -0
  147. package/node_modules/@stable-harness/core/dist/workflows/runtime.d.ts +12 -0
  148. package/node_modules/@stable-harness/core/dist/workflows/runtime.js +1 -0
  149. package/node_modules/@stable-harness/core/dist/workspace/tool-quality.d.ts +22 -0
  150. package/node_modules/@stable-harness/core/dist/workspace/tool-quality.js +1 -0
  151. package/node_modules/@stable-harness/core/dist/workspace/types.d.ts +134 -0
  152. package/node_modules/@stable-harness/core/dist/workspace/types.js +1 -0
  153. package/node_modules/@stable-harness/core/package.json +18 -0
  154. package/node_modules/@stable-harness/governance/dist/src/approval-queue.d.ts +2 -0
  155. package/node_modules/@stable-harness/governance/dist/src/approval-queue.js +1 -0
  156. package/node_modules/@stable-harness/governance/dist/src/index.d.ts +4 -0
  157. package/node_modules/@stable-harness/governance/dist/src/index.js +1 -0
  158. package/node_modules/@stable-harness/governance/dist/src/policy-engine.d.ts +2 -0
  159. package/node_modules/@stable-harness/governance/dist/src/policy-engine.js +1 -0
  160. package/node_modules/@stable-harness/governance/dist/src/skill-candidates.d.ts +2 -0
  161. package/node_modules/@stable-harness/governance/dist/src/skill-candidates.js +1 -0
  162. package/node_modules/@stable-harness/governance/dist/src/types.d.ts +101 -0
  163. package/node_modules/@stable-harness/governance/dist/src/types.js +1 -0
  164. package/node_modules/@stable-harness/governance/package.json +12 -0
  165. package/node_modules/@stable-harness/memory/dist/src/index.d.ts +9 -0
  166. package/node_modules/@stable-harness/memory/dist/src/index.js +1 -0
  167. package/node_modules/@stable-harness/memory/dist/src/langmem-service.d.ts +8 -0
  168. package/node_modules/@stable-harness/memory/dist/src/langmem-service.js +1 -0
  169. package/node_modules/@stable-harness/memory/dist/src/maintenance.d.ts +2 -0
  170. package/node_modules/@stable-harness/memory/dist/src/maintenance.js +1 -0
  171. package/node_modules/@stable-harness/memory/dist/src/persistence.d.ts +4 -0
  172. package/node_modules/@stable-harness/memory/dist/src/persistence.js +1 -0
  173. package/node_modules/@stable-harness/memory/dist/src/policy.d.ts +2 -0
  174. package/node_modules/@stable-harness/memory/dist/src/policy.js +1 -0
  175. package/node_modules/@stable-harness/memory/dist/src/provider.d.ts +50 -0
  176. package/node_modules/@stable-harness/memory/dist/src/provider.js +1 -0
  177. package/node_modules/@stable-harness/memory/dist/src/store.d.ts +5 -0
  178. package/node_modules/@stable-harness/memory/dist/src/store.js +1 -0
  179. package/node_modules/@stable-harness/memory/dist/src/types.d.ts +138 -0
  180. package/node_modules/@stable-harness/memory/dist/src/types.js +1 -0
  181. package/node_modules/@stable-harness/memory/package.json +12 -0
  182. package/node_modules/@stable-harness/protocols/dist/src/http-server.d.ts +3 -0
  183. package/node_modules/@stable-harness/protocols/dist/src/http-server.js +1 -0
  184. package/node_modules/@stable-harness/protocols/dist/src/in-process-client.d.ts +2 -0
  185. package/node_modules/@stable-harness/protocols/dist/src/in-process-client.js +1 -0
  186. package/node_modules/@stable-harness/protocols/dist/src/index.d.ts +4 -0
  187. package/node_modules/@stable-harness/protocols/dist/src/index.js +1 -0
  188. package/node_modules/@stable-harness/protocols/dist/src/openai-compatible.d.ts +9 -0
  189. package/node_modules/@stable-harness/protocols/dist/src/openai-compatible.js +1 -0
  190. package/node_modules/@stable-harness/protocols/dist/src/openai-payload.d.ts +74 -0
  191. package/node_modules/@stable-harness/protocols/dist/src/openai-payload.js +1 -0
  192. package/node_modules/@stable-harness/protocols/dist/src/openai-stream.d.ts +39 -0
  193. package/node_modules/@stable-harness/protocols/dist/src/openai-stream.js +1 -0
  194. package/node_modules/@stable-harness/protocols/package.json +15 -0
  195. package/node_modules/@stable-harness/tool-gateway/dist/src/argument-guard.d.ts +33 -0
  196. package/node_modules/@stable-harness/tool-gateway/dist/src/argument-guard.js +1 -0
  197. package/node_modules/@stable-harness/tool-gateway/dist/src/in-memory.d.ts +4 -0
  198. package/node_modules/@stable-harness/tool-gateway/dist/src/in-memory.js +1 -0
  199. package/node_modules/@stable-harness/tool-gateway/dist/src/index.d.ts +7 -0
  200. package/node_modules/@stable-harness/tool-gateway/dist/src/index.js +1 -0
  201. package/node_modules/@stable-harness/tool-gateway/dist/src/module-loader.d.ts +13 -0
  202. package/node_modules/@stable-harness/tool-gateway/dist/src/module-loader.js +1 -0
  203. package/node_modules/@stable-harness/tool-gateway/dist/src/schema-validation.d.ts +3 -0
  204. package/node_modules/@stable-harness/tool-gateway/dist/src/schema-validation.js +1 -0
  205. package/node_modules/@stable-harness/tool-gateway/dist/src/types.d.ts +79 -0
  206. package/node_modules/@stable-harness/tool-gateway/dist/src/types.js +1 -0
  207. package/node_modules/@stable-harness/tool-gateway/package.json +15 -0
  208. package/node_modules/@stable-harness/workspace-yaml/dist/boundary-scan.d.ts +3 -0
  209. package/node_modules/@stable-harness/workspace-yaml/dist/boundary-scan.js +1 -0
  210. package/node_modules/@stable-harness/workspace-yaml/dist/discovery.d.ts +4 -0
  211. package/node_modules/@stable-harness/workspace-yaml/dist/discovery.js +1 -0
  212. package/node_modules/@stable-harness/workspace-yaml/dist/documents.d.ts +16 -0
  213. package/node_modules/@stable-harness/workspace-yaml/dist/documents.js +1 -0
  214. package/node_modules/@stable-harness/workspace-yaml/dist/evaluations.d.ts +9 -0
  215. package/node_modules/@stable-harness/workspace-yaml/dist/evaluations.js +1 -0
  216. package/node_modules/@stable-harness/workspace-yaml/dist/index.d.ts +1 -0
  217. package/node_modules/@stable-harness/workspace-yaml/dist/index.js +1 -0
  218. package/node_modules/@stable-harness/workspace-yaml/dist/loader.d.ts +2 -0
  219. package/node_modules/@stable-harness/workspace-yaml/dist/loader.js +1 -0
  220. package/node_modules/@stable-harness/workspace-yaml/dist/workflows.d.ts +16 -0
  221. package/node_modules/@stable-harness/workspace-yaml/dist/workflows.js +1 -0
  222. package/node_modules/@stable-harness/workspace-yaml/package.json +16 -0
  223. package/package.json +32 -10
  224. package/packages/adapter-deepagents/package.json +4 -6
  225. package/packages/adapter-langgraph/package.json +1 -1
  226. package/packages/cli/package.json +1 -1
  227. package/packages/core/package.json +1 -1
  228. package/packages/evaluation/package.json +1 -1
  229. package/packages/protocols/package.json +1 -1
  230. package/packages/tool-gateway/package.json +1 -1
  231. package/packages/workspace-yaml/package.json +1 -1
@@ -0,0 +1,24 @@
1
+ import type { CallCandidate, CallSelectionDiagnostics } from "@botbotgo/better-call";
2
+ import type { RuntimeEvent, RuntimeInventoryRepairDiagnostic, RuntimeInventoryRepairLayer } from "./events.js";
3
+ export type RuntimeSelectionRepairResult = {
4
+ ok: true;
5
+ id: string;
6
+ diagnostics?: CallSelectionDiagnostics;
7
+ } | {
8
+ ok: false;
9
+ reason: string;
10
+ diagnostics?: CallSelectionDiagnostics;
11
+ };
12
+ export type RuntimeSelectionRepairTrace = {
13
+ layer: RuntimeInventoryRepairLayer;
14
+ owner: RuntimeInventoryRepairDiagnostic["owner"];
15
+ requestId: string;
16
+ sessionId: string;
17
+ agentId: string;
18
+ emit: (event: RuntimeEvent) => void;
19
+ };
20
+ export declare function repairRuntimeSelection(input: {
21
+ id: string;
22
+ candidates: CallCandidate[];
23
+ trace?: RuntimeSelectionRepairTrace;
24
+ }): Promise<RuntimeSelectionRepairResult>;
@@ -0,0 +1 @@
1
+ import{repairCallSelection as e}from"@botbotgo/better-call";export async function repairRuntimeSelection(i){const a=await e({rawIntent:i.id,candidates:i.candidates,mode:"repair"});return a.ok?(emitSelectionRepair(i,"repaired",a.candidateId,a.diagnostics),{ok:!0,id:a.candidateId,diagnostics:a.diagnostics}):(emitSelectionRepair(i,"blocked",void 0,a.diagnostics,a.reason),{ok:!1,reason:a.reason,diagnostics:a.diagnostics})}function emitSelectionRepair(e,i,a,t,n){const d=e.trace;d&&d.emit({type:"runtime.inventory.repair",requestId:d.requestId,sessionId:d.sessionId,agentId:d.agentId,status:i,diagnostic:{layer:d.layer,owner:d.owner,originalId:t?.originalId??e.id,repairedId:t?.repairedId??a,candidateIds:e.candidates.map(e=>e.id),reason:n,matchSource:t?.matchSource,confidence:t?.confidence}})}
@@ -0,0 +1,41 @@
1
+ import type { RuntimeEvent } from "./events.js";
2
+ export type RuntimeToolFailureKind = "transient" | "business" | "control" | "unknown";
3
+ export type RuntimeToolFailureReason = "timeout" | "network" | "rate_limit" | "server_error" | "invalid_input" | "not_found" | "permission_denied" | "approval_required" | "schema_repair_failed" | "repeat_limit" | "tool_execution_failed" | "unknown";
4
+ export type RuntimeToolFailureClassification = {
5
+ kind: RuntimeToolFailureKind;
6
+ reason: RuntimeToolFailureReason;
7
+ retryable: boolean;
8
+ message: string;
9
+ };
10
+ export type RuntimeToolFailurePolicy = {
11
+ enabled?: boolean;
12
+ circuitBreaker?: {
13
+ enabled?: boolean;
14
+ failureThreshold?: number;
15
+ };
16
+ };
17
+ export type RuntimeToolFailureTracker = {
18
+ isCircuitOpen(toolId: string): boolean;
19
+ recordFailure(toolId: string): boolean;
20
+ recordSuccess(toolId: string): void;
21
+ };
22
+ export declare function createToolFailureTracker(policy: RuntimeToolFailurePolicy | undefined): RuntimeToolFailureTracker;
23
+ export declare function classifyToolFailure(error: unknown): RuntimeToolFailureClassification;
24
+ export declare function toolFailureEvent(input: {
25
+ requestId: string;
26
+ sessionId: string;
27
+ agentId: string;
28
+ toolId: string;
29
+ error: unknown;
30
+ }): Extract<RuntimeEvent, {
31
+ type: "runtime.tool.failure";
32
+ }>;
33
+ export declare function toolCircuitOpenEvent(input: {
34
+ requestId: string;
35
+ sessionId: string;
36
+ agentId: string;
37
+ toolId: string;
38
+ reason: RuntimeToolFailureReason;
39
+ }): Extract<RuntimeEvent, {
40
+ type: "runtime.tool.circuit.opened";
41
+ }>;
@@ -0,0 +1 @@
1
+ export function createToolFailureTracker(e){const t=function readCircuitThreshold(e){const t=e?.circuitBreaker,i=t?.failureThreshold;return!1!==e?.enabled&&!0===t?.enabled&&"number"==typeof i&&Number.isInteger(i)&&i>0?i:void 0}(e),i=new Map,r=new Set;return{isCircuitOpen:e=>r.has(e),recordFailure(e){if(void 0===t)return!1;const n=(i.get(e)??0)+1;return i.set(e,n),n>=t&&(r.add(e),!0)},recordSuccess(e){i.delete(e),r.delete(e)}}}export function classifyToolFailure(e){const t=function formatToolFailureMessage(e){return e instanceof Error?e.message:String(e)}(e),i=t.toLowerCase();return/\b(timeout|timed out|etimedout)\b/u.test(i)?classification("transient","timeout",!0,t):/\b(econnreset|econnrefused|enotfound|network|fetch failed)\b/u.test(i)?classification("transient","network",!0,t):/\b(rate.?limit|too many requests|429)\b/u.test(i)?classification("transient","rate_limit",!0,t):/\b(500|502|503|504|server error|bad gateway)\b/u.test(i)?classification("transient","server_error",!0,t):/\b(approval_required|requires approval|permission denied|forbidden|401|403)\b/u.test(i)?classification("business",i.includes("approval")?"approval_required":"permission_denied",!1,t):/\b(schema repair failed|tool_argument_validation_failed|invalid input|expected .* received|validation)\b/u.test(i)?classification("control",i.includes("schema repair")?"schema_repair_failed":"invalid_input",!1,t):/\b(repeated_tool_call_limit|repeat limit)\b/u.test(i)?classification("control","repeat_limit",!1,t):/\b(not found|404)\b/u.test(i)?classification("business","not_found",!1,t):classification("unknown","tool_execution_failed",!1,t)}export function toolFailureEvent(e){const t=classifyToolFailure(e.error);return{type:"runtime.tool.failure",...e,failure:t}}export function toolCircuitOpenEvent(e){return{type:"runtime.tool.circuit.opened",...e}}function classification(e,t,i,r){return{kind:e,reason:t,retryable:i,message:r}}
@@ -0,0 +1,59 @@
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
+ requestInput?: string;
11
+ observedEvidence?: string;
12
+ approvalIds?: string[];
13
+ sandbox?: RuntimeSandboxDecision;
14
+ };
15
+ export type RuntimeSandboxDecision = {
16
+ action: "allow" | "deny";
17
+ profile?: string;
18
+ reason?: string;
19
+ policyId?: string;
20
+ metadata?: Record<string, unknown>;
21
+ };
22
+ export type RuntimeSandboxPolicyInput = {
23
+ toolId: string;
24
+ args?: unknown;
25
+ context: RuntimeToolGatewayContext;
26
+ };
27
+ export type RuntimeSandboxPolicy = {
28
+ decide(input: RuntimeSandboxPolicyInput): Promise<RuntimeSandboxDecision> | RuntimeSandboxDecision;
29
+ };
30
+ export type RuntimeToolGatewayTool = {
31
+ id: string;
32
+ description?: string;
33
+ schema?: unknown;
34
+ };
35
+ export type RuntimeToolRepairModel = {
36
+ invoke(input: unknown): Promise<unknown> | unknown;
37
+ };
38
+ export type RuntimeToolGateway = {
39
+ get(toolId: string): RuntimeToolGatewayTool | undefined;
40
+ repairToolCall?(request: {
41
+ toolId: string;
42
+ args?: unknown;
43
+ allowedToolIds?: string[];
44
+ repairModel?: RuntimeToolRepairModel;
45
+ context: RuntimeToolGatewayContext;
46
+ }): Promise<{
47
+ toolId: string;
48
+ args: unknown;
49
+ } | undefined>;
50
+ invoke(request: {
51
+ toolId: string;
52
+ args?: unknown;
53
+ repairModel?: RuntimeToolRepairModel;
54
+ context: RuntimeToolGatewayContext;
55
+ }): Promise<{
56
+ toolId: string;
57
+ output: unknown;
58
+ }>;
59
+ };
@@ -0,0 +1,191 @@
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?: RuntimeOutputArtifact[];
10
+ };
11
+ export type RuntimeArtifact = {
12
+ id: string;
13
+ kind: string;
14
+ uri?: string;
15
+ metadata?: Record<string, unknown>;
16
+ };
17
+ export type RuntimeOutputArtifact = RuntimeArtifact & {
18
+ content?: unknown;
19
+ contentType?: string;
20
+ };
21
+ export type RuntimeArtifactRecord = RuntimeArtifact & {
22
+ requestId: string;
23
+ sessionId: string;
24
+ agentId: string;
25
+ createdAt: string;
26
+ contentType?: string;
27
+ size?: number;
28
+ };
29
+ export type RuntimeArtifactInput = RuntimeArtifact & {
30
+ requestId: string;
31
+ sessionId: string;
32
+ agentId: string;
33
+ content?: unknown;
34
+ contentType?: string;
35
+ createdAt?: string;
36
+ };
37
+ export type RuntimeArtifactStore = {
38
+ createArtifact(input: RuntimeArtifactInput): RuntimeArtifactRecord;
39
+ listArtifacts(filter?: RuntimeArtifactFilter): RuntimeArtifactRecord[];
40
+ readArtifact(id: string): unknown;
41
+ };
42
+ export type RuntimeArtifactFilter = {
43
+ requestId?: string;
44
+ sessionId?: string;
45
+ agentId?: string;
46
+ };
47
+ export type RuntimeReplayBundle = {
48
+ schemaVersion: 1;
49
+ kind: "stable-harness.replay-bundle";
50
+ requestId: string;
51
+ sessionId: string;
52
+ agentId: string;
53
+ createdAt: string;
54
+ run: RuntimeRunRecord;
55
+ events: RuntimeEvent[];
56
+ artifacts: RuntimeArtifactRecord[];
57
+ integrity: RuntimeReplayBundleIntegrity;
58
+ };
59
+ export type RuntimeReplayBundleIntegrity = {
60
+ algorithm: "sha256";
61
+ runHash: string;
62
+ eventsHash: string;
63
+ artifactsHash: string;
64
+ bundleHash: string;
65
+ };
66
+ export type RuntimeRequest = {
67
+ input: string;
68
+ agentId?: string;
69
+ sessionId?: string;
70
+ requestId?: string;
71
+ parentRunId?: string;
72
+ toolCall?: RuntimeToolCallRequest;
73
+ workflow?: RuntimeWorkflowRequest;
74
+ memory?: RuntimeRequestMemory;
75
+ metadata?: Record<string, unknown>;
76
+ };
77
+ export type RuntimeRequestMemory = {
78
+ namespace?: string;
79
+ recall?: false | {
80
+ query?: string;
81
+ limit?: number;
82
+ };
83
+ candidates?: RuntimeMemoryCandidateInput[];
84
+ };
85
+ export type RuntimeMemoryCandidateInput = Omit<MemoryCandidate, "namespace"> & {
86
+ namespace?: string;
87
+ };
88
+ export type RuntimeResponse = {
89
+ requestId: string;
90
+ sessionId: string;
91
+ agentId: string;
92
+ state: RuntimeRecordState;
93
+ output: string;
94
+ metadata?: Record<string, unknown>;
95
+ artifacts?: RuntimeArtifact[];
96
+ };
97
+ export type RuntimeRunRecord = {
98
+ requestId: string;
99
+ sessionId: string;
100
+ agentId: string;
101
+ input: string;
102
+ state: RuntimeRecordState;
103
+ output?: string;
104
+ error?: string;
105
+ parentRunId?: string;
106
+ metadata?: Record<string, unknown>;
107
+ artifacts: RuntimeArtifact[];
108
+ startedAt: string;
109
+ completedAt?: string;
110
+ events: RuntimeEvent[];
111
+ };
112
+ export type RuntimeStoreRunPatch = Partial<Pick<RuntimeRunRecord, "state" | "output" | "error" | "metadata" | "artifacts" | "completedAt">>;
113
+ export type RuntimeRunFilter = {
114
+ agentId?: string;
115
+ sessionId?: string;
116
+ state?: RuntimeRecordState;
117
+ };
118
+ export type RuntimeStore = {
119
+ createRun(record: RuntimeRunRecord): void;
120
+ updateRun(requestId: string, patch: RuntimeStoreRunPatch): RuntimeRunRecord | undefined;
121
+ appendEvent(event: RuntimeEvent): RuntimeRunRecord | undefined;
122
+ getRun(requestId: string): RuntimeRunRecord | undefined;
123
+ listRuns(filter?: RuntimeRunFilter): RuntimeRunRecord[];
124
+ };
125
+ export type RuntimeQueueRecord = {
126
+ requestId: string;
127
+ sessionId: string;
128
+ priority: number;
129
+ queueKey?: string;
130
+ enqueuedAt: string;
131
+ availableAt: string;
132
+ claimedBy?: string;
133
+ claimedAt?: string;
134
+ leaseExpiresAt?: string;
135
+ attemptCount: number;
136
+ lastError?: string;
137
+ };
138
+ export type RuntimeRequestControlRecord = {
139
+ requestId: string;
140
+ cancelRequested: boolean;
141
+ cancelReason?: string;
142
+ cancelRequestedAt?: string;
143
+ heartbeatAt?: string;
144
+ workerId?: string;
145
+ workerStartedAt?: string;
146
+ };
147
+ export type RuntimeRecoveryIntent = {
148
+ requestId: string;
149
+ sessionId: string;
150
+ kind: "approval-decision" | "restart-request";
151
+ savedAt: string;
152
+ checkpointRef?: string;
153
+ resumePayload?: unknown;
154
+ attempts: number;
155
+ };
156
+ export type RuntimeQueueStore = {
157
+ enqueue(record: Omit<RuntimeQueueRecord, "attemptCount" | "enqueuedAt"> & {
158
+ attemptCount?: number;
159
+ enqueuedAt?: string;
160
+ }): RuntimeQueueRecord;
161
+ listQueue(): RuntimeQueueRecord[];
162
+ getQueuedRequest(requestId: string): RuntimeQueueRecord | undefined;
163
+ claimNext(input: RuntimeQueueClaimInput): RuntimeQueueRecord | undefined;
164
+ heartbeat(input: RuntimeHeartbeatInput): RuntimeRequestControlRecord | undefined;
165
+ requestCancel(input: RuntimeCancelIntentInput): RuntimeRequestControlRecord;
166
+ getControl(requestId: string): RuntimeRequestControlRecord | undefined;
167
+ listStuck(input: RuntimeStuckRequestInput): RuntimeQueueRecord[];
168
+ saveRecoveryIntent(intent: RuntimeRecoveryIntent): RuntimeRecoveryIntent;
169
+ getRecoveryIntent(requestId: string): RuntimeRecoveryIntent | undefined;
170
+ clearRecoveryIntent(requestId: string): boolean;
171
+ };
172
+ export type RuntimeQueueClaimInput = {
173
+ workerId: string;
174
+ now?: string;
175
+ leaseMs: number;
176
+ queueKey?: string;
177
+ };
178
+ export type RuntimeHeartbeatInput = {
179
+ requestId: string;
180
+ workerId: string;
181
+ now?: string;
182
+ };
183
+ export type RuntimeCancelIntentInput = {
184
+ requestId: string;
185
+ reason?: string;
186
+ now?: string;
187
+ };
188
+ export type RuntimeStuckRequestInput = {
189
+ now?: string;
190
+ staleAfterMs: number;
191
+ };
@@ -0,0 +1,21 @@
1
+ import type { ApprovalQueue } from "@stable-harness/governance";
2
+ import type { MemoryProvider, RuntimeMemoryStore } from "@stable-harness/memory";
3
+ import type { QualityReviewModel } from "./quality/index.js";
4
+ import type { CompiledWorkspace, RuntimeCapabilityModule, RuntimeToolGateway, RuntimeAdapter, RuntimeArtifactStore, RuntimeSandboxPolicy, RuntimeStore, RuntimeProgressNarrationOptions, RuntimeWorkflowAdapter, StableHarnessRuntime } from "./types.js";
5
+ type RuntimeFactoryInput = {
6
+ workspace: CompiledWorkspace;
7
+ adapters: RuntimeAdapter[];
8
+ workflowAdapters?: RuntimeWorkflowAdapter[];
9
+ memory?: RuntimeMemoryStore;
10
+ memoryProviders?: MemoryProvider[];
11
+ approvals?: ApprovalQueue;
12
+ toolGateway?: RuntimeToolGateway;
13
+ sandbox?: RuntimeSandboxPolicy | false;
14
+ store?: RuntimeStore;
15
+ artifacts?: RuntimeArtifactStore;
16
+ progressNarration?: RuntimeProgressNarrationOptions | false;
17
+ qualityReviewModel?: QualityReviewModel;
18
+ capabilities?: RuntimeCapabilityModule[];
19
+ };
20
+ export declare function createStableHarnessRuntime(input: RuntimeFactoryInput): StableHarnessRuntime;
21
+ export {};
@@ -0,0 +1 @@
1
+ import{randomUUID as e}from"node:crypto";import{assertExecutionContract as t}from"./execution-contract.js";import{assertNoRawToolCallOutput as r,assertNoToolExecutionErrorOutput as a,buildAdapterErrorRecoveryPrompt as o,buildEvidenceSynthesisOutput as s,buildExecutionContractRecoveryRequest as n,buildResultRecoveryRequest as i,containsRawToolCallOutput as u,isRecoverableAdapterError as c,rawToolCallFailureMessage as l,toolCallRecoveryEnabled as p}from"./recovery/tool-call.js";import{recoverQualityReview as d,resolveQualityPolicy as m}from"./quality/index.js";import{completeRun as w,failRun as y}from"./runtime/completion.js";import{runDirectToolCall as f}from"./runtime/direct-tool-call.js";import{createApprovalGatedToolGateway as g}from"./runtime/governance/approval-gate.js";import{createSandboxedToolGateway as I}from"./runtime/governance/sandbox.js";import{createRuntimeInspectionMethods as q}from"./runtime/inspection/methods.js";import{createRuntimeCapabilityRegistry as R,normalizeAdapterResult as v}from"./runtime/capabilities.js";import{createMemoryRuntimeCapability as b}from"./runtime/memory.js";import{createInMemoryRuntimeStore as k}from"./runtime/persistence/stores.js";import{createProgressNarrationCapability as A}from"./runtime/progress-narration.js";import{repairRuntimeSelection as C}from"./runtime/selection-repair.js";import{createToolFailureTracker as x}from"./runtime/tool-failure.js";import{runWorkflowRequest as h}from"./workflows/runtime.js";export function createStableHarnessRuntime(t){const r=new Set,a=t.store??k(),s=R([b(t),A({options:t.progressNarration,policy:t.workspace.runtime}),...t.capabilities??[]]),emitBase=e=>{a.appendEvent(e);for(const t of r)t(e)},emit=e=>{emitBase(e),s.emitSideEffects(e,emitBase)},i=I({gateway:g({gateway:t.toolGateway,approvals:t.approvals,workspace:t.workspace,emit:emit}),workspace:t.workspace,sandbox:t.sandbox,emit:emit}),u={...t,toolGateway:i},l=x(function readToolFailurePolicy(e){if("object"!=typeof e||null===e||Array.isArray(e))return;const t=e.failurePolicy;return"object"!=typeof t||null===t||Array.isArray(t)?void 0:t}(t.workspace.runtime.toolGateway));return{request:async t=>async function runRuntimeRequest(t){const r=t.request.requestId??e(),a=t.request.sessionId??e(),s=[],{agent:i,adapter:u}=await async function resolveExecution(e,t,r){const a=t.agentId?await async function resolveRequestedAgentId(e,t,r){if(e.agents.has(t))return t;const a=await C({id:t,candidates:[...e.agents.values()].map(e=>({id:e.id,description:e.description})),trace:{...r,agentId:t,layer:"agent",owner:"stable_runtime_policy"}});return a.ok?a.id:t}(e.workspace,t.agentId,r):function resolveRoutedAgentId(e,t){for(const r of e.runtime.routes??[])if(routeMatches(r,t))return r.agentId;return e.runtime.defaultAgentId}(e.workspace,t.input),o=e.workspace.agents.get(a);if(!o)throw new Error(`Agent ${a} is not defined in the workspace`);if(t.toolCall||t.workflow)return{agent:o,adapter:void 0};const s=e.adapters.find(e=>e.canRun(o));if(!s)throw new Error(`No runtime adapter can run backend ${o.backend} for agent ${o.id}`);return{agent:o,adapter:s}}(t.input,t.request,{requestId:r,sessionId:a,emit:e=>s.push(e)});t.store.createRun(function createRunRecord(e,t,r,a){return{requestId:t,sessionId:r,agentId:a.id,input:e.input,state:"running",parentRunId:e.parentRunId,metadata:e.metadata,artifacts:[],startedAt:(new Date).toISOString(),events:[]}}(t.request,r,a,i)),s.forEach(t.emit),t.emit({type:"runtime.request.started",requestId:r,sessionId:a,agentId:i.id,input:t.request.input});try{if(t.request.workflow){const e=await h({workspace:t.input.workspace,adapters:t.input.workflowAdapters??[],toolGateway:t.input.toolGateway,request:{input:t.request.input,...t.request.workflow},requestId:r,sessionId:a,agentId:i.id,emit:t.emit});return w({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,result:e,artifacts:t.input.artifacts})}if(t.request.toolCall){const e=await f({gateway:t.input.toolGateway,workspace:t.input.workspace,emit:t.emit,request:t.request,requestId:r,sessionId:a,agent:i,toolFailureTracker:t.toolFailureTracker});return w({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,result:e,artifacts:t.input.artifacts})}return await async function runAdapterRequest(e){if(!e.adapter)throw new Error(`No runtime adapter can run backend ${e.agent.backend} for agent ${e.agent.id}`);const t=e.adapter,r=await e.capabilities.beforeAdapterRun(createCapabilityContext(e)),a=r.memory,s=r.pluginMemories??[],i=e.input.workspace.runtime,u=m(e.input.workspace.runtime,e.agent),l=new Map;let p;try{p=await runAdapterOnce(e,t,e.request,a,s,l)}catch(r){if(!c(r,i))throw r;p=await runAdapterOnce(e,t,o(e.request,r,i),a,s,l)}p=await recoverAdapterResultOutput(e,t,e.request,p,a,s,i,l),p=await d(createQualityRuntimeInput(e,a,s,l),e.request,p,u),await e.capabilities.beforeAdapterResultContract({...createCapabilityContext(e),result:p});try{assertRequestExecutionContract(e)}catch(r){const o=n({request:e.request,events:e.store.getRun(e.requestId)?.events??[],policy:i});if(!o)throw r;p=await runAdapterOnce(e,t,o,a,s,l),p=await recoverAdapterResultOutput(e,t,o,p,a,s,i,l),p=await d(createQualityRuntimeInput(e,a,s,l),o,p,u),assertRequestExecutionContract(e)}const y=w({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,result:p,artifacts:e.input.artifacts});return await e.capabilities.afterAdapterResponse({...createCapabilityContext(e),result:p,response:y}),y}({...t,adapter:u,requestId:r,sessionId:a,agent:i})}catch(e){return y({store:t.store,emit:t.emit,requestId:r,sessionId:a,agent:i,error:e})}}({input:u,capabilities:s,store:a,emit:emit,request:t,toolFailureTracker:l}),subscribe:e=>(r.add(e),()=>r.delete(e)),...q({workspace:t.workspace,store:a,artifacts:t.artifacts,approvals:t.approvals,emit:emit}),cancel(e,t){const r=a.getRun(e);r&&"running"===r.state&&(a.updateRun(e,{state:"cancelled",completedAt:(new Date).toISOString()}),emit({type:"runtime.request.cancelled",requestId:e,sessionId:r.sessionId,agentId:r.agentId,reason:t}))},async stop(){await s.stop(),r.clear()}}}function createCapabilityContext(e){return{workspace:e.input.workspace,store:e.store,emit:e.emit,request:e.request,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent}}function createQualityRuntimeInput(e,t,r,a){return{workspace:e.input.workspace,agent:e.agent,request:e.request,requestId:e.requestId,sessionId:e.sessionId,events:e.store.getRun(e.requestId)?.events??[],emit:e.emit,getEvents:()=>e.store.getRun(e.requestId)?.events??[],runAdapter:o=>runAdapterOnce(e,e.adapter,o,t,r,a),reviewModel:e.input.qualityReviewModel,memory:t,pluginMemories:r}}async function recoverAdapterResultOutput(e,t,o,n,c,d,m,w){let y=o;const f=function resultRecoveryAttempts(e){const t="object"!=typeof e||null===e||Array.isArray(e)?void 0:e.recovery,r="object"!=typeof t||null===t||Array.isArray(t)?void 0:t.toolCall,a="object"!=typeof r||null===r||Array.isArray(r)?void 0:r.maxResultRecoveryAttempts;return"number"==typeof a&&Number.isInteger(a)&&a>0?a:3}(m);let g=0;for(let r=0;r<f;r+=1){const r=e.store.getRun(e.requestId)?.events??[],a=i({request:y,output:n.text,events:r.slice(g),availableToolIds:e.agent.tools,policy:m});if(!a)break;y=a,g=e.store.getRun(e.requestId)?.events.length??0,n=await runAdapterOnce(e,t,a,c,d,w)}if(p(m)){let t=!1;u(n.text,m)&&function rawToolCallFailureReturnsMessage(e){return"message"===("object"!=typeof e?.toolCallRecovery||null===e.toolCallRecovery||Array.isArray(e.toolCallRecovery)?{}:e.toolCallRecovery).onFailure}(o.metadata)&&(n={...n,text:l(),metadata:{...n.metadata,toolCallRecovery:{failed:!0,reason:"raw_tool_call_output"}}});const i=s({request:o,output:n.text,events:e.store.getRun(e.requestId)?.events??[],policy:m});i&&(t=!0,n={...n,text:i,metadata:{...n.metadata,toolCallRecovery:{synthesized:!0,reason:"raw_tool_call_output_with_evidence"}}}),t||(r(n.text,m),a(n.text,m))}return n}function assertRequestExecutionContract(e){t({store:e.store,emit:e.emit,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,metadata:e.request.metadata})}async function runAdapterOnce(e,t,r,a,o,s){return v(await t.run({workspace:e.input.workspace,agent:e.agent,request:r,requestId:e.requestId,sessionId:e.sessionId,memory:a,pluginMemories:o,toolGateway:e.input.toolGateway,toolFailureTracker:e.input.toolFailureTracker,requestState:s,emit:e.emit}))}function routeMatches(e,t){if(e.pattern)try{if(new RegExp(e.pattern,"iu").test(t))return!0}catch{return!1}const r=t.toLowerCase();return(e.keywords??[]).some(e=>r.includes(e.toLowerCase()))}
@@ -0,0 +1,4 @@
1
+ import type { WorkspaceSpecDrivenPhase, WorkspaceSpecDrivenWorkflowPolicy } from "./types.js";
2
+ export declare const DEFAULT_SPEC_DRIVEN_PHASES: WorkspaceSpecDrivenPhase[];
3
+ export declare function createSpecDrivenWorkflowPolicy(input?: Partial<WorkspaceSpecDrivenWorkflowPolicy>): WorkspaceSpecDrivenWorkflowPolicy;
4
+ export declare function assertSpecDrivenWorkflowPolicy(policy: WorkspaceSpecDrivenWorkflowPolicy): void;
@@ -0,0 +1 @@
1
+ export const DEFAULT_SPEC_DRIVEN_PHASES=[{id:"constitution",artifactKind:"constitution",required:!0},{id:"specify",artifactKind:"spec",required:!0},{id:"plan",artifactKind:"plan",required:!0},{id:"contracts",artifactKind:"contract"},{id:"research",artifactKind:"research"},{id:"tasks",artifactKind:"tasks",required:!0},{id:"implement",artifactKind:"execution"},{id:"verify",artifactKind:"evidence",required:!0}];export function createSpecDrivenWorkflowPolicy(i){return{enabled:i?.enabled??!1,...i?.constitution?{constitution:i.constitution}:{},artifactsDir:i?.artifactsDir??"specs",phases:(t=i?.phases,(t&&t.length>0?t:DEFAULT_SPEC_DRIVEN_PHASES).map(i=>({id:i.id,...i.artifactKind?{artifactKind:i.artifactKind}:{},...void 0!==i.required?{required:i.required}:{},...i.gate?{gate:i.gate}:{},...i.config?{config:i.config}:{}}))),...i?.gates?{gates:i.gates}:{},...i?.config?{config:i.config}:{}};var t}export function assertSpecDrivenWorkflowPolicy(i){const t=new Set;for(const e of i.phases){if(!e.id.trim())throw new Error("specDrivenWorkflow phases require non-empty id");if(t.has(e.id))throw new Error(`specDrivenWorkflow phase is duplicated: ${e.id}`);t.add(e.id)}}
@@ -0,0 +1,11 @@
1
+ import type { RuntimeEvent } from "../runtime/events.js";
2
+ import type { RuntimeArtifact } from "../runtime/types.js";
3
+ import type { SpecDrivenPhaseTransition } from "./types.js";
4
+ export type SpecDrivenEventContext = {
5
+ requestId: string;
6
+ sessionId: string;
7
+ agentId: string;
8
+ workflowId?: string;
9
+ };
10
+ export declare function createSpecDrivenPhaseEvent(context: SpecDrivenEventContext, transition: SpecDrivenPhaseTransition): RuntimeEvent;
11
+ export declare function createSpecDrivenArtifactEvent(context: SpecDrivenEventContext, phaseId: string, artifact: RuntimeArtifact): RuntimeEvent;
@@ -0,0 +1 @@
1
+ export function createSpecDrivenPhaseEvent(e,t){const r={requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,phaseId:t.phaseId,...e.workflowId?{workflowId:e.workflowId}:{}};return"started"===t.status?{type:"runtime.specDriven.phase.started",...r}:"completed"===t.status?{type:"runtime.specDriven.phase.completed",...r,artifact:t.artifact}:"verified"===t.status?{type:"runtime.specDriven.phase.verified",...r,artifact:t.artifact}:{type:"runtime.specDriven.phase.blocked",...r,reason:t.reason??"unspecified"}}export function createSpecDrivenArtifactEvent(e,t,r){return{type:"runtime.artifact.created",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,artifact:{...r,metadata:{...r.metadata,phaseId:t,workflowKind:"spec-driven"}}}}
@@ -0,0 +1,4 @@
1
+ export * from "./config.js";
2
+ export * from "./events.js";
3
+ export * from "./lifecycle.js";
4
+ export * from "./types.js";
@@ -0,0 +1 @@
1
+ export*from"./config.js";export*from"./events.js";export*from"./lifecycle.js";export*from"./types.js";
@@ -0,0 +1,11 @@
1
+ import type { RuntimeArtifact } from "../runtime/types.js";
2
+ import type { SpecDrivenPhaseTransition, SpecDrivenWorkflowState, WorkspaceSpecDrivenWorkflowPolicy } from "./types.js";
3
+ export declare function createSpecDrivenWorkflowState(policy: WorkspaceSpecDrivenWorkflowPolicy): SpecDrivenWorkflowState;
4
+ export declare function applySpecDrivenPhaseTransition(state: SpecDrivenWorkflowState, transition: SpecDrivenPhaseTransition): SpecDrivenWorkflowState;
5
+ export declare function createSpecDrivenArtifact(input: {
6
+ id: string;
7
+ phaseId: string;
8
+ artifactKind: string;
9
+ uri?: string;
10
+ metadata?: Record<string, unknown>;
11
+ }): RuntimeArtifact;
@@ -0,0 +1 @@
1
+ export function createSpecDrivenWorkflowState(t){return{enabled:t.enabled,artifactsDir:t.artifactsDir,...t.constitution?{constitution:t.constitution}:{},phases:t.phases.map(t=>({id:t.id,status:"pending",updatedAt:new Date(0).toISOString()}))}}export function applySpecDrivenPhaseTransition(t,a){if(!new Set(t.phases.map(t=>t.id)).has(a.phaseId))throw new Error(`Spec-driven workflow phase is not configured: ${a.phaseId}`);return{...t,phases:t.phases.map(t=>function updatePhase(t,a){return t.id!==a.phaseId?t:{id:t.id,status:a.status,...a.artifact?{artifact:a.artifact}:t.artifact?{artifact:t.artifact}:{},...a.reason?{reason:a.reason}:{},updatedAt:a.timestamp??(new Date).toISOString()}}(t,a))}}export function createSpecDrivenArtifact(t){return{id:t.id,kind:`spec-driven.${t.artifactKind}`,...t.uri?{uri:t.uri}:{},metadata:{phaseId:t.phaseId,...t.metadata}}}
@@ -0,0 +1,38 @@
1
+ import type { RuntimeArtifact } from "../runtime/types.js";
2
+ export type SpecDrivenPhaseId = string;
3
+ export type SpecDrivenPhaseStatus = "pending" | "started" | "blocked" | "completed" | "verified";
4
+ export type WorkspaceSpecDrivenPhase = {
5
+ id: string;
6
+ artifactKind?: string;
7
+ required?: boolean;
8
+ gate?: string;
9
+ config?: Record<string, unknown>;
10
+ };
11
+ export type WorkspaceSpecDrivenWorkflowPolicy = {
12
+ enabled: boolean;
13
+ constitution?: string;
14
+ artifactsDir: string;
15
+ phases: WorkspaceSpecDrivenPhase[];
16
+ gates?: Record<string, unknown>;
17
+ config?: Record<string, unknown>;
18
+ };
19
+ export type SpecDrivenPhaseRecord = {
20
+ id: string;
21
+ status: SpecDrivenPhaseStatus;
22
+ artifact?: RuntimeArtifact;
23
+ reason?: string;
24
+ updatedAt: string;
25
+ };
26
+ export type SpecDrivenWorkflowState = {
27
+ enabled: boolean;
28
+ artifactsDir: string;
29
+ constitution?: string;
30
+ phases: SpecDrivenPhaseRecord[];
31
+ };
32
+ export type SpecDrivenPhaseTransition = {
33
+ phaseId: string;
34
+ status: Exclude<SpecDrivenPhaseStatus, "pending">;
35
+ artifact?: RuntimeArtifact;
36
+ reason?: string;
37
+ timestamp?: string;
38
+ };
@@ -0,0 +1,15 @@
1
+ import type { RuntimeEvent, RuntimeRunRecord } from "./types.js";
2
+ export type PlanTodoItem = {
3
+ content: string;
4
+ status: string;
5
+ };
6
+ export type RuntimeTraceEntry = {
7
+ type: "request" | "tool" | "workflow" | "spec" | "adapter" | "memory" | "artifact" | "progress" | "plan" | "delegation";
8
+ label: string;
9
+ agentId: string;
10
+ requestId: string;
11
+ detail?: Record<string, unknown>;
12
+ };
13
+ export declare function projectRuntimeTrace(run: RuntimeRunRecord): RuntimeTraceEntry[];
14
+ export declare function projectEvent(event: RuntimeEvent): RuntimeTraceEntry | undefined;
15
+ export declare function readPlanTodos(output: unknown): PlanTodoItem[];
@@ -0,0 +1 @@
1
+ export function projectRuntimeTrace(e){return e.events.map(projectEvent).filter(isTraceEntry)}export function projectEvent(e){return"runtime.request.started"===e.type||"runtime.request.completed"===e.type||"runtime.request.failed"===e.type?base(e,"request",e.type):"runtime.request.cancelled"===e.type?base(e,"request",e.type,{reason:e.reason}):"runtime.execution.contract.failed"===e.type?base(e,"request",e.type,{reason:e.reason,missingEvidenceTools:e.missingEvidenceTools}):"runtime.inventory.repair"===e.type?base(e,"adapter","runtime.inventory.repair",{status:e.status,...e.diagnostic}):"runtime.tool.direct.started"===e.type?base(e,"tool","runtime.tool.direct.started",{toolId:e.toolId}):"runtime.tool.direct.completed"===e.type?base(e,"tool","runtime.tool.direct.completed",{toolId:e.toolId}):"runtime.sandbox.decision"===e.type?base(e,"tool","runtime.sandbox.decision",{toolId:e.toolId,...e.decision}):"runtime.tool.failure"===e.type?base(e,"tool","runtime.tool.failure",{toolId:e.toolId,...e.failure}):"runtime.tool.circuit.opened"===e.type?base(e,"tool","runtime.tool.circuit.opened",{toolId:e.toolId,reason:e.reason}):"runtime.workflow.started"===e.type||"runtime.workflow.completed"===e.type?base(e,"workflow",e.type,{workflowId:e.workflowId,adapter:e.adapter}):function isSpecDrivenPhaseEvent(e){return e.type.startsWith("runtime.specDriven.phase.")}(e)?base(e,"spec",e.type,{phaseId:e.phaseId,..."workflowId"in e&&e.workflowId?{workflowId:e.workflowId}:{},..."reason"in e?{reason:e.reason}:{},..."artifact"in e&&e.artifact?{artifact:e.artifact}:{}}):"runtime.adapter.event"===e.type?function adapterTrace(e){const t=e.event;if(isRecord(t)&&"string"==typeof t.phase){const r=function semanticAdapterTrace(e,t){if("inventory.repair"===t.phase)return base(e,"adapter","runtime.inventory.repair",{status:t.status,...isRecord(t.diagnostic)?t.diagnostic:{}});const r=function readTraceType(e){const t=readString(e);return"request"===t||"tool"===t||"workflow"===t||"spec"===t||"adapter"===t||"memory"===t||"artifact"===t||"progress"===t||"plan"===t||"delegation"===t?t:void 0}(t.traceType),o=readString(t.traceLabel);return r&&o?base(e,r,o,t):void 0}(e,t);return r||base(e,"adapter",t.phase.startsWith("agent.")?t.phase:`adapter.${t.phase}`,t)}return base(e,"adapter","runtime.adapter.event",{event:t})}(e):"runtime.artifact.created"===e.type?base(e,"artifact","runtime.artifact.created",{artifact:e.artifact}):e.type.startsWith("runtime.memory.")?base(e,"memory",e.type):"runtime.progress.narration"===e.type?base(e,"progress",e.type,{message:e.message,provider:e.provider,sourceEventTypes:e.sourceEventTypes}):void 0}export function readPlanTodos(e){const t=function readPlanRecord(e){if(isRecord(e))return e;if("string"==typeof e)try{const t=JSON.parse(e);return isRecord(t)?t:void 0}catch{return}}(e),r=function readTodosArray(e){const t=isRecord(e?.args)?e.args:void 0;return Array.isArray(e?.todos)?e.todos:Array.isArray(t?.todos)?t.todos:[]}(t);return r.map(readTodo).filter(isPlanTodoItem)}function readTodo(e){if(isRecord(e)&&"string"==typeof e.content)return{content:e.content,status:"string"==typeof e.status?e.status:"pending"}}function isPlanTodoItem(e){return void 0!==e}function base(e,t,r,o){return{type:t,label:r,agentId:e.agentId,requestId:e.requestId,detail:o}}function isTraceEntry(e){return void 0!==e}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}
@@ -0,0 +1,144 @@
1
+ import type { MemoryProvider, MemoryRecord, RuntimeMemoryStore } from "@stable-harness/memory";
2
+ import type { ApprovalQueue, ApprovalRequest, ApprovalRequestStatus } from "@stable-harness/governance";
3
+ import type { RuntimeWorkflowAdapter, RuntimeWorkflowRequest, WorkspaceWorkflow } from "./workflows/index.js";
4
+ import type { SpecDrivenWorkflowState } from "./spec-driven/index.js";
5
+ import type { RuntimeEvent, RuntimeEventListener, RuntimeEmit } from "./runtime/events.js";
6
+ import type { RuntimeToolFailureTracker } from "./runtime/tool-failure.js";
7
+ import type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactRecord, RuntimeOutput, RuntimeRecordState, RuntimeRequest, RuntimeResponse, RuntimeReplayBundle, RuntimeRunFilter, RuntimeRunRecord } from "./runtime/types.js";
8
+ import type { RuntimeToolGateway } from "./runtime/tool-gateway.js";
9
+ import type { CompiledWorkspace, WorkspaceAgent, WorkspaceRuntimePolicy } from "./workspace/types.js";
10
+ export type { RuntimeEvent, RuntimeMemoryHook, RuntimeEventListener, RuntimeEmit } from "./runtime/events.js";
11
+ export type { BoundaryScanFinding, BoundaryScanLayer, BoundaryScanLayerResult, BoundaryScanResource, BoundaryScanResult } from "./boundary-scan.js";
12
+ export type { RuntimeCapabilityContext, RuntimeCapabilityModule, RuntimeCapabilityRegistry, RuntimeCapabilityState } from "./runtime/capabilities.js";
13
+ export type { RuntimeProgressNarrationOptions, RuntimeProgressNarrationProvider } from "./runtime/progress-narration.js";
14
+ export type { RuntimeArtifact, RuntimeArtifactFilter, RuntimeArtifactInput, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeOutputArtifact, RuntimeCancelIntentInput, RuntimeHeartbeatInput, RuntimeMemoryCandidateInput, RuntimeOutput, RuntimeQueueClaimInput, RuntimeQueueRecord, RuntimeQueueStore, RuntimeRecoveryIntent, RuntimeRecordState, RuntimeRequest, RuntimeRequestControlRecord, RuntimeRequestMemory, RuntimeResponse, RuntimeReplayBundle, RuntimeReplayBundleIntegrity, RuntimeRunFilter, RuntimeRunRecord, RuntimeStore, RuntimeStoreRunPatch, RuntimeStuckRequestInput, } from "./runtime/types.js";
15
+ export type { CompiledWorkspace, WorkspaceAdapterPolicy, WorkspaceAgent, WorkspaceBoundaryDiagnostic, WorkspaceBoundaryDiagnosticCode, WorkspaceBoundaryScanPolicy, WorkspaceMemory, WorkspaceModel, WorkspaceRetryPolicy, WorkspaceRetryReason, WorkspaceRetryTargetPolicy, WorkspaceRuntimePolicy, WorkspaceSkill, WorkspaceTool, WorkspaceToolRetryPolicy, WorkspaceValidationPolicy, } from "./workspace/types.js";
16
+ export type { WorkspaceToolQualityDiagnostic, WorkspaceToolQualityDiagnosticCode, WorkspaceToolQualityPolicy, } from "./workspace/tool-quality.js";
17
+ export type { WorkspaceEvaluation, WorkspaceEvaluationCase, } from "./evaluations/index.js";
18
+ export type { SpecDrivenPhaseId, SpecDrivenPhaseRecord, SpecDrivenPhaseStatus, SpecDrivenPhaseTransition, SpecDrivenWorkflowState, WorkspaceSpecDrivenPhase, WorkspaceSpecDrivenWorkflowPolicy, } from "./spec-driven/index.js";
19
+ export type { RuntimeToolCallRequest, RuntimeToolGateway, RuntimeToolGatewayContext, RuntimeToolRepairModel, RuntimeToolGatewayTool, RuntimeSandboxDecision, RuntimeSandboxPolicy, RuntimeSandboxPolicyInput, } from "./runtime/tool-gateway.js";
20
+ export type { RuntimeToolFailureClassification, RuntimeToolFailureKind, RuntimeToolFailurePolicy, RuntimeToolFailureReason, RuntimeToolFailureTracker, } from "./runtime/tool-failure.js";
21
+ export type RuntimeAdapterContext = {
22
+ workspace: CompiledWorkspace;
23
+ agent: WorkspaceAgent;
24
+ request: RuntimeRequest;
25
+ requestId: string;
26
+ sessionId: string;
27
+ memory?: RuntimeMemoryContext;
28
+ pluginMemories?: RuntimeMemoryContext[];
29
+ toolGateway?: RuntimeToolGateway;
30
+ toolFailureTracker?: RuntimeToolFailureTracker;
31
+ requestState?: Map<string, unknown>;
32
+ emit: RuntimeEmit;
33
+ };
34
+ export type RuntimeMemoryContext = {
35
+ namespace: string;
36
+ records: MemoryRecord[];
37
+ context: string;
38
+ };
39
+ export type RuntimeAdapterResult = string | RuntimeOutput;
40
+ export type RuntimeAdapter = {
41
+ name: string;
42
+ canRun(agent: WorkspaceAgent): boolean;
43
+ run(input: RuntimeAdapterContext): Promise<RuntimeAdapterResult>;
44
+ };
45
+ export type { RuntimeWorkflowAdapter, RuntimeWorkflowRequest };
46
+ export type RuntimeMemoryServices = {
47
+ store: RuntimeMemoryStore;
48
+ providers?: MemoryProvider[];
49
+ };
50
+ export type RuntimeGovernanceServices = {
51
+ approvals?: ApprovalQueue;
52
+ };
53
+ export type RuntimeToolServices = {
54
+ gateway?: RuntimeToolGateway;
55
+ };
56
+ export type RuntimeInspectionSnapshot = {
57
+ workspaceRoot: string;
58
+ agents: string[];
59
+ workflows: string[];
60
+ specDrivenWorkflow?: RuntimeSpecDrivenWorkflowInspection;
61
+ evaluations: string[];
62
+ defaultWorkflowId?: string;
63
+ workflowRoutes: string[];
64
+ models: string[];
65
+ tools: string[];
66
+ runs: RuntimeRunRecord[];
67
+ };
68
+ export type RuntimeSpecDrivenWorkflowInspection = {
69
+ enabled: boolean;
70
+ artifactsDir: string;
71
+ constitution?: string;
72
+ phases: string[];
73
+ };
74
+ export type RuntimeRequestSummary = {
75
+ requestId: string;
76
+ sessionId: string;
77
+ agentId: string;
78
+ parentRunId?: string;
79
+ state: RuntimeRecordState;
80
+ startedAt: string;
81
+ completedAt?: string;
82
+ eventCount: number;
83
+ artifactCount: number;
84
+ };
85
+ export type RuntimeSessionSummary = {
86
+ sessionId: string;
87
+ requestCount: number;
88
+ agentIds: string[];
89
+ states: Partial<Record<RuntimeRecordState, number>>;
90
+ startedAt: string;
91
+ updatedAt: string;
92
+ };
93
+ export type RuntimeBindingSnapshot = {
94
+ workspaceRoot: string;
95
+ agentId: string;
96
+ backend: string;
97
+ modelRef?: string;
98
+ tools: string[];
99
+ skills: string[];
100
+ subagents: string[];
101
+ };
102
+ export type RuntimeTimelineItem = {
103
+ index: number;
104
+ type: RuntimeEvent["type"];
105
+ event: RuntimeEvent;
106
+ };
107
+ export type RuntimeRequestInspection = {
108
+ summary: RuntimeRequestSummary;
109
+ input: string;
110
+ output?: string;
111
+ error?: string;
112
+ metadata?: Record<string, unknown>;
113
+ artifacts: RuntimeArtifact[];
114
+ runtimeSnapshot: RuntimeBindingSnapshot;
115
+ specDrivenWorkflow?: SpecDrivenWorkflowState;
116
+ timeline: RuntimeTimelineItem[];
117
+ };
118
+ export type RuntimeClient = {
119
+ request(request: RuntimeRequest): Promise<RuntimeResponse>;
120
+ };
121
+ export type RuntimeEventSource = {
122
+ subscribe(listener: RuntimeEventListener): () => void;
123
+ };
124
+ export type RuntimeInspector = {
125
+ inspect(): RuntimeInspectionSnapshot;
126
+ getRuntimePolicy(): WorkspaceRuntimePolicy;
127
+ getWorkflow(workflowId: string): WorkspaceWorkflow | undefined;
128
+ getRun(requestId: string): RuntimeRunRecord | undefined;
129
+ listArtifacts(filter?: RuntimeArtifactFilter): RuntimeArtifactRecord[];
130
+ getArtifact(id: string): RuntimeArtifactRecord | undefined;
131
+ readArtifact(id: string): unknown | undefined;
132
+ exportReplayBundle(requestId: string): RuntimeReplayBundle | undefined;
133
+ listRequests(filter?: RuntimeRunFilter): RuntimeRequestSummary[];
134
+ listSessions(): RuntimeSessionSummary[];
135
+ inspectRequest(requestId: string): RuntimeRequestInspection | undefined;
136
+ listApprovals(status?: ApprovalRequestStatus): Promise<ApprovalRequest[]>;
137
+ getApproval(id: string): Promise<ApprovalRequest | undefined>;
138
+ resolveApproval(id: string, status: Exclude<ApprovalRequestStatus, "pending">): Promise<ApprovalRequest | undefined>;
139
+ };
140
+ export type RuntimeLifecycle = {
141
+ cancel(requestId: string, reason?: string): void;
142
+ stop(): Promise<void>;
143
+ };
144
+ export type StableHarnessRuntime = RuntimeClient & RuntimeEventSource & RuntimeInspector & RuntimeLifecycle;
@@ -0,0 +1 @@
1
+ export{};