@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,3 +1,5 @@
1
+ import { AGENT_ADAPTER_CATALOG } from "../../../agent/adapterCatalog.js";
2
+ import { AGENT_EXECUTION_COMPONENT_CATALOG } from "../../../agent/executionComponents.js";
1
3
  export const COMPONENTS_SCRIPT = `
2
4
  // Reusable widgets and record cards. Everything here is a pure builder:
3
5
  // data + i18n in, DOM out. Page composition lives in view.js.
@@ -5,15 +7,19 @@ import { node } from "/assets/js/dom.js";
5
7
  import { formatDateTime, relativeTime } from "/assets/js/format.js";
6
8
  import { escapeHtml, inlineMarkdown, renderMarkdown } from "/assets/js/markdown.js";
7
9
 
8
- export function translatedStatus(t, prefix, status) {
9
- return t(prefix + "." + status);
10
- }
11
-
12
- // Mirrors src/agent/adapterCatalog.ts to avoid a runtime import loop.
13
- const adapterLabels = { codex: "Codex", claude: "Claude" };
10
+ // Generated from the server catalogs, not a second product registry.
11
+ const adapterLabels = ${JSON.stringify(Object.fromEntries(AGENT_ADAPTER_CATALOG.map(({ id, label }) => [id, label])))};
12
+ const componentLabels = ${JSON.stringify(Object.fromEntries(AGENT_EXECUTION_COMPONENT_CATALOG.map(({ id, label }) => [id, label])))};
14
13
  function adapterLabel(adapterId) {
15
14
  return adapterLabels[adapterId] || adapterId;
16
15
  }
16
+ function componentLabel(component, adapterId) {
17
+ return component ? componentLabels[component] || component : adapterLabel(adapterId);
18
+ }
19
+
20
+ export function translatedStatus(t, prefix, status) {
21
+ return t(prefix + "." + status);
22
+ }
17
23
 
18
24
  // --- Small widgets -----------------------------------------------------------
19
25
  export function metaItem(label, value) {
@@ -37,7 +43,9 @@ export function chip(text, extraClass) {
37
43
  export function agentBadge(agent) {
38
44
  if (!agent) return null;
39
45
  const badge = node("span", "agent-badge");
40
- if (agent.adapterId) badge.append(chip(adapterLabel(agent.adapterId), "is-adapter"));
46
+ if (agent.adapterId || agent.component) {
47
+ badge.append(chip(componentLabel(agent.component, agent.adapterId), "is-adapter"));
48
+ }
41
49
  if (agent.model) badge.append(chip(agent.model));
42
50
  if (agent.effort) badge.append(chip(agent.effort));
43
51
  return badge.childNodes.length ? badge : null;
@@ -102,6 +110,9 @@ const EXEC_STATUS_TONE = {
102
110
  "working": "is-active",
103
111
  "completed": "is-muted",
104
112
  "retired": "is-muted",
113
+ "cancelled": "is-muted",
114
+ "accepted": "is-muted",
115
+ "open": "is-active",
105
116
  "archived": "is-muted"
106
117
  };
107
118
 
@@ -114,9 +125,9 @@ export function executionBand(projection, t, locale) {
114
125
  head.append(pill(t, "exec.status", projection.status));
115
126
  head.append(node("span", "exec-band-owner",
116
127
  t("exec.owner." + projection.owner) + " · " + t("exec.action." + projection.action)));
117
- if (projection.activeTurns && projection.activeTurns.length > 0) {
128
+ if (projection.activeRuns && projection.activeRuns.length > 0) {
118
129
  head.append(node("span", "exec-band-executors",
119
- projection.activeTurns.length + " " + t("exec.executors")));
130
+ projection.activeRuns.length + " " + t("exec.executors")));
120
131
  }
121
132
  if (projection.monitoring === "stopped") {
122
133
  head.append(node("span", "exec-band-stopped", t("exec.monitoring.stopped")));
@@ -176,9 +187,10 @@ export function workItemExecutionCard(projection, t) {
176
187
  row.append(statusDot(lane.status));
177
188
  row.append(node("span", "lane-role", lane.roleName));
178
189
  row.append(node("span", "lane-status", t("workExec.lane." + lane.status)));
179
- row.append(node("span", "mono", lane.currentTurnId || t("detail.unobserved")));
180
- if (lane.retryTurnId) row.append(chip(t("workExec.retry") + " · " + lane.retryTurnId, "is-danger"));
181
- if (lane.settleTurnId) row.append(chip(t("workExec.settle") + " · " + lane.settleTurnId));
190
+ if (lane.delivery) row.append(chip(t("run.delivery." + lane.delivery)));
191
+ row.append(node("span", "mono", lane.currentRunId || t("detail.unobserved")));
192
+ if (lane.retryRunId) row.append(chip(t("workExec.retry") + " · " + lane.retryRunId, "is-danger"));
193
+ if (lane.settleRunId) row.append(chip(t("workExec.settle") + " · " + lane.settleRunId));
182
194
  if (lane.session === "unobserved") row.append(chip(t("detail.unobserved")));
183
195
  lanes.append(row);
184
196
  });
@@ -187,18 +199,18 @@ export function workItemExecutionCard(projection, t) {
187
199
 
188
200
  const facts = node("div", "record-meta execution-resource-meta");
189
201
  facts.append(node("span", "", t("workExec.main") + " · "
190
- + (projection.mainTurn.turnId || t("detail.unobserved"))
191
- + " [" + t("workExec.mainStatus." + projection.mainTurn.status) + "]"));
202
+ + (projection.mainRun.runId || t("detail.unobserved"))
203
+ + " [" + t("workExec.mainStatus." + projection.mainRun.status) + "]"));
192
204
  facts.append(node("span", "", t("workExec.candidate") + " · "
193
205
  + (projection.candidate.candidateId || t("workExec.none"))
194
206
  + " [" + t("workExec.candidateStatus." + projection.candidate.status) + "]"));
195
207
  card.append(facts);
196
208
 
197
209
  if (projection.candidate.sourceExecutionGroupId) {
198
- const provenance = projection.candidate.successfulLaneTurns.map(function (lane) {
199
- return lane.laneId + " → " + lane.successfulTurnId;
210
+ const provenance = projection.candidate.successfulLaneRuns.map(function (lane) {
211
+ return lane.laneId + " → " + lane.successfulRunId;
200
212
  }).join(", ") || t("detail.unobserved");
201
- card.append(node("p", "muted mono", (projection.candidate.mainTurnId || t("detail.unobserved"))
213
+ card.append(node("p", "muted mono", (projection.candidate.mainRunId || t("detail.unobserved"))
202
214
  + " → " + projection.candidate.sourceExecutionGroupId + " → " + provenance));
203
215
  }
204
216
 
@@ -279,7 +291,7 @@ export function candidateList(candidates, t, locale) {
279
291
  row.append(node("span", "candidate-summary", candidate.summary));
280
292
  const source = candidate.source.type === "direct"
281
293
  ? t("candidate.source.direct")
282
- : t("candidate.source.turn") + " " + candidate.source.turnId;
294
+ : t("candidate.source.run") + " " + candidate.source.runId;
283
295
  row.append(node("span", "candidate-source", source));
284
296
  row.append(node("time", "", formatDateTime(candidate.createdAt, locale)));
285
297
  list.append(row);
@@ -444,7 +456,7 @@ export function inputCard(input, _options, t, locale, actions) {
444
456
  }
445
457
  if (input.requester) {
446
458
  top.append(node("span", "input-requester",
447
- t("detail.requester") + " · " + input.requester.roleName + " / " + input.requester.turnId));
459
+ t("detail.requester") + " · " + input.requester.roleName + " / " + (input.requester.runId ?? input.requester.nativeSessionId)));
448
460
  }
449
461
  card.append(top);
450
462
  card.append(answerActions(input, actions, t));
@@ -455,13 +467,13 @@ export function inputCard(input, _options, t, locale, actions) {
455
467
  export function conclusionMeta(task, t, locale, kind) {
456
468
  const meta = node("div", "conclusion-meta");
457
469
  const actor = kind === "archived" ? task.archivedBy
458
- : kind === "retired" ? task.retiredBy
470
+ : kind === "cancelled" ? task.retiredBy
459
471
  : task.completedBy;
460
472
  const at = kind === "archived" ? task.archivedAt
461
- : kind === "retired" ? task.retiredAt
473
+ : kind === "cancelled" ? task.retiredAt
462
474
  : task.completedAt;
463
475
  const label = kind === "archived" ? t("detail.archivedBy")
464
- : kind === "retired" ? t("detail.retiredBy")
476
+ : kind === "cancelled" ? t("detail.cancelledBy")
465
477
  : t("detail.completedBy");
466
478
  if (actor) meta.append(node("span", "", label + " · " + authorName(t, actor)));
467
479
  if (at) meta.append(node("time", "", formatDateTime(at, locale)));
@@ -471,7 +483,7 @@ export function conclusionMeta(task, t, locale, kind) {
471
483
  // --- Record cards -----------------------------------------------------------------
472
484
  // WorkItems that no longer need action render collapsed; everything actionable
473
485
  // (pending, running, awaiting acceptance, failed) stays expanded.
474
- const WORK_ITEM_OPEN_STATUSES = ["pending", "running", "awaiting_acceptance", "failed"];
486
+ const WORK_ITEM_OPEN_STATUSES = ["open"];
475
487
 
476
488
  export function workItemCard(item, titles, t, locale, actions, taskId) {
477
489
  const collapsible = WORK_ITEM_OPEN_STATUSES.indexOf(item.status) === -1;
@@ -561,46 +573,51 @@ export function workItemCard(item, titles, t, locale, actions, taskId) {
561
573
  return card;
562
574
  }
563
575
 
564
- export function turnCard(turn, t, locale) {
576
+ export function runCard(run, t, locale) {
565
577
  const card = node("article", "execute-card");
566
- card.dataset.status = turn.status;
578
+ card.dataset.status = run.status;
567
579
 
568
580
  const idRow = node("div", "execute-id");
569
- idRow.append(statusDot(turn.status));
570
- idRow.append(node("span", "role", turn.roleName));
571
- idRow.append(node("span", "", turn.id));
572
- if (turn.workItemId) idRow.append(node("span", "", t("detail.workItem") + " · " + turn.workItemId));
573
- if (turn.purpose) idRow.append(chip(t("turn.purpose." + turn.purpose)));
574
- idRow.append(node("time", "", formatDateTime(turn.result?.completedAt || turn.updatedAt, locale)));
581
+ idRow.append(statusDot(run.status));
582
+ idRow.append(node("span", "role", run.roleName));
583
+ idRow.append(node("span", "", run.id));
584
+ if (run.workItemId) idRow.append(node("span", "", t("detail.workItem") + " · " + run.workItemId));
585
+ if (run.purpose) idRow.append(chip(t("run.purpose." + run.purpose)));
586
+ idRow.append(node("time", "", formatDateTime(run.result?.completedAt || run.updatedAt, locale)));
575
587
  card.append(idRow);
588
+ const observation = node("div", "record-meta");
589
+ observation.append(node("span", "", t("run.recordState") + " · " + t("status." + run.status)));
590
+ observation.append(node("span", "", t("run.delivery") + " · "
591
+ + t("run.delivery." + (run.execution?.delivery || "unobserved"))));
592
+ card.append(observation);
576
593
 
577
- const visibleInput = turn.inputs && turn.inputs.length ? turn.inputs[0].input : null;
594
+ const visibleInput = run.inputs && run.inputs.length ? run.inputs[0].input : null;
578
595
  card.append(richText(t("detail.instruction"), visibleInput?.directive || visibleInput?.action || "-", t, { className: "execute-io", threshold: 320 }));
579
- if (turn.result?.output) {
580
- card.append(richText(t("detail.outcome"), turn.result.output, t, { className: "execute-io outcome", threshold: 320 }));
596
+ if (run.result?.output) {
597
+ card.append(richText(t("detail.outcome"), run.result.output, t, { className: "execute-io outcome", threshold: 320 }));
581
598
  }
582
- if (turn.result?.diagnostic) {
583
- card.append(richText(t("detail.failure"), turn.result.diagnostic, t, { className: "execute-io outcome", threshold: 320 }));
599
+ if (run.result?.diagnostic) {
600
+ card.append(richText(t("detail.failure"), run.result.diagnostic, t, { className: "execute-io outcome", threshold: 320 }));
584
601
  }
585
602
 
586
603
  const foot = node("div", "execute-foot");
587
604
  const tags = node("div", "execute-tags");
588
- tags.append(chip(t("mode." + turn.mode)));
589
- if (turn.executionGroupId) {
590
- tags.append(chip(t("detail.lineage") + " · " + turn.executionGroupId
591
- + (turn.executionLaneId ? "/" + turn.executionLaneId : "")));
605
+ tags.append(chip(t("mode." + run.mode)));
606
+ if (run.executionGroupId) {
607
+ tags.append(chip(t("detail.lineage") + " · " + run.executionGroupId
608
+ + (run.executionLaneId ? "/" + run.executionLaneId : "")));
592
609
  }
593
- const badge = turn.effective ? agentBadge(turn.effective) : (turn.agentId ? agentBadge(turn) : null);
610
+ const badge = run.effective ? agentBadge(run.effective) : (run.agentId ? agentBadge(run) : null);
594
611
  if (badge) tags.append(badge);
595
612
  foot.append(tags);
596
- foot.append(pill(t, "turn", turn.status));
613
+ foot.append(pill(t, "run", run.status));
597
614
  card.append(foot);
598
615
 
599
- if (turn.effective) {
616
+ if (run.effective) {
600
617
  const eff = node("div", "record-meta");
601
- eff.append(node("span", "", t("detail.effective") + " · r" + turn.effective.sourceDesiredRevision));
602
- eff.append(node("span", "", t("detail.profileIntent") + " · " + turn.effective.profileAccess));
603
- eff.append(node("span", "", t("detail.permission") + " · " + turn.effective.permission.strategy));
618
+ eff.append(node("span", "", t("detail.effective") + " · r" + run.effective.sourceDesiredRevision));
619
+ eff.append(node("span", "", t("detail.profileIntent") + " · " + run.effective.profileAccess));
620
+ eff.append(node("span", "", t("detail.permission") + " · " + run.effective.permission.strategy));
604
621
  card.append(eff);
605
622
  }
606
623
 
@@ -631,8 +648,8 @@ export function reviewCard(round, t, locale) {
631
648
  if (round.workspace && round.workspace.root) {
632
649
  meta.append(pathMetaItem(t("detail.workspace"), round.workspace.root));
633
650
  }
634
- if (round.reviewerTurnId) {
635
- meta.append(node("span", "mono", t("detail.reviewerTurn") + " · " + round.reviewerTurnId));
651
+ if (round.reviewerRunId) {
652
+ meta.append(node("span", "mono", t("detail.reviewerRun") + " · " + round.reviewerRunId));
636
653
  }
637
654
  if (round.workspaceDisposition) {
638
655
  meta.append(node("span", "", t("detail.workspaceDisposition") + " · "
@@ -647,7 +664,7 @@ export function reviewCard(round, t, locale) {
647
664
  groupMeta.append(node("span", "", t("reviewExec.assignment") + " · "
648
665
  + group.assignment.contextSnapshotRef.id));
649
666
  groupMeta.append(node("span", "", t("reviewExec.main") + " · "
650
- + (round.reviewerTurnId || t("detail.unobserved"))));
667
+ + (round.reviewerRunId || t("detail.unobserved"))));
651
668
  execution.append(groupMeta);
652
669
  const lanes = node("div", "lane-list");
653
670
  group.lanes.forEach(function (lane) {
@@ -656,7 +673,7 @@ export function reviewCard(round, t, locale) {
656
673
  row.append(node("span", "lane-role", t("reviewExec.producer") + " " + lane.ordinal
657
674
  + " · " + lane.roleName));
658
675
  row.append(node("span", "lane-status", t("reviewExec.status." + lane.disposition)));
659
- row.append(node("span", "mono", lane.currentTurnId || t("detail.unobserved")));
676
+ row.append(node("span", "mono", lane.currentRunId || t("detail.unobserved")));
660
677
  lanes.append(row);
661
678
  });
662
679
  execution.append(lanes);
@@ -694,6 +711,7 @@ export function roleCard(role, task, t, locale, actions) {
694
711
  if (activeBinding) {
695
712
  const badge = agentBadge({
696
713
  adapterId: activeBinding.adapterId,
714
+ component: activeBinding.component,
697
715
  model: activeBinding.config && activeBinding.config.model,
698
716
  effort: activeBinding.config && activeBinding.config.effort
699
717
  });
@@ -745,10 +763,10 @@ export function roleCard(role, task, t, locale, actions) {
745
763
  const bindings = bindingIds.map(function (id) {
746
764
  const binding = role.agentBindings[id];
747
765
  const model = binding.config && binding.config.model;
748
- return adapterLabel(binding.adapterId) + (model ? " · " + model : "");
766
+ return componentLabel(binding.component, binding.adapterId) + (model ? " · " + model : "");
749
767
  });
750
768
  const activeBindingLabel = activeBinding
751
- ? adapterLabel(activeBinding.adapterId) + (activeBinding.config && activeBinding.config.model ? " · " + activeBinding.config.model : "")
769
+ ? componentLabel(activeBinding.component, activeBinding.adapterId) + (activeBinding.config && activeBinding.config.model ? " · " + activeBinding.config.model : "")
752
770
  : undefined;
753
771
  cols.append(chipRow(t("detail.agents"), bindings, activeBindingLabel));
754
772
  }
@@ -801,7 +819,7 @@ export function historyEventRow(event, t, locale) {
801
819
  return card;
802
820
  }
803
821
 
804
- export function messageCard(message, t, locale) {
822
+ export function messageCard(message, t, locale, result) {
805
823
  const card = node("article", "record-card");
806
824
  const head = node("div", "record-head");
807
825
  const titleRow = node("div", "record-title-row");
@@ -814,10 +832,25 @@ export function messageCard(message, t, locale) {
814
832
  const meta = node("div", "record-meta");
815
833
  meta.append(node("span", "mono", message.id));
816
834
  meta.append(node("time", "", formatDateTime(message.createdAt, locale)));
817
- if (message.turnId) meta.append(node("span", "mono", message.turnId + (message.workItemId ? " · " + message.workItemId : "")));
835
+ if (message.runId) meta.append(node("span", "mono", message.runId + (message.workItemId ? " · " + message.workItemId : "")));
836
+ if (message.recipient) {
837
+ meta.append(node("span", "mono", "→ " + message.recipient.roleName + " · "
838
+ + (message.recipient.reviewRoundId || message.recipient.workItemId)));
839
+ meta.append(node("span", "mono", !message.recipient.ownerRunId ? t("messageDelivery.notification") : message.continuation?.runId
840
+ ? t("messageDelivery.run") + " " + message.continuation.runId
841
+ : message.continuation?.notDeliveredReason
842
+ ? t("messageDelivery.blocked") + " " + message.continuation.notDeliveredReason
843
+ : t("messageDelivery.pending")));
844
+ }
818
845
  card.append(meta);
819
846
 
820
847
  card.append(richText(null, message.body, t));
848
+ if (message.resultRef) {
849
+ card.append(node("small", "mono", message.resultRef.runId));
850
+ if (result?.output) card.append(richText(t("detail.outcome"), result.output, t));
851
+ if (result?.diagnostic) card.append(richText(t("detail.failure"), result.diagnostic, t));
852
+ if (!result) card.append(node("p", "muted", t("detail.unobserved")));
853
+ }
821
854
  return card;
822
855
  }
823
856
 
@@ -14,7 +14,7 @@ const messages = {
14
14
  "overview.lede": "Tracking {total} tasks — {active} active, {inputs} awaiting input, {completed} completed.",
15
15
  "overview.distribution": "Status distribution",
16
16
  "overview.attention": "Needs attention",
17
- "overview.attentionEmpty": "No open inputs or stalled Turns.",
17
+ "overview.attentionEmpty": "No open inputs or stalled AgentRuns.",
18
18
  "overview.activeNow": "Active now",
19
19
  "overview.activeEmpty": "No tasks are currently active.",
20
20
  "sync.label": "LAST SYNC",
@@ -91,8 +91,8 @@ const messages = {
91
91
  "detail.effective": "Effective launch",
92
92
  "detail.effectiveAgent": "Effective Agent",
93
93
  "detail.failure": "Execution failure",
94
- "detail.reviewerTurn": "Reviewer Turn",
95
- "detail.execution": "Turns",
94
+ "detail.reviewerRun": "Reviewer AgentRun",
95
+ "detail.execution": "AgentRuns",
96
96
  "detail.expectedOutput": "Expected output",
97
97
  "detail.focus": "Current focus",
98
98
  "detail.runtimeHealth": "Runtime health",
@@ -122,6 +122,8 @@ const messages = {
122
122
  "detail.replacement": "Replacement Task",
123
123
  "detail.responsibilities": "Responsibilities",
124
124
  "detail.retired": "Task retired",
125
+ "detail.cancelled": "Task cancelled",
126
+ "detail.cancelledBy": "Cancelled by",
125
127
  "detail.retiredBy": "Retired by",
126
128
  "detail.reviewBase": "Review base",
127
129
  "detail.reviews": "Reviews",
@@ -140,7 +142,18 @@ const messages = {
140
142
  "disposition.removed": "Removed",
141
143
  "empty.brief": "No task brief has been recorded.",
142
144
  "empty.none": "No items",
143
- "empty.turns": "No Turns yet.",
145
+ "empty.runs": "No AgentRuns yet.",
146
+ "run.recordState": "Record state",
147
+ "run.delivery": "Delivery evidence",
148
+ "run.delivery.unobserved": "Unobserved",
149
+ "run.delivery.submitting": "Submitting",
150
+ "run.delivery.deferred": "Waiting for admission — not accepted",
151
+ "run.delivery.accepted": "Accepted — awaiting terminal evidence",
152
+ "run.delivery.delivery-unknown": "Acceptance unknown — no automatic replay",
153
+ "run.delivery.rejected": "Rejected",
154
+ "run.delivery.completed": "Completed",
155
+ "run.delivery.failed": "Failed",
156
+ "run.delivery.cancelled": "Cancelled",
144
157
  "empty.tasks": "No tasks match this view.",
145
158
  "errors.answer": "Unable to answer this input.",
146
159
  "errors.dashboard": "Unable to read the dashboard.",
@@ -152,6 +165,7 @@ const messages = {
152
165
  "group.draft": "Draft",
153
166
  "group.finished": "Completed",
154
167
  "group.retired": "Retired",
168
+ "group.cancelled": "Cancelled",
155
169
  "input.answered": "Input answered.",
156
170
  "input.blocking": "Blocking",
157
171
  "input.freeText": "Type your answer",
@@ -164,6 +178,10 @@ const messages = {
164
178
  "loading.dashboard": "Reading local state…",
165
179
  "loading.detail": "Reading task detail…",
166
180
  "messageKind.operator": "Operator",
181
+ "messageDelivery.run": "Execution record (not acceptance):",
182
+ "messageDelivery.blocked": "Not delivered:",
183
+ "messageDelivery.pending": "Saved, awaiting admission",
184
+ "messageDelivery.notification": "Leader notification; not a separate execution",
167
185
  "messageKind.role-result": "Role result",
168
186
  "messageKind.system": "System",
169
187
  "messageKind.user": "User",
@@ -210,9 +228,10 @@ const messages = {
210
228
  "role.exited": "Exited",
211
229
  "role.failed": "Failed",
212
230
  "role.idle": "Idle",
231
+ "role.unknown": "Unknown / not observed",
213
232
  "role.running": "Running",
214
- "turn.active": "Active",
215
- "turn.failed": "Failed",
233
+ "run.active": "Active",
234
+ "run.failed": "Failed",
216
235
  "search.label": "Search tasks",
217
236
  "search.placeholder": "Filter by title, ID, tag, or project…",
218
237
  "stats.inputs": "inputs",
@@ -223,8 +242,9 @@ const messages = {
223
242
  "status.completed": "Completed",
224
243
  "status.draft": "Draft",
225
244
  "status.retired": "Retired",
245
+ "status.cancelled": "Cancelled",
226
246
  "sync.label": "Last sync",
227
- "tabs.exec": "Turns",
247
+ "tabs.exec": "AgentRuns",
228
248
  "tabs.focus": "Focus",
229
249
  "tabs.history": "History",
230
250
  "tabs.label": "Task sections",
@@ -248,6 +268,8 @@ const messages = {
248
268
  "time.justNow": "just now",
249
269
  "work.awaiting_acceptance": "Awaiting acceptance",
250
270
  "work.cancelled": "Cancelled",
271
+ "work.open": "Open",
272
+ "work.accepted": "Accepted",
251
273
  "work.completed": "Completed",
252
274
  "work.failed": "Failed",
253
275
  "work.pending": "Pending",
@@ -257,28 +279,26 @@ const messages = {
257
279
  "workExec.title": "Execution and recovery",
258
280
  "workExec.shape.direct": "Direct",
259
281
  "workExec.shape.replicated": "Replicated",
260
- "workExec.lane.running": "Running",
282
+ "workExec.lane.running": "Execution record open",
261
283
  "workExec.lane.succeeded": "Succeeded",
262
284
  "workExec.lane.needs-attention": "Needs attention",
263
285
  "workExec.lane.failed": "Failed",
264
286
  "workExec.lane.unknown": "Unknown",
265
287
  "workExec.retry": "Retry",
266
288
  "workExec.settle": "Settle",
267
- "workExec.main": "Main Turn",
289
+ "workExec.main": "Main AgentRun",
268
290
  "workExec.candidate": "Candidate source",
269
291
  "workExec.next": "Next action",
270
292
  "workExec.owner": "owner",
271
293
  "workExec.none": "none",
272
294
  "workExec.synthesis.not-applicable": "No synthesis",
273
- "workExec.synthesis.blocked-by-open-lanes": "Waiting for all Lanes",
274
- "workExec.synthesis.eligible": "Eligible for synthesis",
275
- "workExec.synthesis.insufficient-results": "Insufficient successful results",
276
- "workExec.synthesis.main-running": "Main Turn running",
277
- "workExec.synthesis.main-needs-attention": "Main Turn needs attention",
295
+ "workExec.synthesis.awaiting-selection": "Leader selects synthesis sources",
296
+ "workExec.synthesis.main-running": "Main execution record open",
297
+ "workExec.synthesis.main-needs-attention": "Main AgentRun needs attention",
278
298
  "workExec.synthesis.complete": "Synthesis complete",
279
299
  "workExec.synthesis.unknown": "Synthesis unknown",
280
300
  "workExec.mainStatus.not-started": "Not started",
281
- "workExec.mainStatus.running": "Running",
301
+ "workExec.mainStatus.running": "Execution record open",
282
302
  "workExec.mainStatus.succeeded": "Succeeded",
283
303
  "workExec.mainStatus.needs-attention": "Needs attention",
284
304
  "workExec.mainStatus.unknown": "Unknown",
@@ -289,9 +309,9 @@ const messages = {
289
309
  "workExec.action.wait-for-lanes": "Wait for Lanes",
290
310
  "workExec.action.retry-or-settle-lanes": "Retry or settle exact Lanes",
291
311
  "workExec.action.inspect-unknown": "Inspect missing facts",
292
- "workExec.action.await-main-dispatch": "Await main Turn dispatch",
293
- "workExec.action.wait-for-main": "Wait for main Turn",
294
- "workExec.action.retry-main": "Retry main Turn",
312
+ "workExec.action.select-synthesis-sources": "Select synthesis source AgentRuns",
313
+ "workExec.action.wait-for-main": "Wait for main AgentRun",
314
+ "workExec.action.retry-main": "Retry main AgentRun",
295
315
  "workExec.action.redispatch-work": "Redispatch WorkItem",
296
316
  "workExec.action.submit-candidate": "Submit Candidate",
297
317
  "workExec.action.decide-candidate": "Review or accept Candidate",
@@ -308,6 +328,7 @@ const messages = {
308
328
  "exec.status.working": "Working",
309
329
  "exec.status.completed": "Completed",
310
330
  "exec.status.retired": "Retired",
331
+ "exec.status.cancelled": "Cancelled",
311
332
  "exec.status.archived": "Archived",
312
333
  "exec.owner.leader": "Leader",
313
334
  "exec.owner.worker": "Worker",
@@ -359,9 +380,9 @@ const messages = {
359
380
  "detail.lineage": "Execution",
360
381
  "detail.requester": "Requested by",
361
382
  "candidate.source.direct": "Direct",
362
- "candidate.source.turn": "Turn",
363
- "turn.purpose.execution": "Execution",
364
- "turn.purpose.review": "Review",
383
+ "candidate.source.run": "AgentRun",
384
+ "run.purpose.execution": "Execution",
385
+ "run.purpose.review": "Review",
365
386
  "review.scope.work-item": "Work item",
366
387
  "review.scope.task": "Task"
367
388
  },
@@ -456,8 +477,8 @@ const messages = {
456
477
  "detail.effective": "实际启动配置",
457
478
  "detail.effectiveAgent": "实际 Agent",
458
479
  "detail.failure": "执行失败",
459
- "detail.reviewerTurn": "Reviewer Turn",
460
- "detail.execution": "运行",
480
+ "detail.reviewerRun": "Reviewer 执行记录",
481
+ "detail.execution": "执行记录",
461
482
  "detail.expectedOutput": "期望产出",
462
483
  "detail.focus": "当前重点",
463
484
  "detail.runtimeHealth": "运行健康",
@@ -487,6 +508,8 @@ const messages = {
487
508
  "detail.replacement": "替代任务",
488
509
  "detail.responsibilities": "职责",
489
510
  "detail.retired": "任务已退役",
511
+ "detail.cancelled": "任务已取消",
512
+ "detail.cancelledBy": "取消人",
490
513
  "detail.retiredBy": "退役人",
491
514
  "detail.reviewBase": "评审基线",
492
515
  "detail.reviews": "评审记录",
@@ -505,7 +528,18 @@ const messages = {
505
528
  "disposition.removed": "已移除",
506
529
  "empty.brief": "尚未记录任务简报。",
507
530
  "empty.none": "暂无条目",
508
- "empty.turns": "暂无 Turn 记录。",
531
+ "empty.runs": "暂无执行记录。",
532
+ "run.recordState": "记录状态",
533
+ "run.delivery": "投递证据",
534
+ "run.delivery.unobserved": "尚无观察证据",
535
+ "run.delivery.submitting": "正在提交",
536
+ "run.delivery.deferred": "等待准入,明确未接受",
537
+ "run.delivery.accepted": "已接受,等待准确终态",
538
+ "run.delivery.delivery-unknown": "接受结果未知,不自动重发",
539
+ "run.delivery.rejected": "已拒绝",
540
+ "run.delivery.completed": "已完成",
541
+ "run.delivery.failed": "已失败",
542
+ "run.delivery.cancelled": "已取消",
509
543
  "empty.tasks": "当前视图没有匹配的任务。",
510
544
  "errors.answer": "无法回答该输入请求。",
511
545
  "errors.dashboard": "无法读取控制面板。",
@@ -517,6 +551,7 @@ const messages = {
517
551
  "group.draft": "草稿",
518
552
  "group.finished": "已完成",
519
553
  "group.retired": "已退役",
554
+ "group.cancelled": "已取消",
520
555
  "input.answered": "输入已回答。",
521
556
  "input.blocking": "阻塞",
522
557
  "input.freeText": "输入回答",
@@ -529,6 +564,10 @@ const messages = {
529
564
  "loading.dashboard": "正在读取本地状态…",
530
565
  "loading.detail": "正在读取任务详情…",
531
566
  "messageKind.operator": "Operator",
567
+ "messageDelivery.run": "执行记录(非落实确认):",
568
+ "messageDelivery.blocked": "尚未投递:",
569
+ "messageDelivery.pending": "已保存,等待执行准入",
570
+ "messageDelivery.notification": "Leader 通知,不单独派发执行",
532
571
  "messageKind.role-result": "角色结果",
533
572
  "messageKind.system": "系统",
534
573
  "messageKind.user": "用户",
@@ -575,9 +614,10 @@ const messages = {
575
614
  "role.exited": "已退出",
576
615
  "role.failed": "失败",
577
616
  "role.idle": "空闲",
617
+ "role.unknown": "未知/未观察",
578
618
  "role.running": "运行中",
579
- "turn.active": "执行中",
580
- "turn.failed": "失败",
619
+ "run.active": "执行中",
620
+ "run.failed": "失败",
581
621
  "search.label": "搜索任务",
582
622
  "search.placeholder": "按标题、ID、标签或项目筛选…",
583
623
  "stats.inputs": "项输入",
@@ -588,8 +628,9 @@ const messages = {
588
628
  "status.completed": "已完成",
589
629
  "status.draft": "草稿",
590
630
  "status.retired": "已退役",
631
+ "status.cancelled": "已取消",
591
632
  "sync.label": "最近同步",
592
- "tabs.exec": "运行",
633
+ "tabs.exec": "执行记录",
593
634
  "tabs.focus": "焦点",
594
635
  "tabs.history": "历史",
595
636
  "tabs.label": "任务分区",
@@ -613,6 +654,8 @@ const messages = {
613
654
  "time.justNow": "刚刚",
614
655
  "work.awaiting_acceptance": "待验收",
615
656
  "work.cancelled": "已取消",
657
+ "work.open": "未验收",
658
+ "work.accepted": "已验收",
616
659
  "work.completed": "已完成",
617
660
  "work.failed": "失败",
618
661
  "work.pending": "待处理",
@@ -622,28 +665,26 @@ const messages = {
622
665
  "workExec.title": "执行与恢复",
623
666
  "workExec.shape.direct": "直接执行",
624
667
  "workExec.shape.replicated": "复制执行",
625
- "workExec.lane.running": "运行中",
668
+ "workExec.lane.running": "执行记录未结清",
626
669
  "workExec.lane.succeeded": "已成功",
627
670
  "workExec.lane.needs-attention": "需要处理",
628
671
  "workExec.lane.failed": "已结算失败",
629
672
  "workExec.lane.unknown": "未知",
630
673
  "workExec.retry": "重试",
631
674
  "workExec.settle": "结算",
632
- "workExec.main": "主 Turn",
675
+ "workExec.main": "主执行记录",
633
676
  "workExec.candidate": "Candidate 来源",
634
677
  "workExec.next": "下一步",
635
678
  "workExec.owner": "责任人",
636
679
  "workExec.none": "无",
637
680
  "workExec.synthesis.not-applicable": "无需综合",
638
- "workExec.synthesis.blocked-by-open-lanes": "等待全部 Lane 结算",
639
- "workExec.synthesis.eligible": "可综合",
640
- "workExec.synthesis.insufficient-results": "成功结果不足",
641
- "workExec.synthesis.main-running": "主 Turn 运行中",
642
- "workExec.synthesis.main-needs-attention": "主 Turn 需要处理",
681
+ "workExec.synthesis.awaiting-selection": "等待 Leader 选择综合来源",
682
+ "workExec.synthesis.main-running": "主执行记录未结清",
683
+ "workExec.synthesis.main-needs-attention": "主执行记录需要处理",
643
684
  "workExec.synthesis.complete": "综合已完成",
644
685
  "workExec.synthesis.unknown": "综合状态未知",
645
686
  "workExec.mainStatus.not-started": "未启动",
646
- "workExec.mainStatus.running": "运行中",
687
+ "workExec.mainStatus.running": "执行记录未结清",
647
688
  "workExec.mainStatus.succeeded": "已成功",
648
689
  "workExec.mainStatus.needs-attention": "需要处理",
649
690
  "workExec.mainStatus.unknown": "未知",
@@ -654,9 +695,9 @@ const messages = {
654
695
  "workExec.action.wait-for-lanes": "等待 Lane",
655
696
  "workExec.action.retry-or-settle-lanes": "重试或结算指定 Lane",
656
697
  "workExec.action.inspect-unknown": "检查缺失事实",
657
- "workExec.action.await-main-dispatch": "等待主 Turn 派发",
658
- "workExec.action.wait-for-main": "等待主 Turn",
659
- "workExec.action.retry-main": "重试主 Turn",
698
+ "workExec.action.select-synthesis-sources": "选择综合来源执行记录",
699
+ "workExec.action.wait-for-main": "等待主执行记录",
700
+ "workExec.action.retry-main": "重试主执行记录",
660
701
  "workExec.action.redispatch-work": "重新派发 WorkItem",
661
702
  "workExec.action.submit-candidate": "提交 Candidate",
662
703
  "workExec.action.decide-candidate": "评审或接纳 Candidate",
@@ -673,6 +714,7 @@ const messages = {
673
714
  "exec.status.working": "执行中",
674
715
  "exec.status.completed": "已完成",
675
716
  "exec.status.retired": "已退役",
717
+ "exec.status.cancelled": "已取消",
676
718
  "exec.status.archived": "已归档",
677
719
  "exec.owner.leader": "负责人",
678
720
  "exec.owner.worker": "执行者",
@@ -724,9 +766,9 @@ const messages = {
724
766
  "detail.lineage": "执行谱系",
725
767
  "detail.requester": "请求方",
726
768
  "candidate.source.direct": "直接",
727
- "candidate.source.turn": "Turn",
728
- "turn.purpose.execution": "执行",
729
- "turn.purpose.review": "评审",
769
+ "candidate.source.run": "执行记录",
770
+ "run.purpose.execution": "执行",
771
+ "run.purpose.review": "评审",
730
772
  "review.scope.work-item": "工作项",
731
773
  "review.scope.task": "任务"
732
774
  }
@@ -3,7 +3,7 @@ export const MARKDOWN_SCRIPT = `
3
3
  //
4
4
  // Agent-authored prose (focus, outcomes, reviews, messages) arrives as plain
5
5
  // text with informal Markdown. Rendering structure (headings, lists, code)
6
- // turns walls of text into scannable blocks.
6
+ // runs walls of text into scannable blocks.
7
7
  //
8
8
  // Safety rule: every byte of user text is HTML-escaped BEFORE any tag is
9
9
  // introduced; the transforms below only ever add our own elements. Links are