tickmarkr 2.5.7 → 2.5.9
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/adapters/qwen.js +30 -3
- package/dist/cli/commands/approve.js +23 -4
- package/dist/cli/commands/beat.d.ts +2 -0
- package/dist/cli/commands/beat.js +28 -29
- package/dist/cli/commands/compile.js +18 -0
- package/dist/cli/commands/fleet.js +61 -53
- package/dist/cli/commands/plan.d.ts +5 -0
- package/dist/cli/commands/plan.js +28 -23
- package/dist/cli/commands/resume.js +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/verify.d.ts +4 -1
- package/dist/cli/commands/verify.js +16 -5
- package/dist/cli/help.d.ts +2 -0
- package/dist/cli/help.js +6 -4
- package/dist/compile/native.js +68 -7
- package/dist/compile/retired-literals.d.ts +22 -0
- package/dist/compile/retired-literals.js +271 -0
- package/dist/config/config.d.ts +41 -3
- package/dist/config/config.js +48 -17
- package/dist/config/fleet-overlay.js +47 -62
- package/dist/drivers/index.d.ts +4 -2
- package/dist/drivers/index.js +54 -6
- package/dist/gates/baseline.d.ts +65 -0
- package/dist/gates/baseline.js +163 -9
- package/dist/gates/review.d.ts +6 -4
- package/dist/gates/review.js +62 -21
- package/dist/gates/run-gates.d.ts +6 -1
- package/dist/gates/run-gates.js +25 -13
- package/dist/gates/test-manifest.d.ts +20 -1
- package/dist/gates/test-manifest.js +50 -22
- package/dist/gates/test-reporter.js +22 -1
- package/dist/graph/schema.d.ts +28 -0
- package/dist/graph/schema.js +13 -1
- package/dist/run/daemon.d.ts +19 -0
- package/dist/run/daemon.js +363 -118
- package/dist/run/journal.d.ts +54 -3
- package/dist/run/journal.js +142 -11
- package/dist/run/merge.d.ts +15 -2
- package/dist/run/merge.js +74 -11
- package/dist/run/protocol.d.ts +82 -0
- package/dist/run/protocol.js +35 -0
- package/dist/run/receipt-resolver.d.ts +18 -0
- package/dist/run/receipt-resolver.js +132 -0
- package/dist/run/repair-disposition.d.ts +41 -0
- package/dist/run/repair-disposition.js +77 -0
- package/dist/run/supervision.d.ts +14 -1
- package/dist/run/supervision.js +122 -24
- package/dist/tui/cockpit/evidence-view.d.ts +10 -1
- package/dist/tui/cockpit/evidence-view.js +37 -5
- package/dist/tui/cockpit/home-view.js +45 -30
- package/dist/tui/cockpit/live-store.d.ts +18 -0
- package/dist/tui/ink/fleet-app.d.ts +12 -22
- package/dist/tui/ink/fleet-app.js +520 -131
- package/package.json +1 -1
- package/schema/rungraph.schema.json +54 -0
- package/skills/tickmarkr-overseer/SKILL.md +168 -36
- package/skills/tickmarkr-overseer/scripts/watch-context.sh +14 -2
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { existsSync, renameSync, statSync, unlinkSync } from "node:fs";
|
|
3
|
-
import { basename, dirname, join } from "node:path";
|
|
2
|
+
import { existsSync, realpathSync, renameSync, statSync, unlinkSync } from "node:fs";
|
|
3
|
+
import { basename, dirname, isAbsolute, join } from "node:path";
|
|
4
4
|
import { Box, useInput } from "ink";
|
|
5
5
|
import { useEffect, useRef, useState } from "react";
|
|
6
6
|
import { buildOperatorRecord, formatOperatorRecordRow } from "../../report/operator-record.js";
|
|
7
7
|
import { EMPTY_OPERATOR_PAGE_SUMMARY, foldOperatorPages, operatorPageRow } from "../../run/operator-page-summary.js";
|
|
8
8
|
import { formatJournalNarration } from "../../run/journal.js";
|
|
9
|
+
import { formatReceiptResolution, resolveReceipt } from "../../run/receipt-resolver.js";
|
|
9
10
|
import { BodyText, JournalRowPanel, Panel } from "./components.js";
|
|
10
11
|
import { cellWidth, sliceCells } from "./width.js";
|
|
11
12
|
// review.ts:485 emits `; raw saved: <path>) — failing closed`, the path immediately followed by
|
|
@@ -30,7 +31,7 @@ function stateFor(e) {
|
|
|
30
31
|
}
|
|
31
32
|
/** Pure C2-journal-to-Evidence-rows mapping: the original journal position IS the evidence identity
|
|
32
33
|
* — assigned once here, from the full unfiltered event list, never recomputed from a display slice. */
|
|
33
|
-
export function deriveEvidenceJournal(eventsOrRows, source = "journal.jsonl") {
|
|
34
|
+
export function deriveEvidenceJournal(eventsOrRows, source = "journal.jsonl", runRoot) {
|
|
34
35
|
const result = [];
|
|
35
36
|
for (let i = 0; i < eventsOrRows.length; i++) {
|
|
36
37
|
const item = eventsOrRows[i];
|
|
@@ -61,6 +62,7 @@ export function deriveEvidenceJournal(eventsOrRows, source = "journal.jsonl") {
|
|
|
61
62
|
artifacts.push(p);
|
|
62
63
|
}
|
|
63
64
|
const gate = typeof e.data?.gate === "string" ? e.data.gate : (e.event === "review-leg2" ? "review" : undefined);
|
|
65
|
+
const receipts = resolveRowReceipt(e.data, runRoot ?? runRootOf(rowSource));
|
|
64
66
|
result.push({
|
|
65
67
|
evidence: { source: rowSource, line, id },
|
|
66
68
|
time: e.ts,
|
|
@@ -68,12 +70,42 @@ export function deriveEvidenceJournal(eventsOrRows, source = "journal.jsonl") {
|
|
|
68
70
|
text: formatJournalNarration(e),
|
|
69
71
|
fullText: details || JSON.stringify(e.data, null, 2),
|
|
70
72
|
artifacts,
|
|
73
|
+
receipts,
|
|
71
74
|
...(e.taskId ? { taskId: e.taskId } : {}),
|
|
72
75
|
...(gate ? { gate } : {}),
|
|
73
76
|
});
|
|
74
77
|
}
|
|
75
78
|
return result;
|
|
76
79
|
}
|
|
80
|
+
/** The live cockpit names its journal by absolute path (`<state>/runs/<runId>/journal.jsonl`); that
|
|
81
|
+
* directory IS the run root. A relative or foreign source names no root — nothing is guessed. */
|
|
82
|
+
export function runRootOf(source) {
|
|
83
|
+
return source && isAbsolute(source) && basename(source) === "journal.jsonl" ? dirname(source) : undefined;
|
|
84
|
+
}
|
|
85
|
+
// A reused verdict's receipt stays bound to the run root that minted it; the current run's root
|
|
86
|
+
// answers only for evidence this run produced. No root known → nothing can be verified. A receipt
|
|
87
|
+
// the schema rejects is still a receipt the row carries: each reference it names goes through the
|
|
88
|
+
// resolver and is shown with its reason, never dropped. D-279: the boundary is the run root — the
|
|
89
|
+
// host's ancestors are canonicalised (macOS `/var` → `/private/var`) but the root's own name is
|
|
90
|
+
// passed as recorded, so a root that IS a symlink stays visible and the resolver refuses it.
|
|
91
|
+
function resolveRowReceipt(data, runRoot) {
|
|
92
|
+
const receipt = data?.evidenceReceipt;
|
|
93
|
+
if (!receipt || typeof receipt !== "object")
|
|
94
|
+
return [];
|
|
95
|
+
const refs = [receipt.stdout, receipt.stderr];
|
|
96
|
+
const recorded = typeof data?.originRunRoot === "string" && data.originRunRoot ? data.originRunRoot : runRoot;
|
|
97
|
+
let root;
|
|
98
|
+
try {
|
|
99
|
+
root = recorded ? join(realpathSync(dirname(recorded)), basename(recorded)) : undefined;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
root = undefined;
|
|
103
|
+
}
|
|
104
|
+
return refs.map(ref => {
|
|
105
|
+
const path = typeof ref?.path === "string" ? ref.path : "";
|
|
106
|
+
return formatReceiptResolution(root ? resolveReceipt(ref, root) : { ok: false, path, reason: "missing" });
|
|
107
|
+
});
|
|
108
|
+
}
|
|
77
109
|
/** The most recent review verdict recorded for a task — by original journal position, so a merged
|
|
78
110
|
* task's review opens the row it actually happened on rather than any on-screen index. */
|
|
79
111
|
export function selectTaskReview(journal, taskId) {
|
|
@@ -100,7 +132,7 @@ export function deriveEvidenceView(input) {
|
|
|
100
132
|
const row = operatorPageRow(event, tracked ? item.line : index + 1, tracked ? item.source ?? source : source);
|
|
101
133
|
return row ? [row] : [];
|
|
102
134
|
})).groups,
|
|
103
|
-
journal: deriveEvidenceJournal(items, source),
|
|
135
|
+
journal: deriveEvidenceJournal(items, source, input.runRoot),
|
|
104
136
|
channels: buildOperatorRecord(events, input.costs ?? []),
|
|
105
137
|
reportLines: input.reportLines ?? [],
|
|
106
138
|
statsLines: input.statsLines ?? [],
|
|
@@ -229,7 +261,7 @@ export function EvidenceView({ model, width, focused = true, focusEvidence, onSe
|
|
|
229
261
|
return { id: row.evidence.id, time, state: row.state, text: clipped };
|
|
230
262
|
});
|
|
231
263
|
return (_jsxs(Box, { flexDirection: "column", width: width, children: [_jsxs(BodyText, { emphasis: "strong", children: ["EVIDENCE ", TABS.map((t) => (t === tab ? `[${TAB_TITLE[t]}]` : TAB_TITLE[t])).join(" "), tab === "journal" ? ` | Follow ${follow ? "on" : "off"}` : "", selectedRow ? ` | selected ${selectedRow.evidence.id}` : ""] }), tab === "journal" && (_jsxs(_Fragment, { children: [_jsx(JournalRowPanel, { title: "RAW JOURNAL", rows: journalRows, selection: selectedIndex >= 0 ? selectedIndex : undefined }), _jsx(Panel, { title: "OPERATOR PAGE GROUPS", children: model.operatorPages.length ? model.operatorPages.map((group, index) => (_jsxs(Box, { flexDirection: "column", children: [_jsxs(BodyText, { emphasis: "strong", children: [group.taskId, " \u00B7 ", group.park, " \u00B7 ", group.status] }), _jsxs(BodyText, { children: ["first ", group.firstEvidenceAt] }), _jsxs(BodyText, { children: ["last ", group.lastEvidenceAt] }), _jsxs(BodyText, { children: ["visible ", group.observedCount, " \u00B7 suppressed ", group.suppressedCount, group.rawOnly ? " · raw-only (suppression unrecorded)" : ""] }), _jsx(BodyText, { children: "Raw source lines (\u2191\u2193 select, Enter open):" }), group.lines.map(line => _jsxs(BodyText, { children: ["#L", line] }, line))] }, `${group.key}:${index}`))) : _jsx(BodyText, { emphasis: "dim", children: "no operator pages" }) }), _jsx(Panel, { title: "SELECTED EVIDENCE", children: selectedRow
|
|
232
|
-
? (_jsxs(_Fragment, { children: [_jsxs(BodyText, { emphasis: "dim", children: ["Original journal ", selectedRow.evidence.id] }), selectedRow.fullText.split("\n").map((line, i) => _jsx(BodyText, { children: line }, i)), _jsxs(BodyText, { emphasis: "dim", children: ["Artifacts: ", selectedRow.artifacts.length ? selectedRow.artifacts.join(", ") : "missing"] })] }))
|
|
264
|
+
? (_jsxs(_Fragment, { children: [_jsxs(BodyText, { emphasis: "dim", children: ["Original journal ", selectedRow.evidence.id] }), selectedRow.fullText.split("\n").map((line, i) => _jsx(BodyText, { children: line }, i)), _jsxs(BodyText, { emphasis: "dim", children: ["Artifacts: ", selectedRow.artifacts.length ? selectedRow.artifacts.join(", ") : "missing"] }), selectedRow.receipts.map((line, i) => _jsxs(BodyText, { emphasis: "dim", children: ["Receipt: ", line] }, `r${i}`))] }))
|
|
233
265
|
: _jsx(BodyText, { emphasis: "dim", children: "no history" }) })] })), tab === "report" && (_jsx(Panel, { title: "REPORT", children: model.reportLines.length
|
|
234
266
|
? model.reportLines.map((line, i) => _jsx(BodyText, { children: line }, i))
|
|
235
267
|
: _jsx(BodyText, { emphasis: "dim", children: "no history" }) })), tab === "stats" && (_jsx(Panel, { title: "STATS", children: model.statsLines.length
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { Box, useInput } from "ink";
|
|
3
|
-
import { useLayoutEffect, useState } from "react";
|
|
3
|
+
import { useLayoutEffect, useRef, useState } from "react";
|
|
4
4
|
import { GLYPHS } from "../../brand.js";
|
|
5
5
|
import { BodyText, CockpitGrid, Panel, ProgressMeter, Sparkline, StateGlyph, } from "./components.js";
|
|
6
6
|
import { ABSENT_FIELD, fieldReading } from "./derive.js";
|
|
@@ -146,75 +146,90 @@ export function HomeView({ model, width, focused = true, onOpenPark, onOpenDiagn
|
|
|
146
146
|
const maxOffset = Math.max(0, model.activity.length - 1);
|
|
147
147
|
const maxSelection = Math.max(0, model.activity.length - 1);
|
|
148
148
|
const safeOffset = Math.min(offset, maxOffset);
|
|
149
|
+
// Keep input ahead of the next render/effect subscription, as in EvidenceView.
|
|
150
|
+
// Render reconciles the refs with model updates; each move writes before setting state.
|
|
151
|
+
const sectionRef = useRef(effectiveSection);
|
|
152
|
+
const needsYouIndexRef = useRef(effectiveNeedsYouIndex);
|
|
153
|
+
const activityIndexRef = useRef(effectiveActivityIndex);
|
|
154
|
+
sectionRef.current = effectiveSection;
|
|
155
|
+
needsYouIndexRef.current = effectiveNeedsYouIndex;
|
|
156
|
+
activityIndexRef.current = effectiveActivityIndex;
|
|
157
|
+
const moveSection = (next) => {
|
|
158
|
+
sectionRef.current = next;
|
|
159
|
+
setSection(next);
|
|
160
|
+
};
|
|
161
|
+
const moveNeedsYou = (index) => {
|
|
162
|
+
needsYouIndexRef.current = index;
|
|
163
|
+
setNeedsYouIndex(index);
|
|
164
|
+
setSelectedNeedsYouId(model.needsYou[index]?.id);
|
|
165
|
+
};
|
|
166
|
+
const moveActivity = (index) => {
|
|
167
|
+
activityIndexRef.current = index;
|
|
168
|
+
setActivityIndex(index);
|
|
169
|
+
setSelectedEvidenceId(model.activity[index]?.evidence.id);
|
|
170
|
+
};
|
|
149
171
|
useInput((_input, key) => {
|
|
150
172
|
if (key.leftArrow && model.needsYou.length > 0) {
|
|
151
|
-
if (
|
|
152
|
-
const nextIndex = (
|
|
153
|
-
|
|
154
|
-
setSelectedNeedsYouId(model.needsYou[nextIndex]?.id);
|
|
173
|
+
if (sectionRef.current === "needsYou") {
|
|
174
|
+
const nextIndex = (needsYouIndexRef.current + 1) % model.needsYou.length;
|
|
175
|
+
moveNeedsYou(nextIndex);
|
|
155
176
|
}
|
|
156
177
|
else {
|
|
157
|
-
|
|
178
|
+
moveSection("needsYou");
|
|
158
179
|
}
|
|
159
180
|
}
|
|
160
181
|
if (key.rightArrow)
|
|
161
|
-
|
|
182
|
+
moveSection("activity");
|
|
162
183
|
if (key.upArrow) {
|
|
163
|
-
if (
|
|
184
|
+
if (sectionRef.current === "needsYou") {
|
|
164
185
|
if (model.needsYou.length > 0) {
|
|
165
|
-
const nextIndex = (
|
|
166
|
-
|
|
167
|
-
setSelectedNeedsYouId(model.needsYou[nextIndex]?.id);
|
|
186
|
+
const nextIndex = (needsYouIndexRef.current - 1 + model.needsYou.length) % model.needsYou.length;
|
|
187
|
+
moveNeedsYou(nextIndex);
|
|
168
188
|
}
|
|
169
189
|
}
|
|
170
190
|
else {
|
|
171
191
|
if (model.activity.length > 0) {
|
|
172
|
-
const nextIndex = Math.max(0,
|
|
173
|
-
|
|
174
|
-
setSelectedEvidenceId(model.activity[nextIndex]?.evidence.id);
|
|
192
|
+
const nextIndex = Math.max(0, activityIndexRef.current - 1);
|
|
193
|
+
moveActivity(nextIndex);
|
|
175
194
|
}
|
|
176
195
|
}
|
|
177
196
|
}
|
|
178
197
|
if (key.downArrow) {
|
|
179
|
-
if (
|
|
198
|
+
if (sectionRef.current === "needsYou") {
|
|
180
199
|
if (model.needsYou.length > 0) {
|
|
181
|
-
const nextIndex = (
|
|
182
|
-
|
|
183
|
-
setSelectedNeedsYouId(model.needsYou[nextIndex]?.id);
|
|
200
|
+
const nextIndex = (needsYouIndexRef.current + 1) % model.needsYou.length;
|
|
201
|
+
moveNeedsYou(nextIndex);
|
|
184
202
|
}
|
|
185
203
|
}
|
|
186
204
|
else {
|
|
187
205
|
if (model.activity.length > 0) {
|
|
188
|
-
const nextIndex = Math.min(maxSelection,
|
|
189
|
-
|
|
190
|
-
setSelectedEvidenceId(model.activity[nextIndex]?.evidence.id);
|
|
206
|
+
const nextIndex = Math.min(maxSelection, activityIndexRef.current + 1);
|
|
207
|
+
moveActivity(nextIndex);
|
|
191
208
|
}
|
|
192
209
|
}
|
|
193
210
|
}
|
|
194
211
|
if (key.pageDown) {
|
|
195
212
|
setOffset((o) => Math.max(0, o - HOME_ACTIVITY_VISIBLE_ROWS));
|
|
196
213
|
if (model.activity.length > 0) {
|
|
197
|
-
const nextIndex = Math.max(0,
|
|
198
|
-
|
|
199
|
-
setSelectedEvidenceId(model.activity[nextIndex]?.evidence.id);
|
|
214
|
+
const nextIndex = Math.max(0, activityIndexRef.current - HOME_ACTIVITY_VISIBLE_ROWS);
|
|
215
|
+
moveActivity(nextIndex);
|
|
200
216
|
}
|
|
201
217
|
}
|
|
202
218
|
if (key.pageUp) {
|
|
203
219
|
setOffset((o) => Math.min(maxOffset, o + HOME_ACTIVITY_VISIBLE_ROWS));
|
|
204
220
|
if (model.activity.length > 0) {
|
|
205
|
-
const nextIndex = Math.min(maxSelection,
|
|
206
|
-
|
|
207
|
-
setSelectedEvidenceId(model.activity[nextIndex]?.evidence.id);
|
|
221
|
+
const nextIndex = Math.min(maxSelection, activityIndexRef.current + HOME_ACTIVITY_VISIBLE_ROWS);
|
|
222
|
+
moveActivity(nextIndex);
|
|
208
223
|
}
|
|
209
224
|
}
|
|
210
225
|
if (key.return) {
|
|
211
|
-
if (
|
|
212
|
-
const target =
|
|
226
|
+
if (sectionRef.current === "needsYou") {
|
|
227
|
+
const target = selectNeedsYouTarget(model, needsYouIndexRef.current);
|
|
213
228
|
if (target)
|
|
214
229
|
(target.kind === "park" ? onOpenPark : onOpenDiagnostic)(target.id);
|
|
215
230
|
}
|
|
216
231
|
else {
|
|
217
|
-
const row = model.activity[
|
|
232
|
+
const row = model.activity[activityIndexRef.current];
|
|
218
233
|
if (row)
|
|
219
234
|
onOpenEvidence(row.evidence);
|
|
220
235
|
}
|
|
@@ -121,6 +121,7 @@ export declare function createLiveStore(options: LiveStoreOptions): {
|
|
|
121
121
|
oracle: "test";
|
|
122
122
|
test: string;
|
|
123
123
|
text?: string | undefined;
|
|
124
|
+
landing?: string | undefined;
|
|
124
125
|
} | {
|
|
125
126
|
oracle: "judge";
|
|
126
127
|
text: string;
|
|
@@ -138,6 +139,14 @@ export declare function createLiveStore(options: LiveStoreOptions): {
|
|
|
138
139
|
confidence?: number | undefined;
|
|
139
140
|
reason?: string | undefined;
|
|
140
141
|
}[] | undefined;
|
|
142
|
+
pins?: ({
|
|
143
|
+
kind: "literal";
|
|
144
|
+
text: string;
|
|
145
|
+
glob: string;
|
|
146
|
+
} | {
|
|
147
|
+
kind: "fixture";
|
|
148
|
+
paths: string[];
|
|
149
|
+
})[] | undefined;
|
|
141
150
|
routingHints?: {
|
|
142
151
|
pin?: {
|
|
143
152
|
via: string;
|
|
@@ -213,6 +222,7 @@ export declare function createLiveStore(options: LiveStoreOptions): {
|
|
|
213
222
|
oracle: "test";
|
|
214
223
|
test: string;
|
|
215
224
|
text?: string | undefined;
|
|
225
|
+
landing?: string | undefined;
|
|
216
226
|
} | {
|
|
217
227
|
oracle: "judge";
|
|
218
228
|
text: string;
|
|
@@ -230,6 +240,14 @@ export declare function createLiveStore(options: LiveStoreOptions): {
|
|
|
230
240
|
confidence?: number | undefined;
|
|
231
241
|
reason?: string | undefined;
|
|
232
242
|
}[] | undefined;
|
|
243
|
+
pins?: ({
|
|
244
|
+
kind: "literal";
|
|
245
|
+
text: string;
|
|
246
|
+
glob: string;
|
|
247
|
+
} | {
|
|
248
|
+
kind: "fixture";
|
|
249
|
+
paths: string[];
|
|
250
|
+
})[] | undefined;
|
|
233
251
|
routingHints?: {
|
|
234
252
|
pin?: {
|
|
235
253
|
via: string;
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import { type AuthHealth, type WorkerAdapter } from "../../adapters/types.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type DenyScopeKey, type InitialDenyProps, type MapEntry, type RoutingMode, type StagedDenyKey, type Tier, type TickmarkrConfig } from "../../config/config.js";
|
|
3
3
|
import { type Shape } from "../../graph/schema.js";
|
|
4
4
|
export type FleetSteeringKey = "review" | "consult";
|
|
5
|
-
export type FleetEditorState = {
|
|
6
|
-
denyAdapters: string[];
|
|
7
|
-
denyModels: string[];
|
|
5
|
+
export type FleetEditorState = Record<DenyScopeKey, string[]> & {
|
|
8
6
|
/** OBS-1046: the staged routing.allow complement, distinct from the authored deny lists above */
|
|
9
7
|
allowOut?: string[];
|
|
10
|
-
denyWorkersAdapters: string[];
|
|
11
|
-
denyWorkersModels: string[];
|
|
12
8
|
classifications: FleetClassification[];
|
|
13
9
|
selectedMode: RoutingMode;
|
|
14
10
|
map: Record<string, MapEntry>;
|
|
@@ -63,15 +59,15 @@ export type FleetModelEvidence = {
|
|
|
63
59
|
/** OBS-972/FL-1: a floating alias's resolved concrete model id (e.g. "opus" → "claude-opus-5") */
|
|
64
60
|
identity?: string;
|
|
65
61
|
};
|
|
66
|
-
/**
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
workersAdapters: string[];
|
|
71
|
-
workersModels: string[];
|
|
62
|
+
/** OBS-1099 add.1: the staged deny list of every schema-enumerated scope — keyed by the scope
|
|
63
|
+
* key minus its `deny` prefix (denyWorkersAdapters → workersAdapters) — every preview and the
|
|
64
|
+
* staged routing policy are computed from; a scope the schema gains is a key here, not a hand field. */
|
|
65
|
+
export type FleetStagedDeny = Record<StagedDenyKey, string[]> & {
|
|
72
66
|
/** OBS-1046: the staged routing.allow complement; absent ⇒ the session's initial one */
|
|
73
67
|
allowOut?: string[];
|
|
74
68
|
};
|
|
69
|
+
/** every scope's staged list, empty — the "every policy scope open" probe the picker lifts against */
|
|
70
|
+
export declare const openStagedDeny: () => FleetStagedDeny;
|
|
75
71
|
export type FleetModelGroup = {
|
|
76
72
|
adapter: string;
|
|
77
73
|
vendor?: string;
|
|
@@ -112,6 +108,8 @@ export type FleetCandidateOption = {
|
|
|
112
108
|
via: string;
|
|
113
109
|
model: string;
|
|
114
110
|
};
|
|
111
|
+
/** ranked only after the shape's advisory floor was dropped (candidates.ts) — never lift-eligible */
|
|
112
|
+
belowFloor?: boolean;
|
|
115
113
|
};
|
|
116
114
|
export declare function formatDoctorAge(ageMs: number | null): string;
|
|
117
115
|
export type FleetReach = "in" | "out-workers" | "out-all" | "out-allow" | "unknown";
|
|
@@ -123,15 +121,11 @@ export type FleetStagedRouting = {
|
|
|
123
121
|
ok: false;
|
|
124
122
|
error: string;
|
|
125
123
|
};
|
|
126
|
-
export declare function FleetApp({ ageMs, agents,
|
|
124
|
+
export declare function FleetApp({ ageMs, agents, initialAllowOut, modelGroups, initialMode, modeOptions, initialMap, modePreview, shapeRows, candidatesForShape, preferOptionsForShape, initialSteering, steeringOptionsFor, reviewOverlay, reloadGuard, stagedRouting, entry, initialJudge, judgeSeats, viewRows, frameColumns, frameRows, ...initialDenyProps }: InitialDenyProps & {
|
|
127
125
|
ageMs: number | null;
|
|
128
126
|
agents: AgentCli[];
|
|
129
|
-
initialDenyAdapters: string[];
|
|
130
|
-
initialDenyModels: string[];
|
|
131
127
|
/** OBS-1046: adapter ids and adapter:model keys routing.allow leaves out of the fleet */
|
|
132
128
|
initialAllowOut?: string[];
|
|
133
|
-
initialDenyWorkersAdapters?: string[];
|
|
134
|
-
initialDenyWorkersModels?: string[];
|
|
135
129
|
modelGroups: FleetModelGroup[];
|
|
136
130
|
initialMode: RoutingMode;
|
|
137
131
|
modeOptions: FleetModeOption[];
|
|
@@ -163,16 +157,12 @@ export declare function FleetApp({ ageMs, agents, initialDenyAdapters, initialDe
|
|
|
163
157
|
/** terminal height — set only on a real TTY so the footer sticks to the bottom */
|
|
164
158
|
frameRows?: number;
|
|
165
159
|
}): import("react").JSX.Element;
|
|
166
|
-
export declare function runFleetInkEditor({ ageMs, adapters, health,
|
|
160
|
+
export declare function runFleetInkEditor({ ageMs, adapters, health, initialAllowOut, modelGroups, initialMode, modeOptions, initialMap, modePreview, shapeRows, candidatesForShape, preferOptionsForShape, initialSteering, steeringOptionsFor, reviewOverlay, reloadGuard, stagedRouting, entry, initialJudge, judgeSeats, initialInput, input, output, debug, ...initialDenyProps }: InitialDenyProps & {
|
|
167
161
|
ageMs: number | null;
|
|
168
162
|
adapters: WorkerAdapter[];
|
|
169
163
|
health: Record<string, AuthHealth>;
|
|
170
|
-
initialDenyAdapters: string[];
|
|
171
|
-
initialDenyModels: string[];
|
|
172
164
|
/** OBS-1046: adapter ids and adapter:model keys routing.allow leaves out of the fleet */
|
|
173
165
|
initialAllowOut?: string[];
|
|
174
|
-
initialDenyWorkersAdapters?: string[];
|
|
175
|
-
initialDenyWorkersModels?: string[];
|
|
176
166
|
modelGroups: FleetModelGroup[];
|
|
177
167
|
initialMode: RoutingMode;
|
|
178
168
|
modeOptions: FleetModeOption[];
|