@zq-silk/yui 0.15.7 → 0.15.8

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 (281) hide show
  1. package/ARCHITECTURE.md +192 -399
  2. package/README.md +127 -1149
  3. package/dist/agent/adapterCatalog.js +15 -2
  4. package/dist/agent/agent.js +23 -3
  5. package/dist/agent/argumentPolicy.js +7 -1
  6. package/dist/agent/connectionPlan.js +62 -0
  7. package/dist/agent/executionComponents.js +158 -0
  8. package/dist/agent/launchEnvironment.js +31 -3
  9. package/dist/agent/managedRuntimeEnvironment.js +3 -5
  10. package/dist/{turn/turn.js → agentRun/agentRun.js} +166 -109
  11. package/dist/{turn/turnIdentity.js → agentRun/runIdentity.js} +4 -4
  12. package/dist/brief/taskBrief.js +12 -0
  13. package/dist/cli/agentConfigurationPicker.js +13 -0
  14. package/dist/cli/commandCatalog.js +157 -70
  15. package/dist/cli/interactionCandidates.js +5 -5
  16. package/dist/cli/interactionPolicy.js +38 -8
  17. package/dist/cli/invocationRouter.js +1 -1
  18. package/dist/cli/managedDiagnostics.js +28 -0
  19. package/dist/cli/operatorWizard.js +1 -7
  20. package/dist/cli/roleOptionOrder.js +27 -0
  21. package/dist/cli/roleWizard.js +50 -14
  22. package/dist/cli/updateOrchestrator.js +1 -1
  23. package/dist/cli/updatePorts.js +3 -4
  24. package/dist/cli.js +178 -95
  25. package/dist/commands/agentCommands.js +72 -14
  26. package/dist/commands/capabilityCommands.js +9 -6
  27. package/dist/commands/configCommands.js +20 -20
  28. package/dist/commands/deliveryGuardPreflight.js +2 -2
  29. package/dist/commands/executionAuditCommands.js +24 -24
  30. package/dist/commands/globalRoleCommands.js +1 -1
  31. package/dist/commands/grantCommands.js +4 -4
  32. package/dist/commands/operatorCommands.js +1 -7
  33. package/dist/commands/projectCommands.js +4 -4
  34. package/dist/commands/resourcesCommands.js +2 -2
  35. package/dist/commands/roleConfiguration.js +25 -5
  36. package/dist/commands/roleRuntimeGuard.js +4 -5
  37. package/dist/commands/sessionCommands.js +3 -7
  38. package/dist/commands/taskActivationCommands.js +259 -0
  39. package/dist/commands/taskActor.js +28 -49
  40. package/dist/commands/taskCommands.js +1188 -710
  41. package/dist/commands/taskContextCommand.js +39 -583
  42. package/dist/commands/taskExecutionCommands.js +32 -32
  43. package/dist/commands/taskInputCommands.js +40 -104
  44. package/dist/commands/taskIntegrationCommands.js +3 -2
  45. package/dist/commands/taskIntegrationQueueCommands.js +1 -1
  46. package/dist/commands/taskNextActionCommand.js +8 -8
  47. package/dist/commands/taskOverviewCommand.js +33 -45
  48. package/dist/commands/taskRemoteDeliveryCommand.js +2 -2
  49. package/dist/commands/taskRoleRuntimeStatus.js +133 -102
  50. package/dist/commands/telemetryCommands.js +36 -38
  51. package/dist/config/configCatalog.js +4 -4
  52. package/dist/config/yuiConfig.js +8 -8
  53. package/dist/context/contextSnapshot.js +10 -10
  54. package/dist/context/dispatchContext.js +11 -11
  55. package/dist/context/roleSessionContext.js +6 -3
  56. package/dist/context/{turnContextPack.js → runContextPack.js} +146 -81
  57. package/dist/context/{turnInputContract.js → runInputContract.js} +73 -60
  58. package/dist/context/sessionBootstrapManifest.js +21 -2
  59. package/dist/context/sourceRunContext.js +30 -0
  60. package/dist/context/taskContext.js +458 -0
  61. package/dist/context/wakeNotification.js +27 -27
  62. package/dist/controller/agentRuntimeObserver.js +21 -24
  63. package/dist/controller/capabilityBridge.js +17 -6
  64. package/dist/controller/clientRuntime.js +65 -92
  65. package/dist/controller/controller.js +114 -188
  66. package/dist/controller/fileSchedulerStoreAdapter.js +787 -887
  67. package/dist/controller/jobControl.js +54 -85
  68. package/dist/controller/resourceInventory.js +8 -27
  69. package/dist/controller/resourceInventoryLinux.js +12 -13
  70. package/dist/controller/runtime.js +529 -479
  71. package/dist/controller/runtimeEventInbox.js +55 -25
  72. package/dist/controller/runtimeEventProcessor.js +22 -31
  73. package/dist/controller/{runtimeHookTurnFence.js → runtimeHookRunFence.js} +91 -115
  74. package/dist/controller/runtimeLaunchCoordinator.js +80 -426
  75. package/dist/controller/runtimeObservationHook.js +14 -18
  76. package/dist/controller/sessionNotify.js +16 -24
  77. package/dist/controller/sessionOwnerReconciliation.js +168 -50
  78. package/dist/controller/structuredProviderObservation.js +138 -99
  79. package/dist/coordination/workMailbox.js +3 -3
  80. package/dist/coordination/workMailboxQueue.js +36 -33
  81. package/dist/core/boundedRpc.js +8 -1
  82. package/dist/core/controllerClient.js +20 -1
  83. package/dist/core/controllerServer.js +4 -4
  84. package/dist/doctor/doctor.js +13 -2
  85. package/dist/domain/agentResultTransport.js +9 -9
  86. package/dist/execution/codexThreadNaming.js +2 -8
  87. package/dist/execution/executionHealth.js +51 -63
  88. package/dist/execution/reviewMainRun.js +137 -0
  89. package/dist/execution/workItemExecution.js +28 -29
  90. package/dist/execution/workItemExecutionProjection.js +99 -107
  91. package/dist/execution/workItemMainRun.js +141 -0
  92. package/dist/executor/agentAdapter.js +227 -20
  93. package/dist/executor/agentConfigurationCatalog.js +126 -4
  94. package/dist/executor/agentConfigurationProbe.js +162 -4
  95. package/dist/executor/agentExecutor.js +79 -78
  96. package/dist/executor/effectiveLaunch.js +105 -18
  97. package/dist/executor/executorRegistry.js +29 -44
  98. package/dist/executor/fileRoleLaunchPlanner.js +229 -154
  99. package/dist/executor/workspacePreflightClassification.js +16 -16
  100. package/dist/grant/capabilityGrant.js +6 -3
  101. package/dist/input/inputRequest.js +12 -10
  102. package/dist/integration/gitIntegrationService.js +4 -11
  103. package/dist/integration/integrationQueueService.js +4 -4
  104. package/dist/interaction/operatorPresentation.js +1 -1
  105. package/dist/kernel/builtinCapabilities.js +247 -12
  106. package/dist/kernel/capabilityRegistry.js +64 -18
  107. package/dist/kernel/instanceHost.js +12 -1
  108. package/dist/kernel/kernelPorts.js +2 -2
  109. package/dist/lifecycle/canonicalLifecycleEvent.js +44 -49
  110. package/dist/lifecycle/exactRunTerminalization.js +449 -0
  111. package/dist/message/message.js +62 -6
  112. package/dist/message/messageContinuation.js +204 -0
  113. package/dist/observability/executionAudit.js +70 -72
  114. package/dist/observability/faultClassification.js +2 -2
  115. package/dist/observability/orchestrationMetrics.js +8 -8
  116. package/dist/operator/operatorSessionHistory.js +1 -7
  117. package/dist/output/agentConfigurationPresentation.js +8 -3
  118. package/dist/output/agentRunConfigurationPresentation.js +128 -0
  119. package/dist/output/rolePresentation.js +54 -3
  120. package/dist/plugins/pluginChild.js +104 -0
  121. package/dist/plugins/pluginIntent.js +26 -0
  122. package/dist/plugins/pluginInterpreter.js +43 -0
  123. package/dist/plugins/pluginPackage.js +101 -0
  124. package/dist/plugins/pluginProcess.js +112 -0
  125. package/dist/plugins/pluginService.js +380 -0
  126. package/dist/profile/agentProfile.js +1 -1
  127. package/dist/repository/gitWorkspace.js +26 -4
  128. package/dist/repository/project.js +19 -4
  129. package/dist/repository/taskBaseFreshness.js +13 -13
  130. package/dist/repository/taskWorkspaceCoordinator.js +20 -27
  131. package/dist/repository/taskWorkspacePreparer.js +344 -83
  132. package/dist/resources/autoResourceGc.js +3 -3
  133. package/dist/resources/liveReferences.js +3 -3
  134. package/dist/resources/projectResource.js +123 -0
  135. package/dist/resources/projectResourceService.js +421 -0
  136. package/dist/resources/resourceDiscovery.js +6 -6
  137. package/dist/resources/resourceGc.js +1 -1
  138. package/dist/resources/resourceRegistrar.js +1 -1
  139. package/dist/resources/resourceTypes.js +1 -1
  140. package/dist/review/deltaRecheck.js +3 -3
  141. package/dist/review/reviewAcceptance.js +16 -16
  142. package/dist/review/reviewDecision.js +7 -7
  143. package/dist/review/reviewRound.js +21 -20
  144. package/dist/review/reviewerAvailability.js +2 -2
  145. package/dist/role/role.js +51 -7
  146. package/dist/role/taskRoleUpdate.js +30 -0
  147. package/dist/runtime/acpProtocol.js +425 -0
  148. package/dist/runtime/acpSession.js +731 -0
  149. package/dist/runtime/acpSessionConfiguration.js +260 -0
  150. package/dist/runtime/agentDriver.js +30 -11
  151. package/dist/runtime/agentEndpoint.js +278 -0
  152. package/dist/runtime/agentEndpointIdentity.js +86 -0
  153. package/dist/runtime/agentEndpointOwnership.js +239 -0
  154. package/dist/runtime/agentError.js +2 -10
  155. package/dist/runtime/agentHost.js +565 -314
  156. package/dist/runtime/agentRunConfiguration.js +258 -0
  157. package/dist/runtime/builtinAgentDrivers.js +134 -18
  158. package/dist/runtime/builtinAgentErrorMappers.js +55 -3
  159. package/dist/runtime/builtinTranscriptUsage.js +1 -1
  160. package/dist/runtime/claude-process-owner +0 -0
  161. package/dist/runtime/codexAppServerRuntime.js +38 -30
  162. package/dist/runtime/codexInteractiveHost.js +41 -6
  163. package/dist/runtime/continuationManager.js +2 -6
  164. package/dist/runtime/executionEnvironment.js +30 -0
  165. package/dist/runtime/firstProgressAdvisory.js +11 -11
  166. package/dist/runtime/index.js +4 -3
  167. package/dist/runtime/jsonLineChannel.js +109 -0
  168. package/dist/runtime/launchBroker.js +91 -16
  169. package/dist/runtime/launchDiagnostics.js +2 -2
  170. package/dist/runtime/lifecycleReservation.js +10 -18
  171. package/dist/runtime/managedCaller.js +61 -17
  172. package/dist/runtime/nativeSessionControl.js +102 -0
  173. package/dist/runtime/ports.js +6 -21
  174. package/dist/runtime/processExitObservation.js +8 -7
  175. package/dist/runtime/promptEnvelope.js +17 -6
  176. package/dist/runtime/providerContinuation.js +3 -9
  177. package/dist/runtime/providerContinuationReconciliationService.js +4 -13
  178. package/dist/runtime/providerControl.js +2 -7
  179. package/dist/runtime/providerRuntimeIdentity.js +110 -222
  180. package/dist/runtime/providerRuntimeReconciler.js +5 -9
  181. package/dist/runtime/runtimeBinding.js +0 -1
  182. package/dist/runtime/runtimeContinuationProjection.js +4 -7
  183. package/dist/runtime/runtimeDeadlines.js +9 -0
  184. package/dist/runtime/runtimeHealthPolicy.js +1 -1
  185. package/dist/runtime/runtimeObservation.js +29 -65
  186. package/dist/runtime/runtimeProjection.js +43 -51
  187. package/dist/runtime/runtimeSessionCandidate.js +1 -3
  188. package/dist/runtime/sessionLaunchRequest.js +3 -7
  189. package/dist/runtime/sessionOwnerIdentity.js +7 -54
  190. package/dist/runtime/sessionOwnerRegistry.js +22 -17
  191. package/dist/runtime/sessionReconciliation.js +4 -8
  192. package/dist/runtime/sessionTerminationGuard.js +70 -259
  193. package/dist/runtime/sessionTokenMetrics.js +5 -16
  194. package/dist/runtime/structuredProviderHost.js +237 -117
  195. package/dist/runtime/taskRuntimeIsolation.js +39 -122
  196. package/dist/runtime/tmuxAdapters.js +39 -86
  197. package/dist/scheduler/activeRoleRunDelivery.js +354 -0
  198. package/dist/scheduler/leaderWakeupProcessor.js +75 -266
  199. package/dist/scheduler/operatorInputNotificationProcessor.js +1 -1
  200. package/dist/scheduler/ports.js +80 -9
  201. package/dist/scheduler/{roleTurnLiveness.js → roleRunLiveness.js} +26 -30
  202. package/dist/scheduler/{roleTurnStall.js → roleRunStall.js} +128 -139
  203. package/dist/scheduler/taskExecutionProjection.js +120 -124
  204. package/dist/scheduler/taskObservabilityProjection.js +29 -29
  205. package/dist/scheduler/taskWake.js +11 -4
  206. package/dist/scheduler/wakeReason.js +9 -1
  207. package/dist/setup/setupCommand.js +1 -0
  208. package/dist/storage/migrations/agentRunContract.js +159 -0
  209. package/dist/storage/migrations/removeRuntimeGeneration.js +207 -0
  210. package/dist/storage/sqliteSchema.js +431 -5
  211. package/dist/storage/sqliteStore.js +375 -220
  212. package/dist/storage/storageVersions.js +1 -1
  213. package/dist/storage/storeRpc.js +10 -5
  214. package/dist/storage/taskStore.js +13 -11
  215. package/dist/storage/upgrade/upgradeOrchestrator.js +5 -7
  216. package/dist/surface/surfaceContributions.js +102 -0
  217. package/dist/task/completionReadiness.js +32 -6
  218. package/dist/task/deliveryGuard.js +16 -16
  219. package/dist/task/draftPlan.js +72 -12
  220. package/dist/task/nextAction.js +144 -128
  221. package/dist/task/remoteDelivery.js +6 -6
  222. package/dist/task/task.js +184 -18
  223. package/dist/task/taskActivation.js +301 -0
  224. package/dist/task/taskActivationService.js +392 -0
  225. package/dist/task/taskRecordReference.js +5 -4
  226. package/dist/task/taskRecordRetirement.js +1 -1
  227. package/dist/telemetry/sqliteTelemetryStore.js +55 -68
  228. package/dist/telemetry/telemetryConfig.js +14 -14
  229. package/dist/telemetry/telemetryWiring.js +2 -2
  230. package/dist/web/assets/assetManifest.js +2 -0
  231. package/dist/web/assets/client/app.js +120 -20
  232. package/dist/web/assets/client/components.js +87 -54
  233. package/dist/web/assets/client/i18n.js +83 -41
  234. package/dist/web/assets/client/markdown.js +1 -1
  235. package/dist/web/assets/client/taskSurface.js +353 -0
  236. package/dist/web/assets/client/view.js +49 -44
  237. package/dist/web/assets/shell.js +1 -1
  238. package/dist/web/assets/styles/cards.js +22 -4
  239. package/dist/web/controllerWeb.js +60 -0
  240. package/dist/web/webMutation.js +28 -0
  241. package/dist/web/webServer.js +118 -8
  242. package/dist/web/webSnapshot.js +81 -74
  243. package/dist/web/webTaskSurface.js +64 -0
  244. package/dist/workItem/dependencyGate.js +1 -1
  245. package/dist/workItem/workItem.js +80 -48
  246. package/dist/workspace/workItemChangeSetManager.js +16 -9
  247. package/docs/agent-result-consumption.md +94 -0
  248. package/docs/agent-runtime-drivers.md +91 -0
  249. package/docs/architecture/README.md +38 -0
  250. package/docs/architecture/capabilities-and-resources.md +79 -0
  251. package/docs/managed-turn-and-session-runtime.md +222 -0
  252. package/docs/observability/README.md +81 -0
  253. package/docs/plugin-sdk.md +290 -0
  254. package/docs/provider-runtime.md +163 -0
  255. package/docs/release-workflow.md +303 -0
  256. package/docs/roles-and-configuration.md +113 -0
  257. package/docs/sqlite-control-plane-design.md +76 -0
  258. package/docs/task-dag-semantics.md +57 -0
  259. package/docs/task-delivery.md +103 -0
  260. package/docs/task-local-identity.md +6 -6
  261. package/docs/testing/verification-levels.md +86 -0
  262. package/i18n/README.zh-CN.md +98 -739
  263. package/package.json +2 -2
  264. package/skills/yui-leader/SKILL.md +130 -103
  265. package/skills/yui-leader/references/integration.md +39 -0
  266. package/skills/yui-leader/references/replicated-execution.md +42 -0
  267. package/skills/yui-leader/references/task-plugins.md +33 -0
  268. package/skills/yui-operator/SKILL.md +30 -59
  269. package/skills/yui-reviewer/SKILL.md +35 -36
  270. package/skills/yui-runtime/SKILL.md +88 -24
  271. package/skills/yui-runtime/references/publication.md +22 -0
  272. package/skills/yui-runtime/references/recovery.md +64 -0
  273. package/skills/yui-worker/SKILL.md +37 -39
  274. package/dist/cli/roleOptionCatalog.js +0 -68
  275. package/dist/context/sourceTurnContext.js +0 -30
  276. package/dist/execution/reviewMainTurn.js +0 -161
  277. package/dist/execution/workItemMainTurn.js +0 -164
  278. package/dist/lifecycle/exactTurnTerminalization.js +0 -407
  279. package/dist/runtime/preallocatedNativeSession.js +0 -13
  280. package/dist/runtime/runtimeStopReceipt.js +0 -42
  281. package/dist/scheduler/activeRoleTurnDelivery.js +0 -315
@@ -1,161 +0,0 @@
1
- import { enqueueRoleTurnDispatch } from "../coordination/workMailboxQueue.js";
2
- import { createTurnInput } from "../context/turnInputContract.js";
3
- import { contextSnapshotDeltaRefIds, freezeTurnContextSnapshot } from "../context/turnContextPack.js";
4
- import { contextSnapshotRef } from "../context/contextSnapshot.js";
5
- import { roleAgentSessionResumeMode } from "../executor/agentExecutor.js";
6
- import { resolveEffectiveLaunch } from "../executor/effectiveLaunch.js";
7
- import { createTaskEvent } from "../event/taskEvent.js";
8
- import { finishReviewRound, startReviewRound } from "../review/reviewRound.js";
9
- import { createTurn } from "../turn/turn.js";
10
- import { executionGroupSettled, MINIMUM_SYNTHESIS_RESULTS } from "./workItemExecution.js";
11
- export function successfulReviewSynthesisProducers(store, round, group) {
12
- if (!executionGroupSettled(group)) {
13
- throw new Error(`Review ExecutionGroup is not settled: ${round.id}/${group.id}.`);
14
- }
15
- return [...group.lanes]
16
- .sort((left, right) => left.ordinal - right.ordinal || left.id.localeCompare(right.id))
17
- .flatMap((lane) => {
18
- if (lane.disposition !== "succeeded")
19
- return [];
20
- const turn = lane.successfulTurnId === undefined
21
- ? null
22
- : store.getTurn(round.taskId, lane.successfulTurnId);
23
- if (turn === null
24
- || turn.status !== "completed"
25
- || turn.purpose !== "review"
26
- || turn.reviewRoundId !== round.id
27
- || turn.executionGroupId !== group.id
28
- || turn.executionLaneId !== lane.id
29
- || turn.result === undefined) {
30
- throw new Error(`Successful Review ExecutionLane has no exact Producer result: `
31
- + `${group.id}/${lane.id}.`);
32
- }
33
- return [{
34
- laneId: lane.id,
35
- roleName: lane.roleName,
36
- turnId: turn.id
37
- }];
38
- });
39
- }
40
- /**
41
- * Projects a settled replicated Review into exactly one initial main Reviewer
42
- * synthesis Turn. Explicit Turn retry may create later main attempts with the
43
- * same source Group; successful producer Lanes remain immutable.
44
- */
45
- export function reconcileReviewMainTurns(store, taskId, now) {
46
- const task = store.getTask(taskId);
47
- if (task === null || task.status !== "active") {
48
- return { createdTurns: [], failedReviewRoundIds: [] };
49
- }
50
- const createdTurns = [];
51
- const failedReviewRoundIds = [];
52
- const rounds = [...store.listReviewRounds(taskId)]
53
- .sort((left, right) => left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id));
54
- for (const round of rounds) {
55
- const group = round.executionGroup;
56
- if (round.status !== "running"
57
- || group === undefined
58
- || round.reviewerTurnId !== undefined
59
- || !executionGroupSettled(group))
60
- continue;
61
- const producers = successfulReviewSynthesisProducers(store, round, group);
62
- if (producers.length < MINIMUM_SYNTHESIS_RESULTS) {
63
- const summary = `Review ExecutionGroup ${group.id} settled with ${producers.length} `
64
- + `successful Producer result${producers.length === 1 ? "" : "s"}; at least `
65
- + `${MINIMUM_SYNTHESIS_RESULTS} are required.`;
66
- store.saveReviewRound(taskId, finishReviewRound(round, "failed", now, { kind: "quorum", message: summary }));
67
- store.saveEvent(taskId, createTaskEvent(store.nextEventId(taskId), taskId, "review.execution-group-failed", {
68
- reviewRoundId: round.id,
69
- executionGroupId: group.id,
70
- successfulProducerCount: String(producers.length),
71
- requiredProducerCount: String(MINIMUM_SYNTHESIS_RESULTS)
72
- }, now));
73
- failedReviewRoundIds.push(round.id);
74
- continue;
75
- }
76
- const existing = store.listTurns(taskId).filter((turn) => (turn.purpose === "review"
77
- && turn.reviewRoundId === round.id
78
- && turn.sourceExecutionGroupId === group.id));
79
- if (existing.some(({ status }) => status !== "failed"))
80
- continue;
81
- const role = store.getRole(taskId, round.reviewerRoleName);
82
- if (role === null) {
83
- throw new Error(`Review main Role is missing: ${taskId}/${round.reviewerRoleName}.`);
84
- }
85
- if (store.getActiveTurn(taskId, role.name) !== null)
86
- continue;
87
- const workspace = store.getReviewRoundWorkspace(taskId, round.id);
88
- if (workspace === null) {
89
- throw new Error(`Review main workspace is missing: ${taskId}/${round.id}.`);
90
- }
91
- const effective = resolveEffectiveLaunch({
92
- role,
93
- purpose: "review",
94
- workspace,
95
- reviewRoundId: round.id,
96
- reviewBaseCommit: round.reviewBaseCommit
97
- });
98
- const snapshot = freezeTurnContextSnapshot(store, {
99
- taskId,
100
- roleName: role.name,
101
- purpose: "review",
102
- ...(round.workItemId === undefined ? {} : { workItemId: round.workItemId }),
103
- reviewRoundId: round.id,
104
- sourceExecutionGroupId: group.id
105
- }, now, "controller", group.assignment.contextSnapshotRef);
106
- const turn = createTurn(store.nextTurnId(taskId), taskId, role.name, roleAgentSessionResumeMode(store.getTaskRoleSessionSet(taskId, role.name), effective.agentId, effective), createTurnInput({
107
- source: {
108
- type: "yui",
109
- channel: round.workItemId === undefined ? "task-dispatch" : "workitem-dispatch"
110
- },
111
- directive: synthesisDirective(group, producers),
112
- contextSnapshotRef: contextSnapshotRef(snapshot),
113
- deltaRefIds: contextSnapshotDeltaRefIds(store, snapshot)
114
- }), now, {
115
- ...(round.workItemId === undefined ? {} : { workItemId: round.workItemId }),
116
- purpose: "review",
117
- reviewRoundId: round.id,
118
- sourceExecutionGroupId: group.id,
119
- workspace,
120
- effective
121
- });
122
- store.saveTurn(turn);
123
- store.saveReviewRound(taskId, startReviewRound(round, turn.id));
124
- store.saveActiveTurn(turn);
125
- enqueueRoleTurnDispatch(store, {
126
- taskId,
127
- roleName: role.name,
128
- turnId: turn.id,
129
- reason: "review-synthesis-ready",
130
- occurredAt: now
131
- });
132
- store.saveEvent(taskId, createTaskEvent(store.nextEventId(taskId), taskId, "turn.review-dispatched", {
133
- turnId: turn.id,
134
- role: turn.roleName,
135
- purpose: turn.purpose,
136
- mode: turn.mode,
137
- agent: `${turn.effective.agentId}/${turn.effective.adapterId}`,
138
- effectiveRevision: String(turn.effective.sourceDesiredRevision),
139
- profileAccess: turn.effective.profileAccess,
140
- effectivePermission: turn.effective.permission.strategy,
141
- writeProjectIds: turn.effective.writeProjectIds.join(",") || "none",
142
- reviewRoundId: round.id,
143
- sourceExecutionGroupId: group.id
144
- }, now));
145
- createdTurns.push(turn);
146
- }
147
- return { createdTurns, failedReviewRoundIds };
148
- }
149
- function synthesisDirective(group, producers) {
150
- return [
151
- "Act as the main Reviewer over every frozen successful Producer result in stable Lane order.",
152
- "Expand each exact source Turn from the frozen Context Snapshot and consume its original result text plus Core-authored system evidence.",
153
- "Resolve disagreements through review judgment against the frozen candidate. Do not rerun, retry, append, select, or abandon Lanes.",
154
- "Return one complete original review result for the Leader; Yui Core does not parse or validate its semantic structure.",
155
- JSON.stringify({
156
- schemaVersion: 1,
157
- sourceExecutionGroupId: group.id,
158
- producers
159
- }, null, 2)
160
- ].join("\n\n");
161
- }
@@ -1,164 +0,0 @@
1
- import { isDeepStrictEqual } from "node:util";
2
- import { enqueueRoleTurnDispatch } from "../coordination/workMailboxQueue.js";
3
- import { createTurnInput } from "../context/turnInputContract.js";
4
- import { contextSnapshotDeltaRefIds, freezeTurnContextSnapshot } from "../context/turnContextPack.js";
5
- import { contextSnapshotRef } from "../context/contextSnapshot.js";
6
- import { roleAgentSessionResumeMode } from "../executor/agentExecutor.js";
7
- import { resolveEffectiveLaunch } from "../executor/effectiveLaunch.js";
8
- import { createTaskEvent } from "../event/taskEvent.js";
9
- import { createTurn } from "../turn/turn.js";
10
- import { currentWorkItemExecutionGroup, updateWorkItemStatus } from "../workItem/workItem.js";
11
- import { MINIMUM_WORK_ITEM_SYNTHESIS_RESULTS, workItemExecutionGroupSettled } from "./workItemExecution.js";
12
- export function successfulWorkItemSynthesisProducers(store, item, group) {
13
- if (!workItemExecutionGroupSettled(group)) {
14
- throw new Error(`WorkItem ExecutionGroup is not settled: ${item.id}/${group.id}.`);
15
- }
16
- return [...group.lanes]
17
- .sort((left, right) => left.ordinal - right.ordinal || left.id.localeCompare(right.id))
18
- .flatMap((lane) => {
19
- if (lane.disposition !== "succeeded")
20
- return [];
21
- const turn = lane.successfulTurnId === undefined
22
- ? null
23
- : store.getTurn(item.taskId, lane.successfulTurnId);
24
- if (turn === null
25
- || turn.status !== "completed"
26
- || turn.workItemId !== item.id
27
- || turn.executionGroupId !== group.id
28
- || turn.executionLaneId !== lane.id
29
- || turn.result === undefined) {
30
- throw new Error(`Successful ExecutionLane has no exact Producer Turn result: ${group.id}/${lane.id}.`);
31
- }
32
- return [{
33
- laneId: lane.id,
34
- roleName: lane.roleName,
35
- turnId: turn.id
36
- }];
37
- });
38
- }
39
- /**
40
- * Reconcile every settled replicated WorkItem in one Task. The Turn row is the
41
- * durable caller/idempotency record: at most one initial main Turn may name a
42
- * source Group, while explicit retries append more Turns with the same source.
43
- */
44
- export function reconcileWorkItemMainTurns(store, taskId, now) {
45
- const task = store.getTask(taskId);
46
- if (task === null || task.status !== "active" || task.executionGate.state !== "enabled") {
47
- return { createdTurns: [], failedWorkItemIds: [] };
48
- }
49
- const createdTurns = [];
50
- const failedWorkItemIds = [];
51
- const items = [...store.listWorkItems(taskId)].sort((left, right) => (left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id)));
52
- for (const item of items) {
53
- if (item.status !== "running")
54
- continue;
55
- const group = currentWorkItemExecutionGroup(item);
56
- if (group === undefined || !workItemExecutionGroupSettled(group))
57
- continue;
58
- const producers = successfulWorkItemSynthesisProducers(store, item, group);
59
- if (producers.length < MINIMUM_WORK_ITEM_SYNTHESIS_RESULTS) {
60
- const summary = `ExecutionGroup ${group.id} settled with ${producers.length} successful `
61
- + `Producer result${producers.length === 1 ? "" : "s"}; at least `
62
- + `${MINIMUM_WORK_ITEM_SYNTHESIS_RESULTS} are required.`;
63
- store.saveWorkItem(taskId, updateWorkItemStatus(item, "failed", now, summary));
64
- store.saveEvent(taskId, createTaskEvent(store.nextEventId(taskId), taskId, "work.execution-group-failed", {
65
- workItemId: item.id,
66
- executionGroupId: group.id,
67
- successfulProducerCount: String(producers.length),
68
- requiredProducerCount: String(MINIMUM_WORK_ITEM_SYNTHESIS_RESULTS)
69
- }, now));
70
- failedWorkItemIds.push(item.id);
71
- continue;
72
- }
73
- const existing = store.listTurns(taskId).some((turn) => (turn.purpose === "execution"
74
- && turn.workItemId === item.id
75
- && turn.sourceExecutionGroupId === group.id));
76
- if (existing)
77
- continue;
78
- if (item.assignee === undefined) {
79
- throw new Error(`Replicated WorkItem has no main assignee: ${item.id}.`);
80
- }
81
- const role = store.getRole(taskId, item.assignee);
82
- if (role === null)
83
- throw new Error(`WorkItem main Role is missing: ${taskId}/${item.assignee}.`);
84
- if (store.getActiveTurn(taskId, role.name) !== null)
85
- continue;
86
- const workspace = role.name === "leader"
87
- ? store.getTaskWorkspace(taskId)
88
- : store.getWorkItemWorkspace(taskId, item.id);
89
- if (workspace === null) {
90
- throw new Error(`WorkItem main workspace is missing: ${taskId}/${item.id}.`);
91
- }
92
- const visibleProjectIds = workspace.entries.map(({ projectId }) => projectId).sort();
93
- const taskProjectIds = task.projectBindings.map(({ projectId }) => projectId).sort();
94
- const writableProjectIds = workspace.entries
95
- .filter(({ access }) => access === "write")
96
- .map(({ projectId }) => projectId)
97
- .sort();
98
- if (!isDeepStrictEqual(visibleProjectIds, taskProjectIds)
99
- || !isDeepStrictEqual(writableProjectIds, [...item.writeProjectIds].sort())) {
100
- throw new Error(`WorkItem main workspace does not match its approved scope: ${item.id}.`);
101
- }
102
- const effective = resolveEffectiveLaunch({
103
- role,
104
- purpose: "execution",
105
- workspace,
106
- workItemWriteProjectIds: item.writeProjectIds
107
- });
108
- const snapshot = freezeTurnContextSnapshot(store, {
109
- taskId,
110
- roleName: role.name,
111
- purpose: "execution",
112
- workItemId: item.id,
113
- sourceExecutionGroupId: group.id,
114
- workspace
115
- }, now, "controller", group.assignment.contextSnapshotRef);
116
- const turn = createTurn(store.nextTurnId(taskId), taskId, role.name, roleAgentSessionResumeMode(store.getTaskRoleSessionSet(taskId, role.name), effective.agentId, effective), createTurnInput({
117
- source: { type: "yui", channel: "workitem-dispatch" },
118
- directive: synthesisDirective(group, producers),
119
- contextSnapshotRef: contextSnapshotRef(snapshot),
120
- deltaRefIds: contextSnapshotDeltaRefIds(store, snapshot)
121
- }), now, {
122
- workItemId: item.id,
123
- sourceExecutionGroupId: group.id,
124
- workspace,
125
- effective
126
- });
127
- store.saveTurn(turn);
128
- store.saveActiveTurn(turn);
129
- enqueueRoleTurnDispatch(store, {
130
- taskId,
131
- roleName: role.name,
132
- turnId: turn.id,
133
- reason: "workitem-synthesis-ready",
134
- occurredAt: now
135
- });
136
- store.saveEvent(taskId, createTaskEvent(store.nextEventId(taskId), taskId, "turn.dispatched", {
137
- turnId: turn.id,
138
- role: turn.roleName,
139
- purpose: turn.purpose,
140
- mode: turn.mode,
141
- agent: `${turn.effective.agentId}/${turn.effective.adapterId}`,
142
- effectiveRevision: String(turn.effective.sourceDesiredRevision),
143
- profileAccess: turn.effective.profileAccess,
144
- effectivePermission: turn.effective.permission.strategy,
145
- writeProjectIds: turn.effective.writeProjectIds.join(",") || "none",
146
- workItemId: item.id,
147
- sourceExecutionGroupId: group.id
148
- }, now));
149
- createdTurns.push(turn);
150
- }
151
- return { createdTurns, failedWorkItemIds };
152
- }
153
- function synthesisDirective(group, producers) {
154
- return [
155
- "Synthesize every frozen successful Producer result in stable Lane order.",
156
- "Expand each exact source Turn from the frozen Context Snapshot and consume its original result text plus Core-authored system evidence.",
157
- "Do not rerun, retry, append, or abandon any Lane. Form the final WorkItem result from these records.",
158
- JSON.stringify({
159
- schemaVersion: 1,
160
- sourceExecutionGroupId: group.id,
161
- producers
162
- }, null, 2)
163
- ].join("\n\n");
164
- }