@revisium/orchestrator 0.1.0-alpha.5 → 0.1.0-alpha.6
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 +149 -1
- package/dist/api/graphql-api/filters/agent-observability-exception.filter.js +24 -0
- package/dist/api/graphql-api/filters/agent-observability-exception.filter.js.map +1 -0
- package/dist/api/graphql-api/graphql-api.module.js +2 -0
- package/dist/api/graphql-api/graphql-api.module.js.map +1 -1
- package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js +296 -0
- package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-bridge.service.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js +64 -0
- package/dist/api/graphql-api/graphql-ws/agent-observability-subscription-mappers.js.map +1 -0
- package/dist/api/graphql-api/graphql-ws/constants.js +2 -0
- package/dist/api/graphql-api/graphql-ws/constants.js.map +1 -1
- package/dist/api/graphql-api/graphql-ws/pubsub.module.js +5 -2
- package/dist/api/graphql-api/graphql-ws/pubsub.module.js.map +1 -1
- package/dist/api/graphql-api/registerGraphqlEnums.js +6 -1
- package/dist/api/graphql-api/registerGraphqlEnums.js.map +1 -1
- package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js +48 -0
- package/dist/api/graphql-api/runs/inputs/get-agent-log.input.js.map +1 -0
- package/dist/api/graphql-api/runs/model/agent-activity.model.js +367 -0
- package/dist/api/graphql-api/runs/model/agent-activity.model.js.map +1 -0
- package/dist/api/graphql-api/runs/runs-subscription.resolver.js +35 -4
- package/dist/api/graphql-api/runs/runs-subscription.resolver.js.map +1 -1
- package/dist/api/graphql-api/runs/runs.resolver.js +35 -0
- package/dist/api/graphql-api/runs/runs.resolver.js.map +1 -1
- package/dist/cli/commands/doctor-report.js +39 -0
- package/dist/cli/commands/doctor-report.js.map +1 -0
- package/dist/cli/commands/lifecycle.js +237 -0
- package/dist/cli/commands/lifecycle.js.map +1 -0
- package/dist/cli/commands/mcp.js +46 -8
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/revisium-helpers.js +2 -2
- package/dist/cli/index.js +5 -29
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/program.js +7 -23
- package/dist/cli/program.js.map +1 -1
- package/dist/config.js +42 -5
- package/dist/config.js.map +1 -1
- package/dist/control-plane/bootstrap.js +93 -0
- package/dist/control-plane/bootstrap.js.map +1 -0
- package/dist/control-plane/schema-migration.js +7 -11
- package/dist/control-plane/schema-migration.js.map +1 -1
- package/dist/control-plane/seed-default-playbook.js +23 -0
- package/dist/control-plane/seed-default-playbook.js.map +1 -1
- package/dist/e2e/kit/agents.js +17 -5
- package/dist/e2e/kit/agents.js.map +1 -1
- package/dist/e2e/kit/assertions.js +20 -0
- package/dist/e2e/kit/assertions.js.map +1 -1
- package/dist/e2e/kit/harness.js +12 -1
- package/dist/e2e/kit/harness.js.map +1 -1
- package/dist/e2e/kit/scenarios.js +1 -1
- package/dist/e2e/recovery-dd-crash-child.js +3 -2
- package/dist/e2e/recovery-dd-crash-child.js.map +1 -1
- package/dist/engine/dbos.service.js +20 -0
- package/dist/engine/dbos.service.js.map +1 -1
- package/dist/engine/ensure-postgres.js +11 -9
- package/dist/engine/ensure-postgres.js.map +1 -1
- package/dist/features/runs/queries/handlers/runs-query.handlers.js +135 -0
- package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -1
- package/dist/features/runs/queries/impl/get-agent-activity.query.js +7 -0
- package/dist/features/runs/queries/impl/get-agent-activity.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-agent-attempts.query.js +7 -0
- package/dist/features/runs/queries/impl/get-agent-attempts.query.js.map +1 -0
- package/dist/features/runs/queries/impl/get-agent-log.query.js +7 -0
- package/dist/features/runs/queries/impl/get-agent-log.query.js.map +1 -0
- package/dist/features/runs/queries/index.js +4 -1
- package/dist/features/runs/queries/index.js.map +1 -1
- package/dist/features/runs/runs-api.service.js +12 -0
- package/dist/features/runs/runs-api.service.js.map +1 -1
- package/dist/host/daemon.js +68 -0
- package/dist/host/daemon.js.map +1 -0
- package/dist/host/ensure-host.js +109 -0
- package/dist/host/ensure-host.js.map +1 -0
- package/dist/host/host-runtime.js +52 -0
- package/dist/host/host-runtime.js.map +1 -0
- package/dist/http/graphql-host.js +8 -2
- package/dist/http/graphql-host.js.map +1 -1
- package/dist/http/graphql-host.module.js +3 -0
- package/dist/http/graphql-host.module.js.map +1 -1
- package/dist/mcp/mcp-capabilities.js +6 -1
- package/dist/mcp/mcp-capabilities.js.map +1 -1
- package/dist/mcp/mcp-facade.service.js +24 -0
- package/dist/mcp/mcp-facade.service.js.map +1 -1
- package/dist/mcp/mcp-http.service.js +95 -0
- package/dist/mcp/mcp-http.service.js.map +1 -0
- package/dist/mcp/mcp-tools.js +58 -0
- package/dist/mcp/mcp-tools.js.map +1 -1
- package/dist/observability/agent-activity-reporter.js +185 -0
- package/dist/observability/agent-activity-reporter.js.map +1 -0
- package/dist/observability/agent-observability.service.js +1142 -0
- package/dist/observability/agent-observability.service.js.map +1 -0
- package/dist/observability/index.js +4 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/types.js +11 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/pipeline/data-driven-task.workflow.js +37 -75
- package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
- package/dist/pipeline/pipeline.service.js +54 -15
- package/dist/pipeline/pipeline.service.js.map +1 -1
- package/dist/pipeline-core/validate-capability.js +23 -0
- package/dist/pipeline-core/validate-capability.js.map +1 -0
- package/dist/pipeline-core/validate-conflicts.js +37 -0
- package/dist/pipeline-core/validate-conflicts.js.map +1 -0
- package/dist/pipeline-core/validate-dataflow.js +180 -0
- package/dist/pipeline-core/validate-dataflow.js.map +1 -0
- package/dist/pipeline-core/validate-diff.js +158 -0
- package/dist/pipeline-core/validate-diff.js.map +1 -0
- package/dist/pipeline-core/validate-edges.js +44 -0
- package/dist/pipeline-core/validate-edges.js.map +1 -0
- package/dist/pipeline-core/validate-graph.js +123 -0
- package/dist/pipeline-core/validate-graph.js.map +1 -0
- package/dist/pipeline-core/validate-loops.js +226 -0
- package/dist/pipeline-core/validate-loops.js.map +1 -0
- package/dist/pipeline-core/validate-parallel.js +132 -0
- package/dist/pipeline-core/validate-parallel.js.map +1 -0
- package/dist/pipeline-core/validate-sink.js +27 -0
- package/dist/pipeline-core/validate-sink.js.map +1 -0
- package/dist/pipeline-core/validate-topology.js +140 -0
- package/dist/pipeline-core/validate-topology.js.map +1 -0
- package/dist/pipeline-core/validate-verdict.js +72 -0
- package/dist/pipeline-core/validate-verdict.js.map +1 -0
- package/dist/pipeline-core/validate.js +34 -1107
- package/dist/pipeline-core/validate.js.map +1 -1
- package/dist/revisium/run.service.js +15 -1
- package/dist/revisium/run.service.js.map +1 -1
- package/dist/runners/codex.service.js +51 -0
- package/dist/runners/codex.service.js.map +1 -0
- package/dist/runners/integrator-branch-naming.js +24 -0
- package/dist/runners/integrator-branch-naming.js.map +1 -0
- package/dist/runners/integrator-git.js +84 -0
- package/dist/runners/integrator-git.js.map +1 -0
- package/dist/runners/integrator-remote.js +34 -0
- package/dist/runners/integrator-remote.js.map +1 -0
- package/dist/runners/integrator-types.js +9 -0
- package/dist/runners/integrator-types.js.map +1 -0
- package/dist/runners/integrator.js +12 -132
- package/dist/runners/integrator.js.map +1 -1
- package/dist/runners/runner.module.js +4 -2
- package/dist/runners/runner.module.js.map +1 -1
- package/dist/smoke/cli.js +47 -0
- package/dist/smoke/cli.js.map +1 -0
- package/dist/smoke/isolation.js +113 -0
- package/dist/smoke/isolation.js.map +1 -0
- package/dist/task-control-plane/task-control-plane-api.service.js +24 -1
- package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
- package/dist/task-control-plane/task-control-plane.module.js +21 -1
- package/dist/task-control-plane/task-control-plane.module.js.map +1 -1
- package/dist/worker/artifact-store.js +6 -1
- package/dist/worker/artifact-store.js.map +1 -1
- package/dist/worker/build-context.js +135 -1
- package/dist/worker/build-context.js.map +1 -1
- package/dist/worker/claude-code-runner.js +75 -76
- package/dist/worker/claude-code-runner.js.map +1 -1
- package/dist/worker/codex-runner.js +474 -0
- package/dist/worker/codex-runner.js.map +1 -0
- package/dist/worker/result-envelope.js +51 -79
- package/dist/worker/result-envelope.js.map +1 -1
- package/dist/worker/runner-common.js +106 -0
- package/dist/worker/runner-common.js.map +1 -0
- package/dist/worker/runner-dispatch.js +3 -1
- package/dist/worker/runner-dispatch.js.map +1 -1
- package/dist/worker/runner.js.map +1 -1
- package/dist/worker/stub-runner.js +3 -3
- package/dist/worker/stub-runner.js.map +1 -1
- package/package.json +1 -1
- package/dist/app.module.js +0 -28
- package/dist/app.module.js.map +0 -1
- package/dist/cli/commands/bootstrap.js +0 -100
- package/dist/cli/commands/bootstrap.js.map +0 -1
- package/dist/cli/commands/dev.js +0 -143
- package/dist/cli/commands/dev.js.map +0 -1
- package/dist/cli/commands/inbox.js +0 -288
- package/dist/cli/commands/inbox.js.map +0 -1
- package/dist/cli/commands/playbook.js +0 -74
- package/dist/cli/commands/playbook.js.map +0 -1
- package/dist/cli/commands/poll-workflow-state.js +0 -144
- package/dist/cli/commands/poll-workflow-state.js.map +0 -1
- package/dist/cli/commands/revisium-context.js +0 -23
- package/dist/cli/commands/revisium-context.js.map +0 -1
- package/dist/cli/commands/revisium.js +0 -89
- package/dist/cli/commands/revisium.js.map +0 -1
- package/dist/cli/commands/run.js +0 -451
- package/dist/cli/commands/run.js.map +0 -1
- package/dist/cli/commands/serve.js +0 -26
- package/dist/cli/commands/serve.js.map +0 -1
- package/dist/cli/live-guard.js +0 -49
- package/dist/cli/live-guard.js.map +0 -1
- package/dist/cli/needs-host.js +0 -77
- package/dist/cli/needs-host.js.map +0 -1
- package/dist/mcp/mcp-stdio.service.js +0 -48
- package/dist/mcp/mcp-stdio.service.js.map +0 -1
- package/dist/mcp/mcp.module.js +0 -21
- package/dist/mcp/mcp.module.js.map +0 -1
|
@@ -1,70 +1,65 @@
|
|
|
1
|
-
// The
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// The instruction below is the SINGLE SOURCE OF TRUTH. The runner (claude-code-runner.ts) appends it
|
|
6
|
-
// to EVERY prompt so the agent is always told how to emit; the parser here keys on the same markers.
|
|
7
|
-
// It lives next to the parser — not in build-context.ts (the stub shares that), not in role prompts.
|
|
8
|
-
export const REVO_RESULT_CONTRACT = `
|
|
9
|
-
You MUST end your reply with a single result block in EXACTLY this form — the markers on their own lines,
|
|
10
|
-
valid JSON between them, and NOTHING after the closing marker:
|
|
11
|
-
|
|
12
|
-
<<<REVO_RESULT
|
|
13
|
-
{
|
|
14
|
-
"verdict": <REQUIRED if your role emits one — EXACTLY one routing token, lowercase, no prose, e.g. "approved" | "changes_requested" | "blocker" | "clean" | "dirty"; the pipeline routes on this. Use null if your role emits no verdict>,
|
|
15
|
-
"output": <any JSON — a short human-readable summary or structured result the next step consumes>,
|
|
16
|
-
"artifacts": <any JSON, optional — e.g. { "planPath": "docs/plans/00xx.md" }; omit if none>,
|
|
17
|
-
"nextSteps": [
|
|
18
|
-
{ "role": "developer", "kind": "implement", "input": { "from": "<this step>" },
|
|
19
|
-
"modelProfile"?: "standard", "taskId"?: "<defaults to the current step's task>",
|
|
20
|
-
"priority"?: 0, "maxAttempts"?: 3, "dependsOn"?: [], "runAfter"?: "" }
|
|
21
|
-
],
|
|
22
|
-
"needsHuman": false,
|
|
23
|
-
"lesson": null
|
|
24
|
-
}
|
|
25
|
-
REVO_RESULT>>>
|
|
26
|
-
|
|
27
|
-
If you have no follow-up work, return "nextSteps": []. If you are blocked and need a human, set
|
|
28
|
-
"needsHuman": true and "nextSteps": []. Emit the block exactly once.
|
|
29
|
-
`;
|
|
30
|
-
// Markers the parser keys on — must stay identical to those embedded in REVO_RESULT_CONTRACT.
|
|
31
|
-
// The marker-sync unit test guards that invariant.
|
|
32
|
-
const OPEN_MARKER = '<<<REVO_RESULT';
|
|
33
|
-
const CLOSE_MARKER = 'REVO_RESULT>>>';
|
|
34
|
-
// PRIMARY result channel (0016 follow-up): the claude CLI `--json-schema` constrains the agent's final
|
|
35
|
-
// message to this schema and returns it as the transport `structured_output` field — a RELIABLE
|
|
36
|
-
// `verdict` (the pipeline routes on it), unlike mining a free-text REVO_RESULT block (which the agent
|
|
37
|
-
// shaped as prose, leaving no routable verdict). `output` is the summary/plan the next step consumes.
|
|
1
|
+
// The only supported agent result channel: the Claude CLI `--json-schema` constrains the final
|
|
2
|
+
// message and returns it as the transport `structured_output` field. The engine routes only on the
|
|
3
|
+
// top-level `verdict` from that structured object; prose output is never parsed for routing.
|
|
38
4
|
export const AGENT_RESULT_SCHEMA = JSON.stringify({
|
|
39
5
|
type: 'object',
|
|
40
6
|
additionalProperties: false,
|
|
41
7
|
properties: {
|
|
42
|
-
verdict: {
|
|
8
|
+
verdict: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
minLength: 1,
|
|
11
|
+
description: 'the single routing token, lowercase, e.g. approved | changes_requested | blocker | clean | dirty',
|
|
12
|
+
},
|
|
43
13
|
output: { type: 'string', description: 'a short summary, or the artifact (e.g. the plan) the next step consumes' },
|
|
14
|
+
artifacts: { description: 'optional JSON artifacts, e.g. { "planPath": "docs/plans/00xx.md" }' },
|
|
15
|
+
nextSteps: {
|
|
16
|
+
type: 'array',
|
|
17
|
+
description: 'optional follow-up work items; use [] when there is no follow-up work',
|
|
18
|
+
items: { type: 'object' },
|
|
19
|
+
},
|
|
44
20
|
needsHuman: { type: 'boolean', description: 'true only if you are blocked and a human must intervene' },
|
|
45
21
|
lesson: { type: 'string', description: 'optional one-line note for a future attempt' },
|
|
46
22
|
},
|
|
47
23
|
required: ['verdict', 'output'],
|
|
48
24
|
});
|
|
49
|
-
/** Short prompt note paired with `--json-schema
|
|
50
|
-
* instructions conflict; with --json-schema the CLI returns `structured_output`). */
|
|
25
|
+
/** Short prompt note paired with `--json-schema`; the CLI returns the result as `structured_output`. */
|
|
51
26
|
export const STRUCTURED_RESULT_NOTE = `
|
|
52
27
|
Return your final answer as JSON matching the provided output schema:
|
|
53
28
|
- "verdict": the single routing token for your role (lowercase; e.g. approved | changes_requested | blocker | clean | dirty).
|
|
54
29
|
- "output": a short summary, or — if you produce an artifact for a later step (e.g. an implementation plan) — that artifact.
|
|
30
|
+
- "nextSteps": [] unless you are explicitly creating legacy follow-up steps.
|
|
55
31
|
Set "needsHuman": true only if you are blocked and a human must intervene.
|
|
56
32
|
`;
|
|
57
|
-
/** Build the AgentResult from
|
|
33
|
+
/** Build the AgentResult from the required structured_output object (the --json-schema path). */
|
|
58
34
|
export function agentResultFromStructured(structured) {
|
|
59
|
-
if (structured ===
|
|
60
|
-
|
|
35
|
+
if (structured === undefined) {
|
|
36
|
+
throw new TypeError('agent structured result missing structured_output');
|
|
37
|
+
}
|
|
38
|
+
if (structured === null || typeof structured !== 'object' || Array.isArray(structured)) {
|
|
39
|
+
throw new TypeError('agent structured result must be an object');
|
|
40
|
+
}
|
|
61
41
|
const o = structured;
|
|
42
|
+
if (typeof o.verdict !== 'string' || o.verdict.trim().length === 0) {
|
|
43
|
+
throw new TypeError('agent structured result missing required top-level verdict');
|
|
44
|
+
}
|
|
45
|
+
if (typeof o.output !== 'string') {
|
|
46
|
+
throw new TypeError('agent structured result missing required string output');
|
|
47
|
+
}
|
|
48
|
+
if ('needsHuman' in o && typeof o.needsHuman !== 'boolean') {
|
|
49
|
+
throw new TypeError('agent structured result needsHuman must be a boolean when present');
|
|
50
|
+
}
|
|
51
|
+
if ('lesson' in o && o.lesson !== null && typeof o.lesson !== 'string') {
|
|
52
|
+
throw new TypeError('agent structured result lesson must be a string when present');
|
|
53
|
+
}
|
|
54
|
+
if ('nextSteps' in o && !Array.isArray(o.nextSteps)) {
|
|
55
|
+
throw new TypeError('agent structured result nextSteps must be an array when present');
|
|
56
|
+
}
|
|
62
57
|
return {
|
|
63
|
-
output:
|
|
64
|
-
verdict:
|
|
58
|
+
output: o.output,
|
|
59
|
+
verdict: o.verdict,
|
|
65
60
|
artifacts: o.artifacts,
|
|
66
61
|
nextSteps: Array.isArray(o.nextSteps) ? o.nextSteps : [],
|
|
67
|
-
needsHuman:
|
|
62
|
+
needsHuman: o.needsHuman === true,
|
|
68
63
|
lesson: typeof o.lesson === 'string' ? o.lesson : undefined,
|
|
69
64
|
};
|
|
70
65
|
}
|
|
@@ -78,6 +73,9 @@ function readFinalText(obj) {
|
|
|
78
73
|
return obj.text;
|
|
79
74
|
return '';
|
|
80
75
|
}
|
|
76
|
+
function readNonEmptyString(value) {
|
|
77
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
78
|
+
}
|
|
81
79
|
// Layer A. Parse defensively; field names are read only inside this module, so a CLI drift is a
|
|
82
80
|
// one-file change. Throws only when stdout is not parseable JSON.
|
|
83
81
|
export function parseTransportEnvelope(stdout) {
|
|
@@ -98,58 +96,32 @@ export function parseTransportEnvelope(stdout) {
|
|
|
98
96
|
return {
|
|
99
97
|
text: readFinalText(obj),
|
|
100
98
|
isError: Boolean(obj.is_error),
|
|
99
|
+
permissionDenials: obj.permission_denials,
|
|
100
|
+
terminalReason: readNonEmptyString(obj.terminal_reason),
|
|
101
|
+
sessionId: readNonEmptyString(obj.session_id),
|
|
101
102
|
costUsd: readNumber(obj.total_cost_usd) ?? readNumber(obj.cost_usd),
|
|
102
103
|
inputTokens: readNumber(usage?.input_tokens),
|
|
103
104
|
outputTokens: readNumber(usage?.output_tokens),
|
|
104
105
|
structuredOutput: obj.structured_output,
|
|
105
106
|
};
|
|
106
107
|
}
|
|
107
|
-
// Layer B. Extract the substring between the markers and JSON.parse it. Absent or unparseable →
|
|
108
|
-
// the documented lesson-bearing error (the corrective is the contract the runner re-appends, not this).
|
|
109
|
-
export function extractAgentResult(text) {
|
|
110
|
-
const start = text.indexOf(OPEN_MARKER);
|
|
111
|
-
const end = start === -1 ? -1 : text.indexOf(CLOSE_MARKER, start + OPEN_MARKER.length);
|
|
112
|
-
if (start === -1 || end === -1) {
|
|
113
|
-
throw new Error('agent did not emit a parseable REVO_RESULT envelope');
|
|
114
|
-
}
|
|
115
|
-
const jsonSlice = text.slice(start + OPEN_MARKER.length, end);
|
|
116
|
-
let parsed;
|
|
117
|
-
try {
|
|
118
|
-
parsed = JSON.parse(jsonSlice);
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
throw new Error('agent did not emit a parseable REVO_RESULT envelope');
|
|
122
|
-
}
|
|
123
|
-
if (parsed === null || typeof parsed !== 'object') {
|
|
124
|
-
throw new Error('agent did not emit a parseable REVO_RESULT envelope');
|
|
125
|
-
}
|
|
126
|
-
const obj = parsed;
|
|
127
|
-
return {
|
|
128
|
-
output: obj.output,
|
|
129
|
-
verdict: typeof obj.verdict === 'string' && obj.verdict.length > 0 ? obj.verdict : undefined,
|
|
130
|
-
artifacts: obj.artifacts,
|
|
131
|
-
nextSteps: Array.isArray(obj.nextSteps) ? obj.nextSteps : [],
|
|
132
|
-
needsHuman: Boolean(obj.needsHuman),
|
|
133
|
-
lesson: typeof obj.lesson === 'string' ? obj.lesson : undefined,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
108
|
// Map each raw nextSteps entry to NewStepSpec. Require role/kind/input; default taskId and
|
|
137
109
|
// modelProfile from the current step so the agent never needs to know IDs. Throw a lesson-bearing
|
|
138
110
|
// error (naming the index) on a malformed entry.
|
|
139
111
|
export function normalizeNextSteps(raw, step) {
|
|
140
112
|
return raw.map((entry, i) => {
|
|
141
113
|
if (entry === null || typeof entry !== 'object') {
|
|
142
|
-
throw new Error(`
|
|
114
|
+
throw new Error(`agent result nextSteps[${i}] is not an object`);
|
|
143
115
|
}
|
|
144
116
|
const e = entry;
|
|
145
117
|
if (typeof e.role !== 'string' || e.role.length === 0) {
|
|
146
|
-
throw new Error(`
|
|
118
|
+
throw new Error(`agent result nextSteps[${i}] missing required "role"`);
|
|
147
119
|
}
|
|
148
120
|
if (typeof e.kind !== 'string' || e.kind.length === 0) {
|
|
149
|
-
throw new Error(`
|
|
121
|
+
throw new Error(`agent result nextSteps[${i}] missing required "kind"`);
|
|
150
122
|
}
|
|
151
123
|
if (!('input' in e)) {
|
|
152
|
-
throw new Error(`
|
|
124
|
+
throw new Error(`agent result nextSteps[${i}] missing required "input"`);
|
|
153
125
|
}
|
|
154
126
|
const spec = {
|
|
155
127
|
taskId: typeof e.taskId === 'string' && e.taskId.length > 0 ? e.taskId : step.taskId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-envelope.js","sourceRoot":"","sources":["../../src/worker/result-envelope.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"result-envelope.js","sourceRoot":"","sources":["../../src/worker/result-envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { RunAgentError } from './runner.js';
|
|
2
|
+
import { normalizeNextSteps } from './result-envelope.js';
|
|
3
|
+
const ERROR_TAIL = 2_000;
|
|
4
|
+
const OBSERVABILITY_PREVIEW_MAX_CHARS = 1_000;
|
|
5
|
+
const OBSERVABILITY_ARRAY_MAX_ITEMS = 5;
|
|
6
|
+
const OBSERVABILITY_OBJECT_MAX_KEYS = 12;
|
|
7
|
+
const OBSERVABILITY_STRING_MAX_CHARS = 120;
|
|
8
|
+
export function tail(text) {
|
|
9
|
+
const trimmed = text.trim();
|
|
10
|
+
return trimmed.length > ERROR_TAIL ? trimmed.slice(-ERROR_TAIL) : trimmed;
|
|
11
|
+
}
|
|
12
|
+
function boundedString(value, maxChars = OBSERVABILITY_STRING_MAX_CHARS) {
|
|
13
|
+
return value.length > maxChars ? `${value.slice(0, maxChars)}...` : value;
|
|
14
|
+
}
|
|
15
|
+
export function boundedPreviewValue(value, depth = 0) {
|
|
16
|
+
if (value === null || value === undefined)
|
|
17
|
+
return value;
|
|
18
|
+
if (typeof value === 'string')
|
|
19
|
+
return boundedString(value);
|
|
20
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
21
|
+
return value;
|
|
22
|
+
if (depth >= 3)
|
|
23
|
+
return '[object]';
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
const limited = value.slice(0, OBSERVABILITY_ARRAY_MAX_ITEMS).map((entry) => boundedPreviewValue(entry, depth + 1));
|
|
26
|
+
if (value.length > OBSERVABILITY_ARRAY_MAX_ITEMS) {
|
|
27
|
+
limited.push(`[${value.length - OBSERVABILITY_ARRAY_MAX_ITEMS} more]`);
|
|
28
|
+
}
|
|
29
|
+
return limited;
|
|
30
|
+
}
|
|
31
|
+
if (typeof value === 'object') {
|
|
32
|
+
const out = {};
|
|
33
|
+
const entries = Object.entries(value).slice(0, OBSERVABILITY_OBJECT_MAX_KEYS);
|
|
34
|
+
for (const [key, entry] of entries)
|
|
35
|
+
out[key] = boundedPreviewValue(entry, depth + 1);
|
|
36
|
+
const keyCount = Object.keys(value).length;
|
|
37
|
+
if (keyCount > OBSERVABILITY_OBJECT_MAX_KEYS)
|
|
38
|
+
out._truncatedKeys = keyCount - OBSERVABILITY_OBJECT_MAX_KEYS;
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
return `[${typeof value}]`;
|
|
42
|
+
}
|
|
43
|
+
export function boundedPreview(value) {
|
|
44
|
+
const bounded = boundedPreviewValue(value);
|
|
45
|
+
const preview = JSON.stringify(bounded) ?? String(bounded);
|
|
46
|
+
return preview.length > OBSERVABILITY_PREVIEW_MAX_CHARS
|
|
47
|
+
? `${preview.slice(0, OBSERVABILITY_PREVIEW_MAX_CHARS)}...`
|
|
48
|
+
: preview;
|
|
49
|
+
}
|
|
50
|
+
export function withProcessArtifact(agentArtifacts, process) {
|
|
51
|
+
if (!process)
|
|
52
|
+
return agentArtifacts;
|
|
53
|
+
const processEntry = {
|
|
54
|
+
ref: process.ref,
|
|
55
|
+
stdoutTail: process.stdoutTail,
|
|
56
|
+
stderrTail: process.stderrTail,
|
|
57
|
+
};
|
|
58
|
+
if (agentArtifacts && typeof agentArtifacts === 'object' && !Array.isArray(agentArtifacts)) {
|
|
59
|
+
return { ...agentArtifacts, process: processEntry };
|
|
60
|
+
}
|
|
61
|
+
return { agent: agentArtifacts ?? null, process: processEntry };
|
|
62
|
+
}
|
|
63
|
+
export function runnerError(message, process) {
|
|
64
|
+
return new RunAgentError(message, withProcessArtifact(undefined, process));
|
|
65
|
+
}
|
|
66
|
+
export function buildUsageCosts(step, profile, usage) {
|
|
67
|
+
const inputTokens = usage.inputTokens ?? 0;
|
|
68
|
+
const outputTokens = usage.outputTokens ?? 0;
|
|
69
|
+
const reportedUsd = typeof usage.costUsd === 'number' && Number.isFinite(usage.costUsd) ? usage.costUsd : undefined;
|
|
70
|
+
if (inputTokens === 0 && outputTokens === 0 && reportedUsd === undefined)
|
|
71
|
+
return [];
|
|
72
|
+
const computed = (inputTokens / 1_000_000) * profile.costPerInput +
|
|
73
|
+
(outputTokens / 1_000_000) * profile.costPerOutput;
|
|
74
|
+
return [
|
|
75
|
+
{
|
|
76
|
+
modelProfile: step.modelProfile,
|
|
77
|
+
inputTokens,
|
|
78
|
+
outputTokens,
|
|
79
|
+
costAmount: reportedUsd ?? computed,
|
|
80
|
+
currency: 'USD',
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
export function buildAttemptResult(agent, step, costs, processSnapshot) {
|
|
85
|
+
if (agent.needsHuman) {
|
|
86
|
+
return {
|
|
87
|
+
output: agent.output,
|
|
88
|
+
verdict: agent.verdict,
|
|
89
|
+
artifacts: withProcessArtifact(agent.artifacts, processSnapshot),
|
|
90
|
+
nextSteps: [],
|
|
91
|
+
costs,
|
|
92
|
+
needsHuman: true,
|
|
93
|
+
lesson: agent.lesson,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
output: agent.output,
|
|
98
|
+
verdict: agent.verdict,
|
|
99
|
+
artifacts: withProcessArtifact(agent.artifacts, processSnapshot),
|
|
100
|
+
nextSteps: normalizeNextSteps(agent.nextSteps, step),
|
|
101
|
+
costs,
|
|
102
|
+
needsHuman: false,
|
|
103
|
+
lesson: agent.lesson,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=runner-common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner-common.js","sourceRoot":"","sources":["../../src/worker/runner-common.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,9 @@ export function createRunAgent(deps) {
|
|
|
7
7
|
case 'claude-code':
|
|
8
8
|
return deps.claudeCode(args);
|
|
9
9
|
case 'codex':
|
|
10
|
-
|
|
10
|
+
if (!deps.codex)
|
|
11
|
+
throw new Error('RUNNER_NOT_IMPLEMENTED: codex runner not wired');
|
|
12
|
+
return deps.codex(args);
|
|
11
13
|
case 'script':
|
|
12
14
|
case 'stub-agent':
|
|
13
15
|
if (!deps.script)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-dispatch.js","sourceRoot":"","sources":["../../src/worker/runner-dispatch.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,6FAA6F;AAC7F,yDAAyD;AACzD,MAAM,UAAU,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"runner-dispatch.js","sourceRoot":"","sources":["../../src/worker/runner-dispatch.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,6FAA6F;AAC7F,yDAAyD;AACzD,MAAM,UAAU,cAAc,CAAC,IAAmE;IAChG,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,aAAa;gBAChB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/B,KAAK,OAAO;gBACV,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBACnF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,KAAK,QAAQ,CAAC;YACd,KAAK,YAAY;gBACf,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;gBACrF,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B;gBACE,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/worker/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/worker/runner.ts"],"names":[],"mappings":"AA2BA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,SAAS,CAAW;IAE7B,YAAY,OAAe,EAAE,SAAmB;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAY;IACrD,OAAO,GAAG,YAAY,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
// Zero-cost stub runner for integration testing and smoke verification.
|
|
2
2
|
//
|
|
3
|
-
// GENERIC (plan 0015 slice 4): the stub is role-AGNOSTIC. It emits a passing result
|
|
4
|
-
// (`
|
|
3
|
+
// GENERIC (plan 0015 slice 4): the stub is role-AGNOSTIC. It emits a top-level passing result
|
|
4
|
+
// (`verdict:'approved'`) regardless of role so smoke paths complete end-to-end at zero cost.
|
|
5
5
|
// Real, scenario-specific verdicts are scripted by the e2e kit's agent; the stub no longer encodes any
|
|
6
6
|
// pipeline-role knowledge (no role-name branching, no `nextSteps` — the data-driven engine sequences
|
|
7
7
|
// nodes from the template, never from a runner-returned chain).
|
|
8
8
|
export const stubRunAgent = async ({ role, step, context }) => {
|
|
9
9
|
const output = {
|
|
10
10
|
echo: `[stub] role=${role.name} step=${step.id} contextSize=${context.length}`,
|
|
11
|
-
verdict: 'PASS',
|
|
12
11
|
};
|
|
13
12
|
const result = {
|
|
14
13
|
output,
|
|
14
|
+
verdict: 'approved',
|
|
15
15
|
nextSteps: [],
|
|
16
16
|
costs: [],
|
|
17
17
|
needsHuman: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stub-runner.js","sourceRoot":"","sources":["../../src/worker/stub-runner.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"stub-runner.js","sourceRoot":"","sources":["../../src/worker/stub-runner.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,EAAE;AACF,8FAA8F;AAC9F,6FAA6F;AAC7F,uGAAuG;AACvG,qGAAqG;AACrG,gEAAgE;AAChE,MAAM,CAAC,MAAM,YAAY,GAAa,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;IACtE,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAE,eAAe,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,gBAAgB,OAAO,CAAC,MAAM,EAAE;KAC/E,CAAC;IAEF,MAAM,MAAM,GAAkB;QAC5B,MAAM;QACN,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,EAAE;QACT,UAAU,EAAE,KAAK;KAClB,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
package/package.json
CHANGED
package/dist/app.module.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
import { Module } from '@nestjs/common';
|
|
8
|
-
import { EngineModule } from './engine/dbos.module.js';
|
|
9
|
-
import { McpModule } from './mcp/mcp.module.js';
|
|
10
|
-
import { PipelineModule } from './pipeline/pipeline.module.js';
|
|
11
|
-
import { HostLifecycle } from './host/host.lifecycle.js';
|
|
12
|
-
/**
|
|
13
|
-
* Root NestJS module for the agent-orchestrator host.
|
|
14
|
-
*
|
|
15
|
-
* PipelineModule is imported so PipelineService is constructed (and registers
|
|
16
|
-
* its DBOS workflow/step/queue) BEFORE HostLifecycle.onApplicationBootstrap()
|
|
17
|
-
* calls dbosService.launch() — required by DBOS recovery (OQ-4).
|
|
18
|
-
*/
|
|
19
|
-
let AppModule = class AppModule {
|
|
20
|
-
};
|
|
21
|
-
AppModule = __decorate([
|
|
22
|
-
Module({
|
|
23
|
-
imports: [EngineModule, PipelineModule, McpModule],
|
|
24
|
-
providers: [HostLifecycle],
|
|
25
|
-
})
|
|
26
|
-
], AppModule);
|
|
27
|
-
export { AppModule };
|
|
28
|
-
//# sourceMappingURL=app.module.js.map
|
package/dist/app.module.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;;;;;GAMG;AAKI,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,SAAS;IAJrB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,SAAS,CAAC;QAClD,SAAS,EAAE,CAAC,aAAa,CAAC;KAC3B,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { isHealthy, repoRoot, resolvePorts, revisiumUri } from '../config.js';
|
|
4
|
-
import { applyAdditiveSchemaMigration } from '../../control-plane/schema-migration.js';
|
|
5
|
-
import { seedDefaultPlaybook, } from '../../control-plane/seed-default-playbook.js';
|
|
6
|
-
import { withRevisiumService } from './revisium-context.js';
|
|
7
|
-
/** Run the default-playbook seed against the live draft scope (needs a running daemon). */
|
|
8
|
-
async function runDefaultPlaybookSeed() {
|
|
9
|
-
return withRevisiumService((await import('../../revisium/playbooks.service.js')).PlaybooksService, (service) => seedDefaultPlaybook(service));
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Install the BUILT-IN DEFAULT playbook (slice 5, plan 0015) so a fresh control-plane has a working
|
|
13
|
-
* `feature-development` + `local-change` pipeline out-of-the-box (the default is DATA — a committed
|
|
14
|
-
* playbook source, NOT engine code). Idempotent + best-effort: a fresh bootstrap installs it once;
|
|
15
|
-
* re-running is a no-op. A seed failure must NOT fail the schema bootstrap (the schema is the
|
|
16
|
-
* critical artifact) — it is reported so the operator can re-run `revo playbook install`.
|
|
17
|
-
*
|
|
18
|
-
* `runSeed`/`log` are injected (defaulting to the live daemon seed + stderr) so the logging policy is
|
|
19
|
-
* unit-testable without a daemon — the codebase's CLI-helper pattern (see `pollWorkflowState`).
|
|
20
|
-
*/
|
|
21
|
-
export async function seedDefaultPlaybookBestEffort(runSeed = runDefaultPlaybookSeed, log = (message) => console.error(message)) {
|
|
22
|
-
try {
|
|
23
|
-
const outcome = await runSeed();
|
|
24
|
-
if (outcome.status === 'installed') {
|
|
25
|
-
const { result } = outcome;
|
|
26
|
-
log(`Seeded default playbook ${result.playbookId} ` +
|
|
27
|
-
`(${result.roles} roles, ${result.pipelines} pipelines).`);
|
|
28
|
-
}
|
|
29
|
-
else if (outcome.status === 'already-installed') {
|
|
30
|
-
log('Default playbook already installed — skipping seed.');
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch (err) {
|
|
34
|
-
log(`Default playbook seed failed (schema bootstrap still applied): ${String(err)}. ` +
|
|
35
|
-
'Re-run with `revo playbook install control-plane/default-playbook --commit`.');
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
async function runBootstrap(options) {
|
|
39
|
-
const { httpPort } = await resolvePorts();
|
|
40
|
-
if (!(await isHealthy(httpPort))) {
|
|
41
|
-
console.error('Revisium is not running. Run: revo revisium start');
|
|
42
|
-
process.exitCode = 1;
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const configPath = join(repoRoot, 'control-plane', 'bootstrap.config.json');
|
|
46
|
-
const args = [
|
|
47
|
-
'-y',
|
|
48
|
-
'revisium@2.5.0-alpha.6',
|
|
49
|
-
'example',
|
|
50
|
-
'bootstrap',
|
|
51
|
-
'--config',
|
|
52
|
-
configPath,
|
|
53
|
-
'--url',
|
|
54
|
-
revisiumUri(httpPort),
|
|
55
|
-
'--skip-auth',
|
|
56
|
-
];
|
|
57
|
-
if (options.commit !== false)
|
|
58
|
-
args.push('--commit');
|
|
59
|
-
const runExternalBootstrap = async () => {
|
|
60
|
-
const child = spawn('npx', args, { stdio: 'inherit' });
|
|
61
|
-
const exitCode = await new Promise((resolve) => {
|
|
62
|
-
child.on('error', () => resolve(1));
|
|
63
|
-
child.on('exit', resolve);
|
|
64
|
-
});
|
|
65
|
-
return exitCode ?? 1;
|
|
66
|
-
};
|
|
67
|
-
let exitCode = await runExternalBootstrap();
|
|
68
|
-
if (exitCode !== 0) {
|
|
69
|
-
const migration = await applyAdditiveSchemaMigration({
|
|
70
|
-
configPath,
|
|
71
|
-
httpPort,
|
|
72
|
-
commit: options.commit,
|
|
73
|
-
});
|
|
74
|
-
if (migration.patches > 0) {
|
|
75
|
-
console.error(`Applied additive schema migration (${migration.patches} patch${migration.patches === 1 ? '' : 'es'}): ` +
|
|
76
|
-
migration.updatedTables.join(', '));
|
|
77
|
-
exitCode = await runExternalBootstrap();
|
|
78
|
-
if (exitCode !== 0) {
|
|
79
|
-
console.error('External bootstrap still reports a schema conflict after additive migration; ' +
|
|
80
|
-
'continuing because runtime-compatible schema patches were applied.');
|
|
81
|
-
exitCode = 0;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Seed the built-in default playbook (slice 5) once the schema is in place. Only when committing —
|
|
86
|
-
// a non-committed bootstrap leaves a draft, so installing a non-live playbook would be misleading.
|
|
87
|
-
if (exitCode === 0 && options.commit !== false) {
|
|
88
|
-
await seedDefaultPlaybookBestEffort();
|
|
89
|
-
}
|
|
90
|
-
process.exitCode = exitCode;
|
|
91
|
-
}
|
|
92
|
-
export function registerBootstrap(program) {
|
|
93
|
-
program
|
|
94
|
-
.command('bootstrap')
|
|
95
|
-
.description('Bootstrap the control-plane schema')
|
|
96
|
-
.option('--commit', 'Commit schema changes', true)
|
|
97
|
-
.option('--no-commit', 'Run without committing schema changes')
|
|
98
|
-
.action(runBootstrap);
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/cli/commands/bootstrap.ts"],"names":[],"mappings":"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"}
|