stable-harness 0.0.37 → 0.0.39

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 (271) hide show
  1. package/docs/compatibility-matrix.md +11 -0
  2. package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.d.ts +9 -0
  3. package/node_modules/@stable-harness/adapter-deepagents/dist/src/adapter.js +1 -0
  4. package/node_modules/@stable-harness/adapter-deepagents/dist/src/index.d.ts +4 -0
  5. package/node_modules/@stable-harness/adapter-deepagents/dist/src/index.js +1 -0
  6. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts +17 -0
  7. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/permissions.js +1 -0
  8. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.d.ts +13 -0
  9. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -0
  10. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-args.d.ts +5 -0
  11. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-args.js +1 -0
  12. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-call-repair.d.ts +9 -0
  13. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-call-repair.js +1 -0
  14. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +28 -0
  15. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -0
  16. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-evidence.d.ts +10 -0
  17. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-evidence.js +1 -0
  18. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-failure-events.d.ts +2 -0
  19. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway/tool-failure-events.js +1 -0
  20. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +11 -0
  21. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -0
  22. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/messages.d.ts +9 -0
  23. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/messages.js +1 -0
  24. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.d.ts +12 -0
  25. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/raw-tool-call-parser.js +1 -0
  26. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/skill-file-policy.d.ts +10 -0
  27. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/skill-file-policy.js +1 -0
  28. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/stream-events.d.ts +2 -0
  29. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/stream-events.js +1 -0
  30. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.d.ts +4 -0
  31. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -0
  32. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.d.ts +1 -0
  33. package/node_modules/@stable-harness/adapter-deepagents/dist/src/internal/trace-projection.js +1 -0
  34. package/node_modules/@stable-harness/adapter-deepagents/dist/src/memory.d.ts +5 -0
  35. package/node_modules/@stable-harness/adapter-deepagents/dist/src/memory.js +1 -0
  36. package/node_modules/@stable-harness/adapter-deepagents/dist/src/model-providers.d.ts +4 -0
  37. package/node_modules/@stable-harness/adapter-deepagents/dist/src/model-providers.js +1 -0
  38. package/node_modules/@stable-harness/adapter-deepagents/dist/src/retry-policy.d.ts +2 -0
  39. package/node_modules/@stable-harness/adapter-deepagents/dist/src/retry-policy.js +1 -0
  40. package/node_modules/@stable-harness/adapter-deepagents/dist/src/types.d.ts +12 -0
  41. package/node_modules/@stable-harness/adapter-deepagents/dist/src/types.js +1 -0
  42. package/node_modules/@stable-harness/adapter-deepagents/package.json +26 -0
  43. package/node_modules/@stable-harness/adapter-langgraph/dist/src/graph.d.ts +3 -0
  44. package/node_modules/@stable-harness/adapter-langgraph/dist/src/graph.js +1 -0
  45. package/node_modules/@stable-harness/adapter-langgraph/dist/src/index.d.ts +8 -0
  46. package/node_modules/@stable-harness/adapter-langgraph/dist/src/index.js +1 -0
  47. package/node_modules/@stable-harness/adapter-langgraph/dist/src/runtime.d.ts +3 -0
  48. package/node_modules/@stable-harness/adapter-langgraph/dist/src/runtime.js +1 -0
  49. package/node_modules/@stable-harness/adapter-langgraph/dist/src/skill-providers.d.ts +29 -0
  50. package/node_modules/@stable-harness/adapter-langgraph/dist/src/skill-providers.js +1 -0
  51. package/node_modules/@stable-harness/adapter-langgraph/dist/src/types.d.ts +60 -0
  52. package/node_modules/@stable-harness/adapter-langgraph/dist/src/types.js +1 -0
  53. package/node_modules/@stable-harness/adapter-langgraph/package.json +16 -0
  54. package/node_modules/@stable-harness/core/dist/boundary-scan.d.ts +38 -0
  55. package/node_modules/@stable-harness/core/dist/boundary-scan.js +1 -0
  56. package/node_modules/@stable-harness/core/dist/evaluations/index.d.ts +18 -0
  57. package/node_modules/@stable-harness/core/dist/evaluations/index.js +1 -0
  58. package/node_modules/@stable-harness/core/dist/execution-contract.d.ts +9 -0
  59. package/node_modules/@stable-harness/core/dist/execution-contract.js +1 -0
  60. package/node_modules/@stable-harness/core/dist/index.d.ts +22 -0
  61. package/node_modules/@stable-harness/core/dist/index.js +1 -0
  62. package/node_modules/@stable-harness/core/dist/memory-plugins/maintenance.d.ts +42 -0
  63. package/node_modules/@stable-harness/core/dist/memory-plugins/maintenance.js +1 -0
  64. package/node_modules/@stable-harness/core/dist/memory-plugins/shared.d.ts +8 -0
  65. package/node_modules/@stable-harness/core/dist/memory-plugins/shared.js +1 -0
  66. package/node_modules/@stable-harness/core/dist/memory-plugins.d.ts +25 -0
  67. package/node_modules/@stable-harness/core/dist/memory-plugins.js +1 -0
  68. package/node_modules/@stable-harness/core/dist/quality/event-evidence.d.ts +11 -0
  69. package/node_modules/@stable-harness/core/dist/quality/event-evidence.js +1 -0
  70. package/node_modules/@stable-harness/core/dist/quality/execution-review.d.ts +2 -0
  71. package/node_modules/@stable-harness/core/dist/quality/execution-review.js +1 -0
  72. package/node_modules/@stable-harness/core/dist/quality/index.d.ts +9 -0
  73. package/node_modules/@stable-harness/core/dist/quality/index.js +1 -0
  74. package/node_modules/@stable-harness/core/dist/quality/llm-review.d.ts +7 -0
  75. package/node_modules/@stable-harness/core/dist/quality/llm-review.js +1 -0
  76. package/node_modules/@stable-harness/core/dist/quality/planning-review.d.ts +2 -0
  77. package/node_modules/@stable-harness/core/dist/quality/planning-review.js +1 -0
  78. package/node_modules/@stable-harness/core/dist/quality/profile.d.ts +3 -0
  79. package/node_modules/@stable-harness/core/dist/quality/profile.js +1 -0
  80. package/node_modules/@stable-harness/core/dist/quality/recovery-policy.d.ts +11 -0
  81. package/node_modules/@stable-harness/core/dist/quality/recovery-policy.js +1 -0
  82. package/node_modules/@stable-harness/core/dist/quality/runtime.d.ts +13 -0
  83. package/node_modules/@stable-harness/core/dist/quality/runtime.js +1 -0
  84. package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.d.ts +20 -0
  85. package/node_modules/@stable-harness/core/dist/quality/synthesis/fields.js +1 -0
  86. package/node_modules/@stable-harness/core/dist/quality/synthesis/language.d.ts +3 -0
  87. package/node_modules/@stable-harness/core/dist/quality/synthesis/language.js +1 -0
  88. package/node_modules/@stable-harness/core/dist/quality/synthesis/observed.d.ts +3 -0
  89. package/node_modules/@stable-harness/core/dist/quality/synthesis/observed.js +1 -0
  90. package/node_modules/@stable-harness/core/dist/quality/synthesis.d.ts +2 -0
  91. package/node_modules/@stable-harness/core/dist/quality/synthesis.js +1 -0
  92. package/node_modules/@stable-harness/core/dist/quality/types.d.ts +54 -0
  93. package/node_modules/@stable-harness/core/dist/quality/types.js +1 -0
  94. package/node_modules/@stable-harness/core/dist/recovery/tool-call.d.ts +28 -0
  95. package/node_modules/@stable-harness/core/dist/recovery/tool-call.js +1 -0
  96. package/node_modules/@stable-harness/core/dist/runtime/capabilities.d.ts +48 -0
  97. package/node_modules/@stable-harness/core/dist/runtime/capabilities.js +1 -0
  98. package/node_modules/@stable-harness/core/dist/runtime/completion.d.ts +18 -0
  99. package/node_modules/@stable-harness/core/dist/runtime/completion.js +1 -0
  100. package/node_modules/@stable-harness/core/dist/runtime/direct-tool-call.d.ts +11 -0
  101. package/node_modules/@stable-harness/core/dist/runtime/direct-tool-call.js +1 -0
  102. package/node_modules/@stable-harness/core/dist/runtime/events.d.ts +295 -0
  103. package/node_modules/@stable-harness/core/dist/runtime/events.js +1 -0
  104. package/node_modules/@stable-harness/core/dist/runtime/governance/approval-gate.d.ts +8 -0
  105. package/node_modules/@stable-harness/core/dist/runtime/governance/approval-gate.js +1 -0
  106. package/node_modules/@stable-harness/core/dist/runtime/governance/sandbox.d.ts +9 -0
  107. package/node_modules/@stable-harness/core/dist/runtime/governance/sandbox.js +1 -0
  108. package/node_modules/@stable-harness/core/dist/runtime/inspection/artifacts.d.ts +15 -0
  109. package/node_modules/@stable-harness/core/dist/runtime/inspection/artifacts.js +1 -0
  110. package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.d.ts +11 -0
  111. package/node_modules/@stable-harness/core/dist/runtime/inspection/methods.js +1 -0
  112. package/node_modules/@stable-harness/core/dist/runtime/inspection/replay.d.ts +6 -0
  113. package/node_modules/@stable-harness/core/dist/runtime/inspection/replay.js +1 -0
  114. package/node_modules/@stable-harness/core/dist/runtime/memory.d.ts +29 -0
  115. package/node_modules/@stable-harness/core/dist/runtime/memory.js +1 -0
  116. package/node_modules/@stable-harness/core/dist/runtime/persistence/artifacts.d.ts +8 -0
  117. package/node_modules/@stable-harness/core/dist/runtime/persistence/artifacts.js +1 -0
  118. package/node_modules/@stable-harness/core/dist/runtime/persistence/inspection.d.ts +4 -0
  119. package/node_modules/@stable-harness/core/dist/runtime/persistence/inspection.js +1 -0
  120. package/node_modules/@stable-harness/core/dist/runtime/persistence/queue.d.ts +2 -0
  121. package/node_modules/@stable-harness/core/dist/runtime/persistence/queue.js +1 -0
  122. package/node_modules/@stable-harness/core/dist/runtime/persistence/stores.d.ts +3 -0
  123. package/node_modules/@stable-harness/core/dist/runtime/persistence/stores.js +1 -0
  124. package/node_modules/@stable-harness/core/dist/runtime/policy/projection.d.ts +11 -0
  125. package/node_modules/@stable-harness/core/dist/runtime/policy/projection.js +1 -0
  126. package/node_modules/@stable-harness/core/dist/runtime/policy/tool-invocation.d.ts +45 -0
  127. package/node_modules/@stable-harness/core/dist/runtime/policy/tool-invocation.js +1 -0
  128. package/node_modules/@stable-harness/core/dist/runtime/progress-narration.d.ts +38 -0
  129. package/node_modules/@stable-harness/core/dist/runtime/progress-narration.js +1 -0
  130. package/node_modules/@stable-harness/core/dist/runtime/selection-repair.d.ts +24 -0
  131. package/node_modules/@stable-harness/core/dist/runtime/selection-repair.js +1 -0
  132. package/node_modules/@stable-harness/core/dist/runtime/tool-failure.d.ts +41 -0
  133. package/node_modules/@stable-harness/core/dist/runtime/tool-failure.js +1 -0
  134. package/node_modules/@stable-harness/core/dist/runtime/tool-gateway.d.ts +59 -0
  135. package/node_modules/@stable-harness/core/dist/runtime/tool-gateway.js +1 -0
  136. package/node_modules/@stable-harness/core/dist/runtime/types.d.ts +191 -0
  137. package/node_modules/@stable-harness/core/dist/runtime/types.js +1 -0
  138. package/node_modules/@stable-harness/core/dist/runtime.d.ts +21 -0
  139. package/node_modules/@stable-harness/core/dist/runtime.js +1 -0
  140. package/node_modules/@stable-harness/core/dist/spec-driven/config.d.ts +4 -0
  141. package/node_modules/@stable-harness/core/dist/spec-driven/config.js +1 -0
  142. package/node_modules/@stable-harness/core/dist/spec-driven/events.d.ts +11 -0
  143. package/node_modules/@stable-harness/core/dist/spec-driven/events.js +1 -0
  144. package/node_modules/@stable-harness/core/dist/spec-driven/index.d.ts +4 -0
  145. package/node_modules/@stable-harness/core/dist/spec-driven/index.js +1 -0
  146. package/node_modules/@stable-harness/core/dist/spec-driven/lifecycle.d.ts +11 -0
  147. package/node_modules/@stable-harness/core/dist/spec-driven/lifecycle.js +1 -0
  148. package/node_modules/@stable-harness/core/dist/spec-driven/types.d.ts +38 -0
  149. package/node_modules/@stable-harness/core/dist/spec-driven/types.js +1 -0
  150. package/node_modules/@stable-harness/core/dist/trace.d.ts +21 -0
  151. package/node_modules/@stable-harness/core/dist/trace.js +1 -0
  152. package/node_modules/@stable-harness/core/dist/types.d.ts +145 -0
  153. package/node_modules/@stable-harness/core/dist/types.js +1 -0
  154. package/node_modules/@stable-harness/core/dist/workflows/index.d.ts +70 -0
  155. package/node_modules/@stable-harness/core/dist/workflows/index.js +1 -0
  156. package/node_modules/@stable-harness/core/dist/workflows/runtime.d.ts +12 -0
  157. package/node_modules/@stable-harness/core/dist/workflows/runtime.js +1 -0
  158. package/node_modules/@stable-harness/core/dist/workspace/tool-quality.d.ts +22 -0
  159. package/node_modules/@stable-harness/core/dist/workspace/tool-quality.js +1 -0
  160. package/node_modules/@stable-harness/core/dist/workspace/types.d.ts +134 -0
  161. package/node_modules/@stable-harness/core/dist/workspace/types.js +1 -0
  162. package/node_modules/@stable-harness/core/package.json +18 -0
  163. package/node_modules/@stable-harness/governance/dist/src/approval-queue.d.ts +2 -0
  164. package/node_modules/@stable-harness/governance/dist/src/approval-queue.js +1 -0
  165. package/node_modules/@stable-harness/governance/dist/src/index.d.ts +4 -0
  166. package/node_modules/@stable-harness/governance/dist/src/index.js +1 -0
  167. package/node_modules/@stable-harness/governance/dist/src/policy-engine.d.ts +2 -0
  168. package/node_modules/@stable-harness/governance/dist/src/policy-engine.js +1 -0
  169. package/node_modules/@stable-harness/governance/dist/src/skill-candidates.d.ts +2 -0
  170. package/node_modules/@stable-harness/governance/dist/src/skill-candidates.js +1 -0
  171. package/node_modules/@stable-harness/governance/dist/src/types.d.ts +101 -0
  172. package/node_modules/@stable-harness/governance/dist/src/types.js +1 -0
  173. package/node_modules/@stable-harness/governance/package.json +12 -0
  174. package/node_modules/@stable-harness/memory/dist/src/index.d.ts +9 -0
  175. package/node_modules/@stable-harness/memory/dist/src/index.js +1 -0
  176. package/node_modules/@stable-harness/memory/dist/src/langmem-service.d.ts +8 -0
  177. package/node_modules/@stable-harness/memory/dist/src/langmem-service.js +1 -0
  178. package/node_modules/@stable-harness/memory/dist/src/maintenance.d.ts +2 -0
  179. package/node_modules/@stable-harness/memory/dist/src/maintenance.js +1 -0
  180. package/node_modules/@stable-harness/memory/dist/src/persistence.d.ts +4 -0
  181. package/node_modules/@stable-harness/memory/dist/src/persistence.js +1 -0
  182. package/node_modules/@stable-harness/memory/dist/src/policy.d.ts +2 -0
  183. package/node_modules/@stable-harness/memory/dist/src/policy.js +1 -0
  184. package/node_modules/@stable-harness/memory/dist/src/provider.d.ts +50 -0
  185. package/node_modules/@stable-harness/memory/dist/src/provider.js +1 -0
  186. package/node_modules/@stable-harness/memory/dist/src/store.d.ts +5 -0
  187. package/node_modules/@stable-harness/memory/dist/src/store.js +1 -0
  188. package/node_modules/@stable-harness/memory/dist/src/types.d.ts +138 -0
  189. package/node_modules/@stable-harness/memory/dist/src/types.js +1 -0
  190. package/node_modules/@stable-harness/memory/package.json +12 -0
  191. package/node_modules/@stable-harness/protocols/dist/src/http-server.d.ts +3 -0
  192. package/node_modules/@stable-harness/protocols/dist/src/http-server.js +1 -0
  193. package/node_modules/@stable-harness/protocols/dist/src/in-process-client.d.ts +2 -0
  194. package/node_modules/@stable-harness/protocols/dist/src/in-process-client.js +1 -0
  195. package/node_modules/@stable-harness/protocols/dist/src/index.d.ts +4 -0
  196. package/node_modules/@stable-harness/protocols/dist/src/index.js +1 -0
  197. package/node_modules/@stable-harness/protocols/dist/src/openai-compatible.d.ts +9 -0
  198. package/node_modules/@stable-harness/protocols/dist/src/openai-compatible.js +1 -0
  199. package/node_modules/@stable-harness/protocols/dist/src/openai-payload.d.ts +74 -0
  200. package/node_modules/@stable-harness/protocols/dist/src/openai-payload.js +1 -0
  201. package/node_modules/@stable-harness/protocols/dist/src/openai-stream.d.ts +39 -0
  202. package/node_modules/@stable-harness/protocols/dist/src/openai-stream.js +1 -0
  203. package/node_modules/@stable-harness/protocols/package.json +15 -0
  204. package/node_modules/@stable-harness/tool-gateway/dist/src/argument-guard.d.ts +33 -0
  205. package/node_modules/@stable-harness/tool-gateway/dist/src/argument-guard.js +1 -0
  206. package/node_modules/@stable-harness/tool-gateway/dist/src/in-memory.d.ts +4 -0
  207. package/node_modules/@stable-harness/tool-gateway/dist/src/in-memory.js +1 -0
  208. package/node_modules/@stable-harness/tool-gateway/dist/src/index.d.ts +7 -0
  209. package/node_modules/@stable-harness/tool-gateway/dist/src/index.js +1 -0
  210. package/node_modules/@stable-harness/tool-gateway/dist/src/module-loader.d.ts +13 -0
  211. package/node_modules/@stable-harness/tool-gateway/dist/src/module-loader.js +1 -0
  212. package/node_modules/@stable-harness/tool-gateway/dist/src/schema-validation.d.ts +3 -0
  213. package/node_modules/@stable-harness/tool-gateway/dist/src/schema-validation.js +1 -0
  214. package/node_modules/@stable-harness/tool-gateway/dist/src/types.d.ts +79 -0
  215. package/node_modules/@stable-harness/tool-gateway/dist/src/types.js +1 -0
  216. package/node_modules/@stable-harness/tool-gateway/package.json +15 -0
  217. package/node_modules/@stable-harness/workspace-yaml/dist/boundary-scan.d.ts +3 -0
  218. package/node_modules/@stable-harness/workspace-yaml/dist/boundary-scan.js +1 -0
  219. package/node_modules/@stable-harness/workspace-yaml/dist/discovery.d.ts +4 -0
  220. package/node_modules/@stable-harness/workspace-yaml/dist/discovery.js +1 -0
  221. package/node_modules/@stable-harness/workspace-yaml/dist/documents.d.ts +16 -0
  222. package/node_modules/@stable-harness/workspace-yaml/dist/documents.js +1 -0
  223. package/node_modules/@stable-harness/workspace-yaml/dist/evaluations.d.ts +9 -0
  224. package/node_modules/@stable-harness/workspace-yaml/dist/evaluations.js +1 -0
  225. package/node_modules/@stable-harness/workspace-yaml/dist/index.d.ts +1 -0
  226. package/node_modules/@stable-harness/workspace-yaml/dist/index.js +1 -0
  227. package/node_modules/@stable-harness/workspace-yaml/dist/loader.d.ts +2 -0
  228. package/node_modules/@stable-harness/workspace-yaml/dist/loader.js +1 -0
  229. package/node_modules/@stable-harness/workspace-yaml/dist/workflows.d.ts +16 -0
  230. package/node_modules/@stable-harness/workspace-yaml/dist/workflows.js +1 -0
  231. package/node_modules/@stable-harness/workspace-yaml/package.json +16 -0
  232. package/package.json +33 -11
  233. package/packages/adapter-deepagents/dist/src/adapter.js +1 -1
  234. package/packages/adapter-deepagents/dist/src/internal/builtin/permissions.d.ts +17 -0
  235. package/packages/adapter-deepagents/dist/src/internal/builtin/permissions.js +1 -0
  236. package/packages/adapter-deepagents/dist/src/internal/builtin/task-inventory.d.ts +13 -0
  237. package/packages/adapter-deepagents/dist/src/internal/builtin/task-inventory.js +1 -0
  238. package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.d.ts +2 -13
  239. package/packages/adapter-deepagents/dist/src/internal/builtin-tool-policy.js +1 -1
  240. package/packages/adapter-deepagents/dist/src/internal/gateway-tools.d.ts +1 -23
  241. package/packages/adapter-deepagents/dist/src/internal/gateway-tools.js +1 -1
  242. package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.d.ts +1 -1
  243. package/packages/adapter-deepagents/dist/src/internal/tool-repeat-visibility.js +1 -1
  244. package/packages/adapter-deepagents/dist/src/internal/trace-projection.d.ts +1 -16
  245. package/packages/adapter-deepagents/dist/src/internal/trace-projection.js +1 -1
  246. package/packages/adapter-deepagents/package.json +4 -6
  247. package/packages/adapter-langgraph/package.json +1 -1
  248. package/packages/cli/package.json +1 -1
  249. package/packages/core/dist/index.d.ts +2 -0
  250. package/packages/core/dist/index.js +1 -1
  251. package/packages/core/dist/quality/profile.js +1 -1
  252. package/packages/core/dist/quality/synthesis/fields.d.ts +3 -2
  253. package/packages/core/dist/quality/synthesis/fields.js +1 -1
  254. package/packages/core/dist/quality/synthesis/observed.js +1 -1
  255. package/packages/core/dist/quality/synthesis.js +1 -1
  256. package/packages/core/dist/quality/types.d.ts +2 -0
  257. package/packages/core/dist/runtime/capabilities.d.ts +1 -0
  258. package/packages/core/dist/runtime/capabilities.js +1 -1
  259. package/packages/core/dist/runtime/policy/projection.d.ts +11 -0
  260. package/packages/core/dist/runtime/policy/projection.js +1 -0
  261. package/packages/core/dist/runtime/policy/tool-invocation.d.ts +45 -0
  262. package/packages/core/dist/runtime/policy/tool-invocation.js +1 -0
  263. package/packages/core/dist/runtime.js +1 -1
  264. package/packages/core/dist/trace.d.ts +6 -0
  265. package/packages/core/dist/trace.js +1 -1
  266. package/packages/core/dist/types.d.ts +1 -0
  267. package/packages/core/package.json +1 -1
  268. package/packages/evaluation/package.json +1 -1
  269. package/packages/protocols/package.json +1 -1
  270. package/packages/tool-gateway/package.json +1 -1
  271. package/packages/workspace-yaml/package.json +1 -1
@@ -0,0 +1,48 @@
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
+ modules: Record<string, Record<string, unknown>>;
9
+ };
10
+ export type RuntimeCapabilityContext = {
11
+ workspace: CompiledWorkspace;
12
+ store: RuntimeStore;
13
+ emit: RuntimeEmit;
14
+ request: RuntimeRequest;
15
+ requestId: string;
16
+ sessionId: string;
17
+ agent: WorkspaceAgent;
18
+ state: RuntimeCapabilityState;
19
+ };
20
+ export type RuntimeCapabilityModule = {
21
+ id: string;
22
+ onEvent?(event: RuntimeEvent, emit: RuntimeEmit): void;
23
+ beforeAdapterRun?(context: RuntimeCapabilityContext): Promise<Partial<RuntimeCapabilityState> | void> | Partial<RuntimeCapabilityState> | void;
24
+ beforeAdapterResultContract?(context: RuntimeCapabilityContext & {
25
+ result: RuntimeOutput;
26
+ }): Promise<void> | void;
27
+ afterAdapterResponse?(context: RuntimeCapabilityContext & {
28
+ result: RuntimeOutput;
29
+ response: RuntimeResponse;
30
+ }): Promise<void> | void;
31
+ stop?(): Promise<void> | void;
32
+ };
33
+ export type RuntimeCapabilityRegistry = {
34
+ modules: RuntimeCapabilityModule[];
35
+ state: RuntimeCapabilityState;
36
+ emitSideEffects(event: RuntimeEvent, emit: RuntimeEmit): void;
37
+ beforeAdapterRun(context: Omit<RuntimeCapabilityContext, "state">): Promise<RuntimeCapabilityState>;
38
+ beforeAdapterResultContract(context: Omit<RuntimeCapabilityContext, "state"> & {
39
+ result: RuntimeOutput;
40
+ }): Promise<void>;
41
+ afterAdapterResponse(context: Omit<RuntimeCapabilityContext, "state"> & {
42
+ result: RuntimeOutput;
43
+ response: RuntimeResponse;
44
+ }): Promise<void>;
45
+ stop(): Promise<void>;
46
+ };
47
+ export declare function createRuntimeCapabilityRegistry(modules: Array<RuntimeCapabilityModule | undefined>): RuntimeCapabilityRegistry;
48
+ export declare function normalizeAdapterResult(result: string | RuntimeOutput): RuntimeOutput;
@@ -0,0 +1 @@
1
+ export function createRuntimeCapabilityRegistry(e){const t=e.filter(e=>Boolean(e)),o={modules:{}};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]),t.modules&&(e.modules=function mergeModuleState(e,t){const o={...e};for(const[e,r]of Object.entries(t))o[e]={...o[e]??{},...r};return o}(e.modules,t.modules)))}
@@ -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,11 @@
1
+ import type { CompiledWorkspace, RuntimeRequest, WorkspaceAgent } from "../../types.js";
2
+ export type RuntimePolicyProjectionInput = {
3
+ workspace: CompiledWorkspace;
4
+ agent?: WorkspaceAgent;
5
+ request: RuntimeRequest;
6
+ };
7
+ export type RuntimePolicyProjection = {
8
+ systemPromptSections: string[];
9
+ };
10
+ export declare function projectRuntimePolicies(input: RuntimePolicyProjectionInput): RuntimePolicyProjection;
11
+ export declare function buildRuntimeSystemPrompt(input: RuntimePolicyProjectionInput, basePrompt?: string): string | undefined;
@@ -0,0 +1 @@
1
+ export function projectRuntimePolicies(e){return{systemPromptSections:[skillInventoryPolicy(e),responseLanguagePolicy(e),responsePresentationPolicy(e)].filter(e=>Boolean(e))}}export function buildRuntimeSystemPrompt(e,t){const n=[t,...projectRuntimePolicies(e).systemPromptSections].filter(e=>Boolean(e));return n.length>0?n.join("\n\n"):void 0}function skillInventoryPolicy(e){const t=(e.agent?.skills??[]).map(t=>e.workspace.skills.get(t)).filter(e=>Boolean(e));if(0!==t.length)return["## Stable Harness Skill Inventory","Use only the skills listed in this workspace inventory. Do not infer or invent skill names, skill directories, or SKILL.md paths from generic examples.","Skill files are already registered with the backend. Do not read local SKILL.md files or skill directories through filesystem tools.","If none of these skills match the task, continue with the configured tools and collected evidence instead of reading an unlisted skill path.",t.map(e=>{const t=e.allowedTools.length>0?`; allowed tools: ${e.allowedTools.join(", ")}`:"",n=e.description?`: ${e.description}${t}`:t;return`- ${e.id}${n}`}).join("\n")].join("\n")}function responseLanguagePolicy(e){const t=readRecord(e.workspace.runtime.responseLanguage);if("matchUser"!==(readString(t.mode)??readString(t.strategy)))return;const n=function detectRequestLanguage(e){return/\p{Script=Han}/u.test(e)?"Chinese":/[\p{Script=Hiragana}\p{Script=Katakana}]/u.test(e)?"Japanese":/\p{Script=Hangul}/u.test(e)?"Korean":/\p{Script=Arabic}/u.test(e)?"Arabic":/\p{Script=Hebrew}/u.test(e)?"Hebrew":/\p{Script=Thai}/u.test(e)?"Thai":/\p{Script=Cyrillic}/u.test(e)?"Cyrillic-script language":void 0}(e.request.input);return["Stable runtime response language policy:",...n?[`- Detected request language: ${n}.`]:[],"- Match the final answer language to the original user request unless the user explicitly asks for another language.","- If tool or subagent evidence is in a different language, translate the final user-facing answer into the detected request language.","- When delegating to subagents, include the same response-language requirement in delegated instructions.","- Do not call another tool or subagent only to translate, rewrite, format, or synthesize a completed answer.",`Original user request:\n${e.request.input}`].join("\n")}function responsePresentationPolicy(e){const t=readRecord(e.workspace.runtime.responsePresentation);if(!0===t.enabled&&!function hasStructuredResponseFormat(e){return void 0!==e?.config.responseFormat||isRecord(e?.config.deepagents)&&void 0!==e.config.deepagents.responseFormat}(e.agent))return"markdown"===(readString(t.style)??"markdown")?["Stable runtime final-answer presentation policy:","- For user-facing natural-language final answers, use GitHub-flavored Markdown.","- Prefer clear section headings, short paragraphs, and concise bullets over dense prose.","- Use tables only when they make comparison or planning details easier to scan.","- For detailed investigations, plans, or reports, include assumptions, findings, recommendations, and concrete next steps.","- Preserve exact plain text, JSON, code, or other structured output when the user or response format asks for it.","- Do not end with generic follow-up offers; deliver the requested answer directly."].join("\n"):void 0}function readRecord(e){return isRecord(e)?e:{}}function readString(e){return"string"==typeof e&&e.trim()?e:void 0}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}