@zq-silk/yui 0.16.1 → 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.
Files changed (193) hide show
  1. package/ARCHITECTURE.md +12 -0
  2. package/ARCHITECTURE.zh-CN.md +8 -0
  3. package/README.md +9 -4
  4. package/dist/agent/agent.js +4 -9
  5. package/dist/agent/executionComponents.js +4 -4
  6. package/dist/agent/managedRuntimeEnvironment.js +0 -4
  7. package/dist/agentRun/agentRun.js +13 -23
  8. package/dist/artifacts/managedGit.js +3 -56
  9. package/dist/brief/taskBrief.js +3 -3
  10. package/dist/cli/agentConfigurationPicker.js +24 -21
  11. package/dist/cli/commandCatalog.js +18 -10
  12. package/dist/cli/roleWizard.js +41 -30
  13. package/dist/cli/updateCommand.js +35 -13
  14. package/dist/cli/updateOrchestrator.js +73 -44
  15. package/dist/cli/updatePorts.js +76 -86
  16. package/dist/cli/upgradeCommand.js +4 -8
  17. package/dist/cli.js +39 -33
  18. package/dist/commands/controllerCommands.js +2 -2
  19. package/dist/commands/executionAuditCommands.js +2 -2
  20. package/dist/commands/projectCommands.js +1 -1
  21. package/dist/commands/releaseCommands.js +9 -38
  22. package/dist/commands/taskCommands.js +91 -81
  23. package/dist/commands/taskCompletionGate.js +0 -117
  24. package/dist/commands/taskRoleRuntimeStatus.js +2 -2
  25. package/dist/commands/taskUpstreamCommands.js +93 -54
  26. package/dist/context/runContextPack.js +30 -54
  27. package/dist/context/runInputContract.js +9 -0
  28. package/dist/context/sessionBootstrapManifest.js +11 -19
  29. package/dist/controller/agentHostObservation.js +4 -2
  30. package/dist/controller/agentRuntimeObserver.js +4 -4
  31. package/dist/controller/clientRuntime.js +19 -44
  32. package/dist/controller/controller.js +24 -10
  33. package/dist/controller/fileSchedulerStoreAdapter.js +91 -24
  34. package/dist/controller/globalInputDelivery.js +31 -8
  35. package/dist/controller/globalRuntimeAttention.js +34 -0
  36. package/dist/controller/jobSupervisor.js +3 -3
  37. package/dist/controller/operatorNotification.js +31 -0
  38. package/dist/controller/providerRetryAdmission.js +3 -1
  39. package/dist/controller/providerRetryDelivery.js +136 -119
  40. package/dist/controller/runtime.js +2 -28
  41. package/dist/controller/sessionOwnerReconciliation.js +42 -24
  42. package/dist/controller/structuredProviderObservation.js +28 -1
  43. package/dist/controller/updateReconciliation.js +72 -20
  44. package/dist/coordination/workMailbox.js +4 -4
  45. package/dist/core/controllerIdentity.js +25 -0
  46. package/dist/core/controllerProcessIdentity.js +2 -2
  47. package/dist/core/controllerServer.js +4 -2
  48. package/dist/core/protocol.js +1 -1
  49. package/dist/doctor/doctor.js +2 -1
  50. package/dist/domain/validation.js +6 -0
  51. package/dist/event/taskEvent.js +3 -3
  52. package/dist/execution/workItemExecution.js +2 -2
  53. package/dist/executor/agentAdapter.js +28 -96
  54. package/dist/executor/agentConfigurationCatalog.js +13 -68
  55. package/dist/executor/agentConfigurationFields.js +120 -0
  56. package/dist/executor/agentConfigurationProbe.js +55 -80
  57. package/dist/executor/agentExecutor.js +11 -8
  58. package/dist/executor/effectiveLaunch.js +3 -3
  59. package/dist/executor/executorRegistry.js +0 -9
  60. package/dist/executor/fileRoleLaunchPlanner.js +12 -11
  61. package/dist/grant/capabilityGrant.js +2 -2
  62. package/dist/input/inputRequest.js +4 -4
  63. package/dist/integration/changeSet.js +3 -3
  64. package/dist/integration/integrationAttempt.js +3 -3
  65. package/dist/integration/integrationSourceApplication.js +1 -1
  66. package/dist/interaction/operatorPresentation.js +2 -1
  67. package/dist/job/durableJob.js +1 -1
  68. package/dist/job/jobRunner.js +2 -2
  69. package/dist/message/message.js +8 -6
  70. package/dist/message/messageContinuation.js +8 -9
  71. package/dist/milestone/milestone.js +3 -3
  72. package/dist/observability/executionAudit.js +1 -10
  73. package/dist/observability/runtimeIdentity.js +0 -23
  74. package/dist/output/agentConfigurationPresentation.js +4 -2
  75. package/dist/profile/agentProfile.js +3 -3
  76. package/dist/release/releaseHandover.js +2 -2
  77. package/dist/release/releaseIdempotencyStore.js +0 -23
  78. package/dist/release/releaseWorkflowPorts.js +8 -4
  79. package/dist/release/runtimeRelease.js +9 -7
  80. package/dist/repository/gitWorkspace.js +66 -19
  81. package/dist/repository/project.js +3 -3
  82. package/dist/repository/taskWorkspacePreparer.js +75 -68
  83. package/dist/resources/liveReferences.js +1 -1
  84. package/dist/resources/resourceRegistry.js +90 -44
  85. package/dist/resources/sqliteResourceRegistry.js +5 -7
  86. package/dist/review/reviewRound.js +5 -5
  87. package/dist/role/role.js +7 -8
  88. package/dist/runtime/acpProtocol.js +2 -3
  89. package/dist/runtime/acpSession.js +21 -5
  90. package/dist/runtime/agentDriverObservation.js +1 -1
  91. package/dist/runtime/agentEndpoint.js +4 -1
  92. package/dist/runtime/agentHost.js +25 -65
  93. package/dist/runtime/agentHostCleanup.js +85 -0
  94. package/dist/runtime/agentHostProtocol.js +3 -3
  95. package/dist/runtime/builtinAgentDrivers.js +46 -119
  96. package/dist/runtime/builtinTranscriptObserver.js +10 -6
  97. package/dist/runtime/codexAppServerRuntime.js +55 -89
  98. package/dist/runtime/codexInteractiveHost.js +1 -1
  99. package/dist/runtime/jsonLineChannel.js +35 -7
  100. package/dist/runtime/launchBroker.js +1 -1
  101. package/dist/runtime/processExitObservation.js +1 -1
  102. package/dist/runtime/providerContinuationReconciliationService.js +86 -38
  103. package/dist/runtime/providerRetry.js +15 -0
  104. package/dist/runtime/providerRuntimeIdentity.js +3 -3
  105. package/dist/runtime/providerRuntimeReconciler.js +12 -2
  106. package/dist/runtime/runtimeCoherence.js +7 -3
  107. package/dist/runtime/runtimeObservation.js +3 -3
  108. package/dist/runtime/sessionOwnerIdentity.js +1 -1
  109. package/dist/runtime/structuredProviderHost.js +106 -81
  110. package/dist/runtime/taskRuntimeIsolation.js +3 -3
  111. package/dist/runtime/tmuxAdapters.js +3 -3
  112. package/dist/scheduler/activeRoleRunDelivery.js +5 -1
  113. package/dist/scheduler/operatorInputNotificationProcessor.js +7 -17
  114. package/dist/scheduler/taskWake.js +1 -1
  115. package/dist/storage/baselineSchema.js +606 -0
  116. package/dist/storage/homeLayout.js +5 -16
  117. package/dist/storage/recordValidation.js +16 -4
  118. package/dist/storage/sqliteSchema.js +106 -1741
  119. package/dist/storage/sqliteStore.js +16 -14
  120. package/dist/storage/storageSchema.js +8 -7
  121. package/dist/storage/storageVersions.js +23 -16
  122. package/dist/storage/taskStore.js +3 -29
  123. package/dist/storage/upgrade/upgradeOrchestrator.js +14 -112
  124. package/dist/task/nextAction.js +33 -23
  125. package/dist/task/task.js +17 -8
  126. package/dist/task/taskActivation.js +5 -4
  127. package/dist/telemetry/sqliteTelemetryStore.js +2 -2
  128. package/dist/verification/gateArtifact.js +5 -3
  129. package/dist/verification/verificationPlan.js +6 -7
  130. package/dist/web/assets/assetManifest.js +2 -0
  131. package/dist/web/assets/client/app.js +72 -3
  132. package/dist/web/assets/client/components.js +2 -1
  133. package/dist/web/assets/client/i18n.js +2 -0
  134. package/dist/web/assets/client/taskSummary.js +345 -0
  135. package/dist/web/assets/client/taskSurface.js +44 -26
  136. package/dist/web/assets/client/view.js +33 -0
  137. package/dist/web/assets/shell.js +1 -0
  138. package/dist/web/assets/styles/cards.js +21 -0
  139. package/dist/web/webServer.js +39 -5
  140. package/dist/web/webSessions.js +165 -0
  141. package/dist/web/webSnapshot.js +23 -0
  142. package/dist/web/webTaskSurface.js +23 -0
  143. package/dist/workItem/workItem.js +6 -6
  144. package/dist/workspace/cleanupInspection.js +1 -9
  145. package/dist/worktree/managedWorkspace.js +3 -3
  146. package/docs/managed-turn-and-session-runtime.md +50 -7
  147. package/docs/managed-turn-and-session-runtime.zh-CN.md +36 -5
  148. package/docs/observability/README.md +47 -0
  149. package/docs/observability/README.zh-CN.md +37 -0
  150. package/docs/project-refresh.md +9 -0
  151. package/docs/project-refresh.zh-CN.md +8 -0
  152. package/docs/provider-retry.md +35 -0
  153. package/docs/release-workflow.md +70 -214
  154. package/docs/release-workflow.zh-CN.md +53 -157
  155. package/docs/roles-and-configuration.md +30 -0
  156. package/docs/roles-and-configuration.zh-CN.md +20 -0
  157. package/docs/sqlite-control-plane-design.md +48 -289
  158. package/docs/sqlite-control-plane-design.zh-CN.md +37 -53
  159. package/docs/storage-baseline.md +132 -0
  160. package/docs/storage-baseline.zh-CN.md +106 -0
  161. package/docs/task-delivery.md +110 -2
  162. package/docs/task-delivery.zh-CN.md +82 -2
  163. package/docs/task-discovery.md +9 -0
  164. package/docs/task-discovery.zh-CN.md +6 -0
  165. package/docs/testing/verification-levels.md +42 -164
  166. package/docs/testing/verification-levels.zh-CN.md +29 -115
  167. package/i18n/README.zh-CN.md +7 -4
  168. package/package.json +1 -1
  169. package/skills/yui-leader/SKILL.md +11 -0
  170. package/skills/yui-leader/references/execution.md +22 -0
  171. package/skills/yui-leader/references/planning.md +6 -2
  172. package/skills/yui-operator/SKILL.md +45 -13
  173. package/skills/yui-operator/references/task-delivery.md +99 -0
  174. package/skills/yui-runtime/SKILL.md +5 -3
  175. package/skills/yui-runtime/references/publication.md +56 -5
  176. package/skills/yui-runtime/references/recovery.md +12 -2
  177. package/dist/runtime/agentHostCompatibility.js +0 -127
  178. package/dist/storage/migrations/agentFailureContext.js +0 -22
  179. package/dist/storage/migrations/agentRunContract.js +0 -159
  180. package/dist/storage/migrations/artifactsToGit.js +0 -338
  181. package/dist/storage/migrations/collapseWorktreeLayout.js +0 -963
  182. package/dist/storage/migrations/currentInputContract.js +0 -86
  183. package/dist/storage/migrations/currentRuntimeContract.js +0 -228
  184. package/dist/storage/migrations/historicalVerificationPlan.js +0 -35
  185. package/dist/storage/migrations/integrationContinuation.js +0 -105
  186. package/dist/storage/migrations/narrowAgentFailureContext.js +0 -65
  187. package/dist/storage/migrations/notificationOnlyWakes.js +0 -74
  188. package/dist/storage/migrations/removeRuntimeGeneration.js +0 -207
  189. package/dist/storage/migrations/submitIntent.js +0 -126
  190. package/dist/storage/migrations/unifyHomeLayout.js +0 -925
  191. package/dist/storage/migrations/verificationPlanV1.js +0 -162
  192. package/dist/storage/migrations/verificationPolicy.js +0 -74
  193. 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
- * Historically the managed Git worktrees and provider runtimes escaped Home
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, storage v25 further collapses the former
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. Since storage v25 this holds a
32
- * single layer of real worktrees under `tasks/` (plus the legacy `worktree/`
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>`). Before storage v25 these were symlink views over
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: historical formats belong exclusively to migrations. */
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(validateRoleSessionSet),
40
- global_role_session_sets: check(validateRoleSessionSet),
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
- if (record.schemaVersion !== 2 || record.kind !== "yui-session-owner" || Object.hasOwn(record, "launchId")) {
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) });