@cotal-ai/manager 0.1.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 (46) hide show
  1. package/LICENSE +202 -0
  2. package/dist/attach-client.d.ts +7 -0
  3. package/dist/attach-client.d.ts.map +1 -0
  4. package/dist/attach-client.js +48 -0
  5. package/dist/attach-client.js.map +1 -0
  6. package/dist/attach-endpoint.d.ts +38 -0
  7. package/dist/attach-endpoint.d.ts.map +1 -0
  8. package/dist/attach-endpoint.js +171 -0
  9. package/dist/attach-endpoint.js.map +1 -0
  10. package/dist/commands.d.ts +2 -0
  11. package/dist/commands.d.ts.map +1 -0
  12. package/dist/commands.js +157 -0
  13. package/dist/commands.js.map +1 -0
  14. package/dist/index.d.ts +4 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +3 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/manager.d.ts +43 -0
  19. package/dist/manager.d.ts.map +1 -0
  20. package/dist/manager.js +207 -0
  21. package/dist/manager.js.map +1 -0
  22. package/dist/runtime/cmux.d.ts +16 -0
  23. package/dist/runtime/cmux.d.ts.map +1 -0
  24. package/dist/runtime/cmux.js +50 -0
  25. package/dist/runtime/cmux.js.map +1 -0
  26. package/dist/runtime/index.d.ts +12 -0
  27. package/dist/runtime/index.d.ts.map +1 -0
  28. package/dist/runtime/index.js +34 -0
  29. package/dist/runtime/index.js.map +1 -0
  30. package/dist/runtime/pty.d.ts +13 -0
  31. package/dist/runtime/pty.d.ts.map +1 -0
  32. package/dist/runtime/pty.js +113 -0
  33. package/dist/runtime/pty.js.map +1 -0
  34. package/dist/runtime/tmux.d.ts +16 -0
  35. package/dist/runtime/tmux.d.ts.map +1 -0
  36. package/dist/runtime/tmux.js +77 -0
  37. package/dist/runtime/tmux.js.map +1 -0
  38. package/dist/runtime/types.d.ts +38 -0
  39. package/dist/runtime/types.d.ts.map +1 -0
  40. package/dist/runtime/types.js +2 -0
  41. package/dist/runtime/types.js.map +1 -0
  42. package/dist/ui.d.ts +10 -0
  43. package/dist/ui.d.ts.map +1 -0
  44. package/dist/ui.js +10 -0
  45. package/dist/ui.js.map +1 -0
  46. package/package.json +36 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import "./commands.js";
2
+ export { Manager, type ManagerOptions } from "./manager.js";
3
+ export type { RuntimeKind, RuntimeMode } from "./runtime/index.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import "./commands.js"; // self-registers the control-plane commands on import
2
+ export { Manager } from "./manager.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC,CAAC,sDAAsD;AAE9E,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type RuntimeMode } from "./runtime/index.js";
2
+ export interface ManagerOptions {
3
+ space: string;
4
+ servers?: string;
5
+ name?: string;
6
+ /** Spawn backend. `auto` (default) → pty, or tmux when already inside tmux. */
7
+ runtime?: RuntimeMode;
8
+ workspaceRoot?: string;
9
+ /** Port for the console + attach HTTP/WS endpoint (loopback). 0 → ephemeral. */
10
+ consolePort?: number;
11
+ }
12
+ /**
13
+ * The agent supervisor: a long-lived mesh node that owns agent process lifecycle.
14
+ * It serves control requests on the "manager" service and spawns/kills agents
15
+ * through a pluggable {@link Runtime} (pty by default). It does NOT proxy agent
16
+ * mesh traffic — terminal I/O streams over its own attach endpoint instead.
17
+ */
18
+ export declare class Manager {
19
+ private readonly space;
20
+ private readonly servers;
21
+ private readonly name;
22
+ private readonly workspaceRoot;
23
+ private readonly runtime;
24
+ private readonly agents;
25
+ private readonly attach;
26
+ private ep;
27
+ /** Space trust material when the mesh runs in auth mode (`.cotal/auth` present);
28
+ * the manager mints per-agent creds from it at spawn. Undefined when the mesh is open. */
29
+ private auth?;
30
+ constructor(opts: ManagerOptions);
31
+ get runtimeKind(): string;
32
+ /** The console page URL (manager-hosted, loopback). */
33
+ get consoleUrl(): string;
34
+ start(): Promise<void>;
35
+ stop(): Promise<void>;
36
+ private handle;
37
+ private opStart;
38
+ private opStop;
39
+ private opAttach;
40
+ /** Managed agents cross-referenced with live presence (the manager sees the roster). */
41
+ private list;
42
+ }
43
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAcA,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAcD;;;;;GAKG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,EAAE,CAAiB;IAC3B;+FAC2F;IAC3F,OAAO,CAAC,IAAI,CAAC,CAAY;gBAEb,IAAI,EAAE,cAAc;IAehC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,uDAAuD;IACvD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,MAAM;YAqBN,OAAO;IAmErB,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,QAAQ;IAahB,wFAAwF;IACxF,OAAO,CAAC,IAAI;CAab"}
@@ -0,0 +1,207 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+ import { CotalEndpoint, agentFilePath, authDir, loadAgentFile, loadSpaceAuth, mintCreds, newIdentity, provisionAgent, registry, } from "@cotal-ai/core";
4
+ import { createRuntime, findWorkspaceRoot, } from "./runtime/index.js";
5
+ import { AttachEndpoint } from "./attach-endpoint.js";
6
+ /**
7
+ * The agent supervisor: a long-lived mesh node that owns agent process lifecycle.
8
+ * It serves control requests on the "manager" service and spawns/kills agents
9
+ * through a pluggable {@link Runtime} (pty by default). It does NOT proxy agent
10
+ * mesh traffic — terminal I/O streams over its own attach endpoint instead.
11
+ */
12
+ export class Manager {
13
+ space;
14
+ servers;
15
+ name;
16
+ workspaceRoot;
17
+ runtime;
18
+ agents = new Map();
19
+ attach;
20
+ ep;
21
+ /** Space trust material when the mesh runs in auth mode (`.cotal/auth` present);
22
+ * the manager mints per-agent creds from it at spawn. Undefined when the mesh is open. */
23
+ auth;
24
+ constructor(opts) {
25
+ this.space = opts.space;
26
+ this.servers = opts.servers;
27
+ this.name = opts.name ?? "manager";
28
+ this.workspaceRoot = opts.workspaceRoot ?? findWorkspaceRoot();
29
+ this.runtime = createRuntime(opts.runtime ?? "auto", `cotal-${this.space}`);
30
+ this.attach = new AttachEndpoint((name) => this.agents.get(name)?.handle, () => this.list(),
31
+ // Initial /feed replay for a connecting console: the current peer roster.
32
+ () => [{ event: "roster", data: this.ep?.getRoster() ?? [] }], opts.consolePort ?? 0);
33
+ }
34
+ get runtimeKind() {
35
+ return this.runtime.kind;
36
+ }
37
+ /** The console page URL (manager-hosted, loopback). */
38
+ get consoleUrl() {
39
+ return this.attach.consoleUrl();
40
+ }
41
+ async start() {
42
+ await this.attach.start();
43
+ // In auth mode the manager is just another user in the space's account — it mints
44
+ // itself creds from the same signing key it uses for the agents it spawns.
45
+ this.auth = loadSpaceAuth(authDir(this.workspaceRoot));
46
+ let creds;
47
+ let id;
48
+ if (this.auth) {
49
+ const identity = newIdentity();
50
+ id = identity.id;
51
+ // Privileged profile — the manager pre-creates others' DM durables and serves ctl;
52
+ // minting it as "agent" would silently strip those once step 5 scopes "agent".
53
+ creds = await mintCreds(this.auth, identity, "manager");
54
+ }
55
+ this.ep = new CotalEndpoint({
56
+ space: this.space,
57
+ servers: this.servers,
58
+ channels: [],
59
+ creds,
60
+ // The supervisor serves control + watches presence; it never consumes chat/dm/task
61
+ // (no message handler). consume:false avoids binding consumers it doesn't use — and
62
+ // under auth avoids trying to bind its own DM/task durables that nothing pre-created.
63
+ // It still pre-creates OTHERS' durables via provisionDmInbox/provisionTaskQueue (lazy jsm).
64
+ consume: false,
65
+ card: { id, name: this.name, role: "manager", kind: "endpoint" },
66
+ });
67
+ // Surface endpoint errors (incl. NATS permission denials) — without a listener an
68
+ // emitted "error" would crash the supervisor.
69
+ this.ep.on("error", (e) => console.error(`! manager endpoint: ${e.message}`));
70
+ await this.ep.start();
71
+ await this.ep.setActivity(`supervisor (${this.runtime.kind})`);
72
+ this.ep.serveControl("manager", (req) => this.handle(req));
73
+ }
74
+ async stop() {
75
+ await this.ep.stop();
76
+ await this.attach.stop();
77
+ }
78
+ async handle(req) {
79
+ const args = req.args ?? {};
80
+ switch (req.op) {
81
+ case "start":
82
+ return this.opStart(args);
83
+ case "stop":
84
+ return this.opStop(args);
85
+ case "attach":
86
+ return this.opAttach(args);
87
+ case "ps":
88
+ return { ok: true, data: this.list() };
89
+ case "status": {
90
+ const name = String(args.name ?? "");
91
+ const a = this.list().find((x) => x.name === name);
92
+ return a ? { ok: true, data: a } : { ok: false, error: `no agent "${name}"` };
93
+ }
94
+ default:
95
+ return { ok: false, error: `unknown op: ${req.op}` };
96
+ }
97
+ }
98
+ async opStart(args) {
99
+ const name = String(args.name ?? "").trim();
100
+ if (!name)
101
+ return { ok: false, error: "name required" };
102
+ if (this.agents.has(name))
103
+ return { ok: false, error: `agent "${name}" already running` };
104
+ const agent = args.agent ? String(args.agent) : "cotal";
105
+ // Resolve an agent file from the manager's own workspace — an explicit
106
+ // --config must exist; otherwise discover .cotal/agents/<name>.md if present.
107
+ let configPath;
108
+ if (args.config) {
109
+ configPath = agentFilePath(this.workspaceRoot, String(args.config));
110
+ if (!existsSync(configPath))
111
+ return { ok: false, error: `agent file not found: ${configPath}` };
112
+ }
113
+ else {
114
+ const f = agentFilePath(this.workspaceRoot, name);
115
+ if (existsSync(f))
116
+ configPath = f;
117
+ }
118
+ // --role overrides the file; the file fills it in for bookkeeping otherwise.
119
+ let role = args.role ? String(args.role) : undefined;
120
+ // A stable nkey identity assigned at spawn: the public key is the agent's card.id
121
+ // (threaded via COTAL_ID); the seed is retained to mint matching creds later.
122
+ const identity = newIdentity();
123
+ let handle;
124
+ try {
125
+ const connector = registry.resolve("connector", agent);
126
+ const def = configPath ? loadAgentFile(configPath) : undefined;
127
+ if (!role)
128
+ role = def?.role;
129
+ // In auth mode, mint the agent's creds from the space signing key and write them
130
+ // where the spawned session reads them (COTAL_CREDS path). Open mesh → no creds.
131
+ // The publish allow-list is the file's `publish:`, falling back to `channels:`.
132
+ let credsPath;
133
+ if (this.auth) {
134
+ // Pre-create the agent's bind-only DM (+ role TASK) durables and mint its scoped
135
+ // creds — the shared onboarding step (provisionAgent), the manager just supplies its
136
+ // own connected endpoint as the privileged provisioner.
137
+ const creds = await provisionAgent(this.ep, this.auth, identity, {
138
+ channels: def?.publish ?? def?.channels,
139
+ role,
140
+ });
141
+ credsPath = join(authDir(this.workspaceRoot), "creds", `${name}.creds`);
142
+ mkdirSync(dirname(credsPath), { recursive: true });
143
+ writeFileSync(credsPath, creds, { mode: 0o600 });
144
+ }
145
+ const spec = connector.buildLaunch({
146
+ space: this.space,
147
+ name,
148
+ role,
149
+ id: identity.id,
150
+ creds: credsPath,
151
+ servers: this.servers,
152
+ configPath,
153
+ });
154
+ handle = this.runtime.spawn(name, spec, this.workspaceRoot);
155
+ }
156
+ catch (e) {
157
+ return { ok: false, error: e.message };
158
+ }
159
+ this.agents.set(name, {
160
+ name,
161
+ role,
162
+ agent,
163
+ id: identity.id,
164
+ seed: identity.seed,
165
+ startedAt: Date.now(),
166
+ handle,
167
+ });
168
+ return { ok: true, data: { name, role, agent, id: identity.id, mode: handle.kind } };
169
+ }
170
+ opStop(args) {
171
+ const name = String(args.name ?? "").trim();
172
+ const a = this.agents.get(name);
173
+ if (!a)
174
+ return { ok: false, error: `no agent "${name}"` };
175
+ a.handle.stop();
176
+ this.agents.delete(name);
177
+ return { ok: true, data: { name, stopped: true } };
178
+ }
179
+ opAttach(args) {
180
+ const name = String(args.name ?? "").trim();
181
+ const a = this.agents.get(name);
182
+ if (!a)
183
+ return { ok: false, error: `no agent "${name}"` };
184
+ if (this.runtime.kind !== "pty") {
185
+ return {
186
+ ok: false,
187
+ error: `attach needs the pty runtime; under tmux run \`tmux attach -t cotal-${this.space}:${name}\``,
188
+ };
189
+ }
190
+ return { ok: true, data: { ws: this.attach.url(name) } };
191
+ }
192
+ /** Managed agents cross-referenced with live presence (the manager sees the roster). */
193
+ list() {
194
+ const roster = new Map(this.ep.getRoster().map((p) => [p.card.name, p]));
195
+ return [...this.agents.values()].map((a) => ({
196
+ name: a.name,
197
+ role: a.role,
198
+ agent: a.agent,
199
+ space: this.space,
200
+ mode: a.handle.kind,
201
+ status: a.handle.status(),
202
+ uptimeMs: Date.now() - a.startedAt,
203
+ mesh: roster.get(a.name)?.status ?? "absent",
204
+ }));
205
+ }
206
+ }
207
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,aAAa,EACb,aAAa,EACb,OAAO,EACP,aAAa,EACb,aAAa,EACb,SAAS,EACT,WAAW,EACX,cAAc,EACd,QAAQ,GACT,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,aAAa,EACb,iBAAiB,GAIlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAyBtD;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IACD,KAAK,CAAS;IACd,OAAO,CAAqB;IAC5B,IAAI,CAAS;IACb,aAAa,CAAS;IACtB,OAAO,CAAU;IACjB,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IACzC,MAAM,CAAiB;IAChC,EAAE,CAAiB;IAC3B;+FAC2F;IACnF,IAAI,CAAa;IAEzB,YAAY,IAAoB;QAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,iBAAiB,EAAE,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EACvC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;QACjB,0EAA0E;QAC1E,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,EAC7D,IAAI,CAAC,WAAW,IAAI,CAAC,CACtB,CAAC;IACJ,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,uDAAuD;IACvD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,kFAAkF;QAClF,2EAA2E;QAC3E,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QACvD,IAAI,KAAyB,CAAC;QAC9B,IAAI,EAAsB,CAAC;QAC3B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACjB,mFAAmF;YACnF,+EAA+E;YAC/E,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,IAAI,aAAa,CAAC;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,EAAE;YACZ,KAAK;YACL,mFAAmF;YACnF,oFAAoF;YACpF,sFAAsF;YACtF,4FAA4F;YAC5F,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;SACjE,CAAC,CAAC;QACH,kFAAkF;QAClF,8CAA8C;QAC9C,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrF,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,GAAmB;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC;YACf,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7B,KAAK,IAAI;gBACP,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACzC,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACrC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBACnD,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,IAAI,GAAG,EAAE,CAAC;YAChF,CAAC;YACD;gBACE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,IAA6B;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACxD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,IAAI,mBAAmB,EAAE,CAAC;QAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAExD,uEAAuE;QACvE,8EAA8E;QAC9E,IAAI,UAA8B,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,UAAU,EAAE,EAAE,CAAC;QAClG,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,UAAU,CAAC,CAAC,CAAC;gBAAE,UAAU,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,6EAA6E;QAC7E,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrD,kFAAkF;QAClF,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,MAAmB,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAY,WAAW,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,IAAI,CAAC,IAAI;gBAAE,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;YAC5B,iFAAiF;YACjF,iFAAiF;YACjF,gFAAgF;YAChF,IAAI,SAA6B,CAAC;YAClC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,iFAAiF;gBACjF,qFAAqF;gBACrF,wDAAwD;gBACxD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;oBAC/D,QAAQ,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,QAAQ;oBACvC,IAAI;iBACL,CAAC,CAAC;gBACH,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;gBACxE,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnD,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,CAAC;gBACjC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI;gBACJ,IAAI;gBACJ,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,UAAU;aACX,CAAC,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;YACpB,IAAI;YACJ,IAAI;YACJ,KAAK;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM;SACP,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACvF,CAAC;IAEO,MAAM,CAAC,IAA6B;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,IAAI,GAAG,EAAE,CAAC;QAC1D,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IACrD,CAAC;IAEO,QAAQ,CAAC,IAA6B;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,IAAI,GAAG,EAAE,CAAC;QAC1D,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAChC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,uEAAuE,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI;aACrG,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAC3D,CAAC;IAED,wFAAwF;IAChF,IAAI;QACV,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;YACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE;YACzB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS;YAClC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,QAAQ;SAC7C,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type { LaunchSpec } from "@cotal-ai/core";
2
+ import type { AgentHandle, Runtime } from "./types.js";
3
+ export declare function cmuxAvailable(): boolean;
4
+ /**
5
+ * Opt-in runtime that spawns each agent into its own new cmux tab (workspace), so
6
+ * spawned teammates get room instead of crowding the spawner. cmux can't run a
7
+ * command in a fresh surface directly, so we write the launch as a temp bash
8
+ * script and point the tab's terminal at it — sidestepping nushell↔bash quoting.
9
+ * Opened unfocused so the human stays put; switch to the new tab to watch the
10
+ * worker. Like tmux, you watch it natively, so `attach()` throws.
11
+ */
12
+ export declare class CmuxRuntime implements Runtime {
13
+ readonly kind: "cmux";
14
+ spawn(name: string, spec: LaunchSpec, cwd: string): AgentHandle;
15
+ }
16
+ //# sourceMappingURL=cmux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmux.d.ts","sourceRoot":"","sources":["../../src/runtime/cmux.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAMD;;;;;;;GAOG;AACH,qBAAa,WAAY,YAAW,OAAO;IACzC,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAEhC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW;CA+BhE"}
@@ -0,0 +1,50 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ import { cmux } from "@cotal-ai/cmux";
5
+ export function cmuxAvailable() {
6
+ return cmux.available();
7
+ }
8
+ function shellQuote(s) {
9
+ return `'${s.replace(/'/g, "'\\''")}'`;
10
+ }
11
+ /**
12
+ * Opt-in runtime that spawns each agent into its own new cmux tab (workspace), so
13
+ * spawned teammates get room instead of crowding the spawner. cmux can't run a
14
+ * command in a fresh surface directly, so we write the launch as a temp bash
15
+ * script and point the tab's terminal at it — sidestepping nushell↔bash quoting.
16
+ * Opened unfocused so the human stays put; switch to the new tab to watch the
17
+ * worker. Like tmux, you watch it natively, so `attach()` throws.
18
+ */
19
+ export class CmuxRuntime {
20
+ kind = "cmux";
21
+ spawn(name, spec, cwd) {
22
+ if (!cmux.available())
23
+ throw new Error(`the cmux CLI (${process.env.CMUX_BUNDLED_CLI_PATH ?? "cmux"}) couldn't reach the app — ` +
24
+ "is cmux running, and is this process inside a cmux surface (CMUX_SOCKET_PATH set)?");
25
+ const envPrefix = Object.entries(spec.env ?? {}).map(([k, v]) => `${k}=${shellQuote(v)}`);
26
+ const cmd = [...envPrefix, spec.command, ...spec.args.map(shellQuote)].join(" ");
27
+ const script = `#!/usr/bin/env bash\ncd ${shellQuote(cwd)}\nexec ${cmd}\n`;
28
+ const scriptPath = join(tmpdir(), `cotal-spawn-${name}.sh`);
29
+ writeFileSync(scriptPath, script, { mode: 0o755 });
30
+ const layout = JSON.stringify({
31
+ pane: { surfaces: [{ type: "terminal", command: `bash ${scriptPath}` }] },
32
+ });
33
+ cmux.openWorkspace(`cotal-${name}`, layout, { focus: false });
34
+ return {
35
+ name,
36
+ kind: "cmux",
37
+ // Best-effort: we don't track the tab's surface id, so we can't poll it or
38
+ // close it programmatically — the tab is closed by hand.
39
+ status: () => "running",
40
+ stop: () => { },
41
+ interrupt: () => {
42
+ throw new Error(`cmux runtime: switch to the "cotal-${name}" tab to drive it`);
43
+ },
44
+ attach: () => {
45
+ throw new Error(`cmux runtime: switch to the "cotal-${name}" cmux tab to watch it`);
46
+ },
47
+ };
48
+ }
49
+ }
50
+ //# sourceMappingURL=cmux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmux.js","sourceRoot":"","sources":["../../src/runtime/cmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,MAAe,CAAC;IAEhC,KAAK,CAAC,IAAY,EAAE,IAAgB,EAAE,GAAW;QAC/C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,MAAM,IAAI,KAAK,CACb,iBAAiB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,MAAM,6BAA6B;gBACvF,oFAAoF,CACvF,CAAC;QACJ,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,MAAM,GAAG,GAAG,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,2BAA2B,UAAU,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,IAAI,KAAK,CAAC,CAAC;QAC5D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;YAC5B,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,UAAU,EAAE,EAAE,CAAC,EAAE;SAC1E,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9D,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,MAAM;YACZ,2EAA2E;YAC3E,yDAAyD;YACzD,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS;YACvB,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,SAAS,EAAE,GAAG,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,mBAAmB,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACX,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,wBAAwB,CAAC,CAAC;YACtF,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { Runtime, RuntimeKind } from "./types.js";
2
+ export type { Runtime, RuntimeKind, AgentHandle, AttachSession } from "./types.js";
3
+ /** How a manager picks its backend. `auto` → tmux iff already inside a tmux
4
+ * session, else pty (the default). `cmux` is opt-in only (a tab per agent). No
5
+ * silent fallback: an explicit backend whose tool is missing throws. */
6
+ export type RuntimeMode = RuntimeKind | "auto";
7
+ /** Build the runtime a manager will spawn through. `session` names the tmux
8
+ * session (per space) when the tmux backend is selected. */
9
+ export declare function createRuntime(mode: RuntimeMode, session: string): Runtime;
10
+ /** Walk up from `startDir` to the pnpm workspace root (for spawning `pnpm cotal …`). */
11
+ export declare function findWorkspaceRoot(startDir?: string): string;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEvD,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnF;;yEAEyE;AACzE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;AAE/C;6DAC6D;AAC7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAYzE;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAQ1E"}
@@ -0,0 +1,34 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { PtyRuntime } from "./pty.js";
4
+ import { TmuxRuntime, tmuxAvailable } from "./tmux.js";
5
+ import { CmuxRuntime, cmuxAvailable } from "./cmux.js";
6
+ /** Build the runtime a manager will spawn through. `session` names the tmux
7
+ * session (per space) when the tmux backend is selected. */
8
+ export function createRuntime(mode, session) {
9
+ const kind = mode === "auto" ? (process.env.TMUX ? "tmux" : "pty") : mode;
10
+ if (kind === "tmux") {
11
+ if (!tmuxAvailable())
12
+ throw new Error("tmux runtime requested but tmux is not installed");
13
+ return new TmuxRuntime(session);
14
+ }
15
+ if (kind === "cmux") {
16
+ if (!cmuxAvailable())
17
+ throw new Error("cmux runtime requested but the cmux app is not reachable");
18
+ return new CmuxRuntime();
19
+ }
20
+ return new PtyRuntime();
21
+ }
22
+ /** Walk up from `startDir` to the pnpm workspace root (for spawning `pnpm cotal …`). */
23
+ export function findWorkspaceRoot(startDir = process.cwd()) {
24
+ let dir = resolve(startDir);
25
+ for (;;) {
26
+ if (existsSync(join(dir, "pnpm-workspace.yaml")))
27
+ return dir;
28
+ const parent = dirname(dir);
29
+ if (parent === dir)
30
+ return resolve(startDir);
31
+ dir = parent;
32
+ }
33
+ }
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAUvD;6DAC6D;AAC7D,MAAM,UAAU,aAAa,CAAC,IAAiB,EAAE,OAAe;IAC9D,MAAM,IAAI,GAAgB,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAC1F,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,UAAU,EAAE,CAAC;AAC1B,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAChE,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,SAAS,CAAC;QACR,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7C,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { LaunchSpec } from "@cotal-ai/core";
2
+ import type { AgentHandle, Runtime } from "./types.js";
3
+ /**
4
+ * The default runtime: the manager spawns the agent in a pseudo-terminal it owns
5
+ * via `@lydell/node-pty`. A real native TUI — the manager keeps full OS-signal
6
+ * control, and `cotal attach` streams the same PTY. Terminal I/O stays off the
7
+ * mesh; the agent's own plugin still talks to NATS directly.
8
+ */
9
+ export declare class PtyRuntime implements Runtime {
10
+ readonly kind: "pty";
11
+ spawn(name: string, spec: LaunchSpec, cwd: string): AgentHandle;
12
+ }
13
+ //# sourceMappingURL=pty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../src/runtime/pty.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAiB,OAAO,EAAE,MAAM,YAAY,CAAC;AAmBtE;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,OAAO;IACxC,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAE/B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW;CAoFhE"}
@@ -0,0 +1,113 @@
1
+ import * as pty from "@lydell/node-pty";
2
+ const DEFAULT_COLS = 120;
3
+ const DEFAULT_ROWS = 32;
4
+ /** How much terminal output to retain for late-attach scrollback replay. */
5
+ const SCROLLBACK_BYTES = 256 * 1024;
6
+ /** Stop watching for a spawn-confirm prompt after this long (it appears at startup). */
7
+ const CONFIRM_WINDOW_MS = 20_000;
8
+ /** Strip ANSI control sequences and whitespace so a confirm prompt matches regardless
9
+ * of how a TUI positions its text (cursor moves between words, not spaces). */
10
+ function normalizeForMatch(s) {
11
+ return s
12
+ .replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, "") // OSC
13
+ .replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g, "") // CSI
14
+ .replace(/\x1b[@-Z\\-_]/g, "") // other escapes
15
+ .replace(/\s+/g, "");
16
+ }
17
+ /**
18
+ * The default runtime: the manager spawns the agent in a pseudo-terminal it owns
19
+ * via `@lydell/node-pty`. A real native TUI — the manager keeps full OS-signal
20
+ * control, and `cotal attach` streams the same PTY. Terminal I/O stays off the
21
+ * mesh; the agent's own plugin still talks to NATS directly.
22
+ */
23
+ export class PtyRuntime {
24
+ kind = "pty";
25
+ spawn(name, spec, cwd) {
26
+ const proc = pty.spawn(spec.command, spec.args, {
27
+ name: "xterm-256color",
28
+ cols: DEFAULT_COLS,
29
+ rows: DEFAULT_ROWS,
30
+ cwd,
31
+ env: { ...process.env, ...spec.env },
32
+ });
33
+ const dataSubs = new Set();
34
+ const exitSubs = new Set();
35
+ const ring = [];
36
+ let ringBytes = 0;
37
+ let alive = true;
38
+ let cols = DEFAULT_COLS;
39
+ let rows = DEFAULT_ROWS;
40
+ // Auto-clear a one-time spawn prompt (e.g. Claude's dev-channel confirmation):
41
+ // watch early output for `spec.confirm` and press Enter once when it appears.
42
+ const confirmTarget = spec.confirm ? normalizeForMatch(spec.confirm) : "";
43
+ let confirmArmed = Boolean(confirmTarget);
44
+ let confirmBuf = "";
45
+ if (confirmArmed)
46
+ setTimeout(() => (confirmArmed = false), CONFIRM_WINDOW_MS);
47
+ proc.onData((d) => {
48
+ const b = Buffer.from(d, "utf8");
49
+ ring.push(b);
50
+ ringBytes += b.length;
51
+ while (ringBytes > SCROLLBACK_BYTES && ring.length > 1) {
52
+ ringBytes -= ring.shift().length;
53
+ }
54
+ if (confirmArmed) {
55
+ confirmBuf = (confirmBuf + d).slice(-8192);
56
+ if (normalizeForMatch(confirmBuf).includes(confirmTarget)) {
57
+ confirmArmed = false;
58
+ // Let the TUI finish wiring up its raw-mode input loop (it may flush
59
+ // stdin on init) before pressing Enter, or the keypress is dropped.
60
+ setTimeout(() => alive && proc.write("\r"), 500);
61
+ }
62
+ }
63
+ for (const fn of dataSubs)
64
+ fn(b);
65
+ });
66
+ proc.onExit(() => {
67
+ alive = false;
68
+ for (const fn of exitSubs)
69
+ fn();
70
+ });
71
+ return {
72
+ name,
73
+ kind: "pty",
74
+ status: () => (alive ? "running" : "exited"),
75
+ stop: () => {
76
+ if (alive)
77
+ proc.kill();
78
+ },
79
+ interrupt: () => {
80
+ if (alive)
81
+ proc.write("\x03");
82
+ },
83
+ attach: () => ({
84
+ get cols() {
85
+ return cols;
86
+ },
87
+ get rows() {
88
+ return rows;
89
+ },
90
+ backlog: () => Buffer.concat(ring),
91
+ onData: (fn) => {
92
+ dataSubs.add(fn);
93
+ return () => dataSubs.delete(fn);
94
+ },
95
+ onExit: (fn) => {
96
+ exitSubs.add(fn);
97
+ return () => exitSubs.delete(fn);
98
+ },
99
+ write: (data) => {
100
+ if (alive)
101
+ proc.write(data);
102
+ },
103
+ resize: (c, r) => {
104
+ cols = c;
105
+ rows = r;
106
+ if (alive)
107
+ proc.resize(c, r);
108
+ },
109
+ }),
110
+ };
111
+ }
112
+ }
113
+ //# sourceMappingURL=pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../../src/runtime/pty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { LaunchSpec } from "@cotal-ai/core";
2
+ import type { AgentHandle, Runtime } from "./types.js";
3
+ export declare function tmuxAvailable(): boolean;
4
+ /**
5
+ * Opt-in runtime for users already living in a multiplexer: each agent gets a
6
+ * tmux window in a shared per-space session. You watch / drive it natively
7
+ * (`tmux attach -t <session>:<name>`), so `attach()` here points you there
8
+ * rather than streaming — the PTY runtime is the streamable default.
9
+ */
10
+ export declare class TmuxRuntime implements Runtime {
11
+ private readonly session;
12
+ readonly kind: "tmux";
13
+ constructor(session: string);
14
+ spawn(name: string, spec: LaunchSpec, cwd: string): AgentHandle;
15
+ }
16
+ //# sourceMappingURL=tmux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../../src/runtime/tmux.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAgB,aAAa,IAAI,OAAO,CAOvC;AA0BD;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,OAAO;IAG7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;gBAEH,OAAO,EAAE,MAAM;IAE5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW;CAoChE"}