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.
Files changed (57) hide show
  1. package/dist/adapters/qwen.js +30 -3
  2. package/dist/cli/commands/approve.js +23 -4
  3. package/dist/cli/commands/beat.d.ts +2 -0
  4. package/dist/cli/commands/beat.js +28 -29
  5. package/dist/cli/commands/compile.js +18 -0
  6. package/dist/cli/commands/fleet.js +61 -53
  7. package/dist/cli/commands/plan.d.ts +5 -0
  8. package/dist/cli/commands/plan.js +28 -23
  9. package/dist/cli/commands/resume.js +1 -1
  10. package/dist/cli/commands/run.js +1 -1
  11. package/dist/cli/commands/verify.d.ts +4 -1
  12. package/dist/cli/commands/verify.js +16 -5
  13. package/dist/cli/help.d.ts +2 -0
  14. package/dist/cli/help.js +6 -4
  15. package/dist/compile/native.js +68 -7
  16. package/dist/compile/retired-literals.d.ts +22 -0
  17. package/dist/compile/retired-literals.js +271 -0
  18. package/dist/config/config.d.ts +41 -3
  19. package/dist/config/config.js +48 -17
  20. package/dist/config/fleet-overlay.js +47 -62
  21. package/dist/drivers/index.d.ts +4 -2
  22. package/dist/drivers/index.js +54 -6
  23. package/dist/gates/baseline.d.ts +65 -0
  24. package/dist/gates/baseline.js +163 -9
  25. package/dist/gates/review.d.ts +6 -4
  26. package/dist/gates/review.js +62 -21
  27. package/dist/gates/run-gates.d.ts +6 -1
  28. package/dist/gates/run-gates.js +25 -13
  29. package/dist/gates/test-manifest.d.ts +20 -1
  30. package/dist/gates/test-manifest.js +50 -22
  31. package/dist/gates/test-reporter.js +22 -1
  32. package/dist/graph/schema.d.ts +28 -0
  33. package/dist/graph/schema.js +13 -1
  34. package/dist/run/daemon.d.ts +19 -0
  35. package/dist/run/daemon.js +363 -118
  36. package/dist/run/journal.d.ts +54 -3
  37. package/dist/run/journal.js +142 -11
  38. package/dist/run/merge.d.ts +15 -2
  39. package/dist/run/merge.js +74 -11
  40. package/dist/run/protocol.d.ts +82 -0
  41. package/dist/run/protocol.js +35 -0
  42. package/dist/run/receipt-resolver.d.ts +18 -0
  43. package/dist/run/receipt-resolver.js +132 -0
  44. package/dist/run/repair-disposition.d.ts +41 -0
  45. package/dist/run/repair-disposition.js +77 -0
  46. package/dist/run/supervision.d.ts +14 -1
  47. package/dist/run/supervision.js +122 -24
  48. package/dist/tui/cockpit/evidence-view.d.ts +10 -1
  49. package/dist/tui/cockpit/evidence-view.js +37 -5
  50. package/dist/tui/cockpit/home-view.js +45 -30
  51. package/dist/tui/cockpit/live-store.d.ts +18 -0
  52. package/dist/tui/ink/fleet-app.d.ts +12 -22
  53. package/dist/tui/ink/fleet-app.js +520 -131
  54. package/package.json +1 -1
  55. package/schema/rungraph.schema.json +54 -0
  56. package/skills/tickmarkr-overseer/SKILL.md +168 -36
  57. 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 (effectiveSection === "needsYou") {
152
- const nextIndex = (effectiveNeedsYouIndex + 1) % model.needsYou.length;
153
- setNeedsYouIndex(nextIndex);
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
- setSection("needsYou");
178
+ moveSection("needsYou");
158
179
  }
159
180
  }
160
181
  if (key.rightArrow)
161
- setSection("activity");
182
+ moveSection("activity");
162
183
  if (key.upArrow) {
163
- if (effectiveSection === "needsYou") {
184
+ if (sectionRef.current === "needsYou") {
164
185
  if (model.needsYou.length > 0) {
165
- const nextIndex = (effectiveNeedsYouIndex - 1 + model.needsYou.length) % model.needsYou.length;
166
- setNeedsYouIndex(nextIndex);
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, effectiveActivityIndex - 1);
173
- setActivityIndex(nextIndex);
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 (effectiveSection === "needsYou") {
198
+ if (sectionRef.current === "needsYou") {
180
199
  if (model.needsYou.length > 0) {
181
- const nextIndex = (effectiveNeedsYouIndex + 1) % model.needsYou.length;
182
- setNeedsYouIndex(nextIndex);
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, effectiveActivityIndex + 1);
189
- setActivityIndex(nextIndex);
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, effectiveActivityIndex - HOME_ACTIVITY_VISIBLE_ROWS);
198
- setActivityIndex(nextIndex);
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, effectiveActivityIndex + HOME_ACTIVITY_VISIBLE_ROWS);
206
- setActivityIndex(nextIndex);
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 (effectiveSection === "needsYou") {
212
- const target = selectedNeedsYou;
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[effectiveActivityIndex];
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 { MapEntry, RoutingMode, Tier, TickmarkrConfig } from "../../config/config.js";
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
- /** The four staged deny sets every preview and the staged routing policy are computed from. */
67
- export type FleetStagedDeny = {
68
- adapters: string[];
69
- models: string[];
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, initialDenyAdapters, initialDenyModels, initialAllowOut, initialDenyWorkersAdapters, initialDenyWorkersModels, modelGroups, initialMode, modeOptions, initialMap, modePreview, shapeRows, candidatesForShape, preferOptionsForShape, initialSteering, steeringOptionsFor, reviewOverlay, reloadGuard, stagedRouting, entry, initialJudge, judgeSeats, viewRows, frameColumns, frameRows, }: {
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, initialDenyAdapters, initialDenyModels, initialAllowOut, initialDenyWorkersAdapters, initialDenyWorkersModels, modelGroups, initialMode, modeOptions, initialMap, modePreview, shapeRows, candidatesForShape, preferOptionsForShape, initialSteering, steeringOptionsFor, reviewOverlay, reloadGuard, stagedRouting, entry, initialJudge, judgeSeats, initialInput, input, output, debug, }: {
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[];