@zq-silk/yui 0.13.9 → 0.14.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 (229) hide show
  1. package/ARCHITECTURE.md +69 -428
  2. package/README.md +108 -298
  3. package/dist/agent/managedRuntimeEnvironment.js +2 -2
  4. package/dist/cli/commandCatalog.js +39 -77
  5. package/dist/cli/interactionCandidates.js +4 -4
  6. package/dist/cli/interactionPolicy.js +7 -10
  7. package/dist/cli/invocationRouter.js +1 -1
  8. package/dist/cli/updateCommand.js +6 -27
  9. package/dist/cli/updateOrchestrator.js +63 -484
  10. package/dist/cli/updatePorts.js +15 -333
  11. package/dist/cli/upgradeCommand.js +8 -65
  12. package/dist/cli.js +57 -242
  13. package/dist/commands/configCommands.js +11 -62
  14. package/dist/commands/executionAuditCommands.js +23 -23
  15. package/dist/commands/globalRoleCommands.js +2 -7
  16. package/dist/commands/jobCommands.js +1 -4
  17. package/dist/commands/projectCommands.js +5 -5
  18. package/dist/commands/releaseCommands.js +3 -10
  19. package/dist/commands/resourcesCommands.js +2 -2
  20. package/dist/commands/sessionCommands.js +2 -2
  21. package/dist/commands/taskActor.js +31 -39
  22. package/dist/commands/taskChangeSetCommands.js +5 -12
  23. package/dist/commands/taskCommands.js +464 -1249
  24. package/dist/commands/taskContextCommand.js +35 -36
  25. package/dist/commands/taskExecutionCommands.js +33 -46
  26. package/dist/commands/taskInputCommands.js +20 -42
  27. package/dist/commands/taskNextActionCommand.js +9 -9
  28. package/dist/commands/taskOverviewCommand.js +56 -95
  29. package/dist/commands/taskRoleRuntimeStatus.js +77 -107
  30. package/dist/commands/taskUpstreamCommands.js +3 -3
  31. package/dist/commands/taskWorkspaceCommands.js +7 -79
  32. package/dist/commands/telemetryCommands.js +32 -124
  33. package/dist/commands/workflowCommands.js +3 -3
  34. package/dist/completion/fileCompletionManager.js +1 -1
  35. package/dist/config/configCatalog.js +4 -6
  36. package/dist/config/yuiConfig.js +6 -43
  37. package/dist/context/dispatchContext.js +14 -30
  38. package/dist/context/roleSessionContext.js +2 -2
  39. package/dist/context/sessionBootstrapManifest.js +2 -2
  40. package/dist/context/{runContextPack.js → turnContextPack.js} +58 -73
  41. package/dist/context/turnInputContract.js +204 -0
  42. package/dist/context/wakeNotification.js +2 -2
  43. package/dist/controller/agentRuntimeObserver.js +18 -18
  44. package/dist/controller/clientRuntime.js +13 -20
  45. package/dist/controller/controller.js +89 -116
  46. package/dist/controller/fileSchedulerStoreAdapter.js +511 -742
  47. package/dist/controller/jobControl.js +17 -17
  48. package/dist/controller/resourceInventory.js +6 -6
  49. package/dist/controller/resourceInventoryLinux.js +38 -59
  50. package/dist/controller/resourceInventoryRpc.js +3 -3
  51. package/dist/controller/resourceInventoryWorker.js +1 -1
  52. package/dist/controller/runtime.js +46 -53
  53. package/dist/controller/runtimeEventInbox.js +23 -31
  54. package/dist/controller/runtimeEventProcessor.js +15 -15
  55. package/dist/controller/{runtimeHookRunFence.js → runtimeHookTurnFence.js} +87 -81
  56. package/dist/controller/runtimeLaunchCoordinator.js +3 -3
  57. package/dist/controller/runtimeObservationHook.js +11 -8
  58. package/dist/controller/sessionNotify.js +11 -11
  59. package/dist/controller/structuredProviderObservation.js +89 -16
  60. package/dist/coordination/workMailbox.js +309 -579
  61. package/dist/coordination/workMailboxQueue.js +5 -6
  62. package/dist/core/controllerClient.js +1 -91
  63. package/dist/core/controllerServer.js +3 -6
  64. package/dist/doctor/doctor.js +51 -314
  65. package/dist/execution/candidateConvergence.js +3 -3
  66. package/dist/execution/executionGroup.js +32 -33
  67. package/dist/execution/executionHealth.js +36 -38
  68. package/dist/execution/resourceBroker.js +12 -12
  69. package/dist/executor/agentExecutor.js +30 -265
  70. package/dist/executor/effectiveLaunch.js +9 -19
  71. package/dist/executor/executorRegistry.js +43 -17
  72. package/dist/executor/fileRoleLaunchPlanner.js +56 -56
  73. package/dist/executor/launchPlan.js +3 -3
  74. package/dist/executor/workspacePreflightClassification.js +16 -16
  75. package/dist/grant/capabilityGrant.js +20 -25
  76. package/dist/input/inputRequest.js +12 -12
  77. package/dist/integration/changeSet.js +9 -13
  78. package/dist/integration/changeSetManifest.js +1 -1
  79. package/dist/integration/gitIntegrationService.js +2 -2
  80. package/dist/integration/integrationQueueService.js +5 -21
  81. package/dist/integration/overlapDiagnostics.js +2 -2
  82. package/dist/interaction/operatorPresentation.js +1 -1
  83. package/dist/job/jobRunner.js +1 -1
  84. package/dist/lifecycle/canonicalLifecycleEvent.js +25 -25
  85. package/dist/lifecycle/{exactRunTerminalization.js → exactTurnTerminalization.js} +116 -232
  86. package/dist/message/message.js +6 -6
  87. package/dist/observability/executionAudit.js +74 -86
  88. package/dist/observability/faultClassification.js +7 -24
  89. package/dist/observability/orchestrationMetrics.js +5 -5
  90. package/dist/observability/runtimeIdentity.js +34 -101
  91. package/dist/profile/agentProfile.js +1 -1
  92. package/dist/release/cliHomeReleaseFence.js +3 -3
  93. package/dist/release/releaseWorkflowEngine.js +6 -10
  94. package/dist/release/releaseWorkflowPorts.js +2 -2
  95. package/dist/release/workflowFileLock.js +1 -1
  96. package/dist/repository/checkoutSwap.js +1 -1
  97. package/dist/repository/gitWorkspace.js +0 -13
  98. package/dist/repository/project.js +1 -1
  99. package/dist/repository/projectMaintenanceLock.js +1 -2
  100. package/dist/repository/taskBaseFreshness.js +13 -13
  101. package/dist/repository/taskWorkspaceCoordinator.js +21 -25
  102. package/dist/repository/taskWorkspaceIdentity.js +8 -21
  103. package/dist/repository/taskWorkspacePreparer.js +63 -620
  104. package/dist/resources/autoResourceGc.js +3 -3
  105. package/dist/resources/liveReferences.js +1 -1
  106. package/dist/resources/resourceGc.js +1 -1
  107. package/dist/resources/sqliteResourceRegistry.js +1 -1
  108. package/dist/review/reviewDecision.js +7 -7
  109. package/dist/review/reviewFindingLedger.js +1 -1
  110. package/dist/review/reviewOutcomeClassifier.js +35 -50
  111. package/dist/review/reviewRound.js +14 -25
  112. package/dist/review/reviewerAvailability.js +4 -4
  113. package/dist/review/taskFinalReviewContractResolution.js +41 -0
  114. package/dist/role/role.js +6 -3
  115. package/dist/runtime/agentDriver.js +4 -0
  116. package/dist/runtime/agentHost.js +151 -36
  117. package/dist/runtime/builtinAgentDrivers.js +79 -2
  118. package/dist/runtime/codexAppServerRuntime.js +122 -0
  119. package/dist/runtime/continuationManager.js +3 -5
  120. package/dist/runtime/exactControlPlane.js +17 -42
  121. package/dist/runtime/firstProgressAdvisory.js +1 -1
  122. package/dist/runtime/index.js +2 -2
  123. package/dist/runtime/launchDiagnostics.js +2 -2
  124. package/dist/runtime/lifecycleReservation.js +4 -4
  125. package/dist/runtime/processExitObservation.js +1 -1
  126. package/dist/runtime/processExitOutbox.js +0 -32
  127. package/dist/runtime/promptEnvelope.js +9 -9
  128. package/dist/runtime/providerContinuation.js +2 -2
  129. package/dist/runtime/providerContinuationReconciliationService.js +2 -2
  130. package/dist/runtime/providerRuntimeIdentity.js +76 -24
  131. package/dist/runtime/recentTurnIds.js +38 -0
  132. package/dist/runtime/runtimeContinuationProjection.js +2 -2
  133. package/dist/runtime/runtimeHealthPolicy.js +1 -1
  134. package/dist/runtime/runtimeObservation.js +58 -21
  135. package/dist/runtime/runtimeProjection.js +19 -27
  136. package/dist/runtime/sessionLaunchRequest.js +2 -2
  137. package/dist/runtime/structuredProviderHost.js +177 -12
  138. package/dist/runtime/tmuxAdapters.js +46 -11
  139. package/dist/scheduler/activeRoleTurnDelivery.js +245 -0
  140. package/dist/scheduler/leaderWakeupProcessor.js +147 -445
  141. package/dist/scheduler/operatorEvent.js +4 -6
  142. package/dist/scheduler/resourceQueueProjection.js +71 -0
  143. package/dist/scheduler/{roleRunLiveness.js → roleTurnLiveness.js} +24 -28
  144. package/dist/scheduler/{roleRunStall.js → roleTurnStall.js} +162 -247
  145. package/dist/scheduler/taskExecutionProjection.js +99 -99
  146. package/dist/scheduler/taskObservabilityProjection.js +10 -10
  147. package/dist/scheduler/taskWake.js +4 -4
  148. package/dist/scheduler/wakeReason.js +6 -10
  149. package/dist/scheduler/wakeupQueue.js +0 -9
  150. package/dist/setup/setupCommand.js +2 -2
  151. package/dist/storage/currentTaskStore.js +46 -0
  152. package/dist/storage/persistenceWorker.js +1 -1
  153. package/dist/storage/sqliteSchema.js +81 -485
  154. package/dist/storage/sqliteStore.js +206 -365
  155. package/dist/storage/storageSchema.js +1 -15
  156. package/dist/storage/storageVersions.js +8 -9
  157. package/dist/storage/storeRpc.js +10 -34
  158. package/dist/storage/taskStore.js +63 -3415
  159. package/dist/storage/upgrade/recordVersions.js +55 -149
  160. package/dist/storage/upgrade/upgradeOrchestrator.js +89 -1752
  161. package/dist/task/completionReadiness.js +5 -5
  162. package/dist/task/deliveryGuard.js +10 -10
  163. package/dist/task/nextAction.js +74 -77
  164. package/dist/task/task.js +2 -4
  165. package/dist/task/taskRecordReference.js +3 -3
  166. package/dist/task/taskRecordRetirement.js +1 -1
  167. package/dist/telemetry/sqliteTelemetryStore.js +53 -53
  168. package/dist/telemetry/telemetryConfig.js +14 -14
  169. package/dist/telemetry/telemetryWiring.js +8 -14
  170. package/dist/turn/turn.js +356 -0
  171. package/dist/{run/runIdentity.js → turn/turnIdentity.js} +4 -4
  172. package/dist/verification/gateArtifactStore.js +2 -2
  173. package/dist/web/assets/client/app.js +1 -1
  174. package/dist/web/assets/client/components.js +29 -54
  175. package/dist/web/assets/client/i18n.js +17 -37
  176. package/dist/web/assets/client/view.js +37 -37
  177. package/dist/web/assets/shell.js +1 -1
  178. package/dist/web/assets/styles/cards.js +5 -5
  179. package/dist/web/assets/styles/widgets.js +1 -2
  180. package/dist/web/webSnapshot.js +65 -60
  181. package/dist/workItem/workItem.js +11 -11
  182. package/dist/workspace/workItemChangeSetManager.js +1 -1
  183. package/docs/task-local-identity.md +5 -5
  184. package/i18n/README.zh-CN.md +41 -54
  185. package/package.json +1 -1
  186. package/skills/yui-leader/SKILL.md +85 -83
  187. package/skills/yui-operator/SKILL.md +16 -16
  188. package/skills/yui-reviewer/SKILL.md +10 -10
  189. package/skills/yui-runtime/SKILL.md +17 -18
  190. package/skills/yui-worker/SKILL.md +16 -18
  191. package/dist/context/runContextContract.js +0 -162
  192. package/dist/executor/turnCompletion.js +0 -126
  193. package/dist/review/taskFinalReviewContractEvent.js +0 -1
  194. package/dist/review/taskFinalReviewContractRebind.js +0 -367
  195. package/dist/run/agentRun.js +0 -356
  196. package/dist/run/rejectedYieldAttempt.js +0 -221
  197. package/dist/run/runControlRequest.js +0 -50
  198. package/dist/run/yieldReceipt.js +0 -65
  199. package/dist/runtime/turnCompletion.js +0 -3
  200. package/dist/scheduler/actionability.js +0 -323
  201. package/dist/scheduler/activeRoleRunDelivery.js +0 -868
  202. package/dist/scheduler/activeTaskProgress.js +0 -126
  203. package/dist/storage/compatibleTaskStore.js +0 -248
  204. package/dist/storage/migration/baseline.js +0 -78
  205. package/dist/storage/migration/classifier.js +0 -51
  206. package/dist/storage/migration/compatibleCodec.js +0 -53
  207. package/dist/storage/migration/engine.js +0 -147
  208. package/dist/storage/migration/index.js +0 -33
  209. package/dist/storage/migration/planner.js +0 -154
  210. package/dist/storage/migration/productionRegistry.js +0 -3931
  211. package/dist/storage/migration/registry.js +0 -169
  212. package/dist/storage/migration/report.js +0 -54
  213. package/dist/storage/migration/types.js +0 -31
  214. package/dist/storage/upgrade/homeClassification.js +0 -353
  215. package/dist/storage/upgrade/homeMigrationTarget.js +0 -595
  216. package/dist/storage/upgrade/migrationReceipt.js +0 -67
  217. package/dist/storage/upgrade/offlineUpgradeInventory.js +0 -453
  218. package/dist/storage/upgrade/productionMigrationRegistry.js +0 -6
  219. package/dist/storage/upgrade/pseudoLayoutRepair.js +0 -241
  220. package/dist/storage/upgrade/recordVersionScan.js +0 -176
  221. package/dist/storage/upgrade/sqliteFileSet.js +0 -50
  222. package/dist/storage/upgrade/sqliteMigrationTarget.js +0 -375
  223. package/dist/storage/upgrade/sqliteRecordMigrationTarget.js +0 -305
  224. package/dist/storage/upgrade/sqliteStateMigration.js +0 -918
  225. package/dist/storage/upgrade/switchProgress.js +0 -80
  226. package/dist/storage/upgrade/upgradeReceipt.js +0 -161
  227. package/dist/storage/upgradeCoordination.js +0 -187
  228. package/dist/storage/upgradeFence.js +0 -366
  229. package/dist/telemetry/telemetryCompaction.js +0 -252
@@ -1,173 +1,79 @@
1
- /**
2
- * The current-baseline record-axis version map.
3
- *
4
- * The three storage axes are `layout`, `aggregate`, and `record`. The layout and
5
- * aggregate axes are scalars sourced from `storageSchema.ts`; the record axis is
6
- * a `recordKind -> { version, path }` map because every record family versions
7
- * independently (see the generic migration core in `../migration`).
8
- *
9
- * This map is a SNAPSHOT of the record families that exist on the current
10
- * baseline, enumerated from their real `schemaVersion`s in `taskStore.ts` and the
11
- * per-record modules. It is intentionally NOT a frozen "first release" set: as
12
- * the schema evolves (a new record family, a bumped family version), this map is
13
- * updated in lockstep, exactly like the scalar constants. It exists so
14
- * doctor/inspect and the migration planner can reason about record families.
15
- * Post-baseline record changes require an explicit adjacent registration and
16
- * transform in the production migration graph.
17
- */
1
+ /** Current record-family versions for the single SQLite storage contract. */
18
2
  import { CURRENT_AGGREGATE_SCHEMA_VERSION, CURRENT_STORAGE_LAYOUT_VERSION } from "../storageVersions.js";
19
- import { CURRENT_AGENT_RUN_SCHEMA_VERSION, CURRENT_ACTIVE_RUN_POINTER_SCHEMA_VERSION, CURRENT_AGENT_PROFILE_SCHEMA_VERSION, CURRENT_CAPABILITY_GRANT_SCHEMA_VERSION, CURRENT_CONFIG_SCHEMA_VERSION, CURRENT_CONFIGURED_AGENT_SCHEMA_VERSION, CURRENT_CHANGE_SET_SCHEMA_VERSION, CURRENT_CONTEXT_SNAPSHOT_SCHEMA_VERSION, CURRENT_DECISION_SCHEMA_VERSION, CURRENT_EVENT_SCHEMA_VERSION, CURRENT_GLOBAL_ROLE_SCHEMA_VERSION, CURRENT_GLOBAL_ROLE_SESSION_SET_SCHEMA_VERSION, CURRENT_INPUT_REQUEST_SCHEMA_VERSION, CURRENT_INTEGRATION_ATTEMPT_SCHEMA_VERSION, CURRENT_INTEGRATION_QUEUE_SCHEMA_VERSION, CURRENT_MANAGED_WORKSPACE_SCHEMA_VERSION, CURRENT_MESSAGE_SCHEMA_VERSION, CURRENT_MILESTONE_SCHEMA_VERSION, CURRENT_PUBLICATION_REFERENCE_SCHEMA_VERSION, CURRENT_PROJECT_SCHEMA_VERSION, CURRENT_RELEASE_WORKFLOW_SCHEMA_VERSION, CURRENT_REVIEW_ROUND_SCHEMA_VERSION, CURRENT_STORED_TASK_SCHEMA_VERSION, CURRENT_TASK_BRIEF_SCHEMA_VERSION, CURRENT_TASK_ROLE_SCHEMA_VERSION, CURRENT_TASK_ROLE_SESSION_SET_SCHEMA_VERSION, CURRENT_TASK_SCHEMA_VERSION, CURRENT_WORK_ITEM_SCHEMA_VERSION, CURRENT_WORK_MAILBOX_SCHEMA_VERSION } from "../taskStore.js";
3
+ import { CURRENT_TURN_SCHEMA_VERSION, CURRENT_AGENT_PROFILE_SCHEMA_VERSION, CURRENT_CAPABILITY_GRANT_SCHEMA_VERSION, CURRENT_CONFIG_SCHEMA_VERSION, CURRENT_CONFIGURED_AGENT_SCHEMA_VERSION, CURRENT_CHANGE_SET_SCHEMA_VERSION, CURRENT_CONTEXT_SNAPSHOT_SCHEMA_VERSION, CURRENT_DECISION_SCHEMA_VERSION, CURRENT_EVENT_SCHEMA_VERSION, CURRENT_GLOBAL_ROLE_SCHEMA_VERSION, CURRENT_GLOBAL_ROLE_SESSION_SET_SCHEMA_VERSION, CURRENT_INPUT_REQUEST_SCHEMA_VERSION, CURRENT_INTEGRATION_ATTEMPT_SCHEMA_VERSION, CURRENT_INTEGRATION_QUEUE_SCHEMA_VERSION, CURRENT_MANAGED_WORKSPACE_SCHEMA_VERSION, CURRENT_MESSAGE_SCHEMA_VERSION, CURRENT_MILESTONE_SCHEMA_VERSION, CURRENT_PUBLICATION_REFERENCE_SCHEMA_VERSION, CURRENT_PROJECT_SCHEMA_VERSION, CURRENT_RELEASE_WORKFLOW_SCHEMA_VERSION, CURRENT_REVIEW_ROUND_SCHEMA_VERSION, CURRENT_TASK_BRIEF_SCHEMA_VERSION, CURRENT_TASK_ROLE_SCHEMA_VERSION, CURRENT_TASK_ROLE_SESSION_SET_SCHEMA_VERSION, CURRENT_TASK_SCHEMA_VERSION, CURRENT_WORK_ITEM_SCHEMA_VERSION, CURRENT_WORK_MAILBOX_SCHEMA_VERSION } from "../taskStore.js";
20
4
  import { CURRENT_LEADER_FAILURE_SCHEMA_VERSION } from "../../scheduler/leaderFailure.js";
21
5
  import { CURRENT_TASK_WAKE_SCHEMA_VERSION } from "../../scheduler/taskWake.js";
22
6
  import { CURRENT_DURABLE_JOB_SCHEMA_VERSION } from "../../job/durableJob.js";
23
- function descriptor(version, path) {
24
- return Object.freeze({ version, path });
7
+ function descriptor(kind, version) {
8
+ return Object.freeze({ version, path: `sqlite:${kind}` });
25
9
  }
26
- /**
27
- * Independent persisted-boundary contract for the direct family keys and
28
- * locators. The upgrade descriptor table is checked against this contract so
29
- * omitting a newly persisted family or changing a locator cannot make the
30
- * scanner silently skip that family.
31
- */
32
- const EXPECTED_DIRECT_RECORD_LOCATORS = Object.freeze({
33
- config: "state.json#/config",
34
- configuredAgent: "state.json#/configuredAgents",
35
- project: "state.json#/projects",
36
- agentProfile: "state.json#/agentProfiles",
37
- globalRole: "state.json#/globalRoles",
38
- globalRoleSessionSet: "state.json#/globalRoleSessionSets",
39
- storedTask: "state.json#/tasks/*",
40
- task: "state.json#/tasks/*/task",
41
- taskBrief: "state.json#/tasks/*/brief",
42
- taskRole: "state.json#/tasks/*/roles",
43
- managedWorkspace: "state.json#/tasks/*/managedWorkspaces",
44
- taskRoleSessionSet: "state.json#/tasks/*/roleSessionSets",
45
- workItem: "state.json#/tasks/*/workItems",
46
- contextSnapshot: "state.json#/tasks/*/contextSnapshots",
47
- agentRun: "state.json#/tasks/*/agentRuns",
48
- reviewRound: "state.json#/tasks/*/reviewRounds",
49
- changeSet: "state.json#/tasks/*/changeSets",
50
- integrationAttempt: "state.json#/tasks/*/integrationAttempts",
51
- integrationQueue: "state.json#/tasks/*/integrationQueue",
52
- durableJob: "state.json#/tasks/*/durableJobs",
53
- activeRunPointer: "state.json#/tasks/*/activeRuns",
54
- message: "state.json#/tasks/*/messages",
55
- inputRequest: "state.json#/tasks/*/inputRequests",
56
- decision: "state.json#/tasks/*/decisions",
57
- milestone: "state.json#/tasks/*/milestones",
58
- event: "state.json#/tasks/*/events",
59
- taskWake: "state.json#/tasks/*/wakes",
60
- capabilityGrant: "state.json#/tasks/*/capabilityGrants",
61
- releaseWorkflow: "state.json#/tasks/*/releaseWorkflows",
62
- publicationReference: "state.json#/tasks/*/publicationReferences",
63
- leaderFailure: "state.json#/tasks/*/leaderFailure",
64
- operatorNotification: "state.json#/tasks/*/operatorNotification",
65
- workMailbox: "state.json#/mailboxes"
66
- });
67
- /**
68
- * The one authoritative descriptor table for every direct StorageState and
69
- * StoredTask record family. `path` is a logical, human-readable location of
70
- * where the family's records live inside the authoritative store; the generic
71
- * engine treats it as opaque. Update this table whenever a family is added or
72
- * its `schemaVersion` changes — it tracks the live schema, it does not freeze
73
- * it.
74
- *
75
- * Lazy-initialized to avoid a circular-dependency TDZ: `recordVersions.ts`
76
- * imports the `CURRENT_*_SCHEMA_VERSION` constants from `taskStore.ts`, which
77
- * imports `requireStorageSchema` from `storageSchema.ts`, which (via the
78
- * provider pattern) depends on this module. Building the descriptors lazily
79
- * means the constants are only read at runtime, after every module has loaded.
80
- */
81
- let currentRecordDescriptors = null;
10
+ // Lazy construction avoids the taskStore -> storageSchema -> recordVersions
11
+ // initialization cycle while keeping one canonical family list.
12
+ let currentDescriptors = null;
82
13
  function getCurrentRecordDescriptors() {
83
- if (currentRecordDescriptors === null) {
84
- currentRecordDescriptors = Object.freeze({
85
- config: descriptor(CURRENT_CONFIG_SCHEMA_VERSION, "state.json#/config"),
86
- configuredAgent: descriptor(CURRENT_CONFIGURED_AGENT_SCHEMA_VERSION, "state.json#/configuredAgents"),
87
- project: descriptor(CURRENT_PROJECT_SCHEMA_VERSION, "state.json#/projects"),
88
- agentProfile: descriptor(CURRENT_AGENT_PROFILE_SCHEMA_VERSION, "state.json#/agentProfiles"),
89
- globalRole: descriptor(CURRENT_GLOBAL_ROLE_SCHEMA_VERSION, "state.json#/globalRoles"),
90
- globalRoleSessionSet: descriptor(CURRENT_GLOBAL_ROLE_SESSION_SET_SCHEMA_VERSION, "state.json#/globalRoleSessionSets"),
91
- // The task aggregate is itself a versioned record family. Keep this family
92
- // alongside (and distinct from) the nested `task` record family: an older
93
- // aggregate wrapper must be classified on the record axis before the strict
94
- // loader is asked to parse its nested members.
95
- storedTask: descriptor(CURRENT_STORED_TASK_SCHEMA_VERSION, "state.json#/tasks/*"),
96
- task: descriptor(CURRENT_TASK_SCHEMA_VERSION, "state.json#/tasks/*/task"),
97
- taskBrief: descriptor(CURRENT_TASK_BRIEF_SCHEMA_VERSION, "state.json#/tasks/*/brief"),
98
- taskRole: descriptor(CURRENT_TASK_ROLE_SCHEMA_VERSION, "state.json#/tasks/*/roles"),
99
- managedWorkspace: descriptor(CURRENT_MANAGED_WORKSPACE_SCHEMA_VERSION, "state.json#/tasks/*/managedWorkspaces"),
100
- taskRoleSessionSet: descriptor(CURRENT_TASK_ROLE_SESSION_SET_SCHEMA_VERSION, "state.json#/tasks/*/roleSessionSets"),
101
- workItem: descriptor(CURRENT_WORK_ITEM_SCHEMA_VERSION, "state.json#/tasks/*/workItems"),
102
- contextSnapshot: descriptor(CURRENT_CONTEXT_SNAPSHOT_SCHEMA_VERSION, "state.json#/tasks/*/contextSnapshots"),
103
- agentRun: descriptor(CURRENT_AGENT_RUN_SCHEMA_VERSION, "state.json#/tasks/*/agentRuns"),
104
- reviewRound: descriptor(CURRENT_REVIEW_ROUND_SCHEMA_VERSION, "state.json#/tasks/*/reviewRounds"),
105
- changeSet: descriptor(CURRENT_CHANGE_SET_SCHEMA_VERSION, "state.json#/tasks/*/changeSets"),
106
- integrationAttempt: descriptor(CURRENT_INTEGRATION_ATTEMPT_SCHEMA_VERSION, "state.json#/tasks/*/integrationAttempts"),
107
- integrationQueue: descriptor(CURRENT_INTEGRATION_QUEUE_SCHEMA_VERSION, "state.json#/tasks/*/integrationQueue"),
108
- durableJob: descriptor(CURRENT_DURABLE_JOB_SCHEMA_VERSION, "state.json#/tasks/*/durableJobs"),
109
- activeRunPointer: descriptor(CURRENT_ACTIVE_RUN_POINTER_SCHEMA_VERSION, "state.json#/tasks/*/activeRuns"),
110
- message: descriptor(CURRENT_MESSAGE_SCHEMA_VERSION, "state.json#/tasks/*/messages"),
111
- inputRequest: descriptor(CURRENT_INPUT_REQUEST_SCHEMA_VERSION, "state.json#/tasks/*/inputRequests"),
112
- decision: descriptor(CURRENT_DECISION_SCHEMA_VERSION, "state.json#/tasks/*/decisions"),
113
- milestone: descriptor(CURRENT_MILESTONE_SCHEMA_VERSION, "state.json#/tasks/*/milestones"),
114
- event: descriptor(CURRENT_EVENT_SCHEMA_VERSION, "state.json#/tasks/*/events"),
115
- taskWake: descriptor(CURRENT_TASK_WAKE_SCHEMA_VERSION, "state.json#/tasks/*/wakes"),
116
- capabilityGrant: descriptor(CURRENT_CAPABILITY_GRANT_SCHEMA_VERSION, "state.json#/tasks/*/capabilityGrants"),
117
- releaseWorkflow: descriptor(CURRENT_RELEASE_WORKFLOW_SCHEMA_VERSION, "state.json#/tasks/*/releaseWorkflows"),
118
- publicationReference: descriptor(CURRENT_PUBLICATION_REFERENCE_SCHEMA_VERSION, "state.json#/tasks/*/publicationReferences"),
119
- leaderFailure: descriptor(CURRENT_LEADER_FAILURE_SCHEMA_VERSION, "state.json#/tasks/*/leaderFailure"),
120
- // Historical family retained in the version graph so StoredTask v17
121
- // Homes can migrate; current v18 aggregates never store this field.
122
- operatorNotification: descriptor(1, "state.json#/tasks/*/operatorNotification"),
123
- workMailbox: descriptor(CURRENT_WORK_MAILBOX_SCHEMA_VERSION, "state.json#/mailboxes")
124
- });
14
+ if (currentDescriptors === null) {
15
+ const versions = {
16
+ config: CURRENT_CONFIG_SCHEMA_VERSION,
17
+ configuredAgent: CURRENT_CONFIGURED_AGENT_SCHEMA_VERSION,
18
+ project: CURRENT_PROJECT_SCHEMA_VERSION,
19
+ agentProfile: CURRENT_AGENT_PROFILE_SCHEMA_VERSION,
20
+ globalRole: CURRENT_GLOBAL_ROLE_SCHEMA_VERSION,
21
+ globalRoleSessionSet: CURRENT_GLOBAL_ROLE_SESSION_SET_SCHEMA_VERSION,
22
+ task: CURRENT_TASK_SCHEMA_VERSION,
23
+ taskBrief: CURRENT_TASK_BRIEF_SCHEMA_VERSION,
24
+ taskRole: CURRENT_TASK_ROLE_SCHEMA_VERSION,
25
+ managedWorkspace: CURRENT_MANAGED_WORKSPACE_SCHEMA_VERSION,
26
+ taskRoleSessionSet: CURRENT_TASK_ROLE_SESSION_SET_SCHEMA_VERSION,
27
+ workItem: CURRENT_WORK_ITEM_SCHEMA_VERSION,
28
+ contextSnapshot: CURRENT_CONTEXT_SNAPSHOT_SCHEMA_VERSION,
29
+ turn: CURRENT_TURN_SCHEMA_VERSION,
30
+ reviewRound: CURRENT_REVIEW_ROUND_SCHEMA_VERSION,
31
+ changeSet: CURRENT_CHANGE_SET_SCHEMA_VERSION,
32
+ integrationAttempt: CURRENT_INTEGRATION_ATTEMPT_SCHEMA_VERSION,
33
+ integrationQueue: CURRENT_INTEGRATION_QUEUE_SCHEMA_VERSION,
34
+ durableJob: CURRENT_DURABLE_JOB_SCHEMA_VERSION,
35
+ message: CURRENT_MESSAGE_SCHEMA_VERSION,
36
+ inputRequest: CURRENT_INPUT_REQUEST_SCHEMA_VERSION,
37
+ decision: CURRENT_DECISION_SCHEMA_VERSION,
38
+ milestone: CURRENT_MILESTONE_SCHEMA_VERSION,
39
+ event: CURRENT_EVENT_SCHEMA_VERSION,
40
+ taskWake: CURRENT_TASK_WAKE_SCHEMA_VERSION,
41
+ capabilityGrant: CURRENT_CAPABILITY_GRANT_SCHEMA_VERSION,
42
+ releaseWorkflow: CURRENT_RELEASE_WORKFLOW_SCHEMA_VERSION,
43
+ publicationReference: CURRENT_PUBLICATION_REFERENCE_SCHEMA_VERSION,
44
+ leaderFailure: CURRENT_LEADER_FAILURE_SCHEMA_VERSION,
45
+ workMailbox: CURRENT_WORK_MAILBOX_SCHEMA_VERSION
46
+ };
47
+ currentDescriptors = Object.freeze(Object.fromEntries(Object.entries(versions).map(([kind, version]) => [kind, descriptor(kind, version)])));
125
48
  }
126
- return currentRecordDescriptors;
49
+ return currentDescriptors;
127
50
  }
128
- /** Kept as the public-facing name used by upgrade callers and tests. */
129
- const CURRENT_RECORD_VERSIONS = getCurrentRecordDescriptors;
130
- /** The record-axis map for the current baseline (a defensive shallow copy). */
131
- export function currentRecordVersions(candidate = CURRENT_RECORD_VERSIONS()) {
51
+ /** Defensive copy of the current record-family contract. */
52
+ export function currentRecordVersions(candidate = getCurrentRecordDescriptors()) {
132
53
  assertRecordVersionDescriptors(candidate);
133
54
  return { ...candidate };
134
55
  }
135
- /**
136
- * Fail closed if a record descriptor map drifts from the one authoritative
137
- * table. The candidate parameter is exported so the regression suite can
138
- * exercise an unchecked-family version/path drift directly; production callers
139
- * use the default current descriptor table.
140
- */
141
- export function assertRecordVersionDescriptors(candidate = CURRENT_RECORD_VERSIONS()) {
142
- const expectedKinds = Object.keys(EXPECTED_DIRECT_RECORD_LOCATORS);
56
+ /** Reject missing, extra, stale, or non-SQLite record descriptors. */
57
+ export function assertRecordVersionDescriptors(candidate = getCurrentRecordDescriptors()) {
58
+ const expected = getCurrentRecordDescriptors();
59
+ const expectedKinds = Object.keys(expected);
143
60
  const mappedKinds = Object.keys(candidate);
144
61
  const missing = expectedKinds.filter((kind) => !Object.hasOwn(candidate, kind));
145
- const unexpected = mappedKinds.filter((kind) => !Object.hasOwn(EXPECTED_DIRECT_RECORD_LOCATORS, kind));
62
+ const unexpected = mappedKinds.filter((kind) => !Object.hasOwn(expected, kind));
146
63
  if (missing.length > 0 || unexpected.length > 0) {
147
64
  throw new Error(`Record version map completeness drift: missing=${missing.join(",") || "none"}; `
148
65
  + `unexpected=${unexpected.join(",") || "none"}.`);
149
66
  }
150
- const descriptors = getCurrentRecordDescriptors();
151
67
  for (const kind of expectedKinds) {
152
- const expected = descriptors[kind];
153
- const expectedPath = EXPECTED_DIRECT_RECORD_LOCATORS[kind];
154
- const mapped = candidate[kind];
155
- if (expected === undefined
156
- || mapped === undefined
157
- || mapped === null
158
- || mapped.version !== expected.version
159
- || mapped.path !== expectedPath) {
160
- throw new Error(`Record version map drift for ${kind}: expected=${String(expected?.version)}@${expectedPath}; `
161
- + `actual=${String(mapped?.version)}@${String(mapped?.path)}.`);
68
+ const wanted = expected[kind];
69
+ const found = candidate[kind];
70
+ if (found?.version !== wanted.version || found.path !== wanted.path) {
71
+ throw new Error(`Record version map drift for ${kind}: expected=${wanted.version}@${wanted.path}; `
72
+ + `actual=${String(found?.version)}@${String(found?.path)}.`);
162
73
  }
163
74
  }
164
75
  }
165
- /**
166
- * The full latest-supported {@link StorageVersionState} this release understands:
167
- * the scalar layout/aggregate versions plus the current record map. The engine
168
- * and classifier compare a source against this to decide the four-state verdict.
169
- */
170
- export function latestStorageVersionState(recordDescriptors = CURRENT_RECORD_VERSIONS()) {
76
+ export function latestStorageVersionState(recordDescriptors = getCurrentRecordDescriptors()) {
171
77
  return {
172
78
  layout: CURRENT_STORAGE_LAYOUT_VERSION,
173
79
  aggregate: CURRENT_AGGREGATE_SCHEMA_VERSION,