stageflow 0.40.0 → 0.44.0

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 (519) hide show
  1. package/README.md +15 -4
  2. package/dist/agent/activity.d.ts +18 -0
  3. package/dist/agent/claudeAdapter.js +7 -0
  4. package/dist/agent/claudeTools.d.ts +27 -18
  5. package/dist/agent/claudeTools.js +54 -15
  6. package/dist/agent/compactionEvents.d.ts +34 -0
  7. package/dist/agent/compactionEvents.js +37 -0
  8. package/dist/agent/openRouterRouting.d.ts +7 -0
  9. package/dist/agent/openRouterRouting.js +23 -0
  10. package/dist/agent/piAdapter.d.ts +6 -0
  11. package/dist/agent/piAdapter.js +128 -27
  12. package/dist/agent/piSettings.d.ts +7 -0
  13. package/dist/agent/piSettings.js +9 -0
  14. package/dist/agent/sandboxPiTools.d.ts +3 -1
  15. package/dist/agent/sandboxPiTools.js +8 -2
  16. package/dist/agent/stageTurnDriver.d.ts +11 -2
  17. package/dist/agent/stageTurnDriver.js +45 -4
  18. package/dist/agent/toolOutputBudget.d.ts +15 -1
  19. package/dist/agent/toolOutputBudget.js +18 -0
  20. package/dist/agent/toolOutputBudgetExtension.d.ts +2 -0
  21. package/dist/agent/toolOutputBudgetExtension.js +40 -3
  22. package/dist/agents/authorChat.d.ts +5 -0
  23. package/dist/agents/authorChat.js +120 -12
  24. package/dist/agents/authorSessionStore.d.ts +38 -0
  25. package/dist/agents/authorSessionStore.js +167 -0
  26. package/dist/agents/chatTurn.d.ts +2 -0
  27. package/dist/agents/chatTurn.js +17 -1
  28. package/dist/agents/errors.d.ts +1 -1
  29. package/dist/agents/errors.js +1 -0
  30. package/dist/agents/evalGate.d.ts +61 -0
  31. package/dist/agents/evalGate.js +103 -0
  32. package/dist/agents/evalSession.d.ts +26 -0
  33. package/dist/agents/evalSession.js +29 -0
  34. package/dist/agents/hostContext.d.ts +4 -1
  35. package/dist/agents/hostContext.js +4 -1
  36. package/dist/agents/runtime/piRuntime.d.ts +6 -2
  37. package/dist/agents/runtime/piRuntime.js +50 -16
  38. package/dist/agents/runtime/types.d.ts +3 -1
  39. package/dist/agents/service.d.ts +27 -2
  40. package/dist/agents/service.js +91 -15
  41. package/dist/agents/sessions.d.ts +8 -0
  42. package/dist/agents/sessions.js +53 -11
  43. package/dist/agents/store.d.ts +14 -3
  44. package/dist/agents/store.js +45 -7
  45. package/dist/agents/toolRisk.d.ts +21 -0
  46. package/dist/agents/toolRisk.js +50 -0
  47. package/dist/cli/doctorCommand.js +26 -0
  48. package/dist/cli/evalCommand.d.ts +20 -0
  49. package/dist/cli/evalCommand.js +720 -0
  50. package/dist/cli/exportAllCommand.js +1 -1
  51. package/dist/cli/hostClient.d.ts +60 -0
  52. package/dist/cli/hostClient.js +71 -0
  53. package/dist/cli/validateOutput.d.ts +2 -2
  54. package/dist/cli/validateOutput.js +2 -2
  55. package/dist/cli.js +10 -0
  56. package/dist/compaction/directives.d.ts +18 -0
  57. package/dist/compaction/directives.js +119 -0
  58. package/dist/compaction/extension.d.ts +20 -0
  59. package/dist/compaction/extension.js +78 -0
  60. package/dist/compaction/mask.d.ts +18 -0
  61. package/dist/compaction/mask.js +155 -0
  62. package/dist/compaction/pin.d.ts +21 -0
  63. package/dist/compaction/pin.js +270 -0
  64. package/dist/compaction/scrub.d.ts +7 -0
  65. package/dist/compaction/scrub.js +26 -0
  66. package/dist/compaction/sessionWiring.d.ts +22 -0
  67. package/dist/compaction/sessionWiring.js +26 -0
  68. package/dist/compaction/summarize.d.ts +79 -0
  69. package/dist/compaction/summarize.js +171 -0
  70. package/dist/compaction/toolPolicy.d.ts +3 -0
  71. package/dist/compaction/toolPolicy.js +33 -0
  72. package/dist/compaction/types.d.ts +45 -0
  73. package/dist/compaction/types.js +7 -0
  74. package/dist/compaction/workingState.d.ts +56 -0
  75. package/dist/compaction/workingState.js +198 -0
  76. package/dist/config/atomicWrite.d.ts +15 -0
  77. package/dist/config/atomicWrite.js +43 -0
  78. package/dist/config/browseCatalog.d.ts +2 -0
  79. package/dist/config/browseCatalog.js +4 -2
  80. package/dist/config/createPipeline.js +2 -0
  81. package/dist/config/createTrigger.js +7 -1
  82. package/dist/config/csv.d.ts +9 -0
  83. package/dist/config/csv.js +81 -0
  84. package/dist/config/datasetAgentCheck.d.ts +18 -0
  85. package/dist/config/datasetAgentCheck.js +109 -0
  86. package/dist/config/datasetCandidates.d.ts +22 -0
  87. package/dist/config/datasetCandidates.js +86 -0
  88. package/dist/config/datasetFromSessions.d.ts +34 -0
  89. package/dist/config/datasetFromSessions.js +105 -0
  90. package/dist/config/datasetHash.d.ts +1 -0
  91. package/dist/config/datasetHash.js +4 -0
  92. package/dist/config/datasetImport.d.ts +21 -0
  93. package/dist/config/datasetImport.js +120 -0
  94. package/dist/config/datasetStageCheck.d.ts +9 -0
  95. package/dist/config/datasetStageCheck.js +17 -0
  96. package/dist/config/datasetTypes.d.ts +27 -0
  97. package/dist/config/datasetTypes.js +1 -0
  98. package/dist/config/ensureCatalogScanRoot.d.ts +4 -1
  99. package/dist/config/ensureCatalogScanRoot.js +8 -6
  100. package/dist/config/evalCatalog.d.ts +22 -0
  101. package/dist/config/evalCatalog.js +95 -0
  102. package/dist/config/evalWriteRoots.d.ts +17 -0
  103. package/dist/config/evalWriteRoots.js +109 -0
  104. package/dist/config/githubTriggerAction.d.ts +8 -0
  105. package/dist/config/githubTriggerAction.js +29 -0
  106. package/dist/config/hostConfig.js +3 -0
  107. package/dist/config/installEvalSample.d.ts +34 -0
  108. package/dist/config/installEvalSample.js +182 -0
  109. package/dist/config/loadDataset.d.ts +16 -0
  110. package/dist/config/loadDataset.js +318 -0
  111. package/dist/config/loadEval.d.ts +32 -0
  112. package/dist/config/loadEval.js +1103 -0
  113. package/dist/config/loadOutcome.d.ts +5 -0
  114. package/dist/config/loadStageflowManifest.js +64 -0
  115. package/dist/config/pipelineNeeds.d.ts +2 -0
  116. package/dist/config/pipelineNeeds.js +16 -3
  117. package/dist/config/pipelineRoute.js +5 -4
  118. package/dist/config/resolveAgentTarget.d.ts +32 -0
  119. package/dist/config/resolveAgentTarget.js +118 -0
  120. package/dist/config/resolveEvalTarget.d.ts +21 -0
  121. package/dist/config/resolveEvalTarget.js +89 -0
  122. package/dist/config/scanCatalogPaths.d.ts +1 -1
  123. package/dist/config/scanCatalogPaths.js +17 -5
  124. package/dist/config/validateCatalog.d.ts +2 -2
  125. package/dist/config/validateCatalog.js +21 -1
  126. package/dist/config/validateEval.d.ts +36 -0
  127. package/dist/config/validateEval.js +446 -0
  128. package/dist/config/writeDataset.d.ts +54 -0
  129. package/dist/config/writeDataset.js +186 -0
  130. package/dist/config/writeEval.d.ts +25 -0
  131. package/dist/config/writeEval.js +398 -0
  132. package/dist/diagnostics/checks.js +1 -1
  133. package/dist/envelope/assertEmittedArtifacts.d.ts +12 -0
  134. package/dist/envelope/assertEmittedArtifacts.js +43 -0
  135. package/dist/envelope/preEmitChecks.d.ts +3 -0
  136. package/dist/evals/agentDiff.d.ts +13 -0
  137. package/dist/evals/agentDiff.js +11 -0
  138. package/dist/evals/canonical.d.ts +3 -0
  139. package/dist/evals/canonical.js +24 -0
  140. package/dist/evals/caseTask.d.ts +3 -0
  141. package/dist/evals/caseTask.js +9 -0
  142. package/dist/evals/compare.d.ts +94 -0
  143. package/dist/evals/compare.js +201 -0
  144. package/dist/evals/constants.d.ts +62 -0
  145. package/dist/evals/constants.js +97 -0
  146. package/dist/evals/engine/FakeEngine.d.ts +33 -0
  147. package/dist/evals/engine/FakeEngine.js +177 -0
  148. package/dist/evals/engine/index.d.ts +9 -0
  149. package/dist/evals/engine/index.js +19 -0
  150. package/dist/evals/engine/promptfoo/PromptfooEngine.d.ts +52 -0
  151. package/dist/evals/engine/promptfoo/PromptfooEngine.js +312 -0
  152. package/dist/evals/engine/promptfoo/errors.d.ts +5 -0
  153. package/dist/evals/engine/promptfoo/errors.js +8 -0
  154. package/dist/evals/engine/promptfoo/generate.d.ts +30 -0
  155. package/dist/evals/engine/promptfoo/generate.js +345 -0
  156. package/dist/evals/engine/promptfoo/guard.d.ts +10 -0
  157. package/dist/evals/engine/promptfoo/guard.js +116 -0
  158. package/dist/evals/engine/promptfoo/install.d.ts +17 -0
  159. package/dist/evals/engine/promptfoo/install.js +73 -0
  160. package/dist/evals/engine/promptfoo/judgeProviders.d.ts +2 -0
  161. package/dist/evals/engine/promptfoo/judgeProviders.js +9 -0
  162. package/dist/evals/engine/promptfoo/judgeServices.d.ts +6 -0
  163. package/dist/evals/engine/promptfoo/judgeServices.js +41 -0
  164. package/dist/evals/engine/promptfoo/locate.d.ts +21 -0
  165. package/dist/evals/engine/promptfoo/locate.js +68 -0
  166. package/dist/evals/engine/promptfoo/nodeVersion.d.ts +7 -0
  167. package/dist/evals/engine/promptfoo/nodeVersion.js +14 -0
  168. package/dist/evals/engine/promptfoo/normalize.d.ts +66 -0
  169. package/dist/evals/engine/promptfoo/normalize.js +261 -0
  170. package/dist/evals/engine/promptfoo/pinned.d.ts +5 -0
  171. package/dist/evals/engine/promptfoo/pinned.js +5 -0
  172. package/dist/evals/engine/promptfoo/rubricPrompt.d.ts +14 -0
  173. package/dist/evals/engine/promptfoo/rubricPrompt.js +105 -0
  174. package/dist/evals/engine/promptfoo/runTokens.d.ts +18 -0
  175. package/dist/evals/engine/promptfoo/runTokens.js +31 -0
  176. package/dist/evals/engine/promptfoo/status.d.ts +13 -0
  177. package/dist/evals/engine/promptfoo/status.js +16 -0
  178. package/dist/evals/estimate.d.ts +56 -0
  179. package/dist/evals/estimate.js +66 -0
  180. package/dist/evals/graders/codeGrader.d.ts +6 -0
  181. package/dist/evals/graders/codeGrader.js +85 -0
  182. package/dist/evals/graders/conversationCheckGrader.d.ts +6 -0
  183. package/dist/evals/graders/conversationCheckGrader.js +62 -0
  184. package/dist/evals/graders/fieldGrader.d.ts +11 -0
  185. package/dist/evals/graders/fieldGrader.js +117 -0
  186. package/dist/evals/graders/goal.d.ts +3 -0
  187. package/dist/evals/graders/goal.js +14 -0
  188. package/dist/evals/graders/index.d.ts +18 -0
  189. package/dist/evals/graders/index.js +34 -0
  190. package/dist/evals/graders/notApplicable.d.ts +5 -0
  191. package/dist/evals/graders/notApplicable.js +9 -0
  192. package/dist/evals/graders/path.d.ts +26 -0
  193. package/dist/evals/graders/path.js +75 -0
  194. package/dist/evals/graders/referenceGrader.d.ts +5 -0
  195. package/dist/evals/graders/referenceGrader.js +59 -0
  196. package/dist/evals/graders/schemaGrader.d.ts +5 -0
  197. package/dist/evals/graders/schemaGrader.js +29 -0
  198. package/dist/evals/graders/subject.d.ts +6 -0
  199. package/dist/evals/graders/subject.js +33 -0
  200. package/dist/evals/graders/toolCallsGrader.d.ts +6 -0
  201. package/dist/evals/graders/toolCallsGrader.js +100 -0
  202. package/dist/evals/graders/transcript.d.ts +12 -0
  203. package/dist/evals/graders/transcript.js +57 -0
  204. package/dist/evals/graders/types.d.ts +20 -0
  205. package/dist/evals/graders/types.js +1 -0
  206. package/dist/evals/judgeProviders.d.ts +16 -0
  207. package/dist/evals/judgeProviders.js +27 -0
  208. package/dist/evals/lineDiff.d.ts +5 -0
  209. package/dist/evals/lineDiff.js +34 -0
  210. package/dist/evals/listStatus.d.ts +31 -0
  211. package/dist/evals/listStatus.js +48 -0
  212. package/dist/evals/manager.d.ts +187 -0
  213. package/dist/evals/manager.js +795 -0
  214. package/dist/evals/plan.d.ts +65 -0
  215. package/dist/evals/plan.js +621 -0
  216. package/dist/evals/planInternalAgent.d.ts +19 -0
  217. package/dist/evals/planInternalAgent.js +205 -0
  218. package/dist/evals/providerKeys.d.ts +1 -0
  219. package/dist/evals/providerKeys.js +21 -0
  220. package/dist/evals/read/agentTargets.d.ts +37 -0
  221. package/dist/evals/read/agentTargets.js +101 -0
  222. package/dist/evals/read/api.d.ts +208 -0
  223. package/dist/evals/read/api.js +363 -0
  224. package/dist/evals/read/compare.d.ts +4 -0
  225. package/dist/evals/read/compare.js +39 -0
  226. package/dist/evals/read/datasets.d.ts +105 -0
  227. package/dist/evals/read/datasets.js +318 -0
  228. package/dist/evals/read/list.d.ts +66 -0
  229. package/dist/evals/read/list.js +182 -0
  230. package/dist/evals/read/results.d.ts +46 -0
  231. package/dist/evals/read/results.js +107 -0
  232. package/dist/evals/read/runs.d.ts +154 -0
  233. package/dist/evals/read/runs.js +295 -0
  234. package/dist/evals/read/suggestions.d.ts +43 -0
  235. package/dist/evals/read/suggestions.js +73 -0
  236. package/dist/evals/runner/FakeAgentBackend.d.ts +40 -0
  237. package/dist/evals/runner/FakeAgentBackend.js +82 -0
  238. package/dist/evals/runner/agentCaseRunner.d.ts +24 -0
  239. package/dist/evals/runner/agentCaseRunner.js +388 -0
  240. package/dist/evals/runner/caseRunner.d.ts +8 -0
  241. package/dist/evals/runner/caseRunner.js +28 -0
  242. package/dist/evals/runner/conversationSubject.d.ts +18 -0
  243. package/dist/evals/runner/conversationSubject.js +123 -0
  244. package/dist/evals/runner/internalAgentCaseRunner.d.ts +6 -0
  245. package/dist/evals/runner/internalAgentCaseRunner.js +250 -0
  246. package/dist/evals/runner/simulatorModel.d.ts +51 -0
  247. package/dist/evals/runner/simulatorModel.js +58 -0
  248. package/dist/evals/runner/simulatorPrompt.d.ts +29 -0
  249. package/dist/evals/runner/simulatorPrompt.js +59 -0
  250. package/dist/evals/runner/stageCaseRunner.d.ts +30 -0
  251. package/dist/evals/runner/stageCaseRunner.js +279 -0
  252. package/dist/evals/runner/userDriver.d.ts +71 -0
  253. package/dist/evals/runner/userDriver.js +104 -0
  254. package/dist/evals/scoring.d.ts +34 -0
  255. package/dist/evals/scoring.js +67 -0
  256. package/dist/evals/snapshot.d.ts +191 -0
  257. package/dist/evals/snapshot.js +70 -0
  258. package/dist/evals/stageDiff.d.ts +8 -0
  259. package/dist/evals/stageDiff.js +48 -0
  260. package/dist/evals/stats.d.ts +95 -0
  261. package/dist/evals/stats.js +220 -0
  262. package/dist/evals/statsAdapter.d.ts +4 -0
  263. package/dist/evals/statsAdapter.js +30 -0
  264. package/dist/evals/statsTypes.d.ts +51 -0
  265. package/dist/evals/statsTypes.js +18 -0
  266. package/dist/evals/storeError.d.ts +5 -0
  267. package/dist/evals/storeError.js +8 -0
  268. package/dist/evals/storeTypes.d.ts +207 -0
  269. package/dist/evals/storeTypes.js +1 -0
  270. package/dist/evals/tTable.d.ts +3 -0
  271. package/dist/evals/tTable.js +15 -0
  272. package/dist/evals/triage/constants.d.ts +26 -0
  273. package/dist/evals/triage/constants.js +33 -0
  274. package/dist/evals/triage/credentials.d.ts +13 -0
  275. package/dist/evals/triage/credentials.js +20 -0
  276. package/dist/evals/triage/jevClassifier.d.ts +14 -0
  277. package/dist/evals/triage/jevClassifier.js +124 -0
  278. package/dist/evals/triage/judgeClassifier.d.ts +10 -0
  279. package/dist/evals/triage/judgeClassifier.js +76 -0
  280. package/dist/evals/triage/prompts.d.ts +16 -0
  281. package/dist/evals/triage/prompts.js +64 -0
  282. package/dist/evals/triage/service.d.ts +79 -0
  283. package/dist/evals/triage/service.js +217 -0
  284. package/dist/evals/triage/stateBuilder.d.ts +19 -0
  285. package/dist/evals/triage/stateBuilder.js +125 -0
  286. package/dist/evals/triage/types.d.ts +60 -0
  287. package/dist/evals/triage/types.js +8 -0
  288. package/dist/evals/types.d.ts +357 -0
  289. package/dist/evals/types.js +4 -0
  290. package/dist/guide/cardContract.d.ts +133 -0
  291. package/dist/guide/cardContract.js +156 -0
  292. package/dist/guide/chat.d.ts +45 -0
  293. package/dist/guide/chat.js +378 -0
  294. package/dist/guide/knowledge/index.d.ts +14 -0
  295. package/dist/guide/knowledge/index.js +109 -0
  296. package/dist/guide/knowledge/topics/agents.d.ts +2 -0
  297. package/dist/guide/knowledge/topics/agents.js +58 -0
  298. package/dist/guide/knowledge/topics/bestPractices.d.ts +2 -0
  299. package/dist/guide/knowledge/topics/bestPractices.js +67 -0
  300. package/dist/guide/knowledge/topics/connections.d.ts +2 -0
  301. package/dist/guide/knowledge/topics/connections.js +66 -0
  302. package/dist/guide/knowledge/topics/consoleMap.d.ts +2 -0
  303. package/dist/guide/knowledge/topics/consoleMap.js +55 -0
  304. package/dist/guide/knowledge/topics/evals.d.ts +2 -0
  305. package/dist/guide/knowledge/topics/evals.js +72 -0
  306. package/dist/guide/knowledge/topics/limitations.d.ts +2 -0
  307. package/dist/guide/knowledge/topics/limitations.js +84 -0
  308. package/dist/guide/knowledge/topics/mcpSkillsBrowser.d.ts +2 -0
  309. package/dist/guide/knowledge/topics/mcpSkillsBrowser.js +57 -0
  310. package/dist/guide/knowledge/topics/memories.d.ts +2 -0
  311. package/dist/guide/knowledge/topics/memories.js +63 -0
  312. package/dist/guide/knowledge/topics/modelsAndProviders.d.ts +2 -0
  313. package/dist/guide/knowledge/topics/modelsAndProviders.js +56 -0
  314. package/dist/guide/knowledge/topics/overview.d.ts +2 -0
  315. package/dist/guide/knowledge/topics/overview.js +56 -0
  316. package/dist/guide/knowledge/topics/pipelines.d.ts +2 -0
  317. package/dist/guide/knowledge/topics/pipelines.js +93 -0
  318. package/dist/guide/knowledge/topics/stages.d.ts +2 -0
  319. package/dist/guide/knowledge/topics/stages.js +54 -0
  320. package/dist/guide/knowledge/topics/tasks.d.ts +2 -0
  321. package/dist/guide/knowledge/topics/tasks.js +52 -0
  322. package/dist/guide/knowledge/topics/triggers.d.ts +2 -0
  323. package/dist/guide/knowledge/topics/triggers.js +68 -0
  324. package/dist/guide/knowledge/topics/troubleshooting.d.ts +2 -0
  325. package/dist/guide/knowledge/topics/troubleshooting.js +85 -0
  326. package/dist/guide/knowledgeTools.d.ts +2 -0
  327. package/dist/guide/knowledgeTools.js +56 -0
  328. package/dist/guide/showUi.d.ts +6 -0
  329. package/dist/guide/showUi.js +546 -0
  330. package/dist/guide/threadStore.d.ts +48 -0
  331. package/dist/guide/threadStore.js +189 -0
  332. package/dist/guide/writeRoot.d.ts +11 -0
  333. package/dist/guide/writeRoot.js +70 -0
  334. package/dist/hosted/translate.js +2 -0
  335. package/dist/mcp/agentTools.js +12 -0
  336. package/dist/mcp/catalogTools.js +18 -20
  337. package/dist/mcp/catalogWriteTools.d.ts +8 -0
  338. package/dist/mcp/catalogWriteTools.js +225 -0
  339. package/dist/mcp/connectionTools.d.ts +3 -0
  340. package/dist/mcp/connectionTools.js +85 -0
  341. package/dist/mcp/controlTools.js +34 -1
  342. package/dist/mcp/deps.d.ts +16 -0
  343. package/dist/mcp/evalTools.d.ts +3 -0
  344. package/dist/mcp/evalTools.js +943 -0
  345. package/dist/mcp/memoryHostTools.d.ts +3 -0
  346. package/dist/mcp/memoryHostTools.js +72 -0
  347. package/dist/mcp/pipelineAuthorTools.js +14 -1
  348. package/dist/mcp/server.js +6 -0
  349. package/dist/mcp/tools.js +8 -0
  350. package/dist/mcp/triggerTools.js +77 -31
  351. package/dist/models/response.d.ts +7 -2
  352. package/dist/models/response.js +6 -1
  353. package/dist/operatorAgent/agentAuthorContext.d.ts +1 -1
  354. package/dist/operatorAgent/agentAuthorContext.js +1 -1
  355. package/dist/operatorAgent/evalGate.d.ts +22 -0
  356. package/dist/operatorAgent/evalGate.js +77 -0
  357. package/dist/operatorAgent/fakeHost.js +10 -2
  358. package/dist/operatorAgent/host.js +18 -2
  359. package/dist/operatorAgent/index.d.ts +1 -0
  360. package/dist/operatorAgent/index.js +1 -0
  361. package/dist/operatorAgent/internalAgents.d.ts +11 -0
  362. package/dist/operatorAgent/internalAgents.js +13 -0
  363. package/dist/operatorAgent/piModel.d.ts +5 -1
  364. package/dist/operatorAgent/piModel.js +32 -14
  365. package/dist/operatorAgent/profiles/agentAuthor.d.ts +3 -1
  366. package/dist/operatorAgent/profiles/agentAuthor.js +201 -32
  367. package/dist/operatorAgent/profiles/agentAuthorPlaybook.d.ts +1 -1
  368. package/dist/operatorAgent/profiles/agentAuthorPlaybook.js +48 -15
  369. package/dist/operatorAgent/profiles/authorReadable.d.ts +2 -0
  370. package/dist/operatorAgent/profiles/authorReadable.js +26 -0
  371. package/dist/operatorAgent/profiles/guideConfirm.d.ts +21 -0
  372. package/dist/operatorAgent/profiles/guideConfirm.js +100 -0
  373. package/dist/operatorAgent/profiles/guideTools.d.ts +7 -0
  374. package/dist/operatorAgent/profiles/guideTools.js +123 -0
  375. package/dist/operatorAgent/profiles/stageflowGuide.d.ts +7 -0
  376. package/dist/operatorAgent/profiles/stageflowGuide.js +132 -0
  377. package/dist/operatorAgent/profiles/workshopAuthor.js +23 -0
  378. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
  379. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +9 -1
  380. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +2 -0
  381. package/dist/operatorAgent/profiles/workshopAuthorTools.js +197 -9
  382. package/dist/operatorAgent/types.d.ts +23 -0
  383. package/dist/package-meta.d.ts +1 -1
  384. package/dist/package-meta.js +1 -1
  385. package/dist/runstore/port.d.ts +43 -0
  386. package/dist/runstore/retention.d.ts +2 -1
  387. package/dist/runstore/retention.js +3 -7
  388. package/dist/runstore/runStatusClock.d.ts +17 -0
  389. package/dist/runstore/runStatusClock.js +19 -0
  390. package/dist/runstore/sqlite/SqliteRunStore.d.ts +29 -0
  391. package/dist/runstore/sqlite/SqliteRunStore.js +144 -50
  392. package/dist/runstore/sqlite/evalStore.d.ts +20 -0
  393. package/dist/runstore/sqlite/evalStore.js +541 -0
  394. package/dist/runstore/sqlite/migrations/015-evals.d.ts +12 -0
  395. package/dist/runstore/sqlite/migrations/015-evals.js +157 -0
  396. package/dist/runstore/sqlite/migrations/016-eval-subject-ref.d.ts +12 -0
  397. package/dist/runstore/sqlite/migrations/016-eval-subject-ref.js +20 -0
  398. package/dist/runstore/sqlite/migrations/017-eval-result-suggestions.d.ts +11 -0
  399. package/dist/runstore/sqlite/migrations/017-eval-result-suggestions.js +36 -0
  400. package/dist/runstore/sqlite/migrations/index.js +6 -0
  401. package/dist/runstore/sqlite/suggestionStore.d.ts +14 -0
  402. package/dist/runstore/sqlite/suggestionStore.js +132 -0
  403. package/dist/runstore/workspaceLayout.js +6 -1
  404. package/dist/runtime/artifactDiskInspect.d.ts +14 -0
  405. package/dist/runtime/artifactDiskInspect.js +52 -0
  406. package/dist/runtime/artifactPath.d.ts +24 -0
  407. package/dist/runtime/artifactPath.js +84 -0
  408. package/dist/runtime/completionCheckRunner.js +15 -43
  409. package/dist/runtime/githubPollSource.d.ts +22 -4
  410. package/dist/runtime/githubPollSource.js +93 -8
  411. package/dist/runtime/pipelineRunner.d.ts +2 -1
  412. package/dist/runtime/pipelineRunner.js +2 -0
  413. package/dist/runtime/priorArtifactGrants.d.ts +8 -0
  414. package/dist/runtime/priorArtifactGrants.js +105 -0
  415. package/dist/runtime/runActionEligibility.d.ts +46 -0
  416. package/dist/runtime/runActionEligibility.js +123 -0
  417. package/dist/runtime/runManager.d.ts +6 -2
  418. package/dist/runtime/runManager.js +60 -16
  419. package/dist/runtime/runRetentionSweep.js +2 -2
  420. package/dist/runtime/runRetryCoordinator.d.ts +2 -14
  421. package/dist/runtime/runRetryCoordinator.js +3 -67
  422. package/dist/runtime/sandboxContainer.d.ts +7 -0
  423. package/dist/runtime/sandboxContainer.js +48 -6
  424. package/dist/runtime/sandboxDesk.d.ts +2 -1
  425. package/dist/runtime/sandboxDesk.js +11 -12
  426. package/dist/runtime/stageEnvironment.js +1 -0
  427. package/dist/runtime/stageRoots.d.ts +12 -0
  428. package/dist/runtime/stageSandbox.d.ts +2 -1
  429. package/dist/runtime/stageSandbox.js +18 -2
  430. package/dist/runtime/stageWorker.js +20 -0
  431. package/dist/server/agentAuthorRoutes.js +59 -1
  432. package/dist/server/bootstrap.d.ts +13 -0
  433. package/dist/server/bootstrap.js +69 -0
  434. package/dist/server/controlToken.js +3 -0
  435. package/dist/server/evalInternalRoutes.d.ts +14 -0
  436. package/dist/server/evalInternalRoutes.js +87 -0
  437. package/dist/server/evalRouteContext.d.ts +46 -0
  438. package/dist/server/evalRouteContext.js +43 -0
  439. package/dist/server/evalRoutes.d.ts +5 -0
  440. package/dist/server/evalRoutes.js +1456 -0
  441. package/dist/server/evalTriageRoutes.d.ts +2 -0
  442. package/dist/server/evalTriageRoutes.js +95 -0
  443. package/dist/server/guideRoutes.d.ts +5 -0
  444. package/dist/server/guideRoutes.js +166 -0
  445. package/dist/server/http.d.ts +15 -0
  446. package/dist/server/http.js +67 -3
  447. package/dist/server/internalAgentRoutes.d.ts +6 -0
  448. package/dist/server/internalAgentRoutes.js +12 -0
  449. package/dist/server/mcpHost.js +5 -0
  450. package/dist/toolkit/meta.d.ts +1 -1
  451. package/dist/toolkit/meta.js +53 -0
  452. package/dist/toolkit/profiles.d.ts +5 -0
  453. package/dist/toolkit/profiles.js +13 -1
  454. package/dist/tools/askOperator.js +2 -1
  455. package/dist/tools/emitStageEnvelope.d.ts +17 -16
  456. package/dist/tools/emitStageEnvelope.js +46 -32
  457. package/dist/tools/stageToolNames.d.ts +4 -0
  458. package/dist/tools/stageToolNames.js +4 -0
  459. package/dist/tools/workingState.d.ts +40 -0
  460. package/dist/tools/workingState.js +108 -0
  461. package/dist/tools/writeStageArtifact.d.ts +0 -9
  462. package/dist/tools/writeStageArtifact.js +2 -1
  463. package/dist/types/stageflowManifest.d.ts +6 -0
  464. package/dist/ui/assets/{MarkdownText-D7tYaIFO.js → MarkdownText-S5C_vemc.js} +2 -2
  465. package/dist/ui/assets/adapters-C0l4ruiR.js +17 -0
  466. package/dist/ui/assets/chat-CjnsmvqR.js +2 -0
  467. package/dist/ui/assets/chat-DFDd4UjS.css +2 -0
  468. package/dist/ui/assets/{main-BFo79krC.css → main-Del1GeLf.css} +1 -1
  469. package/dist/ui/assets/main-_yXVqcW9.js +277 -0
  470. package/dist/ui/chat.html +3 -4
  471. package/dist/ui/index.html +3 -4
  472. package/dist/workshop/chatTurn.js +1 -1
  473. package/dist/workshop/workshopPin.d.ts +3 -3
  474. package/dist/workshop/workshopPin.js +16 -15
  475. package/examples/README.md +2 -0
  476. package/examples/compaction-stress/README.md +30 -0
  477. package/examples/compaction-stress/check-run.mjs +53 -0
  478. package/examples/compaction-stress/collect-evidence.yaml +60 -0
  479. package/examples/compaction-stress/compaction-stress.pipeline.yaml +141 -0
  480. package/examples/compaction-stress/compaction-stress.task.yaml +15 -0
  481. package/examples/compaction-stress/generate-evidence.mjs +110 -0
  482. package/examples/compaction-stress/root-cause.yaml +26 -0
  483. package/examples/compaction-stress/stageflow.yaml +9 -0
  484. package/examples/compaction-stress/write-postmortem.yaml +40 -0
  485. package/examples/document-policy-review/README.md +35 -0
  486. package/examples/document-policy-review/agents/compliance.agent.yaml +42 -0
  487. package/examples/document-policy-review/documents/acme-vendor-sow.md +15 -0
  488. package/examples/document-policy-review/documents/support-runbook.md +13 -0
  489. package/examples/document-policy-review/policies/acceptable-use.md +13 -0
  490. package/examples/document-policy-review/policies/data-handling.md +17 -0
  491. package/examples/document-policy-review/policies/vendor-security.md +17 -0
  492. package/examples/evals/README.md +141 -0
  493. package/examples/evals/critique-sample.dataset.jsonl +8 -0
  494. package/examples/evals/critique-sample.eval.yaml +34 -0
  495. package/examples/evals/critique-sample.task.yaml +4 -0
  496. package/examples/evals/eval-sample.pipeline.yaml +35 -0
  497. package/examples/evals/guide-behavior.dataset.jsonl +15 -0
  498. package/examples/evals/guide-behavior.eval.yaml +35 -0
  499. package/examples/evals/guide-depth.dataset.jsonl +35 -0
  500. package/examples/evals/guide-depth.eval.yaml +169 -0
  501. package/examples/evals/support-sample.agent.yaml +20 -0
  502. package/examples/evals/support-sample.dataset.jsonl +6 -0
  503. package/examples/evals/support-sample.eval.yaml +38 -0
  504. package/examples/memory/evals/guide-behavior.dataset.jsonl +15 -0
  505. package/examples/memory/evals/guide-behavior.eval.yaml +35 -0
  506. package/examples/memory/evals/guide-depth.dataset.jsonl +35 -0
  507. package/examples/memory/evals/guide-depth.eval.yaml +169 -0
  508. package/examples/stageflow.yaml +6 -0
  509. package/package.json +1 -1
  510. package/skills/stageflow/SKILL.md +5 -2
  511. package/skills/stageflow/references/control-surface.md +4 -2
  512. package/skills/stageflow/references/evals.md +68 -0
  513. package/skills/stageflow-author/SKILL.md +4 -0
  514. package/skills/stageflow-run/SKILL.md +4 -0
  515. package/dist/ui/assets/AssistantRuntimeProvider-CsiPFhCT.js +0 -9
  516. package/dist/ui/assets/ReadonlyStore-BfXqHykm.js +0 -6
  517. package/dist/ui/assets/chat-BbLukq9W.js +0 -5
  518. package/dist/ui/assets/chat-zIZU_bP1.css +0 -2
  519. package/dist/ui/assets/main-CijYMeM0.js +0 -259
@@ -135,7 +135,7 @@ function parseExportArgs(args) {
135
135
  }
136
136
  export async function* iterateExportNdjson(options) {
137
137
  yield `${JSON.stringify(buildExportHeader(options.filter, options.now ?? new Date()))}\n`;
138
- const runs = await options.store.listRuns(options.filter);
138
+ const runs = await options.store.listRuns({ ...options.filter, origin: "any" });
139
139
  for (const summary of runs) {
140
140
  const detail = await options.store.readRun(summary.run_id);
141
141
  const pipelineBody = await options.store.readPipelineBody(summary.run_id);
@@ -77,5 +77,65 @@ export type HttpListTriggersResult = {
77
77
  export declare function httpFireTrigger(base: string, triggerId: string, task?: Record<string, unknown>): Promise<StartRunResult>;
78
78
  export declare function httpListTriggers(base: string): Promise<HttpListTriggersResult>;
79
79
  export declare function httpGetTrigger(base: string, triggerId: string): Promise<HttpTriggerLookupResult>;
80
+ export type HttpEvalResult<T> = {
81
+ ok: true;
82
+ body: T;
83
+ } | {
84
+ ok: false;
85
+ reason: string;
86
+ status: number;
87
+ code?: string;
88
+ findings?: unknown[];
89
+ };
90
+ export declare function httpListEvals(base: string, projectRoot?: string): Promise<HttpEvalResult<Record<string, unknown>>>;
91
+ export declare function httpGetEval(base: string, evalId: string, projectRoot?: string): Promise<HttpEvalResult<Record<string, unknown>>>;
92
+ export declare function httpValidateEval(base: string, input: {
93
+ project_root?: string;
94
+ yaml?: string;
95
+ path?: string;
96
+ }): Promise<HttpEvalResult<Record<string, unknown>>>;
97
+ export type HttpStartEvalRunInput = {
98
+ project_root?: string;
99
+ repeats?: number;
100
+ judge?: string;
101
+ model?: string;
102
+ user_model?: string;
103
+ allow_real_tools?: boolean;
104
+ max_cost_usd?: number;
105
+ case_ids?: string[];
106
+ tags?: string[];
107
+ label?: string;
108
+ started_via?: "console" | "cli" | "mcp";
109
+ };
110
+ export declare function httpStartEvalRun(base: string, evalId: string, input: HttpStartEvalRunInput): Promise<HttpEvalResult<{
111
+ eval_run_id: string;
112
+ status: string;
113
+ run_number?: number;
114
+ }>>;
115
+ export declare function httpGetEvalRun(base: string, evalRunId: string): Promise<HttpEvalResult<Record<string, any>>>;
116
+ export declare function httpCancelEvalRun(base: string, evalRunId: string): Promise<HttpEvalResult<Record<string, any>>>;
117
+ export declare function httpSortEvalFailures(base: string, evalRunId: string, input: {
118
+ classifier?: "auto" | "jev" | "judge";
119
+ only_unsorted?: boolean;
120
+ limit?: number;
121
+ }): Promise<HttpEvalResult<Record<string, any>>>;
122
+ export declare function httpListEvalSuggestions(base: string, evalRunId: string, status?: string): Promise<HttpEvalResult<{
123
+ items: Array<Record<string, any>>;
124
+ summary: Record<string, any>;
125
+ }>>;
126
+ export declare function httpListEvalRuns(base: string, query?: {
127
+ eval_id?: string;
128
+ project_root?: string;
129
+ limit?: number;
130
+ cursor?: string;
131
+ }): Promise<HttpEvalResult<{
132
+ items: Array<Record<string, unknown>>;
133
+ next_cursor: string | null;
134
+ }>>;
135
+ export declare function httpDeleteEvalRun(base: string, evalRunId: string): Promise<HttpEvalResult<null>>;
136
+ export declare function httpCompareEvalRuns(base: string, a: string, b: string): Promise<HttpEvalResult<Record<string, unknown>>>;
137
+ export declare function httpListDatasets(base: string, projectRoot?: string): Promise<HttpEvalResult<{
138
+ items: Array<Record<string, unknown>>;
139
+ }>>;
80
140
  export declare function resolveAbsolute(cwd: string, maybeRelative: string): string;
81
141
  export {};
@@ -292,6 +292,77 @@ export async function httpGetTrigger(base, triggerId) {
292
292
  }
293
293
  return { ok: true, trigger: body };
294
294
  }
295
+ function evalFailure(status, body) {
296
+ const rec = body && typeof body === "object" ? body : {};
297
+ return {
298
+ ok: false,
299
+ reason: extractError(body, status),
300
+ status,
301
+ ...(typeof rec.code === "string" ? { code: rec.code } : {}),
302
+ ...(Array.isArray(rec.findings) ? { findings: rec.findings } : {}),
303
+ };
304
+ }
305
+ function evalQuery(params) {
306
+ const parts = [];
307
+ for (const [key, value] of Object.entries(params)) {
308
+ if (value === undefined || value === "")
309
+ continue;
310
+ parts.push(`${key}=${enc(String(value))}`);
311
+ }
312
+ return parts.length > 0 ? `?${parts.join("&")}` : "";
313
+ }
314
+ async function evalGet(base, urlPath, expected = 200) {
315
+ const { status, body } = await getJson(base, urlPath);
316
+ return status === expected ? { ok: true, body: body } : evalFailure(status, body);
317
+ }
318
+ export function httpListEvals(base, projectRoot) {
319
+ return evalGet(base, `/api/evals${evalQuery({ project_root: projectRoot })}`);
320
+ }
321
+ export function httpGetEval(base, evalId, projectRoot) {
322
+ return evalGet(base, `/api/evals/${enc(evalId)}${evalQuery({ project_root: projectRoot })}`);
323
+ }
324
+ export async function httpValidateEval(base, input) {
325
+ const { status, body } = await postJson(base, "/api/evals/validate", input);
326
+ return status === 200 ? { ok: true, body: body } : evalFailure(status, body);
327
+ }
328
+ export async function httpStartEvalRun(base, evalId, input) {
329
+ const { status, body } = await postJson(base, `/api/evals/${enc(evalId)}/runs`, input);
330
+ return status === 202
331
+ ? { ok: true, body: body }
332
+ : evalFailure(status, body);
333
+ }
334
+ export function httpGetEvalRun(base, evalRunId) {
335
+ return evalGet(base, `/api/eval-runs/${enc(evalRunId)}`);
336
+ }
337
+ export async function httpCancelEvalRun(base, evalRunId) {
338
+ const { status, body } = await postJson(base, `/api/eval-runs/${enc(evalRunId)}/cancel`, {});
339
+ return status === 200 ? { ok: true, body: body } : evalFailure(status, body);
340
+ }
341
+ export async function httpSortEvalFailures(base, evalRunId, input) {
342
+ const { status, body } = await postJson(base, `/api/eval-runs/${enc(evalRunId)}/failures/sort`, input);
343
+ return status === 200 ? { ok: true, body: body } : evalFailure(status, body);
344
+ }
345
+ export function httpListEvalSuggestions(base, evalRunId, status) {
346
+ return evalGet(base, `/api/eval-runs/${enc(evalRunId)}/failures/suggestions${evalQuery({ status })}`);
347
+ }
348
+ export function httpListEvalRuns(base, query = {}) {
349
+ return evalGet(base, `/api/eval-runs${evalQuery(query)}`);
350
+ }
351
+ export async function httpDeleteEvalRun(base, evalRunId) {
352
+ const res = await fetch(`${base}/api/eval-runs/${enc(evalRunId)}`, {
353
+ method: "DELETE",
354
+ headers: { ...clientAuthorizationHeaders("DELETE") },
355
+ });
356
+ if (res.status === 204)
357
+ return { ok: true, body: null };
358
+ return evalFailure(res.status, await parseJsonBody(res));
359
+ }
360
+ export function httpCompareEvalRuns(base, a, b) {
361
+ return evalGet(base, `/api/eval-compare${evalQuery({ a, b })}`);
362
+ }
363
+ export function httpListDatasets(base, projectRoot) {
364
+ return evalGet(base, `/api/datasets${evalQuery({ project_root: projectRoot })}`);
365
+ }
295
366
  export function resolveAbsolute(cwd, maybeRelative) {
296
367
  return path.resolve(cwd, maybeRelative);
297
368
  }
@@ -1,6 +1,6 @@
1
1
  import type { ValidationResult } from "../config/validateCatalog.js";
2
- export declare const VALIDATION_SCOPE_LINE = "Scope: catalog YAML (pipelines, stages, and tasks as selected by flags). Provider auth and checkout paths are not checked.";
3
- export declare const VALIDATION_CHECKS = "catalog YAML (pipelines, stages, tasks as selected by flags)";
2
+ export declare const VALIDATION_SCOPE_LINE = "Scope: catalog YAML (pipelines, stages, tasks, and evals as selected by flags). Provider auth and checkout paths are not checked.";
3
+ export declare const VALIDATION_CHECKS = "catalog YAML (pipelines, stages, tasks, evals as selected by flags)";
4
4
  export declare function formatValidationHuman(result: ValidationResult, options?: {
5
5
  strict?: boolean;
6
6
  }): string;
@@ -1,6 +1,6 @@
1
1
  import { effectiveSeverity } from "../config/validateCatalog.js";
2
- export const VALIDATION_SCOPE_LINE = "Scope: catalog YAML (pipelines, stages, and tasks as selected by flags). Provider auth and checkout paths are not checked.";
3
- export const VALIDATION_CHECKS = "catalog YAML (pipelines, stages, tasks as selected by flags)";
2
+ export const VALIDATION_SCOPE_LINE = "Scope: catalog YAML (pipelines, stages, tasks, and evals as selected by flags). Provider auth and checkout paths are not checked.";
3
+ export const VALIDATION_CHECKS = "catalog YAML (pipelines, stages, tasks, evals as selected by flags)";
4
4
  function effectiveSeverityRank(finding, strict) {
5
5
  return effectiveSeverity(finding, strict) === "error" ? 0 : 1;
6
6
  }
package/dist/cli.js CHANGED
@@ -20,6 +20,7 @@ import { RUN_STAGE_USAGE, runRunStageCommand } from "./cli/runStageCommand.js";
20
20
  import { RUNS_USAGE, runRunsCommand } from "./cli/runsCommand.js";
21
21
  import { AGENTS_USAGE, runAgentsCommand } from "./cli/agentsCommand.js";
22
22
  import { TRIGGER_USAGE, runTriggerCommand } from "./cli/triggerCommand.js";
23
+ import { EVAL_USAGE, runEvalCommand } from "./cli/evalCommand.js";
23
24
  import { resolveOperatorCatalog } from "./cli/operatorCatalog.js";
24
25
  import { SKILLS_USAGE, runSkillsCommand } from "./cli/skillsCommand.js";
25
26
  import { VALIDATE_USAGE, runValidateCommand } from "./cli/validateCommand.js";
@@ -125,6 +126,8 @@ ${RUNS_USAGE}
125
126
 
126
127
  ${TRIGGER_USAGE}
127
128
 
129
+ ${EVAL_USAGE}
130
+
128
131
  ${AGENTS_USAGE}
129
132
 
130
133
  ${PROVIDERS_USAGE}
@@ -168,6 +171,7 @@ function parseArgs(argv) {
168
171
  command === "export" ||
169
172
  command === "runs" ||
170
173
  command === "trigger" ||
174
+ command === "eval" ||
171
175
  command === "agents" ||
172
176
  command === "skills" ||
173
177
  command === "browser") {
@@ -495,6 +499,12 @@ async function main(argv) {
495
499
  cwd: ctx.invocationCwd,
496
500
  });
497
501
  }
502
+ if (parsed.command === "eval") {
503
+ return runEvalCommand(argv.slice(3), {
504
+ cwd: ctx.invocationCwd,
505
+ projectRoot: ctx.projectRoot,
506
+ });
507
+ }
498
508
  if (parsed.command === "agents") {
499
509
  return runAgentsCommand(argv.slice(3), {
500
510
  cwd: ctx.invocationCwd,
@@ -0,0 +1,18 @@
1
+ import type { LooseMessage } from "./pin.js";
2
+ export type DirectiveSource = "operator" | "user" | "rejection";
3
+ /** Words from the people running the work, copied verbatim so a summary cannot reword a decision. */
4
+ export type Directive = {
5
+ source: DirectiveSource;
6
+ text: string;
7
+ };
8
+ export declare const DIRECTIVE_MAX_CHARS = 600;
9
+ export declare const USER_DIRECTIVE_MAX_CHARS = 280;
10
+ export declare const DIRECTIVES_CARRY_MAX = 60;
11
+ /**
12
+ * Operator answers, rejected emits and user messages, in order. The stage kickoff and reminder prompts are
13
+ * skipped: they carry no decision.
14
+ */
15
+ export declare function extractDirectives(messages: readonly LooseMessage[]): Directive[];
16
+ export declare function mergeDirectives(previous: readonly Directive[], fresh: readonly Directive[], max?: number): Directive[];
17
+ /** Directive-like entries first (newest up to 60% of the budget, then oldest), then the rest if room remains. */
18
+ export declare function renderDirectives(directives: readonly Directive[], maxChars: number): string;
@@ -0,0 +1,119 @@
1
+ import { ASK_OPERATOR_TOOL_NAME, EMIT_STAGE_ENVELOPE_TOOL_NAME } from "../tools/stageToolNames.js";
2
+ import { scrubSecrets } from "./scrub.js";
3
+ export const DIRECTIVE_MAX_CHARS = 600;
4
+ export const USER_DIRECTIVE_MAX_CHARS = 280;
5
+ export const DIRECTIVES_CARRY_MAX = 60;
6
+ const NOISE_USER = /^(?:Begin this stage\b|Reminder \d+ of \d+)/i;
7
+ const FEEDBACK_RESUME_PREFIX = /^Continue this stage after feedback-loop send-back\.\s*Incorporate the operator\/source feedback below[^\n]*\n*/i;
8
+ const OPERATOR_TOOLS = new Set([ASK_OPERATOR_TOOL_NAME]);
9
+ const ENVELOPE_TOOLS = new Set([EMIT_STAGE_ENVELOPE_TOOL_NAME]);
10
+ function blocksText(content) {
11
+ if (typeof content === "string")
12
+ return content;
13
+ if (!Array.isArray(content))
14
+ return "";
15
+ return content
16
+ .map((b) => (b !== null && typeof b === "object" && b.type === "text" && typeof b.text === "string" ? b.text : ""))
17
+ .filter(Boolean)
18
+ .join("\n");
19
+ }
20
+ function clip(text, max = DIRECTIVE_MAX_CHARS) {
21
+ const flat = text.replace(/\s+/g, " ").trim();
22
+ return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
23
+ }
24
+ /**
25
+ * Operator answers, rejected emits and user messages, in order. The stage kickoff and reminder prompts are
26
+ * skipped: they carry no decision.
27
+ */
28
+ export function extractDirectives(messages) {
29
+ const out = [];
30
+ for (const m of messages) {
31
+ if (m.role === "user") {
32
+ const text = blocksText(m.content).trim().replace(FEEDBACK_RESUME_PREFIX, "");
33
+ if (!text.trim() || NOISE_USER.test(text.trim()))
34
+ continue;
35
+ out.push({ source: "user", text: clip(scrubSecrets(text), USER_DIRECTIVE_MAX_CHARS) });
36
+ }
37
+ else if (m.role === "toolResult") {
38
+ const name = typeof m.toolName === "string" ? m.toolName : "";
39
+ const text = blocksText(m.content);
40
+ if (!text.trim())
41
+ continue;
42
+ if (OPERATOR_TOOLS.has(name))
43
+ out.push({ source: "operator", text: clip(scrubSecrets(text)) });
44
+ else if (ENVELOPE_TOOLS.has(name) && m.isError === true)
45
+ out.push({ source: "rejection", text: clip(scrubSecrets(text)) });
46
+ }
47
+ }
48
+ return out;
49
+ }
50
+ export function mergeDirectives(previous, fresh, max = DIRECTIVES_CARRY_MAX) {
51
+ const seen = new Set();
52
+ const merged = [];
53
+ for (const d of [...previous, ...fresh]) {
54
+ const key = `${d.source}\u0000${d.text}`;
55
+ if (seen.has(key))
56
+ continue;
57
+ seen.add(key);
58
+ merged.push(d);
59
+ }
60
+ return merged.slice(-max);
61
+ }
62
+ const LABEL = { operator: "Operator", user: "User", rejection: "Rejected" };
63
+ const DIRECTIVE_WORDS = /\b(?:always|never|must|should|shall|don'?t|do not|cannot|can'?t|only|prefer|require[sd]?|approved?|rejected?|decid(?:e|ed|ion)|deadline|due|before|after|until|instead|budget|limit|forbidden|allowed|use|avoid|ensure|remember|important)\b/i;
64
+ const SHORT_MESSAGE_CHARS = 160;
65
+ /** Instruction-like or short messages outrank long prose, so filler cannot crowd out a rule. */
66
+ function isDirectiveLike(d) {
67
+ if (d.source !== "user")
68
+ return true;
69
+ return d.text.length <= SHORT_MESSAGE_CHARS || DIRECTIVE_WORDS.test(d.text);
70
+ }
71
+ /** Directive-like entries first (newest up to 60% of the budget, then oldest), then the rest if room remains. */
72
+ export function renderDirectives(directives, maxChars) {
73
+ if (directives.length === 0)
74
+ return "";
75
+ const header = "## Operator and user directives (verbatim, oldest first)";
76
+ const lineOf = (d) => `- ${LABEL[d.source]}: ${d.text}`;
77
+ const picked = new Set();
78
+ let used = header.length;
79
+ const take = (i, limit) => {
80
+ const cost = lineOf(directives[i]).length + 1;
81
+ if (used + cost > limit)
82
+ return false;
83
+ picked.add(i);
84
+ used += cost;
85
+ return true;
86
+ };
87
+ const primary = directives.map((d, i) => (isDirectiveLike(d) ? i : -1)).filter((i) => i >= 0);
88
+ const secondary = directives.map((d, i) => (isDirectiveLike(d) ? -1 : i)).filter((i) => i >= 0);
89
+ const newestLimit = Math.floor(maxChars * 0.6);
90
+ for (let k = primary.length - 1; k >= 0; k--)
91
+ if (!take(primary[k], newestLimit))
92
+ break;
93
+ for (const i of primary) {
94
+ if (picked.has(i))
95
+ continue;
96
+ if (!take(i, maxChars))
97
+ break;
98
+ }
99
+ for (const i of secondary) {
100
+ if (!take(i, maxChars))
101
+ break;
102
+ }
103
+ if (picked.size === 0)
104
+ return "";
105
+ const lines = [];
106
+ let gap = false;
107
+ for (let i = 0; i < directives.length; i++) {
108
+ if (picked.has(i)) {
109
+ if (gap)
110
+ lines.push("- (…)");
111
+ gap = false;
112
+ lines.push(lineOf(directives[i]));
113
+ }
114
+ else if (lines.length > 0)
115
+ gap = true;
116
+ }
117
+ const omitted = directives.length - picked.size;
118
+ return [header, ...lines, ...(omitted > 0 ? [`- (${omitted} omitted for space)`] : [])].join("\n");
119
+ }
@@ -0,0 +1,20 @@
1
+ import { compact as piCompact, type ExtensionFactory } from "@earendil-works/pi-coding-agent";
2
+ import { type ClearingPolicy } from "./mask.js";
3
+ export type CompactionPolicy = {
4
+ /** Clear stale re-fetchable tool results in the text the summarizer reads. */
5
+ clearInSummary?: ClearingPolicy;
6
+ /** Clear stale re-fetchable tool results in every request once the window is this full (0-1). */
7
+ preemptive?: {
8
+ usageFraction: number;
9
+ policy: ClearingPolicy;
10
+ };
11
+ };
12
+ export declare const DEFAULT_COMPACTION_POLICY: CompactionPolicy;
13
+ type CompactFn = typeof piCompact;
14
+ export type CompactionExtensionOptions = {
15
+ policy?: CompactionPolicy;
16
+ compact?: CompactFn;
17
+ onWarn?: (message: string) => void;
18
+ };
19
+ export declare function createCompactionExtension(options?: CompactionExtensionOptions): ExtensionFactory;
20
+ export {};
@@ -0,0 +1,78 @@
1
+ import { compact as piCompact, } from "@earendil-works/pi-coding-agent";
2
+ import { applyClearing, planClearing } from "./mask.js";
3
+ import { COMPACTION_FOCUS, composeCompactionSummary, readStageflowDetails, stageflowDetails, } from "./summarize.js";
4
+ import { getWorkingStateSections } from "./workingState.js";
5
+ export const DEFAULT_COMPACTION_POLICY = {};
6
+ function lastCompactionDetails(branch) {
7
+ for (let i = branch.length - 1; i >= 0; i--) {
8
+ const e = branch[i];
9
+ if (e?.type === "compaction")
10
+ return readStageflowDetails(e.details);
11
+ }
12
+ return undefined;
13
+ }
14
+ export function createCompactionExtension(options = {}) {
15
+ const policy = options.policy ?? DEFAULT_COMPACTION_POLICY;
16
+ const compact = options.compact ?? piCompact;
17
+ const warn = options.onWarn ?? (() => { });
18
+ return (pi) => {
19
+ pi.on("session_before_compact", async (event, rawCtx) => {
20
+ const ctx = rawCtx;
21
+ const model = ctx.model;
22
+ if (!model)
23
+ return undefined;
24
+ try {
25
+ const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
26
+ if (!auth.ok)
27
+ return undefined;
28
+ const { preparation } = event;
29
+ const previousDetails = lastCompactionDetails(event.branchEntries);
30
+ const historyCount = preparation.messagesToSummarize.length;
31
+ const composed = await composeCompactionSummary({
32
+ messages: [...preparation.messagesToSummarize, ...preparation.turnPrefixMessages],
33
+ ...(preparation.previousSummary !== undefined ? { previousSummary: preparation.previousSummary } : {}),
34
+ ...(previousDetails ? { previousDetails } : {}),
35
+ state: getWorkingStateSections(ctx.sessionManager.getEntries()),
36
+ ...(policy.clearInSummary ? { clearInSummary: policy.clearInSummary } : {}),
37
+ summarize: ({ messages, previousSummary }) => compact({
38
+ ...preparation,
39
+ messagesToSummarize: messages.slice(0, historyCount),
40
+ turnPrefixMessages: messages.slice(historyCount),
41
+ ...(previousSummary !== undefined ? { previousSummary } : {}),
42
+ }, model, auth.apiKey, auth.headers, COMPACTION_FOCUS, event.signal, ctx.thinkingLevel, undefined, auth.env),
43
+ });
44
+ const { result, prepared } = composed;
45
+ return {
46
+ compaction: {
47
+ summary: composed.summary,
48
+ firstKeptEntryId: result.firstKeptEntryId,
49
+ tokensBefore: result.tokensBefore,
50
+ ...(result.usage ? { usage: result.usage } : {}),
51
+ details: stageflowDetails(result.details, previousDetails, prepared.pinned, prepared.cleared, prepared.directives),
52
+ },
53
+ };
54
+ }
55
+ catch (err) {
56
+ if (event.signal.aborted)
57
+ throw err;
58
+ warn(`stageflow compaction fell back to Pi default: ${err instanceof Error ? err.message : String(err)}`);
59
+ return undefined;
60
+ }
61
+ });
62
+ const preemptive = policy.preemptive;
63
+ if (preemptive) {
64
+ pi.on("context", async (event, rawCtx) => {
65
+ const ctx = rawCtx;
66
+ const usage = ctx.getContextUsage();
67
+ if (!usage || usage.tokens === null || usage.contextWindow <= 0)
68
+ return undefined;
69
+ if (usage.tokens / usage.contextWindow < preemptive.usageFraction)
70
+ return undefined;
71
+ const plan = planClearing(event.messages, preemptive.policy);
72
+ if (plan.cleared.length === 0)
73
+ return undefined;
74
+ return { messages: applyClearing(event.messages, plan) };
75
+ });
76
+ }
77
+ };
78
+ }
@@ -0,0 +1,18 @@
1
+ import type { LooseMessage } from "./pin.js";
2
+ import type { ClearedResult } from "./types.js";
3
+ export type ClearingPolicy = {
4
+ /** Never touch results at or after the Nth assistant turn from the end. */
5
+ keepRecentTurns: number;
6
+ /** Ignore results smaller than this many UTF-8 bytes. */
7
+ minBytes: number;
8
+ /** Overrides the default recover hint when it returns a non-empty string. */
9
+ recoverHintFor?: (message: LooseMessage) => string | undefined;
10
+ };
11
+ export type ClearingPlan = {
12
+ cleared: ClearedResult[];
13
+ clearIds: Set<string>;
14
+ };
15
+ export declare function planClearing(messages: readonly LooseMessage[], policy: ClearingPolicy): ClearingPlan;
16
+ export declare function placeholderFor(item: ClearedResult): string;
17
+ export declare function applyClearing<T extends LooseMessage>(messages: readonly T[], plan: ClearingPlan): T[];
18
+ export declare function renderClearedIndex(cleared: readonly ClearedResult[], maxChars: number): string;
@@ -0,0 +1,155 @@
1
+ import { scrubSecrets } from "./scrub.js";
2
+ import { classifyForClearing } from "./toolPolicy.js";
3
+ const PLACEHOLDER_PREFIX = "[Tool result cleared to save context:";
4
+ const DESCRIPTOR_MAX = 100;
5
+ function record(value) {
6
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined;
7
+ }
8
+ function resultText(message) {
9
+ const content = message.content;
10
+ if (typeof content === "string")
11
+ return content;
12
+ if (!Array.isArray(content))
13
+ return "";
14
+ let out = "";
15
+ for (const block of content) {
16
+ const b = record(block);
17
+ if (b?.type === "text" && typeof b.text === "string")
18
+ out += (out ? "\n" : "") + b.text;
19
+ }
20
+ return out;
21
+ }
22
+ function oneLine(text, max) {
23
+ const flat = text.replace(/\s+/g, " ").trim();
24
+ return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
25
+ }
26
+ function findToolCall(messages, before, toolCallId) {
27
+ for (let i = before - 1; i >= 0; i--) {
28
+ const m = messages[i];
29
+ if (m.role !== "assistant" || !Array.isArray(m.content))
30
+ continue;
31
+ for (const block of m.content) {
32
+ const b = record(block);
33
+ if (b?.type === "toolCall" && b.id === toolCallId)
34
+ return b;
35
+ }
36
+ }
37
+ return undefined;
38
+ }
39
+ function callArgs(call) {
40
+ return record(call?.arguments) ?? {};
41
+ }
42
+ function describe(toolName, args) {
43
+ const pathArg = typeof args.path === "string" ? args.path : typeof args.file_path === "string" ? args.file_path : undefined;
44
+ if (pathArg)
45
+ return oneLine(`${toolName} ${pathArg}`, DESCRIPTOR_MAX);
46
+ if (typeof args.command === "string")
47
+ return oneLine(`${toolName}: ${args.command}`, DESCRIPTOR_MAX);
48
+ if (typeof args.pattern === "string")
49
+ return oneLine(`${toolName} ${args.pattern}${typeof args.path === "string" ? ` in ${args.path}` : ""}`, DESCRIPTOR_MAX);
50
+ const keys = Object.keys(args);
51
+ if (keys.length === 0)
52
+ return toolName;
53
+ let json = "";
54
+ try {
55
+ json = JSON.stringify(args);
56
+ }
57
+ catch {
58
+ json = "";
59
+ }
60
+ return oneLine(json ? `${toolName} ${json}` : toolName, DESCRIPTOR_MAX);
61
+ }
62
+ function defaultHint(message, toolName, args) {
63
+ const spill = record(record(message.details)?.stageflowToolOutput);
64
+ const spillPath = typeof spill?.path === "string" ? spill.path : undefined;
65
+ if (spillPath)
66
+ return `read ${spillPath}`;
67
+ if (toolName === "read") {
68
+ const p = typeof args.path === "string" ? args.path : typeof args.file_path === "string" ? args.file_path : undefined;
69
+ if (p)
70
+ return `read ${p} (offset/limit as before)`;
71
+ }
72
+ return `re-run ${toolName} with the same arguments`;
73
+ }
74
+ function isPlaceholder(text) {
75
+ return text.startsWith(PLACEHOLDER_PREFIX);
76
+ }
77
+ export function planClearing(messages, policy) {
78
+ const cleared = [];
79
+ const clearIds = new Set();
80
+ let boundary = messages.length;
81
+ if (policy.keepRecentTurns > 0) {
82
+ let seen = 0;
83
+ boundary = 0;
84
+ for (let i = messages.length - 1; i >= 0; i--) {
85
+ if (messages[i].role === "assistant" && ++seen === policy.keepRecentTurns) {
86
+ boundary = i;
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ for (let i = 0; i < boundary; i++) {
92
+ const m = messages[i];
93
+ if (m.role !== "toolResult")
94
+ continue;
95
+ const toolCallId = typeof m.toolCallId === "string" ? m.toolCallId : undefined;
96
+ const toolName = typeof m.toolName === "string" ? m.toolName : undefined;
97
+ if (!toolCallId || !toolName || clearIds.has(toolCallId))
98
+ continue;
99
+ if (classifyForClearing(toolName, m.isError === true, m.details) !== "clearable")
100
+ continue;
101
+ const text = resultText(m);
102
+ if (isPlaceholder(text))
103
+ continue;
104
+ const bytes = Buffer.byteLength(text, "utf8");
105
+ if (bytes < policy.minBytes)
106
+ continue;
107
+ const args = callArgs(findToolCall(messages, i, toolCallId));
108
+ const custom = policy.recoverHintFor?.(m);
109
+ cleared.push({
110
+ toolName,
111
+ toolCallId,
112
+ bytes,
113
+ descriptor: scrubSecrets(describe(toolName, args)),
114
+ recoverHint: scrubSecrets(custom && custom.trim().length > 0 ? oneLine(custom, 300) : defaultHint(m, toolName, args)),
115
+ });
116
+ clearIds.add(toolCallId);
117
+ }
118
+ return { cleared, clearIds };
119
+ }
120
+ export function placeholderFor(item) {
121
+ return `${PLACEHOLDER_PREFIX} ${item.descriptor}, ${item.bytes} bytes. To get it again: ${item.recoverHint}]`;
122
+ }
123
+ export function applyClearing(messages, plan) {
124
+ if (plan.clearIds.size === 0)
125
+ return [...messages];
126
+ const byId = new Map(plan.cleared.map((c) => [c.toolCallId, c]));
127
+ return messages.map((m) => {
128
+ if (m.role !== "toolResult" || typeof m.toolCallId !== "string" || !plan.clearIds.has(m.toolCallId))
129
+ return m;
130
+ const item = byId.get(m.toolCallId);
131
+ if (!item || isPlaceholder(resultText(m)))
132
+ return m;
133
+ return { ...m, content: [{ type: "text", text: placeholderFor(item) }] };
134
+ });
135
+ }
136
+ export function renderClearedIndex(cleared, maxChars) {
137
+ const title = "## Cleared tool results (re-fetch if needed)";
138
+ const omitted = (n) => `- (${n} more omitted)`;
139
+ if (cleared.length === 0)
140
+ return title;
141
+ const reserve = omitted(cleared.length).length + 1;
142
+ const lines = [];
143
+ let used = title.length;
144
+ for (const item of cleared) {
145
+ const line = `- ${item.descriptor} (${item.bytes} bytes) — ${oneLine(item.recoverHint, 200)}`;
146
+ if (used + line.length + 1 + reserve > maxChars)
147
+ break;
148
+ lines.push(line);
149
+ used += line.length + 1;
150
+ }
151
+ const out = [title, ...lines];
152
+ if (lines.length < cleared.length)
153
+ out.push(omitted(cleared.length - lines.length));
154
+ return out.join("\n").slice(0, Math.max(maxChars, 0));
155
+ }
@@ -0,0 +1,21 @@
1
+ import type { PinnedFact } from "./types.js";
2
+ /** Minimal message shape (Pi session messages); only role and content are read. */
3
+ export type LooseMessage = {
4
+ role?: unknown;
5
+ content?: unknown;
6
+ toolName?: unknown;
7
+ [key: string]: unknown;
8
+ };
9
+ export type RankedPinnedFact = PinnedFact & {
10
+ count: number;
11
+ score: number;
12
+ };
13
+ export type ExtractPinnedOptions = {
14
+ maxFactsPerMessage?: number;
15
+ maxFacts?: number;
16
+ maxLinesPerMessage?: number;
17
+ maxLineChars?: number;
18
+ noiseThreshold?: number;
19
+ };
20
+ export declare function extractPinnedFacts(messages: readonly LooseMessage[], options?: ExtractPinnedOptions): RankedPinnedFact[];
21
+ export declare function renderPinned(facts: readonly PinnedFact[], maxChars: number): string;