agentopology 0.2.5 → 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 +121 -7
- 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 +102 -3
- 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 +344 -5
- 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 +1553 -207
- 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/ast.d.ts +39 -0
- package/dist/parser/ast.d.ts.map +1 -1
- package/dist/parser/index.d.ts +50 -6
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +241 -30
- 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 +143 -5
- 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__/brain.test.d.ts +2 -0
- package/dist/visualizer/__tests__/brain.test.d.ts.map +1 -0
- package/dist/visualizer/__tests__/brain.test.js +138 -0
- package/dist/visualizer/__tests__/brain.test.js.map +1 -0
- package/dist/visualizer/__tests__/topology-brain-link.test.d.ts +2 -0
- package/dist/visualizer/__tests__/topology-brain-link.test.d.ts.map +1 -0
- package/dist/visualizer/__tests__/topology-brain-link.test.js +56 -0
- package/dist/visualizer/__tests__/topology-brain-link.test.js.map +1 -0
- package/dist/visualizer/brain.d.ts +97 -0
- package/dist/visualizer/brain.d.ts.map +1 -0
- package/dist/visualizer/brain.js +473 -0
- package/dist/visualizer/brain.js.map +1 -0
- package/dist/visualizer/index.d.ts +19 -1
- package/dist/visualizer/index.d.ts.map +1 -1
- package/dist/visualizer/index.js +26 -11
- package/dist/visualizer/index.js.map +1 -1
- package/examples/code-review.at +32 -4
- package/examples/company-brain-team.at +241 -0
- package/examples/company-brain.at +104 -0
- package/examples/data-processing.at +33 -4
- package/examples/logos/gmail.svg +1 -0
- package/examples/logos/slack.svg +1 -0
- package/package.json +1 -1
- package/spec/grammar.md +55 -3
- package/spec/validation.md +103 -35
|
@@ -0,0 +1,425 @@
|
|
|
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
|
+
const TIER_NOTE = {
|
|
13
|
+
preventive: "tool allowlist — needs a file, unavailable here",
|
|
14
|
+
enforced: "hook exit 2 — needs a file, unavailable here",
|
|
15
|
+
"fileless-verify": "Workflow script — Claude Code only",
|
|
16
|
+
"evidence-orchestrator": "you run the command and read the exit code",
|
|
17
|
+
"evidence-agent": "the agent runs it and reports the exit code",
|
|
18
|
+
advisory: "declared advisory — record the result, never block",
|
|
19
|
+
};
|
|
20
|
+
function fence(body) {
|
|
21
|
+
return ["~~~", body, "~~~"].join("\n");
|
|
22
|
+
}
|
|
23
|
+
function rolePrompt(brief, role) {
|
|
24
|
+
const lines = [];
|
|
25
|
+
lines.push("TASK CONTEXT");
|
|
26
|
+
lines.push(brief.task ?? "{{TASK}}");
|
|
27
|
+
lines.push("");
|
|
28
|
+
lines.push(`You are \`${role.id}\` in the topology \`${brief.topology}\`.`);
|
|
29
|
+
lines.push("");
|
|
30
|
+
lines.push("ROLE");
|
|
31
|
+
lines.push(role.role);
|
|
32
|
+
if (role.prompt) {
|
|
33
|
+
lines.push("");
|
|
34
|
+
lines.push("INSTRUCTIONS");
|
|
35
|
+
lines.push(role.prompt);
|
|
36
|
+
}
|
|
37
|
+
if (role.readsAbs.length) {
|
|
38
|
+
lines.push("");
|
|
39
|
+
lines.push("INPUTS — read exactly these paths. They are absolute; use them as given.");
|
|
40
|
+
for (const r of role.readsAbs)
|
|
41
|
+
lines.push(` ${r}`);
|
|
42
|
+
}
|
|
43
|
+
if (role.writesAbs.length) {
|
|
44
|
+
lines.push("");
|
|
45
|
+
lines.push("OUTPUTS — write exactly these paths. They are absolute; use them as given.");
|
|
46
|
+
for (const w of role.writesAbs)
|
|
47
|
+
lines.push(` ${w}`);
|
|
48
|
+
}
|
|
49
|
+
if (role.blindTo.length) {
|
|
50
|
+
lines.push("");
|
|
51
|
+
lines.push("ISOLATION");
|
|
52
|
+
lines.push(`${role.blindTo.join(" and ")} ${role.blindTo.length > 1 ? "are" : "is"} running right now on the same task. ` +
|
|
53
|
+
"You must not read, ask for, or speculate about that work.");
|
|
54
|
+
}
|
|
55
|
+
if (role.mustNotReadAbs.length) {
|
|
56
|
+
lines.push("");
|
|
57
|
+
lines.push("WITHHELD — an upstream role wrote these and they are on disk. You must");
|
|
58
|
+
lines.push("not read them, and must not ask for their contents:");
|
|
59
|
+
for (const w of role.mustNotReadAbs)
|
|
60
|
+
lines.push(` ${w}`);
|
|
61
|
+
lines.push("");
|
|
62
|
+
lines.push("This is deliberate. If you find yourself wanting one, that is the signal");
|
|
63
|
+
lines.push("the design is protecting — say so in your reply rather than reading it.");
|
|
64
|
+
}
|
|
65
|
+
if (role.declaredTools?.length) {
|
|
66
|
+
lines.push("");
|
|
67
|
+
lines.push("TOOL POLICY — DECLARED BUT NOT ENFORCED");
|
|
68
|
+
lines.push(`This role declares tools: [${role.declaredTools.join(", ")}]. The host cannot ` +
|
|
69
|
+
"restrict your tools at runtime. Confine yourself to them as a matter of contract.");
|
|
70
|
+
}
|
|
71
|
+
const keys = Object.keys(role.outputs);
|
|
72
|
+
lines.push("");
|
|
73
|
+
lines.push("RETURN PROTOCOL");
|
|
74
|
+
lines.push("End your reply with exactly one fenced block, and nothing after it:");
|
|
75
|
+
lines.push("");
|
|
76
|
+
lines.push("```at-output");
|
|
77
|
+
for (const k of keys)
|
|
78
|
+
lines.push(`${k}: <${role.outputs[k].join("|")}>`);
|
|
79
|
+
for (const w of role.writesAbs)
|
|
80
|
+
lines.push(`wrote: ${w}`);
|
|
81
|
+
if (!keys.length && !role.writesAbs.length)
|
|
82
|
+
lines.push("done: yes");
|
|
83
|
+
lines.push("```");
|
|
84
|
+
return lines.join("\n");
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Render the brief.
|
|
88
|
+
*
|
|
89
|
+
* @param brief - A structure from `buildExecutionBrief`.
|
|
90
|
+
* @returns The Markdown document, with no trailing newline.
|
|
91
|
+
*/
|
|
92
|
+
export function renderBriefMarkdown(brief) {
|
|
93
|
+
const L = [];
|
|
94
|
+
L.push("---");
|
|
95
|
+
L.push("brief: agentopology/v1");
|
|
96
|
+
L.push(`topology: ${brief.topology}@${brief.version}`);
|
|
97
|
+
L.push(`source: ${brief.source}`);
|
|
98
|
+
L.push(`root: ${brief.root}`);
|
|
99
|
+
if (brief.revision)
|
|
100
|
+
L.push(`revision: ${brief.revision}`);
|
|
101
|
+
L.push(`autonomy: ${brief.autonomy}`);
|
|
102
|
+
if (brief.ambiguityLog)
|
|
103
|
+
L.push(`ambiguity-log: ${brief.ambiguityLog}`);
|
|
104
|
+
L.push("---");
|
|
105
|
+
L.push("");
|
|
106
|
+
if (brief.errors.length) {
|
|
107
|
+
L.push("# ⛔ DO NOT ENACT — the topology does not validate");
|
|
108
|
+
L.push("");
|
|
109
|
+
for (const e of brief.errors) {
|
|
110
|
+
L.push(`- **[${e.rule}]** ${e.node ? `\`${e.node}\`: ` : ""}${e.message}`);
|
|
111
|
+
}
|
|
112
|
+
L.push("");
|
|
113
|
+
L.push("Fix the source file and re-run `agentopology plan`.");
|
|
114
|
+
return L.join("\n");
|
|
115
|
+
}
|
|
116
|
+
// §0 -----------------------------------------------------------------
|
|
117
|
+
L.push("# §0 — Enactment loop");
|
|
118
|
+
L.push("");
|
|
119
|
+
L.push("You are the interpreter for this brief. It is a program, not documentation.");
|
|
120
|
+
L.push("");
|
|
121
|
+
L.push("1. Adopt the autonomy notch in §1. It governs every announcement below.");
|
|
122
|
+
L.push("2. Verify §2's preconditions. If a run input is missing, stop and ask.");
|
|
123
|
+
L.push("3. Walk §2's step table **strictly in order**. Before each step print one line:");
|
|
124
|
+
L.push(` \`[${brief.topology}] step N/${brief.steps.length} — <id> — <kind>\`.`);
|
|
125
|
+
L.push(" Print it under **every** notch, `auto` included.");
|
|
126
|
+
L.push("4. For a step with two or more roles, issue **all Agent calls in a single");
|
|
127
|
+
L.push(" message** before reading any result. This is not an optimisation — it is");
|
|
128
|
+
L.push(" how §4's isolation is enforced. If you have not yet seen a sibling's");
|
|
129
|
+
L.push(" output when you compose its neighbour's prompt, you cannot leak it.");
|
|
130
|
+
L.push("5. Spawn with the role card's parameters and its prompt verbatim. The task");
|
|
131
|
+
L.push(" text is in §1b — it is already substituted into each prompt unless the");
|
|
132
|
+
L.push(" prompt still shows a literal `{{TASK}}`, in which case put the user's");
|
|
133
|
+
L.push(" request there. You may change nothing else in a prompt.");
|
|
134
|
+
L.push(" `name` is a CONVENIENCE, not a requirement. Some hosts reject it (\"Teammates");
|
|
135
|
+
L.push(" cannot spawn other teammates\"). If a spawn is rejected for `name`, drop it");
|
|
136
|
+
L.push(" and re-dispatch — do not treat that as a failed step.");
|
|
137
|
+
L.push("6. Extract each reply's ```at-output``` block. Resolve each declared output:");
|
|
138
|
+
L.push(" **T1 contract** (key present, value in enum) → **T2 scan** (find enum tokens");
|
|
139
|
+
L.push(" in the reply; exactly one distinct token wins) → **T3 infer** (you decide).");
|
|
140
|
+
L.push(" Log T2 and T3. **If T3 fires on the FIRST subagent of the run, stop and ask**");
|
|
141
|
+
L.push(" regardless of notch — that subagent is the canary for whether this host");
|
|
142
|
+
L.push(" honours the protocol at all.");
|
|
143
|
+
L.push("7. Run gates per §7. Route per §5. Decrement loop budgets per §6.");
|
|
144
|
+
L.push("8. Close with: steps run · roles spawned · outputs resolved (by contract / by");
|
|
145
|
+
L.push(" scan / by inference) · gate exit codes · loop traversals used · one line per");
|
|
146
|
+
L.push(" ambiguity recorded, with its `fix:`.");
|
|
147
|
+
L.push("");
|
|
148
|
+
if (brief.revision) {
|
|
149
|
+
L.push(`The source tree was at \`${brief.revision}\` when this brief was built. If it moved ` +
|
|
150
|
+
"under you mid-run, say so — a role may have read a file that has since changed.");
|
|
151
|
+
L.push("");
|
|
152
|
+
}
|
|
153
|
+
// §1 -----------------------------------------------------------------
|
|
154
|
+
L.push("# §1 — Run contract");
|
|
155
|
+
L.push("");
|
|
156
|
+
L.push(`Notch for this run: **${brief.autonomy}**.`);
|
|
157
|
+
L.push("");
|
|
158
|
+
L.push("| notch | before the run | material rewrite | ambiguity |");
|
|
159
|
+
L.push("|---|---|---|---|");
|
|
160
|
+
L.push("| plan | show this brief, wait for a word | show diff, wait | ask |");
|
|
161
|
+
L.push("| execute | run | announce, proceed | announce, proceed |");
|
|
162
|
+
L.push("| auto | run | silent, report at end | record only |");
|
|
163
|
+
L.push("");
|
|
164
|
+
if (brief.orchestrator) {
|
|
165
|
+
L.push(`The orchestrator \`${brief.orchestrator}\` is **you**. Do not spawn it as a subagent.`);
|
|
166
|
+
L.push("");
|
|
167
|
+
}
|
|
168
|
+
// §1b ----------------------------------------------------------------
|
|
169
|
+
L.push("# §1b — Run inputs");
|
|
170
|
+
L.push("");
|
|
171
|
+
L.push(`**Root.** Every path in this brief is absolute, resolved against \`${brief.root}\`.`);
|
|
172
|
+
L.push("Use them exactly as written. Do not re-resolve them against your own working");
|
|
173
|
+
L.push("directory — sibling roles that normalise the same relative path differently");
|
|
174
|
+
L.push("break the handoff in §4 silently.");
|
|
175
|
+
L.push("");
|
|
176
|
+
if (brief.task) {
|
|
177
|
+
L.push("**Task.** This is what the run is for. It is already substituted into every");
|
|
178
|
+
L.push("role prompt below:");
|
|
179
|
+
L.push("");
|
|
180
|
+
L.push("> " + brief.task.split("\n").join("\n> "));
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
L.push("**Task.** None was given to `plan`, so role prompts carry a literal");
|
|
184
|
+
L.push("`{{TASK}}`. Substitute the user's actual request there before spawning, and");
|
|
185
|
+
L.push("use the same text for every role — they are working on one task, not several.");
|
|
186
|
+
L.push("Pass `--task \"...\"` to have `plan` bake it in instead.");
|
|
187
|
+
}
|
|
188
|
+
L.push("");
|
|
189
|
+
// §2 -----------------------------------------------------------------
|
|
190
|
+
L.push("# §2 — Execution order");
|
|
191
|
+
L.push("");
|
|
192
|
+
if (brief.preconditions.length) {
|
|
193
|
+
L.push("Preconditions — read by a role but produced by none, so they must exist first.");
|
|
194
|
+
L.push("Checked on disk at plan time:");
|
|
195
|
+
L.push("");
|
|
196
|
+
for (const p of brief.preconditions) {
|
|
197
|
+
L.push(` ${p.exists ? "✅" : "⛔ MISSING"} ${p.absolute}`);
|
|
198
|
+
}
|
|
199
|
+
const missing = brief.preconditions.filter((p) => !p.exists);
|
|
200
|
+
if (missing.length) {
|
|
201
|
+
L.push("");
|
|
202
|
+
L.push(`**${missing.length} run input(s) do not exist.** Stop and ask before step 1 — ` +
|
|
203
|
+
"the first role to need one will fail, and it will fail late.");
|
|
204
|
+
}
|
|
205
|
+
L.push("");
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
L.push("No preconditions — every declared input is produced inside the run.");
|
|
209
|
+
L.push("");
|
|
210
|
+
}
|
|
211
|
+
L.push("| step | kind | id(s) | depth |");
|
|
212
|
+
L.push("|---|---|---|---|");
|
|
213
|
+
for (const s of brief.steps) {
|
|
214
|
+
const note = s.ids.length > 1 ? " *(parallel, mutually blind)*" : "";
|
|
215
|
+
L.push(`| ${s.index} | ${s.kind} | \`${s.ids.join("`, `")}\`${note} | ${s.depth ?? "spliced"} |`);
|
|
216
|
+
}
|
|
217
|
+
L.push("");
|
|
218
|
+
// §3 -----------------------------------------------------------------
|
|
219
|
+
L.push("# §3 — Role cards");
|
|
220
|
+
L.push("");
|
|
221
|
+
L.push(brief.task
|
|
222
|
+
? "Spawn parameters, then the prompt verbatim. The task is already substituted — change nothing."
|
|
223
|
+
: "Spawn parameters, then the prompt verbatim. Substitute the task where the prompt shows a placeholder; change nothing else.");
|
|
224
|
+
L.push("");
|
|
225
|
+
for (const role of brief.roles) {
|
|
226
|
+
L.push(`### \`${role.id}\``);
|
|
227
|
+
L.push("");
|
|
228
|
+
L.push("| param | value |");
|
|
229
|
+
L.push("|---|---|");
|
|
230
|
+
L.push("| `subagent_type` | `general-purpose` |");
|
|
231
|
+
L.push(`| \`name\` | \`${role.id}\` — optional; drop it if the host rejects it |`);
|
|
232
|
+
L.push(`| \`model\` | ${role.model ? `\`${role.model}\`` : "— (inherit)"} |`);
|
|
233
|
+
L.push(`| \`isolation\` | ${role.isolation ? `\`${role.isolation}\`` : "—"} |`);
|
|
234
|
+
L.push("");
|
|
235
|
+
L.push(fence(rolePrompt(brief, role)));
|
|
236
|
+
L.push("");
|
|
237
|
+
}
|
|
238
|
+
// §4 -----------------------------------------------------------------
|
|
239
|
+
L.push("# §4 — Handoffs and isolation");
|
|
240
|
+
L.push("");
|
|
241
|
+
L.push("`passes` = writer's `writes` ∩ reader's `reads`. `withholds` = the rest of the");
|
|
242
|
+
L.push("writer's `writes`. Both computed from one intersection, so they cannot drift.");
|
|
243
|
+
L.push("");
|
|
244
|
+
if (brief.handoffs.length) {
|
|
245
|
+
L.push("| edge | passes | withholds |");
|
|
246
|
+
L.push("|---|---|---|");
|
|
247
|
+
for (const h of brief.handoffs) {
|
|
248
|
+
const warn = h.passes.length === 0 ? " ⚠ **nothing declared crosses**" : "";
|
|
249
|
+
L.push(`| \`${h.from} → ${h.to}\` | ${h.passes.map((p) => `\`${p}\``).join(", ") || "—"}${warn} | ${h.withholds.map((p) => `\`${p}\``).join(", ") || "—"} |`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
L.push("No agent-to-agent edges.");
|
|
254
|
+
}
|
|
255
|
+
L.push("");
|
|
256
|
+
if (brief.blindPairs.length) {
|
|
257
|
+
L.push("Mutually blind — same step, no edge between them:");
|
|
258
|
+
L.push("");
|
|
259
|
+
for (const p of brief.blindPairs)
|
|
260
|
+
L.push(`- step ${p.step}: \`${p.a}\` ⟂ \`${p.b}\``);
|
|
261
|
+
L.push("");
|
|
262
|
+
}
|
|
263
|
+
// §5 -----------------------------------------------------------------
|
|
264
|
+
L.push("# §5 — Routing");
|
|
265
|
+
L.push("");
|
|
266
|
+
if (brief.routes.length) {
|
|
267
|
+
for (const r of brief.routes) {
|
|
268
|
+
L.push(`**On \`${r.subject}.${r.key}\`:**`);
|
|
269
|
+
L.push("");
|
|
270
|
+
L.push("| condition | go to | budget |");
|
|
271
|
+
L.push("|---|---|---|");
|
|
272
|
+
for (const e of r.edges) {
|
|
273
|
+
L.push(`| \`${e.condition}\` | \`${e.to}\` | ${e.maxIterations ? `max ${e.maxIterations}` : "—"} |`);
|
|
274
|
+
}
|
|
275
|
+
if (r.fallbacks.length) {
|
|
276
|
+
for (const f of r.fallbacks) {
|
|
277
|
+
L.push(`| *(no condition — default)* | \`${f.to}\` | — |`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
L.push("");
|
|
281
|
+
}
|
|
282
|
+
const anyFallback = brief.routes.some((r) => r.fallbacks.length > 0);
|
|
283
|
+
L.push(anyFallback
|
|
284
|
+
? "If no condition matches, take the unconditional default row. Only if there is none, log `route-unmatched` and stop. Never guess."
|
|
285
|
+
: "If no condition matches at runtime, log `route-unmatched` and stop. Never guess.");
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
L.push("No conditional edges — the order in §2 is the whole control flow.");
|
|
289
|
+
}
|
|
290
|
+
L.push("");
|
|
291
|
+
// §6 -----------------------------------------------------------------
|
|
292
|
+
L.push("# §6 — Loops");
|
|
293
|
+
L.push("");
|
|
294
|
+
if (brief.loops.length) {
|
|
295
|
+
L.push("| back-edge | condition | budget | note |");
|
|
296
|
+
L.push("|---|---|---|---|");
|
|
297
|
+
for (const l of brief.loops) {
|
|
298
|
+
const note = l.budget
|
|
299
|
+
? `\`max ${l.budget}\` bounds TRAVERSALS, so \`${l.to}\` runs at most ${l.budget + 1} times`
|
|
300
|
+
: "⚠ unbounded — V6 should have caught this";
|
|
301
|
+
L.push(`| \`${l.from} → ${l.to}\` | \`${l.condition ?? "—"}\` | ${l.budget ?? "∞"} | ${note} |`);
|
|
302
|
+
}
|
|
303
|
+
L.push("");
|
|
304
|
+
L.push("A re-spawned role is a **fresh context**. Tell it which attempt it is on and");
|
|
305
|
+
L.push("where the previous verdict lives. On exhaustion, take the other outgoing edge");
|
|
306
|
+
L.push("and log `loop-budget-exhausted`.");
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
L.push("No loops.");
|
|
310
|
+
}
|
|
311
|
+
L.push("");
|
|
312
|
+
// §7 -----------------------------------------------------------------
|
|
313
|
+
L.push("# §7 — Gates");
|
|
314
|
+
L.push("");
|
|
315
|
+
if (brief.gates.length) {
|
|
316
|
+
L.push("| gate | anchor | tier | mechanism | blocking |");
|
|
317
|
+
L.push("|---|---|---|---|---|");
|
|
318
|
+
for (const g of brief.gates) {
|
|
319
|
+
// A gate may anchor by `after`, by `before`, or both. Rendering only
|
|
320
|
+
// `after` made a before-only gate read as anchored to nothing.
|
|
321
|
+
const anchor = [
|
|
322
|
+
g.after ? `after \`${g.after}\`` : "",
|
|
323
|
+
g.before ? `before \`${g.before}\`` : "",
|
|
324
|
+
]
|
|
325
|
+
.filter(Boolean)
|
|
326
|
+
.join(", ");
|
|
327
|
+
L.push(`| \`${g.id}\` | ${anchor || "⚠ unanchored — runs last"} | ${g.tier} | ${TIER_NOTE[g.tier]} | ${g.blocking ? `yes · on-fail: ${g.onFail}` : "no"} |`);
|
|
328
|
+
}
|
|
329
|
+
L.push("");
|
|
330
|
+
for (const g of brief.gates) {
|
|
331
|
+
if (g.run)
|
|
332
|
+
L.push(`- \`${g.id}\`: run \`${g.run}\` and record the exit code.`);
|
|
333
|
+
}
|
|
334
|
+
L.push("");
|
|
335
|
+
L.push("Tiers 1 and 2 (tool allowlist, hook exit 2) both need files and are unreachable");
|
|
336
|
+
L.push("in interpreted mode. The evidence contract is the strongest portable tier: a");
|
|
337
|
+
L.push("skipped check is **visible** as missing evidence rather than a silent pass.");
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
L.push("No gates declared.");
|
|
341
|
+
}
|
|
342
|
+
L.push("");
|
|
343
|
+
// §8 -----------------------------------------------------------------
|
|
344
|
+
L.push("# §8 — Declared but not enforceable");
|
|
345
|
+
L.push("");
|
|
346
|
+
L.push("The Agent tool accepts only `subagent_type`, `model`, `isolation`, `prompt`,");
|
|
347
|
+
L.push("`name`. Everything below was declared and cannot be imposed at runtime. Each is");
|
|
348
|
+
L.push("restated inside the relevant prompt as a contract.");
|
|
349
|
+
L.push("");
|
|
350
|
+
if (brief.unenforceable.length) {
|
|
351
|
+
L.push("| role | declared | consequence |");
|
|
352
|
+
L.push("|---|---|---|");
|
|
353
|
+
for (const u of brief.unenforceable) {
|
|
354
|
+
L.push(`| \`${u.node}\` | \`${u.field}: ${JSON.stringify(u.declared)}\` | runs unrestricted |`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
L.push("Nothing — every role runs with the host's default capability.");
|
|
359
|
+
}
|
|
360
|
+
L.push("");
|
|
361
|
+
// §9 -----------------------------------------------------------------
|
|
362
|
+
L.push("# §9 — Present but needs `scaffold`");
|
|
363
|
+
L.push("");
|
|
364
|
+
L.push("Five features are platform **registrations**, not steps in a run. They cannot");
|
|
365
|
+
L.push("work fileless on any vendor.");
|
|
366
|
+
L.push("");
|
|
367
|
+
L.push("| feature | declared |");
|
|
368
|
+
L.push("|---|---|");
|
|
369
|
+
const all = [
|
|
370
|
+
"triggers / slash commands",
|
|
371
|
+
"schedules / cron",
|
|
372
|
+
"mcp-servers",
|
|
373
|
+
"hooks",
|
|
374
|
+
"per-agent tools / permissions",
|
|
375
|
+
];
|
|
376
|
+
const found = new Map(brief.persistent.map((p) => [p.feature, p.count]));
|
|
377
|
+
for (const f of all)
|
|
378
|
+
L.push(`| ${f} | ${found.get(f) ?? "none"} |`);
|
|
379
|
+
L.push("");
|
|
380
|
+
if (brief.persistent.length) {
|
|
381
|
+
L.push(`**${brief.persistent.length} of 5 present.** Run \`agentopology scaffold ${brief.source}\` if these must bind.`);
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
L.push("None present — this topology runs fully fileless.");
|
|
385
|
+
}
|
|
386
|
+
L.push("");
|
|
387
|
+
// §10 ----------------------------------------------------------------
|
|
388
|
+
L.push("# §10 — Ambiguity log");
|
|
389
|
+
L.push("");
|
|
390
|
+
if (brief.ambiguityLog) {
|
|
391
|
+
L.push(`Append one JSON object per line to \`${brief.ambiguityLog}\`.`);
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
L.push("No log path was given. Hold records in context and print them in the closing report.");
|
|
395
|
+
}
|
|
396
|
+
L.push("");
|
|
397
|
+
L.push("Session scratchpad only. Never write it into the repo, never append to a shared or global log.");
|
|
398
|
+
L.push("");
|
|
399
|
+
L.push("Fields: `ts` · `run` · `kind` · `at` · `question` · `chose` · `alternatives` ·");
|
|
400
|
+
L.push("`confidence` · **`fix`** — a concrete `.at` edit. `fix` is the payoff: with it the");
|
|
401
|
+
L.push("log is a patch queue for the source topology; without it, a diary.");
|
|
402
|
+
L.push("");
|
|
403
|
+
if (brief.preflagged.length) {
|
|
404
|
+
L.push("**Pre-identified — the planner already knows these need a guess. Record each at**");
|
|
405
|
+
L.push("**the moment it occurs, filling in `chose`.**");
|
|
406
|
+
L.push("");
|
|
407
|
+
for (const p of brief.preflagged) {
|
|
408
|
+
L.push(`- **\`${p.kind}\`** (§${p.at.section}${p.at.node ? `, \`${p.at.node}\`` : ""}${p.at.edge ? `, \`${p.at.edge}\`` : ""})`);
|
|
409
|
+
L.push(` - ${p.question}`);
|
|
410
|
+
L.push(` - alternatives: ${p.alternatives.map((a) => `_${a}_`).join(" · ")}`);
|
|
411
|
+
L.push(` - fix: \`${p.fix}\``);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
L.push("Nothing pre-identified. Log any guess you make during the run.");
|
|
416
|
+
}
|
|
417
|
+
if (brief.defaultsApplied.length) {
|
|
418
|
+
L.push("");
|
|
419
|
+
L.push("---");
|
|
420
|
+
L.push("");
|
|
421
|
+
L.push(`_${brief.defaultsApplied.length} field(s) were never authored and took their value from the spec's defaults table (\`spec/grammar.md\` §7)._`);
|
|
422
|
+
}
|
|
423
|
+
return L.join("\n");
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/plan/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ascii.test.d.ts","sourceRoot":"","sources":["../../../src/render/__tests__/ascii.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { resolve, dirname } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { parse } from "../../parser/index.js";
|
|
6
|
+
import { renderAscii } from "../ascii.js";
|
|
7
|
+
const example = (name) => readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), "../../../examples", name), "utf8");
|
|
8
|
+
describe("renderAscii", () => {
|
|
9
|
+
it("puts the gate after the agent it gates, not first", () => {
|
|
10
|
+
const out = renderAscii(parse(example("code-review.at")));
|
|
11
|
+
const lines = out.split("\n");
|
|
12
|
+
const reviewer = lines.findIndex((l) => l.includes("reviewer") && l.includes("▸"));
|
|
13
|
+
const gate = lines.findIndex((l) => l.includes("human-approval"));
|
|
14
|
+
expect(gate).toBeGreaterThan(reviewer);
|
|
15
|
+
});
|
|
16
|
+
it("shows a parallel step on one line", () => {
|
|
17
|
+
const out = renderAscii(parse(example("code-review.at")));
|
|
18
|
+
expect(out).toContain("analyzer ∥ security-scanner");
|
|
19
|
+
expect(out).toContain("agent ×2, parallel");
|
|
20
|
+
});
|
|
21
|
+
it("renders every back-edge with its condition and budget", () => {
|
|
22
|
+
const out = renderAscii(parse(example("simple-pipeline.at")));
|
|
23
|
+
expect(out).toContain("↩ reviewer → writer");
|
|
24
|
+
expect(out).toContain("when reviewer.verdict == revise, max 2");
|
|
25
|
+
expect(out).toContain("↩ reviewer → researcher");
|
|
26
|
+
});
|
|
27
|
+
it("states that the orchestrator is the host, not a step", () => {
|
|
28
|
+
const out = renderAscii(parse(example("simple-pipeline.at")));
|
|
29
|
+
expect(out).toContain("is the host agent — it is not a step");
|
|
30
|
+
});
|
|
31
|
+
it("emits no ANSI escape codes — colour is the CLI's job", () => {
|
|
32
|
+
const out = renderAscii(parse(example("code-review.at")));
|
|
33
|
+
// eslint-disable-next-line no-control-regex
|
|
34
|
+
expect(/\[/.test(out)).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
it("includes a roles table with model and handoff counts", () => {
|
|
37
|
+
const out = renderAscii(parse(example("simple-pipeline.at")));
|
|
38
|
+
expect(out).toContain("Roles");
|
|
39
|
+
expect(out).toMatch(/researcher\s+sonnet/);
|
|
40
|
+
});
|
|
41
|
+
it("does not render unwired nodes as a parallel step", () => {
|
|
42
|
+
// Regression: nodes with no edges all rank at Kahn depth 0, so they came
|
|
43
|
+
// out as one "agent ×N, parallel" line that read like real concurrent work
|
|
44
|
+
// — and `(no flow declared)` was unreachable. An earlier version of THIS
|
|
45
|
+
// test asserted the buggy behaviour.
|
|
46
|
+
const src = `topology t : [pipeline] {
|
|
47
|
+
meta {
|
|
48
|
+
version: "1.0.0"
|
|
49
|
+
description: "x"
|
|
50
|
+
}
|
|
51
|
+
agent a {
|
|
52
|
+
model: sonnet
|
|
53
|
+
description: "a"
|
|
54
|
+
invocation: manual
|
|
55
|
+
}
|
|
56
|
+
agent b {
|
|
57
|
+
model: sonnet
|
|
58
|
+
description: "b"
|
|
59
|
+
invocation: manual
|
|
60
|
+
}
|
|
61
|
+
}`;
|
|
62
|
+
const out = renderAscii(parse(src));
|
|
63
|
+
expect(out).toContain("(no flow declared)");
|
|
64
|
+
expect(out).toContain("declared but not in the flow: a, b");
|
|
65
|
+
expect(out).not.toContain("parallel");
|
|
66
|
+
});
|
|
67
|
+
it("keeps unwired nodes out of the spine but still names them", () => {
|
|
68
|
+
const src = `topology t : [pipeline] {
|
|
69
|
+
meta {
|
|
70
|
+
version: "1.0.0"
|
|
71
|
+
description: "x"
|
|
72
|
+
}
|
|
73
|
+
agent wired {
|
|
74
|
+
model: sonnet
|
|
75
|
+
description: "w"
|
|
76
|
+
}
|
|
77
|
+
agent lonely {
|
|
78
|
+
model: sonnet
|
|
79
|
+
description: "l"
|
|
80
|
+
invocation: manual
|
|
81
|
+
}
|
|
82
|
+
action i {
|
|
83
|
+
kind: inline
|
|
84
|
+
description: "in"
|
|
85
|
+
}
|
|
86
|
+
flow { i -> wired }
|
|
87
|
+
}`;
|
|
88
|
+
const out = renderAscii(parse(src));
|
|
89
|
+
expect(out).toMatch(/1\s+▪ i/);
|
|
90
|
+
expect(out).toMatch(/2\s+▸ wired/); // renumbered, no gap
|
|
91
|
+
expect(out).toContain("declared but not in the flow: lonely");
|
|
92
|
+
});
|
|
93
|
+
it("renders every shipped example without throwing", () => {
|
|
94
|
+
for (const f of [
|
|
95
|
+
"code-review.at",
|
|
96
|
+
"simple-pipeline.at",
|
|
97
|
+
"data-processing.at",
|
|
98
|
+
"memory-system.at",
|
|
99
|
+
"scheduled-monitor.at",
|
|
100
|
+
"company-brain.at",
|
|
101
|
+
]) {
|
|
102
|
+
expect(() => renderAscii(parse(example(f))), f).not.toThrow();
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
it("renders a decision as a branch, not as parallel work", () => {
|
|
106
|
+
const src = `topology t : [pipeline] {
|
|
107
|
+
meta {
|
|
108
|
+
version: "1.0.0"
|
|
109
|
+
description: "x"
|
|
110
|
+
}
|
|
111
|
+
agent judge {
|
|
112
|
+
model: opus
|
|
113
|
+
description: "j"
|
|
114
|
+
outputs: {
|
|
115
|
+
verdict: pass | fail
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
agent onpass {
|
|
119
|
+
model: sonnet
|
|
120
|
+
description: "p"
|
|
121
|
+
}
|
|
122
|
+
agent onfail {
|
|
123
|
+
model: sonnet
|
|
124
|
+
description: "f"
|
|
125
|
+
}
|
|
126
|
+
action i {
|
|
127
|
+
kind: inline
|
|
128
|
+
description: "in"
|
|
129
|
+
}
|
|
130
|
+
flow { i -> judge
|
|
131
|
+
judge -> onpass [when judge.verdict == pass]
|
|
132
|
+
judge -> onfail [when judge.verdict == fail] }
|
|
133
|
+
}`;
|
|
134
|
+
const out = renderAscii(parse(src));
|
|
135
|
+
expect(out).toContain("exactly one runs");
|
|
136
|
+
expect(out).not.toContain("parallel");
|
|
137
|
+
// and the condition that selects each branch is shown, not dropped
|
|
138
|
+
expect(out).toContain("when judge.verdict == pass");
|
|
139
|
+
expect(out).toContain("when judge.verdict == fail");
|
|
140
|
+
});
|
|
141
|
+
it("keeps the spine aligned past step 99", () => {
|
|
142
|
+
// Regression: the step number was padded to a fixed width of 2, so the
|
|
143
|
+
// whole column shifted at step 100.
|
|
144
|
+
const agents = Array.from({ length: 105 }, (_, i) => i + 1)
|
|
145
|
+
.map((n) => ` agent a${n} {\n model: sonnet\n description: "a${n}"\n phase: ${n}\n }`)
|
|
146
|
+
.join("\n");
|
|
147
|
+
const chain = Array.from({ length: 105 }, (_, i) => `a${i + 1}`).join(" -> ");
|
|
148
|
+
const src = [
|
|
149
|
+
"topology big : [pipeline] {",
|
|
150
|
+
" meta {",
|
|
151
|
+
' version: "1.0.0"',
|
|
152
|
+
' description: "x"',
|
|
153
|
+
" }",
|
|
154
|
+
agents,
|
|
155
|
+
" action i {",
|
|
156
|
+
" kind: inline",
|
|
157
|
+
' description: "in"',
|
|
158
|
+
" }",
|
|
159
|
+
` flow { i -> ${chain} }`,
|
|
160
|
+
"}",
|
|
161
|
+
].join("\n");
|
|
162
|
+
const lines = renderAscii(parse(src)).split("\n");
|
|
163
|
+
const step9 = lines.find((l) => /^\s+9\s+[▸▪]/.test(l));
|
|
164
|
+
const step100 = lines.find((l) => /^\s+100\s+[▸▪]/.test(l));
|
|
165
|
+
expect(step9).toBeDefined();
|
|
166
|
+
expect(step100).toBeDefined();
|
|
167
|
+
// The glyph must sit in the same column on both.
|
|
168
|
+
expect(step9.indexOf("▸")).toBe(step100.indexOf("▸"));
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=ascii.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ascii.test.js","sourceRoot":"","sources":["../../../src/render/__tests__/ascii.test.ts"],"names":[],"mappings":"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"}
|