@zq-silk/yui 0.13.10 → 0.14.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.
Files changed (230) hide show
  1. package/ARCHITECTURE.md +69 -428
  2. package/README.md +113 -300
  3. package/dist/agent/argumentPolicy.js +2 -1
  4. package/dist/agent/managedRuntimeEnvironment.js +2 -2
  5. package/dist/cli/commandCatalog.js +39 -77
  6. package/dist/cli/interactionCandidates.js +4 -4
  7. package/dist/cli/interactionPolicy.js +7 -10
  8. package/dist/cli/invocationRouter.js +1 -1
  9. package/dist/cli/updateCommand.js +6 -27
  10. package/dist/cli/updateOrchestrator.js +63 -484
  11. package/dist/cli/updatePorts.js +15 -333
  12. package/dist/cli/upgradeCommand.js +8 -65
  13. package/dist/cli.js +57 -242
  14. package/dist/commands/configCommands.js +11 -62
  15. package/dist/commands/executionAuditCommands.js +23 -23
  16. package/dist/commands/globalRoleCommands.js +2 -7
  17. package/dist/commands/jobCommands.js +1 -4
  18. package/dist/commands/projectCommands.js +5 -5
  19. package/dist/commands/releaseCommands.js +3 -10
  20. package/dist/commands/resourcesCommands.js +2 -2
  21. package/dist/commands/sessionCommands.js +2 -2
  22. package/dist/commands/taskActor.js +31 -39
  23. package/dist/commands/taskChangeSetCommands.js +5 -12
  24. package/dist/commands/taskCommands.js +464 -1249
  25. package/dist/commands/taskContextCommand.js +35 -36
  26. package/dist/commands/taskExecutionCommands.js +33 -46
  27. package/dist/commands/taskInputCommands.js +20 -42
  28. package/dist/commands/taskNextActionCommand.js +9 -9
  29. package/dist/commands/taskOverviewCommand.js +56 -95
  30. package/dist/commands/taskRoleRuntimeStatus.js +77 -107
  31. package/dist/commands/taskUpstreamCommands.js +3 -3
  32. package/dist/commands/taskWorkspaceCommands.js +7 -79
  33. package/dist/commands/telemetryCommands.js +32 -124
  34. package/dist/commands/workflowCommands.js +3 -3
  35. package/dist/completion/fileCompletionManager.js +1 -1
  36. package/dist/config/configCatalog.js +4 -6
  37. package/dist/config/yuiConfig.js +6 -43
  38. package/dist/context/dispatchContext.js +14 -30
  39. package/dist/context/roleSessionContext.js +2 -2
  40. package/dist/context/sessionBootstrapManifest.js +20 -3
  41. package/dist/context/{runContextPack.js → turnContextPack.js} +58 -73
  42. package/dist/context/turnInputContract.js +204 -0
  43. package/dist/context/wakeNotification.js +2 -2
  44. package/dist/controller/agentRuntimeObserver.js +18 -18
  45. package/dist/controller/clientRuntime.js +13 -20
  46. package/dist/controller/controller.js +89 -116
  47. package/dist/controller/fileSchedulerStoreAdapter.js +511 -742
  48. package/dist/controller/jobControl.js +17 -17
  49. package/dist/controller/resourceInventory.js +6 -6
  50. package/dist/controller/resourceInventoryLinux.js +38 -59
  51. package/dist/controller/resourceInventoryRpc.js +3 -3
  52. package/dist/controller/resourceInventoryWorker.js +1 -1
  53. package/dist/controller/runtime.js +46 -53
  54. package/dist/controller/runtimeEventInbox.js +23 -31
  55. package/dist/controller/runtimeEventProcessor.js +15 -15
  56. package/dist/controller/{runtimeHookRunFence.js → runtimeHookTurnFence.js} +87 -81
  57. package/dist/controller/runtimeLaunchCoordinator.js +3 -3
  58. package/dist/controller/runtimeObservationHook.js +11 -8
  59. package/dist/controller/sessionNotify.js +11 -11
  60. package/dist/controller/structuredProviderObservation.js +89 -16
  61. package/dist/coordination/workMailbox.js +309 -579
  62. package/dist/coordination/workMailboxQueue.js +5 -6
  63. package/dist/core/controllerClient.js +1 -91
  64. package/dist/core/controllerServer.js +3 -6
  65. package/dist/doctor/doctor.js +51 -314
  66. package/dist/execution/candidateConvergence.js +3 -3
  67. package/dist/execution/executionGroup.js +32 -33
  68. package/dist/execution/executionHealth.js +36 -38
  69. package/dist/execution/resourceBroker.js +12 -12
  70. package/dist/executor/agentExecutor.js +30 -265
  71. package/dist/executor/effectiveLaunch.js +9 -19
  72. package/dist/executor/executorRegistry.js +43 -17
  73. package/dist/executor/fileRoleLaunchPlanner.js +91 -57
  74. package/dist/executor/launchPlan.js +3 -3
  75. package/dist/executor/workspacePreflightClassification.js +16 -16
  76. package/dist/grant/capabilityGrant.js +20 -25
  77. package/dist/input/inputRequest.js +12 -12
  78. package/dist/integration/changeSet.js +9 -13
  79. package/dist/integration/changeSetManifest.js +1 -1
  80. package/dist/integration/gitIntegrationService.js +2 -2
  81. package/dist/integration/integrationQueueService.js +5 -21
  82. package/dist/integration/overlapDiagnostics.js +2 -2
  83. package/dist/interaction/operatorPresentation.js +1 -1
  84. package/dist/job/jobRunner.js +1 -1
  85. package/dist/lifecycle/canonicalLifecycleEvent.js +25 -25
  86. package/dist/lifecycle/{exactRunTerminalization.js → exactTurnTerminalization.js} +116 -232
  87. package/dist/message/message.js +6 -6
  88. package/dist/observability/executionAudit.js +74 -86
  89. package/dist/observability/faultClassification.js +7 -24
  90. package/dist/observability/orchestrationMetrics.js +5 -5
  91. package/dist/observability/runtimeIdentity.js +34 -101
  92. package/dist/profile/agentProfile.js +1 -1
  93. package/dist/release/cliHomeReleaseFence.js +3 -3
  94. package/dist/release/releaseWorkflowEngine.js +6 -10
  95. package/dist/release/releaseWorkflowPorts.js +2 -2
  96. package/dist/release/workflowFileLock.js +1 -1
  97. package/dist/repository/checkoutSwap.js +1 -1
  98. package/dist/repository/gitWorkspace.js +0 -13
  99. package/dist/repository/project.js +1 -1
  100. package/dist/repository/projectMaintenanceLock.js +1 -2
  101. package/dist/repository/taskBaseFreshness.js +13 -13
  102. package/dist/repository/taskWorkspaceCoordinator.js +21 -25
  103. package/dist/repository/taskWorkspaceIdentity.js +8 -21
  104. package/dist/repository/taskWorkspacePreparer.js +63 -620
  105. package/dist/resources/autoResourceGc.js +3 -3
  106. package/dist/resources/liveReferences.js +1 -1
  107. package/dist/resources/resourceGc.js +1 -1
  108. package/dist/resources/sqliteResourceRegistry.js +1 -1
  109. package/dist/review/reviewDecision.js +7 -7
  110. package/dist/review/reviewFindingLedger.js +1 -1
  111. package/dist/review/reviewOutcomeClassifier.js +35 -50
  112. package/dist/review/reviewRound.js +14 -25
  113. package/dist/review/reviewerAvailability.js +4 -4
  114. package/dist/review/taskFinalReviewContractResolution.js +41 -0
  115. package/dist/role/role.js +6 -3
  116. package/dist/runtime/agentDriver.js +4 -0
  117. package/dist/runtime/agentHost.js +151 -36
  118. package/dist/runtime/builtinAgentDrivers.js +79 -2
  119. package/dist/runtime/codexAppServerRuntime.js +122 -0
  120. package/dist/runtime/continuationManager.js +3 -5
  121. package/dist/runtime/exactControlPlane.js +17 -42
  122. package/dist/runtime/firstProgressAdvisory.js +1 -1
  123. package/dist/runtime/index.js +2 -2
  124. package/dist/runtime/launchDiagnostics.js +2 -2
  125. package/dist/runtime/lifecycleReservation.js +4 -4
  126. package/dist/runtime/processExitObservation.js +1 -1
  127. package/dist/runtime/processExitOutbox.js +0 -32
  128. package/dist/runtime/promptEnvelope.js +9 -9
  129. package/dist/runtime/providerContinuation.js +2 -2
  130. package/dist/runtime/providerContinuationReconciliationService.js +2 -2
  131. package/dist/runtime/providerRuntimeIdentity.js +76 -24
  132. package/dist/runtime/recentTurnIds.js +38 -0
  133. package/dist/runtime/runtimeContinuationProjection.js +2 -2
  134. package/dist/runtime/runtimeHealthPolicy.js +1 -1
  135. package/dist/runtime/runtimeObservation.js +58 -21
  136. package/dist/runtime/runtimeProjection.js +19 -27
  137. package/dist/runtime/sessionLaunchRequest.js +2 -2
  138. package/dist/runtime/structuredProviderHost.js +177 -12
  139. package/dist/runtime/tmuxAdapters.js +46 -11
  140. package/dist/scheduler/activeRoleTurnDelivery.js +245 -0
  141. package/dist/scheduler/leaderWakeupProcessor.js +147 -445
  142. package/dist/scheduler/operatorEvent.js +4 -6
  143. package/dist/scheduler/resourceQueueProjection.js +71 -0
  144. package/dist/scheduler/{roleRunLiveness.js → roleTurnLiveness.js} +24 -28
  145. package/dist/scheduler/{roleRunStall.js → roleTurnStall.js} +162 -247
  146. package/dist/scheduler/taskExecutionProjection.js +99 -99
  147. package/dist/scheduler/taskObservabilityProjection.js +10 -10
  148. package/dist/scheduler/taskWake.js +4 -4
  149. package/dist/scheduler/wakeReason.js +6 -10
  150. package/dist/scheduler/wakeupQueue.js +0 -9
  151. package/dist/setup/setupCommand.js +2 -2
  152. package/dist/storage/currentTaskStore.js +46 -0
  153. package/dist/storage/persistenceWorker.js +1 -1
  154. package/dist/storage/sqliteSchema.js +81 -485
  155. package/dist/storage/sqliteStore.js +206 -365
  156. package/dist/storage/storageSchema.js +1 -15
  157. package/dist/storage/storageVersions.js +8 -9
  158. package/dist/storage/storeRpc.js +10 -34
  159. package/dist/storage/taskStore.js +63 -3415
  160. package/dist/storage/upgrade/recordVersions.js +55 -149
  161. package/dist/storage/upgrade/upgradeOrchestrator.js +89 -1752
  162. package/dist/task/completionReadiness.js +5 -5
  163. package/dist/task/deliveryGuard.js +10 -10
  164. package/dist/task/nextAction.js +74 -77
  165. package/dist/task/task.js +2 -4
  166. package/dist/task/taskRecordReference.js +3 -3
  167. package/dist/task/taskRecordRetirement.js +1 -1
  168. package/dist/telemetry/sqliteTelemetryStore.js +53 -53
  169. package/dist/telemetry/telemetryConfig.js +14 -14
  170. package/dist/telemetry/telemetryWiring.js +8 -14
  171. package/dist/turn/turn.js +356 -0
  172. package/dist/{run/runIdentity.js → turn/turnIdentity.js} +4 -4
  173. package/dist/verification/gateArtifactStore.js +2 -2
  174. package/dist/web/assets/client/app.js +1 -1
  175. package/dist/web/assets/client/components.js +29 -54
  176. package/dist/web/assets/client/i18n.js +17 -37
  177. package/dist/web/assets/client/view.js +37 -37
  178. package/dist/web/assets/shell.js +1 -1
  179. package/dist/web/assets/styles/cards.js +5 -5
  180. package/dist/web/assets/styles/widgets.js +1 -2
  181. package/dist/web/webSnapshot.js +65 -60
  182. package/dist/workItem/workItem.js +11 -11
  183. package/dist/workspace/workItemChangeSetManager.js +1 -1
  184. package/docs/task-local-identity.md +5 -5
  185. package/i18n/README.zh-CN.md +42 -55
  186. package/package.json +1 -1
  187. package/skills/yui-leader/SKILL.md +85 -83
  188. package/skills/yui-operator/SKILL.md +16 -16
  189. package/skills/yui-reviewer/SKILL.md +10 -10
  190. package/skills/yui-runtime/SKILL.md +22 -24
  191. package/skills/yui-worker/SKILL.md +16 -18
  192. package/dist/context/runContextContract.js +0 -162
  193. package/dist/executor/turnCompletion.js +0 -126
  194. package/dist/review/taskFinalReviewContractEvent.js +0 -1
  195. package/dist/review/taskFinalReviewContractRebind.js +0 -367
  196. package/dist/run/agentRun.js +0 -356
  197. package/dist/run/rejectedYieldAttempt.js +0 -221
  198. package/dist/run/runControlRequest.js +0 -50
  199. package/dist/run/yieldReceipt.js +0 -65
  200. package/dist/runtime/turnCompletion.js +0 -3
  201. package/dist/scheduler/actionability.js +0 -323
  202. package/dist/scheduler/activeRoleRunDelivery.js +0 -868
  203. package/dist/scheduler/activeTaskProgress.js +0 -126
  204. package/dist/storage/compatibleTaskStore.js +0 -248
  205. package/dist/storage/migration/baseline.js +0 -78
  206. package/dist/storage/migration/classifier.js +0 -51
  207. package/dist/storage/migration/compatibleCodec.js +0 -53
  208. package/dist/storage/migration/engine.js +0 -147
  209. package/dist/storage/migration/index.js +0 -33
  210. package/dist/storage/migration/planner.js +0 -154
  211. package/dist/storage/migration/productionRegistry.js +0 -3931
  212. package/dist/storage/migration/registry.js +0 -169
  213. package/dist/storage/migration/report.js +0 -54
  214. package/dist/storage/migration/types.js +0 -31
  215. package/dist/storage/upgrade/homeClassification.js +0 -353
  216. package/dist/storage/upgrade/homeMigrationTarget.js +0 -595
  217. package/dist/storage/upgrade/migrationReceipt.js +0 -67
  218. package/dist/storage/upgrade/offlineUpgradeInventory.js +0 -453
  219. package/dist/storage/upgrade/productionMigrationRegistry.js +0 -6
  220. package/dist/storage/upgrade/pseudoLayoutRepair.js +0 -241
  221. package/dist/storage/upgrade/recordVersionScan.js +0 -176
  222. package/dist/storage/upgrade/sqliteFileSet.js +0 -50
  223. package/dist/storage/upgrade/sqliteMigrationTarget.js +0 -375
  224. package/dist/storage/upgrade/sqliteRecordMigrationTarget.js +0 -305
  225. package/dist/storage/upgrade/sqliteStateMigration.js +0 -926
  226. package/dist/storage/upgrade/switchProgress.js +0 -80
  227. package/dist/storage/upgrade/upgradeReceipt.js +0 -161
  228. package/dist/storage/upgradeCoordination.js +0 -187
  229. package/dist/storage/upgradeFence.js +0 -366
  230. 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,