@cotal-ai/herdr 0.0.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +95 -8
- package/dist/driver.d.ts +140 -0
- package/dist/driver.d.ts.map +1 -0
- package/dist/driver.js +543 -0
- package/dist/driver.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime.d.ts +30 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +230 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +29 -7
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { hardenPrivate, registry, writeSecretFile, } from "@cotal-ai/core";
|
|
5
|
+
import * as herdr from "./driver.js";
|
|
6
|
+
const GRACE_MS = 2_000;
|
|
7
|
+
const CONFIRM_INTERVAL_MS = 1_000;
|
|
8
|
+
const MAX_CONFIRMS = 5;
|
|
9
|
+
function launcherSource(payload) {
|
|
10
|
+
return `import { spawn } from "node:child_process";\n` +
|
|
11
|
+
`import { rmSync } from "node:fs";\n` +
|
|
12
|
+
`const launch = ${JSON.stringify(payload)};\n` +
|
|
13
|
+
`try { rmSync(new URL(".", import.meta.url), { recursive: true, force: true }); } catch {}\n` +
|
|
14
|
+
`process.chdir(launch.cwd);\n` +
|
|
15
|
+
`const child = spawn(launch.command, launch.args, { env: launch.env, stdio: "inherit", windowsHide: false });\n` +
|
|
16
|
+
`let exiting = false;\n` +
|
|
17
|
+
`const forward = (signal) => { if (!exiting && child.pid) child.kill(signal); };\n` +
|
|
18
|
+
`process.on("SIGINT", () => forward("SIGINT"));\n` +
|
|
19
|
+
`process.on("SIGTERM", () => forward("SIGTERM"));\n` +
|
|
20
|
+
`child.on("error", (err) => { console.error("[cotal-herdr-launch] " + launch.command + ": " + err.message); process.exit(127); });\n` +
|
|
21
|
+
`child.on("exit", (code, signal) => { exiting = true; if (signal) process.exit(128); process.exit(code ?? 0); });\n`;
|
|
22
|
+
}
|
|
23
|
+
/** The connector-declared env (identity, creds, control token) must never appear on herdr's
|
|
24
|
+
* command line or in the server's pane records, so it rides an owner-only (0o600) launcher
|
|
25
|
+
* script in a private temp dir; herdr only ever sees `node <script>`. The script removes its
|
|
26
|
+
* own directory as soon as it has loaded. */
|
|
27
|
+
export function privateLauncher(spec, cwd) {
|
|
28
|
+
// Prefix is specifically `cotal-herdr-launch-`, not `cotal-herdr-`: the smoke counts launcher
|
|
29
|
+
// dirs to prove failed spawns clean up after themselves, and a shorter prefix would also match
|
|
30
|
+
// the driver's own `cotal-herdr-srv-` scratch, making that count wider than the claim it tests.
|
|
31
|
+
const dir = mkdtempSync(join(tmpdir(), "cotal-herdr-launch-"));
|
|
32
|
+
hardenPrivate(dir, "dir");
|
|
33
|
+
const script = join(dir, "launch.mjs");
|
|
34
|
+
writeSecretFile(script, launcherSource({ cwd, command: spec.command, args: spec.args, env: spec.env ?? {} }));
|
|
35
|
+
return { argv: [process.execPath, script], dir, script };
|
|
36
|
+
}
|
|
37
|
+
/** How spawned agents are laid out in the session: `tab` (default) gives each agent its own
|
|
38
|
+
* name-labeled tab; `split` shares one tab, splitting it per agent.
|
|
39
|
+
* Selected per manager process via COTAL_HERDR_LAYOUT; an unknown value fails loud. */
|
|
40
|
+
function layoutFromEnv() {
|
|
41
|
+
const raw = process.env.COTAL_HERDR_LAYOUT ?? "tab";
|
|
42
|
+
if (raw === "tab" || raw === "split")
|
|
43
|
+
return raw;
|
|
44
|
+
throw new Error(`herdr runtime: unknown COTAL_HERDR_LAYOUT ${JSON.stringify(raw)} (expected "tab" or "split")`);
|
|
45
|
+
}
|
|
46
|
+
function isDirectory(path) {
|
|
47
|
+
try {
|
|
48
|
+
return statSync(path).isDirectory();
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function cleanupLauncher(launcher) {
|
|
55
|
+
try {
|
|
56
|
+
rmSync(launcher.dir, { recursive: true, force: true });
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
/* the launcher also removes itself after loading */
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Spawns each managed agent into a pane of a DEDICATED named herdr session (`cotal-<space>`,
|
|
64
|
+
* from the manager) with its own server and socket — never the operator's default session, so
|
|
65
|
+
* no Cotal operation can inspect or kill unrelated panes. Panes are owned by the herdr server,
|
|
66
|
+
* so agents survive the manager's terminal going away; watch them with
|
|
67
|
+
* `herdr session attach <session>`. Lifecycle is keyed off the globally-unique `terminal_id`;
|
|
68
|
+
* the workspace-scoped public `pane_id` is re-resolved before every pane-scoped call (a pane
|
|
69
|
+
* move changes it) and never trusted from cache.
|
|
70
|
+
*/
|
|
71
|
+
export class HerdrRuntime {
|
|
72
|
+
session;
|
|
73
|
+
kind = "herdr";
|
|
74
|
+
constructor(session) {
|
|
75
|
+
this.session = session;
|
|
76
|
+
}
|
|
77
|
+
spawn(name, spec, cwd) {
|
|
78
|
+
if (!/^[A-Za-z0-9_.-]+$/.test(name))
|
|
79
|
+
throw new Error(`herdr runtime: unsafe agent name ${JSON.stringify(name)} (allowed: letters, digits, _ . -)`);
|
|
80
|
+
if (!herdr.available()) {
|
|
81
|
+
const found = herdr.versionText();
|
|
82
|
+
throw new Error(`herdr runtime: no usable herdr on PATH - needs >= ${herdr.MIN_HERDR.join(".")}` +
|
|
83
|
+
(found ? ` (found "${found}")` : " (herdr not installed or not on PATH)"));
|
|
84
|
+
}
|
|
85
|
+
// herdr silently substitutes $HOME for a bad --cwd; validate here so a bad workspace
|
|
86
|
+
// fails loud at spawn instead of the agent starting somewhere else entirely (a non-directory
|
|
87
|
+
// would otherwise die later, invisibly, at the launcher's chdir).
|
|
88
|
+
if (!isDirectory(cwd))
|
|
89
|
+
throw new Error(`herdr runtime: cwd ${JSON.stringify(cwd)} is not a directory`);
|
|
90
|
+
const layout = layoutFromEnv(); // before any side effects, so a bad value spawns nothing
|
|
91
|
+
herdr.ensureServer(this.session);
|
|
92
|
+
// `split` shares a tab, so the tab set has to be sampled BEFORE this agent adds its own.
|
|
93
|
+
const tabsBefore = layout === "split" ? herdr.tabIds(this.session) : [];
|
|
94
|
+
const launcher = privateLauncher(spec, cwd);
|
|
95
|
+
let agent;
|
|
96
|
+
let startedTerminalId;
|
|
97
|
+
try {
|
|
98
|
+
// agentStart lands the agent in its own workspace + name-labeled tab, so the default
|
|
99
|
+
// layout needs no move at all.
|
|
100
|
+
agent = herdr.agentStart(this.session, name, cwd, launcher.argv);
|
|
101
|
+
startedTerminalId = agent.terminalId;
|
|
102
|
+
// `split`: fold this agent into a pre-existing tab. With none (the first agent) there is
|
|
103
|
+
// nothing to share and it stays where it is — that is the layout's meaning, not a fallback.
|
|
104
|
+
// The move changes the public pane id — keep the returned, terminal-pinned record.
|
|
105
|
+
if (layout === "split" && tabsBefore.length > 0)
|
|
106
|
+
agent = herdr.paneMoveIntoTab(this.session, agent.paneId, tabsBefore[0], startedTerminalId);
|
|
107
|
+
// Cosmetic but part of the spawn contract: fail loud, and don't leave the started pane behind.
|
|
108
|
+
herdr.reportMetadata(this.session, agent.paneId, "cotal", { cotal: this.session });
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (startedTerminalId) {
|
|
112
|
+
// A move may have already changed the public pane id when the failure hit — never
|
|
113
|
+
// close whichever pane record happened to assign; re-resolve off the stable terminal.
|
|
114
|
+
try {
|
|
115
|
+
const current = herdr.agentInfo(this.session, startedTerminalId);
|
|
116
|
+
if (current)
|
|
117
|
+
herdr.closePane(this.session, current.paneId);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
/* best-effort teardown of the half-spawned pane */
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
cleanupLauncher(launcher);
|
|
124
|
+
throw err;
|
|
125
|
+
}
|
|
126
|
+
const { terminalId } = agent;
|
|
127
|
+
const session = this.session;
|
|
128
|
+
/** The CURRENT pane id for this terminal — resolved fresh for every pane-scoped op, never
|
|
129
|
+
* the (possibly stale) id from spawn time. Gone terminal → HerdrCliError(pane_not_found). */
|
|
130
|
+
const currentPane = () => {
|
|
131
|
+
const info = herdr.agentInfo(session, terminalId);
|
|
132
|
+
if (!info)
|
|
133
|
+
throw new herdr.HerdrCliError("pane_not_found", `terminal ${terminalId} is gone`);
|
|
134
|
+
return info.paneId;
|
|
135
|
+
};
|
|
136
|
+
if (spec.confirm) {
|
|
137
|
+
for (let i = 1; i <= MAX_CONFIRMS; i++) {
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
try {
|
|
140
|
+
herdr.sendKeys(session, currentPane(), "enter");
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
/* pane may already be gone */
|
|
144
|
+
}
|
|
145
|
+
}, i * CONFIRM_INTERVAL_MS);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
name,
|
|
150
|
+
kind: "herdr",
|
|
151
|
+
// terminalState throws on any failed inventory (fail closed); for the status probe that
|
|
152
|
+
// uncertainty must read as "running" — preserving, like tmux — never as a false exit.
|
|
153
|
+
status: () => {
|
|
154
|
+
try {
|
|
155
|
+
return herdr.terminalState(session, terminalId);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return "running";
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
stop: (opts) => {
|
|
162
|
+
if (opts?.graceful === false) {
|
|
163
|
+
try {
|
|
164
|
+
herdr.closePane(session, currentPane());
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
if (!(err instanceof herdr.HerdrCliError && err.code === "pane_not_found"))
|
|
168
|
+
throw err;
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
cleanupLauncher(launcher);
|
|
172
|
+
}
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// Graceful: type `/exit` so the agent session shuts down cleanly (its lifecycle hook
|
|
176
|
+
// leaves the mesh), then close the now-idle pane regardless. Both calls are pane-scoped,
|
|
177
|
+
// so resolve the pane ONCE — re-resolving between them would let the id move underneath.
|
|
178
|
+
try {
|
|
179
|
+
const pane = currentPane();
|
|
180
|
+
herdr.sendText(session, pane, "/exit");
|
|
181
|
+
herdr.sendKeys(session, pane, "enter");
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
/* terminal already gone — still ensure the pane closes below */
|
|
185
|
+
}
|
|
186
|
+
// Deferred: a throw here would be uncaught in a timer and crash the manager — guard it.
|
|
187
|
+
setTimeout(() => {
|
|
188
|
+
try {
|
|
189
|
+
herdr.closePane(session, currentPane());
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (err instanceof herdr.HerdrCliError && err.code === "pane_not_found")
|
|
193
|
+
return;
|
|
194
|
+
console.error(`herdr runtime: failed to close pane for "${name}":`, err);
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
cleanupLauncher(launcher);
|
|
198
|
+
}
|
|
199
|
+
}, GRACE_MS);
|
|
200
|
+
},
|
|
201
|
+
waitForExit: () => herdr.waitForTerminalExit(session, terminalId),
|
|
202
|
+
interrupt: () => {
|
|
203
|
+
try {
|
|
204
|
+
herdr.sendKeys(session, currentPane(), "ctrl+c");
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
if (err instanceof herdr.HerdrCliError && err.code === "pane_not_found")
|
|
208
|
+
return;
|
|
209
|
+
throw err;
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
attach: () => {
|
|
213
|
+
// NOT `agent attach`: herdr reserves its agent registry for recognized kinds, and a pane
|
|
214
|
+
// started by this runtime never joins it — that command would report the agent as missing.
|
|
215
|
+
throw new Error(`herdr runtime: attach natively - \`herdr session attach ${session}\`, ` +
|
|
216
|
+
`then select the "${name}" tab (terminal ${terminalId})`);
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Self-registering runtime provider — `import "@cotal-ai/herdr"` makes the manager's `herdr`
|
|
222
|
+
* runtime available without the manager depending on this package. */
|
|
223
|
+
export const herdrRuntimeProvider = {
|
|
224
|
+
kind: "runtime",
|
|
225
|
+
name: "herdr",
|
|
226
|
+
available: () => herdr.available(),
|
|
227
|
+
create: (opts) => new HerdrRuntime(opts.session),
|
|
228
|
+
};
|
|
229
|
+
registry.register(herdrRuntimeProvider);
|
|
230
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cotal-ai/herdr",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"description": "Cotal Herdr integration: a Herdr Runtime provider for spawning agents into panes of a dedicated Herdr session.",
|
|
4
|
+
"version": "0.19.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "https://github.com/Cotal-AI/Cotal.git",
|
|
9
9
|
"directory": "extensions/herdr"
|
|
10
10
|
},
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"peerDependencies": {
|
|
21
|
+
"@cotal-ai/core": "*"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"tsx": "^4.22.4",
|
|
25
|
+
"@cotal-ai/core": "0.19.0"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
35
|
+
"build": "tsc -p tsconfig.json"
|
|
36
|
+
}
|
|
37
|
+
}
|