tickmarkr 1.90.8 → 1.92.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.
@@ -9,7 +9,20 @@ export declare function TextLines({ lines }: {
9
9
  export declare function ToggleMark({ active }: {
10
10
  active: boolean;
11
11
  }): import("react").JSX.Element;
12
- export declare function FleetListScreen({ title, legend, rows, cursor, details, filter, }: {
12
+ /**
13
+ * v1.90.9 (operator field report: "can't choose models for omp"): a list longer than the
14
+ * terminal rendered EVERY row, so the title, legend, and cursor scrolled off the top — omp's
15
+ * 218 unclassified models left the operator staring at a tail of unselectable rows. The window
16
+ * is cursor-centered and clamped; the markers say exactly what is elided and that the list is
17
+ * still fully reachable (arrows walk it, type-to-search narrows it).
18
+ */
19
+ export declare function windowRows<T>(rows: T[], cursor: number, capacity: number): {
20
+ visible: T[];
21
+ start: number;
22
+ above: number;
23
+ below: number;
24
+ };
25
+ export declare function FleetListScreen({ title, legend, rows, cursor, details, filter, viewRows, }: {
13
26
  title: string;
14
27
  legend: string;
15
28
  rows: FleetListRow[];
@@ -17,6 +30,8 @@ export declare function FleetListScreen({ title, legend, rows, cursor, details,
17
30
  details?: string[];
18
31
  /** active type-to-search string; rendered on the legend line so the operator sees the narrowing */
19
32
  filter?: string;
33
+ /** list viewport capacity; rows beyond it window around the cursor with elision markers */
34
+ viewRows?: number;
20
35
  }): import("react").JSX.Element;
21
36
  export declare function FleetReviewScreen({ title, legend, diff, }: {
22
37
  title: string;
@@ -17,8 +17,22 @@ export function ToggleMark({ active }) {
17
17
  ? _jsx(Text, { color: "ansi256(41)", children: GLYPHS.toggleActive })
18
18
  : _jsx(Text, { dimColor: true, children: GLYPHS.toggleInactive });
19
19
  }
20
- export function FleetListScreen({ title, legend, rows, cursor, details = [], filter, }) {
21
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: title }), _jsx(Text, { dimColor: true, children: filter ? `${legend} · search: ${filter}` : legend }), rows.map((row, index) => (_jsxs(Text, { bold: index === cursor, children: [index === cursor ? `${GLYPHS.pointer} ` : " ", row.content] }, row.id))), _jsx(TextLines, { lines: details })] }));
20
+ /**
21
+ * v1.90.9 (operator field report: "can't choose models for omp"): a list longer than the
22
+ * terminal rendered EVERY row, so the title, legend, and cursor scrolled off the top — omp's
23
+ * 218 unclassified models left the operator staring at a tail of unselectable rows. The window
24
+ * is cursor-centered and clamped; the markers say exactly what is elided and that the list is
25
+ * still fully reachable (arrows walk it, type-to-search narrows it).
26
+ */
27
+ export function windowRows(rows, cursor, capacity) {
28
+ if (capacity <= 0 || rows.length <= capacity)
29
+ return { visible: rows, start: 0, above: 0, below: 0 };
30
+ const start = Math.min(Math.max(cursor - Math.floor(capacity / 2), 0), rows.length - capacity);
31
+ return { visible: rows.slice(start, start + capacity), start, above: start, below: rows.length - start - capacity };
32
+ }
33
+ export function FleetListScreen({ title, legend, rows, cursor, details = [], filter, viewRows, }) {
34
+ const { visible, start, above, below } = windowRows(rows, cursor, viewRows ?? Number.POSITIVE_INFINITY);
35
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: title }), _jsx(Text, { dimColor: true, children: filter ? `${legend} · search: ${filter}` : legend }), above > 0 && _jsxs(Text, { dimColor: true, children: [" \u2026 ", above, " above"] }), visible.map((row, index) => (_jsxs(Text, { bold: start + index === cursor, children: [start + index === cursor ? `${GLYPHS.pointer} ` : " ", row.content] }, row.id))), below > 0 && _jsxs(Text, { dimColor: true, children: [" \u2026 ", below, " below \u2014 type to search"] }), _jsx(TextLines, { lines: details })] }));
22
36
  }
23
37
  export function FleetReviewScreen({ title, legend, diff, }) {
24
38
  return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: title }), _jsx(Text, { dimColor: true, children: legend }), _jsx(Text, { children: diff })] }));
@@ -42,13 +42,32 @@ type AgentCli = {
42
42
  version: string;
43
43
  authed: boolean;
44
44
  };
45
+ export type FleetModelSuggestion = {
46
+ tier: Tier;
47
+ note: string;
48
+ };
49
+ /** Catalog + probe metadata rendered as the browser's metadata columns (omp-style). */
50
+ export type FleetModelEvidence = {
51
+ contextWindow?: number;
52
+ outputWindow?: number;
53
+ inputCostPerMtok?: number;
54
+ outputCostPerMtok?: number;
55
+ /** doctor's model probe wall clock (modelAuth.durationMs) — the "how fast did it answer" column */
56
+ probeMs?: number;
57
+ /** OBS-519: doctor's failed model-auth verdict reason — the row must not render like a healthy one */
58
+ unauthed?: string;
59
+ };
45
60
  export type FleetModelGroup = {
46
61
  adapter: string;
47
62
  vendor?: string;
63
+ /** configured billing channel (cfg.tiers.<adapter>.channel) — prices render for api, quota for sub */
64
+ channel?: "sub" | "api";
48
65
  rows: Array<{
49
66
  model: string;
50
67
  tier?: Tier;
51
68
  detectedAt?: string;
69
+ suggestion?: FleetModelSuggestion;
70
+ evidence?: FleetModelEvidence;
52
71
  }>;
53
72
  };
54
73
  export type FleetClassification = {
@@ -76,7 +95,7 @@ export type FleetCandidateOption = {
76
95
  };
77
96
  };
78
97
  export declare function formatDoctorAge(ageMs: number | null): string;
79
- export declare function FleetApp({ ageMs, agents, initialDenyAdapters, initialDenyModels, modelGroups, initialMode, modeOptions, initialMap, modePreview, shapeRows, candidatesForShape, preferOptionsForShape, initialSteering, steeringOptionsFor, reviewOverlay, reloadGuard, entry, initialJudge, judgeSeats, }: {
98
+ export declare function FleetApp({ ageMs, agents, initialDenyAdapters, initialDenyModels, modelGroups, initialMode, modeOptions, initialMap, modePreview, shapeRows, candidatesForShape, preferOptionsForShape, initialSteering, steeringOptionsFor, reviewOverlay, reloadGuard, entry, initialJudge, judgeSeats, viewRows, frameColumns, frameRows, }: {
80
99
  ageMs: number | null;
81
100
  agents: AgentCli[];
82
101
  initialDenyAdapters: string[];
@@ -85,9 +104,21 @@ export declare function FleetApp({ ageMs, agents, initialDenyAdapters, initialDe
85
104
  initialMode: RoutingMode;
86
105
  modeOptions: FleetModeOption[];
87
106
  initialMap: Record<string, MapEntry>;
88
- modePreview: (mode: RoutingMode, map: Record<string, MapEntry>) => string[];
89
- shapeRows: (mode: RoutingMode, map: Record<string, MapEntry>) => FleetShapeRow[];
90
- candidatesForShape: (shape: Shape, mode: RoutingMode, map: Record<string, MapEntry>) => FleetCandidateOption[];
107
+ modePreview: (mode: RoutingMode, map: Record<string, MapEntry>, deny: {
108
+ adapters: string[];
109
+ models: string[];
110
+ }) => string[];
111
+ shapeRows: (mode: RoutingMode, map: Record<string, MapEntry>, deny: {
112
+ adapters: string[];
113
+ models: string[];
114
+ }) => FleetShapeRow[];
115
+ candidatesForShape: (shape: Shape, mode: RoutingMode, map: Record<string, MapEntry>, deny: {
116
+ adapters: string[];
117
+ models: string[];
118
+ }) => {
119
+ rows: FleetCandidateOption[];
120
+ excludedNote?: string;
121
+ };
91
122
  preferOptionsForShape: (shape: Shape, current: string[]) => string[];
92
123
  initialSteering: Record<FleetSteeringKey, string[] | undefined>;
93
124
  steeringOptionsFor: (which: FleetSteeringKey, current: string[]) => string[];
@@ -98,6 +129,12 @@ export declare function FleetApp({ ageMs, agents, initialDenyAdapters, initialDe
98
129
  initialJudge?: string;
99
130
  /** discovered adapter:model seats — the judge picker universe */
100
131
  judgeSeats?: string[];
132
+ /** list viewport capacity (terminal rows minus chrome) — long lists window around the cursor */
133
+ viewRows?: number;
134
+ /** terminal width the frame lays out against */
135
+ frameColumns?: number;
136
+ /** terminal height — set only on a real TTY so the footer sticks to the bottom */
137
+ frameRows?: number;
101
138
  }): import("react").JSX.Element;
102
139
  export declare function runFleetInkEditor({ ageMs, adapters, health, initialDenyAdapters, initialDenyModels, modelGroups, initialMode, modeOptions, initialMap, modePreview, shapeRows, candidatesForShape, preferOptionsForShape, initialSteering, steeringOptionsFor, reviewOverlay, reloadGuard, entry, initialJudge, judgeSeats, initialInput, input, output, debug, }: {
103
140
  ageMs: number | null;
@@ -109,15 +146,27 @@ export declare function runFleetInkEditor({ ageMs, adapters, health, initialDeny
109
146
  initialMode: RoutingMode;
110
147
  modeOptions: FleetModeOption[];
111
148
  initialMap: Record<string, MapEntry>;
112
- modePreview: (mode: RoutingMode, map: Record<string, MapEntry>) => string[];
113
- shapeRows: (mode: RoutingMode, map: Record<string, MapEntry>) => FleetShapeRow[];
114
- candidatesForShape: (shape: Shape, mode: RoutingMode, map: Record<string, MapEntry>) => FleetCandidateOption[];
149
+ modePreview: (mode: RoutingMode, map: Record<string, MapEntry>, deny: {
150
+ adapters: string[];
151
+ models: string[];
152
+ }) => string[];
153
+ shapeRows: (mode: RoutingMode, map: Record<string, MapEntry>, deny: {
154
+ adapters: string[];
155
+ models: string[];
156
+ }) => FleetShapeRow[];
157
+ candidatesForShape: (shape: Shape, mode: RoutingMode, map: Record<string, MapEntry>, deny: {
158
+ adapters: string[];
159
+ models: string[];
160
+ }) => {
161
+ rows: FleetCandidateOption[];
162
+ excludedNote?: string;
163
+ };
115
164
  preferOptionsForShape: (shape: Shape, current: string[]) => string[];
116
165
  initialSteering: Record<FleetSteeringKey, string[] | undefined>;
117
166
  steeringOptionsFor: (which: FleetSteeringKey, current: string[]) => string[];
118
167
  reviewOverlay: (state: FleetEditorState) => FleetOverlayReview;
119
168
  reloadGuard: (bytes: string) => string | null;
120
- /** "presets" opens on the routing-mode screen with the extra custom row; default preserves the probe-first walk */
169
+ /** "presets" = init's entry: Esc in the browser is HOME to the preset overlay, not quit */
121
170
  entry?: "presets" | "probe";
122
171
  initialJudge?: string;
123
172
  judgeSeats?: string[];