@zq-silk/yui 2.5.0 → 2.7.1
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/README.md +23 -0
- package/dist/cli/commandCatalog.js +31 -4
- package/dist/commands/globalRoleCommands.js +22 -2
- package/dist/commands/inboxCommands.js +352 -0
- package/dist/commands/roleSkillValidation.js +2 -0
- package/dist/commands/taskCommands.js +40 -7
- package/dist/commands/taskContextCommand.js +3 -2
- package/dist/context/currentSkills.js +48 -0
- package/dist/context/roleSessionContext.js +13 -16
- package/dist/context/runContextPack.js +2 -0
- package/dist/context/runInputContract.js +1 -1
- package/dist/context/sessionBootstrapManifest.js +27 -4
- package/dist/context/skillCatalog.js +2 -3
- package/dist/context/taskContext.js +9 -4
- package/dist/controlPlaneCli.js +18 -1
- package/dist/controller/controller.js +3 -2
- package/dist/controller/fileSchedulerStoreAdapter.js +19 -4
- package/dist/controller/globalInputDelivery.js +73 -15
- package/dist/controller/globalRuntimeAttention.js +1 -1
- package/dist/controller/operatorNotification.js +6 -1
- package/dist/controller/providerRetryDelivery.js +3 -5
- package/dist/controller/runtime.js +2 -2
- package/dist/doctor/doctor.js +25 -2
- package/dist/executor/effectiveLaunch.js +2 -2
- package/dist/executor/fileRoleLaunchPlanner.js +4 -6
- package/dist/interaction/notificationPresentation.js +2 -2
- package/dist/interaction/operatorPresentation.js +1 -1
- package/dist/kernel/builtinCapabilities.js +2 -1
- package/dist/message/globalInputBacklog.js +69 -0
- package/dist/message/globalMessageQuery.js +1 -0
- package/dist/message/inboxReceipt.js +32 -0
- package/dist/message/message.js +6 -1
- package/dist/message/messageContinuation.js +34 -13
- package/dist/message/taskInboxOwnership.js +21 -0
- package/dist/nativeAgent/session/backends.js +1 -1
- package/dist/observability/runtimeIdentity.js +1 -1
- package/dist/resources/sqliteResourceRegistry.js +1 -1
- package/dist/runtime/agentHost.js +105 -16
- package/dist/runtime/builtinAgentErrorMappers.js +9 -5
- package/dist/runtime/providerRetry.js +38 -0
- package/dist/runtime/taskSessions.js +240 -0
- package/dist/scheduler/operatorEvent.js +49 -0
- package/dist/scheduler/operatorInputNotificationProcessor.js +5 -4
- package/dist/scheduler/taskExecutionProjection.js +78 -6
- package/dist/scheduler/taskWake.js +5 -0
- package/dist/sqlite/driver.js +108 -0
- package/dist/storage/sqliteSchema.js +11 -1
- package/dist/storage/sqliteStore.js +60 -1
- package/dist/storage/storageSchema.js +1 -1
- package/dist/storage/storageVersions.js +1 -1
- package/dist/storage/storeRpc.js +1 -0
- package/dist/storage/upgrade/upgradeOrchestrator.js +1 -1
- package/dist/task/completionReadiness.js +11 -4
- package/dist/telemetry/sqliteTelemetryStore.js +1 -1
- package/dist/web/assets/assetManifest.js +2 -0
- package/dist/web/assets/client/app/taskView.js +1 -0
- package/dist/web/assets/client/domain/records.js +70 -2
- package/dist/web/assets/client/domain/runs.js +3 -2
- package/dist/web/assets/client/domain/vocab.js +1 -1
- package/dist/web/assets/client/i18n/en.js +17 -1
- package/dist/web/assets/client/i18n/zh-CN.js +17 -1
- package/dist/web/assets/client/lib/api.js +4 -1
- package/dist/web/assets/client/lib/theme.js +31 -10
- package/dist/web/assets/client/views/task/actions.js +38 -21
- package/dist/web/assets/client/views/task/observation.js +12 -3
- package/dist/web/assets/client/views/task/overview.js +7 -40
- package/dist/web/assets/client/views/task/runtime.js +71 -34
- package/dist/web/assets/shared/icons.js +2 -0
- package/dist/web/assets/shell/index.js +1 -0
- package/dist/web/assets/shell/settings.js +1 -0
- package/dist/web/assets/styles/views/task.js +14 -0
- package/dist/web/webServer.js +12 -0
- package/dist/web/webSessions.js +2 -165
- package/dist/web/webSnapshot.js +9 -5
- package/dist/web/webTaskActivity.js +54 -0
- package/dist/web/webTaskSurface.js +1 -0
- package/docs/managed-turn-and-session-runtime.md +81 -5
- package/docs/managed-turn-and-session-runtime.zh-CN.md +51 -3
- package/docs/observability/README.md +25 -1
- package/docs/observability/README.zh-CN.md +18 -1
- package/docs/provider-retry.md +11 -0
- package/docs/release-workflow.md +74 -2
- package/docs/release-workflow.zh-CN.md +56 -1
- package/docs/storage-baseline.md +17 -7
- package/docs/storage-baseline.zh-CN.md +11 -5
- package/docs/task-delivery.md +17 -8
- package/docs/task-delivery.zh-CN.md +11 -5
- package/docs/testing/verification-levels.md +22 -4
- package/docs/testing/verification-levels.zh-CN.md +8 -1
- package/i18n/README.zh-CN.md +19 -0
- package/package.json +5 -2
- package/skills/yui-leader/SKILL.md +28 -11
- package/skills/yui-leader/VERSION +1 -0
- package/skills/yui-operator/SKILL.md +10 -2
- package/skills/yui-operator/VERSION +1 -0
- package/skills/yui-operator/references/task-delivery.md +2 -0
- package/skills/yui-reviewer/SKILL.md +8 -1
- package/skills/yui-reviewer/VERSION +1 -0
- package/skills/yui-runtime/SKILL.md +94 -11
- package/skills/yui-runtime/VERSION +1 -0
- package/skills/yui-runtime/references/publication.md +16 -5
- package/skills/yui-runtime/references/recovery.md +9 -0
- package/skills/yui-worker/SKILL.md +8 -1
- package/skills/yui-worker/VERSION +1 -0
package/dist/web/webSessions.js
CHANGED
|
@@ -1,165 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { projectRuntimeTaskEvents, classifyRuntimeHealth } from "../runtime/runtimeProjection.js";
|
|
4
|
-
import { DEFAULT_RUNTIME_HEALTH_POLICY } from "../runtime/runtimeHealthPolicy.js";
|
|
5
|
-
import { providerRetryProjection } from "../runtime/providerRetry.js";
|
|
6
|
-
/** Read-only presentation of the selected native connections, never an AgentRun
|
|
7
|
-
* count. Foreground facts are fenced to the exact input; retained continuations
|
|
8
|
-
* stay attached to their original input and are not counted as extra Sessions.
|
|
9
|
-
* No live probe, timers, persistence or recovery actions are introduced here. */
|
|
10
|
-
export function projectWebSessions(input) {
|
|
11
|
-
const policy = input.policy ?? DEFAULT_RUNTIME_HEALTH_POLICY;
|
|
12
|
-
const sessions = [];
|
|
13
|
-
const seen = new Map();
|
|
14
|
-
const observations = input.events.map(event => ({ event, observation: runtimeObservationFromTaskEvent(event) }))
|
|
15
|
-
.filter(entry => entry.observation !== null);
|
|
16
|
-
for (const set of input.sessionSets) {
|
|
17
|
-
const session = set.sessions[set.activeAgentId];
|
|
18
|
-
const binding = set.providerBinding;
|
|
19
|
-
const conversation = binding?.conversations.find(c => c.epoch === binding.currentConversationEpoch && c.status === "current");
|
|
20
|
-
const nativeSessionId = session?.nativeSessionId ?? conversation?.conversationId ?? null;
|
|
21
|
-
const identity = JSON.stringify([binding?.providerNamespace ?? session?.adapterId,
|
|
22
|
-
binding?.accountScope ?? set.activeAgentId, nativeSessionId ?? set.owner.roleName]);
|
|
23
|
-
const prior = seen.get(identity);
|
|
24
|
-
if (prior !== undefined) {
|
|
25
|
-
if (sessions[prior].roleName !== set.owner.roleName)
|
|
26
|
-
sessions[prior] = {
|
|
27
|
-
...sessions[prior], group: "unknown", reason: "Multiple Roles name this native Session; inspect ownership."
|
|
28
|
-
};
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
seen.set(identity, sessions.length);
|
|
32
|
-
const turn = binding?.run;
|
|
33
|
-
const row = {
|
|
34
|
-
taskId: input.taskId, roleName: set.owner.roleName, agentId: set.activeAgentId,
|
|
35
|
-
nativeSessionId, attemptId: turn?.attemptId ?? null, nativeTurnId: turn?.nativeTurnId ?? null,
|
|
36
|
-
runId: turn?.runId ?? null, group: "unknown", reason: "Current native input is not observable.",
|
|
37
|
-
layer: null, lastActivityAt: null, semanticProgressAt: input.semanticProgressAt ?? null,
|
|
38
|
-
sourceUpdatedAt: turn?.updatedAt ?? session?.updatedAt ?? set.updatedAt,
|
|
39
|
-
waitingReason: null, operations: [], background: []
|
|
40
|
-
};
|
|
41
|
-
if (!session || !binding || !conversation || conversation.conversationId !== session.nativeSessionId) {
|
|
42
|
-
sessions.push(row);
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
let driverId;
|
|
46
|
-
try {
|
|
47
|
-
driverId = builtinDriverIdForAdapter(session.adapterId);
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
sessions.push(row);
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
const fence = { taskId: input.taskId, roleName: set.owner.roleName,
|
|
54
|
-
agentId: session.agentId, driverId, nativeSessionId: session.nativeSessionId };
|
|
55
|
-
const sessionFacts = observations.filter(({ observation }) => Object.entries(fence).every(([key, value]) => observation.fence[key] === value));
|
|
56
|
-
// Each Run's continuation fold has its own authority. Foreground operations
|
|
57
|
-
// from older inputs must not make the current input look active.
|
|
58
|
-
const groups = new Map();
|
|
59
|
-
for (const { event, observation } of sessionFacts) {
|
|
60
|
-
const runId = observation.fence.runId;
|
|
61
|
-
const group = groups.get(runId) ?? [];
|
|
62
|
-
group.push(event);
|
|
63
|
-
groups.set(runId, group);
|
|
64
|
-
}
|
|
65
|
-
const background = [...groups].flatMap(([runId, events]) => {
|
|
66
|
-
const projection = projectRuntimeTaskEvents({ ...fence, ...(runId ? { runId } : {}) }, session.createdAt, events);
|
|
67
|
-
const children = Object.entries(projection.continuations)
|
|
68
|
-
.filter(([, c]) => c.execution !== "quiescent" || c.identityConflict)
|
|
69
|
-
.map(([id, c]) => ({ id: `${runId ?? "native"}/${id}`, execution: c.execution }));
|
|
70
|
-
return [...children, ...Object.entries(projection.operations)
|
|
71
|
-
.filter(([, operation]) => operation.kind === "subagent")
|
|
72
|
-
.map(([id]) => ({ id: `${runId ?? "native"}/operation:${id}`, execution: "unsettled" }))];
|
|
73
|
-
});
|
|
74
|
-
if (!turn) {
|
|
75
|
-
sessions.push({ ...row, background, ...(background.length ? {
|
|
76
|
-
group: "background", reason: "Retained background execution is not settled."
|
|
77
|
-
} : {}) });
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
const exactEvents = sessionFacts.filter(({ observation }) => {
|
|
81
|
-
const observed = observation;
|
|
82
|
-
const f = observed.fence;
|
|
83
|
-
if (f.continuationId !== undefined || f.runId !== turn.runId)
|
|
84
|
-
return false;
|
|
85
|
-
if (f.receiptId === undefined && f.nativeTurnId === undefined
|
|
86
|
-
&& ["host.observed", "session.ended", "session.failed", "observer.health"].includes(observed.kind)) {
|
|
87
|
-
return observed.receivedAt >= turn.submittedAt;
|
|
88
|
-
}
|
|
89
|
-
if (f.receiptId !== undefined && f.receiptId !== turn.attemptId)
|
|
90
|
-
return false;
|
|
91
|
-
if (f.nativeTurnId !== undefined && f.nativeTurnId !== turn.nativeTurnId)
|
|
92
|
-
return false;
|
|
93
|
-
return f.receiptId === turn.attemptId
|
|
94
|
-
|| (turn.nativeTurnId !== undefined && f.nativeTurnId === turn.nativeTurnId);
|
|
95
|
-
}).map(entry => entry.event);
|
|
96
|
-
const projection = projectRuntimeTaskEvents({
|
|
97
|
-
...fence, ...(turn.runId ? { runId: turn.runId } : {}),
|
|
98
|
-
receiptId: turn.attemptId, ...(turn.nativeTurnId ? { nativeTurnId: turn.nativeTurnId } : {})
|
|
99
|
-
}, turn.submittedAt, exactEvents);
|
|
100
|
-
const health = classifyRuntimeHealth({ projection, now: input.now, policy,
|
|
101
|
-
semanticProgressAt: input.semanticProgressAt ?? turn.submittedAt });
|
|
102
|
-
const retry = providerRetryProjection(binding);
|
|
103
|
-
let group;
|
|
104
|
-
let reason = health.reason;
|
|
105
|
-
if (turn.status === "delivery-unknown") {
|
|
106
|
-
group = "unknown";
|
|
107
|
-
reason = "Original input delivery is unknown; do not replay it.";
|
|
108
|
-
}
|
|
109
|
-
else if (session.status === "ended") {
|
|
110
|
-
group = background.length ? "background" : "stopped";
|
|
111
|
-
reason = "The selected Session ended; Task acceptance and retained background execution are separate.";
|
|
112
|
-
}
|
|
113
|
-
else if (retry?.status === "waiting") {
|
|
114
|
-
group = "waiting";
|
|
115
|
-
reason = `Controller-owned Provider retry waiting (${retry.attempts}/${retry.limit}); next eligible ${retry.nextEligibleAt}. Existing work is preserved.`;
|
|
116
|
-
}
|
|
117
|
-
else if (["failed", "cancelled", "rejected"].includes(turn.status)) {
|
|
118
|
-
group = background.length ? "background" : "stopped";
|
|
119
|
-
reason = turn.terminalReason ?? "The selected native execution stopped; Task acceptance is separate.";
|
|
120
|
-
}
|
|
121
|
-
else if (turn.status === "completed") {
|
|
122
|
-
group = background.length ? "background" : "idle";
|
|
123
|
-
reason = background.length ? "Main Turn ended; background execution remains unsettled."
|
|
124
|
-
: "The native Turn ended; this is not Task completion.";
|
|
125
|
-
}
|
|
126
|
-
else if (turn.status !== "accepted") {
|
|
127
|
-
group = "waiting";
|
|
128
|
-
reason = "Waiting for native input acceptance.";
|
|
129
|
-
}
|
|
130
|
-
else if (projection.run === "waiting") {
|
|
131
|
-
group = "waiting";
|
|
132
|
-
}
|
|
133
|
-
else if (["broken", "stopped"].includes(health.layer)) {
|
|
134
|
-
group = "stopped";
|
|
135
|
-
}
|
|
136
|
-
else if (["completed", "failed", "cancelled"].includes(projection.run)) {
|
|
137
|
-
group = "unknown";
|
|
138
|
-
reason = "Native terminal and current input binding disagree; inspect the exact original input.";
|
|
139
|
-
}
|
|
140
|
-
else if (projection.observer.status === "unavailable") {
|
|
141
|
-
group = "unknown";
|
|
142
|
-
}
|
|
143
|
-
else if (health.layer === "diagnostic-needed") {
|
|
144
|
-
group = "diagnostic";
|
|
145
|
-
}
|
|
146
|
-
else if (health.runtimeIdleMs < policy.quietAfterMs && projection.activity.kind !== "provider") {
|
|
147
|
-
group = "active";
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
group = "quiet";
|
|
151
|
-
reason = "Accepted input has no recent structured activity; silence is not a proven deadlock.";
|
|
152
|
-
}
|
|
153
|
-
sessions.push({ ...row, group, reason, layer: health.layer, background,
|
|
154
|
-
lastActivityAt: projection.lastRuntimeActivityAt ?? null,
|
|
155
|
-
waitingReason: projection.waitingReason ?? null, operations: health.activeOperations });
|
|
156
|
-
}
|
|
157
|
-
const counts = {
|
|
158
|
-
active: 0, waiting: 0, quiet: 0, diagnostic: 0, unknown: 0, stopped: 0, idle: 0, background: 0
|
|
159
|
-
};
|
|
160
|
-
for (const session of sessions)
|
|
161
|
-
counts[session.group]++;
|
|
162
|
-
return { scope: "task-selected-native-sessions", taskId: input.taskId,
|
|
163
|
-
readAt: input.now.toISOString(), counts, sessions,
|
|
164
|
-
coverage: "Recorded selected Sessions only; not a live process or historical resource inventory." };
|
|
165
|
-
}
|
|
1
|
+
// CLI and Web share the same read-only native observation fold.
|
|
2
|
+
export { projectTaskSessions as projectWebSessions } from "../runtime/taskSessions.js";
|
package/dist/web/webSnapshot.js
CHANGED
|
@@ -96,14 +96,14 @@ export function buildWebTaskDetail(store, taskId, now = new Date(), compact = fa
|
|
|
96
96
|
&& effectiveLaunch.sourceDesiredRevision !== role.launchRevision
|
|
97
97
|
};
|
|
98
98
|
});
|
|
99
|
-
const execution = buildTaskExecutionProjection(reader, taskId, now);
|
|
100
|
-
if (execution === null)
|
|
101
|
-
return null;
|
|
102
99
|
const brief = reader.getTaskBrief(taskId);
|
|
103
100
|
const roleSessionSets = reader.listRoleSessionSets(taskId);
|
|
104
101
|
const sessions = projectWebSessions({ taskId, sessionSets: roleSessionSets, events, now,
|
|
105
102
|
...(brief?.updatedAt === undefined ? {} : { semanticProgressAt: brief.updatedAt }),
|
|
106
103
|
policy: resolveRuntimeHealth(reader.getConfig().runtimeHealth) });
|
|
104
|
+
const execution = buildTaskExecutionProjection(reader, taskId, now, sessions);
|
|
105
|
+
if (execution === null)
|
|
106
|
+
return null;
|
|
107
107
|
if (compact) {
|
|
108
108
|
// Observation is not semantic progress. No Task/Message/Run bodies,
|
|
109
109
|
// Role history or validation logs ride the default polling response.
|
|
@@ -115,15 +115,19 @@ export function buildWebTaskDetail(store, taskId, now = new Date(), compact = fa
|
|
|
115
115
|
monitoring: execution.monitoring, failClosed: execution.failClosed,
|
|
116
116
|
activeRuns: execution.activeRuns.slice(0, 16).map(run => ({ id: run.id })),
|
|
117
117
|
activeRunCount: execution.activeRuns.length,
|
|
118
|
+
activity: execution.activity,
|
|
118
119
|
attention: execution.attention.slice(0, 8).map(item => ({ ...item, summary: clip(item.summary) })),
|
|
119
120
|
blockers: execution.blockers.slice(0, 8).map(item => ({ ...item, summary: clip(item.summary) }))
|
|
120
121
|
},
|
|
122
|
+
roleCount: roles.length,
|
|
121
123
|
roles: roles.slice(0, 16).map(role => ({
|
|
122
124
|
name: role.name, status: role.status, runtimeSession: role.runtimeSession
|
|
123
125
|
})),
|
|
124
|
-
sessions: { ...sessions,
|
|
126
|
+
sessions: { ...sessions, total: sessions.sessions.length, coverageStatus: "partial",
|
|
127
|
+
sessions: sessions.sessions.slice(0, 16).map(session => ({
|
|
125
128
|
...session, reason: session.reason.slice(0, 1200),
|
|
126
|
-
|
|
129
|
+
operationCount: session.operations.length, backgroundCount: session.background.length,
|
|
130
|
+
operations: [], background: []
|
|
127
131
|
})) },
|
|
128
132
|
observability: {
|
|
129
133
|
cost: execution.observability.cost,
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { taskNotFound } from "../errors/cliError.js";
|
|
2
|
+
import { recordPage } from "../output/boundedRead.js";
|
|
3
|
+
import { resolveRuntimeHealth } from "../config/yuiConfig.js";
|
|
4
|
+
import { projectTaskSessions } from "../runtime/taskSessions.js";
|
|
5
|
+
/** Native observations are not durable execution records. Flatten only the
|
|
6
|
+
* unfinished, recorded facts so one bounded page cannot hide a large child
|
|
7
|
+
* collection inside a single Session. Detail remains in the native Session. */
|
|
8
|
+
export function nativeActivityRows(projection) {
|
|
9
|
+
return projection.sessions.flatMap(session => {
|
|
10
|
+
const identity = {
|
|
11
|
+
roleName: session.roleName, agentId: session.agentId,
|
|
12
|
+
driverId: session.driverId,
|
|
13
|
+
nativeSessionId: session.nativeSessionId, runId: session.runId,
|
|
14
|
+
sourceUpdatedAt: session.sourceUpdatedAt
|
|
15
|
+
};
|
|
16
|
+
const key = JSON.stringify([session.roleName, session.agentId, session.driverId, session.nativeSessionId]);
|
|
17
|
+
return [
|
|
18
|
+
...(["idle", "stopped"].includes(session.group) ? [] : [{
|
|
19
|
+
...identity, id: key, kind: "session", status: session.group,
|
|
20
|
+
summary: session.reason.slice(0, 1200), waitingReason: session.waitingReason,
|
|
21
|
+
lastActivityAt: session.lastActivityAt
|
|
22
|
+
}]),
|
|
23
|
+
...session.operations.filter(operation => !operation.startsWith("subagent:")).map(operation => ({
|
|
24
|
+
...identity, id: `${key}/operation/${operation}`, kind: "operation",
|
|
25
|
+
status: "unsettled", summary: operation.slice(0, 1200)
|
|
26
|
+
})),
|
|
27
|
+
...session.background.map(child => ({
|
|
28
|
+
...identity, runId: child.runId, id: `${key}/background/${child.id}`, kind: "background",
|
|
29
|
+
status: child.execution, summary: child.id.slice(0, 1200)
|
|
30
|
+
}))
|
|
31
|
+
];
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function readWebTaskActivity(store, taskId, options, now = new Date()) {
|
|
35
|
+
return store.readTransaction(reader => {
|
|
36
|
+
if (reader.getTask(taskId) === null)
|
|
37
|
+
throw taskNotFound(taskId);
|
|
38
|
+
const projection = projectTaskSessions({
|
|
39
|
+
taskId, sessionSets: reader.listRoleSessionSets(taskId), events: reader.listEvents(taskId), now,
|
|
40
|
+
policy: resolveRuntimeHealth(reader.getConfig().runtimeHealth)
|
|
41
|
+
});
|
|
42
|
+
const rows = nativeActivityRows(projection);
|
|
43
|
+
return {
|
|
44
|
+
...recordPage(rows, `task:${taskId}/native-activity`, options),
|
|
45
|
+
readAt: now.toISOString(), coverage: "partial",
|
|
46
|
+
scope: projection.coverage,
|
|
47
|
+
counts: {
|
|
48
|
+
sessions: rows.filter(row => row.kind === "session").length,
|
|
49
|
+
operations: rows.filter(row => row.kind === "operation").length,
|
|
50
|
+
background: rows.filter(row => row.kind === "background").length
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -349,6 +349,7 @@ export function createWebTaskSurface(store, options = {}, observations = [], hos
|
|
|
349
349
|
// The same paged family discovery as `task context list`: summaries and
|
|
350
350
|
// exact references, never bodies; continuations keep their filters.
|
|
351
351
|
list: (taskId, input) => listTaskContext(store, taskId, input.store, {
|
|
352
|
+
...(input.view === undefined ? {} : { view: input.view }),
|
|
352
353
|
...(input.status === undefined ? {} : { status: input.status }),
|
|
353
354
|
...(input.cursor === undefined ? {} : { cursor: input.cursor }),
|
|
354
355
|
...(input.limit === undefined ? {} : { limit: input.limit })
|
|
@@ -69,11 +69,27 @@ Run Pack is a reference directory: read the relevant requirement and message
|
|
|
69
69
|
bodies before acting, rather than treating a successful load as the deliverable.
|
|
70
70
|
Planning Packs expose no Project write scope or Task-completion permission.
|
|
71
71
|
|
|
72
|
-
The Manifest pointer is a recovery locator, not a read receipt.
|
|
73
|
-
`yui
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
The Manifest pointer is a recovery locator, not a read receipt. At the start of
|
|
73
|
+
every turn run `yui session skills --json` through the Session's CLI/Home. It
|
|
74
|
+
checks current paths, internal `VERSION` files and readability, without reading
|
|
75
|
+
Skill bodies or walking/snapshotting resources. Builtins use the running
|
|
76
|
+
installation's `skills/<id>` entry; configured Skills use `YUI_HOME/skills/<id>`.
|
|
77
|
+
These paths do not contain a Session/content digest. After changing installation
|
|
78
|
+
locations the check resolves the current installation, not an old recorded path.
|
|
79
|
+
For Global Sessions the Manifest's `skillCheckCommand` is its self-contained
|
|
80
|
+
`session context <role>` read, which also returns current Skill metadata and works
|
|
81
|
+
after moving to Desktop without the launch shell's environment. An older Global
|
|
82
|
+
Manifest's existing `loadCommand` provides the same check.
|
|
83
|
+
|
|
84
|
+
Load current `yui-runtime`, applicable Role/custom Skills and necessary references,
|
|
85
|
+
plus the Manifest's profile, on first entry, a version change, recovery, or missing/
|
|
86
|
+
compacted/uncertain context. Reuse only when versions are unchanged and the full
|
|
87
|
+
instructions remain available now. Yui stores no "already read" state and does
|
|
88
|
+
not claim to inspect the model's context. Historical packages remain audit only;
|
|
89
|
+
missing/corrupt snapshots do not prevent valid Session resume or input delivery.
|
|
90
|
+
Missing current files report their exact path and recovery action. Session
|
|
91
|
+
identity, scope, writer fences and real CLI/Home incompatibility still reject.
|
|
92
|
+
Always refresh dynamic facts. Leader notifications use
|
|
77
93
|
`currentCommand`; dispatched AgentRuns use the actual Run ID with
|
|
78
94
|
`loadCommand`/`expandCommand`, never their placeholder templates.
|
|
79
95
|
|
|
@@ -139,6 +155,66 @@ summary store, read-acknowledgement or extra model call is involved. Missing or
|
|
|
139
155
|
oversized summaries fall back to facts without clipping qualifications.
|
|
140
156
|
Summaries never grant authority, accept results or mark reviews approved.
|
|
141
157
|
|
|
158
|
+
### Operator backlog and periodic recovery
|
|
159
|
+
|
|
160
|
+
Task completion/cancellation/retirement, publication records/adoption and input
|
|
161
|
+
requests enqueue Operator attention in the same transaction as their durable
|
|
162
|
+
event. Existing Run failure routing keeps its retry and supervisor guards.
|
|
163
|
+
The ready mailbox is the incremental recovery source: a lost scheduler signal
|
|
164
|
+
or Controller restart does not require a Leader report or a scan of historical
|
|
165
|
+
Tasks. The existing periodic pass retries outstanding mailbox work; an unchanged,
|
|
166
|
+
settled mailbox creates neither a Message nor a model call.
|
|
167
|
+
|
|
168
|
+
At most one unsent engineering notice is queued. Further facts coalesce in the
|
|
169
|
+
mailbox until that notice is accepted or conclusively not delivered. Each handoff
|
|
170
|
+
claims at most 64 source signals and reads exact records, retaining the unclaimed
|
|
171
|
+
suffix. Global delivery reads at most 64 pending Messages per Role per pass;
|
|
172
|
+
conclusively stale originals retain their nondelivery evidence, with later pages
|
|
173
|
+
handled by subsequent passes. Reserved interrupt-then inputs remain discoverable
|
|
174
|
+
beyond that ordinary page. FIFO user inputs and unknown-effect fences are not
|
|
175
|
+
reordered to make notifications appear healthy. SQL aggregates still inspect
|
|
176
|
+
matching stored rows; these bounds limit materialized records and per-pass
|
|
177
|
+
delivery work, not the size of the persisted mailbox or database.
|
|
178
|
+
|
|
179
|
+
A full reconciliation may ask the original Host to republish an already observed
|
|
180
|
+
terminal for the exact Session, authority, attempt and native Turn. For a Desktop
|
|
181
|
+
direct Turn, that Host must have retained both the exact start and terminal under
|
|
182
|
+
the unchanged writer fence; `direct:<nativeTurnId>` and the native Turn are both
|
|
183
|
+
required. This bounded latest observation does not make the input client-owned.
|
|
184
|
+
This uses the existing Inbox and canonical observer, including the original result.
|
|
185
|
+
It does not submit input, query another native client, restart a Host, or infer
|
|
186
|
+
quiescence from elapsed time/idle state. Normal terminal processing signals again
|
|
187
|
+
after releasing Host occupancy. Unknown acceptance remains isolated unless exact
|
|
188
|
+
evidence settles that input. Explicit stop/replacement and external writers remain
|
|
189
|
+
hard boundaries.
|
|
190
|
+
|
|
191
|
+
`yui session context <role> --json` includes bounded `backlog` diagnostics: pending
|
|
192
|
+
count, oldest timestamp, target and attempt identities, blocking reason and
|
|
193
|
+
recovery guidance. Live age is in `backlogObservation`, outside the paged source
|
|
194
|
+
digest. `in-flight-or-unobserved-terminal` deliberately does not label a
|
|
195
|
+
long-running accepted Turn as stuck. An unavailable/older Host or missing retained
|
|
196
|
+
terminal produces one record-only runtime-attention Message per exact attempt;
|
|
197
|
+
inspect it through the existing message list/show commands. No recovery Agent,
|
|
198
|
+
private timer, migration or new acknowledgement state is introduced. If the
|
|
199
|
+
Provider itself never reported a terminal, or the original Host lost its evidence,
|
|
200
|
+
automatic reconciliation cannot prove completion: restore the compatible observation
|
|
201
|
+
path or explicitly stop/replace only with the required native quiescence evidence.
|
|
202
|
+
This change does not backfill arbitrary pre-existing historical events, adopt old
|
|
203
|
+
Hosts, or authorize production upgrades/restarts.
|
|
204
|
+
|
|
205
|
+
Controller restart preserves live Hosts; it does not replace their loaded code.
|
|
206
|
+
A supported surviving Host writes raw observations to the immutable Inbox even
|
|
207
|
+
while the Controller is down; the restarted Controller applies them under current
|
|
208
|
+
Session fences. A frozen Manifest's CLI/storage mismatch is a context-read failure,
|
|
209
|
+
not proof that the Host publisher failed: this publisher uses the Inbox/RPC, not
|
|
210
|
+
that CLI. An Endpoint checkout generation is not a complete Host build identity.
|
|
211
|
+
The runtime-attention evidence distinguishes an unavailable control channel,
|
|
212
|
+
rejected control (including implementations without reconciliation), and a missing
|
|
213
|
+
exact retained terminal, with reported Endpoint/event-delivery observations.
|
|
214
|
+
Missing delivery diagnostics mean unreported, not healthy. Unsupported live code
|
|
215
|
+
cannot be repaired by another Controller restart or guessed adoption; inspect the
|
|
216
|
+
original evidence and explicitly authorize any necessary lifecycle recovery.
|
|
217
|
+
|
|
142
218
|
`task wake show <task> <wake>` now defaults to inputs/results and explicit
|
|
143
219
|
references, including older referenced originals. It omits unrelated diagnostic
|
|
144
220
|
events and merely started Runs; `--history` restores full fixed-window discovery.
|
|
@@ -55,9 +55,19 @@ Run Context 冻结 Assignment、来源引用、生效配置和工作区边界。
|
|
|
55
55
|
和消息正文,而不是把加载成功当成交付物。规划 Pack 不暴露 Project 写范围或 Task 完成
|
|
56
56
|
权限。
|
|
57
57
|
|
|
58
|
-
Manifest
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
Manifest 指针是恢复定位入口,不是已读凭据。每轮开始通过本 Session 的 CLI/Home 执行
|
|
59
|
+
`yui session skills --json`,轻量检查当前路径、内部 `VERSION` 和文件可读性,不读取
|
|
60
|
+
正文或遍历/冻结资源。内置入口是当前安装目录的 `skills/<id>`,自定义入口是
|
|
61
|
+
`YUI_HOME/skills/<id>`,不包含 Session/内容摘要;安装位置变化后由检查重新解析当前入口。
|
|
62
|
+
Global Manifest 的 `skillCheckCommand` 使用自包含的 `session context <role>`,
|
|
63
|
+
同时返回 Skill 元数据,因此切换到 Desktop 后不依赖启动 shell 的环境;
|
|
64
|
+
旧 Global Manifest 的 `loadCommand` 也能执行相同检查。
|
|
65
|
+
首次进入、版本变化、恢复,以及压缩后全文缺失或可用性不确定时,读取当前 Runtime、
|
|
66
|
+
Role/custom Skills 全文及必要引用、Manifest 的 profile。只有版本未变且全文仍在当前
|
|
67
|
+
上下文时才复用。系统不保存“已经读过”状态,也不声称检查了模型上下文。
|
|
68
|
+
历史冻结包仅作审计:缺失或损坏不阻止合法 Session 恢复与消息投递;当前文件缺失则
|
|
69
|
+
报告具体路径和修复动作。身份、作用域、writer fence 与实际 CLI/Home 不兼容仍会拒绝。
|
|
70
|
+
动态事实仍须刷新:
|
|
61
71
|
Leader 通知使用 `currentCommand`,显式 AgentRun 使用真实 Run ID 的
|
|
62
72
|
`loadCommand`/`expandCommand`,不可直接执行占位模板。
|
|
63
73
|
|
|
@@ -110,6 +120,44 @@ Leader 本地编辑保留持久事件,但不创建自唤醒。当 Leader 忙
|
|
|
110
120
|
Task 叙述。人工输入、显式执行进入和激活失败通过既有唤醒机制及时投递。Worker 结果
|
|
111
121
|
保留其聚合窗口。忙碌的原生输入仍保留待处理的消息。
|
|
112
122
|
|
|
123
|
+
### Operator 积压与周期恢复
|
|
124
|
+
|
|
125
|
+
Task 完成/取消/退役、Publication 记录/采用及 InputRequest 与持久事件在同一事务中
|
|
126
|
+
进入 Operator 邮箱;Run 失败继续遵守既有重试和监督路由。邮箱自身就是增量恢复源:
|
|
127
|
+
通知信号遗漏或 Controller 重启后,既有周期协调读取尚未处理的引用,不依赖 Leader
|
|
128
|
+
主动报告,也不遍历历史 Task。已结算且无变化的邮箱不会生成消息或调用模型。
|
|
129
|
+
|
|
130
|
+
最多保留一条未发送的工程通知,后续事实在原邮箱中合并,直到该通知已接受或明确未投递。
|
|
131
|
+
每次认领最多 64 个来源信号,读取精确记录并保留未认领后缀。Global 投递每个 Role 每轮
|
|
132
|
+
最多读取 64 条待处理消息;已证明失效的原始消息保留未投递证据,后续页由下一轮处理。
|
|
133
|
+
interrupt-then 的预留输入不会因超出普通页而被跳过,用户输入顺序和未知效果围栏保持不变。
|
|
134
|
+
SQL 聚合仍检查匹配的存储行;这些上界约束物化记录和每轮投递工作,不限制持久邮箱或数据库大小。
|
|
135
|
+
|
|
136
|
+
完整周期协调可要求原 Host 重发它已经观察到的精确终态,严格绑定 Session、
|
|
137
|
+
authority、attempt 和 native Turn。Desktop direct 回合还要求该 Host 保留同一 writer 围栏下
|
|
138
|
+
精确匹配的开始和结束,同时核对 `direct:<nativeTurnId>` 与 native Turn;只保留最近一次
|
|
139
|
+
观察,不把 direct 输入改为 client-owned。通过原 Inbox 和规范观察器处理完整结果;不提交新输入、
|
|
140
|
+
另开原生客户端查询、重启 Host,也不凭时间或 idle 推定静止。正常终态在释放 Host 占用后
|
|
141
|
+
再次发出队列信号。未知接受只有精确证据才能结算,显式停止/替换及外部 writer 仍是硬边界。
|
|
142
|
+
|
|
143
|
+
`yui session context <role> --json` 的 `backlog` 提供有界待投递数量、最老时间、
|
|
144
|
+
目标与尝试身份、阻塞原因和恢复指引;实时年龄位于分页摘要外的 `backlogObservation`,
|
|
145
|
+
不会令分页游标因时间流逝失效。`in-flight-or-unobserved-terminal` 不把长期 accepted
|
|
146
|
+
误报为卡死。Host 不可达、不支持重观察或缺少保留终态时,每个精确尝试只留下一个 record-only
|
|
147
|
+
runtime-attention Message,可通过既有 message list/show 查看,不自动唤醒恢复 Agent。
|
|
148
|
+
如果 Provider 从未报告终态,或原 Host 已失去证据,则不能自动证明完成;须恢复兼容观察路径,
|
|
149
|
+
或在取得原生静止证据后显式停止/替换。不新增私有定时器、迁移或 ack 状态,不猜补任意旧历史、
|
|
150
|
+
收养旧 Host,也不授权生产升级/重启。
|
|
151
|
+
|
|
152
|
+
Controller 重启保留存活 Host,不替换它们已加载的代码。支持当前协议的原 Host 在 Controller
|
|
153
|
+
停机期间仍把原始观察写入不可变 Inbox,重启后由 Controller 按当前 Session 围栏应用。
|
|
154
|
+
冻结 Manifest 的旧 CLI/storage 不匹配是 Context 读取失败,不足以证明 Host 发布失败:
|
|
155
|
+
发布器使用 Inbox/RPC,不执行该 CLI。Endpoint 的 checkout generation 也不是完整 Host
|
|
156
|
+
构建身份。runtime-attention 区分控制通道不可达、控制被拒绝(包括实现不支持协调)和
|
|
157
|
+
精确终态未保留,并附已报告的 Endpoint/eventDelivery 观察;缺少诊断表示未报告,而非健康。
|
|
158
|
+
再次重启 Controller 或猜测 adoption 不能修复不支持的存活代码;须检查原证据,并为必要的
|
|
159
|
+
生命周期恢复另行取得明确授权。
|
|
160
|
+
|
|
113
161
|
| 证据 | 处置 |
|
|
114
162
|
| --- | --- |
|
|
115
163
|
| 忙碌且已证明未接受 | 保留输入;新的传输尝试可以使用同一 Session |
|
|
@@ -108,8 +108,32 @@ All routes use the local Web token and Task boundary.
|
|
|
108
108
|
`GET /api/tasks/<id>/artifacts` lists a fixed repository revision;
|
|
109
109
|
`?path=<relative-path>&commit=<full-commit>` reads its exact text file.
|
|
110
110
|
`GET /api/tasks/<id>/evidence` reads original check/Review/workspace records.
|
|
111
|
-
`GET /api/tasks/<id>/list?store=<family>[&status&cursor&limit]` returns the same
|
|
111
|
+
`GET /api/tasks/<id>/list?store=<family>[&view=current|all&status&cursor&limit]` returns the same
|
|
112
112
|
paged summaries as `task context list`.
|
|
113
|
+
|
|
114
|
+
`task context list <task> --store <family> --view current` uses the same
|
|
115
|
+
membership as the compact Context counts: active runs, pending/running reviews,
|
|
116
|
+
open InputRequests and queued/running/unknown Jobs. The default `all` view
|
|
117
|
+
preserves history. Each continuation binds the filtered collection and rejects
|
|
118
|
+
changed sources; refresh instead of mixing versions. Runtime lists expose
|
|
119
|
+
loaded/total counts, continuation, explicit refresh and read failures. Exact
|
|
120
|
+
record bodies remain on demand.
|
|
121
|
+
|
|
122
|
+
`GET /api/tasks/<id>/activity[?cursor=...&limit=20]` is a token-authenticated,
|
|
123
|
+
read-only page of recorded native Session, operation and background facts.
|
|
124
|
+
It uses the shared runtime projection, including retained, exactly fenced
|
|
125
|
+
children after Session replacement; it never probes processes or Providers.
|
|
126
|
+
Pages contain at most 100 items and 32 KiB, with separate category counts,
|
|
127
|
+
read time and explicit partial coverage. Compact observations carry full
|
|
128
|
+
counts with bounded Session samples, not nested child lists. Native facts and
|
|
129
|
+
AgentRuns can describe the same execution; their counts are not additive.
|
|
130
|
+
Unknown, unloaded and unavailable observations must not mean no activity.
|
|
131
|
+
|
|
132
|
+
The execution summary includes Job and native facts alongside open inputs and
|
|
133
|
+
AgentRuns. `waiting-on-jobs` is a derived display/next-action state, not a Task
|
|
134
|
+
lifecycle value. Waiting for a user keeps parallel work visible; unknown Job
|
|
135
|
+
outcomes or native activity remain attention facts, never completion or replay
|
|
136
|
+
authority.
|
|
113
137
|
These reads do not start a runtime, fetch a remote, write business state, require
|
|
114
138
|
a migration, or introduce a new persistent protocol.
|
|
115
139
|
|
|
@@ -89,8 +89,25 @@ skipped/缺失检查不算通过。工作区所有权不证明可清理;既
|
|
|
89
89
|
`GET /api/tasks/<id>/artifacts` 列出固定仓库版本;
|
|
90
90
|
`?path=<relative-path>&commit=<full-commit>` 读取该版本文本;
|
|
91
91
|
`GET /api/tasks/<id>/evidence` 读取原检查/Review/工作区记录;
|
|
92
|
-
`GET /api/tasks/<id>/list?store=<family>[&status&cursor&limit]` 返回与
|
|
92
|
+
`GET /api/tasks/<id>/list?store=<family>[&view=current|all&status&cursor&limit]` 返回与
|
|
93
93
|
`task context list` 相同的分页摘要。
|
|
94
|
+
|
|
95
|
+
`task context list <task> --store <family> --view current` 与紧凑 Context
|
|
96
|
+
计数使用同一筛选:active Run、pending/running Review、open InputRequest,
|
|
97
|
+
以及 queued/running/unknown Job。默认 `all` 保留历史。分页游标绑定筛选后的
|
|
98
|
+
集合,来源变化时明确拒绝继续拼接;应刷新重读。运行页展示已加载/总数、继续
|
|
99
|
+
加载、刷新及读取失败,记录原文仍按需展开。
|
|
100
|
+
|
|
101
|
+
`GET /api/tasks/<id>/activity[?cursor=...&limit=20]` 是经过 token 鉴权的只读
|
|
102
|
+
原生会话、operation 和后台活动分页。复用共享运行投影,覆盖会话更换后身份
|
|
103
|
+
明确的保留子活动,不探测系统进程或 Provider。每页最多 100 项、32 KiB,
|
|
104
|
+
包含分类计数、读取时间和明确的 partial 覆盖范围。紧凑观测返回完整计数及
|
|
105
|
+
有限的会话样本,不携带嵌套子活动清单。原生事实与 AgentRun 可能指向同一
|
|
106
|
+
执行,计数不可相加;未知、未加载和观测不可用都不能表示没有活动。
|
|
107
|
+
|
|
108
|
+
执行摘要同时考虑 Job、原生事实、用户输入和 AgentRun。`waiting-on-jobs`
|
|
109
|
+
只是派生展示/下一步状态,不改变 Task 生命周期。等待用户不隐藏并行工作;
|
|
110
|
+
未知 Job 结果和原生活动保留为关注事实,不能据此判定完成或授权重放。
|
|
94
111
|
读取不启动运行时、不访问远端、不写业务状态、不引入迁移或新持久协议。
|
|
95
112
|
|
|
96
113
|
## 执行审计
|
package/docs/provider-retry.md
CHANGED
|
@@ -21,6 +21,10 @@ next input. Agents still own semantic recovery and acceptance.
|
|
|
21
21
|
- An explicit manual retry of the same Run retains its recovery lineage,
|
|
22
22
|
automatic count and original deadline. It is not charged as an automatic
|
|
23
23
|
attempt, but a further failure cannot replenish automatic allowance.
|
|
24
|
+
If no automatic chain exists, it can still use the current binding's exact
|
|
25
|
+
accepted failed Turn and original input. The error need not have qualified
|
|
26
|
+
for automation; manual intent does not waive Session, authority, latest-Turn
|
|
27
|
+
or background-quiescence checks.
|
|
24
28
|
|
|
25
29
|
The records live on the existing Provider binding, with indexed pending-record
|
|
26
30
|
reads and the existing Controller deadline timer. There is no retry Task status,
|
|
@@ -56,6 +60,13 @@ failure and earlier chain references. A changed error that still satisfies the
|
|
|
56
60
|
same safe retry rule continues within the original budget. Loss of that rule,
|
|
57
61
|
authority or budget stops automatic submission.
|
|
58
62
|
|
|
63
|
+
Codex's structured `codexErrorInfo: "serverOverloaded"` qualifies as temporary
|
|
64
|
+
capacity failure. Capacity prose alone does not grant replay eligibility.
|
|
65
|
+
Native nonterminal error/retry notifications do not create a Yui retry; only
|
|
66
|
+
the exact failed terminal does. A missing retry record therefore does not
|
|
67
|
+
prove budget exhaustion or an unrecoverable Session: inspect the original
|
|
68
|
+
error and current Turn before choosing explicit recovery.
|
|
69
|
+
|
|
59
70
|
Task errors retain their original `runtime.agent-error` evidence and notify the
|
|
60
71
|
Leader, or the Operator when the affected Role is the Leader. Global failures
|
|
61
72
|
retain record-only Messages in their own Role inbox, including intermediate
|
package/docs/release-workflow.md
CHANGED
|
@@ -51,6 +51,77 @@ merely to avoid a version decision. Package versions remain distinct from protoc
|
|
|
51
51
|
and persistent-storage contracts: their compatibility checks and required migrations
|
|
52
52
|
are unchanged, and the storage rules below do not authorize a package release.
|
|
53
53
|
|
|
54
|
+
### 2.7.1 compatibility and migration notes
|
|
55
|
+
|
|
56
|
+
This release delivers the intended 2.7 feature line. The `v2.7.0` attempt stopped
|
|
57
|
+
before npm publication because package smoke compared a macOS temporary path
|
|
58
|
+
with its physical alias. The smoke now uses the physical package root; its
|
|
59
|
+
assertions and the cross-platform release gate remain intact.
|
|
60
|
+
|
|
61
|
+
This minor adds own-scope Agent inbox discovery, full reads, claims and
|
|
62
|
+
acknowledgements for GlobalRoles and Task Leaders, Workers and Reviewers.
|
|
63
|
+
Use `yui inbox list/show/claim/ack` from the current managed Session; reads do
|
|
64
|
+
not consume input, claims do not grant additional authority, and an
|
|
65
|
+
acknowledgement is not execution-result acceptance. Durable receipts arbitrate
|
|
66
|
+
with automatic delivery without replaying unknown native input.
|
|
67
|
+
|
|
68
|
+
Storage advances from **1.6 to 1.7** through the centralized additive migration
|
|
69
|
+
for Message and Leader-wake inbox receipts. Use `yui update --version 2.7.1`
|
|
70
|
+
for an exact upgrade; the updater preflights the target Home, takes a backup
|
|
71
|
+
when migration is required, and coordinates the exact Controller replacement.
|
|
72
|
+
Do not edit stored records manually. Task, Session and original input history
|
|
73
|
+
remain authoritative.
|
|
74
|
+
|
|
75
|
+
Runtime and Role instructions now use stable current source paths and independent
|
|
76
|
+
integer `VERSION` files. Every managed turn checks `yui session skills --json`;
|
|
77
|
+
only unchanged full instructions still present in context may be reused.
|
|
78
|
+
Recovery, version changes and missing/uncertain context require full reload.
|
|
79
|
+
Configured Skills must supply `VERSION` beside `SKILL.md`.
|
|
80
|
+
|
|
81
|
+
Frozen packages remain historical audit, not a Session admission condition.
|
|
82
|
+
Valid pre-1.5 Sessions may resume without that evidence; no historical read,
|
|
83
|
+
native acceptance or input consumption is fabricated. Identity, scope, writer,
|
|
84
|
+
lifecycle, protocol/storage and unknown-input fences are unchanged. The Skill
|
|
85
|
+
loading change itself adds no storage migration.
|
|
86
|
+
|
|
87
|
+
This release also recovers Operator notification backlogs and Desktop-direct
|
|
88
|
+
terminal facts across Controller replacement, retaining exact input and Turn
|
|
89
|
+
identities. SQLite prefers the pinned modern N-API driver, with a bounded
|
|
90
|
+
compatibility fallback when that optional native candidate is unavailable;
|
|
91
|
+
this fixes the reproduced Node 24 native GC abort.
|
|
92
|
+
|
|
93
|
+
Deterministic core checks and isolated assembled/fresh-install package smoke
|
|
94
|
+
are the release evidence; they do not establish real-model behavior.
|
|
95
|
+
Publishing this package alone does not authorize a global CLI update, Home
|
|
96
|
+
migration or Controller replacement.
|
|
97
|
+
|
|
98
|
+
### 2.6.0 compatibility and migration notes
|
|
99
|
+
|
|
100
|
+
This minor includes Task111's paged current activity and parallel execution
|
|
101
|
+
summary. Task runtime lists can discover all current Roles, Runs, Reviews,
|
|
102
|
+
Jobs and open InputRequests beyond the compact samples; exact record details
|
|
103
|
+
remain on demand. `task context list --view current` selects current membership,
|
|
104
|
+
while the default `all` retains history. Refresh a changed collection instead
|
|
105
|
+
of reusing its stale pagination cursor.
|
|
106
|
+
|
|
107
|
+
Execution consumers must handle the additional derived `waiting-on-jobs`
|
|
108
|
+
status and `wait-for-jobs` action, and the parallel `activity` categories.
|
|
109
|
+
These are not Task lifecycle states or new scheduling authority. Waiting for
|
|
110
|
+
user input no longer hides concurrent work. Unknown outcomes remain unknown
|
|
111
|
+
and never authorize replay.
|
|
112
|
+
|
|
113
|
+
Compact native observations now return category totals and bounded Session
|
|
114
|
+
samples with `operationCount`/`backgroundCount`, not embedded child lists.
|
|
115
|
+
Consumers needing those rows must page `/api/tasks/<id>/activity`.
|
|
116
|
+
Coverage is explicitly partial: selected native Sessions and retained,
|
|
117
|
+
exactly fenced child observations, not a live process inventory. Native facts
|
|
118
|
+
may describe an AgentRun and must not be added to it as separate executors.
|
|
119
|
+
|
|
120
|
+
No storage migration is added; storage remains **1.6**. Existing acceptance
|
|
121
|
+
evidence uses deterministic tests and isolated browser fixtures, not real-model
|
|
122
|
+
validation. Publishing this package does not upgrade a global CLI, migrate a
|
|
123
|
+
Home or restart a Controller.
|
|
124
|
+
|
|
54
125
|
### 2.5.0 compatibility and migration notes
|
|
55
126
|
|
|
56
127
|
This minor includes Task110's notification and context-loading improvements.
|
|
@@ -91,8 +162,9 @@ fixes are included; Task110's unmerged work is not part of this release.
|
|
|
91
162
|
Storage is now **1.6**. Use the supported centralized, contiguous same-major
|
|
92
163
|
upgrade path for older supported Homes; do not edit stored records manually.
|
|
93
164
|
Historical missing cost remains unknown. Old Skill provenance is not rebuilt
|
|
94
|
-
from today's files
|
|
95
|
-
|
|
165
|
+
from today's files. The original 2.4 restoration restriction for missing packages
|
|
166
|
+
is superseded by the current Skill-loading contract above; preserve old history
|
|
167
|
+
without making that audit evidence a Session admission condition.
|
|
96
168
|
Current model adoption is connection-local and does not change future defaults;
|
|
97
169
|
exit the Host-owned native TUI before changing its model (closing a viewer only
|
|
98
170
|
detaches it). Unknown sends must be inspected by their original request ID,
|