@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.
- package/README.md +167 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +31 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/delegate.d.ts +77 -10
- package/dist/commands/delegate.d.ts.map +1 -1
- package/dist/commands/delegate.js +435 -33
- package/dist/commands/delegate.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +109 -11
- package/dist/commands/doctor.js.map +1 -1
- package/dist/delegate/argus.d.ts +327 -0
- package/dist/delegate/argus.d.ts.map +1 -0
- package/dist/delegate/argus.js +611 -0
- package/dist/delegate/argus.js.map +1 -0
- package/dist/delegate/vsix.d.ts +21 -0
- package/dist/delegate/vsix.d.ts.map +1 -1
- package/dist/delegate/vsix.js +34 -0
- package/dist/delegate/vsix.js.map +1 -1
- package/package.json +2 -2
- package/skill/SKILL.md +16 -5
- package/vscode/pharos-bridge.json +3 -3
- package/vscode/pharos-bridge.vsix +0 -0
|
@@ -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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"}
|