stageflow 0.42.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.
- package/README.md +12 -3
- package/dist/agent/activity.d.ts +18 -0
- package/dist/agent/claudeAdapter.js +7 -0
- package/dist/agent/claudeTools.d.ts +27 -18
- package/dist/agent/claudeTools.js +54 -15
- package/dist/agent/compactionEvents.d.ts +34 -0
- package/dist/agent/compactionEvents.js +37 -0
- package/dist/agent/openRouterRouting.d.ts +7 -0
- package/dist/agent/openRouterRouting.js +23 -0
- package/dist/agent/piAdapter.d.ts +6 -0
- package/dist/agent/piAdapter.js +128 -27
- package/dist/agent/piSettings.d.ts +7 -0
- package/dist/agent/piSettings.js +9 -0
- package/dist/agent/sandboxPiTools.d.ts +3 -1
- package/dist/agent/sandboxPiTools.js +8 -2
- package/dist/agent/stageTurnDriver.d.ts +11 -2
- package/dist/agent/stageTurnDriver.js +45 -4
- package/dist/agent/toolOutputBudget.d.ts +15 -1
- package/dist/agent/toolOutputBudget.js +18 -0
- package/dist/agent/toolOutputBudgetExtension.d.ts +2 -0
- package/dist/agent/toolOutputBudgetExtension.js +40 -3
- package/dist/agents/authorChat.d.ts +1 -0
- package/dist/agents/authorChat.js +7 -0
- package/dist/agents/authorSessionStore.d.ts +3 -0
- package/dist/agents/authorSessionStore.js +17 -2
- package/dist/agents/hostContext.d.ts +1 -1
- package/dist/agents/runtime/piRuntime.d.ts +5 -1
- package/dist/agents/runtime/piRuntime.js +46 -12
- package/dist/agents/service.js +3 -2
- package/dist/agents/sessions.js +3 -1
- package/dist/compaction/directives.d.ts +18 -0
- package/dist/compaction/directives.js +119 -0
- package/dist/compaction/extension.d.ts +20 -0
- package/dist/compaction/extension.js +78 -0
- package/dist/compaction/mask.d.ts +18 -0
- package/dist/compaction/mask.js +155 -0
- package/dist/compaction/pin.d.ts +21 -0
- package/dist/compaction/pin.js +270 -0
- package/dist/compaction/scrub.d.ts +7 -0
- package/dist/compaction/scrub.js +26 -0
- package/dist/compaction/sessionWiring.d.ts +22 -0
- package/dist/compaction/sessionWiring.js +26 -0
- package/dist/compaction/summarize.d.ts +79 -0
- package/dist/compaction/summarize.js +171 -0
- package/dist/compaction/toolPolicy.d.ts +3 -0
- package/dist/compaction/toolPolicy.js +33 -0
- package/dist/compaction/types.d.ts +45 -0
- package/dist/compaction/types.js +7 -0
- package/dist/compaction/workingState.d.ts +56 -0
- package/dist/compaction/workingState.js +198 -0
- package/dist/config/createPipeline.js +2 -0
- package/dist/config/createTrigger.js +7 -1
- package/dist/config/ensureCatalogScanRoot.d.ts +2 -0
- package/dist/config/ensureCatalogScanRoot.js +6 -0
- package/dist/config/evalCatalog.js +30 -2
- package/dist/config/githubTriggerAction.d.ts +8 -0
- package/dist/config/githubTriggerAction.js +29 -0
- package/dist/config/hostConfig.js +2 -0
- package/dist/config/loadEval.js +21 -3
- package/dist/config/pipelineNeeds.d.ts +2 -0
- package/dist/config/pipelineNeeds.js +16 -3
- package/dist/config/pipelineRoute.js +5 -4
- package/dist/config/validateCatalog.d.ts +1 -1
- package/dist/config/validateCatalog.js +12 -0
- package/dist/config/validateEval.js +43 -2
- package/dist/config/writeEval.js +2 -2
- package/dist/envelope/assertEmittedArtifacts.d.ts +12 -0
- package/dist/envelope/assertEmittedArtifacts.js +43 -0
- package/dist/envelope/preEmitChecks.d.ts +3 -0
- package/dist/evals/constants.d.ts +3 -1
- package/dist/evals/constants.js +3 -1
- package/dist/evals/engine/FakeEngine.d.ts +1 -1
- package/dist/evals/engine/FakeEngine.js +2 -1
- package/dist/evals/engine/promptfoo/PromptfooEngine.d.ts +1 -1
- package/dist/evals/engine/promptfoo/PromptfooEngine.js +2 -1
- package/dist/evals/engine/promptfoo/generate.d.ts +1 -1
- package/dist/evals/engine/promptfoo/generate.js +11 -8
- package/dist/evals/engine/promptfoo/rubricPrompt.d.ts +1 -1
- package/dist/evals/engine/promptfoo/rubricPrompt.js +5 -3
- package/dist/evals/manager.d.ts +13 -0
- package/dist/evals/manager.js +10 -2
- package/dist/evals/plan.d.ts +8 -1
- package/dist/evals/plan.js +28 -9
- package/dist/evals/planInternalAgent.d.ts +19 -0
- package/dist/evals/planInternalAgent.js +205 -0
- package/dist/evals/read/api.d.ts +12 -0
- package/dist/evals/read/api.js +5 -0
- package/dist/evals/read/list.js +10 -1
- package/dist/evals/read/runs.d.ts +5 -0
- package/dist/evals/read/runs.js +7 -1
- package/dist/evals/runner/caseRunner.d.ts +2 -1
- package/dist/evals/runner/caseRunner.js +16 -5
- package/dist/evals/runner/internalAgentCaseRunner.d.ts +6 -0
- package/dist/evals/runner/internalAgentCaseRunner.js +250 -0
- package/dist/evals/snapshot.d.ts +10 -2
- package/dist/evals/snapshot.js +8 -3
- package/dist/evals/types.d.ts +12 -2
- package/dist/evals/types.js +4 -1
- package/dist/guide/cardContract.d.ts +133 -0
- package/dist/guide/cardContract.js +156 -0
- package/dist/guide/chat.d.ts +45 -0
- package/dist/guide/chat.js +378 -0
- package/dist/guide/knowledge/index.d.ts +14 -0
- package/dist/guide/knowledge/index.js +109 -0
- package/dist/guide/knowledge/topics/agents.d.ts +2 -0
- package/dist/guide/knowledge/topics/agents.js +58 -0
- package/dist/guide/knowledge/topics/bestPractices.d.ts +2 -0
- package/dist/guide/knowledge/topics/bestPractices.js +67 -0
- package/dist/guide/knowledge/topics/connections.d.ts +2 -0
- package/dist/guide/knowledge/topics/connections.js +66 -0
- package/dist/guide/knowledge/topics/consoleMap.d.ts +2 -0
- package/dist/guide/knowledge/topics/consoleMap.js +55 -0
- package/dist/guide/knowledge/topics/evals.d.ts +2 -0
- package/dist/guide/knowledge/topics/evals.js +72 -0
- package/dist/guide/knowledge/topics/limitations.d.ts +2 -0
- package/dist/guide/knowledge/topics/limitations.js +84 -0
- package/dist/guide/knowledge/topics/mcpSkillsBrowser.d.ts +2 -0
- package/dist/guide/knowledge/topics/mcpSkillsBrowser.js +57 -0
- package/dist/guide/knowledge/topics/memories.d.ts +2 -0
- package/dist/guide/knowledge/topics/memories.js +63 -0
- package/dist/guide/knowledge/topics/modelsAndProviders.d.ts +2 -0
- package/dist/guide/knowledge/topics/modelsAndProviders.js +56 -0
- package/dist/guide/knowledge/topics/overview.d.ts +2 -0
- package/dist/guide/knowledge/topics/overview.js +56 -0
- package/dist/guide/knowledge/topics/pipelines.d.ts +2 -0
- package/dist/guide/knowledge/topics/pipelines.js +93 -0
- package/dist/guide/knowledge/topics/stages.d.ts +2 -0
- package/dist/guide/knowledge/topics/stages.js +54 -0
- package/dist/guide/knowledge/topics/tasks.d.ts +2 -0
- package/dist/guide/knowledge/topics/tasks.js +52 -0
- package/dist/guide/knowledge/topics/triggers.d.ts +2 -0
- package/dist/guide/knowledge/topics/triggers.js +68 -0
- package/dist/guide/knowledge/topics/troubleshooting.d.ts +2 -0
- package/dist/guide/knowledge/topics/troubleshooting.js +85 -0
- package/dist/guide/knowledgeTools.d.ts +2 -0
- package/dist/guide/knowledgeTools.js +56 -0
- package/dist/guide/showUi.d.ts +6 -0
- package/dist/guide/showUi.js +546 -0
- package/dist/guide/threadStore.d.ts +48 -0
- package/dist/guide/threadStore.js +189 -0
- package/dist/guide/writeRoot.d.ts +11 -0
- package/dist/guide/writeRoot.js +70 -0
- package/dist/hosted/translate.js +2 -0
- package/dist/mcp/agentTools.js +12 -0
- package/dist/mcp/catalogTools.js +18 -20
- package/dist/mcp/catalogWriteTools.d.ts +8 -0
- package/dist/mcp/catalogWriteTools.js +225 -0
- package/dist/mcp/connectionTools.d.ts +3 -0
- package/dist/mcp/connectionTools.js +85 -0
- package/dist/mcp/controlTools.js +34 -1
- package/dist/mcp/deps.d.ts +9 -0
- package/dist/mcp/evalTools.js +684 -21
- package/dist/mcp/memoryHostTools.d.ts +3 -0
- package/dist/mcp/memoryHostTools.js +72 -0
- package/dist/mcp/pipelineAuthorTools.js +14 -1
- package/dist/mcp/server.js +5 -0
- package/dist/mcp/tools.js +6 -0
- package/dist/mcp/triggerTools.js +77 -31
- package/dist/operatorAgent/evalGate.d.ts +22 -0
- package/dist/operatorAgent/evalGate.js +77 -0
- package/dist/operatorAgent/fakeHost.js +10 -2
- package/dist/operatorAgent/host.js +18 -2
- package/dist/operatorAgent/index.d.ts +1 -0
- package/dist/operatorAgent/index.js +1 -0
- package/dist/operatorAgent/internalAgents.d.ts +11 -0
- package/dist/operatorAgent/internalAgents.js +13 -0
- package/dist/operatorAgent/piModel.d.ts +5 -1
- package/dist/operatorAgent/piModel.js +15 -10
- package/dist/operatorAgent/profiles/agentAuthor.js +66 -22
- package/dist/operatorAgent/profiles/agentAuthorPlaybook.d.ts +1 -1
- package/dist/operatorAgent/profiles/agentAuthorPlaybook.js +1 -1
- package/dist/operatorAgent/profiles/guideConfirm.d.ts +21 -0
- package/dist/operatorAgent/profiles/guideConfirm.js +100 -0
- package/dist/operatorAgent/profiles/guideTools.d.ts +7 -0
- package/dist/operatorAgent/profiles/guideTools.js +123 -0
- package/dist/operatorAgent/profiles/stageflowGuide.d.ts +7 -0
- package/dist/operatorAgent/profiles/stageflowGuide.js +132 -0
- package/dist/operatorAgent/profiles/workshopAuthor.js +23 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +1 -1
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +9 -1
- package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +2 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.js +197 -9
- package/dist/operatorAgent/types.d.ts +23 -0
- package/dist/package-meta.d.ts +1 -1
- package/dist/package-meta.js +1 -1
- package/dist/runstore/retention.d.ts +2 -1
- package/dist/runstore/retention.js +3 -7
- package/dist/runstore/runStatusClock.d.ts +17 -0
- package/dist/runstore/runStatusClock.js +19 -0
- package/dist/runstore/sqlite/SqliteRunStore.d.ts +1 -0
- package/dist/runstore/sqlite/SqliteRunStore.js +45 -45
- package/dist/runstore/workspaceLayout.js +6 -1
- package/dist/runtime/artifactDiskInspect.d.ts +14 -0
- package/dist/runtime/artifactDiskInspect.js +52 -0
- package/dist/runtime/artifactPath.d.ts +24 -0
- package/dist/runtime/artifactPath.js +84 -0
- package/dist/runtime/completionCheckRunner.js +15 -43
- package/dist/runtime/githubPollSource.d.ts +22 -4
- package/dist/runtime/githubPollSource.js +93 -8
- package/dist/runtime/priorArtifactGrants.d.ts +8 -0
- package/dist/runtime/priorArtifactGrants.js +105 -0
- package/dist/runtime/runActionEligibility.d.ts +46 -0
- package/dist/runtime/runActionEligibility.js +123 -0
- package/dist/runtime/runManager.d.ts +4 -1
- package/dist/runtime/runManager.js +52 -10
- package/dist/runtime/runRetryCoordinator.d.ts +2 -14
- package/dist/runtime/runRetryCoordinator.js +3 -67
- package/dist/runtime/sandboxContainer.d.ts +7 -0
- package/dist/runtime/sandboxContainer.js +48 -6
- package/dist/runtime/sandboxDesk.d.ts +2 -1
- package/dist/runtime/sandboxDesk.js +11 -12
- package/dist/runtime/stageEnvironment.js +1 -0
- package/dist/runtime/stageRoots.d.ts +12 -0
- package/dist/runtime/stageSandbox.d.ts +2 -1
- package/dist/runtime/stageSandbox.js +18 -2
- package/dist/runtime/stageWorker.js +20 -0
- package/dist/server/agentAuthorRoutes.js +12 -3
- package/dist/server/bootstrap.d.ts +5 -0
- package/dist/server/bootstrap.js +14 -1
- package/dist/server/evalRoutes.js +38 -9
- package/dist/server/guideRoutes.d.ts +5 -0
- package/dist/server/guideRoutes.js +166 -0
- package/dist/server/http.d.ts +10 -0
- package/dist/server/http.js +35 -1
- package/dist/server/internalAgentRoutes.d.ts +6 -0
- package/dist/server/internalAgentRoutes.js +12 -0
- package/dist/server/mcpHost.js +2 -0
- package/dist/toolkit/meta.d.ts +1 -1
- package/dist/toolkit/meta.js +39 -1
- package/dist/toolkit/profiles.d.ts +5 -0
- package/dist/toolkit/profiles.js +12 -0
- package/dist/tools/askOperator.js +2 -1
- package/dist/tools/emitStageEnvelope.d.ts +17 -16
- package/dist/tools/emitStageEnvelope.js +46 -32
- package/dist/tools/stageToolNames.d.ts +4 -0
- package/dist/tools/stageToolNames.js +4 -0
- package/dist/tools/workingState.d.ts +40 -0
- package/dist/tools/workingState.js +108 -0
- package/dist/tools/writeStageArtifact.d.ts +0 -9
- package/dist/tools/writeStageArtifact.js +2 -1
- package/dist/ui/assets/{MarkdownText-BTrOqu5J.js → MarkdownText-S5C_vemc.js} +2 -2
- package/dist/ui/assets/adapters-C0l4ruiR.js +17 -0
- package/dist/ui/assets/chat-CjnsmvqR.js +2 -0
- package/dist/ui/assets/chat-DFDd4UjS.css +2 -0
- package/dist/ui/assets/{main-CHlmTNJe.css → main-Del1GeLf.css} +1 -1
- package/dist/ui/assets/main-_yXVqcW9.js +277 -0
- package/dist/ui/chat.html +3 -4
- package/dist/ui/index.html +3 -4
- package/dist/workshop/chatTurn.js +1 -1
- package/dist/workshop/workshopPin.d.ts +3 -3
- package/dist/workshop/workshopPin.js +16 -15
- package/examples/compaction-stress/README.md +30 -0
- package/examples/compaction-stress/check-run.mjs +53 -0
- package/examples/compaction-stress/collect-evidence.yaml +60 -0
- package/examples/compaction-stress/compaction-stress.pipeline.yaml +141 -0
- package/examples/compaction-stress/compaction-stress.task.yaml +15 -0
- package/examples/compaction-stress/generate-evidence.mjs +110 -0
- package/examples/compaction-stress/root-cause.yaml +26 -0
- package/examples/compaction-stress/stageflow.yaml +9 -0
- package/examples/compaction-stress/write-postmortem.yaml +40 -0
- package/examples/evals/README.md +18 -0
- package/examples/evals/guide-behavior.dataset.jsonl +15 -0
- package/examples/evals/guide-behavior.eval.yaml +35 -0
- package/examples/evals/guide-depth.dataset.jsonl +35 -0
- package/examples/evals/guide-depth.eval.yaml +169 -0
- package/examples/memory/evals/guide-behavior.dataset.jsonl +15 -0
- package/examples/memory/evals/guide-behavior.eval.yaml +35 -0
- package/examples/memory/evals/guide-depth.dataset.jsonl +35 -0
- package/examples/memory/evals/guide-depth.eval.yaml +169 -0
- package/package.json +1 -1
- package/dist/ui/assets/AssistantRuntimeProvider-qIX1xNoH.js +0 -9
- package/dist/ui/assets/ReadonlyStore-BfXqHykm.js +0 -6
- package/dist/ui/assets/chat-Df_wCpak.js +0 -5
- package/dist/ui/assets/chat-P7KQznHm.css +0 -2
- package/dist/ui/assets/main-CvVfxmMd.js +0 -271
package/README.md
CHANGED
|
@@ -10,6 +10,15 @@ Open-source runtime for **configurable multi-stage agent workflows** with typed
|
|
|
10
10
|
[](https://github.com/tejasghutukade/stageflow/issues)
|
|
11
11
|
[](https://github.com/tejasghutukade/stageflow/actions/workflows/ci.yml)
|
|
12
12
|
|
|
13
|
+
<p align="center">
|
|
14
|
+
<a href="https://github.com/tejasghutukade/stageflow/releases/download/media/stageflow-demo.mp4"><img src="https://github.com/tejasghutukade/stageflow/releases/download/media/stageflow-demo.gif" alt="Stageflow demo: a pipeline runs, pauses at a human gate, resumes, and finishes in the operator console" width="800"></a>
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<a href="https://github.com/tejasghutukade/stageflow/releases/download/media/stageflow-demo.mp4">Watch the 76s demo (MP4)</a> ·
|
|
19
|
+
<a href="https://github.com/tejasghutukade/stageflow/releases/download/media/stageflow-demo-long.mp4">Full walkthrough (3 min)</a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
13
22
|
Author pipeline-owned YAML in your project. Stageflow schedules each stage in a fresh agent session, moves context through explicit envelopes and artifacts, and persists run state under `.stageflow/`. [Pi](https://github.com/badlogic/pi-mono) is the current agent execution backend. Bins: **`sf`** and **`stageflow`**.
|
|
14
23
|
|
|
15
24
|
## Why Stageflow?
|
|
@@ -58,14 +67,14 @@ See [Architecture](docs/architecture.md) for component boundaries, execution flo
|
|
|
58
67
|
|
|
59
68
|
### Docker (recommended)
|
|
60
69
|
|
|
61
|
-
Run Stageflow from the published image. It is [`ghcr.io/tejasghutukade/stageflow`](https://github.com/tejasghutukade/stageflow/pkgs/container/stageflow). `0.
|
|
70
|
+
Run Stageflow from the published image. It is [`ghcr.io/tejasghutukade/stageflow`](https://github.com/tejasghutukade/stageflow/pkgs/container/stageflow). `0.42` is the current minor tag (`0.42.0` is that exact release).
|
|
62
71
|
|
|
63
72
|
```bash
|
|
64
73
|
docker run --rm --name stageflow \
|
|
65
74
|
-e STAGEFLOW_ALLOW_UNAUTHENTICATED_BIND=1 \
|
|
66
75
|
-p 127.0.0.1:3847:3847 \
|
|
67
76
|
-v stageflow-data:/data \
|
|
68
|
-
ghcr.io/tejasghutukade/stageflow:0.
|
|
77
|
+
ghcr.io/tejasghutukade/stageflow:0.42 \
|
|
69
78
|
sf ui
|
|
70
79
|
```
|
|
71
80
|
|
|
@@ -82,7 +91,7 @@ docker run --rm --name stageflow \
|
|
|
82
91
|
-p 127.0.0.1:3847:3847 \
|
|
83
92
|
-v stageflow-data:/data \
|
|
84
93
|
-v "$PWD":/project \
|
|
85
|
-
ghcr.io/tejasghutukade/stageflow:0.
|
|
94
|
+
ghcr.io/tejasghutukade/stageflow:0.42 \
|
|
86
95
|
sf ui
|
|
87
96
|
```
|
|
88
97
|
|
package/dist/agent/activity.d.ts
CHANGED
|
@@ -43,6 +43,24 @@ export type StageActivityEvent = {
|
|
|
43
43
|
event: "message";
|
|
44
44
|
role: string;
|
|
45
45
|
text?: string;
|
|
46
|
+
} | {
|
|
47
|
+
event: "context_usage";
|
|
48
|
+
/** Estimated tokens in the model's context after the latest response. */
|
|
49
|
+
tokens: number;
|
|
50
|
+
contextWindow: number;
|
|
51
|
+
/** Whole-number share of the window, 0-100. */
|
|
52
|
+
percent: number;
|
|
53
|
+
} | {
|
|
54
|
+
event: "context_compacted";
|
|
55
|
+
reason: "manual" | "threshold" | "overflow";
|
|
56
|
+
tokensBefore: number;
|
|
57
|
+
/** Best estimate after compaction; null if unknown. */
|
|
58
|
+
tokensAfter: number | null;
|
|
59
|
+
summaryChars: number;
|
|
60
|
+
costUsd: number;
|
|
61
|
+
willRetry: boolean;
|
|
62
|
+
aborted: boolean;
|
|
63
|
+
error?: string;
|
|
46
64
|
} | {
|
|
47
65
|
event: "operator_prompt";
|
|
48
66
|
prompt: AskOperatorPrompt;
|
|
@@ -225,7 +225,13 @@ async function runTurn(input, model, markerPath, promptText, resumeSessionId, us
|
|
|
225
225
|
preEmitCheckOptions: {
|
|
226
226
|
checks: input.stage.pre_emit_checks,
|
|
227
227
|
readQaTrail: input.readQaTrail,
|
|
228
|
+
artifactPresence: {
|
|
229
|
+
runWorkspaceDir: input.roots.runWorkspaceDir,
|
|
230
|
+
stageId: runtimeStageId(input),
|
|
231
|
+
attempt: input.roots.attempt ?? 1,
|
|
232
|
+
},
|
|
228
233
|
},
|
|
234
|
+
feedbackLoopEmitContext: input.feedbackLoopEmitContext,
|
|
229
235
|
writeStageArtifact: {
|
|
230
236
|
runWorkspaceDir: input.roots.runWorkspaceDir,
|
|
231
237
|
stageId: runtimeStageId(input),
|
|
@@ -255,6 +261,7 @@ async function runTurn(input, model, markerPath, promptText, resumeSessionId, us
|
|
|
255
261
|
model,
|
|
256
262
|
systemPrompt: { type: "custom", prompt: input.stage.system_prompt },
|
|
257
263
|
settingSources: [],
|
|
264
|
+
settings: { autoCompactEnabled: true },
|
|
258
265
|
tools: CLAUDE_BUILTIN_TOOLS,
|
|
259
266
|
mcpServers: { [STAGEFLOW_MCP_SERVER_NAME]: mcpServer, ...passedServers },
|
|
260
267
|
permissionMode: "bypassPermissions",
|
|
@@ -30,6 +30,7 @@ import { type EmitCapture } from "../tools/emitStageEnvelope.js";
|
|
|
30
30
|
import { type WriteStageArtifactOptions } from "../tools/writeStageArtifact.js";
|
|
31
31
|
import { type AskOperatorKind, type AskOperatorPrompt } from "../tools/askOperator.js";
|
|
32
32
|
import type { CloneEmitContext, ForkEmitContext } from "../types/forkChoice.js";
|
|
33
|
+
import type { FeedbackLoopConfig } from "../types/pipeline.js";
|
|
33
34
|
import type { PreEmitCheckOptions } from "../envelope/preEmitChecks.js";
|
|
34
35
|
import { execInSandboxContainer as defaultExecInSandboxContainer } from "../runtime/sandboxContainer.js";
|
|
35
36
|
export declare const STAGEFLOW_MCP_SERVER_NAME = "stageflow";
|
|
@@ -43,35 +44,42 @@ export declare const SANDBOX_EDIT_TOOL_NAME = "mcp__stageflow__sandbox_edit";
|
|
|
43
44
|
export type AskOperatorCapture = {
|
|
44
45
|
prompt?: AskOperatorPrompt;
|
|
45
46
|
};
|
|
46
|
-
/**
|
|
47
|
-
* Exported so a parity test can assert this stays field-for-field aligned
|
|
48
|
-
* with `tools/emitStageEnvelope.ts`'s typebox schema — the two are hand
|
|
49
|
-
* written against the same envelope shape with no shared source, so
|
|
50
|
-
* nothing else catches one drifting from the other.
|
|
51
|
-
*
|
|
52
|
-
* Field presence mirrors the typebox schema's own conditionality:
|
|
53
|
-
* `fork_choice` is required (not just present) when the stage has a fork
|
|
54
|
-
* to route.
|
|
55
|
-
*/
|
|
56
47
|
export declare function buildEmitStageEnvelopeShape(options: {
|
|
57
48
|
forkEmitContext?: ForkEmitContext;
|
|
58
49
|
cloneEmitContext?: CloneEmitContext;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
success: "success";
|
|
63
|
-
}>;
|
|
50
|
+
payloadSchema?: unknown;
|
|
51
|
+
feedbackLoopEmitContext?: FeedbackLoopConfig;
|
|
52
|
+
}): z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
64
53
|
summary: z.ZodString;
|
|
65
54
|
artifacts: z.ZodArray<z.ZodString>;
|
|
66
|
-
|
|
55
|
+
checklist_attestations: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
56
|
+
check_id: z.ZodString;
|
|
57
|
+
items: z.ZodArray<z.ZodString>;
|
|
58
|
+
}, z.core.$strict>>>;
|
|
59
|
+
stage_id: z.ZodOptional<z.ZodString>;
|
|
60
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
61
|
+
status: z.ZodLiteral<"success">;
|
|
62
|
+
payload: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
|
|
67
63
|
fork_choice: z.ZodArray<z.ZodString> | z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
64
|
+
feedback_loop?: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
65
|
+
action: z.ZodLiteral<"continue">;
|
|
66
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
67
|
+
action: z.ZodLiteral<"send_back">;
|
|
68
|
+
target: z.ZodLiteral<string>;
|
|
69
|
+
}, z.core.$strict>], "action"> | undefined;
|
|
70
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
71
|
+
summary: z.ZodString;
|
|
72
|
+
artifacts: z.ZodArray<z.ZodString>;
|
|
68
73
|
checklist_attestations: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
69
74
|
check_id: z.ZodString;
|
|
70
75
|
items: z.ZodArray<z.ZodString>;
|
|
71
|
-
}, z.core.$
|
|
76
|
+
}, z.core.$strict>>>;
|
|
72
77
|
stage_id: z.ZodOptional<z.ZodString>;
|
|
73
78
|
notes: z.ZodOptional<z.ZodString>;
|
|
74
|
-
|
|
79
|
+
fork_choice: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
80
|
+
status: z.ZodLiteral<"failure">;
|
|
81
|
+
payload: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
|
|
82
|
+
}, z.core.$strict>], "status">;
|
|
75
83
|
/** Exported for the same parity-test reason as `emitStageEnvelopeShape` above. */
|
|
76
84
|
export declare const writeStageArtifactShape: {
|
|
77
85
|
path: z.ZodString;
|
|
@@ -89,6 +97,7 @@ export declare function buildStageflowMcpServer(options: {
|
|
|
89
97
|
forkEmitContext?: ForkEmitContext;
|
|
90
98
|
cloneEmitContext?: CloneEmitContext;
|
|
91
99
|
preEmitCheckOptions?: PreEmitCheckOptions;
|
|
100
|
+
feedbackLoopEmitContext?: FeedbackLoopConfig;
|
|
92
101
|
writeStageArtifact: WriteStageArtifactOptions;
|
|
93
102
|
askOperator?: {
|
|
94
103
|
capture: AskOperatorCapture;
|
|
@@ -49,24 +49,61 @@ export const SANDBOX_EDIT_TOOL_NAME = `mcp__${STAGEFLOW_MCP_SERVER_NAME}__sandbo
|
|
|
49
49
|
* `fork_choice` is required (not just present) when the stage has a fork
|
|
50
50
|
* to route.
|
|
51
51
|
*/
|
|
52
|
+
function feedbackLoopShape(context) {
|
|
53
|
+
return z.discriminatedUnion("action", [
|
|
54
|
+
z.strictObject({ action: z.literal("continue") }),
|
|
55
|
+
z.strictObject({
|
|
56
|
+
action: z.literal("send_back"),
|
|
57
|
+
target: z.literal(context.target),
|
|
58
|
+
}),
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
function payloadShape(payloadSchema, required) {
|
|
62
|
+
const base = payloadSchema === undefined
|
|
63
|
+
? z.record(z.string(), z.unknown())
|
|
64
|
+
: z.fromJSONSchema(payloadSchema);
|
|
65
|
+
return required ? base : base.optional();
|
|
66
|
+
}
|
|
52
67
|
export function buildEmitStageEnvelopeShape(options) {
|
|
53
|
-
|
|
54
|
-
|
|
68
|
+
const forkRequired = options.forkEmitContext !== undefined && options.feedbackLoopEmitContext === undefined;
|
|
69
|
+
const attestations = z
|
|
70
|
+
.array(z.strictObject({
|
|
71
|
+
check_id: z.string().min(1),
|
|
72
|
+
items: z.array(z.string()),
|
|
73
|
+
}))
|
|
74
|
+
.optional();
|
|
75
|
+
const shared = {
|
|
55
76
|
summary: z.string().min(1),
|
|
56
77
|
artifacts: z.array(z.string()),
|
|
57
|
-
|
|
58
|
-
fork_choice: options.forkEmitContext !== undefined
|
|
59
|
-
? z.array(z.string())
|
|
60
|
-
: z.array(z.string()).optional(),
|
|
61
|
-
checklist_attestations: z
|
|
62
|
-
.array(z.object({
|
|
63
|
-
check_id: z.string().min(1),
|
|
64
|
-
items: z.array(z.string()),
|
|
65
|
-
}))
|
|
66
|
-
.optional(),
|
|
78
|
+
checklist_attestations: attestations,
|
|
67
79
|
stage_id: z.string().optional(),
|
|
68
80
|
notes: z.string().optional(),
|
|
81
|
+
fork_choice: z.array(z.string()).optional(),
|
|
69
82
|
};
|
|
83
|
+
return z.discriminatedUnion("status", [
|
|
84
|
+
z.strictObject({
|
|
85
|
+
status: z.literal("success"),
|
|
86
|
+
...shared,
|
|
87
|
+
payload: payloadShape(options.payloadSchema, options.payloadSchema !== undefined),
|
|
88
|
+
fork_choice: forkRequired ? z.array(z.string()) : z.array(z.string()).optional(),
|
|
89
|
+
...(options.feedbackLoopEmitContext !== undefined
|
|
90
|
+
? { feedback_loop: feedbackLoopShape(options.feedbackLoopEmitContext) }
|
|
91
|
+
: {}),
|
|
92
|
+
}),
|
|
93
|
+
z.strictObject({
|
|
94
|
+
status: z.literal("failure"),
|
|
95
|
+
...shared,
|
|
96
|
+
payload: payloadShape(options.payloadSchema, false),
|
|
97
|
+
}),
|
|
98
|
+
]);
|
|
99
|
+
}
|
|
100
|
+
function asClaudeObjectSchema(schema) {
|
|
101
|
+
const json = z.toJSONSchema(schema);
|
|
102
|
+
delete json.$schema;
|
|
103
|
+
const target = schema;
|
|
104
|
+
target._zod.def.type = "object";
|
|
105
|
+
target._zod.toJSONSchema = () => json;
|
|
106
|
+
return schema;
|
|
70
107
|
}
|
|
71
108
|
/** Exported for the same parity-test reason as `emitStageEnvelopeShape` above. */
|
|
72
109
|
export const writeStageArtifactShape = {
|
|
@@ -207,12 +244,14 @@ function buildSandboxEditTool(options) {
|
|
|
207
244
|
});
|
|
208
245
|
}
|
|
209
246
|
export function buildStageflowMcpServer(options) {
|
|
210
|
-
const emitDef = createEmitStageEnvelopeTool(options.capture, options.payloadSchema, options.forkEmitContext, options.cloneEmitContext, options.preEmitCheckOptions);
|
|
247
|
+
const emitDef = createEmitStageEnvelopeTool(options.capture, options.payloadSchema, options.forkEmitContext, options.cloneEmitContext, options.preEmitCheckOptions, options.feedbackLoopEmitContext);
|
|
211
248
|
const artifactDef = createWriteStageArtifactTool(options.writeStageArtifact);
|
|
212
|
-
const emitTool = tool(emitDef.name, emitDef.description, buildEmitStageEnvelopeShape({
|
|
249
|
+
const emitTool = tool(emitDef.name, emitDef.description, asClaudeObjectSchema(buildEmitStageEnvelopeShape({
|
|
213
250
|
forkEmitContext: options.forkEmitContext,
|
|
214
251
|
cloneEmitContext: options.cloneEmitContext,
|
|
215
|
-
|
|
252
|
+
payloadSchema: options.payloadSchema,
|
|
253
|
+
feedbackLoopEmitContext: options.feedbackLoopEmitContext,
|
|
254
|
+
})), async (args) => toCallToolResult(await emitDef.execute("claude-tool-call", args)));
|
|
216
255
|
const artifactTool = tool(artifactDef.name, artifactDef.description, writeStageArtifactShape, async (args) => toCallToolResult(await artifactDef.execute("claude-tool-call", args)));
|
|
217
256
|
const tools = [emitTool, artifactTool];
|
|
218
257
|
if (options.askOperator) {
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { StageActivityEvent } from "./activity.js";
|
|
2
|
+
import { type StageUsage } from "../types/usage.js";
|
|
3
|
+
export type CompactionEndSessionEvent = {
|
|
4
|
+
type: "compaction_end";
|
|
5
|
+
reason: "manual" | "threshold" | "overflow";
|
|
6
|
+
result?: {
|
|
7
|
+
summary?: string;
|
|
8
|
+
tokensBefore?: number;
|
|
9
|
+
estimatedTokensAfter?: number;
|
|
10
|
+
usage?: CompactionUsage;
|
|
11
|
+
};
|
|
12
|
+
aborted?: boolean;
|
|
13
|
+
willRetry?: boolean;
|
|
14
|
+
errorMessage?: string;
|
|
15
|
+
};
|
|
16
|
+
export type CompactionUsage = {
|
|
17
|
+
input?: number;
|
|
18
|
+
output?: number;
|
|
19
|
+
cacheRead?: number;
|
|
20
|
+
cacheWrite?: number;
|
|
21
|
+
cost?: {
|
|
22
|
+
total?: number;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export type CompactionCost = {
|
|
26
|
+
inputTokens: number;
|
|
27
|
+
outputTokens: number;
|
|
28
|
+
costUsd: number;
|
|
29
|
+
};
|
|
30
|
+
export declare function compactionUsageCost(event: CompactionEndSessionEvent): CompactionCost;
|
|
31
|
+
export declare function compactionActivityEvent(event: CompactionEndSessionEvent, tokensAfter: number | null): Extract<StageActivityEvent, {
|
|
32
|
+
event: "context_compacted";
|
|
33
|
+
}>;
|
|
34
|
+
export declare function addCompactionUsage(usage: StageUsage, model: string | undefined, event: CompactionEndSessionEvent): void;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { redactSecrets } from "./streamLogRedact.js";
|
|
2
|
+
import { addModelUsage } from "../types/usage.js";
|
|
3
|
+
export function compactionUsageCost(event) {
|
|
4
|
+
const u = event.result?.usage;
|
|
5
|
+
return {
|
|
6
|
+
inputTokens: Number.isFinite(u?.input) ? u.input : 0,
|
|
7
|
+
outputTokens: Number.isFinite(u?.output) ? u.output : 0,
|
|
8
|
+
costUsd: Number.isFinite(u?.cost?.total) ? u.cost.total : 0,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function compactionActivityEvent(event, tokensAfter) {
|
|
12
|
+
const result = event.result;
|
|
13
|
+
return {
|
|
14
|
+
event: "context_compacted",
|
|
15
|
+
reason: event.reason,
|
|
16
|
+
tokensBefore: result?.tokensBefore ?? 0,
|
|
17
|
+
tokensAfter: tokensAfter ?? result?.estimatedTokensAfter ?? null,
|
|
18
|
+
summaryChars: result?.summary?.length ?? 0,
|
|
19
|
+
costUsd: compactionUsageCost(event).costUsd,
|
|
20
|
+
willRetry: event.willRetry ?? false,
|
|
21
|
+
aborted: event.aborted ?? false,
|
|
22
|
+
...(event.errorMessage ? { error: redactSecrets(event.errorMessage) } : {}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function addCompactionUsage(usage, model, event) {
|
|
26
|
+
const u = event.result?.usage;
|
|
27
|
+
if (!u)
|
|
28
|
+
return;
|
|
29
|
+
const finite = (n) => (typeof n === "number" && Number.isFinite(n) ? n : 0);
|
|
30
|
+
addModelUsage(usage, model ?? "unknown", {
|
|
31
|
+
inputTokens: finite(u.input),
|
|
32
|
+
outputTokens: finite(u.output),
|
|
33
|
+
cacheReadInputTokens: finite(u.cacheRead),
|
|
34
|
+
cacheCreationInputTokens: finite(u.cacheWrite),
|
|
35
|
+
costUsd: finite(u.cost?.total),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ExtensionFactory } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
/**
|
|
3
|
+
* OpenRouter load-balances a model across providers, and providers differ in tool-call support. On any
|
|
4
|
+
* request that carries tools, ask OpenRouter to skip providers that cannot honour them. Routing the Host
|
|
5
|
+
* set in models.json (`openRouterRouting`) wins over this default.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createOpenRouterRoutingExtension(): ExtensionFactory;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function isOpenRouter(model) {
|
|
2
|
+
return model?.provider === "openrouter" || (typeof model?.baseUrl === "string" && model.baseUrl.includes("openrouter.ai"));
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* OpenRouter load-balances a model across providers, and providers differ in tool-call support. On any
|
|
6
|
+
* request that carries tools, ask OpenRouter to skip providers that cannot honour them. Routing the Host
|
|
7
|
+
* set in models.json (`openRouterRouting`) wins over this default.
|
|
8
|
+
*/
|
|
9
|
+
export function createOpenRouterRoutingExtension() {
|
|
10
|
+
return (pi) => {
|
|
11
|
+
pi.on("before_provider_request", (event, ctx) => {
|
|
12
|
+
const payload = event.payload;
|
|
13
|
+
if (payload === null || typeof payload !== "object")
|
|
14
|
+
return undefined;
|
|
15
|
+
if (!Array.isArray(payload.tools) || payload.tools.length === 0)
|
|
16
|
+
return undefined;
|
|
17
|
+
if (!isOpenRouter(ctx.model))
|
|
18
|
+
return undefined;
|
|
19
|
+
const existing = payload.provider !== null && typeof payload.provider === "object" ? payload.provider : {};
|
|
20
|
+
return { ...payload, provider: { require_parameters: true, ...existing } };
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -75,6 +75,12 @@ export type RouteSessionEventToProgressOptions = {
|
|
|
75
75
|
*/
|
|
76
76
|
export declare function routeSessionEventToProgress(event: Record<string, unknown>, options: RouteSessionEventToProgressOptions): void;
|
|
77
77
|
export declare function composeStageUserPrompt(input: StageRunInput, emitToolName: string, emitHintOverride?: string, artifactToolName?: string): string;
|
|
78
|
+
/**
|
|
79
|
+
* Pi stages carry the whole assignment (task, prior envelopes, envelope
|
|
80
|
+
* contract, guidance) in the system prompt: compaction never summarizes it.
|
|
81
|
+
*/
|
|
82
|
+
export declare function composeStagePiSystemPrompt(input: StageRunInput, emitToolName: string, emitHintOverride?: string, artifactToolName?: string): string;
|
|
83
|
+
export declare function composeStagePiKickoffPrompt(input: StageRunInput): string;
|
|
78
84
|
export declare function composeFeedbackResumePrompt(input: StageRunInput): string;
|
|
79
85
|
export declare function mcpToolMetadataMissing(loader: DefaultResourceLoader): boolean;
|
|
80
86
|
export declare function collectMcpExtensionToolNames(loader: DefaultResourceLoader): {
|