@zq-silk/yui 0.16.2 → 1.0.0-alpha
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 +6 -4
- package/dist/agent/agent.js +4 -9
- package/dist/agent/executionComponents.js +4 -4
- package/dist/agentRun/agentRun.js +8 -8
- package/dist/artifacts/managedGit.js +3 -56
- package/dist/brief/taskBrief.js +3 -3
- package/dist/cli/updateOrchestrator.js +2 -13
- package/dist/cli/updatePorts.js +36 -69
- package/dist/cli/upgradeCommand.js +4 -8
- package/dist/cli.js +4 -7
- package/dist/commands/controllerCommands.js +1 -1
- package/dist/commands/taskCommands.js +8 -1
- package/dist/commands/taskRoleRuntimeStatus.js +1 -1
- package/dist/context/runInputContract.js +1 -1
- package/dist/controller/agentRuntimeObserver.js +4 -4
- package/dist/controller/clientRuntime.js +19 -44
- package/dist/controller/controller.js +16 -4
- package/dist/controller/fileSchedulerStoreAdapter.js +6 -6
- package/dist/controller/globalInputDelivery.js +3 -1
- package/dist/controller/jobSupervisor.js +3 -3
- package/dist/controller/providerRetryDelivery.js +128 -118
- package/dist/controller/runtime.js +1 -1
- package/dist/controller/structuredProviderObservation.js +1 -1
- package/dist/coordination/workMailbox.js +4 -4
- package/dist/core/controllerIdentity.js +25 -0
- package/dist/core/controllerProcessIdentity.js +2 -2
- package/dist/core/controllerServer.js +4 -2
- package/dist/core/protocol.js +1 -1
- package/dist/domain/validation.js +6 -0
- package/dist/event/taskEvent.js +3 -3
- package/dist/execution/workItemExecution.js +2 -2
- package/dist/executor/agentExecutor.js +6 -6
- package/dist/executor/effectiveLaunch.js +3 -3
- package/dist/grant/capabilityGrant.js +2 -2
- package/dist/input/inputRequest.js +4 -4
- package/dist/integration/changeSet.js +3 -3
- package/dist/integration/integrationAttempt.js +3 -3
- package/dist/integration/integrationSourceApplication.js +1 -1
- package/dist/job/durableJob.js +1 -1
- package/dist/job/jobRunner.js +2 -2
- package/dist/message/message.js +8 -6
- package/dist/milestone/milestone.js +3 -3
- package/dist/profile/agentProfile.js +3 -3
- package/dist/release/runtimeRelease.js +9 -7
- package/dist/repository/project.js +3 -3
- package/dist/resources/liveReferences.js +1 -1
- package/dist/resources/sqliteResourceRegistry.js +2 -2
- package/dist/review/reviewRound.js +5 -5
- package/dist/role/role.js +7 -8
- package/dist/runtime/acpProtocol.js +2 -3
- package/dist/runtime/agentDriverObservation.js +1 -1
- package/dist/runtime/agentHost.js +3 -3
- package/dist/runtime/agentHostProtocol.js +2 -2
- package/dist/runtime/codexInteractiveHost.js +1 -1
- package/dist/runtime/launchBroker.js +1 -1
- package/dist/runtime/processExitObservation.js +1 -1
- package/dist/runtime/providerContinuationReconciliationService.js +84 -75
- package/dist/runtime/providerRuntimeIdentity.js +3 -3
- package/dist/runtime/runtimeCoherence.js +7 -3
- package/dist/runtime/runtimeObservation.js +3 -3
- package/dist/runtime/sessionOwnerIdentity.js +1 -1
- package/dist/runtime/taskRuntimeIsolation.js +3 -3
- package/dist/runtime/tmuxAdapters.js +3 -3
- package/dist/scheduler/taskWake.js +1 -1
- package/dist/storage/baselineSchema.js +606 -0
- package/dist/storage/homeLayout.js +5 -16
- package/dist/storage/recordValidation.js +16 -4
- package/dist/storage/sqliteSchema.js +106 -1741
- package/dist/storage/sqliteStore.js +16 -14
- package/dist/storage/storageSchema.js +8 -7
- package/dist/storage/storageVersions.js +23 -16
- package/dist/storage/taskStore.js +3 -29
- package/dist/storage/upgrade/upgradeOrchestrator.js +14 -102
- package/dist/task/task.js +15 -7
- package/dist/task/taskActivation.js +5 -4
- package/dist/telemetry/sqliteTelemetryStore.js +2 -2
- package/dist/verification/gateArtifact.js +5 -3
- package/dist/verification/verificationPlan.js +6 -7
- package/dist/workItem/workItem.js +6 -6
- package/dist/workspace/cleanupInspection.js +1 -9
- package/dist/worktree/managedWorkspace.js +3 -3
- package/docs/managed-turn-and-session-runtime.md +26 -14
- package/docs/managed-turn-and-session-runtime.zh-CN.md +18 -10
- package/docs/release-workflow.md +52 -300
- package/docs/release-workflow.zh-CN.md +41 -234
- package/docs/sqlite-control-plane-design.md +48 -289
- package/docs/sqlite-control-plane-design.zh-CN.md +37 -53
- package/docs/storage-baseline.md +132 -0
- package/docs/storage-baseline.zh-CN.md +106 -0
- package/docs/task-delivery.md +3 -4
- package/docs/task-delivery.zh-CN.md +3 -3
- package/docs/testing/verification-levels.md +40 -180
- package/docs/testing/verification-levels.zh-CN.md +27 -131
- package/i18n/README.zh-CN.md +5 -4
- package/package.json +1 -1
- package/dist/storage/migrations/agentFailureContext.js +0 -22
- package/dist/storage/migrations/agentRunContract.js +0 -159
- package/dist/storage/migrations/artifactsToGit.js +0 -338
- package/dist/storage/migrations/collapseWorktreeLayout.js +0 -963
- package/dist/storage/migrations/currentInputContract.js +0 -86
- package/dist/storage/migrations/currentRuntimeContract.js +0 -228
- package/dist/storage/migrations/historicalVerificationPlan.js +0 -35
- package/dist/storage/migrations/integrationContinuation.js +0 -105
- package/dist/storage/migrations/narrowAgentFailureContext.js +0 -65
- package/dist/storage/migrations/notificationOnlyWakes.js +0 -74
- package/dist/storage/migrations/removeRuntimeGeneration.js +0 -207
- package/dist/storage/migrations/submitIntent.js +0 -126
- package/dist/storage/migrations/unifyHomeLayout.js +0 -925
- package/dist/storage/migrations/verificationPlanV1.js +0 -162
- package/dist/storage/migrations/verificationPolicy.js +0 -74
- package/dist/storage/migrations/workItemHistory.js +0 -46
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
/** Current Home schema. Fresh initialization executes this once; no historical DDL is replayed. */
|
|
2
|
+
export const BASELINE_SCHEMA_SQL = String.raw `CREATE TABLE storage_schema (
|
|
3
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
4
|
+
format TEXT NOT NULL,
|
|
5
|
+
major INTEGER NOT NULL CHECK (major > 0),
|
|
6
|
+
minor INTEGER NOT NULL CHECK (minor >= 0),
|
|
7
|
+
checksum TEXT NOT NULL,
|
|
8
|
+
created_at TEXT NOT NULL
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
CREATE TABLE active_turns (
|
|
12
|
+
task_id TEXT NOT NULL,
|
|
13
|
+
pointer TEXT NOT NULL,
|
|
14
|
+
turn_id TEXT NOT NULL,
|
|
15
|
+
payload TEXT NOT NULL,
|
|
16
|
+
updated_at TEXT NOT NULL,
|
|
17
|
+
PRIMARY KEY (task_id, pointer)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE agent_profiles (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
payload TEXT NOT NULL,
|
|
23
|
+
updated_at TEXT NOT NULL
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
CREATE TABLE capability_grants (
|
|
27
|
+
task_id TEXT NOT NULL,
|
|
28
|
+
grant_id TEXT NOT NULL,
|
|
29
|
+
payload TEXT NOT NULL,
|
|
30
|
+
updated_at TEXT NOT NULL,
|
|
31
|
+
PRIMARY KEY (task_id, grant_id)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE TABLE change_sets (
|
|
35
|
+
task_id TEXT NOT NULL,
|
|
36
|
+
change_set_id TEXT NOT NULL,
|
|
37
|
+
project_id TEXT NOT NULL,
|
|
38
|
+
head_sha TEXT NOT NULL,
|
|
39
|
+
payload TEXT NOT NULL,
|
|
40
|
+
created_at TEXT NOT NULL,
|
|
41
|
+
PRIMARY KEY (task_id, change_set_id)
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE TABLE config (
|
|
45
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
46
|
+
payload TEXT NOT NULL,
|
|
47
|
+
updated_at TEXT NOT NULL
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
CREATE TABLE configured_agents (
|
|
51
|
+
id TEXT PRIMARY KEY,
|
|
52
|
+
payload TEXT NOT NULL,
|
|
53
|
+
updated_at TEXT NOT NULL
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
CREATE TABLE context_snapshots (
|
|
57
|
+
task_id TEXT NOT NULL,
|
|
58
|
+
snapshot_id TEXT NOT NULL,
|
|
59
|
+
scope TEXT NOT NULL CHECK (scope IN ('task','workitem','stage')),
|
|
60
|
+
scope_ref TEXT,
|
|
61
|
+
sequence INTEGER NOT NULL CHECK (sequence > 0),
|
|
62
|
+
digest TEXT NOT NULL CHECK (length(digest) = 64),
|
|
63
|
+
payload TEXT NOT NULL,
|
|
64
|
+
frozen_at TEXT NOT NULL,
|
|
65
|
+
PRIMARY KEY (task_id, snapshot_id),
|
|
66
|
+
FOREIGN KEY (task_id) REFERENCES tasks_catalog(task_id) ON DELETE CASCADE,
|
|
67
|
+
CHECK ((scope = 'task' AND scope_ref IS NULL) OR (scope <> 'task' AND scope_ref IS NOT NULL))
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
CREATE TABLE decisions (
|
|
71
|
+
task_id TEXT NOT NULL,
|
|
72
|
+
decision_id TEXT NOT NULL,
|
|
73
|
+
payload TEXT NOT NULL,
|
|
74
|
+
created_at TEXT NOT NULL,
|
|
75
|
+
PRIMARY KEY (task_id, decision_id)
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
CREATE TABLE durable_jobs (
|
|
79
|
+
job_id TEXT NOT NULL,
|
|
80
|
+
task_id TEXT NOT NULL,
|
|
81
|
+
idempotency_key TEXT,
|
|
82
|
+
status TEXT NOT NULL,
|
|
83
|
+
payload TEXT NOT NULL,
|
|
84
|
+
created_at TEXT NOT NULL,
|
|
85
|
+
updated_at TEXT NOT NULL,
|
|
86
|
+
PRIMARY KEY (task_id, job_id)
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
CREATE TABLE environment_preparations (
|
|
90
|
+
task_id TEXT NOT NULL REFERENCES tasks_catalog(task_id),
|
|
91
|
+
id TEXT NOT NULL,
|
|
92
|
+
payload TEXT NOT NULL,
|
|
93
|
+
PRIMARY KEY (task_id, id)
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
CREATE TABLE events (
|
|
97
|
+
task_id TEXT NOT NULL,
|
|
98
|
+
event_id TEXT NOT NULL,
|
|
99
|
+
type TEXT NOT NULL,
|
|
100
|
+
occurred_at TEXT NOT NULL,
|
|
101
|
+
payload TEXT NOT NULL,
|
|
102
|
+
PRIMARY KEY (task_id, event_id)
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
CREATE TABLE gate_artifact_logs (
|
|
106
|
+
artifact_key TEXT NOT NULL,
|
|
107
|
+
step_name TEXT NOT NULL,
|
|
108
|
+
log_content BLOB NOT NULL,
|
|
109
|
+
log_digest TEXT NOT NULL,
|
|
110
|
+
log_bytes INTEGER NOT NULL,
|
|
111
|
+
PRIMARY KEY (artifact_key, step_name),
|
|
112
|
+
FOREIGN KEY (artifact_key) REFERENCES gate_artifacts(key) ON DELETE CASCADE
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
CREATE TABLE gate_artifacts (
|
|
116
|
+
key TEXT PRIMARY KEY,
|
|
117
|
+
project_id TEXT NOT NULL,
|
|
118
|
+
level TEXT NOT NULL CHECK (level IN ('L1','L2')),
|
|
119
|
+
commit_sha TEXT NOT NULL,
|
|
120
|
+
plan_digest TEXT NOT NULL,
|
|
121
|
+
toolchain_digest TEXT NOT NULL,
|
|
122
|
+
target_ref TEXT,
|
|
123
|
+
status TEXT NOT NULL CHECK (status IN ('incomplete','complete')),
|
|
124
|
+
outcome TEXT NOT NULL CHECK (outcome IN ('unknown','succeeded','failed')),
|
|
125
|
+
payload TEXT NOT NULL,
|
|
126
|
+
created_at TEXT NOT NULL,
|
|
127
|
+
completed_at TEXT,
|
|
128
|
+
last_used_at TEXT NOT NULL
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
CREATE TABLE global_role_messages (
|
|
132
|
+
name TEXT NOT NULL,
|
|
133
|
+
message_id TEXT NOT NULL,
|
|
134
|
+
seq INTEGER NOT NULL,
|
|
135
|
+
payload TEXT NOT NULL,
|
|
136
|
+
created_at TEXT NOT NULL,
|
|
137
|
+
PRIMARY KEY (name, message_id),
|
|
138
|
+
FOREIGN KEY (name) REFERENCES global_roles(name)
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
CREATE TABLE global_role_session_sets (
|
|
142
|
+
name TEXT PRIMARY KEY,
|
|
143
|
+
payload TEXT NOT NULL,
|
|
144
|
+
updated_at TEXT NOT NULL,
|
|
145
|
+
FOREIGN KEY (name) REFERENCES global_roles(name)
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
CREATE TABLE global_roles (
|
|
149
|
+
name TEXT PRIMARY KEY,
|
|
150
|
+
payload TEXT NOT NULL,
|
|
151
|
+
updated_at TEXT NOT NULL
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
CREATE TABLE global_sequences (
|
|
155
|
+
name TEXT PRIMARY KEY,
|
|
156
|
+
high_water INTEGER NOT NULL
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
CREATE TABLE home_meta (
|
|
160
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
161
|
+
home_identity TEXT NOT NULL,
|
|
162
|
+
revision INTEGER NOT NULL,
|
|
163
|
+
created_at TEXT NOT NULL,
|
|
164
|
+
updated_at TEXT NOT NULL
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
CREATE TABLE id_sequences (
|
|
168
|
+
task_id TEXT NOT NULL,
|
|
169
|
+
kind TEXT NOT NULL,
|
|
170
|
+
high_water INTEGER NOT NULL,
|
|
171
|
+
PRIMARY KEY (task_id, kind)
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
CREATE TABLE input_requests (
|
|
175
|
+
task_id TEXT NOT NULL,
|
|
176
|
+
input_id TEXT NOT NULL,
|
|
177
|
+
status TEXT NOT NULL,
|
|
178
|
+
blocks TEXT,
|
|
179
|
+
payload TEXT NOT NULL,
|
|
180
|
+
created_at TEXT NOT NULL,
|
|
181
|
+
updated_at TEXT NOT NULL,
|
|
182
|
+
PRIMARY KEY (task_id, input_id)
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
CREATE TABLE integration_attempts (
|
|
186
|
+
task_id TEXT NOT NULL,
|
|
187
|
+
integration_id TEXT NOT NULL,
|
|
188
|
+
status TEXT NOT NULL,
|
|
189
|
+
payload TEXT NOT NULL,
|
|
190
|
+
updated_at TEXT NOT NULL,
|
|
191
|
+
PRIMARY KEY (task_id, integration_id)
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
CREATE TABLE local_resources (
|
|
195
|
+
id TEXT PRIMARY KEY,
|
|
196
|
+
canonical_identity TEXT NOT NULL UNIQUE,
|
|
197
|
+
payload TEXT NOT NULL
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
CREATE TABLE mailboxes (
|
|
201
|
+
mailbox_id INTEGER PRIMARY KEY,
|
|
202
|
+
target_kind TEXT NOT NULL CHECK (target_kind IN
|
|
203
|
+
('task','role','role-runtime','global-role-runtime','operator')),
|
|
204
|
+
task_id TEXT,
|
|
205
|
+
role_name TEXT,
|
|
206
|
+
-- The stable mailboxTargetKey string carries the real uniqueness: the column
|
|
207
|
+
-- UNIQUE below cannot, because NULL task_id/role_name (the 'operator' and
|
|
208
|
+
-- 'global-role-runtime' targets) are distinct under SQL NULL semantics.
|
|
209
|
+
target_key TEXT NOT NULL,
|
|
210
|
+
next_sequence INTEGER NOT NULL,
|
|
211
|
+
processing TEXT,
|
|
212
|
+
pending TEXT,
|
|
213
|
+
recent_dedupe_keys TEXT NOT NULL DEFAULT '[]',
|
|
214
|
+
UNIQUE (target_kind, task_id, role_name)
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
CREATE TABLE managed_workspaces (
|
|
218
|
+
owner_kind TEXT NOT NULL CHECK (owner_kind IN
|
|
219
|
+
('task','work-item','review-round','integration-attempt','execution-lane')),
|
|
220
|
+
owner_id TEXT NOT NULL,
|
|
221
|
+
task_id TEXT,
|
|
222
|
+
path TEXT NOT NULL,
|
|
223
|
+
payload TEXT NOT NULL,
|
|
224
|
+
status TEXT NOT NULL,
|
|
225
|
+
created_at TEXT NOT NULL,
|
|
226
|
+
updated_at TEXT NOT NULL,
|
|
227
|
+
PRIMARY KEY (owner_kind, owner_id)
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
CREATE TABLE messages (
|
|
231
|
+
task_id TEXT NOT NULL,
|
|
232
|
+
message_id TEXT NOT NULL,
|
|
233
|
+
seq INTEGER NOT NULL,
|
|
234
|
+
payload TEXT NOT NULL,
|
|
235
|
+
created_at TEXT NOT NULL,
|
|
236
|
+
PRIMARY KEY (task_id, message_id)
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
CREATE TABLE milestones (
|
|
240
|
+
task_id TEXT NOT NULL,
|
|
241
|
+
milestone_id TEXT NOT NULL,
|
|
242
|
+
payload TEXT NOT NULL,
|
|
243
|
+
created_at TEXT NOT NULL,
|
|
244
|
+
PRIMARY KEY (task_id, milestone_id)
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
CREATE TABLE outbox (
|
|
248
|
+
outbox_id INTEGER PRIMARY KEY,
|
|
249
|
+
request_id TEXT NOT NULL UNIQUE,
|
|
250
|
+
command TEXT NOT NULL,
|
|
251
|
+
state TEXT NOT NULL DEFAULT 'pending',
|
|
252
|
+
created_at TEXT NOT NULL,
|
|
253
|
+
applied_at TEXT
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
CREATE TABLE plugin_intents (
|
|
257
|
+
task_id TEXT NOT NULL REFERENCES tasks_catalog(task_id),
|
|
258
|
+
plugin_id TEXT NOT NULL,
|
|
259
|
+
payload TEXT NOT NULL,
|
|
260
|
+
PRIMARY KEY (task_id, plugin_id)
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
CREATE TABLE plugin_validations (
|
|
264
|
+
task_id TEXT NOT NULL REFERENCES tasks_catalog(task_id),
|
|
265
|
+
id TEXT NOT NULL,
|
|
266
|
+
payload TEXT NOT NULL,
|
|
267
|
+
PRIMARY KEY (task_id, id)
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
CREATE TABLE projects (
|
|
271
|
+
id TEXT PRIMARY KEY,
|
|
272
|
+
name TEXT NOT NULL,
|
|
273
|
+
path TEXT NOT NULL,
|
|
274
|
+
payload TEXT NOT NULL,
|
|
275
|
+
created_at TEXT NOT NULL,
|
|
276
|
+
updated_at TEXT NOT NULL
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
CREATE TABLE publication_references (
|
|
280
|
+
task_id TEXT NOT NULL,
|
|
281
|
+
publication_id TEXT NOT NULL,
|
|
282
|
+
project_id TEXT NOT NULL,
|
|
283
|
+
provider TEXT NOT NULL,
|
|
284
|
+
repository TEXT NOT NULL,
|
|
285
|
+
external_kind TEXT NOT NULL,
|
|
286
|
+
external_id TEXT NOT NULL,
|
|
287
|
+
external_key TEXT NOT NULL,
|
|
288
|
+
state TEXT NOT NULL,
|
|
289
|
+
verification TEXT NOT NULL,
|
|
290
|
+
external_url TEXT,
|
|
291
|
+
title TEXT,
|
|
292
|
+
source_branch TEXT,
|
|
293
|
+
target_branch TEXT,
|
|
294
|
+
local_commit TEXT,
|
|
295
|
+
remote_commit TEXT,
|
|
296
|
+
supersedes TEXT,
|
|
297
|
+
payload TEXT NOT NULL,
|
|
298
|
+
merged_at TEXT,
|
|
299
|
+
created_at TEXT NOT NULL,
|
|
300
|
+
PRIMARY KEY (task_id, publication_id)
|
|
301
|
+
);
|
|
302
|
+
|
|
303
|
+
CREATE TABLE release_workflows (
|
|
304
|
+
task_id TEXT NOT NULL,
|
|
305
|
+
workflow_id TEXT NOT NULL,
|
|
306
|
+
payload TEXT NOT NULL,
|
|
307
|
+
updated_at TEXT NOT NULL,
|
|
308
|
+
PRIMARY KEY (task_id, workflow_id)
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
CREATE TABLE resource_registry (
|
|
312
|
+
id TEXT PRIMARY KEY,
|
|
313
|
+
kind TEXT NOT NULL,
|
|
314
|
+
path TEXT NOT NULL,
|
|
315
|
+
disposition TEXT NOT NULL,
|
|
316
|
+
task_id TEXT,
|
|
317
|
+
payload TEXT NOT NULL,
|
|
318
|
+
created_at TEXT NOT NULL,
|
|
319
|
+
updated_at TEXT NOT NULL
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
CREATE TABLE review_rounds (
|
|
323
|
+
task_id TEXT NOT NULL,
|
|
324
|
+
review_round_id TEXT NOT NULL,
|
|
325
|
+
status TEXT NOT NULL,
|
|
326
|
+
payload TEXT NOT NULL,
|
|
327
|
+
updated_at TEXT NOT NULL,
|
|
328
|
+
PRIMARY KEY (task_id, review_round_id)
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
CREATE TABLE role_session_sets (
|
|
332
|
+
task_id TEXT NOT NULL,
|
|
333
|
+
role_name TEXT NOT NULL,
|
|
334
|
+
payload TEXT NOT NULL,
|
|
335
|
+
updated_at TEXT NOT NULL,
|
|
336
|
+
PRIMARY KEY (task_id, role_name)
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
CREATE TABLE runtime_session_candidates (
|
|
340
|
+
scope TEXT NOT NULL CHECK(scope IN ('task','global')), task_id TEXT NOT NULL,
|
|
341
|
+
role_name TEXT NOT NULL, agent_id TEXT NOT NULL, adapter_id TEXT NOT NULL,
|
|
342
|
+
native_session_id TEXT NOT NULL, session_updated_at TEXT NOT NULL,
|
|
343
|
+
PRIMARY KEY(scope, task_id, role_name),
|
|
344
|
+
CHECK((scope = 'task' AND length(task_id) > 0) OR (scope = 'global' AND task_id = ''))
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
CREATE TABLE session_owners (
|
|
348
|
+
process_key TEXT PRIMARY KEY, scope TEXT NOT NULL CHECK(scope IN ('task','global')),
|
|
349
|
+
task_id TEXT, role_name TEXT NOT NULL, agent_id TEXT NOT NULL, native_session_id TEXT,
|
|
350
|
+
provider_root_pid INTEGER, payload TEXT NOT NULL, recorded_at TEXT NOT NULL
|
|
351
|
+
);
|
|
352
|
+
|
|
353
|
+
CREATE TABLE storage_migration_archive (
|
|
354
|
+
migration_version INTEGER NOT NULL,
|
|
355
|
+
family TEXT NOT NULL,
|
|
356
|
+
record_key TEXT NOT NULL,
|
|
357
|
+
payload TEXT NOT NULL,
|
|
358
|
+
content BLOB,
|
|
359
|
+
PRIMARY KEY (migration_version, family, record_key)
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
CREATE TABLE task_projections (
|
|
363
|
+
task_id TEXT NOT NULL,
|
|
364
|
+
kind TEXT NOT NULL CHECK (kind IN ('leader-failure','operator-notification')),
|
|
365
|
+
payload TEXT,
|
|
366
|
+
updated_at TEXT NOT NULL,
|
|
367
|
+
PRIMARY KEY (task_id, kind)
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
CREATE TABLE task_records (
|
|
371
|
+
task_id TEXT PRIMARY KEY,
|
|
372
|
+
payload TEXT NOT NULL,
|
|
373
|
+
brief TEXT,
|
|
374
|
+
updated_at TEXT NOT NULL,
|
|
375
|
+
FOREIGN KEY (task_id) REFERENCES tasks_catalog(task_id)
|
|
376
|
+
);
|
|
377
|
+
|
|
378
|
+
CREATE TABLE task_roles (
|
|
379
|
+
task_id TEXT NOT NULL,
|
|
380
|
+
role_name TEXT NOT NULL,
|
|
381
|
+
payload TEXT NOT NULL,
|
|
382
|
+
updated_at TEXT NOT NULL,
|
|
383
|
+
PRIMARY KEY (task_id, role_name)
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
CREATE TABLE task_wakes (
|
|
387
|
+
task_id TEXT NOT NULL,
|
|
388
|
+
wake_id TEXT NOT NULL,
|
|
389
|
+
seq INTEGER NOT NULL,
|
|
390
|
+
status TEXT NOT NULL CHECK (status IN ('dispatched','consumed')),
|
|
391
|
+
from_cursor TEXT NOT NULL,
|
|
392
|
+
to_cursor TEXT NOT NULL,
|
|
393
|
+
reasons TEXT NOT NULL,
|
|
394
|
+
payload TEXT NOT NULL,
|
|
395
|
+
created_at TEXT NOT NULL,
|
|
396
|
+
consumed_at TEXT,
|
|
397
|
+
PRIMARY KEY (task_id, wake_id)
|
|
398
|
+
);
|
|
399
|
+
|
|
400
|
+
CREATE TABLE tasks_catalog (
|
|
401
|
+
task_id TEXT PRIMARY KEY,
|
|
402
|
+
status TEXT NOT NULL,
|
|
403
|
+
lifecycle TEXT NOT NULL,
|
|
404
|
+
is_active INTEGER NOT NULL CHECK (is_active IN (0,1)),
|
|
405
|
+
created_at TEXT NOT NULL,
|
|
406
|
+
updated_at TEXT NOT NULL
|
|
407
|
+
);
|
|
408
|
+
|
|
409
|
+
CREATE TABLE telemetry (
|
|
410
|
+
task_id TEXT NOT NULL, role_name TEXT NOT NULL, turn_id TEXT NOT NULL,
|
|
411
|
+
progress_id TEXT NOT NULL, sequence INTEGER, payload TEXT NOT NULL,
|
|
412
|
+
received_at TEXT NOT NULL,
|
|
413
|
+
PRIMARY KEY (task_id, role_name, turn_id, progress_id)
|
|
414
|
+
) WITHOUT ROWID;
|
|
415
|
+
|
|
416
|
+
CREATE TABLE telemetry_aggregate (
|
|
417
|
+
task_id TEXT NOT NULL, role_name TEXT NOT NULL, turn_id TEXT NOT NULL,
|
|
418
|
+
first_at TEXT NOT NULL, last_at TEXT NOT NULL, count INTEGER NOT NULL,
|
|
419
|
+
max_sequence INTEGER, error_count INTEGER NOT NULL DEFAULT 0, updated_at TEXT NOT NULL,
|
|
420
|
+
PRIMARY KEY (task_id, role_name, turn_id)
|
|
421
|
+
) WITHOUT ROWID;
|
|
422
|
+
|
|
423
|
+
CREATE TABLE turns (
|
|
424
|
+
task_id TEXT NOT NULL,
|
|
425
|
+
turn_id TEXT NOT NULL,
|
|
426
|
+
role_name TEXT NOT NULL,
|
|
427
|
+
status TEXT NOT NULL,
|
|
428
|
+
payload TEXT NOT NULL,
|
|
429
|
+
updated_at TEXT NOT NULL,
|
|
430
|
+
PRIMARY KEY (task_id, turn_id)
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
CREATE TABLE work_items (
|
|
434
|
+
task_id TEXT NOT NULL,
|
|
435
|
+
work_item_id TEXT NOT NULL,
|
|
436
|
+
status TEXT NOT NULL,
|
|
437
|
+
payload TEXT NOT NULL,
|
|
438
|
+
updated_at TEXT NOT NULL,
|
|
439
|
+
PRIMARY KEY (task_id, work_item_id)
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
CREATE INDEX idx_change_sets_project ON change_sets(task_id, project_id);
|
|
443
|
+
|
|
444
|
+
CREATE UNIQUE INDEX idx_context_snapshots_scope_sequence
|
|
445
|
+
ON context_snapshots(task_id, scope, COALESCE(scope_ref, ''), sequence);
|
|
446
|
+
|
|
447
|
+
CREATE UNIQUE INDEX idx_durable_jobs_idempotency
|
|
448
|
+
ON durable_jobs(task_id, idempotency_key) WHERE idempotency_key IS NOT NULL;
|
|
449
|
+
|
|
450
|
+
CREATE UNIQUE INDEX idx_durable_jobs_request
|
|
451
|
+
ON durable_jobs(task_id, json_extract(payload, '$.operation.actorId'),
|
|
452
|
+
json_extract(payload, '$.operation.requestId'));
|
|
453
|
+
|
|
454
|
+
CREATE INDEX idx_durable_jobs_status ON durable_jobs(status);
|
|
455
|
+
|
|
456
|
+
CREATE INDEX idx_durable_jobs_task ON durable_jobs(task_id);
|
|
457
|
+
|
|
458
|
+
CREATE INDEX idx_events_type_time ON events(task_id, type, occurred_at);
|
|
459
|
+
|
|
460
|
+
CREATE INDEX idx_gate_artifacts_project_commit
|
|
461
|
+
ON gate_artifacts(project_id, commit_sha);
|
|
462
|
+
|
|
463
|
+
CREATE INDEX idx_gate_artifacts_project_last_used
|
|
464
|
+
ON gate_artifacts(project_id, last_used_at);
|
|
465
|
+
|
|
466
|
+
CREATE INDEX idx_global_provider_retry ON global_role_session_sets(
|
|
467
|
+
json_extract(payload, '$.providerBinding.retry.status')
|
|
468
|
+
) WHERE json_extract(payload, '$.providerBinding.retry.status') IN ('waiting', 'in-flight');
|
|
469
|
+
|
|
470
|
+
CREATE INDEX idx_global_role_messages_seq ON global_role_messages(name, seq);
|
|
471
|
+
|
|
472
|
+
CREATE INDEX idx_input_requests_open_hot
|
|
473
|
+
ON input_requests(task_id, input_id)
|
|
474
|
+
WHERE status = 'open';
|
|
475
|
+
|
|
476
|
+
CREATE INDEX idx_mailboxes_ready
|
|
477
|
+
ON mailboxes(target_key)
|
|
478
|
+
WHERE processing IS NOT NULL OR json_type(pending) <> 'null';
|
|
479
|
+
|
|
480
|
+
CREATE UNIQUE INDEX idx_mailboxes_target_key
|
|
481
|
+
ON mailboxes(target_key);
|
|
482
|
+
|
|
483
|
+
CREATE INDEX idx_messages_seq ON messages(task_id, seq);
|
|
484
|
+
|
|
485
|
+
CREATE INDEX idx_outbox_state ON outbox(state, created_at);
|
|
486
|
+
|
|
487
|
+
CREATE INDEX idx_publication_references_external
|
|
488
|
+
ON publication_references(external_key);
|
|
489
|
+
|
|
490
|
+
CREATE UNIQUE INDEX idx_publication_references_external_root
|
|
491
|
+
ON publication_references(external_key) WHERE supersedes IS NULL;
|
|
492
|
+
|
|
493
|
+
CREATE INDEX idx_publication_references_task
|
|
494
|
+
ON publication_references(task_id);
|
|
495
|
+
|
|
496
|
+
CREATE INDEX idx_resource_registry_disposition
|
|
497
|
+
ON resource_registry(disposition);
|
|
498
|
+
|
|
499
|
+
CREATE INDEX idx_resource_registry_task
|
|
500
|
+
ON resource_registry(task_id);
|
|
501
|
+
|
|
502
|
+
CREATE INDEX idx_session_owners_task ON session_owners(task_id, role_name);
|
|
503
|
+
|
|
504
|
+
CREATE INDEX idx_task_provider_retry ON role_session_sets(
|
|
505
|
+
json_extract(payload, '$.providerBinding.retry.status')
|
|
506
|
+
) WHERE json_extract(payload, '$.providerBinding.retry.status') IN ('waiting', 'in-flight');
|
|
507
|
+
|
|
508
|
+
CREATE INDEX idx_task_wakes_seq ON task_wakes(task_id, seq);
|
|
509
|
+
|
|
510
|
+
CREATE INDEX idx_tasks_activation_pending ON task_records(task_id)
|
|
511
|
+
WHERE json_extract(payload, '$.activationRequest.disposition') = 'pending';
|
|
512
|
+
|
|
513
|
+
CREATE INDEX idx_tasks_active ON tasks_catalog(is_active) WHERE is_active = 1;
|
|
514
|
+
|
|
515
|
+
CREATE INDEX idx_telemetry_turn ON telemetry(task_id, turn_id);
|
|
516
|
+
|
|
517
|
+
CREATE INDEX idx_turns_planning_active ON turns(task_id, turn_id)
|
|
518
|
+
WHERE status = 'active' AND json_extract(payload, '$.purpose') = 'planning';
|
|
519
|
+
|
|
520
|
+
CREATE INDEX idx_turns_role_status ON turns(task_id, role_name, status);
|
|
521
|
+
|
|
522
|
+
CREATE INDEX idx_work_items_status ON work_items(task_id, status);
|
|
523
|
+
|
|
524
|
+
CREATE INDEX idx_workspaces_task ON managed_workspaces(task_id);
|
|
525
|
+
|
|
526
|
+
CREATE TRIGGER telemetry_ai AFTER INSERT ON telemetry
|
|
527
|
+
BEGIN
|
|
528
|
+
INSERT INTO telemetry_aggregate
|
|
529
|
+
(task_id, role_name, turn_id, first_at, last_at, count, max_sequence, error_count, updated_at)
|
|
530
|
+
VALUES (NEW.task_id, NEW.role_name, NEW.turn_id, NEW.received_at, NEW.received_at,
|
|
531
|
+
1, NEW.sequence,
|
|
532
|
+
CASE WHEN json_valid(NEW.payload)
|
|
533
|
+
AND (COALESCE(json_extract(NEW.payload, '$.error'), '') <> ''
|
|
534
|
+
OR COALESCE(json_extract(NEW.payload, '$.errorKind'), '') <> '')
|
|
535
|
+
THEN 1 ELSE 0 END, NEW.received_at)
|
|
536
|
+
ON CONFLICT(task_id, role_name, turn_id) DO UPDATE SET
|
|
537
|
+
first_at = MIN(telemetry_aggregate.first_at, excluded.first_at),
|
|
538
|
+
last_at = MAX(telemetry_aggregate.last_at, excluded.last_at),
|
|
539
|
+
count = telemetry_aggregate.count + 1,
|
|
540
|
+
max_sequence = CASE WHEN excluded.max_sequence IS NOT NULL
|
|
541
|
+
AND (telemetry_aggregate.max_sequence IS NULL OR excluded.max_sequence > telemetry_aggregate.max_sequence)
|
|
542
|
+
THEN excluded.max_sequence ELSE telemetry_aggregate.max_sequence END,
|
|
543
|
+
error_count = telemetry_aggregate.error_count + excluded.error_count,
|
|
544
|
+
updated_at = excluded.updated_at;
|
|
545
|
+
END;
|
|
546
|
+
|
|
547
|
+
CREATE TRIGGER telemetry_au AFTER UPDATE ON telemetry
|
|
548
|
+
BEGIN
|
|
549
|
+
UPDATE telemetry_aggregate SET
|
|
550
|
+
last_at = MAX(last_at, NEW.received_at),
|
|
551
|
+
max_sequence = CASE WHEN NEW.sequence IS NOT NULL
|
|
552
|
+
AND (max_sequence IS NULL OR NEW.sequence > max_sequence) THEN NEW.sequence ELSE max_sequence END,
|
|
553
|
+
updated_at = NEW.received_at
|
|
554
|
+
WHERE task_id = NEW.task_id AND role_name = NEW.role_name AND turn_id = NEW.turn_id;
|
|
555
|
+
END;
|
|
556
|
+
`;
|
|
557
|
+
export const SQLITE_SCHEMA_TABLES = [
|
|
558
|
+
"storage_schema",
|
|
559
|
+
"active_turns",
|
|
560
|
+
"agent_profiles",
|
|
561
|
+
"capability_grants",
|
|
562
|
+
"change_sets",
|
|
563
|
+
"config",
|
|
564
|
+
"configured_agents",
|
|
565
|
+
"context_snapshots",
|
|
566
|
+
"decisions",
|
|
567
|
+
"durable_jobs",
|
|
568
|
+
"environment_preparations",
|
|
569
|
+
"events",
|
|
570
|
+
"gate_artifact_logs",
|
|
571
|
+
"gate_artifacts",
|
|
572
|
+
"global_role_messages",
|
|
573
|
+
"global_role_session_sets",
|
|
574
|
+
"global_roles",
|
|
575
|
+
"global_sequences",
|
|
576
|
+
"home_meta",
|
|
577
|
+
"id_sequences",
|
|
578
|
+
"input_requests",
|
|
579
|
+
"integration_attempts",
|
|
580
|
+
"local_resources",
|
|
581
|
+
"mailboxes",
|
|
582
|
+
"managed_workspaces",
|
|
583
|
+
"messages",
|
|
584
|
+
"milestones",
|
|
585
|
+
"outbox",
|
|
586
|
+
"plugin_intents",
|
|
587
|
+
"plugin_validations",
|
|
588
|
+
"projects",
|
|
589
|
+
"publication_references",
|
|
590
|
+
"release_workflows",
|
|
591
|
+
"resource_registry",
|
|
592
|
+
"review_rounds",
|
|
593
|
+
"role_session_sets",
|
|
594
|
+
"runtime_session_candidates",
|
|
595
|
+
"session_owners",
|
|
596
|
+
"storage_migration_archive",
|
|
597
|
+
"task_projections",
|
|
598
|
+
"task_records",
|
|
599
|
+
"task_roles",
|
|
600
|
+
"task_wakes",
|
|
601
|
+
"tasks_catalog",
|
|
602
|
+
"telemetry",
|
|
603
|
+
"telemetry_aggregate",
|
|
604
|
+
"turns",
|
|
605
|
+
"work_items"
|
|
606
|
+
];
|
|
@@ -3,16 +3,10 @@ import { createHash } from "node:crypto";
|
|
|
3
3
|
/**
|
|
4
4
|
* The single authority for every Yui self-managed path derived from a Home.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* through two different mechanisms: worktree/task roots were derived from the
|
|
8
|
-
* user-facing `defaultWorkspace` (an out-of-Home directory), and provider
|
|
9
|
-
* runtimes/backups were written to string-built siblings of Home
|
|
10
|
-
* (`${home}.task-runtimes`, `${home}-backups`). Both are unified here so that a
|
|
11
|
-
* single canonical YUI_HOME contains all self-managed data, with only the
|
|
6
|
+
* A single canonical YUI_HOME contains all self-managed data, with only the
|
|
12
7
|
* approved short-path IPC sockets (Controller, tmux, Agent Host, integration
|
|
13
8
|
* runtime) remaining outside it for the `sockaddr_un` length budget. Within the
|
|
14
|
-
* managed workspace root
|
|
15
|
-
* physical-worktree/symlink-view split into a single layer of real worktrees
|
|
9
|
+
* managed workspace root contains a single layer of real worktrees
|
|
16
10
|
* under `tasks/` (see {@link managedTaskRoot}).
|
|
17
11
|
*
|
|
18
12
|
* `defaultWorkspace` is intentionally NOT an input to this module: it remains a
|
|
@@ -28,11 +22,8 @@ function homeRoot(home) {
|
|
|
28
22
|
return resolved;
|
|
29
23
|
}
|
|
30
24
|
/**
|
|
31
|
-
* Root that contains every managed Git workspace
|
|
32
|
-
*
|
|
33
|
-
* root, preserved by the 24->25 migration as its rollback anchor). A single
|
|
34
|
-
* parent keeps the managed families adjacent and lets the storage migrations
|
|
35
|
-
* relocate them as one subtree.
|
|
25
|
+
* Root that contains every managed Git workspace, with a single layer of real
|
|
26
|
+
* worktrees under `tasks/`.
|
|
36
27
|
*/
|
|
37
28
|
export function managedWorkspacesRoot(home) {
|
|
38
29
|
return join(homeRoot(home), "workspaces");
|
|
@@ -41,9 +32,7 @@ export function managedWorkspacesRoot(home) {
|
|
|
41
32
|
* Managed Git worktrees, one real worktree per Task owner and Project at
|
|
42
33
|
* `<home>/workspaces/tasks/<taskId>/<owner>/<projectDirectory>` (owner being
|
|
43
34
|
* `main`, `work-items/<id>`, `reviews/<name>`, `integrations/<id>`, or
|
|
44
|
-
* `execution-lanes/<g>/<l>`).
|
|
45
|
-
* the physical `worktree/` root; the 24->25 migration makes them the worktrees
|
|
46
|
-
* themselves, so the logical entry path and the physical Git worktree coincide.
|
|
35
|
+
* `execution-lanes/<g>/<l>`). The logical entry path and physical Git worktree coincide.
|
|
47
36
|
*/
|
|
48
37
|
export function managedTaskRoot(home) {
|
|
49
38
|
return join(managedWorkspacesRoot(home), "tasks");
|
|
@@ -24,10 +24,11 @@ import { validateGateArtifact } from "../verification/gateArtifact.js";
|
|
|
24
24
|
import { validateWorkItem } from "../workItem/workItem.js";
|
|
25
25
|
import { validateManagedWorkspace } from "../worktree/managedWorkspace.js";
|
|
26
26
|
import { StorageRecordError, storedCapabilityGrant, storedPublicationReference, storedReleaseWorkflow } from "./taskStore.js";
|
|
27
|
+
import { requireKnownFields } from "../domain/validation.js";
|
|
27
28
|
const check = (validate) => record => { validate(record); };
|
|
28
29
|
/** One current domain contract for saves, reads and explicit Home diagnostics.
|
|
29
30
|
* Protocol-specific metadata/outbox/telemetry have their own readers. This is
|
|
30
|
-
* validation only:
|
|
31
|
+
* validation only: other storage formats require an independent converter. */
|
|
31
32
|
const validators = {
|
|
32
33
|
task_records: check(validateTask),
|
|
33
34
|
work_items: check(validateWorkItem),
|
|
@@ -36,8 +37,16 @@ const validators = {
|
|
|
36
37
|
projects: check(validateProject),
|
|
37
38
|
task_roles: check(validateTaskRole),
|
|
38
39
|
global_roles: check(validateGlobalRole),
|
|
39
|
-
role_session_sets: check(
|
|
40
|
-
|
|
40
|
+
role_session_sets: check(record => {
|
|
41
|
+
if (record.owner?.scope !== "task")
|
|
42
|
+
throw new Error("Task Session set requires task scope.");
|
|
43
|
+
validateRoleSessionSet(record);
|
|
44
|
+
}),
|
|
45
|
+
global_role_session_sets: check(record => {
|
|
46
|
+
if (record.owner?.scope !== "global")
|
|
47
|
+
throw new Error("Global Session set requires global scope.");
|
|
48
|
+
validateRoleSessionSet(record);
|
|
49
|
+
}),
|
|
41
50
|
messages: check(validateTaskMessage),
|
|
42
51
|
global_role_messages: check(validateGlobalRoleMessage),
|
|
43
52
|
turns: check(validateRun),
|
|
@@ -61,7 +70,10 @@ const validators = {
|
|
|
61
70
|
plugin_intents: check(validatePluginIntent),
|
|
62
71
|
plugin_validations: check(validatePluginValidation),
|
|
63
72
|
session_owners: check((record) => {
|
|
64
|
-
|
|
73
|
+
requireKnownFields(record, [
|
|
74
|
+
"schemaVersion", "kind", "owner", "agentId", "adapterId", "nativeSessionId", "tmux", "providerRoot", "runtimeRoot", "recordedAt"
|
|
75
|
+
], "Session owner identity");
|
|
76
|
+
if (record.schemaVersion !== 1 || record.kind !== "yui-session-owner") {
|
|
65
77
|
throw new Error("Session owner identity is invalid.");
|
|
66
78
|
}
|
|
67
79
|
createSessionOwnerIdentity({ ...record, recordedAt: new Date(record.recordedAt) });
|