@noopolis/daimon 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/contracts/attentionContract.d.ts +25 -0
- package/dist/contracts/attentionContract.d.ts.map +1 -1
- package/dist/contracts/attentionContract.js +8 -1
- package/dist/contracts/grokBrokerTaskClock.d.ts +18 -0
- package/dist/contracts/grokBrokerTaskClock.d.ts.map +1 -0
- package/dist/contracts/grokBrokerTaskClock.js +16 -0
- package/dist/contracts/organizationRuntimeContract.d.ts +76 -0
- package/dist/contracts/organizationRuntimeContract.d.ts.map +1 -1
- package/dist/contracts/organizationRuntimeContract.js +2 -0
- package/dist/contracts/runtimeContractManifest.d.ts +222 -15
- package/dist/contracts/runtimeContractManifest.d.ts.map +1 -1
- package/dist/contracts/runtimeContractManifest.js +35 -10
- package/dist/contracts/shellEnvironmentPolicy.d.ts +3 -0
- package/dist/contracts/shellEnvironmentPolicy.d.ts.map +1 -0
- package/dist/contracts/shellEnvironmentPolicy.js +5 -0
- package/dist/contracts/wakeMomentContract.d.ts +61 -0
- package/dist/contracts/wakeMomentContract.d.ts.map +1 -0
- package/dist/contracts/wakeMomentContract.js +27 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/examples/jungianPlayAgent.d.ts +1 -0
- package/dist/examples/jungianPlayAgent.d.ts.map +1 -1
- package/dist/examples/jungianPlayAgent.js +6 -2
- package/dist/observability/causalEvents.d.ts +3 -3
- package/dist/observability/causalEvents.d.ts.map +1 -1
- package/dist/observability/causalEvents.js +4 -4
- package/dist/pi/cliEngineSpawn.d.ts +2 -2
- package/dist/pi/cliEngineSpawn.d.ts.map +1 -1
- package/dist/pi/cliEngineSpawn.js +7 -2
- package/dist/pi/cliEnvironment.d.ts.map +1 -1
- package/dist/pi/cliEnvironment.js +2 -0
- package/dist/pi/cliMcpRegistration.d.ts +1 -1
- package/dist/pi/cliMcpRegistration.d.ts.map +1 -1
- package/dist/pi/cliMcpRegistration.js +1 -1
- package/dist/pi/cliSession.d.ts +2 -0
- package/dist/pi/cliSession.d.ts.map +1 -1
- package/dist/pi/cliSession.js +3 -80
- package/dist/pi/cliSessionMcp.d.ts +9 -0
- package/dist/pi/cliSessionMcp.d.ts.map +1 -0
- package/dist/pi/cliSessionMcp.js +80 -0
- package/dist/pi/engineTaskClock.d.ts +9 -0
- package/dist/pi/engineTaskClock.d.ts.map +1 -0
- package/dist/pi/engineTaskClock.js +28 -0
- package/dist/pi/grokHomeMcpRegistration.d.ts.map +1 -1
- package/dist/pi/grokHomeMcpRegistration.js +2 -1
- package/dist/pi/grokSandbox.js +1 -1
- package/dist/pi/memoryClock.d.ts +25 -0
- package/dist/pi/memoryClock.d.ts.map +1 -0
- package/dist/pi/memoryClock.js +18 -0
- package/dist/pi/piAgentHandle.d.ts +3 -1
- package/dist/pi/piAgentHandle.d.ts.map +1 -1
- package/dist/pi/piAgentHandle.js +5 -2
- package/dist/pi/piHarness.d.ts +8 -2
- package/dist/pi/piHarness.d.ts.map +1 -1
- package/dist/pi/piHarness.js +28 -12
- package/dist/pi/taskClockProcess.d.ts +6 -0
- package/dist/pi/taskClockProcess.d.ts.map +1 -0
- package/dist/pi/taskClockProcess.js +8 -0
- package/dist/pi/turnCausal.d.ts +4 -2
- package/dist/pi/turnCausal.d.ts.map +1 -1
- package/dist/pi/turnCausal.js +4 -4
- package/dist/pi/wakeAcceptance.d.ts +1 -1
- package/dist/pi/wakeAcceptance.d.ts.map +1 -1
- package/dist/pi/wakeAcceptance.js +2 -2
- package/dist/runtime/agySubscriptionBootstrap.js +1 -1
- package/dist/runtime/agySubscriptionRealm.js +1 -1
- package/dist/runtime/attention.d.ts +5 -0
- package/dist/runtime/attention.d.ts.map +1 -1
- package/dist/runtime/attention.js +14 -1
- package/dist/runtime/attentionDispatcher.d.ts +14 -2
- package/dist/runtime/attentionDispatcher.d.ts.map +1 -1
- package/dist/runtime/attentionDispatcher.js +127 -33
- package/dist/runtime/cli.js +5 -0
- package/dist/runtime/contract-manifest.json +1 -1
- package/dist/runtime/contract-manifest.sha256 +1 -1
- package/dist/runtime/engineBrokerCapabilities.d.ts +10 -0
- package/dist/runtime/engineBrokerCapabilities.d.ts.map +1 -1
- package/dist/runtime/engineBrokerCapabilities.js +10 -0
- package/dist/runtime/engineBrokerControlClient.d.ts +12 -1
- package/dist/runtime/engineBrokerControlClient.d.ts.map +1 -1
- package/dist/runtime/engineBrokerControlClient.js +139 -43
- package/dist/runtime/engineBrokerCredentialJournal.d.ts +2 -0
- package/dist/runtime/engineBrokerCredentialJournal.d.ts.map +1 -1
- package/dist/runtime/engineBrokerCredentialJournal.js +9 -0
- package/dist/runtime/engineBrokerInferenceProtocol.d.ts +3 -2
- package/dist/runtime/engineBrokerInferenceProtocol.d.ts.map +1 -1
- package/dist/runtime/engineBrokerInferenceProtocol.js +4 -4
- package/dist/runtime/engineBrokerMcpCallLog.d.ts +11 -0
- package/dist/runtime/engineBrokerMcpCallLog.d.ts.map +1 -1
- package/dist/runtime/engineBrokerMcpCallLog.js +13 -1
- package/dist/runtime/engineBrokerMcpFacade.d.ts +5 -2
- package/dist/runtime/engineBrokerMcpFacade.d.ts.map +1 -1
- package/dist/runtime/engineBrokerMcpFacade.js +5 -2
- package/dist/runtime/engineBrokerNativeClient.js +2 -2
- package/dist/runtime/engineBrokerProtocol.d.ts +42 -10
- package/dist/runtime/engineBrokerProtocol.d.ts.map +1 -1
- package/dist/runtime/engineBrokerProtocol.js +97 -14
- package/dist/runtime/engineBrokerSealLedger.d.ts.map +1 -1
- package/dist/runtime/engineBrokerSealLedger.js +9 -0
- package/dist/runtime/engineBrokerService.d.ts +8 -2
- package/dist/runtime/engineBrokerService.d.ts.map +1 -1
- package/dist/runtime/engineBrokerService.js +95 -37
- package/dist/runtime/engineBrokerServiceCli.js +1 -1
- package/dist/runtime/engineBrokerServiceConfig.d.ts +5 -0
- package/dist/runtime/engineBrokerServiceConfig.d.ts.map +1 -1
- package/dist/runtime/engineBrokerServiceConfig.js +47 -9
- package/dist/runtime/engineBrokerTurnRegistry.d.ts +1 -1
- package/dist/runtime/engineBrokerTurnRegistry.d.ts.map +1 -1
- package/dist/runtime/engineBrokerTurnRegistry.js +7 -6
- package/dist/runtime/engineDispatcher.d.ts +2 -0
- package/dist/runtime/engineDispatcher.d.ts.map +1 -1
- package/dist/runtime/engineDispatcher.js +14 -2
- package/dist/runtime/engineReadiness.js +1 -1
- package/dist/runtime/grokBrokerCredentialAuthority.d.ts +1 -0
- package/dist/runtime/grokBrokerCredentialAuthority.d.ts.map +1 -1
- package/dist/runtime/grokBrokerCredentialAuthority.js +48 -22
- package/dist/runtime/grokBrokerCredentialReader.d.ts +1 -0
- package/dist/runtime/grokBrokerCredentialReader.d.ts.map +1 -1
- package/dist/runtime/grokBrokerCredentialReader.js +2 -1
- package/dist/runtime/grokBrokerProjection.d.ts +9 -1
- package/dist/runtime/grokBrokerProjection.d.ts.map +1 -1
- package/dist/runtime/grokBrokerProjection.js +11 -4
- package/dist/runtime/grokBrokerProviderClock.d.ts +26 -0
- package/dist/runtime/grokBrokerProviderClock.d.ts.map +1 -0
- package/dist/runtime/grokBrokerProviderClock.js +133 -0
- package/dist/runtime/grokBrokerProxy.d.ts +17 -3
- package/dist/runtime/grokBrokerProxy.d.ts.map +1 -1
- package/dist/runtime/grokBrokerProxy.js +73 -9
- package/dist/runtime/grokBrokerProxyJson.d.ts +10 -0
- package/dist/runtime/grokBrokerProxyJson.d.ts.map +1 -0
- package/dist/runtime/grokBrokerProxyJson.js +31 -0
- package/dist/runtime/grokBrokerProxyRequest.d.ts.map +1 -1
- package/dist/runtime/grokBrokerProxyRequest.js +17 -6
- package/dist/runtime/grokBrokerRealmLease.js +1 -1
- package/dist/runtime/grokBrokerRefresh.js +1 -1
- package/dist/runtime/grokBrokerRunBudget.d.ts +20 -0
- package/dist/runtime/grokBrokerRunBudget.d.ts.map +1 -0
- package/dist/runtime/grokBrokerRunBudget.js +85 -0
- package/dist/runtime/grokBrokerSlot.d.ts +6 -0
- package/dist/runtime/grokBrokerSlot.d.ts.map +1 -0
- package/dist/runtime/grokBrokerSlot.js +21 -0
- package/dist/runtime/grokBrokerTaskClock.d.ts +32 -0
- package/dist/runtime/grokBrokerTaskClock.d.ts.map +1 -0
- package/dist/runtime/grokBrokerTaskClock.js +120 -0
- package/dist/runtime/grokBrokerTurnMeter.d.ts +55 -3
- package/dist/runtime/grokBrokerTurnMeter.d.ts.map +1 -1
- package/dist/runtime/grokBrokerTurnMeter.js +90 -4
- package/dist/runtime/grokBrokerWorkerConfig.d.ts +5 -2
- package/dist/runtime/grokBrokerWorkerConfig.d.ts.map +1 -1
- package/dist/runtime/grokBrokerWorkerConfig.js +22 -3
- package/dist/runtime/grokEngineBroker.d.ts +43 -3
- package/dist/runtime/grokEngineBroker.d.ts.map +1 -1
- package/dist/runtime/grokEngineBroker.js +159 -71
- package/dist/runtime/grokEngineBrokerTurn.d.ts +32 -8
- package/dist/runtime/grokEngineBrokerTurn.d.ts.map +1 -1
- package/dist/runtime/grokEngineBrokerTurn.js +204 -21
- package/dist/runtime/grokEngineBrokerTurnEnd.d.ts +88 -0
- package/dist/runtime/grokEngineBrokerTurnEnd.d.ts.map +1 -0
- package/dist/runtime/grokEngineBrokerTurnEnd.js +148 -0
- package/dist/runtime/grokInferenceProxy.d.ts.map +1 -1
- package/dist/runtime/grokInferenceProxy.js +3 -0
- package/dist/runtime/grokSubscriptionRealm.js +1 -1
- package/dist/runtime/grokWorkerAttestation.d.ts +9 -4
- package/dist/runtime/grokWorkerAttestation.d.ts.map +1 -1
- package/dist/runtime/grokWorkerAttestation.js +2 -2
- package/dist/runtime/grokWorkerHomeAttestation.d.ts +4 -2
- package/dist/runtime/grokWorkerHomeAttestation.d.ts.map +1 -1
- package/dist/runtime/grokWorkerHomeAttestation.js +10 -4
- package/dist/runtime/index.d.ts +7 -2
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +5 -1
- package/dist/runtime/native/daimon-engine-broker +0 -0
- package/dist/runtime/organizationRuntime.d.ts +3 -0
- package/dist/runtime/organizationRuntime.d.ts.map +1 -1
- package/dist/runtime/organizationRuntimeAdmission.d.ts +6 -0
- package/dist/runtime/organizationRuntimeAdmission.d.ts.map +1 -0
- package/dist/runtime/organizationRuntimeAdmission.js +22 -0
- package/dist/runtime/organizationRuntimeControl.d.ts +9 -0
- package/dist/runtime/organizationRuntimeControl.d.ts.map +1 -1
- package/dist/runtime/organizationRuntimeControl.js +72 -24
- package/dist/runtime/organizationRuntimeHost.d.ts.map +1 -1
- package/dist/runtime/organizationRuntimeHost.js +13 -4
- package/dist/runtime/organizationRuntimeParsing.d.ts.map +1 -1
- package/dist/runtime/organizationRuntimeParsing.js +4 -1
- package/dist/runtime/organizationRuntimeReadiness.d.ts.map +1 -1
- package/dist/runtime/organizationRuntimeReadiness.js +8 -0
- package/dist/runtime/organizationRuntimeRecording.d.ts +7 -0
- package/dist/runtime/organizationRuntimeRecording.d.ts.map +1 -0
- package/dist/runtime/organizationRuntimeRecording.js +58 -0
- package/dist/runtime/physicalReadiness.d.ts +12 -0
- package/dist/runtime/physicalReadiness.d.ts.map +1 -1
- package/dist/runtime/physicalReadiness.js +43 -9
- package/dist/runtime/productionAgentTools.d.ts.map +1 -1
- package/dist/runtime/productionAgentTools.js +13 -5
- package/dist/runtime/relocateRuntimeConfig.d.ts +14 -0
- package/dist/runtime/relocateRuntimeConfig.d.ts.map +1 -0
- package/dist/runtime/relocateRuntimeConfig.js +38 -0
- package/dist/runtime/schedule.d.ts.map +1 -1
- package/dist/runtime/schedule.js +12 -7
- package/dist/runtime/storeCoordination.d.ts +10 -0
- package/dist/runtime/storeCoordination.d.ts.map +1 -1
- package/dist/runtime/storeCoordination.js +23 -0
- package/dist/runtime/taskClock.d.ts +42 -0
- package/dist/runtime/taskClock.d.ts.map +1 -0
- package/dist/runtime/taskClock.js +102 -0
- package/dist/runtime/taskClockProcess.d.ts +17 -0
- package/dist/runtime/taskClockProcess.d.ts.map +1 -0
- package/dist/runtime/taskClockProcess.js +58 -0
- package/dist/runtime/turnRequestLedger.d.ts +0 -5
- package/dist/runtime/turnRequestLedger.d.ts.map +1 -1
- package/dist/runtime/turnRequestLedger.js +23 -21
- package/dist/runtime/wakeAcceptanceClaimDiagnostics.d.ts +34 -0
- package/dist/runtime/wakeAcceptanceClaimDiagnostics.d.ts.map +1 -0
- package/dist/runtime/wakeAcceptanceClaimDiagnostics.js +79 -0
- package/dist/runtime/wakeAcceptanceIndex.d.ts +55 -0
- package/dist/runtime/wakeAcceptanceIndex.d.ts.map +1 -0
- package/dist/runtime/wakeAcceptanceIndex.js +158 -0
- package/dist/runtime/wakeAcceptanceProcessIdentity.d.ts +9 -1
- package/dist/runtime/wakeAcceptanceProcessIdentity.d.ts.map +1 -1
- package/dist/runtime/wakeAcceptanceProcessIdentity.js +5 -1
- package/dist/runtime/wakeAcceptanceRecord.d.ts +2 -0
- package/dist/runtime/wakeAcceptanceRecord.d.ts.map +1 -1
- package/dist/runtime/wakeAcceptanceRecord.js +4 -2
- package/dist/runtime/wakeAcceptanceRetention.d.ts +25 -1
- package/dist/runtime/wakeAcceptanceRetention.d.ts.map +1 -1
- package/dist/runtime/wakeAcceptanceRetention.js +28 -2
- package/dist/runtime/wakeAcceptanceStore.d.ts +8 -8
- package/dist/runtime/wakeAcceptanceStore.d.ts.map +1 -1
- package/dist/runtime/wakeAcceptanceStore.js +66 -63
- package/dist/runtime/wakeFuse.d.ts +58 -3
- package/dist/runtime/wakeFuse.d.ts.map +1 -1
- package/dist/runtime/wakeFuse.js +106 -7
- package/dist/runtime/wakeMomentFs.d.ts +27 -0
- package/dist/runtime/wakeMomentFs.d.ts.map +1 -0
- package/dist/runtime/wakeMomentFs.js +223 -0
- package/dist/runtime/wakeMomentHistory.d.ts +26 -0
- package/dist/runtime/wakeMomentHistory.d.ts.map +1 -0
- package/dist/runtime/wakeMomentHistory.js +109 -0
- package/dist/runtime/wakeMomentIo.d.ts +22 -0
- package/dist/runtime/wakeMomentIo.d.ts.map +1 -0
- package/dist/runtime/wakeMomentIo.js +114 -0
- package/dist/runtime/wakeMomentRecorder.d.ts +33 -0
- package/dist/runtime/wakeMomentRecorder.d.ts.map +1 -0
- package/dist/runtime/wakeMomentRecorder.js +81 -0
- package/dist/runtime/wakeMomentRetention.d.ts +7 -0
- package/dist/runtime/wakeMomentRetention.d.ts.map +1 -0
- package/dist/runtime/wakeMomentRetention.js +143 -0
- package/dist/runtime/wakeMomentRows.d.ts +8 -0
- package/dist/runtime/wakeMomentRows.d.ts.map +1 -0
- package/dist/runtime/wakeMomentRows.js +66 -0
- package/dist/runtime/wakeMomentSnapshot.d.ts +56 -0
- package/dist/runtime/wakeMomentSnapshot.d.ts.map +1 -0
- package/dist/runtime/wakeMomentSnapshot.js +248 -0
- package/package.json +4 -4
|
@@ -1,96 +1,141 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { rm } from "node:fs/promises";
|
|
3
|
+
import { assertBrokerTaskClockIsolation, brokerTaskClockFileFor } from "./grokBrokerSlot.js";
|
|
4
|
+
import { needsBrokerTaskClockReconciliation, writeBrokerTaskClock } from "./grokBrokerTaskClock.js";
|
|
1
5
|
import { DurableGrokBrokerCredentialAuthority } from "./grokBrokerCredentialAuthority.js";
|
|
2
6
|
import { runNativeBrokerTurn } from "./engineBrokerNativeClient.js";
|
|
7
|
+
import { ENGINE_BROKER_TASK_CLOCK_RESET_FAILED } from "./engineBrokerProtocol.js";
|
|
3
8
|
import { EngineBrokerTurnRegistry } from "./engineBrokerTurnRegistry.js";
|
|
9
|
+
import { GrokBrokerRunBudget } from "./grokBrokerRunBudget.js";
|
|
4
10
|
import { startGrokBrokerProxy } from "./grokBrokerProxy.js";
|
|
5
11
|
import { startEngineBrokerMcpFacade } from "./engineBrokerMcpFacade.js";
|
|
6
12
|
import { acquireGrokBrokerRealmLease } from "./grokBrokerRealmLease.js";
|
|
7
|
-
import {
|
|
13
|
+
import { grokBrokerWorkerConfigPins } from "./grokBrokerWorkerConfig.js";
|
|
8
14
|
import { parseGrokBrokerModelPolicy } from "./grokBrokerModelPolicy.js";
|
|
9
|
-
import { runGrokEngineBrokerTurn } from "./grokEngineBrokerTurn.js";
|
|
15
|
+
import { EngineBrokerTurnFailure, runGrokEngineBrokerTurn } from "./grokEngineBrokerTurn.js";
|
|
10
16
|
import { createGrokWorkerIsolationGuard, grokBrokerAttestationInput, prepareGrokWorkerAttestation } from "./grokWorkerAttestation.js";
|
|
17
|
+
import { awaitGrokWorkerIdentityEmpty, GROK_WORKER_REAP_WAIT_MS, grokWorkerIdentityEmpty } from "./grokEngineBrokerTurnEnd.js";
|
|
11
18
|
import { createLedgeredGrokInferenceGrants, GrokInferenceGrantRefused } from "./grokInferenceGrants.js";
|
|
12
19
|
export { EngineBrokerTurnFailure } from "./grokEngineBrokerTurn.js";
|
|
13
20
|
export { finishBrokerTurnWithUsage } from "./grokEngineBrokerMetering.js";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
const brokerDependencies = {
|
|
22
|
+
acquireLease: acquireGrokBrokerRealmLease,
|
|
23
|
+
createAuthority: (command, home) => new DurableGrokBrokerCredentialAuthority(command, home),
|
|
24
|
+
startProxy: startGrokBrokerProxy,
|
|
25
|
+
startMcp: startEngineBrokerMcpFacade,
|
|
26
|
+
prepareAttestation: prepareGrokWorkerAttestation,
|
|
27
|
+
needsTaskClockReconciliation: needsBrokerTaskClockReconciliation,
|
|
28
|
+
createIsolationGuard: createGrokWorkerIsolationGuard,
|
|
29
|
+
writeTaskClock: writeBrokerTaskClock,
|
|
30
|
+
workerIdentityEmpty: (uid) => grokWorkerIdentityEmpty(uid, undefined, true),
|
|
31
|
+
runNative: runNativeBrokerTurn
|
|
32
|
+
};
|
|
33
|
+
export async function startGrokEngineBroker(options, dependencies = brokerDependencies) {
|
|
34
|
+
const registrations = new Map(options.registrations.map((entry) => [
|
|
35
|
+
entry.slot, { ...entry, model: parseGrokBrokerModelPolicy(entry.model) }
|
|
36
|
+
]));
|
|
37
|
+
if (registrations.size !== options.registrations.length || new Set(options.registrations.map((entry) => entry.workerUid)).size !== options.registrations.length)
|
|
28
38
|
throw new Error("engine broker registration conflict");
|
|
29
|
-
const attestationFor = (registration) => grokBrokerAttestationInput(registration, [...registrations.values()],
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
const lease = await
|
|
33
|
-
const authority =
|
|
34
|
-
try {
|
|
35
|
-
await authority.initialize();
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
await lease.close();
|
|
39
|
-
throw error;
|
|
40
|
-
}
|
|
39
|
+
const attestationFor = (registration) => grokBrokerAttestationInput(registration, [...registrations.values()], grokBrokerWorkerConfigPins(registration.model, registration.slot));
|
|
40
|
+
const grants = options.inferenceLedgerPath === undefined
|
|
41
|
+
? undefined : createLedgeredGrokInferenceGrants(options.inferenceLedgerPath);
|
|
42
|
+
const lease = await dependencies.acquireLease(options.credentialHome);
|
|
43
|
+
const authority = dependencies.createAuthority(options.grokCommand, options.credentialHome);
|
|
41
44
|
let proxy;
|
|
42
|
-
try {
|
|
43
|
-
proxy = await startGrokBrokerProxy(authority, undefined, undefined, undefined, grants);
|
|
44
|
-
}
|
|
45
|
-
catch (error) {
|
|
46
|
-
await lease.close();
|
|
47
|
-
throw error;
|
|
48
|
-
}
|
|
49
45
|
let mcp;
|
|
46
|
+
let runBudget;
|
|
47
|
+
const clockedSlots = new Set();
|
|
50
48
|
try {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
// Reconcile before accepting traffic. A prior broker may have died after
|
|
50
|
+
// publishing an offset; its finally never ran. The realm lease excludes peers.
|
|
51
|
+
for (const registration of registrations.values()) {
|
|
52
|
+
const attestation = attestationFor(registration);
|
|
53
|
+
if (!await dependencies.needsTaskClockReconciliation(registration.profilePath, attestation.configSha256, brokerTaskClockFileFor(registration.slot)))
|
|
54
|
+
continue;
|
|
55
|
+
const snapshot = await dependencies.prepareAttestation(attestation);
|
|
56
|
+
assertBrokerTaskClockIsolation(snapshot.configVariant, registration.slot, [...registrations.keys()], snapshot.denyPaths);
|
|
57
|
+
const reaped = await awaitGrokWorkerIdentityEmpty(registration.workerUid, GROK_WORKER_REAP_WAIT_MS, dependencies.workerIdentityEmpty);
|
|
58
|
+
if (!reaped)
|
|
59
|
+
throw new Error("Grok broker task clock worker did not terminate");
|
|
60
|
+
await dependencies.writeTaskClock(undefined, brokerTaskClockFileFor(registration.slot));
|
|
61
|
+
clockedSlots.add(registration.slot);
|
|
62
|
+
}
|
|
63
|
+
await authority.initialize();
|
|
64
|
+
runBudget = options.maxRunRequests === undefined ? undefined :
|
|
65
|
+
await GrokBrokerRunBudget.open(options.maxRunRequests, path.join(options.runRequestStore ?? options.turnStore, "run-requests.json"));
|
|
66
|
+
proxy = await dependencies.startProxy(authority, undefined, undefined, undefined, grants, runBudget);
|
|
67
|
+
mcp = await dependencies.startMcp();
|
|
54
68
|
}
|
|
55
69
|
catch (error) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
await
|
|
59
|
-
await lease.close();
|
|
70
|
+
grants?.close();
|
|
71
|
+
await Promise.allSettled([mcp?.close(), proxy?.close(), runBudget?.close()]);
|
|
72
|
+
await Promise.allSettled([lease.close()]);
|
|
60
73
|
throw error;
|
|
61
74
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const turns = new EngineBrokerTurnRegistry(options.turnStore);
|
|
75
|
+
const slotStore = (slot) => path.join(options.turnStore, `slot-${slot}`);
|
|
76
|
+
const turnStores = new Map([...registrations.keys()].map((slot) => [slot, new EngineBrokerTurnRegistry(slotStore(slot))]));
|
|
65
77
|
const active = new Map();
|
|
66
78
|
let closed = false;
|
|
79
|
+
const clockFailed = new Set();
|
|
80
|
+
const resetting = new Set();
|
|
81
|
+
const resets = new Map();
|
|
67
82
|
const facade = mcp;
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
83
|
+
const provider = proxy;
|
|
84
|
+
const depsFor = (registration) => ({
|
|
85
|
+
turns: turnStores.get(registration.slot), proxy: provider, mcp: facade, credentialStale: () => authority.isStale(),
|
|
86
|
+
clockedSlot: clockedSlots.has(registration.slot),
|
|
87
|
+
writeTaskClock: (value) => dependencies.writeTaskClock(value, brokerTaskClockFileFor(registration.slot)),
|
|
88
|
+
workerIdentityEmpty: dependencies.workerIdentityEmpty,
|
|
89
|
+
taskClockFailed: () => { clockFailed.add(registration.slot); },
|
|
90
|
+
prepareIsolation: async (registration) => {
|
|
91
|
+
const attestation = attestationFor(registration);
|
|
92
|
+
const snapshot = await dependencies.prepareAttestation(attestation);
|
|
93
|
+
assertBrokerTaskClockIsolation(snapshot.configVariant, registration.slot, [...registrations.keys()], snapshot.denyPaths);
|
|
94
|
+
if (snapshot.configVariant === "clocked")
|
|
95
|
+
clockedSlots.add(registration.slot);
|
|
96
|
+
return {
|
|
97
|
+
guard: dependencies.createIsolationGuard(attestation, snapshot),
|
|
98
|
+
configVariant: snapshot.configVariant
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
runNative: (input, signal) => dependencies.runNative(options.nativeClient, input, signal)
|
|
102
|
+
});
|
|
73
103
|
return {
|
|
74
|
-
|
|
75
|
-
if (
|
|
104
|
+
turn: createGrokEngineBrokerTurnDispatch(registrations, active, () => closed, async (registration, ...args) => {
|
|
105
|
+
if (clockFailed.has(registration.slot))
|
|
106
|
+
throw new EngineBrokerTurnFailure("unavailable", undefined, { outcome: "failed", usage: null, model: registration.model.model, requests: 0, limitReason: "none" }, undefined, undefined, undefined, ENGINE_BROKER_TASK_CLOCK_RESET_FAILED);
|
|
107
|
+
return runGrokEngineBrokerTurn(depsFor(registration), registration, ...args);
|
|
108
|
+
}, resetting),
|
|
109
|
+
async resetSlot(slot) {
|
|
110
|
+
const registration = registrations.get(slot);
|
|
111
|
+
if (closed || registration === undefined)
|
|
76
112
|
throw new Error("engine broker unavailable");
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
113
|
+
if (active.has(slot) || resetting.has(slot))
|
|
114
|
+
throw new Error("engine broker slot busy");
|
|
115
|
+
resetting.add(slot);
|
|
116
|
+
const reset = (async () => {
|
|
117
|
+
try {
|
|
118
|
+
const empty = await awaitGrokWorkerIdentityEmpty(registration.workerUid, GROK_WORKER_REAP_WAIT_MS, dependencies.workerIdentityEmpty);
|
|
119
|
+
if (!empty)
|
|
120
|
+
throw new Error("engine broker slot busy");
|
|
121
|
+
if (clockedSlots.has(slot))
|
|
122
|
+
await dependencies.writeTaskClock(undefined, brokerTaskClockFileFor(slot));
|
|
123
|
+
await rm(slotStore(slot), { recursive: true, force: true });
|
|
124
|
+
turnStores.set(slot, new EngineBrokerTurnRegistry(slotStore(slot)));
|
|
125
|
+
clockFailed.delete(slot);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
clockFailed.add(slot);
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
})();
|
|
132
|
+
resets.set(slot, reset);
|
|
88
133
|
try {
|
|
89
|
-
|
|
134
|
+
await reset;
|
|
90
135
|
}
|
|
91
136
|
finally {
|
|
92
|
-
|
|
93
|
-
|
|
137
|
+
resetting.delete(slot);
|
|
138
|
+
resets.delete(slot);
|
|
94
139
|
}
|
|
95
140
|
},
|
|
96
141
|
requestInferenceGrant(request) {
|
|
@@ -105,10 +150,53 @@ export async function startGrokEngineBroker(options) {
|
|
|
105
150
|
throw new GrokInferenceGrantRefused("unavailable");
|
|
106
151
|
return grants.release(grantId);
|
|
107
152
|
},
|
|
108
|
-
async close() {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
153
|
+
async close() {
|
|
154
|
+
if (closed)
|
|
155
|
+
return;
|
|
156
|
+
closed = true;
|
|
157
|
+
grants?.close();
|
|
158
|
+
const running = [...active.values()];
|
|
159
|
+
for (const entry of running)
|
|
160
|
+
entry.controller.abort();
|
|
161
|
+
await Promise.allSettled([...running.map((entry) => entry.done), ...resets.values()]);
|
|
162
|
+
const results = await Promise.allSettled([facade.close(), provider.close(), runBudget?.close()]);
|
|
163
|
+
results.push(...await Promise.allSettled([lease.close()]));
|
|
164
|
+
const failures = results.flatMap((entry) => entry.status === "rejected" ? [entry.reason] : []);
|
|
165
|
+
if (failures.length)
|
|
166
|
+
throw new AggregateError(failures, "engine broker shutdown failed");
|
|
167
|
+
},
|
|
168
|
+
readiness: () => ({
|
|
169
|
+
providerProxyPort: provider.port, mcpFacadePort: 43_124, registrations: registrations.size,
|
|
170
|
+
credentialStale: authority.isStale(), realmLease: true, workerIsolation: clockFailed.size === 0
|
|
171
|
+
})
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/** The production dispatch boundary, isolated from credential/network setup for lifecycle tests. */
|
|
175
|
+
export function createGrokEngineBrokerTurnDispatch(registrations, active, isClosed, run, resetting = new Set()) {
|
|
176
|
+
return async (agentId, ...input) => {
|
|
177
|
+
const [wakeId, prompt, mcpEndpoint, signal_, limits, processClock, requestedSlot] = input;
|
|
178
|
+
const matches = [...registrations.values()].filter((entry) => entry.agentId === agentId);
|
|
179
|
+
const registration = requestedSlot === undefined ? (matches.length === 1 ? matches[0] : undefined) : registrations.get(requestedSlot);
|
|
180
|
+
const args = [wakeId, prompt, mcpEndpoint, signal_, limits, processClock];
|
|
181
|
+
if (isClosed() || registration === undefined || registration.agentId !== agentId)
|
|
182
|
+
throw new Error("engine broker unavailable");
|
|
183
|
+
const slot = registration.slot;
|
|
184
|
+
if (active.has(slot) || resetting.has(slot))
|
|
185
|
+
throw new Error("engine broker slot already active");
|
|
186
|
+
const signal = args[3], controller = new AbortController();
|
|
187
|
+
const onAbort = () => controller.abort();
|
|
188
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
189
|
+
if (signal?.aborted)
|
|
190
|
+
controller.abort();
|
|
191
|
+
args[3] = controller.signal;
|
|
192
|
+
const done = Promise.resolve().then(() => run(registration, ...args));
|
|
193
|
+
active.set(slot, { controller, done: done.then(() => undefined, () => undefined) });
|
|
194
|
+
try {
|
|
195
|
+
return await done;
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
signal?.removeEventListener("abort", onAbort);
|
|
199
|
+
active.delete(slot);
|
|
200
|
+
}
|
|
113
201
|
};
|
|
114
202
|
}
|
|
@@ -1,29 +1,37 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { GrokWorkerConfigVariant } from "../contracts/grokBrokerTaskClock.js";
|
|
2
|
+
import { writeBrokerTaskClock, type BrokerShellClock, type BrokerClockObservation } from "./grokBrokerTaskClock.js";
|
|
3
|
+
import { type GrokBrokerProviderClockObservation } from "./grokBrokerProviderClock.js";
|
|
4
|
+
import { type EngineBrokerCleanupObservation, type EngineBrokerFailureCode } from "./engineBrokerProtocol.js";
|
|
2
5
|
import type { EngineBrokerMcpCallObservation } from "./engineBrokerMcpCallLog.js";
|
|
3
6
|
import { type EngineBrokerTurnAccounting, type EngineBrokerTurnLimitOverrides } from "./engineBrokerTurnAccounting.js";
|
|
4
7
|
import { type NativeBrokerDiagnostic, type NativeBrokerTurn, type NativeBrokerTurnResult } from "./engineBrokerNativeClient.js";
|
|
5
8
|
import type { EngineBrokerTurnRegistry } from "./engineBrokerTurnRegistry.js";
|
|
6
9
|
import { type EngineBrokerServiceRegistration } from "./engineBrokerServiceConfig.js";
|
|
7
10
|
import type { GrokBrokerProxyTurn } from "./grokBrokerProxy.js";
|
|
11
|
+
import { type GrokBrokerTurnEndTiming, type GrokWorkerProcess } from "./grokEngineBrokerTurnEnd.js";
|
|
12
|
+
import type { EngineBrokerMcpActivity } from "./engineBrokerMcpCallLog.js";
|
|
8
13
|
export type GrokEngineBrokerTurnResult = Readonly<{
|
|
9
14
|
text: string;
|
|
10
15
|
workerPid: number;
|
|
11
16
|
workerUid: number;
|
|
12
17
|
workerStartTime: string;
|
|
13
|
-
}> & EngineBrokerTurnAccounting;
|
|
18
|
+
}> & EngineBrokerTurnAccounting & BrokerClockObservation & EngineBrokerCleanupObservation;
|
|
14
19
|
export declare class EngineBrokerTurnFailure extends Error {
|
|
15
|
-
readonly code: Exclude<EngineBrokerFailureCode, "turn_conflict"
|
|
20
|
+
readonly code: Exclude<EngineBrokerFailureCode, "turn_conflict">;
|
|
16
21
|
readonly diagnostic?: NativeBrokerDiagnostic | undefined;
|
|
17
22
|
readonly accounting?: EngineBrokerTurnAccounting | undefined;
|
|
18
23
|
readonly mcpCalls?: EngineBrokerMcpCallObservation | undefined;
|
|
19
|
-
|
|
24
|
+
readonly shellClock?: BrokerShellClock | undefined;
|
|
25
|
+
readonly providerClock?: GrokBrokerProviderClockObservation | undefined;
|
|
26
|
+
readonly cleanupDiagnostic?: EngineBrokerCleanupObservation["cleanupDiagnostic"];
|
|
27
|
+
constructor(code: Exclude<EngineBrokerFailureCode, "turn_conflict">, diagnostic?: NativeBrokerDiagnostic | undefined, accounting?: EngineBrokerTurnAccounting | undefined, mcpCalls?: EngineBrokerMcpCallObservation | undefined, shellClock?: BrokerShellClock | undefined, providerClock?: GrokBrokerProviderClockObservation | undefined, cleanupDiagnostic?: EngineBrokerCleanupObservation["cleanupDiagnostic"]);
|
|
20
28
|
}
|
|
21
29
|
/** Everything one broker turn touches, injected so the accounting and limit paths run under test without a native launcher. */
|
|
22
30
|
export type GrokEngineBrokerTurnDependencies = Readonly<{
|
|
23
31
|
turns: EngineBrokerTurnRegistry;
|
|
24
32
|
proxy: Readonly<{
|
|
25
33
|
capabilities: Readonly<{
|
|
26
|
-
issue(agentId: string, turnId: string): string;
|
|
34
|
+
issue(agentId: string, turnId: string, ttlMs?: number): string;
|
|
27
35
|
revoke(turnId: string): void;
|
|
28
36
|
}>;
|
|
29
37
|
registerIsolationGuard(turnId: string, guard: () => Promise<void>): void;
|
|
@@ -32,13 +40,29 @@ export type GrokEngineBrokerTurnDependencies = Readonly<{
|
|
|
32
40
|
revokeTurn(turnId: string): void;
|
|
33
41
|
}>;
|
|
34
42
|
mcp: Readonly<{
|
|
35
|
-
register(agentId: string, turnId: string, endpoint: string): string;
|
|
43
|
+
register(agentId: string, turnId: string, endpoint: string, ttlMs?: number): string;
|
|
36
44
|
revoke(turnId: string): void;
|
|
37
45
|
observe?(turnId: string): EngineBrokerMcpCallObservation | undefined;
|
|
46
|
+
activity?(turnId: string): EngineBrokerMcpActivity | undefined;
|
|
38
47
|
}>;
|
|
39
48
|
credentialStale(): boolean;
|
|
40
|
-
prepareIsolation(registration: EngineBrokerServiceRegistration): Promise<
|
|
49
|
+
prepareIsolation(registration: EngineBrokerServiceRegistration): Promise<Readonly<{
|
|
50
|
+
guard: () => Promise<void>;
|
|
51
|
+
configVariant: GrokWorkerConfigVariant;
|
|
52
|
+
}>>;
|
|
53
|
+
writeTaskClock?: typeof writeBrokerTaskClock;
|
|
54
|
+
/** Startup attestation also owns cleanup when per-turn attestation fails. */
|
|
55
|
+
clockedSlot?: boolean;
|
|
56
|
+
/** A failed cleanup fences production dispatch until the broker restarts. */
|
|
57
|
+
taskClockFailed?(): void;
|
|
41
58
|
runNative(input: NativeBrokerTurn, signal: AbortSignal): Promise<Readonly<NativeBrokerTurnResult>>;
|
|
59
|
+
/** The worker the launcher started for this identity (`/proc` by default); only read when the broker ends a turn itself. */
|
|
60
|
+
observeWorker?(workerUid: number): Promise<GrokWorkerProcess | undefined>;
|
|
61
|
+
/** Overrides the turn-end grace and idle bounds (tests). */
|
|
62
|
+
turnEnd?: GrokBrokerTurnEndTiming;
|
|
63
|
+
/** Whether no live process holds the worker identity (`/proc` by default); polled, bounded, before an aborted turn is sealed. */
|
|
64
|
+
workerIdentityEmpty?(workerUid: number): Promise<boolean>;
|
|
65
|
+
workerReapWaitMs?: number;
|
|
42
66
|
}>;
|
|
43
67
|
/**
|
|
44
68
|
* One brokered Grok turn under its declared limits.
|
|
@@ -54,5 +78,5 @@ export type GrokEngineBrokerTurnDependencies = Readonly<{
|
|
|
54
78
|
* metered through {@link finishBrokerTurnWithUsage}; a replayed turn returns its
|
|
55
79
|
* sealed accounting before any of this runs and never meters again.
|
|
56
80
|
*/
|
|
57
|
-
export declare function runGrokEngineBrokerTurn(deps: GrokEngineBrokerTurnDependencies, registration: EngineBrokerServiceRegistration, wakeId: string, prompt: string, mcpEndpoint: string, signal?: AbortSignal, overrides?: EngineBrokerTurnLimitOverrides): Promise<GrokEngineBrokerTurnResult>;
|
|
81
|
+
export declare function runGrokEngineBrokerTurn(deps: GrokEngineBrokerTurnDependencies, registration: EngineBrokerServiceRegistration, wakeId: string, prompt: string, mcpEndpoint: string, signal?: AbortSignal, overrides?: EngineBrokerTurnLimitOverrides, processClock?: string): Promise<GrokEngineBrokerTurnResult>;
|
|
58
82
|
//# sourceMappingURL=grokEngineBrokerTurn.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grokEngineBrokerTurn.d.ts","sourceRoot":"","sources":["../../src/runtime/grokEngineBrokerTurn.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grokEngineBrokerTurn.d.ts","sourceRoot":"","sources":["../../src/runtime/grokEngineBrokerTurn.ts"],"names":[],"mappings":"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"}
|