@lumenflow/runtime 3.0.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.
@@ -0,0 +1,45 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { createConnection } from 'node:net';
4
+ export async function sendDaemonRequest(socketPath, request, timeoutMs = 1000) {
5
+ return new Promise((resolve, reject) => {
6
+ const socket = createConnection(socketPath);
7
+ const timeout = setTimeout(() => {
8
+ socket.destroy();
9
+ reject(new Error(`Daemon request timed out after ${timeoutMs}ms`));
10
+ }, timeoutMs);
11
+ let buffer = '';
12
+ socket.on('connect', () => {
13
+ socket.write(`${JSON.stringify(request)}\n`);
14
+ });
15
+ socket.on('data', (chunk) => {
16
+ buffer += chunk.toString('utf8');
17
+ const newlineIndex = buffer.indexOf('\n');
18
+ if (newlineIndex < 0) {
19
+ return;
20
+ }
21
+ const line = buffer.slice(0, newlineIndex);
22
+ clearTimeout(timeout);
23
+ socket.end();
24
+ try {
25
+ resolve(JSON.parse(line));
26
+ }
27
+ catch (error) {
28
+ reject(error);
29
+ }
30
+ });
31
+ socket.on('error', (error) => {
32
+ clearTimeout(timeout);
33
+ reject(error);
34
+ });
35
+ });
36
+ }
37
+ export async function routeRequestWithDaemonFallback(input) {
38
+ try {
39
+ return await sendDaemonRequest(input.socketPath, input.request);
40
+ }
41
+ catch {
42
+ return input.inProcessHandler(input.request);
43
+ }
44
+ }
45
+ //# sourceMappingURL=daemon-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../src/client/daemon-client.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAS5C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,OAAsB,EACtB,SAAS,GAAG,IAAI;IAEhB,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,SAAS,IAAI,CAAC,CAAC,CAAC;QACrE,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YAC3C,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,EAAE,CAAC;YAEb,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAA6B;IAE7B,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { TaskScheduler } from '../scheduler/task-scheduler.js';
2
+ import { SessionManager } from '../session/session-manager.js';
3
+ export interface RuntimeDaemonOptions {
4
+ socketPath: string;
5
+ pidFilePath: string;
6
+ scheduler: TaskScheduler;
7
+ sessionManager: SessionManager;
8
+ }
9
+ export declare class RuntimeDaemon {
10
+ private readonly socketPath;
11
+ private readonly pidFilePath;
12
+ private readonly scheduler;
13
+ private readonly sessionManager;
14
+ private readonly handlerRegistry;
15
+ private readonly transport;
16
+ private signalBound;
17
+ private sigtermHandler;
18
+ private sigintHandler;
19
+ constructor(options: RuntimeDaemonOptions);
20
+ start(): Promise<void>;
21
+ stop(): Promise<void>;
22
+ isRunning(): boolean;
23
+ handleSignal(_signal: 'SIGTERM' | 'SIGINT'): Promise<void>;
24
+ private invalidParamsResponse;
25
+ private createHandlerRegistry;
26
+ private isRequestType;
27
+ private getHandlerForMethod;
28
+ private handlePing;
29
+ private handleSchedulerEnqueue;
30
+ private handleSchedulerDequeue;
31
+ private handleSessionCreate;
32
+ private handleSessionCheckpoint;
33
+ private handleSessionRestore;
34
+ private handleRequest;
35
+ private bindSignals;
36
+ private unbindSignals;
37
+ }
38
+ //# sourceMappingURL=runtime-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-daemon.d.ts","sourceRoot":"","sources":["../../src/daemon/runtime-daemon.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAyC/D,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAA6B;gBAEtC,OAAO,EAAE,oBAAoB;IAYnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,SAAS,IAAI,OAAO;IAId,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,mBAAmB;YAOb,UAAU;YAcV,sBAAsB;YAgBtB,sBAAsB;YAYtB,mBAAmB;YAcnB,uBAAuB;YAiBvB,oBAAoB;YAcpB,aAAa;IAa3B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,aAAa;CActB"}
@@ -0,0 +1,224 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { mkdir, rm, writeFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { z } from 'zod';
6
+ import { TaskScheduler } from '../scheduler/task-scheduler.js';
7
+ import { SessionManager } from '../session/session-manager.js';
8
+ import { UnixSocketServer, } from '../transport/unix-socket-server.js';
9
+ const SchedulerEnqueueParamsSchema = z.object({
10
+ task_id: z.string().min(1),
11
+ lane_id: z.string().min(1),
12
+ priority: z.enum(['P0', 'P1', 'P2', 'P3']),
13
+ payload: z.record(z.string(), z.unknown()).optional(),
14
+ });
15
+ const EmptyParamsSchema = z.record(z.string(), z.unknown());
16
+ const SessionCreateParamsSchema = z.object({
17
+ agent_id: z.string().min(1),
18
+ });
19
+ const SessionCheckpointParamsSchema = z.object({
20
+ session_id: z.string().min(1),
21
+ state: z.record(z.string(), z.unknown()),
22
+ });
23
+ const SessionRestoreParamsSchema = z.object({
24
+ session_id: z.string().min(1),
25
+ });
26
+ const REQUEST_TYPES = {
27
+ PING: 'ping',
28
+ SCHEDULER_ENQUEUE: 'scheduler.enqueue',
29
+ SCHEDULER_DEQUEUE: 'scheduler.dequeue',
30
+ SESSION_CREATE: 'session.create',
31
+ SESSION_CHECKPOINT: 'session.checkpoint',
32
+ SESSION_RESTORE: 'session.restore',
33
+ };
34
+ const REQUEST_TYPE_VALUES = new Set(Object.values(REQUEST_TYPES));
35
+ export class RuntimeDaemon {
36
+ socketPath;
37
+ pidFilePath;
38
+ scheduler;
39
+ sessionManager;
40
+ handlerRegistry;
41
+ transport;
42
+ signalBound = false;
43
+ sigtermHandler = null;
44
+ sigintHandler = null;
45
+ constructor(options) {
46
+ this.socketPath = path.resolve(options.socketPath);
47
+ this.pidFilePath = path.resolve(options.pidFilePath);
48
+ this.scheduler = options.scheduler;
49
+ this.sessionManager = options.sessionManager;
50
+ this.handlerRegistry = this.createHandlerRegistry();
51
+ this.transport = new UnixSocketServer({
52
+ socketPath: this.socketPath,
53
+ handler: async (request) => this.handleRequest(request),
54
+ });
55
+ }
56
+ async start() {
57
+ if (this.isRunning()) {
58
+ return;
59
+ }
60
+ await mkdir(path.dirname(this.pidFilePath), { recursive: true });
61
+ await writeFile(this.pidFilePath, String(process.pid), 'utf8');
62
+ await this.transport.start();
63
+ this.bindSignals();
64
+ }
65
+ async stop() {
66
+ if (!this.isRunning()) {
67
+ await rm(this.pidFilePath, { force: true });
68
+ return;
69
+ }
70
+ await this.transport.stop();
71
+ await rm(this.pidFilePath, { force: true });
72
+ this.unbindSignals();
73
+ }
74
+ isRunning() {
75
+ return this.transport.isRunning();
76
+ }
77
+ async handleSignal(_signal) {
78
+ await this.stop();
79
+ }
80
+ invalidParamsResponse(requestId, method, message) {
81
+ return {
82
+ id: requestId,
83
+ ok: false,
84
+ error: `Invalid params for ${method}: ${message}`,
85
+ };
86
+ }
87
+ createHandlerRegistry() {
88
+ return new Map([
89
+ [REQUEST_TYPES.PING, this.handlePing.bind(this)],
90
+ [REQUEST_TYPES.SCHEDULER_ENQUEUE, this.handleSchedulerEnqueue.bind(this)],
91
+ [REQUEST_TYPES.SCHEDULER_DEQUEUE, this.handleSchedulerDequeue.bind(this)],
92
+ [REQUEST_TYPES.SESSION_CREATE, this.handleSessionCreate.bind(this)],
93
+ [REQUEST_TYPES.SESSION_CHECKPOINT, this.handleSessionCheckpoint.bind(this)],
94
+ [REQUEST_TYPES.SESSION_RESTORE, this.handleSessionRestore.bind(this)],
95
+ ]);
96
+ }
97
+ isRequestType(method) {
98
+ return REQUEST_TYPE_VALUES.has(method);
99
+ }
100
+ getHandlerForMethod(method) {
101
+ if (!this.isRequestType(method)) {
102
+ return null;
103
+ }
104
+ return this.handlerRegistry.get(method) ?? null;
105
+ }
106
+ async handlePing(request) {
107
+ const parsedParams = EmptyParamsSchema.safeParse(request.params);
108
+ if (!parsedParams.success) {
109
+ return this.invalidParamsResponse(request.id, request.method, parsedParams.error.message);
110
+ }
111
+ return {
112
+ id: request.id,
113
+ ok: true,
114
+ result: {
115
+ status: 'ok',
116
+ },
117
+ };
118
+ }
119
+ async handleSchedulerEnqueue(request) {
120
+ const parsedParams = SchedulerEnqueueParamsSchema.safeParse(request.params);
121
+ if (!parsedParams.success) {
122
+ return this.invalidParamsResponse(request.id, request.method, parsedParams.error.message);
123
+ }
124
+ this.scheduler.enqueue(parsedParams.data);
125
+ return {
126
+ id: request.id,
127
+ ok: true,
128
+ result: {
129
+ enqueued: true,
130
+ },
131
+ };
132
+ }
133
+ async handleSchedulerDequeue(request) {
134
+ const parsedParams = EmptyParamsSchema.safeParse(request.params);
135
+ if (!parsedParams.success) {
136
+ return this.invalidParamsResponse(request.id, request.method, parsedParams.error.message);
137
+ }
138
+ return {
139
+ id: request.id,
140
+ ok: true,
141
+ result: this.scheduler.dequeue(),
142
+ };
143
+ }
144
+ async handleSessionCreate(request) {
145
+ const parsedParams = SessionCreateParamsSchema.safeParse(request.params);
146
+ if (!parsedParams.success) {
147
+ return this.invalidParamsResponse(request.id, request.method, parsedParams.error.message);
148
+ }
149
+ const result = await this.sessionManager.createSession(parsedParams.data);
150
+ return {
151
+ id: request.id,
152
+ ok: true,
153
+ result,
154
+ };
155
+ }
156
+ async handleSessionCheckpoint(request) {
157
+ const parsedParams = SessionCheckpointParamsSchema.safeParse(request.params);
158
+ if (!parsedParams.success) {
159
+ return this.invalidParamsResponse(request.id, request.method, parsedParams.error.message);
160
+ }
161
+ const result = await this.sessionManager.checkpoint(parsedParams.data.session_id, parsedParams.data.state);
162
+ return {
163
+ id: request.id,
164
+ ok: true,
165
+ result,
166
+ };
167
+ }
168
+ async handleSessionRestore(request) {
169
+ const parsedParams = SessionRestoreParamsSchema.safeParse(request.params);
170
+ if (!parsedParams.success) {
171
+ return this.invalidParamsResponse(request.id, request.method, parsedParams.error.message);
172
+ }
173
+ const result = await this.sessionManager.restore(parsedParams.data.session_id);
174
+ return {
175
+ id: request.id,
176
+ ok: true,
177
+ result,
178
+ };
179
+ }
180
+ async handleRequest(request) {
181
+ const handler = this.getHandlerForMethod(request.method);
182
+ if (!handler) {
183
+ return {
184
+ id: request.id,
185
+ ok: false,
186
+ error: `Unknown method: ${request.method}`,
187
+ };
188
+ }
189
+ return handler(request);
190
+ }
191
+ bindSignals() {
192
+ if (this.signalBound) {
193
+ return;
194
+ }
195
+ this.sigtermHandler = () => {
196
+ this.handleSignal('SIGTERM').catch(() => {
197
+ // no-op: shutdown best-effort
198
+ });
199
+ };
200
+ this.sigintHandler = () => {
201
+ this.handleSignal('SIGINT').catch(() => {
202
+ // no-op: shutdown best-effort
203
+ });
204
+ };
205
+ this.signalBound = true;
206
+ process.once('SIGTERM', this.sigtermHandler);
207
+ process.once('SIGINT', this.sigintHandler);
208
+ }
209
+ unbindSignals() {
210
+ if (!this.signalBound) {
211
+ return;
212
+ }
213
+ if (this.sigtermHandler) {
214
+ process.removeListener('SIGTERM', this.sigtermHandler);
215
+ }
216
+ if (this.sigintHandler) {
217
+ process.removeListener('SIGINT', this.sigintHandler);
218
+ }
219
+ this.sigtermHandler = null;
220
+ this.sigintHandler = null;
221
+ this.signalBound = false;
222
+ }
223
+ }
224
+ //# sourceMappingURL=runtime-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-daemon.js","sourceRoot":"","sources":["../../src/daemon/runtime-daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './client/daemon-client.js';
2
+ export * from './daemon/runtime-daemon.js';
3
+ export * from './scheduler/task-scheduler.js';
4
+ export * from './session/session-manager.js';
5
+ export * from './transport/unix-socket-server.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export * from './client/daemon-client.js';
4
+ export * from './daemon/runtime-daemon.js';
5
+ export * from './scheduler/task-scheduler.js';
6
+ export * from './session/session-manager.js';
7
+ export * from './transport/unix-socket-server.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC"}
@@ -0,0 +1,27 @@
1
+ export type TaskPriority = 'P0' | 'P1' | 'P2' | 'P3';
2
+ export interface ScheduledTask {
3
+ task_id: string;
4
+ lane_id: string;
5
+ priority: TaskPriority;
6
+ payload?: Record<string, unknown>;
7
+ }
8
+ export interface TaskSchedulerOptions {
9
+ laneWipLimits?: Record<string, number>;
10
+ }
11
+ export declare class TaskScheduler {
12
+ private readonly laneWipLimits;
13
+ private readonly queue;
14
+ private readonly activeByLane;
15
+ private readonly activeByTask;
16
+ private readonly dequeuedByTask;
17
+ private sequenceCounter;
18
+ constructor(options?: TaskSchedulerOptions);
19
+ enqueue(task: ScheduledTask): void;
20
+ dequeue(): ScheduledTask | null;
21
+ markStarted(taskId: string): void;
22
+ markCompleted(taskId: string): void;
23
+ getQueueDepth(): number;
24
+ getLaneActiveCount(laneId: string): number;
25
+ private canStartInLane;
26
+ }
27
+ //# sourceMappingURL=task-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/task-scheduler.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAcD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,eAAe,CAAS;gBAEpB,OAAO,GAAE,oBAAyB;IAS9C,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAQlC,OAAO,IAAI,aAAa,GAAG,IAAI;IAgC/B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYjC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBnC,aAAa,IAAI,MAAM;IAIvB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI1C,OAAO,CAAC,cAAc;CAOvB"}
@@ -0,0 +1,95 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ const PRIORITY_SCORE = {
4
+ P0: 0,
5
+ P1: 1,
6
+ P2: 2,
7
+ P3: 3,
8
+ };
9
+ export class TaskScheduler {
10
+ laneWipLimits;
11
+ queue;
12
+ activeByLane;
13
+ activeByTask;
14
+ dequeuedByTask;
15
+ sequenceCounter;
16
+ constructor(options = {}) {
17
+ this.laneWipLimits = { ...(options.laneWipLimits ?? {}) };
18
+ this.queue = [];
19
+ this.activeByLane = new Map();
20
+ this.activeByTask = new Map();
21
+ this.dequeuedByTask = new Map();
22
+ this.sequenceCounter = 0;
23
+ }
24
+ enqueue(task) {
25
+ this.queue.push({
26
+ task,
27
+ sequence: this.sequenceCounter,
28
+ });
29
+ this.sequenceCounter += 1;
30
+ }
31
+ dequeue() {
32
+ if (this.queue.length === 0) {
33
+ return null;
34
+ }
35
+ const sorted = [...this.queue]
36
+ .map((entry, index) => ({
37
+ entry,
38
+ index,
39
+ }))
40
+ .sort((left, right) => {
41
+ const priorityDelta = PRIORITY_SCORE[left.entry.task.priority] - PRIORITY_SCORE[right.entry.task.priority];
42
+ if (priorityDelta !== 0) {
43
+ return priorityDelta;
44
+ }
45
+ return left.entry.sequence - right.entry.sequence;
46
+ });
47
+ for (const candidate of sorted) {
48
+ if (!this.canStartInLane(candidate.entry.task.lane_id)) {
49
+ continue;
50
+ }
51
+ this.queue.splice(candidate.index, 1);
52
+ this.dequeuedByTask.set(candidate.entry.task.task_id, candidate.entry.task);
53
+ return candidate.entry.task;
54
+ }
55
+ return null;
56
+ }
57
+ markStarted(taskId) {
58
+ const task = this.dequeuedByTask.get(taskId);
59
+ if (!task) {
60
+ return;
61
+ }
62
+ const current = this.activeByLane.get(task.lane_id) ?? 0;
63
+ this.activeByLane.set(task.lane_id, current + 1);
64
+ this.activeByTask.set(task.task_id, task.lane_id);
65
+ this.dequeuedByTask.delete(taskId);
66
+ }
67
+ markCompleted(taskId) {
68
+ const laneId = this.activeByTask.get(taskId);
69
+ if (!laneId) {
70
+ return;
71
+ }
72
+ this.activeByTask.delete(taskId);
73
+ const activeCount = this.activeByLane.get(laneId) ?? 0;
74
+ const next = Math.max(0, activeCount - 1);
75
+ if (next === 0) {
76
+ this.activeByLane.delete(laneId);
77
+ return;
78
+ }
79
+ this.activeByLane.set(laneId, next);
80
+ }
81
+ getQueueDepth() {
82
+ return this.queue.length;
83
+ }
84
+ getLaneActiveCount(laneId) {
85
+ return this.activeByLane.get(laneId) ?? 0;
86
+ }
87
+ canStartInLane(laneId) {
88
+ const limit = this.laneWipLimits[laneId];
89
+ if (typeof limit !== 'number' || limit <= 0) {
90
+ return true;
91
+ }
92
+ return this.getLaneActiveCount(laneId) < limit;
93
+ }
94
+ }
95
+ //# sourceMappingURL=task-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-scheduler.js","sourceRoot":"","sources":["../../src/scheduler/task-scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface SessionManagerOptions {
2
+ checkpointsDir: string;
3
+ }
4
+ export interface SessionRecord {
5
+ session_id: string;
6
+ agent_id: string;
7
+ created_at: string;
8
+ updated_at: string;
9
+ state?: Record<string, unknown>;
10
+ }
11
+ export interface CreateSessionInput {
12
+ agent_id: string;
13
+ }
14
+ export declare class SessionManager {
15
+ private readonly checkpointsDir;
16
+ private readonly sessionsById;
17
+ constructor(options: SessionManagerOptions);
18
+ createSession(input: CreateSessionInput): Promise<SessionRecord>;
19
+ checkpoint(sessionId: string, state: Record<string, unknown>): Promise<SessionRecord>;
20
+ restore(sessionId: string): Promise<SessionRecord | null>;
21
+ closeSession(sessionId: string): Promise<void>;
22
+ private persist;
23
+ private filePath;
24
+ }
25
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;gBAE9C,OAAO,EAAE,qBAAqB;IAKpC,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAchE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAgBrF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAoBzD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAItC,OAAO;IAKrB,OAAO,CAAC,QAAQ;CAGjB"}
@@ -0,0 +1,70 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { randomUUID } from 'node:crypto';
4
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ export class SessionManager {
7
+ checkpointsDir;
8
+ sessionsById;
9
+ constructor(options) {
10
+ this.checkpointsDir = path.resolve(options.checkpointsDir);
11
+ this.sessionsById = new Map();
12
+ }
13
+ async createSession(input) {
14
+ await mkdir(this.checkpointsDir, { recursive: true });
15
+ const now = new Date().toISOString();
16
+ const session = {
17
+ session_id: randomUUID(),
18
+ agent_id: input.agent_id,
19
+ created_at: now,
20
+ updated_at: now,
21
+ };
22
+ this.sessionsById.set(session.session_id, session);
23
+ await this.persist(session);
24
+ return session;
25
+ }
26
+ async checkpoint(sessionId, state) {
27
+ const existing = await this.restore(sessionId);
28
+ if (!existing) {
29
+ throw new Error(`Session not found: ${sessionId}`);
30
+ }
31
+ const updated = {
32
+ ...existing,
33
+ updated_at: new Date().toISOString(),
34
+ state,
35
+ };
36
+ this.sessionsById.set(sessionId, updated);
37
+ await this.persist(updated);
38
+ return updated;
39
+ }
40
+ async restore(sessionId) {
41
+ const inMemory = this.sessionsById.get(sessionId);
42
+ if (inMemory) {
43
+ return inMemory;
44
+ }
45
+ try {
46
+ const data = await readFile(this.filePath(sessionId), 'utf8');
47
+ const parsed = JSON.parse(data);
48
+ this.sessionsById.set(sessionId, parsed);
49
+ return parsed;
50
+ }
51
+ catch (error) {
52
+ const nodeError = error;
53
+ if (nodeError.code === 'ENOENT') {
54
+ return null;
55
+ }
56
+ throw error;
57
+ }
58
+ }
59
+ async closeSession(sessionId) {
60
+ this.sessionsById.delete(sessionId);
61
+ }
62
+ async persist(session) {
63
+ await mkdir(this.checkpointsDir, { recursive: true });
64
+ await writeFile(this.filePath(session.session_id), JSON.stringify(session), 'utf8');
65
+ }
66
+ filePath(sessionId) {
67
+ return path.join(this.checkpointsDir, `${sessionId}.json`);
68
+ }
69
+ }
70
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ export declare const DaemonRequestSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ method: z.ZodString;
5
+ params: z.ZodUnknown;
6
+ }, z.core.$strip>;
7
+ export type DaemonRequest = z.infer<typeof DaemonRequestSchema>;
8
+ export interface DaemonResponse {
9
+ id: string;
10
+ ok: boolean;
11
+ result?: unknown;
12
+ error?: string;
13
+ }
14
+ export type DaemonRequestHandler = (request: DaemonRequest) => Promise<DaemonResponse>;
15
+ export interface UnixSocketServerOptions {
16
+ socketPath: string;
17
+ handler: DaemonRequestHandler;
18
+ }
19
+ export declare class UnixSocketServer {
20
+ private readonly socketPath;
21
+ private readonly handler;
22
+ private server;
23
+ constructor(options: UnixSocketServerOptions);
24
+ start(): Promise<void>;
25
+ stop(): Promise<void>;
26
+ isRunning(): boolean;
27
+ private attachConnection;
28
+ private processLine;
29
+ }
30
+ //# sourceMappingURL=unix-socket-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unix-socket-server.d.ts","sourceRoot":"","sources":["../../src/transport/unix-socket-server.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;iBAI9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAEvF,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,CAAC;CAC/B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,uBAAuB;IAMtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,SAAS,IAAI,OAAO;IAIpB,OAAO,CAAC,gBAAgB;YA0BV,WAAW;CAsC1B"}