@zq-silk/yui 0.6.8 → 0.6.10

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 (58) hide show
  1. package/README.md +10 -3
  2. package/dist/cli/commandCatalog.js +1 -1
  3. package/dist/commands/taskCommands.js +63 -28
  4. package/dist/commands/taskContextCommand.js +27 -1
  5. package/dist/commands/taskRoleRuntimeStatus.js +17 -6
  6. package/dist/controller/agentRuntimeObserver.js +6 -3
  7. package/dist/controller/controller.js +29 -47
  8. package/dist/controller/fileSchedulerStoreAdapter.js +572 -258
  9. package/dist/controller/runtime.js +8 -1
  10. package/dist/controller/runtimeEventInbox.js +16 -5
  11. package/dist/controller/runtimeHookRunFence.js +51 -5
  12. package/dist/controller/runtimeObservationHook.js +8 -2
  13. package/dist/coordination/workMailbox.js +408 -28
  14. package/dist/coordination/workMailboxQueue.js +12 -10
  15. package/dist/executor/agentExecutor.js +101 -94
  16. package/dist/executor/executorRegistry.js +47 -2
  17. package/dist/executor/fileRoleLaunchPlanner.js +4 -2
  18. package/dist/lifecycle/exactRunTerminalization.js +1 -7
  19. package/dist/repository/taskWorkspaceCoordinator.js +9 -4
  20. package/dist/runtime/agentDriver.js +83 -4
  21. package/dist/runtime/agentDriverObservation.js +25 -10
  22. package/dist/runtime/builtinAgentDrivers.js +168 -18
  23. package/dist/runtime/codexAppServerRuntime.js +355 -0
  24. package/dist/runtime/continuationManager.js +117 -0
  25. package/dist/runtime/index.js +2 -0
  26. package/dist/runtime/lifecycleReservation.js +4 -3
  27. package/dist/runtime/promptEnvelope.js +14 -3
  28. package/dist/runtime/providerContinuation.js +225 -0
  29. package/dist/runtime/providerContinuationReconciliationService.js +172 -0
  30. package/dist/runtime/providerRuntimeIdentity.js +232 -0
  31. package/dist/runtime/providerRuntimeReconciler.js +166 -0
  32. package/dist/runtime/runtimeContinuationProjection.js +34 -0
  33. package/dist/runtime/runtimeObservation.js +217 -6
  34. package/dist/runtime/runtimeProjection.js +172 -11
  35. package/dist/scheduler/activeRoleRunDelivery.js +314 -1
  36. package/dist/scheduler/leaderWakeupProcessor.js +2 -1
  37. package/dist/scheduler/operatorInputNotificationProcessor.js +3 -2
  38. package/dist/scheduler/roleRunLiveness.js +8 -7
  39. package/dist/scheduler/roleRunStall.js +4 -2
  40. package/dist/scheduler/taskExecutionProjection.js +2 -2
  41. package/dist/storage/migration/productionRegistry.js +474 -1
  42. package/dist/storage/sqliteSchema.js +102 -21
  43. package/dist/storage/sqliteStore.js +52 -110
  44. package/dist/storage/storageVersions.js +1 -1
  45. package/dist/storage/storeRpc.js +0 -1
  46. package/dist/storage/taskStore.js +40 -53
  47. package/dist/storage/upgrade/sqliteStateMigration.js +0 -21
  48. package/dist/task/nextAction.js +1 -1
  49. package/dist/web/assets/client/app.js +1 -1
  50. package/dist/web/assets/client/components.js +233 -4
  51. package/dist/web/assets/client/i18n.js +166 -2
  52. package/dist/web/assets/client/view.js +30 -13
  53. package/dist/web/assets/styles/cards.js +62 -0
  54. package/dist/web/assets/styles/widgets.js +1 -0
  55. package/dist/web/webSnapshot.js +11 -2
  56. package/package.json +1 -1
  57. package/skills/yui-leader/SKILL.md +33 -24
  58. package/skills/yui-operator/SKILL.md +7 -5
@@ -132,4 +132,66 @@ details.work-item-card>summary.record-head~*{margin-top:0}
132
132
  .criteria-list li{position:relative;padding-left:16px;font-family:var(--font-body);font-size:12px;line-height:1.5;color:var(--text)}
133
133
  .criteria-list li:before{content:"";position:absolute;left:0;top:8px;width:9px;height:2px;border:0;border-radius:2px;background:var(--border-strong)}
134
134
  .criteria-block.is-collapsed .criteria-list li:nth-child(n+7){display:none}
135
+ /* Task-first execution status band */
136
+ .exec-band{display:grid;gap:8px;padding:11px 14px;border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:var(--radius-lg);background:var(--bg-2);box-shadow:var(--shadow-card)}
137
+ .exec-band.is-danger{border-left-color:var(--danger)}
138
+ .exec-band.is-warning{border-left-color:var(--warning)}
139
+ .exec-band.is-active{border-left-color:var(--active)}
140
+ .exec-band.is-accent{border-left-color:var(--accent)}
141
+ .exec-band.is-muted{border-left-color:var(--faint)}
142
+ .exec-band-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
143
+ .exec-band-owner{color:var(--muted);font-family:var(--font-body);font-size:12px;font-weight:600}
144
+ .exec-band-executors{color:var(--active);font-family:var(--font-mono);font-size:10px;letter-spacing:.04em}
145
+ .exec-band-stopped{color:var(--faint);font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase}
146
+ .exec-band-failclosed{color:var(--danger);font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--danger);padding:2px 8px;border-radius:var(--radius-pill)}
147
+ .exec-band-summary{margin:0;font-family:var(--font-body);font-size:13px;line-height:1.55;color:var(--text)}
148
+ .exec-signal-list{display:grid;gap:5px}
149
+ .exec-signal{display:flex;gap:9px;align-items:baseline;padding:6px 10px;border-radius:var(--radius);font-size:11.5px;line-height:1.45}
150
+ .exec-signal.is-attention{background:var(--warning-soft);border:1px solid color-mix(in srgb,var(--warning) 30%,transparent)}
151
+ .exec-signal.is-blocker{background:var(--danger-soft);border:1px solid color-mix(in srgb,var(--danger) 30%,transparent)}
152
+ .exec-signal-kind{flex:none;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
153
+ .exec-signal-text{min-width:0;color:var(--text)}
154
+ /* Unified execution Group (Lanes + resolution) */
155
+ .exec-group{gap:8px}
156
+ .lane-list{display:grid;gap:4px}
157
+ .lane-row{display:flex;align-items:center;gap:9px;padding:5px 9px;border-radius:var(--radius);background:var(--bg-3);border:1px solid var(--border);font-size:11.5px}
158
+ .lane-row .status-dot{margin-top:0}
159
+ .lane-role{font-family:var(--font-body);font-weight:700;font-size:12px;color:var(--text)}
160
+ .lane-status{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
161
+ .lane-summary{flex:1;min-width:0;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
162
+ .exec-resolution{display:flex;gap:9px;align-items:baseline;flex-wrap:wrap;padding:7px 10px;border-radius:var(--radius);background:var(--accent-soft);border:1px solid var(--accent-line)}
163
+ .exec-resolution-decision{font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent)}
164
+ .exec-resolution-summary{flex:1;min-width:0;font-size:12px;color:var(--text)}
165
+ .exec-resolution time{color:var(--muted);font-size:10.5px}
166
+ /* Candidates */
167
+ .candidate-list{display:grid;gap:4px}
168
+ .candidate-row{display:flex;align-items:baseline;gap:9px;padding:5px 9px;border-radius:var(--radius);background:var(--bg-3);border:1px solid var(--border);font-size:11.5px}
169
+ .candidate-seq{flex:none;font-family:var(--font-mono);font-size:10px;color:var(--faint)}
170
+ .candidate-summary{flex:1;min-width:0;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
171
+ .candidate-source{flex:none;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted)}
172
+ .candidate-row time{flex:none;color:var(--muted);font-size:10.5px}
173
+ /* Findings */
174
+ .finding-list{display:grid;gap:4px}
175
+ .finding-row{display:flex;align-items:baseline;gap:8px;padding:5px 9px;border-radius:var(--radius);background:var(--bg-3);border:1px solid var(--border);font-size:11.5px}
176
+ .finding-summary{flex:1;min-width:0;color:var(--text)}
177
+ .finding-row.is-critical,.finding-row.is-high{border-left:2px solid var(--danger)}
178
+ .finding-row.is-medium{border-left:2px solid var(--warning)}
179
+ .finding-row.is-low{border-left:2px solid var(--faint)}
180
+ .chip.is-critical{color:var(--danger);border-color:var(--danger)}
181
+ .chip.is-high{color:var(--danger)}
182
+ .chip.is-medium{color:var(--warning)}
183
+ .chip.is-low{color:var(--muted)}
184
+ /* Sidebar derived execution status */
185
+ .task-exec{grid-row:1;grid-column:3;align-self:center;flex:none;font-family:var(--font-mono);font-size:8.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--faint);white-space:nowrap;max-width:90px;overflow:hidden;text-overflow:ellipsis}
186
+ .task-exec.is-blocked,.task-exec.is-attention{color:var(--danger)}
187
+ .task-exec.is-recovering,.task-exec.is-progressing-with-attention{color:var(--warning)}
188
+ .task-exec.is-working,.task-exec.is-waiting-on-agents{color:var(--active)}
189
+ .task-exec.is-needs-leader-action{color:var(--accent)}
190
+ /* Overview row derived status label */
191
+ .overview-row-label{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--warning);white-space:nowrap}
192
+ /* Disposition block */
193
+ .disposition-block{border-left:2px solid var(--warning);padding-left:10px}
194
+ .disposition-block>small{color:var(--warning)}
195
+ /* Input requester */
196
+ .input-requester{color:var(--muted);font-family:var(--font-mono);font-size:10px;letter-spacing:.02em}
135
197
  `;
@@ -54,6 +54,7 @@ kbd{background:var(--bg-3);border:1px solid var(--border);border-bottom-width:2p
54
54
  .filter-dot.completed{background:var(--success);box-shadow:0 0 6px var(--success)}
55
55
  .filter-dot.yielded{background:var(--success);box-shadow:0 0 6px var(--success)}
56
56
  .filter-dot.failed{background:var(--danger);box-shadow:0 0 6px var(--danger)}
57
+ .filter-dot.retired{background:var(--faint)}
57
58
  .filter-dot.archived{background:var(--muted)}
58
59
  .filter-chip[data-status=active].is-active{color:var(--active);background:var(--active-soft);border-color:color-mix(in srgb,var(--active) 45%,transparent)}
59
60
  .filter-chip[data-status=active].is-active .filter-count{color:var(--active)}
@@ -1,5 +1,7 @@
1
1
  import { isRoleRunStalled } from "../scheduler/roleRunStall.js";
2
2
  import { buildTaskExecutionProjection } from "../scheduler/taskExecutionProjection.js";
3
+ import { summarizeExecutionGroup } from "../execution/executionGroup.js";
4
+ import { currentWorkItemExecutionGroup } from "../workItem/workItem.js";
3
5
  export function buildWebDashboardSnapshot(store, now = new Date()) {
4
6
  return store.transaction((reader) => {
5
7
  const statusCounts = {
@@ -38,7 +40,8 @@ export function buildWebDashboardSnapshot(store, now = new Date()) {
38
40
  roleCount: reader.listRoles(task.id).length,
39
41
  openInputCount: taskOpenInputs,
40
42
  needsAttentionCount,
41
- execution
43
+ execution,
44
+ executionStatus: execution?.status ?? null
42
45
  };
43
46
  }).sort(compareDashboardTasks);
44
47
  return {
@@ -94,7 +97,13 @@ export function buildWebTaskDetail(store, taskId) {
94
97
  execution: buildTaskExecutionProjection(reader, taskId),
95
98
  brief: reader.getTaskBrief(taskId),
96
99
  roles,
97
- workItems: reader.listWorkItems(taskId),
100
+ workItems: reader.listWorkItems(taskId).map((item) => {
101
+ const group = currentWorkItemExecutionGroup(item);
102
+ return {
103
+ ...item,
104
+ ...(group === undefined ? {} : { currentExecution: summarizeExecutionGroup(group) })
105
+ };
106
+ }),
98
107
  runs,
99
108
  runtimeHealth: { needsAttentionRuns },
100
109
  reviewRounds: reader.listReviewRounds(taskId),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zq-silk/yui",
3
- "version": "0.6.8",
3
+ "version": "0.6.10",
4
4
  "description": "Local control plane for long-running native agent CLI sessions backed by tmux.",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -38,20 +38,24 @@ Choose the executor in this order:
38
38
 
39
39
  1. **Leader directly** when the work is small and the current Leader context,
40
40
  authority, and tools are sufficient.
41
- 2. **At most one native implementer subagent** when one bounded implementation
42
- pass benefits from parallel attention or a specialist available inside the
43
- current Agent. Give it one explicit Profile, one writable workspace, and one
44
- result contract.
45
- 3. **Task Role AgentRun** only when the work genuinely needs independent
46
- parallel ownership, different credentials or authority, a provider/model
47
- capability unavailable to the current Agent, or an independently managed
48
- Session and durable Run lifecycle.
41
+ 2. **Native subagents** when bounded implementation or research benefits from
42
+ specialist attention or parallel fan-out inside the current Agent Session.
43
+ Give each child an explicit Profile, workspace access, and result contract.
44
+ 3. **Task Role AgentRun** when the work genuinely needs independent durable
45
+ ownership, different credentials or authority, a provider/model capability
46
+ unavailable to the current Agent, or an independently managed Session and
47
+ Run lifecycle.
49
48
 
50
49
  Do not dispatch a Task Role merely to obtain a fresh context, run a command,
51
50
  perform a routine small edit, or add an intermediate review. Direct and native
52
51
  execution add no Worker Role, Worker Yui Session, or Worker AgentRun. The exact
53
- Leader Run fence stays active until a native child hands back its result; the
54
- WorkItem and its workspace remain the durable delivery boundary.
52
+ Leader Run remains active until an explicit Yui yield, completion, or exact
53
+ failure; native child lifecycle never decides that Run outcome. The WorkItem
54
+ and its workspace remain the durable delivery boundary.
55
+
56
+ Provider-native foreground and background child lifecycle stays owned by the
57
+ current Agent Session. Structured child completion notifications may resume the
58
+ Leader in later provider Turns while the same Yui AgentRun remains active.
55
59
 
56
60
  A Project-backed code result still uses one WorkItem-owned Develop workspace
57
61
  and a clean committed Candidate. The fast path compresses orchestration, not
@@ -84,11 +88,13 @@ WorkItem while its delivery scope remains open. If an immutable final-review
84
88
  boundary makes that impossible, create only the smallest repair WorkItem and
85
89
  retain the original Candidate, Review, and Integration evidence.
86
90
 
87
- Native and managed waits use different fences. For a native child, wait once on
88
- the native completion event inside the current Leader turn. Keep the exact
89
- Leader Run active; the child result returns control directly to this Leader.
90
- Do not poll, send a waiting Message, rewrite a checkpoint, or yield before that
91
- handoff.
91
+ Native and managed waits use different fences. For native children, let the
92
+ provider deliver structured completion notifications while the parent
93
+ Conversation is live. A parent Turn or Activation may end first; Yui preserves
94
+ the active Run and known continuation identities, reconciles only known
95
+ children through adapter metadata, and routes a later result reference through
96
+ the durable inbox. Do not poll, send a waiting Message, rewrite a checkpoint,
97
+ or yield merely to preserve that native wait.
92
98
 
93
99
  For a managed Task Role or Reviewer Run, persist a necessary changed checkpoint,
94
100
  yield the active Leader Run, and stop the turn. Its durable mailbox result or an
@@ -344,12 +350,14 @@ hint only if this Agent's native child API supports that override; otherwise
344
350
  inherit the actual runtime setting. Never claim a model that cannot be
345
351
  confirmed.
346
352
 
347
- Create and communicate with the child through the native Agent tools. Yui does
348
- not create, address, resume, or terminate that child. The child returns its
349
- result through the native child-result mechanism and must not mutate Yui
350
- lifecycle state. Wait on the native completion event in this Leader turn and
351
- keep the current Leader Run active until that one result arrives; do not yield
352
- the Run as though Yui could wake it for a native child.
353
+ Create and communicate with children through the native Agent tools. Yui does
354
+ not create, address, resume, or terminate those children; it observes their
355
+ structured lifecycle so the parent AgentRun can span the provider Turns needed
356
+ to receive their results, including a later provider Activation. Children must
357
+ not mutate Yui lifecycle state. If the provider cannot automatically return a
358
+ detached result to the parent, the adapter records a bounded Provider result
359
+ reference and the inbox wakes the Leader. Synthesize that fact before deciding
360
+ the next Yui workflow outcome.
353
361
 
354
362
  Review the returned work and run proportionate checks. Record each round in the
355
363
  WorkItem summary; preserve earlier round facts when updating it:
@@ -617,9 +625,10 @@ evidence; truthfully surface the blocker through the supported provider failure
617
625
  boundary. Do not add a fallback protocol.
618
626
 
619
627
  Yield before waiting only for managed Task Role or Reviewer results whose
620
- durable mailbox can wake the Task. Do not yield while a native child result is
621
- outstanding; its native completion event returns to this same Leader turn and
622
- requires the exact Leader Run fence to remain active.
628
+ durable mailbox can wake the Task. Do not yield merely because native child
629
+ results are outstanding: the provider owns their completion notifications, and
630
+ Yui keeps this AgentRun active across intermediate provider Turns. After native
631
+ work drains, continue to Task completion, InputRequest, or final yield.
623
632
 
624
633
  Complete only after required WorkItems are accepted, Role work is terminal,
625
634
  latest isolated results are integrated or deliberately abandoned, and user
@@ -162,11 +162,13 @@ Do not pre-split WorkItems or decide their dependsOn, execution path,
162
162
  acceptance, or Integration; the Leader owns WorkItem creation, replacement,
163
163
  parallel dispatch, dependency and conflict resolution inside the one Task.
164
164
 
165
- The Leader chooses among direct execution, a native subagent, and a Task Role
166
- AgentRun. A native subagent is created inside the Leader conversation, inherits
167
- the Leader Agent, ignores Task Role Agent bindings, and has no Yui launch
168
- command. A Task Role is required when the user requests a different provider,
169
- credentials, interactive Session, or durable independent lifecycle.
165
+ The Leader chooses among direct execution, native subagents, and a Task Role
166
+ AgentRun. Native subagents are created inside the Leader Session, inherit the
167
+ Leader Agent, ignore Task Role Agent bindings, and have no Yui launch command.
168
+ Their structured lifecycle and completion notifications may span provider
169
+ Turns inside the same Yui AgentRun. A Task Role is required when the user
170
+ requests a different provider, credentials, interactive Session, or durable
171
+ independent lifecycle.
170
172
 
171
173
  When the user requires a specific Leader or Worker provider, inspect Roles
172
174
  before routing: