@cotal-ai/cli 0.6.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 (135) hide show
  1. package/dist/commands/channels.d.ts +4 -2
  2. package/dist/commands/channels.d.ts.map +1 -1
  3. package/dist/commands/channels.js +17 -18
  4. package/dist/commands/channels.js.map +1 -1
  5. package/dist/commands/console.d.ts.map +1 -1
  6. package/dist/commands/console.js +13 -29
  7. package/dist/commands/console.js.map +1 -1
  8. package/dist/commands/down-manifest.d.ts +6 -0
  9. package/dist/commands/down-manifest.d.ts.map +1 -0
  10. package/dist/commands/down-manifest.js +282 -0
  11. package/dist/commands/down-manifest.js.map +1 -0
  12. package/dist/commands/down.d.ts +5 -3
  13. package/dist/commands/down.d.ts.map +1 -1
  14. package/dist/commands/down.js +30 -3
  15. package/dist/commands/down.js.map +1 -1
  16. package/dist/commands/history.d.ts.map +1 -1
  17. package/dist/commands/history.js +6 -13
  18. package/dist/commands/history.js.map +1 -1
  19. package/dist/commands/join.d.ts.map +1 -1
  20. package/dist/commands/join.js +20 -7
  21. package/dist/commands/join.js.map +1 -1
  22. package/dist/commands/meshes.d.ts +5 -0
  23. package/dist/commands/meshes.d.ts.map +1 -0
  24. package/dist/commands/meshes.js +25 -0
  25. package/dist/commands/meshes.js.map +1 -0
  26. package/dist/commands/mint.d.ts.map +1 -1
  27. package/dist/commands/mint.js +2 -1
  28. package/dist/commands/mint.js.map +1 -1
  29. package/dist/commands/setup.d.ts.map +1 -1
  30. package/dist/commands/setup.js +66 -16
  31. package/dist/commands/setup.js.map +1 -1
  32. package/dist/commands/spawn-manifest.d.ts +10 -0
  33. package/dist/commands/spawn-manifest.d.ts.map +1 -0
  34. package/dist/commands/spawn-manifest.js +197 -0
  35. package/dist/commands/spawn-manifest.js.map +1 -0
  36. package/dist/commands/spawn.d.ts +4 -2
  37. package/dist/commands/spawn.d.ts.map +1 -1
  38. package/dist/commands/spawn.js +84 -25
  39. package/dist/commands/spawn.js.map +1 -1
  40. package/dist/commands/topology.d.ts +10 -0
  41. package/dist/commands/topology.d.ts.map +1 -0
  42. package/dist/commands/topology.js +46 -0
  43. package/dist/commands/topology.js.map +1 -0
  44. package/dist/commands/up.d.ts +4 -0
  45. package/dist/commands/up.d.ts.map +1 -1
  46. package/dist/commands/up.js +223 -6
  47. package/dist/commands/up.js.map +1 -1
  48. package/dist/commands/use.d.ts +7 -0
  49. package/dist/commands/use.d.ts.map +1 -0
  50. package/dist/commands/use.js +27 -0
  51. package/dist/commands/use.js.map +1 -0
  52. package/dist/commands/web.d.ts.map +1 -1
  53. package/dist/commands/web.js +60 -28
  54. package/dist/commands/web.js.map +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +27 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/lib/connect.d.ts +74 -0
  59. package/dist/lib/connect.d.ts.map +1 -0
  60. package/dist/lib/connect.js +91 -0
  61. package/dist/lib/connect.js.map +1 -0
  62. package/dist/lib/delivery-proc.d.ts.map +1 -1
  63. package/dist/lib/delivery-proc.js +2 -1
  64. package/dist/lib/delivery-proc.js.map +1 -1
  65. package/dist/lib/manager-proc.d.ts +4 -0
  66. package/dist/lib/manager-proc.d.ts.map +1 -1
  67. package/dist/lib/manager-proc.js +17 -0
  68. package/dist/lib/manager-proc.js.map +1 -1
  69. package/dist/lib/manifest/apply.d.ts +29 -0
  70. package/dist/lib/manifest/apply.d.ts.map +1 -0
  71. package/dist/lib/manifest/apply.js +138 -0
  72. package/dist/lib/manifest/apply.js.map +1 -0
  73. package/dist/lib/manifest/errors.d.ts +21 -0
  74. package/dist/lib/manifest/errors.d.ts.map +1 -0
  75. package/dist/lib/manifest/errors.js +19 -0
  76. package/dist/lib/manifest/errors.js.map +1 -0
  77. package/dist/lib/manifest/index.d.ts +13 -0
  78. package/dist/lib/manifest/index.d.ts.map +1 -0
  79. package/dist/lib/manifest/index.js +21 -0
  80. package/dist/lib/manifest/index.js.map +1 -0
  81. package/dist/lib/manifest/ledger.d.ts +81 -0
  82. package/dist/lib/manifest/ledger.d.ts.map +1 -0
  83. package/dist/lib/manifest/ledger.js +213 -0
  84. package/dist/lib/manifest/ledger.js.map +1 -0
  85. package/dist/lib/manifest/live.d.ts +25 -0
  86. package/dist/lib/manifest/live.d.ts.map +1 -0
  87. package/dist/lib/manifest/live.js +61 -0
  88. package/dist/lib/manifest/live.js.map +1 -0
  89. package/dist/lib/manifest/model.d.ts +71 -0
  90. package/dist/lib/manifest/model.d.ts.map +1 -0
  91. package/dist/lib/manifest/model.js +2 -0
  92. package/dist/lib/manifest/model.js.map +1 -0
  93. package/dist/lib/manifest/preflight.d.ts +12 -0
  94. package/dist/lib/manifest/preflight.d.ts.map +1 -0
  95. package/dist/lib/manifest/preflight.js +43 -0
  96. package/dist/lib/manifest/preflight.js.map +1 -0
  97. package/dist/lib/manifest/prepare.d.ts +57 -0
  98. package/dist/lib/manifest/prepare.d.ts.map +1 -0
  99. package/dist/lib/manifest/prepare.js +95 -0
  100. package/dist/lib/manifest/prepare.js.map +1 -0
  101. package/dist/lib/manifest/render.d.ts +41 -0
  102. package/dist/lib/manifest/render.d.ts.map +1 -0
  103. package/dist/lib/manifest/render.js +177 -0
  104. package/dist/lib/manifest/render.js.map +1 -0
  105. package/dist/lib/manifest/resolve.d.ts +5 -0
  106. package/dist/lib/manifest/resolve.d.ts.map +1 -0
  107. package/dist/lib/manifest/resolve.js +185 -0
  108. package/dist/lib/manifest/resolve.js.map +1 -0
  109. package/dist/lib/manifest/schema.d.ts +103 -0
  110. package/dist/lib/manifest/schema.d.ts.map +1 -0
  111. package/dist/lib/manifest/schema.js +77 -0
  112. package/dist/lib/manifest/schema.js.map +1 -0
  113. package/dist/lib/manifest/spawn-plan.d.ts +87 -0
  114. package/dist/lib/manifest/spawn-plan.d.ts.map +1 -0
  115. package/dist/lib/manifest/spawn-plan.js +75 -0
  116. package/dist/lib/manifest/spawn-plan.js.map +1 -0
  117. package/dist/lib/meshes.d.ts +2 -0
  118. package/dist/lib/meshes.d.ts.map +1 -0
  119. package/dist/lib/meshes.js +6 -0
  120. package/dist/lib/meshes.js.map +1 -0
  121. package/dist/lib/onboard.js +6 -6
  122. package/dist/lib/onboard.js.map +1 -1
  123. package/dist/lib/paths.js +1 -1
  124. package/dist/lib/paths.js.map +1 -1
  125. package/dist/lib/status.d.ts.map +1 -1
  126. package/dist/lib/status.js +2 -1
  127. package/dist/lib/status.js.map +1 -1
  128. package/dist/lib/transient.d.ts +7 -6
  129. package/dist/lib/transient.d.ts.map +1 -1
  130. package/dist/lib/transient.js +6 -25
  131. package/dist/lib/transient.js.map +1 -1
  132. package/dist/web/graph.html +207 -0
  133. package/dist/web/graph.js +508 -0
  134. package/dist/web/index.html +6 -0
  135. package/package.json +6 -2
@@ -0,0 +1,197 @@
1
+ /**
2
+ * `cotal spawn -f cotal.yaml` — deploy a mesh manifest onto a RUNNING mesh (additive). The only
3
+ * command that touches a mesh it doesn't own, so it is creation-only + ownership-scoped:
4
+ *
5
+ * - classifies channels (new → seed + own · existing → `exists-unmanaged`, card untouched) and
6
+ * agents (will-create · already-owned · stale) against the live mesh + any prior ledger;
7
+ * - boots agents through the workspace-local manager's admin `launch` op (it reads the run spec by
8
+ * id and mints from the resolved policy — the control wire carries no authority);
9
+ * - records exactly what it created in a `cotal-ledger/v1` ledger so `down -f` removes only that;
10
+ * - flags unmanaged actors on declared channels as a SECURITY warning (an explicit lower bound).
11
+ *
12
+ * `--dry-run` prints the plan and mutates nothing; a stale declared agent exits non-zero unless
13
+ * `--allow-stale <names>`.
14
+ */
15
+ import { readFileSync } from "node:fs";
16
+ import { resolve } from "node:path";
17
+ import { DEFAULT_SERVER, readChannelRegistry, seedChannelRegistry, } from "@cotal-ai/core";
18
+ import { c } from "../ui.js";
19
+ import { cotalRoot } from "../lib/paths.js";
20
+ import { connectOrExit } from "../lib/connect.js";
21
+ import { managerUp, startManagerDetached } from "../lib/manager-proc.js";
22
+ import { loadManifest } from "../lib/manifest/index.js";
23
+ import { buildLaunchSpec, channelsSeed, genRunId, preflightConnectors, writeLaunchSpec } from "../lib/manifest/apply.js";
24
+ import { buildLedger, hashManifestSource, listLedgers, writeLedger } from "../lib/manifest/ledger.js";
25
+ import { classifyAgents, classifyChannels, detectUnmanagedActors } from "../lib/manifest/spawn-plan.js";
26
+ import { connectProbe, launchAgent, settleRoster, waitManagerReady } from "../lib/manifest/live.js";
27
+ import { renderInherited, renderSpawnPlan, renderSpawnSummary, renderWarnings } from "../lib/manifest/render.js";
28
+ import { failManifest } from "./topology.js";
29
+ const RUNTIMES = ["pty", "tmux", "cmux"];
30
+ export async function spawnManifest(file, flags) {
31
+ const abs = resolve(file);
32
+ let prepared;
33
+ try {
34
+ prepared = loadManifest(abs);
35
+ }
36
+ catch (e) {
37
+ failManifest(e);
38
+ }
39
+ if (flags.runtime && !RUNTIMES.includes(flags.runtime)) {
40
+ console.error(c.red(`✗ unknown --runtime "${flags.runtime}" — expected ${RUNTIMES.join(", ")}`));
41
+ process.exit(1);
42
+ }
43
+ const eff = applyOverrides(prepared, flags);
44
+ const m = eff.manifest;
45
+ const space = m.space;
46
+ const runtime = m.runtime ?? "pty";
47
+ // Connectors + their binaries must exist before any mutation (no fallback).
48
+ const connErr = preflightConnectors(eff);
49
+ if (connErr) {
50
+ console.error(c.red(`✗ connector preflight failed: ${connErr}`));
51
+ process.exit(1);
52
+ }
53
+ // spawn -f deploys onto a RUNNING mesh — the broker MUST be reachable (opposite of up -f). Resolve
54
+ // the mesh + mint a manager (admin-control) cred from the local registry/auth (same-checkout).
55
+ const connection = await connectOrExit({ server: m.broker?.servers ?? flags.server, space }, "manager");
56
+ const root = cotalRoot();
57
+ // Same-checkout invariant (security/UX): the launch spec, the ledger, and the manager `spawn -f`
58
+ // drives all live under THIS checkout's `.cotal`. Deploying onto a mesh recorded by a different
59
+ // checkout would decouple those local artifacts from that mesh's root/manager. Refuse unless the
60
+ // resolved mesh is registered to this root; a raw off-registry target (no recorded root) isn't
61
+ // supported for a manifest deploy.
62
+ if (!connection.root) {
63
+ console.error(c.red(`✗ spawn -f needs a mesh registered to this checkout — a raw off-registry target (--server/--space) isn't supported for a manifest deploy`));
64
+ process.exit(1);
65
+ }
66
+ if (resolve(connection.root) !== resolve(root)) {
67
+ console.error(c.red(`✗ mesh "${space}" belongs to a different checkout (${connection.root}) — \`spawn -f\` / \`down -f\` are same-checkout; run them from ${connection.root}`));
68
+ process.exit(1);
69
+ }
70
+ const manifestHash = hashManifestSource(readFileSync(abs, "utf8"));
71
+ // A prior ledger for this manifest content ⇒ a re-apply (reuse its runId, classify against it).
72
+ // listLedgers fails closed (throws) on a symlinked `.cotal/manifests` — surface it cleanly.
73
+ let priors;
74
+ try {
75
+ priors = listLedgers(root).filter((l) => l.ledger.manifestHash === manifestHash && l.ledger.space === space);
76
+ }
77
+ catch (e) {
78
+ console.error(c.red(`✗ ${e.message}`));
79
+ process.exit(1);
80
+ }
81
+ if (priors.length > 1) {
82
+ console.error(c.red(`✗ ${priors.length} runs already deployed this manifest (${priors.map((p) => p.ledger.runId).join(", ")}) — tear one down first: \`cotal down -f ${file} --run <id>\``));
83
+ process.exit(1);
84
+ }
85
+ const prior = priors[0]?.ledger;
86
+ const runId = prior?.runId ?? genRunId();
87
+ const ownedKeys = new Set(prior?.created.channels ?? []);
88
+ const ownedIds = new Set((prior?.created.agents ?? []).map((a) => a.id));
89
+ const ownedNames = new Set((prior?.created.agents ?? []).map((a) => a.name));
90
+ const liveRegistry = await readChannelRegistry({ servers: connection.server, space, creds: connection.creds });
91
+ const ep = await connectProbe({ space, server: connection.server, creds: connection.creds });
92
+ try {
93
+ const roster = await settleRoster(ep);
94
+ const membership = await ep.readMembership().catch(() => null);
95
+ const channelPlan = classifyChannels(m.channels, liveRegistry, ownedKeys);
96
+ const agentPlan = classifyAgents(eff.agents, roster, prior);
97
+ const unmanaged = detectUnmanagedActors(m.channels.map((ch) => ch.name), membership, roster, { ids: ownedIds, names: ownedNames });
98
+ if (flags.dryRun) {
99
+ console.log(renderSpawnPlan(eff, channelPlan, agentPlan, unmanaged, { server: connection.server, runId, dryRun: true }));
100
+ return;
101
+ }
102
+ // Stale gate (apply-only): a re-declared owned agent whose resolved policy changed must restart —
103
+ // never silently keep running the old policy. Exit non-zero unless explicitly waived by name.
104
+ const allow = new Set(flags.allowStale ?? []);
105
+ const unwaived = agentPlan.stale.filter((e) => !allow.has(e.agent.name));
106
+ if (unwaived.length) {
107
+ console.error(c.red(`✗ ${unwaived.length} declared agent(s) are stale (policy changed) — restart required:`));
108
+ for (const e of unwaived)
109
+ console.error(c.red(` ${e.agent.name}: ${e.prior?.name} hash ${e.prior?.hash.slice(0, 8)} → ${e.hash.slice(0, 8)}`));
110
+ console.error(c.dim(` Waive (they keep running the OLD policy until restarted): --allow-stale ${unwaived.map((e) => e.agent.name).join(",")}`));
111
+ process.exit(1);
112
+ }
113
+ console.log(renderSpawnPlan(eff, channelPlan, agentPlan, unmanaged, { server: connection.server, runId, dryRun: false }), "\n");
114
+ // 1) Seed ONLY brand-new channel keys — no defaults, no pre-existing/unmanaged card mutation.
115
+ if (channelPlan.create.length)
116
+ await seedChannelRegistry({ servers: connection.server, space, creds: connection.creds, file: channelsSeed(channelPlan.create) });
117
+ // 2-4) Boot the will-create agents through the workspace-local manager's admin `launch` op,
118
+ // capturing the SPAWNED name + id the ledger keys on (creds are filed under the
119
+ // collision-numbered spawned name, not the manifest key). Skipped entirely for a
120
+ // channels-only deploy — no need to stand up a manager.
121
+ const agents = [...(prior?.created.agents ?? [])];
122
+ const launchedNow = [];
123
+ if (agentPlan.willCreate.length) {
124
+ // The manager reads the run spec by runId on each `launch`.
125
+ writeLaunchSpec(root, buildLaunchSpec(eff, runId), { update: Boolean(prior) });
126
+ if (!managerUp())
127
+ startManagerDetached({ space, server: connection.server, runtime });
128
+ if (!(await waitManagerReady(ep))) {
129
+ console.error(c.red("✗ manager did not become ready for control — see .cotal/manager.log"));
130
+ process.exit(1);
131
+ }
132
+ for (const e of agentPlan.willCreate) {
133
+ const reply = await launchAgent(ep, runId, e.agent.name);
134
+ if (!reply.ok) {
135
+ console.error(c.red(`✗ ${e.agent.name}: ${reply.error ?? "launch failed"}`));
136
+ continue;
137
+ }
138
+ const d = reply.data;
139
+ agents.push({ requested: d.requested, name: d.name, id: d.id, hash: d.hash });
140
+ launchedNow.push(d.name);
141
+ console.log(c.green(`✓ launched ${d.name}`) + c.dim(` (${e.agent.agentType})`));
142
+ }
143
+ }
144
+ // 5) Write/update the creation-only ownership ledger (prior owned ∪ this run's new).
145
+ const createdChannels = dedupe([...(prior?.created.channels ?? []), ...channelPlan.create.map((ch) => ch.name)]);
146
+ const ledger = buildLedger({ runId, space, server: connection.server, manifestHash, manifestPath: abs, channels: createdChannels, agents: dedupeAgents(agents) });
147
+ const ledgerPath = writeLedger(root, ledger, { update: Boolean(prior) });
148
+ // 6) Summary + the exact ownership-scoped teardown command.
149
+ console.log("\n" + renderSpawnSummary({
150
+ space,
151
+ server: connection.server,
152
+ runId,
153
+ ledgerPath,
154
+ manifestPath: abs,
155
+ created: channelPlan.create.map((ch) => ch.name),
156
+ launched: launchedNow,
157
+ existsUnmanaged: channelPlan.existsUnmanaged.map((x) => x.channel.name),
158
+ unmanaged,
159
+ }));
160
+ const inh = renderInherited(eff);
161
+ if (inh)
162
+ console.log("\n" + inh);
163
+ if (eff.warnings.length)
164
+ console.log("\n" + renderWarnings(eff.warnings));
165
+ }
166
+ finally {
167
+ await ep.stop();
168
+ }
169
+ }
170
+ /** CLI overrides for `spawn -f` (flag > manifest > default): the connect target + runtime. No
171
+ * host/open — we connect to an existing broker, not bind one. */
172
+ function applyOverrides(prepared, o) {
173
+ const m = prepared.manifest;
174
+ const broker = { ...m.broker };
175
+ if (o.server)
176
+ broker.servers = o.server;
177
+ if (!broker.servers)
178
+ broker.servers = DEFAULT_SERVER;
179
+ return {
180
+ ...prepared,
181
+ manifest: {
182
+ ...m,
183
+ broker,
184
+ space: o.space ?? m.space,
185
+ runtime: o.runtime ?? m.runtime,
186
+ },
187
+ };
188
+ }
189
+ const dedupe = (xs) => [...new Set(xs)];
190
+ /** Keep one entry per nkey id (defensive — `willCreate` excludes prior-owned, so no dup in practice). */
191
+ function dedupeAgents(agents) {
192
+ const byId = new Map();
193
+ for (const a of agents)
194
+ byId.set(a.id, a);
195
+ return [...byId.values()];
196
+ }
197
+ //# sourceMappingURL=spawn-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-manifest.js","sourceRoot":"","sources":["../../src/commands/spawn-manifest.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { type CompletionResult } from "@cotal-ai/core";
2
- /** Completion for `cotal spawn <name>` the first positional is a persona; the rest are flags
3
- * we leave to the shell. Filesystem-only (the persona catalog), so it never opens the mesh. */
2
+ /** Completion for `cotal spawn` — `--space <TAB>` lists the running meshes, and the first positional
3
+ * is a persona from the mesh this spawn would target. Resolved OFFLINE (registry + `current`, no
4
+ * probe — a <TAB> must stay cheap and never open the network), so it lists the *target* mesh's
5
+ * personas, not the cwd's. */
4
6
  export declare function spawnComplete(argv: string[]): CompletionResult;
5
7
  export declare function spawn(argv: string[]): Promise<void>;
6
8
  //# sourceMappingURL=spawn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"AAIA,OAAO,EAiBL,KAAK,gBAAgB,EAGtB,MAAM,gBAAgB,CAAC;AAKxB;gGACgG;AAChG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAI9D;AA8DD,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgJzD"}
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"AAIA,OAAO,EAcL,KAAK,gBAAgB,EAGtB,MAAM,gBAAgB,CAAC;AAOxB;;;+BAG+B;AAC/B,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAe9D;AAmED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2LzD"}
@@ -2,15 +2,31 @@ import { spawn as spawnProcess } from "node:child_process";
2
2
  import { mkdirSync, writeFileSync } from "node:fs";
3
3
  import { join, dirname } from "node:path";
4
4
  import { parseArgs } from "node:util";
5
- import { DEFAULT_SERVER, agentFilePath, authDir, connectorServers, firstFreeName, isReachable, loadAgentFile, loadCotalConfig, loadSpaceAuth, mintCreds, newIdentity, parseShareSelection, provisionAgent, registry, CotalEndpoint, } from "@cotal-ai/core";
6
- import { cotalRoot } from "../lib/paths.js";
7
- import { listPersonaNames } from "../lib/personas.js";
8
- import { resolveSpace } from "../lib/status.js";
9
- /** Completion for `cotal spawn <name>` — the first positional is a persona; the rest are flags
10
- * we leave to the shell. Filesystem-only (the persona catalog), so it never opens the mesh. */
5
+ import { agentFilePath, connectorServers, firstFreeName, isReachable, loadAgentFile, loadCotalConfig, mintCreds, newIdentity, parseShareSelection, provisionAgent, registry, CotalEndpoint, } from "@cotal-ai/core";
6
+ import { authDir, loadMeshes, resolveMeshTarget } from "@cotal-ai/workspace";
7
+ import { c } from "../ui.js";
8
+ import { preflightOrExit, resolveTargetOrExit } from "../lib/connect.js";
9
+ import { listPersonas } from "../lib/personas.js";
10
+ import { spawnManifest } from "./spawn-manifest.js";
11
+ /** Completion for `cotal spawn` — `--space <TAB>` lists the running meshes, and the first positional
12
+ * is a persona from the mesh this spawn would target. Resolved OFFLINE (registry + `current`, no
13
+ * probe — a <TAB> must stay cheap and never open the network), so it lists the *target* mesh's
14
+ * personas, not the cwd's. */
11
15
  export function spawnComplete(argv) {
12
- if (argv.length <= 1)
13
- return { items: listPersonaNames().map((value) => ({ value })), directive: "nofiles" };
16
+ if (argv[argv.length - 2] === "--space")
17
+ return { items: loadMeshes().map((m) => ({ value: m.space })), directive: "nofiles" };
18
+ // Only the first word after `spawn` is the persona positional; once it's typed, defer to the shell.
19
+ if (argv.length <= 1) {
20
+ try {
21
+ const target = resolveMeshTarget(process.cwd());
22
+ return { items: listPersonas(target.root).map((p) => ({ value: p.name })), directive: "nofiles" };
23
+ }
24
+ catch {
25
+ // No single target (no mesh, or several with no `current`) — fail CLOSED: offer no personas
26
+ // rather than throw. `cotal spawn --space <TAB>` still lists the running meshes.
27
+ return { items: [], directive: "nofiles" };
28
+ }
29
+ }
14
30
  return { items: [], directive: "nofiles" };
15
31
  }
16
32
  /**
@@ -25,6 +41,10 @@ export function spawnComplete(argv) {
25
41
  * shared with the manager); only *how the spec runs* differs — foreground exec
26
42
  * here vs. a supervised runtime in the manager. The connector is resolved from
27
43
  * the registry by agent type, composed at the root.
44
+ *
45
+ * The mesh it joins — creds and personas together — is resolved by {@link resolveMeshTarget}, so a
46
+ * bare `cotal spawn <persona>` from any directory finds the running mesh (one up, or the `current`
47
+ * default) instead of mistaking `~/.cotal` for a space.
28
48
  */
29
49
  /**
30
50
  * Auto-number `requested` past any peer already present on the mesh (foo → foo-2 → foo-3) — the same
@@ -88,46 +108,83 @@ export async function spawn(argv) {
88
108
  subscribe: { type: "string" }, // read set override (comma-separated)
89
109
  "allow-subscribe": { type: "string" }, // read ACL override
90
110
  "allow-publish": { type: "string" }, // post ACL override
111
+ file: { type: "string", short: "f" }, // a mesh manifest (cotal.yaml) — deploy onto the running mesh
112
+ "dry-run": { type: "boolean" }, // with -f: print the plan, mutate nothing
113
+ "allow-stale": { type: "string" }, // with -f: waive named stale agents (apply-only)
114
+ runtime: { type: "string" }, // with -f: override the manifest's runtime (pty | tmux | cmux)
91
115
  },
92
116
  });
93
117
  const splitFlag = (v) => (v ? v.split(",").map((s) => s.trim()).filter(Boolean) : undefined);
118
+ // `spawn -f cotal.yaml` is a distinct path: deploy a manifest onto a RUNNING mesh (additive,
119
+ // ownership-scoped). The broker must already be reachable; bringing up a fresh mesh is `up -f`.
120
+ if (values.file) {
121
+ await spawnManifest(values.file, {
122
+ dryRun: Boolean(values["dry-run"]),
123
+ server: values.server,
124
+ space: values.space,
125
+ runtime: values.runtime,
126
+ allowStale: splitFlag(values["allow-stale"]),
127
+ });
128
+ return;
129
+ }
94
130
  // Transcript mirroring to `tr-<name>` is OFF by default; `--transcript` opts in
95
131
  // (`--no-transcript` is accepted too, to be explicit about the default).
96
132
  const transcript = values.transcript ? true : values["no-transcript"] ? false : false;
133
+ // Which mesh this spawn joins — creds + personas together, resolved from --server/--space, a local
134
+ // project, or the registry (the running mesh / the `current` default).
135
+ const target = await resolveTargetOrExit({ server: values.server, space: values.space });
136
+ const { space, server, auth } = target;
97
137
  // Where the config lives: --config, else the positional <name-or-path>, else --name
98
- // (.cotal/agents/<name>.md). With none of those, fall back to the seeded `default` persona:
99
- // `cotal spawn` with no args launches `.cotal/agents/default.md` (same flags as `cotal start`).
138
+ // (.cotal/agents/<name>.md under the TARGET mesh's root). With none, fall back to its `default`
139
+ // persona — `cotal spawn` with no args launches `<root>/.cotal/agents/default.md`.
100
140
  const ref = values.config ?? positionals[0] ?? values.name ?? "default";
101
- const path = agentFilePath(cotalRoot(), ref);
141
+ const path = agentFilePath(target.root, ref);
102
142
  let def;
103
143
  try {
104
144
  def = loadAgentFile(path);
105
145
  }
106
146
  catch (e) {
107
- const noDefault = ref === "default" && e.code === "ENOENT";
108
- console.error(noDefault
109
- ? "✗ no default persona yet — run `cotal setup` to seed one, or name a persona: `cotal spawn <name>`"
110
- : `✗ ${e.message}`);
147
+ const code = e.code;
148
+ if (code === "ENOENT") {
149
+ console.error(c.red(ref === "default"
150
+ ? "✗ no default persona yet — run `cotal setup` to seed one, or name a persona: `cotal spawn <name>`"
151
+ : `✗ no persona "${ref}" in ${target.space}'s ${target.personaRoot} — use \`--config <path>\` for a file elsewhere`));
152
+ }
153
+ else {
154
+ console.error(c.red(`✗ ${e.message}`));
155
+ }
111
156
  process.exit(1);
112
157
  }
113
158
  // --name / --role override the file (name defaults from the file's frontmatter).
114
159
  const requested = values.name ?? def.name;
115
160
  const role = values.role ?? def.role;
116
- const space = values.space ?? resolveSpace(process.cwd());
117
- const server = values.server ?? DEFAULT_SERVER;
118
- const auth = loadSpaceAuth(authDir(cotalRoot()));
161
+ // Preflight: fail with one sentence if the mesh is down or won't take our creds, instead of
162
+ // crashing mid-connect with a raw NATS Authorization Violation.
163
+ await preflightOrExit(target);
119
164
  // A second `cotal spawn` of the same agent would otherwise join under a duplicate mesh identity:
120
165
  // auto-number the name past anyone already present (best-effort — this path bypasses the manager's
121
166
  // race-free reservation; see uniqueMeshName). Everything below (creds path, launch) uses `name`.
122
167
  const name = await uniqueMeshName(requested, { space, server, auth });
123
168
  if (name !== requested)
124
169
  console.error(`"${requested}" is already on the mesh — spawning as ${name} instead`);
170
+ // When the target was auto-resolved (one mesh up, or the `current` default), say which mesh we
171
+ // picked — it isn't obvious from the cwd. An explicit --space/--server or a local project is
172
+ // self-evident, so stay quiet there.
173
+ if (target.source === "registry" || target.source === "current")
174
+ console.error(c.dim(`→ joining mesh ${space} (${server}) as ${name}`));
125
175
  // Auth mode (`.cotal/auth` present): mint a stable identity + scoped creds for this agent
126
176
  // and pre-create its bind-only durables, via a short-lived privileged provisioner — the
127
177
  // same onboarding the manager does, so the foreground launch joins the authed mesh too.
128
178
  // Open mode (no `.cotal/auth`): unchanged — the session connects without creds.
129
179
  let id;
130
180
  let credsPath;
181
+ // The agent's access policy (flags > persona file) — minted into the creds AND forwarded to the
182
+ // connector (COTAL_SUBSCRIBE / COTAL_ALLOW_*) so the session's runtime read/post set matches its
183
+ // credentials. One source, so a `--subscribe` override can't land in the creds yet be lost at
184
+ // runtime (the connector would otherwise read only the persona file / fall back to `general`).
185
+ const subscribe = splitFlag(values.subscribe) ?? def.subscribe;
186
+ const allowSubscribe = splitFlag(values["allow-subscribe"]) ?? def.allowSubscribe ?? subscribe;
187
+ const allowPublish = splitFlag(values["allow-publish"]) ?? def.allowPublish;
131
188
  if (auth) {
132
189
  const identity = newIdentity();
133
190
  const prov = new CotalEndpoint({
@@ -142,7 +199,6 @@ export async function spawn(argv) {
142
199
  });
143
200
  prov.on("error", (e) => console.error(`! provisioner: ${e.message}`));
144
201
  await prov.start();
145
- const subscribe = splitFlag(values.subscribe) ?? def.subscribe;
146
202
  // Direct foreground spawn is LIVE-ONLY: this short-lived provisioner is not a managing Plane-3 host,
147
203
  // and no long-lived manager knows this agent (it's in no manager's `agents` ledger), so a durable
148
204
  // boot membership could be neither authorized for reader delivery nor leaved via self-service. Skip
@@ -150,24 +206,24 @@ export async function spawn(argv) {
150
206
  // (`cotal start` / `cotal up`).
151
207
  const creds = await provisionAgent(prov, auth, identity, {
152
208
  subscribe,
153
- allowSubscribe: splitFlag(values["allow-subscribe"]) ?? def.allowSubscribe ?? subscribe,
154
- allowPublish: splitFlag(values["allow-publish"]) ?? def.allowPublish,
209
+ allowSubscribe,
210
+ allowPublish,
155
211
  role,
156
212
  capabilities: def.capabilities,
157
213
  durableMembership: false,
158
214
  });
159
215
  await prov.stop();
160
- credsPath = join(authDir(cotalRoot()), "creds", `${name}.creds`);
216
+ credsPath = join(authDir(target.root), "creds", `${name}.creds`);
161
217
  mkdirSync(dirname(credsPath), { recursive: true });
162
218
  writeFileSync(credsPath, creds, { mode: 0o600 });
163
219
  id = identity.id;
164
220
  console.error(`minted creds for ${name} (auth mode) → ${credsPath}`);
165
221
  }
166
222
  // Which of the operator's personal MCP servers to share with this agent: declared in the cotal
167
- // config (global ~/.config/cotal + space-local .cotal), narrowed by an optional --share-tools
168
- // selection. Default (no config) is none — the connector launches isolated.
223
+ // config (global ~/.config/cotal + the target mesh's .cotal), narrowed by an optional
224
+ // --share-tools selection. Default (no config) is none — the connector launches isolated.
169
225
  const agentType = values.agent ?? "claude";
170
- const mcpServers = connectorServers(loadCotalConfig(cotalRoot()), agentType, parseShareSelection(values["share-tools"]));
226
+ const mcpServers = connectorServers(loadCotalConfig(target.root), agentType, parseShareSelection(values["share-tools"]));
171
227
  const connector = registry.resolve("connector", agentType);
172
228
  const spec = connector.buildLaunch({
173
229
  space,
@@ -177,6 +233,9 @@ export async function spawn(argv) {
177
233
  creds: credsPath,
178
234
  servers: server,
179
235
  configPath: path,
236
+ subscribe,
237
+ allowSubscribe,
238
+ allowPublish,
180
239
  prompt: values.prompt,
181
240
  transcript,
182
241
  mcpServers,
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/commands/spawn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `cotal topology view -f cotal.yaml` — validate a mesh manifest and print its access graph:
3
+ * per-channel and per-agent subscribe/read/post (with humane labels), any persona-inherited
4
+ * unmanaged scopes, and warnings. Read-only — it mutates nothing and needs no running broker, so
5
+ * it's the safe way to see what `up -f` / `spawn -f` WOULD launch.
6
+ */
7
+ export declare function topology(argv: string[]): Promise<void>;
8
+ /** Print a manifest/file error as one red block (located issues for a ManifestError) and exit 1. */
9
+ export declare function failManifest(e: unknown): never;
10
+ //# sourceMappingURL=topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology.d.ts","sourceRoot":"","sources":["../../src/commands/topology.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5D;AAED,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK,CAM9C"}
@@ -0,0 +1,46 @@
1
+ import { parseArgs } from "node:util";
2
+ import { resolve } from "node:path";
3
+ import { loadManifest, renderTopology, ManifestError } from "../lib/manifest/index.js";
4
+ import { c } from "../ui.js";
5
+ /**
6
+ * `cotal topology view -f cotal.yaml` — validate a mesh manifest and print its access graph:
7
+ * per-channel and per-agent subscribe/read/post (with humane labels), any persona-inherited
8
+ * unmanaged scopes, and warnings. Read-only — it mutates nothing and needs no running broker, so
9
+ * it's the safe way to see what `up -f` / `spawn -f` WOULD launch.
10
+ */
11
+ export async function topology(argv) {
12
+ const [sub, ...rest] = argv;
13
+ if (sub !== "view") {
14
+ console.error(c.red(`✗ unknown topology subcommand "${sub ?? ""}" — expected: view`));
15
+ console.error(c.dim("cotal topology view -f <cotal.yaml>"));
16
+ process.exit(1);
17
+ }
18
+ const { values, positionals } = parseArgs({
19
+ args: rest,
20
+ allowPositionals: true,
21
+ options: { file: { type: "string", short: "f" } },
22
+ });
23
+ const file = values.file ?? positionals[0];
24
+ if (!file) {
25
+ console.error(c.red("✗ a manifest file is required — `cotal topology view -f <cotal.yaml>`"));
26
+ process.exit(1);
27
+ }
28
+ try {
29
+ const prepared = loadManifest(resolve(file));
30
+ console.log(renderTopology(prepared));
31
+ }
32
+ catch (e) {
33
+ failManifest(e);
34
+ }
35
+ }
36
+ /** Print a manifest/file error as one red block (located issues for a ManifestError) and exit 1. */
37
+ export function failManifest(e) {
38
+ if (e instanceof ManifestError)
39
+ console.error(c.red(e.message));
40
+ else if (e?.code === "ENOENT")
41
+ console.error(c.red(`✗ manifest file not found: ${e.path ?? ""}`));
42
+ else
43
+ console.error(c.red(`✗ ${e.message}`));
44
+ process.exit(1);
45
+ }
46
+ //# sourceMappingURL=topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topology.js","sourceRoot":"","sources":["../../src/commands/topology.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,kCAAkC,GAAG,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,EAAE,IAAI;QACV,gBAAgB,EAAE,IAAI;QACtB,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;KAClD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,YAAY,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,IAAI,CAAC,YAAY,aAAa;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;SAC3D,IAAK,CAA2B,EAAE,IAAI,KAAK,QAAQ;QACtD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,8BAA+B,CAA2B,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;;QAC3F,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type ChannelRegistryFile } from "@cotal-ai/core";
1
2
  export declare function up(argv: string[]): Promise<void>;
2
3
  export interface DetachOpts {
3
4
  server?: string;
@@ -6,6 +7,9 @@ export interface DetachOpts {
6
7
  open?: boolean;
7
8
  channels?: string;
8
9
  host?: string;
10
+ /** Channel-registry seed in memory (the `cotal up -f` manifest path), used instead of reading a
11
+ * `--channels` file. Takes precedence over {@link channels}. */
12
+ seed?: ChannelRegistryFile;
9
13
  /** Live boot lines, tailed from the server's log file (safe for a detached child). */
10
14
  onLine?: (line: string) => void;
11
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AAkCA,wBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEtD;AAcD,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAkCvH"}
1
+ {"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AAaA,OAAO,EAWL,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAyBxB,wBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HtD;AA8GD,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;qEACiE;IACjE,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,sFAAsF;IACtF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsCvH"}