@lloyal-labs/dev-tools 0.1.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/LICENSE ADDED
@@ -0,0 +1,107 @@
1
+ # Functional Source License, Version 1.1, Apache 2.0 Future License
2
+
3
+ ## Abbreviation
4
+
5
+ FSL-1.1-Apache-2.0
6
+
7
+ ## Notice
8
+
9
+ Copyright 2026 Lloyal Labs
10
+
11
+ ## Terms and Conditions
12
+
13
+ ### Licensor ("We")
14
+
15
+ The party offering the Software under these Terms and Conditions.
16
+
17
+ ### The Software
18
+
19
+ The "Software" is each version of the software that we make available under
20
+ these Terms and Conditions, as indicated by our inclusion of these Terms and
21
+ Conditions with the Software.
22
+
23
+ ### License Grant
24
+
25
+ Subject to your compliance with this License Grant and the Patents,
26
+ Redistribution and Trademark clauses below, we hereby grant you the right to
27
+ use, copy, modify, create derivative works, publish, and distribute the
28
+ Software for any Permitted Purpose identified below.
29
+
30
+ ### Permitted Purpose
31
+
32
+ A "Permitted Purpose" is any purpose other than a Competing Use. A
33
+ "Competing Use" means making the Software available to others in a
34
+ commercial product or service that:
35
+
36
+ 1. substitutes for the Software;
37
+
38
+ 2. substitutes for any other product or service we offer using the Software
39
+ that exists as of the date we make the Software available; or
40
+
41
+ 3. offers the same or substantially similar functionality as the Software.
42
+
43
+ Permitted Purposes specifically include using the Software:
44
+
45
+ 1. for your internal use and access;
46
+
47
+ 2. for non-commercial education;
48
+
49
+ 3. for non-commercial research; and
50
+
51
+ 4. in connection with professional services that you provide to a Licensee
52
+ using the Software in accordance with these Terms and Conditions.
53
+
54
+ ### Patents
55
+
56
+ To the extent your use for a Permitted Purpose would necessarily infringe our
57
+ patents, the license grant above includes a license under our patents. If you
58
+ make a claim against any party that the Software infringes or contributes to
59
+ the infringement of any patent, then your patent license to the Software ends
60
+ immediately.
61
+
62
+ ### Redistribution
63
+
64
+ The Terms and Conditions apply to all copies, modifications and derivatives
65
+ of the Software.
66
+
67
+ If you redistribute any copies, modifications or derivatives of the Software,
68
+ you must include a copy of or a link to these Terms and Conditions and not
69
+ remove any copyright notices provided in or with the Software.
70
+
71
+ ### Disclaimer
72
+
73
+ THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND,
74
+ INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE,
75
+ MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
76
+
77
+ IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO
78
+ THE SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
79
+ DAMAGES, EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
80
+
81
+ ### Trademarks
82
+
83
+ Except for displaying the License Details and identifying us as the origin of
84
+ the Software, you have no right under these Terms and Conditions to use our
85
+ trademarks, trade names, service marks or product names.
86
+
87
+ ## Grant of Future License
88
+
89
+ We hereby irrevocably grant you an additional license to use the Software
90
+ under the Apache License, Version 2.0 that is effective on the second
91
+ anniversary of the date we make the Software available. On or after that
92
+ date, you may use the Software under the Apache License, Version 2.0, in
93
+ which case the following will apply:
94
+
95
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not
96
+ use this file except in compliance with the License.
97
+
98
+ You may obtain a copy of the License at
99
+
100
+ http://www.apache.org/licenses/LICENSE-2.0
101
+
102
+ Unless required by applicable law or agreed to in writing, software
103
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
104
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
105
+
106
+ See the License for the specific language governing permissions and
107
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @lloyal-labs/dev-tools
2
+
3
+ The dev pane for scaffolded harnesses. A cog appears when the harness runs
4
+ under `LLOYAL_DEV=1`; it opens a docked pane — Timeline, Sources, Settings —
5
+ fed entirely by the event bus the harness already emits. Nothing ships to end
6
+ users: without the dev signal the components render nothing.
7
+
8
+ - `@lloyal-labs/dev-tools` — the node-free model: event folding, control
9
+ tables, provenance vocabulary.
10
+ - `@lloyal-labs/dev-tools/react` — `<DevPane>`, mounted once beside the
11
+ shared React view (desktop + web).
12
+ - `@lloyal-labs/dev-tools/ink` — `<DevOverlay>`, a bounded ctrl+g overlay for
13
+ the terminal view.
14
+ - `@lloyal-labs/dev-tools/node` — `startHostResources`, the host sampler a
15
+ dev-gated Node boot starts beside its trace sink.
16
+
17
+ The harness itself never imports this package — the pane is a sink on the
18
+ bus, and the commands it dispatches are the same ones the composer already
19
+ sends.
@@ -0,0 +1,313 @@
1
+ /**
2
+ * The dev pane's node-free core: the event fold that turns a harness's bus
3
+ * stream into renderable pane state, the declarative control table a template
4
+ * contributes, and the provenance/tier vocabulary.
5
+ *
6
+ * Everything here is DERIVED from events the harness already emits — the pane
7
+ * never asks the harness for anything it doesn't already say. Events arrive
8
+ * structurally (`{ type: string }` + fields); this module reads only fields
9
+ * whose emitters are versioned alongside it (the template protocols and the
10
+ * agents package), and ignores what it doesn't know.
11
+ *
12
+ * @category DevTools
13
+ */
14
+ import type { ConfigOriginValue } from '@lloyal-labs/rig';
15
+ export type { ConfigOriginValue } from '@lloyal-labs/rig';
16
+ /** A structural bus event — the pane subscribes to the SAME stream the app
17
+ * view folds, and narrows by `type` per field it reads. */
18
+ export type DevEvent = {
19
+ type: string;
20
+ } & Record<string, unknown>;
21
+ /** The pane's tabs. `prompt` arrives with the trace transport — the model
22
+ * knows the name so the tab strip can reserve it, but v1 never activates it. */
23
+ export type PaneTab = 'timeline' | 'sources' | 'settings';
24
+ /**
25
+ * One template-contributed Settings control — pure DATA, no components. The
26
+ * pane renders a segmented control and dispatches
27
+ * `{ type: command, [field]: value }` on click; the template's reducer and
28
+ * handlers already know that command (it is the same one its composer sends).
29
+ */
30
+ export interface DevControl {
31
+ /** The config path this control edits (display + provenance lookup),
32
+ * e.g. `defaults.effort`. */
33
+ key: string;
34
+ /** The `ConfigOrigin` field carrying this key's provenance, e.g. `effort`
35
+ * is not tracked — use the origin key that is (`reasoningMode`), or omit. */
36
+ originKey?: string;
37
+ /** The values the segmented control offers, in display order. */
38
+ values: readonly string[];
39
+ /** The command `type` dispatched on selection. */
40
+ command: string;
41
+ /** The command field carrying the selected value. */
42
+ field: string;
43
+ /** One clause shown beside the control, e.g. `applies next run`. */
44
+ note?: string;
45
+ /** Read the current value out of the live config object. */
46
+ read: (config: Record<string, unknown>) => string | undefined;
47
+ }
48
+ /** A clarify exchange on the planner's lane — the planner waiting on the
49
+ * USER, rendered with the same call/wait/answer grammar a tool wait uses. */
50
+ export interface ClarifyExchange {
51
+ questions: string[];
52
+ askedAt: number;
53
+ answeredAt: number | null;
54
+ }
55
+ /** One lane row of the timeline: an agent's span, derived live from the bus. */
56
+ export interface AgentLane {
57
+ agentId: number;
58
+ parentAgentId: number | null;
59
+ /** The run phase current at spawn — research's own markers (`plan:start`,
60
+ * `research:start`, `synthesize:start`) when the template emits them;
61
+ * null when the wire says nothing (basic). Never guessed. */
62
+ role: 'planner' | 'research' | 'synth' | null;
63
+ spawnedAt: number;
64
+ doneAt: number | null;
65
+ /** Terminal outcome, when known. `failed` carries the reason. */
66
+ outcome: 'running' | 'done' | 'recovered' | 'failed';
67
+ failReason?: string;
68
+ tokenCount: number;
69
+ /** tool name → the call currently in flight (cleared on result). */
70
+ inflightTool: string | null;
71
+ /** The agent's delivered report — `agent:return` (voluntary) or
72
+ * `agent:recovered` (extracted). Null until one arrives. */
73
+ report: string | null;
74
+ reportSource: 'voluntary' | 'recovery' | null;
75
+ /** When the pool reclaimed the branch's KV (`branch:prune` mirror). */
76
+ prunedAt: number | null;
77
+ /** The pool's drop reason (`pool:agentDrop` mirror) — richer than the
78
+ * bus `agent:failed` reason. */
79
+ dropReason: string | null;
80
+ /** Set on the planner while it waits on the user (research's clarify). */
81
+ clarify: ClarifyExchange | null;
82
+ /** Per-token epistemics samples (`agent:produce` under the dev gate),
83
+ * time-anchored to the lane's span. h = model entropy in nats (how open
84
+ * the next-token choice was, over the full vocabulary); s = model
85
+ * surprisal in nats (−ln p of the token actually picked). Past the cap
86
+ * the array is decimated in place — pairs averaged (h) / maxed (s) — so
87
+ * the WHOLE run stays covered rather than a sliding recent window.
88
+ * Empty when tracing is off. */
89
+ epistemics: EpiSample[];
90
+ /** Running NLL accumulator over produced tokens — never decimated, so
91
+ * {@link lanePpl} stays exact for the lane's full lifetime. */
92
+ nllSum: number;
93
+ nllCount: number;
94
+ }
95
+ /** One per-token epistemics sample, stamped at fold time. */
96
+ /** One host-resources sample on the wire — produced by the node entry's
97
+ * sampler (`@lloyal-labs/dev-tools/node`), folded into {@link PaneModel.host}.
98
+ * Declared here so a node-free protocol can name it type-only. */
99
+ export interface HostResourcesEvent {
100
+ type: 'host:resources';
101
+ /** The harness process's CPU use since the last sample, as % of the
102
+ * whole machine (all cores). */
103
+ cpuPct: number;
104
+ /** The process's resident set, MB — on a model host this is effectively
105
+ * weights + KV + runtime. */
106
+ rssMb: number;
107
+ /** System-wide memory in use, MB — honest per-platform accounting
108
+ * (darwin: vm_stat active+wired+compressed; linux: total − MemAvailable).
109
+ * Absent where no honest read exists. */
110
+ sysMemUsedMb?: number;
111
+ /** Total machine memory, MB. */
112
+ sysMemTotalMb?: number;
113
+ }
114
+ export interface EpiSample {
115
+ at: number;
116
+ h: number;
117
+ s: number;
118
+ }
119
+ /** Model perplexity over the lane's produced tokens — exp(mean surprisal),
120
+ * the same accumulator the pool's branch tracker harvests. The one number
121
+ * comparable ACROSS agents; null before any sample. */
122
+ export declare function lanePpl(lane: AgentLane): number | null;
123
+ /** A harness intervention the model felt but the UI never showed until now:
124
+ * a guard rejecting a call before dispatch, a budget/pressure nudge, or an
125
+ * auth rejection on an ungranted protected tool. */
126
+ export interface Intervention {
127
+ kind: 'guard' | 'nudge' | 'auth';
128
+ agentId: number;
129
+ at: number;
130
+ tool?: string;
131
+ args?: string;
132
+ guard?: string;
133
+ message?: string;
134
+ reason?: string;
135
+ }
136
+ /** The admission funnel for one retrieval — `rerank:end`'s live mirror. */
137
+ export interface AdmissionSummary {
138
+ selectedPassageCount: number;
139
+ totalChars: number;
140
+ durationMs: number;
141
+ topResults: Array<{
142
+ file: string;
143
+ heading: string;
144
+ score: number;
145
+ textPreview?: string;
146
+ }>;
147
+ topK?: number;
148
+ tokenBudget?: number;
149
+ admittedTokens?: number;
150
+ threshold?: number;
151
+ totalScored?: number;
152
+ }
153
+ /** One tool call/result pair — the Sources tab's row. */
154
+ export interface Retrieval {
155
+ agentId: number;
156
+ tool: string;
157
+ args: string;
158
+ dispatchedAt: number;
159
+ settledAt: number | null;
160
+ /** The tool's JSON result string, when it settled. */
161
+ result: string | null;
162
+ contextAvailablePercent: number | null;
163
+ /** From the `tool:dispatch` mirror — keys the trace metadata below. */
164
+ callId: string | null;
165
+ /** explore (agent-local scoring) vs exploit (re-ranked against the query).
166
+ * Null when the wire never said. */
167
+ explore: boolean | null;
168
+ /** The admission funnel (`rerank:end` mirror), when the tool ran one. */
169
+ admission: AdmissionSummary | null;
170
+ /** Exploit dual scores (`entailment:content:exploit` mirror) — the
171
+ * before/after ranking the slope chart draws. */
172
+ exploitChunks: Array<{
173
+ heading: string;
174
+ toolQueryScore: number;
175
+ combinedScore: number;
176
+ }> | null;
177
+ /** The call is PARKED: the tool reported a transient failure and the pool
178
+ * will re-execute after `afterMs` (`agent:tool_retry`). Rendered as
179
+ * waiting-on-the-outside-world, never as bare in-flight. */
180
+ retry: {
181
+ at: number;
182
+ afterMs: number;
183
+ attempt: number;
184
+ } | null;
185
+ }
186
+ /** One point of the live pressure series (`agent:tick` is the bus twin of the
187
+ * trace's per-commit `pool:tick`). */
188
+ export interface PressurePoint {
189
+ at: number;
190
+ cellsUsed: number;
191
+ nCtx: number;
192
+ }
193
+ /** One INSTALLED ability (enabled or not), as `abilities:state` describes it: manifest-derived
194
+ * display fields, the config schema (field names/types for the Settings
195
+ * form), and stored config REDACTED to key-presence — values never ride
196
+ * the bus. */
197
+ export interface AbilityInfo {
198
+ name: string;
199
+ title?: string;
200
+ description?: string;
201
+ configSchema?: {
202
+ properties?: Record<string, {
203
+ type?: string;
204
+ description?: string;
205
+ 'x-secret'?: boolean;
206
+ }>;
207
+ required?: string[];
208
+ };
209
+ config: Record<string, unknown>;
210
+ enabled: boolean;
211
+ }
212
+ /** The folded pane state. Everything optional is honestly absent until its
213
+ * event arrives — the pane renders absence, never a placeholder value. */
214
+ export interface PaneModel {
215
+ /** The current run's phase cursor — set by the template's own phase events;
216
+ * tags each spawn with a role. */
217
+ runPhase: 'planner' | 'research' | 'synth' | null;
218
+ /** When the current run began (`query` / `plan:start`) — the timeline's
219
+ * anchor. Null before the first run. */
220
+ runStartAt: number | null;
221
+ /** When the run delivered its `answer` — the run-complete marker. The
222
+ * phase gap between pools has no open lanes but the run is still LIVE:
223
+ * liveness is runStartAt-to-runEndedAt, not lane-counting. */
224
+ runEndedAt: number | null;
225
+ /** When a clarify continuation re-entered planning — guards the paired
226
+ * `plan:start` → `query` that follows from resetting the run. */
227
+ runContinuedAt: number | null;
228
+ /** The dev gate — `config:loaded.dev`, the boot's LLOYAL_DEV signal carried
229
+ * on the wire. The FAB renders only when true. */
230
+ dev: boolean;
231
+ /** From basic's `ready.facts` — display only (research has no ready
232
+ * event; its status area degrades gracefully). */
233
+ facts: {
234
+ surface: string;
235
+ model: {
236
+ id: string;
237
+ sizeBytes: number;
238
+ };
239
+ abilities: string[];
240
+ } | null;
241
+ /** The live resolved config (`config:loaded` / `config:updated`, ability
242
+ * values already redacted by the harness). */
243
+ config: Record<string, unknown> | null;
244
+ /** Per-field provenance. */
245
+ origin: Record<string, ConfigOriginValue> | null;
246
+ /** Where the last save landed: a real path (edge) or null (served —
247
+ * "applied for this session"). Undefined until a save happens. */
248
+ lastSavedTo: string | null | undefined;
249
+ lanes: Map<number, AgentLane>;
250
+ retrievals: Retrieval[];
251
+ pressure: PressurePoint[];
252
+ /** Host samples (`host:resources`, dev-gated boots only): the harness
253
+ * process's cpu% of the whole machine, its resident set, and system
254
+ * memory (used/total MB, null where the platform offers no honest
255
+ * read) — the machine-pressure twin of the kv series. */
256
+ host: {
257
+ at: number;
258
+ cpu: number;
259
+ rssMb: number;
260
+ memUsedMb: number | null;
261
+ memTotalMb: number;
262
+ }[];
263
+ /** Guard rejections, nudges, auth rejections — in arrival order. */
264
+ interventions: Intervention[];
265
+ /** Enabled abilities (`abilities:state`) — the Settings nav + form source.
266
+ * Null until the harness says; a harness that never emits it degrades to
267
+ * the redacted config keys. */
268
+ abilities: AbilityInfo[] | null;
269
+ /** The structured plan (`plan` with research intent) — task descriptions
270
+ * in fanout order, which is also flat-mode spawn order. */
271
+ plan: {
272
+ intent: string;
273
+ tasks: string[];
274
+ } | null;
275
+ /** True between a clarify plan and the follow-up planning cycle — the
276
+ * next plan:start/query CONTINUES the run instead of resetting it. */
277
+ clarifying: boolean;
278
+ /** The first event's arrival time — the timeline's 0. */
279
+ t0: number | null;
280
+ eventCount: number;
281
+ }
282
+ export declare function createPaneModel(): PaneModel;
283
+ export declare function foldEvent(m: PaneModel, ev: DevEvent, now: number): void;
284
+ /** Live when any lane is still open — the run is producing and the pane's
285
+ * clocks (elapsed, park countdowns) must keep advancing even between
286
+ * events. */
287
+ export declare function isLive(m: PaneModel): boolean;
288
+ /** The latest pressure reading as a 0–100 used percentage, or null before the
289
+ * first tick. */
290
+ export declare function pressurePercent(m: PaneModel): number | null;
291
+ /** Downsample the pressure series to at most `buckets` points for a strip
292
+ * chart — plotted against TIME (the tick rate slows as the context fills, so
293
+ * index-based plotting would stretch exactly the interesting part). */
294
+ export declare function pressureStrip(m: PaneModel, buckets: number): {
295
+ at: number;
296
+ pct: number;
297
+ }[];
298
+ /** A fixed-width unicode sparkline of the pressure series — pure, node-free
299
+ * (the ink overlay renders it; anything else may too). */
300
+ export declare function sparkline(m: PaneModel, width: number): string;
301
+ /** Display order + one-clause meaning for each provenance rung — the six real
302
+ * values, nothing invented. */
303
+ export declare const PROVENANCE_RUNGS: readonly {
304
+ rung: ConfigOriginValue;
305
+ means: string;
306
+ }[];
307
+ /** The tier each well-known config key answers to. The runtime sets the tier,
308
+ * not the UI — it decides whether a control can exist at all. */
309
+ export type ConfigTier = 'session' | 'reload' | 'boot';
310
+ export declare const KEY_TIERS: Readonly<Record<string, ConfigTier>>;
311
+ /** Read a dotted config path off the live config object. */
312
+ export declare function readConfigPath(config: Record<string, unknown> | null, path: string): unknown;
313
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}