@floh-solutions/pharos-cli 0.31.0 → 0.32.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.
@@ -0,0 +1,327 @@
1
+ /**
2
+ * The Argus board socket — the route to a coding agent running in Navarch.
3
+ *
4
+ * ## Why there is a fourth route at all
5
+ *
6
+ * Terminal takes an Apple Event and VS Code takes a URI, because in both the
7
+ * thing that owns the terminal is the application. Navarch owns neither: a
8
+ * worker's PTY belongs to `argusd`, a daemon that outlives the app, and the
9
+ * app is what watches a screen settle before typing into it. So the delegation
10
+ * goes over `argusd`'s own socket as one verb — `delegate` — and the two
11
+ * halves split where the knowledge is: the daemon validates and does the find,
12
+ * the app starts a worker if there is none, waits for a screen that can take
13
+ * text, types, and reports back.
14
+ *
15
+ * The contract is `docs/delegation-plan.md` in the argus repo (board #1378).
16
+ * Everything below was measured against an isolated `argusd` built from argus
17
+ * master `2aaefd3` on 2026-09-11; the fixtures in `test/argus.test.ts` are that
18
+ * daemon's replies verbatim.
19
+ *
20
+ * ## Spoken directly, not through `argus-board`
21
+ *
22
+ * `~/.config/argus/bin/argus-board` frames exactly this — one newline-
23
+ * terminated JSON object in, one line back — and shelling out to it would have
24
+ * been half the code. It is wrong here for one measured reason: **that script
25
+ * stamps the CALLER'S identity onto every request**, from the environment.
26
+ * `_agent` from `$ARGUS_AGENT`, `_worker` from `$ARGUS_WORKER`, plus `_sub`,
27
+ * `_persona` and `_mission`. A `pharos delegate` run inside an Argus worker —
28
+ * which is precisely where Pharos.app's Ask Agent runs it — would therefore
29
+ * raise an approval card naming that worker, and file the ledger entry and the
30
+ * outcome note under it. The card is the whole point of the dial: it has to
31
+ * read *Pharos wants to hand work to a claude worker in …*, which is a
32
+ * question a person can answer.
33
+ *
34
+ * Speaking the socket means exactly the keys below travel, and nothing this
35
+ * process happens to have been started with. It also lets a park hold for the
36
+ * daemon's full wait (the script's own deadline is `wait + 5`, tuned for the
37
+ * board's reads) and keeps a transport failure distinguishable from a refusal,
38
+ * which a script that prints one line for both cannot be.
39
+ *
40
+ * ## `ARGUS_BOARD_SOCK` is honoured
41
+ *
42
+ * The same variable `argus-board` reads. It is how an isolated daemon is
43
+ * reached, and a session pointed at one should not have this verb quietly
44
+ * talking to the live fleet instead.
45
+ */
46
+ /** Where `argusd` binds its board socket, unless the environment says otherwise. */
47
+ export declare function argusSocketPath(env?: NodeJS.ProcessEnv): string;
48
+ /**
49
+ * The kinds `delegate` will type a prompt at, as the wire spells them.
50
+ *
51
+ * A shell is deliberately not one: a delegation is a prompt, and typed at a
52
+ * bare shell it is a command. `claude` and `codex` are the two this CLI's
53
+ * `--agent` offers; `antigravity` exists on the wire and has no `--agent` yet.
54
+ */
55
+ export type ArgusKind = "claude" | "codex" | "antigravity";
56
+ /** The one-line limit the daemon holds `text` to (`BoardStore.sendTextLimit`). */
57
+ export declare const ARGUS_TEXT_LIMIT = 4000;
58
+ /**
59
+ * How long to ask the daemon to park, in seconds.
60
+ *
61
+ * **60, always, and never the default 10.** Two measured reasons. A delegation
62
+ * onto an empty folder has to start a worker and wait out a cold agent's first
63
+ * screen — `FleetControl.delegateSpawnWindow` is 45s — so a ten-second answer
64
+ * is `pending` with the real outcome landing half a minute later in a reply
65
+ * nobody is reading. And on the default autonomy dial the first hand-off on a
66
+ * machine raises an approval card, which answers `pending` the instant it goes
67
+ * up whatever the wait is; the wait is what catches the person who clicks
68
+ * *Allow* straight away, and ten seconds does not.
69
+ *
70
+ * 60 is also the daemon's ceiling (`maxFleetWait`), so this is "as long as it
71
+ * will hold", not a number picked here.
72
+ */
73
+ export declare const ARGUS_WAIT_SECONDS = 60;
74
+ /** What the request is stamped with. The card names this; an anonymous one reads "A program outside the fleet". */
75
+ export declare const ARGUS_AGENT = "Pharos";
76
+ /**
77
+ * One reply off the socket, decoded no further than `ok`.
78
+ *
79
+ * `reason` is `null` rather than absent when the key was not there, because
80
+ * **that absence is the single most important fact on this wire** — see
81
+ * {@link mapRefusal}.
82
+ */
83
+ export interface ArgusSuccess {
84
+ ok: true;
85
+ data: Record<string, unknown>;
86
+ }
87
+ export interface ArgusRefusal {
88
+ ok: false;
89
+ reason: string | null;
90
+ error: string;
91
+ data: Record<string, unknown> | null;
92
+ }
93
+ export type ArgusReply = ArgusSuccess | ArgusRefusal;
94
+ /**
95
+ * Decode one line. Anything that is not a JSON object with a boolean-ish `ok`
96
+ * is a transport fault rather than an answer, and is reported as one.
97
+ */
98
+ export declare function parseArgusReply(line: string): ArgusReply | null;
99
+ /**
100
+ * The socket was there and the conversation still failed — a park that outlived
101
+ * its own deadline, a daemon that closed mid-answer, a line that is not JSON.
102
+ *
103
+ * Separate from a refusal on purpose: a refusal is a fact about this machine
104
+ * with a fix on it, and this is the CLI's ordinary failure.
105
+ */
106
+ export declare class ArgusTransportError extends Error {
107
+ readonly code: string;
108
+ constructor(message: string, code: string);
109
+ }
110
+ /** Nothing is listening: the socket file is absent, or the connect was refused. */
111
+ export declare class ArgusUnreachableError extends Error {
112
+ readonly code: string;
113
+ readonly socketPath: string;
114
+ constructor(message: string, code: string, socketPath: string);
115
+ }
116
+ /** The machine-facing half, injectable so every shape below is testable without a daemon. */
117
+ export interface ArgusDeps {
118
+ /** One request, one reply line. Throws {@link ArgusUnreachableError} or {@link ArgusTransportError}. */
119
+ ask: (request: Record<string, unknown>, timeoutMs: number) => Promise<string>;
120
+ }
121
+ export declare function systemArgusDeps(env?: NodeJS.ProcessEnv): ArgusDeps;
122
+ /**
123
+ * The refusal ids this route adds to `delegate`'s closed set.
124
+ *
125
+ * Every one names a DIFFERENT fix, which is the whole reason they are told
126
+ * apart — the app renders a fact and the fix beside it, and two states that
127
+ * share a word send somebody to the wrong Settings pane. `unsupported` and
128
+ * `folder-missing` are not here because the verb already has them and they
129
+ * mean the same thing on this route.
130
+ */
131
+ export declare const ARGUS_REASONS: readonly ["argusd-not-running", "argusd-outdated", "navarch-not-running", "not-an-operator", "rate-limited", "declined", "delivery-failed", "request-unknown", "argus-refused"];
132
+ export type ArgusReason = (typeof ARGUS_REASONS)[number];
133
+ /** What a delegation is, at whatever point it has got to. */
134
+ export interface ArgusDelegation {
135
+ /** `pending` is a real answer: a card is up, or the app has not reported yet. */
136
+ action: "sent" | "launched" | "pending";
137
+ /** The id `--status` asks about. */
138
+ request: string;
139
+ /** **Absent until there is one.** `null` means "we have not got a worker yet", never "the empty string". */
140
+ worker: string | null;
141
+ name: string | null;
142
+ created: boolean;
143
+ kind: string;
144
+ directory: string;
145
+ /** The remote host a worker lives on; empty for this Mac. */
146
+ host: string;
147
+ /** The hidden scratch pad the delegation is recorded on. */
148
+ todo: number | null;
149
+ /** Prose for a person. The app renders this. */
150
+ detail: string;
151
+ }
152
+ export interface ArgusFailure {
153
+ reason: ArgusReason | "unsupported" | "folder-missing";
154
+ detail: string;
155
+ /** What the daemon actually said. Kept so a reason this pharos does not know is still diagnosable. */
156
+ argus: {
157
+ reason: string | null;
158
+ error: string;
159
+ };
160
+ /** The delegation row, on the refusals that carry one — `declined` and `failed` both do. */
161
+ delegation?: ArgusDelegation;
162
+ }
163
+ /**
164
+ * Generic over what it is paired with, because three different reads return
165
+ * "the thing, or the refusal that stopped it": a delegation, a fleet, a list.
166
+ */
167
+ export declare function isFailure<T extends object>(value: T | ArgusFailure): value is ArgusFailure;
168
+ /**
169
+ * The delegation inside a reply, or the refusal it is instead.
170
+ *
171
+ * One function for all three answers — `delegate`, the end of its park and
172
+ * `delegate_status` — because the daemon builds all three from one builder and
173
+ * a caller that parsed them separately would be inventing a difference.
174
+ */
175
+ export declare function readDelegation(reply: ArgusReply): ArgusDelegation | ArgusFailure;
176
+ /**
177
+ * A refusal, as an id this CLI's caller already renders.
178
+ *
179
+ * ## The rule that matters: **no `reason` key is an OLD DAEMON**
180
+ *
181
+ * `reason` arrived with `delegate` itself, so an `argusd` too old to serve the
182
+ * verb is also too old to stamp one. That is not a corner — it is the first
183
+ * thing this route meets on any machine whose daemon has not been reloaded,
184
+ * which on the machine this was written on was every machine the day it
185
+ * landed. And an old daemon says three different things, two of which accuse
186
+ * this CLI of a bug it does not have (measured against argus `2fa7bf0`, the
187
+ * commit before the verb):
188
+ *
189
+ * | what is attached | what comes back, with no `reason` |
190
+ * |---|---|
191
+ * | old daemon, old app or none | `unknown op 'delegate' — see argus-board help …` |
192
+ * | old daemon, **new Navarch publishing `delegate`** | `delegate requires a "todo" (id) — the work it serves` |
193
+ * | …the same, unstamped | `'delegate' is an Argus Agent action — this session was not started as one. …` |
194
+ *
195
+ * The middle row is the trap: an old daemon forwards any verb the app claims
196
+ * it can run, and that forwarder demands the `todo` this verb exists to
197
+ * remove. A caller that believed the prose would go and add one. So the test
198
+ * is the MISSING KEY and never the wording — the wording only chooses how
199
+ * sharply the detail can put it. A current daemon stamps a reason on every
200
+ * refusal, and argus asserts that in `Tests/delegate_test.py` precisely so this
201
+ * inference stays true.
202
+ */
203
+ export declare function mapRefusal(reply: ArgusRefusal): ArgusFailure;
204
+ /** What a delegation asks for. Nothing else reaches the wire. */
205
+ export interface DelegateJob {
206
+ /** Absolute, and already canonicalised — the daemon's compare resolves system symlinks only. */
207
+ directory: string;
208
+ kind: ArgusKind;
209
+ /** ONE line. */
210
+ text: string;
211
+ /** Seconds to park. Defaults to {@link ARGUS_WAIT_SECONDS}. */
212
+ wait?: number;
213
+ }
214
+ /**
215
+ * The request, built in one place.
216
+ *
217
+ * `host`, `name`, `stage` and `project` are deliberately never sent. `host`
218
+ * would name a remote machine and this CLI's `--host` means the application, so
219
+ * spelling one here would be a collision waiting to pick the wrong worker;
220
+ * `name` names a NEW worker, which Navarch derives better than a caller can;
221
+ * `project` and `stage` belong to a board this delegation does not have.
222
+ */
223
+ export declare function delegateRequest(job: DelegateJob): Record<string, unknown>;
224
+ export declare function delegateStatusRequest(request: string, wait?: number): Record<string, unknown>;
225
+ export declare function fleetStatusRequest(): Record<string, unknown>;
226
+ /**
227
+ * How long to wait on the socket for a park of `wait` seconds.
228
+ *
229
+ * The daemon has to notice its own deadline and write a reply after it, so the
230
+ * read has to outlast the park or every timed-out delegation reads as a broken
231
+ * socket. Ten seconds of margin, the same shape `argus-board` uses (it allows
232
+ * five, for reads that are not parked on a person).
233
+ */
234
+ export declare function readTimeoutMs(waitSeconds: number): number;
235
+ export declare function askArgus(deps: ArgusDeps, request: Record<string, unknown>, timeoutMs: number): Promise<ArgusReply>;
236
+ /** The refusal for a socket nothing is listening on. */
237
+ export declare function unreachable(error: ArgusUnreachableError): ArgusFailure;
238
+ /**
239
+ * One worker as `fleet_status` reports it (`FleetWorkerStatus.boardRow`).
240
+ *
241
+ * Only the fields the find and a menu row need. `todo` is the mission a worker
242
+ * is holding — see {@link eligible} for why it is a weaker signal here than it
243
+ * is inside the daemon.
244
+ */
245
+ export interface ArgusWorker {
246
+ id: string;
247
+ name: string;
248
+ kind: string;
249
+ /** `waiting`, `working`, `starting`, `exited`, … — the daemon's own words. */
250
+ status: string;
251
+ /** What it is doing, in its own words. Often empty. */
252
+ stage: string;
253
+ directory: string;
254
+ /** The remote machine it runs on; empty for this Mac. */
255
+ host: string;
256
+ /** The mission todo it is holding, when the board still has that row. */
257
+ todo: number | null;
258
+ /** True for an Argus Agent — an operator, which a delegation must never land in. */
259
+ fleet: boolean;
260
+ }
261
+ export declare function parseFleet(reply: ArgusSuccess): ArgusWorker[];
262
+ /**
263
+ * Is this worker a candidate for a delegation onto `directory`?
264
+ *
265
+ * `BoardStore.delegateTarget`, rule for rule. Two of the five exclusions are
266
+ * the interesting ones, and both look like perfectly good targets from here:
267
+ *
268
+ * - **a mission worker** runs in a shared base checkout and would match, and
269
+ * typing an unrelated work item into an agent mid-branch derails the todo it
270
+ * is holding;
271
+ * - **an Argus Agent** is a claude worker with no mission sitting in a base
272
+ * checkout — which is exactly the folder a person links in Pharos. A
273
+ * delegation landing there hands the work item to the thing that *drives* the
274
+ * fleet, in the session whose next turn can start missions and type into
275
+ * every other worker.
276
+ *
277
+ * **Mission-hood is weaker here than it is inside the daemon**, and the
278
+ * difference is worth knowing. The daemon tests `missionTodo` on the worker
279
+ * itself; `fleet_status` only writes `todo` onto the row when the board still
280
+ * holds that todo, so a mission whose todo was deleted reads as free here and
281
+ * is excluded there. The direction of the error is the safe one — this can
282
+ * only list or predict a worker the daemon would decline to use, never hide
283
+ * one it would pick — but it is why a prediction is all this is, and why the
284
+ * send itself never names a worker: the daemon does the find that counts.
285
+ */
286
+ export declare function eligible(worker: ArgusWorker, kind: ArgusKind, directory: string): boolean;
287
+ /**
288
+ * Two spellings of one folder.
289
+ *
290
+ * The daemon compares `standardizingPath` on both sides, which expands `~`,
291
+ * drops `.`/`..` and a trailing slash and resolves the symlinked prefixes
292
+ * macOS ships (`/tmp` → `/private/tmp`) — but NOT an arbitrary symlink
293
+ * somebody made. That is why the caller canonicalises the folder with
294
+ * `realpath` before it gets here, the same way the Terminal route does; this
295
+ * is the rest of the daemon's normalisation, and it is case-insensitive
296
+ * because `caseInsensitiveCompare` is what the daemon uses.
297
+ */
298
+ export declare function sameFolder(a: string, b: string): boolean;
299
+ /**
300
+ * The candidates for a delegation onto `directory`, in the order the daemon
301
+ * would pick them. `[0]` is the worker a plain delegate takes.
302
+ *
303
+ * **The tie-break is the id and never the status**, because two calls a second
304
+ * apart must pick the same pane. A worker that has not painted yet is worst —
305
+ * there is no box to type into — and everything else is equal, so `starting`
306
+ * sinks and the rest sort on a uuid that never changes.
307
+ */
308
+ export declare function rankWorkers(workers: readonly ArgusWorker[], kind: ArgusKind, directory: string): ArgusWorker[];
309
+ /**
310
+ * The read that answers "has this argusd been reloaded since `delegate`
311
+ * landed?" without delegating anything.
312
+ *
313
+ * `delegate_status` is a pure read of the daemon's own table — not gated, not
314
+ * rate-limited, and about an id it minted — so asking it about one that cannot
315
+ * exist costs nothing and changes nothing. A current daemon answers
316
+ * `unknown-request`; one that predates the verb answers `unknown op
317
+ * 'delegate_status'` with no `reason` at all, which is the same tell the send
318
+ * path uses.
319
+ *
320
+ * It earns its round trip on `--list` and `--dry-run`, which otherwise read
321
+ * `fleet_status` — a verb every generation of the daemon serves — and would
322
+ * cheerfully list workers that a send is about to refuse to deliver to.
323
+ */
324
+ export declare const PROBE_REQUEST = "00000000-0000-0000-0000-000000000000";
325
+ /** True when the reply says this daemon knows the delegate family. */
326
+ export declare function servesDelegate(reply: ArgusReply): boolean;
327
+ //# sourceMappingURL=argus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argus.d.ts","sourceRoot":"","sources":["../../src/delegate/argus.ts"],"names":[],"mappings":"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"}