@almyty/runner 1.5.0 → 1.5.2
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/README.md +40 -13
- package/dist/cli-args.d.ts +2 -0
- package/dist/cli-args.js +6 -1
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.d.ts +3 -2
- package/dist/cli.js +10 -5
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.js +23 -1
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +4 -1
- package/dist/daemon.js +42 -6
- package/dist/daemon.js.map +1 -1
- package/dist/handlers.d.ts +12 -0
- package/dist/handlers.js +67 -7
- package/dist/handlers.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/policy.d.ts +17 -2
- package/dist/policy.js +21 -2
- package/dist/policy.js.map +1 -1
- package/dist/process-manager.d.ts +11 -2
- package/dist/process-manager.js +12 -2
- package/dist/process-manager.js.map +1 -1
- package/dist/protocol.d.ts +58 -0
- package/dist/protocol.js +29 -0
- package/dist/protocol.js.map +1 -1
- package/dist/streamable-client.d.ts +24 -1
- package/dist/streamable-client.js +84 -14
- package/dist/streamable-client.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js.map +1 -1
- package/dist/workspace-reclaimer.d.ts +72 -0
- package/dist/workspace-reclaimer.js +100 -0
- package/dist/workspace-reclaimer.js.map +1 -0
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -2,29 +2,55 @@
|
|
|
2
2
|
|
|
3
3
|
A long-running CLI daemon that lets almyty agents run commands on a machine you
|
|
4
4
|
control — your laptop, a build box, a GPU host, a server in your own network.
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
Execution happens on that machine, but command results and requested output
|
|
6
|
+
are sent back to almyty and may become agent/model context. Do not print secrets
|
|
7
|
+
or return sensitive file contents unless you intend to share them.
|
|
8
|
+
One common use is orchestrating a CLI coding agent
|
|
7
9
|
(Claude Code, Codex, Gemini, aider, …) against your codebase in one coherent
|
|
8
10
|
workspace, but nothing about the runner is specific to coding agents.
|
|
9
11
|
|
|
10
12
|
## Install
|
|
11
13
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Three commands in three minutes:
|
|
14
|
+
Install once, then call the installed binaries. The runner is a daemon you
|
|
15
|
+
start, restart, query and stop on that machine, so it is a pinned global
|
|
16
|
+
install rather than whatever `npx` resolves on each start.
|
|
17
17
|
|
|
18
18
|
```
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
npm i -g @almyty/runner @almyty/auth
|
|
20
|
+
almyty-auth login # once per machine
|
|
21
|
+
almyty-runner start --name my-laptop # add --org <org-id> if you belong to several orgs
|
|
21
22
|
# in another terminal:
|
|
22
|
-
|
|
23
|
+
almyty-runner status
|
|
23
24
|
```
|
|
24
25
|
|
|
25
|
-
Stop with `
|
|
26
|
+
Stop with `almyty-runner stop` or ctrl-c in the daemon's terminal.
|
|
27
|
+
|
|
28
|
+
Or use the UI: log into your almyty account and head to **Runners → Start a
|
|
29
|
+
runner**. The page creates the runner (name, labels, and who can see it:
|
|
30
|
+
Private, Team or Org-wide), prints the exact start command, and waits for the
|
|
31
|
+
daemon to come online before opening the runner. From that page you can go
|
|
32
|
+
back and change anything, or cancel, which deletes the runner again.
|
|
33
|
+
|
|
34
|
+
## What identifies and authorises a runner
|
|
35
|
+
|
|
36
|
+
Your almyty login on that machine, not the name. `almyty-runner start` sends
|
|
37
|
+
the token `almyty-auth login` stored in `~/.almyty/credentials.json` (or
|
|
38
|
+
`ALMYTY_TOKEN`); the backend attaches the daemon to the runner of that user in
|
|
39
|
+
that organization. The name is a label, unique within the organization:
|
|
40
|
+
|
|
41
|
+
- Someone who knows the name cannot connect to your runner. Their daemon
|
|
42
|
+
carries their login, so it is refused (the name is already used in the org)
|
|
43
|
+
rather than attached to yours.
|
|
44
|
+
- Restarting with the same name from a machine logged in as you replaces the
|
|
45
|
+
previous connection of your runner; that is how a rebuilt machine takes over.
|
|
46
|
+
- `--org` only picks among organizations you belong to; any other is refused.
|
|
47
|
+
- The daemon's live session is bound to your user as well: another member of
|
|
48
|
+
the organization cannot attach a session to your runner by its id.
|
|
26
49
|
|
|
27
|
-
|
|
50
|
+
Who else can *use* the runner is its visibility: **Private** (the default:
|
|
51
|
+
you only, not even org admins), **Team**, or **Org-wide**. It is enforced on
|
|
52
|
+
the server when runners are listed and fetched, when work is dispatched, and on
|
|
53
|
+
the tools a runner publishes.
|
|
28
54
|
|
|
29
55
|
## What that command lets almyty do to your machine
|
|
30
56
|
|
|
@@ -71,6 +97,7 @@ The runner exposes a method surface over a persistent connection to almyty, and
|
|
|
71
97
|
|
|
72
98
|
- `process.*` — `spawn`, `write`, `close_input`, `read`, `signal`, `wait`, `wait_for_idle`, `list`
|
|
73
99
|
- `runner.info` — capabilities and status
|
|
100
|
+
- `workspace.prepare` — make the folder for a workspace an agent run was given: `almyty-workspaces/<name>` under the first `allowedCwdRoots` entry, else `~/.almyty/workspaces/<name>`. The folder stays when the workspace is released.
|
|
74
101
|
- `agent.*` — `spawn`, `list`, `status` for almyty agent processes
|
|
75
102
|
- `coding.*` — `start`, `input`, `list`, `status`, `stop` for coding-CLI sessions
|
|
76
103
|
|
|
@@ -84,7 +111,7 @@ JSON, layered lowest precedence first:
|
|
|
84
111
|
2. `~/.almyty/config.json` (global)
|
|
85
112
|
3. `./.almyty/config.json` (project-local)
|
|
86
113
|
4. Environment variables (`ALMYTY_URL`, `ALMYTY_TOKEN`, `ALMYTY_RUNNER_NAME`, `ALMYTY_RUNNER_ISOLATION`)
|
|
87
|
-
5. CLI flags (`--name`, `--label`, `--config`, `--url`)
|
|
114
|
+
5. CLI flags (`--name`, `--org`, `--label`, `--config`, `--url`)
|
|
88
115
|
6. Backend overrides (constrain-only; never escalate)
|
|
89
116
|
|
|
90
117
|
A `~/.almyty/config.json` that keeps work inside one tree — the shape worth
|
package/dist/cli-args.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export interface ParsedFlags {
|
|
|
11
11
|
url?: string;
|
|
12
12
|
configPath?: string;
|
|
13
13
|
labels?: Record<string, string>;
|
|
14
|
+
/** --org: the organization to register in (X-Organization-Id). */
|
|
15
|
+
org?: string;
|
|
14
16
|
/**
|
|
15
17
|
* A usage problem worth exiting on. Parsing reports it rather than
|
|
16
18
|
* exiting itself, so the surface can be tested without a process, and
|
package/dist/cli-args.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* splits its arguments out the same way.
|
|
7
7
|
*/
|
|
8
8
|
export const COMMANDS = ['start', 'status', 'stop', 'help', 'version'];
|
|
9
|
+
const VALUE_FLAGS = ['--name', '--config', '--url', '--label', '--org'];
|
|
9
10
|
/** Takes a full argv; the first two entries are node and the script. */
|
|
10
11
|
export function parseArgs(argv) {
|
|
11
12
|
const args = argv.slice(2);
|
|
@@ -28,7 +29,7 @@ export function parseArgs(argv) {
|
|
|
28
29
|
const a = args[i];
|
|
29
30
|
if (a === '--help' || a === '-h')
|
|
30
31
|
return { command: 'help' };
|
|
31
|
-
if (a
|
|
32
|
+
if (VALUE_FLAGS.includes(a)) {
|
|
32
33
|
const value = args[i + 1];
|
|
33
34
|
if (value === undefined || value.startsWith('-')) {
|
|
34
35
|
return { ...flags, error: `${a} needs a value` };
|
|
@@ -46,6 +47,10 @@ export function parseArgs(argv) {
|
|
|
46
47
|
flags.url = value;
|
|
47
48
|
continue;
|
|
48
49
|
}
|
|
50
|
+
if (a === '--org') {
|
|
51
|
+
flags.org = value;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
49
54
|
const eq = value.indexOf('=');
|
|
50
55
|
if (eq <= 0)
|
|
51
56
|
return { ...flags, error: `--label expects key=value, got: ${value}` };
|
package/dist/cli-args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* almyty-runner CLI.
|
|
4
4
|
*
|
|
5
|
-
* almyty-runner start [--name X] [--label k=v]... [--config path] [--url URL]
|
|
5
|
+
* almyty-runner start [--name X] [--org ORG_ID] [--label k=v]... [--config path] [--url URL]
|
|
6
6
|
* almyty-runner status
|
|
7
7
|
* almyty-runner stop
|
|
8
8
|
*
|
|
9
9
|
* Auth: ALMYTY_TOKEN env or ~/.almyty/credentials.json (run
|
|
10
|
-
* `
|
|
10
|
+
* `almyty-auth login` first if neither is configured). The runner is
|
|
11
|
+
* registered to whoever that login belongs to; the name is only a label.
|
|
11
12
|
*/
|
|
12
13
|
export { parseArgs, COMMANDS, type ParsedFlags } from './cli-args.js';
|
package/dist/cli.js
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* almyty-runner CLI.
|
|
4
4
|
*
|
|
5
|
-
* almyty-runner start [--name X] [--label k=v]... [--config path] [--url URL]
|
|
5
|
+
* almyty-runner start [--name X] [--org ORG_ID] [--label k=v]... [--config path] [--url URL]
|
|
6
6
|
* almyty-runner status
|
|
7
7
|
* almyty-runner stop
|
|
8
8
|
*
|
|
9
9
|
* Auth: ALMYTY_TOKEN env or ~/.almyty/credentials.json (run
|
|
10
|
-
* `
|
|
10
|
+
* `almyty-auth login` first if neither is configured). The runner is
|
|
11
|
+
* registered to whoever that login belongs to; the name is only a label.
|
|
11
12
|
*/
|
|
12
13
|
import { RunnerDaemon, readStatus, stopDaemon } from './daemon.js';
|
|
13
14
|
import { RUNNER_VERSION } from './runtime-info.js';
|
|
@@ -22,8 +23,9 @@ Usage:
|
|
|
22
23
|
almyty-runner stop Send SIGTERM to the local daemon
|
|
23
24
|
|
|
24
25
|
Options for start:
|
|
25
|
-
--name <name> Runner name (matches [a-zA-Z0-9_-]{1,64})
|
|
26
|
-
--
|
|
26
|
+
--name <name> Runner name (matches [a-zA-Z0-9_-]{1,64}), unique in the org; defaults to this machine's hostname
|
|
27
|
+
--org <org-id> Organization to register in (needed if you belong to several)
|
|
28
|
+
--label key=value Add a descriptive label; repeat for multiple
|
|
27
29
|
--config <path> Path to a JSON config file (overrides global+project)
|
|
28
30
|
--url <backend-url> Override backend URL (e.g. https://api.almyty.com)
|
|
29
31
|
|
|
@@ -37,7 +39,9 @@ Exit codes:
|
|
|
37
39
|
2 usage error (unknown command, bad flags)
|
|
38
40
|
|
|
39
41
|
Auth:
|
|
40
|
-
ALMYTY_TOKEN env or ~/.almyty/credentials.json (\`
|
|
42
|
+
ALMYTY_TOKEN env or ~/.almyty/credentials.json (\`almyty-auth login\`).
|
|
43
|
+
The runner belongs to the user that login is for. Nobody else can
|
|
44
|
+
attach to it, whatever name they pick.
|
|
41
45
|
`);
|
|
42
46
|
}
|
|
43
47
|
async function main() {
|
|
@@ -78,6 +82,7 @@ async function main() {
|
|
|
78
82
|
name: flags.name,
|
|
79
83
|
labels: flags.labels,
|
|
80
84
|
backendUrl: flags.url,
|
|
85
|
+
organizationId: flags.org,
|
|
81
86
|
configPath: flags.configPath,
|
|
82
87
|
});
|
|
83
88
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -56,5 +56,13 @@ export interface LoadConfigInputs {
|
|
|
56
56
|
globalPath?: string;
|
|
57
57
|
/** Override project config path (testing). */
|
|
58
58
|
projectPath?: string;
|
|
59
|
+
/** The machine's hostname, used as the name when none is set. Defaults to os.hostname(). */
|
|
60
|
+
hostname?: () => string;
|
|
59
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* A hostname turned into a valid runner name (letters, digits, _ and -,
|
|
64
|
+
* at most 64 characters): "Franes-MacBook-Pro.local" becomes
|
|
65
|
+
* "franes-macbook-pro". Empty when nothing usable is left.
|
|
66
|
+
*/
|
|
67
|
+
export declare function runnerNameFromHostname(host: string): string;
|
|
60
68
|
export declare function loadConfig(inputs?: LoadConfigInputs): ResolvedConfig;
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'fs';
|
|
2
|
-
import { homedir } from 'os';
|
|
2
|
+
import { homedir, hostname } from 'os';
|
|
3
3
|
import { join, isAbsolute, resolve as pathResolve } from 'path';
|
|
4
4
|
import { allProbeBinaries } from './coding-agents/index.js';
|
|
5
5
|
/**
|
|
@@ -113,6 +113,19 @@ export function describeIsolationPosture(config) {
|
|
|
113
113
|
}
|
|
114
114
|
export const GLOBAL_CONFIG_PATH = join(homedir(), '.almyty', 'config.json');
|
|
115
115
|
export const PROJECT_CONFIG_PATH = join(process.cwd(), '.almyty', 'config.json');
|
|
116
|
+
/**
|
|
117
|
+
* A hostname turned into a valid runner name (letters, digits, _ and -,
|
|
118
|
+
* at most 64 characters): "Franes-MacBook-Pro.local" becomes
|
|
119
|
+
* "franes-macbook-pro". Empty when nothing usable is left.
|
|
120
|
+
*/
|
|
121
|
+
export function runnerNameFromHostname(host) {
|
|
122
|
+
return host
|
|
123
|
+
.split('.')[0]
|
|
124
|
+
.toLowerCase()
|
|
125
|
+
.replace(/[^a-z0-9_-]+/g, '-')
|
|
126
|
+
.replace(/^-+|(?<!-)-+$/g, '')
|
|
127
|
+
.slice(0, 64);
|
|
128
|
+
}
|
|
116
129
|
export function loadConfig(inputs = {}) {
|
|
117
130
|
const env = inputs.env ?? process.env;
|
|
118
131
|
const readFile = inputs.readFile ?? safeRead;
|
|
@@ -145,6 +158,8 @@ export function loadConfig(inputs = {}) {
|
|
|
145
158
|
resolved.backendUrl = env.ALMYTY_URL;
|
|
146
159
|
if (env.ALMYTY_RUNNER_NAME)
|
|
147
160
|
resolved.name = env.ALMYTY_RUNNER_NAME;
|
|
161
|
+
if (env.ALMYTY_ORG_ID)
|
|
162
|
+
resolved.organizationId = env.ALMYTY_ORG_ID;
|
|
148
163
|
if (env.ALMYTY_RUNNER_ISOLATION) {
|
|
149
164
|
if (!isIsolation(env.ALMYTY_RUNNER_ISOLATION)) {
|
|
150
165
|
throw new Error(`ALMYTY_RUNNER_ISOLATION must be one of: container, host`);
|
|
@@ -160,11 +175,18 @@ export function loadConfig(inputs = {}) {
|
|
|
160
175
|
resolved.labels = { ...resolved.labels, ...f.labels };
|
|
161
176
|
if (f.backendUrl)
|
|
162
177
|
resolved.backendUrl = f.backendUrl;
|
|
178
|
+
if (f.organizationId)
|
|
179
|
+
resolved.organizationId = f.organizationId;
|
|
163
180
|
if (f.config)
|
|
164
181
|
resolved.config = mergeRunnerConfig(resolved.config, f.config);
|
|
165
182
|
if (f.binaryProbeList && f.binaryProbeList.length > 0) {
|
|
166
183
|
resolved.binaryProbeList = f.binaryProbeList;
|
|
167
184
|
}
|
|
185
|
+
// No name anywhere: use the machine's own, which is what a person
|
|
186
|
+
// would type anyway ("franes-macbook-pro").
|
|
187
|
+
if (!resolved.name) {
|
|
188
|
+
resolved.name = runnerNameFromHostname((inputs.hostname ?? hostname)());
|
|
189
|
+
}
|
|
168
190
|
if (!resolved.name) {
|
|
169
191
|
// A runner without a name is meaningless: the backend keys
|
|
170
192
|
// single-runner enforcement on (user, org, name). Surface a
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
CHANGED
|
@@ -18,7 +18,9 @@ export interface DaemonStatus {
|
|
|
18
18
|
* 4. POST /runners/register with the snapshot.
|
|
19
19
|
* 5. Open the Streamable HTTP stream and start dispatching incoming
|
|
20
20
|
* envelopes to handlers.
|
|
21
|
-
* 6. Heartbeat every 30s
|
|
21
|
+
* 6. Heartbeat every 30s, and reconcile workspaces against the set
|
|
22
|
+
* of still-active ones the backend returns in each ack — killing
|
|
23
|
+
* processes for workspaces that have been released or expired.
|
|
22
24
|
* 7. On SIGTERM / SIGINT: send a final shutdown envelope, wait
|
|
23
25
|
* briefly for in-flight responses, then exit.
|
|
24
26
|
*
|
|
@@ -30,6 +32,7 @@ export declare class RunnerDaemon {
|
|
|
30
32
|
private client;
|
|
31
33
|
private processes;
|
|
32
34
|
private coding;
|
|
35
|
+
private reclaimer;
|
|
33
36
|
private runnerId;
|
|
34
37
|
private heartbeatTimer;
|
|
35
38
|
private status;
|
package/dist/daemon.js
CHANGED
|
@@ -8,6 +8,7 @@ import { createDefaultAdapterFactory, ProcessManager } from './process-manager.j
|
|
|
8
8
|
import { StreamableClient, envelope } from './streamable-client.js';
|
|
9
9
|
import { dispatchHandler } from './handlers.js';
|
|
10
10
|
import { CodingSessionManager } from './coding-sessions.js';
|
|
11
|
+
import { WorkspaceReclaimer } from './workspace-reclaimer.js';
|
|
11
12
|
const STATE_DIR = join(homedir(), '.almyty', 'runner');
|
|
12
13
|
const PID_FILE = join(STATE_DIR, 'daemon.pid');
|
|
13
14
|
const STATUS_FILE = join(STATE_DIR, 'status.json');
|
|
@@ -25,7 +26,9 @@ const MAX_SESSION_LOST_STREAK = 8;
|
|
|
25
26
|
* 4. POST /runners/register with the snapshot.
|
|
26
27
|
* 5. Open the Streamable HTTP stream and start dispatching incoming
|
|
27
28
|
* envelopes to handlers.
|
|
28
|
-
* 6. Heartbeat every 30s
|
|
29
|
+
* 6. Heartbeat every 30s, and reconcile workspaces against the set
|
|
30
|
+
* of still-active ones the backend returns in each ack — killing
|
|
31
|
+
* processes for workspaces that have been released or expired.
|
|
29
32
|
* 7. On SIGTERM / SIGINT: send a final shutdown envelope, wait
|
|
30
33
|
* briefly for in-flight responses, then exit.
|
|
31
34
|
*
|
|
@@ -37,6 +40,7 @@ export class RunnerDaemon {
|
|
|
37
40
|
client = null;
|
|
38
41
|
processes = null;
|
|
39
42
|
coding = null;
|
|
43
|
+
reclaimer = null;
|
|
40
44
|
runnerId = null;
|
|
41
45
|
heartbeatTimer = null;
|
|
42
46
|
status = null;
|
|
@@ -73,11 +77,16 @@ export class RunnerDaemon {
|
|
|
73
77
|
// effective config, which we use to confirm what limits the backend
|
|
74
78
|
// applied. After registration we switch to Streamable HTTP for the
|
|
75
79
|
// long-lived connection.
|
|
80
|
+
// Who this runner belongs to is decided by the backend from the
|
|
81
|
+
// bearer token (the user who ran `almyty-auth login`), never from
|
|
82
|
+
// anything in this body: the name is a label. X-Organization-Id picks
|
|
83
|
+
// among that user's organizations and is refused for any other.
|
|
76
84
|
const regResp = await fetch(`${backendUrl}/runners/register`, {
|
|
77
85
|
method: 'POST',
|
|
78
86
|
headers: {
|
|
79
87
|
'Content-Type': 'application/json',
|
|
80
88
|
'Authorization': `Bearer ${credentials.token}`,
|
|
89
|
+
...(resolved.organizationId ? { 'X-Organization-Id': resolved.organizationId } : {}),
|
|
81
90
|
},
|
|
82
91
|
body: JSON.stringify({
|
|
83
92
|
name: resolved.name,
|
|
@@ -105,11 +114,24 @@ export class RunnerDaemon {
|
|
|
105
114
|
process.stderr.write(`coding event send failed: ${err?.message ?? err}\n`);
|
|
106
115
|
});
|
|
107
116
|
});
|
|
117
|
+
// Workspace cleanup. Each heartbeat ack carries the set of
|
|
118
|
+
// workspaces the backend still lists as active; anything this
|
|
119
|
+
// machine is still hosting outside that set gets its processes
|
|
120
|
+
// killed. Reclaims are announced on stdout, not silently: these are
|
|
121
|
+
// the user's own processes on the user's own machine.
|
|
122
|
+
this.reclaimer = new WorkspaceReclaimer(this.processes, {
|
|
123
|
+
info: (line) => process.stdout.write(`${line}\n`),
|
|
124
|
+
warn: (line) => process.stderr.write(`${line}\n`),
|
|
125
|
+
});
|
|
108
126
|
// Open the Streamable HTTP stream.
|
|
109
|
-
this.client = new StreamableClient({
|
|
127
|
+
this.client = new StreamableClient({
|
|
128
|
+
baseUrl: backendUrl,
|
|
129
|
+
token: credentials.token,
|
|
130
|
+
organizationId: resolved.organizationId,
|
|
131
|
+
});
|
|
110
132
|
this.wireClient();
|
|
111
133
|
// First POST mints the session id; send a hello envelope so the
|
|
112
|
-
// backend's
|
|
134
|
+
// backend's worker stream (WorkerStreamTransport) assigns one.
|
|
113
135
|
await this.client.send(envelope('event', { kind: 'runner.hello', runnerId: this.runnerId }));
|
|
114
136
|
await this.client.openStream();
|
|
115
137
|
// Heartbeat loop. This timer is deliberately REF'd: it is the daemon's
|
|
@@ -180,9 +202,18 @@ export class RunnerDaemon {
|
|
|
180
202
|
this.handleRequest(env).catch(err => {
|
|
181
203
|
process.stderr.write(`request handling error: ${err.message}\n`);
|
|
182
204
|
});
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (env.type === 'heartbeat') {
|
|
208
|
+
// Heartbeat ack: carries the workspaces the backend still lists
|
|
209
|
+
// as active. Everything about the decision to kill (including
|
|
210
|
+
// deciding not to) lives in the reclaimer.
|
|
211
|
+
void this.reclaimer?.onAck(env).catch(err => {
|
|
212
|
+
process.stderr.write(`workspace reconcile failed: ${err?.message ?? err}\n`);
|
|
213
|
+
});
|
|
214
|
+
return;
|
|
183
215
|
}
|
|
184
|
-
//
|
|
185
|
-
// the runner doesn't react to them in v1.0.
|
|
216
|
+
// Other server-side event envelopes are observational.
|
|
186
217
|
});
|
|
187
218
|
this.client.on('reconnect', info => {
|
|
188
219
|
process.stderr.write(`reconnecting (attempt ${info.attempt}, delay ${info.delayMs}ms): ${info.reason}\n`);
|
|
@@ -230,7 +261,12 @@ export class RunnerDaemon {
|
|
|
230
261
|
if (!this.client || !this.processes)
|
|
231
262
|
return;
|
|
232
263
|
const inUse = this.processes.inUse();
|
|
233
|
-
|
|
264
|
+
const env = envelope('heartbeat', { ts: Date.now(), inUse });
|
|
265
|
+
// Remember the beat before it goes out: the backend can answer
|
|
266
|
+
// faster than the await resolves, and an ack we cannot correlate to
|
|
267
|
+
// a heartbeat we sent is ignored.
|
|
268
|
+
this.reclaimer?.noteSent(env.id, Date.now());
|
|
269
|
+
await this.client.send(env);
|
|
234
270
|
this.updateState({ inUseProcesses: inUse });
|
|
235
271
|
}
|
|
236
272
|
/**
|
package/dist/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers.d.ts
CHANGED
|
@@ -35,5 +35,17 @@ export interface HandlerContext {
|
|
|
35
35
|
coding?: CodingSessionManager;
|
|
36
36
|
/** Test injection for coding.list's binary probing. */
|
|
37
37
|
probeExec?: ProbeExec;
|
|
38
|
+
/**
|
|
39
|
+
* Where `workspace.prepare` makes folders. Unset: under the first
|
|
40
|
+
* allowedCwdRoot, else ~/.almyty/workspaces (workspaceFolderRoot).
|
|
41
|
+
*/
|
|
42
|
+
workspacesRoot?: string;
|
|
38
43
|
}
|
|
39
44
|
export declare function dispatchHandler(ctx: HandlerContext, req: RequestPayload): Promise<ResponsePayload>;
|
|
45
|
+
/**
|
|
46
|
+
* Where automatic workspace folders go on this machine: `almyty-workspaces`
|
|
47
|
+
* under the first allowedCwdRoot when roots are configured (so the folder
|
|
48
|
+
* passes the same policy every command in it is held to), else
|
|
49
|
+
* ~/.almyty/workspaces.
|
|
50
|
+
*/
|
|
51
|
+
export declare function workspaceFolderRoot(config: RunnerConfig, home?: string): string;
|
package/dist/handlers.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { mkdir, realpath } from 'fs/promises';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { isAbsolute, join, resolve as resolvePath } from 'path';
|
|
1
4
|
import { shellExec } from './process-manager.js';
|
|
2
|
-
import { enforceSpawnPolicy, enforceShellPolicy } from './policy.js';
|
|
5
|
+
import { enforceSpawnPolicy, enforceShellPolicy, enforceWorkspaceFolderPolicy } from './policy.js';
|
|
3
6
|
import { detectRuntimeInfo, RUNNER_VERSION } from './runtime-info.js';
|
|
4
7
|
import { WORKER_ERROR_CODES } from './protocol.js';
|
|
5
8
|
import { buildAgentSpawn, classifyStatus, detectCodingAgents, findByBinary, getCodingAgent, listCodingAgents, stripVtEscapes, } from './coding-agents/index.js';
|
|
@@ -18,6 +21,7 @@ export async function dispatchHandler(ctx, req) {
|
|
|
18
21
|
case 'process.wait': return ok(await waitH(ctx, req));
|
|
19
22
|
case 'shell.exec': return ok(await shell(ctx, req));
|
|
20
23
|
case 'runner.info': return ok(await info(ctx));
|
|
24
|
+
case 'workspace.prepare': return ok(await workspacePrepare(ctx, req));
|
|
21
25
|
case 'agent.list': return ok(agentList());
|
|
22
26
|
case 'agent.spawn': return ok(await agentSpawn(ctx, req));
|
|
23
27
|
case 'agent.status': return ok(agentStatus(ctx, req));
|
|
@@ -108,14 +112,39 @@ async function shell(ctx, req) {
|
|
|
108
112
|
// the process manager's bookkeeping; one-shot execution returns
|
|
109
113
|
// stdout+stderr+exit and forgets.
|
|
110
114
|
requireWorkspace(req);
|
|
115
|
+
// The parameters are the ones the backend publishes for this method
|
|
116
|
+
// (runner-capability.publisher.ts): `command`, and a `cwd` relative to
|
|
117
|
+
// the workspace root. This read `cmd` and ignored `cwd`, so every call
|
|
118
|
+
// through the published tool failed "cmd is required".
|
|
111
119
|
const p = req.params;
|
|
112
|
-
const cmd = requireString(p.
|
|
120
|
+
const cmd = requireString(p.command, 'command');
|
|
121
|
+
const cwd = resolveShellCwd(req.workspaceCwd, p.cwd);
|
|
113
122
|
// Enforce the same execution policy as process.spawn — isolation
|
|
114
|
-
// fail-closed, denyPatterns, installBlocked — and run
|
|
115
|
-
// sanitized env. Without this, shell.exec was a hole straight
|
|
116
|
-
// every protection spawn honours.
|
|
117
|
-
const { env } = enforceShellPolicy(ctx.config, cmd, p.env);
|
|
118
|
-
return shellExec(cmd, env, p.timeoutMs);
|
|
123
|
+
// fail-closed, denyPatterns, installBlocked, allowedCwdRoots — and run
|
|
124
|
+
// with the sanitized env. Without this, shell.exec was a hole straight
|
|
125
|
+
// past every protection spawn honours.
|
|
126
|
+
const { env } = enforceShellPolicy(ctx.config, cmd, p.env, cwd);
|
|
127
|
+
return shellExec(cmd, env, p.timeoutMs, cwd);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Where a shell.exec runs: the workspace root, or `cwd` resolved against
|
|
131
|
+
* it. With no workspace root known, an absolute `cwd` is used as given
|
|
132
|
+
* and a relative one is refused rather than resolved against wherever
|
|
133
|
+
* the daemon was started. The policy then holds the result to
|
|
134
|
+
* allowedCwdRoots.
|
|
135
|
+
*/
|
|
136
|
+
function resolveShellCwd(workspaceCwd, cwd) {
|
|
137
|
+
const root = typeof workspaceCwd === 'string' && workspaceCwd.length > 0 ? workspaceCwd : undefined;
|
|
138
|
+
if (cwd === undefined || cwd === null || cwd === '')
|
|
139
|
+
return root;
|
|
140
|
+
if (typeof cwd !== 'string') {
|
|
141
|
+
throw new RunnerError('cwd must be a string', RUNNER_ERROR_CODES.PATH_DENIED);
|
|
142
|
+
}
|
|
143
|
+
if (root)
|
|
144
|
+
return resolvePath(root, cwd);
|
|
145
|
+
if (isAbsolute(cwd))
|
|
146
|
+
return cwd;
|
|
147
|
+
throw new RunnerError('a relative cwd needs a workspace root', RUNNER_ERROR_CODES.PATH_DENIED);
|
|
119
148
|
}
|
|
120
149
|
async function info(ctx) {
|
|
121
150
|
// We re-detect on every call; binaries can be installed/removed at
|
|
@@ -268,6 +297,37 @@ function codingStop(ctx, req) {
|
|
|
268
297
|
const p = req.params;
|
|
269
298
|
return coding.stop(requireString(p.sessionId, 'sessionId'), p.force === true);
|
|
270
299
|
}
|
|
300
|
+
// ── workspace folders ───────────────────────────────────────────────
|
|
301
|
+
/** A folder name the backend may ask for: `<agent>-<run>`, nothing path-like. */
|
|
302
|
+
const WORKSPACE_FOLDER_NAME = /^[a-z0-9][a-z0-9-]{0,79}$/;
|
|
303
|
+
/**
|
|
304
|
+
* Where automatic workspace folders go on this machine: `almyty-workspaces`
|
|
305
|
+
* under the first allowedCwdRoot when roots are configured (so the folder
|
|
306
|
+
* passes the same policy every command in it is held to), else
|
|
307
|
+
* ~/.almyty/workspaces.
|
|
308
|
+
*/
|
|
309
|
+
export function workspaceFolderRoot(config, home = homedir()) {
|
|
310
|
+
const root = config.allowedCwdRoots?.[0];
|
|
311
|
+
return root ? join(root, 'almyty-workspaces') : join(home, '.almyty', 'workspaces');
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Make (or reuse) the folder for a workspace an agent run was given, and
|
|
315
|
+
* say where it is. The backend calls this before it records the workspace,
|
|
316
|
+
* because only the machine knows its own home directory and cwd roots.
|
|
317
|
+
* Idempotent: the same name is the same folder, so a run whose workspace
|
|
318
|
+
* expired and was replaced keeps working in the files it already made.
|
|
319
|
+
*/
|
|
320
|
+
async function workspacePrepare(ctx, req) {
|
|
321
|
+
const p = req.params;
|
|
322
|
+
const name = requireString(p?.name, 'name');
|
|
323
|
+
if (!WORKSPACE_FOLDER_NAME.test(name)) {
|
|
324
|
+
throw new RunnerError('workspace folder name must be lowercase letters, digits and dashes', RUNNER_ERROR_CODES.PATH_DENIED);
|
|
325
|
+
}
|
|
326
|
+
const dir = join(ctx.workspacesRoot ?? workspaceFolderRoot(ctx.config), name);
|
|
327
|
+
enforceWorkspaceFolderPolicy(ctx.config, dir);
|
|
328
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
329
|
+
return { cwd: await realpath(dir) };
|
|
330
|
+
}
|
|
271
331
|
// ── helpers ─────────────────────────────────────────────────────────
|
|
272
332
|
function requireWorkspace(req) {
|
|
273
333
|
if (!req.workspaceId) {
|