agl 40.5.1 → 41.0.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 (137) hide show
  1. package/changelog.md +43 -0
  2. package/dist_serve/bundle.js +3514 -3357
  3. package/dist_serve/bundle.js.map +2 -2
  4. package/dist_serve/bundle.js.third-party-notices.json +58 -32
  5. package/dist_serve/bundle.js.third-party-notices.txt +108 -33
  6. package/dist_ts/00_commitinfo_data.js +1 -1
  7. package/dist_ts/aglapi/aglapisurface.document.js +64 -37
  8. package/dist_ts/classes.aglhome.d.ts +5 -0
  9. package/dist_ts/classes.aglhome.js +2 -1
  10. package/dist_ts/classes.authstore.js +5 -1
  11. package/dist_ts/classes.controller.d.ts +8 -0
  12. package/dist_ts/classes.controller.js +119 -22
  13. package/dist_ts/classes.controllereventdelivery.d.ts +72 -0
  14. package/dist_ts/classes.controllereventdelivery.js +233 -0
  15. package/dist_ts/classes.flexmodels.public.js +4 -1
  16. package/dist_ts/classes.flexprojectionreader.d.ts +6 -0
  17. package/dist_ts/classes.flexprojectionreader.js +29 -5
  18. package/dist_ts/classes.flexservice.d.ts +2 -1
  19. package/dist_ts/classes.flexservice.js +34 -6
  20. package/dist_ts/classes.flexstore.d.ts +41 -4
  21. package/dist_ts/classes.flexstore.js +266 -203
  22. package/dist_ts/classes.inferencegateway.d.ts +35 -1
  23. package/dist_ts/classes.inferencegateway.js +86 -26
  24. package/dist_ts/classes.inferenceservice.d.ts +4 -2
  25. package/dist_ts/classes.inferenceservice.js +5 -4
  26. package/dist_ts/classes.proxycontrol.d.ts +58 -4
  27. package/dist_ts/classes.proxycontrol.js +23 -44
  28. package/dist_ts/classes.proxycontrolclient.d.ts +15 -5
  29. package/dist_ts/classes.proxycontrolclient.js +67 -17
  30. package/dist_ts/classes.proxydaemon.d.ts +22 -3
  31. package/dist_ts/classes.proxydaemon.js +73 -12
  32. package/dist_ts/classes.proxyleaseholder.d.ts +43 -14
  33. package/dist_ts/classes.proxyleaseholder.js +66 -22
  34. package/dist_ts/classes.proxystore.d.ts +9 -0
  35. package/dist_ts/classes.proxystore.js +15 -7
  36. package/dist_ts/classes.ticketnotifier.js +4 -2
  37. package/dist_ts/classes.ticketstore.d.ts +50 -2
  38. package/dist_ts/classes.ticketstore.js +195 -78
  39. package/dist_ts/classes.workercallerbindings.d.ts +66 -0
  40. package/dist_ts/classes.workercallerbindings.js +211 -0
  41. package/dist_ts/classes.workercallers.d.ts +63 -2
  42. package/dist_ts/classes.workercallers.js +430 -65
  43. package/dist_ts/driver/classes.drivereventrelay.d.ts +13 -1
  44. package/dist_ts/driver/classes.drivereventrelay.js +99 -6
  45. package/dist_ts/driver/functions.driverinstructions.d.ts +1 -1
  46. package/dist_ts/driver/functions.driverinstructions.js +1 -1
  47. package/dist_ts/driver/functions.drivertools.d.ts +11 -2
  48. package/dist_ts/driver/functions.drivertools.js +19 -9
  49. package/dist_ts/fleet/classes.boardpump.d.ts +8 -2
  50. package/dist_ts/fleet/classes.boardpump.js +38 -20
  51. package/dist_ts/fleet/classes.ticketeffects.d.ts +17 -2
  52. package/dist_ts/fleet/classes.ticketeffects.js +16 -10
  53. package/dist_ts/fleet/classes.workerlaunches.d.ts +12 -5
  54. package/dist_ts/fleet/classes.workerlaunches.js +25 -19
  55. package/dist_ts/fleet/classes.workers.d.ts +21 -0
  56. package/dist_ts/fleet/classes.workers.js +110 -17
  57. package/dist_ts/fleet/functions.workervalidation.js +2 -2
  58. package/dist_ts/functions.flexprivatesnapshot.d.ts +102 -0
  59. package/dist_ts/functions.flexprivatesnapshot.js +461 -0
  60. package/dist_ts/functions.inferencecli.d.ts +3 -2
  61. package/dist_ts/functions.inferencecli.js +67 -5
  62. package/dist_ts/functions.inferencecliarguments.d.ts +6 -2
  63. package/dist_ts/functions.inferencecliarguments.js +29 -2
  64. package/dist_ts/functions.inferencelaunch.d.ts +24 -0
  65. package/dist_ts/functions.inferencelaunch.js +42 -2
  66. package/dist_ts/functions.mcptickettools.d.ts +3 -0
  67. package/dist_ts/functions.mcptickettools.js +2 -2
  68. package/dist_ts/functions.proxycontract.d.ts +11 -0
  69. package/dist_ts/functions.proxycontract.js +12 -1
  70. package/dist_ts/functions.proxysocket.d.ts +6 -0
  71. package/dist_ts/functions.proxysocket.js +46 -0
  72. package/dist_ts/functions.ticketcli.d.ts +1 -1
  73. package/dist_ts/functions.ticketcli.js +8 -4
  74. package/dist_ts/functions.ticketvalidation.d.ts +3 -0
  75. package/dist_ts/functions.ticketvalidation.js +7 -4
  76. package/dist_ts/functions.workerprocessproof.d.ts +6 -0
  77. package/dist_ts/functions.workerprocessproof.js +28 -4
  78. package/dist_ts/interfaces.flexipc.d.ts +21 -2
  79. package/dist_ts/interfaces.flexipc.js +33 -16
  80. package/dist_ts_interfaces/fleetworkers.d.ts +6 -0
  81. package/dist_ts_interfaces/interfaces.d.ts +1 -1
  82. package/dist_ts_interfaces/interfaces.js +1 -1
  83. package/dist_ts_interfaces/requests.tickets.d.ts +8 -12
  84. package/dist_ts_interfaces/tickets.d.ts +37 -9
  85. package/dist_ts_interfaces/tickets.js +7 -1
  86. package/dist_ts_interfaces/workercallers.d.ts +43 -4
  87. package/package.json +7 -7
  88. package/readme.md +156 -23
  89. package/ts/00_commitinfo_data.ts +1 -1
  90. package/ts/aglapi/aglapisurface.document.ts +63 -36
  91. package/ts/classes.aglhome.ts +6 -0
  92. package/ts/classes.authstore.ts +4 -0
  93. package/ts/classes.controller.ts +141 -32
  94. package/ts/classes.controllereventdelivery.ts +289 -0
  95. package/ts/classes.flexmodels.public.ts +10 -0
  96. package/ts/classes.flexprojectionreader.ts +30 -3
  97. package/ts/classes.flexservice.ts +33 -5
  98. package/ts/classes.flexstore.ts +381 -246
  99. package/ts/classes.inferencegateway.ts +104 -23
  100. package/ts/classes.inferenceservice.ts +6 -3
  101. package/ts/classes.proxycontrol.ts +76 -39
  102. package/ts/classes.proxycontrolclient.ts +72 -20
  103. package/ts/classes.proxydaemon.ts +85 -15
  104. package/ts/classes.proxyleaseholder.ts +84 -28
  105. package/ts/classes.proxystore.ts +16 -5
  106. package/ts/classes.ticketnotifier.ts +3 -1
  107. package/ts/classes.ticketstore.ts +201 -75
  108. package/ts/classes.workercallerbindings.ts +147 -0
  109. package/ts/classes.workercallers.ts +410 -59
  110. package/ts/driver/classes.drivereventrelay.ts +89 -4
  111. package/ts/driver/functions.driverinstructions.ts +1 -1
  112. package/ts/driver/functions.drivertools.ts +22 -8
  113. package/ts/fleet/classes.boardpump.ts +51 -19
  114. package/ts/fleet/classes.ticketeffects.ts +25 -11
  115. package/ts/fleet/classes.workerlaunches.ts +23 -15
  116. package/ts/fleet/classes.workers.ts +79 -17
  117. package/ts/fleet/functions.workervalidation.ts +1 -1
  118. package/ts/functions.flexprivatesnapshot.ts +601 -0
  119. package/ts/functions.inferencecli.ts +61 -7
  120. package/ts/functions.inferencecliarguments.ts +32 -1
  121. package/ts/functions.inferencelaunch.ts +49 -2
  122. package/ts/functions.mcptickettools.ts +1 -1
  123. package/ts/functions.proxycontract.ts +12 -0
  124. package/ts/functions.proxysocket.ts +39 -0
  125. package/ts/functions.ticketcli.ts +7 -3
  126. package/ts/functions.ticketvalidation.ts +7 -3
  127. package/ts/functions.workerprocessproof.ts +27 -4
  128. package/ts/interfaces.flexipc.ts +50 -21
  129. package/ts_interfaces/fleetworkers.ts +6 -0
  130. package/ts_interfaces/interfaces.ts +1 -1
  131. package/ts_interfaces/requests.tickets.ts +9 -6
  132. package/ts_interfaces/tickets.ts +32 -1
  133. package/ts_interfaces/workercallers.ts +32 -4
  134. package/ts_web/00_commitinfo_data.ts +1 -1
  135. package/ts_web/elements.harnesscontrollerapp.ts +19 -8
  136. package/ts_web/elements.ticketboard.ts +16 -4
  137. package/ts_web/settings.general.ts +10 -4
@@ -0,0 +1,66 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { IWorkerBridgeCommand, IWorkerProcessSnapshot } from './functions.workerprocessproof.js';
3
+ /** The Claude process a kept binding was last proved against: its PID, start and the digest of its whole snapshot. */
4
+ export interface IWorkerCallerBindingProcess {
5
+ pid: number;
6
+ startTicks: string;
7
+ snapshotDigest: string;
8
+ }
9
+ /**
10
+ * What the controller keeps of a fleet Claude worker's current caller launch, so a restarted controller proves the
11
+ * worker's bridge again instead of forgetting it. Never a credential, never the launch id or generation themselves:
12
+ * the overlay holds those, and a bridge presents them; the record keeps their digests to find and check the launch.
13
+ */
14
+ export interface IWorkerCallerBindingDocument {
15
+ /** The fleet worker's id: a worker keeps one binding, its current launch's. */
16
+ id: string;
17
+ projectId: string;
18
+ harnessId: 'claude';
19
+ /** SHA-256 digests (base64url) of the launch id and of its generation. */
20
+ launchDigest: string;
21
+ generationDigest: string;
22
+ /** The bridge command approved when the launch was prepared, and the Claude Code executable it was proved against. */
23
+ command: IWorkerBridgeCommand;
24
+ claudeExecutable: string;
25
+ revision: number;
26
+ /** Once bound: the background job, its session, and the job's process when one was proved. */
27
+ binding?: {
28
+ nativeSessionId: string;
29
+ jobId: string;
30
+ process?: IWorkerCallerBindingProcess;
31
+ };
32
+ updateId: string;
33
+ }
34
+ export type TWorkerCallerBindingRecord = Omit<IWorkerCallerBindingDocument, 'updateId'>;
35
+ /** Where the controller keeps the bindings of fleet Claude launches. */
36
+ export interface IWorkerCallerBindingStore {
37
+ /** The binding kept for the launch whose id has the digest `launchDigestArg`. */
38
+ find(launchDigestArg: string): Promise<TWorkerCallerBindingRecord | undefined>;
39
+ /** Keeps `recordArg` as its worker's binding; another launch's binding of the worker is replaced. */
40
+ save(recordArg: TWorkerCallerBindingRecord): Promise<void>;
41
+ /** Deletes the worker's binding; with `launchDigestArg`, only while it is that launch's. */
42
+ delete(workerIdArg: string, launchDigestArg?: string): Promise<void>;
43
+ }
44
+ export declare const workerCallerDigest: (valueArg: string) => string;
45
+ export declare const workerProcessSnapshotDigest: (snapshotArg: IWorkerProcessSnapshot) => string;
46
+ export declare class WorkerCallerBindingModel extends plugins.nosqldb.SmartDataDbDoc<WorkerCallerBindingModel, IWorkerCallerBindingDocument> {
47
+ static exact: plugins.nosqldb.TExact<WorkerCallerBindingModel>;
48
+ id: string;
49
+ projectId: string;
50
+ harnessId: 'claude';
51
+ launchDigest: string;
52
+ generationDigest: string;
53
+ command: IWorkerBridgeCommand;
54
+ claudeExecutable: string;
55
+ revision: number;
56
+ binding?: IWorkerCallerBindingDocument['binding'];
57
+ updateId: string;
58
+ }
59
+ /** The kept bindings in the controller's store; the auth store owns the model manager and database. Writes run one at a time. */
60
+ export declare class WorkerCallerBindingStore implements IWorkerCallerBindingStore {
61
+ private mutationTail;
62
+ find(launchDigestArg: string): Promise<TWorkerCallerBindingRecord | undefined>;
63
+ save(recordArg: TWorkerCallerBindingRecord): Promise<void>;
64
+ delete(workerIdArg: string, launchDigestArg?: string): Promise<void>;
65
+ private mutate;
66
+ }
@@ -0,0 +1,211 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import * as plugins from './plugins.js';
36
+ export const workerCallerDigest = (valueArg) => plugins.crypto.createHash('sha256').update(valueArg).digest('base64url');
37
+ export const workerProcessSnapshotDigest = (snapshotArg) => workerCallerDigest(JSON.stringify([
38
+ snapshotArg.pid, snapshotArg.parentPid, snapshotArg.startTicks, snapshotArg.executable, snapshotArg.arguments
39
+ ]));
40
+ const digest = plugins.z.string().regex(/^[A-Za-z0-9_-]{43}$/u);
41
+ const absolutePath = plugins.z.string().min(2).max(4096).refine((valueArg) => plugins.path.isAbsolute(valueArg) && !valueArg.includes('\0'));
42
+ const documentSchema = plugins.z.object({
43
+ id: plugins.z.string().min(3).max(1024), projectId: plugins.z.string().regex(/^[A-Za-z0-9_.:-]{1,256}$/u),
44
+ harnessId: plugins.z.literal('claude'), launchDigest: digest, generationDigest: digest,
45
+ command: plugins.z.object({ executable: absolutePath, entry: absolutePath,
46
+ arguments: plugins.z.array(plugins.z.string().max(4096)).max(64) }).strict(),
47
+ claudeExecutable: absolutePath, revision: plugins.z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),
48
+ binding: plugins.z.object({ nativeSessionId: plugins.z.string().uuid(), jobId: plugins.z.string().regex(/^[A-Za-z0-9_.:-]{1,256}$/u),
49
+ process: plugins.z.object({ pid: plugins.z.number().int().min(2), startTicks: plugins.z.string().regex(/^\d{1,32}$/u),
50
+ snapshotDigest: digest }).strict().optional() }).strict().optional(),
51
+ updateId: plugins.z.string().uuid(),
52
+ }).strict();
53
+ let WorkerCallerBindingModel = (() => {
54
+ let _classDecorators = [plugins.nosqldb.namedIndex({ name: 'worker_caller_launch', key: { launchDigest: 1 }, options: { unique: true } }), plugins.nosqldb.managed({ collectionName: 'agl_worker_caller_bindings' }), plugins.nosqldb.exactPersistence({ assertDocument: (input) => {
55
+ const doc = documentSchema.parse(input);
56
+ if (!doc.id.startsWith(`${doc.projectId}:`))
57
+ throw new Error('Worker caller binding identity mismatch.');
58
+ if (doc.binding && doc.revision < 1)
59
+ throw new Error('Worker caller binding revision mismatch.');
60
+ } })];
61
+ let _classDescriptor;
62
+ let _classExtraInitializers = [];
63
+ let _classThis;
64
+ let _classSuper = plugins.nosqldb.SmartDataDbDoc;
65
+ let _id_decorators;
66
+ let _id_initializers = [];
67
+ let _id_extraInitializers = [];
68
+ let _projectId_decorators;
69
+ let _projectId_initializers = [];
70
+ let _projectId_extraInitializers = [];
71
+ let _harnessId_decorators;
72
+ let _harnessId_initializers = [];
73
+ let _harnessId_extraInitializers = [];
74
+ let _launchDigest_decorators;
75
+ let _launchDigest_initializers = [];
76
+ let _launchDigest_extraInitializers = [];
77
+ let _generationDigest_decorators;
78
+ let _generationDigest_initializers = [];
79
+ let _generationDigest_extraInitializers = [];
80
+ let _command_decorators;
81
+ let _command_initializers = [];
82
+ let _command_extraInitializers = [];
83
+ let _claudeExecutable_decorators;
84
+ let _claudeExecutable_initializers = [];
85
+ let _claudeExecutable_extraInitializers = [];
86
+ let _revision_decorators;
87
+ let _revision_initializers = [];
88
+ let _revision_extraInitializers = [];
89
+ let _binding_decorators;
90
+ let _binding_initializers = [];
91
+ let _binding_extraInitializers = [];
92
+ let _updateId_decorators;
93
+ let _updateId_initializers = [];
94
+ let _updateId_extraInitializers = [];
95
+ var WorkerCallerBindingModel = class extends _classSuper {
96
+ static { _classThis = this; }
97
+ static {
98
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
99
+ _id_decorators = [plugins.nosqldb.unI()];
100
+ _projectId_decorators = [plugins.nosqldb.svDb()];
101
+ _harnessId_decorators = [plugins.nosqldb.svDb()];
102
+ _launchDigest_decorators = [plugins.nosqldb.svDb()];
103
+ _generationDigest_decorators = [plugins.nosqldb.svDb()];
104
+ _command_decorators = [plugins.nosqldb.svDb()];
105
+ _claudeExecutable_decorators = [plugins.nosqldb.svDb()];
106
+ _revision_decorators = [plugins.nosqldb.svDb()];
107
+ _binding_decorators = [plugins.nosqldb.svDb()];
108
+ _updateId_decorators = [plugins.nosqldb.svDb()];
109
+ __esDecorate(null, null, _id_decorators, { kind: "field", name: "id", static: false, private: false, access: { has: obj => "id" in obj, get: obj => obj.id, set: (obj, value) => { obj.id = value; } }, metadata: _metadata }, _id_initializers, _id_extraInitializers);
110
+ __esDecorate(null, null, _projectId_decorators, { kind: "field", name: "projectId", static: false, private: false, access: { has: obj => "projectId" in obj, get: obj => obj.projectId, set: (obj, value) => { obj.projectId = value; } }, metadata: _metadata }, _projectId_initializers, _projectId_extraInitializers);
111
+ __esDecorate(null, null, _harnessId_decorators, { kind: "field", name: "harnessId", static: false, private: false, access: { has: obj => "harnessId" in obj, get: obj => obj.harnessId, set: (obj, value) => { obj.harnessId = value; } }, metadata: _metadata }, _harnessId_initializers, _harnessId_extraInitializers);
112
+ __esDecorate(null, null, _launchDigest_decorators, { kind: "field", name: "launchDigest", static: false, private: false, access: { has: obj => "launchDigest" in obj, get: obj => obj.launchDigest, set: (obj, value) => { obj.launchDigest = value; } }, metadata: _metadata }, _launchDigest_initializers, _launchDigest_extraInitializers);
113
+ __esDecorate(null, null, _generationDigest_decorators, { kind: "field", name: "generationDigest", static: false, private: false, access: { has: obj => "generationDigest" in obj, get: obj => obj.generationDigest, set: (obj, value) => { obj.generationDigest = value; } }, metadata: _metadata }, _generationDigest_initializers, _generationDigest_extraInitializers);
114
+ __esDecorate(null, null, _command_decorators, { kind: "field", name: "command", static: false, private: false, access: { has: obj => "command" in obj, get: obj => obj.command, set: (obj, value) => { obj.command = value; } }, metadata: _metadata }, _command_initializers, _command_extraInitializers);
115
+ __esDecorate(null, null, _claudeExecutable_decorators, { kind: "field", name: "claudeExecutable", static: false, private: false, access: { has: obj => "claudeExecutable" in obj, get: obj => obj.claudeExecutable, set: (obj, value) => { obj.claudeExecutable = value; } }, metadata: _metadata }, _claudeExecutable_initializers, _claudeExecutable_extraInitializers);
116
+ __esDecorate(null, null, _revision_decorators, { kind: "field", name: "revision", static: false, private: false, access: { has: obj => "revision" in obj, get: obj => obj.revision, set: (obj, value) => { obj.revision = value; } }, metadata: _metadata }, _revision_initializers, _revision_extraInitializers);
117
+ __esDecorate(null, null, _binding_decorators, { kind: "field", name: "binding", static: false, private: false, access: { has: obj => "binding" in obj, get: obj => obj.binding, set: (obj, value) => { obj.binding = value; } }, metadata: _metadata }, _binding_initializers, _binding_extraInitializers);
118
+ __esDecorate(null, null, _updateId_decorators, { kind: "field", name: "updateId", static: false, private: false, access: { has: obj => "updateId" in obj, get: obj => obj.updateId, set: (obj, value) => { obj.updateId = value; } }, metadata: _metadata }, _updateId_initializers, _updateId_extraInitializers);
119
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
120
+ WorkerCallerBindingModel = _classThis = _classDescriptor.value;
121
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
122
+ __runInitializers(_classThis, _classExtraInitializers);
123
+ }
124
+ id = __runInitializers(this, _id_initializers, void 0);
125
+ projectId = (__runInitializers(this, _id_extraInitializers), __runInitializers(this, _projectId_initializers, void 0));
126
+ harnessId = (__runInitializers(this, _projectId_extraInitializers), __runInitializers(this, _harnessId_initializers, void 0));
127
+ launchDigest = (__runInitializers(this, _harnessId_extraInitializers), __runInitializers(this, _launchDigest_initializers, void 0));
128
+ generationDigest = (__runInitializers(this, _launchDigest_extraInitializers), __runInitializers(this, _generationDigest_initializers, void 0));
129
+ command = (__runInitializers(this, _generationDigest_extraInitializers), __runInitializers(this, _command_initializers, void 0));
130
+ claudeExecutable = (__runInitializers(this, _command_extraInitializers), __runInitializers(this, _claudeExecutable_initializers, void 0));
131
+ revision = (__runInitializers(this, _claudeExecutable_extraInitializers), __runInitializers(this, _revision_initializers, void 0));
132
+ binding = (__runInitializers(this, _revision_extraInitializers), __runInitializers(this, _binding_initializers, void 0));
133
+ updateId = (__runInitializers(this, _binding_extraInitializers), __runInitializers(this, _updateId_initializers, void 0));
134
+ constructor() {
135
+ super(...arguments);
136
+ __runInitializers(this, _updateId_extraInitializers);
137
+ }
138
+ };
139
+ return WorkerCallerBindingModel = _classThis;
140
+ })();
141
+ export { WorkerCallerBindingModel };
142
+ const ambiguous = (errorArg) => errorArg instanceof plugins.nosqldb.SmartdataExactPersistenceError && errorArg.code === 'ambiguous_write';
143
+ const record = (documentArg) => {
144
+ const { updateId: _updateId, ...rest } = structuredClone(documentArg);
145
+ return rest;
146
+ };
147
+ /** The kept bindings in the controller's store; the auth store owns the model manager and database. Writes run one at a time. */
148
+ export class WorkerCallerBindingStore {
149
+ mutationTail = Promise.resolve();
150
+ async find(launchDigestArg) {
151
+ const stored = await WorkerCallerBindingModel.exact.findStoredOne({ launchDigest: launchDigestArg });
152
+ return stored ? record(WorkerCallerBindingModel.exact.toPersisted(stored)) : undefined;
153
+ }
154
+ save(recordArg) {
155
+ return this.mutate(async () => {
156
+ const candidate = { ...structuredClone(recordArg), updateId: plugins.crypto.randomUUID() };
157
+ const stored = await WorkerCallerBindingModel.exact.findStoredOne({ id: candidate.id });
158
+ try {
159
+ if (stored) {
160
+ const current = WorkerCallerBindingModel.exact.toPersisted(stored);
161
+ if (current.launchDigest === candidate.launchDigest) {
162
+ // A launch's binding only gains or renews its job; it is never unbound again.
163
+ if (current.binding && !candidate.binding)
164
+ throw new Error('A kept worker caller binding cannot lose its job.');
165
+ const result = await WorkerCallerBindingModel.exact.transition({ current: stored, change: (model) => { Object.assign(model, candidate); } });
166
+ if (result.status !== 'transitioned')
167
+ throw new Error('The kept worker caller binding changed concurrently.');
168
+ return;
169
+ }
170
+ const deleted = await WorkerCallerBindingModel.exact.delete({ current: stored });
171
+ if (deleted.status !== 'deleted')
172
+ throw new Error('The kept worker caller binding changed concurrently.');
173
+ }
174
+ const inserted = await WorkerCallerBindingModel.exact.insert(candidate);
175
+ if (WorkerCallerBindingModel.exact.toPersisted(inserted.document).updateId !== candidate.updateId) {
176
+ throw new Error('Another worker caller binding holds this launch.');
177
+ }
178
+ }
179
+ catch (error) {
180
+ if (!ambiguous(error))
181
+ throw error;
182
+ const after = await WorkerCallerBindingModel.exact.findStoredOne({ id: candidate.id });
183
+ if (!after || WorkerCallerBindingModel.exact.toPersisted(after).updateId !== candidate.updateId) {
184
+ throw new Error('Keeping the worker caller binding has an uncertain outcome.', { cause: error });
185
+ }
186
+ }
187
+ });
188
+ }
189
+ delete(workerIdArg, launchDigestArg) {
190
+ return this.mutate(async () => {
191
+ const stored = await WorkerCallerBindingModel.exact.findStoredOne({ id: workerIdArg });
192
+ if (!stored || launchDigestArg !== undefined && WorkerCallerBindingModel.exact.toPersisted(stored).launchDigest !== launchDigestArg)
193
+ return;
194
+ try {
195
+ const result = await WorkerCallerBindingModel.exact.delete({ current: stored });
196
+ if (result.status !== 'deleted')
197
+ throw new Error('The kept worker caller binding changed concurrently.');
198
+ }
199
+ catch (error) {
200
+ if (!ambiguous(error) || await WorkerCallerBindingModel.exact.findStoredOne({ id: workerIdArg }))
201
+ throw error;
202
+ }
203
+ });
204
+ }
205
+ mutate(operationArg) {
206
+ const task = this.mutationTail.then(operationArg);
207
+ this.mutationTail = task.then(() => undefined, () => undefined);
208
+ return task;
209
+ }
210
+ }
211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53b3JrZXJjYWxsZXJiaW5kaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMud29ya2VyY2FsbGVyYmluZGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBMkN4QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFFBQWdCLEVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekksTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxXQUFtQyxFQUFVLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzVILFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFNBQVM7Q0FBQyxDQUFDLENBQUMsQ0FBQztBQUVuSCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2hFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FB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
@@ -1,6 +1,7 @@
1
- import { type IFleetWorkerCallerHooks, type TFleetWorkerCallerLaunch, type TFleetWorkerCallerBinding, type IWorkerCallerReadiness, type TWorkerCallerEnrollment, type IWorkerCallerEnrollmentResponse, type IConfigurationMaster, type IControllerMcpCaller, type IControllerMcpWireCaller } from '../dist_ts_interfaces/index.js';
1
+ import { type IFleetWorkerCallerHooks, type TFleetWorkerCallerLaunch, type TFleetWorkerCallerBinding, type IWorkerCallerReadiness, type TWorkerCallerEnrollment, type IWorkerCallerEnrollmentResponse, type IConfigurationMaster, type IControllerMcpCaller, type IControllerMcpWireCaller, type IWorkerClaudeJobRequest, type TWorkerClaudeJobObservation } from '../dist_ts_interfaces/index.js';
2
2
  import { ControllerMcpCallerRegistry } from './classes.mcpcallerregistry.js';
3
- import { resolveWorkerBridgeCommand, resolveClaudeWorkerExecutable, verifyClaudeWorkerProcess, verifyWorkerBridge, type IWorkerCallerConnection, type IWorkerProcessSnapshot } from './functions.workerprocessproof.js';
3
+ import { resolveWorkerBridgeCommand, resolveClaudeWorkerExecutable, verifyClaudeWorkerProcess, readWorkerBridge, verifyWorkerBridge, type IWorkerCallerConnection, type IWorkerProcessSnapshot } from './functions.workerprocessproof.js';
4
+ import { type IWorkerCallerBindingStore } from './classes.workercallerbindings.js';
4
5
  export interface IWorkerCodexCallerOrigin {
5
6
  parent: IWorkerProcessSnapshot;
6
7
  isCurrent(): Promise<boolean>;
@@ -18,11 +19,21 @@ export interface IControllerWorkerCallerOptions {
18
19
  harnessId: 'codex';
19
20
  }>): Promise<IWorkerCodexCallerOrigin>;
20
21
  processProof?: IWorkerCallerProcessProof;
22
+ /** Keeps the bindings of fleet Claude launches, so a restarted controller proves their bridges again; absent keeps them in memory. */
23
+ bindings?: IWorkerCallerBindingStore;
24
+ /**
25
+ * A fresh read of the Claude background job a launch is bound to, from the fleet's own inventory, one read at a time.
26
+ * Without it a bridge of a process that replaced the bound one stays pending.
27
+ */
28
+ observeClaudeJob?(request: IWorkerClaudeJobRequest): Promise<TWorkerClaudeJobObservation>;
29
+ /** Where the reason a worker enrollment stays pending is written once; the controller log by default. */
30
+ log?(line: string): void;
21
31
  }
22
32
  export interface IWorkerCallerProcessProof {
23
33
  resolveCommand: typeof resolveWorkerBridgeCommand;
24
34
  resolveClaude: typeof resolveClaudeWorkerExecutable;
25
35
  verifyClaude: typeof verifyClaudeWorkerProcess;
36
+ readBridge: typeof readWorkerBridge;
26
37
  verifyBridge: typeof verifyWorkerBridge;
27
38
  }
28
39
  export declare class ControllerWorkerCallers implements IFleetWorkerCallerHooks {
@@ -30,8 +41,15 @@ export declare class ControllerWorkerCallers implements IFleetWorkerCallerHooks
30
41
  private readonly launches;
31
42
  private readonly sessions;
32
43
  private readonly challenges;
44
+ /** Each worker's current launch, prepared by this controller or kept from before its restart. */
45
+ private readonly workers;
46
+ /** Per worker, the chain its kept binding's writes, deletion and restoration run on, one at a time. */
47
+ private readonly workerTails;
48
+ /** Pending reasons logged for launches this controller does not hold, by launch digest and reason. */
49
+ private readonly loggedUnknown;
33
50
  private closed;
34
51
  private readonly proof;
52
+ private readonly log;
35
53
  constructor(options: IControllerWorkerCallerOptions);
36
54
  prepareWorkerCaller(launchArg: TFleetWorkerCallerLaunch): ReturnType<IFleetWorkerCallerHooks['prepareWorkerCaller']>;
37
55
  bindWorkerCaller(bindingArg: TFleetWorkerCallerBinding): ReturnType<IFleetWorkerCallerHooks['bindWorkerCaller']>;
@@ -40,6 +58,49 @@ export declare class ControllerWorkerCallers implements IFleetWorkerCallerHooks
40
58
  enroll(requestArg: TWorkerCallerEnrollment, connectionArg?: IWorkerCallerConnection): Promise<IWorkerCallerEnrollmentResponse>;
41
59
  admit(wireArg: IControllerMcpWireCaller | undefined, connectionArg?: IWorkerCallerConnection): Promise<IWorkerCallerLease>;
42
60
  close(): Promise<void>;
61
+ /**
62
+ * Binds `recordArg` to `bindingArg`, inside its serial chain: a Claude launch to its background job and, when it has
63
+ * one, the job's process; a Codex launch to its thread on the proved origin. The kept binding is written first.
64
+ */
65
+ private bind;
66
+ /**
67
+ * Enrolls the bridge of a Claude launch: against the process the launch is bound to, or, when that process is gone or
68
+ * replaced, after the fleet proved the bridge's process to be the next process of the same job.
69
+ */
70
+ private enrollClaude;
71
+ /**
72
+ * Proves the bridge's process to be the current process of the job the launch is bound to, from a fresh inventory the
73
+ * fleet reads, and binds the launch to it at the current revision. A bridge refused for good is remembered for its
74
+ * process's life, one refused for a reason that may pass for a short while; neither is proved again at every call.
75
+ */
76
+ private reprove;
77
+ /** Whether the Claude process `processArg` the launch was proved against still runs, unchanged. */
78
+ private processStands;
79
+ /**
80
+ * The launch a restarted controller kept for a bridge that presents it, as it was bound: found by its id's digest,
81
+ * checked against its generation's, and only while it is still its worker's current launch. It is restored
82
+ * unverified: its bridge enrolls only after a fresh inventory shows the job still the worker's, in the kept process
83
+ * when that still runs unchanged, or in the bridge's process, which then proves itself as the job's next process.
84
+ */
85
+ private restore;
86
+ /** The kept process of a restored launch while it still runs as it was proved: the same PID, start and snapshot. */
87
+ private keptProcess;
88
+ /** Keeps the binding of a Claude launch at `revisionArg`: prepared, or bound to `bindingArg`. Refused once the launch is revoked. */
89
+ private keep;
90
+ /** The one non-secret stdio `agl` MCP server the Configuration master defines for `harnessArg`. */
91
+ private approvedServer;
92
+ /** The bridge command this controller approves now for Claude launches, resolved from its own configured `agl` entry. */
93
+ private currentCommand;
94
+ /** Runs `operationArg` on the worker's chain: kept-binding writes, deletion and restoration of one worker never interleave. */
95
+ private withWorker;
96
+ /** Whether the launch was revoked, also by this controller closing; a method, so a check after an await reads the state again. */
97
+ private revoked;
98
+ private markRevoked;
99
+ private settleRevocation;
100
+ /** Writes once per launch and reason why its bridge's enrollment stays pending; never a credential or the launch id. */
101
+ private logPending;
102
+ /** As `logPending`, for a launch this controller does not hold. */
103
+ private logUnknown;
43
104
  private enrollCredential;
44
105
  private challenge;
45
106
  private runChallenge;