@excitedjs/agent-runtime-codex 0.2.0-alpha.g0ddd418597ca

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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/dist/approval.d.ts +30 -0
  4. package/dist/approval.d.ts.map +1 -0
  5. package/dist/approval.js +42 -0
  6. package/dist/approval.js.map +1 -0
  7. package/dist/args.d.ts +55 -0
  8. package/dist/args.d.ts.map +1 -0
  9. package/dist/args.js +113 -0
  10. package/dist/args.js.map +1 -0
  11. package/dist/bin.d.ts +14 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +18 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/codex-home.d.ts +42 -0
  16. package/dist/codex-home.d.ts.map +1 -0
  17. package/dist/codex-home.js +112 -0
  18. package/dist/codex-home.js.map +1 -0
  19. package/dist/config.d.ts +76 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +106 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/diagnostic.d.ts +14 -0
  24. package/dist/diagnostic.d.ts.map +1 -0
  25. package/dist/diagnostic.js +58 -0
  26. package/dist/diagnostic.js.map +1 -0
  27. package/dist/events.d.ts +88 -0
  28. package/dist/events.d.ts.map +1 -0
  29. package/dist/events.js +225 -0
  30. package/dist/events.js.map +1 -0
  31. package/dist/handshake.d.ts +44 -0
  32. package/dist/handshake.d.ts.map +1 -0
  33. package/dist/handshake.js +85 -0
  34. package/dist/handshake.js.map +1 -0
  35. package/dist/index.d.ts +22 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +24 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/internal/completion-body.d.ts +38 -0
  40. package/dist/internal/completion-body.d.ts.map +1 -0
  41. package/dist/internal/completion-body.js +62 -0
  42. package/dist/internal/completion-body.js.map +1 -0
  43. package/dist/internal/config-validate.d.ts +23 -0
  44. package/dist/internal/config-validate.d.ts.map +1 -0
  45. package/dist/internal/config-validate.js +122 -0
  46. package/dist/internal/config-validate.js.map +1 -0
  47. package/dist/internal/os.d.ts +30 -0
  48. package/dist/internal/os.d.ts.map +1 -0
  49. package/dist/internal/os.js +81 -0
  50. package/dist/internal/os.js.map +1 -0
  51. package/dist/internal/socket.d.ts +23 -0
  52. package/dist/internal/socket.d.ts.map +1 -0
  53. package/dist/internal/socket.js +74 -0
  54. package/dist/internal/socket.js.map +1 -0
  55. package/dist/internal/turn-render.d.ts +22 -0
  56. package/dist/internal/turn-render.d.ts.map +1 -0
  57. package/dist/internal/turn-render.js +40 -0
  58. package/dist/internal/turn-render.js.map +1 -0
  59. package/dist/mcp-config.d.ts +9 -0
  60. package/dist/mcp-config.d.ts.map +1 -0
  61. package/dist/mcp-config.js +21 -0
  62. package/dist/mcp-config.js.map +1 -0
  63. package/dist/paths.d.ts +7 -0
  64. package/dist/paths.d.ts.map +1 -0
  65. package/dist/paths.js +26 -0
  66. package/dist/paths.js.map +1 -0
  67. package/dist/provider-ref.d.ts +8 -0
  68. package/dist/provider-ref.d.ts.map +1 -0
  69. package/dist/provider-ref.js +8 -0
  70. package/dist/provider-ref.js.map +1 -0
  71. package/dist/provider.d.ts +71 -0
  72. package/dist/provider.d.ts.map +1 -0
  73. package/dist/provider.js +137 -0
  74. package/dist/provider.js.map +1 -0
  75. package/dist/rpc.d.ts +65 -0
  76. package/dist/rpc.d.ts.map +1 -0
  77. package/dist/rpc.js +200 -0
  78. package/dist/rpc.js.map +1 -0
  79. package/dist/runtime-support.d.ts +27 -0
  80. package/dist/runtime-support.d.ts.map +1 -0
  81. package/dist/runtime-support.js +57 -0
  82. package/dist/runtime-support.js.map +1 -0
  83. package/dist/runtime.d.ts +246 -0
  84. package/dist/runtime.d.ts.map +1 -0
  85. package/dist/runtime.js +648 -0
  86. package/dist/runtime.js.map +1 -0
  87. package/dist/supervisor.d.ts +55 -0
  88. package/dist/supervisor.d.ts.map +1 -0
  89. package/dist/supervisor.js +183 -0
  90. package/dist/supervisor.js.map +1 -0
  91. package/dist/turn-manager.d.ts +92 -0
  92. package/dist/turn-manager.d.ts.map +1 -0
  93. package/dist/turn-manager.js +271 -0
  94. package/dist/turn-manager.js.map +1 -0
  95. package/dist/types.d.ts +143 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +10 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/version.d.ts +16 -0
  100. package/dist/version.d.ts.map +1 -0
  101. package/dist/version.js +33 -0
  102. package/dist/version.js.map +1 -0
  103. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Codex app-server child process supervisor.
3
+ *
4
+ * Heavily simplified from claudemux's
5
+ * `plugins/claudemux/core/src/engines/codex/supervisor.ts`. Differences:
6
+ * - one process per Dispatcher, owned in-memory (no /tmp registry)
7
+ * - no IPC bridge subprocess (the server holds the WS itself)
8
+ * - no spawn lock / borrow lock (Dispatcher is the single owner)
9
+ * - lifecycle bound to CodexRuntime, not a CLI invocation
10
+ *
11
+ * Issue #2 §"实现陷阱": codex CLI is a node wrapper that spawns the rust
12
+ * binary as a child; both land in the same process group. Reap must
13
+ * SIGKILL the whole group, not just the leader, or the rust process leaks.
14
+ */
15
+ export interface CodexProcessOptions {
16
+ /** Unix socket path the daemon should listen on. */
17
+ socketPath: string;
18
+ /** Working directory for the daemon. */
19
+ cwd: string;
20
+ /** Where to log stdout. */
21
+ stdoutLogPath: string;
22
+ /** Where to log stderr. */
23
+ stderrLogPath: string;
24
+ /** Codex binary path. Defaults to `'codex'` on PATH; env `CODEX_HOST_CODEX_BIN` overrides. */
25
+ binPath?: string;
26
+ /** Extra args after `app-server --listen unix://<socket>`. */
27
+ extraArgs?: string[];
28
+ /** Environment for the daemon. */
29
+ env?: NodeJS.ProcessEnv;
30
+ /** Ready-probe timeout in ms (how long to wait for the socket to appear). */
31
+ readyTimeoutMs?: number;
32
+ }
33
+ export interface CodexProcessExit {
34
+ code: number | null;
35
+ signal: NodeJS.Signals | null;
36
+ }
37
+ export type CodexProcessExitHandler = (exit: CodexProcessExit) => void;
38
+ /** A handle to one running codex app-server child process. */
39
+ export declare class CodexProcess {
40
+ private readonly opts;
41
+ readonly socketPath: string;
42
+ readonly cwd: string;
43
+ private child;
44
+ private _pid;
45
+ private reaped;
46
+ private readonly exitHandlers;
47
+ constructor(opts: CodexProcessOptions);
48
+ get pid(): number | null;
49
+ onExit(handler: CodexProcessExitHandler): void;
50
+ /** Spawn the daemon and resolve once its listen socket is bound. */
51
+ start(): Promise<void>;
52
+ /** SIGTERM → 1s wait → SIGKILL group. Idempotent. */
53
+ reap(): Promise<void>;
54
+ }
55
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAgBH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEvE,8DAA8D;AAC9D,qBAAa,YAAY;IAQX,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;gBAEjC,IAAI,EAAE,mBAAmB;IAKtD,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,CAEvB;IAED,MAAM,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAI9C,oEAAoE;IAC9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8F5B,qDAAqD;IAC/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B5B"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Codex app-server child process supervisor.
3
+ *
4
+ * Heavily simplified from claudemux's
5
+ * `plugins/claudemux/core/src/engines/codex/supervisor.ts`. Differences:
6
+ * - one process per Dispatcher, owned in-memory (no /tmp registry)
7
+ * - no IPC bridge subprocess (the server holds the WS itself)
8
+ * - no spawn lock / borrow lock (Dispatcher is the single owner)
9
+ * - lifecycle bound to CodexRuntime, not a CLI invocation
10
+ *
11
+ * Issue #2 §"实现陷阱": codex CLI is a node wrapper that spawns the rust
12
+ * binary as a child; both land in the same process group. Reap must
13
+ * SIGKILL the whole group, not just the leader, or the rust process leaks.
14
+ */
15
+ import { spawn as spawnChild, } from 'node:child_process';
16
+ import { mkdir, open, rm, stat } from 'node:fs/promises';
17
+ import { dirname } from 'node:path';
18
+ import { ensureOwnerOnlyDir, isProcessAlive, killProcessGroup, removeEmptyLogFile, } from '@excitedjs/dreamux-utils';
19
+ /** A handle to one running codex app-server child process. */
20
+ export class CodexProcess {
21
+ opts;
22
+ socketPath;
23
+ cwd;
24
+ child = null;
25
+ _pid = null;
26
+ reaped = false;
27
+ exitHandlers = [];
28
+ constructor(opts) {
29
+ this.opts = opts;
30
+ this.socketPath = opts.socketPath;
31
+ this.cwd = opts.cwd;
32
+ }
33
+ get pid() {
34
+ return this._pid;
35
+ }
36
+ onExit(handler) {
37
+ this.exitHandlers.push(handler);
38
+ }
39
+ /** Spawn the daemon and resolve once its listen socket is bound. */
40
+ async start() {
41
+ if (this.child !== null) {
42
+ throw new Error('CodexProcess.start: already started');
43
+ }
44
+ const binPath = this.opts.binPath ?? (process.env['CODEX_HOST_CODEX_BIN'] || 'codex');
45
+ const args = [
46
+ 'app-server',
47
+ '--listen',
48
+ `unix://${this.opts.socketPath}`,
49
+ ...(this.opts.extraArgs ?? []),
50
+ ];
51
+ // The socket dir is a private runtime root (issue #182): owner-only, so
52
+ // other local users can never reach the rendezvous endpoint. Enforce it
53
+ // even when the dir already exists with a permissive mode.
54
+ await ensureOwnerOnlyDir(dirname(this.opts.socketPath));
55
+ await mkdir(this.opts.cwd, { recursive: true });
56
+ await mkdir(dirname(this.opts.stdoutLogPath), { recursive: true });
57
+ // Stale socket from a previous crashed run would otherwise prevent
58
+ // the daemon from binding.
59
+ try {
60
+ await rm(this.opts.socketPath, { force: true });
61
+ }
62
+ catch {
63
+ /* ignore — bind will fail loudly if it really is busy */
64
+ }
65
+ // Open the log files as FileHandles and hand their fds to the child's
66
+ // stdio. The handles are kept in locals (referenced by the finally below)
67
+ // so they cannot be garbage-collected — and thus closed out from under the
68
+ // child — between open and spawn. They are closed once the child owns the
69
+ // inherited fds, matching the previous openSync/closeSync timing.
70
+ const stdoutHandle = await open(this.opts.stdoutLogPath, 'a', 0o600);
71
+ const stderrHandle = await open(this.opts.stderrLogPath, 'a', 0o600);
72
+ const spawnOpts = {
73
+ cwd: this.opts.cwd,
74
+ env: this.opts.env ?? process.env,
75
+ detached: true, // its own process group, so we can group-kill on reap
76
+ stdio: ['ignore', stdoutHandle.fd, stderrHandle.fd],
77
+ };
78
+ let child;
79
+ try {
80
+ child = await new Promise((resolve, reject) => {
81
+ let settled = false;
82
+ const c = spawnChild(binPath, args, spawnOpts);
83
+ c.once('error', (e) => {
84
+ if (settled)
85
+ return;
86
+ settled = true;
87
+ reject(e instanceof Error ? e : new Error(String(e)));
88
+ });
89
+ c.once('spawn', () => {
90
+ if (settled)
91
+ return;
92
+ settled = true;
93
+ resolve(c);
94
+ });
95
+ });
96
+ }
97
+ finally {
98
+ await stdoutHandle.close();
99
+ await stderrHandle.close();
100
+ }
101
+ if (child.pid === undefined) {
102
+ throw new Error('codex daemon spawned without a pid');
103
+ }
104
+ this.child = child;
105
+ this._pid = child.pid;
106
+ // Future post-spawn `error` emissions must not crash the supervisor.
107
+ child.on('error', () => {
108
+ /* daemon-side error, can no longer affect this process */
109
+ });
110
+ child.once('exit', (code, signal) => {
111
+ if (this.reaped)
112
+ return;
113
+ for (const handler of this.exitHandlers) {
114
+ try {
115
+ handler({ code, signal });
116
+ }
117
+ catch {
118
+ /* exit observers must not poison process event dispatch */
119
+ }
120
+ }
121
+ });
122
+ try {
123
+ await waitForSocket(this.opts.socketPath, child.pid, this.opts.readyTimeoutMs ?? 10000);
124
+ }
125
+ catch (e) {
126
+ await this.reap();
127
+ throw e;
128
+ }
129
+ }
130
+ /** SIGTERM → 1s wait → SIGKILL group. Idempotent. */
131
+ async reap() {
132
+ if (this.reaped)
133
+ return;
134
+ this.reaped = true;
135
+ const pid = this._pid;
136
+ if (pid !== null) {
137
+ if (isProcessAlive(pid)) {
138
+ killProcessGroup(pid, 'SIGTERM');
139
+ const deadline = Date.now() + 1000;
140
+ while (Date.now() < deadline) {
141
+ if (!isProcessAlive(pid))
142
+ break;
143
+ await new Promise((r) => setTimeout(r, 25));
144
+ }
145
+ }
146
+ // Always SIGKILL the group, even if the leader is already dead —
147
+ // a reparented child (rust binary outliving its node wrapper) is
148
+ // the exact failure this guards against.
149
+ killProcessGroup(pid, 'SIGKILL');
150
+ }
151
+ try {
152
+ await rm(this.opts.socketPath, { force: true });
153
+ }
154
+ catch {
155
+ /* best effort */
156
+ }
157
+ // The child has exited, so its inherited stdout/stderr fds are released.
158
+ // Drop the log files if the child produced no output — normal Codex traffic
159
+ // flows over the socket, so they are usually empty (issue #182 logs stage).
160
+ await removeEmptyLogFile(this.opts.stdoutLogPath);
161
+ await removeEmptyLogFile(this.opts.stderrLogPath);
162
+ this.child = null;
163
+ }
164
+ }
165
+ async function waitForSocket(path, pid, timeoutMs) {
166
+ const deadline = Date.now() + timeoutMs;
167
+ while (Date.now() < deadline) {
168
+ try {
169
+ const st = await stat(path);
170
+ if (st.isSocket())
171
+ return;
172
+ }
173
+ catch {
174
+ /* not bound yet or race; keep polling */
175
+ }
176
+ if (!isProcessAlive(pid)) {
177
+ throw new Error(`codex daemon (pid ${pid}) exited before binding ${path}`);
178
+ }
179
+ await new Promise((r) => setTimeout(r, 25));
180
+ }
181
+ throw new Error(`codex daemon (pid ${pid}) did not bind ${path} within ${timeoutMs}ms`);
182
+ }
183
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../src/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Per-dispatcher in-memory inbound submitter.
3
+ *
4
+ * Contract:
5
+ * - accepted inbound messages are not persisted;
6
+ * - Feishu message_id redelivery is deduped within this server process;
7
+ * - one accepted inbound message becomes one Codex `turn/start` submission;
8
+ * - Codex text output alone does not send anything to Feishu.
9
+ */
10
+ import { type CollectedTurn } from './events.js';
11
+ import type { CodexWsClient } from './rpc.js';
12
+ import type { InboundTurnInput, InboundDeliveryResult, NoticeInjectionResult, InboundDeliveryHooks, TurnSettledSignal } from '@excitedjs/dreamux-types';
13
+ export interface TurnManagerOptions {
14
+ dispatcherId: string;
15
+ /** Lazily resolved Codex thread id (set after thread/start | resume). */
16
+ getThreadId(): string | null;
17
+ client: CodexWsClient;
18
+ /**
19
+ * Codex cwd to pass on each turn/start. Issue #2 Q1: for MVP we leave
20
+ * this null because thread cwd is set once at thread/start time.
21
+ */
22
+ turnCwd?: string | null;
23
+ /** Process-local Feishu message_id dedupe window size. */
24
+ messageIdDedupeWindow?: number;
25
+ /** Optional logger; defaults to console.error. */
26
+ log?: (level: 'info' | 'warn' | 'error', msg: string, err?: unknown) => void;
27
+ /** Best-effort runtime-local snapshot hook for `AgentRuntime.getLast()`. */
28
+ onTurnCompleted?: (turn: CollectedTurn) => void;
29
+ /**
30
+ * Fired when a submitted turn is cut short by `stop()` before it reached
31
+ * `turn/completed` (a crashed or torn-down runtime). The successful
32
+ * `completed` settlement is fired by the runtime from its `onTurnCompleted`
33
+ * handler; this hook only covers the `stopped` case so an in-flight teammate
34
+ * turn never vanishes silently.
35
+ */
36
+ onTurnSettled?: (settled: TurnSettledSignal) => void;
37
+ }
38
+ export declare class TurnManager {
39
+ private readonly opts;
40
+ private readonly seenMessageIds;
41
+ private readonly seenMessageIdOrder;
42
+ private stopped;
43
+ /**
44
+ * Set once any real inbound has been accepted and handed to Codex. There is
45
+ * no FIFO queue here — inbound submission folds onto Codex's active turn — so
46
+ * this flag is what lets a best-effort restart-notice injection detect an
47
+ * in-flight inbound and skip rather than wake the thread twice (issue #78).
48
+ */
49
+ private inboundSubmitted;
50
+ private activeTurnSlot;
51
+ private activeTurnId;
52
+ /**
53
+ * Turn ids submitted to Codex that have not yet reached `turn/completed`. On
54
+ * `stop()` each still-pending turn is settled as `stopped` so a teammate turn
55
+ * interrupted by teardown is not lost.
56
+ */
57
+ private readonly pendingTurnIds;
58
+ private readonly log;
59
+ private readonly messageIdDedupeWindow;
60
+ constructor(opts: TurnManagerOptions);
61
+ /**
62
+ * Submit one accepted inbound message to Codex. Returns duplicate when this
63
+ * process already saw the message_id.
64
+ */
65
+ enqueue(input: InboundTurnInput, hooks?: InboundDeliveryHooks): Promise<InboundDeliveryResult>;
66
+ /**
67
+ * Best-effort one-shot notice injected after a `daemon restart --notify-
68
+ * resumed` resumes this dispatcher's thread. Skips if the manager is stopped,
69
+ * if a real inbound has already woken the thread, or if no thread is bound.
70
+ * A submission failure is reported, never thrown — it must not fail the
71
+ * dispatcher's start or the restart.
72
+ */
73
+ injectNotice(text: string): Promise<NoticeInjectionResult>;
74
+ stop(): Promise<void>;
75
+ private claimActiveTurnSlot;
76
+ private recordTurnStartSuccess;
77
+ private recordTurnStartFailure;
78
+ private activateTurnSlot;
79
+ /**
80
+ * Record a submitted turn as pending and wire its completion. On
81
+ * `turn/completed` the turn is removed from the pending set and the snapshot
82
+ * hook fires (which is where the runtime emits the `completed` settlement). On
83
+ * a terminal turn failure (collector rejects: codex `error` with
84
+ * `willRetry: false`, or a `turn/completed` carrying `turn.error`) the turn is
85
+ * settled as `failed` here, so a teammate turn that errors at the model level
86
+ * is delivered with a status instead of hanging until teardown.
87
+ */
88
+ private trackTurn;
89
+ private notifyAccepted;
90
+ private rememberMessageId;
91
+ }
92
+ //# sourceMappingURL=turn-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-manager.d.ts","sourceRoot":"","sources":["../src/turn-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAalC,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,0DAA0D;IAC1D,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kDAAkD;IAClD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E,4EAA4E;IAC5E,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAChD;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACtD;AAED,qBAAa,WAAW;IAsBV,OAAO,CAAC,QAAQ,CAAC,IAAI;IArBjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgB;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAAuB;IAC3C;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyC;IAC7D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;gBAElB,IAAI,EAAE,kBAAkB;IAYrD;;;OAGG;IACG,OAAO,CACX,KAAK,EAAE,gBAAgB,EACvB,KAAK,GAAE,oBAAyB,GAC/B,OAAO,CAAC,qBAAqB,CAAC;IAuDjC;;;;;;OAMG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgC1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,sBAAsB;IAkB9B,OAAO,CAAC,gBAAgB;IAOxB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;YAmCH,cAAc;IAgB5B,OAAO,CAAC,iBAAiB;CAW1B"}
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Per-dispatcher in-memory inbound submitter.
3
+ *
4
+ * Contract:
5
+ * - accepted inbound messages are not persisted;
6
+ * - Feishu message_id redelivery is deduped within this server process;
7
+ * - one accepted inbound message becomes one Codex `turn/start` submission;
8
+ * - Codex text output alone does not send anything to Feishu.
9
+ */
10
+ import { subscribeTurnCollection, submitTurnStart, } from './events.js';
11
+ import { DEFAULT_MESSAGE_ID_DEDUPE_WINDOW } from '@excitedjs/dreamux-utils';
12
+ export class TurnManager {
13
+ opts;
14
+ seenMessageIds = new Set();
15
+ seenMessageIdOrder = [];
16
+ stopped = false;
17
+ /**
18
+ * Set once any real inbound has been accepted and handed to Codex. There is
19
+ * no FIFO queue here — inbound submission folds onto Codex's active turn — so
20
+ * this flag is what lets a best-effort restart-notice injection detect an
21
+ * in-flight inbound and skip rather than wake the thread twice (issue #78).
22
+ */
23
+ inboundSubmitted = false;
24
+ activeTurnSlot = null;
25
+ activeTurnId = null;
26
+ /**
27
+ * Turn ids submitted to Codex that have not yet reached `turn/completed`. On
28
+ * `stop()` each still-pending turn is settled as `stopped` so a teammate turn
29
+ * interrupted by teardown is not lost.
30
+ */
31
+ pendingTurnIds = new Set();
32
+ log;
33
+ messageIdDedupeWindow;
34
+ constructor(opts) {
35
+ this.opts = opts;
36
+ this.log = opts.log ?? ((lvl, msg, err) => {
37
+ const prefix = `[turn-manager ${opts.dispatcherId}] ${lvl}`;
38
+ if (err !== undefined)
39
+ console.error(prefix, msg, err);
40
+ else
41
+ console.error(prefix, msg);
42
+ });
43
+ this.messageIdDedupeWindow = Math.max(0, opts.messageIdDedupeWindow ?? DEFAULT_MESSAGE_ID_DEDUPE_WINDOW);
44
+ }
45
+ /**
46
+ * Submit one accepted inbound message to Codex. Returns duplicate when this
47
+ * process already saw the message_id.
48
+ */
49
+ async enqueue(input, hooks = {}) {
50
+ if (this.stopped)
51
+ return { status: 'stopped' };
52
+ if (!this.rememberMessageId(input.sourceId)) {
53
+ return { status: 'duplicate' };
54
+ }
55
+ // Mark before any await so a concurrent restart-notice injection observes
56
+ // that a real inbound is in flight and skips itself.
57
+ this.inboundSubmitted = true;
58
+ const threadId = this.opts.getThreadId();
59
+ if (threadId === null) {
60
+ await this.notifyAccepted(input, hooks);
61
+ const error = new Error('inbound submitted without thread_id');
62
+ this.log('error', error.message);
63
+ return { status: 'failed', error };
64
+ }
65
+ const activeTurn = this.claimActiveTurnSlot(threadId);
66
+ activeTurn.slot.pendingSubmissions += 1;
67
+ await this.notifyAccepted(input, hooks);
68
+ let res;
69
+ try {
70
+ res = await submitTurnStart(this.opts.client, threadId, input.text, this.opts.turnCwd ?? null);
71
+ }
72
+ catch (err) {
73
+ const error = err instanceof Error ? err : new Error(String(err));
74
+ this.recordTurnStartFailure(activeTurn.slot, error, activeTurn.primary);
75
+ this.log('error', `turn/start submission failed for message ${input.sourceId === '' ? '<none>' : input.sourceId}: ${error.message}`, error);
76
+ return { status: 'failed', error };
77
+ }
78
+ const turnId = this.recordTurnStartSuccess(activeTurn.slot, res.turn.id, activeTurn.primary);
79
+ try {
80
+ return {
81
+ status: 'submitted',
82
+ turnId: turnId ?? await activeTurn.slot.turnIdPromise,
83
+ };
84
+ }
85
+ catch (err) {
86
+ const error = err instanceof Error ? err : new Error(String(err));
87
+ return { status: 'failed', error };
88
+ }
89
+ }
90
+ /**
91
+ * Best-effort one-shot notice injected after a `daemon restart --notify-
92
+ * resumed` resumes this dispatcher's thread. Skips if the manager is stopped,
93
+ * if a real inbound has already woken the thread, or if no thread is bound.
94
+ * A submission failure is reported, never thrown — it must not fail the
95
+ * dispatcher's start or the restart.
96
+ */
97
+ async injectNotice(text) {
98
+ if (this.stopped)
99
+ return { status: 'stopped' };
100
+ if (this.inboundSubmitted)
101
+ return { status: 'skipped' };
102
+ const threadId = this.opts.getThreadId();
103
+ if (threadId === null) {
104
+ const error = new Error('restart notice injected without thread_id');
105
+ this.log('error', error.message);
106
+ return { status: 'failed', error };
107
+ }
108
+ // Mark before submitting so a racing real inbound is not double-counted and
109
+ // a second injection cannot fire.
110
+ this.inboundSubmitted = true;
111
+ try {
112
+ const collector = subscribeTurnCollection(this.opts.client, threadId);
113
+ const res = await submitTurnStart(this.opts.client, threadId, text, this.opts.turnCwd ?? null);
114
+ this.trackTurn(res.turn.id, collector);
115
+ this.log('info', `injected restart notice into thread ${threadId}`);
116
+ return { status: 'submitted', turnId: res.turn.id };
117
+ }
118
+ catch (err) {
119
+ const error = err instanceof Error ? err : new Error(String(err));
120
+ this.log('warn', `restart notice injection failed: ${error.message}`, error);
121
+ return { status: 'failed', error };
122
+ }
123
+ }
124
+ async stop() {
125
+ this.stopped = true;
126
+ const activeSlot = this.activeTurnSlot;
127
+ this.activeTurnSlot = null;
128
+ if (activeSlot !== null && activeSlot.turnId === null) {
129
+ activeSlot.rejectTurnId(new Error('codex turn stopped before acceptance'));
130
+ }
131
+ // Any turn still in flight at teardown will never reach `turn/completed`
132
+ // (the WS is closing). Settle each as `stopped` so an interrupted teammate
133
+ // turn is delivered with a status rather than vanishing.
134
+ for (const turnId of this.pendingTurnIds) {
135
+ this.opts.onTurnSettled?.({ turnId, status: 'stopped' });
136
+ }
137
+ this.pendingTurnIds.clear();
138
+ this.activeTurnId = null;
139
+ }
140
+ claimActiveTurnSlot(threadId) {
141
+ const active = this.activeTurnSlot;
142
+ if (active !== null)
143
+ return { slot: active, primary: false };
144
+ let resolveTurnId;
145
+ let rejectTurnId;
146
+ const turnIdPromise = new Promise((resolve, reject) => {
147
+ resolveTurnId = resolve;
148
+ rejectTurnId = reject;
149
+ });
150
+ // The primary submitter returns its own failure directly. The shared promise
151
+ // only exists for concurrent followers waiting for that primary turn id, so
152
+ // reject it without producing an unhandled rejection when there are none.
153
+ turnIdPromise.catch(() => undefined);
154
+ const slot = {
155
+ collector: subscribeTurnCollection(this.opts.client, threadId),
156
+ turnId: null,
157
+ candidateTurnId: null,
158
+ primaryFailed: false,
159
+ pendingSubmissions: 0,
160
+ turnIdPromise,
161
+ resolveTurnId,
162
+ rejectTurnId,
163
+ };
164
+ this.activeTurnSlot = slot;
165
+ return { slot, primary: true };
166
+ }
167
+ recordTurnStartSuccess(slot, turnId, primary) {
168
+ slot.pendingSubmissions = Math.max(0, slot.pendingSubmissions - 1);
169
+ if (slot.turnId !== null)
170
+ return slot.turnId;
171
+ if (this.stopped) {
172
+ slot.rejectTurnId(new Error('codex turn stopped before acceptance'));
173
+ return null;
174
+ }
175
+ if (primary || slot.primaryFailed) {
176
+ this.activateTurnSlot(slot, turnId);
177
+ return turnId;
178
+ }
179
+ slot.candidateTurnId ??= turnId;
180
+ return null;
181
+ }
182
+ recordTurnStartFailure(slot, error, primary) {
183
+ slot.pendingSubmissions = Math.max(0, slot.pendingSubmissions - 1);
184
+ if (slot.turnId !== null)
185
+ return;
186
+ if (primary)
187
+ slot.primaryFailed = true;
188
+ if (slot.primaryFailed && slot.candidateTurnId !== null) {
189
+ this.activateTurnSlot(slot, slot.candidateTurnId);
190
+ return;
191
+ }
192
+ if (slot.primaryFailed && slot.pendingSubmissions === 0) {
193
+ if (this.activeTurnSlot === slot)
194
+ this.activeTurnSlot = null;
195
+ slot.rejectTurnId(error);
196
+ }
197
+ }
198
+ activateTurnSlot(slot, turnId) {
199
+ if (slot.turnId !== null)
200
+ return;
201
+ slot.turnId = turnId;
202
+ this.trackTurn(turnId, slot.collector, slot);
203
+ slot.resolveTurnId(turnId);
204
+ }
205
+ /**
206
+ * Record a submitted turn as pending and wire its completion. On
207
+ * `turn/completed` the turn is removed from the pending set and the snapshot
208
+ * hook fires (which is where the runtime emits the `completed` settlement). On
209
+ * a terminal turn failure (collector rejects: codex `error` with
210
+ * `willRetry: false`, or a `turn/completed` carrying `turn.error`) the turn is
211
+ * settled as `failed` here, so a teammate turn that errors at the model level
212
+ * is delivered with a status instead of hanging until teardown.
213
+ */
214
+ trackTurn(turnId, collector, slot) {
215
+ if (this.pendingTurnIds.has(turnId))
216
+ return;
217
+ this.pendingTurnIds.add(turnId);
218
+ this.activeTurnId = turnId;
219
+ void collector.awaitTurn(turnId).then((turn) => {
220
+ // Only forward completion if this turn was still pending. If `stop()`
221
+ // already settled it as `stopped`, the delete returns false and we drop
222
+ // the late completion so a turn is never settled twice.
223
+ if (this.pendingTurnIds.delete(turnId)) {
224
+ if (this.activeTurnSlot === slot)
225
+ this.activeTurnSlot = null;
226
+ if (this.activeTurnId === turnId)
227
+ this.activeTurnId = null;
228
+ this.opts.onTurnCompleted?.(turn);
229
+ }
230
+ }, (err) => {
231
+ // Same mutual-exclusion guard as the completed path: only settle as
232
+ // `failed` if `stop()` did not already settle it as `stopped`.
233
+ if (this.pendingTurnIds.delete(turnId)) {
234
+ if (this.activeTurnSlot === slot)
235
+ this.activeTurnSlot = null;
236
+ if (this.activeTurnId === turnId)
237
+ this.activeTurnId = null;
238
+ this.opts.onTurnSettled?.({
239
+ turnId,
240
+ status: 'failed',
241
+ error: err instanceof Error ? err : new Error(String(err)),
242
+ });
243
+ }
244
+ });
245
+ }
246
+ async notifyAccepted(input, hooks) {
247
+ if (hooks.onAccepted === undefined)
248
+ return;
249
+ try {
250
+ await hooks.onAccepted(input);
251
+ }
252
+ catch (err) {
253
+ this.log('warn', `accepted-inbound hook failed for message ${input.sourceId === '' ? '<none>' : input.sourceId}`, err);
254
+ }
255
+ }
256
+ rememberMessageId(messageId) {
257
+ if (messageId === '')
258
+ return true;
259
+ if (this.seenMessageIds.has(messageId))
260
+ return false;
261
+ this.seenMessageIds.add(messageId);
262
+ this.seenMessageIdOrder.push(messageId);
263
+ while (this.seenMessageIdOrder.length > this.messageIdDedupeWindow) {
264
+ const evicted = this.seenMessageIdOrder.shift();
265
+ if (evicted !== undefined)
266
+ this.seenMessageIds.delete(evicted);
267
+ }
268
+ return true;
269
+ }
270
+ }
271
+ //# sourceMappingURL=turn-manager.js.map