@zq-silk/yui 0.5.3 → 0.6.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 (157) hide show
  1. package/README.md +5 -5
  2. package/dist/agent/managedRuntimeEnvironment.js +2 -1
  3. package/dist/cli/agentConfigurationPicker.js +1 -1
  4. package/dist/cli/commandCatalog.js +251 -13
  5. package/dist/cli/updateOrchestrator.js +8 -0
  6. package/dist/cli/updatePorts.js +76 -22
  7. package/dist/cli.js +264 -20
  8. package/dist/commands/configCommands.js +83 -9
  9. package/dist/commands/controllerCommands.js +103 -0
  10. package/dist/commands/deliveryGuardPreflight.js +35 -0
  11. package/dist/commands/durableJobCommands.js +231 -0
  12. package/dist/commands/executionAuditCommands.js +193 -0
  13. package/dist/commands/grantCommands.js +374 -0
  14. package/dist/commands/projectCommands.js +119 -81
  15. package/dist/commands/releaseCommands.js +444 -0
  16. package/dist/commands/resourcesCommands.js +274 -0
  17. package/dist/commands/sessionCommands.js +104 -0
  18. package/dist/commands/taskActor.js +117 -0
  19. package/dist/commands/taskChangeSetCommands.js +60 -0
  20. package/dist/commands/taskCommands.js +610 -201
  21. package/dist/commands/taskCompletionGate.js +78 -1
  22. package/dist/commands/taskContextCommand.js +24 -6
  23. package/dist/commands/taskInputCommands.js +1 -1
  24. package/dist/commands/taskIntegrationCommands.js +136 -33
  25. package/dist/commands/taskIntegrationQueueCommands.js +228 -0
  26. package/dist/commands/taskNextActionCommand.js +85 -0
  27. package/dist/commands/taskOverlapCommands.js +120 -0
  28. package/dist/commands/taskOverviewCommand.js +36 -8
  29. package/dist/commands/telemetryCommands.js +330 -0
  30. package/dist/commands/workflowCommands.js +415 -0
  31. package/dist/config/yuiConfig.js +60 -0
  32. package/dist/controller/clientRuntime.js +42 -1
  33. package/dist/controller/controller.js +413 -61
  34. package/dist/controller/controllerMain.js +25 -2
  35. package/dist/controller/domainIdentity.js +16 -8
  36. package/dist/controller/ephemeralResourceReaper.js +2 -1
  37. package/dist/controller/fileSchedulerStoreAdapter.js +423 -31
  38. package/dist/controller/handoverCandidate.js +168 -0
  39. package/dist/controller/jobClient.js +102 -0
  40. package/dist/controller/jobControl.js +613 -0
  41. package/dist/controller/jobSupervisor.js +498 -0
  42. package/dist/controller/providerHookRunFence.js +34 -5
  43. package/dist/controller/resourceCleanupLinux.js +18 -9
  44. package/dist/controller/resourceInventoryLinux.js +90 -39
  45. package/dist/controller/resourceInventoryRpc.js +85 -0
  46. package/dist/controller/resourceInventoryWorker.js +50 -0
  47. package/dist/controller/runtime.js +238 -22
  48. package/dist/controller/runtimeEventInbox.js +234 -57
  49. package/dist/controller/runtimeEventProcessor.js +549 -42
  50. package/dist/controller/sessionOwnerReconciliation.js +321 -0
  51. package/dist/core/boundedRpc.js +475 -0
  52. package/dist/core/controllerServer.js +416 -27
  53. package/dist/core/controllerTelemetry.js +167 -0
  54. package/dist/doctor/doctor.js +113 -16
  55. package/dist/domain/validation.js +9 -0
  56. package/dist/execution/executionGroup.js +40 -3
  57. package/dist/executor/agentExecutor.js +6 -3
  58. package/dist/executor/effectiveLaunch.js +52 -0
  59. package/dist/executor/executorRegistry.js +50 -0
  60. package/dist/executor/fileRoleLaunchPlanner.js +61 -6
  61. package/dist/grant/capabilityGrant.js +282 -0
  62. package/dist/integration/changeSet.js +16 -3
  63. package/dist/integration/changeSetManifest.js +46 -0
  64. package/dist/integration/gitIntegrationService.js +528 -147
  65. package/dist/integration/integrationAttempt.js +54 -5
  66. package/dist/integration/integrationQueueEntry.js +221 -0
  67. package/dist/integration/integrationQueueService.js +955 -0
  68. package/dist/integration/manifestTags.js +99 -0
  69. package/dist/integration/overlapDiagnostics.js +211 -0
  70. package/dist/job/durableJob.js +449 -0
  71. package/dist/job/jobRunner.js +350 -0
  72. package/dist/lifecycle/exactRunTerminalization.js +24 -2
  73. package/dist/lifecycle/providerErrorClass.js +126 -0
  74. package/dist/message/message.js +16 -3
  75. package/dist/observability/executionAudit.js +545 -0
  76. package/dist/observability/faultClassification.js +160 -0
  77. package/dist/observability/runtimeIdentity.js +367 -0
  78. package/dist/release/fakeReleasePorts.js +55 -0
  79. package/dist/release/releaseHandover.js +475 -0
  80. package/dist/release/releaseIdempotencyStore.js +165 -0
  81. package/dist/release/releaseWorkflow.js +459 -0
  82. package/dist/release/releaseWorkflowEngine.js +688 -0
  83. package/dist/release/releaseWorkflowPorts.js +1720 -0
  84. package/dist/release/runtimeRelease.js +495 -0
  85. package/dist/release/workflowFileLock.js +218 -0
  86. package/dist/repository/gitWorkspace.js +177 -1
  87. package/dist/repository/projectMaintenanceLock.js +315 -0
  88. package/dist/repository/taskWorkspaceCoordinator.js +87 -17
  89. package/dist/repository/taskWorkspacePreparer.js +1091 -517
  90. package/dist/resources/autoResourceGc.js +116 -0
  91. package/dist/resources/liveReferences.js +574 -0
  92. package/dist/resources/resourceDiscovery.js +477 -0
  93. package/dist/resources/resourceGc.js +645 -0
  94. package/dist/resources/resourceRegistrar.js +256 -0
  95. package/dist/resources/resourceRegistry.js +150 -0
  96. package/dist/resources/resourceRegistryStore.js +41 -0
  97. package/dist/resources/resourceTypes.js +42 -0
  98. package/dist/resources/sqliteResourceRegistry.js +111 -0
  99. package/dist/review/reviewConfig.js +10 -0
  100. package/dist/review/reviewFinding.js +240 -0
  101. package/dist/review/reviewFindingLedger.js +545 -0
  102. package/dist/review/reviewOutcomeClassifier.js +61 -0
  103. package/dist/review/reviewRound.js +56 -4
  104. package/dist/run/agentRun.js +80 -4
  105. package/dist/run/providerRetry.js +84 -0
  106. package/dist/run/providerRetryConfig.js +63 -0
  107. package/dist/run/yieldReceipt.js +65 -0
  108. package/dist/runtime/exactControlPlane.js +79 -2
  109. package/dist/runtime/index.js +4 -0
  110. package/dist/runtime/sessionOwnerIdentity.js +269 -0
  111. package/dist/runtime/sessionOwnerRegistry.js +132 -0
  112. package/dist/runtime/sessionReconciliation.js +93 -0
  113. package/dist/runtime/sessionTerminationGuard.js +211 -0
  114. package/dist/runtime/taskRuntimeIsolation.js +13 -0
  115. package/dist/runtime/tmuxAdapters.js +34 -1
  116. package/dist/scheduler/actionability.js +155 -0
  117. package/dist/scheduler/activeRoleRunDelivery.js +14 -5
  118. package/dist/scheduler/activeTaskProgress.js +60 -0
  119. package/dist/scheduler/leaderWakeupProcessor.js +22 -11
  120. package/dist/scheduler/roleRunStall.js +135 -29
  121. package/dist/scheduler/taskExecutionProjection.js +11 -0
  122. package/dist/setup/setupCommand.js +27 -4
  123. package/dist/storage/compatibleTaskStore.js +112 -5
  124. package/dist/storage/migration/productionRegistry.js +769 -1
  125. package/dist/storage/persistenceWorker.js +194 -0
  126. package/dist/storage/sqliteSchema.js +705 -0
  127. package/dist/storage/sqliteStore.js +1695 -0
  128. package/dist/storage/storageVersions.js +9 -2
  129. package/dist/storage/storeRpc.js +298 -0
  130. package/dist/storage/taskStore.js +982 -21
  131. package/dist/storage/upgrade/homeClassification.js +157 -12
  132. package/dist/storage/upgrade/migrationReceipt.js +67 -0
  133. package/dist/storage/upgrade/pseudoLayoutRepair.js +241 -0
  134. package/dist/storage/upgrade/recordVersions.js +10 -1
  135. package/dist/storage/upgrade/sqliteMigrationTarget.js +351 -0
  136. package/dist/storage/upgrade/sqliteRecordMigrationTarget.js +290 -0
  137. package/dist/storage/upgrade/sqliteStateMigration.js +713 -0
  138. package/dist/storage/upgrade/upgradeOrchestrator.js +510 -18
  139. package/dist/task/deliveryGuard.js +226 -0
  140. package/dist/task/nextAction.js +343 -0
  141. package/dist/task/repairWave.js +137 -0
  142. package/dist/task/taskRecordReference.js +6 -1
  143. package/dist/telemetry/sqliteTelemetryStore.js +387 -0
  144. package/dist/telemetry/telemetryCompaction.js +251 -0
  145. package/dist/telemetry/telemetryConfig.js +64 -0
  146. package/dist/telemetry/telemetryRouter.js +32 -0
  147. package/dist/telemetry/telemetryStore.js +19 -0
  148. package/dist/telemetry/telemetryWiring.js +33 -0
  149. package/dist/tmux/tmuxManager.js +20 -1
  150. package/dist/tmux/tmuxSocketEndpoint.js +20 -0
  151. package/dist/verification/gateArtifact.js +216 -0
  152. package/dist/verification/gateArtifactStore.js +87 -0
  153. package/dist/verification/verificationGateService.js +414 -0
  154. package/dist/verification/verificationPlan.js +308 -0
  155. package/dist/workspace/gitChangeSetCapture.js +12 -2
  156. package/dist/workspace/workItemChangeSetManager.js +60 -3
  157. package/package.json +2 -1
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Persistence Worker Thread (task-21, work-item-5).
3
+ *
4
+ * The worker owns the {@link SqliteTaskStore} connection: one writer connection
5
+ * (single-writer, `BEGIN IMMEDIATE`) plus a small read pool (separate WAL
6
+ * connections that never take the write lock, §3.2). The main thread never
7
+ * touches the db; it sends commands over a `MessageChannel` port and receives
8
+ * results.
9
+ *
10
+ * The port handshake, dispatch, cancellation observation, and error
11
+ * serialization are provided by the shared `core/boundedRpc` worker host
12
+ * (`runRpcWorker`); this module supplies the storage dialect:
13
+ *
14
+ * - `call` ......... a `TaskStore` method. Reads use the read pool; writes
15
+ * run on the writer inside a transaction and are made
16
+ * idempotent via the durable outbox (§5.4): a retried
17
+ * write after a crash returns `already-applied`.
18
+ * - `transaction` .. an ordered command batch inside one
19
+ * `BEGIN IMMEDIATE … COMMIT` on the writer (§3.2),
20
+ * yielding between commands so a `cancel` can roll back an
21
+ * open transaction (§3.1). Committed batches are not undone.
22
+ * - `observer` ..... a controller observer method hosted by the worker (the
23
+ * `FileSchedulerStoreAdapter` folds run here, off the main
24
+ * event loop).
25
+ * - `expectedRevision` enforces the global revision CAS in the same txn
26
+ * (§5.3); a mismatch fails with `StorageConflictError`.
27
+ *
28
+ * `synchronous=FULL` is never weakened; the worker opens the store with the same
29
+ * pragmas as the in-process path (WAL, FULL, busy_timeout).
30
+ */
31
+ import { runRpcWorker } from "../core/boundedRpc.js";
32
+ import { SqliteTaskStore } from "./sqliteStore.js";
33
+ import { StorageRecordError } from "./taskStore.js";
34
+ // -- method invocation -------------------------------------------------------
35
+ function invokeMethod(target, method, args) {
36
+ const fn = target[method];
37
+ if (typeof fn !== "function") {
38
+ throw new StorageRecordError(`Unknown store method: ${method}`);
39
+ }
40
+ return fn.apply(target, args);
41
+ }
42
+ /**
43
+ * Sentinel returned by a handler when the durable outbox already records the
44
+ * request's effect (§5.4). The host's `result` builder maps it to an
45
+ * `already-applied` response. Store results are plain JSON data, so a Symbol
46
+ * sentinel can never collide with a real result.
47
+ */
48
+ const ALREADY_APPLIED = Symbol("already-applied");
49
+ const state = {
50
+ writer: undefined,
51
+ readers: [],
52
+ readIndex: 0,
53
+ observer: undefined,
54
+ cancelled: new Set()
55
+ };
56
+ function nextReader() {
57
+ const reader = state.readers[state.readIndex % state.readers.length];
58
+ state.readIndex += 1;
59
+ return reader;
60
+ }
61
+ // -- request handlers --------------------------------------------------------
62
+ async function handleInit(request) {
63
+ const writer = new SqliteTaskStore(request.home);
64
+ const poolSize = request.readPoolSize ?? 4;
65
+ const readers = [];
66
+ for (let index = 0; index < poolSize; index += 1) {
67
+ readers.push(new SqliteTaskStore(request.home));
68
+ }
69
+ state.writer = writer;
70
+ state.readers = readers;
71
+ if (request.observerModule !== undefined) {
72
+ const module = (await import(request.observerModule));
73
+ const Adapter = module.FileSchedulerStoreAdapter;
74
+ if (Adapter === undefined) {
75
+ throw new Error(`Observer module ${request.observerModule} does not export FileSchedulerStoreAdapter.`);
76
+ }
77
+ const host = new Adapter(writer);
78
+ state.observer = {
79
+ invoke(method, args) {
80
+ return invokeMethod(host, method, args);
81
+ }
82
+ };
83
+ }
84
+ }
85
+ async function handleCall(request) {
86
+ const { requestId, method, args, readOnly } = request;
87
+ if (readOnly) {
88
+ return invokeMethod(nextReader(), method, args);
89
+ }
90
+ // Write. With a requestId, make it idempotent via the durable outbox
91
+ // (§5.4): skip if already committed, otherwise record the effect in the
92
+ // same transaction. The worker is single-threaded, so the check and the
93
+ // write are race-free; the UNIQUE constraint is the backstop.
94
+ const writer = state.writer;
95
+ if (writer === undefined)
96
+ throw new Error("Worker not initialized.");
97
+ if (writer.hasOutboxEntry(requestId)) {
98
+ return ALREADY_APPLIED;
99
+ }
100
+ return writer.transaction((store) => invokeMethod(store, method, args), { requestId });
101
+ }
102
+ async function handleTransaction(request) {
103
+ const { requestId, commands, expectedRevision } = request;
104
+ const writer = state.writer;
105
+ if (writer === undefined) {
106
+ throw new Error("Worker not initialized.");
107
+ }
108
+ // Idempotent replay: a batch that committed before a crash is not re-run.
109
+ if (writer.hasOutboxEntry(requestId)) {
110
+ return ALREADY_APPLIED;
111
+ }
112
+ const shouldCancel = () => state.cancelled.has(requestId);
113
+ try {
114
+ return await writer.transactionAsyncBatch(commands, {
115
+ requestId,
116
+ ...(expectedRevision === undefined ? {} : { expectedRevision }),
117
+ shouldCancel
118
+ });
119
+ }
120
+ finally {
121
+ state.cancelled.delete(requestId);
122
+ }
123
+ }
124
+ async function handleObserver(request) {
125
+ if (state.observer === undefined) {
126
+ throw new Error("Worker has no observer host (observerModule not provided at init).");
127
+ }
128
+ return state.observer.invoke(request.method, request.args);
129
+ }
130
+ // -- worker host --------------------------------------------------------------
131
+ runRpcWorker({
132
+ serial: true,
133
+ kindOf: (request) => {
134
+ switch (request.kind) {
135
+ case "init":
136
+ return "init";
137
+ case "cancel":
138
+ return "cancel";
139
+ case "shutdown":
140
+ return "shutdown";
141
+ case "call":
142
+ case "transaction":
143
+ case "observer":
144
+ return "request";
145
+ }
146
+ },
147
+ requestIdOf: (request) => {
148
+ switch (request.kind) {
149
+ case "call":
150
+ case "transaction":
151
+ case "observer":
152
+ case "cancel":
153
+ return request.requestId;
154
+ case "init":
155
+ case "shutdown":
156
+ return undefined;
157
+ }
158
+ },
159
+ init: (request) => handleInit(request),
160
+ handle: (request) => {
161
+ switch (request.kind) {
162
+ case "call":
163
+ return handleCall(request);
164
+ case "transaction":
165
+ return handleTransaction(request);
166
+ case "observer":
167
+ return handleObserver(request);
168
+ case "init":
169
+ case "cancel":
170
+ case "shutdown":
171
+ throw new Error(`Unexpected request kind for handle: ${request.kind}`);
172
+ }
173
+ },
174
+ cancel: (requestId) => {
175
+ state.cancelled.add(requestId);
176
+ },
177
+ shutdown: async () => {
178
+ for (const reader of state.readers) {
179
+ try {
180
+ reader.close();
181
+ }
182
+ catch { /* already closed */ }
183
+ }
184
+ try {
185
+ state.writer?.close();
186
+ }
187
+ catch { /* already closed */ }
188
+ },
189
+ ready: () => ({ kind: "ready" }),
190
+ result: (requestId, value) => (value === ALREADY_APPLIED
191
+ ? { kind: "already-applied", requestId }
192
+ : { kind: "result", requestId, result: value }),
193
+ error: (requestId, error) => ({ kind: "error", requestId, error })
194
+ });