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,47 @@
1
+ import type { RuntimeMemoryContext } from "../types.js";
2
+ import type { RuntimeEvent, RuntimeEmit } from "./events.js";
3
+ import type { RuntimeOutput, RuntimeRequest, RuntimeResponse, RuntimeStore } from "./types.js";
4
+ import type { CompiledWorkspace, WorkspaceAgent } from "../workspace/types.js";
5
+ export type RuntimeCapabilityState = {
6
+ memory?: RuntimeMemoryContext;
7
+ pluginMemories?: RuntimeMemoryContext[];
8
+ };
9
+ export type RuntimeCapabilityContext = {
10
+ workspace: CompiledWorkspace;
11
+ store: RuntimeStore;
12
+ emit: RuntimeEmit;
13
+ request: RuntimeRequest;
14
+ requestId: string;
15
+ sessionId: string;
16
+ agent: WorkspaceAgent;
17
+ state: RuntimeCapabilityState;
18
+ };
19
+ export type RuntimeCapabilityModule = {
20
+ id: string;
21
+ onEvent?(event: RuntimeEvent, emit: RuntimeEmit): void;
22
+ beforeAdapterRun?(context: RuntimeCapabilityContext): Promise<Partial<RuntimeCapabilityState> | void> | Partial<RuntimeCapabilityState> | void;
23
+ beforeAdapterResultContract?(context: RuntimeCapabilityContext & {
24
+ result: RuntimeOutput;
25
+ }): Promise<void> | void;
26
+ afterAdapterResponse?(context: RuntimeCapabilityContext & {
27
+ result: RuntimeOutput;
28
+ response: RuntimeResponse;
29
+ }): Promise<void> | void;
30
+ stop?(): Promise<void> | void;
31
+ };
32
+ export type RuntimeCapabilityRegistry = {
33
+ modules: RuntimeCapabilityModule[];
34
+ state: RuntimeCapabilityState;
35
+ emitSideEffects(event: RuntimeEvent, emit: RuntimeEmit): void;
36
+ beforeAdapterRun(context: Omit<RuntimeCapabilityContext, "state">): Promise<RuntimeCapabilityState>;
37
+ beforeAdapterResultContract(context: Omit<RuntimeCapabilityContext, "state"> & {
38
+ result: RuntimeOutput;
39
+ }): Promise<void>;
40
+ afterAdapterResponse(context: Omit<RuntimeCapabilityContext, "state"> & {
41
+ result: RuntimeOutput;
42
+ response: RuntimeResponse;
43
+ }): Promise<void>;
44
+ stop(): Promise<void>;
45
+ };
46
+ export declare function createRuntimeCapabilityRegistry(modules: Array<RuntimeCapabilityModule | undefined>): RuntimeCapabilityRegistry;
47
+ export declare function normalizeAdapterResult(result: string | RuntimeOutput): RuntimeOutput;
@@ -0,0 +1 @@
1
+ export function createRuntimeCapabilityRegistry(e){const t=e.filter(e=>Boolean(e)),o={};return{modules:t,state:o,emitSideEffects(e,o){for(const r of t)try{r.onEvent?.(e,o)}catch{continue}},async beforeAdapterRun(e){for(const r of t){const t=await(r.beforeAdapterRun?.({...e,state:o}));mergeCapabilityState(o,t)}return o},async beforeAdapterResultContract(e){for(const r of t)await(r.beforeAdapterResultContract?.({...e,state:o}))},async afterAdapterResponse(e){for(const r of t)await(r.afterAdapterResponse?.({...e,state:o}))},async stop(){await Promise.all(t.map(e=>e.stop?.()))}}}export function normalizeAdapterResult(e){return"string"==typeof e?{text:e}:e}function mergeCapabilityState(e,t){t&&(void 0!==t.memory&&(e.memory=t.memory),t.pluginMemories&&(e.pluginMemories=[...e.pluginMemories??[],...t.pluginMemories]))}
@@ -0,0 +1,18 @@
1
+ import type { RuntimeArtifactStore, 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
+ artifacts?: RuntimeArtifactStore;
10
+ }): RuntimeResponse;
11
+ export declare function failRun(input: {
12
+ store: RuntimeStore;
13
+ emit: (event: RuntimeEvent) => void;
14
+ requestId: string;
15
+ sessionId: string;
16
+ agent: WorkspaceAgent;
17
+ error: unknown;
18
+ }): RuntimeResponse;
@@ -0,0 +1 @@
1
+ export function completeRun(t){const e=t.store.getRun(t.requestId);if("cancelled"===e?.state)return response(t,"cancelled",e.artifacts);const s=(t.result.artifacts??[]).map(toPublicArtifact);e&&t.store.updateRun(t.requestId,{state:"completed",output:t.result.text,metadata:{...e.metadata,...t.result.metadata},artifacts:mergeArtifacts(e.artifacts,s),completedAt:(new Date).toISOString()});for(const e of t.result.artifacts??[])t.artifacts?.createArtifact({...e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id});for(const e of s)t.emit({type:"runtime.artifact.created",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,artifact:e});return t.emit({type:"runtime.request.completed",requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,output:t.result.text}),response(t,"completed",t.store.getRun(t.requestId)?.artifacts)}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:"runtime.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 response(t,e,s){return{requestId:t.requestId,sessionId:t.sessionId,agentId:t.agent.id,state:e,output:t.result.text,metadata:t.result.metadata,artifacts:s??t.result.artifacts}}function mergeArtifacts(t,e){const s=new Map;for(const r of[...t??[],...e??[]])s.set(r.id,r);return[...s.values()]}function toPublicArtifact(t){return{id:t.id,kind:t.kind,...t.uri?{uri:t.uri}:{},...t.metadata?{metadata:t.metadata}:{}}}
@@ -0,0 +1,11 @@
1
+ import type { CompiledWorkspace, RuntimeEvent, RuntimeOutput, RuntimeRequest, RuntimeToolFailureTracker, 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
+ toolFailureTracker?: RuntimeToolFailureTracker;
11
+ }): Promise<RuntimeOutput>;
@@ -0,0 +1 @@
1
+ import{toolCircuitOpenEvent as o,toolFailureEvent as t}from"./tool-failure.js";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 resolveDirectToolCall(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,requestInput:o.request.input,approvalIds:readApprovalIds(o.request.metadata)}}));if(t&&o.agent.tools.includes(t.toolId)&&o.gateway.get(t.toolId))return emitToolRepair(o,"repaired",t.toolId),t;if(!o.agent.tools.includes(o.toolId))throw emitToolRepair(o,"blocked",void 0,`Tool ${o.toolId} is not assigned to agent ${o.agent.id}`),new Error(`Tool ${o.toolId} is not assigned to agent ${o.agent.id}`);throw emitToolRepair(o,"blocked",void 0,`Tool is not registered: ${o.toolId}`),new Error(`Tool is not registered: ${o.toolId}`)}({gateway:o.gateway,workspace:o.workspace,requestId:o.requestId,sessionId:o.sessionId,agent:o.agent,emit:o.emit,request:o.request,toolId:t.toolId,args:t.args});if(o.emit({type:"runtime.tool.direct.started",requestId:o.requestId,sessionId:o.sessionId,agentId:o.agent.id,toolId:e.toolId}),o.toolFailureTracker?.isCircuitOpen(e.toolId)){const t=new Error(`Tool circuit is open: ${e.toolId}`);throw emitToolFailure(o,e.toolId,t),t}const r=await async function invokeToolWithFailureEvents(o,t){try{return await o.gateway.invoke({toolId:t.toolId,args:t.args,context:{workspaceRoot:o.workspace.root,requestId:o.requestId,sessionId:o.sessionId,agentId:o.agent.id,requestInput:o.request.input,approvalIds:readApprovalIds(o.request.metadata)}})}catch(e){throw emitToolFailure(o,t.toolId,e),e}}(o,e);return o.toolFailureTracker?.recordSuccess(r.toolId),o.emit({type:"runtime.tool.direct.completed",requestId:o.requestId,sessionId:o.sessionId,agentId:o.agent.id,toolId:r.toolId,output:r.output}),{text:(s=r.output,"string"==typeof s?s:JSON.stringify(s)),metadata:{toolCall:{toolId:r.toolId}}};var s}function emitToolFailure(e,r,s){const a=t({requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,toolId:r,error:s});e.emit(a),e.toolFailureTracker?.recordFailure(r)&&e.emit(o({requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,toolId:r,reason:"runtime.tool.failure"===a.type?a.failure.reason:"unknown"}))}function emitToolRepair(o,t,e,r){o.emit({type:"runtime.inventory.repair",requestId:o.requestId,sessionId:o.sessionId,agentId:o.agent.id,status:t,diagnostic:{layer:"tool",owner:"stable_runtime_policy",originalId:o.toolId,repairedId:e,candidateIds:o.agent.tools,reason:r}})}function readApprovalIds(o){const t=o?.approvalIds??o?.approvalId;return"string"==typeof t&&t.trim()?[t.trim()]:Array.isArray(t)?t.filter(o=>"string"==typeof o&&o.trim().length>0):void 0}
@@ -0,0 +1,295 @@
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
+ import type { RuntimeSandboxDecision } from "./tool-gateway.js";
5
+ import type { RuntimeToolFailureClassification, RuntimeToolFailureReason } from "./tool-failure.js";
6
+ export type RuntimeInventoryRepairLayer = "agent" | "workflow_route" | "workflow" | "tool" | "task" | "skill";
7
+ export type RuntimeInventoryRepairStatus = "repaired" | "blocked";
8
+ export type RuntimeInventoryRepairDiagnostic = {
9
+ layer: RuntimeInventoryRepairLayer;
10
+ owner: "stable_runtime_policy" | "protocol_adapter" | "upstream_backend" | "workspace_config";
11
+ originalId?: string;
12
+ repairedId?: string;
13
+ candidateIds: string[];
14
+ reason?: string;
15
+ matchSource?: string;
16
+ confidence?: number;
17
+ };
18
+ export type RuntimeEvent = {
19
+ type: "runtime.request.started";
20
+ requestId: string;
21
+ sessionId: string;
22
+ agentId: string;
23
+ input?: string;
24
+ } | {
25
+ type: "runtime.request.completed";
26
+ requestId: string;
27
+ sessionId: string;
28
+ agentId: string;
29
+ output: string;
30
+ } | {
31
+ type: "runtime.request.failed";
32
+ requestId: string;
33
+ sessionId: string;
34
+ agentId: string;
35
+ error: string;
36
+ } | {
37
+ type: "runtime.request.cancelled";
38
+ requestId: string;
39
+ sessionId: string;
40
+ agentId: string;
41
+ reason?: string;
42
+ } | {
43
+ type: "runtime.artifact.created";
44
+ requestId: string;
45
+ sessionId: string;
46
+ agentId: string;
47
+ artifact: RuntimeArtifact;
48
+ } | {
49
+ type: "runtime.execution.contract.failed";
50
+ requestId: string;
51
+ sessionId: string;
52
+ agentId: string;
53
+ reason: string;
54
+ missingEvidenceTools?: string[];
55
+ } | {
56
+ type: "runtime.inventory.repair";
57
+ requestId: string;
58
+ sessionId: string;
59
+ agentId: string;
60
+ status: RuntimeInventoryRepairStatus;
61
+ diagnostic: RuntimeInventoryRepairDiagnostic;
62
+ } | {
63
+ type: "runtime.tool.direct.started";
64
+ requestId: string;
65
+ sessionId: string;
66
+ agentId: string;
67
+ toolId: string;
68
+ } | {
69
+ type: "runtime.tool.direct.completed";
70
+ requestId: string;
71
+ sessionId: string;
72
+ agentId: string;
73
+ toolId: string;
74
+ output: unknown;
75
+ } | {
76
+ type: "runtime.sandbox.decision";
77
+ requestId: string;
78
+ sessionId: string;
79
+ agentId: string;
80
+ toolId: string;
81
+ decision: RuntimeSandboxDecision;
82
+ } | {
83
+ type: "runtime.approval.requested";
84
+ requestId: string;
85
+ sessionId: string;
86
+ agentId: string;
87
+ approval: ApprovalRequest;
88
+ } | {
89
+ type: "runtime.approval.resolved";
90
+ requestId: string;
91
+ sessionId: string;
92
+ agentId: string;
93
+ approval: ApprovalRequest;
94
+ } | {
95
+ type: "runtime.tool.failure";
96
+ requestId: string;
97
+ sessionId: string;
98
+ agentId: string;
99
+ toolId: string;
100
+ error: unknown;
101
+ failure: RuntimeToolFailureClassification;
102
+ } | {
103
+ type: "runtime.tool.circuit.opened";
104
+ requestId: string;
105
+ sessionId: string;
106
+ agentId: string;
107
+ toolId: string;
108
+ reason: RuntimeToolFailureReason;
109
+ } | {
110
+ type: "runtime.workflow.started";
111
+ requestId: string;
112
+ sessionId: string;
113
+ agentId: string;
114
+ workflowId: string;
115
+ adapter: string;
116
+ } | {
117
+ type: "runtime.workflow.completed";
118
+ requestId: string;
119
+ sessionId: string;
120
+ agentId: string;
121
+ workflowId: string;
122
+ adapter: string;
123
+ } | {
124
+ type: "runtime.specDriven.phase.started";
125
+ requestId: string;
126
+ sessionId: string;
127
+ agentId: string;
128
+ phaseId: string;
129
+ workflowId?: string;
130
+ } | {
131
+ type: "runtime.specDriven.phase.blocked";
132
+ requestId: string;
133
+ sessionId: string;
134
+ agentId: string;
135
+ phaseId: string;
136
+ workflowId?: string;
137
+ reason: string;
138
+ } | {
139
+ type: "runtime.specDriven.phase.completed";
140
+ requestId: string;
141
+ sessionId: string;
142
+ agentId: string;
143
+ phaseId: string;
144
+ workflowId?: string;
145
+ artifact?: RuntimeArtifact;
146
+ } | {
147
+ type: "runtime.specDriven.phase.verified";
148
+ requestId: string;
149
+ sessionId: string;
150
+ agentId: string;
151
+ phaseId: string;
152
+ workflowId?: string;
153
+ artifact?: RuntimeArtifact;
154
+ } | {
155
+ type: "runtime.memory.lifecycle";
156
+ requestId: string;
157
+ sessionId: string;
158
+ agentId: string;
159
+ hook: RuntimeMemoryHook;
160
+ } | {
161
+ type: "runtime.memory.recall.completed";
162
+ requestId: string;
163
+ sessionId: string;
164
+ agentId: string;
165
+ namespace: string;
166
+ recordIds: string[];
167
+ context: string;
168
+ } | {
169
+ type: "runtime.memory.candidate.submitted";
170
+ requestId: string;
171
+ sessionId: string;
172
+ agentId: string;
173
+ candidate: MemoryCandidate;
174
+ decision: MemoryDecision;
175
+ record?: MemoryRecord;
176
+ } | {
177
+ type: "runtime.memory.approval.requested";
178
+ requestId: string;
179
+ sessionId: string;
180
+ agentId: string;
181
+ approval: ApprovalRequest;
182
+ } | {
183
+ type: "runtime.memory.plugin.started";
184
+ requestId: string;
185
+ sessionId: string;
186
+ agentId: string;
187
+ memoryId: string;
188
+ provider: string;
189
+ namespace: string;
190
+ } | {
191
+ type: "runtime.memory.plugin.completed";
192
+ requestId: string;
193
+ sessionId: string;
194
+ agentId: string;
195
+ memoryId: string;
196
+ provider: string;
197
+ namespace: string;
198
+ candidateCount: number;
199
+ } | {
200
+ type: "runtime.memory.plugin.failed";
201
+ requestId: string;
202
+ sessionId: string;
203
+ agentId: string;
204
+ memoryId: string;
205
+ provider: string;
206
+ namespace: string;
207
+ error: string;
208
+ } | {
209
+ type: "runtime.memory.maintenance.started";
210
+ requestId: string;
211
+ sessionId: string;
212
+ agentId: string;
213
+ target: string;
214
+ } | {
215
+ type: "runtime.memory.maintenance.completed";
216
+ requestId: string;
217
+ sessionId: string;
218
+ agentId: string;
219
+ target: string;
220
+ operationCount: number;
221
+ } | {
222
+ type: "runtime.memory.maintenance.failed";
223
+ requestId: string;
224
+ sessionId: string;
225
+ agentId: string;
226
+ target: string;
227
+ error: string;
228
+ } | {
229
+ type: "runtime.skill.candidate.created";
230
+ requestId: string;
231
+ sessionId: string;
232
+ agentId: string;
233
+ candidateId: string;
234
+ name: string;
235
+ confidence: number;
236
+ evidenceCount: number;
237
+ status: string;
238
+ proposedPath?: string;
239
+ } | {
240
+ type: "runtime.progress.narration";
241
+ requestId: string;
242
+ sessionId: string;
243
+ agentId: string;
244
+ message: string;
245
+ provider: string;
246
+ sourceEventTypes: string[];
247
+ sourceEventIds?: string[];
248
+ model?: string;
249
+ style?: string;
250
+ } | {
251
+ type: "runtime.quality.planning.reviewed";
252
+ requestId: string;
253
+ sessionId: string;
254
+ agentId: string;
255
+ verdict: string;
256
+ issues: Array<{
257
+ code: string;
258
+ message: string;
259
+ recoverable: boolean;
260
+ }>;
261
+ } | {
262
+ type: "runtime.quality.execution.reviewed";
263
+ requestId: string;
264
+ sessionId: string;
265
+ agentId: string;
266
+ verdict: string;
267
+ issues: Array<{
268
+ code: string;
269
+ message: string;
270
+ recoverable: boolean;
271
+ }>;
272
+ } | {
273
+ type: "runtime.quality.recovery.started";
274
+ requestId: string;
275
+ sessionId: string;
276
+ agentId: string;
277
+ phase: "planning" | "execution";
278
+ attempt: number;
279
+ verdict: string;
280
+ } | {
281
+ type: "runtime.quality.synthesis.created";
282
+ requestId: string;
283
+ sessionId: string;
284
+ agentId: string;
285
+ mode: "evidence_only";
286
+ } | {
287
+ type: "runtime.adapter.event";
288
+ requestId: string;
289
+ sessionId: string;
290
+ agentId: string;
291
+ event: unknown;
292
+ };
293
+ export type RuntimeMemoryHook = "read-before-plan" | "read-before-finalize" | "write-after-run";
294
+ export type RuntimeEventListener = (event: RuntimeEvent) => void;
295
+ export type RuntimeEmit = (event: RuntimeEvent) => void;
@@ -0,0 +1,8 @@
1
+ import type { ApprovalQueue } from "@stable-harness/governance";
2
+ import type { CompiledWorkspace, RuntimeEvent, RuntimeToolGateway } from "../../types.js";
3
+ export declare function createApprovalGatedToolGateway(input: {
4
+ gateway?: RuntimeToolGateway;
5
+ approvals?: ApprovalQueue;
6
+ workspace: CompiledWorkspace;
7
+ emit: (event: RuntimeEvent) => void;
8
+ }): RuntimeToolGateway | undefined;
@@ -0,0 +1 @@
1
+ export function createApprovalGatedToolGateway(e){if(!e.gateway)return;const t=function readRequiredToolIds(e){const t=readRecord(e);return new Set(function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.trim().length>0):[]}(t?.requiredToolIds??t?.approvalRequiredToolIds))}(e.workspace.runtime.approvals);return 0===t.size?e.gateway:{get:t=>e.gateway?.get(t),repairToolCall:e.gateway.repairToolCall?.bind(e.gateway),async invoke(o){if(!t.has(o.toolId))return e.gateway.invoke(o);const r=await async function resolveApprovedToolInvocation(e,t,o){if(e&&o.approvalIds?.length)for(const r of o.approvalIds){const o=await e.get(r);if("tool_invocation"===o?.kind&&readRecord(o.subject)?.toolId===t){if("approved"===o.status)return"approved";if("rejected"===o.status)return"rejected"}}}(e.approvals,o.toolId,o.context);if("approved"===r)return e.gateway.invoke(o);if("rejected"===r)return{toolId:o.toolId,output:approvalRequiredOutput(o.toolId,"rejected","The linked approval was rejected.")};if(!e.approvals)return{toolId:o.toolId,output:approvalRequiredOutput(o.toolId,"approval_queue_missing","Tool approval is required, but no approval queue is configured.")};const a=await e.approvals.create({kind:"tool_invocation",reason:`Tool '${o.toolId}' requires explicit approval.`,requestId:o.context.requestId,sessionId:o.context.sessionId,agentId:o.context.agentId,subject:{toolId:o.toolId,args:o.args,requestInput:o.context.requestInput}});return e.emit({type:"runtime.approval.requested",requestId:o.context.requestId,sessionId:o.context.sessionId,agentId:o.context.agentId,approval:a}),{toolId:o.toolId,output:approvalRequiredOutput(o.toolId,"pending",a.reason,a.id)}}}}function approvalRequiredOutput(e,t,o,r){return{status:"approval_required",toolId:e,state:t,reason:o,...r?{approvalId:r}:{}}}function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}
@@ -0,0 +1,9 @@
1
+ import type { CompiledWorkspace, RuntimeEvent, RuntimeToolGateway } from "../../types.js";
2
+ import type { RuntimeSandboxPolicy } from "../tool-gateway.js";
3
+ export declare function createSandboxedToolGateway(input: {
4
+ gateway?: RuntimeToolGateway;
5
+ workspace: CompiledWorkspace;
6
+ sandbox?: RuntimeSandboxPolicy | false;
7
+ emit: (event: RuntimeEvent) => void;
8
+ }): RuntimeToolGateway | undefined;
9
+ export declare function createWorkspaceSandboxPolicy(config: unknown): RuntimeSandboxPolicy | undefined;
@@ -0,0 +1 @@
1
+ export function createSandboxedToolGateway(e){const o=!1===e.sandbox?void 0:e.sandbox??createWorkspaceSandboxPolicy(e.workspace.runtime.sandbox);return e.gateway&&o?{get:o=>e.gateway.get(o),repairToolCall:e.gateway.repairToolCall?o=>e.gateway.repairToolCall(o):void 0,async invoke(t){const n=await o.decide({toolId:t.toolId,args:t.args,context:t.context});return function emitDecision(e,o,t){e({type:"runtime.sandbox.decision",requestId:o.context.requestId,sessionId:o.context.sessionId,agentId:o.context.agentId,toolId:o.toolId,decision:t})}(e.emit,t,n),"deny"===n.action?{toolId:t.toolId,output:sandboxDeniedOutput(t.toolId,n)}:e.gateway.invoke({...t,context:{...t.context,sandbox:n}})}}:e.gateway}export function createWorkspaceSandboxPolicy(e){const o=readRecord(e);if(!o||!1===o.enabled)return;const t=function readRuleMap(e){const o=readRecord(e);return o?new Map(Object.entries(o).map(([e,o])=>[e,readRule(o)])):new Map}(o.byToolId??o.sandboxByToolId??o.profilesByToolId),n=new Set(function readStringArray(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e&&e.trim().length>0):[]}(o.denyToolIds)),a=function fallbackDecision(e){const o=readAction(e.defaultAction)??"allow",t=readString(e.defaultProfile)??readString(e.profile);return{action:o,...t?{profile:t}:{},reason:"allow"===o?"No sandbox rule matched; default allow applied.":"No sandbox rule matched; default deny applied."}}(o);return{decide:e=>n.has(e.toolId)?{action:"deny",reason:"Tool is denied by sandbox policy."}:t.get(e.toolId)??a}}function sandboxDeniedOutput(e,o){return{status:"sandbox_denied",toolId:e,reason:o.reason??"Tool execution was denied by sandbox policy.",...o.profile?{profile:o.profile}:{},...o.policyId?{policyId:o.policyId}:{}}}function readRule(e){if("string"==typeof e&&e.trim())return{action:"allow",profile:e.trim()};const o=readRecord(e);if(!o)return{action:"allow"};const t=readAction(o.action)??(!0===o.deny?"deny":"allow"),n=readString(o.profile),a=readString(o.reason),r=readString(o.policyId),d=readRecord(o.metadata);return{action:t,...n?{profile:n}:{},...a?{reason:a}:{},...r?{policyId:r}:{},...d?{metadata:d}:{}}}function readAction(e){return"allow"===e||"deny"===e?e:void 0}function readString(e){return"string"==typeof e&&e.trim()?e.trim():void 0}function readRecord(e){return"object"!=typeof e||null===e||Array.isArray(e)?void 0:e}
@@ -0,0 +1,15 @@
1
+ import type { RuntimeArtifactFilter, RuntimeArtifactRecord, RuntimeArtifactStore, RuntimeStore } from "../types.js";
2
+ export declare function listRuntimeArtifacts(input: {
3
+ store: RuntimeStore;
4
+ artifacts?: RuntimeArtifactStore;
5
+ filter?: RuntimeArtifactFilter;
6
+ }): RuntimeArtifactRecord[];
7
+ export declare function getRuntimeArtifact(input: {
8
+ store: RuntimeStore;
9
+ artifacts?: RuntimeArtifactStore;
10
+ id: string;
11
+ }): RuntimeArtifactRecord | undefined;
12
+ export declare function readRuntimeArtifact(input: {
13
+ artifacts?: RuntimeArtifactStore;
14
+ id: string;
15
+ }): unknown | undefined;
@@ -0,0 +1 @@
1
+ export function listRuntimeArtifacts(t){return t.artifacts?t.artifacts.listArtifacts(t.filter):t.store.listRuns().flatMap(e=>function projectRunArtifacts(t,e){return function matchesFilter(t,e){return!(e&&(e.requestId&&e.requestId!==t.requestId||e.sessionId&&e.sessionId!==t.sessionId||e.agentId&&e.agentId!==t.agentId))}(t,e)?t.artifacts.map(e=>({...e,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,createdAt:t.completedAt??t.startedAt})):[]}(e,t.filter))}export function getRuntimeArtifact(t){return listRuntimeArtifacts(t).find(e=>e.id===t.id)}export function readRuntimeArtifact(t){try{return t.artifacts?.readArtifact(t.id)}catch{return}}
@@ -0,0 +1,11 @@
1
+ import type { ApprovalQueue } from "@stable-harness/governance";
2
+ import type { CompiledWorkspace, RuntimeArtifactStore, RuntimeEvent, RuntimeStore, StableHarnessRuntime } from "../../types.js";
3
+ type RuntimeInspectionMethods = Pick<StableHarnessRuntime, "inspect" | "getRuntimePolicy" | "getWorkflow" | "getRun" | "listArtifacts" | "getArtifact" | "readArtifact" | "exportReplayBundle" | "listRequests" | "listSessions" | "inspectRequest" | "listApprovals" | "getApproval" | "resolveApproval">;
4
+ export declare function createRuntimeInspectionMethods(input: {
5
+ workspace: CompiledWorkspace;
6
+ store: RuntimeStore;
7
+ artifacts?: RuntimeArtifactStore;
8
+ approvals?: ApprovalQueue;
9
+ emit: (event: RuntimeEvent) => void;
10
+ }): RuntimeInspectionMethods;
11
+ export {};
@@ -0,0 +1 @@
1
+ import{projectRequestInspection as t,projectRequestSummary as e,projectSessionSummaries as s}from"../persistence/inspection.js";import{getRuntimeArtifact as r,listRuntimeArtifacts as o,readRuntimeArtifact as a}from"./artifacts.js";import{exportRuntimeReplayBundle as i}from"./replay.js";export function createRuntimeInspectionMethods(n){return{inspect:()=>{return{workspaceRoot:n.workspace.root,agents:[...n.workspace.agents.keys()].sort(),workflows:[...n.workspace.workflows.keys()].sort(),...n.workspace.runtime.specDrivenWorkflow?{specDrivenWorkflow:(t=n.workspace.runtime.specDrivenWorkflow,{enabled:t.enabled,artifactsDir:t.artifactsDir,...t.constitution?{constitution:t.constitution}:{},phases:t.phases.map(t=>t.id)})}:{},evaluations:[...n.workspace.evaluations?.keys()??[]].sort(),...n.workspace.runtime.workflowRouting?.defaultWorkflowId?{defaultWorkflowId:n.workspace.runtime.workflowRouting.defaultWorkflowId}:{},workflowRoutes:(n.workspace.runtime.workflowRouting?.routes??[]).map(t=>t.id).sort(),models:[...n.workspace.models.keys()].sort(),tools:[...n.workspace.tools.keys()].sort(),runs:n.store.listRuns()};var t},getRuntimePolicy:()=>n.workspace.runtime,getWorkflow:t=>n.workspace.workflows.get(t),getRun:t=>n.store.getRun(t),listArtifacts:t=>o({store:n.store,artifacts:n.artifacts,filter:t}),getArtifact:t=>r({store:n.store,artifacts:n.artifacts,id:t}),readArtifact:t=>a({artifacts:n.artifacts,id:t}),exportReplayBundle:t=>i({store:n.store,artifacts:n.artifacts,requestId:t}),listRequests:t=>n.store.listRuns(t).map(e),listSessions:()=>s(n.store.listRuns()),inspectRequest:e=>{const s=n.store.getRun(e);return s?t(n.workspace,s):void 0},listApprovals:t=>n.approvals?.list(t)??Promise.resolve([]),getApproval:t=>n.approvals?.get(t)??Promise.resolve(void 0),resolveApproval:async(t,e)=>{const s=await(n.approvals?.resolve(t,e));return s&&n.emit({type:"runtime.approval.resolved",requestId:s.requestId??"",sessionId:s.sessionId??"",agentId:s.agentId??"",approval:s}),s}}}
@@ -0,0 +1,6 @@
1
+ import type { RuntimeArtifactStore, RuntimeReplayBundle, RuntimeStore } from "../types.js";
2
+ export declare function exportRuntimeReplayBundle(input: {
3
+ store: RuntimeStore;
4
+ artifacts?: RuntimeArtifactStore;
5
+ requestId: string;
6
+ }): RuntimeReplayBundle | undefined;
@@ -0,0 +1 @@
1
+ import{createHash as t}from"node:crypto";import{listRuntimeArtifacts as e}from"./artifacts.js";export function exportRuntimeReplayBundle(t){const s=t.store.getRun(t.requestId);if(!s)return;const r=e({store:t.store,artifacts:t.artifacts,filter:{requestId:t.requestId}}),a={schemaVersion:1,kind:"stable-harness.replay-bundle",requestId:s.requestId,sessionId:s.sessionId,agentId:s.agentId,createdAt:s.completedAt??s.startedAt,run:s,events:s.events,artifacts:r};return{...a,integrity:{algorithm:"sha256",runHash:digest(s),eventsHash:digest(s.events),artifactsHash:digest(r),bundleHash:digest(a)}}}function digest(e){return t("sha256").update(function stableJson(t){return JSON.stringify(sortValue(t))}(e)).digest("hex")}function sortValue(t){return Array.isArray(t)?t.map(sortValue):t&&"object"==typeof t?Object.fromEntries(Object.entries(t).sort(([t],[e])=>t.localeCompare(e)).map(([t,e])=>[t,sortValue(e)])):t}
@@ -0,0 +1,29 @@
1
+ import type { ApprovalQueue } from "@stable-harness/governance";
2
+ import type { MemoryProvider, RuntimeMemoryStore } from "@stable-harness/memory";
3
+ import type { CompiledWorkspace, RuntimeEvent, RuntimeMemoryContext, RuntimeRequest, WorkspaceAgent } from "../types.js";
4
+ import type { RuntimeCapabilityModule } from "./capabilities.js";
5
+ 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;
6
+ export declare function runMemoryRecall(input: {
7
+ memory: RuntimeMemoryStore | undefined;
8
+ emit: (event: RuntimeEvent) => void;
9
+ request: RuntimeRequest;
10
+ requestId: string;
11
+ sessionId: string;
12
+ agent: WorkspaceAgent;
13
+ workspace: CompiledWorkspace;
14
+ }): Promise<RuntimeMemoryContext | undefined>;
15
+ export declare function submitMemoryCandidates(input: {
16
+ memory: RuntimeMemoryStore | undefined;
17
+ approvals: ApprovalQueue | undefined;
18
+ emit: (event: RuntimeEvent) => void;
19
+ request: RuntimeRequest;
20
+ requestId: string;
21
+ sessionId: string;
22
+ agent: WorkspaceAgent;
23
+ workspace: CompiledWorkspace;
24
+ }): Promise<void>;
25
+ export declare function createMemoryRuntimeCapability(input: {
26
+ memory?: RuntimeMemoryStore;
27
+ memoryProviders?: MemoryProvider[];
28
+ approvals?: ApprovalQueue;
29
+ }): RuntimeCapabilityModule;
@@ -0,0 +1 @@
1
+ import{recallMemoryPlugins as e,runMemoryPlugins as r}from"../memory-plugins.js";export function emitMemoryLifecycle(e,r,s,t,o,a){e&&r({type:"runtime.memory.lifecycle",requestId:s,sessionId:t,agentId:o,hook:a})}export async function runMemoryRecall(e){if(!e.memory)return;if(emitMemoryLifecycle(e.memory,e.emit,e.requestId,e.sessionId,e.agent.id,"read-before-plan"),!1===e.request.memory?.recall)return;const r=resolveMemoryNamespace(e.workspace,e.agent,e.request),s=e.request.memory?.recall?.query??e.request.input,t=await e.memory.recall({namespace:r,query:s,limit:e.request.memory?.recall?.limit});return e.emit({type:"runtime.memory.recall.completed",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,namespace:r,recordIds:t.records.map(e=>e.id),context:t.context}),{namespace:r,records:t.records,context:t.context}}export async function submitMemoryCandidates(e){if(!e.memory||!e.request.memory?.candidates?.length)return;emitMemoryLifecycle(e.memory,e.emit,e.requestId,e.sessionId,e.agent.id,"write-after-run");const r=resolveMemoryNamespace(e.workspace,e.agent,e.request);for(const s of e.request.memory.candidates){const t={...s,namespace:s.namespace??r},o=await e.memory.submitCandidate(t);if(e.emit({type:"runtime.memory.candidate.submitted",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,candidate:o.candidate,decision:o.decision,record:o.record}),"review"===o.decision.action&&e.approvals){const r=await e.approvals.create({kind:"memory_write",reason:o.decision.reason,requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,subject:{candidate:o.candidate,decision:o.decision}});e.emit({type:"runtime.memory.approval.requested",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agent.id,approval:r})}}}export function createMemoryRuntimeCapability(s){return{id:"runtime.memory",beforeAdapterRun:async r=>({memory:await runMemoryRecall({memory:s.memory,emit:r.emit,request:r.request,requestId:r.requestId,sessionId:r.sessionId,agent:r.agent,workspace:r.workspace}),pluginMemories:await e({providers:s.memoryProviders,request:r.request,agent:r.agent,workspace:r.workspace})}),async beforeAdapterResultContract(e){emitMemoryLifecycle(s.memory,e.emit,e.requestId,e.sessionId,e.agent.id,"read-before-finalize"),await submitMemoryCandidates({memory:s.memory,approvals:s.approvals,emit:e.emit,request:e.request,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,workspace:e.workspace})},async afterAdapterResponse(e){await r({providers:s.memoryProviders,emit:e.emit,request:e.request,requestId:e.requestId,sessionId:e.sessionId,agent:e.agent,workspace:e.workspace,result:e.result})}}}function resolveMemoryNamespace(e,r,s){return s.memory?.namespace??`${e.root}:${r.id}`}
@@ -0,0 +1,8 @@
1
+ import type { RuntimeArtifactRecord, RuntimeArtifactStore } from "../types.js";
2
+ type ArtifactState = {
3
+ records: RuntimeArtifactRecord[];
4
+ contents: Record<string, unknown>;
5
+ };
6
+ export declare function createInMemoryArtifactStore(initial?: ArtifactState): RuntimeArtifactStore;
7
+ export declare function createJsonFileArtifactStore(filePath: string): RuntimeArtifactStore;
8
+ export {};
@@ -0,0 +1 @@
1
+ import{existsSync as t,mkdirSync as e,readFileSync as r,writeFileSync as n}from"node:fs";import i from"node:path";export function createInMemoryArtifactStore(t){const e=new Map((t?.records??[]).map(t=>[t.id,cloneRecord(t)])),r=new Map(Object.entries(t?.contents??{}).map(([t,e])=>[t,structuredClone(e)]));return{createArtifact(t){const n=function toRecord(t){return{id:t.id,kind:t.kind,uri:t.uri,metadata:t.metadata,requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,contentType:t.contentType,createdAt:t.createdAt??(new Date).toISOString(),size:(e=t.content,Buffer.byteLength(JSON.stringify(e??null),"utf8"))};var e}(t);return e.set(n.id,n),r.set(n.id,structuredClone(t.content??null)),cloneRecord(n)},listArtifacts:t=>[...e.values()].filter(e=>function matchesFilter(t,e){return!e||!(e.requestId&&e.requestId!==t.requestId||e.sessionId&&e.sessionId!==t.sessionId||e.agentId&&e.agentId!==t.agentId)}(e,t)).map(cloneRecord),readArtifact(t){if(!r.has(t))throw new Error(`Artifact not found: ${t}`);return structuredClone(r.get(t))}}}export function createJsonFileArtifactStore(c){const o=i.resolve(c),s=createInMemoryArtifactStore(function readArtifactFile(e){if(!t(e))return{records:[],contents:{}};const n=JSON.parse(r(e,"utf8"));if(!function isState(t){return"object"==typeof t&&null!==t&&Array.isArray(t.records)&&"object"==typeof t.contents}(n))throw new Error(`Invalid artifact store file: ${e}`);return n}(o));return{createArtifact(t){const r=s.createArtifact(t);return function writeArtifactFile(t,r){e(i.dirname(t),{recursive:!0}),n(t,`${JSON.stringify({version:1,...r},null,2)}\n`)}(o,function snapshot(t){const e=t.listArtifacts(),r=Object.fromEntries(e.map(e=>[e.id,t.readArtifact(e.id)]));return{records:e,contents:r}}(s)),r},listArtifacts:t=>s.listArtifacts(t),readArtifact:t=>s.readArtifact(t)}}function cloneRecord(t){return structuredClone(t)}
@@ -0,0 +1,4 @@
1
+ import type { CompiledWorkspace, RuntimeRequestInspection, RuntimeRequestSummary, RuntimeRunRecord, RuntimeSessionSummary } from "../../types.js";
2
+ export declare function projectRequestSummary(run: RuntimeRunRecord): RuntimeRequestSummary;
3
+ export declare function projectSessionSummaries(runs: RuntimeRunRecord[]): RuntimeSessionSummary[];
4
+ export declare function projectRequestInspection(workspace: CompiledWorkspace, run: RuntimeRunRecord): RuntimeRequestInspection;
@@ -0,0 +1 @@
1
+ import{applySpecDrivenPhaseTransition as t,createSpecDrivenWorkflowState as e}from"../../spec-driven/index.js";export function projectRequestSummary(t){return{requestId:t.requestId,sessionId:t.sessionId,agentId:t.agentId,parentRunId:t.parentRunId,state:t.state,startedAt:t.startedAt,completedAt:t.completedAt,eventCount:t.events.length,artifactCount:t.artifacts.length}}export function projectSessionSummaries(t){const e=new Map;for(const n of t)e.set(n.sessionId,[...e.get(n.sessionId)??[],n]);return[...e.entries()].map(([t,e])=>function projectSessionSummary(t,e){const n=[...e].sort((t,e)=>t.startedAt.localeCompare(e.startedAt));return{sessionId:t,requestCount:e.length,agentIds:[...new Set(e.map(t=>t.agentId))].sort(),states:countStates(e),startedAt:n[0]?.startedAt??"",updatedAt:latestTimestamp(e)}}(t,e)).sort((t,e)=>e.updatedAt.localeCompare(t.updatedAt))}export function projectRequestInspection(t,e){return{summary:projectRequestSummary(e),input:e.input,output:e.output,error:e.error,metadata:e.metadata,artifacts:e.artifacts,runtimeSnapshot:projectBindingSnapshot(t,e.agentId),...t.runtime.specDrivenWorkflow?{specDrivenWorkflow:projectSpecDrivenState(t.runtime.specDrivenWorkflow,e)}:{},timeline:projectTimeline(e)}}function projectSpecDrivenState(n,r){const s=new Set(n.phases.map(t=>t.id));return r.events.map(specDrivenTransition).filter(t=>void 0!==t&&s.has(t.phaseId)).reduce(t,e(n))}function specDrivenTransition(t){if(!function isSpecDrivenPhaseEvent(t){return t.type.startsWith("runtime.specDriven.phase.")}(t))return;const e=t.type.slice(25);return["started","blocked","completed","verified"].includes(e)?{phaseId:t.phaseId,status:e,..."artifact"in t&&t.artifact?{artifact:t.artifact}:{},..."reason"in t?{reason:t.reason}:{}}:void 0}function projectBindingSnapshot(t,e){const n=t.agents.get(e);return{workspaceRoot:t.root,agentId:e,backend:n?.backend??"unknown",modelRef:n?.modelRef,tools:[...n?.tools??[]],skills:[...n?.skills??[]],subagents:[...n?.subagents??[]]}}function projectTimeline(t){return t.events.map((t,e)=>({index:e,type:t.type,event:t}))}function countStates(t){return t.reduce((t,e)=>(t[e.state]=(t[e.state]??0)+1,t),{})}function latestTimestamp(t){return t.map(t=>t.completedAt??t.startedAt).sort((t,e)=>e.localeCompare(t))[0]??""}
@@ -0,0 +1,2 @@
1
+ import type { RuntimeQueueStore } from "../types.js";
2
+ export declare function createInMemoryRuntimeQueueStore(): RuntimeQueueStore;
@@ -0,0 +1 @@
1
+ export function createInMemoryRuntimeQueueStore(){const e=new Map,t=new Map,r=new Map;return{enqueue(t){const r=t.enqueuedAt??(new Date).toISOString(),n=cloneQueueRecord({...t,enqueuedAt:r,attemptCount:t.attemptCount??0});return e.set(n.requestId,n),cloneQueueRecord(n)},listQueue:()=>sortQueue([...e.values()]).map(cloneQueueRecord),getQueuedRequest:t=>cloneOptional(e.get(t),cloneQueueRecord),claimNext(r){const n=function findClaimCandidate(e,t){const r=Date.parse(t.now??(new Date).toISOString());return sortQueue(e).find(e=>{const n=Date.parse(e.availableAt)<=r,o=!t.queueKey||e.queueKey===t.queueKey,u=!e.leaseExpiresAt||Date.parse(e.leaseExpiresAt)<=r;return n&&o&&u})}([...e.values()],r);if(!n)return;const o=r.now??(new Date).toISOString(),u=function claimRecord(e,t,r,n){return{...e,claimedBy:t,claimedAt:r,leaseExpiresAt:new Date(Date.parse(r)+n).toISOString(),attemptCount:e.attemptCount+1}}(n,r.workerId,o,r.leaseMs);return e.set(u.requestId,u),t.set(u.requestId,{requestId:u.requestId,cancelRequested:t.get(u.requestId)?.cancelRequested??!1,workerId:r.workerId,workerStartedAt:t.get(u.requestId)?.workerStartedAt??o,heartbeatAt:o}),cloneQueueRecord(u)},heartbeat(e){const r=t.get(e.requestId);if(!r||r.workerId!==e.workerId)return;const n={...r,heartbeatAt:e.now??(new Date).toISOString()};return t.set(e.requestId,n),cloneControl(n)},requestCancel(e){const r={...t.get(e.requestId),requestId:e.requestId,cancelRequested:!0,cancelReason:e.reason,cancelRequestedAt:e.now??(new Date).toISOString()};return t.set(e.requestId,r),cloneControl(r)},getControl:e=>cloneOptional(t.get(e),cloneControl),listStuck(r){const n=Date.parse(r.now??(new Date).toISOString());return[...e.values()].filter(e=>function isStuck(e,t,r,n){if(!e.claimedAt)return!1;const o=Date.parse(t?.heartbeatAt??e.claimedAt);return!!e.leaseExpiresAt&&Date.parse(e.leaseExpiresAt)<r||r-o>n}(e,t.get(e.requestId),n,r.staleAfterMs)).map(cloneQueueRecord)},saveRecoveryIntent:e=>(r.set(e.requestId,cloneRecovery(e)),cloneRecovery(e)),getRecoveryIntent:e=>cloneOptional(r.get(e),cloneRecovery),clearRecoveryIntent:e=>r.delete(e)}}function sortQueue(e){return[...e].sort((e,t)=>{const r=t.priority-e.priority;return 0===r?e.enqueuedAt.localeCompare(t.enqueuedAt):r})}function cloneOptional(e,t){return e?t(e):void 0}function cloneQueueRecord(e){return structuredClone(e)}function cloneControl(e){return structuredClone(e)}function cloneRecovery(e){return structuredClone(e)}
@@ -0,0 +1,3 @@
1
+ import type { RuntimeRunRecord, RuntimeStore } from "../types.js";
2
+ export declare function createInMemoryRuntimeStore(initialRuns?: RuntimeRunRecord[]): RuntimeStore;
3
+ export declare function createJsonFileRuntimeStore(filePath: string): RuntimeStore;
@@ -0,0 +1 @@
1
+ import{existsSync as e,mkdirSync as t,readFileSync as n,writeFileSync as r}from"node:fs";import u from"node:path";export function createInMemoryRuntimeStore(e=[]){const t=new Map(e.map(e=>[e.requestId,cloneRun(e)]));return{createRun(e){t.set(e.requestId,cloneRun(e))},updateRun(e,n){const r=t.get(e);if(r)return Object.assign(r,function clonePatch(e){return structuredClone(e)}(n)),cloneRun(r)},appendEvent(e){const n=t.get(e.requestId);if(!n)return;const r=function eventArtifact(e){return"artifact"in e&&e.artifact?e.artifact:void 0}(e);return r&&!n.artifacts.some(e=>e.id===r.id)&&n.artifacts.push(structuredClone(r)),n.events.push(function cloneEvent(e){return structuredClone(e)}(e)),cloneRun(n)},getRun:e=>function cloneOptionalRun(e){return e?cloneRun(e):void 0}(t.get(e)),listRuns:e=>[...t.values()].filter(t=>function matchesFilter(e,t){return!t||!(t.agentId&&t.agentId!==e.agentId||t.sessionId&&t.sessionId!==e.sessionId||t.state&&t.state!==e.state)}(t,e)).map(cloneRun)}}export function createJsonFileRuntimeStore(t){const r=u.resolve(t),i=createInMemoryRuntimeStore(function readStoreFile(t){if(!e(t))return[];const r=JSON.parse(n(t,"utf8"));if(!isRecord(r)||!Array.isArray(r.runs))throw new Error(`Invalid runtime store file: ${t}`);return r.runs.map(assertRunRecord)}(r));return{createRun(e){i.createRun(e),writeStoreFile(r,i.listRuns())},updateRun(e,t){const n=i.updateRun(e,t);return writeStoreFile(r,i.listRuns()),n},appendEvent(e){const t=i.appendEvent(e);return writeStoreFile(r,i.listRuns()),t},getRun:e=>i.getRun(e),listRuns:e=>i.listRuns(e)}}function writeStoreFile(e,n){t(u.dirname(e),{recursive:!0}),r(e,`${JSON.stringify({version:1,runs:n},null,2)}\n`)}function assertRunRecord(e){if(!isRecord(e)||"string"!=typeof e.requestId)throw new Error("Invalid runtime run record in store file");return cloneRun(e)}function cloneRun(e){return structuredClone(e)}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}
@@ -0,0 +1,38 @@
1
+ import type { RuntimeEvent } from "./events.js";
2
+ import type { RuntimeCapabilityModule } from "./capabilities.js";
3
+ export type RuntimeProgressNarrationProvider = {
4
+ name: string;
5
+ narrate(event: RuntimeEvent, context: RuntimeProgressNarrationContext): RuntimeProgressNarrationResult;
6
+ };
7
+ export type RuntimeProgressNarrationResult = RuntimeProgressNarrationOutput | undefined | Promise<RuntimeProgressNarrationOutput | undefined>;
8
+ export type RuntimeProgressNarrationContext = {
9
+ style?: string;
10
+ model?: string;
11
+ };
12
+ export type RuntimeProgressNarrationOutput = {
13
+ message: string;
14
+ sourceEventTypes?: string[];
15
+ sourceEventIds?: string[];
16
+ model?: string;
17
+ style?: string;
18
+ };
19
+ export type RuntimeProgressNarrationOptions = {
20
+ enabled?: boolean;
21
+ style?: string;
22
+ model?: string;
23
+ provider?: RuntimeProgressNarrationProvider;
24
+ };
25
+ export declare function resolveProgressNarrator(input: {
26
+ options?: RuntimeProgressNarrationOptions | false;
27
+ policy?: Record<string, unknown>;
28
+ }): RuntimeProgressNarrationProvider | undefined;
29
+ export declare function createProgressNarrationEvent(input: {
30
+ source: RuntimeEvent;
31
+ narrator: RuntimeProgressNarrationProvider | undefined;
32
+ options?: RuntimeProgressNarrationOptions | false;
33
+ policy?: Record<string, unknown>;
34
+ }): RuntimeEvent | Promise<RuntimeEvent | undefined> | undefined;
35
+ export declare function createProgressNarrationCapability(input: {
36
+ options?: RuntimeProgressNarrationOptions | false;
37
+ policy?: Record<string, unknown>;
38
+ }): RuntimeCapabilityModule | undefined;
@@ -0,0 +1 @@
1
+ export function resolveProgressNarrator(e){if(!1===e.options)return;const t=readProgressPolicy(e.policy);return e.options?.enabled??t.enabled?e.options?.provider??function createTemplateProgressNarrator(){const e=new Map,t=new Map;return{name:"template",narrate(r,n){var o;"runtime.request.started"===r.type&&(e.set(r.requestId,{language:(o=r.input??"",/\p{Script=Han}/u.test(o)?"zh":void 0),input:r.input}),t.delete(r.requestId));const i=function templateMessage(e,t){const r="zh"===t?.language;return"runtime.request.started"===e.type?r?`我开始处理这个请求:${summarizeText(e.input)}`:`I'm starting on this request: ${summarizeText(e.input)}`:"runtime.request.completed"===e.type?r?"我已经完成执行链,正在交付最终结果。":"I've finished the execution chain and am returning the final result.":"runtime.request.failed"===e.type?r?"执行链失败了,我会保留具体错误方便定位。":"The execution chain failed; I'm keeping the concrete error visible for diagnosis.":"runtime.request.cancelled"===e.type?r?"这个请求已取消,后续执行会停止。":"The request was cancelled, so the remaining execution will stop.":"runtime.tool.direct.started"===e.type?r?`我正在运行 ${e.toolId}。`:`I'm running ${e.toolId}.`:"runtime.tool.direct.completed"===e.type?r?`${e.toolId} 已返回结果,我会继续使用这份证据。`:`${e.toolId} returned; I'll keep using that evidence.`:"runtime.workflow.started"===e.type?r?`我正在启动 workflow ${e.workflowId}。`:`I'm starting workflow ${e.workflowId}.`:"runtime.workflow.completed"===e.type?r?`workflow ${e.workflowId} 已完成。`:`Workflow ${e.workflowId} is complete.`:"runtime.specDriven.phase.started"===e.type?r?`我正在进入 spec-driven 阶段 ${e.phaseId}。`:`I'm starting spec-driven phase ${e.phaseId}.`:"runtime.specDriven.phase.blocked"===e.type?r?`spec-driven 阶段 ${e.phaseId} 被 gate 阻塞。`:`Spec-driven phase ${e.phaseId} is blocked by a gate.`:"runtime.specDriven.phase.completed"===e.type?r?`spec-driven 阶段 ${e.phaseId} 已完成。`:`Spec-driven phase ${e.phaseId} is complete.`:"runtime.specDriven.phase.verified"===e.type?r?`spec-driven 阶段 ${e.phaseId} 已验证。`:`Spec-driven phase ${e.phaseId} is verified.`:"runtime.artifact.created"===e.type?r?"我已经保存一份运行产物。":"I've saved a runtime artifact.":"runtime.execution.contract.failed"===e.type?r?"运行证据没有满足执行契约,我会进入恢复或失败路径。":"The run evidence did not satisfy the execution contract, so I'll recover or fail explicitly.":"runtime.inventory.repair"===e.type?inventoryRepairMessage(e.status,e.diagnostic.layer,r):"runtime.skill.candidate.created"===e.type?r?`我发现一个可沉淀的 skill 候选:${e.name}。`:`I found a reusable skill candidate: ${e.name}.`:e.type.startsWith("runtime.memory.")?function memoryMessage(e,t){return"runtime.memory.lifecycle"===e.type?t?`我进入记忆阶段:${e.hook}。`:`I'm in the memory lifecycle phase: ${e.hook}.`:"runtime.memory.recall.completed"===e.type?t?`我召回了 ${e.recordIds.length} 条相关记忆。`:`I recalled ${e.recordIds.length} relevant memory records.`:"runtime.memory.candidate.submitted"===e.type?t?"我提交了一条候选记忆。":"I submitted a memory candidate.":"runtime.memory.approval.requested"===e.type?t?"我提交了记忆审批请求。":"I requested memory approval.":"runtime.memory.plugin.started"===e.type?t?`我正在运行记忆插件 ${e.provider}。`:`I'm running memory plugin ${e.provider}.`:"runtime.memory.plugin.completed"===e.type?t?`记忆插件 ${e.provider} 已完成。`:`Memory plugin ${e.provider} completed.`:"runtime.memory.plugin.failed"===e.type?t?`记忆插件 ${e.provider} 失败了;主任务会继续,不把它当成执行结果。`:`Memory plugin ${e.provider} failed; the main task will continue without treating it as the result.`:"runtime.memory.maintenance.started"===e.type?t?`我正在维护 ${e.target} 记忆。`:`I'm maintaining ${e.target} memory.`:"runtime.memory.maintenance.completed"===e.type?t?`${e.target} 记忆维护完成。`:`${e.target} memory maintenance completed.`:"runtime.memory.maintenance.failed"===e.type?t?`${e.target} 记忆维护失败。`:`${e.target} memory maintenance failed.`:void 0}(e,r):"runtime.adapter.event"===e.type?function adapterMessage(e,t){if(isRecord(e)){if("agent.handoff"===e.phase)return t?"我把请求交给上游 agent backend,让它负责规划和执行。":"I'm handing the request to the upstream agent backend for planning and execution.";if("agent.tool.start"===e.phase&&"string"==typeof e.toolId)return function toolStartMessage(e,t,r){if("task"===e){const e=function readTaskTarget(e){const t=isRecord(e)?e:{};return readString(t.subagent_type)??readString(t.subagentType)}(t),n=function readDescription(e){const t=isRecord(e)?e:{};return summarizeText(readString(t.description)??readString(t.task))}(t);if(e&&n)return r?`我正在请求 task 工具委派给 ${e}:${n}`:`I'm asking the task tool to delegate to ${e}: ${n}`;if(e)return r?`我正在请求 task 工具委派给 ${e}。`:`I'm asking the task tool to delegate to ${e}.`}return r?`我正在运行 ${e} 收集证据。`:`I'm running ${e} to gather evidence.`}(e.toolId,e.args,t);if("agent.tool.result"===e.phase&&"string"==typeof e.toolId)return function toolResultMessage(e,t,r,n,o){if(r)return o?`${e} 返回错误:${summarizeText(String(r))}`:`${e} returned an error: ${summarizeText(String(r))}`;const i="string"==typeof n?n:function readToolControlStatus(e){const t=function parseToolOutputRecord(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);return"string"==typeof t?.status?t.status:"string"==typeof t?.error?t.error:"string"==typeof e&&e.startsWith("Task delegation target is not in the workspace inventory")?"task_inventory_blocked":void 0}(t);if(i)return function toolControlMessage(e,t,r){return"duplicate_tool_call"===t?r?`${e} 重复调用已复用已有证据。`:`${e} repeated an equivalent call, so the existing evidence was reused.`:"repeated_tool_call_limit"===t?r?`${e} 出现重复调用循环,我会基于已有证据继续收敛。`:`${e} entered a repeated-call loop, so I'll continue from the evidence already collected.`:"tool_argument_error"===t||"tool_argument_validation_failed"===t?r?`${e} 参数被工具 schema 拒绝,我会让 agent 修正参数或改用合适工具。`:`${e} arguments were rejected by the tool schema; I'll have the agent repair them or choose a suitable tool.`:"task_inventory_blocked"===t?r?"task 委派目标不在当前 workspace inventory 中,已被运行时策略阻止。":"The task delegation target is not in the current workspace inventory and was blocked by runtime policy.":r?`${e} 返回运行时控制状态:${t}。`:`${e} returned runtime control status: ${t}.`}(e,i,o);if("task"===e)return o?"委派任务已返回结果,我会基于这些证据继续推进。":"The delegated task returned; I'll keep going with that evidence.";const a=function summarizeToolOutput(e){if("string"==typeof e)return summarizeText(e);if(isRecord(e)){if("string"==typeof e.status)return summarizeText(e.status);if("string"==typeof e.summary)return summarizeText(e.summary)}}(t);return o?`${e} 已返回${a?`:${a}`:",我会继续判断下一步。"}`:`${e} returned${a?`: ${a}`:"; I'll decide the next step from here."}`}(e.toolId,e.output,e.error,e.controlStatus,t);if("agent.langgraph.invoke"===e.phase)return t?"我正在调用 workflow backend。":"I'm invoking the workflow backend.";if("agent.node.completed"===e.phase&&"string"==typeof e.nodeId)return t?`节点 ${e.nodeId} 已完成。`:`Node ${e.nodeId} is complete.`;if("inventory.repair"===e.phase&&"string"==typeof e.status){const r=isRecord(e.diagnostic)?e.diagnostic:{};return inventoryRepairMessage(e.status,readString(r.layer)??"selection",t)}}}(e.event,r):void 0}(r,e.get(r.requestId));if(i&&i!==t.get(r.requestId))return t.set(r.requestId,i),"runtime.request.failed"!==r.type&&"runtime.request.cancelled"!==r.type||(e.delete(r.requestId),t.delete(r.requestId)),function pruneRequestState(e,t){for(;e.size>200;){const r=e.keys().next().value;if(!r)break;e.delete(r),t.delete(r)}}(e,t),{message:i,style:n.style,model:n.model}}}}():void 0}export function createProgressNarrationEvent(e){if(!e.narrator||"runtime.progress.narration"===e.source.type)return;const t=readProgressPolicy(e.policy),r=!1===e.options?void 0:e.options,n=e.narrator.narrate(e.source,{style:r?.style??t.style,model:r?.model??t.model});return function isPromiseLike(e){return isRecord(e)&&"function"==typeof e.then}(n)?n.then(t=>toNarrationEvent(e.source,e.narrator,t)):toNarrationEvent(e.source,e.narrator,n)}export function createProgressNarrationCapability(e){const t=resolveProgressNarrator(e);if(t)return{id:"runtime.progress.narration",onEvent(r,n){try{const o=createProgressNarrationEvent({source:r,narrator:t,options:e.options,policy:e.policy});!function isRuntimeEventPromise(e){return isRecord(e)&&"function"==typeof e.then}(o)?o&&n(o):o.then(e=>{e&&n(e)}).catch(()=>{})}catch{return}}}}function toNarrationEvent(e,t,r){if(r?.message.trim())return{type:"runtime.progress.narration",requestId:e.requestId,sessionId:e.sessionId,agentId:e.agentId,message:r.message,provider:t.name,sourceEventTypes:r.sourceEventTypes??[e.type],sourceEventIds:r.sourceEventIds,model:r.model,style:r.style}}function inventoryRepairMessage(e,t,r){return"repaired"===e?r?`${t} 选择已按 workspace inventory 修正。`:`${t} selection was repaired against the workspace inventory.`:r?`${t} 选择不在 workspace inventory 中,已被阻止。`:`${t} selection was blocked because it is outside the workspace inventory.`}function summarizeText(e){const t=e?.replace(/\s+/gu," ").trim();return t?t.length>120?`${t.slice(0,117)}...`:t:""}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function readProgressPolicy(e){const t=isRecord(e?.progress)?e.progress:{},r=isRecord(t.narration)?t.narration:{};return{enabled:"boolean"==typeof r.enabled?r.enabled:void 0,style:"string"==typeof r.style?r.style:void 0,model:"string"==typeof r.model?r.model:void 0}}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}