@dsh-enhanced/assistant-actions 0.1.30

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/cordis.patch.yml +3 -0
  4. package/lib/broker-cli.d.ts +70 -0
  5. package/lib/broker-cli.d.ts.map +1 -0
  6. package/lib/broker-cli.js +255 -0
  7. package/lib/broker-cli.js.map +1 -0
  8. package/lib/broker-client.d.ts +54 -0
  9. package/lib/broker-client.d.ts.map +1 -0
  10. package/lib/broker-client.js +266 -0
  11. package/lib/broker-client.js.map +1 -0
  12. package/lib/broker-core.d.ts +51 -0
  13. package/lib/broker-core.d.ts.map +1 -0
  14. package/lib/broker-core.js +441 -0
  15. package/lib/broker-core.js.map +1 -0
  16. package/lib/broker-ledger.d.ts +131 -0
  17. package/lib/broker-ledger.d.ts.map +1 -0
  18. package/lib/broker-ledger.js +925 -0
  19. package/lib/broker-ledger.js.map +1 -0
  20. package/lib/broker-peer-linux.d.ts +23 -0
  21. package/lib/broker-peer-linux.d.ts.map +1 -0
  22. package/lib/broker-peer-linux.js +68 -0
  23. package/lib/broker-peer-linux.js.map +1 -0
  24. package/lib/broker-protocol.d.ts +419 -0
  25. package/lib/broker-protocol.d.ts.map +1 -0
  26. package/lib/broker-protocol.js +786 -0
  27. package/lib/broker-protocol.js.map +1 -0
  28. package/lib/broker-server.d.ts +77 -0
  29. package/lib/broker-server.d.ts.map +1 -0
  30. package/lib/broker-server.js +467 -0
  31. package/lib/broker-server.js.map +1 -0
  32. package/lib/cli.d.ts +3 -0
  33. package/lib/cli.d.ts.map +1 -0
  34. package/lib/cli.js +36 -0
  35. package/lib/cli.js.map +1 -0
  36. package/lib/config.d.ts +54 -0
  37. package/lib/config.d.ts.map +1 -0
  38. package/lib/config.js +165 -0
  39. package/lib/config.js.map +1 -0
  40. package/lib/external-delivery-receipt.d.ts +11 -0
  41. package/lib/external-delivery-receipt.d.ts.map +1 -0
  42. package/lib/external-delivery-receipt.js +25 -0
  43. package/lib/external-delivery-receipt.js.map +1 -0
  44. package/lib/github.d.ts +78 -0
  45. package/lib/github.d.ts.map +1 -0
  46. package/lib/github.js +611 -0
  47. package/lib/github.js.map +1 -0
  48. package/lib/index.d.ts +19 -0
  49. package/lib/index.d.ts.map +1 -0
  50. package/lib/index.js +23 -0
  51. package/lib/index.js.map +1 -0
  52. package/lib/ledger.d.ts +78 -0
  53. package/lib/ledger.d.ts.map +1 -0
  54. package/lib/ledger.js +1064 -0
  55. package/lib/ledger.js.map +1 -0
  56. package/lib/repository-readback.d.ts +34 -0
  57. package/lib/repository-readback.d.ts.map +1 -0
  58. package/lib/repository-readback.js +193 -0
  59. package/lib/repository-readback.js.map +1 -0
  60. package/lib/service.d.ts +86 -0
  61. package/lib/service.d.ts.map +1 -0
  62. package/lib/service.js +1259 -0
  63. package/lib/service.js.map +1 -0
  64. package/lib/types.d.ts +174 -0
  65. package/lib/types.d.ts.map +1 -0
  66. package/lib/types.js +2 -0
  67. package/lib/types.js.map +1 -0
  68. package/lib/verified-delivery.d.ts +104 -0
  69. package/lib/verified-delivery.d.ts.map +1 -0
  70. package/lib/verified-delivery.js +262 -0
  71. package/lib/verified-delivery.js.map +1 -0
  72. package/lib/version.d.ts +2 -0
  73. package/lib/version.d.ts.map +1 -0
  74. package/lib/version.js +2 -0
  75. package/lib/version.js.map +1 -0
  76. package/package.json +123 -0
@@ -0,0 +1,467 @@
1
+ import { createPublicKey, KeyObject, randomUUID } from 'node:crypto';
2
+ import { chmod, chown, lstat, realpath, rename, unlink } from 'node:fs/promises';
3
+ import { createConnection, createServer } from 'node:net';
4
+ import { dirname, isAbsolute, resolve } from 'node:path';
5
+ import { BrokerFrameDecoder, GITHUB_BROKER_DEFAULT_HELLO_TTL_MS, GITHUB_BROKER_REQUEST_MAX_BYTES, GITHUB_BROKER_RESPONSE_MAX_BYTES, createBrokerAdminResponse, createBrokerServerHello, createBrokerServerResponse, encodeBrokerFrame, verifyBrokerAdminRequest, verifyBrokerClientRequest, verifyBrokerServerHello, } from './broker-protocol.js';
6
+ export class GitHubBrokerServerError extends Error {
7
+ code;
8
+ constructor(code, message, options) {
9
+ super(`assistant-actions broker server: ${message}`, options);
10
+ this.name = 'GitHubBrokerServerError';
11
+ this.code = code;
12
+ }
13
+ }
14
+ const SAFE_CORE_CODES = new Set(['aborted', 'broker-busy', 'broker-draining', 'credential-unavailable', 'deadline-exceeded', 'grant-expired', 'grant-invalid', 'grant-revoked', 'identity-mismatch', 'internal-error', 'policy-changed', 'request-conflict', 'request-invalid', 'target-mismatch', 'transport-failed', 'unsupported-operation']);
15
+ const integer = (value, minimum, maximum) => typeof value === 'number' && Number.isSafeInteger(value) && value >= minimum && value <= maximum;
16
+ const enoent = (error) => !!error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT';
17
+ function failure(code, message, cause) { return new GitHubBrokerServerError(code, message, cause === undefined ? undefined : { cause }); }
18
+ function fileIdentity(stat) { return { dev: BigInt(stat.dev), ino: BigInt(stat.ino), uid: BigInt(stat.uid), gid: BigInt(stat.gid), mode: Number(stat.mode) & 0o7777 }; }
19
+ function sameIdentity(left, right) { return left.dev === right.dev && left.ino === right.ino && left.uid === right.uid && left.gid === right.gid && left.mode === right.mode; }
20
+ function sameInode(left, right) { return left.dev === right.dev && left.ino === right.ino; }
21
+ function timer(callback, timeoutMs) { const value = setTimeout(callback, timeoutMs); value.unref(); return value; }
22
+ function clearTimers(state) { clearTimeout(state.totalTimer); if (state.firstByteTimer)
23
+ clearTimeout(state.firstByteTimer); if (state.frameTimer)
24
+ clearTimeout(state.frameTimer); }
25
+ function destroy(state, reason) { if (!state.controller.signal.aborted)
26
+ state.controller.abort(new Error(reason)); clearTimers(state); if (!state.socket.destroyed)
27
+ state.socket.destroy(); }
28
+ function safeCoreError(error) {
29
+ if (!error || typeof error !== 'object')
30
+ return { code: 'internal-error', dispatched: false };
31
+ return { code: 'code' in error && typeof error.code === 'string' && SAFE_CORE_CODES.has(error.code) ? error.code : 'internal-error', dispatched: 'dispatched' in error && error.dispatched === true };
32
+ }
33
+ function abortable(operation, signal) {
34
+ if (signal.aborted)
35
+ return Promise.reject(signal.reason);
36
+ return new Promise((resolveOperation, rejectOperation) => {
37
+ const onAbort = () => { signal.removeEventListener('abort', onAbort); rejectOperation(signal.reason); };
38
+ signal.addEventListener('abort', onAbort, { once: true });
39
+ Promise.resolve(operation).then(value => { signal.removeEventListener('abort', onAbort); resolveOperation(value); }, error => { signal.removeEventListener('abort', onAbort); rejectOperation(error); });
40
+ });
41
+ }
42
+ async function beforeDeadline(operation, deadlineAt, now, message) {
43
+ let timeout;
44
+ try {
45
+ return await Promise.race([operation, new Promise((_resolve, reject) => { timeout = timer(() => reject(failure('shutdown-failed', message)), Math.max(1, deadlineAt - now())); })]);
46
+ }
47
+ finally {
48
+ if (timeout)
49
+ clearTimeout(timeout);
50
+ }
51
+ }
52
+ function publicKey(value) {
53
+ if (value instanceof KeyObject && value.type === 'public')
54
+ return value;
55
+ return createPublicKey(value);
56
+ }
57
+ function endpoint(path, uid, gid, parentMode, mode, maxConnections) {
58
+ if (!isAbsolute(path) || resolve(path) !== path || dirname(path) === path || Buffer.byteLength(path) > 100 || !integer(uid, 0, 0x7fffffff) || !integer(gid, 0, 0x7fffffff)
59
+ || !integer(parentMode, 0, 0o777) || (parentMode & 0o022) !== 0 || !integer(mode, 0, 0o777) || (mode & 0o007) !== 0
60
+ || !integer(maxConnections, 1, 1_024))
61
+ throw failure('invalid-config', 'socket endpoint is invalid');
62
+ return { path, uid, gid, parentMode, mode, maxConnections };
63
+ }
64
+ function normalize(options) {
65
+ const action = endpoint(options.actionSocketPath, options.expectedActionSocketUid, options.expectedActionSocketGid, options.expectedActionParentMode, options.expectedActionSocketMode, options.maxActionConnections ?? 32);
66
+ const admin = endpoint(options.adminSocketPath, options.expectedAdminSocketUid, options.expectedAdminSocketGid, options.expectedAdminParentMode, options.expectedAdminSocketMode, options.maxAdminConnections ?? 4);
67
+ const result = { ...options, action, admin, maxConcurrentRequests: options.maxConcurrentRequests ?? 2, firstByteTimeoutMs: options.firstByteTimeoutMs ?? 2_000, frameTimeoutMs: options.frameTimeoutMs ?? 10_000, totalTimeoutMs: options.totalTimeoutMs ?? 30_000, helloTtlMs: options.helloTtlMs ?? GITHUB_BROKER_DEFAULT_HELLO_TTL_MS, staleProbeTimeoutMs: options.staleProbeTimeoutMs ?? 500, drainTimeoutMs: options.drainTimeoutMs ?? 10_000, now: options.now ?? Date.now };
68
+ let signingKeysValid = false, sameSigningKey = true;
69
+ try {
70
+ const server = publicKey(result.serverPrivateKey), client = publicKey(result.clientPublicKey), admin = publicKey(result.adminPublicKey);
71
+ signingKeysValid = server.asymmetricKeyType === 'ed25519' && client.asymmetricKeyType === 'ed25519' && admin.asymmetricKeyType === 'ed25519';
72
+ sameSigningKey = client.equals(admin) || server.equals(client) || server.equals(admin);
73
+ }
74
+ catch { /* rejected below without binding */ }
75
+ if (action.path === admin.path || !result.instanceId || result.instanceId.length > 128 || !result.clientKeyId || result.clientKeyId.length > 128 || !result.adminKeyId || result.adminKeyId.length > 128
76
+ || result.clientKeyId === result.adminKeyId || !signingKeysValid || sameSigningKey
77
+ || !integer(result.generation, 1, Number.MAX_SAFE_INTEGER) || typeof result.inspectPeerCredentials !== 'function' || typeof result.core?.snapshot !== 'function' || typeof result.core?.execute !== 'function' || typeof result.core?.admin !== 'function' || typeof result.core?.beginDrain !== 'function' || typeof result.core?.drain !== 'function' || typeof result.core?.close !== 'function'
78
+ || !integer(result.expectedClientPeerUid, 0, 0x7fffffff) || !integer(result.expectedClientPeerGid, 0, 0x7fffffff) || !integer(result.expectedAdminPeerUid, 0, 0x7fffffff) || !integer(result.expectedAdminPeerGid, 0, 0x7fffffff)
79
+ || !integer(result.maxConcurrentRequests, 1, action.maxConnections) || !integer(result.firstByteTimeoutMs, 1, 60_000) || !integer(result.frameTimeoutMs, result.firstByteTimeoutMs, 300_000)
80
+ || !integer(result.totalTimeoutMs, result.frameTimeoutMs, 300_000) || !integer(result.helloTtlMs, 1, 300_000) || !integer(result.staleProbeTimeoutMs, 1, 10_000) || !integer(result.drainTimeoutMs, 1, 300_000))
81
+ throw failure('invalid-config', 'server options are invalid');
82
+ return result;
83
+ }
84
+ async function inspectParent(endpoint) {
85
+ const parent = dirname(endpoint.path);
86
+ let cursor = parent;
87
+ for (;;) {
88
+ const [canonicalCursor, cursorStat] = await Promise.all([realpath(cursor), lstat(cursor)]);
89
+ const mode = cursorStat.mode & 0o7777, stickyRoot = cursorStat.uid === 0 && (mode & 0o1000) !== 0 && (mode & 0o022) !== 0;
90
+ if (canonicalCursor !== cursor || cursorStat.isSymbolicLink() || !cursorStat.isDirectory() || !stickyRoot && (mode & 0o022) !== 0)
91
+ throw failure('unsafe-parent', 'socket ancestor is unsafe');
92
+ const next = dirname(cursor);
93
+ if (next === cursor)
94
+ break;
95
+ cursor = next;
96
+ }
97
+ let canonical, stat;
98
+ try {
99
+ [canonical, stat] = await Promise.all([realpath(parent), lstat(parent)]);
100
+ }
101
+ catch (error) {
102
+ throw failure('unsafe-parent', 'socket parent cannot be inspected', error);
103
+ }
104
+ if (canonical !== parent || stat.isSymbolicLink() || !stat.isDirectory() || stat.uid !== endpoint.uid || stat.gid !== endpoint.gid || (stat.mode & 0o7777) !== endpoint.parentMode)
105
+ throw failure('unsafe-parent', 'socket parent type, ownership, or mode is unsafe');
106
+ return fileIdentity(stat);
107
+ }
108
+ async function inspectSocket(endpoint) {
109
+ let stat;
110
+ try {
111
+ stat = await lstat(endpoint.path);
112
+ }
113
+ catch (error) {
114
+ if (enoent(error))
115
+ return undefined;
116
+ throw failure('unsafe-socket', 'socket path cannot be inspected', error);
117
+ }
118
+ if (stat.isSymbolicLink() || !stat.isSocket() || stat.uid !== endpoint.uid || stat.gid !== endpoint.gid || (stat.mode & 0o7777) !== endpoint.mode)
119
+ throw failure('unsafe-socket', 'socket type, ownership, or mode is unsafe');
120
+ return fileIdentity(stat);
121
+ }
122
+ async function probe(endpoint, options) {
123
+ const publicKey = createPublicKey(options.serverPrivateKey);
124
+ return await new Promise(resolveProbe => {
125
+ const decoder = new BrokerFrameDecoder(GITHUB_BROKER_RESPONSE_MAX_BYTES, 1), socket = createConnection({ path: endpoint.path });
126
+ let settled = false;
127
+ const settle = (result) => { if (settled)
128
+ return; settled = true; clearTimeout(timeout); socket.removeAllListeners(); socket.destroy(); resolveProbe(result); };
129
+ const timeout = timer(() => settle('untrusted'), options.staleProbeTimeoutMs);
130
+ socket.on('data', chunk => { try {
131
+ const values = decoder.push(chunk);
132
+ if (values.length === 1) {
133
+ verifyBrokerServerHello(values[0], publicKey, { maxTtlMs: options.helloTtlMs, expectedInstanceId: options.instanceId, minimumGeneration: 1 });
134
+ settle('active');
135
+ }
136
+ }
137
+ catch {
138
+ settle('untrusted');
139
+ } });
140
+ socket.once('error', error => settle(error && typeof error === 'object' && 'code' in error && error.code === 'ECONNREFUSED' ? 'refused' : 'untrusted'));
141
+ socket.once('end', () => settle('untrusted'));
142
+ });
143
+ }
144
+ async function removeStale(endpoint, options, before) {
145
+ const result = await probe(endpoint, options);
146
+ if (result === 'active')
147
+ throw failure('already-running', 'an authenticated broker is already listening');
148
+ if (result !== 'refused')
149
+ throw failure('unsafe-socket', 'existing socket cannot be authenticated or proven stale');
150
+ const after = await inspectSocket(endpoint);
151
+ if (!after || !sameIdentity(before, after))
152
+ throw failure('unsafe-socket', 'socket changed during stale inspection');
153
+ await unlink(endpoint.path).catch(error => { throw failure('unsafe-socket', 'stale socket cannot be removed', error); });
154
+ }
155
+ async function listen(server, path) {
156
+ await new Promise((resolveListen, rejectListen) => { const onError = (error) => { server.off('listening', onListen); rejectListen(error); }; const onListen = () => { server.off('error', onError); resolveListen(); }; server.once('error', onError); server.once('listening', onListen); server.listen(path); });
157
+ }
158
+ async function closeServer(server, deadlineAt, now) {
159
+ if (!server.listening)
160
+ return;
161
+ await new Promise((resolveClose, rejectClose) => {
162
+ const timeout = timer(() => rejectClose(failure('shutdown-failed', 'listener close deadline exceeded')), Math.max(1, deadlineAt - now()));
163
+ server.close(error => { clearTimeout(timeout); if (error)
164
+ rejectClose(error);
165
+ else
166
+ resolveClose(); });
167
+ });
168
+ }
169
+ async function closeOwned(listener, deadlineAt, now) {
170
+ if (!listener.owned) {
171
+ await closeServer(listener.server, deadlineAt, now);
172
+ return;
173
+ }
174
+ const parked = `${listener.endpoint.path}.replacement-${randomUUID()}`;
175
+ let parkedIdentity;
176
+ let parkedExists = false;
177
+ let problem;
178
+ try {
179
+ try {
180
+ await rename(listener.endpoint.path, parked);
181
+ parkedExists = true;
182
+ }
183
+ catch (error) {
184
+ if (!enoent(error))
185
+ throw error;
186
+ }
187
+ const stat = await lstat(parked).catch(error => enoent(error) ? undefined : Promise.reject(error));
188
+ if (stat) {
189
+ parkedIdentity = fileIdentity(stat);
190
+ if (!sameInode(parkedIdentity, listener.owned) && (stat.isSymbolicLink() || !stat.isSocket() || stat.uid !== listener.endpoint.uid || stat.gid !== listener.endpoint.gid || (stat.mode & 0o7777) !== listener.endpoint.mode))
191
+ throw failure('shutdown-failed', 'parked socket is unsafe');
192
+ }
193
+ }
194
+ catch (error) {
195
+ problem = error;
196
+ }
197
+ try {
198
+ await closeServer(listener.server, deadlineAt, now);
199
+ }
200
+ catch (error) {
201
+ problem ??= error;
202
+ }
203
+ try {
204
+ if (parkedIdentity && sameInode(parkedIdentity, listener.owned))
205
+ await unlink(parked);
206
+ else if (parkedIdentity) {
207
+ if (await lstat(listener.endpoint.path).then(() => true, error => enoent(error) ? false : Promise.reject(error)) || !sameIdentity(parkedIdentity, fileIdentity(await lstat(parked))))
208
+ throw failure('shutdown-failed', 'replacement socket cannot be restored');
209
+ await rename(parked, listener.endpoint.path);
210
+ if (!sameIdentity(parkedIdentity, fileIdentity(await lstat(listener.endpoint.path))))
211
+ throw failure('shutdown-failed', 'replacement socket changed');
212
+ }
213
+ }
214
+ catch (error) {
215
+ problem ??= error;
216
+ }
217
+ if (problem !== undefined) {
218
+ if (parkedExists && parkedIdentity && sameInode(parkedIdentity, listener.owned))
219
+ await unlink(parked).catch(() => undefined);
220
+ else if (parkedExists) {
221
+ const destinationMissing = await lstat(listener.endpoint.path).then(() => false, error => enoent(error));
222
+ if (destinationMissing)
223
+ await rename(parked, listener.endpoint.path).catch(() => undefined);
224
+ }
225
+ if (problem instanceof GitHubBrokerServerError)
226
+ throw problem;
227
+ throw failure('shutdown-failed', 'socket preservation failed', problem);
228
+ }
229
+ }
230
+ async function unlinkOwned(listener) {
231
+ if (!listener.owned)
232
+ return;
233
+ const current = await inspectSocket(listener.endpoint).catch(() => undefined);
234
+ if (current && sameIdentity(current, listener.owned) && await inspectParent(listener.endpoint).catch(() => undefined))
235
+ await unlink(listener.endpoint.path).catch(() => undefined);
236
+ }
237
+ export class GitHubBrokerServer {
238
+ #options;
239
+ #action;
240
+ #admin;
241
+ #accepting = false;
242
+ #concurrent = 0;
243
+ #stopping;
244
+ constructor(options) {
245
+ this.#options = options;
246
+ this.#action = this.#listener('action', options.action);
247
+ this.#admin = this.#listener('admin', options.admin);
248
+ }
249
+ #listener(kind, endpoint) {
250
+ const listener = { kind, endpoint, server: undefined, connections: new Set(), active: new Set() };
251
+ listener.server = createServer(socket => this.#accept(listener, socket));
252
+ listener.server.maxConnections = endpoint.maxConnections;
253
+ return listener;
254
+ }
255
+ static async start(raw) {
256
+ const options = normalize(raw), instance = new GitHubBrokerServer(options);
257
+ try {
258
+ await instance.#bind(instance.#action);
259
+ await instance.#bind(instance.#admin);
260
+ instance.#accepting = true;
261
+ return instance;
262
+ }
263
+ catch (error) {
264
+ const deadlineAt = options.now() + options.drainTimeoutMs;
265
+ await Promise.allSettled([closeOwned(instance.#action, deadlineAt, options.now), closeOwned(instance.#admin, deadlineAt, options.now)]);
266
+ await Promise.allSettled([unlinkOwned(instance.#action), unlinkOwned(instance.#admin)]);
267
+ if (error instanceof GitHubBrokerServerError)
268
+ throw error;
269
+ throw failure('listen-failed', 'Unix socket bind failed', error);
270
+ }
271
+ }
272
+ async #bind(listener) {
273
+ const before = await inspectParent(listener.endpoint), existing = await inspectSocket(listener.endpoint);
274
+ if (existing)
275
+ await removeStale(listener.endpoint, this.#options, existing);
276
+ const after = await inspectParent(listener.endpoint);
277
+ if (!sameIdentity(before, after))
278
+ throw failure('unsafe-parent', 'socket parent changed during startup');
279
+ await listen(listener.server, listener.endpoint.path);
280
+ const provisional = await lstat(listener.endpoint.path);
281
+ if (provisional.isSymbolicLink() || !provisional.isSocket())
282
+ throw failure('unsafe-socket', 'newly bound path is not a socket');
283
+ listener.owned = fileIdentity(provisional);
284
+ await chown(listener.endpoint.path, listener.endpoint.uid, listener.endpoint.gid);
285
+ await chmod(listener.endpoint.path, listener.endpoint.mode);
286
+ const socket = await inspectSocket(listener.endpoint), finalParent = await inspectParent(listener.endpoint);
287
+ if (!socket || !sameIdentity(after, finalParent))
288
+ throw failure('unsafe-socket', 'bound socket identity could not be verified');
289
+ if (!sameInode(listener.owned, socket))
290
+ throw failure('unsafe-socket', 'bound socket inode changed during startup');
291
+ listener.owned = socket;
292
+ }
293
+ get actionSocketPath() { return this.#action.endpoint.path; }
294
+ get adminSocketPath() { return this.#admin.endpoint.path; }
295
+ get accepting() { return this.#accepting; }
296
+ get activeRequests() { return this.#concurrent; }
297
+ #accept(listener, socket) {
298
+ if (!this.#accepting || listener.connections.size >= listener.endpoint.maxConnections) {
299
+ socket.destroy();
300
+ return;
301
+ }
302
+ const controller = new AbortController();
303
+ const state = { socket, controller, verified: false, settled: false, totalTimer: timer(() => destroy(state, 'total deadline exceeded'), this.#options.totalTimeoutMs) };
304
+ listener.connections.add(state);
305
+ socket.once('close', () => { clearTimers(state); listener.connections.delete(state); if (state.verified && !state.settled)
306
+ controller.abort(new Error('client disconnected')); });
307
+ const task = this.#serve(listener.kind, state).finally(() => listener.active.delete(task));
308
+ listener.active.add(task);
309
+ }
310
+ async #serve(kind, state) {
311
+ try {
312
+ const peer = await abortable(this.#options.inspectPeerCredentials(state.socket, state.controller.signal), state.controller.signal);
313
+ if (!peer || !integer(peer.uid, 0, 0x7fffffff) || !integer(peer.gid, 0, 0x7fffffff) || peer.pid !== undefined && !integer(peer.pid, 1, 0x7fffffff))
314
+ return destroy(state, 'peer credentials rejected');
315
+ const expectedUid = kind === 'action' ? this.#options.expectedClientPeerUid : this.#options.expectedAdminPeerUid;
316
+ const expectedGid = kind === 'action' ? this.#options.expectedClientPeerGid : this.#options.expectedAdminPeerGid;
317
+ if (peer.uid !== expectedUid || peer.gid !== expectedGid)
318
+ return destroy(state, 'peer role rejected');
319
+ const now = this.#options.now(), snapshot = this.#options.core.snapshot();
320
+ if (!integer(snapshot.generation, 1, Number.MAX_SAFE_INTEGER) || snapshot.generation !== this.#options.generation || !integer(snapshot.policyEpoch, 0, Number.MAX_SAFE_INTEGER) || !integer(snapshot.emergencyEpoch, 0, Number.MAX_SAFE_INTEGER))
321
+ return destroy(state, 'core snapshot rejected');
322
+ const hello = createBrokerServerHello({ instanceId: this.#options.instanceId, generation: snapshot.generation, policyEpoch: snapshot.policyEpoch, emergencyEpoch: snapshot.emergencyEpoch, expiresAt: now + this.#options.helloTtlMs }, this.#options.serverPrivateKey);
323
+ state.socket.write(encodeBrokerFrame(hello, GITHUB_BROKER_RESPONSE_MAX_BYTES));
324
+ if (kind === 'admin')
325
+ return await this.#serveAdmin(state, hello);
326
+ await this.#serveAction(state, hello);
327
+ }
328
+ catch {
329
+ destroy(state, 'request rejected');
330
+ }
331
+ }
332
+ async #serveAction(state, hello) {
333
+ const request = await this.#read(state, raw => verifyBrokerClientRequest(raw, hello, this.#options.clientPublicKey, { now: this.#options.now(), expectedClientKeyId: this.#options.clientKeyId }));
334
+ if (!request)
335
+ return;
336
+ state.verified = true;
337
+ if (!this.#accepting || this.#concurrent >= this.#options.maxConcurrentRequests)
338
+ return await this.#replyAction(state, request, { status: 'failed', dispatched: false, result: null, error: { code: this.#accepting ? 'broker-busy' : 'broker-draining' }, completedAt: this.#options.now() }, hello);
339
+ this.#concurrent++;
340
+ try {
341
+ await this.#replyAction(state, request, await abortable(this.#options.core.execute(request, state.controller.signal), state.controller.signal), hello);
342
+ }
343
+ catch (error) {
344
+ const safe = safeCoreError(error);
345
+ await this.#replyAction(state, request, { status: safe.dispatched ? 'unknown' : 'failed', dispatched: safe.dispatched, result: null, error: { code: safe.code }, completedAt: this.#options.now() }, hello);
346
+ }
347
+ finally {
348
+ this.#concurrent--;
349
+ }
350
+ }
351
+ async #serveAdmin(state, hello) {
352
+ const request = await this.#read(state, raw => verifyBrokerAdminRequest(raw, hello, this.#options.adminPublicKey, { now: this.#options.now(), expectedAdminKeyId: this.#options.adminKeyId }));
353
+ if (!request)
354
+ return;
355
+ state.verified = true;
356
+ try {
357
+ await this.#replyAdmin(state, request, await abortable(this.#options.core.admin(request, state.controller.signal), state.controller.signal), hello);
358
+ }
359
+ catch {
360
+ destroy(state, 'admin request rejected');
361
+ }
362
+ }
363
+ async #read(state, verify) {
364
+ const decoder = new BrokerFrameDecoder(GITHUB_BROKER_REQUEST_MAX_BYTES, 1);
365
+ return await new Promise(resolveRequest => {
366
+ let settled = false, sawByte = false;
367
+ const settle = (value) => { if (settled)
368
+ return; settled = true; if (state.firstByteTimer)
369
+ clearTimeout(state.firstByteTimer); if (state.frameTimer)
370
+ clearTimeout(state.frameTimer); state.socket.off('data', onData); state.socket.off('end', onEnd); state.controller.signal.removeEventListener('abort', onAbort); resolveRequest(value); };
371
+ const reject = () => { settle(); destroy(state, 'invalid request frame'); };
372
+ const onAbort = () => settle();
373
+ const onEnd = () => { try {
374
+ decoder.finish();
375
+ }
376
+ catch { /* rejected below */ } reject(); };
377
+ const onData = (chunk) => {
378
+ if (!sawByte && chunk.length) {
379
+ sawByte = true;
380
+ if (state.firstByteTimer)
381
+ clearTimeout(state.firstByteTimer);
382
+ state.frameTimer = timer(reject, this.#options.frameTimeoutMs);
383
+ }
384
+ try {
385
+ const values = decoder.push(chunk);
386
+ if (values.length === 1) {
387
+ const request = verify(values[0]);
388
+ state.socket.on('data', reject);
389
+ settle(request);
390
+ }
391
+ }
392
+ catch {
393
+ reject();
394
+ }
395
+ };
396
+ state.firstByteTimer = timer(reject, this.#options.firstByteTimeoutMs);
397
+ state.socket.on('data', onData);
398
+ state.socket.once('end', onEnd);
399
+ state.controller.signal.addEventListener('abort', onAbort, { once: true });
400
+ });
401
+ }
402
+ async #replyAction(state, request, input, hello) { if (!state.controller.signal.aborted && !state.socket.destroyed)
403
+ await this.#end(state, encodeBrokerFrame(createBrokerServerResponse(input, request, hello, this.#options.serverPrivateKey), GITHUB_BROKER_RESPONSE_MAX_BYTES)); }
404
+ async #replyAdmin(state, request, input, hello) { if (!state.controller.signal.aborted && !state.socket.destroyed)
405
+ await this.#end(state, encodeBrokerFrame(createBrokerAdminResponse(input, request, hello, this.#options.serverPrivateKey), GITHUB_BROKER_RESPONSE_MAX_BYTES)); }
406
+ async #end(state, frame) { await new Promise((resolveWrite, rejectWrite) => { state.socket.once('error', rejectWrite); state.socket.end(frame, () => { state.socket.off('error', rejectWrite); resolveWrite(); }); }); state.settled = true; }
407
+ stop(reason = 'lifecycle', timeoutMs = this.#options.drainTimeoutMs) { if (this.#stopping)
408
+ return this.#stopping; if (!integer(timeoutMs, 1, 300_000))
409
+ return Promise.reject(failure('invalid-config', 'shutdown timeout is invalid')); this.#stopping = this.#stop(reason, timeoutMs); return this.#stopping; }
410
+ async #stop(reason, timeoutMs) {
411
+ this.#accepting = false;
412
+ const deadlineAt = this.#options.now() + timeoutMs, listeners = [this.#action, this.#admin];
413
+ let cause;
414
+ try {
415
+ await beforeDeadline(Promise.resolve().then(() => this.#options.core.beginDrain(reason)), deadlineAt, this.#options.now, 'begin-drain deadline exceeded');
416
+ }
417
+ catch (error) {
418
+ cause = error;
419
+ }
420
+ const closing = Promise.allSettled(listeners.map(listener => closeOwned(listener, deadlineAt, this.#options.now))).then(results => { const rejected = results.find(result => result.status === 'rejected'); if (rejected?.status === 'rejected')
421
+ cause ??= rejected.reason; });
422
+ for (const listener of listeners)
423
+ for (const state of listener.connections)
424
+ if (!state.verified)
425
+ destroy(state, 'server draining');
426
+ let deadlineTimer;
427
+ const deadline = new Promise(resolveDeadline => { deadlineTimer = timer(() => resolveDeadline('deadline'), Math.max(1, deadlineAt - this.#options.now())); });
428
+ const activeSets = listeners.map(listener => Promise.allSettled(listener.active));
429
+ const settled = Promise.all(activeSets).then(() => 'settled');
430
+ if (await Promise.race([settled, deadline]) === 'deadline') {
431
+ for (const listener of listeners)
432
+ for (const state of listener.connections)
433
+ destroy(state, 'drain deadline exceeded');
434
+ await Promise.all(listeners.map(listener => Promise.allSettled(listener.active)));
435
+ }
436
+ if (deadlineTimer)
437
+ clearTimeout(deadlineTimer);
438
+ for (const listener of listeners)
439
+ for (const state of listener.connections)
440
+ destroy(state, 'server shutdown');
441
+ try {
442
+ await beforeDeadline(Promise.resolve().then(() => this.#options.core.drain(deadlineAt)), deadlineAt, this.#options.now, 'core drain deadline exceeded');
443
+ }
444
+ catch (error) {
445
+ cause ??= error;
446
+ }
447
+ try {
448
+ await beforeDeadline(closing, deadlineAt, this.#options.now, 'listener close deadline exceeded');
449
+ }
450
+ catch (error) {
451
+ cause ??= error;
452
+ }
453
+ try {
454
+ await beforeDeadline(Promise.resolve().then(() => this.#options.core.close()), deadlineAt, this.#options.now, 'core close deadline exceeded');
455
+ }
456
+ catch (error) {
457
+ cause ??= error;
458
+ }
459
+ finally {
460
+ await Promise.allSettled(listeners.map(unlinkOwned));
461
+ }
462
+ if (cause !== undefined)
463
+ throw failure('shutdown-failed', 'one or more shutdown barriers failed', cause);
464
+ }
465
+ }
466
+ export async function startGitHubBrokerServer(options) { return await GitHubBrokerServer.start(options); }
467
+ //# sourceMappingURL=broker-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker-server.js","sourceRoot":"","sources":["../src/broker-server.ts"],"names":[],"mappings":"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"}
package/lib/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function revokeActionGrant(root: string, grantId: string, revision: number): void;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAMA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOvF"}
package/lib/cli.js ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ import { lstatSync, realpathSync } from 'node:fs';
3
+ import { isAbsolute, join } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { ActionLedger } from './ledger.js';
6
+ export function revokeActionGrant(root, grantId, revision) {
7
+ if (!isAbsolute(root) || realpathSync(root) !== root)
8
+ throw new Error('private canonical root required');
9
+ const dir = lstatSync(root);
10
+ const path = join(root, 'ledger.sqlite');
11
+ const file = lstatSync(path);
12
+ if (!dir.isDirectory() || dir.uid !== process.getuid?.() || (dir.mode & 0o077) !== 0 || !file.isFile() || file.isSymbolicLink()
13
+ || file.nlink !== 1 || file.uid !== dir.uid || (file.mode & 0o077) !== 0)
14
+ throw new Error('private owned ledger required');
15
+ const ledger = new ActionLedger(path);
16
+ try {
17
+ ledger.revoke(grantId, revision);
18
+ }
19
+ finally {
20
+ ledger.close();
21
+ }
22
+ }
23
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
24
+ const [command, root, grant, revision, ...extra] = process.argv.slice(2);
25
+ try {
26
+ if (command !== 'revoke' || !root || !grant || !revision || !/^[1-9][0-9]*$/.test(revision) || extra.length)
27
+ throw new Error('usage: dsh-actions revoke /private/state grant-id revision');
28
+ revokeActionGrant(root, grant, Number(revision));
29
+ process.stdout.write('{"revoked":true,"inFlightOutcome":"requires-readback"}\n');
30
+ }
31
+ catch {
32
+ process.stderr.write('assistant-actions: revocation failed or invalid arguments\n');
33
+ process.exitCode = 1;
34
+ }
35
+ }
36
+ //# sourceMappingURL=cli.js.map
package/lib/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAe,EAAE,QAAgB;IAC/E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACxG,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IACnG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;WAC1H,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAC5H,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,CAAC;QAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAAC,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAAC,CAAC;AACrE,CAAC;AACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACxE,IAAI,CAAC;QACH,IAAI,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;QAC1L,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAClF,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IAAC,CAAC;AACvH,CAAC"}
@@ -0,0 +1,54 @@
1
+ import Schema from '@deepseek-ai/schemastery';
2
+ import type { ActionGrant, CommitRequest, CompensationRequest, ExternalActionGrantMirror, VerifiedDeliveryRequest } from './types.js';
3
+ export interface EmbeddedBrokerConfig {
4
+ mode: 'embedded-compat';
5
+ }
6
+ export interface ExternalUnixBrokerConfig {
7
+ mode: 'external-unix-v1';
8
+ actionSocketPath: string;
9
+ brokerId: string;
10
+ brokerPublicKeyPath: string;
11
+ clientKeyId: string;
12
+ clientSigningKeyPath: string;
13
+ clientInstanceId: string;
14
+ clientGeneration: number;
15
+ requestTimeoutMs?: number;
16
+ helloTtlMs?: number;
17
+ expectedSocketUid: number;
18
+ expectedSocketGid: number;
19
+ expectedSocketMode?: number;
20
+ expectedSocketParentUid?: number;
21
+ expectedSocketParentGid?: number;
22
+ expectedSocketParentMode?: number;
23
+ expectedBrokerPeerUid: number;
24
+ expectedBrokerPeerGid: number;
25
+ minimumBrokerGeneration?: number;
26
+ }
27
+ export type BrokerConfig = EmbeddedBrokerConfig | ExternalUnixBrokerConfig;
28
+ export interface Config {
29
+ stateRoot?: string;
30
+ grants?: ActionGrant[];
31
+ externalGrants?: readonly ExternalActionGrantMirror[];
32
+ broker?: BrokerConfig;
33
+ }
34
+ type ValidatedExternalUnixBrokerConfig = Required<ExternalUnixBrokerConfig>;
35
+ export type ValidatedConfig = {
36
+ stateRoot: string;
37
+ grants: ActionGrant[];
38
+ externalGrants: [];
39
+ broker: EmbeddedBrokerConfig;
40
+ } | {
41
+ stateRoot: string;
42
+ grants: [];
43
+ externalGrants: ExternalActionGrantMirror[];
44
+ broker: ValidatedExternalUnixBrokerConfig;
45
+ };
46
+ export declare const Config: Schema<Config>;
47
+ export declare function validPath(value: unknown): value is string;
48
+ export declare function validateConfig(input: Config): ValidatedConfig;
49
+ export declare function normalizeCommit(value: CommitRequest): CommitRequest;
50
+ export declare const commitBytes: (request: CommitRequest) => number;
51
+ export declare function normalizeCompensation(value: CompensationRequest): CompensationRequest;
52
+ export declare function normalizeVerifiedDelivery(input: VerifiedDeliveryRequest): VerifiedDeliveryRequest;
53
+ export {};
54
+ //# sourceMappingURL=config.d.ts.map