@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.
- package/LICENSE +172 -0
- package/README.md +487 -2
- package/dist/codebuddy-auth.d.ts +2 -0
- package/dist/codebuddy-auth.d.ts.map +1 -0
- package/dist/codebuddy-auth.js +80 -0
- package/dist/codebuddy-auth.js.map +1 -0
- package/dist/codebuddy-locks.d.ts +12 -0
- package/dist/codebuddy-locks.d.ts.map +1 -0
- package/dist/codebuddy-locks.js +101 -0
- package/dist/codebuddy-locks.js.map +1 -0
- package/dist/codebuddy-redaction.d.ts +3 -0
- package/dist/codebuddy-redaction.d.ts.map +1 -0
- package/dist/codebuddy-redaction.js +31 -0
- package/dist/codebuddy-redaction.js.map +1 -0
- package/dist/codebuddy-runtime.d.ts +82 -0
- package/dist/codebuddy-runtime.d.ts.map +1 -0
- package/dist/codebuddy-runtime.js +285 -0
- package/dist/codebuddy-runtime.js.map +1 -0
- package/dist/codebuddy-session.d.ts +13 -0
- package/dist/codebuddy-session.d.ts.map +1 -0
- package/dist/codebuddy-session.js +73 -0
- package/dist/codebuddy-session.js.map +1 -0
- package/dist/codebuddy-tool-gate.d.ts +4 -0
- package/dist/codebuddy-tool-gate.d.ts.map +1 -0
- package/dist/codebuddy-tool-gate.js +10 -0
- package/dist/codebuddy-tool-gate.js.map +1 -0
- package/dist/codex-runtime.d.ts +6 -0
- package/dist/codex-runtime.d.ts.map +1 -0
- package/dist/codex-runtime.js +24 -0
- package/dist/codex-runtime.js.map +1 -0
- package/dist/computer.d.ts +25 -0
- package/dist/computer.d.ts.map +1 -0
- package/dist/computer.js +161 -0
- package/dist/computer.js.map +1 -0
- package/dist/configuration-lifetime.d.ts +15 -0
- package/dist/configuration-lifetime.d.ts.map +1 -0
- package/dist/configuration-lifetime.js +143 -0
- package/dist/configuration-lifetime.js.map +1 -0
- package/dist/device-id.d.ts +7 -0
- package/dist/device-id.d.ts.map +1 -0
- package/dist/device-id.js +84 -0
- package/dist/device-id.js.map +1 -0
- package/dist/index.d.ts +209 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1459 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +126 -0
- package/dist/main.js.map +1 -0
- package/dist/managed-workspace.d.ts +33 -0
- package/dist/managed-workspace.d.ts.map +1 -0
- package/dist/managed-workspace.js +149 -0
- package/dist/managed-workspace.js.map +1 -0
- package/dist/pi-runtime.d.ts +24 -0
- package/dist/pi-runtime.d.ts.map +1 -0
- package/dist/pi-runtime.js +156 -0
- package/dist/pi-runtime.js.map +1 -0
- package/dist/readiness.d.ts +12 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +66 -0
- package/dist/readiness.js.map +1 -0
- package/dist/resource-lock.d.ts +11 -0
- package/dist/resource-lock.d.ts.map +1 -0
- package/dist/resource-lock.js +74 -0
- package/dist/resource-lock.js.map +1 -0
- package/dist/session-index.d.ts +41 -0
- package/dist/session-index.d.ts.map +1 -0
- package/dist/session-index.js +99 -0
- package/dist/session-index.js.map +1 -0
- package/dist/user-service.d.ts +21 -0
- package/dist/user-service.d.ts.map +1 -0
- package/dist/user-service.js +224 -0
- package/dist/user-service.js.map +1 -0
- package/package.json +46 -4
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
const marker = ".mirrorx-codebuddy-locks.json";
|
|
5
|
+
/** Locks fence both native-session mutation and workspace writes, including crash recovery. */
|
|
6
|
+
export async function acquireCodebuddyLocks(stateRoot, keys, recovery) {
|
|
7
|
+
const root = path.join(stateRoot, "codebuddy-locks");
|
|
8
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
9
|
+
const entry = await lstat(root);
|
|
10
|
+
if (!entry.isDirectory() || entry.isSymbolicLink() || (process.getuid && entry.uid !== process.getuid()))
|
|
11
|
+
throw new Error("Unsafe WorkBuddy lock directory");
|
|
12
|
+
const token = randomUUID(), held = [], planned = [...new Set(keys)].sort();
|
|
13
|
+
if (planned.some(key => !/^[0-9a-f]{64}$/.test(key)))
|
|
14
|
+
throw new Error("Invalid WorkBuddy lock key");
|
|
15
|
+
const staging = (key) => path.join(root, `.${key}.${token}`);
|
|
16
|
+
const release = async () => {
|
|
17
|
+
for (const key of held) {
|
|
18
|
+
const dir = path.join(root, key);
|
|
19
|
+
const entry = await lstat(dir).catch(() => null);
|
|
20
|
+
if (!entry)
|
|
21
|
+
continue;
|
|
22
|
+
if (!entry.isDirectory() || entry.isSymbolicLink())
|
|
23
|
+
throw new Error("Unsafe WorkBuddy lock");
|
|
24
|
+
if ((await readFile(path.join(dir, "owner"), "utf8")) !== token)
|
|
25
|
+
throw new Error("WorkBuddy lock ownership changed");
|
|
26
|
+
await rm(dir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
try {
|
|
30
|
+
if (recovery) {
|
|
31
|
+
// A crash at any later await must leave command-scoped recovery authority.
|
|
32
|
+
await writeFile(path.join(recovery.directory, marker), JSON.stringify({ token, keys: planned, planned: true }), { flag: "wx", mode: 0o600 });
|
|
33
|
+
await recovery.persist();
|
|
34
|
+
}
|
|
35
|
+
for (const key of planned) {
|
|
36
|
+
const dir = path.join(root, key);
|
|
37
|
+
if (await lstat(dir).catch(error => { if (error.code === "ENOENT")
|
|
38
|
+
return null; throw error; }))
|
|
39
|
+
throw new Error("WorkBuddy session or workspace is active or requires reconciliation");
|
|
40
|
+
// Publish a complete owner atomically; never expose an ownerless lock.
|
|
41
|
+
const staged = staging(key);
|
|
42
|
+
await mkdir(staged, { mode: 0o700 });
|
|
43
|
+
await writeFile(path.join(staged, "owner"), token, { flag: "wx", mode: 0o600 });
|
|
44
|
+
try {
|
|
45
|
+
await rename(staged, dir);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (["EEXIST", "ENOTEMPTY"].includes(error.code ?? ""))
|
|
49
|
+
throw new Error("WorkBuddy session or workspace is active or requires reconciliation");
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
held.push(key);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
release,
|
|
56
|
+
save: (directory) => writeFile(path.join(directory, marker), JSON.stringify({ token, keys: held }), { flag: "wx", mode: 0o600 }),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
await release();
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
for (const key of planned)
|
|
65
|
+
await rm(staging(key), { recursive: true, force: true });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Invoked only after configuration ownership and stopped evidence have been validated. */
|
|
69
|
+
export async function reclaimCodebuddyLocks(reference, stateRoot) {
|
|
70
|
+
if (!reference.configurationDirectory || !path.basename(reference.configurationDirectory).startsWith("mirrorx-codebuddy-command-"))
|
|
71
|
+
return;
|
|
72
|
+
let saved;
|
|
73
|
+
try {
|
|
74
|
+
saved = JSON.parse(await readFile(path.join(reference.configurationDirectory, marker), "utf8"));
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (error.code === "ENOENT")
|
|
78
|
+
return;
|
|
79
|
+
throw new Error("Could not inspect retained WorkBuddy lock ownership");
|
|
80
|
+
}
|
|
81
|
+
if (typeof saved.token !== "string" || !/^[0-9a-f-]{36}$/.test(saved.token) || !Array.isArray(saved.keys) || saved.keys.length > 2 || saved.keys.some(key => !/^[0-9a-f]{64}$/.test(key)) || (saved.planned !== undefined && saved.planned !== true))
|
|
82
|
+
throw new Error("Invalid WorkBuddy lock ownership record");
|
|
83
|
+
for (const key of saved.keys) {
|
|
84
|
+
const dir = path.join(stateRoot, "codebuddy-locks", key);
|
|
85
|
+
const entry = await lstat(dir).catch(() => null);
|
|
86
|
+
if (entry) {
|
|
87
|
+
if (!entry.isDirectory() || entry.isSymbolicLink() || (process.getuid && entry.uid !== process.getuid()))
|
|
88
|
+
throw new Error("Unsafe retained WorkBuddy lock");
|
|
89
|
+
if (await readFile(path.join(dir, "owner"), "utf8") !== saved.token) {
|
|
90
|
+
// A write-ahead plan may never have acquired this key. Never touch its owner.
|
|
91
|
+
if (!saved.planned)
|
|
92
|
+
throw new Error("Retained WorkBuddy lock ownership changed");
|
|
93
|
+
}
|
|
94
|
+
else
|
|
95
|
+
await rm(dir, { recursive: true });
|
|
96
|
+
}
|
|
97
|
+
if (saved.planned)
|
|
98
|
+
await rm(path.join(stateRoot, "codebuddy-locks", `.${key}.${saved.token}`), { recursive: true, force: true });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=codebuddy-locks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebuddy-locks.js","sourceRoot":"","sources":["../src/codebuddy-locks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Preserve split secrets across arbitrary UTF-8 decoder chunks before spooling. */
|
|
2
|
+
export declare function createCodebuddyRedactor(values: string[]): (stream: "stdout" | "stderr", chunk: string, final?: boolean) => string;
|
|
3
|
+
//# sourceMappingURL=codebuddy-redaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebuddy-redaction.d.ts","sourceRoot":"","sources":["../src/codebuddy-redaction.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,IAI9C,QAAQ,QAAQ,GAAG,QAAQ,EAAE,OAAO,MAAM,EAAE,eAAa,YAmBlE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Preserve split secrets across arbitrary UTF-8 decoder chunks before spooling. */
|
|
2
|
+
export function createCodebuddyRedactor(values) {
|
|
3
|
+
const secrets = [...new Set(values.filter(value => value.length > 0))].sort((a, b) => b.length - a.length);
|
|
4
|
+
const hold = Math.max(0, ...secrets.map(value => value.length - 1));
|
|
5
|
+
const pending = { stdout: "", stderr: "" };
|
|
6
|
+
return (stream, chunk, final = false) => {
|
|
7
|
+
pending[stream] += chunk;
|
|
8
|
+
let end = final ? pending[stream].length : Math.max(0, pending[stream].length - hold);
|
|
9
|
+
for (;;) {
|
|
10
|
+
const previous = end;
|
|
11
|
+
for (const secret of secrets) {
|
|
12
|
+
let offset = pending[stream].indexOf(secret);
|
|
13
|
+
while (offset >= 0 && offset < end) {
|
|
14
|
+
if (offset + secret.length > end) {
|
|
15
|
+
end = offset;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
offset = pending[stream].indexOf(secret, offset + secret.length);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (end === previous)
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
let output = pending[stream].slice(0, end);
|
|
25
|
+
pending[stream] = pending[stream].slice(end);
|
|
26
|
+
for (const secret of secrets)
|
|
27
|
+
output = output.split(secret).join("[REDACTED]");
|
|
28
|
+
return output;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=codebuddy-redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebuddy-redaction.js","sourceRoot":"","sources":["../src/codebuddy-redaction.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,UAAU,uBAAuB,CAAC,MAAgB;IACtD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3G,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC3C,OAAO,CAAC,MAA2B,EAAE,KAAa,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;QACnE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;QACzB,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACtF,SAAS,CAAC;YACR,MAAM,QAAQ,GAAG,GAAG,CAAC;YACrB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC7C,OAAO,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;oBACnC,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;wBAAC,GAAG,GAAG,MAAM,CAAC;wBAAC,MAAM;oBAAC,CAAC;oBAC1D,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YACD,IAAI,GAAG,KAAK,QAAQ;gBAAE,MAAM;QAC9B,CAAC;QACD,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/E,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { ConfigurationReference } from "./configuration-lifetime.js";
|
|
2
|
+
export declare const QUALIFIED_CODEBUDDY_VERSION = "2.137.1";
|
|
3
|
+
export declare const WORKBUDDY_CLI = "/Applications/WorkBuddy.app/Contents/Resources/app.asar.unpacked/cli/bin/codebuddy";
|
|
4
|
+
export declare const codebuddyDeniedTools: string[];
|
|
5
|
+
export declare const proxyKeys: string[];
|
|
6
|
+
export declare function codebuddyEnvironment(home: string, config: string, temporary: string, local?: NodeJS.ProcessEnv): {
|
|
7
|
+
HOME: string;
|
|
8
|
+
TMPDIR: string;
|
|
9
|
+
CODEBUDDY_CONFIG_DIR: string;
|
|
10
|
+
CODEBUDDY_DISABLE_MEMORY: string;
|
|
11
|
+
CODEBUDDY_DISABLE_CRON: string;
|
|
12
|
+
CODEBUDDY_DISABLE_WORKFLOWS: string;
|
|
13
|
+
CODEBUDDY_DISABLE_PRODUCT_CACHE: string;
|
|
14
|
+
CODEBUDDY_DISABLE_HOT_RELOAD: string;
|
|
15
|
+
CODEBUDDY_DISABLE_SYSTEM_REMINDER: string;
|
|
16
|
+
CODEBUDDY_REMOTE_CONFIG_DISABLED: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function inspectCodebuddyProtocol(cli: string, cwd: string, environment: Record<string, string>): Promise<string>;
|
|
19
|
+
export declare function codebuddyWorkspaceContains(cwd: string, candidate: string): boolean;
|
|
20
|
+
export declare const codebuddyProjectKey: (cwd: string) => string;
|
|
21
|
+
export declare function isCodebuddyCommand(command: string): command is "codebuddy";
|
|
22
|
+
export type CodebuddyAuthority = {
|
|
23
|
+
baseUrl: string;
|
|
24
|
+
companyId: string;
|
|
25
|
+
agentId: string;
|
|
26
|
+
bindingId: string;
|
|
27
|
+
deviceProfileId?: string;
|
|
28
|
+
generation?: number;
|
|
29
|
+
};
|
|
30
|
+
export type CodebuddyRequest = {
|
|
31
|
+
sessionId: string;
|
|
32
|
+
resume: boolean;
|
|
33
|
+
authorization: string;
|
|
34
|
+
mcpServers: Record<string, {
|
|
35
|
+
type: "http";
|
|
36
|
+
url: string;
|
|
37
|
+
headers: Record<string, string>;
|
|
38
|
+
defer_loading: false;
|
|
39
|
+
} | {
|
|
40
|
+
type: "stdio";
|
|
41
|
+
command: string;
|
|
42
|
+
args: string[];
|
|
43
|
+
env: Record<string, string>;
|
|
44
|
+
}>;
|
|
45
|
+
tools: string[];
|
|
46
|
+
taskMcpSource?: string;
|
|
47
|
+
};
|
|
48
|
+
/** Only the actual CodeBuddy launch is prepared; transfer/helper commands are untouched. */
|
|
49
|
+
export declare function prepareCodebuddyCommand(input: {
|
|
50
|
+
args: string[];
|
|
51
|
+
env: Record<string, string>;
|
|
52
|
+
cwd: string;
|
|
53
|
+
authority: CodebuddyAuthority;
|
|
54
|
+
stateRoot: string;
|
|
55
|
+
onConfiguration?: (reference: Required<ConfigurationReference>) => Promise<void>;
|
|
56
|
+
}): Promise<{
|
|
57
|
+
observeStdout: (chunk: string) => void;
|
|
58
|
+
command: string;
|
|
59
|
+
cwd: string;
|
|
60
|
+
args: string[];
|
|
61
|
+
redact: (stream: "stdout" | "stderr", chunk: string, final?: boolean) => string;
|
|
62
|
+
version: string;
|
|
63
|
+
env: {
|
|
64
|
+
SHELL: string;
|
|
65
|
+
HOME: string;
|
|
66
|
+
TMPDIR: string;
|
|
67
|
+
CODEBUDDY_CONFIG_DIR: string;
|
|
68
|
+
CODEBUDDY_DISABLE_MEMORY: string;
|
|
69
|
+
CODEBUDDY_DISABLE_CRON: string;
|
|
70
|
+
CODEBUDDY_DISABLE_WORKFLOWS: string;
|
|
71
|
+
CODEBUDDY_DISABLE_PRODUCT_CACHE: string;
|
|
72
|
+
CODEBUDDY_DISABLE_HOT_RELOAD: string;
|
|
73
|
+
CODEBUDDY_DISABLE_SYSTEM_REMINDER: string;
|
|
74
|
+
CODEBUDDY_REMOTE_CONFIG_DISABLED: string;
|
|
75
|
+
};
|
|
76
|
+
configDirectory: string;
|
|
77
|
+
configurationToken: string;
|
|
78
|
+
rollbackUnstarted: () => Promise<void>;
|
|
79
|
+
finalize(success: boolean): Promise<"failed" | undefined>;
|
|
80
|
+
cleanup(): Promise<void>;
|
|
81
|
+
}>;
|
|
82
|
+
//# sourceMappingURL=codebuddy-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebuddy-runtime.d.ts","sourceRoot":"","sources":["../src/codebuddy-runtime.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAG1E,eAAO,MAAM,2BAA2B,YAAY,CAAC;AAErD,eAAO,MAAM,aAAa,uFAAuF,CAAC;AAElH,eAAO,MAAM,oBAAoB,UAKhC,CAAC;AAEF,eAAO,MAAM,SAAS,UAAuF,CAAC;AAC9G,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,oBAAc;;;;;;;;;;;EASxG;AACD,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,mBAqC3G;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAGxE;AAED,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,WAA2E,CAAC;AAC3H,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,0BAAqC;AACvF,MAAM,MAAM,kBAAkB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC3J,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAC1D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,aAAa,EAAE,KAAK,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IACnM,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAGF,4FAA4F;AAC5F,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAC3G,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,sBAAsB,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClF;2BA0F2B,MAAM;;;;;;;;;;;;;;;;;;;;;;sBA4BJ,OAAO;;GA6BpC"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { execFile, spawn } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { randomUUID, createHash } from "node:crypto";
|
|
4
|
+
import { lstat, mkdir, mkdtemp, open, readFile, realpath, rename, rm, writeFile } from "node:fs/promises";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { acquireCodebuddyLocks } from "./codebuddy-locks.js";
|
|
8
|
+
import { mirrorxIdentityHome } from "./device-id.js";
|
|
9
|
+
import { snapshotWorkbuddyAuth } from "./codebuddy-auth.js";
|
|
10
|
+
import { createCodebuddyRedactor } from "./codebuddy-redaction.js";
|
|
11
|
+
import { ownConfiguration } from "./configuration-lifetime.js";
|
|
12
|
+
import { codebuddySessionLockKeys, codebuddySessionPattern, rememberCodebuddySession } from "./codebuddy-session.js";
|
|
13
|
+
import { codebuddyToolGate, shellQuote } from "./codebuddy-tool-gate.js";
|
|
14
|
+
export const QUALIFIED_CODEBUDDY_VERSION = "2.137.1";
|
|
15
|
+
export const WORKBUDDY_CLI = "/Applications/WorkBuddy.app/Contents/Resources/app.asar.unpacked/cli/bin/codebuddy";
|
|
16
|
+
// --tools alone leaves CodeBuddy's supplemental native/meta tools visible.
|
|
17
|
+
export const codebuddyDeniedTools = [
|
|
18
|
+
"Bash", "PowerShell", "Skill", "Task", "Agent", "WebFetch", "WebSearch", "Read", "Write", "Edit", "Glob", "Grep",
|
|
19
|
+
"EnterPlanMode", "ExitPlanMode", "TaskCreate", "TaskGet", "TaskUpdate", "TaskList", "TaskStop", "TaskOutput",
|
|
20
|
+
"AskUserQuestion", "StructuredOutput", "ToolSearch", "DeferExecuteTool", "SendMessage", "TeamCreate", "TeamDelete",
|
|
21
|
+
"ImageGen", "VideoGen", "WeChatReply", "WeComReply", "ListMcpResources", "ReadMcpResource", "MessageColleague", "SpeakInChannel",
|
|
22
|
+
];
|
|
23
|
+
const basicKeys = ["PATH", "LANG", "LC_ALL", "LC_CTYPE", "SHELL", "TERM", "TZ", "NO_COLOR", "SSL_CERT_FILE", "SSL_CERT_DIR", "NO_PROXY", "no_proxy"];
|
|
24
|
+
export const proxyKeys = ["HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "http_proxy", "https_proxy", "all_proxy"];
|
|
25
|
+
export function codebuddyEnvironment(home, config, temporary, local = process.env) {
|
|
26
|
+
const env = {};
|
|
27
|
+
for (const key of [...basicKeys, ...proxyKeys])
|
|
28
|
+
if (typeof local[key] === "string")
|
|
29
|
+
env[key] = local[key];
|
|
30
|
+
// WorkBuddy uses system utilities (including ioreg) even for readiness; do not require global CLI installations.
|
|
31
|
+
if (process.platform === "darwin")
|
|
32
|
+
env.PATH = [...new Set([...(env.PATH ?? "").split(path.delimiter).filter(Boolean), "/usr/bin", "/bin", "/usr/sbin", "/sbin"])].join(path.delimiter);
|
|
33
|
+
return { ...env, HOME: home, TMPDIR: temporary, CODEBUDDY_CONFIG_DIR: config,
|
|
34
|
+
CODEBUDDY_DISABLE_MEMORY: "true", CODEBUDDY_DISABLE_CRON: "true", CODEBUDDY_DISABLE_WORKFLOWS: "true",
|
|
35
|
+
CODEBUDDY_DISABLE_PRODUCT_CACHE: "true", CODEBUDDY_DISABLE_HOT_RELOAD: "true",
|
|
36
|
+
CODEBUDDY_DISABLE_SYSTEM_REMINDER: "true", CODEBUDDY_REMOTE_CONFIG_DISABLED: "true" };
|
|
37
|
+
}
|
|
38
|
+
export async function inspectCodebuddyProtocol(cli, cwd, environment) {
|
|
39
|
+
let stage = "version";
|
|
40
|
+
try {
|
|
41
|
+
const info = await promisify(execFile)(cli, ["--print", "--version"], { cwd, env: environment, timeout: 10_000, maxBuffer: 1_000_000 });
|
|
42
|
+
stage = "help";
|
|
43
|
+
// The bundled CLI exits before its asynchronous pipe writes always drain.
|
|
44
|
+
// A private regular fd preserves the tail (including --setting-sources).
|
|
45
|
+
const file = path.join(environment.TMPDIR ?? os.tmpdir(), `workbuddy-help-${randomUUID()}.txt`);
|
|
46
|
+
const output = await open(file, "wx", 0o600);
|
|
47
|
+
let help;
|
|
48
|
+
try {
|
|
49
|
+
const child = spawn(cli, ["--help"], { cwd, env: environment, shell: false, stdio: ["ignore", output.fd, "ignore"] });
|
|
50
|
+
let escalation;
|
|
51
|
+
const timer = setTimeout(() => {
|
|
52
|
+
if (child.pid && child.exitCode === null && child.signalCode === null)
|
|
53
|
+
child.kill("SIGTERM");
|
|
54
|
+
escalation = setTimeout(() => { if (child.pid && child.exitCode === null && child.signalCode === null)
|
|
55
|
+
child.kill("SIGKILL"); }, 2_000);
|
|
56
|
+
}, 10_000);
|
|
57
|
+
try {
|
|
58
|
+
const code = await new Promise((resolve, reject) => { child.once("error", reject); child.once("close", resolve); });
|
|
59
|
+
if (code !== 0)
|
|
60
|
+
throw new Error("help_failed");
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
if (escalation)
|
|
65
|
+
clearTimeout(escalation);
|
|
66
|
+
}
|
|
67
|
+
if ((await output.stat()).size > 1_000_000)
|
|
68
|
+
throw new Error("help_limit");
|
|
69
|
+
help = await readFile(file, "utf8");
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await output.close();
|
|
73
|
+
await rm(file, { force: true });
|
|
74
|
+
}
|
|
75
|
+
stage = "contract";
|
|
76
|
+
const version = info.stdout.trim();
|
|
77
|
+
const flags = ["--strict-mcp-config", "--setting-sources", "--output-format", "--resume", "--allowedTools", "--disallowedTools", "--tools", "--permission-mode"];
|
|
78
|
+
stage = "qualified-version";
|
|
79
|
+
if (!new RegExp(`^${QUALIFIED_CODEBUDDY_VERSION.replaceAll(".", "\\.")}(?:$|\\s)`).test(version))
|
|
80
|
+
throw new Error("protocol");
|
|
81
|
+
stage = "contract";
|
|
82
|
+
if (!flags.every(flag => help.includes(flag)))
|
|
83
|
+
throw new Error("protocol");
|
|
84
|
+
return version;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
const value = error.code;
|
|
88
|
+
const code = typeof value === "string" && /^[A-Z_0-9]{1,32}$/.test(value) ? value : "unavailable";
|
|
89
|
+
throw new Error(`WorkBuddy CLI protocol readiness failed (${stage}, code=${code}); check the local CLI installation`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function codebuddyWorkspaceContains(cwd, candidate) {
|
|
93
|
+
const relative = path.relative(cwd, candidate);
|
|
94
|
+
return relative === "" || (!(relative === ".." || relative.startsWith(".." + path.sep)) && !path.isAbsolute(relative));
|
|
95
|
+
}
|
|
96
|
+
export const codebuddyProjectKey = (cwd) => cwd.replace(/^[/\\]+/, "").replace(/[\\/:]/g, "-").replace(/-+/g, "-");
|
|
97
|
+
export function isCodebuddyCommand(command) { return command === "codebuddy"; }
|
|
98
|
+
/** Only the actual CodeBuddy launch is prepared; transfer/helper commands are untouched. */
|
|
99
|
+
export async function prepareCodebuddyCommand(input) {
|
|
100
|
+
let request;
|
|
101
|
+
try {
|
|
102
|
+
request = JSON.parse(input.env.MIRRORX_CODEBUDDY_REQUEST ?? "null");
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
throw new Error("Invalid WorkBuddy launch descriptor");
|
|
106
|
+
}
|
|
107
|
+
if (!request || !codebuddySessionPattern.test(request.sessionId) || !request.authorization || !Array.isArray(request.tools) || request.tools.some(tool => typeof tool !== "string" || !/^mcp__[A-Za-z0-9_.-]+__[A-Za-z0-9_.-]+$/.test(tool)))
|
|
108
|
+
throw new Error("Invalid WorkBuddy launch descriptor");
|
|
109
|
+
if (process.platform !== "darwin")
|
|
110
|
+
throw new Error("WorkBuddy desktop authentication is qualified only on macOS");
|
|
111
|
+
const cwd = await realpath(input.cwd);
|
|
112
|
+
const localHome = await realpath(os.homedir());
|
|
113
|
+
const stateRoot = await realpath(input.stateRoot);
|
|
114
|
+
const sourceAuth = path.join(localHome, "Library", "Application Support", "CodeBuddyExtension");
|
|
115
|
+
if ([stateRoot, mirrorxIdentityHome(), sourceAuth].some(protectedPath => (codebuddyWorkspaceContains(cwd, protectedPath) || codebuddyWorkspaceContains(protectedPath, cwd))))
|
|
116
|
+
throw new Error("Choose a project workspace that does not overlap device state or desktop authentication");
|
|
117
|
+
const cli = process.env.MIRRORX_WORKBUDDY_CLI || WORKBUDDY_CLI;
|
|
118
|
+
if (!path.isAbsolute(cli) || !(await lstat(cli)).isFile())
|
|
119
|
+
throw new Error("WorkBuddy CLI is missing; install WorkBuddy or configure its local executable path");
|
|
120
|
+
const resolvedCli = await realpath(cli), app = resolvedCli.indexOf(".app/");
|
|
121
|
+
const installation = app >= 0 ? resolvedCli.slice(0, app + 4) : resolvedCli;
|
|
122
|
+
if (codebuddyWorkspaceContains(cwd, installation) || codebuddyWorkspaceContains(installation, cwd))
|
|
123
|
+
throw new Error("WorkBuddy installation must be outside the task workspace");
|
|
124
|
+
const identity = JSON.stringify({ ...input.authority, cwd, authorization: request.authorization });
|
|
125
|
+
const sessionRoot = path.join(input.stateRoot, "codebuddy-sessions", createHash("sha256").update(identity).digest("hex"));
|
|
126
|
+
await mkdir(sessionRoot, { recursive: true, mode: 0o700 });
|
|
127
|
+
const invalidated = path.join(sessionRoot, `${request.sessionId}.unsettled`);
|
|
128
|
+
let locks;
|
|
129
|
+
let directory;
|
|
130
|
+
let configurationToken, fenced = false;
|
|
131
|
+
const rollbackUnstarted = async () => {
|
|
132
|
+
if (!fenced)
|
|
133
|
+
return;
|
|
134
|
+
const marker = JSON.parse(await readFile(invalidated, "utf8"));
|
|
135
|
+
if (marker.configurationToken !== configurationToken)
|
|
136
|
+
throw new Error("WorkBuddy session fence ownership changed");
|
|
137
|
+
await rm(invalidated);
|
|
138
|
+
fenced = false;
|
|
139
|
+
};
|
|
140
|
+
try {
|
|
141
|
+
directory = await mkdtemp(path.join(await realpath(os.tmpdir()), "mirrorx-codebuddy-command-"));
|
|
142
|
+
if (codebuddyWorkspaceContains(cwd, directory))
|
|
143
|
+
throw new Error("WorkBuddy private configuration must be outside the task workspace");
|
|
144
|
+
const ownedDirectory = directory;
|
|
145
|
+
configurationToken = await ownConfiguration(directory, true);
|
|
146
|
+
const reference = { configurationDirectory: directory, configurationToken };
|
|
147
|
+
locks = await acquireCodebuddyLocks(stateRoot, codebuddySessionLockKeys(cwd, identity, request.sessionId), {
|
|
148
|
+
directory, persist: async () => { await input.onConfiguration?.(reference); },
|
|
149
|
+
});
|
|
150
|
+
const release = locks.release;
|
|
151
|
+
await rememberCodebuddySession(stateRoot, sessionRoot, identity);
|
|
152
|
+
if (await lstat(invalidated).catch(() => null))
|
|
153
|
+
throw new Error(`WorkBuddy session has an unsettled previous attempt; reconcile the original command, then reset-session --kind codebuddy --company ${input.authority.companyId} --session-key ${path.basename(sessionRoot)} --session ${request.sessionId} --confirm-stopped to discard its checkpoint before a fresh session`);
|
|
154
|
+
const home = path.join(directory, "home"), config = path.join(directory, "config"), temporary = path.join(directory, "tmp");
|
|
155
|
+
for (const dir of [home, config, temporary])
|
|
156
|
+
await mkdir(dir, { mode: 0o700 });
|
|
157
|
+
// WorkBuddy encodes the entire cwd as one transcript directory component.
|
|
158
|
+
// Long managed task paths exceed NAME_MAX. Native tools remain disabled;
|
|
159
|
+
// task MCP tools keep their original authorized workspace, while the vendor
|
|
160
|
+
// stores only its own session state under this private, short working dir.
|
|
161
|
+
const launchCwd = Buffer.byteLength(codebuddyProjectKey(cwd)) > 240 ? path.join(directory, "work") : cwd;
|
|
162
|
+
if (launchCwd !== cwd)
|
|
163
|
+
await mkdir(launchCwd, { mode: 0o700 });
|
|
164
|
+
snapshotWorkbuddyAuth(home);
|
|
165
|
+
const transcript = path.join(config, "projects", codebuddyProjectKey(launchCwd), `${request.sessionId}.jsonl`);
|
|
166
|
+
const saved = path.join(sessionRoot, `${request.sessionId}.jsonl`);
|
|
167
|
+
if (request.resume) {
|
|
168
|
+
const entry = await lstat(saved).catch(() => null);
|
|
169
|
+
if (!entry?.isFile() || entry.isSymbolicLink())
|
|
170
|
+
throw new Error("WorkBuddy native session is missing; refusing an implicit fresh replay");
|
|
171
|
+
await mkdir(path.dirname(transcript), { recursive: true, mode: 0o700 });
|
|
172
|
+
await writeFile(transcript, await readFile(saved), { flag: "wx", mode: 0o600 });
|
|
173
|
+
}
|
|
174
|
+
if (request.taskMcpSource) {
|
|
175
|
+
if (request.taskMcpSource.length > 32_000)
|
|
176
|
+
throw new Error("WorkBuddy task MCP asset exceeds its limit");
|
|
177
|
+
const script = path.join(directory, "task-mcp.mjs");
|
|
178
|
+
// The task MCP process must retain the authorized task cwd even when the
|
|
179
|
+
// vendor launches in a short private cwd for native transcript storage.
|
|
180
|
+
await writeFile(script, `process.chdir(${JSON.stringify(cwd)});\n${request.taskMcpSource}`, { flag: "wx", mode: 0o600 });
|
|
181
|
+
for (const server of Object.values(request.mcpServers))
|
|
182
|
+
if (server.type === "stdio" && server.command === "@mirrorx/task") {
|
|
183
|
+
server.command = process.execPath;
|
|
184
|
+
server.args = [script];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const environment = { ...codebuddyEnvironment(home, config, temporary), SHELL: "/bin/sh" };
|
|
188
|
+
const version = await inspectCodebuddyProtocol(cli, launchCwd, environment);
|
|
189
|
+
const protectedValues = proxyKeys.flatMap(key => process.env[key] ? [process.env[key]] : []);
|
|
190
|
+
for (const server of Object.values(request.mcpServers)) {
|
|
191
|
+
if (server.type === "http")
|
|
192
|
+
for (const value of Object.values(server.headers)) {
|
|
193
|
+
protectedValues.push(value, value.replace(/^Bearer /i, ""));
|
|
194
|
+
}
|
|
195
|
+
if (server.type === "stdio")
|
|
196
|
+
for (const [key, value] of Object.entries(server.env)) {
|
|
197
|
+
if (/TOKEN|KEY|SECRET|PASSWORD/.test(key))
|
|
198
|
+
protectedValues.push(value);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const mcp = path.join(directory, "mcp.json"), settings = path.join(directory, "settings.json");
|
|
202
|
+
await writeFile(mcp, JSON.stringify({ mcpServers: request.mcpServers }), { flag: "wx", mode: 0o600 });
|
|
203
|
+
const gate = path.join(directory, "tool-gate.cjs");
|
|
204
|
+
await writeFile(gate, codebuddyToolGate(request.tools), { flag: "wx", mode: 0o600 });
|
|
205
|
+
await writeFile(settings, JSON.stringify({ trustedDirectories: [cwd], permissions: { allow: request.tools, defaultMode: "dontAsk", disableBypassPermissionsMode: "disable", deny: codebuddyDeniedTools },
|
|
206
|
+
hooks: { PreToolUse: [{ matcher: "*", hooks: [{ type: "command", command: `${shellQuote(process.execPath)} ${shellQuote(gate)}`, timeout: 5 }] }] } }), { flag: "wx", mode: 0o600 });
|
|
207
|
+
await writeFile(invalidated, JSON.stringify({ preparedAt: new Date().toISOString(), configurationToken }), { flag: "wx", mode: 0o600 });
|
|
208
|
+
fenced = true;
|
|
209
|
+
let pending = "", terminal = false, failed = false, malformed = false, results = 0;
|
|
210
|
+
const observe = (chunk) => {
|
|
211
|
+
pending += chunk;
|
|
212
|
+
for (;;) {
|
|
213
|
+
const end = pending.indexOf("\n");
|
|
214
|
+
if (end < 0)
|
|
215
|
+
break;
|
|
216
|
+
const line = pending.slice(0, end);
|
|
217
|
+
pending = pending.slice(end + 1);
|
|
218
|
+
try {
|
|
219
|
+
const event = JSON.parse(line);
|
|
220
|
+
if (event.type === "result") {
|
|
221
|
+
if (++results !== 1)
|
|
222
|
+
malformed = true;
|
|
223
|
+
terminal = event.subtype === "success" && event.is_error === false && event.session_id === request.sessionId;
|
|
224
|
+
// A matching terminal API failure (including exit-zero 401) is a
|
|
225
|
+
// known failed turn, not missing shutdown evidence. Never commit
|
|
226
|
+
// its checkpoint or silently replay the previous native session.
|
|
227
|
+
failed = event.is_error === true && event.session_id === request.sessionId
|
|
228
|
+
&& ["success", "error_during_execution", "error_max_turns", "error_max_budget_usd", "error_max_structured_output_retries"].includes(event.subtype);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch { /* Non-protocol diagnostics do not authorize a checkpoint. */ }
|
|
232
|
+
}
|
|
233
|
+
if (pending.length > 2_000_000) {
|
|
234
|
+
pending = "";
|
|
235
|
+
malformed = true;
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
return {
|
|
239
|
+
observeStdout: observe,
|
|
240
|
+
command: cli, cwd: launchCwd, args: [...input.args, "--setting-sources", "", "--settings", settings,
|
|
241
|
+
"--strict-mcp-config", "--mcp-config", mcp, "--tools", request.tools.map(tool => tool.startsWith("mcp__") ? `NoDefer(${tool})` : tool).join(","), "--allowedTools", request.tools.join(","), "--disallowedTools", codebuddyDeniedTools.join(","), "--permission-mode", "dontAsk"],
|
|
242
|
+
redact: createCodebuddyRedactor(protectedValues),
|
|
243
|
+
version, env: environment, configDirectory: directory, configurationToken,
|
|
244
|
+
rollbackUnstarted,
|
|
245
|
+
async finalize(success) {
|
|
246
|
+
if (pending)
|
|
247
|
+
observe("\n");
|
|
248
|
+
if (!success)
|
|
249
|
+
return;
|
|
250
|
+
if (failed && !malformed && results === 1)
|
|
251
|
+
return "failed";
|
|
252
|
+
if (!terminal || malformed || results !== 1)
|
|
253
|
+
throw new Error("WorkBuddy ended without exactly one valid success result; reconciliation is required");
|
|
254
|
+
const entry = await lstat(transcript).catch(() => null);
|
|
255
|
+
if (!entry)
|
|
256
|
+
throw new Error("WorkBuddy finished without a native session transcript; reconciliation is required");
|
|
257
|
+
if (entry) {
|
|
258
|
+
if (!entry.isFile() || entry.isSymbolicLink() || entry.size > 64 * 1024 * 1024)
|
|
259
|
+
throw new Error("WorkBuddy session transcript is unsafe or too large");
|
|
260
|
+
const bytes = await readFile(transcript);
|
|
261
|
+
const text = bytes.toString("utf8");
|
|
262
|
+
if (protectedValues.some(value => value && text.includes(value)))
|
|
263
|
+
throw new Error("WorkBuddy native transcript contains run credentials; checkpoint requires reconciliation");
|
|
264
|
+
const tmp = path.join(sessionRoot, `${request.sessionId}.${randomUUID()}.tmp`);
|
|
265
|
+
await writeFile(tmp, bytes, { flag: "wx", mode: 0o600 });
|
|
266
|
+
await rename(tmp, saved);
|
|
267
|
+
await rm(invalidated);
|
|
268
|
+
fenced = false;
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
async cleanup() { await release(); await rm(ownedDirectory, { recursive: true, force: true }); },
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
await rollbackUnstarted();
|
|
276
|
+
await locks?.release();
|
|
277
|
+
if (directory)
|
|
278
|
+
await rm(directory, { recursive: true, force: true });
|
|
279
|
+
// Source file paths and credential content must never enter task logs.
|
|
280
|
+
if (error instanceof Error && !('code' in error))
|
|
281
|
+
throw error;
|
|
282
|
+
throw new Error("Could not prepare WorkBuddy private runtime; check local installation and authentication permissions");
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=codebuddy-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebuddy-runtime.js","sourceRoot":"","sources":["../src/codebuddy-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const codebuddySessionPattern: RegExp;
|
|
2
|
+
export declare const codebuddySessionLockKeys: (cwd: string, identity: string, sessionId: string) => string[];
|
|
3
|
+
/** Non-secret identity is retained even when the private launch profile is reclaimed. */
|
|
4
|
+
export declare function rememberCodebuddySession(stateRoot: string, directory: string, identity: string): Promise<void>;
|
|
5
|
+
/** Explicit destructive local recovery: never restores a stale checkpoint or changes a command receipt. */
|
|
6
|
+
export declare function discardCodebuddySession(input: {
|
|
7
|
+
stateRoot: string;
|
|
8
|
+
companyId: string;
|
|
9
|
+
sessionKey: string;
|
|
10
|
+
sessionId: string;
|
|
11
|
+
confirmedStopped: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=codebuddy-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codebuddy-session.d.ts","sourceRoot":"","sources":["../src/codebuddy-session.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,QAAsC,CAAC;AAE3E,eAAO,MAAM,wBAAwB,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,EAAE,WAAW,MAAM,aACf,CAAC;AAiB3E,yFAAyF;AACzF,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAMpG;AAED,2GAA2G;AAC3G,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAC;CACxG,iBAmBA"}
|