@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.
- package/ARCHITECTURE.md +603 -133
- package/README.md +806 -31
- package/dist/agent/agent.js +2 -1
- package/dist/agent/argumentPolicy.js +3 -1
- package/dist/agent/launchEnvironment.js +106 -0
- package/dist/agent/managedRuntimeEnvironment.js +34 -0
- package/dist/brief/taskBrief.js +11 -1
- package/dist/cli/agentConfigurationPicker.js +287 -0
- package/dist/cli/commandCatalog.js +488 -60
- package/dist/cli/completion.js +146 -22
- package/dist/cli/helpRenderer.js +3 -1
- package/dist/cli/interactionCandidates.js +53 -15
- package/dist/cli/interactionPolicy.js +267 -30
- package/dist/cli/interactiveSelection.js +6 -2
- package/dist/cli/invocationRouter.js +5 -1
- package/dist/cli/operatorWizard.js +87 -0
- package/dist/cli/roleOptionCatalog.js +1 -0
- package/dist/cli/roleWizard.js +185 -21
- package/dist/cli/updateCommand.js +62 -19
- package/dist/cli/updateOrchestrator.js +539 -0
- package/dist/cli/updatePorts.js +1119 -0
- package/dist/cli/upgradeCommand.js +112 -0
- package/dist/cli.js +1420 -86
- package/dist/commands/agentCommands.js +146 -3
- package/dist/commands/configCommands.js +126 -0
- package/dist/commands/controllerCommands.js +365 -0
- package/dist/commands/globalRoleCommands.js +168 -126
- package/dist/commands/jobCommands.js +18 -8
- package/dist/commands/operatorCommands.js +159 -9
- package/dist/commands/profileCommands.js +203 -0
- package/dist/commands/projectCommands.js +650 -0
- package/dist/commands/roleConfiguration.js +85 -24
- package/dist/commands/roleRuntimeGuard.js +12 -0
- package/dist/commands/roleSkillValidation.js +47 -0
- package/dist/commands/taskActor.js +127 -0
- package/dist/commands/taskCommands.js +4201 -313
- package/dist/commands/taskCompletionGate.js +131 -0
- package/dist/commands/taskContextCommand.js +244 -30
- package/dist/commands/taskInputCommands.js +177 -59
- package/dist/commands/taskIntegrationCommands.js +303 -0
- package/dist/commands/taskOverviewCommand.js +363 -0
- package/dist/commands/taskRoleRuntimeStatus.js +125 -19
- package/dist/commands/textInput.js +15 -0
- package/dist/completion/completionInstaller.js +26 -22
- package/dist/config/yuiConfig.js +4 -3
- package/dist/context/dispatchContext.js +90 -38
- package/dist/context/roleSessionContext.js +119 -0
- package/dist/controller/claudeLifecycleHook.js +203 -0
- package/dist/controller/clientRuntime.js +408 -56
- package/dist/controller/codexLifecycleHook.js +108 -0
- package/dist/controller/controller.js +1089 -32
- package/dist/controller/domainIdentity.js +505 -0
- package/dist/controller/ephemeralResourceReaper.js +131 -0
- package/dist/controller/fileSchedulerStoreAdapter.js +2153 -103
- package/dist/controller/providerHookRunFence.js +127 -0
- package/dist/controller/resourceCleanupLinux.js +286 -0
- package/dist/controller/resourceInventory.js +531 -0
- package/dist/controller/resourceInventoryLinux.js +610 -0
- package/dist/controller/runtime.js +629 -10
- package/dist/controller/runtimeEventInbox.js +564 -0
- package/dist/controller/runtimeEventProcessor.js +248 -0
- package/dist/controller/runtimeLaunchCoordinator.js +477 -0
- package/dist/controller/sessionNotify.js +121 -78
- package/dist/coordination/deadlineScheduler.js +15 -0
- package/dist/coordination/mailboxScheduler.js +108 -0
- package/dist/coordination/workMailbox.js +329 -0
- package/dist/coordination/workMailboxQueue.js +86 -0
- package/dist/core/controllerClient.js +19 -5
- package/dist/core/controllerEndpoint.js +37 -0
- package/dist/core/controllerServer.js +218 -10
- package/dist/core/protocol.js +6 -2
- package/dist/decision/decision.js +2 -1
- package/dist/doctor/doctor.js +681 -32
- package/dist/domain/validation.js +53 -0
- package/dist/errors/cliError.js +5 -3
- package/dist/event/taskEvent.js +7 -3
- package/dist/execution/codexThreadNaming.js +160 -0
- package/dist/execution/executionGroup.js +579 -0
- package/dist/executor/agentAdapter.js +255 -40
- package/dist/executor/agentConfigurationCatalog.js +326 -0
- package/dist/executor/agentConfigurationProbe.js +506 -0
- package/dist/executor/agentExecutor.js +625 -10
- package/dist/executor/codexConfigConflict.js +290 -0
- package/dist/executor/effectiveLaunch.js +340 -0
- package/dist/executor/executorRegistry.js +238 -36
- package/dist/executor/fileRoleLaunchPlanner.js +550 -40
- package/dist/executor/turnCompletion.js +126 -0
- package/dist/input/inputRequest.js +30 -9
- package/dist/integration/changeSet.js +36 -0
- package/dist/integration/checkResult.js +24 -0
- package/dist/integration/gitIntegrationService.js +695 -0
- package/dist/integration/integrationAttempt.js +142 -0
- package/dist/interaction/operatorPresentation.js +96 -0
- package/dist/lifecycle/canonicalLifecycleEvent.js +342 -0
- package/dist/lifecycle/exactRunTerminalization.js +572 -0
- package/dist/lifecycle/providerLifecycleMapping.js +190 -0
- package/dist/lifecycle/taskRoleSessionReset.js +124 -0
- package/dist/message/message.js +23 -7
- package/dist/milestone/milestone.js +2 -1
- package/dist/operator/operatorSessionHistory.js +124 -0
- package/dist/output/agentConfigurationPresentation.js +43 -0
- package/dist/output/rolePresentation.js +34 -10
- package/dist/output/terminal.js +8 -0
- package/dist/output/timePresentation.js +55 -0
- package/dist/profile/agentProfile.js +128 -0
- package/dist/repository/gitWorkspace.js +578 -24
- package/dist/repository/project.js +213 -0
- package/dist/repository/taskWorkspaceCoordinator.js +392 -0
- package/dist/repository/taskWorkspacePreparer.js +1688 -191
- package/dist/review/reviewConfig.js +11 -0
- package/dist/review/reviewRound.js +399 -0
- package/dist/review/taskFinalReviewContract.js +90 -0
- package/dist/role/role.js +124 -23
- package/dist/run/agentRun.js +155 -12
- package/dist/run/runIdentity.js +82 -0
- package/dist/runtime/exactControlPlane.js +472 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/lifecycleReservation.js +38 -0
- package/dist/runtime/ports.js +11 -0
- package/dist/runtime/preallocatedNativeSession.js +13 -0
- package/dist/runtime/promptEnvelope.js +30 -0
- package/dist/runtime/runtimeBinding.js +31 -0
- package/dist/runtime/runtimeOwner.js +14 -0
- package/dist/runtime/sessionLaunchRequest.js +62 -0
- package/dist/runtime/sessionTitle.js +54 -0
- package/dist/runtime/taskRuntimeIsolation.js +643 -0
- package/dist/runtime/tmuxAdapters.js +315 -0
- package/dist/runtime/turnCompletion.js +3 -0
- package/dist/runtime/validation.js +23 -0
- package/dist/scheduler/activeRoleRunDelivery.js +342 -32
- package/dist/scheduler/activeTaskProgress.js +63 -0
- package/dist/scheduler/leaderFailure.js +2 -1
- package/dist/scheduler/leaderWakeupProcessor.js +307 -66
- package/dist/scheduler/operatorInputNotificationProcessor.js +109 -46
- package/dist/scheduler/operatorNotification.js +44 -2
- package/dist/scheduler/ports.js +28 -1
- package/dist/scheduler/roleRunLiveness.js +131 -25
- package/dist/scheduler/roleRunStall.js +951 -0
- package/dist/scheduler/taskExecutionProjection.js +544 -0
- package/dist/scheduler/wakeupQueue.js +3 -0
- package/dist/setup/setupCommand.js +302 -52
- package/dist/storage/compatibleTaskStore.js +102 -0
- package/dist/storage/migration/baseline.js +78 -0
- package/dist/storage/migration/classifier.js +51 -0
- package/dist/storage/migration/compatibleCodec.js +53 -0
- package/dist/storage/migration/engine.js +147 -0
- package/dist/storage/migration/index.js +33 -0
- package/dist/storage/migration/planner.js +154 -0
- package/dist/storage/migration/productionRegistry.js +486 -0
- package/dist/storage/migration/registry.js +169 -0
- package/dist/storage/migration/report.js +54 -0
- package/dist/storage/migration/types.js +31 -0
- package/dist/storage/storageSchema.js +147 -123
- package/dist/storage/storageVersions.js +11 -0
- package/dist/storage/taskStore.js +1793 -197
- package/dist/storage/upgrade/homeClassification.js +156 -0
- package/dist/storage/upgrade/homeMigrationTarget.js +595 -0
- package/dist/storage/upgrade/offlineUpgradeInventory.js +315 -0
- package/dist/storage/upgrade/productionMigrationRegistry.js +6 -0
- package/dist/storage/upgrade/recordVersionScan.js +176 -0
- package/dist/storage/upgrade/recordVersions.js +159 -0
- package/dist/storage/upgrade/switchProgress.js +80 -0
- package/dist/storage/upgrade/upgradeOrchestrator.js +948 -0
- package/dist/storage/upgrade/upgradeReceipt.js +161 -0
- package/dist/storage/upgradeCoordination.js +186 -0
- package/dist/storage/upgradeFence.js +366 -0
- package/dist/task/task.js +132 -26
- package/dist/task/taskRecordReference.js +66 -0
- package/dist/tmux/commandExecutor.js +75 -2
- package/dist/tmux/tmuxManager.js +747 -49
- package/dist/version.js +23 -0
- package/dist/web/assets/assetManifest.js +62 -0
- package/dist/web/assets/client/app.js +631 -0
- package/dist/web/assets/client/components.js +605 -0
- package/dist/web/assets/client/dom.js +14 -0
- package/dist/web/assets/client/format.js +28 -0
- package/dist/web/assets/client/i18n.js +494 -0
- package/dist/web/assets/client/markdown.js +114 -0
- package/dist/web/assets/client/theme.js +32 -0
- package/dist/web/assets/client/view.js +458 -0
- package/dist/web/assets/fontData.js +12 -0
- package/dist/web/assets/fonts.js +12 -0
- package/dist/web/assets/shell.js +114 -0
- package/dist/web/assets/styles/cards.js +135 -0
- package/dist/web/assets/styles/layout.js +47 -0
- package/dist/web/assets/styles/markdown.js +29 -0
- package/dist/web/assets/styles/responsive.js +39 -0
- package/dist/web/assets/styles/tokens.js +101 -0
- package/dist/web/assets/styles/widgets.js +147 -0
- package/dist/web/tmuxWebTerminal.js +158 -0
- package/dist/web/webServer.js +463 -0
- package/dist/web/webSnapshot.js +148 -0
- package/dist/workItem/workItem.js +642 -23
- package/dist/workspace/gitChangeSetCapture.js +86 -0
- package/dist/workspace/workItemChangeSetManager.js +445 -0
- package/dist/worktree/managedWorkspace.js +202 -0
- package/docs/task-local-identity.md +62 -0
- package/i18n/README.zh-CN.md +406 -31
- package/package.json +10 -2
- package/skills/yui-leader/SKILL.md +601 -39
- package/skills/yui-operator/SKILL.md +255 -34
- package/skills/yui-reviewer/SKILL.md +57 -0
- package/skills/yui-worker/SKILL.md +214 -17
- package/dist/commands/repositoryCommands.js +0 -86
- package/dist/operator/operatorContext.js +0 -66
- package/dist/repository/repository.js +0 -55
- package/dist/scheduler/archivedTaskRuntime.js +0 -12
- 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
|
+
}
|