@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.
- package/README.md +5 -5
- package/dist/agent/managedRuntimeEnvironment.js +2 -1
- package/dist/cli/agentConfigurationPicker.js +1 -1
- package/dist/cli/commandCatalog.js +251 -13
- package/dist/cli/updateOrchestrator.js +8 -0
- package/dist/cli/updatePorts.js +76 -22
- package/dist/cli.js +264 -20
- package/dist/commands/configCommands.js +83 -9
- package/dist/commands/controllerCommands.js +103 -0
- package/dist/commands/deliveryGuardPreflight.js +35 -0
- package/dist/commands/durableJobCommands.js +231 -0
- package/dist/commands/executionAuditCommands.js +193 -0
- package/dist/commands/grantCommands.js +374 -0
- package/dist/commands/projectCommands.js +119 -81
- package/dist/commands/releaseCommands.js +444 -0
- package/dist/commands/resourcesCommands.js +274 -0
- package/dist/commands/sessionCommands.js +104 -0
- package/dist/commands/taskActor.js +117 -0
- package/dist/commands/taskChangeSetCommands.js +60 -0
- package/dist/commands/taskCommands.js +610 -201
- package/dist/commands/taskCompletionGate.js +78 -1
- package/dist/commands/taskContextCommand.js +24 -6
- package/dist/commands/taskInputCommands.js +1 -1
- package/dist/commands/taskIntegrationCommands.js +136 -33
- package/dist/commands/taskIntegrationQueueCommands.js +228 -0
- package/dist/commands/taskNextActionCommand.js +85 -0
- package/dist/commands/taskOverlapCommands.js +120 -0
- package/dist/commands/taskOverviewCommand.js +36 -8
- package/dist/commands/telemetryCommands.js +330 -0
- package/dist/commands/workflowCommands.js +415 -0
- package/dist/config/yuiConfig.js +60 -0
- package/dist/controller/clientRuntime.js +42 -1
- package/dist/controller/controller.js +413 -61
- package/dist/controller/controllerMain.js +25 -2
- package/dist/controller/domainIdentity.js +16 -8
- package/dist/controller/ephemeralResourceReaper.js +2 -1
- package/dist/controller/fileSchedulerStoreAdapter.js +423 -31
- package/dist/controller/handoverCandidate.js +168 -0
- package/dist/controller/jobClient.js +102 -0
- package/dist/controller/jobControl.js +613 -0
- package/dist/controller/jobSupervisor.js +498 -0
- package/dist/controller/providerHookRunFence.js +34 -5
- package/dist/controller/resourceCleanupLinux.js +18 -9
- package/dist/controller/resourceInventoryLinux.js +90 -39
- package/dist/controller/resourceInventoryRpc.js +85 -0
- package/dist/controller/resourceInventoryWorker.js +50 -0
- package/dist/controller/runtime.js +238 -22
- package/dist/controller/runtimeEventInbox.js +234 -57
- package/dist/controller/runtimeEventProcessor.js +549 -42
- package/dist/controller/sessionOwnerReconciliation.js +321 -0
- package/dist/core/boundedRpc.js +475 -0
- package/dist/core/controllerServer.js +416 -27
- package/dist/core/controllerTelemetry.js +167 -0
- package/dist/doctor/doctor.js +113 -16
- package/dist/domain/validation.js +9 -0
- package/dist/execution/executionGroup.js +40 -3
- package/dist/executor/agentExecutor.js +6 -3
- package/dist/executor/effectiveLaunch.js +52 -0
- package/dist/executor/executorRegistry.js +50 -0
- package/dist/executor/fileRoleLaunchPlanner.js +61 -6
- package/dist/grant/capabilityGrant.js +282 -0
- package/dist/integration/changeSet.js +16 -3
- package/dist/integration/changeSetManifest.js +46 -0
- package/dist/integration/gitIntegrationService.js +528 -147
- package/dist/integration/integrationAttempt.js +54 -5
- package/dist/integration/integrationQueueEntry.js +221 -0
- package/dist/integration/integrationQueueService.js +955 -0
- package/dist/integration/manifestTags.js +99 -0
- package/dist/integration/overlapDiagnostics.js +211 -0
- package/dist/job/durableJob.js +449 -0
- package/dist/job/jobRunner.js +350 -0
- package/dist/lifecycle/exactRunTerminalization.js +24 -2
- package/dist/lifecycle/providerErrorClass.js +126 -0
- package/dist/message/message.js +16 -3
- package/dist/observability/executionAudit.js +545 -0
- package/dist/observability/faultClassification.js +160 -0
- package/dist/observability/runtimeIdentity.js +367 -0
- package/dist/release/fakeReleasePorts.js +55 -0
- package/dist/release/releaseHandover.js +475 -0
- package/dist/release/releaseIdempotencyStore.js +165 -0
- package/dist/release/releaseWorkflow.js +459 -0
- package/dist/release/releaseWorkflowEngine.js +688 -0
- package/dist/release/releaseWorkflowPorts.js +1720 -0
- package/dist/release/runtimeRelease.js +495 -0
- package/dist/release/workflowFileLock.js +218 -0
- package/dist/repository/gitWorkspace.js +177 -1
- package/dist/repository/projectMaintenanceLock.js +315 -0
- package/dist/repository/taskWorkspaceCoordinator.js +87 -17
- package/dist/repository/taskWorkspacePreparer.js +1091 -517
- package/dist/resources/autoResourceGc.js +116 -0
- package/dist/resources/liveReferences.js +574 -0
- package/dist/resources/resourceDiscovery.js +477 -0
- package/dist/resources/resourceGc.js +645 -0
- package/dist/resources/resourceRegistrar.js +256 -0
- package/dist/resources/resourceRegistry.js +150 -0
- package/dist/resources/resourceRegistryStore.js +41 -0
- package/dist/resources/resourceTypes.js +42 -0
- package/dist/resources/sqliteResourceRegistry.js +111 -0
- package/dist/review/reviewConfig.js +10 -0
- package/dist/review/reviewFinding.js +240 -0
- package/dist/review/reviewFindingLedger.js +545 -0
- package/dist/review/reviewOutcomeClassifier.js +61 -0
- package/dist/review/reviewRound.js +56 -4
- package/dist/run/agentRun.js +80 -4
- package/dist/run/providerRetry.js +84 -0
- package/dist/run/providerRetryConfig.js +63 -0
- package/dist/run/yieldReceipt.js +65 -0
- package/dist/runtime/exactControlPlane.js +79 -2
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/sessionOwnerIdentity.js +269 -0
- package/dist/runtime/sessionOwnerRegistry.js +132 -0
- package/dist/runtime/sessionReconciliation.js +93 -0
- package/dist/runtime/sessionTerminationGuard.js +211 -0
- package/dist/runtime/taskRuntimeIsolation.js +13 -0
- package/dist/runtime/tmuxAdapters.js +34 -1
- package/dist/scheduler/actionability.js +155 -0
- package/dist/scheduler/activeRoleRunDelivery.js +14 -5
- package/dist/scheduler/activeTaskProgress.js +60 -0
- package/dist/scheduler/leaderWakeupProcessor.js +22 -11
- package/dist/scheduler/roleRunStall.js +135 -29
- package/dist/scheduler/taskExecutionProjection.js +11 -0
- package/dist/setup/setupCommand.js +27 -4
- package/dist/storage/compatibleTaskStore.js +112 -5
- package/dist/storage/migration/productionRegistry.js +769 -1
- package/dist/storage/persistenceWorker.js +194 -0
- package/dist/storage/sqliteSchema.js +705 -0
- package/dist/storage/sqliteStore.js +1695 -0
- package/dist/storage/storageVersions.js +9 -2
- package/dist/storage/storeRpc.js +298 -0
- package/dist/storage/taskStore.js +982 -21
- package/dist/storage/upgrade/homeClassification.js +157 -12
- package/dist/storage/upgrade/migrationReceipt.js +67 -0
- package/dist/storage/upgrade/pseudoLayoutRepair.js +241 -0
- package/dist/storage/upgrade/recordVersions.js +10 -1
- package/dist/storage/upgrade/sqliteMigrationTarget.js +351 -0
- package/dist/storage/upgrade/sqliteRecordMigrationTarget.js +290 -0
- package/dist/storage/upgrade/sqliteStateMigration.js +713 -0
- package/dist/storage/upgrade/upgradeOrchestrator.js +510 -18
- package/dist/task/deliveryGuard.js +226 -0
- package/dist/task/nextAction.js +343 -0
- package/dist/task/repairWave.js +137 -0
- package/dist/task/taskRecordReference.js +6 -1
- package/dist/telemetry/sqliteTelemetryStore.js +387 -0
- package/dist/telemetry/telemetryCompaction.js +251 -0
- package/dist/telemetry/telemetryConfig.js +64 -0
- package/dist/telemetry/telemetryRouter.js +32 -0
- package/dist/telemetry/telemetryStore.js +19 -0
- package/dist/telemetry/telemetryWiring.js +33 -0
- package/dist/tmux/tmuxManager.js +20 -1
- package/dist/tmux/tmuxSocketEndpoint.js +20 -0
- package/dist/verification/gateArtifact.js +216 -0
- package/dist/verification/gateArtifactStore.js +87 -0
- package/dist/verification/verificationGateService.js +414 -0
- package/dist/verification/verificationPlan.js +308 -0
- package/dist/workspace/gitChangeSetCapture.js +12 -2
- package/dist/workspace/workItemChangeSetManager.js +60 -3
- 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
|
+
});
|