codex-worker 0.1.1

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 (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -0
  3. package/bin/codex-worker.mjs +9 -0
  4. package/dist/src/cli.d.ts +2 -0
  5. package/dist/src/cli.js +579 -0
  6. package/dist/src/cli.js.map +1 -0
  7. package/dist/src/core/failure-classifier.d.ts +2 -0
  8. package/dist/src/core/failure-classifier.js +70 -0
  9. package/dist/src/core/failure-classifier.js.map +1 -0
  10. package/dist/src/core/fleet-mode.d.ts +3 -0
  11. package/dist/src/core/fleet-mode.js +21 -0
  12. package/dist/src/core/fleet-mode.js.map +1 -0
  13. package/dist/src/core/ids.d.ts +1 -0
  14. package/dist/src/core/ids.js +5 -0
  15. package/dist/src/core/ids.js.map +1 -0
  16. package/dist/src/core/markdown.d.ts +5 -0
  17. package/dist/src/core/markdown.js +14 -0
  18. package/dist/src/core/markdown.js.map +1 -0
  19. package/dist/src/core/model-catalog.d.ts +21 -0
  20. package/dist/src/core/model-catalog.js +47 -0
  21. package/dist/src/core/model-catalog.js.map +1 -0
  22. package/dist/src/core/paths.d.ts +18 -0
  23. package/dist/src/core/paths.js +43 -0
  24. package/dist/src/core/paths.js.map +1 -0
  25. package/dist/src/core/profile-faults.d.ts +15 -0
  26. package/dist/src/core/profile-faults.js +110 -0
  27. package/dist/src/core/profile-faults.js.map +1 -0
  28. package/dist/src/core/profile-manager.d.ts +25 -0
  29. package/dist/src/core/profile-manager.js +162 -0
  30. package/dist/src/core/profile-manager.js.map +1 -0
  31. package/dist/src/core/store.d.ts +33 -0
  32. package/dist/src/core/store.js +184 -0
  33. package/dist/src/core/store.js.map +1 -0
  34. package/dist/src/core/types.d.ts +97 -0
  35. package/dist/src/core/types.js +2 -0
  36. package/dist/src/core/types.js.map +1 -0
  37. package/dist/src/daemon/client.d.ts +6 -0
  38. package/dist/src/daemon/client.js +117 -0
  39. package/dist/src/daemon/client.js.map +1 -0
  40. package/dist/src/daemon/server.d.ts +1 -0
  41. package/dist/src/daemon/server.js +176 -0
  42. package/dist/src/daemon/server.js.map +1 -0
  43. package/dist/src/daemon/service.d.ts +86 -0
  44. package/dist/src/daemon/service.js +973 -0
  45. package/dist/src/daemon/service.js.map +1 -0
  46. package/dist/src/doctor.d.ts +1 -0
  47. package/dist/src/doctor.js +28 -0
  48. package/dist/src/doctor.js.map +1 -0
  49. package/dist/src/index.d.ts +3 -0
  50. package/dist/src/index.js +4 -0
  51. package/dist/src/index.js.map +1 -0
  52. package/dist/src/output.d.ts +9 -0
  53. package/dist/src/output.js +49 -0
  54. package/dist/src/output.js.map +1 -0
  55. package/dist/src/runtime/app-server.d.ts +44 -0
  56. package/dist/src/runtime/app-server.js +194 -0
  57. package/dist/src/runtime/app-server.js.map +1 -0
  58. package/dist/src/smoke.d.ts +1 -0
  59. package/dist/src/smoke.js +55 -0
  60. package/dist/src/smoke.js.map +1 -0
  61. package/package.json +58 -0
@@ -0,0 +1,33 @@
1
+ import type { AccountProfileState, LocalJobRecord, PendingServerRequestRecord, ThreadRecord, TurnRecord } from './types.js';
2
+ export declare class PersistentStore {
3
+ private readonly root;
4
+ private state;
5
+ load(): Promise<void>;
6
+ getProfiles(): AccountProfileState[];
7
+ setProfiles(profiles: AccountProfileState[]): void;
8
+ listThreads(): ThreadRecord[];
9
+ getThread(threadId: string): ThreadRecord | undefined;
10
+ upsertThread(input: ThreadRecord): ThreadRecord;
11
+ updateThread(threadId: string, updates: Partial<ThreadRecord>): ThreadRecord;
12
+ listTurns(threadId?: string): TurnRecord[];
13
+ getTurn(turnId: string): TurnRecord | undefined;
14
+ upsertTurn(input: TurnRecord): TurnRecord;
15
+ updateTurn(turnId: string, updates: Partial<TurnRecord>): TurnRecord;
16
+ createJob(input: Omit<LocalJobRecord, 'id' | 'createdAt' | 'updatedAt'>): LocalJobRecord;
17
+ getJob(jobId: string): LocalJobRecord | undefined;
18
+ listJobs(): LocalJobRecord[];
19
+ updateJob(jobId: string, updates: Partial<LocalJobRecord>): LocalJobRecord;
20
+ createPendingRequest(input: Omit<PendingServerRequestRecord, 'id' | 'createdAt' | 'updatedAt' | 'status'>): PendingServerRequestRecord;
21
+ getPendingRequest(id: string): PendingServerRequestRecord | undefined;
22
+ getPendingRequestByRequestId(requestId: string, connectionKey: string): PendingServerRequestRecord | undefined;
23
+ listPendingRequests(status?: PendingServerRequestRecord['status']): PendingServerRequestRecord[];
24
+ resolvePendingRequest(id: string, response: Record<string, unknown>): PendingServerRequestRecord;
25
+ failPendingRequest(id: string, error: string): PendingServerRequestRecord;
26
+ appendThreadEvent(input: {
27
+ cwd: string;
28
+ threadId: string;
29
+ payload: Record<string, unknown>;
30
+ logLine?: string | undefined;
31
+ }): Promise<void>;
32
+ persist(): Promise<void>;
33
+ }
@@ -0,0 +1,184 @@
1
+ import { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { generateId } from './ids.js';
4
+ import { ensureStateRoot, logPath, transcriptPath } from './paths.js';
5
+ const EMPTY_STATE = {
6
+ version: 1,
7
+ profiles: [],
8
+ threads: [],
9
+ turns: [],
10
+ pendingRequests: [],
11
+ jobs: [],
12
+ };
13
+ function nowIso() {
14
+ return new Date().toISOString();
15
+ }
16
+ export class PersistentStore {
17
+ root = ensureStateRoot();
18
+ state = structuredClone(EMPTY_STATE);
19
+ async load() {
20
+ if (!existsSync(this.root.registryPath)) {
21
+ this.state = structuredClone(EMPTY_STATE);
22
+ await this.persist();
23
+ return;
24
+ }
25
+ const raw = await readFile(this.root.registryPath, 'utf8');
26
+ const parsed = JSON.parse(raw);
27
+ this.state = {
28
+ version: 1,
29
+ profiles: parsed.profiles ?? [],
30
+ threads: parsed.threads ?? [],
31
+ turns: parsed.turns ?? [],
32
+ pendingRequests: parsed.pendingRequests ?? [],
33
+ jobs: parsed.jobs ?? [],
34
+ };
35
+ }
36
+ getProfiles() {
37
+ return this.state.profiles.map((profile) => ({ ...profile }));
38
+ }
39
+ setProfiles(profiles) {
40
+ this.state.profiles = profiles.map((profile) => ({ ...profile }));
41
+ }
42
+ listThreads() {
43
+ return [...this.state.threads].sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
44
+ }
45
+ getThread(threadId) {
46
+ const lowered = threadId.toLowerCase();
47
+ return this.state.threads.find((thread) => thread.id.toLowerCase() === lowered);
48
+ }
49
+ upsertThread(input) {
50
+ const existing = this.getThread(input.id);
51
+ if (existing) {
52
+ Object.assign(existing, input, { updatedAt: nowIso() });
53
+ return existing;
54
+ }
55
+ const record = { ...input };
56
+ this.state.threads.push(record);
57
+ return record;
58
+ }
59
+ updateThread(threadId, updates) {
60
+ const thread = this.getThread(threadId);
61
+ if (!thread) {
62
+ throw new Error(`Thread not found: ${threadId}`);
63
+ }
64
+ Object.assign(thread, updates, { updatedAt: nowIso() });
65
+ return thread;
66
+ }
67
+ listTurns(threadId) {
68
+ const turns = threadId ? this.state.turns.filter((turn) => turn.threadId === threadId) : this.state.turns;
69
+ return [...turns].sort((left, right) => right.startedAt.localeCompare(left.startedAt));
70
+ }
71
+ getTurn(turnId) {
72
+ const lowered = turnId.toLowerCase();
73
+ return this.state.turns.find((turn) => turn.id.toLowerCase() === lowered);
74
+ }
75
+ upsertTurn(input) {
76
+ const existing = this.getTurn(input.id);
77
+ if (existing) {
78
+ Object.assign(existing, input);
79
+ return existing;
80
+ }
81
+ const record = { ...input };
82
+ this.state.turns.push(record);
83
+ return record;
84
+ }
85
+ updateTurn(turnId, updates) {
86
+ const turn = this.getTurn(turnId);
87
+ if (!turn) {
88
+ throw new Error(`Turn not found: ${turnId}`);
89
+ }
90
+ Object.assign(turn, updates);
91
+ return turn;
92
+ }
93
+ createJob(input) {
94
+ const timestamp = nowIso();
95
+ const record = {
96
+ ...input,
97
+ id: generateId(),
98
+ createdAt: timestamp,
99
+ updatedAt: timestamp,
100
+ };
101
+ this.state.jobs.push(record);
102
+ return record;
103
+ }
104
+ getJob(jobId) {
105
+ const lowered = jobId.toLowerCase();
106
+ return this.state.jobs.find((job) => job.id.toLowerCase() === lowered);
107
+ }
108
+ listJobs() {
109
+ return [...this.state.jobs].sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
110
+ }
111
+ updateJob(jobId, updates) {
112
+ const job = this.getJob(jobId);
113
+ if (!job) {
114
+ throw new Error(`Job not found: ${jobId}`);
115
+ }
116
+ Object.assign(job, updates, { updatedAt: nowIso() });
117
+ return job;
118
+ }
119
+ createPendingRequest(input) {
120
+ const existing = this.getPendingRequestByRequestId(input.requestId, input.connectionKey);
121
+ const timestamp = nowIso();
122
+ if (existing) {
123
+ Object.assign(existing, input, { status: 'pending', updatedAt: timestamp });
124
+ return existing;
125
+ }
126
+ const record = {
127
+ ...input,
128
+ id: generateId(),
129
+ status: 'pending',
130
+ createdAt: timestamp,
131
+ updatedAt: timestamp,
132
+ };
133
+ this.state.pendingRequests.push(record);
134
+ return record;
135
+ }
136
+ getPendingRequest(id) {
137
+ const lowered = id.toLowerCase();
138
+ return this.state.pendingRequests.find((request) => request.id.toLowerCase() === lowered);
139
+ }
140
+ getPendingRequestByRequestId(requestId, connectionKey) {
141
+ return this.state.pendingRequests.find((entry) => entry.requestId === requestId && entry.connectionKey === connectionKey);
142
+ }
143
+ listPendingRequests(status) {
144
+ const entries = status ? this.state.pendingRequests.filter((entry) => entry.status === status) : this.state.pendingRequests;
145
+ return [...entries].sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));
146
+ }
147
+ resolvePendingRequest(id, response) {
148
+ const request = this.getPendingRequest(id);
149
+ if (!request) {
150
+ throw new Error(`Pending request not found: ${id}`);
151
+ }
152
+ Object.assign(request, {
153
+ status: 'responded',
154
+ response,
155
+ resolvedAt: nowIso(),
156
+ updatedAt: nowIso(),
157
+ });
158
+ return request;
159
+ }
160
+ failPendingRequest(id, error) {
161
+ const request = this.getPendingRequest(id);
162
+ if (!request) {
163
+ throw new Error(`Pending request not found: ${id}`);
164
+ }
165
+ Object.assign(request, {
166
+ status: 'failed',
167
+ error,
168
+ resolvedAt: nowIso(),
169
+ updatedAt: nowIso(),
170
+ });
171
+ return request;
172
+ }
173
+ async appendThreadEvent(input) {
174
+ await mkdir(ensureStateRoot().rootDir, { recursive: true });
175
+ await appendFile(transcriptPath(input.cwd, input.threadId), `${JSON.stringify(input.payload)}\n`);
176
+ if (input.logLine) {
177
+ await appendFile(logPath(input.cwd, input.threadId), `${input.logLine}\n`);
178
+ }
179
+ }
180
+ async persist() {
181
+ await writeFile(this.root.registryPath, JSON.stringify(this.state, null, 2));
182
+ }
183
+ }
184
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ export type WorkerFailureCategory = 'auth' | 'rate_limit' | 'connection' | 'transient' | 'fatal';
2
+ export interface WorkerFailureInfo {
3
+ category: WorkerFailureCategory;
4
+ retryable: boolean;
5
+ message: string;
6
+ code?: number | undefined;
7
+ }
8
+ export interface AccountProfileState {
9
+ id: string;
10
+ codexHome: string;
11
+ cooldownUntil?: number | undefined;
12
+ failureCount: number;
13
+ lastFailureReason?: string | undefined;
14
+ lastFailureCategory?: WorkerFailureCategory | undefined;
15
+ lastFailureAt?: string | undefined;
16
+ lastSuccessAt?: string | undefined;
17
+ }
18
+ export interface ThreadRecord {
19
+ id: string;
20
+ cwd: string;
21
+ codexHome: string;
22
+ model: string;
23
+ modelProvider: string;
24
+ status: string;
25
+ createdAt: string;
26
+ updatedAt: string;
27
+ latestTurnId?: string | undefined;
28
+ lastError?: string | undefined;
29
+ }
30
+ export interface TurnRecord {
31
+ id: string;
32
+ threadId: string;
33
+ status: string;
34
+ source: 'turn/start' | 'turn/steer' | 'alias/run' | 'alias/send';
35
+ inputFilePath?: string | undefined;
36
+ promptPreview: string;
37
+ startedAt: string;
38
+ completedAt?: string | undefined;
39
+ error?: string | undefined;
40
+ }
41
+ export interface PendingServerRequestRecord {
42
+ id: string;
43
+ requestId: string;
44
+ method: string;
45
+ threadId?: string | undefined;
46
+ turnId?: string | undefined;
47
+ connectionKey: string;
48
+ codexHome: string;
49
+ cwd: string;
50
+ status: 'pending' | 'responded' | 'failed';
51
+ params: Record<string, unknown>;
52
+ createdAt: string;
53
+ updatedAt: string;
54
+ resolvedAt?: string | undefined;
55
+ response?: Record<string, unknown> | undefined;
56
+ error?: string | undefined;
57
+ }
58
+ export interface LocalJobRecord {
59
+ id: string;
60
+ alias: 'run' | 'send';
61
+ threadId: string;
62
+ turnId: string;
63
+ status: 'running' | 'waiting_request' | 'completed' | 'failed' | 'interrupted';
64
+ createdAt: string;
65
+ updatedAt: string;
66
+ inputFilePath: string;
67
+ outputLogPath: string;
68
+ error?: string | undefined;
69
+ }
70
+ export interface StateFile {
71
+ version: 1;
72
+ profiles: AccountProfileState[];
73
+ threads: ThreadRecord[];
74
+ turns: TurnRecord[];
75
+ pendingRequests: PendingServerRequestRecord[];
76
+ jobs: LocalJobRecord[];
77
+ }
78
+ export interface DaemonMeta {
79
+ pid: number;
80
+ socketPath: string;
81
+ token: string;
82
+ startedAt: string;
83
+ }
84
+ export type DaemonCommand = 'daemon.status' | 'daemon.stop' | 'thread.start' | 'thread.resume' | 'thread.read' | 'thread.list' | 'turn.start' | 'turn.steer' | 'turn.interrupt' | 'model.list' | 'account.read' | 'account.rate-limits' | 'skills.list' | 'app.list' | 'request.list' | 'request.read' | 'request.respond' | 'wait' | 'doctor' | 'run' | 'send' | 'read';
85
+ export interface DaemonRequestEnvelope {
86
+ id: string;
87
+ token: string;
88
+ command: DaemonCommand;
89
+ args?: Record<string, unknown> | undefined;
90
+ }
91
+ export interface DaemonResponseEnvelope {
92
+ id: string;
93
+ type: 'event' | 'result' | 'error';
94
+ event?: string | undefined;
95
+ data?: Record<string, unknown> | undefined;
96
+ error?: string | undefined;
97
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { DaemonMeta, DaemonRequestEnvelope } from '../core/types.js';
2
+ export declare function ensureDaemonMeta(): Promise<DaemonMeta>;
3
+ export declare function sendDaemonRequest(command: DaemonRequestEnvelope['command'], args?: Record<string, unknown>, options?: {
4
+ onEvent?: ((event: string, data: Record<string, unknown>) => void) | undefined;
5
+ }): Promise<Record<string, unknown>>;
6
+ export declare function daemonIsRunning(): Promise<boolean>;
@@ -0,0 +1,117 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import net from 'node:net';
4
+ import { spawn } from 'node:child_process';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { buildDaemonToken, ensureStateRoot } from '../core/paths.js';
7
+ function delay(ms) {
8
+ return new Promise((resolve) => setTimeout(resolve, ms));
9
+ }
10
+ function cliLaunchSpec() {
11
+ const compiledCliPath = fileURLToPath(new URL('../cli.js', import.meta.url));
12
+ if (existsSync(compiledCliPath)) {
13
+ return {
14
+ command: process.execPath,
15
+ args: [compiledCliPath, 'daemon-run'],
16
+ };
17
+ }
18
+ const sourceCliPath = fileURLToPath(new URL('../cli.ts', import.meta.url));
19
+ return {
20
+ command: process.execPath,
21
+ args: ['--import', 'tsx', sourceCliPath, 'daemon-run'],
22
+ };
23
+ }
24
+ async function readDaemonMeta() {
25
+ const { daemonMetaPath } = ensureStateRoot();
26
+ if (!existsSync(daemonMetaPath)) {
27
+ return null;
28
+ }
29
+ try {
30
+ const raw = await readFile(daemonMetaPath, 'utf8');
31
+ return JSON.parse(raw);
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ async function canConnect(socketPath) {
38
+ return await new Promise((resolve) => {
39
+ const socket = net.createConnection(socketPath, () => {
40
+ socket.end();
41
+ resolve(true);
42
+ });
43
+ socket.on('error', () => resolve(false));
44
+ });
45
+ }
46
+ export async function ensureDaemonMeta() {
47
+ const existing = await readDaemonMeta();
48
+ if (existing && await canConnect(existing.socketPath)) {
49
+ return existing;
50
+ }
51
+ const { socketPath } = ensureStateRoot();
52
+ const token = buildDaemonToken();
53
+ const launchSpec = cliLaunchSpec();
54
+ const child = spawn(launchSpec.command, launchSpec.args, {
55
+ detached: true,
56
+ stdio: 'ignore',
57
+ env: {
58
+ ...process.env,
59
+ CODEX_WORKER_DAEMON_SOCKET: socketPath,
60
+ CODEX_WORKER_DAEMON_TOKEN: token,
61
+ },
62
+ });
63
+ child.unref();
64
+ for (let attempt = 0; attempt < 60; attempt += 1) {
65
+ const current = await readDaemonMeta();
66
+ if (current && await canConnect(current.socketPath)) {
67
+ return current;
68
+ }
69
+ await delay(100);
70
+ }
71
+ throw new Error('Timed out waiting for codex-worker daemon to start');
72
+ }
73
+ export async function sendDaemonRequest(command, args, options) {
74
+ const meta = await ensureDaemonMeta();
75
+ const request = {
76
+ id: `${Date.now()}`,
77
+ token: meta.token,
78
+ command,
79
+ args,
80
+ };
81
+ return await new Promise((resolve, reject) => {
82
+ let buffer = '';
83
+ const socket = net.createConnection(meta.socketPath);
84
+ socket.on('connect', () => {
85
+ socket.write(`${JSON.stringify(request)}\n`);
86
+ });
87
+ socket.on('data', (chunk) => {
88
+ buffer += chunk.toString('utf8');
89
+ let newlineIndex = buffer.indexOf('\n');
90
+ while (newlineIndex >= 0) {
91
+ const line = buffer.slice(0, newlineIndex).trim();
92
+ buffer = buffer.slice(newlineIndex + 1);
93
+ if (line) {
94
+ const envelope = JSON.parse(line);
95
+ if (envelope.type === 'event') {
96
+ options?.onEvent?.(envelope.event ?? 'event', envelope.data ?? {});
97
+ }
98
+ else if (envelope.type === 'result') {
99
+ socket.end();
100
+ resolve(envelope.data ?? {});
101
+ }
102
+ else {
103
+ socket.end();
104
+ reject(new Error(envelope.error ?? 'Unknown daemon error'));
105
+ }
106
+ }
107
+ newlineIndex = buffer.indexOf('\n');
108
+ }
109
+ });
110
+ socket.on('error', reject);
111
+ });
112
+ }
113
+ export async function daemonIsRunning() {
114
+ const meta = await readDaemonMeta();
115
+ return Boolean(meta && await canConnect(meta.socketPath));
116
+ }
117
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/daemon/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runDaemonServer(): Promise<void>;
@@ -0,0 +1,176 @@
1
+ import net from 'node:net';
2
+ import { existsSync } from 'node:fs';
3
+ import { unlink } from 'node:fs/promises';
4
+ import { ensureStateRoot } from '../core/paths.js';
5
+ import { CliCodexWorkerService } from './service.js';
6
+ function writeEnvelope(socket, envelope) {
7
+ socket.write(`${JSON.stringify(envelope)}\n`);
8
+ }
9
+ export async function runDaemonServer() {
10
+ const socketPath = process.env.CODEX_WORKER_DAEMON_SOCKET
11
+ ?? process.env.CLI_CODEX_WORKER_DAEMON_SOCKET
12
+ ?? ensureStateRoot().socketPath;
13
+ const token = process.env.CODEX_WORKER_DAEMON_TOKEN
14
+ ?? process.env.CLI_CODEX_WORKER_DAEMON_TOKEN;
15
+ if (!token) {
16
+ throw new Error('Missing CODEX_WORKER_DAEMON_TOKEN');
17
+ }
18
+ if (existsSync(socketPath)) {
19
+ await unlink(socketPath).catch(() => { });
20
+ }
21
+ const service = new CliCodexWorkerService();
22
+ await service.initialize();
23
+ await service.writeDaemonMeta(socketPath, token);
24
+ const shutdown = async () => {
25
+ await service.shutdown().catch(() => { });
26
+ server.close();
27
+ process.exit(0);
28
+ };
29
+ const server = net.createServer((socket) => {
30
+ let buffer = '';
31
+ socket.on('data', (chunk) => {
32
+ buffer += chunk.toString('utf8');
33
+ let newlineIndex = buffer.indexOf('\n');
34
+ while (newlineIndex >= 0) {
35
+ const line = buffer.slice(0, newlineIndex).trim();
36
+ buffer = buffer.slice(newlineIndex + 1);
37
+ if (line) {
38
+ void handleRequest(line, socket, token, service, shutdown);
39
+ }
40
+ newlineIndex = buffer.indexOf('\n');
41
+ }
42
+ });
43
+ });
44
+ await new Promise((resolve, reject) => {
45
+ server.once('error', reject);
46
+ server.listen(socketPath, () => resolve());
47
+ });
48
+ process.on('SIGINT', () => void shutdown());
49
+ process.on('SIGTERM', () => void shutdown());
50
+ }
51
+ async function handleRequest(line, socket, token, service, shutdown) {
52
+ let envelope;
53
+ try {
54
+ envelope = JSON.parse(line);
55
+ }
56
+ catch {
57
+ writeEnvelope(socket, {
58
+ id: 'unknown',
59
+ type: 'error',
60
+ error: 'Invalid JSON request',
61
+ });
62
+ return;
63
+ }
64
+ if (envelope.token !== token) {
65
+ writeEnvelope(socket, {
66
+ id: envelope.id,
67
+ type: 'error',
68
+ error: 'Unauthorized',
69
+ });
70
+ return;
71
+ }
72
+ const writer = {
73
+ event(name, data) {
74
+ writeEnvelope(socket, {
75
+ id: envelope.id,
76
+ type: 'event',
77
+ event: name,
78
+ data,
79
+ });
80
+ },
81
+ };
82
+ try {
83
+ let result;
84
+ let shouldShutdown = false;
85
+ switch (envelope.command) {
86
+ case 'daemon.status':
87
+ result = await service.daemonStatus();
88
+ break;
89
+ case 'daemon.stop':
90
+ result = await service.shutdown();
91
+ shouldShutdown = true;
92
+ break;
93
+ case 'thread.start':
94
+ result = await service.threadStart(envelope.args ?? {}, writer);
95
+ break;
96
+ case 'thread.resume':
97
+ result = await service.threadResume(envelope.args ?? {});
98
+ break;
99
+ case 'thread.read':
100
+ result = await service.threadRead(envelope.args ?? {});
101
+ break;
102
+ case 'thread.list':
103
+ result = await service.threadList(envelope.args ?? {});
104
+ break;
105
+ case 'turn.start':
106
+ result = await service.turnStart(envelope.args ?? {}, writer);
107
+ break;
108
+ case 'turn.steer':
109
+ result = await service.turnSteer(envelope.args ?? {}, writer);
110
+ break;
111
+ case 'turn.interrupt':
112
+ result = await service.turnInterrupt(envelope.args ?? {});
113
+ break;
114
+ case 'model.list':
115
+ result = await service.modelList(envelope.args ?? {});
116
+ break;
117
+ case 'account.read':
118
+ result = await service.accountRead(envelope.args ?? {});
119
+ break;
120
+ case 'account.rate-limits':
121
+ result = await service.accountRateLimits(envelope.args ?? {});
122
+ break;
123
+ case 'skills.list':
124
+ result = await service.skillsList(envelope.args ?? {});
125
+ break;
126
+ case 'app.list':
127
+ result = await service.appList(envelope.args ?? {});
128
+ break;
129
+ case 'request.list':
130
+ result = await service.requestList(envelope.args ?? {});
131
+ break;
132
+ case 'request.read':
133
+ result = await service.requestRead(envelope.args ?? {});
134
+ break;
135
+ case 'request.respond':
136
+ result = await service.requestRespond(envelope.args ?? {});
137
+ break;
138
+ case 'wait':
139
+ result = await service.wait(envelope.args ?? {}, writer);
140
+ break;
141
+ case 'doctor':
142
+ result = await service.doctor();
143
+ break;
144
+ case 'run':
145
+ result = await service.run(envelope.args ?? {}, writer);
146
+ break;
147
+ case 'send':
148
+ result = await service.send(envelope.args ?? {}, writer);
149
+ break;
150
+ case 'read':
151
+ result = await service.read(envelope.args ?? {});
152
+ break;
153
+ default:
154
+ throw new Error(`Unknown command: ${envelope.command}`);
155
+ }
156
+ writeEnvelope(socket, {
157
+ id: envelope.id,
158
+ type: 'result',
159
+ data: result,
160
+ });
161
+ if (shouldShutdown) {
162
+ socket.end();
163
+ setTimeout(() => {
164
+ void shutdown();
165
+ }, 10).unref();
166
+ }
167
+ }
168
+ catch (error) {
169
+ writeEnvelope(socket, {
170
+ id: envelope.id,
171
+ type: 'error',
172
+ error: error instanceof Error ? error.message : String(error),
173
+ });
174
+ }
175
+ }
176
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/daemon/server.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,SAAS,aAAa,CAAC,MAAkB,EAAE,QAAgC;IACzE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B;WACpD,OAAO,CAAC,GAAG,CAAC,8BAA8B;WAC1C,eAAe,EAAE,CAAC,UAAU,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB;WAC9C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;IAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC5C,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3B,MAAM,OAAO,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE;QACzC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,YAAY,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;gBACxC,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC7D,CAAC;gBACD,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,MAAkB,EAClB,KAAa,EACb,OAA8B,EAC9B,QAA6B;IAE7B,IAAI,QAA+B,CAAC;IACpC,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,CAAC,MAAM,EAAE;YACpB,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,sBAAsB;SAC9B,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC7B,aAAa,CAAC,MAAM,EAAE;YACpB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,cAAc;SACtB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG;QACb,KAAK,CAAC,IAAY,EAAE,IAA6B;YAC/C,aAAa,CAAC,MAAM,EAAE;gBACpB,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,IAAI;gBACX,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,MAA+B,CAAC;QACpC,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,QAAQ,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzB,KAAK,eAAe;gBAClB,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;gBACtC,MAAM;YACR,KAAK,aAAa;gBAChB,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAClC,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,KAAK,cAAc;gBACjB,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;gBAChE,MAAM;YACR,KAAK,eAAe;gBAClB,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,aAAa;gBAChB,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACvD,MAAM;YACR,KAAK,aAAa;gBAChB,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACvD,MAAM;YACR,KAAK,YAAY;gBACf,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC9D,MAAM;YACR,KAAK,YAAY;gBACf,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC9D,MAAM;YACR,KAAK,gBAAgB;gBACnB,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,YAAY;gBACf,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,cAAc;gBACjB,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,qBAAqB;gBACxB,MAAM,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC9D,MAAM;YACR,KAAK,aAAa;gBAChB,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACvD,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,cAAc;gBACjB,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,cAAc;gBACjB,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,iBAAiB;gBACpB,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM;YACR,KAAK,KAAK;gBACR,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;gBACzD,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACjD,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,aAAa,CAAC,MAAM,EAAE;YACpB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QACH,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,QAAQ,EAAE,CAAC;YAClB,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,aAAa,CAAC,MAAM,EAAE;YACpB,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}