agentopology 0.3.0 → 0.4.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 +52 -4
- package/dist/analyzer/__tests__/analyzer.test.js +36 -9
- package/dist/analyzer/__tests__/analyzer.test.js.map +1 -1
- package/dist/analyzer/__tests__/observability-gap.test.js +40 -10
- package/dist/analyzer/__tests__/observability-gap.test.js.map +1 -1
- package/dist/analyzer/index.d.ts +2 -1
- package/dist/analyzer/index.d.ts.map +1 -1
- package/dist/analyzer/index.js +1 -1
- package/dist/analyzer/index.js.map +1 -1
- package/dist/bindings/__tests__/bindings.test.js +20 -5
- package/dist/bindings/__tests__/bindings.test.js.map +1 -1
- package/dist/bindings/__tests__/claude-workflow.test.js +12 -3
- package/dist/bindings/__tests__/claude-workflow.test.js.map +1 -1
- package/dist/bindings/__tests__/defaults-agreement.test.d.ts +16 -0
- package/dist/bindings/__tests__/defaults-agreement.test.d.ts.map +1 -0
- package/dist/bindings/__tests__/defaults-agreement.test.js +80 -0
- package/dist/bindings/__tests__/defaults-agreement.test.js.map +1 -0
- package/dist/bindings/__tests__/observability.test.js +8 -2
- package/dist/bindings/__tests__/observability.test.js.map +1 -1
- package/dist/bindings/__tests__/stub-generation.test.js +8 -2
- package/dist/bindings/__tests__/stub-generation.test.js.map +1 -1
- package/dist/bindings/claude-code.d.ts.map +1 -1
- package/dist/bindings/claude-code.js +2 -1
- package/dist/bindings/claude-code.js.map +1 -1
- package/dist/bindings/claude-workflow.d.ts.map +1 -1
- package/dist/bindings/claude-workflow.js +2 -1
- package/dist/bindings/claude-workflow.js.map +1 -1
- package/dist/bindings/codex.d.ts.map +1 -1
- package/dist/bindings/codex.js +6 -2
- package/dist/bindings/codex.js.map +1 -1
- package/dist/bindings/gemini-cli.d.ts.map +1 -1
- package/dist/bindings/gemini-cli.js +2 -1
- package/dist/bindings/gemini-cli.js.map +1 -1
- package/dist/bindings/kiro.d.ts.map +1 -1
- package/dist/bindings/kiro.js +2 -1
- package/dist/bindings/kiro.js.map +1 -1
- package/dist/bindings/openclaw.d.ts.map +1 -1
- package/dist/bindings/openclaw.js +2 -1
- package/dist/bindings/openclaw.js.map +1 -1
- package/dist/cli/__tests__/cli.test.d.ts +12 -0
- package/dist/cli/__tests__/cli.test.d.ts.map +1 -0
- package/dist/cli/__tests__/cli.test.js +171 -0
- package/dist/cli/__tests__/cli.test.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +149 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/docs/content.d.ts.map +1 -1
- package/dist/docs/content.js +112 -0
- package/dist/docs/content.js.map +1 -1
- package/dist/exporters/ascii.d.ts +13 -0
- package/dist/exporters/ascii.d.ts.map +1 -0
- package/dist/exporters/ascii.js +26 -0
- package/dist/exporters/ascii.js.map +1 -0
- package/dist/exporters/brief.d.ts +14 -0
- package/dist/exporters/brief.d.ts.map +1 -0
- package/dist/exporters/brief.js +37 -0
- package/dist/exporters/brief.js.map +1 -0
- package/dist/exporters/index.d.ts +2 -0
- package/dist/exporters/index.d.ts.map +1 -1
- package/dist/exporters/index.js +6 -0
- package/dist/exporters/index.js.map +1 -1
- package/dist/exporters/markdown.d.ts.map +1 -1
- package/dist/exporters/markdown.js +2 -1
- package/dist/exporters/markdown.js.map +1 -1
- package/dist/exporters/mermaid.d.ts.map +1 -1
- package/dist/exporters/mermaid.js +2 -1
- package/dist/exporters/mermaid.js.map +1 -1
- package/dist/import/__tests__/import.test.js +8 -2
- package/dist/import/__tests__/import.test.js.map +1 -1
- package/dist/parser/__tests__/parser.test.js +1386 -210
- package/dist/parser/__tests__/parser.test.js.map +1 -1
- package/dist/parser/__tests__/spec-sync.test.d.ts +10 -0
- package/dist/parser/__tests__/spec-sync.test.d.ts.map +1 -0
- package/dist/parser/__tests__/spec-sync.test.js +60 -0
- package/dist/parser/__tests__/spec-sync.test.js.map +1 -0
- package/dist/parser/index.d.ts +50 -6
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +183 -28
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/validator.d.ts +7 -1
- package/dist/parser/validator.d.ts.map +1 -1
- package/dist/parser/validator.js +77 -2
- package/dist/parser/validator.js.map +1 -1
- package/dist/plan/__tests__/brief.test.d.ts +2 -0
- package/dist/plan/__tests__/brief.test.d.ts.map +1 -0
- package/dist/plan/__tests__/brief.test.js +442 -0
- package/dist/plan/__tests__/brief.test.js.map +1 -0
- package/dist/plan/brief.d.ts +207 -0
- package/dist/plan/brief.d.ts.map +1 -0
- package/dist/plan/brief.js +342 -0
- package/dist/plan/brief.js.map +1 -0
- package/dist/plan/render.d.ts +20 -0
- package/dist/plan/render.d.ts.map +1 -0
- package/dist/plan/render.js +425 -0
- package/dist/plan/render.js.map +1 -0
- package/dist/render/__tests__/ascii.test.d.ts +2 -0
- package/dist/render/__tests__/ascii.test.d.ts.map +1 -0
- package/dist/render/__tests__/ascii.test.js +171 -0
- package/dist/render/__tests__/ascii.test.js.map +1 -0
- package/dist/render/ascii.d.ts +23 -0
- package/dist/render/ascii.d.ts.map +1 -0
- package/dist/render/ascii.js +178 -0
- package/dist/render/ascii.js.map +1 -0
- package/dist/resolve/__tests__/defaults.test.d.ts +2 -0
- package/dist/resolve/__tests__/defaults.test.d.ts.map +1 -0
- package/dist/resolve/__tests__/defaults.test.js +109 -0
- package/dist/resolve/__tests__/defaults.test.js.map +1 -0
- package/dist/resolve/__tests__/order.test.d.ts +2 -0
- package/dist/resolve/__tests__/order.test.d.ts.map +1 -0
- package/dist/resolve/__tests__/order.test.js +238 -0
- package/dist/resolve/__tests__/order.test.js.map +1 -0
- package/dist/resolve/__tests__/phase.test.d.ts +12 -0
- package/dist/resolve/__tests__/phase.test.d.ts.map +1 -0
- package/dist/resolve/__tests__/phase.test.js +81 -0
- package/dist/resolve/__tests__/phase.test.js.map +1 -0
- package/dist/resolve/defaults.d.ts +51 -0
- package/dist/resolve/defaults.d.ts.map +1 -0
- package/dist/resolve/defaults.js +109 -0
- package/dist/resolve/defaults.js.map +1 -0
- package/dist/resolve/order.d.ts +73 -0
- package/dist/resolve/order.d.ts.map +1 -0
- package/dist/resolve/order.js +208 -0
- package/dist/resolve/order.js.map +1 -0
- package/dist/resolve/phase.d.ts +57 -0
- package/dist/resolve/phase.d.ts.map +1 -0
- package/dist/resolve/phase.js +60 -0
- package/dist/resolve/phase.js.map +1 -0
- package/dist/scaffold/__tests__/scaffold.test.js +8 -2
- package/dist/scaffold/__tests__/scaffold.test.js.map +1 -1
- package/dist/scaffold/__tests__/settings-merge.test.js +95 -0
- package/dist/scaffold/__tests__/settings-merge.test.js.map +1 -1
- package/dist/scaffold/incremental.d.ts.map +1 -1
- package/dist/scaffold/incremental.js +13 -2
- package/dist/scaffold/incremental.js.map +1 -1
- package/dist/visualizer/__tests__/topology-brain-link.test.js +19 -4
- package/dist/visualizer/__tests__/topology-brain-link.test.js.map +1 -1
- package/examples/code-review.at +32 -4
- package/examples/data-processing.at +33 -4
- package/package.json +1 -1
- package/spec/grammar.md +25 -1
- package/spec/validation.md +103 -35
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.d.ts","sourceRoot":"","sources":["../../src/plan/brief.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The execution brief — what `agentopology plan` hands to a host coding agent.
|
|
3
|
+
*
|
|
4
|
+
* WHY MARKDOWN
|
|
5
|
+
* ------------
|
|
6
|
+
* The consumer is a language model, on three different vendors. Markdown is
|
|
7
|
+
* what every binding already emits and what a model acts on without a parse
|
|
8
|
+
* step; JSON costs more tokens for identical content and invites the model to
|
|
9
|
+
* summarize the document rather than execute it. A machine format already
|
|
10
|
+
* exists for programs: `agentopology export --format json`.
|
|
11
|
+
*
|
|
12
|
+
* TWO LAYERS
|
|
13
|
+
* ----------
|
|
14
|
+
* `buildExecutionBrief` computes a typed structure; `renderBriefMarkdown` is
|
|
15
|
+
* the only renderer that ships. A `--json` twin, if one is ever needed, is
|
|
16
|
+
* `JSON.stringify` of the same structure — so the two can never drift.
|
|
17
|
+
*
|
|
18
|
+
* WHAT IT IS NOT
|
|
19
|
+
* --------------
|
|
20
|
+
* Not a translation. `.at` is already agent-readable and `exporters/markdown`
|
|
21
|
+
* already renders it for humans. This resolves what a host would otherwise
|
|
22
|
+
* have to guess: order, handoffs, what must stay blind, gate tiers, loop
|
|
23
|
+
* budgets, and which declarations cannot be honoured without files.
|
|
24
|
+
*
|
|
25
|
+
* @module
|
|
26
|
+
*/
|
|
27
|
+
import { existsSync } from "node:fs";
|
|
28
|
+
import { isAbsolute, resolve as resolvePath } from "node:path";
|
|
29
|
+
import { resolveDefaults } from "../resolve/defaults.js";
|
|
30
|
+
import { resolveOrder } from "../resolve/order.js";
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Computation
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
function agentsOf(ast) {
|
|
35
|
+
return ast.nodes.filter((n) => n.type === "agent");
|
|
36
|
+
}
|
|
37
|
+
/** Choose the strongest gate tier available in interpreted mode. */
|
|
38
|
+
function gateTier(gate) {
|
|
39
|
+
// An advisory gate never blocks, whatever mechanism is available.
|
|
40
|
+
if (gate.behavior === "advisory")
|
|
41
|
+
return "advisory";
|
|
42
|
+
// Tiers 1 and 2 (tool allowlist, hook exit 2) both require files, so they are
|
|
43
|
+
// unreachable here by construction. Tier 3 needs a Workflow phase. That
|
|
44
|
+
// leaves the evidence contract, which is the only portable fileless tier.
|
|
45
|
+
if (gate.run)
|
|
46
|
+
return "evidence-orchestrator";
|
|
47
|
+
return "evidence-agent";
|
|
48
|
+
}
|
|
49
|
+
/** The five features that are platform registrations, not steps in a run. */
|
|
50
|
+
function persistentFeatures(ast) {
|
|
51
|
+
const out = [];
|
|
52
|
+
const push = (feature, count) => {
|
|
53
|
+
if (count > 0)
|
|
54
|
+
out.push({ feature, count });
|
|
55
|
+
};
|
|
56
|
+
push("triggers / slash commands", ast.triggers?.length ?? 0);
|
|
57
|
+
push("schedules / cron", ast.schedules?.length ?? 0);
|
|
58
|
+
push("mcp-servers", Object.keys(ast.mcpServers ?? {}).length);
|
|
59
|
+
const agentHooks = agentsOf(ast).reduce((n, a) => n + (a.hooks?.length ?? 0), 0);
|
|
60
|
+
push("hooks", (ast.hooks?.length ?? 0) + agentHooks);
|
|
61
|
+
const restricted = agentsOf(ast).filter((a) => a.tools?.length || a.disallowedTools?.length || a.mcpServers?.length).length;
|
|
62
|
+
push("per-agent tools / permissions", restricted);
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
function computeHandoffs(ast) {
|
|
66
|
+
const byId = new Map(ast.nodes.map((n) => [n.id, n]));
|
|
67
|
+
const out = [];
|
|
68
|
+
// Deduped by pair: two conditional edges between the same roles are one
|
|
69
|
+
// handoff, not two. The condition is control flow (§5), not information flow.
|
|
70
|
+
const seen = new Set();
|
|
71
|
+
for (const edge of ast.edges) {
|
|
72
|
+
if (edge.isError)
|
|
73
|
+
continue;
|
|
74
|
+
const key = `${edge.from} ${edge.to}`;
|
|
75
|
+
if (seen.has(key))
|
|
76
|
+
continue;
|
|
77
|
+
const from = byId.get(edge.from);
|
|
78
|
+
const to = byId.get(edge.to);
|
|
79
|
+
if (from?.type !== "agent" || to?.type !== "agent")
|
|
80
|
+
continue;
|
|
81
|
+
seen.add(key);
|
|
82
|
+
const writes = from.writes ?? [];
|
|
83
|
+
const reads = new Set(to.reads ?? []);
|
|
84
|
+
const passes = writes.filter((w) => reads.has(w));
|
|
85
|
+
const withholds = writes.filter((w) => !reads.has(w));
|
|
86
|
+
out.push({ from: edge.from, to: edge.to, passes, withholds });
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
function computeBlindPairs(steps, ast) {
|
|
91
|
+
const linked = new Set(ast.edges.flatMap((e) => [`${e.from} ${e.to}`, `${e.to} ${e.from}`]));
|
|
92
|
+
const out = [];
|
|
93
|
+
for (const step of steps) {
|
|
94
|
+
if (step.ids.length < 2)
|
|
95
|
+
continue;
|
|
96
|
+
// Exclusive branches never co-run, so they cannot leak into each other and
|
|
97
|
+
// must NOT be dispatched together. Marking them blind told the host to
|
|
98
|
+
// spawn every branch of a decision in one message.
|
|
99
|
+
if (step.exclusive)
|
|
100
|
+
continue;
|
|
101
|
+
for (let i = 0; i < step.ids.length; i++) {
|
|
102
|
+
for (let j = i + 1; j < step.ids.length; j++) {
|
|
103
|
+
const [a, b] = [step.ids[i], step.ids[j]];
|
|
104
|
+
if (!linked.has(`${a} ${b}`))
|
|
105
|
+
out.push({ step: step.index, a, b });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/** Resolve a declared path against the run root. Absolute paths pass through. */
|
|
112
|
+
function abs(root, p) {
|
|
113
|
+
return isAbsolute(p) ? p : resolvePath(root, p);
|
|
114
|
+
}
|
|
115
|
+
function computePreconditions(ast, root) {
|
|
116
|
+
const produced = new Set(agentsOf(ast).flatMap((a) => a.writes ?? []));
|
|
117
|
+
const needed = new Set(agentsOf(ast).flatMap((a) => a.reads ?? []));
|
|
118
|
+
return [...needed]
|
|
119
|
+
.filter((p) => !produced.has(p))
|
|
120
|
+
.sort()
|
|
121
|
+
.map((p) => {
|
|
122
|
+
const absolute = abs(root, p);
|
|
123
|
+
// A directory prefix like "workspace/raw/" is a legal `reads` target, so
|
|
124
|
+
// existsSync covers both files and dirs.
|
|
125
|
+
return { path: p, absolute, exists: existsSync(absolute) };
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The node and output a condition tests, from `x.y == v`.
|
|
130
|
+
*
|
|
131
|
+
* The SUBJECT is `x`, which is not necessarily the edge's source. In
|
|
132
|
+
* `worker -> judge [when judge.verdict == fail]` the edge leaves `worker` but
|
|
133
|
+
* the condition tests `judge`. Heading the table with the edge source produced
|
|
134
|
+
* `worker.verdict` — a node/output pair that does not exist.
|
|
135
|
+
*/
|
|
136
|
+
function conditionSubject(condition) {
|
|
137
|
+
const m = /([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)/.exec(condition ?? "");
|
|
138
|
+
return { node: m?.[1] ?? "?", key: m?.[2] ?? "?" };
|
|
139
|
+
}
|
|
140
|
+
function computeRoutes(ast) {
|
|
141
|
+
// Group by (source, output key). A node may route on more than one output,
|
|
142
|
+
// and each is a separate decision with its own exhaustiveness.
|
|
143
|
+
const groups = new Map();
|
|
144
|
+
const fallbacksByFrom = new Map();
|
|
145
|
+
for (const e of ast.edges) {
|
|
146
|
+
if (e.isError)
|
|
147
|
+
continue;
|
|
148
|
+
if (!e.condition) {
|
|
149
|
+
// An unconditional out-edge is the default path. Dropping it while
|
|
150
|
+
// telling the host to halt when nothing matches sent runs into a dead
|
|
151
|
+
// end that the topology had an answer for.
|
|
152
|
+
if (!fallbacksByFrom.has(e.from))
|
|
153
|
+
fallbacksByFrom.set(e.from, []);
|
|
154
|
+
fallbacksByFrom.get(e.from).push(e);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const { node: subject, key } = conditionSubject(e.condition);
|
|
158
|
+
// Group by the DECISION — the node and output actually tested — not by the
|
|
159
|
+
// edge's source.
|
|
160
|
+
const id = `${subject}\u0000${key}`;
|
|
161
|
+
if (!groups.has(id))
|
|
162
|
+
groups.set(id, { from: e.from, subject, key, edges: [] });
|
|
163
|
+
groups.get(id).edges.push(e);
|
|
164
|
+
}
|
|
165
|
+
return [...groups.values()].map((g) => ({
|
|
166
|
+
...g,
|
|
167
|
+
fallbacks: fallbacksByFrom.get(g.from) ?? [],
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
function computeUnenforceable(ast) {
|
|
171
|
+
const out = [];
|
|
172
|
+
for (const a of agentsOf(ast)) {
|
|
173
|
+
if (a.tools?.length)
|
|
174
|
+
out.push({ node: a.id, field: "tools", declared: a.tools });
|
|
175
|
+
if (a.disallowedTools?.length)
|
|
176
|
+
out.push({ node: a.id, field: "disallowed-tools", declared: a.disallowedTools });
|
|
177
|
+
if (a.mcpServers?.length)
|
|
178
|
+
out.push({ node: a.id, field: "mcp-servers", declared: a.mcpServers });
|
|
179
|
+
}
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
function computePreflagged(ast, handoffs, unenforceable, persistent, preconditions) {
|
|
183
|
+
const out = [];
|
|
184
|
+
// An agent with no authored prompt: its whole instruction set is its role line.
|
|
185
|
+
for (const a of agentsOf(ast)) {
|
|
186
|
+
if (!a.prompt) {
|
|
187
|
+
out.push({
|
|
188
|
+
kind: "prompt-missing",
|
|
189
|
+
at: { section: "3", node: a.id },
|
|
190
|
+
question: `"${a.id}" declares no prompt block; its instructions are its role line alone.`,
|
|
191
|
+
alternatives: ["compose from role + reads/writes", "ask the human for intent"],
|
|
192
|
+
fix: `add a prompt { } block to agent ${a.id}`,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// A live edge across which nothing crosses: the host must invent the handoff.
|
|
197
|
+
for (const h of handoffs) {
|
|
198
|
+
if (h.passes.length === 0) {
|
|
199
|
+
out.push({
|
|
200
|
+
kind: "handoff-overlap-empty",
|
|
201
|
+
at: { section: "4", edge: `${h.from}->${h.to}` },
|
|
202
|
+
question: `${h.from}.writes and ${h.to}.reads do not overlap; nothing is declared to cross this edge.`,
|
|
203
|
+
alternatives: [
|
|
204
|
+
"pass the writer's output text inline",
|
|
205
|
+
`add one of ${h.from}'s writes to ${h.to}.reads`,
|
|
206
|
+
],
|
|
207
|
+
fix: `add a shared path to agent ${h.to} reads:`,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// A gate that is both advisory and asks to bounce back is self-contradictory.
|
|
212
|
+
for (const g of ast.nodes.filter((n) => n.type === "gate")) {
|
|
213
|
+
if (g.behavior === "advisory" && g.onFail && g.onFail !== "continue") {
|
|
214
|
+
out.push({
|
|
215
|
+
kind: "gate-conflict-resolved",
|
|
216
|
+
at: { section: "7", node: g.id },
|
|
217
|
+
question: `gate "${g.id}" is advisory but declares on-fail: ${g.onFail}. Advisory wins; on-fail is ignored.`,
|
|
218
|
+
alternatives: ["treat as blocking", "treat as advisory"],
|
|
219
|
+
fix: `remove behavior: advisory from gate ${g.id}, or set on-fail: continue`,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (unenforceable.length) {
|
|
224
|
+
const nodes = [...new Set(unenforceable.map((u) => u.node))];
|
|
225
|
+
out.push({
|
|
226
|
+
kind: "tool-restriction-unenforced",
|
|
227
|
+
at: { section: "8" },
|
|
228
|
+
question: `${nodes.length} role(s) declare tool or MCP restrictions the host cannot set inline.`,
|
|
229
|
+
alternatives: ["spawn unrestricted and restate as a prompt contract", "scaffold instead"],
|
|
230
|
+
fix: "agentopology scaffold <file> --target claude-code",
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
for (const pre of preconditions) {
|
|
234
|
+
if (pre.exists)
|
|
235
|
+
continue;
|
|
236
|
+
out.push({
|
|
237
|
+
kind: "precondition-missing",
|
|
238
|
+
at: { section: "2" },
|
|
239
|
+
question: `run input \`${pre.path}\` is read by a role, produced by none, and does not exist at ${pre.absolute}.`,
|
|
240
|
+
alternatives: ["stop and ask the human", "let the first reader discover it"],
|
|
241
|
+
fix: `create ${pre.path}, or add a role that writes it`,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
if (persistent.length) {
|
|
245
|
+
out.push({
|
|
246
|
+
kind: "persistent-feature-ignored",
|
|
247
|
+
at: { section: "9" },
|
|
248
|
+
question: `${persistent.length} inherently-persistent feature(s) declared; they cannot run fileless.`,
|
|
249
|
+
alternatives: ["run the rest and name them", "scaffold instead"],
|
|
250
|
+
fix: "agentopology scaffold <file>",
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return out;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Build the execution brief structure for a topology.
|
|
257
|
+
*
|
|
258
|
+
* @param rawAst - A parsed topology. Defaults are resolved internally.
|
|
259
|
+
* @param opts - Autonomy notch, source path, log path, validation results.
|
|
260
|
+
* @returns The typed brief. Render it with {@link renderBriefMarkdown}.
|
|
261
|
+
*/
|
|
262
|
+
export function buildExecutionBrief(rawAst, opts = {}) {
|
|
263
|
+
const root = resolvePath(opts.root ?? process.cwd());
|
|
264
|
+
const { ast, applied } = resolveDefaults(rawAst);
|
|
265
|
+
const { steps, loops, orchestrator } = resolveOrder(ast);
|
|
266
|
+
const handoffs = computeHandoffs(ast);
|
|
267
|
+
const blindPairs = computeBlindPairs(steps, ast);
|
|
268
|
+
const unenforceable = computeUnenforceable(ast);
|
|
269
|
+
const persistent = persistentFeatures(ast);
|
|
270
|
+
const preconditions = computePreconditions(ast, root);
|
|
271
|
+
const preflagged = computePreflagged(ast, handoffs, unenforceable, persistent, preconditions);
|
|
272
|
+
const stepOf = new Map();
|
|
273
|
+
for (const s of steps)
|
|
274
|
+
for (const id of s.ids)
|
|
275
|
+
stepOf.set(id, s);
|
|
276
|
+
// Withholds belong to the RECEIVER: for each inbound edge, the paths its
|
|
277
|
+
// upstream writer produced but did not offer to this reader.
|
|
278
|
+
const withheldFromReader = new Map();
|
|
279
|
+
for (const h of handoffs) {
|
|
280
|
+
if (!withheldFromReader.has(h.to))
|
|
281
|
+
withheldFromReader.set(h.to, new Set());
|
|
282
|
+
for (const w of h.withholds)
|
|
283
|
+
withheldFromReader.get(h.to).add(w);
|
|
284
|
+
}
|
|
285
|
+
const roles = agentsOf(ast).map((a) => {
|
|
286
|
+
const blindTo = blindPairs
|
|
287
|
+
.filter((p) => p.a === a.id || p.b === a.id)
|
|
288
|
+
.map((p) => (p.a === a.id ? p.b : p.a));
|
|
289
|
+
return {
|
|
290
|
+
id: a.id,
|
|
291
|
+
model: a.model,
|
|
292
|
+
isolation: a.isolation,
|
|
293
|
+
prompt: a.prompt ?? null,
|
|
294
|
+
role: a.role ?? a.description ?? a.id,
|
|
295
|
+
reads: a.reads ?? [],
|
|
296
|
+
writes: a.writes ?? [],
|
|
297
|
+
readsAbs: (a.reads ?? []).map((p) => abs(root, p)),
|
|
298
|
+
writesAbs: (a.writes ?? []).map((p) => abs(root, p)),
|
|
299
|
+
mustNotRead: [...(withheldFromReader.get(a.id) ?? [])],
|
|
300
|
+
mustNotReadAbs: [...(withheldFromReader.get(a.id) ?? [])].map((p) => abs(root, p)),
|
|
301
|
+
blindTo,
|
|
302
|
+
outputs: a.outputs ?? {},
|
|
303
|
+
declaredTools: a.tools,
|
|
304
|
+
fileless: !(a.tools?.length || a.disallowedTools?.length || a.mcpServers?.length),
|
|
305
|
+
};
|
|
306
|
+
});
|
|
307
|
+
return {
|
|
308
|
+
topology: ast.topology.name,
|
|
309
|
+
version: ast.topology.version ?? "0.0.0",
|
|
310
|
+
source: opts.source ?? "<stdin>",
|
|
311
|
+
root,
|
|
312
|
+
task: opts.task ?? null,
|
|
313
|
+
revision: opts.revision ?? null,
|
|
314
|
+
autonomy: opts.autonomy ?? "execute",
|
|
315
|
+
ambiguityLog: opts.ambiguityLog ?? null,
|
|
316
|
+
errors: opts.errors ?? [],
|
|
317
|
+
steps,
|
|
318
|
+
preconditions,
|
|
319
|
+
roles,
|
|
320
|
+
handoffs,
|
|
321
|
+
blindPairs,
|
|
322
|
+
routes: computeRoutes(ast),
|
|
323
|
+
loops,
|
|
324
|
+
gates: ast.nodes
|
|
325
|
+
.filter((n) => n.type === "gate")
|
|
326
|
+
.map((g) => ({
|
|
327
|
+
id: g.id,
|
|
328
|
+
after: g.after,
|
|
329
|
+
before: g.before,
|
|
330
|
+
tier: gateTier(g),
|
|
331
|
+
run: g.run,
|
|
332
|
+
blocking: g.behavior !== "advisory",
|
|
333
|
+
onFail: g.onFail ?? "halt",
|
|
334
|
+
})),
|
|
335
|
+
unenforceable,
|
|
336
|
+
persistent,
|
|
337
|
+
preflagged,
|
|
338
|
+
defaultsApplied: applied,
|
|
339
|
+
orchestrator,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brief.js","sourceRoot":"","sources":["../../src/plan/brief.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders an {@link ExecutionBrief} as the Markdown document a host coding
|
|
3
|
+
* agent executes.
|
|
4
|
+
*
|
|
5
|
+
* The document is a program, not documentation. Section numbers and headings
|
|
6
|
+
* are fixed, and every section is emitted even when empty — an empty section
|
|
7
|
+
* is information ("no MCP servers declared") rather than an omission the host
|
|
8
|
+
* has to interpret.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { ExecutionBrief } from "./brief.js";
|
|
13
|
+
/**
|
|
14
|
+
* Render the brief.
|
|
15
|
+
*
|
|
16
|
+
* @param brief - A structure from `buildExecutionBrief`.
|
|
17
|
+
* @returns The Markdown document, with no trailing newline.
|
|
18
|
+
*/
|
|
19
|
+
export declare function renderBriefMarkdown(brief: ExecutionBrief): string;
|
|
20
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/plan/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAqFrE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAuWjE"}
|