@cotal-ai/cli 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/dist/commands/down-manifest.d.ts +6 -0
  2. package/dist/commands/down-manifest.d.ts.map +1 -0
  3. package/dist/commands/down-manifest.js +282 -0
  4. package/dist/commands/down-manifest.js.map +1 -0
  5. package/dist/commands/down.d.ts +5 -3
  6. package/dist/commands/down.d.ts.map +1 -1
  7. package/dist/commands/down.js +24 -4
  8. package/dist/commands/down.js.map +1 -1
  9. package/dist/commands/meshes.js +1 -1
  10. package/dist/commands/meshes.js.map +1 -1
  11. package/dist/commands/mint.d.ts.map +1 -1
  12. package/dist/commands/mint.js +2 -1
  13. package/dist/commands/mint.js.map +1 -1
  14. package/dist/commands/setup.d.ts.map +1 -1
  15. package/dist/commands/setup.js +66 -16
  16. package/dist/commands/setup.js.map +1 -1
  17. package/dist/commands/spawn-manifest.d.ts +10 -0
  18. package/dist/commands/spawn-manifest.d.ts.map +1 -0
  19. package/dist/commands/spawn-manifest.js +197 -0
  20. package/dist/commands/spawn-manifest.js.map +1 -0
  21. package/dist/commands/spawn.d.ts.map +1 -1
  22. package/dist/commands/spawn.js +31 -4
  23. package/dist/commands/spawn.js.map +1 -1
  24. package/dist/commands/topology.d.ts +10 -0
  25. package/dist/commands/topology.d.ts.map +1 -0
  26. package/dist/commands/topology.js +46 -0
  27. package/dist/commands/topology.js.map +1 -0
  28. package/dist/commands/up.d.ts +4 -0
  29. package/dist/commands/up.d.ts.map +1 -1
  30. package/dist/commands/up.js +112 -2
  31. package/dist/commands/up.js.map +1 -1
  32. package/dist/commands/use.d.ts +1 -1
  33. package/dist/commands/use.d.ts.map +1 -1
  34. package/dist/commands/use.js +1 -1
  35. package/dist/commands/use.js.map +1 -1
  36. package/dist/commands/web.d.ts.map +1 -1
  37. package/dist/commands/web.js +3 -1
  38. package/dist/commands/web.js.map +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +10 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/lib/connect.d.ts +18 -16
  43. package/dist/lib/connect.d.ts.map +1 -1
  44. package/dist/lib/connect.js +27 -51
  45. package/dist/lib/connect.js.map +1 -1
  46. package/dist/lib/delivery-proc.d.ts.map +1 -1
  47. package/dist/lib/delivery-proc.js +2 -1
  48. package/dist/lib/delivery-proc.js.map +1 -1
  49. package/dist/lib/manager-proc.d.ts +4 -0
  50. package/dist/lib/manager-proc.d.ts.map +1 -1
  51. package/dist/lib/manager-proc.js +17 -0
  52. package/dist/lib/manager-proc.js.map +1 -1
  53. package/dist/lib/manifest/apply.d.ts +29 -0
  54. package/dist/lib/manifest/apply.d.ts.map +1 -0
  55. package/dist/lib/manifest/apply.js +138 -0
  56. package/dist/lib/manifest/apply.js.map +1 -0
  57. package/dist/lib/manifest/errors.d.ts +21 -0
  58. package/dist/lib/manifest/errors.d.ts.map +1 -0
  59. package/dist/lib/manifest/errors.js +19 -0
  60. package/dist/lib/manifest/errors.js.map +1 -0
  61. package/dist/lib/manifest/index.d.ts +13 -0
  62. package/dist/lib/manifest/index.d.ts.map +1 -0
  63. package/dist/lib/manifest/index.js +21 -0
  64. package/dist/lib/manifest/index.js.map +1 -0
  65. package/dist/lib/manifest/ledger.d.ts +81 -0
  66. package/dist/lib/manifest/ledger.d.ts.map +1 -0
  67. package/dist/lib/manifest/ledger.js +213 -0
  68. package/dist/lib/manifest/ledger.js.map +1 -0
  69. package/dist/lib/manifest/live.d.ts +25 -0
  70. package/dist/lib/manifest/live.d.ts.map +1 -0
  71. package/dist/lib/manifest/live.js +61 -0
  72. package/dist/lib/manifest/live.js.map +1 -0
  73. package/dist/lib/manifest/model.d.ts +71 -0
  74. package/dist/lib/manifest/model.d.ts.map +1 -0
  75. package/dist/lib/manifest/model.js +2 -0
  76. package/dist/lib/manifest/model.js.map +1 -0
  77. package/dist/lib/manifest/preflight.d.ts +12 -0
  78. package/dist/lib/manifest/preflight.d.ts.map +1 -0
  79. package/dist/lib/manifest/preflight.js +43 -0
  80. package/dist/lib/manifest/preflight.js.map +1 -0
  81. package/dist/lib/manifest/prepare.d.ts +57 -0
  82. package/dist/lib/manifest/prepare.d.ts.map +1 -0
  83. package/dist/lib/manifest/prepare.js +95 -0
  84. package/dist/lib/manifest/prepare.js.map +1 -0
  85. package/dist/lib/manifest/render.d.ts +41 -0
  86. package/dist/lib/manifest/render.d.ts.map +1 -0
  87. package/dist/lib/manifest/render.js +177 -0
  88. package/dist/lib/manifest/render.js.map +1 -0
  89. package/dist/lib/manifest/resolve.d.ts +5 -0
  90. package/dist/lib/manifest/resolve.d.ts.map +1 -0
  91. package/dist/lib/manifest/resolve.js +185 -0
  92. package/dist/lib/manifest/resolve.js.map +1 -0
  93. package/dist/lib/manifest/schema.d.ts +103 -0
  94. package/dist/lib/manifest/schema.d.ts.map +1 -0
  95. package/dist/lib/manifest/schema.js +77 -0
  96. package/dist/lib/manifest/schema.js.map +1 -0
  97. package/dist/lib/manifest/spawn-plan.d.ts +87 -0
  98. package/dist/lib/manifest/spawn-plan.d.ts.map +1 -0
  99. package/dist/lib/manifest/spawn-plan.js +75 -0
  100. package/dist/lib/manifest/spawn-plan.js.map +1 -0
  101. package/dist/lib/meshes.d.ts +1 -7
  102. package/dist/lib/meshes.d.ts.map +1 -1
  103. package/dist/lib/meshes.js +5 -14
  104. package/dist/lib/meshes.js.map +1 -1
  105. package/dist/lib/onboard.js +1 -1
  106. package/dist/lib/onboard.js.map +1 -1
  107. package/dist/lib/paths.js +1 -1
  108. package/dist/lib/paths.js.map +1 -1
  109. package/dist/lib/status.d.ts.map +1 -1
  110. package/dist/lib/status.js +2 -1
  111. package/dist/lib/status.js.map +1 -1
  112. package/dist/web/graph.html +3 -0
  113. package/dist/web/graph.js +76 -21
  114. package/package.json +6 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../../src/lib/manifest/prepare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { PreparedManifest } from "./preflight.js";
2
+ import type { AgentWarning } from "./prepare.js";
3
+ import type { AgentPlan, ChannelPlan, UnmanagedReport } from "./spawn-plan.js";
4
+ /** The full `topology view`: header, channel access, agent access, persona-inherited scopes, warnings. */
5
+ export declare function renderTopology(p: PreparedManifest): string;
6
+ /** The `cotal up -f --dry-run` plan: a fresh mesh creates everything, so the grouping is simply
7
+ * "will create" — broker + channels + agents — followed by the full access view. Mutates nothing. */
8
+ export declare function renderUpPlan(p: PreparedManifest, server: string): string;
9
+ /** The loud "persona grants outside manifest channels" section — unmanaged credential scopes that
10
+ * an old persona ref drags in under `personaPermissions: include`. Returns "" when there are none. */
11
+ export declare function renderInherited(p: PreparedManifest): string;
12
+ /** Render the non-fatal warnings (empty-ACL agents, loud when they carry capabilities). */
13
+ export declare function renderWarnings(warnings: AgentWarning[]): string;
14
+ /** The `cotal spawn -f` plan / `--dry-run`: deploy onto a RUNNING mesh. Groups channels and agents
15
+ * by disposition (create / exists-unmanaged / owned · will-create / already-owned / stale), then the
16
+ * SECURITY block + persona-inherited access. Creation-only — an existing unmanaged card is shown
17
+ * desired-vs-live, never patched. */
18
+ export declare function renderSpawnPlan(p: PreparedManifest, channels: ChannelPlan, agents: AgentPlan, unmanaged: UnmanagedReport, ctx: {
19
+ server: string;
20
+ runId: string;
21
+ dryRun: boolean;
22
+ }): string;
23
+ /** The SECURITY block: unmanaged actors observed with read access to a manifest-declared channel —
24
+ * an isolation conflict on the shared mesh — phrased as an explicit LOWER BOUND (presence + the
25
+ * broker membership feed; live-only core subscriptions aren't observable when the feed is absent).
26
+ * Returns "" only when there's nothing to say AND the feed was readable. */
27
+ export declare function renderUnmanaged(u: UnmanagedReport): string;
28
+ /** Post-apply summary for `cotal spawn -f`: what was created/launched, what was left untouched, the
29
+ * SECURITY block, and the exact ownership-scoped teardown command + ledger path. */
30
+ export declare function renderSpawnSummary(ctx: {
31
+ space: string;
32
+ server: string;
33
+ runId: string;
34
+ ledgerPath: string;
35
+ manifestPath: string;
36
+ created: string[];
37
+ launched: string[];
38
+ existsUnmanaged: string[];
39
+ unmanaged: UnmanagedReport;
40
+ }): string;
41
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/lib/manifest/render.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAU/E,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAwC1D;AAED;sGACsG;AACtG,wBAAgB,YAAY,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWxE;AAED;uGACuG;AACvG,wBAAgB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAqB3D;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAG/D;AAED;;;sCAGsC;AACtC,wBAAgB,eAAe,CAC7B,CAAC,EAAE,gBAAgB,EACnB,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,eAAe,EAC1B,GAAG,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACtD,MAAM,CA+BR;AAED;;;6EAG6E;AAC7E,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAmB1D;AAED;qFACqF;AACrF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,eAAe,CAAC;CAC5B,GAAG,MAAM,CAWT"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Human-readable rendering of a prepared manifest — the `cotal topology view` output and the shared
3
+ * pieces of `--dry-run`. The native verbs get humane labels here so the field names aren't the only
4
+ * explanation (UX): `subscribe (auto-listens at boot)` etc. No mutation, no live state.
5
+ */
6
+ import { c } from "../../ui.js";
7
+ const LABEL = {
8
+ subscribe: "subscribe (auto-listens at boot)",
9
+ allowSubscribe: "allowSubscribe (may read/join)",
10
+ allowPublish: "allowPublish (may post)",
11
+ };
12
+ const list = (xs) => (xs.length ? xs.join(", ") : c.dim("(none)"));
13
+ /** The full `topology view`: header, channel access, agent access, persona-inherited scopes, warnings. */
14
+ export function renderTopology(p) {
15
+ const m = p.manifest;
16
+ const out = [];
17
+ const broker = m.broker?.servers ?? "fresh local broker";
18
+ out.push(c.bold(`Mesh "${m.space}"`) +
19
+ c.dim(` (broker: ${broker} · runtime ${m.runtime ?? "pty"} · personaPermissions: ${m.personaPermissions})`));
20
+ // Channels — who subscribes / may read / may post (agent names).
21
+ out.push("", c.bold(`Channels (${m.channels.length})`));
22
+ for (const ch of m.channels) {
23
+ out.push(` ${c.cyan("#" + ch.name)}${ch.description ? c.dim(" " + ch.description) : ""}`);
24
+ out.push(` ${c.dim(LABEL.subscribe + ":")} ${list(ch.subscribe)}`);
25
+ out.push(` ${c.dim(LABEL.allowSubscribe + ":")} ${list(ch.allowSubscribe)}`);
26
+ out.push(` ${c.dim(LABEL.allowPublish + ":")} ${list(ch.allowPublish)}`);
27
+ if (ch.instructions)
28
+ out.push(` ${c.dim("instructions: " + ch.instructions)}`);
29
+ }
30
+ // Agents — effective merged access (manifest + any persona-inherited under `include`).
31
+ out.push("", c.bold(`Agents (${p.agents.length})`));
32
+ for (const a of p.agents) {
33
+ const src = a.persona ? `persona ${a.persona}` : "inline";
34
+ const meta = [a.agentType, a.model ? `model ${a.model}` : undefined, a.role ? `role ${a.role}` : undefined]
35
+ .filter(Boolean)
36
+ .join(" · ");
37
+ out.push(` ${c.bold(a.name)} ${c.dim(meta + " · " + src)}`);
38
+ out.push(` ${c.dim(LABEL.subscribe + ":")} ${list(a.policy.subscribe)}`);
39
+ out.push(` ${c.dim(LABEL.allowSubscribe + ":")} ${list(a.policy.allowSubscribe)}`);
40
+ out.push(` ${c.dim(LABEL.allowPublish + ":")} ${list(a.policy.allowPublish)}`);
41
+ if (a.capabilities.length)
42
+ out.push(` ${c.dim("capabilities:")} ${a.capabilities.join(", ")}${a.capabilitySource === "persona" ? c.dim(" (persona-inherited)") : ""}`);
43
+ }
44
+ const inherited = renderInherited(p);
45
+ if (inherited)
46
+ out.push("", inherited);
47
+ if (p.warnings.length)
48
+ out.push("", renderWarnings(p.warnings));
49
+ return out.join("\n");
50
+ }
51
+ /** The `cotal up -f --dry-run` plan: a fresh mesh creates everything, so the grouping is simply
52
+ * "will create" — broker + channels + agents — followed by the full access view. Mutates nothing. */
53
+ export function renderUpPlan(p, server) {
54
+ const m = p.manifest;
55
+ const head = [
56
+ c.bold("Plan — cotal up -f (fresh mesh)"),
57
+ c.bold("Will create:"),
58
+ ` ${c.green("+")} broker + space ${c.cyan(`"${m.space}"`)} at ${server}`,
59
+ ` ${c.green("+")} ${m.channels.length} channel(s): ${m.channels.map((ch) => c.cyan("#" + ch.name)).join(", ")}`,
60
+ ` ${c.green("+")} ${p.agents.length} agent(s): ${p.agents.map((a) => a.name).join(", ")}`,
61
+ "",
62
+ ].join("\n");
63
+ return `${head}${renderTopology(p)}\n\n${c.dim("Dry run — nothing was changed. Re-run without --dry-run to apply.")}`;
64
+ }
65
+ /** The loud "persona grants outside manifest channels" section — unmanaged credential scopes that
66
+ * an old persona ref drags in under `personaPermissions: include`. Returns "" when there are none. */
67
+ export function renderInherited(p) {
68
+ const rows = [];
69
+ for (const a of p.agents) {
70
+ const i = a.inherited;
71
+ const hasAcl = i.subscribe.length || i.allowSubscribe.length || i.allowPublish.length;
72
+ if (!hasAcl && !i.capabilities.length)
73
+ continue;
74
+ // Capabilities first — they are NOT channel-scoped (spawn/tool power), so they're easiest to miss
75
+ // and most security-significant (security review, round-8).
76
+ if (i.capabilities.length)
77
+ rows.push(` ${c.yellow("‼")} ${c.bold(a.name)} capabilities: ${i.capabilities.join(", ")} ${c.dim(`(persona ${a.persona} — not channel-scoped)`)}`);
78
+ if (hasAcl) {
79
+ const parts = [
80
+ i.subscribe.length ? `subscribe ${i.subscribe.join(",")}` : "",
81
+ i.allowSubscribe.length ? `read ${i.allowSubscribe.join(",")}` : "",
82
+ i.allowPublish.length ? `post ${i.allowPublish.join(",")}` : "",
83
+ ].filter(Boolean);
84
+ rows.push(` ${c.bold(a.name)} → ${parts.join(" · ")} ${c.dim(`(persona ${a.persona} · unmanaged by manifest, no card)`)}`);
85
+ }
86
+ }
87
+ if (!rows.length)
88
+ return "";
89
+ return [c.yellow(c.bold("⚠ Persona-inherited access + capabilities outside manifest channels")), ...rows].join("\n");
90
+ }
91
+ /** Render the non-fatal warnings (empty-ACL agents, loud when they carry capabilities). */
92
+ export function renderWarnings(warnings) {
93
+ const rows = warnings.map((w) => ` ${w.loud ? c.yellow("‼") : c.dim("•")} ${c.bold(w.agent)}: ${w.message}`);
94
+ return [c.yellow(c.bold(`⚠ Warnings (${warnings.length})`)), ...rows].join("\n");
95
+ }
96
+ /** The `cotal spawn -f` plan / `--dry-run`: deploy onto a RUNNING mesh. Groups channels and agents
97
+ * by disposition (create / exists-unmanaged / owned · will-create / already-owned / stale), then the
98
+ * SECURITY block + persona-inherited access. Creation-only — an existing unmanaged card is shown
99
+ * desired-vs-live, never patched. */
100
+ export function renderSpawnPlan(p, channels, agents, unmanaged, ctx) {
101
+ const out = [c.bold(`Plan — cotal spawn -f (deploy onto running mesh ${ctx.server})`)];
102
+ out.push("", c.bold("Channels:"));
103
+ for (const ch of channels.create)
104
+ out.push(` ${c.green("+")} create ${c.cyan("#" + ch.name)} ${c.dim("(seed + own)")}`);
105
+ for (const { channel, live } of channels.existsUnmanaged) {
106
+ out.push(` ${c.yellow("~")} ${c.cyan("#" + channel.name)} ${c.yellow("exists — unmanaged")} ${c.dim("(card left untouched)")}`);
107
+ if ((channel.description ?? "") !== (live.description ?? ""))
108
+ out.push(` ${c.dim(`desired: ${channel.description ?? "(none)"} · live: ${live.description ?? "(none)"}`)}`);
109
+ if ((channel.instructions ?? "") !== (live.instructions ?? ""))
110
+ out.push(` ${c.dim(`desired instructions differ from live — not applied (use a future --patch flag)`)}`);
111
+ }
112
+ for (const ch of channels.owned)
113
+ out.push(` ${c.dim("=")} ${c.cyan("#" + ch.name)} ${c.dim("(already owned by this run)")}`);
114
+ if (!channels.create.length && !channels.existsUnmanaged.length && !channels.owned.length)
115
+ out.push(` ${c.dim("(none)")}`);
116
+ out.push("", c.bold("Agents:"));
117
+ for (const e of agents.willCreate)
118
+ out.push(` ${c.green("+")} ${c.bold(e.agent.name)} ${c.dim(`${e.agent.agentType} — will launch`)}`);
119
+ for (const e of agents.alreadyOwned)
120
+ out.push(` ${c.dim("=")} ${c.bold(e.agent.name)} ${c.dim(`(already running as ${e.prior?.name} — no-op)`)}`);
121
+ for (const e of agents.stale)
122
+ out.push(` ${c.yellow("!")} ${c.bold(e.agent.name)} ${c.yellow("stale — restart required")} ` +
123
+ c.dim(`(${e.prior?.name}: hash ${e.prior?.hash.slice(0, 8)} → ${e.hash.slice(0, 8)}${e.running ? "" : ", not running"})`));
124
+ if (!agents.entries.length)
125
+ out.push(` ${c.dim("(none)")}`);
126
+ const sec = renderUnmanaged(unmanaged);
127
+ if (sec)
128
+ out.push("", sec);
129
+ const inherited = renderInherited(p);
130
+ if (inherited)
131
+ out.push("", inherited);
132
+ if (ctx.dryRun)
133
+ out.push("", c.dim(`Dry run — nothing was changed. Run ${ctx.runId} not written. Re-run without --dry-run to apply.`));
134
+ return out.join("\n");
135
+ }
136
+ /** The SECURITY block: unmanaged actors observed with read access to a manifest-declared channel —
137
+ * an isolation conflict on the shared mesh — phrased as an explicit LOWER BOUND (presence + the
138
+ * broker membership feed; live-only core subscriptions aren't observable when the feed is absent).
139
+ * Returns "" only when there's nothing to say AND the feed was readable. */
140
+ export function renderUnmanaged(u) {
141
+ const rows = [];
142
+ for (const ce of u.perChannel) {
143
+ const who = ce.actors.map((a) => `${a.name ?? a.id.slice(0, 8)} (${a.via})`).join(", ");
144
+ rows.push(` ${c.red("‼")} ${c.cyan("#" + ce.channel)}: unmanaged ${who}`);
145
+ }
146
+ const caveat = u.feedAvailable
147
+ ? c.dim(` detected via presence + membership feed (asOf ${new Date(u.asOf).toISOString()}); live-only core subscriptions are a lower bound`)
148
+ : c.dim(" membership feed unavailable — detection is PRESENCE-ONLY (a lower bound; channel membership/live subscriptions not observable)");
149
+ // Show the block when there are conflicts, or when the feed was unavailable (so an empty result is
150
+ // never mistaken for "provably isolated").
151
+ if (!rows.length && u.feedAvailable) {
152
+ return u.presentUnowned.length
153
+ ? c.dim(`note: ${u.presentUnowned.length} unmanaged peer(s) present on the mesh; none on a declared channel (${caveat.trim()})`)
154
+ : "";
155
+ }
156
+ const head = c.red(c.bold("⚠ SECURITY — unmanaged actors with access to declared channels"));
157
+ const tail = u.presentUnowned.length ? [c.dim(` (${u.presentUnowned.length} unmanaged peer(s) present on the mesh in total)`)] : [];
158
+ return [head, ...rows, caveat, ...tail].join("\n");
159
+ }
160
+ /** Post-apply summary for `cotal spawn -f`: what was created/launched, what was left untouched, the
161
+ * SECURITY block, and the exact ownership-scoped teardown command + ledger path. */
162
+ export function renderSpawnSummary(ctx) {
163
+ const out = [c.green(`✓ deployed onto "${ctx.space}" (${ctx.server})`)];
164
+ if (ctx.created.length)
165
+ out.push(` ${c.green("+")} created ${ctx.created.length} channel(s): ${ctx.created.map((n) => c.cyan("#" + n)).join(", ")}`);
166
+ if (ctx.launched.length)
167
+ out.push(` ${c.green("+")} launched ${ctx.launched.length} agent(s): ${ctx.launched.join(", ")}`);
168
+ if (ctx.existsUnmanaged.length)
169
+ out.push(` ${c.yellow("~")} left ${ctx.existsUnmanaged.length} existing channel(s) untouched: ${ctx.existsUnmanaged.map((n) => c.cyan("#" + n)).join(", ")}`);
170
+ const sec = renderUnmanaged(ctx.unmanaged);
171
+ if (sec)
172
+ out.push("", sec);
173
+ out.push("", c.dim(`Run ${ctx.runId} · ledger ${ctx.ledgerPath}`));
174
+ out.push(c.dim(`Tear down ONLY this deploy: `) + `cotal down -f ${ctx.manifestPath} --run ${ctx.runId}`);
175
+ return out.join("\n");
176
+ }
177
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/lib/manifest/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ResolvedManifest } from "./model.js";
2
+ /** Parse + validate a manifest source into the resolved model. `sourcePath` anchors relative
3
+ * persona refs and locates errors. */
4
+ export declare function resolveManifest(src: string, sourcePath: string): ResolvedManifest;
5
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/lib/manifest/resolve.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAmE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpH;uCACuC;AACvC,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CA4EjF"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * The pure manifest pipeline (no network, no persona-file reads — those are preflight):
3
+ *
4
+ * parse (YAML, keep line/col) → schema (strict Zod) → normalize + invert (channel-centric →
5
+ * per-agent ACLs) → semantic checks (names resolve, allowSubscribe ⊇ subscribe, concrete tokens).
6
+ *
7
+ * Returns a {@link ResolvedManifest}; throws {@link ManifestError} with every problem located by
8
+ * file + line. Stages 1–4 of the plan — deterministic and unit-testable.
9
+ */
10
+ import { isAbsolute, resolve as resolvePath, dirname } from "node:path";
11
+ import { parseDocument, LineCounter } from "yaml";
12
+ import { assertValidChannel, assertValidName, isConcreteChannel } from "@cotal-ai/core";
13
+ import { MeshManifestSchema } from "./schema.js";
14
+ import { ManifestError } from "./errors.js";
15
+ /** Parse + validate a manifest source into the resolved model. `sourcePath` anchors relative
16
+ * persona refs and locates errors. */
17
+ export function resolveManifest(src, sourcePath) {
18
+ const lc = new LineCounter();
19
+ const doc = parseDocument(src, { lineCounter: lc });
20
+ // Best-effort location: try the exact node, then walk up the path (union/object-level errors
21
+ // often have no node of their own), finally the document root. Diagnostics only — never on the
22
+ // resolved model (engineer, round-6).
23
+ const locate = (path) => {
24
+ if (!path)
25
+ return {};
26
+ const p = [...path];
27
+ for (;;) {
28
+ const node = doc.getIn(p, true);
29
+ if (node?.range) {
30
+ const { line, col } = lc.linePos(node.range[0]);
31
+ return { line, col };
32
+ }
33
+ if (p.length === 0)
34
+ return {};
35
+ p.pop();
36
+ }
37
+ };
38
+ // 1. Parse. Syntax errors + duplicate map keys (yaml enforces unique keys) surface here.
39
+ if (doc.errors.length)
40
+ throw new ManifestError(sourcePath, doc.errors.map((e) => ({ message: e.message.split("\n")[0], line: e.linePos?.[0]?.line, col: e.linePos?.[0]?.col })));
41
+ // Targeted message for the single-space deferral before the strict schema rejects it generically.
42
+ if (doc.has("spaces"))
43
+ throw new ManifestError(sourcePath, [
44
+ { message: "`spaces:` is not supported in v1 (single-space) — use a scalar `space:`", path: ["spaces"], ...locate(["spaces"]) },
45
+ ]);
46
+ // 2. Schema (strict): shape + unknown-key rejection. Map every Zod issue back to a located line.
47
+ const parsed = MeshManifestSchema.safeParse(doc.toJS());
48
+ if (!parsed.success)
49
+ throw new ManifestError(sourcePath, parsed.error.issues.map((iss) => {
50
+ const path = iss.path.filter((p) => typeof p !== "symbol");
51
+ // Point the line at the offending unknown key, not just its containing object.
52
+ const keys = iss.keys;
53
+ const locPath = iss.code === "unrecognized_keys" && keys?.length ? [...path, keys[0]] : path;
54
+ return { message: iss.message, path, ...locate(locPath) };
55
+ }));
56
+ const raw = parsed.data;
57
+ // 3 + 4. Normalize/invert and run pure semantic checks, collecting every problem in one pass.
58
+ const issues = [];
59
+ const add = (message, path) => issues.push({ message, path, ...locate(path) });
60
+ const agentNames = new Set(Object.keys(raw.agents ?? {}));
61
+ for (const name of agentNames)
62
+ try {
63
+ assertValidName(name);
64
+ }
65
+ catch (e) {
66
+ add(e.message, ["agents", name]);
67
+ }
68
+ if (raw.broker)
69
+ validateBroker(raw.broker, add);
70
+ const channels = normalizeChannels(raw, agentNames, add);
71
+ const agents = resolveAgents(raw, channels, sourcePath, add);
72
+ if (issues.length)
73
+ throw new ManifestError(sourcePath, issues);
74
+ return {
75
+ space: raw.space,
76
+ broker: raw.broker,
77
+ runtime: raw.runtime,
78
+ personaPermissions: raw.personaPermissions ?? "reject",
79
+ defaults: raw.defaults,
80
+ agents,
81
+ channels,
82
+ sourcePath,
83
+ };
84
+ }
85
+ /** Normalize each channel (default `allowSubscribe` ⇐ `subscribe`, dedup) and run the channel-level
86
+ * semantic checks: concrete token, every referenced name resolves, `allowSubscribe ⊇ subscribe`. */
87
+ function normalizeChannels(raw, agentNames, add) {
88
+ const out = [];
89
+ for (const [name, entry] of Object.entries(raw.channels)) {
90
+ try {
91
+ assertValidChannel(name);
92
+ if (!isConcreteChannel(name))
93
+ throw new Error(`channel "${name}" must be concrete — wildcard channels are not supported in v1`);
94
+ }
95
+ catch (e) {
96
+ add(e.message, ["channels", name]);
97
+ }
98
+ const subscribe = dedupe(entry.subscribe ?? []);
99
+ const allowSubscribe = entry.allowSubscribe ? dedupe(entry.allowSubscribe) : [...subscribe];
100
+ const allowPublish = dedupe(entry.allowPublish ?? []);
101
+ // Every name listed under a channel must resolve to an `agents:` entry (no silent default).
102
+ for (const [field, names] of [["subscribe", subscribe], ["allowSubscribe", allowSubscribe], ["allowPublish", allowPublish]])
103
+ for (const n of names)
104
+ if (!agentNames.has(n))
105
+ add(`"${n}" is not declared in agents:`, ["channels", name, field]);
106
+ // An explicit allowSubscribe must be a superset of subscribe (the read-ACL invariant).
107
+ const missing = subscribe.filter((n) => !allowSubscribe.includes(n));
108
+ if (missing.length)
109
+ add(`subscribe [${missing.join(", ")}] not in allowSubscribe — a subscriber must be allowed to read`, ["channels", name, "allowSubscribe"]);
110
+ out.push({
111
+ name,
112
+ description: entry.description,
113
+ instructions: entry.instructions,
114
+ subscribe,
115
+ allowSubscribe,
116
+ allowPublish,
117
+ replay: entry.replay,
118
+ replayWindow: entry.replayWindow,
119
+ deliveryClass: entry.deliveryClass,
120
+ });
121
+ }
122
+ return out;
123
+ }
124
+ /** Build each agent's resolved form: its persona source (file/inline) + the per-agent ACLs inverted
125
+ * from channel membership. Behavior overrides are carried verbatim; the persona default is filled
126
+ * in during preflight (which reads the file). */
127
+ function resolveAgents(raw, channels, sourcePath, add) {
128
+ const topPolicy = raw.personaPermissions ?? "reject";
129
+ const dir = dirname(sourcePath);
130
+ const personaPath = (ref) => (isAbsolute(ref) ? ref : resolvePath(dir, ref));
131
+ // No silent default connector (matches roster.yaml): an agent needs its own `agent:` or the
132
+ // top-level default. Fail loud rather than guessing claude/opencode.
133
+ const connector = (name, own) => {
134
+ const t = own ?? raw.agent;
135
+ if (!t)
136
+ add(`no connector for "${name}" — set \`agent:\` on it or a top-level \`agent:\` default`, ["agents", name]);
137
+ return t ?? "";
138
+ };
139
+ // After schema preprocessing every entry is the object form (a bare string was normalized to
140
+ // `{ persona }`), so there's a single shape to read here.
141
+ return Object.entries(raw.agents ?? {}).map(([name, entry]) => ({
142
+ name,
143
+ agentType: connector(name, entry.agent),
144
+ persona: entry.persona ? personaPath(entry.persona) : undefined,
145
+ model: entry.model,
146
+ role: entry.role,
147
+ description: entry.description,
148
+ instructions: entry.instructions,
149
+ capabilities: entry.capabilities,
150
+ personaPermissions: entry.personaPermissions ?? topPolicy,
151
+ policy: invertPolicy(name, channels),
152
+ }));
153
+ }
154
+ /** Invert channel-centric membership into one agent's per-channel ACLs (the channels it appears in). */
155
+ function invertPolicy(name, channels) {
156
+ return {
157
+ subscribe: channels.filter((c) => c.subscribe.includes(name)).map((c) => c.name),
158
+ allowSubscribe: channels.filter((c) => c.allowSubscribe.includes(name)).map((c) => c.name),
159
+ allowPublish: channels.filter((c) => c.allowPublish.includes(name)).map((c) => c.name),
160
+ };
161
+ }
162
+ /** Reject inline credentials in the broker config: a `nats://user:pass@host` URL must use the
163
+ * auth creds/profile path, not embedded secrets (critic, round-6); `host` is a bind address, not
164
+ * a URL. Each server entry must parse as a URL (no silent fallback). */
165
+ function validateBroker(broker, add) {
166
+ if (broker.host?.includes("://"))
167
+ add(`broker.host is a bind address (e.g. 127.0.0.1), not a URL — drop the scheme`, ["broker", "host"]);
168
+ if (broker.servers)
169
+ for (const s of broker.servers.split(",").map((x) => x.trim()).filter(Boolean)) {
170
+ let u;
171
+ try {
172
+ u = new URL(s);
173
+ }
174
+ catch {
175
+ add(`broker.servers entry "${s}" is not a valid URL (e.g. nats://127.0.0.1:4222)`, ["broker", "servers"]);
176
+ continue;
177
+ }
178
+ if (u.username || u.password)
179
+ add(`broker.servers must not embed credentials ("${u.username}:***@…") — use auth creds/profile, not inline secrets`, ["broker", "servers"]);
180
+ }
181
+ }
182
+ function dedupe(xs) {
183
+ return [...new Set(xs)];
184
+ }
185
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/lib/manifest/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * The mesh-manifest schema (`cotal.yaml`, `kind: Mesh`) — the strict Zod shape the parser
3
+ * validates before any normalization. Strict objects reject unknown keys (no silent ignore —
4
+ * matches the repo's "no fallbacks" rule); the resolved/inverted model lives in {@link ./model.js}.
5
+ *
6
+ * This is shape-only: cross-field rules (names resolve to an agent, `allowSubscribe ⊇ subscribe`,
7
+ * concrete channel tokens) are pure semantic checks in {@link ./resolve.js}, where they can report
8
+ * the offending file + line.
9
+ */
10
+ import { z } from "zod";
11
+ /** An `agents:` value is a string (bare persona path) OR the object above. A plain `z.union`
12
+ * collapses an object with a bad key to a useless "Invalid input", so normalize the string form to
13
+ * `{ persona }` first and validate the one strict object — its real errors (unrecognized key, …)
14
+ * then surface with their path. */
15
+ declare const AgentEntry: z.ZodPreprocess<z.ZodObject<{
16
+ persona: z.ZodOptional<z.ZodString>;
17
+ agent: z.ZodOptional<z.ZodString>;
18
+ model: z.ZodOptional<z.ZodString>;
19
+ role: z.ZodOptional<z.ZodString>;
20
+ description: z.ZodOptional<z.ZodString>;
21
+ instructions: z.ZodOptional<z.ZodString>;
22
+ capabilities: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
+ personaPermissions: z.ZodOptional<z.ZodEnum<{
24
+ reject: "reject";
25
+ include: "include";
26
+ }>>;
27
+ }, z.core.$strict>>;
28
+ /** A channel carries its registry card (description/instructions + replay knobs — the existing
29
+ * ChannelConfig fields) plus the three native access verbs listed per-channel (agents under it). */
30
+ declare const ChannelEntry: z.ZodObject<{
31
+ description: z.ZodOptional<z.ZodString>;
32
+ instructions: z.ZodOptional<z.ZodString>;
33
+ subscribe: z.ZodOptional<z.ZodArray<z.ZodString>>;
34
+ allowSubscribe: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
+ allowPublish: z.ZodOptional<z.ZodArray<z.ZodString>>;
36
+ replay: z.ZodOptional<z.ZodBoolean>;
37
+ replayWindow: z.ZodOptional<z.ZodString>;
38
+ deliveryClass: z.ZodOptional<z.ZodEnum<{
39
+ live: "live";
40
+ durable: "durable";
41
+ }>>;
42
+ }, z.core.$strict>;
43
+ /** The whole manifest. `apiVersion`/`kind` are literals so a foreign YAML doc is rejected up front;
44
+ * `agents` and `channels` are required maps. */
45
+ export declare const MeshManifestSchema: z.ZodObject<{
46
+ apiVersion: z.ZodLiteral<"cotal/v1">;
47
+ kind: z.ZodLiteral<"Mesh">;
48
+ space: z.ZodString;
49
+ broker: z.ZodOptional<z.ZodObject<{
50
+ servers: z.ZodOptional<z.ZodString>;
51
+ host: z.ZodOptional<z.ZodString>;
52
+ auth: z.ZodOptional<z.ZodBoolean>;
53
+ }, z.core.$strict>>;
54
+ runtime: z.ZodOptional<z.ZodEnum<{
55
+ pty: "pty";
56
+ tmux: "tmux";
57
+ cmux: "cmux";
58
+ }>>;
59
+ agent: z.ZodOptional<z.ZodString>;
60
+ personaPermissions: z.ZodOptional<z.ZodEnum<{
61
+ reject: "reject";
62
+ include: "include";
63
+ }>>;
64
+ agents: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodPreprocess<z.ZodObject<{
65
+ persona: z.ZodOptional<z.ZodString>;
66
+ agent: z.ZodOptional<z.ZodString>;
67
+ model: z.ZodOptional<z.ZodString>;
68
+ role: z.ZodOptional<z.ZodString>;
69
+ description: z.ZodOptional<z.ZodString>;
70
+ instructions: z.ZodOptional<z.ZodString>;
71
+ capabilities: z.ZodOptional<z.ZodArray<z.ZodString>>;
72
+ personaPermissions: z.ZodOptional<z.ZodEnum<{
73
+ reject: "reject";
74
+ include: "include";
75
+ }>>;
76
+ }, z.core.$strict>>>>;
77
+ defaults: z.ZodOptional<z.ZodObject<{
78
+ replay: z.ZodOptional<z.ZodBoolean>;
79
+ replayWindow: z.ZodOptional<z.ZodString>;
80
+ deliveryClass: z.ZodOptional<z.ZodEnum<{
81
+ live: "live";
82
+ durable: "durable";
83
+ }>>;
84
+ }, z.core.$strict>>;
85
+ channels: z.ZodRecord<z.ZodString, z.ZodObject<{
86
+ description: z.ZodOptional<z.ZodString>;
87
+ instructions: z.ZodOptional<z.ZodString>;
88
+ subscribe: z.ZodOptional<z.ZodArray<z.ZodString>>;
89
+ allowSubscribe: z.ZodOptional<z.ZodArray<z.ZodString>>;
90
+ allowPublish: z.ZodOptional<z.ZodArray<z.ZodString>>;
91
+ replay: z.ZodOptional<z.ZodBoolean>;
92
+ replayWindow: z.ZodOptional<z.ZodString>;
93
+ deliveryClass: z.ZodOptional<z.ZodEnum<{
94
+ live: "live";
95
+ durable: "durable";
96
+ }>>;
97
+ }, z.core.$strict>>;
98
+ }, z.core.$strict>;
99
+ export type RawManifest = z.infer<typeof MeshManifestSchema>;
100
+ export type RawAgentEntry = z.infer<typeof AgentEntry>;
101
+ export type RawChannelEntry = z.infer<typeof ChannelEntry>;
102
+ export {};
103
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/lib/manifest/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB;;;oCAGoC;AACpC,QAAA,MAAM,UAAU;;;;;;;;;;;;mBAAsF,CAAC;AAEvG;qGACqG;AACrG,QAAA,MAAM,YAAY;;;;;;;;;;;;kBAShB,CAAC;AAcH;iDACiD;AACjD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAc7B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC7D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AACvD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}