@allin-ai/agent-client 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 (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/bin/allinai-agent +4 -0
  4. package/dist/capabilities/context.d.ts +16 -0
  5. package/dist/capabilities/context.d.ts.map +1 -0
  6. package/dist/capabilities/context.js +98 -0
  7. package/dist/capabilities/context.js.map +1 -0
  8. package/dist/capabilities/input.d.ts +7 -0
  9. package/dist/capabilities/input.d.ts.map +1 -0
  10. package/dist/capabilities/input.js +224 -0
  11. package/dist/capabilities/input.js.map +1 -0
  12. package/dist/capabilities/manifest.d.ts +15 -0
  13. package/dist/capabilities/manifest.d.ts.map +1 -0
  14. package/dist/capabilities/manifest.js +292 -0
  15. package/dist/capabilities/manifest.js.map +1 -0
  16. package/dist/capabilities/policy.d.ts +17 -0
  17. package/dist/capabilities/policy.d.ts.map +1 -0
  18. package/dist/capabilities/policy.js +57 -0
  19. package/dist/capabilities/policy.js.map +1 -0
  20. package/dist/capabilities/shell-host.d.ts +32 -0
  21. package/dist/capabilities/shell-host.d.ts.map +1 -0
  22. package/dist/capabilities/shell-host.js +378 -0
  23. package/dist/capabilities/shell-host.js.map +1 -0
  24. package/dist/capabilities/shell-wire.d.ts +13 -0
  25. package/dist/capabilities/shell-wire.d.ts.map +1 -0
  26. package/dist/capabilities/shell-wire.js +60 -0
  27. package/dist/capabilities/shell-wire.js.map +1 -0
  28. package/dist/capabilities/types.d.ts +46 -0
  29. package/dist/capabilities/types.d.ts.map +1 -0
  30. package/dist/capabilities/types.js +7 -0
  31. package/dist/capabilities/types.js.map +1 -0
  32. package/dist/cli/commands.d.ts +83 -0
  33. package/dist/cli/commands.d.ts.map +1 -0
  34. package/dist/cli/commands.js +638 -0
  35. package/dist/cli/commands.js.map +1 -0
  36. package/dist/cli/main.d.ts +2 -0
  37. package/dist/cli/main.d.ts.map +1 -0
  38. package/dist/cli/main.js +7 -0
  39. package/dist/cli/main.js.map +1 -0
  40. package/dist/client/state-store.d.ts +80 -0
  41. package/dist/client/state-store.d.ts.map +1 -0
  42. package/dist/client/state-store.js +422 -0
  43. package/dist/client/state-store.js.map +1 -0
  44. package/dist/client/supervisor.d.ts +118 -0
  45. package/dist/client/supervisor.d.ts.map +1 -0
  46. package/dist/client/supervisor.js +627 -0
  47. package/dist/client/supervisor.js.map +1 -0
  48. package/dist/client/transport.d.ts +30 -0
  49. package/dist/client/transport.d.ts.map +1 -0
  50. package/dist/client/transport.js +2 -0
  51. package/dist/client/transport.js.map +1 -0
  52. package/dist/client/types.d.ts +65 -0
  53. package/dist/client/types.d.ts.map +1 -0
  54. package/dist/client/types.js +13 -0
  55. package/dist/client/types.js.map +1 -0
  56. package/dist/client/wire.d.ts +32 -0
  57. package/dist/client/wire.d.ts.map +1 -0
  58. package/dist/client/wire.js +302 -0
  59. package/dist/client/wire.js.map +1 -0
  60. package/dist/client/ws-transport.d.ts +54 -0
  61. package/dist/client/ws-transport.d.ts.map +1 -0
  62. package/dist/client/ws-transport.js +229 -0
  63. package/dist/client/ws-transport.js.map +1 -0
  64. package/dist/config.d.ts +38 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +125 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/control.d.ts +59 -0
  69. package/dist/control.d.ts.map +1 -0
  70. package/dist/control.js +217 -0
  71. package/dist/control.js.map +1 -0
  72. package/dist/credentials.d.ts +44 -0
  73. package/dist/credentials.d.ts.map +1 -0
  74. package/dist/credentials.js +229 -0
  75. package/dist/credentials.js.map +1 -0
  76. package/dist/hub.d.ts +83 -0
  77. package/dist/hub.d.ts.map +1 -0
  78. package/dist/hub.js +412 -0
  79. package/dist/hub.js.map +1 -0
  80. package/dist/index.d.ts +20 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +18 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/logger.d.ts +47 -0
  85. package/dist/logger.d.ts.map +1 -0
  86. package/dist/logger.js +175 -0
  87. package/dist/logger.js.map +1 -0
  88. package/dist/paths.d.ts +29 -0
  89. package/dist/paths.d.ts.map +1 -0
  90. package/dist/paths.js +50 -0
  91. package/dist/paths.js.map +1 -0
  92. package/dist/plugins/git.d.ts +30 -0
  93. package/dist/plugins/git.d.ts.map +1 -0
  94. package/dist/plugins/git.js +80 -0
  95. package/dist/plugins/git.js.map +1 -0
  96. package/dist/plugins/manager.d.ts +41 -0
  97. package/dist/plugins/manager.d.ts.map +1 -0
  98. package/dist/plugins/manager.js +328 -0
  99. package/dist/plugins/manager.js.map +1 -0
  100. package/dist/plugins/manifest.d.ts +9 -0
  101. package/dist/plugins/manifest.d.ts.map +1 -0
  102. package/dist/plugins/manifest.js +63 -0
  103. package/dist/plugins/manifest.js.map +1 -0
  104. package/dist/plugins/types.d.ts +39 -0
  105. package/dist/plugins/types.d.ts.map +1 -0
  106. package/dist/plugins/types.js +2 -0
  107. package/dist/plugins/types.js.map +1 -0
  108. package/dist/runtime/claude.d.ts +30 -0
  109. package/dist/runtime/claude.d.ts.map +1 -0
  110. package/dist/runtime/claude.js +163 -0
  111. package/dist/runtime/claude.js.map +1 -0
  112. package/dist/runtime/codex.d.ts +44 -0
  113. package/dist/runtime/codex.d.ts.map +1 -0
  114. package/dist/runtime/codex.js +192 -0
  115. package/dist/runtime/codex.js.map +1 -0
  116. package/dist/runtime/events.d.ts +7 -0
  117. package/dist/runtime/events.d.ts.map +1 -0
  118. package/dist/runtime/events.js +37 -0
  119. package/dist/runtime/events.js.map +1 -0
  120. package/dist/runtime/index.d.ts +10 -0
  121. package/dist/runtime/index.d.ts.map +1 -0
  122. package/dist/runtime/index.js +10 -0
  123. package/dist/runtime/index.js.map +1 -0
  124. package/dist/runtime/pi.d.ts +34 -0
  125. package/dist/runtime/pi.d.ts.map +1 -0
  126. package/dist/runtime/pi.js +211 -0
  127. package/dist/runtime/pi.js.map +1 -0
  128. package/dist/runtime/registry.d.ts +16 -0
  129. package/dist/runtime/registry.d.ts.map +1 -0
  130. package/dist/runtime/registry.js +22 -0
  131. package/dist/runtime/registry.js.map +1 -0
  132. package/dist/runtime/runner-child.d.ts +2 -0
  133. package/dist/runtime/runner-child.d.ts.map +1 -0
  134. package/dist/runtime/runner-child.js +41 -0
  135. package/dist/runtime/runner-child.js.map +1 -0
  136. package/dist/runtime/runner-manager.d.ts +77 -0
  137. package/dist/runtime/runner-manager.d.ts.map +1 -0
  138. package/dist/runtime/runner-manager.js +295 -0
  139. package/dist/runtime/runner-manager.js.map +1 -0
  140. package/dist/runtime/runner-wire.d.ts +23 -0
  141. package/dist/runtime/runner-wire.d.ts.map +1 -0
  142. package/dist/runtime/runner-wire.js +93 -0
  143. package/dist/runtime/runner-wire.js.map +1 -0
  144. package/dist/runtime/types.d.ts +43 -0
  145. package/dist/runtime/types.d.ts.map +1 -0
  146. package/dist/runtime/types.js +3 -0
  147. package/dist/runtime/types.js.map +1 -0
  148. package/dist/runtime/zcode.d.ts +14 -0
  149. package/dist/runtime/zcode.d.ts.map +1 -0
  150. package/dist/runtime/zcode.js +21 -0
  151. package/dist/runtime/zcode.js.map +1 -0
  152. package/dist/service/launchd.d.ts +34 -0
  153. package/dist/service/launchd.d.ts.map +1 -0
  154. package/dist/service/launchd.js +86 -0
  155. package/dist/service/launchd.js.map +1 -0
  156. package/dist/service/systemd.d.ts +16 -0
  157. package/dist/service/systemd.d.ts.map +1 -0
  158. package/dist/service/systemd.js +89 -0
  159. package/dist/service/systemd.js.map +1 -0
  160. package/dist/wire.d.ts +24 -0
  161. package/dist/wire.d.ts.map +1 -0
  162. package/dist/wire.js +7 -0
  163. package/dist/wire.js.map +1 -0
  164. package/package.json +140 -0
@@ -0,0 +1,217 @@
1
+ import { lstat, mkdir, unlink } from "node:fs/promises";
2
+ import { createConnection, createServer, } from "node:net";
3
+ import path from "node:path";
4
+ import { resolveAgentControlEndpoint } from "./paths.js";
5
+ const controlFs = { mkdir, lstat, unlink };
6
+ function absent(error) {
7
+ return (typeof error === "object" &&
8
+ error !== null &&
9
+ "code" in error &&
10
+ error.code === "ENOENT");
11
+ }
12
+ function controlError(error) {
13
+ return error instanceof Error ? error.message : "Control request failed";
14
+ }
15
+ function parseRequest(value) {
16
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
17
+ throw new TypeError("Control request must be an object");
18
+ }
19
+ const input = value;
20
+ if (typeof input.id !== "string" || !input.id)
21
+ throw new TypeError("Control request id is required");
22
+ if (input.method === "health")
23
+ return { id: input.id, method: "health" };
24
+ if (input.method === "status")
25
+ return { id: input.id, method: "status" };
26
+ if (input.method === "sync")
27
+ return { id: input.id, method: "sync" };
28
+ if (input.method === "approve" &&
29
+ typeof input.executionId === "string" &&
30
+ input.executionId) {
31
+ return { id: input.id, method: "approve", executionId: input.executionId };
32
+ }
33
+ throw new TypeError("Unsupported control request");
34
+ }
35
+ function defaultEndpointActive(endpoint) {
36
+ return new Promise((resolve) => {
37
+ const socket = createConnection({ path: endpoint });
38
+ const timeout = setTimeout(() => {
39
+ socket.destroy();
40
+ resolve(false);
41
+ }, 250);
42
+ socket.once("connect", () => {
43
+ clearTimeout(timeout);
44
+ socket.destroy();
45
+ resolve(true);
46
+ });
47
+ socket.once("error", () => {
48
+ clearTimeout(timeout);
49
+ resolve(false);
50
+ });
51
+ });
52
+ }
53
+ async function prepareUnixSocket(endpoint, fs, endpointActive) {
54
+ await fs.mkdir(path.dirname(endpoint), { recursive: true });
55
+ try {
56
+ const entry = await fs.lstat(endpoint);
57
+ if (!entry.isSocket()) {
58
+ throw new Error(`Refusing to remove non-socket control path: ${endpoint}`);
59
+ }
60
+ }
61
+ catch (error) {
62
+ if (absent(error))
63
+ return;
64
+ throw error;
65
+ }
66
+ if (await endpointActive(endpoint)) {
67
+ throw new Error(`Agent control socket is already active: ${endpoint}`);
68
+ }
69
+ await fs.unlink(endpoint);
70
+ }
71
+ function listen(server, endpoint) {
72
+ return new Promise((resolve, reject) => {
73
+ const onError = (error) => {
74
+ server.off("listening", onListening);
75
+ reject(error);
76
+ };
77
+ const onListening = () => {
78
+ server.off("error", onError);
79
+ resolve();
80
+ };
81
+ server.once("error", onError);
82
+ server.once("listening", onListening);
83
+ // Endpoint is always a Unix-domain socket or a Windows named pipe.
84
+ server.listen(endpoint);
85
+ });
86
+ }
87
+ function close(server) {
88
+ return new Promise((resolve, reject) => {
89
+ server.close((error) => (error ? reject(error) : resolve()));
90
+ });
91
+ }
92
+ /**
93
+ * Start the local control server. Its API deliberately has no host/port field,
94
+ * preventing an unauthenticated TCP listener from being configured here.
95
+ */
96
+ export async function startAgentControlServer(options) {
97
+ const platform = options.platform ?? process.platform;
98
+ const endpoint = options.socketPath ??
99
+ (options.paths
100
+ ? resolveAgentControlEndpoint(options.paths, platform)
101
+ : undefined);
102
+ if (!endpoint)
103
+ throw new TypeError("socketPath or paths is required for agent control");
104
+ if (platform !== "win32") {
105
+ await prepareUnixSocket(endpoint, options.fileSystem ?? controlFs, options.endpointActive ?? defaultEndpointActive);
106
+ }
107
+ const server = (options.serverFactory ?? createServer)(async (socket) => {
108
+ let pending = "";
109
+ socket.setEncoding("utf8");
110
+ socket.on("data", (chunk) => {
111
+ pending += chunk;
112
+ if (pending.length > 64 * 1024) {
113
+ socket.destroy(new Error("Control request is too large"));
114
+ return;
115
+ }
116
+ let newline = pending.indexOf("\n");
117
+ while (newline >= 0) {
118
+ const line = pending.slice(0, newline);
119
+ pending = pending.slice(newline + 1);
120
+ void handleLine(options.control, socket, line);
121
+ newline = pending.indexOf("\n");
122
+ }
123
+ });
124
+ });
125
+ await listen(server, endpoint);
126
+ return { endpoint, close: () => close(server) };
127
+ }
128
+ async function handleLine(control, socket, line) {
129
+ let response;
130
+ let request;
131
+ try {
132
+ request = parseRequest(JSON.parse(line));
133
+ if (request.method === "health") {
134
+ response = { id: request.id, ok: true, result: await control.health() };
135
+ }
136
+ else if (request.method === "status") {
137
+ response = { id: request.id, ok: true, result: await control.status() };
138
+ }
139
+ else if (request.method === "sync") {
140
+ if (!control.sync)
141
+ throw new Error("Local Agent Client does not support sync");
142
+ await control.sync();
143
+ response = { id: request.id, ok: true };
144
+ }
145
+ else {
146
+ await control.approve(request.executionId);
147
+ response = { id: request.id, ok: true };
148
+ }
149
+ }
150
+ catch (error) {
151
+ response = {
152
+ id: request?.id ?? "unknown",
153
+ ok: false,
154
+ error: controlError(error),
155
+ };
156
+ }
157
+ socket.write(`${JSON.stringify(response)}\n`);
158
+ }
159
+ function sendControlRequest(endpoint, request, options) {
160
+ const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
161
+ return new Promise((resolve, reject) => {
162
+ const socket = (options.connect ??
163
+ ((pathToSocket) => createConnection({ path: pathToSocket })))(endpoint);
164
+ const timeout = setTimeout(() => {
165
+ socket.destroy();
166
+ reject(new Error("Timed out waiting for local agent control response"));
167
+ }, options.timeoutMs ?? 5_000);
168
+ let pending = "";
169
+ socket.setEncoding("utf8");
170
+ socket.once("connect", () => {
171
+ socket.write(`${JSON.stringify({ id, ...request })}\n`);
172
+ });
173
+ socket.on("data", (chunk) => {
174
+ pending += chunk;
175
+ const newline = pending.indexOf("\n");
176
+ if (newline < 0)
177
+ return;
178
+ clearTimeout(timeout);
179
+ socket.end();
180
+ try {
181
+ const response = JSON.parse(pending.slice(0, newline));
182
+ if (response.id !== id)
183
+ throw new Error("Mismatched local control response");
184
+ if (!response.ok)
185
+ throw new Error(response.error ?? "Local control request failed");
186
+ resolve(response.result);
187
+ }
188
+ catch (error) {
189
+ reject(error);
190
+ }
191
+ });
192
+ socket.once("error", (error) => {
193
+ clearTimeout(timeout);
194
+ reject(error);
195
+ });
196
+ });
197
+ }
198
+ /** Client seam used by the future CLI/Desktop without opening a network port. */
199
+ export function createAgentControlClient(endpoint, options = {}) {
200
+ return {
201
+ async health() {
202
+ return (await sendControlRequest(endpoint, { method: "health" }, options));
203
+ },
204
+ async status() {
205
+ return (await sendControlRequest(endpoint, { method: "status" }, options));
206
+ },
207
+ async approve(executionId) {
208
+ if (!executionId.trim())
209
+ throw new TypeError("executionId must be a nonempty string");
210
+ await sendControlRequest(endpoint, { method: "approve", executionId }, options);
211
+ },
212
+ async sync() {
213
+ await sendControlRequest(endpoint, { method: "sync" }, options);
214
+ },
215
+ };
216
+ }
217
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type AgentPaths } from "./paths.js";
2
+ export type CredentialStore = {
3
+ load(clientId: string): Promise<string | null>;
4
+ save(clientId: string, token: string): Promise<void>;
5
+ clear(clientId: string): Promise<void>;
6
+ };
7
+ export type SecurityCommandResult = {
8
+ code: number;
9
+ stdout: string;
10
+ stderr: string;
11
+ };
12
+ /** Process port: tests can verify the exact security invocation without spawning a process. */
13
+ export type SecurityExecutor = (file: string, args: string[]) => Promise<SecurityCommandResult>;
14
+ export type CredentialFileSystem = {
15
+ mkdir(dir: string, options: {
16
+ recursive: true;
17
+ }): Promise<string | undefined>;
18
+ readFile(file: string, encoding: "utf8"): Promise<string>;
19
+ writeFile(file: string, data: string, options: {
20
+ encoding: "utf8";
21
+ mode: number;
22
+ flag: "wx";
23
+ }): Promise<void>;
24
+ rename(from: string, to: string): Promise<void>;
25
+ unlink(file: string): Promise<void>;
26
+ chmod(file: string, mode: number): Promise<void>;
27
+ stat(file: string): Promise<{
28
+ mode: number;
29
+ }>;
30
+ };
31
+ export type CredentialStoreOptions = {
32
+ homeDir?: string;
33
+ paths?: Pick<AgentPaths, "credentialsRoot">;
34
+ platform?: NodeJS.Platform;
35
+ executor?: SecurityExecutor;
36
+ fs?: CredentialFileSystem;
37
+ serviceName?: string;
38
+ };
39
+ /**
40
+ * Keychain is preferred on macOS. A mode-0600, atomic local file is used only
41
+ * when Keychain itself is unavailable (or on a platform without Keychain).
42
+ */
43
+ export declare function createCredentialStore(options?: CredentialStoreOptions): CredentialStore;
44
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,+FAA+F;AAC/F,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,GACtD,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AA8OF;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,sBAA2B,GACnC,eAAe,CASjB"}
@@ -0,0 +1,229 @@
1
+ import { chmod, mkdir, readFile, rename, stat, unlink, writeFile, } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { resolveAgentPaths } from "./paths.js";
5
+ const credentialFs = {
6
+ mkdir,
7
+ readFile,
8
+ writeFile,
9
+ rename,
10
+ unlink,
11
+ chmod,
12
+ stat,
13
+ };
14
+ const KEYCHAIN_SERVICE = "allinai-agent";
15
+ function credentialFileName(clientId) {
16
+ if (!clientId.trim())
17
+ throw new TypeError("clientId must be a nonempty string");
18
+ return `${encodeURIComponent(clientId)}.token`;
19
+ }
20
+ function credentialFilePath(root, clientId) {
21
+ return path.join(root, credentialFileName(clientId));
22
+ }
23
+ function missingFile(error) {
24
+ return (typeof error === "object" &&
25
+ error !== null &&
26
+ "code" in error &&
27
+ error.code === "ENOENT");
28
+ }
29
+ function messageOf(error) {
30
+ return error instanceof Error ? error.message : String(error);
31
+ }
32
+ function keychainUnavailable(error, platform) {
33
+ if (platform !== "darwin")
34
+ return true;
35
+ if (typeof error === "object" &&
36
+ error !== null &&
37
+ "code" in error &&
38
+ error.code === "ENOENT") {
39
+ return true;
40
+ }
41
+ const message = typeof error === "object" && error !== null && "stderr" in error
42
+ ? `${String(error.stdout ?? "")} ${String(error.stderr ?? "")}`.toLowerCase()
43
+ : messageOf(error).toLowerCase();
44
+ return (message.includes("keychain is not available") ||
45
+ message.includes("no keychain"));
46
+ }
47
+ function keychainItemMissing(result) {
48
+ const text = `${result.stdout}\n${result.stderr}`.toLowerCase();
49
+ return text.includes("could not be found") || text.includes("item not found");
50
+ }
51
+ function defaultSecurityExecutor() {
52
+ return async (file, args) => {
53
+ const { execFile } = await import("node:child_process");
54
+ return await new Promise((resolve, reject) => {
55
+ execFile(file, args, { shell: false }, (error, stdout, stderr) => {
56
+ if (error && typeof error.code !== "number") {
57
+ reject(error);
58
+ return;
59
+ }
60
+ resolve({
61
+ code: typeof error?.code === "number"
62
+ ? error.code
63
+ : 0,
64
+ stdout,
65
+ stderr,
66
+ });
67
+ });
68
+ });
69
+ };
70
+ }
71
+ async function deleteIfPresent(fs, file) {
72
+ try {
73
+ await fs.unlink(file);
74
+ }
75
+ catch (error) {
76
+ if (!missingFile(error))
77
+ throw error;
78
+ }
79
+ }
80
+ class FileCredentialStore {
81
+ root;
82
+ fs;
83
+ constructor(root, fs) {
84
+ this.root = root;
85
+ this.fs = fs;
86
+ }
87
+ async load(clientId) {
88
+ const file = credentialFilePath(this.root, clientId);
89
+ try {
90
+ const info = await this.fs.stat(file);
91
+ if ((info.mode & 0o077) !== 0) {
92
+ throw new Error(`Credential fallback file ${file} must have mode 0600`);
93
+ }
94
+ const token = (await this.fs.readFile(file, "utf8")).trim();
95
+ return token || null;
96
+ }
97
+ catch (error) {
98
+ if (missingFile(error))
99
+ return null;
100
+ throw error;
101
+ }
102
+ }
103
+ async save(clientId, token) {
104
+ if (!token.trim())
105
+ throw new TypeError("token must be a nonempty string");
106
+ await this.fs.mkdir(this.root, { recursive: true });
107
+ const file = credentialFilePath(this.root, clientId);
108
+ const temporary = `${file}.${randomUUID()}.tmp`;
109
+ try {
110
+ await this.fs.writeFile(temporary, token, {
111
+ encoding: "utf8",
112
+ mode: 0o600,
113
+ flag: "wx",
114
+ });
115
+ await this.fs.chmod(temporary, 0o600);
116
+ await this.fs.rename(temporary, file);
117
+ await this.fs.chmod(file, 0o600);
118
+ }
119
+ catch (error) {
120
+ await deleteIfPresent(this.fs, temporary);
121
+ throw error;
122
+ }
123
+ }
124
+ async clear(clientId) {
125
+ await deleteIfPresent(this.fs, credentialFilePath(this.root, clientId));
126
+ }
127
+ }
128
+ class KeychainCredentialStore {
129
+ platform;
130
+ executor;
131
+ serviceName;
132
+ fallback;
133
+ constructor(platform, executor, paths, fs, serviceName) {
134
+ this.platform = platform;
135
+ this.executor = executor;
136
+ this.serviceName = serviceName;
137
+ this.fallback = new FileCredentialStore(paths.credentialsRoot, fs);
138
+ }
139
+ async load(clientId) {
140
+ if (this.platform !== "darwin")
141
+ return this.fallback.load(clientId);
142
+ try {
143
+ const result = await this.executor("security", [
144
+ "find-generic-password",
145
+ "-a",
146
+ clientId,
147
+ "-s",
148
+ this.serviceName,
149
+ "-w",
150
+ ]);
151
+ if (result.code === 0)
152
+ return result.stdout.trim() || null;
153
+ // A functioning Keychain is authoritative. Do not silently prefer an
154
+ // old fallback file merely because this account has no Keychain item.
155
+ if (keychainItemMissing(result))
156
+ return null;
157
+ if (keychainUnavailable(result, this.platform))
158
+ return this.fallback.load(clientId);
159
+ throw new Error(`Keychain load failed: ${result.stderr || result.stdout || result.code}`);
160
+ }
161
+ catch (error) {
162
+ if (keychainUnavailable(error, this.platform))
163
+ return this.fallback.load(clientId);
164
+ throw error;
165
+ }
166
+ }
167
+ async save(clientId, token) {
168
+ if (!token.trim())
169
+ throw new TypeError("token must be a nonempty string");
170
+ if (this.platform !== "darwin")
171
+ return this.fallback.save(clientId, token);
172
+ try {
173
+ const result = await this.executor("security", [
174
+ "add-generic-password",
175
+ "-U",
176
+ "-a",
177
+ clientId,
178
+ "-s",
179
+ this.serviceName,
180
+ "-w",
181
+ token,
182
+ ]);
183
+ if (result.code === 0)
184
+ return;
185
+ if (keychainUnavailable(result, this.platform))
186
+ return this.fallback.save(clientId, token);
187
+ throw new Error(`Keychain save failed: ${result.stderr || result.stdout || result.code}`);
188
+ }
189
+ catch (error) {
190
+ if (keychainUnavailable(error, this.platform))
191
+ return this.fallback.save(clientId, token);
192
+ throw error;
193
+ }
194
+ }
195
+ async clear(clientId) {
196
+ if (this.platform !== "darwin")
197
+ return this.fallback.clear(clientId);
198
+ try {
199
+ const result = await this.executor("security", [
200
+ "delete-generic-password",
201
+ "-a",
202
+ clientId,
203
+ "-s",
204
+ this.serviceName,
205
+ ]);
206
+ if (result.code === 0 || keychainItemMissing(result)) {
207
+ await this.fallback.clear(clientId);
208
+ return;
209
+ }
210
+ if (keychainUnavailable(result, this.platform))
211
+ return this.fallback.clear(clientId);
212
+ throw new Error(`Keychain clear failed: ${result.stderr || result.stdout || result.code}`);
213
+ }
214
+ catch (error) {
215
+ if (keychainUnavailable(error, this.platform))
216
+ return this.fallback.clear(clientId);
217
+ throw error;
218
+ }
219
+ }
220
+ }
221
+ /**
222
+ * Keychain is preferred on macOS. A mode-0600, atomic local file is used only
223
+ * when Keychain itself is unavailable (or on a platform without Keychain).
224
+ */
225
+ export function createCredentialStore(options = {}) {
226
+ const paths = options.paths ?? resolveAgentPaths(options.homeDir);
227
+ return new KeychainCredentialStore(options.platform ?? process.platform, options.executor ?? defaultSecurityExecutor(), paths, options.fs ?? credentialFs, options.serviceName ?? KEYCHAIN_SERVICE);
228
+ }
229
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
package/dist/hub.d.ts ADDED
@@ -0,0 +1,83 @@
1
+ import http from "node:http";
2
+ import { AGENT_CLIENT_PROTOCOL_VERSION, type HubRuntimeEvent } from "./wire.js";
3
+ import type { ClientCommand, ClientEvent, PluginSyncAcknowledgement } from "./client/types.js";
4
+ export declare const HUB_HEARTBEAT_STALE_MS: number;
5
+ /** Compatibility-only HTTP registration record; it is not an executor. */
6
+ export type MemoryHubRuntime = {
7
+ runtimeId: string;
8
+ displayName: string;
9
+ protocolVersion: number;
10
+ registeredAt: number;
11
+ lastSeen: number;
12
+ };
13
+ export type MemoryHubClient = {
14
+ clientId: string;
15
+ protocolVersion: typeof AGENT_CLIENT_PROTOCOL_VERSION;
16
+ connectedAt: number;
17
+ lastSeen: number;
18
+ online: boolean;
19
+ pendingOutboxCount: number;
20
+ };
21
+ export type MemoryHubOptions = {
22
+ /** Shared Hub token; generated when omitted (read it from hub.token). */
23
+ token?: string;
24
+ /** Nodes silent longer than this are reported stale (default 90s). */
25
+ staleMs?: number;
26
+ /** Push hook for embedded-Hub audit events. */
27
+ onRuntimeEvents?: (runtimeId: string, events: HubRuntimeEvent[]) => void;
28
+ /** Push hook for compatibility registration events. */
29
+ onRegister?: (runtime: MemoryHubRuntime) => void;
30
+ /** Receives the strict v2 acknowledgement for a local plugin desired-state revision. */
31
+ onPluginSyncAcknowledgement?: (clientId: string, acknowledgement: PluginSyncAcknowledgement) => void;
32
+ /** Replace the process-wide client logger before the Hub starts. */
33
+ logger?: import("./logger.js").BridgeLogger;
34
+ /**
35
+ * Custom token check for HTTP + WS auth (for example a DB-backed per-user
36
+ * credential lookup). It may be asynchronous and is awaited at every gate.
37
+ */
38
+ authorizeToken?: (candidate: string, req: http.IncomingMessage) => boolean | Promise<boolean>;
39
+ /** Max WS message bytes (default 1 MiB); guards the public exposure surface. */
40
+ maxPayloadBytes?: number;
41
+ };
42
+ /** A durable offer is retained until the Client reports the required state. */
43
+ type ClientOffer = {
44
+ offerId: string;
45
+ targetClientId: string;
46
+ command: ClientCommand;
47
+ };
48
+ export type MemoryHubSnapshot = {
49
+ runtimes: MemoryHubRuntime[];
50
+ watermark: Record<string, Record<string, number>>;
51
+ clients?: Omit<MemoryHubClient, "online" | "pendingOutboxCount">[];
52
+ offers?: ClientOffer[];
53
+ executionWatermarks?: Record<string, number>;
54
+ };
55
+ export type MemoryHub = ReturnType<typeof createMemoryHub>;
56
+ export declare function createMemoryHub(options?: MemoryHubOptions): {
57
+ token: string;
58
+ handle: (req: http.IncomingMessage, res: http.ServerResponse) => Promise<boolean>;
59
+ attach: (server: http.Server, opts?: {
60
+ fallback?: (req: http.IncomingMessage, res: http.ServerResponse) => void;
61
+ onUnknownUpgrade?: (req: http.IncomingMessage, socket: import("node:stream").Duplex, head: Buffer) => void;
62
+ authorizeToken?: (candidate: string, req: http.IncomingMessage) => boolean | Promise<boolean>;
63
+ }) => void;
64
+ start: (host?: string, port?: number) => Promise<{
65
+ port: number;
66
+ close: () => Promise<void>;
67
+ }>;
68
+ offer: (targetClientId: string, command: ClientCommand) => void;
69
+ receiveEvents: (clientId: string, events: ClientEvent[]) => Record<string, number>;
70
+ listRuntimes: () => Array<MemoryHubRuntime & {
71
+ online: boolean;
72
+ stale: boolean;
73
+ }>;
74
+ listClients: () => MemoryHubClient[];
75
+ events: (runtimeId: string) => HubRuntimeEvent[];
76
+ clientEvents: (executionId: string) => ClientEvent[];
77
+ watermark: () => MemoryHubSnapshot["watermark"];
78
+ snapshot: () => MemoryHubSnapshot;
79
+ restore: (state: MemoryHubSnapshot) => void;
80
+ stop: () => void;
81
+ };
82
+ export {};
83
+ //# sourceMappingURL=hub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../src/hub.ts"],"names":[],"mappings":"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"}