@noopolis/daimon 0.2.0 → 0.2.2

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 (261) hide show
  1. package/README.md +6 -0
  2. package/dist/contracts/attentionContract.d.ts +25 -0
  3. package/dist/contracts/attentionContract.d.ts.map +1 -1
  4. package/dist/contracts/attentionContract.js +8 -1
  5. package/dist/contracts/grokBrokerTaskClock.d.ts +18 -0
  6. package/dist/contracts/grokBrokerTaskClock.d.ts.map +1 -0
  7. package/dist/contracts/grokBrokerTaskClock.js +16 -0
  8. package/dist/contracts/organizationRuntimeContract.d.ts +76 -0
  9. package/dist/contracts/organizationRuntimeContract.d.ts.map +1 -1
  10. package/dist/contracts/organizationRuntimeContract.js +2 -0
  11. package/dist/contracts/runtimeContractManifest.d.ts +222 -15
  12. package/dist/contracts/runtimeContractManifest.d.ts.map +1 -1
  13. package/dist/contracts/runtimeContractManifest.js +35 -10
  14. package/dist/contracts/shellEnvironmentPolicy.d.ts +3 -0
  15. package/dist/contracts/shellEnvironmentPolicy.d.ts.map +1 -0
  16. package/dist/contracts/shellEnvironmentPolicy.js +5 -0
  17. package/dist/contracts/wakeMomentContract.d.ts +61 -0
  18. package/dist/contracts/wakeMomentContract.d.ts.map +1 -0
  19. package/dist/contracts/wakeMomentContract.js +27 -0
  20. package/dist/core/types.d.ts +2 -0
  21. package/dist/core/types.d.ts.map +1 -1
  22. package/dist/examples/jungianPlayAgent.d.ts +1 -0
  23. package/dist/examples/jungianPlayAgent.d.ts.map +1 -1
  24. package/dist/examples/jungianPlayAgent.js +6 -2
  25. package/dist/observability/causalEvents.d.ts +3 -3
  26. package/dist/observability/causalEvents.d.ts.map +1 -1
  27. package/dist/observability/causalEvents.js +4 -4
  28. package/dist/pi/cliEngineSpawn.d.ts +2 -2
  29. package/dist/pi/cliEngineSpawn.d.ts.map +1 -1
  30. package/dist/pi/cliEngineSpawn.js +7 -2
  31. package/dist/pi/cliEnvironment.d.ts.map +1 -1
  32. package/dist/pi/cliEnvironment.js +2 -0
  33. package/dist/pi/cliMcpRegistration.d.ts +1 -1
  34. package/dist/pi/cliMcpRegistration.d.ts.map +1 -1
  35. package/dist/pi/cliMcpRegistration.js +1 -1
  36. package/dist/pi/cliSession.d.ts +2 -0
  37. package/dist/pi/cliSession.d.ts.map +1 -1
  38. package/dist/pi/cliSession.js +3 -80
  39. package/dist/pi/cliSessionMcp.d.ts +9 -0
  40. package/dist/pi/cliSessionMcp.d.ts.map +1 -0
  41. package/dist/pi/cliSessionMcp.js +80 -0
  42. package/dist/pi/engineTaskClock.d.ts +9 -0
  43. package/dist/pi/engineTaskClock.d.ts.map +1 -0
  44. package/dist/pi/engineTaskClock.js +28 -0
  45. package/dist/pi/grokHomeMcpRegistration.d.ts.map +1 -1
  46. package/dist/pi/grokHomeMcpRegistration.js +2 -1
  47. package/dist/pi/grokSandbox.js +1 -1
  48. package/dist/pi/memoryClock.d.ts +25 -0
  49. package/dist/pi/memoryClock.d.ts.map +1 -0
  50. package/dist/pi/memoryClock.js +18 -0
  51. package/dist/pi/piAgentHandle.d.ts +3 -1
  52. package/dist/pi/piAgentHandle.d.ts.map +1 -1
  53. package/dist/pi/piAgentHandle.js +5 -2
  54. package/dist/pi/piHarness.d.ts +8 -2
  55. package/dist/pi/piHarness.d.ts.map +1 -1
  56. package/dist/pi/piHarness.js +28 -12
  57. package/dist/pi/taskClockProcess.d.ts +6 -0
  58. package/dist/pi/taskClockProcess.d.ts.map +1 -0
  59. package/dist/pi/taskClockProcess.js +8 -0
  60. package/dist/pi/turnCausal.d.ts +4 -2
  61. package/dist/pi/turnCausal.d.ts.map +1 -1
  62. package/dist/pi/turnCausal.js +4 -4
  63. package/dist/pi/wakeAcceptance.d.ts +1 -1
  64. package/dist/pi/wakeAcceptance.d.ts.map +1 -1
  65. package/dist/pi/wakeAcceptance.js +2 -2
  66. package/dist/runtime/agentSkillsDirectory.d.ts +25 -0
  67. package/dist/runtime/agentSkillsDirectory.d.ts.map +1 -0
  68. package/dist/runtime/agentSkillsDirectory.js +101 -0
  69. package/dist/runtime/agySubscriptionBootstrap.js +1 -1
  70. package/dist/runtime/agySubscriptionRealm.js +1 -1
  71. package/dist/runtime/attention.d.ts +5 -0
  72. package/dist/runtime/attention.d.ts.map +1 -1
  73. package/dist/runtime/attention.js +14 -1
  74. package/dist/runtime/attentionDispatcher.d.ts +14 -2
  75. package/dist/runtime/attentionDispatcher.d.ts.map +1 -1
  76. package/dist/runtime/attentionDispatcher.js +127 -33
  77. package/dist/runtime/cli.js +5 -0
  78. package/dist/runtime/contract-manifest.json +1 -1
  79. package/dist/runtime/contract-manifest.sha256 +1 -1
  80. package/dist/runtime/engineBrokerCapabilities.d.ts +10 -0
  81. package/dist/runtime/engineBrokerCapabilities.d.ts.map +1 -1
  82. package/dist/runtime/engineBrokerCapabilities.js +10 -0
  83. package/dist/runtime/engineBrokerControlClient.d.ts +12 -1
  84. package/dist/runtime/engineBrokerControlClient.d.ts.map +1 -1
  85. package/dist/runtime/engineBrokerControlClient.js +139 -43
  86. package/dist/runtime/engineBrokerCredentialJournal.d.ts +2 -0
  87. package/dist/runtime/engineBrokerCredentialJournal.d.ts.map +1 -1
  88. package/dist/runtime/engineBrokerCredentialJournal.js +9 -0
  89. package/dist/runtime/engineBrokerInferenceProtocol.d.ts +3 -2
  90. package/dist/runtime/engineBrokerInferenceProtocol.d.ts.map +1 -1
  91. package/dist/runtime/engineBrokerInferenceProtocol.js +4 -4
  92. package/dist/runtime/engineBrokerMcpCallLog.d.ts +11 -0
  93. package/dist/runtime/engineBrokerMcpCallLog.d.ts.map +1 -1
  94. package/dist/runtime/engineBrokerMcpCallLog.js +13 -1
  95. package/dist/runtime/engineBrokerMcpFacade.d.ts +5 -2
  96. package/dist/runtime/engineBrokerMcpFacade.d.ts.map +1 -1
  97. package/dist/runtime/engineBrokerMcpFacade.js +5 -2
  98. package/dist/runtime/engineBrokerNativeClient.js +2 -2
  99. package/dist/runtime/engineBrokerProtocol.d.ts +42 -10
  100. package/dist/runtime/engineBrokerProtocol.d.ts.map +1 -1
  101. package/dist/runtime/engineBrokerProtocol.js +97 -14
  102. package/dist/runtime/engineBrokerSealLedger.d.ts.map +1 -1
  103. package/dist/runtime/engineBrokerSealLedger.js +9 -0
  104. package/dist/runtime/engineBrokerService.d.ts +8 -2
  105. package/dist/runtime/engineBrokerService.d.ts.map +1 -1
  106. package/dist/runtime/engineBrokerService.js +95 -37
  107. package/dist/runtime/engineBrokerServiceCli.js +1 -1
  108. package/dist/runtime/engineBrokerServiceConfig.d.ts +15 -2
  109. package/dist/runtime/engineBrokerServiceConfig.d.ts.map +1 -1
  110. package/dist/runtime/engineBrokerServiceConfig.js +53 -11
  111. package/dist/runtime/engineBrokerTurnRegistry.d.ts +1 -1
  112. package/dist/runtime/engineBrokerTurnRegistry.d.ts.map +1 -1
  113. package/dist/runtime/engineBrokerTurnRegistry.js +7 -6
  114. package/dist/runtime/engineDispatcher.d.ts +2 -0
  115. package/dist/runtime/engineDispatcher.d.ts.map +1 -1
  116. package/dist/runtime/engineDispatcher.js +14 -2
  117. package/dist/runtime/engineReadiness.js +1 -1
  118. package/dist/runtime/grokBrokerCredentialAuthority.d.ts +1 -0
  119. package/dist/runtime/grokBrokerCredentialAuthority.d.ts.map +1 -1
  120. package/dist/runtime/grokBrokerCredentialAuthority.js +48 -22
  121. package/dist/runtime/grokBrokerCredentialReader.d.ts +1 -0
  122. package/dist/runtime/grokBrokerCredentialReader.d.ts.map +1 -1
  123. package/dist/runtime/grokBrokerCredentialReader.js +2 -1
  124. package/dist/runtime/grokBrokerProjection.d.ts +26 -2
  125. package/dist/runtime/grokBrokerProjection.d.ts.map +1 -1
  126. package/dist/runtime/grokBrokerProjection.js +18 -7
  127. package/dist/runtime/grokBrokerProviderClock.d.ts +26 -0
  128. package/dist/runtime/grokBrokerProviderClock.d.ts.map +1 -0
  129. package/dist/runtime/grokBrokerProviderClock.js +133 -0
  130. package/dist/runtime/grokBrokerProxy.d.ts +17 -3
  131. package/dist/runtime/grokBrokerProxy.d.ts.map +1 -1
  132. package/dist/runtime/grokBrokerProxy.js +73 -9
  133. package/dist/runtime/grokBrokerProxyJson.d.ts +10 -0
  134. package/dist/runtime/grokBrokerProxyJson.d.ts.map +1 -0
  135. package/dist/runtime/grokBrokerProxyJson.js +31 -0
  136. package/dist/runtime/grokBrokerProxyRequest.d.ts.map +1 -1
  137. package/dist/runtime/grokBrokerProxyRequest.js +17 -6
  138. package/dist/runtime/grokBrokerRealmLease.js +1 -1
  139. package/dist/runtime/grokBrokerRefresh.js +1 -1
  140. package/dist/runtime/grokBrokerRunBudget.d.ts +20 -0
  141. package/dist/runtime/grokBrokerRunBudget.d.ts.map +1 -0
  142. package/dist/runtime/grokBrokerRunBudget.js +85 -0
  143. package/dist/runtime/grokBrokerSlot.d.ts +6 -0
  144. package/dist/runtime/grokBrokerSlot.d.ts.map +1 -0
  145. package/dist/runtime/grokBrokerSlot.js +21 -0
  146. package/dist/runtime/grokBrokerTaskClock.d.ts +32 -0
  147. package/dist/runtime/grokBrokerTaskClock.d.ts.map +1 -0
  148. package/dist/runtime/grokBrokerTaskClock.js +120 -0
  149. package/dist/runtime/grokBrokerTurnMeter.d.ts +55 -3
  150. package/dist/runtime/grokBrokerTurnMeter.d.ts.map +1 -1
  151. package/dist/runtime/grokBrokerTurnMeter.js +90 -4
  152. package/dist/runtime/grokBrokerWorkerConfig.d.ts +5 -2
  153. package/dist/runtime/grokBrokerWorkerConfig.d.ts.map +1 -1
  154. package/dist/runtime/grokBrokerWorkerConfig.js +22 -3
  155. package/dist/runtime/grokEngineBroker.d.ts +43 -3
  156. package/dist/runtime/grokEngineBroker.d.ts.map +1 -1
  157. package/dist/runtime/grokEngineBroker.js +159 -71
  158. package/dist/runtime/grokEngineBrokerTurn.d.ts +32 -8
  159. package/dist/runtime/grokEngineBrokerTurn.d.ts.map +1 -1
  160. package/dist/runtime/grokEngineBrokerTurn.js +204 -21
  161. package/dist/runtime/grokEngineBrokerTurnEnd.d.ts +88 -0
  162. package/dist/runtime/grokEngineBrokerTurnEnd.d.ts.map +1 -0
  163. package/dist/runtime/grokEngineBrokerTurnEnd.js +148 -0
  164. package/dist/runtime/grokInferenceProxy.d.ts.map +1 -1
  165. package/dist/runtime/grokInferenceProxy.js +3 -0
  166. package/dist/runtime/grokSubscriptionRealm.js +1 -1
  167. package/dist/runtime/grokWorkerAttestation.d.ts +12 -5
  168. package/dist/runtime/grokWorkerAttestation.d.ts.map +1 -1
  169. package/dist/runtime/grokWorkerAttestation.js +5 -3
  170. package/dist/runtime/grokWorkerHomeAttestation.d.ts +51 -5
  171. package/dist/runtime/grokWorkerHomeAttestation.d.ts.map +1 -1
  172. package/dist/runtime/grokWorkerHomeAttestation.js +103 -8
  173. package/dist/runtime/grokWorkerSkills.d.ts +86 -0
  174. package/dist/runtime/grokWorkerSkills.d.ts.map +1 -0
  175. package/dist/runtime/grokWorkerSkills.js +135 -0
  176. package/dist/runtime/index.d.ts +10 -2
  177. package/dist/runtime/index.d.ts.map +1 -1
  178. package/dist/runtime/index.js +8 -1
  179. package/dist/runtime/native/daimon-engine-broker +0 -0
  180. package/dist/runtime/organizationRuntime.d.ts +3 -0
  181. package/dist/runtime/organizationRuntime.d.ts.map +1 -1
  182. package/dist/runtime/organizationRuntimeAdmission.d.ts +6 -0
  183. package/dist/runtime/organizationRuntimeAdmission.d.ts.map +1 -0
  184. package/dist/runtime/organizationRuntimeAdmission.js +22 -0
  185. package/dist/runtime/organizationRuntimeControl.d.ts +9 -0
  186. package/dist/runtime/organizationRuntimeControl.d.ts.map +1 -1
  187. package/dist/runtime/organizationRuntimeControl.js +72 -24
  188. package/dist/runtime/organizationRuntimeHost.d.ts.map +1 -1
  189. package/dist/runtime/organizationRuntimeHost.js +13 -4
  190. package/dist/runtime/organizationRuntimeParsing.d.ts.map +1 -1
  191. package/dist/runtime/organizationRuntimeParsing.js +4 -1
  192. package/dist/runtime/organizationRuntimeReadiness.d.ts.map +1 -1
  193. package/dist/runtime/organizationRuntimeReadiness.js +8 -0
  194. package/dist/runtime/organizationRuntimeRecording.d.ts +7 -0
  195. package/dist/runtime/organizationRuntimeRecording.d.ts.map +1 -0
  196. package/dist/runtime/organizationRuntimeRecording.js +58 -0
  197. package/dist/runtime/physicalReadiness.d.ts +12 -0
  198. package/dist/runtime/physicalReadiness.d.ts.map +1 -1
  199. package/dist/runtime/physicalReadiness.js +43 -9
  200. package/dist/runtime/productionAgentTools.d.ts.map +1 -1
  201. package/dist/runtime/productionAgentTools.js +13 -5
  202. package/dist/runtime/relocateRuntimeConfig.d.ts +14 -0
  203. package/dist/runtime/relocateRuntimeConfig.d.ts.map +1 -0
  204. package/dist/runtime/relocateRuntimeConfig.js +38 -0
  205. package/dist/runtime/schedule.d.ts.map +1 -1
  206. package/dist/runtime/schedule.js +12 -7
  207. package/dist/runtime/storeCoordination.d.ts +10 -0
  208. package/dist/runtime/storeCoordination.d.ts.map +1 -1
  209. package/dist/runtime/storeCoordination.js +23 -0
  210. package/dist/runtime/taskClock.d.ts +42 -0
  211. package/dist/runtime/taskClock.d.ts.map +1 -0
  212. package/dist/runtime/taskClock.js +102 -0
  213. package/dist/runtime/taskClockProcess.d.ts +17 -0
  214. package/dist/runtime/taskClockProcess.d.ts.map +1 -0
  215. package/dist/runtime/taskClockProcess.js +58 -0
  216. package/dist/runtime/turnRequestLedger.d.ts +0 -5
  217. package/dist/runtime/turnRequestLedger.d.ts.map +1 -1
  218. package/dist/runtime/turnRequestLedger.js +23 -21
  219. package/dist/runtime/wakeAcceptanceClaimDiagnostics.d.ts +34 -0
  220. package/dist/runtime/wakeAcceptanceClaimDiagnostics.d.ts.map +1 -0
  221. package/dist/runtime/wakeAcceptanceClaimDiagnostics.js +79 -0
  222. package/dist/runtime/wakeAcceptanceIndex.d.ts +55 -0
  223. package/dist/runtime/wakeAcceptanceIndex.d.ts.map +1 -0
  224. package/dist/runtime/wakeAcceptanceIndex.js +158 -0
  225. package/dist/runtime/wakeAcceptanceProcessIdentity.d.ts +9 -1
  226. package/dist/runtime/wakeAcceptanceProcessIdentity.d.ts.map +1 -1
  227. package/dist/runtime/wakeAcceptanceProcessIdentity.js +5 -1
  228. package/dist/runtime/wakeAcceptanceRecord.d.ts +2 -0
  229. package/dist/runtime/wakeAcceptanceRecord.d.ts.map +1 -1
  230. package/dist/runtime/wakeAcceptanceRecord.js +4 -2
  231. package/dist/runtime/wakeAcceptanceRetention.d.ts +25 -1
  232. package/dist/runtime/wakeAcceptanceRetention.d.ts.map +1 -1
  233. package/dist/runtime/wakeAcceptanceRetention.js +28 -2
  234. package/dist/runtime/wakeAcceptanceStore.d.ts +8 -8
  235. package/dist/runtime/wakeAcceptanceStore.d.ts.map +1 -1
  236. package/dist/runtime/wakeAcceptanceStore.js +66 -63
  237. package/dist/runtime/wakeFuse.d.ts +58 -3
  238. package/dist/runtime/wakeFuse.d.ts.map +1 -1
  239. package/dist/runtime/wakeFuse.js +106 -7
  240. package/dist/runtime/wakeMomentFs.d.ts +27 -0
  241. package/dist/runtime/wakeMomentFs.d.ts.map +1 -0
  242. package/dist/runtime/wakeMomentFs.js +223 -0
  243. package/dist/runtime/wakeMomentHistory.d.ts +26 -0
  244. package/dist/runtime/wakeMomentHistory.d.ts.map +1 -0
  245. package/dist/runtime/wakeMomentHistory.js +109 -0
  246. package/dist/runtime/wakeMomentIo.d.ts +22 -0
  247. package/dist/runtime/wakeMomentIo.d.ts.map +1 -0
  248. package/dist/runtime/wakeMomentIo.js +114 -0
  249. package/dist/runtime/wakeMomentRecorder.d.ts +33 -0
  250. package/dist/runtime/wakeMomentRecorder.d.ts.map +1 -0
  251. package/dist/runtime/wakeMomentRecorder.js +81 -0
  252. package/dist/runtime/wakeMomentRetention.d.ts +7 -0
  253. package/dist/runtime/wakeMomentRetention.d.ts.map +1 -0
  254. package/dist/runtime/wakeMomentRetention.js +143 -0
  255. package/dist/runtime/wakeMomentRows.d.ts +8 -0
  256. package/dist/runtime/wakeMomentRows.d.ts.map +1 -0
  257. package/dist/runtime/wakeMomentRows.js +66 -0
  258. package/dist/runtime/wakeMomentSnapshot.d.ts +56 -0
  259. package/dist/runtime/wakeMomentSnapshot.d.ts.map +1 -0
  260. package/dist/runtime/wakeMomentSnapshot.js +248 -0
  261. package/package.json +4 -4
@@ -1,5 +1,8 @@
1
+ import { brokerTaskClockFileFor } from "./grokBrokerSlot.js";
1
2
  import { createHash } from "node:crypto";
2
3
  import path from "node:path";
4
+ import { GROK_BROKER_TASK_CLOCK } from "../contracts/grokBrokerTaskClock.js";
5
+ import { shellEnvironmentPolicyEntries } from "../contracts/shellEnvironmentPolicy.js";
3
6
  import { GROK_ENGINE_BROKER } from "../contracts/runtimeContractManifest.js";
4
7
  import { DAIMON_GROK_SYSTEM_PROMPT, GROK_WORKER_MAX_TURNS, GROK_WORKER_TOOL_IDS } from "../contracts/grokWorkerContract.js";
5
8
  import { parseGrokBrokerModelPolicy } from "./grokBrokerModelPolicy.js";
@@ -95,8 +98,16 @@ export const renderGrokLeanBaseConfig = () => [
95
98
  * default *and* its closed enum, so it reaches the request body and nothing
96
99
  * else can be selected; the proxy then re-verifies it on every body.
97
100
  */
98
- export function renderGrokBrokerWorkerConfig(policy = {}) {
99
- return renderGrokBrokerWorkerConfigWith(parseGrokBrokerModelPolicy(policy), PRODUCTION_ENDPOINTS);
101
+ export function renderGrokBrokerWorkerConfig(policy = {}, variant = "unclocked", slot = 0) {
102
+ if (variant !== "unclocked" && variant !== "clocked")
103
+ throw new TypeError("invalid Grok worker config variant");
104
+ const base = renderGrokBrokerWorkerConfigWith(parseGrokBrokerModelPolicy(policy), PRODUCTION_ENDPOINTS);
105
+ return variant === "unclocked" ? base : `${base}\n[shell_environment_policy]\n${shellEnvironmentPolicyEntries({
106
+ LD_PRELOAD: GROK_BROKER_TASK_CLOCK.preloadPath,
107
+ FAKETIME_TIMESTAMP_FILE: brokerTaskClockFileFor(slot),
108
+ FAKETIME_DONT_FAKE_MONOTONIC: "1",
109
+ LC_ALL: "C"
110
+ }).join("\n")}\n`;
100
111
  }
101
112
  /** Explicit-endpoint variant for the local live probe; production bytes come only from the function above. */
102
113
  export function renderGrokBrokerWorkerConfigWith(policy, endpoints) {
@@ -116,7 +127,15 @@ export function renderGrokBrokerWorkerConfigWith(policy, endpoints) {
116
127
  "[mcp_servers.daimon]", `url = "${mcpUrl}"`, 'bearer_token_env_var = "DAIMON_MCP_CAPABILITY"', ""
117
128
  ].join("\n");
118
129
  }
119
- export const grokBrokerWorkerConfigSha256 = (policy = {}) => createHash("sha256").update(renderGrokBrokerWorkerConfig(policy)).digest("hex");
130
+ export const grokBrokerWorkerConfigSha256 = (policy = {}, variant = "unclocked", slot = 0) => createHash("sha256").update(renderGrokBrokerWorkerConfig(policy, variant, slot)).digest("hex");
131
+ /** Validate the slot-zero template pin before deriving bytes for another canonical slot path. */
132
+ export function grokBrokerWorkerConfigPins(policy, slot = 0) {
133
+ const base = GROK_ENGINE_BROKER.worker.clockedConfigSha256[policy.model][policy.reasoningEffort];
134
+ if (grokBrokerWorkerConfigSha256(policy, "clocked", 0) !== base)
135
+ throw new Error("Grok clocked config template drifted from manifest");
136
+ return { unclocked: GROK_ENGINE_BROKER.worker.configSha256[policy.model][policy.reasoningEffort],
137
+ clocked: grokBrokerWorkerConfigSha256(policy, "clocked", slot) };
138
+ }
120
139
  /**
121
140
  * TypeScript mirror of the argv compiled into `native/engineBrokerLauncherCore.inc`.
122
141
  * `native/launcherArgv.test.ts` parses the C source and fails on any divergence.
@@ -1,6 +1,13 @@
1
+ import { needsBrokerTaskClockReconciliation, writeBrokerTaskClock } from "./grokBrokerTaskClock.js";
2
+ import { DurableGrokBrokerCredentialAuthority } from "./grokBrokerCredentialAuthority.js";
3
+ import { runNativeBrokerTurn } from "./engineBrokerNativeClient.js";
1
4
  import type { EngineBrokerServiceRegistration } from "./engineBrokerServiceConfig.js";
2
5
  import type { EngineBrokerTurnLimitOverrides } from "./engineBrokerTurnAccounting.js";
3
- import { type GrokEngineBrokerTurnResult } from "./grokEngineBrokerTurn.js";
6
+ import { startGrokBrokerProxy } from "./grokBrokerProxy.js";
7
+ import { acquireGrokBrokerRealmLease } from "./grokBrokerRealmLease.js";
8
+ import { type GrokEngineBrokerTurnDependencies, type GrokEngineBrokerTurnResult } from "./grokEngineBrokerTurn.js";
9
+ import { createGrokWorkerIsolationGuard, prepareGrokWorkerAttestation } from "./grokWorkerAttestation.js";
10
+ import { grokWorkerIdentityEmpty } from "./grokEngineBrokerTurnEnd.js";
4
11
  import { type GrokInferenceGrantRequest } from "./grokInferenceGrants.js";
5
12
  export { EngineBrokerTurnFailure, type GrokEngineBrokerTurnResult } from "./grokEngineBrokerTurn.js";
6
13
  export { finishBrokerTurnWithUsage } from "./grokEngineBrokerMetering.js";
@@ -17,6 +24,24 @@ export type GrokEngineBroker = Awaited<ReturnType<typeof startGrokEngineBroker>>
17
24
  * proxy; their rows go only to that ledger. A stale realm refuses a grant as
18
25
  * `auth_stale`, exactly as it fails subject turns.
19
26
  */
27
+ /** Internal seams exercise the production startup and per-turn admission paths. */
28
+ export type GrokEngineBrokerDependencies = Readonly<{
29
+ acquireLease: typeof acquireGrokBrokerRealmLease;
30
+ createAuthority: (command: string, home: string) => Pick<DurableGrokBrokerCredentialAuthority, "initialize" | "accessToken" | "markRejected" | "isStale">;
31
+ startProxy: (...args: Parameters<typeof startGrokBrokerProxy>) => Promise<GrokEngineBrokerTurnDependencies["proxy"] & {
32
+ port: number;
33
+ close(): Promise<void>;
34
+ }>;
35
+ startMcp: () => Promise<GrokEngineBrokerTurnDependencies["mcp"] & {
36
+ close(): Promise<void>;
37
+ }>;
38
+ prepareAttestation: typeof prepareGrokWorkerAttestation;
39
+ needsTaskClockReconciliation: typeof needsBrokerTaskClockReconciliation;
40
+ createIsolationGuard: typeof createGrokWorkerIsolationGuard;
41
+ writeTaskClock: typeof writeBrokerTaskClock;
42
+ workerIdentityEmpty: typeof grokWorkerIdentityEmpty;
43
+ runNative: typeof runNativeBrokerTurn;
44
+ }>;
20
45
  export declare function startGrokEngineBroker(options: Readonly<{
21
46
  grokCommand: string;
22
47
  nativeClient: string;
@@ -24,8 +49,15 @@ export declare function startGrokEngineBroker(options: Readonly<{
24
49
  turnStore: string;
25
50
  registrations: readonly GrokEngineBrokerRegistration[];
26
51
  inferenceLedgerPath?: string;
27
- }>): Promise<{
28
- turn(agentId: string, wakeId: string, prompt: string, mcpEndpoint: string, signal?: AbortSignal, limits?: EngineBrokerTurnLimitOverrides): Promise<GrokEngineBrokerTurnResult>;
52
+ maxRunRequests?: number;
53
+ runRequestStore?: string;
54
+ }>, dependencies?: GrokEngineBrokerDependencies): Promise<{
55
+ turn: (agentId: string, wakeId: string, prompt: string, mcpEndpoint: string, signal?: AbortSignal | undefined, limits?: Readonly<Partial<Readonly<{
56
+ maxRequests: number;
57
+ maxTokens: number;
58
+ timeoutMs: number;
59
+ }>>> | undefined, processClock?: string | undefined, slot?: number | undefined) => Promise<GrokEngineBrokerTurnResult>;
60
+ resetSlot(slot: number): Promise<void>;
29
61
  requestInferenceGrant(request: GrokInferenceGrantRequest): Readonly<{
30
62
  grantId: string;
31
63
  token: string;
@@ -45,4 +77,12 @@ export declare function startGrokEngineBroker(options: Readonly<{
45
77
  workerIsolation: boolean;
46
78
  };
47
79
  }>;
80
+ /** @internal One slot identity carries one turn until cleanup settles, including clock publication. */
81
+ export type GrokBrokerActiveTurns = Map<number, {
82
+ controller: AbortController;
83
+ done: Promise<void>;
84
+ }>;
85
+ type TurnArguments = [wakeId: string, prompt: string, mcpEndpoint: string, signal?: AbortSignal, limits?: EngineBrokerTurnLimitOverrides, processClock?: string];
86
+ /** The production dispatch boundary, isolated from credential/network setup for lifecycle tests. */
87
+ export declare function createGrokEngineBrokerTurnDispatch(registrations: ReadonlyMap<number, GrokEngineBrokerRegistration>, active: GrokBrokerActiveTurns, isClosed: () => boolean, run: (registration: GrokEngineBrokerRegistration, ...args: TurnArguments) => Promise<GrokEngineBrokerTurnResult>, resetting?: ReadonlySet<number>): (agentId: string, ...input: [...TurnArguments, slot?: number]) => Promise<GrokEngineBrokerTurnResult>;
48
88
  //# sourceMappingURL=grokEngineBroker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"grokEngineBroker.d.ts","sourceRoot":"","sources":["../../src/runtime/grokEngineBroker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAOtF,OAAO,EAA2B,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAErG,OAAO,EAAgE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAExI,OAAO,EAAE,uBAAuB,EAAE,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACrG,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,MAAM,MAAM,4BAA4B,GAAG,+BAA+B,CAAC;AAC3E,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,SAAS,4BAA4B,EAAE,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;kBAYrN,MAAM,UAAU,MAAM,UAAU,MAAM,eAAe,MAAM,WAAW,WAAW,WAAW,8BAA8B,GAAG,OAAO,CAAC,0BAA0B,CAAC;mCAOrJ,yBAAyB;;;;;;;;mCAKzB,MAAM,GAAG,OAAO;aAIhC,OAAO,CAAC,IAAI,CAAC;;;;;;;;;GAG/B"}
1
+ {"version":3,"file":"grokEngineBroker.d.ts","sourceRoot":"","sources":["../../src/runtime/grokEngineBroker.ts"],"names":[],"mappings":"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"}
@@ -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 { grokBrokerWorkerConfigSha256 } from "./grokBrokerWorkerConfig.js";
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
- * The Grok engine broker: one credential realm, one provider proxy, one MCP
16
- * facade, and the root-provisioned registrations. Each registration declares
17
- * its own model/effort (whose worker config bytes are attested), usage ledger,
18
- * and turn limits (`engineBrokerServiceConfig.ts`).
19
- *
20
- * With an `inferenceLedgerPath` the broker also issues evaluator inference
21
- * grants (`grokInferenceGrants.ts`) over the same credential authority and
22
- * proxy; their rows go only to that ledger. A stale realm refuses a grant as
23
- * `auth_stale`, exactly as it fails subject turns.
24
- */
25
- export async function startGrokEngineBroker(options) {
26
- const registrations = new Map(options.registrations.map((entry) => [entry.agentId, { ...entry, model: parseGrokBrokerModelPolicy(entry.model) }]));
27
- if (registrations.size !== options.registrations.length)
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()], grokBrokerWorkerConfigSha256(registration.model));
30
- const inferenceLedgerPath = options.inferenceLedgerPath;
31
- const grants = inferenceLedgerPath === undefined ? undefined : createLedgeredGrokInferenceGrants(inferenceLedgerPath);
32
- const lease = await acquireGrokBrokerRealmLease(options.credentialHome);
33
- const authority = new DurableGrokBrokerCredentialAuthority(options.grokCommand, options.credentialHome);
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
- mcp = await startEngineBrokerMcpFacade();
52
- for (const registration of registrations.values())
53
- await prepareGrokWorkerAttestation(attestationFor(registration));
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
- if (mcp)
57
- await mcp.close().catch(() => undefined);
58
- await proxy.close();
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
- if (!mcp)
63
- throw new Error("engine broker unavailable");
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 deps = {
69
- turns, proxy, mcp: facade, credentialStale: () => authority.isStale(),
70
- prepareIsolation: async (registration) => { const attestation = attestationFor(registration); return createGrokWorkerIsolationGuard(attestation, await prepareGrokWorkerAttestation(attestation)); },
71
- runNative: (input, signal) => runNativeBrokerTurn(options.nativeClient, input, signal)
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
- async turn(agentId, wakeId, prompt, mcpEndpoint, signal, limits) {
75
- if (closed)
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
- const registration = registrations.get(agentId);
78
- if (registration === undefined)
79
- throw new Error("engine broker unavailable");
80
- const controller = new AbortController();
81
- const onAbort = () => controller.abort();
82
- signal?.addEventListener("abort", onAbort, { once: true });
83
- if (signal?.aborted)
84
- controller.abort();
85
- const key = `${agentId}\0${wakeId}`;
86
- const done = runGrokEngineBrokerTurn(deps, registration, wakeId, prompt, mcpEndpoint, controller.signal, limits);
87
- active.set(key, { controller, done: done.then(() => undefined, () => undefined) });
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
- return await done;
134
+ await reset;
90
135
  }
91
136
  finally {
92
- signal?.removeEventListener("abort", onAbort);
93
- active.delete(key);
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() { if (closed)
109
- return; closed = true; grants?.close(); const running = [...active.values()]; for (const entry of running)
110
- entry.controller.abort(); await Promise.allSettled(running.map((entry) => entry.done)); const results = await Promise.allSettled([facade.close(), proxy.close(), lease.close()]); const failures = results.flatMap((entry) => entry.status === "rejected" ? [entry.reason] : []); if (failures.length)
111
- throw new AggregateError(failures, "engine broker shutdown failed"); },
112
- readiness: () => ({ providerProxyPort: proxy.port, mcpFacadePort: 43_124, registrations: registrations.size, credentialStale: authority.isStale(), realmLease: true, workerIsolation: true })
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 { type EngineBrokerFailureCode } from "./engineBrokerProtocol.js";
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" | "unavailable">;
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
- constructor(code: Exclude<EngineBrokerFailureCode, "turn_conflict" | "unavailable">, diagnostic?: NativeBrokerDiagnostic | undefined, accounting?: EngineBrokerTurnAccounting | undefined, mcpCalls?: EngineBrokerMcpCallObservation | undefined);
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<() => Promise<void>>;
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":"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"}
1
+ {"version":3,"file":"grokEngineBrokerTurn.d.ts","sourceRoot":"","sources":["../../src/runtime/grokEngineBrokerTurn.ts"],"names":[],"mappings":"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"}