@cotal-ai/manager 0.16.0 → 0.18.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 (62) hide show
  1. package/README.md +2 -1
  2. package/dist/attach-endpoint.d.ts +53 -59
  3. package/dist/attach-endpoint.d.ts.map +1 -1
  4. package/dist/attach-endpoint.js +120 -244
  5. package/dist/attach-endpoint.js.map +1 -1
  6. package/dist/commands.js +88 -8
  7. package/dist/commands.js.map +1 -1
  8. package/dist/console/app.js +68 -30
  9. package/dist/console/index.html +3 -2
  10. package/dist/console/session-bundle.js +9736 -0
  11. package/dist/console-crypto-shim.d.ts +16 -0
  12. package/dist/console-crypto-shim.d.ts.map +1 -0
  13. package/dist/console-crypto-shim.js +20 -0
  14. package/dist/console-crypto-shim.js.map +1 -0
  15. package/dist/console-session-entry.d.ts +2 -0
  16. package/dist/console-session-entry.d.ts.map +1 -0
  17. package/dist/console-session-entry.js +26 -0
  18. package/dist/console-session-entry.js.map +1 -0
  19. package/dist/endpoint-evict.d.ts +29 -0
  20. package/dist/endpoint-evict.d.ts.map +1 -0
  21. package/dist/endpoint-evict.js +80 -0
  22. package/dist/endpoint-evict.js.map +1 -0
  23. package/dist/holder-liveness.d.ts +40 -0
  24. package/dist/holder-liveness.d.ts.map +1 -0
  25. package/dist/holder-liveness.js +98 -0
  26. package/dist/holder-liveness.js.map +1 -0
  27. package/dist/manager-service-contract.d.ts +132 -0
  28. package/dist/manager-service-contract.d.ts.map +1 -0
  29. package/dist/manager-service-contract.js +332 -0
  30. package/dist/manager-service-contract.js.map +1 -0
  31. package/dist/manager.d.ts +519 -22
  32. package/dist/manager.d.ts.map +1 -1
  33. package/dist/manager.js +2273 -262
  34. package/dist/manager.js.map +1 -1
  35. package/dist/reconcile-gate.d.ts +82 -0
  36. package/dist/reconcile-gate.d.ts.map +1 -0
  37. package/dist/reconcile-gate.js +118 -0
  38. package/dist/reconcile-gate.js.map +1 -0
  39. package/dist/runtime/pty.d.ts.map +1 -1
  40. package/dist/runtime/pty.js +15 -2
  41. package/dist/runtime/pty.js.map +1 -1
  42. package/dist/session/bridge.d.ts +63 -0
  43. package/dist/session/bridge.d.ts.map +1 -0
  44. package/dist/session/bridge.js +157 -0
  45. package/dist/session/bridge.js.map +1 -0
  46. package/dist/session/establish.d.ts +212 -0
  47. package/dist/session/establish.d.ts.map +1 -0
  48. package/dist/session/establish.js +174 -0
  49. package/dist/session/establish.js.map +1 -0
  50. package/dist/session/index.d.ts +12 -0
  51. package/dist/session/index.d.ts.map +1 -0
  52. package/dist/session/index.js +15 -0
  53. package/dist/session/index.js.map +1 -0
  54. package/dist/session/plane.d.ts +120 -0
  55. package/dist/session/plane.d.ts.map +1 -0
  56. package/dist/session/plane.js +327 -0
  57. package/dist/session/plane.js.map +1 -0
  58. package/dist/static-lifecycle.d.ts +97 -0
  59. package/dist/static-lifecycle.d.ts.map +1 -0
  60. package/dist/static-lifecycle.js +262 -0
  61. package/dist/static-lifecycle.js.map +1 -0
  62. package/package.json +10 -6
package/dist/commands.js CHANGED
@@ -1,6 +1,12 @@
1
- import { isReachable, DEFAULT_SERVER, DEFAULT_SPACE, registry, } from "@cotal-ai/core";
2
- import { authDir, findCotalRoot, soleSpaceOf } from "@cotal-ai/workspace";
1
+ import { connect } from "@nats-io/transport-node";
2
+ import { Kvm } from "@nats-io/kv";
3
+ import { isReachable, epAuthBucket, mintCreds, newIdentity, standaloneConnectOpts, DEFAULT_SERVER, DEFAULT_SPACE, registry, } from "@cotal-ai/core";
4
+ import { authDir, findCotalRoot, getSpaceAuth, loadManagerInstanceIdentity, soleSpaceOf, workspaceSecretStore } from "@cotal-ai/workspace";
3
5
  import { Manager } from "./manager.js";
6
+ import { MANAGER_ENDPOINT } from "./manager-service-contract.js";
7
+ import { makeManagerEndpointEvictor } from "./endpoint-evict.js";
8
+ import { makeManagerHolderLivenessProbe } from "./holder-liveness.js";
9
+ import { GateReconcileRefused, reconcileEndpointGate } from "./reconcile-gate.js";
4
10
  import { loadRoster } from "./roster.js";
5
11
  import { loadLaunchSpec, materializePersona, launchAgentToStartOpts } from "./launch.js";
6
12
  import {} from "./runtime/index.js";
@@ -45,9 +51,12 @@ async function runManager(args, defaultRuntime) {
45
51
  process.exit(1);
46
52
  }
47
53
  const consolePort = v["console-port"] ? Number(v["console-port"]) : undefined;
48
- // Where the console/attach face binds. Absent loopback, so a bare `cotal supervise` keeps a
49
- // machine-local endpoint. `cotal up` passes the address it bound the broker to when that address
50
- // is reachable, which is what lets `cotal attach` reach this manager from another machine.
54
+ // P2 item 6: the broker ws listener port (loopback) `cotal up` allocated — the console's mesh
55
+ // session client builds its wsUrl from it. Absent no console session client (POST /session 503s).
56
+ const wsPort = v["ws-port"] ? Number(v["ws-port"]) : undefined;
57
+ // Where the console face binds. Absent → loopback, so a bare `cotal supervise` keeps a
58
+ // machine-local console. `cotal up` passes the address it bound the broker to when the operator
59
+ // asked for an exposed console; the terminal itself rides the mesh either way.
51
60
  const attachHost = v["console-host"];
52
61
  // Construction resolves the runtime (createRuntime) — which fails loud on an unusable env, e.g. the
53
62
  // pty runtime under Bun. Render that as one actionable line, not a raw stack (this also lands in
@@ -62,6 +71,7 @@ async function runManager(args, defaultRuntime) {
62
71
  servers: server,
63
72
  runtime,
64
73
  consolePort,
74
+ wsPort,
65
75
  attachHost,
66
76
  installedExtensions: true,
67
77
  resumeAttemptId: v["resume-attempt"],
@@ -152,8 +162,64 @@ async function runManager(args, defaultRuntime) {
152
162
  }
153
163
  await new Promise(() => { });
154
164
  }
155
- /** The manager's one command: the `supervise` daemon runner. Self-registered on import; the
156
- * `cotal` binary resolves it from the registry. */
165
+ /**
166
+ * `cotal reconcile-gate` the guarded exit from an issuance gate left FROZEN by a crashed
167
+ * re-registration whose freeze-holder is dead (#391).
168
+ *
169
+ * WHY THIS IS A CLI COMMAND AND NOT AN ADMIN VERB ON THE MANAGER ENDPOINT: the wedged state IS
170
+ * "the manager cannot complete registration", so anything the manager endpoint serves is
171
+ * unreachable in exactly the state it would exist to repair. This runs operator-locally against
172
+ * the auth KV and the delivery daemon, needing nothing from the wedged endpoint.
173
+ *
174
+ * Read-only until the guard passes: it observes and probes before it constructs the barrier.
175
+ */
176
+ async function runReconcileGate(args) {
177
+ const v = args.values;
178
+ const space = spaceFor(v);
179
+ const servers = v.server ?? DEFAULT_SERVER;
180
+ const endpoint = v.endpoint ?? MANAGER_ENDPOINT;
181
+ const root = findCotalRoot();
182
+ // The instanceId is the manager's PERSISTED identity by default — the same one the crashed
183
+ // incarnation registered under. An explicit --instance covers a non-manager endpoint.
184
+ const instanceId = v.instance ?? loadManagerInstanceIdentity(root, space)?.instanceId;
185
+ if (!instanceId)
186
+ throw new Error(`no persisted manager instance identity under ${root} for space "${space}" — pass --instance <id> for a non-manager endpoint`);
187
+ const auth = await getSpaceAuth(workspaceSecretStore(root), space);
188
+ if (!auth)
189
+ throw new Error(`no space auth for "${space}" here — run this on the mesh root that holds the space's auth material`);
190
+ console.error(c.dim(`• reconciling the ${endpoint} issuance gate for ${instanceId} on ${servers} (space ${space})`));
191
+ const identity = newIdentity();
192
+ const creds = await mintCreds(auth, identity, "endpoint-serve-executor", {
193
+ endpointServeExecutor: { endpoint, instanceId },
194
+ });
195
+ const nc = await connect({ servers, ...standaloneConnectOpts({ creds, tls: false }), maxReconnectAttempts: 0 });
196
+ try {
197
+ const kv = await new Kvm(nc).open(epAuthBucket(space));
198
+ const report = await reconcileEndpointGate({
199
+ kv, space, endpoint, instanceId,
200
+ probeHolder: makeManagerHolderLivenessProbe({ space, servers, auth, log: (l) => console.error(c.dim(` ${l}`)) }),
201
+ evict: makeManagerEndpointEvictor({ space, servers, auth, log: (l) => console.error(c.dim(` ${l}`)) }),
202
+ log: (l) => console.error(` ${l}`),
203
+ });
204
+ console.log(c.green(`✓ ${endpoint}/${instanceId}: gate reopened at generation ${report.reopenedAtGeneration}`) +
205
+ ` (processEpoch unchanged at ${report.before.processEpoch}; ${report.revoked.length} credential(s) revoked, ${report.evicted.length} holder(s) verify-evicted). Start the manager to let its normal takeover run.`);
206
+ }
207
+ catch (e) {
208
+ // A refusal is the DESIGNED outcome for every state this does not repair, so it prints the
209
+ // condition by name — an operator must never have to guess which guard fired.
210
+ if (e instanceof GateReconcileRefused) {
211
+ console.error(c.red(`✗ refused (${e.condition}): ${e.message}`));
212
+ process.exitCode = 2;
213
+ return;
214
+ }
215
+ throw e;
216
+ }
217
+ finally {
218
+ await nc.drain().catch(() => nc.close());
219
+ }
220
+ }
221
+ /** The manager's commands: the `supervise` daemon runner, and the guarded `reconcile-gate` repair.
222
+ * Self-registered on import; the `cotal` binary resolves them from the registry. */
157
223
  const managerCommands = [
158
224
  {
159
225
  kind: "command",
@@ -165,7 +231,8 @@ const managerCommands = [
165
231
  { name: "server", type: "string", value: "<url>", description: "broker URL (default: the local mesh)" },
166
232
  { name: "runtime", type: "string", value: "<name>", description: "agent runtime (default pty; others come from installed extensions)" },
167
233
  { name: "console-port", type: "string", value: "<n>", description: "protocol-console port" },
168
- { name: "console-host", type: "string", value: "<host>", description: "bind host for the console + attach endpoint (default: loopback)" },
234
+ { name: "console-host", type: "string", value: "<host>", description: "bind host for the console endpoint (default: loopback)" },
235
+ { name: "ws-port", type: "string", value: "<n>", description: "broker ws listener port for the console session client (P2 item 6)" },
169
236
  { name: "roster", type: "string", value: "<file>", description: "declarative roster to boot at startup" },
170
237
  { name: "launch", type: "string", value: "<spec>", description: "resolved mesh-manifest launch spec (cotal up -f / spawn -f)" },
171
238
  { name: "resume-attempt", type: "string", value: "<id>", description: "maintenance restore attempt accepted by resumePreserved" },
@@ -178,6 +245,19 @@ const managerCommands = [
178
245
  },
179
246
  run: (args) => runManager(args, "auto"),
180
247
  },
248
+ {
249
+ kind: "command",
250
+ name: "reconcile-gate",
251
+ group: "Manager",
252
+ summary: "reconcile an issuance gate left frozen by a crashed re-registration - verifies the freeze-holder is gone, then completes the dead op (refuses if it is alive or unprovable) [--space <s>] [--server <url>] [--endpoint <e>] [--instance <id>]",
253
+ flags: [
254
+ { name: "space", type: "string", value: "<s>", description: "space to reconcile in (default: this folder's auth space)" },
255
+ { name: "server", type: "string", value: "<url>", description: "broker URL (default: the local mesh)" },
256
+ { name: "endpoint", type: "string", value: "<e>", description: `endpoint whose gate is frozen (default: ${MANAGER_ENDPOINT})` },
257
+ { name: "instance", type: "string", value: "<id>", description: "instance id (default: this folder's persisted manager instance)" },
258
+ ],
259
+ run: runReconcileGate,
260
+ },
181
261
  ];
182
262
  registry.register(...managerCommands);
183
263
  //# sourceMappingURL=commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -1,36 +1,32 @@
1
- // Cotal console client: one xterm pane per managed agent, each wired straight to
2
- // the manager's attach WebSocket (addon-attach). We discover agents over HTTP
3
- // (the manager's /agents list, which it cross-references with mesh presence) and
4
- // stream the actual terminal bytes over the direct socket never the mesh.
1
+ // Cotal console client (P2 item 6): one xterm pane per managed agent, each wired to the manager
2
+ // over a mesh §13.6 SESSION — never a 127.0.0.1 terminal socket. Per pane we POST /session/<name>
3
+ // (the loopback face mints a holder-bound offer + a per-session, rails-only caller credential),
4
+ // connect to the broker's WebSocket listener with that credential, open the caller rail with the
5
+ // redeemed grant, and drive xterm over the SAME core rail code the manager serves. Agents are
6
+ // discovered over HTTP (/agents, cross-referenced with mesh presence).
5
7
  const { Terminal } = window;
6
8
  const { FitAddon } = window.FitAddon;
7
- const { AttachAddon } = window.AttachAddon;
9
+ const S = window.CotalSession; // the served session bundle (wsconnect + core rail + frame codec)
8
10
 
9
11
  const grid = document.getElementById("grid");
10
12
  const empty = document.getElementById("empty");
11
13
  const meta = document.getElementById("meta");
12
- const panes = new Map(); // name -> { el, term, fit, ws, status }
14
+ const panes = new Map(); // name -> { el, term, fit, session, status }
13
15
 
14
16
  // The console token, taken once from this page's own URL and kept only in memory. Deliberately not
15
17
  // stored in a cookie: cookies are host-scoped and not port-scoped, so a cookie set here would be
16
18
  // sent to every other HTTP service on this host, and two managers on one host would clobber each
17
- // other's. The manager serves the static shell openly and requires this on the routes that carry
18
- // real data (/agents) and on the attach socket.
19
+ // other's. The manager serves the static shell openly and requires this on every route that carries
20
+ // real data (/agents, /feed) or mints one (/session/<name>).
19
21
  // Preferred source is the FRAGMENT: a browser never sends it to a server, so the credential stays
20
22
  // out of request logs, proxies, and `Referer`. The query is accepted as a fallback for a hand-built
21
- // URL. Either way it lives only in this variable — never a cookie (host-scoped, not port-scoped, so
22
- // it would leak to every other service on this host and collide between two managers).
23
+ // URL.
23
24
  const TOKEN =
24
25
  new URLSearchParams(location.hash.replace(/^#/, "")).get("t") ??
25
26
  new URLSearchParams(location.search).get("t") ??
26
27
  "";
27
28
  const withToken = (path) => `${path}${path.includes("?") ? "&" : "?"}t=${encodeURIComponent(TOKEN)}`;
28
29
 
29
- function wsUrl(name) {
30
- const proto = location.protocol === "https:" ? "wss" : "ws";
31
- return `${proto}://${location.host}${withToken(`/attach/${encodeURIComponent(name)}`)}`;
32
- }
33
-
34
30
  function layout() {
35
31
  const n = panes.size;
36
32
  const cols = n <= 1 ? 1 : n <= 4 ? 2 : 3;
@@ -56,30 +52,71 @@ function addPane(agent) {
56
52
  term.loadAddon(fit);
57
53
  term.open(el.querySelector(".term"));
58
54
 
59
- const ws = new WebSocket(wsUrl(agent.name));
60
- ws.binaryType = "arraybuffer";
61
- ws.onopen = () => {
62
- term.loadAddon(new AttachAddon(ws));
63
- fit.fit();
64
- sendResize(ws, term);
65
- };
66
- // addon-attach forwards keystrokes; resize is our own text frame (r:cols,rows).
67
- term.onResize(() => sendResize(ws, term));
68
-
69
- const pane = { el, term, fit, ws, status: agent.status };
55
+ const pane = { el, term, fit, session: undefined, status: agent.status };
70
56
  panes.set(agent.name, pane);
71
57
  empty.style.display = "none";
72
58
  layout();
59
+ void openSession(agent.name, pane);
73
60
  }
74
61
 
75
- function sendResize(ws, term) {
76
- if (ws.readyState === WebSocket.OPEN) ws.send(`r:${term.cols},${term.rows}`);
62
+ // Open the mesh §13.6 session for one pane: POST /session, connect over the broker ws with the
63
+ // per-session cred, open the caller rail with the grant, and bridge it to xterm.
64
+ async function openSession(name, pane) {
65
+ const { term, fit } = pane;
66
+ if (!S) { term.write("\r\n[cotal: session bundle not loaded]\r\n"); return; }
67
+ let est;
68
+ try {
69
+ const res = await fetch(withToken(`/session/${encodeURIComponent(name)}`), { method: "POST" });
70
+ if (!res.ok) { term.write(`\r\n[cotal: attach failed (${res.status})]\r\n`); return; }
71
+ est = await res.json();
72
+ } catch { term.write("\r\n[cotal: attach request failed]\r\n"); return; }
73
+ const { grant, wsUrl, creds } = est;
74
+ let nc;
75
+ try {
76
+ nc = await S.wsconnect({
77
+ servers: wsUrl,
78
+ ...(creds ? { authenticator: S.credsAuthenticator(new TextEncoder().encode(creds)) } : {}),
79
+ });
80
+ } catch { term.write("\r\n[cotal: broker connection failed]\r\n"); return; }
81
+ if (!panes.has(name)) { void nc.close(); return; } // pane removed while connecting
82
+
83
+ // Mark the pane's dot as dead when the SESSION ends — honest even if /agents still lists the
84
+ // agent for a beat (the terminal is gone). `ended` wins over the roster-poll dot (setStatus).
85
+ const markEnded = () => { pane.ended = true; const dot = pane.el.querySelector(".dot"); if (dot) dot.className = "dot exited"; };
86
+ const rail = S.openSessionRail({
87
+ nc,
88
+ grant,
89
+ role: "caller",
90
+ onData: (data) => {
91
+ let frame;
92
+ try { frame = S.decodeTerminalFrame(data); } catch { return; }
93
+ if (frame.k === "data") term.write(S.terminalFrameBytes(frame));
94
+ else if (frame.k === "end") { term.write(`\r\n[cotal: session ended - ${frame.reason}]\r\n`); markEnded(); }
95
+ else if (frame.k === "drop") term.write(`\r\n[cotal: ${frame.bytes} bytes dropped - backpressure]\r\n`);
96
+ },
97
+ onClose: () => { term.write("\r\n[cotal: session closed]\r\n"); markEnded(); },
98
+ onProtocolError: (reason) => { term.write(`\r\n[cotal: session error - ${reason}]\r\n`); markEnded(); },
99
+ });
100
+
101
+ // The caller's `out` subscription must be live before the serving side replays (EPS is at-most-
102
+ // once, no retention). flush() forces the SUB, then send `ready` and go.
103
+ await nc.flush();
104
+ try { rail.send({ k: "ready" }); } catch { /* the onProtocolError path surfaces it */ }
105
+ fit.fit();
106
+ // xterm's onData is a STRING, but the §13.6 data frame carries raw bytes — UTF-8-encode it (a raw
107
+ // string would base64-encode its chars as NUL bytes the pty silently ignores: no echo).
108
+ term.onData((data) => { try { rail.send(S.encodeTerminalData(new TextEncoder().encode(data))); } catch (e) { console.error("[cotal] keystroke send failed", e); } });
109
+ // Guard the resize: a pane fitting before it is laid out can compute a 0 dimension, which the
110
+ // §13.6 codec rejects — a bad frame the serving side now tolerates, but never emit it in the first place.
111
+ term.onResize(() => { if (term.cols > 0 && term.rows > 0) { try { rail.send({ k: "resize", cols: term.cols, rows: term.rows }); } catch { /* advisory */ } } });
112
+ pane.session = { nc, rail };
77
113
  }
78
114
 
79
115
  function removePane(name) {
80
116
  const p = panes.get(name);
81
117
  if (!p) return;
82
- try { p.ws.close(); } catch {}
118
+ try { p.session?.rail.close(); } catch {}
119
+ try { void p.session?.nc.close(); } catch {}
83
120
  p.term.dispose();
84
121
  p.el.remove();
85
122
  panes.delete(name);
@@ -91,6 +128,7 @@ function setStatus(name, status) {
91
128
  const p = panes.get(name);
92
129
  if (!p) return;
93
130
  p.status = status;
131
+ if (p.ended) { p.el.querySelector(".dot").className = "dot exited"; return; } // a dead session stays dead in the UI
94
132
  p.el.querySelector(".dot").className = `dot ${status === "running" ? "running" : "exited"}`;
95
133
  }
96
134
 
@@ -105,7 +143,7 @@ async function poll() {
105
143
  setStatus(a.name, a.status);
106
144
  }
107
145
  for (const name of [...panes.keys()]) if (!seen.has(name)) removePane(name);
108
- } catch (e) {
146
+ } catch {
109
147
  meta.textContent = "manager unreachable";
110
148
  }
111
149
  }
@@ -58,11 +58,12 @@
58
58
  <h1>COTAL CONSOLE</h1>
59
59
  <span class="meta" id="meta">connecting…</span>
60
60
  </header>
61
- <div id="grid"><div id="empty">no agents yet <code>cotal start --agent claude --name …</code></div></div>
61
+ <div id="grid"><div id="empty">no agents yet: <code>cotal start --agent claude --name …</code></div></div>
62
62
 
63
63
  <script src="/assets/xterm.js"></script>
64
64
  <script src="/assets/addon-fit.js"></script>
65
- <script src="/assets/addon-attach.js"></script>
65
+ <!-- P2 item 6: the mesh §13.6 session client bundle (wsconnect + core rail + frame codec). -->
66
+ <script src="/session-bundle.js"></script>
66
67
  <script src="/app.js"></script>
67
68
  </body>
68
69
  </html>