@moxt-ai/mobius 0.0.4 → 0.0.6

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 (115) hide show
  1. package/dist/acp/native-session.d.ts +30 -0
  2. package/dist/acp/native-session.d.ts.map +1 -0
  3. package/dist/acp/native-session.js +25 -0
  4. package/dist/acp/native-session.js.map +1 -0
  5. package/dist/acp/session-history.d.ts +9 -0
  6. package/dist/acp/session-history.d.ts.map +1 -0
  7. package/dist/acp/session-history.js +69 -0
  8. package/dist/acp/session-history.js.map +1 -0
  9. package/dist/acp/session-manager.d.ts +16 -5
  10. package/dist/acp/session-manager.d.ts.map +1 -1
  11. package/dist/acp/session-manager.js +226 -41
  12. package/dist/acp/session-manager.js.map +1 -1
  13. package/dist/acp/session-store.d.ts +9 -0
  14. package/dist/acp/session-store.d.ts.map +1 -1
  15. package/dist/acp/session-store.js +43 -0
  16. package/dist/acp/session-store.js.map +1 -1
  17. package/dist/agent-catalog/agent-diagnostics.d.ts +3 -0
  18. package/dist/agent-catalog/agent-diagnostics.d.ts.map +1 -0
  19. package/dist/agent-catalog/agent-diagnostics.js +62 -0
  20. package/dist/agent-catalog/agent-diagnostics.js.map +1 -0
  21. package/dist/agent-catalog/discover-local-agents.d.ts +77 -0
  22. package/dist/agent-catalog/discover-local-agents.d.ts.map +1 -0
  23. package/dist/agent-catalog/discover-local-agents.js +467 -0
  24. package/dist/agent-catalog/discover-local-agents.js.map +1 -0
  25. package/dist/agent-catalog/local-agent.d.ts +38 -0
  26. package/dist/agent-catalog/local-agent.d.ts.map +1 -0
  27. package/dist/agent-catalog/local-agent.js +93 -0
  28. package/dist/agent-catalog/local-agent.js.map +1 -0
  29. package/dist/agent-catalog/publish-agent-catalog.d.ts +3 -0
  30. package/dist/agent-catalog/publish-agent-catalog.d.ts.map +1 -0
  31. package/dist/agent-catalog/publish-agent-catalog.js +58 -0
  32. package/dist/agent-catalog/publish-agent-catalog.js.map +1 -0
  33. package/dist/agent-installation/agent-installation-manager.d.ts +60 -0
  34. package/dist/agent-installation/agent-installation-manager.d.ts.map +1 -0
  35. package/dist/agent-installation/agent-installation-manager.js +242 -0
  36. package/dist/agent-installation/agent-installation-manager.js.map +1 -0
  37. package/dist/agent-installation/automatic-adapter-provisioner.d.ts +18 -0
  38. package/dist/agent-installation/automatic-adapter-provisioner.d.ts.map +1 -0
  39. package/dist/agent-installation/automatic-adapter-provisioner.js +116 -0
  40. package/dist/agent-installation/automatic-adapter-provisioner.js.map +1 -0
  41. package/dist/agent-installation/fixed-agent-install-recipes.d.ts +20 -0
  42. package/dist/agent-installation/fixed-agent-install-recipes.d.ts.map +1 -0
  43. package/dist/agent-installation/fixed-agent-install-recipes.js +163 -0
  44. package/dist/agent-installation/fixed-agent-install-recipes.js.map +1 -0
  45. package/dist/agent-installation/fixed-installation-executor.d.ts +20 -0
  46. package/dist/agent-installation/fixed-installation-executor.d.ts.map +1 -0
  47. package/dist/agent-installation/fixed-installation-executor.js +204 -0
  48. package/dist/agent-installation/fixed-installation-executor.js.map +1 -0
  49. package/dist/agent-installation/installation-grants.d.ts +2 -0
  50. package/dist/agent-installation/installation-grants.d.ts.map +1 -0
  51. package/dist/agent-installation/installation-grants.js +52 -0
  52. package/dist/agent-installation/installation-grants.js.map +1 -0
  53. package/dist/agent-installation/local-installation-authorizer.d.ts +7 -0
  54. package/dist/agent-installation/local-installation-authorizer.d.ts.map +1 -0
  55. package/dist/agent-installation/local-installation-authorizer.js +32 -0
  56. package/dist/agent-installation/local-installation-authorizer.js.map +1 -0
  57. package/dist/agent-installation/managed-adapter-installer.d.ts +20 -0
  58. package/dist/agent-installation/managed-adapter-installer.d.ts.map +1 -0
  59. package/dist/agent-installation/managed-adapter-installer.js +159 -0
  60. package/dist/agent-installation/managed-adapter-installer.js.map +1 -0
  61. package/dist/agent-installation/verified-download.d.ts +24 -0
  62. package/dist/agent-installation/verified-download.d.ts.map +1 -0
  63. package/dist/agent-installation/verified-download.js +158 -0
  64. package/dist/agent-installation/verified-download.js.map +1 -0
  65. package/dist/audit/audit-store.d.ts +1 -0
  66. package/dist/audit/audit-store.d.ts.map +1 -1
  67. package/dist/audit/audit-store.js +12 -4
  68. package/dist/audit/audit-store.js.map +1 -1
  69. package/dist/authorization/local-authorization-error.d.ts +5 -0
  70. package/dist/authorization/local-authorization-error.d.ts.map +1 -0
  71. package/dist/authorization/local-authorization-error.js +8 -0
  72. package/dist/authorization/local-authorization-error.js.map +1 -0
  73. package/dist/authorization/workspace-directory.d.ts +16 -5
  74. package/dist/authorization/workspace-directory.d.ts.map +1 -1
  75. package/dist/authorization/workspace-directory.js +109 -119
  76. package/dist/authorization/workspace-directory.js.map +1 -1
  77. package/dist/cli.js +6289 -2124
  78. package/dist/cli.js.map +4 -4
  79. package/dist/config.d.ts +8 -12
  80. package/dist/config.d.ts.map +1 -1
  81. package/dist/config.js +14 -55
  82. package/dist/config.js.map +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +4894 -852
  86. package/dist/index.js.map +4 -4
  87. package/dist/native-sessions/codex-history.d.ts +11 -0
  88. package/dist/native-sessions/codex-history.d.ts.map +1 -0
  89. package/dist/native-sessions/codex-history.js +223 -0
  90. package/dist/native-sessions/codex-history.js.map +1 -0
  91. package/dist/native-sessions/service.d.ts +14 -0
  92. package/dist/native-sessions/service.d.ts.map +1 -0
  93. package/dist/native-sessions/service.js +249 -0
  94. package/dist/native-sessions/service.js.map +1 -0
  95. package/dist/pairing/pair-local-machine.d.ts +2 -2
  96. package/dist/pairing/pair-local-machine.d.ts.map +1 -1
  97. package/dist/pairing/pair-local-machine.js +65 -41
  98. package/dist/pairing/pair-local-machine.js.map +1 -1
  99. package/dist/process/executable.d.ts +40 -0
  100. package/dist/process/executable.d.ts.map +1 -0
  101. package/dist/process/executable.js +305 -0
  102. package/dist/process/executable.js.map +1 -0
  103. package/dist/run-daemon.d.ts +1 -1
  104. package/dist/run-daemon.d.ts.map +1 -1
  105. package/dist/run-daemon.js +431 -180
  106. package/dist/run-daemon.js.map +1 -1
  107. package/dist/storage/state-directory.d.ts +2 -0
  108. package/dist/storage/state-directory.d.ts.map +1 -0
  109. package/dist/storage/state-directory.js +10 -0
  110. package/dist/storage/state-directory.js.map +1 -0
  111. package/package.json +5 -6
  112. package/dist/authorization/authorize-binding.d.ts +0 -6
  113. package/dist/authorization/authorize-binding.d.ts.map +0 -1
  114. package/dist/authorization/authorize-binding.js +0 -30
  115. package/dist/authorization/authorize-binding.js.map +0 -1
@@ -0,0 +1,159 @@
1
+ import { mkdir, mkdtemp, open, realpath, rename, rm, stat, } from "node:fs/promises";
2
+ import { delimiter, dirname, join, relative } from "node:path";
3
+ import { findExecutableOnPath, resolveExecutablePath, runBoundedProcess, } from "../process/executable.js";
4
+ const ADAPTER_INSTALL_TIMEOUT_MILLISECONDS = 2 * 60 * 1_000;
5
+ const PACKAGE_METADATA_LIMIT_BYTES = 64 * 1024;
6
+ export class ManagedAdapterInstallError extends Error {
7
+ code;
8
+ constructor(code, message, options = {}) {
9
+ super(message, options);
10
+ this.code = code;
11
+ this.name = "ManagedAdapterInstallError";
12
+ }
13
+ }
14
+ function isRecord(value) {
15
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ }
17
+ function packagePath(root, packageName) {
18
+ return join(root, "node_modules", ...packageName.split("/"));
19
+ }
20
+ async function readPackageJson(path) {
21
+ const handle = await open(path, "r");
22
+ try {
23
+ const metadata = await handle.stat();
24
+ if (!metadata.isFile() || metadata.size > PACKAGE_METADATA_LIMIT_BYTES) {
25
+ throw new ManagedAdapterInstallError("adapter_verification_failed", "The managed adapter package metadata is invalid");
26
+ }
27
+ const value = JSON.parse(await handle.readFile({ encoding: "utf8" }));
28
+ if (!isRecord(value)) {
29
+ throw new ManagedAdapterInstallError("adapter_verification_failed", "The managed adapter package metadata is invalid");
30
+ }
31
+ return value;
32
+ }
33
+ finally {
34
+ await handle.close();
35
+ }
36
+ }
37
+ function readBinPath(packageMetadata, executableName) {
38
+ const bin = packageMetadata["bin"];
39
+ if (typeof bin === "string") {
40
+ return bin;
41
+ }
42
+ if (isRecord(bin) && typeof bin[executableName] === "string") {
43
+ return bin[executableName];
44
+ }
45
+ throw new ManagedAdapterInstallError("adapter_verification_failed", "The managed adapter executable declaration is invalid");
46
+ }
47
+ export async function validateManagedAdapter(root, specification) {
48
+ const rootPath = await realpath(root);
49
+ const packageRoot = await realpath(packagePath(rootPath, specification.adapterPackage));
50
+ const packageDifference = relative(rootPath, packageRoot);
51
+ if (packageDifference.startsWith("..") || packageDifference.length === 0) {
52
+ throw new ManagedAdapterInstallError("adapter_verification_failed", "The managed adapter package escaped its private cache");
53
+ }
54
+ const metadata = await readPackageJson(join(packageRoot, "package.json"));
55
+ if (metadata["name"] !== specification.adapterPackage ||
56
+ metadata["version"] !== specification.adapterVersion) {
57
+ throw new ManagedAdapterInstallError("adapter_verification_failed", "The managed adapter package identity is invalid");
58
+ }
59
+ const declaredBin = readBinPath(metadata, specification.adapterExecutable);
60
+ const executable = await resolveExecutablePath(join(packageRoot, declaredBin));
61
+ if (executable === null) {
62
+ throw new ManagedAdapterInstallError("adapter_verification_failed", "The managed adapter executable is invalid");
63
+ }
64
+ const executableDifference = relative(rootPath, executable.path);
65
+ if (executableDifference.startsWith("..") ||
66
+ executableDifference.length === 0) {
67
+ throw new ManagedAdapterInstallError("adapter_verification_failed", "The managed adapter executable escaped its private cache");
68
+ }
69
+ return executable;
70
+ }
71
+ export class ManagedAdapterInstaller {
72
+ #environment;
73
+ #stateDirectory;
74
+ constructor(options) {
75
+ this.#environment = options.environment;
76
+ this.#stateDirectory = options.stateDirectory;
77
+ }
78
+ install = async (specification, signal) => {
79
+ signal.throwIfAborted();
80
+ const agentCache = join(this.#stateDirectory, "adapters", specification.id);
81
+ const published = join(agentCache, specification.adapterVersion);
82
+ try {
83
+ const metadata = await stat(published);
84
+ if (metadata.isDirectory()) {
85
+ return await validateManagedAdapter(published, specification);
86
+ }
87
+ }
88
+ catch (error) {
89
+ if (!(error instanceof Error) ||
90
+ !("code" in error) ||
91
+ error.code !== "ENOENT") {
92
+ throw error;
93
+ }
94
+ }
95
+ await mkdir(agentCache, { mode: 0o700, recursive: true });
96
+ const staging = await mkdtemp(join(agentCache, `.${specification.adapterVersion}.staging-`));
97
+ try {
98
+ const npm = await findExecutableOnPath(process.platform === "win32" ? "npm.cmd" : "npm", this.#environment);
99
+ if (npm === null) {
100
+ throw new ManagedAdapterInstallError("package_manager_not_found", "A supported npm executable is required to install the ACP adapter");
101
+ }
102
+ await runBoundedProcess({
103
+ arguments: [
104
+ "install",
105
+ "--prefix",
106
+ staging,
107
+ "--omit=optional",
108
+ "--ignore-scripts",
109
+ "--no-audit",
110
+ "--no-fund",
111
+ "--package-lock=false",
112
+ "--save=false",
113
+ "--registry=https://registry.npmjs.org/",
114
+ `${specification.adapterPackage}@${specification.adapterVersion}`,
115
+ ],
116
+ command: npm.path,
117
+ cwd: staging,
118
+ environment: {
119
+ HOME: join(staging, "home"),
120
+ NPM_CONFIG_AUDIT: "false",
121
+ NPM_CONFIG_FUND: "false",
122
+ NPM_CONFIG_IGNORE_SCRIPTS: "true",
123
+ NPM_CONFIG_OMIT: "optional",
124
+ NPM_CONFIG_REGISTRY: "https://registry.npmjs.org/",
125
+ PATH: `${dirname(process.execPath)}${delimiter}/usr/bin${delimiter}/bin`,
126
+ },
127
+ outputLimitBytes: 64 * 1024,
128
+ signal,
129
+ timeoutMilliseconds: ADAPTER_INSTALL_TIMEOUT_MILLISECONDS,
130
+ });
131
+ await validateManagedAdapter(staging, specification);
132
+ try {
133
+ await rename(staging, published);
134
+ }
135
+ catch (error) {
136
+ try {
137
+ return await validateManagedAdapter(published, specification);
138
+ }
139
+ catch {
140
+ throw new ManagedAdapterInstallError("adapter_publish_failed", "The managed adapter could not be published", { cause: error });
141
+ }
142
+ }
143
+ return await validateManagedAdapter(published, specification);
144
+ }
145
+ catch (error) {
146
+ if (signal.aborted) {
147
+ signal.throwIfAborted();
148
+ }
149
+ if (error instanceof ManagedAdapterInstallError) {
150
+ throw error;
151
+ }
152
+ throw new ManagedAdapterInstallError("adapter_install_failed", "The pinned ACP adapter could not be installed", { cause: error });
153
+ }
154
+ finally {
155
+ await rm(staging, { force: true, recursive: true });
156
+ }
157
+ };
158
+ }
159
+ //# sourceMappingURL=managed-adapter-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-adapter-installer.js","sourceRoot":"","sources":["../../src/agent-installation/managed-adapter-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type Response } from "undici";
2
+ export declare class InstallerDownloadError extends Error {
3
+ readonly code: string;
4
+ constructor(code: string, message: string, options?: ErrorOptions);
5
+ }
6
+ export declare class VerifiedDownload {
7
+ readonly bytes: number;
8
+ readonly sha256: string;
9
+ readonly url: URL;
10
+ constructor(url: URL, bytes: number, sha256: string);
11
+ }
12
+ export interface VerifiedDownloadOptions {
13
+ readonly allowedHosts: ReadonlySet<string>;
14
+ readonly destination: string;
15
+ readonly maximumBytes: number;
16
+ readonly signal: AbortSignal;
17
+ readonly timeoutMilliseconds: number;
18
+ readonly url: URL;
19
+ }
20
+ export interface InstallerDownloadTransport {
21
+ readonly get: (url: URL, signal: AbortSignal) => Promise<Response>;
22
+ }
23
+ export declare function downloadVerifiedFile(options: VerifiedDownloadOptions, transport?: InstallerDownloadTransport): Promise<VerifiedDownload>;
24
+ //# sourceMappingURL=verified-download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-download.d.ts","sourceRoot":"","sources":["../../src/agent-installation/verified-download.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAO9C,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAIpE;CACF;AAED,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAElB,YAAY,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAIlD;CACF;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACpE;AA0GD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,uBAAuB,EAChC,SAAS,GAAE,0BAAmE,GAC7E,OAAO,CAAC,gBAAgB,CAAC,CA2F3B"}
@@ -0,0 +1,158 @@
1
+ import { createHash } from "node:crypto";
2
+ import { open, unlink } from "node:fs/promises";
3
+ import { fetch } from "undici";
4
+ import { environmentProxyDispatcher } from "../network/environment-proxy.js";
5
+ const MAX_REDIRECTS = 4;
6
+ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
7
+ export class InstallerDownloadError extends Error {
8
+ code;
9
+ constructor(code, message, options = {}) {
10
+ super(message, options);
11
+ this.code = code;
12
+ this.name = "InstallerDownloadError";
13
+ }
14
+ }
15
+ export class VerifiedDownload {
16
+ bytes;
17
+ sha256;
18
+ url;
19
+ constructor(url, bytes, sha256) {
20
+ this.bytes = bytes;
21
+ this.sha256 = sha256;
22
+ this.url = url;
23
+ }
24
+ }
25
+ class UndiciInstallerDownloadTransport {
26
+ get = async (url, signal) => await fetch(url, {
27
+ dispatcher: environmentProxyDispatcher,
28
+ headers: {
29
+ accept: "text/plain, application/octet-stream;q=0.9",
30
+ "user-agent": "Mobius-Agent-Installer/0.0.3",
31
+ },
32
+ method: "GET",
33
+ redirect: "manual",
34
+ signal,
35
+ });
36
+ }
37
+ function validateUrl(url, allowedHosts) {
38
+ if (url.protocol !== "https:" ||
39
+ url.username.length > 0 ||
40
+ url.password.length > 0 ||
41
+ url.port.length > 0 ||
42
+ !allowedHosts.has(url.hostname)) {
43
+ throw new InstallerDownloadError("installer_host_not_allowed", "The installer download target is not allowed");
44
+ }
45
+ }
46
+ async function fetchInstaller(options, signal, transport) {
47
+ let url = new URL(options.url);
48
+ for (let redirectCount = 0; redirectCount <= MAX_REDIRECTS; redirectCount += 1) {
49
+ validateUrl(url, options.allowedHosts);
50
+ const response = await transport.get(url, signal);
51
+ if (!REDIRECT_STATUSES.has(response.status)) {
52
+ return { response, url };
53
+ }
54
+ await response.body?.cancel();
55
+ const location = response.headers.get("location");
56
+ if (location === null || redirectCount === MAX_REDIRECTS) {
57
+ throw new InstallerDownloadError("installer_redirect_invalid", "The installer returned an invalid redirect");
58
+ }
59
+ let redirected;
60
+ try {
61
+ redirected = new URL(location, url);
62
+ }
63
+ catch (error) {
64
+ throw new InstallerDownloadError("installer_redirect_invalid", "The installer returned an invalid redirect", { cause: error });
65
+ }
66
+ try {
67
+ validateUrl(redirected, options.allowedHosts);
68
+ }
69
+ catch (error) {
70
+ throw new InstallerDownloadError("installer_redirect_not_allowed", "The installer redirect left the approved host allowlist", { cause: error });
71
+ }
72
+ url = redirected;
73
+ }
74
+ throw new InstallerDownloadError("installer_redirect_invalid", "The installer returned too many redirects");
75
+ }
76
+ async function writeCompleteChunk(handle, chunk) {
77
+ let offset = 0;
78
+ while (offset < chunk.byteLength) {
79
+ const written = await handle.write(chunk, offset, chunk.byteLength - offset);
80
+ if (written.bytesWritten < 1) {
81
+ throw new InstallerDownloadError("installer_write_failed", "The verified installer could not be stored");
82
+ }
83
+ offset += written.bytesWritten;
84
+ }
85
+ }
86
+ export async function downloadVerifiedFile(options, transport = new UndiciInstallerDownloadTransport()) {
87
+ options.signal.throwIfAborted();
88
+ const timeoutSignal = AbortSignal.timeout(options.timeoutMilliseconds);
89
+ const signal = AbortSignal.any([options.signal, timeoutSignal]);
90
+ let handle = null;
91
+ let responseBody = null;
92
+ try {
93
+ const fetched = await fetchInstaller(options, signal, transport);
94
+ responseBody = fetched.response.body;
95
+ if (!fetched.response.ok || fetched.response.body === null) {
96
+ throw new InstallerDownloadError("installer_download_failed", "The approved installer could not be downloaded");
97
+ }
98
+ const contentLength = fetched.response.headers.get("content-length");
99
+ if (contentLength !== null) {
100
+ const declaredLength = Number(contentLength);
101
+ if (!Number.isSafeInteger(declaredLength) ||
102
+ declaredLength < 1 ||
103
+ declaredLength > options.maximumBytes) {
104
+ throw new InstallerDownloadError("installer_size_invalid", "The installer size is outside the approved limit");
105
+ }
106
+ }
107
+ handle = await open(options.destination, "wx", 0o600);
108
+ const digest = createHash("sha256");
109
+ const reader = fetched.response.body.getReader();
110
+ let bytes = 0;
111
+ try {
112
+ while (true) {
113
+ signal.throwIfAborted();
114
+ const chunk = await reader.read();
115
+ if (chunk.done) {
116
+ break;
117
+ }
118
+ bytes += chunk.value.byteLength;
119
+ if (bytes > options.maximumBytes) {
120
+ throw new InstallerDownloadError("installer_size_invalid", "The installer exceeded the approved size limit");
121
+ }
122
+ digest.update(chunk.value);
123
+ await writeCompleteChunk(handle, chunk.value);
124
+ }
125
+ }
126
+ finally {
127
+ await reader.cancel().catch(() => undefined);
128
+ reader.releaseLock();
129
+ }
130
+ if (bytes === 0) {
131
+ throw new InstallerDownloadError("installer_verification_failed", "The downloaded installer is empty");
132
+ }
133
+ await handle.sync();
134
+ await handle.close();
135
+ handle = null;
136
+ return new VerifiedDownload(fetched.url, bytes, digest.digest("hex"));
137
+ }
138
+ catch (error) {
139
+ if (handle !== null) {
140
+ await handle.close().catch(() => undefined);
141
+ }
142
+ await unlink(options.destination).catch(() => undefined);
143
+ if (options.signal.aborted) {
144
+ options.signal.throwIfAborted();
145
+ }
146
+ if (timeoutSignal.aborted) {
147
+ throw new InstallerDownloadError("installer_download_timeout", "The installer download timed out", { cause: error });
148
+ }
149
+ if (error instanceof InstallerDownloadError) {
150
+ throw error;
151
+ }
152
+ throw new InstallerDownloadError("installer_download_failed", "The approved installer could not be downloaded", { cause: error });
153
+ }
154
+ finally {
155
+ await responseBody?.cancel().catch(() => undefined);
156
+ }
157
+ }
158
+ //# sourceMappingURL=verified-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verified-download.js","sourceRoot":"","sources":["../../src/agent-installation/verified-download.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export interface AuditRecord {
2
2
  readonly commandId: string;
3
+ readonly details?: Readonly<Record<string, string>>;
3
4
  readonly event: string;
4
5
  readonly sessionId: string;
5
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audit-store.d.ts","sourceRoot":"","sources":["../../src/audit/audit-store.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IAExC,YAAY,IAAI,EAAE,MAAM,EAYvB;IAED,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAkBhC;IAED,KAAK,IAAI,IAAI,CAEZ;CACF"}
1
+ {"version":3,"file":"audit-store.d.ts","sourceRoot":"","sources":["../../src/audit/audit-store.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IAExC,YAAY,IAAI,EAAE,MAAM,EAuBvB;IAED,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAoBhC;IAED,KAAK,IAAI,IAAI,CAEZ;CACF"}
@@ -12,9 +12,16 @@ export class AuditStore {
12
12
  recorded_at TEXT NOT NULL,
13
13
  event TEXT NOT NULL,
14
14
  command_id TEXT NOT NULL,
15
- session_id TEXT NOT NULL
15
+ session_id TEXT NOT NULL,
16
+ details_json TEXT NOT NULL DEFAULT '{}'
16
17
  ) STRICT
17
18
  `);
19
+ const columns = this.database
20
+ .prepare("PRAGMA table_info(audit_events)")
21
+ .all();
22
+ if (!columns.some((column) => Reflect.get(column, "name") === "details_json")) {
23
+ this.database.exec("ALTER TABLE audit_events ADD COLUMN details_json TEXT NOT NULL DEFAULT '{}'");
24
+ }
18
25
  }
19
26
  record(record) {
20
27
  this.database
@@ -23,10 +30,11 @@ export class AuditStore {
23
30
  recorded_at,
24
31
  event,
25
32
  command_id,
26
- session_id
27
- ) VALUES (?, ?, ?, ?)
33
+ session_id,
34
+ details_json
35
+ ) VALUES (?, ?, ?, ?, ?)
28
36
  `)
29
- .run(new Date().toISOString(), record.event, record.commandId, record.sessionId);
37
+ .run(new Date().toISOString(), record.event, record.commandId, record.sessionId, JSON.stringify(record.details ?? {}));
30
38
  }
31
39
  close() {
32
40
  this.database.close();
@@ -1 +1 @@
1
- {"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../../src/audit/audit-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,OAAO,UAAU;IACJ,QAAQ,CAAe;IAExC,YAAY,IAAY;QACtB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;KAQlB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAmB;QACxB,IAAI,CAAC,QAAQ;aACV,OAAO,CACN;;;;;;;SAOC,CACF;aACA,GAAG,CACF,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,CACjB,CAAC;IACN,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
1
+ {"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../../src/audit/audit-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,MAAM,OAAO,UAAU;IACJ,QAAQ,CAAe;IAExC,YAAY,IAAY;QACtB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;KASlB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ;aAC1B,OAAO,CAAC,iCAAiC,CAAC;aAC1C,GAAG,EAAE,CAAC;QACT,IACE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,cAAc,CAAC,EACzE,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,6EAA6E,CAC9E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,MAAmB;QACxB,IAAI,CAAC,QAAQ;aACV,OAAO,CACN;;;;;;;;SAQC,CACF;aACA,GAAG,CACF,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,SAAS,EAChB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CACrC,CAAC;IACN,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export declare class LocalAuthorizationError extends Error {
2
+ readonly code = "local_authorization_failed";
3
+ constructor(message: string, options?: ErrorOptions);
4
+ }
5
+ //# sourceMappingURL=local-authorization-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-authorization-error.d.ts","sourceRoot":"","sources":["../../src/authorization/local-authorization-error.ts"],"names":[],"mappings":"AAAA,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,gCAAgC;IAE7C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAGtD;CACF"}
@@ -0,0 +1,8 @@
1
+ export class LocalAuthorizationError extends Error {
2
+ code = "local_authorization_failed";
3
+ constructor(message, options = {}) {
4
+ super(message, options);
5
+ this.name = "LocalAuthorizationError";
6
+ }
7
+ }
8
+ //# sourceMappingURL=local-authorization-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-authorization-error.js","sourceRoot":"","sources":["../../src/authorization/local-authorization-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACvC,IAAI,GAAG,4BAA4B,CAAC;IAE7C,YAAY,OAAe,EAAE,OAAO,GAAiB,EAAE;QACrD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
@@ -6,12 +6,23 @@ export declare class WorkspaceDirectoryListing {
6
6
  readonly parentDirectoryId: string;
7
7
  constructor(directoryId: string, directoryLabel: string, entries: readonly WorkspaceEntry[], parentDirectoryId: string);
8
8
  }
9
+ /** Pairing authorizes the machine. Directory identifiers select a working
10
+ * directory; they do not grant additional filesystem capabilities. */
9
11
  export declare class WorkspaceDirectoryService {
10
12
  #private;
11
- constructor(approvedBindingId: string, approvedRoot: string);
12
- readonly resolve: (requestedBindingId: string, requestedDirectoryId: string) => Promise<string>;
13
- readonly list: (requestedBindingId: string, requestedDirectoryId: string) => Promise<WorkspaceDirectoryListing>;
14
- readonly resolveMany: (requestedBindingId: string, directoryIds: readonly string[]) => Promise<readonly string[]>;
15
- readonly resolveRoot: () => Promise<string>;
13
+ constructor(bindingId: string, defaultWorkspace: string);
14
+ private readonly authorizeMachine;
15
+ private readonly requestedPath;
16
+ private readonly resolvePath;
17
+ private readonly label;
18
+ readonly identify: (bindingId: string, requestedPath: string, signal: AbortSignal) => Promise<{
19
+ readonly path: string;
20
+ readonly directoryId: string;
21
+ readonly name: string;
22
+ readonly label: string;
23
+ }>;
24
+ readonly resolve: (bindingId: string, id: string, signal: AbortSignal) => Promise<string>;
25
+ readonly list: (bindingId: string, id: string, signal: AbortSignal) => Promise<WorkspaceDirectoryListing>;
26
+ readonly resolveMany: (bindingId: string, ids: readonly string[], signal: AbortSignal) => Promise<readonly string[]>;
16
27
  }
17
28
  //# sourceMappingURL=workspace-directory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-directory.d.ts","sourceRoot":"","sources":["../../src/authorization/workspace-directory.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,qBAAa,yBAAyB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAEnC,YACE,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,iBAAiB,EAAE,MAAM,EAM1B;CACF;AAmDD,qBAAa,yBAAyB;;IAIpC,YAAY,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAG1D;IAED,QAAQ,CAAC,OAAO,uBACM,MAAM,wBACJ,MAAM,KAC3B,OAAO,CAAC,MAAM,CAAC,CA0BhB;IAEF,QAAQ,CAAC,IAAI,uBACS,MAAM,wBACJ,MAAM,KAC3B,OAAO,CAAC,yBAAyB,CAAC,CAqDnC;IAEF,QAAQ,CAAC,WAAW,uBACE,MAAM,gBACZ,SAAS,MAAM,EAAE,KAC9B,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAc3B;IAEF,QAAQ,CAAC,WAAW,QAAa,OAAO,CAAC,MAAM,CAAC,CAqB9C;CACH"}
1
+ {"version":3,"file":"workspace-directory.d.ts","sourceRoot":"","sources":["../../src/authorization/workspace-directory.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,qBAAa,yBAAyB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,YACE,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,iBAAiB,EAAE,MAAM,EAM1B;CACF;AA8BD;sEACsE;AACtE,qBAAa,yBAAyB;;IAIpC,YAAY,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAGtD;IAED,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAK/B;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAQ5B;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAiC1B;IAEF,OAAO,CAAC,QAAQ,CAAC,KAAK,CASpB;IAEF,QAAQ,CAAC,QAAQ,cACJ,MAAM,iBACF,MAAM,UACb,WAAW,KAClB,OAAO,CAAC;QACT,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC,CASA;IAEF,QAAQ,CAAC,OAAO,cACH,MAAM,MACb,MAAM,UACF,WAAW,KAClB,OAAO,CAAC,MAAM,CAAC,CAGhB;IAEF,QAAQ,CAAC,IAAI,cACA,MAAM,MACb,MAAM,UACF,WAAW,KAClB,OAAO,CAAC,yBAAyB,CAAC,CAyCnC;IAEF,QAAQ,CAAC,WAAW,cACP,MAAM,OACZ,SAAS,MAAM,EAAE,UACd,WAAW,KAClB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAI3B;CACH"}