@amaster.ai/mirrorx-device-client 0.0.0-stage → 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 (75) hide show
  1. package/LICENSE +172 -0
  2. package/README.md +487 -2
  3. package/dist/codebuddy-auth.d.ts +2 -0
  4. package/dist/codebuddy-auth.d.ts.map +1 -0
  5. package/dist/codebuddy-auth.js +80 -0
  6. package/dist/codebuddy-auth.js.map +1 -0
  7. package/dist/codebuddy-locks.d.ts +12 -0
  8. package/dist/codebuddy-locks.d.ts.map +1 -0
  9. package/dist/codebuddy-locks.js +101 -0
  10. package/dist/codebuddy-locks.js.map +1 -0
  11. package/dist/codebuddy-redaction.d.ts +3 -0
  12. package/dist/codebuddy-redaction.d.ts.map +1 -0
  13. package/dist/codebuddy-redaction.js +31 -0
  14. package/dist/codebuddy-redaction.js.map +1 -0
  15. package/dist/codebuddy-runtime.d.ts +82 -0
  16. package/dist/codebuddy-runtime.d.ts.map +1 -0
  17. package/dist/codebuddy-runtime.js +285 -0
  18. package/dist/codebuddy-runtime.js.map +1 -0
  19. package/dist/codebuddy-session.d.ts +13 -0
  20. package/dist/codebuddy-session.d.ts.map +1 -0
  21. package/dist/codebuddy-session.js +73 -0
  22. package/dist/codebuddy-session.js.map +1 -0
  23. package/dist/codebuddy-tool-gate.d.ts +4 -0
  24. package/dist/codebuddy-tool-gate.d.ts.map +1 -0
  25. package/dist/codebuddy-tool-gate.js +10 -0
  26. package/dist/codebuddy-tool-gate.js.map +1 -0
  27. package/dist/codex-runtime.d.ts +6 -0
  28. package/dist/codex-runtime.d.ts.map +1 -0
  29. package/dist/codex-runtime.js +24 -0
  30. package/dist/codex-runtime.js.map +1 -0
  31. package/dist/computer.d.ts +25 -0
  32. package/dist/computer.d.ts.map +1 -0
  33. package/dist/computer.js +161 -0
  34. package/dist/computer.js.map +1 -0
  35. package/dist/configuration-lifetime.d.ts +15 -0
  36. package/dist/configuration-lifetime.d.ts.map +1 -0
  37. package/dist/configuration-lifetime.js +143 -0
  38. package/dist/configuration-lifetime.js.map +1 -0
  39. package/dist/device-id.d.ts +7 -0
  40. package/dist/device-id.d.ts.map +1 -0
  41. package/dist/device-id.js +84 -0
  42. package/dist/device-id.js.map +1 -0
  43. package/dist/index.d.ts +209 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +1459 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/main.d.ts +3 -0
  48. package/dist/main.d.ts.map +1 -0
  49. package/dist/main.js +126 -0
  50. package/dist/main.js.map +1 -0
  51. package/dist/managed-workspace.d.ts +33 -0
  52. package/dist/managed-workspace.d.ts.map +1 -0
  53. package/dist/managed-workspace.js +149 -0
  54. package/dist/managed-workspace.js.map +1 -0
  55. package/dist/pi-runtime.d.ts +24 -0
  56. package/dist/pi-runtime.d.ts.map +1 -0
  57. package/dist/pi-runtime.js +156 -0
  58. package/dist/pi-runtime.js.map +1 -0
  59. package/dist/readiness.d.ts +12 -0
  60. package/dist/readiness.d.ts.map +1 -0
  61. package/dist/readiness.js +66 -0
  62. package/dist/readiness.js.map +1 -0
  63. package/dist/resource-lock.d.ts +11 -0
  64. package/dist/resource-lock.d.ts.map +1 -0
  65. package/dist/resource-lock.js +74 -0
  66. package/dist/resource-lock.js.map +1 -0
  67. package/dist/session-index.d.ts +41 -0
  68. package/dist/session-index.d.ts.map +1 -0
  69. package/dist/session-index.js +99 -0
  70. package/dist/session-index.js.map +1 -0
  71. package/dist/user-service.d.ts +21 -0
  72. package/dist/user-service.d.ts.map +1 -0
  73. package/dist/user-service.js +224 -0
  74. package/dist/user-service.js.map +1 -0
  75. package/package.json +46 -4
@@ -0,0 +1,156 @@
1
+ import { mkdtemp, readFile, readdir, rm, writeFile } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { ownConfiguration } from "./configuration-lifetime.js";
6
+ export function isPiDeviceCommand(command) {
7
+ return /^pi(?:\.cmd|\.exe)?$/i.test(path.basename(command));
8
+ }
9
+ class PiRuntimeConfigError extends Error {
10
+ }
11
+ const object = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
12
+ async function readConfig(directory, name) {
13
+ try {
14
+ return object(JSON.parse(await readFile(path.join(directory, name), "utf8")));
15
+ }
16
+ catch (error) {
17
+ if (error.code === "ENOENT")
18
+ return {};
19
+ const code = error.code;
20
+ throw Object.assign(new PiRuntimeConfigError(`Could not read Pi device ${name}${code ? ` (${code})` : ": invalid JSON"}`), { code });
21
+ }
22
+ }
23
+ // A device owns its model catalog. MirrorX supplies the per-run Billing route,
24
+ // which must never be replaced by local credentials or model-level endpoints.
25
+ const catalogEntry = (value) => {
26
+ const { apiKey: _key, baseUrl: _url, headers: _headers, ...catalog } = object(value);
27
+ return catalog;
28
+ };
29
+ function mergeEntry(a, b) {
30
+ const previous = catalogEntry(a), next = catalogEntry(b);
31
+ return { ...previous, ...next,
32
+ ...(previous.compat || next.compat ? { compat: { ...object(previous.compat), ...object(next.compat) } } : {}) };
33
+ }
34
+ async function preparePiDeviceCommandOnce(command, args, env, runtime) {
35
+ if (runtime?.available === false && isPiDeviceCommand(command))
36
+ throw new Error("Pi model execution is disabled in MirrorX hosting-only mode");
37
+ const unchanged = { args, env, cleanup: async () => { } };
38
+ if (!runtime || !isPiDeviceCommand(command)
39
+ || !env.MIRRORX_BILLING_TURN_ID || !env.PI_CODING_AGENT_DIR)
40
+ return unchanged;
41
+ const source = await readConfig(runtime.configDir, "models.json");
42
+ const staged = await readConfig(env.PI_CODING_AGENT_DIR, "models.json");
43
+ const local = object(object(source.providers).amaster);
44
+ const { compat: _unsupportedProviderCompat, ...injected } = object(object(staged.providers).amaster);
45
+ if (!injected.apiKey || !injected.baseUrl)
46
+ throw new Error("Missing MirrorX Pi Billing route");
47
+ const models = new Map();
48
+ const overrides = {};
49
+ for (const provider of [local, injected]) {
50
+ if (provider.models !== undefined && !Array.isArray(provider.models))
51
+ throw new Error("Invalid Pi device model catalog");
52
+ for (const entry of provider.models ?? []) {
53
+ if (typeof entry?.id !== "string" || !entry.id)
54
+ throw new Error("Invalid Pi device model catalog");
55
+ models.set(entry.id, mergeEntry(models.get(entry.id), entry));
56
+ }
57
+ for (const [id, entry] of Object.entries(object(provider.modelOverrides)))
58
+ overrides[id] = mergeEntry(overrides[id], entry);
59
+ }
60
+ if (!models.size)
61
+ throw new Error("Pi device has no amaster model catalog; configure models.json in the Pi configuration directory");
62
+ // Only catalog/protocol metadata comes from the device. Other local provider
63
+ // settings (including credentials, OAuth headers and custom providers) stay local.
64
+ staged.providers = { ...object(staged.providers), amaster: {
65
+ ...(local.api ? { api: local.api } : {}),
66
+ ...injected,
67
+ models: [...models.values()],
68
+ ...(Object.keys(overrides).length ? { modelOverrides: overrides } : {}),
69
+ } };
70
+ const optionArgs = args.slice(0, args.indexOf("--") < 0 ? args.length : args.indexOf("--"));
71
+ const informationOnly = optionArgs.some(value => ["--help", "-h", "--version", "--list-models"].includes(value));
72
+ const resolvedArgs = [];
73
+ let explicitModel, explicitProvider;
74
+ if (informationOnly)
75
+ resolvedArgs.push(...args);
76
+ else {
77
+ for (let i = 0; i < optionArgs.length; i++) {
78
+ const arg = optionArgs[i];
79
+ const name = arg.split("=", 1)[0];
80
+ const canonical = name === "-m" ? "--model" : name;
81
+ if (canonical !== "--model" && canonical !== "--provider") {
82
+ resolvedArgs.push(arg);
83
+ continue;
84
+ }
85
+ const separate = arg === name;
86
+ const value = separate ? optionArgs[++i] : arg.slice(name.length + 1);
87
+ // Pi consumes the next token for --model, including declared dash IDs.
88
+ const declaredModel = canonical === "--model" && models.has(value ?? "");
89
+ if (!value || (separate && value.startsWith("-") && !declaredModel)) {
90
+ throw new Error(`Pi device option ${name} requires a value`);
91
+ }
92
+ // The bridge accepts aliases/equals syntax; Pi receives its native form.
93
+ // Preserve ordering so repeated options retain Pi's last-value semantics.
94
+ resolvedArgs.push(canonical, value);
95
+ if (canonical === "--model")
96
+ explicitModel = value;
97
+ else
98
+ explicitProvider = value;
99
+ }
100
+ resolvedArgs.push(...args.slice(optionArgs.length)); // Keep -- and prompt bytes unchanged.
101
+ }
102
+ if (!explicitModel && !informationOnly) {
103
+ const settings = await readConfig(runtime.configDir, "settings.json");
104
+ // Billing selects the amaster route. A device's default provider may have
105
+ // another name; only reuse its model ID when this route's catalog has it.
106
+ const provider = explicitProvider ?? "amaster";
107
+ const model = [runtime.defaultModel?.model, settings.defaultModel]
108
+ .find((id) => typeof id === "string" && models.has(id));
109
+ if (provider !== "amaster" || typeof model !== "string")
110
+ throw new Error("Pi device default model has no matching model in its amaster Billing catalog");
111
+ resolvedArgs.unshift("--model", model);
112
+ if (!explicitProvider)
113
+ resolvedArgs.unshift("--provider", provider);
114
+ }
115
+ const directory = await mkdtemp(path.join(os.tmpdir(), "mirrorx-pi-command-"));
116
+ const cleanup = () => rm(directory, { recursive: true, force: true });
117
+ try {
118
+ const configurationToken = await ownConfiguration(directory);
119
+ // Enforce the producer's file-transfer contract, without interpreting Pi
120
+ // settings keys or duplicating its package-source parser. Any extra staged
121
+ // entry could be referenced by current or future settings and must not vanish.
122
+ const entries = await readdir(env.PI_CODING_AGENT_DIR);
123
+ if (entries.some(name => name !== "models.json" && name !== "settings.json")) {
124
+ throw new PiRuntimeConfigError("Pi Billing profile contains additional staged resources; use a managed models/settings-only profile");
125
+ }
126
+ if (entries.includes("settings.json")) {
127
+ const settings = await readConfig(env.PI_CODING_AGENT_DIR, "settings.json");
128
+ await writeFile(path.join(directory, "settings.json"), JSON.stringify(settings), { mode: 0o600 });
129
+ }
130
+ await writeFile(path.join(directory, "models.json"), JSON.stringify(staged), { mode: 0o600 });
131
+ return { args: resolvedArgs, env: { ...env, PI_CODING_AGENT_DIR: directory, "AMASTER-CLI_CODING_AGENT_DIR": directory }, configDirectory: directory, configurationToken, cleanup };
132
+ }
133
+ catch (error) {
134
+ await cleanup();
135
+ if (error instanceof PiRuntimeConfigError)
136
+ throw error;
137
+ const code = error.code;
138
+ throw Object.assign(new Error(`Could not prepare Pi device runtime configuration${code ? ` (${code})` : ""}`), { code });
139
+ }
140
+ }
141
+ export async function preparePiDeviceCommand(command, args, env, runtime) {
142
+ for (let attempt = 0;; attempt++) {
143
+ try {
144
+ return await preparePiDeviceCommandOnce(command, args, env, runtime);
145
+ }
146
+ catch (error) {
147
+ const code = error.code;
148
+ // No process has been launched. Retry only bounded filesystem failures;
149
+ // invalid configuration is deterministic and should be reported at once.
150
+ if (attempt >= 2 || !["EAGAIN", "EBUSY", "EMFILE", "ENFILE"].includes(code ?? ""))
151
+ throw error;
152
+ await delay(100 * (attempt + 1));
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=pi-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-runtime.js","sourceRoot":"","sources":["../src/pi-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type ToolReadiness = {
2
+ state: "unknown" | "ready" | "not_installed" | "login_required" | "version_unsupported" | "workspace_unavailable";
3
+ checkedAt: string;
4
+ toolVersion?: string;
5
+ };
6
+ export declare function inspectDeviceReadiness(input: {
7
+ executorKind: string;
8
+ workspaceRoot: string;
9
+ piExecutable?: string;
10
+ piAvailable?: boolean | undefined;
11
+ }): Promise<ToolReadiness>;
12
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,eAAe,GAAG,gBAAgB,GAAG,qBAAqB,GAAG,uBAAuB,CAAC;IAC9I,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5C,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAkCrL"}
@@ -0,0 +1,66 @@
1
+ /** Small selected-tool probe. Never enumerates tools or reads login secrets. */
2
+ import { execFile } from "node:child_process";
3
+ import { access, constants, stat } from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { QUALIFIED_CODEBUDDY_VERSION, WORKBUDDY_CLI } from "./codebuddy-runtime.js";
8
+ export async function inspectDeviceReadiness(input) {
9
+ const checkedAt = new Date().toISOString();
10
+ try {
11
+ if (!(await stat(input.workspaceRoot)).isDirectory())
12
+ return { state: "workspace_unavailable", checkedAt };
13
+ await access(input.workspaceRoot, constants.R_OK | constants.W_OK | constants.X_OK);
14
+ }
15
+ catch {
16
+ return { state: "workspace_unavailable", checkedAt };
17
+ }
18
+ if (input.executorKind === "pi") {
19
+ if (input.piAvailable === false)
20
+ return { state: "login_required", checkedAt };
21
+ if (!input.piExecutable)
22
+ return { state: "unknown", checkedAt };
23
+ try {
24
+ await access(input.piExecutable, constants.X_OK);
25
+ return { state: "ready", checkedAt };
26
+ }
27
+ catch {
28
+ return { state: "not_installed", checkedAt };
29
+ }
30
+ }
31
+ const codebuddy = input.executorKind === "codebuddy";
32
+ if (codebuddy && (process.platform !== "darwin" || process.arch !== "arm64"))
33
+ return { state: "version_unsupported", checkedAt };
34
+ const command = codebuddy ? WORKBUDDY_CLI : "codex";
35
+ try {
36
+ const result = await promisify(execFile)(command, codebuddy ? ["--print", "--version"] : ["--version"], {
37
+ cwd: input.workspaceRoot, timeout: 5_000, maxBuffer: 16_000, windowsHide: true,
38
+ });
39
+ const version = result.stdout.match(/\b\d+\.\d+\.\d+\b/)?.[0];
40
+ if (!version || codebuddy && version !== QUALIFIED_CODEBUDDY_VERSION)
41
+ return { state: "version_unsupported", checkedAt };
42
+ if (codebuddy) {
43
+ const auth = path.join(os.homedir(), "Library/Application Support/CodeBuddyExtension/Data/Public/auth/workbuddy-desktop.info");
44
+ try {
45
+ if ((await stat(`${auth}.logged-out`).catch(() => null)) || !(await stat(auth)).isFile())
46
+ return { state: "login_required", checkedAt, toolVersion: version };
47
+ }
48
+ catch {
49
+ return { state: "login_required", checkedAt, toolVersion: version };
50
+ }
51
+ }
52
+ else {
53
+ try {
54
+ await promisify(execFile)(command, ["login", "status"], { cwd: input.workspaceRoot, timeout: 5_000, maxBuffer: 16_000, windowsHide: true });
55
+ }
56
+ catch {
57
+ return { state: "login_required", checkedAt, toolVersion: version };
58
+ }
59
+ }
60
+ return { state: "ready", checkedAt, toolVersion: version };
61
+ }
62
+ catch (error) {
63
+ return { state: error.code === "ENOENT" ? "not_installed" : "unknown", checkedAt };
64
+ }
65
+ }
66
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type DeviceResource = {
2
+ baseUrl: string;
3
+ principalId: string;
4
+ deviceProfileId: string;
5
+ companyId: string;
6
+ executorKind: string;
7
+ bindingId?: string | undefined;
8
+ };
9
+ export declare function deviceResourceKey(resource: DeviceResource): string;
10
+ export declare function acquireDeviceResourceLock(resource: DeviceResource, instanceId: string): Promise<() => Promise<void>>;
11
+ //# sourceMappingURL=resource-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-lock.d.ts","sourceRoot":"","sources":["../src/resource-lock.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACxK,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAIlE;AACD,wBAAsB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gCA2C3F"}
@@ -0,0 +1,74 @@
1
+ import { randomUUID, createHash } from "node:crypto";
2
+ import { link, mkdir, open, readFile, unlink, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { canonicalServerOrigin, mirrorxIdentityHome } from "./device-id.js";
5
+ export function deviceResourceKey(resource) {
6
+ const key = [canonicalServerOrigin(resource.baseUrl), resource.principalId, resource.deviceProfileId, resource.companyId, resource.executorKind];
7
+ if (resource.bindingId)
8
+ key.push(resource.bindingId);
9
+ return createHash("sha256").update(JSON.stringify(key)).digest("hex");
10
+ }
11
+ export async function acquireDeviceResourceLock(resource, instanceId) {
12
+ const directory = path.join(mirrorxIdentityHome(), "locks");
13
+ await mkdir(directory, { recursive: true, mode: 0o700 });
14
+ const file = path.join(directory, `${deviceResourceKey(resource)}.lock`);
15
+ const temporary = `${file}.${randomUUID()}.tmp`;
16
+ await writeFile(temporary, JSON.stringify({ pid: process.pid, instanceId }), { mode: 0o600, flag: "wx" });
17
+ try {
18
+ try {
19
+ await link(temporary, file);
20
+ }
21
+ catch (error) {
22
+ if (error.code !== "EEXIST")
23
+ throw error;
24
+ // Only a fully initialized, positively dead owner is reclaimable. A PID
25
+ // recycled to a live process, EPERM, malformed state and unknown owners
26
+ // fail closed. The repair mutex serializes stale-lock removers; no signal
27
+ // is ever sent to another process.
28
+ const repair = `${file}.repair`;
29
+ const handle = await open(repair, "wx", 0o600).catch(() => {
30
+ throw new Error("Another MirrorX bridge owns this execution resource; disconnect it before switching hosts");
31
+ });
32
+ try {
33
+ const bytes = await readFile(file, "utf8").catch(readError => {
34
+ if (readError.code === "ENOENT")
35
+ return null;
36
+ throw readError;
37
+ });
38
+ if (bytes) {
39
+ const owner = JSON.parse(bytes);
40
+ if (!Number.isSafeInteger(owner.pid) || owner.pid <= 0 || typeof owner.instanceId !== "string" || !owner.instanceId) {
41
+ throw new Error("Unknown MirrorX resource lock owner; explicit repair required");
42
+ }
43
+ try {
44
+ process.kill(owner.pid, 0);
45
+ throw new Error("Another MirrorX bridge owns this execution resource; disconnect it before switching hosts");
46
+ }
47
+ catch (probe) {
48
+ if (probe.code !== "ESRCH")
49
+ throw probe;
50
+ }
51
+ // A normal release/new owner may race the probe. Never unlink bytes
52
+ // different from the initialized dead owner we just inspected.
53
+ if (await readFile(file, "utf8") !== bytes)
54
+ throw new Error("MirrorX resource ownership changed during repair");
55
+ await unlink(file);
56
+ }
57
+ await link(temporary, file);
58
+ }
59
+ finally {
60
+ await handle.close();
61
+ await unlink(repair);
62
+ }
63
+ }
64
+ }
65
+ finally {
66
+ await unlink(temporary);
67
+ }
68
+ return async () => {
69
+ const owner = JSON.parse(await readFile(file, "utf8"));
70
+ if (owner.instanceId === instanceId)
71
+ await unlink(file);
72
+ };
73
+ }
74
+ //# sourceMappingURL=resource-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-lock.js","sourceRoot":"","sources":["../src/resource-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ type Authority = {
2
+ baseUrl: string;
3
+ userSubject?: string;
4
+ principalId?: string;
5
+ deviceProfileId?: string;
6
+ companyId: string;
7
+ bindingId: string;
8
+ agentId: string;
9
+ workspaceRoot: string;
10
+ };
11
+ export type DeviceSessionReference = {
12
+ companyId: string;
13
+ agentId: string;
14
+ bindingId: string;
15
+ sourceRunId: string;
16
+ issueId?: string;
17
+ sessionId: string;
18
+ nativeSessionId: string;
19
+ filePath: string;
20
+ sourceWorkspacePath: string;
21
+ executorKind: "pi" | "codex";
22
+ state: "preserved";
23
+ };
24
+ export declare function recordDeviceSession(input: {
25
+ home: string;
26
+ authority: Authority;
27
+ cwd: string;
28
+ runId: string;
29
+ issueId?: string;
30
+ args: string[];
31
+ env: Record<string, string>;
32
+ stdout: string;
33
+ executorKind: string;
34
+ }): Promise<void>;
35
+ export declare function findDeviceSession(input: {
36
+ home: string;
37
+ authority: Authority;
38
+ sessionId: string;
39
+ }): Promise<DeviceSessionReference | undefined>;
40
+ export {};
41
+ //# sourceMappingURL=session-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-index.d.ts","sourceRoot":"","sources":["../src/session-index.ts"],"names":[],"mappings":"AAQA,KAAK,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AACzL,MAAM,MAAM,sBAAsB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAClI,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAoBhJ,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,iBAkCvN;AACD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAUrJ"}
@@ -0,0 +1,99 @@
1
+ /** Indexes exact native session files under the authenticated binding, without scanning other workspaces. */
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { createReadStream } from "node:fs";
4
+ import { mkdir, lstat, readFile, readdir, realpath, rename, writeFile } from "node:fs/promises";
5
+ import { createInterface } from "node:readline";
6
+ import path from "node:path";
7
+ import { canonicalServerOrigin } from "./device-id.js";
8
+ const contains = (root, file) => { const relative = path.relative(root, file); return !!relative && relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative); };
9
+ function indexFile(home, authority, session) {
10
+ const hash = createHash("sha256").update(JSON.stringify([canonicalServerOrigin(authority.baseUrl), authority.userSubject, authority.principalId,
11
+ authority.deviceProfileId, authority.companyId, authority.bindingId, session])).digest("hex");
12
+ return path.join(home, "session-index", `${hash}.json`);
13
+ }
14
+ async function sessionHeader(file) {
15
+ const stream = createReadStream(file, { encoding: "utf8", highWaterMark: 4096 });
16
+ const lines = createInterface({ input: stream, crlfDelay: Infinity });
17
+ try {
18
+ for await (const line of lines) {
19
+ if (line.length > 64_000)
20
+ return;
21
+ const header = JSON.parse(line);
22
+ if (header.type === "session" && typeof header.id === "string")
23
+ return { id: header.id, executorKind: "pi" };
24
+ if (header.type === "session_meta" && typeof header.payload?.id === "string")
25
+ return { id: header.payload.id, executorKind: "codex" };
26
+ return;
27
+ }
28
+ }
29
+ finally {
30
+ lines.close();
31
+ stream.destroy();
32
+ }
33
+ }
34
+ export async function recordDeviceSession(input) {
35
+ let file;
36
+ const sessionArgument = input.args.indexOf("--session");
37
+ if (input.executorKind === "pi" && sessionArgument >= 0)
38
+ file = input.args[sessionArgument + 1];
39
+ if (input.executorKind === "codex" && input.env.CODEX_HOME && contains(input.cwd, input.env.CODEX_HOME)) {
40
+ let sessionId;
41
+ for (const line of input.stdout.split("\n")) {
42
+ try {
43
+ const row = JSON.parse(line);
44
+ if (row.type === "thread.started")
45
+ sessionId = row.thread_id;
46
+ }
47
+ catch { /* CLI diagnostics need not be JSON. */ }
48
+ }
49
+ if (sessionId && /^[0-9a-f-]{36}$/i.test(sessionId)) {
50
+ const directories = [path.join(input.env.CODEX_HOME, "sessions")];
51
+ for (let scanned = 0; directories.length && scanned < 100; scanned++) {
52
+ const directory = directories.shift();
53
+ for (const entry of await readdir(directory, { withFileTypes: true }).catch(() => [])) {
54
+ if (entry.isDirectory())
55
+ directories.push(path.join(directory, entry.name));
56
+ else if (entry.isFile() && entry.name.endsWith(`${sessionId}.jsonl`))
57
+ file = path.join(directory, entry.name);
58
+ }
59
+ if (file)
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ if (!file || !contains(input.cwd, file) || await realpath(file).catch(() => "") !== file)
65
+ return;
66
+ const header = await sessionHeader(file);
67
+ if (!header)
68
+ return;
69
+ const reference = { companyId: input.authority.companyId, agentId: input.authority.agentId, bindingId: input.authority.bindingId,
70
+ sourceRunId: input.runId, ...(input.issueId ? { issueId: input.issueId } : {}), sessionId: header.id, nativeSessionId: header.id,
71
+ filePath: file, sourceWorkspacePath: input.cwd, executorKind: header.executorKind, state: "preserved" };
72
+ const directory = path.dirname(indexFile(input.home, input.authority, header.id));
73
+ await mkdir(directory, { recursive: true, mode: 0o700 });
74
+ const info = await lstat(directory);
75
+ if (!info.isDirectory() || info.isSymbolicLink() || process.getuid && info.uid !== process.getuid())
76
+ throw new Error("Unsafe device session index");
77
+ for (const alias of new Set([header.id, file])) {
78
+ const target = indexFile(input.home, input.authority, alias), temporary = `${target}.${randomUUID()}.tmp`;
79
+ await writeFile(temporary, JSON.stringify(reference), { flag: "wx", mode: 0o600 });
80
+ await rename(temporary, target);
81
+ }
82
+ }
83
+ export async function findDeviceSession(input) {
84
+ try {
85
+ const file = indexFile(input.home, input.authority, input.sessionId), info = await lstat(file);
86
+ if (!info.isFile() || info.isSymbolicLink() || info.size > 64_000 || process.getuid && info.uid !== process.getuid())
87
+ return;
88
+ const ref = JSON.parse(await readFile(file, "utf8"));
89
+ if (ref.companyId !== input.authority.companyId || ref.agentId !== input.authority.agentId || ref.bindingId !== input.authority.bindingId
90
+ || !contains(input.authority.workspaceRoot, ref.filePath) || await realpath(ref.filePath) !== ref.filePath)
91
+ return;
92
+ const header = await sessionHeader(ref.filePath);
93
+ return header?.id === ref.nativeSessionId ? { ...ref, sessionId: ref.nativeSessionId } : undefined;
94
+ }
95
+ catch {
96
+ return;
97
+ }
98
+ }
99
+ //# sourceMappingURL=session-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-index.js","sourceRoot":"","sources":["../src/session-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export declare function userServiceSupport(): Promise<{
2
+ supported: boolean;
3
+ reason?: never;
4
+ } | {
5
+ supported: boolean;
6
+ reason: string;
7
+ }>;
8
+ export declare function userServiceStatus(): Promise<{
9
+ state: string;
10
+ } | {
11
+ processVisible: string | boolean;
12
+ instanceId: string;
13
+ pid: number;
14
+ state: string;
15
+ startedAt: string;
16
+ heartbeatAt?: string;
17
+ }>;
18
+ export declare function runUserService(): Promise<void>;
19
+ export declare function stopUserService(): Promise<void>;
20
+ export declare function installUserService(): Promise<void>;
21
+ //# sourceMappingURL=user-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-service.d.ts","sourceRoot":"","sources":["../src/user-service.ts"],"names":[],"mappings":"AA4BA,wBAAsB,kBAAkB;;;;;;GAMvC;AACD,wBAAsB,iBAAiB;;;;gBAhByC,MAAM;SAAO,MAAM;WAAS,MAAM;eAAa,MAAM;kBAAgB,MAAM;GAyB1J;AACD,wBAAsB,cAAc,kBAkDnC;AACD,wBAAsB,eAAe,kBAepC;AAED,wBAAsB,kBAAkB,kBA6CvC"}