sessionpipe 0.6.1 → 0.7.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 +16 -1
- package/dist/cli.js +1819 -1223
- package/dist/cli.js.map +4 -4
- package/dist/control/aliases.d.ts +15 -0
- package/dist/control/aliases.d.ts.map +1 -0
- package/dist/control/cli.d.ts.map +1 -1
- package/dist/control/daemon.d.ts +50 -10
- package/dist/control/daemon.d.ts.map +1 -1
- package/dist/control/pair.d.ts +2 -0
- package/dist/control/pair.d.ts.map +1 -1
- package/dist/control/route.d.ts +5 -2
- package/dist/control/route.d.ts.map +1 -1
- package/dist/hook.js +1 -1
- package/dist/index.js +69 -41
- package/dist/index.js.map +4 -4
- package/dist/run.d.ts.map +1 -1
- package/dist/worker.js +73 -45
- package/dist/worker.js.map +4 -4
- package/package.json +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface Alias {
|
|
2
|
+
/** The harness's own session id. */
|
|
3
|
+
id: string;
|
|
4
|
+
/** The folder the session runs in (the start's). */
|
|
5
|
+
cwd: string;
|
|
6
|
+
at: string;
|
|
7
|
+
}
|
|
8
|
+
export type Aliases = Record<string, Alias>;
|
|
9
|
+
export declare const aliasFile: (controlDir: string) => string;
|
|
10
|
+
export declare function readAliases(file: string): Aliases;
|
|
11
|
+
/** Written whole and renamed into place, 0600 in a 0700 folder. */
|
|
12
|
+
export declare function writeAliases(file: string, all: Aliases): void;
|
|
13
|
+
/** The command's id a harness's own session goes by, or null when it was never renamed. */
|
|
14
|
+
export declare function receiverIdOf(all: Aliases, harness: string, id: string): string | null;
|
|
15
|
+
//# sourceMappingURL=aliases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/control/aliases.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,KAAK;IACpB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AACD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE5C,eAAO,MAAM,SAAS,GAAI,YAAY,MAAM,KAAG,MAA+C,CAAC;AAE/F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcjD;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAQ7D;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/control/cli.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/control/cli.ts"],"names":[],"mappings":"AAKA,OAAO,EASL,KAAK,IAAI,EAEV,MAAM,mBAAmB,CAAC;AAiB3B,eAAO,MAAM,YAAY,2YAGkE,CAAC;AAiC5F,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2H3G;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,CAK3F;AA+GD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CASvF;AAED;;oCAEoC;AACpC,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CASjH"}
|
package/dist/control/daemon.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { claudeControl } from "@sessionpipe/core";
|
|
1
|
+
import { claudeControl, type Login, type RunOptions, type RunResult } from "@sessionpipe/core";
|
|
2
2
|
import { type ControlConfig, type PairedReceiver } from "./store.js";
|
|
3
3
|
type Caps = claudeControl.Caps;
|
|
4
|
-
type RunResult = claudeControl.RunResult;
|
|
5
|
-
type Login = claudeControl.Login;
|
|
6
4
|
/** The message as the receiver carried it (control.json). */
|
|
7
5
|
export interface Carried {
|
|
8
6
|
id: string;
|
|
@@ -54,12 +52,16 @@ export interface DaemonDeps {
|
|
|
54
52
|
bin: string;
|
|
55
53
|
caps: Caps;
|
|
56
54
|
} | null;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
55
|
+
/** Codex CLI's `codex` and Antigravity's `agy` on this machine (null: not installed).
|
|
56
|
+
* Absent: this daemon doesn't drive that harness. */
|
|
57
|
+
codex?: () => string | null;
|
|
58
|
+
agy?: () => string | null;
|
|
59
|
+
/** Is Codex signed in as this process sees it? Asked before a run. */
|
|
60
|
+
codexLogin?: (bin: string) => Promise<Login>;
|
|
61
|
+
/** The harnesses every hello advertises (core's drivableHarnesses); by default, the
|
|
62
|
+
* ones the finders above find. */
|
|
63
|
+
harnesses?: () => string[];
|
|
64
|
+
run: (bin: string, args: string[], o: RunOptions) => Promise<RunResult>;
|
|
63
65
|
sdk?: SdkHost | null;
|
|
64
66
|
/** How long to follow a live session's turn for an in-place answer (tests shorten it). */
|
|
65
67
|
answerWaitMs?: number;
|
|
@@ -177,6 +179,12 @@ export declare class ControlDaemon {
|
|
|
177
179
|
/** Every open local connection: stop() ends them, or the server's close would wait
|
|
178
180
|
* on a client that never says anything. */
|
|
179
181
|
private readonly conns;
|
|
182
|
+
/** Codex and Antigravity sessions the daemon started, under the start's id (aliases.ts). */
|
|
183
|
+
private aliases;
|
|
184
|
+
/** Starts in hand, by the session they name, from the moment they arrive: a prompt
|
|
185
|
+
* for that session that came in the same poll waits for its start rather than
|
|
186
|
+
* finding no session (2026-10-04: a start and a prompt queued back to back). */
|
|
187
|
+
private readonly startsPending;
|
|
180
188
|
constructor(cfg: ControlConfig, dir: string, sock: string, deps: DaemonDeps);
|
|
181
189
|
start(): Promise<void>;
|
|
182
190
|
/** `leaveSocket`: the socket path is another daemon's now. Closing a Unix-socket
|
|
@@ -221,9 +229,26 @@ export declare class ControlDaemon {
|
|
|
221
229
|
private flushing;
|
|
222
230
|
private flushAcks;
|
|
223
231
|
handle(r: PairedReceiver, m: Carried): Promise<void>;
|
|
232
|
+
private handleVerified;
|
|
224
233
|
/** Where the session lives, and whether its folder is allowed — read from the
|
|
225
|
-
* session's own transcript (Claude Code)
|
|
234
|
+
* session's own transcript (Claude Code, Codex), the folder its start recorded, or
|
|
235
|
+
* the hooks' cwd, never the command. */
|
|
226
236
|
private place;
|
|
237
|
+
/** A Codex or Antigravity session: one the daemon started is its alias (the harness's
|
|
238
|
+
* id and the start's folder); one the hooks reported is Codex's rollout (its
|
|
239
|
+
* `session_meta` cwd) or, for Antigravity, the folder its hooks gave. */
|
|
240
|
+
private placeDriven;
|
|
241
|
+
/** The folder the worker recorded for a session from its hooks (run.ts, facts). */
|
|
242
|
+
private factsCwd;
|
|
243
|
+
private aliasOf;
|
|
244
|
+
/** The harness revealed its own id for a session the command named: from now on that
|
|
245
|
+
* is where the command's id leads (aliases.ts). Written before anything else reads it. */
|
|
246
|
+
private setAlias;
|
|
247
|
+
/** `<harness>:<harness's id>` → `<harness>:<the start's id>` for a session the daemon named. */
|
|
248
|
+
private named;
|
|
249
|
+
private driver;
|
|
250
|
+
/** The harnesses this machine can run a message in, for hello. */
|
|
251
|
+
private harnesses;
|
|
227
252
|
private allowed;
|
|
228
253
|
private permission;
|
|
229
254
|
private cancel;
|
|
@@ -236,6 +261,18 @@ export declare class ControlDaemon {
|
|
|
236
261
|
/** Null when Claude Code is signed in for this account (or can't say); otherwise what
|
|
237
262
|
* to tell the person. */
|
|
238
263
|
private loginProblem;
|
|
264
|
+
/** One harness account's login, asked at most every 10 minutes (30 s after a no). */
|
|
265
|
+
private signedIn;
|
|
266
|
+
/** Null when a Codex or Antigravity run may go ahead; otherwise what to tell the person. */
|
|
267
|
+
private drivenProblem;
|
|
268
|
+
/** A Codex or Antigravity session's next message: a headless turn resumed under the
|
|
269
|
+
* harness's own id, after any run of the daemon's own that holds it. */
|
|
270
|
+
private resumeDriven;
|
|
271
|
+
/** Run one Codex or Antigravity turn and ack it: `progress` as its answer grows, then
|
|
272
|
+
* `delivered` (mode `resume`) with the reply. The moment the harness names the session
|
|
273
|
+
* — a start's new one, or a fresh one for an id it didn't know — the command's id
|
|
274
|
+
* becomes its alias, so the next message resumes it. */
|
|
275
|
+
private drive;
|
|
239
276
|
private headless;
|
|
240
277
|
private outcome;
|
|
241
278
|
private addKey;
|
|
@@ -258,6 +295,9 @@ export declare class ControlDaemon {
|
|
|
258
295
|
private slot;
|
|
259
296
|
private startSession;
|
|
260
297
|
private startOne;
|
|
298
|
+
/** A new Codex or Antigravity session: the harness picks its id, and the start's id
|
|
299
|
+
* becomes its name (aliases.ts) as soon as the run says what it picked. */
|
|
300
|
+
private startDriven;
|
|
261
301
|
private closeIdleSdk;
|
|
262
302
|
}
|
|
263
303
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/control/daemon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/control/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/control/pair.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export interface PairOptions {
|
|
|
14
14
|
env?: NodeJS.ProcessEnv;
|
|
15
15
|
/** Called with a sessions key the receiver handed over at pairing. */
|
|
16
16
|
addSink?: (token: string) => void;
|
|
17
|
+
/** The harnesses this machine can run a message in (default: those installed here). */
|
|
18
|
+
harnesses?: string[];
|
|
17
19
|
}
|
|
18
20
|
export declare function discover(url: string, f: typeof fetch): Promise<{
|
|
19
21
|
control: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/control/pair.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/control/pair.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,aAAa,EAMnB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ;;8CAE0C;IAC1C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAUD,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,CAAC,EAAE,OAAO,KAAK,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAkBlF;AAED,uFAAuF;AACvF,wBAAsB,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA+FjE;AAED,gFAAgF;AAChF,wBAAsB,GAAG,CAAC,CAAC,EAAE;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,iCAaA;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAWrE;AAOD;;qFAEqF;AACrF,wBAAgB,YAAY,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;EAsC3F;AAED,MAAM,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;AAI3D;;;uEAGuE;AACvE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,IAAgB,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAiBhG;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC5B,GAAG,MAAM,CAqCT;AAED,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAiB9D"}
|
package/dist/control/route.d.ts
CHANGED
|
@@ -10,9 +10,9 @@ export interface SessionView {
|
|
|
10
10
|
midTurn: boolean;
|
|
11
11
|
/** A live process holds the session (registry entry or a fresh transcript write). */
|
|
12
12
|
live: boolean;
|
|
13
|
-
/** The transcript exists on this machine. */
|
|
13
|
+
/** The transcript exists on this machine (Codex, Antigravity: the session was placed). */
|
|
14
14
|
known: boolean;
|
|
15
|
-
/** This Claude Code can copy a session (`--fork-session`). */
|
|
15
|
+
/** This Claude Code can copy a session (`--fork-session`); no other harness can. */
|
|
16
16
|
canFork: boolean;
|
|
17
17
|
/** The harness has an input API (OpenCode, Codex app-server) — none is wired yet. */
|
|
18
18
|
api: boolean;
|
|
@@ -24,6 +24,9 @@ export type Route = {
|
|
|
24
24
|
} | {
|
|
25
25
|
refused: "no_session";
|
|
26
26
|
};
|
|
27
|
+
/** The harnesses the daemon can run a turn of by itself: resume an idle session, start a
|
|
28
|
+
* new one (`claude -p`, `codex exec`, `agy -p`). */
|
|
29
|
+
export declare const HEADLESS: Set<string>;
|
|
27
30
|
/** Where a prompt (or a start) goes. Never two writers on one transcript: a live
|
|
28
31
|
* session gets a fork, never a resume. */
|
|
29
32
|
export declare function routePrompt(s: SessionView): Route;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/control/route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEjF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,GAAG,EAAE,OAAO,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,IAAI,EAAE,OAAO,CAAC;IACd,
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/control/route.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEjF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,GAAG,EAAE,OAAO,CAAC;IACb,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,IAAI,EAAE,OAAO,CAAC;IACd,0FAA0F;IAC1F,KAAK,EAAE,OAAO,CAAC;IACf,oFAAoF;IACpF,OAAO,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC;AAEjG;qDACqD;AACrD,eAAO,MAAM,QAAQ,aAAmD,CAAC;AAEzE;2CAC2C;AAC3C,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,GAAG,KAAK,CAejD;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CACtB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,GACd,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAaxE;AAED;+BAC+B;AAC/B;;qFAEqF;AACrF,eAAO,MAAM,eAAe,6KACgJ,CAAC;AAE7K,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED;;;;mDAImD;AACnD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMjE"}
|
package/dist/hook.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// sessionpipe 0.
|
|
1
|
+
// sessionpipe 0.7.0 · Apache-2.0 · https://sessionpipe.org
|
|
2
2
|
|
|
3
3
|
// src/http-sink.ts
|
|
4
4
|
import { createHash, createHmac } from "node:crypto";
|
|
@@ -92,16 +92,16 @@ var HttpSink = class {
|
|
|
92
92
|
import {
|
|
93
93
|
appendFileSync as appendFileSync3,
|
|
94
94
|
existsSync as existsSync8,
|
|
95
|
-
mkdirSync as
|
|
95
|
+
mkdirSync as mkdirSync8,
|
|
96
96
|
readdirSync as readdirSync6,
|
|
97
|
-
readFileSync as
|
|
98
|
-
renameSync as
|
|
97
|
+
readFileSync as readFileSync9,
|
|
98
|
+
renameSync as renameSync3,
|
|
99
99
|
statSync as statSync5,
|
|
100
100
|
unlinkSync as unlinkSync4,
|
|
101
|
-
writeFileSync as
|
|
101
|
+
writeFileSync as writeFileSync7
|
|
102
102
|
} from "node:fs";
|
|
103
103
|
import os3 from "node:os";
|
|
104
|
-
import
|
|
104
|
+
import path13 from "node:path";
|
|
105
105
|
|
|
106
106
|
// ../core/src/adapters/antigravity.ts
|
|
107
107
|
import {
|
|
@@ -289,6 +289,9 @@ function readClaude(lines, from) {
|
|
|
289
289
|
}
|
|
290
290
|
return pairTurns(msgs, endOf(lines));
|
|
291
291
|
}
|
|
292
|
+
function codexInjected(text) {
|
|
293
|
+
return /^<[a-z_-]+>/i.test(text) || /^# AGENTS\.md instructions\b/i.test(text);
|
|
294
|
+
}
|
|
292
295
|
function readCodex(lines, from) {
|
|
293
296
|
const msgs = [];
|
|
294
297
|
for (let i = from; i < lines.length; i++) {
|
|
@@ -300,7 +303,7 @@ function readCodex(lines, from) {
|
|
|
300
303
|
const text = textParts(p.content, ["input_text", "output_text"]).trim();
|
|
301
304
|
if (!text) continue;
|
|
302
305
|
if (p.role === "user") {
|
|
303
|
-
if (
|
|
306
|
+
if (codexInjected(text)) continue;
|
|
304
307
|
msgs.push({ role: "user", text, at, line: i });
|
|
305
308
|
} else if (p.role === "assistant") msgs.push({ role: "assistant", text, at, line: i });
|
|
306
309
|
}
|
|
@@ -1538,7 +1541,8 @@ function uninstallNotify(env) {
|
|
|
1538
1541
|
}
|
|
1539
1542
|
return { file, changed: false };
|
|
1540
1543
|
}
|
|
1541
|
-
function findRollout(threadId, env) {
|
|
1544
|
+
function findRollout(threadId, env = process.env) {
|
|
1545
|
+
if (!/^[A-Za-z0-9-]{8,128}$/.test(threadId)) return null;
|
|
1542
1546
|
let best = null;
|
|
1543
1547
|
const walk = (dir, depth) => {
|
|
1544
1548
|
let names = [];
|
|
@@ -1549,7 +1553,7 @@ function findRollout(threadId, env) {
|
|
|
1549
1553
|
}
|
|
1550
1554
|
for (const n of names.sort().reverse()) {
|
|
1551
1555
|
const p = path6.join(dir, n);
|
|
1552
|
-
if (n.endsWith(
|
|
1556
|
+
if (n.endsWith(`-${threadId}.jsonl`)) {
|
|
1553
1557
|
best = p;
|
|
1554
1558
|
return;
|
|
1555
1559
|
}
|
|
@@ -1754,7 +1758,7 @@ function codexFacts(file) {
|
|
|
1754
1758
|
const p = j.payload;
|
|
1755
1759
|
if (j.type !== "response_item" || !p || p.type !== "message" || p.role !== "user") continue;
|
|
1756
1760
|
const text = (p.content ?? []).filter((b) => b && b.type === "input_text" && typeof b.text === "string").map((b) => b.text).join("\n").trim();
|
|
1757
|
-
if (!text ||
|
|
1761
|
+
if (!text || codexInjected(text)) continue;
|
|
1758
1762
|
const line = text.split("\n").find((l) => l.trim()) ?? "";
|
|
1759
1763
|
out.title = line.length > 80 ? `${line.slice(0, 80).replace(/\s+\S*$/, "")}\u2026` : line;
|
|
1760
1764
|
out.title_source = "first-ask";
|
|
@@ -2576,14 +2580,39 @@ var StdoutSink = class {
|
|
|
2576
2580
|
}
|
|
2577
2581
|
};
|
|
2578
2582
|
|
|
2583
|
+
// src/control/aliases.ts
|
|
2584
|
+
import { chmodSync as chmodSync2, mkdirSync as mkdirSync7, readFileSync as readFileSync8, renameSync as renameSync2, writeFileSync as writeFileSync6 } from "node:fs";
|
|
2585
|
+
import path11 from "node:path";
|
|
2586
|
+
var aliasFile = (controlDir) => path11.join(controlDir, "aliases.json");
|
|
2587
|
+
function readAliases(file) {
|
|
2588
|
+
try {
|
|
2589
|
+
const j = JSON.parse(readFileSync8(file, "utf8"));
|
|
2590
|
+
if (!j || typeof j !== "object" || Array.isArray(j)) return {};
|
|
2591
|
+
const out = {};
|
|
2592
|
+
for (const [k, v] of Object.entries(j)) {
|
|
2593
|
+
const a = v;
|
|
2594
|
+
if (a && typeof a.id === "string" && a.id && typeof a.cwd === "string")
|
|
2595
|
+
out[k] = { id: a.id, cwd: a.cwd, at: typeof a.at === "string" ? a.at : "" };
|
|
2596
|
+
}
|
|
2597
|
+
return out;
|
|
2598
|
+
} catch {
|
|
2599
|
+
return {};
|
|
2600
|
+
}
|
|
2601
|
+
}
|
|
2602
|
+
function receiverIdOf(all, harness, id) {
|
|
2603
|
+
const prefix = `${harness}:`;
|
|
2604
|
+
for (const [k, a] of Object.entries(all)) if (a.id === id && k.startsWith(prefix)) return k.slice(prefix.length);
|
|
2605
|
+
return null;
|
|
2606
|
+
}
|
|
2607
|
+
|
|
2579
2608
|
// src/control/local.ts
|
|
2580
2609
|
import net from "node:net";
|
|
2581
2610
|
import os2 from "node:os";
|
|
2582
|
-
import
|
|
2611
|
+
import path12 from "node:path";
|
|
2583
2612
|
function socketPath(state, env = process.env) {
|
|
2584
2613
|
if (env.SESSIONPIPE_SOCKET) return env.SESSIONPIPE_SOCKET;
|
|
2585
2614
|
if (process.platform === "win32") return `\\\\.\\pipe\\sessionpipe-control-${os2.userInfo().username}`;
|
|
2586
|
-
return
|
|
2615
|
+
return path12.join(state, "control.sock");
|
|
2587
2616
|
}
|
|
2588
2617
|
function ask(sock, req, timeoutMs) {
|
|
2589
2618
|
return new Promise((resolve) => {
|
|
@@ -2647,16 +2676,16 @@ function sinkWithSecrets(s, run = defaultRunner) {
|
|
|
2647
2676
|
}
|
|
2648
2677
|
|
|
2649
2678
|
// src/run.ts
|
|
2650
|
-
async function tellDaemon(state, job, session, transcript) {
|
|
2679
|
+
async function tellDaemon(state, job, session, cwd, transcript) {
|
|
2651
2680
|
const sock = socketPath(state);
|
|
2652
2681
|
if (process.platform !== "win32" && !existsSync8(sock)) return;
|
|
2653
2682
|
await ask(
|
|
2654
2683
|
sock,
|
|
2655
2684
|
{
|
|
2656
2685
|
op: "event",
|
|
2657
|
-
session:
|
|
2686
|
+
session: `${job.harness}:${session}`,
|
|
2658
2687
|
event: job.event,
|
|
2659
|
-
cwd:
|
|
2688
|
+
...cwd ? { cwd } : {},
|
|
2660
2689
|
...transcript ? { transcript } : {}
|
|
2661
2690
|
},
|
|
2662
2691
|
300
|
|
@@ -2664,17 +2693,17 @@ async function tellDaemon(state, job, session, transcript) {
|
|
|
2664
2693
|
}
|
|
2665
2694
|
function enqueueJob(state, job) {
|
|
2666
2695
|
const jobs = jobsDir(state);
|
|
2667
|
-
|
|
2668
|
-
const f =
|
|
2669
|
-
|
|
2696
|
+
mkdirSync8(jobs, { recursive: true, mode: 448 });
|
|
2697
|
+
const f = path13.join(jobs, `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}.json`);
|
|
2698
|
+
writeFileSync7(f, JSON.stringify(job), { mode: 384 });
|
|
2670
2699
|
return f;
|
|
2671
2700
|
}
|
|
2672
2701
|
function log(state, line) {
|
|
2673
2702
|
try {
|
|
2674
|
-
|
|
2675
|
-
const f =
|
|
2703
|
+
mkdirSync8(state, { recursive: true, mode: 448 });
|
|
2704
|
+
const f = path13.join(state, "log");
|
|
2676
2705
|
try {
|
|
2677
|
-
if (statSync5(f).size > 1024 * 1024)
|
|
2706
|
+
if (statSync5(f).size > 1024 * 1024) renameSync3(f, `${f}.1`);
|
|
2678
2707
|
} catch {
|
|
2679
2708
|
}
|
|
2680
2709
|
appendFileSync3(f, `${(/* @__PURE__ */ new Date()).toISOString()} ${line}
|
|
@@ -2683,11 +2712,11 @@ function log(state, line) {
|
|
|
2683
2712
|
}
|
|
2684
2713
|
}
|
|
2685
2714
|
function factsState(state) {
|
|
2686
|
-
const file = (h, s) =>
|
|
2715
|
+
const file = (h, s) => path13.join(state, "facts", safeId(h), `${safeId(s)}.json`);
|
|
2687
2716
|
return {
|
|
2688
2717
|
get(h, s) {
|
|
2689
2718
|
try {
|
|
2690
|
-
return JSON.parse(
|
|
2719
|
+
return JSON.parse(readFileSync9(file(h, s), "utf8"));
|
|
2691
2720
|
} catch {
|
|
2692
2721
|
return {};
|
|
2693
2722
|
}
|
|
@@ -2696,8 +2725,8 @@ function factsState(state) {
|
|
|
2696
2725
|
const cur = this.get(h, s);
|
|
2697
2726
|
const next = { ...cur, ...patch };
|
|
2698
2727
|
if (JSON.stringify(next) === JSON.stringify(cur)) return;
|
|
2699
|
-
|
|
2700
|
-
|
|
2728
|
+
mkdirSync8(path13.dirname(file(h, s)), { recursive: true, mode: 448 });
|
|
2729
|
+
writeFileSync7(file(h, s), JSON.stringify(next), { mode: 384 });
|
|
2701
2730
|
}
|
|
2702
2731
|
};
|
|
2703
2732
|
}
|
|
@@ -2725,30 +2754,33 @@ async function runJob(job, opts = {}) {
|
|
|
2725
2754
|
if (!adapter) return { events: [], delivered: {} };
|
|
2726
2755
|
const r = adapter.fromHook({ argv: job.argv, stdin: job.stdin, env: { ...process.env, ...job.env }, cwd: job.cwd });
|
|
2727
2756
|
if (!r || !r.session.id) return { events: [], delivered: {} };
|
|
2728
|
-
|
|
2757
|
+
const id = receiverIdOf(readAliases(aliasFile(path13.join(state, "control"))), job.harness, r.session.id) ?? r.session.id;
|
|
2758
|
+
await tellDaemon(state, job, id, r.session.cwd, r.transcript);
|
|
2729
2759
|
const outbox = new Outbox(state);
|
|
2730
|
-
const ref = { harness: job.harness, session:
|
|
2760
|
+
const ref = { harness: job.harness, session: id };
|
|
2731
2761
|
let release = takeLock(state, ref);
|
|
2732
2762
|
for (let wait = 50; !release && wait <= 3200; wait *= 2) {
|
|
2733
2763
|
await new Promise((res) => setTimeout(res, wait));
|
|
2734
2764
|
release = takeLock(state, ref);
|
|
2735
2765
|
}
|
|
2736
2766
|
if (!release) {
|
|
2737
|
-
log(state, `${job.harness} ${job.event}: session ${
|
|
2767
|
+
log(state, `${job.harness} ${job.event}: session ${id} locked for 6 s, re-queued`);
|
|
2738
2768
|
enqueueJob(state, job);
|
|
2739
2769
|
return { events: [], delivered: {} };
|
|
2740
2770
|
}
|
|
2741
2771
|
try {
|
|
2742
2772
|
const facts = factsState(state);
|
|
2743
|
-
const mem = facts.get(job.harness,
|
|
2773
|
+
const mem = facts.get(job.harness, id);
|
|
2744
2774
|
const heavy = !/^(PreToolUse|PostToolUse|PostToolUseFailure|BeforeTool|AfterTool|PostInvocation)$/.test(job.event);
|
|
2745
2775
|
let learned = {};
|
|
2746
2776
|
if (heavy) {
|
|
2747
2777
|
const f = adapter.facts(r.session, r.transcript, r.hints ?? {}, facts);
|
|
2748
2778
|
const { started_at: _s, last_at: _l, first_ask: _fa, harness_version, ...rest } = f;
|
|
2749
2779
|
learned = rest;
|
|
2750
|
-
if (harness_version) facts.save(job.harness,
|
|
2751
|
-
facts.save(job.harness,
|
|
2780
|
+
if (harness_version) facts.save(job.harness, id, { harness_version });
|
|
2781
|
+
facts.save(job.harness, id, { session: { ...mem.session, ...learned } });
|
|
2782
|
+
if (job.harness === "antigravity" && r.session.cwd && path13.isAbsolute(r.session.cwd))
|
|
2783
|
+
facts.save(job.harness, id, { cwd: r.session.cwd });
|
|
2752
2784
|
}
|
|
2753
2785
|
const known = mem.session ?? {};
|
|
2754
2786
|
const cwdRaw = learned.cwd ?? r.session.cwd ?? known.cwd;
|
|
@@ -2758,13 +2790,13 @@ async function runJob(job, opts = {}) {
|
|
|
2758
2790
|
...learned,
|
|
2759
2791
|
...git,
|
|
2760
2792
|
...learned.branch ? { branch: learned.branch } : {},
|
|
2761
|
-
id
|
|
2793
|
+
id,
|
|
2762
2794
|
seq: 0,
|
|
2763
2795
|
machine: machineName(cfg, os3.hostname()),
|
|
2764
2796
|
...cwdRaw ? { cwd: tilde(cwdRaw) } : {},
|
|
2765
2797
|
...r.session.model ? { model: r.session.model } : {}
|
|
2766
2798
|
};
|
|
2767
|
-
const version = facts.get(job.harness,
|
|
2799
|
+
const version = facts.get(job.harness, id).harness_version ?? void 0;
|
|
2768
2800
|
const events = [];
|
|
2769
2801
|
for (const a of r.events) {
|
|
2770
2802
|
const e = makeEvent(a, {
|
|
@@ -2776,7 +2808,7 @@ async function runJob(job, opts = {}) {
|
|
|
2776
2808
|
}
|
|
2777
2809
|
const wantsTranscript = cfg.sinks.some((s) => !s.paused && Math.min(s.tier, s.max_tier ?? 3) >= 2);
|
|
2778
2810
|
if (wantsTranscript && r.transcript && r.events.some((e) => e.type === "turn.ended" || e.type === "session.ended")) {
|
|
2779
|
-
const cur = facts.get(job.harness,
|
|
2811
|
+
const cur = facts.get(job.harness, id);
|
|
2780
2812
|
const fromLine = Number(cur.transcript_line) || 0;
|
|
2781
2813
|
let turnNo = Number(cur.transcript_turns) || 0;
|
|
2782
2814
|
const read = adapter.readTranscript(r.transcript, fromLine);
|
|
@@ -2796,17 +2828,13 @@ async function runJob(job, opts = {}) {
|
|
|
2796
2828
|
)
|
|
2797
2829
|
);
|
|
2798
2830
|
}
|
|
2799
|
-
if (read.turns.length)
|
|
2800
|
-
facts.save(job.harness, r.session.id, { transcript_line: read.line, transcript_turns: turnNo });
|
|
2831
|
+
if (read.turns.length) facts.save(job.harness, id, { transcript_line: read.line, transcript_turns: turnNo });
|
|
2801
2832
|
}
|
|
2802
2833
|
outbox.append(
|
|
2803
2834
|
ref,
|
|
2804
2835
|
events.map((e) => ({ ...e, session: redactDeep(e.session), data: redactDeep(e.data) }))
|
|
2805
2836
|
);
|
|
2806
|
-
log(
|
|
2807
|
-
state,
|
|
2808
|
-
`${job.harness} ${job.event}: ${events.map((e) => e.type).join(",") || "nothing"} (${r.session.id.slice(0, 8)})`
|
|
2809
|
-
);
|
|
2837
|
+
log(state, `${job.harness} ${job.event}: ${events.map((e) => e.type).join(",") || "nothing"} (${id.slice(0, 8)})`);
|
|
2810
2838
|
const delivered = await flush(state, cfg.sinks, outbox, ref);
|
|
2811
2839
|
if (Math.random() < 0.02) outbox.prune(cfg.keep_days ?? 30);
|
|
2812
2840
|
return { events, delivered };
|
|
@@ -2897,7 +2925,7 @@ function applySinkVerdict(name, res) {
|
|
|
2897
2925
|
} catch {
|
|
2898
2926
|
}
|
|
2899
2927
|
}
|
|
2900
|
-
var jobsDir = (state) =>
|
|
2928
|
+
var jobsDir = (state) => path13.join(state, "jobs");
|
|
2901
2929
|
export {
|
|
2902
2930
|
HttpSink,
|
|
2903
2931
|
buildSinks,
|