@myagentroam/node 0.1.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.
Files changed (68) hide show
  1. package/README.md +17 -0
  2. package/dist/capabilities.d.ts +5 -0
  3. package/dist/capabilities.js +23 -0
  4. package/dist/capabilities.js.map +1 -0
  5. package/dist/claude-agent-sdk.d.ts +101 -0
  6. package/dist/claude-agent-sdk.js +341 -0
  7. package/dist/claude-agent-sdk.js.map +1 -0
  8. package/dist/claude-channel.d.ts +28 -0
  9. package/dist/claude-channel.js +45 -0
  10. package/dist/claude-channel.js.map +1 -0
  11. package/dist/codex-app-server.d.ts +96 -0
  12. package/dist/codex-app-server.js +361 -0
  13. package/dist/codex-app-server.js.map +1 -0
  14. package/dist/config.d.ts +17 -0
  15. package/dist/config.js +51 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/connector.d.ts +343 -0
  18. package/dist/connector.js +5525 -0
  19. package/dist/connector.js.map +1 -0
  20. package/dist/database.d.ts +282 -0
  21. package/dist/database.js +1347 -0
  22. package/dist/database.js.map +1 -0
  23. package/dist/event-buffer.d.ts +12 -0
  24. package/dist/event-buffer.js +29 -0
  25. package/dist/event-buffer.js.map +1 -0
  26. package/dist/fake-runner.d.ts +42 -0
  27. package/dist/fake-runner.js +130 -0
  28. package/dist/fake-runner.js.map +1 -0
  29. package/dist/health.d.ts +4 -0
  30. package/dist/health.js +4 -0
  31. package/dist/health.js.map +1 -0
  32. package/dist/main.d.ts +2 -0
  33. package/dist/main.js +47 -0
  34. package/dist/main.js.map +1 -0
  35. package/dist/native-session-history.d.ts +72 -0
  36. package/dist/native-session-history.js +647 -0
  37. package/dist/native-session-history.js.map +1 -0
  38. package/dist/operational.d.ts +30 -0
  39. package/dist/operational.js +82 -0
  40. package/dist/operational.js.map +1 -0
  41. package/dist/process-tree.d.ts +9 -0
  42. package/dist/process-tree.js +19 -0
  43. package/dist/process-tree.js.map +1 -0
  44. package/dist/runner-command-engine.d.ts +19 -0
  45. package/dist/runner-command-engine.js +47 -0
  46. package/dist/runner-command-engine.js.map +1 -0
  47. package/dist/runner-profiles.d.ts +11 -0
  48. package/dist/runner-profiles.js +138 -0
  49. package/dist/runner-profiles.js.map +1 -0
  50. package/dist/runner-usage.d.ts +33 -0
  51. package/dist/runner-usage.js +193 -0
  52. package/dist/runner-usage.js.map +1 -0
  53. package/dist/runtime-state.d.ts +174 -0
  54. package/dist/runtime-state.js +957 -0
  55. package/dist/runtime-state.js.map +1 -0
  56. package/dist/service.d.ts +4 -0
  57. package/dist/service.js +39 -0
  58. package/dist/service.js.map +1 -0
  59. package/dist/storage.d.ts +2 -0
  60. package/dist/storage.js +33 -0
  61. package/dist/storage.js.map +1 -0
  62. package/dist/terminal.d.ts +132 -0
  63. package/dist/terminal.js +417 -0
  64. package/dist/terminal.js.map +1 -0
  65. package/dist/workspace.d.ts +116 -0
  66. package/dist/workspace.js +732 -0
  67. package/dist/workspace.js.map +1 -0
  68. package/package.json +36 -0
@@ -0,0 +1,96 @@
1
+ import { type ChildProcessWithoutNullStreams } from 'node:child_process';
2
+ export interface CodexProbe {
3
+ readonly available: boolean;
4
+ readonly version?: string;
5
+ readonly compatible: boolean;
6
+ }
7
+ /**
8
+ * The visible control state of a Codex thread. This deliberately models a
9
+ * verified transport, not a guess based on a transcript file.
10
+ */
11
+ export type CodexSessionControlLevel = 'MANAGED' | 'SHARED_CONTROL' | 'OBSERVE_ONLY' | 'RESUMABLE' | 'UNAVAILABLE';
12
+ export interface CodexSessionControl {
13
+ readonly level: CodexSessionControlLevel;
14
+ readonly capabilities: readonly ('history.read' | 'events.live' | 'turn.start' | 'turn.steer' | 'turn.interrupt')[];
15
+ }
16
+ /**
17
+ * Maps the facts that the Node can actually establish to user-visible
18
+ * controls. In particular, seeing an external thread never implies that it
19
+ * is safe to write to its active turn.
20
+ */
21
+ export declare function codexSessionControl(input: {
22
+ readonly available: boolean;
23
+ readonly nativeThreadId: string | null;
24
+ readonly nativeControl: 'MAR_MANAGED' | 'EXTERNAL';
25
+ readonly activeTurn: boolean;
26
+ readonly sharedControl?: boolean;
27
+ }): CodexSessionControl;
28
+ export interface JsonRpcNotification {
29
+ readonly method: string;
30
+ readonly params: unknown;
31
+ readonly requestId?: string | number;
32
+ }
33
+ export interface CodexAppServerOptions {
34
+ readonly command?: string;
35
+ readonly args?: readonly string[];
36
+ readonly cwd?: string;
37
+ readonly timeoutMs?: number;
38
+ /** `auto` uses a private Unix socket on Linux and stdio on Windows. */
39
+ readonly transport?: 'auto' | 'stdio' | 'unix';
40
+ readonly socketPath?: string;
41
+ readonly spawnProcess?: (command: string, args: readonly string[], options: {
42
+ readonly cwd?: string;
43
+ }) => ChildProcessWithoutNullStreams;
44
+ }
45
+ export interface CodexRunConfiguration {
46
+ readonly model?: string | null;
47
+ readonly effort?: string | null;
48
+ readonly access?: string | null;
49
+ readonly serviceTier?: 'fast';
50
+ readonly collaborationMode?: 'default' | 'plan';
51
+ }
52
+ /** Public App Server turn inputs supported by the Workbench Composer. */
53
+ export type CodexComposerInput = {
54
+ readonly type: 'text';
55
+ readonly text: string;
56
+ } | {
57
+ readonly type: 'localImage';
58
+ readonly path: string;
59
+ };
60
+ /**
61
+ * Local JSON-RPC client for a Node-supervised Codex App Server. Linux uses a
62
+ * private Unix socket by default; Windows uses stdio. Neither is exposed to
63
+ * MAR Server or the browser.
64
+ */
65
+ export declare class CodexAppServerClient {
66
+ private readonly options;
67
+ private child;
68
+ private transport;
69
+ private socketPath;
70
+ private nextId;
71
+ private readonly pending;
72
+ private readonly notifications;
73
+ constructor(options?: CodexAppServerOptions);
74
+ start(): Promise<void>;
75
+ stop(): void;
76
+ onNotification(listener: (notification: JsonRpcNotification) => void): () => void;
77
+ request(method: string, params: unknown): Promise<unknown>;
78
+ notify(method: string, params: unknown): void;
79
+ respond(requestId: string | number, result: unknown): void;
80
+ startThread(cwd: string, configuration?: CodexRunConfiguration): Promise<unknown>;
81
+ listThreads(): Promise<unknown>;
82
+ listCollaborationModes(): Promise<unknown>;
83
+ readThread(threadId: string, includeTurns?: boolean): Promise<unknown>;
84
+ setThreadName(threadId: string, name: string): Promise<unknown>;
85
+ resumeThread(threadId: string, cwd: string, configuration?: CodexRunConfiguration): Promise<unknown>;
86
+ startTurn(threadId: string, text: string, cwd: string, configuration?: CodexRunConfiguration, attachments?: readonly Extract<CodexComposerInput, {
87
+ readonly type: 'localImage';
88
+ }>[]): Promise<unknown>;
89
+ steerTurn(threadId: string, expectedTurnId: string, text: string): Promise<unknown>;
90
+ interruptTurn(threadId: string, turnId: string): Promise<unknown>;
91
+ private handleLine;
92
+ private failAll;
93
+ private transportMode;
94
+ }
95
+ export declare function probeCodex(command?: string): CodexProbe;
96
+ export declare function isSupportedCodexVersion(version: string): boolean;
@@ -0,0 +1,361 @@
1
+ import { spawn, spawnSync } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { existsSync } from 'node:fs';
4
+ import { unlink } from 'node:fs/promises';
5
+ import { connect } from 'node:net';
6
+ import { tmpdir } from 'node:os';
7
+ import { join } from 'node:path';
8
+ import { createInterface } from 'node:readline';
9
+ import { minimalRunnerEnvironment, platformCliInvocation } from './operational.js';
10
+ const REQUEST_TIMEOUT_MS = 15_000;
11
+ const SUPPORTED_CODEX_VERSION = /^codex-cli 0\.(?:146|147)\./;
12
+ /**
13
+ * Maps the facts that the Node can actually establish to user-visible
14
+ * controls. In particular, seeing an external thread never implies that it
15
+ * is safe to write to its active turn.
16
+ */
17
+ export function codexSessionControl(input) {
18
+ if (!input.available)
19
+ return { level: 'UNAVAILABLE', capabilities: [] };
20
+ if (input.sharedControl) {
21
+ return {
22
+ level: 'SHARED_CONTROL',
23
+ capabilities: ['history.read', 'events.live', 'turn.start', 'turn.steer', 'turn.interrupt']
24
+ };
25
+ }
26
+ if (input.nativeThreadId !== null && input.nativeControl === 'EXTERNAL') {
27
+ return { level: 'OBSERVE_ONLY', capabilities: ['history.read'] };
28
+ }
29
+ if (input.activeTurn) {
30
+ return {
31
+ level: 'MANAGED',
32
+ capabilities: ['history.read', 'events.live', 'turn.steer', 'turn.interrupt']
33
+ };
34
+ }
35
+ return {
36
+ level: 'RESUMABLE',
37
+ capabilities: ['history.read', 'turn.start']
38
+ };
39
+ }
40
+ /**
41
+ * Local JSON-RPC client for a Node-supervised Codex App Server. Linux uses a
42
+ * private Unix socket by default; Windows uses stdio. Neither is exposed to
43
+ * MAR Server or the browser.
44
+ */
45
+ export class CodexAppServerClient {
46
+ options;
47
+ child;
48
+ transport;
49
+ socketPath;
50
+ nextId = 1;
51
+ pending = new Map();
52
+ notifications = new Set();
53
+ constructor(options = {}) {
54
+ this.options = options;
55
+ }
56
+ async start() {
57
+ if (this.child !== undefined)
58
+ return;
59
+ const command = this.options.command ?? 'codex';
60
+ const mode = this.transportMode();
61
+ this.socketPath =
62
+ mode === 'unix' ? (this.options.socketPath ?? privateSocketPath()) : undefined;
63
+ const baseArgs = this.options.args ?? ['app-server'];
64
+ const args = [
65
+ ...baseArgs,
66
+ ...(mode === 'unix' ? ['--listen', `unix://${this.socketPath}`] : [])
67
+ ];
68
+ const spawnProcess = this.options.spawnProcess ?? defaultSpawn;
69
+ let child = spawnProcess(command, args, {
70
+ ...(this.options.cwd === undefined ? {} : { cwd: this.options.cwd })
71
+ });
72
+ this.child = child;
73
+ let socket;
74
+ if (mode === 'unix') {
75
+ try {
76
+ socket = await connectUnix(this.socketPath, (this.options.transport ?? 'auto') === 'auto'
77
+ ? Math.min(this.options.timeoutMs ?? REQUEST_TIMEOUT_MS, 1_000)
78
+ : (this.options.timeoutMs ?? REQUEST_TIMEOUT_MS));
79
+ }
80
+ catch (error) {
81
+ if ((this.options.transport ?? 'auto') !== 'auto')
82
+ throw error;
83
+ child.kill();
84
+ if (this.socketPath !== undefined && existsSync(this.socketPath))
85
+ await unlink(this.socketPath);
86
+ this.socketPath = undefined;
87
+ child = spawnProcess(command, baseArgs, {
88
+ ...(this.options.cwd === undefined ? {} : { cwd: this.options.cwd })
89
+ });
90
+ this.child = child;
91
+ }
92
+ }
93
+ this.transport = socket ?? stdioTransport(child);
94
+ const lines = createInterface({ input: socket ?? child.stdout });
95
+ lines.on('line', (line) => this.handleLine(line));
96
+ child.once('error', (error) => this.failAll(new Error(`CODEX_APP_SERVER_START_FAILED:${error.message}`)));
97
+ child.once('exit', () => {
98
+ this.child = undefined;
99
+ this.failAll(new Error('CODEX_APP_SERVER_EXITED'));
100
+ });
101
+ await this.request('initialize', {
102
+ clientInfo: { name: 'myagentroam', title: 'MyAgentRoam', version: '0.1.0' },
103
+ capabilities: { experimentalApi: true }
104
+ });
105
+ this.notify('initialized', {});
106
+ }
107
+ stop() {
108
+ this.transport?.destroy();
109
+ this.transport = undefined;
110
+ this.child?.kill();
111
+ this.child = undefined;
112
+ if (this.socketPath !== undefined && existsSync(this.socketPath))
113
+ void unlink(this.socketPath);
114
+ this.socketPath = undefined;
115
+ this.failAll(new Error('CODEX_APP_SERVER_STOPPED'));
116
+ }
117
+ onNotification(listener) {
118
+ this.notifications.add(listener);
119
+ return () => this.notifications.delete(listener);
120
+ }
121
+ async request(method, params) {
122
+ const transport = this.transport;
123
+ if (transport === undefined || !transport.writable)
124
+ throw new Error('CODEX_APP_SERVER_UNAVAILABLE');
125
+ const id = this.nextId++;
126
+ const timeoutMs = this.options.timeoutMs ?? REQUEST_TIMEOUT_MS;
127
+ const result = new Promise((resolve, reject) => {
128
+ const timer = setTimeout(() => {
129
+ this.pending.delete(id);
130
+ reject(new Error('CODEX_APP_SERVER_TIMEOUT'));
131
+ }, timeoutMs);
132
+ this.pending.set(id, { resolve, reject, timer });
133
+ });
134
+ transport.write(`${JSON.stringify({ method, id, params })}\n`);
135
+ return result;
136
+ }
137
+ notify(method, params) {
138
+ const transport = this.transport;
139
+ if (transport === undefined || !transport.writable)
140
+ throw new Error('CODEX_APP_SERVER_UNAVAILABLE');
141
+ transport.write(`${JSON.stringify({ method, params })}\n`);
142
+ }
143
+ respond(requestId, result) {
144
+ const transport = this.transport;
145
+ if (transport === undefined || !transport.writable)
146
+ throw new Error('CODEX_APP_SERVER_UNAVAILABLE');
147
+ transport.write(`${JSON.stringify({ id: requestId, result })}\n`);
148
+ }
149
+ startThread(cwd, configuration = {}) {
150
+ return this.request('thread/start', {
151
+ cwd,
152
+ ...codexThreadConfiguration(cwd, configuration)
153
+ });
154
+ }
155
+ listThreads() {
156
+ return this.request('thread/list', {});
157
+ }
158
+ listCollaborationModes() {
159
+ return this.request('collaborationMode/list', {});
160
+ }
161
+ readThread(threadId, includeTurns = true) {
162
+ return this.request('thread/read', { threadId, includeTurns });
163
+ }
164
+ setThreadName(threadId, name) {
165
+ return this.request('thread/name/set', { threadId, name });
166
+ }
167
+ resumeThread(threadId, cwd, configuration = {}) {
168
+ return this.request('thread/resume', {
169
+ threadId,
170
+ cwd,
171
+ ...codexThreadConfiguration(cwd, configuration)
172
+ });
173
+ }
174
+ startTurn(threadId, text, cwd, configuration = {}, attachments = []) {
175
+ return this.request('turn/start', {
176
+ threadId,
177
+ cwd,
178
+ input: [{ type: 'text', text }, ...attachments],
179
+ ...codexTurnConfiguration(cwd, configuration)
180
+ });
181
+ }
182
+ steerTurn(threadId, expectedTurnId, text) {
183
+ return this.request('turn/steer', {
184
+ threadId,
185
+ expectedTurnId,
186
+ input: [{ type: 'text', text }]
187
+ });
188
+ }
189
+ interruptTurn(threadId, turnId) {
190
+ return this.request('turn/interrupt', { threadId, turnId });
191
+ }
192
+ handleLine(line) {
193
+ let message;
194
+ try {
195
+ message = JSON.parse(line);
196
+ }
197
+ catch {
198
+ return;
199
+ }
200
+ if ((typeof message.id === 'number' || typeof message.id === 'string') &&
201
+ typeof message.method === 'string') {
202
+ for (const listener of this.notifications) {
203
+ listener({ method: message.method, params: message.params, requestId: message.id });
204
+ }
205
+ return;
206
+ }
207
+ if (typeof message.id === 'number') {
208
+ const pending = this.pending.get(message.id);
209
+ if (pending === undefined)
210
+ return;
211
+ clearTimeout(pending.timer);
212
+ this.pending.delete(message.id);
213
+ if (message.error !== undefined) {
214
+ pending.reject(new Error(`CODEX_APP_SERVER_RPC_ERROR:${JSON.stringify(message.error)}`));
215
+ }
216
+ else {
217
+ pending.resolve(message.result);
218
+ }
219
+ return;
220
+ }
221
+ if (typeof message.method === 'string') {
222
+ for (const listener of this.notifications)
223
+ listener({ method: message.method, params: message.params });
224
+ }
225
+ }
226
+ failAll(error) {
227
+ for (const [id, pending] of this.pending) {
228
+ clearTimeout(pending.timer);
229
+ pending.reject(error);
230
+ this.pending.delete(id);
231
+ }
232
+ }
233
+ transportMode() {
234
+ const requested = this.options.transport ?? 'auto';
235
+ if (requested === 'auto')
236
+ return process.platform === 'linux' ? 'unix' : 'stdio';
237
+ if (requested === 'unix' && process.platform !== 'linux') {
238
+ throw new Error('CODEX_UNIX_SOCKET_PLATFORM_UNSUPPORTED');
239
+ }
240
+ return requested;
241
+ }
242
+ }
243
+ function codexThreadConfiguration(cwd, configuration) {
244
+ return {
245
+ ...modelOption(configuration.model),
246
+ ...codexPermissionConfiguration(cwd, configuration.access, 'thread')
247
+ };
248
+ }
249
+ function codexTurnConfiguration(cwd, configuration) {
250
+ return {
251
+ ...modelOption(configuration.model),
252
+ ...(typeof configuration.effort === 'string' ? { effort: configuration.effort } : {}),
253
+ ...(configuration.serviceTier === 'fast' ? { serviceTier: 'fast' } : {}),
254
+ ...(configuration.collaborationMode === undefined
255
+ ? {}
256
+ : {
257
+ collaborationMode: {
258
+ mode: configuration.collaborationMode,
259
+ settings: {
260
+ model: configuration.model ?? 'gpt-5.6-sol',
261
+ reasoningEffort: configuration.effort ?? null,
262
+ developerInstructions: null
263
+ }
264
+ }
265
+ }),
266
+ ...codexPermissionConfiguration(cwd, configuration.access, 'turn')
267
+ };
268
+ }
269
+ function modelOption(model) {
270
+ return model === undefined || model === null ? {} : { model };
271
+ }
272
+ function codexPermissionConfiguration(cwd, access, phase) {
273
+ const sandbox = access === 'read-only'
274
+ ? 'read-only'
275
+ : access === 'workspace-write' || access === 'on-request'
276
+ ? 'workspace-write'
277
+ : access === 'full-access'
278
+ ? 'danger-full-access'
279
+ : undefined;
280
+ const approvalPolicy = access === 'workspace-write' || access === 'full-access' ? 'never' : 'on-request';
281
+ if (phase === 'thread')
282
+ return {
283
+ ...(sandbox === undefined ? {} : { sandbox }),
284
+ approvalPolicy
285
+ };
286
+ return {
287
+ ...(sandbox === undefined
288
+ ? {}
289
+ : {
290
+ sandboxPolicy: sandbox === 'read-only'
291
+ ? { type: 'readOnly' }
292
+ : sandbox === 'danger-full-access'
293
+ ? { type: 'dangerFullAccess' }
294
+ : { type: 'workspaceWrite', writableRoots: [cwd], networkAccess: true }
295
+ }),
296
+ approvalPolicy
297
+ };
298
+ }
299
+ export function probeCodex(command = 'codex') {
300
+ const invocation = platformCliInvocation(command, ['--version']);
301
+ const result = spawnSync(invocation.command, invocation.args, {
302
+ windowsHide: true,
303
+ env: minimalRunnerEnvironment(),
304
+ timeout: 3_000,
305
+ encoding: 'utf8'
306
+ });
307
+ if (result.status !== 0 || result.error !== undefined)
308
+ return { available: false, compatible: false };
309
+ const version = `${result.stdout}${result.stderr}`.trim().slice(0, 128);
310
+ return {
311
+ available: true,
312
+ ...(version.length === 0 ? {} : { version }),
313
+ compatible: SUPPORTED_CODEX_VERSION.test(version)
314
+ };
315
+ }
316
+ export function isSupportedCodexVersion(version) {
317
+ return SUPPORTED_CODEX_VERSION.test(version);
318
+ }
319
+ function defaultSpawn(command, args, options) {
320
+ const invocation = platformCliInvocation(command, args);
321
+ return spawn(invocation.command, invocation.args, {
322
+ stdio: ['pipe', 'pipe', 'pipe'],
323
+ shell: false,
324
+ windowsHide: true,
325
+ ...(options.cwd === undefined ? {} : { cwd: options.cwd })
326
+ });
327
+ }
328
+ function stdioTransport(child) {
329
+ return {
330
+ get writable() {
331
+ return child.stdin.writable;
332
+ },
333
+ write: (data) => child.stdin.write(data),
334
+ on: (event, listener) => child.stdout.on(event, listener),
335
+ once: (event, listener) => child.stdout.once(event, listener),
336
+ destroy: () => child.stdout.destroy()
337
+ };
338
+ }
339
+ function privateSocketPath() {
340
+ return join(tmpdir(), `myagentroam-codex-${process.pid}-${randomUUID()}.sock`);
341
+ }
342
+ function connectUnix(socketPath, timeoutMs) {
343
+ return new Promise((resolve, reject) => {
344
+ const deadline = Date.now() + timeoutMs;
345
+ const attempt = () => {
346
+ const socket = connect(socketPath);
347
+ const retry = (error) => {
348
+ socket.destroy();
349
+ if (Date.now() >= deadline) {
350
+ reject(new Error(`CODEX_UNIX_SOCKET_CONNECT_FAILED:${error.message}`));
351
+ return;
352
+ }
353
+ setTimeout(attempt, 25);
354
+ };
355
+ socket.once('connect', () => resolve(socket));
356
+ socket.once('error', retry);
357
+ };
358
+ attempt();
359
+ });
360
+ }
361
+ //# sourceMappingURL=codex-app-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-server.js","sourceRoot":"","sources":["../src/codex-app-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface NodeConfig {
2
+ readonly serverUrl: string;
3
+ /** Explicit roots or the platform default resolved while loading the config. */
4
+ readonly allowedRoots: readonly string[];
5
+ /** Absolute or config-relative location of this Node's private runtime SQLite. */
6
+ readonly databasePath?: string;
7
+ readonly nodeId?: string;
8
+ readonly credential?: string;
9
+ readonly registrationToken?: string;
10
+ }
11
+ export declare function nodeConfigPath(): string;
12
+ export declare function loadNodeConfig(path?: string): Promise<NodeConfig>;
13
+ /** Uses the Node service account's scope when no Workspace roots are configured. */
14
+ export declare function defaultAllowedRoots(platform?: NodeJS.Platform, homePath?: string, currentDirectory?: string): readonly string[];
15
+ export declare function nodeDatabasePath(config: NodeConfig, configPath?: string): string;
16
+ /** Credentials are always written with owner-only POSIX permissions where supported. */
17
+ export declare function saveNodeConfig(config: NodeConfig, path?: string): Promise<void>;
package/dist/config.js ADDED
@@ -0,0 +1,51 @@
1
+ import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { dirname, resolve, win32 } from 'node:path';
4
+ export function nodeConfigPath() {
5
+ return resolve(process.env['MAR_NODE_CONFIG'] ?? 'data/mar-node.json');
6
+ }
7
+ export async function loadNodeConfig(path = nodeConfigPath()) {
8
+ const parsed = JSON.parse(await readFile(path, 'utf8'));
9
+ if (typeof parsed !== 'object' ||
10
+ parsed === null ||
11
+ !('serverUrl' in parsed) ||
12
+ typeof parsed.serverUrl !== 'string' ||
13
+ ('allowedRoots' in parsed &&
14
+ (!Array.isArray(parsed.allowedRoots) ||
15
+ !parsed.allowedRoots.every((root) => typeof root === 'string')))) {
16
+ throw new Error('NODE_CONFIG_INVALID');
17
+ }
18
+ const input = parsed;
19
+ const optionalString = (name) => typeof input[name] === 'string' ? input[name] : undefined;
20
+ const nodeId = optionalString('nodeId');
21
+ const credential = optionalString('credential');
22
+ const registrationToken = optionalString('registrationToken');
23
+ const databasePath = optionalString('databasePath');
24
+ const allowedRoots = Array.isArray(input['allowedRoots'])
25
+ ? input['allowedRoots']
26
+ : defaultAllowedRoots();
27
+ return {
28
+ serverUrl: parsed.serverUrl,
29
+ allowedRoots,
30
+ ...(nodeId === undefined ? {} : { nodeId }),
31
+ ...(credential === undefined ? {} : { credential }),
32
+ ...(registrationToken === undefined ? {} : { registrationToken }),
33
+ ...(databasePath === undefined ? {} : { databasePath })
34
+ };
35
+ }
36
+ /** Uses the Node service account's scope when no Workspace roots are configured. */
37
+ export function defaultAllowedRoots(platform = process.platform, homePath = homedir(), currentDirectory = process.cwd()) {
38
+ return platform === 'win32' ? [win32.parse(currentDirectory).root] : [homePath];
39
+ }
40
+ export function nodeDatabasePath(config, configPath = nodeConfigPath()) {
41
+ return config.databasePath ?? resolve(dirname(configPath), 'node-runtime.sqlite');
42
+ }
43
+ /** Credentials are always written with owner-only POSIX permissions where supported. */
44
+ export async function saveNodeConfig(config, path = nodeConfigPath()) {
45
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
46
+ await writeFile(path, `${JSON.stringify(config, undefined, 2)}\n`, { mode: 0o600 });
47
+ if (process.platform !== 'win32') {
48
+ await chmod(path, 0o600);
49
+ }
50
+ }
51
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}