@parall/codex-agent 1.44.0 → 1.46.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/dist/app-server-process.d.ts +9 -0
- package/dist/app-server-process.d.ts.map +1 -0
- package/dist/app-server-process.js +58 -0
- package/dist/app-server-protocol.d.ts +19 -0
- package/dist/app-server-protocol.d.ts.map +1 -0
- package/dist/app-server-protocol.js +42 -0
- package/dist/dispatch.d.ts +88 -5
- package/dist/dispatch.d.ts.map +1 -1
- package/dist/dispatch.js +364 -196
- package/dist/index.js +27 -11
- package/dist/instructions-refresh.d.ts +136 -0
- package/dist/instructions-refresh.d.ts.map +1 -0
- package/dist/instructions-refresh.js +244 -0
- package/dist/jsonrpc-client.d.ts +49 -1
- package/dist/jsonrpc-client.d.ts.map +1 -1
- package/dist/jsonrpc-client.js +77 -5
- package/dist/legacy-workspace-config-migration.d.ts +112 -0
- package/dist/legacy-workspace-config-migration.d.ts.map +1 -0
- package/dist/legacy-workspace-config-migration.js +229 -0
- package/dist/server-requests.d.ts +10 -0
- package/dist/server-requests.d.ts.map +1 -0
- package/dist/server-requests.js +39 -0
- package/dist/session-manager.d.ts +12 -0
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +53 -3
- package/dist/turn-sink.d.ts +26 -0
- package/dist/turn-sink.d.ts.map +1 -0
- package/dist/turn-sink.js +45 -0
- package/dist/workspace.d.ts +23 -25
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +138 -138
- package/package.json +5 -5
- package/src/app-server-process.ts +59 -0
- package/src/app-server-protocol.ts +46 -0
- package/src/dispatch.ts +426 -204
- package/src/index.ts +35 -10
- package/src/instructions-refresh.ts +367 -0
- package/src/jsonrpc-client.ts +109 -7
- package/src/legacy-workspace-config-migration.ts +296 -0
- package/src/server-requests.ts +40 -0
- package/src/session-manager.ts +74 -6
- package/src/turn-sink.ts +54 -0
- package/src/workspace.ts +155 -155
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OS-level plumbing for the `codex app-server` child process: the cwd invariant
|
|
3
|
+
* it requires (a git repo), and the Windows spawn/kill quirks.
|
|
4
|
+
*/
|
|
5
|
+
export declare const IS_WIN32: boolean;
|
|
6
|
+
export declare function quoteWin32Arg(arg: string): string;
|
|
7
|
+
export declare function killWin32Tree(pid: number): boolean;
|
|
8
|
+
export declare function ensureGitRepo(workingDirectory: string): void;
|
|
9
|
+
//# sourceMappingURL=app-server-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-server-process.d.ts","sourceRoot":"","sources":["../src/app-server-process.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,eAAO,MAAM,QAAQ,SAA+B,CAAC;AAErD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAiC5D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import { ensureLocalAttachmentGitExclude } from '@parall/agent-core/internal/attachment-input';
|
|
4
|
+
/**
|
|
5
|
+
* OS-level plumbing for the `codex app-server` child process: the cwd invariant
|
|
6
|
+
* it requires (a git repo), and the Windows spawn/kill quirks.
|
|
7
|
+
*/
|
|
8
|
+
export const IS_WIN32 = process.platform === 'win32';
|
|
9
|
+
export function quoteWin32Arg(arg) {
|
|
10
|
+
if (!/[\s"&|^<>()]/.test(arg))
|
|
11
|
+
return arg;
|
|
12
|
+
return `"${arg.replace(/"/g, '""')}"`;
|
|
13
|
+
}
|
|
14
|
+
export function killWin32Tree(pid) {
|
|
15
|
+
try {
|
|
16
|
+
execSync(`taskkill /T /F /PID ${pid}`, { windowsHide: true, stdio: 'ignore' });
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function ensureGitRepo(workingDirectory) {
|
|
24
|
+
fs.mkdirSync(workingDirectory, { recursive: true });
|
|
25
|
+
// Only `git init` if the workspace isn't already inside any git repo. A
|
|
26
|
+
// bare existsSync(.git) check would miss the common case of a user pointing
|
|
27
|
+
// PRLL_WORKSPACE_DIR at a subdirectory of their existing project,
|
|
28
|
+
// and silently creating a nested repo there would mangle their layout.
|
|
29
|
+
//
|
|
30
|
+
// The exclude write sits inside this try, so in principle its failure would
|
|
31
|
+
// read as "not a repo" and fall through to `git init` in the user's existing
|
|
32
|
+
// repository. It cannot: the helper swallows its own errors. Deliberately left
|
|
33
|
+
// as-is rather than fixed under review — latent, not live, and out of this
|
|
34
|
+
// PR's scope: docs/tech-debt/codex-ensure-git-repo-exclude-coupling.md.
|
|
35
|
+
try {
|
|
36
|
+
execSync('git rev-parse --is-inside-work-tree', { cwd: workingDirectory, stdio: 'pipe' });
|
|
37
|
+
ensureLocalAttachmentGitExclude(workingDirectory);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Not inside a repo — fall through to init.
|
|
42
|
+
}
|
|
43
|
+
const env = {
|
|
44
|
+
...process.env,
|
|
45
|
+
GIT_AUTHOR_NAME: 'parall-codex-agent',
|
|
46
|
+
GIT_AUTHOR_EMAIL: 'agent@parall.local',
|
|
47
|
+
GIT_COMMITTER_NAME: 'parall-codex-agent',
|
|
48
|
+
GIT_COMMITTER_EMAIL: 'agent@parall.local',
|
|
49
|
+
};
|
|
50
|
+
try {
|
|
51
|
+
execSync('git init', { cwd: workingDirectory, stdio: 'pipe', env });
|
|
52
|
+
execSync('git commit --allow-empty -m init', { cwd: workingDirectory, stdio: 'pipe', env });
|
|
53
|
+
ensureLocalAttachmentGitExclude(workingDirectory);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Non-fatal: codex app-server may still accept a bare directory. Let it raise at turn time.
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PreparedLocalImage } from '@parall/agent-core/internal/attachment-input';
|
|
2
|
+
/**
|
|
3
|
+
* Wire shapes of the `codex app-server` JSON-RPC payloads: what we send as turn
|
|
4
|
+
* input, and how we read ids back out of responses and notifications. The
|
|
5
|
+
* protocol has shifted between CLI versions, so the tolerant field probing lives
|
|
6
|
+
* here rather than being spread through the adapter.
|
|
7
|
+
*/
|
|
8
|
+
export type CodexTurnInput = {
|
|
9
|
+
type: 'text';
|
|
10
|
+
text: string;
|
|
11
|
+
} | {
|
|
12
|
+
type: 'localImage';
|
|
13
|
+
path: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function buildTurnInput(body: string, images: PreparedLocalImage[]): CodexTurnInput[];
|
|
16
|
+
export declare function extractThreadId(result: unknown): string | undefined;
|
|
17
|
+
export declare function extractTurnId(result: unknown): string | undefined;
|
|
18
|
+
export declare function extractThreadIdFromNotification(params: unknown): string | undefined;
|
|
19
|
+
//# sourceMappingURL=app-server-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-server-protocol.d.ts","sourceRoot":"","sources":["../src/app-server-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAEvF;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,cAAc,EAAE,CAK3F;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOnE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOjE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CASnF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function buildTurnInput(body, images) {
|
|
2
|
+
return [
|
|
3
|
+
{ type: 'text', text: body },
|
|
4
|
+
...images.map((image) => ({ type: 'localImage', path: image.localPath })),
|
|
5
|
+
];
|
|
6
|
+
}
|
|
7
|
+
export function extractThreadId(result) {
|
|
8
|
+
if (!result || typeof result !== 'object')
|
|
9
|
+
return undefined;
|
|
10
|
+
const r = result;
|
|
11
|
+
if (typeof r.threadId === 'string')
|
|
12
|
+
return r.threadId;
|
|
13
|
+
const thread = r.thread;
|
|
14
|
+
if (thread && typeof thread.id === 'string')
|
|
15
|
+
return thread.id;
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
export function extractTurnId(result) {
|
|
19
|
+
if (!result || typeof result !== 'object')
|
|
20
|
+
return undefined;
|
|
21
|
+
const r = result;
|
|
22
|
+
if (typeof r.turnId === 'string')
|
|
23
|
+
return r.turnId;
|
|
24
|
+
const turn = r.turn;
|
|
25
|
+
if (turn && typeof turn.id === 'string')
|
|
26
|
+
return turn.id;
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
export function extractThreadIdFromNotification(params) {
|
|
30
|
+
if (!params || typeof params !== 'object')
|
|
31
|
+
return undefined;
|
|
32
|
+
const p = params;
|
|
33
|
+
if (typeof p.threadId === 'string')
|
|
34
|
+
return p.threadId;
|
|
35
|
+
const thread = p.thread;
|
|
36
|
+
if (thread && typeof thread.id === 'string')
|
|
37
|
+
return thread.id;
|
|
38
|
+
const meta = (p._meta ?? p.meta);
|
|
39
|
+
if (meta && typeof meta.threadId === 'string')
|
|
40
|
+
return meta.threadId;
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
package/dist/dispatch.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CleanupForkOpts, DispatchAdapter, DispatchOpts, ForkOpts, ForkSessionHandle, GatewayLogger, RuntimeEvent } from '@parall/agent-core';
|
|
2
2
|
import type { CodexAgentConfig } from './config.js';
|
|
3
|
+
import { type NotificationTap } from './instructions-refresh.js';
|
|
3
4
|
import type { CodexSessionManager } from './session-manager.js';
|
|
4
5
|
type CodexAppServerAdapterOptions = Pick<CodexAgentConfig, 'approvalPolicy' | 'codexBin' | 'codexHome' | 'model' | 'reasoningEffort' | 'sandbox' | 'workspaceDir'> & {
|
|
5
6
|
sessionManager: CodexSessionManager;
|
|
@@ -15,7 +16,44 @@ type CodexAppServerAdapterOptions = Pick<CodexAgentConfig, 'approvalPolicy' | 'c
|
|
|
15
16
|
* on its next shell command — no respawn needed.
|
|
16
17
|
*/
|
|
17
18
|
capabilityBinDir?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Platform system prompt, delivered per-thread via the app-server's typed
|
|
21
|
+
* top-level `developerInstructions` param — the ONLY delivery channel. It
|
|
22
|
+
* replaces the legacy workspace `.codex/config.toml` + global trust entry,
|
|
23
|
+
* which coupled the prompt to codex's interactive workspace-trust concept
|
|
24
|
+
* and made the bridge write into the operator's own config on shared homes.
|
|
25
|
+
*
|
|
26
|
+
* Where it lands on 0.144.1: `thread/start` bakes it in (canonical AND
|
|
27
|
+
* model-visible at once); a fresh-process `thread/resume` updates only the
|
|
28
|
+
* thread's CANONICAL configuration (a resume of a still-running thread
|
|
29
|
+
* ignores every override); `thread/fork` inherits the parent's; compaction
|
|
30
|
+
* rebuilds the model-visible context from the canonical configuration.
|
|
31
|
+
*
|
|
32
|
+
* Consequence: updateConfig() changes what the NEXT thread open sends; for
|
|
33
|
+
* the persisted main thread, the lazy restart's fresh-process resume plus
|
|
34
|
+
* one explicit compaction converge both planes before the next turn — the
|
|
35
|
+
* full two-plane semantics and evidence live in instructions-refresh.ts.
|
|
36
|
+
*/
|
|
37
|
+
developerInstructions?: string;
|
|
38
|
+
/** Override the compaction wait budget for the instructions refresh (tests). */
|
|
39
|
+
instructionsCompactTimeoutMs?: number;
|
|
40
|
+
/** Override the post-interrupt grace for the instructions refresh (tests). */
|
|
41
|
+
instructionsInterruptGraceMs?: number;
|
|
18
42
|
};
|
|
43
|
+
/**
|
|
44
|
+
* Bridge driver backed by `codex app-server --listen stdio://`.
|
|
45
|
+
*
|
|
46
|
+
* Lifecycle:
|
|
47
|
+
* - bridge startup: spawn one `codex app-server` subprocess, do the
|
|
48
|
+
* `initialize` / `initialized` handshake once, keep the pipe open
|
|
49
|
+
* - per Parall dispatch: `thread/start` (first time) or `thread/resume`,
|
|
50
|
+
* then `turn/start`; forward server notifications until `turn/completed`
|
|
51
|
+
* - fork-on-busy: `thread/fork` creates a disposable sibling thread
|
|
52
|
+
*
|
|
53
|
+
* Concurrency: agent-core routes one dispatch per sessionKey at a time, so
|
|
54
|
+
* main + fork can interleave turns on the same stdio pipe. We route
|
|
55
|
+
* notifications by threadId the server stamps on every item/turn event.
|
|
56
|
+
*/
|
|
19
57
|
export declare class CodexAppServerAdapter implements DispatchAdapter {
|
|
20
58
|
private readonly opts;
|
|
21
59
|
private client;
|
|
@@ -26,7 +64,22 @@ export declare class CodexAppServerAdapter implements DispatchAdapter {
|
|
|
26
64
|
private readonly activeTurnIds;
|
|
27
65
|
private readonly pendingInjections;
|
|
28
66
|
private readonly resumedThreadIds;
|
|
67
|
+
/** Threads whose reconcile compaction is in flight — tap-only traffic. */
|
|
68
|
+
private readonly reconcilingThreadIds;
|
|
69
|
+
/**
|
|
70
|
+
* Set when a stalled compaction left (possibly) a zombie turn on the main
|
|
71
|
+
* thread. Until the subprocess ACTUALLY restarts, main-lane redrives must
|
|
72
|
+
* not open/compact/turn-start the thread: re-entering the zombie process
|
|
73
|
+
* lets a second compaction's watcher misattribute the zombie's close as a
|
|
74
|
+
* plain failure, dropping the stalled marker and re-arming the
|
|
75
|
+
* fresh-thread rotation this state exists to prevent. Cleared where the
|
|
76
|
+
* zombie dies: subprocess teardown.
|
|
77
|
+
*/
|
|
78
|
+
private mainLaneQuarantined;
|
|
79
|
+
private readonly notificationTaps;
|
|
80
|
+
private readonly instructionsRefresher;
|
|
29
81
|
private stopping;
|
|
82
|
+
private lastUnroutedNotificationWarnAt;
|
|
30
83
|
/**
|
|
31
84
|
* Store an active turn sink keyed by threadId. If a sink already exists for
|
|
32
85
|
* the same threadId, log a warning and fail the existing sink — this
|
|
@@ -37,27 +90,57 @@ export declare class CodexAppServerAdapter implements DispatchAdapter {
|
|
|
37
90
|
*/
|
|
38
91
|
private setActiveTurn;
|
|
39
92
|
constructor(opts: CodexAppServerAdapterOptions);
|
|
93
|
+
/** Register a listener for every server notification; returns unregister. */
|
|
94
|
+
addNotificationTap(tap: NotificationTap): () => void;
|
|
95
|
+
/**
|
|
96
|
+
* Tell tap waiters the subprocess is gone so they abort immediately —
|
|
97
|
+
* no further notifications will ever arrive, and a waiter left to its
|
|
98
|
+
* own timeout would stall its dispatch for the full compaction budget.
|
|
99
|
+
* Mirrors the global-error broadcast routeNotification does for sinks.
|
|
100
|
+
*/
|
|
101
|
+
private notifyTapsDisposed;
|
|
40
102
|
updateConfig(config: {
|
|
41
103
|
model?: string | null;
|
|
42
104
|
reasoningEffort?: string | null;
|
|
105
|
+
developerInstructions?: string | null;
|
|
43
106
|
}): void;
|
|
44
107
|
enqueueDuringDispatch(sessionKey: string, body: string): Promise<boolean>;
|
|
45
108
|
abortDispatch(sessionKey: string): void;
|
|
46
109
|
hasPendingInjections(sessionKey: string): boolean;
|
|
47
110
|
dispatch({ event, bodyForAgent, sessionKey, context, }: DispatchOpts): AsyncIterable<RuntimeEvent>;
|
|
111
|
+
/**
|
|
112
|
+
* Bring the app-server up and open (start or resume) the thread for this
|
|
113
|
+
* dispatch, then reconcile the main thread's EFFECTIVE instructions plane.
|
|
114
|
+
* Extracted from dispatch() so the convergence re-check there can loop back
|
|
115
|
+
* through the restart path without duplicating the open logic. Errors are
|
|
116
|
+
* returned, not thrown — the generator yields them as runtime events.
|
|
117
|
+
*/
|
|
118
|
+
private openDispatchTarget;
|
|
48
119
|
getBranchPoint(_sessionKey: string): string | undefined;
|
|
49
120
|
forkSession({ sessionKey: parentSessionKey }: ForkOpts): Promise<ForkSessionHandle | null>;
|
|
50
121
|
cleanupFork({ fork }: CleanupForkOpts): void;
|
|
51
122
|
private logForkFailure;
|
|
52
123
|
/**
|
|
53
|
-
* Lazily restart the app-server before the NEXT turn
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
124
|
+
* Lazily restart the app-server before the NEXT turn, so a subprocess that
|
|
125
|
+
* has been running since before a capability change starts clean. Deferred
|
|
126
|
+
* to the next dispatch with no active turns — never kills an in-flight turn;
|
|
127
|
+
* thread state survives via thread/resume.
|
|
128
|
+
*
|
|
129
|
+
* For the persisted main thread this restart is also the CANONICAL half of
|
|
130
|
+
* the instructions refresh: only a fresh-process thread/resume applies the
|
|
131
|
+
* updated developerInstructions to the thread's configuration (a resume of
|
|
132
|
+
* a still-running thread ignores it). The EFFECTIVE half is the explicit
|
|
133
|
+
* compaction in instructions-refresh.ts. The capability shim dir on PATH is
|
|
134
|
+
* what makes a grant/revocation's TOOLS effective immediately.
|
|
58
135
|
*/
|
|
59
136
|
requestProcessRestart(): void;
|
|
60
137
|
private restartRequested;
|
|
138
|
+
/**
|
|
139
|
+
* Dispatches currently inside their open/reconcile phase — real work on
|
|
140
|
+
* the subprocess (thread open, possibly a compaction turn) that predates
|
|
141
|
+
* any TurnSink registration, so activeTurns alone cannot gate the restart.
|
|
142
|
+
*/
|
|
143
|
+
private openingDispatches;
|
|
61
144
|
private applyPendingRestart;
|
|
62
145
|
stop(): Promise<void>;
|
|
63
146
|
private ensureStarted;
|
package/dist/dispatch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
|