@zq-silk/yui 0.2.0 → 0.4.2

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 (208) hide show
  1. package/ARCHITECTURE.md +603 -133
  2. package/README.md +806 -31
  3. package/dist/agent/agent.js +2 -1
  4. package/dist/agent/argumentPolicy.js +3 -1
  5. package/dist/agent/launchEnvironment.js +106 -0
  6. package/dist/agent/managedRuntimeEnvironment.js +34 -0
  7. package/dist/brief/taskBrief.js +11 -1
  8. package/dist/cli/agentConfigurationPicker.js +287 -0
  9. package/dist/cli/commandCatalog.js +488 -60
  10. package/dist/cli/completion.js +146 -22
  11. package/dist/cli/helpRenderer.js +3 -1
  12. package/dist/cli/interactionCandidates.js +53 -15
  13. package/dist/cli/interactionPolicy.js +267 -30
  14. package/dist/cli/interactiveSelection.js +6 -2
  15. package/dist/cli/invocationRouter.js +5 -1
  16. package/dist/cli/operatorWizard.js +87 -0
  17. package/dist/cli/roleOptionCatalog.js +1 -0
  18. package/dist/cli/roleWizard.js +185 -21
  19. package/dist/cli/updateCommand.js +62 -19
  20. package/dist/cli/updateOrchestrator.js +539 -0
  21. package/dist/cli/updatePorts.js +1119 -0
  22. package/dist/cli/upgradeCommand.js +112 -0
  23. package/dist/cli.js +1420 -86
  24. package/dist/commands/agentCommands.js +146 -3
  25. package/dist/commands/configCommands.js +126 -0
  26. package/dist/commands/controllerCommands.js +365 -0
  27. package/dist/commands/globalRoleCommands.js +168 -126
  28. package/dist/commands/jobCommands.js +18 -8
  29. package/dist/commands/operatorCommands.js +159 -9
  30. package/dist/commands/profileCommands.js +203 -0
  31. package/dist/commands/projectCommands.js +650 -0
  32. package/dist/commands/roleConfiguration.js +85 -24
  33. package/dist/commands/roleRuntimeGuard.js +12 -0
  34. package/dist/commands/roleSkillValidation.js +47 -0
  35. package/dist/commands/taskActor.js +127 -0
  36. package/dist/commands/taskCommands.js +4201 -313
  37. package/dist/commands/taskCompletionGate.js +131 -0
  38. package/dist/commands/taskContextCommand.js +244 -30
  39. package/dist/commands/taskInputCommands.js +177 -59
  40. package/dist/commands/taskIntegrationCommands.js +303 -0
  41. package/dist/commands/taskOverviewCommand.js +363 -0
  42. package/dist/commands/taskRoleRuntimeStatus.js +125 -19
  43. package/dist/commands/textInput.js +15 -0
  44. package/dist/completion/completionInstaller.js +26 -22
  45. package/dist/config/yuiConfig.js +4 -3
  46. package/dist/context/dispatchContext.js +90 -38
  47. package/dist/context/roleSessionContext.js +119 -0
  48. package/dist/controller/claudeLifecycleHook.js +203 -0
  49. package/dist/controller/clientRuntime.js +408 -56
  50. package/dist/controller/codexLifecycleHook.js +108 -0
  51. package/dist/controller/controller.js +1089 -32
  52. package/dist/controller/domainIdentity.js +505 -0
  53. package/dist/controller/ephemeralResourceReaper.js +131 -0
  54. package/dist/controller/fileSchedulerStoreAdapter.js +2153 -103
  55. package/dist/controller/providerHookRunFence.js +127 -0
  56. package/dist/controller/resourceCleanupLinux.js +286 -0
  57. package/dist/controller/resourceInventory.js +531 -0
  58. package/dist/controller/resourceInventoryLinux.js +610 -0
  59. package/dist/controller/runtime.js +629 -10
  60. package/dist/controller/runtimeEventInbox.js +564 -0
  61. package/dist/controller/runtimeEventProcessor.js +248 -0
  62. package/dist/controller/runtimeLaunchCoordinator.js +477 -0
  63. package/dist/controller/sessionNotify.js +121 -78
  64. package/dist/coordination/deadlineScheduler.js +15 -0
  65. package/dist/coordination/mailboxScheduler.js +108 -0
  66. package/dist/coordination/workMailbox.js +329 -0
  67. package/dist/coordination/workMailboxQueue.js +86 -0
  68. package/dist/core/controllerClient.js +19 -5
  69. package/dist/core/controllerEndpoint.js +37 -0
  70. package/dist/core/controllerServer.js +218 -10
  71. package/dist/core/protocol.js +6 -2
  72. package/dist/decision/decision.js +2 -1
  73. package/dist/doctor/doctor.js +681 -32
  74. package/dist/domain/validation.js +53 -0
  75. package/dist/errors/cliError.js +5 -3
  76. package/dist/event/taskEvent.js +7 -3
  77. package/dist/execution/codexThreadNaming.js +160 -0
  78. package/dist/execution/executionGroup.js +579 -0
  79. package/dist/executor/agentAdapter.js +255 -40
  80. package/dist/executor/agentConfigurationCatalog.js +326 -0
  81. package/dist/executor/agentConfigurationProbe.js +506 -0
  82. package/dist/executor/agentExecutor.js +625 -10
  83. package/dist/executor/codexConfigConflict.js +290 -0
  84. package/dist/executor/effectiveLaunch.js +340 -0
  85. package/dist/executor/executorRegistry.js +238 -36
  86. package/dist/executor/fileRoleLaunchPlanner.js +550 -40
  87. package/dist/executor/turnCompletion.js +126 -0
  88. package/dist/input/inputRequest.js +30 -9
  89. package/dist/integration/changeSet.js +36 -0
  90. package/dist/integration/checkResult.js +24 -0
  91. package/dist/integration/gitIntegrationService.js +695 -0
  92. package/dist/integration/integrationAttempt.js +142 -0
  93. package/dist/interaction/operatorPresentation.js +96 -0
  94. package/dist/lifecycle/canonicalLifecycleEvent.js +342 -0
  95. package/dist/lifecycle/exactRunTerminalization.js +572 -0
  96. package/dist/lifecycle/providerLifecycleMapping.js +190 -0
  97. package/dist/lifecycle/taskRoleSessionReset.js +124 -0
  98. package/dist/message/message.js +23 -7
  99. package/dist/milestone/milestone.js +2 -1
  100. package/dist/operator/operatorSessionHistory.js +124 -0
  101. package/dist/output/agentConfigurationPresentation.js +43 -0
  102. package/dist/output/rolePresentation.js +34 -10
  103. package/dist/output/terminal.js +8 -0
  104. package/dist/output/timePresentation.js +55 -0
  105. package/dist/profile/agentProfile.js +128 -0
  106. package/dist/repository/gitWorkspace.js +578 -24
  107. package/dist/repository/project.js +213 -0
  108. package/dist/repository/taskWorkspaceCoordinator.js +392 -0
  109. package/dist/repository/taskWorkspacePreparer.js +1688 -191
  110. package/dist/review/reviewConfig.js +11 -0
  111. package/dist/review/reviewRound.js +399 -0
  112. package/dist/review/taskFinalReviewContract.js +90 -0
  113. package/dist/role/role.js +124 -23
  114. package/dist/run/agentRun.js +155 -12
  115. package/dist/run/runIdentity.js +82 -0
  116. package/dist/runtime/exactControlPlane.js +472 -0
  117. package/dist/runtime/index.js +8 -0
  118. package/dist/runtime/lifecycleReservation.js +38 -0
  119. package/dist/runtime/ports.js +11 -0
  120. package/dist/runtime/preallocatedNativeSession.js +13 -0
  121. package/dist/runtime/promptEnvelope.js +30 -0
  122. package/dist/runtime/runtimeBinding.js +31 -0
  123. package/dist/runtime/runtimeOwner.js +14 -0
  124. package/dist/runtime/sessionLaunchRequest.js +62 -0
  125. package/dist/runtime/sessionTitle.js +54 -0
  126. package/dist/runtime/taskRuntimeIsolation.js +643 -0
  127. package/dist/runtime/tmuxAdapters.js +315 -0
  128. package/dist/runtime/turnCompletion.js +3 -0
  129. package/dist/runtime/validation.js +23 -0
  130. package/dist/scheduler/activeRoleRunDelivery.js +342 -32
  131. package/dist/scheduler/activeTaskProgress.js +63 -0
  132. package/dist/scheduler/leaderFailure.js +2 -1
  133. package/dist/scheduler/leaderWakeupProcessor.js +307 -66
  134. package/dist/scheduler/operatorInputNotificationProcessor.js +109 -46
  135. package/dist/scheduler/operatorNotification.js +44 -2
  136. package/dist/scheduler/ports.js +28 -1
  137. package/dist/scheduler/roleRunLiveness.js +131 -25
  138. package/dist/scheduler/roleRunStall.js +951 -0
  139. package/dist/scheduler/taskExecutionProjection.js +544 -0
  140. package/dist/scheduler/wakeupQueue.js +3 -0
  141. package/dist/setup/setupCommand.js +302 -52
  142. package/dist/storage/compatibleTaskStore.js +102 -0
  143. package/dist/storage/migration/baseline.js +78 -0
  144. package/dist/storage/migration/classifier.js +51 -0
  145. package/dist/storage/migration/compatibleCodec.js +53 -0
  146. package/dist/storage/migration/engine.js +147 -0
  147. package/dist/storage/migration/index.js +33 -0
  148. package/dist/storage/migration/planner.js +154 -0
  149. package/dist/storage/migration/productionRegistry.js +486 -0
  150. package/dist/storage/migration/registry.js +169 -0
  151. package/dist/storage/migration/report.js +54 -0
  152. package/dist/storage/migration/types.js +31 -0
  153. package/dist/storage/storageSchema.js +147 -123
  154. package/dist/storage/storageVersions.js +11 -0
  155. package/dist/storage/taskStore.js +1793 -197
  156. package/dist/storage/upgrade/homeClassification.js +156 -0
  157. package/dist/storage/upgrade/homeMigrationTarget.js +595 -0
  158. package/dist/storage/upgrade/offlineUpgradeInventory.js +315 -0
  159. package/dist/storage/upgrade/productionMigrationRegistry.js +6 -0
  160. package/dist/storage/upgrade/recordVersionScan.js +176 -0
  161. package/dist/storage/upgrade/recordVersions.js +159 -0
  162. package/dist/storage/upgrade/switchProgress.js +80 -0
  163. package/dist/storage/upgrade/upgradeOrchestrator.js +948 -0
  164. package/dist/storage/upgrade/upgradeReceipt.js +161 -0
  165. package/dist/storage/upgradeCoordination.js +186 -0
  166. package/dist/storage/upgradeFence.js +366 -0
  167. package/dist/task/task.js +132 -26
  168. package/dist/task/taskRecordReference.js +66 -0
  169. package/dist/tmux/commandExecutor.js +75 -2
  170. package/dist/tmux/tmuxManager.js +747 -49
  171. package/dist/version.js +23 -0
  172. package/dist/web/assets/assetManifest.js +62 -0
  173. package/dist/web/assets/client/app.js +631 -0
  174. package/dist/web/assets/client/components.js +605 -0
  175. package/dist/web/assets/client/dom.js +14 -0
  176. package/dist/web/assets/client/format.js +28 -0
  177. package/dist/web/assets/client/i18n.js +494 -0
  178. package/dist/web/assets/client/markdown.js +114 -0
  179. package/dist/web/assets/client/theme.js +32 -0
  180. package/dist/web/assets/client/view.js +458 -0
  181. package/dist/web/assets/fontData.js +12 -0
  182. package/dist/web/assets/fonts.js +12 -0
  183. package/dist/web/assets/shell.js +114 -0
  184. package/dist/web/assets/styles/cards.js +135 -0
  185. package/dist/web/assets/styles/layout.js +47 -0
  186. package/dist/web/assets/styles/markdown.js +29 -0
  187. package/dist/web/assets/styles/responsive.js +39 -0
  188. package/dist/web/assets/styles/tokens.js +101 -0
  189. package/dist/web/assets/styles/widgets.js +147 -0
  190. package/dist/web/tmuxWebTerminal.js +158 -0
  191. package/dist/web/webServer.js +463 -0
  192. package/dist/web/webSnapshot.js +148 -0
  193. package/dist/workItem/workItem.js +642 -23
  194. package/dist/workspace/gitChangeSetCapture.js +86 -0
  195. package/dist/workspace/workItemChangeSetManager.js +445 -0
  196. package/dist/worktree/managedWorkspace.js +202 -0
  197. package/docs/task-local-identity.md +62 -0
  198. package/i18n/README.zh-CN.md +406 -31
  199. package/package.json +10 -2
  200. package/skills/yui-leader/SKILL.md +601 -39
  201. package/skills/yui-operator/SKILL.md +255 -34
  202. package/skills/yui-reviewer/SKILL.md +57 -0
  203. package/skills/yui-worker/SKILL.md +214 -17
  204. package/dist/commands/repositoryCommands.js +0 -86
  205. package/dist/operator/operatorContext.js +0 -66
  206. package/dist/repository/repository.js +0 -55
  207. package/dist/scheduler/archivedTaskRuntime.js +0 -12
  208. package/dist/worktree/roleWorkspace.js +0 -62
@@ -0,0 +1,203 @@
1
+ import { callController } from "../core/controllerClient.js";
2
+ import { runtimeLifecycleSignalKey } from "../runtime/lifecycleReservation.js";
3
+ import { FileRuntimeEventInbox, MAX_RUNTIME_EVENT_FILE_BYTES } from "./runtimeEventInbox.js";
4
+ import { resolveProviderHookRunFence } from "./providerHookRunFence.js";
5
+ /**
6
+ * Hidden CLI entrypoint used by the managed Claude lifecycle plugin. It parses
7
+ * by hook_event_name and writes one immutable runtime-inbox event per fact:
8
+ * SessionStart → native-session-lifecycle (carrying the source variant),
9
+ * UserPromptSubmit → native-prompt-accepted (the exact provider-accepted fence),
10
+ * PostToolUse → native-turn-progress (the exact provider/tool progress fence),
11
+ * StopFailure → claude-stop-failure. The durable write is authoritative; the
12
+ * socket call is only a wake-up hint.
13
+ */
14
+ export async function runClaudeLifecycleHookCommand(stdinJson, environment = process.env, call = callController) {
15
+ const home = requireIdentity(environment.YUI_HOME, "YUI_HOME");
16
+ const inbox = new FileRuntimeEventInbox(home);
17
+ const envelope = parseClaudeHookEnvelope(stdinJson, environment);
18
+ if (envelope.kind === "session-start") {
19
+ inbox.enqueueSessionLifecycle({
20
+ scope: "task",
21
+ taskId: envelope.taskId,
22
+ roleName: envelope.roleName,
23
+ agentId: envelope.agentId,
24
+ adapterId: "claude",
25
+ launchId: envelope.launchId,
26
+ nativeSessionId: envelope.nativeSessionId,
27
+ runId: envelope.runId,
28
+ sessionSource: envelope.sessionSource
29
+ });
30
+ }
31
+ else if (envelope.kind === "prompt-submit") {
32
+ inbox.enqueuePromptAccepted({
33
+ scope: "task",
34
+ taskId: envelope.taskId,
35
+ roleName: envelope.roleName,
36
+ agentId: envelope.agentId,
37
+ adapterId: "claude",
38
+ launchId: envelope.launchId,
39
+ nativeSessionId: envelope.nativeSessionId,
40
+ runId: envelope.runId,
41
+ receiptId: envelope.receiptId
42
+ });
43
+ }
44
+ else if (envelope.kind === "turn-progress") {
45
+ inbox.enqueueProviderProgress({
46
+ scope: "task",
47
+ taskId: envelope.taskId,
48
+ roleName: envelope.roleName,
49
+ agentId: envelope.agentId,
50
+ adapterId: "claude",
51
+ launchId: envelope.launchId,
52
+ nativeSessionId: envelope.nativeSessionId,
53
+ runId: envelope.runId,
54
+ progressId: envelope.progressId
55
+ });
56
+ }
57
+ else {
58
+ inbox.enqueueClaudeStopFailure({
59
+ scope: "task",
60
+ taskId: envelope.taskId,
61
+ roleName: envelope.roleName,
62
+ agentId: envelope.agentId,
63
+ adapterId: "claude",
64
+ launchId: envelope.launchId,
65
+ nativeSessionId: envelope.nativeSessionId,
66
+ runId: envelope.runId,
67
+ error: envelope.error,
68
+ ...(envelope.errorDetails === undefined
69
+ ? {}
70
+ : { errorDetails: envelope.errorDetails }),
71
+ ...(envelope.lastAssistantMessage === undefined
72
+ ? {}
73
+ : { lastAssistantMessage: envelope.lastAssistantMessage })
74
+ });
75
+ }
76
+ // The immutable event is authoritative; the socket call is only a hint.
77
+ await call(home, "scheduler.signal", {
78
+ key: runtimeLifecycleSignalKey({
79
+ scope: "task",
80
+ taskId: envelope.taskId,
81
+ roleName: envelope.roleName
82
+ })
83
+ }, { timeoutMs: 100 }).catch(() => { });
84
+ }
85
+ /**
86
+ * Parses a Claude hook payload by hook_event_name into the exact fenced
87
+ * envelope. Every event requires the managed launch envelope (task/role/agent/
88
+ * launch/run) and the payload session id must match YUI_NATIVE_SESSION_ID, so a
89
+ * mismatched generation fails closed before any inbox write.
90
+ */
91
+ export function parseClaudeHookEnvelope(stdinJson, environment) {
92
+ const payload = parseObject(stdinJson);
93
+ if (payload.hook_event_name !== "SessionStart"
94
+ && payload.hook_event_name !== "UserPromptSubmit"
95
+ && payload.hook_event_name !== "PostToolUse"
96
+ && payload.hook_event_name !== "StopFailure") {
97
+ throw new Error("Managed Claude lifecycle ingestion received an unsupported hook event.");
98
+ }
99
+ const sessionSource = payload.hook_event_name === "SessionStart"
100
+ ? requireIdentity(payload.source, "Claude SessionStart source")
101
+ : undefined;
102
+ const base = parseClaudeEnvelope(payload, environment, {
103
+ allowPreallocatedClaudeStartup: sessionSource === "startup"
104
+ });
105
+ switch (payload.hook_event_name) {
106
+ case "SessionStart":
107
+ return {
108
+ ...base,
109
+ kind: "session-start",
110
+ sessionSource: sessionSource
111
+ };
112
+ case "UserPromptSubmit":
113
+ return {
114
+ ...base,
115
+ kind: "prompt-submit",
116
+ receiptId: requireIdentity(base.receiptId, "Claude transport receipt id")
117
+ };
118
+ case "PostToolUse":
119
+ return {
120
+ ...base,
121
+ kind: "turn-progress",
122
+ progressId: requireIdentity(payload.tool_use_id, "Claude PostToolUse id")
123
+ };
124
+ case "StopFailure":
125
+ return {
126
+ ...base,
127
+ kind: "stop-failure",
128
+ error: requireResult(payload.error, "Claude StopFailure error"),
129
+ ...(payload.error_details === undefined
130
+ ? {}
131
+ : { errorDetails: requireResult(payload.error_details, "Claude StopFailure error_details") }),
132
+ ...(payload.last_assistant_message === undefined
133
+ ? {}
134
+ : {
135
+ lastAssistantMessage: requireResult(payload.last_assistant_message, "Claude StopFailure last_assistant_message")
136
+ })
137
+ };
138
+ default:
139
+ throw new Error("Managed Claude lifecycle ingestion received an unsupported hook event.");
140
+ }
141
+ }
142
+ function parseClaudeEnvelope(payload, environment, options) {
143
+ const nativeSessionId = requireIdentity(payload.session_id, "Claude session id");
144
+ return {
145
+ ...resolveProviderHookRunFence(environment, "claude", nativeSessionId, options),
146
+ adapterId: "claude"
147
+ };
148
+ }
149
+ export function parseClaudeStopFailureHookNotification(stdinJson, environment) {
150
+ const envelope = parseClaudeHookEnvelope(stdinJson, environment);
151
+ if (envelope.kind !== "stop-failure") {
152
+ throw new Error("Managed Claude lifecycle ingestion accepts only StopFailure.");
153
+ }
154
+ return {
155
+ taskId: envelope.taskId,
156
+ roleName: envelope.roleName,
157
+ agentId: envelope.agentId,
158
+ adapterId: "claude",
159
+ launchId: envelope.launchId,
160
+ runId: envelope.runId,
161
+ nativeSessionId: envelope.nativeSessionId,
162
+ type: "StopFailure",
163
+ error: envelope.error,
164
+ ...(envelope.errorDetails === undefined ? {} : { errorDetails: envelope.errorDetails }),
165
+ ...(envelope.lastAssistantMessage === undefined
166
+ ? {}
167
+ : { lastAssistantMessage: envelope.lastAssistantMessage })
168
+ };
169
+ }
170
+ function parseObject(value) {
171
+ if (value === undefined
172
+ || Buffer.byteLength(value, "utf8") > MAX_RUNTIME_EVENT_FILE_BYTES) {
173
+ throw new Error("Claude lifecycle hook stdin JSON is invalid.");
174
+ }
175
+ try {
176
+ const parsed = JSON.parse(value);
177
+ if (!isObject(parsed))
178
+ throw new Error("shape");
179
+ return parsed;
180
+ }
181
+ catch {
182
+ throw new Error("Claude lifecycle hook stdin JSON is invalid.");
183
+ }
184
+ }
185
+ function requireIdentity(value, label) {
186
+ if (typeof value !== "string" || value.includes("\0")) {
187
+ throw new Error(`${label} is required.`);
188
+ }
189
+ const normalized = value.trim();
190
+ if (normalized.length === 0 || normalized.length > 1_024) {
191
+ throw new Error(`${label} is invalid.`);
192
+ }
193
+ return normalized;
194
+ }
195
+ function requireResult(value, label) {
196
+ if (typeof value !== "string" || value.includes("\0") || value.trim().length === 0) {
197
+ throw new Error(`${label} is required.`);
198
+ }
199
+ return value;
200
+ }
201
+ function isObject(value) {
202
+ return typeof value === "object" && value !== null && !Array.isArray(value);
203
+ }