@zq-silk/yui 2.16.0 → 2.17.0
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/dist/cli/commandCatalog.js +17 -11
- package/dist/cli/interactionCandidates.js +20 -5
- package/dist/cli/interactionPolicy.js +5 -4
- package/dist/cli/roleWizard.js +7 -0
- package/dist/commands/globalRoleCommands.js +13 -2
- package/dist/commands/operatorCommands.js +2 -0
- package/dist/commands/profileCommands.js +19 -2
- package/dist/commands/roleConfiguration.js +3 -0
- package/dist/commands/taskCommands.js +16 -0
- package/dist/commands/taskRoleRuntimeStatus.js +3 -0
- package/dist/controller/agentJobControl.js +9 -1
- package/dist/controller/fileSchedulerStoreAdapter.js +35 -4
- package/dist/controller/globalInputDelivery.js +14 -8
- package/dist/controller/providerRetryAdmission.js +9 -0
- package/dist/controller/providerRetryDelivery.js +16 -0
- package/dist/controller/runtime.js +14 -0
- package/dist/controller/runtimeLaunchCoordinator.js +3 -1
- package/dist/executor/fileRoleLaunchPlanner.js +3 -0
- package/dist/message/messageContinuation.js +4 -0
- package/dist/output/rolePresentation.js +3 -0
- package/dist/profile/agentProfile.js +8 -0
- package/dist/profile/agentProfileRuntime.js +16 -1
- package/dist/review/reviewDecision.js +6 -0
- package/dist/role/availability.js +28 -0
- package/dist/role/role.js +6 -0
- package/dist/runtime/codexNativeAccess.js +21 -4
- package/dist/runtime/tmuxAdapters.js +5 -0
- package/dist/scheduler/activeRoleRunDelivery.js +9 -0
- package/dist/scheduler/leaderWakeupProcessor.js +8 -1
- package/dist/scheduler/roleRunLiveness.js +3 -0
- package/dist/storage/sqliteSchema.js +10 -0
- package/dist/storage/storageVersions.js +1 -1
- package/dist/web/assets/client/app/main.js +15 -22
- package/dist/web/assets/client/app/taskView.js +7 -11
- package/dist/web/assets/client/i18n/en.js +62 -18
- package/dist/web/assets/client/i18n/zh-CN.js +62 -18
- package/dist/web/assets/client/index.js +2 -0
- package/dist/web/assets/client/layout/shortcuts.js +2 -2
- package/dist/web/assets/client/layout/workspace.js +99 -112
- package/dist/web/assets/client/ui/primitives.js +15 -2
- package/dist/web/assets/client/views/dock/conversation.js +421 -123
- package/dist/web/assets/client/views/dock/session.js +229 -0
- package/dist/web/assets/client/views/dock/terminal.js +48 -39
- package/dist/web/assets/client/views/overview.js +2 -2
- package/dist/web/assets/client/views/task/page.js +2 -12
- package/dist/web/assets/shell/dock.js +9 -27
- package/dist/web/assets/styles/views/conversation.js +96 -17
- package/dist/web/assets/styles/views/dock.js +17 -5
- package/dist/web/assets/styles/views/task.js +1 -2
- package/dist/web/assets/styles/views/terminal.js +12 -8
- package/dist/web/webConversation.js +1 -0
- package/dist/web/webSettings.js +10 -2
- package/docs/managed-turn-and-session-runtime.md +10 -0
- package/docs/managed-turn-and-session-runtime.zh-CN.md +6 -0
- package/docs/release-workflow.md +24 -0
- package/docs/release-workflow.zh-CN.md +19 -0
- package/docs/roles-and-configuration.md +45 -1
- package/docs/roles-and-configuration.zh-CN.md +35 -0
- package/docs/storage-baseline.md +6 -1
- package/docs/storage-baseline.zh-CN.md +5 -1
- package/docs/testing/review-evaluation.md +35 -1
- package/docs/testing/review-evaluation.zh-CN.md +25 -1
- package/docs/testing/verification-levels.md +2 -2
- package/docs/testing/verification-levels.zh-CN.md +2 -2
- package/package.json +1 -1
- package/skills/yui-leader/VERSION +1 -1
- package/skills/yui-leader/references/execution.md +19 -8
- package/skills/yui-reviewer/SKILL.md +13 -2
- package/skills/yui-reviewer/VERSION +1 -1
|
@@ -6,21 +6,55 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export const CONVERSATION_STYLES = `
|
|
8
8
|
#dock-conversation{min-width:0}
|
|
9
|
+
/* Session page: one view at a time (chat or terminal), rebuilt on a mode switch */
|
|
10
|
+
.session-view{flex:1;min-height:0;min-width:0;display:flex;flex-direction:column}
|
|
11
|
+
.sp-modes{flex:none}
|
|
12
|
+
.sp-modes .seg-btn{gap:5px}
|
|
13
|
+
.sp-modes .seg-btn .icon{width:14px;height:14px;flex:none}
|
|
14
|
+
.sp-modes .seg-btn[aria-disabled="true"]{opacity:.45}
|
|
15
|
+
@container dock (max-width:440px){.sp-modes .seg-btn>span{display:none}.sp-modes .seg-btn{padding:0 7px}}
|
|
9
16
|
.cv-head{flex:none;display:flex;align-items:center;gap:6px;padding:8px 10px 4px 8px}
|
|
10
|
-
.cv-
|
|
11
|
-
/*
|
|
12
|
-
.cv-
|
|
13
|
-
.cv-
|
|
14
|
-
|
|
15
|
-
.cv-
|
|
16
|
-
.cv-
|
|
17
|
+
.cv-head .spacer{flex:1 1 0;min-width:0}
|
|
18
|
+
/* Session picker: one readable name; current and previous Sessions on demand */
|
|
19
|
+
.cv-pop.cv-picker{flex:0 1 auto;min-width:0;max-width:100%}
|
|
20
|
+
.cv-picker-btn{display:flex;align-items:center;gap:4px;min-width:0;height:30px;padding:0 6px 0 8px;border-radius:var(--r-sm);color:var(--ink);font-weight:600;font-size:var(--fs-md);cursor:pointer}
|
|
21
|
+
.cv-picker-btn:hover,.cv-picker[open]>.cv-picker-btn{background:var(--surface-3)}
|
|
22
|
+
.cv-picker-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
23
|
+
.cv-picker-chevron{width:13px;height:13px;flex:none;color:var(--ink-3)}
|
|
24
|
+
.cv-picker>.cv-popbody{left:0;top:calc(100% + 6px);width:min(320px,calc(100vw - 32px))}
|
|
25
|
+
.cv-session-list{display:grid;gap:1px}
|
|
26
|
+
.cv-session-opt{display:flex;align-items:center;gap:8px;width:100%;min-width:0;padding:6px 8px;border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink);text-align:left;cursor:pointer}
|
|
27
|
+
.cv-session-opt:hover,.cv-session-opt[aria-selected=true]{background:var(--surface-3)}
|
|
28
|
+
.cv-so-dot{width:7px;height:7px;border-radius:50%;flex:none;background:var(--idle)}
|
|
29
|
+
.cv-so-dot.is-active{background:var(--ok)}
|
|
30
|
+
.cv-so-dot.is-failed{background:var(--bad)}
|
|
31
|
+
.cv-so-text{flex:1;min-width:0;display:grid}
|
|
32
|
+
.cv-so-main,.cv-so-meta{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
33
|
+
.cv-so-main{font-size:var(--fs-sm)}
|
|
34
|
+
.cv-so-meta{color:var(--ink-3);font-size:var(--fs-2xs)}
|
|
35
|
+
.cv-so-check{width:14px;height:14px;flex:none}
|
|
36
|
+
.cv-more-sessions{justify-self:start}
|
|
37
|
+
.cv-back{display:inline-flex;align-items:center;gap:3px;flex:none;white-space:nowrap}
|
|
38
|
+
.cv-back .icon{width:13px;height:13px}
|
|
39
|
+
.cv-back[hidden]{display:none}
|
|
40
|
+
/* Status: a dot plus one word; the reason and observation time live in the tooltip */
|
|
41
|
+
.cv-status{flex:0 1 auto;min-width:0;max-width:40%;display:inline-flex;align-items:center;gap:6px;color:var(--ink-3);font-size:var(--fs-xs);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
17
42
|
.cv-status::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--idle);flex:none}
|
|
18
43
|
.cv-status.is-active::before{background:var(--ok)}
|
|
19
44
|
.cv-status.is-waiting::before{background:var(--warn)}
|
|
20
45
|
.cv-status.is-failed::before,.cv-status.is-unknown::before{background:var(--bad)}
|
|
21
46
|
.cv-status:empty{display:none}
|
|
22
|
-
|
|
23
|
-
.cv-
|
|
47
|
+
/* Details menu: labelled facts, then the exact identity for copying */
|
|
48
|
+
.cv-facts{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 10px;margin:0;padding:0 4px;font-size:var(--fs-xs)}
|
|
49
|
+
.cv-facts dt{color:var(--ink-3)}
|
|
50
|
+
.cv-facts dd{margin:0;min-width:0;display:grid;color:var(--ink);overflow-wrap:anywhere}
|
|
51
|
+
.cv-facts small{color:var(--ink-4);font-size:var(--fs-2xs)}
|
|
52
|
+
.cv-identity-row{display:flex;align-items:flex-start;gap:6px;padding:0 4px;min-width:0}
|
|
53
|
+
.cv-identity-row .cv-identity{flex:1;min-width:0;font-family:var(--font-mono)}
|
|
54
|
+
.cv-identity-row .cv-link{display:inline-flex;align-items:center;gap:3px;flex:none}
|
|
55
|
+
.cv-identity-row .icon{width:12px;height:12px}
|
|
56
|
+
.cv-older{position:absolute;z-index:1;top:6px;left:50%;transform:translateX(-50%);padding:3px 10px;border:1px solid var(--line-2);border-radius:var(--r-pill);background:var(--surface-2);box-shadow:var(--shadow-1)}
|
|
57
|
+
.cv-older[hidden]{display:none}
|
|
24
58
|
.cv-stage{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}
|
|
25
59
|
.cv-stage .feed{gap:18px;padding:12px 16px 20px}
|
|
26
60
|
.cv-jump{position:absolute;left:50%;bottom:10px;transform:translateX(-50%);width:32px;height:32px;display:grid;place-items:center;padding:0;border:1px solid var(--line-2);border-radius:50%;background:var(--surface-2);color:var(--ink);box-shadow:var(--shadow-1);cursor:pointer}
|
|
@@ -29,14 +63,16 @@ export const CONVERSATION_STYLES = `
|
|
|
29
63
|
.cv-note{margin:0;color:var(--ink-3);font-size:var(--fs-xs);overflow-wrap:anywhere}
|
|
30
64
|
.cv-link{padding:2px 4px;border:0;background:none;color:var(--ink-3);font-size:var(--fs-xs);cursor:pointer;border-radius:var(--r-xs)}
|
|
31
65
|
.cv-link:hover{color:var(--ink);background:var(--surface-3)}
|
|
32
|
-
.cv-link[hidden],.cv-stop[hidden],.cv-
|
|
66
|
+
.cv-link[hidden],.cv-stop[hidden],.cv-sub[hidden],.cv-pop[hidden]{display:none}
|
|
33
67
|
.cv-code{margin:6px 0 0;padding:8px 10px;max-height:200px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;border-radius:var(--r-sm);background:var(--sunken);font:var(--fs-xs)/1.5 var(--font-mono)}
|
|
68
|
+
.cv-note:empty{display:none}
|
|
34
69
|
.cv-identity{margin:0;color:var(--ink-4);font-size:var(--fs-2xs);overflow-wrap:anywhere}
|
|
35
70
|
/* Messages */
|
|
36
71
|
.cv-msg{min-width:0;overflow-wrap:anywhere}
|
|
37
72
|
.cv-user{align-self:flex-end;max-width:88%;display:flex;flex-direction:column;align-items:flex-end;gap:4px}
|
|
38
73
|
.cv-bubble{padding:9px 14px;border-radius:18px;background:var(--info-soft);color:var(--ink);font-size:var(--fs-md);line-height:1.5}
|
|
39
74
|
.cv-tag{color:var(--ink-4);font-size:var(--fs-2xs)}
|
|
75
|
+
/* A leading tagged context block folds to one line; the raw text stays one click away */
|
|
40
76
|
.cv-assistant{position:relative;font-size:var(--fs-md);line-height:1.6}
|
|
41
77
|
/* Copy: always visible under the newest message, a hover badge on older ones */
|
|
42
78
|
.cv-actions{display:flex;gap:2px;position:absolute;top:-6px;right:0;opacity:0;transition:opacity var(--t-fast)}
|
|
@@ -75,14 +111,27 @@ export const CONVERSATION_STYLES = `
|
|
|
75
111
|
/* An empty draft reads as inactive, like the reference composers */
|
|
76
112
|
.cv-box:has(.cv-input:placeholder-shown) .cv-send{background:var(--surface-3);color:var(--ink-4)}
|
|
77
113
|
.cv-send:disabled{background:var(--surface-3);color:var(--ink-4);cursor:default;opacity:1}
|
|
78
|
-
.cv-
|
|
79
|
-
.cv-
|
|
80
|
-
.cv-
|
|
81
|
-
.cv-
|
|
114
|
+
.cv-notice{display:flex;align-items:center;gap:6px;min-width:0;margin:0;padding:0 6px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
115
|
+
.cv-notice.is-warn{color:var(--warn)}
|
|
116
|
+
.cv-notice[hidden]{display:none}
|
|
117
|
+
.cv-notice .icon{width:13px;height:13px;flex:none}
|
|
118
|
+
.cv-notice>span{min-width:0;overflow-wrap:anywhere}
|
|
119
|
+
.cv-notice .cv-link{flex:none;margin-left:auto}
|
|
120
|
+
.cv-pill{display:inline-flex;align-items:center;gap:4px;max-width:220px;height:28px;padding:0 8px;border-radius:var(--r-pill);color:var(--ink-3);font-size:var(--fs-sm);list-style:none;cursor:pointer}
|
|
82
121
|
.cv-pill::-webkit-details-marker{display:none}
|
|
83
122
|
.cv-pill:hover,.cv-pop[open]>.cv-pill{background:var(--surface-3);color:var(--ink)}
|
|
84
123
|
.cv-pill .icon{width:13px;height:13px;flex:none}
|
|
124
|
+
.cv-model-state{flex:none;font-size:var(--fs-xs);font-weight:600;color:var(--ink-2)}
|
|
125
|
+
.cv-model-state[hidden]{display:none}
|
|
126
|
+
.cv-model[data-state=pending] .cv-model-state{color:var(--accent,var(--info))}
|
|
127
|
+
/* The model menu shrinks before the send button is pushed out; the state word stays whole and the model name ellipsizes */
|
|
128
|
+
.cv-pop.cv-model{flex:0 1 auto;min-width:0}
|
|
129
|
+
.cv-model>.cv-pill{max-width:min(220px,100%);box-sizing:border-box}
|
|
85
130
|
.cv-model-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
131
|
+
.cv-model-dot{width:6px;height:6px;border-radius:50%;flex:none;background:var(--ok)}
|
|
132
|
+
.cv-model[data-state=unknown] .cv-model-dot{background:var(--warn)}
|
|
133
|
+
.cv-model[data-state=pending] .cv-model-dot{background:var(--accent,var(--info))}
|
|
134
|
+
.cv-model[data-state=unknown] .cv-model-label{font-style:italic}
|
|
86
135
|
.cv-hint{display:flex;flex-wrap:wrap;align-items:center;gap:2px 8px;padding:0 6px;min-width:0}
|
|
87
136
|
.cv-hint:empty{display:none}
|
|
88
137
|
.cv-hint .cv-note:empty{display:none}
|
|
@@ -100,7 +149,37 @@ export const CONVERSATION_STYLES = `
|
|
|
100
149
|
.cv-pop>summary::-webkit-details-marker{display:none}
|
|
101
150
|
.cv-popbody{position:absolute;z-index:var(--z-popover);display:grid;gap:8px;width:min(300px,calc(100vw - 32px));max-height:min(420px,60vh);overflow:auto;padding:10px;border:1px solid var(--line-2);border-radius:var(--r-lg);background:var(--surface-2);box-shadow:var(--shadow-2);box-sizing:border-box}
|
|
102
151
|
.cv-attach>.cv-popbody{left:0;bottom:calc(100% + 8px)}
|
|
103
|
-
.cv-model>.cv-popbody{right:0;bottom:calc(100% + 8px)}
|
|
152
|
+
.cv-model>.cv-popbody{right:0;bottom:calc(100% + 8px);width:min(300px,calc(100vw - 24px));gap:0;padding:6px}
|
|
153
|
+
/* Model picker: two quiet facts, a short list, one action row. Background
|
|
154
|
+
polls update text in place and never toggle these controls. */
|
|
155
|
+
.cv-model .cv-model-facts{grid-template-columns:auto minmax(0,1fr);gap:5px 14px;align-items:baseline;margin:0;padding:8px 10px 10px;font-size:var(--fs-xs)}
|
|
156
|
+
.cv-model .cv-model-facts dt{color:var(--ink-3);white-space:nowrap}
|
|
157
|
+
.cv-model .cv-model-facts dd{display:flex;align-items:baseline;gap:8px;min-width:0}
|
|
158
|
+
.cv-mf-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);font-size:var(--fs-sm);font-weight:600}
|
|
159
|
+
.cv-mf-value.is-empty{color:var(--ink-3);font-weight:400}
|
|
160
|
+
.cv-model .cv-model-facts .cv-mf-note{flex:none;margin-left:auto;color:var(--ink-4);font-size:var(--fs-2xs);white-space:nowrap}
|
|
161
|
+
.cv-mf-note[hidden]{display:none}
|
|
162
|
+
.cv-model[data-state=pending] .cv-mf-note{color:var(--accent)}
|
|
163
|
+
.cv-model .cv-options{gap:2px;max-height:216px;overflow:auto;min-height:0;padding:6px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
|
|
164
|
+
.cv-model .cv-options:empty{display:none}
|
|
165
|
+
.cv-model .cv-option{gap:10px;min-height:36px;padding:6px 10px;font-size:var(--fs-sm);transition:background var(--t-fast),color var(--t-fast)}
|
|
166
|
+
.cv-model .cv-option:hover:not(:disabled){background:var(--surface-3)}
|
|
167
|
+
.cv-model .cv-option.is-selected{background:var(--accent-soft)}
|
|
168
|
+
.cv-model .cv-option.is-selected .cv-option-name{font-weight:600}
|
|
169
|
+
.cv-model .cv-option.is-selected .icon{color:var(--accent)}
|
|
170
|
+
.cv-model .cv-option:disabled{cursor:default;color:var(--ink-3)}
|
|
171
|
+
.cv-model .cv-option.is-selected:hover:not(:disabled){background:var(--accent-soft)}
|
|
172
|
+
.cv-model .cv-option:disabled:not(.is-selected){background:transparent}
|
|
173
|
+
.cv-option-mark{width:6px;height:6px;flex:none;border-radius:50%;background:transparent}
|
|
174
|
+
.cv-option.is-current .cv-option-mark{background:var(--ok)}
|
|
175
|
+
.cv-model .cv-option-id{display:block;flex:0 1 auto;min-width:0;max-width:45%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink-4);font:var(--fs-2xs)/1.4 var(--font-mono)}
|
|
176
|
+
.cv-model .cv-pop-actions{flex-wrap:wrap;justify-content:flex-end;gap:6px 8px;padding:8px 4px 2px 10px}
|
|
177
|
+
.cv-model-notes{flex:1 1 140px;min-width:0;display:grid;gap:2px}
|
|
178
|
+
.cv-model-notes:not(:has(.cv-note:not(:empty))){display:none}
|
|
179
|
+
.cv-model .cv-pop-actions .cv-link{flex:none}
|
|
180
|
+
.cv-model .cv-note:empty{display:none}
|
|
181
|
+
.cv-apply{height:28px;padding:0 12px;flex:none}
|
|
182
|
+
.cv-apply:disabled{background:var(--surface-3);color:var(--ink-4);opacity:1}
|
|
104
183
|
.cv-menu>.cv-popbody{right:0;top:calc(100% + 6px)}
|
|
105
184
|
.cv-pop-title{margin:0;padding:0 4px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
106
185
|
.cv-pop-actions{display:flex;align-items:center;justify-content:space-between;gap:8px}
|
|
@@ -123,11 +202,11 @@ export const CONVERSATION_STYLES = `
|
|
|
123
202
|
.cv-card label{display:grid;gap:4px}
|
|
124
203
|
.cv-card input,.cv-card select,.cv-card textarea{min-width:0;max-width:100%;box-sizing:border-box}
|
|
125
204
|
/* Keyboard focus */
|
|
126
|
-
.cv-iconbtn:focus-visible,.cv-send:focus-visible,.cv-stop:focus-visible,.cv-jump:focus-visible,.cv-pill:focus-visible,.cv-option:focus-visible,.cv-link:focus-visible,.cv-cmd:focus-visible,.cv-x:focus-visible,.cv-activity>summary:focus-visible,.cv-sub>summary:focus-visible{outline:none;box-shadow:var(--focus)}
|
|
127
|
-
.cv-session:focus-visible{box-shadow:var(--focus)}
|
|
205
|
+
.cv-iconbtn:focus-visible,.cv-send:focus-visible,.cv-stop:focus-visible,.cv-jump:focus-visible,.cv-pill:focus-visible,.cv-option:focus-visible,.cv-link:focus-visible,.cv-cmd:focus-visible,.cv-x:focus-visible,.cv-activity>summary:focus-visible,.cv-sub>summary:focus-visible,.cv-picker-btn:focus-visible,.cv-session-opt:focus-visible{outline:none;box-shadow:var(--focus)}
|
|
128
206
|
.cv-input:focus-visible{outline:none;box-shadow:none}
|
|
129
207
|
@media(max-width:760px){
|
|
130
208
|
.cv-user{max-width:94%}
|
|
209
|
+
.cv-status{max-width:30%}
|
|
131
210
|
.cv-composer{padding-bottom:max(12px,env(safe-area-inset-bottom,0px))}
|
|
132
211
|
}
|
|
133
212
|
`;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* DOCK VIEW — the Discussion pane: its sub-header, the message feed with day
|
|
3
3
|
* separators and bubbles, the composer, submission facets and next steps.
|
|
4
|
-
* The
|
|
4
|
+
* The session page is views/conversation and views/terminal; the dock frame is layout/workspace.
|
|
5
5
|
*/
|
|
6
6
|
export const DOCK_STYLES = `
|
|
7
|
-
.dock-head{height:auto;min-height:var(--header-h);padding-top:6px;padding-bottom:6px
|
|
7
|
+
.dock-head{height:auto;min-height:var(--header-h);padding-top:6px;padding-bottom:6px}
|
|
8
8
|
.dock-actions{flex-shrink:0}
|
|
9
9
|
/* Who the panel talks to: a title-like menu button with its target list */
|
|
10
10
|
.dock-target{position:relative;min-width:0}
|
|
@@ -24,9 +24,21 @@ export const DOCK_STYLES = `
|
|
|
24
24
|
.dock-target-item:hover{background:var(--surface-3);color:var(--ink)}
|
|
25
25
|
.dock-target-item[aria-pressed="true"]{color:var(--ink);font-weight:550}
|
|
26
26
|
.dock-target-item .dock-target-check{color:var(--accent)}
|
|
27
|
-
.dock-
|
|
28
|
-
.dock-
|
|
29
|
-
|
|
27
|
+
.dock-target-dot{width:7px;height:7px;margin:0 4px;flex:none;border-radius:50%;background:var(--idle)}
|
|
28
|
+
.dock-target-dot.is-live{background:var(--ok)}
|
|
29
|
+
/* One header row: target, view tabs, actions. The target's name wins space
|
|
30
|
+
first: icon-only tabs up to 480px, the selected label up to 560px, then
|
|
31
|
+
every label. Tabs keep aria-label and title at every width. */
|
|
32
|
+
.dock{container-type:inline-size;container-name:dock}
|
|
33
|
+
.dock-target{flex:0 1 auto}
|
|
34
|
+
.dock-tabs{flex:0 0 auto;display:flex;min-width:0;margin-left:auto}
|
|
35
|
+
.dock-tabs .seg-btn{justify-content:center;gap:5px;min-width:0}
|
|
36
|
+
.dock-tabs .seg-btn .icon{width:14px;height:14px;flex:none}
|
|
37
|
+
.dock-tabs .seg-btn[aria-selected="false"]>span{display:none}
|
|
38
|
+
.dock-tabs .seg-btn>span{white-space:nowrap}
|
|
39
|
+
@container dock (min-width:560px){.dock-tabs .seg-btn[aria-selected="false"]>span{display:inline}}
|
|
40
|
+
@container dock (max-width:480px){.dock-tabs .seg-btn>span{display:none}}
|
|
41
|
+
@container dock (max-width:340px){.dock-target-icon{display:none}}
|
|
30
42
|
.dock-preview{display:flex;flex-direction:column;min-height:0;overflow:auto}
|
|
31
43
|
.dock-preview>.feed-note{text-align:left;padding:0 12px;color:var(--ink-3)}
|
|
32
44
|
.preview-services{flex:none;max-height:40%;overflow:auto}
|
|
@@ -9,8 +9,7 @@ export const TASK_STYLES = `
|
|
|
9
9
|
and frosting the content scrolling beneath them. */
|
|
10
10
|
.tabs-wrap{position:sticky;margin:0 calc(-1 * var(--gutter));padding:0 var(--gutter);background:var(--canvas)}
|
|
11
11
|
.dock-toggle{height:30px}
|
|
12
|
-
.
|
|
13
|
-
.operator-toggle[aria-pressed="true"]{background:var(--accent-soft);color:var(--accent)}
|
|
12
|
+
.operator-toggle[aria-pressed="true"],.panel-toggle[aria-expanded="true"]{background:var(--accent-soft);color:var(--accent)}
|
|
14
13
|
.task-hero{padding:28px 0 18px}
|
|
15
14
|
.task-title{font-size:var(--fs-2xl);font-weight:650;letter-spacing:-.025em;line-height:1.25;overflow-wrap:anywhere}
|
|
16
15
|
.task-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:12px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DEFAULT_DARK_THEME } from "../../shared/themes.js";
|
|
2
2
|
const SESSION_TONES = DEFAULT_DARK_THEME.tokens;
|
|
3
3
|
/*
|
|
4
|
-
* TERMINAL VIEW — the
|
|
4
|
+
* TERMINAL VIEW — the session page's terminal mode. It renders a native terminal, so it
|
|
5
5
|
* stays dark in every theme: its chrome uses a scoped palette (white alphas
|
|
6
6
|
* and the default dark theme's status colours) instead of theme tokens.
|
|
7
7
|
*/
|
|
@@ -9,13 +9,15 @@ export const TERMINAL_STYLES = `
|
|
|
9
9
|
.dock-session{background:var(--term-bg);color:#e6e6e8;--chrome-line:rgba(255,255,255,.07);--chrome-ok:${SESSION_TONES.ok};--chrome-info:${SESSION_TONES.info};--chrome-bad:${SESSION_TONES.bad}}
|
|
10
10
|
.dock-session .faint{color:rgba(255,255,255,.4)}
|
|
11
11
|
|
|
12
|
-
/*
|
|
12
|
+
/* Header row: the selected Session, the connection state, the mode switch */
|
|
13
13
|
.session-bar{flex:none;display:flex;align-items:center;gap:8px;min-height:44px;padding:6px 10px;border-bottom:1px solid var(--chrome-line)}
|
|
14
|
-
.session-
|
|
15
|
-
.
|
|
16
|
-
.
|
|
17
|
-
.
|
|
18
|
-
.
|
|
14
|
+
.session-bar .spacer{flex:1 1 0;min-width:0}
|
|
15
|
+
.sp-term-icon{width:14px;height:14px;flex:none;color:rgba(255,255,255,.45)}
|
|
16
|
+
.sp-term-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fff;font-size:var(--fs-sm);font-weight:600}
|
|
17
|
+
.dock-session .sp-modes{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.1)}
|
|
18
|
+
.dock-session .sp-modes .seg-btn{color:rgba(255,255,255,.62)}
|
|
19
|
+
.dock-session .sp-modes .seg-btn:hover{color:#fff}
|
|
20
|
+
.dock-session .sp-modes .seg-btn[aria-checked="true"]{background:rgba(255,255,255,.14);color:#fff;box-shadow:none}
|
|
19
21
|
.conn{display:inline-flex;align-items:center;gap:6px;flex:none;color:rgba(255,255,255,.6);font-size:var(--fs-xs);font-weight:500}
|
|
20
22
|
.conn i{width:7px;height:7px;border-radius:50%;background:rgba(255,255,255,.3)}
|
|
21
23
|
.conn[data-state="connecting"] i{background:var(--warn);animation:m-blink 1s infinite}
|
|
@@ -33,6 +35,8 @@ export const TERMINAL_STYLES = `
|
|
|
33
35
|
.terminal-empty .icon{color:rgba(255,255,255,.35)}
|
|
34
36
|
.terminal-empty-title{color:#fff;font-weight:600}
|
|
35
37
|
.terminal-empty-text{max-width:300px;font-size:var(--fs-xs);line-height:1.5}
|
|
38
|
+
.terminal-empty[hidden]{display:none}
|
|
39
|
+
.terminal-empty .btn{margin-top:4px}
|
|
36
40
|
.session-foot{flex:none;display:flex;align-items:center;gap:8px;padding:8px 12px;border-top:1px solid var(--chrome-line);color:rgba(255,255,255,.45);font-size:var(--fs-2xs)}
|
|
37
|
-
.session-foot code{color:rgba(255,255,255,.8);user-select:all}
|
|
41
|
+
.session-foot code{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:rgba(255,255,255,.8);user-select:all}
|
|
38
42
|
`;
|
|
@@ -91,6 +91,7 @@ export function conversationSessions(set) {
|
|
|
91
91
|
endReason: session.endReason, createdAt: session.createdAt,
|
|
92
92
|
executionAuthority: session.effective.executionAuthority,
|
|
93
93
|
launchModel: session.effective.model ?? null,
|
|
94
|
+
launchEffort: session.effective.effort ?? null,
|
|
94
95
|
current: set.sessions[set.activeAgentId] === session,
|
|
95
96
|
conversationEpoch: set.providerBinding?.conversations.find(c => c.conversationId === session.nativeSessionId)?.epoch ?? null }));
|
|
96
97
|
}
|
package/dist/web/webSettings.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { isEnabled } from "../role/availability.js";
|
|
2
3
|
import { CONFIG_DOMAINS, configDefinitionsForDomain } from "../config/configCatalog.js";
|
|
3
4
|
import { effectiveConfigData, runConfigCommand } from "../commands/configCommands.js";
|
|
4
5
|
import { runAgentCommand } from "../commands/agentCommands.js";
|
|
@@ -9,8 +10,8 @@ import { staticAgentConfigurationFields } from "../executor/agentConfigurationFi
|
|
|
9
10
|
import { validateAgentLaunchConfiguration } from "../executor/agentConfigurationCatalog.js";
|
|
10
11
|
import { resolveAgentProfileView } from "../profile/agentProfileRuntime.js";
|
|
11
12
|
import { webLocalMutation, WebRequestRejected } from "./webMutation.js";
|
|
12
|
-
const ROLE_NOTICE = "
|
|
13
|
-
const PROFILE_NOTICE = "Profile
|
|
13
|
+
const ROLE_NOTICE = "Disabling blocks new execution and template selection, without stopping running Sessions or discarding input. Enable allows normal scheduling, not an immediate Session start. Existing Task bindings are unchanged. Launch settings apply to a subsequent launch; no Session is restarted here.";
|
|
14
|
+
const PROFILE_NOTICE = "Disabling prevents new Profile application. A Profile is a template, not a process. Existing Task Roles are not rebound or stopped. Inherited runtime requires an enabled global Worker when applied. Reset preserves enabled state.";
|
|
14
15
|
const AGENT_NOTICE = "Command, arguments and environment references apply to subsequent Host processes. Authentication remains with the native Agent. Only reference names and presence in the Controller environment are shown; no environment values are returned.";
|
|
15
16
|
/** A view adapter over existing commands, not another writable configuration store. */
|
|
16
17
|
export function createWebSettings(store, options) {
|
|
@@ -84,6 +85,7 @@ export function createWebSettings(store, options) {
|
|
|
84
85
|
notice = ROLE_NOTICE;
|
|
85
86
|
const specs = roleOptionSpecs({ update: true, includeWorkspace: true });
|
|
86
87
|
fields = [
|
|
88
|
+
{ ...field("enabled", isEnabled(role), "boolean"), summary: ROLE_NOTICE },
|
|
87
89
|
{ ...field("activeAgentId", role.activeAgentId), choices: store.listConfiguredAgents().map(a => a.id),
|
|
88
90
|
summary: "Explicit global Role Agent selection. Save this field alone, then edit the selected Agent's settings. Existing live-session and lifecycle guards apply; no Task is rebound." },
|
|
89
91
|
field("workspace", role.workspace),
|
|
@@ -109,6 +111,7 @@ export function createWebSettings(store, options) {
|
|
|
109
111
|
notice = PROFILE_NOTICE;
|
|
110
112
|
agentId = view.runtime.status === "resolved" ? view.runtime.binding.agentId : undefined;
|
|
111
113
|
fields = [
|
|
114
|
+
{ ...field("enabled", isEnabled(profile), "boolean"), summary: PROFILE_NOTICE },
|
|
112
115
|
{ ...field("access", profile.defaultAccess), choices: ["read", "write"] },
|
|
113
116
|
{ ...field("description", profile.description ?? "", "multiline"), reset: true },
|
|
114
117
|
{ ...field("instructions", profile.instructions ?? "", "multiline"), reset: true },
|
|
@@ -287,6 +290,11 @@ function objectArguments(id, changes) {
|
|
|
287
290
|
if (CONFIG_DOMAINS.includes(id))
|
|
288
291
|
return [];
|
|
289
292
|
return changes.flatMap(c => {
|
|
293
|
+
if ((id.startsWith("role/") || id.startsWith("profile/")) && c.key === "enabled") {
|
|
294
|
+
if (typeof c.value !== "boolean")
|
|
295
|
+
throw new WebRequestRejected("Enabled must be a boolean.");
|
|
296
|
+
return ["--enabled", String(c.value)];
|
|
297
|
+
}
|
|
290
298
|
if (id.startsWith("role/") && c.key === "activeAgentId")
|
|
291
299
|
return [];
|
|
292
300
|
if (id.startsWith("agent/")) {
|
|
@@ -526,6 +526,16 @@ conversation unrecoverable. The request is legal while an AgentRun is active,
|
|
|
526
526
|
the Session is ended, or previous cleanup is pending. A Leader may also request
|
|
527
527
|
its own replacement and end its current turn.
|
|
528
528
|
|
|
529
|
+
For a Draft Leader whose planning Run has already ended, the replacement
|
|
530
|
+
initialization notification admits the selected fresh Session after confirmed
|
|
531
|
+
cleanup. It does not create another business Run, activate the Task, or adopt a
|
|
532
|
+
delivery workspace: the successor retains planning-only authority and reads
|
|
533
|
+
current Task context and retained inbox originals before handling them. Ordinary
|
|
534
|
+
Draft notifications and unscoped native hooks cannot use this admission.
|
|
535
|
+
A rejected startup retains the notification for explicit `task wake retry`
|
|
536
|
+
after correction, or another legal Session replacement; unknown input acceptance
|
|
537
|
+
never becomes permission to replay.
|
|
538
|
+
|
|
529
539
|
`task role session stop` can also stop a running Role without first changing
|
|
530
540
|
its Run status. It retains the native conversation for possible reuse. Pending
|
|
531
541
|
Messages remain intent and may start a continuation after the stop; use Task
|
|
@@ -400,6 +400,12 @@ Run 的普通 Leader 通知。未知的原生状态阻塞清理;仅停止一
|
|
|
400
400
|
一种偏好,而不是要求证明旧对话不可恢复。该请求在 AgentRun 活动、Session 已结束或
|
|
401
401
|
上一次清理待处理时都是合法的。Leader 也可以请求替换自己并结束当前轮次。
|
|
402
402
|
|
|
403
|
+
对于 planning Run 已结束的 Draft Leader,替换初始化通知在确认清理后允许所选的新
|
|
404
|
+
Session 登记。它不会新增业务 Run、激活 Task 或接纳 delivery 工作区;后继仍只有
|
|
405
|
+
planning 权限,先读取当前 Task 上下文和保留的信箱原文,再处理输入。普通 Draft 通知
|
|
406
|
+
和无启动范围的原生 hook 不能借用此准入。启动被拒绝时保留通知,修正原因后可显式
|
|
407
|
+
`task wake retry`,或再次合法替换 Session;接受状态未知的输入始终不能据此重放。
|
|
408
|
+
|
|
403
409
|
`task role session stop` 也可以在不先更改 Run 状态的情况下停止一个运行中的 Role。它
|
|
404
410
|
保留原生对话以备复用。待处理的 Message 仍是意图,可以在停止后启动一次 continuation;
|
|
405
411
|
当整个 Task 都必须保持暂停时,使用 Task execution stop。对于自我替换,使用异步的
|
package/docs/release-workflow.md
CHANGED
|
@@ -51,6 +51,30 @@ 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.17.0 compatibility and migration notes
|
|
55
|
+
|
|
56
|
+
This minor adds persistent Role/Profile enable and disable controls in CLI and
|
|
57
|
+
Web settings. Use `yui config role enable|disable`, `yui config profile
|
|
58
|
+
enable|disable`, and `yui task role enable|disable` with the relevant identity.
|
|
59
|
+
Disabled templates cannot be selected for new bindings; existing Task Role
|
|
60
|
+
copies remain independent. Disabling a Role prevents new execution and pauses
|
|
61
|
+
eligible pending work; it does not kill a running Turn, discard pending input,
|
|
62
|
+
block exact terminal recording or erase inspection/claim/acknowledgement access.
|
|
63
|
+
Re-enabling resumes eligible work under its existing authority and retry budgets,
|
|
64
|
+
without replaying accepted or unknown input.
|
|
65
|
+
|
|
66
|
+
Storage advances from **1.21 to 1.22** through the centralized additive migration
|
|
67
|
+
for optional `enabled` fields. Existing records without the field remain enabled;
|
|
68
|
+
their historical payloads are preserved. With separate upgrade authorization,
|
|
69
|
+
use `yui update --version 2.17.0`; the updater owns preflight, backup, migration
|
|
70
|
+
and Controller handover. Do not open the upgraded Home with an older binary.
|
|
71
|
+
|
|
72
|
+
The release also includes the merged Draft planning Session replacement repair
|
|
73
|
+
and stronger behavioral-constraint/real-path review handoffs. Validation uses
|
|
74
|
+
deterministic tests and the exact-tarball fresh-install matrix, not real-model
|
|
75
|
+
behavior. Publishing does not update the global CLI, migrate a production Home,
|
|
76
|
+
restart its Controller or deploy a production Web listener.
|
|
77
|
+
|
|
54
78
|
### 2.16.0 compatibility and migration notes
|
|
55
79
|
|
|
56
80
|
This minor refreshes the Web workbench (PR #484). One global navigation rail
|
|
@@ -36,6 +36,25 @@ Agent 选择一个预先声明的计划,设施从持久状态驱动该计划
|
|
|
36
36
|
不能将不兼容冒称为兼容,也不为回避版本选择新增历史兼容机制。包版本与协议、
|
|
37
37
|
持久存储契约仍然独立:兼容性检查和必要迁移要求不变,下文存储规则不授予发版权限。
|
|
38
38
|
|
|
39
|
+
### 2.17.0 兼容性及迁移说明
|
|
40
|
+
|
|
41
|
+
本 minor 在 CLI 和 Web 设置中新增持久化的 Role/Profile 启用、停用控制。
|
|
42
|
+
可使用 `yui config role enable|disable`、`yui config profile enable|disable`
|
|
43
|
+
及 `yui task role enable|disable`,并指定对应身份。停用的模板不可用于新绑定;
|
|
44
|
+
已复制到 Task 的 Role 保持独立。停用 Role 会阻止新的执行并暂停符合条件的待执行工作,
|
|
45
|
+
但不杀死正在运行的 Turn、不丢弃待处理输入、不阻止精确终态补录,也不移除查看、
|
|
46
|
+
claim 和 ACK 权限。重新启用后,符合条件的工作按原有权限和重试预算继续,
|
|
47
|
+
不会重放已接受或结果未知的输入。
|
|
48
|
+
|
|
49
|
+
存储通过集中式增量迁移从 **1.21 升至 1.22**,加入可选的 `enabled` 字段。
|
|
50
|
+
没有该字段的已有记录仍视为启用,历史载荷保持不变。另行获得升级授权后,可使用
|
|
51
|
+
`yui update --version 2.17.0`;updater 负责预检、备份、迁移与 Controller 交接。
|
|
52
|
+
不得使用旧二进制打开升级后的 Home。
|
|
53
|
+
|
|
54
|
+
本次发布还包含已合入的 Draft 规划 Session 替换修复,以及强化行为约束和真实调用路径的
|
|
55
|
+
审查交接说明。验证依据为确定性测试与精确 tarball 的全新安装矩阵,不代表真实模型行为验证。
|
|
56
|
+
发布本身不会更新全局 CLI、迁移生产 Home、重启其 Controller 或部署生产 Web listener。
|
|
57
|
+
|
|
39
58
|
### 2.16.0 兼容性及迁移说明
|
|
40
59
|
|
|
41
60
|
本 minor 更新 Web 工作台(PR #484):工作台与管理页共用一条全局导航栏
|
|
@@ -18,7 +18,51 @@ requiring a same-named global Role. A global Role is a creation template only
|
|
|
18
18
|
when the requested Task Role does not exist. Availability, producer separation
|
|
19
19
|
and the frozen review candidate still apply.
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## Enable and disable
|
|
22
|
+
|
|
23
|
+
Availability is configuration, separate from active Agent selection, Session
|
|
24
|
+
activity and the Task execution gate:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
yui config role disable worker
|
|
28
|
+
yui config role enable worker
|
|
29
|
+
yui config profile disable implementer
|
|
30
|
+
yui config profile enable implementer
|
|
31
|
+
yui task role disable task-1 reviewer
|
|
32
|
+
yui task role enable task-1 reviewer
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`update --enabled true|false` uses the same rules. Repeating an enable/disable
|
|
36
|
+
is a no-op. Settings → Role/Profile exposes the same boolean with its scope.
|
|
37
|
+
List/show keeps disabled entries visible; application selectors exclude them.
|
|
38
|
+
|
|
39
|
+
A disabled Global Role cannot start/resume execution, receive a new automatic
|
|
40
|
+
Turn, or create a new Task binding from that template. This includes Operator,
|
|
41
|
+
Leader, Worker and Job-owned Roles. An existing Task Role instead uses its own
|
|
42
|
+
flag, even when its original template is disabled. A disabled Profile cannot be
|
|
43
|
+
applied; inherited runtime also requires an enabled Global Worker. Explicit
|
|
44
|
+
Agent Profiles also require an enabled Worker when copying a matching Worker
|
|
45
|
+
binding's options; an explicit Agent without such a binding uses its own defaults.
|
|
46
|
+
No fallback Agent, account or reviewer is chosen.
|
|
47
|
+
|
|
48
|
+
Disabling never kills a Session, cancels a Run, settles a claim, acknowledges
|
|
49
|
+
input or discards unknown delivery evidence. Current execution can finish and
|
|
50
|
+
report. New delivery and automatic recovery wait; retry budgets are not reset
|
|
51
|
+
or extended. Use the existing stop/interrupt operations when stopping is intended.
|
|
52
|
+
Enabling does not start an empty Session, activate a Draft, reopen a completed
|
|
53
|
+
Task, override a Task stop, or replay accepted/unknown effects. Normal scheduling
|
|
54
|
+
continues only where existing lifecycle, authority and exact-input fences allow.
|
|
55
|
+
|
|
56
|
+
All settings remain editable while disabled. Profile reset restores builtin
|
|
57
|
+
content but preserves enabled state; initialization and upgrades do not revive
|
|
58
|
+
disabled entries. Deletion retains its existing reference checks. Missing
|
|
59
|
+
`enabled` in older records means enabled; storage 1.21 → 1.22 adds this optional
|
|
60
|
+
field without rewriting old records or frozen Session/context evidence.
|
|
61
|
+
If Operator or a Task Leader is disabled, use the authorized local CLI/Web
|
|
62
|
+
configuration entry to re-enable it; a disabled critical responsibility is not
|
|
63
|
+
silently replaced or considered completed.
|
|
64
|
+
|
|
65
|
+
## Profile behavior
|
|
22
66
|
|
|
23
67
|
An Agent Profile combines portable behavior—instructions, Skills and access
|
|
24
68
|
intent—with runtime intent. Runtime either follows the current Global Worker
|
|
@@ -15,6 +15,41 @@ Task Role 是 Task 局部的;global Role 提供已配置的默认值和全局
|
|
|
15
15
|
的 global Role。只有当请求的 Task Role 不存在时,global Role 才作为创建模板。
|
|
16
16
|
可用性、producer 分离和冻结的审查候选仍然适用。
|
|
17
17
|
|
|
18
|
+
## 启用与停用
|
|
19
|
+
|
|
20
|
+
启停是配置状态,与 Active Agent、Session 是否运行和 Task executionGate 分开:
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
yui config role disable worker
|
|
24
|
+
yui config role enable worker
|
|
25
|
+
yui config profile disable implementer
|
|
26
|
+
yui config profile enable implementer
|
|
27
|
+
yui task role disable task-1 reviewer
|
|
28
|
+
yui task role enable task-1 reviewer
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`update --enabled true|false` 使用相同规则;重复启停不产生变化。
|
|
32
|
+
Web 设置页的 Role/Profile 提供同一开关和作用域提示。
|
|
33
|
+
list/show 保留停用项供查看和恢复,应用选择器不提供不可用项。
|
|
34
|
+
|
|
35
|
+
Global Role 停用阻止它自身的新启动、恢复、自动 Turn,以及从该模板新建 Task
|
|
36
|
+
绑定;Operator、Leader、Worker 和 Job-owned Role 同样适用。已复制的 Task Role
|
|
37
|
+
以自身开关为准,不随模板停用。Profile 停用后不能新应用;动态继承还要求 Global
|
|
38
|
+
Worker 可用。显式 Agent Profile 若复制匹配 Worker 绑定的配置选项,也要求
|
|
39
|
+
Worker 启用;没有匹配绑定的显式 Agent 使用其默认配置。不偷偷切换 Agent、账号或审查角色。
|
|
40
|
+
|
|
41
|
+
停用不强停 Session、不取消 Run、不消费 claim/ACK,也不丢弃未知投递证据。
|
|
42
|
+
运行中的执行可以正常收尾和报告;新投递及自动恢复等待,原重试预算不重置或延长。
|
|
43
|
+
需要停止时使用既有 stop/interrupt。启用不是立即启动空 Session,不激活 Draft、
|
|
44
|
+
重开已完成 Task、解除 Task 停止或重放已接受/未知效果;仅允许原调度在原生命周期、
|
|
45
|
+
权限及准确输入约束内继续。
|
|
46
|
+
|
|
47
|
+
停用期间仍可编辑配置。Profile reset 恢复内置内容但保留启停状态;初始化、升级
|
|
48
|
+
不会复活停用项。删除沿用已有引用检查。旧记录缺少 `enabled` 默认启用,
|
|
49
|
+
存储 1.21 → 1.22 只声明新增可选字段,不改写历史记录、冻结 Session 或上下文。
|
|
50
|
+
若 Operator/Task Leader 被停用,可由有权限的本地 CLI/Web 配置入口恢复;
|
|
51
|
+
系统不会跳过关键职责、换人或假定完成。
|
|
52
|
+
|
|
18
53
|
## Profile
|
|
19
54
|
|
|
20
55
|
Agent Profile 把可移植行为(指令、Skill 和访问意图)与运行时意图组合在一起。
|
package/docs/storage-baseline.md
CHANGED
|
@@ -2,7 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
# Storage baseline 1.0
|
|
4
4
|
|
|
5
|
-
Current storage is 1.
|
|
5
|
+
Current storage is 1.22. The 1.21 → 1.22 transition admits an optional boolean
|
|
6
|
+
`enabled` on Roles and Profiles. Absence means enabled. SQL layout, historical
|
|
7
|
+
payloads, existing Task bindings, Session snapshots and input receipts are
|
|
8
|
+
unchanged; upgrade does not launch or stop execution.
|
|
9
|
+
|
|
10
|
+
The 1.20 → 1.21 transition converts provably unedited
|
|
6
11
|
built-in Project sync defaults to timezone-explicit clock schedules, archiving
|
|
7
12
|
their original bytes under migration 21. Ambiguous higher revisions and custom
|
|
8
13
|
plans remain unchanged; no Git work or reauthorization occurs. See
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
# 存储基线 1.0
|
|
4
4
|
|
|
5
|
-
当前存储为 1.
|
|
5
|
+
当前存储为 1.22。1.21 → 1.22 为 Role/Profile 声明可选布尔字段 `enabled`,
|
|
6
|
+
缺省表示启用。SQL 布局、历史 payload、已有 Task 绑定、Session 快照和输入回执
|
|
7
|
+
保持不变;升级不启动或停止执行。
|
|
8
|
+
|
|
9
|
+
1.20 → 1.21 将可证明未经修改的旧内置 Project 同步默认计划
|
|
6
10
|
转换为显式时区的整点计划,在 migration 21 下归档原始字节。更高 revision 的
|
|
7
11
|
来源不明确计划及自定义计划保留,不执行 Git 或重新授权。保守转换边界见
|
|
8
12
|
[Project 同步](project-sync.zh-CN.md)。
|
|
@@ -14,7 +14,9 @@ may benefit from a short Task artifact index:
|
|
|
14
14
|
|
|
15
15
|
- Goal/non-goals and effective decision references.
|
|
16
16
|
- Observable scenarios, expected behavior and independent contract sources.
|
|
17
|
-
-
|
|
17
|
+
- For cross-layer/async risks, a short actual path: entry, consumers, relevant
|
|
18
|
+
waits/atomic commits, result and failure/recovery consequences, linked to
|
|
19
|
+
candidate code or existing documentation.
|
|
18
20
|
- Candidate identity and actual check results (commit, environment, command,
|
|
19
21
|
result), distinguishing unexecuted scenarios and uncovered boundaries.
|
|
20
22
|
- For full re-review: repair delta, previous findings' dispositions and still
|
|
@@ -29,6 +31,38 @@ Later Brief/decision edits do not change an existing Review snapshot. This is
|
|
|
29
31
|
not a document-completeness gate, prose parser or Skill-version freeze.
|
|
30
32
|
Ordinary full review and the existing equivalence Delta Recheck remain distinct.
|
|
31
33
|
|
|
34
|
+
### Keep the material small and actionable
|
|
35
|
+
|
|
36
|
+
These are examples, not mandatory sections or a scenario quota. A simple E01
|
|
37
|
+
handoff can cite its half-open interval contract and `main.mjs/select` directly:
|
|
38
|
+
the caller supplies bounds and receives rows; timezone conversion is a non-goal.
|
|
39
|
+
No separate path document is needed.
|
|
40
|
+
|
|
41
|
+
For E03, the contract requires unchanged opaque cursors and ordered items.
|
|
42
|
+
The actual path is caller -> `main.mjs/collect` -> await
|
|
43
|
+
`page.mjs/fetchPage(cursor)` -> consume items/cursor -> next request or return.
|
|
44
|
+
There is no persistent commit. Check the cursor at the downstream consumer,
|
|
45
|
+
not merely the first successful page; a rejected request rejects collection,
|
|
46
|
+
so accumulated rows are not returned as success. Retry/concurrent mutation is
|
|
47
|
+
outside this example's contract. The index is a navigation hint, not a finding
|
|
48
|
+
or a claim that all paths were inspected.
|
|
49
|
+
|
|
50
|
+
Keep evidence roles separate: that contract is the expectation;
|
|
51
|
+
`scripts/review-eval/verify.mjs`'s E03 probes are executable references;
|
|
52
|
+
only an actual `node scripts/review-eval/evaluate.mjs verify` invocation plus its
|
|
53
|
+
candidate commit, environment and output establishes a result. The probes use
|
|
54
|
+
the two supplied modules for the counterexample, a one-page normal control,
|
|
55
|
+
and a controlled wait followed by rejection to check pending/failure behavior.
|
|
56
|
+
They do not exercise a live server, crash recovery or Reviewer behavior.
|
|
57
|
+
|
|
58
|
+
In a pause/resume task, constraints might instead distinguish unsubmitted
|
|
59
|
+
intent, registered/unknown effects, terminal settlement and legal resumption.
|
|
60
|
+
Those are domain-specific examples, not universal state-machine requirements.
|
|
61
|
+
Use the task's own contract and reachable paths. After a shared-root finding,
|
|
62
|
+
check the other affected consumers in the same scope and refresh the small
|
|
63
|
+
index and repair evidence; do not append the entire review history. Reviewer
|
|
64
|
+
inspection still covers the complete frozen candidate, not just these hints.
|
|
65
|
+
|
|
32
66
|
## Small development corpus
|
|
33
67
|
|
|
34
68
|
`scripts/review-eval/` is an offline file tool, not a scheduler, model adapter or
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
|
|
13
13
|
- 目标/非目标及有效决定入口。
|
|
14
14
|
- 可观察场景、预期行为和独立契约依据。
|
|
15
|
-
-
|
|
15
|
+
- 对跨层/异步风险,提供简短实际链路:入口、消费者、关键等待/原子提交边界、
|
|
16
|
+
结果及失败/恢复后果,并指向候选代码或已有文档。
|
|
16
17
|
- 候选身份和实际检查结果(提交、环境、命令、结果),区分未执行场景与未覆盖边界。
|
|
17
18
|
- 完整复审追加修复 delta、历史 Findings 处置及仍适用证据;当前完整冻结候选仍在范围内。
|
|
18
19
|
|
|
@@ -23,6 +24,29 @@
|
|
|
23
24
|
后续 Brief/决定修改不改变既有 Review Snapshot。这不是文档齐全门禁、
|
|
24
25
|
自然语言解析器或 Skill 版本冻结机制。普通完整复审与已有等价性 Delta Recheck 保持不同语义。
|
|
25
26
|
|
|
27
|
+
### 保持材料简短且可用
|
|
28
|
+
|
|
29
|
+
以下是示例,不是必填章节或场景配额。简单的 E01 交接可直接引用半开区间契约和
|
|
30
|
+
`main.mjs/select`:调用方提供边界并接收行,时区转换是非目标,无须另写链路文档。
|
|
31
|
+
|
|
32
|
+
E03 的契约要求原样传递不透明游标并按顺序返回条目。实际链路是:
|
|
33
|
+
调用方 -> `main.mjs/collect` -> 等待 `page.mjs/fetchPage(cursor)` ->
|
|
34
|
+
消费条目/游标 -> 下一次请求或返回。这里没有持久化提交。
|
|
35
|
+
应检查下游消费者收到的游标,而不只是首个成功页面;请求拒绝时收集操作拒绝,
|
|
36
|
+
已累计条目不会作为成功结果返回。重试/并发修改不属于此例契约。
|
|
37
|
+
索引只是定位提示,不是缺陷结论,也不声称已检查所有路径。
|
|
38
|
+
|
|
39
|
+
分清证据身份:上述契约是预期;`scripts/review-eval/verify.mjs` 的 E03
|
|
40
|
+
探针是可执行引用;只有实际运行 `node scripts/review-eval/evaluate.mjs verify`
|
|
41
|
+
并保留候选提交、环境和输出才构成结果。探针用给定的两个模块验证反例,
|
|
42
|
+
提供单页正常对照,以及可控等待后拒绝的未完成/失败行为检查;
|
|
43
|
+
不覆盖真实服务、崩溃恢复或 Reviewer 行为。
|
|
44
|
+
|
|
45
|
+
暂停/恢复类任务的约束可能分别要求:未提交意图保留、已登记/未知效果不重放、
|
|
46
|
+
已有执行允许终态收尾、恢复后沿合法意图继续。这些是领域示例,不是通用状态机要求。
|
|
47
|
+
应以本任务契约和可达路径为依据。同根因发现后检查同范围内其他受影响消费者,
|
|
48
|
+
刷新简短索引与修复证据,不追加整轮历史;Reviewer 仍检查完整冻结候选,不局限于这些提示。
|
|
49
|
+
|
|
26
50
|
## 小型开发集
|
|
27
51
|
|
|
28
52
|
`scripts/review-eval/` 是离线文件工具,不是调度器、模型适配器或新增 Core 存储。
|