@lloyal-labs/dev-tools 0.4.2 → 0.5.0-alpha.10
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/index.d.ts +166 -57
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +254 -43
- package/dist/index.js.map +1 -1
- package/dist/ink.d.ts +20 -1
- package/dist/ink.d.ts.map +1 -1
- package/dist/ink.js +51 -11
- package/dist/ink.js.map +1 -1
- package/dist/react.d.ts +13 -5
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +277 -87
- package/dist/react.js.map +1 -1
- package/dist/store.d.ts +8 -3
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +13 -10
- package/dist/store.js.map +1 -1
- package/package.json +3 -7
- package/dist/node.d.ts +0 -6
- package/dist/node.d.ts.map +0 -1
- package/dist/node.js +0 -78
- package/dist/node.js.map +0 -1
package/dist/store.js
CHANGED
|
@@ -13,19 +13,18 @@
|
|
|
13
13
|
* are the same clock: a token stream never causes per-token renders.
|
|
14
14
|
*/
|
|
15
15
|
import { createStore } from 'zustand/vanilla';
|
|
16
|
-
import { createPaneModel, foldEvent, isLive } from './index.js';
|
|
16
|
+
import { createPaneModel, foldEvent, isLive, DEFAULT_FRAMING } from './index.js';
|
|
17
17
|
/** Live-edge quantum, ms — capsules grow and repaints happen on this grid. */
|
|
18
18
|
export const EDGE_STEP = 1000;
|
|
19
19
|
/** Event types whose arrival repaints immediately — everything a human reads
|
|
20
20
|
* as "something happened" rather than "the stream is flowing". */
|
|
21
|
-
const STRUCTURAL =
|
|
22
|
-
'config:loaded', 'config:updated', 'ready', 'abilities:state',
|
|
23
|
-
'plan:start', 'query', 'research:start', 'synthesize:start', 'plan',
|
|
21
|
+
const STRUCTURAL = [
|
|
22
|
+
'config:loaded', 'config:updated', 'ready', 'abilities:state', 'plan',
|
|
24
23
|
'agent:spawn', 'agent:done', 'agent:failed', 'agent:recovered',
|
|
25
24
|
'agent:return', 'agent:tool_call', 'agent:tool_result', 'agent:trace',
|
|
26
25
|
'run:paused', 'run:resumed', 'run:windingDown',
|
|
27
26
|
'answer', 'error',
|
|
28
|
-
]
|
|
27
|
+
];
|
|
29
28
|
/** One store per bridge, for the LIFETIME of the page. A React remount
|
|
30
29
|
* (fast refresh, StrictMode, lazy mounting) must REATTACH to the running
|
|
31
30
|
* fold, not restart it — a fresh store mid-run would miss the wire gate's
|
|
@@ -35,16 +34,20 @@ const STRUCTURAL = new Set([
|
|
|
35
34
|
* pane's; on today's contract a reload starts a new session, whose fresh
|
|
36
35
|
* stream re-opens the gate naturally. */
|
|
37
36
|
const STORES = new WeakMap();
|
|
38
|
-
export function devStoreFor(bridge) {
|
|
37
|
+
export function devStoreFor(bridge, framing) {
|
|
39
38
|
let store = STORES.get(bridge);
|
|
40
39
|
if (!store) {
|
|
41
|
-
store = createDevStore(bridge);
|
|
40
|
+
store = createDevStore(bridge, framing);
|
|
42
41
|
STORES.set(bridge, store);
|
|
43
42
|
}
|
|
44
43
|
return store;
|
|
45
44
|
}
|
|
46
|
-
export function createDevStore(bridge) {
|
|
45
|
+
export function createDevStore(bridge, framing = DEFAULT_FRAMING) {
|
|
47
46
|
const model = createPaneModel();
|
|
47
|
+
// Framing markers repaint immediately too — they are run boundaries.
|
|
48
|
+
const structural = new Set([
|
|
49
|
+
...STRUCTURAL, ...framing.open, ...framing.close, ...Object.keys(framing.phases),
|
|
50
|
+
]);
|
|
48
51
|
const store = createStore(() => ({
|
|
49
52
|
model,
|
|
50
53
|
rev: 0,
|
|
@@ -74,11 +77,11 @@ export function createDevStore(bridge) {
|
|
|
74
77
|
// a production stream pays one string compare per event, nothing more.
|
|
75
78
|
if (!model.dev && ev.type !== 'config:loaded')
|
|
76
79
|
return;
|
|
77
|
-
foldEvent(model, ev, performance.now());
|
|
80
|
+
foldEvent(model, ev, performance.now(), framing);
|
|
78
81
|
if (!model.dev)
|
|
79
82
|
return;
|
|
80
83
|
ensureTimer();
|
|
81
|
-
if (
|
|
84
|
+
if (structural.has(ev.type))
|
|
82
85
|
paint();
|
|
83
86
|
else
|
|
84
87
|
dirty = true;
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lloyal-labs/dev-tools",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "The dev pane for scaffolded harnesses
|
|
3
|
+
"version": "0.5.0-alpha.10",
|
|
4
|
+
"description": "The dev pane for scaffolded harnesses — timeline, sources, and settings over the event bus, gated by the runner's dev signal",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -17,10 +17,6 @@
|
|
|
17
17
|
"./ink": {
|
|
18
18
|
"types": "./dist/ink.d.ts",
|
|
19
19
|
"default": "./dist/ink.js"
|
|
20
|
-
},
|
|
21
|
-
"./node": {
|
|
22
|
-
"types": "./dist/node.d.ts",
|
|
23
|
-
"default": "./dist/node.js"
|
|
24
20
|
}
|
|
25
21
|
},
|
|
26
22
|
"publishConfig": {
|
|
@@ -52,7 +48,7 @@
|
|
|
52
48
|
"build": "tsc -p tsconfig.json"
|
|
53
49
|
},
|
|
54
50
|
"dependencies": {
|
|
55
|
-
"@lloyal-labs/rig": "
|
|
51
|
+
"@lloyal-labs/rig": "5.6.0-alpha.10",
|
|
56
52
|
"zustand": "^5.0.15"
|
|
57
53
|
},
|
|
58
54
|
"peerDependencies": {
|
package/dist/node.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { HostResourcesEvent } from './index.js';
|
|
2
|
-
export type { HostResourcesEvent } from './index.js';
|
|
3
|
-
/** Start sampling; returns the stop function. The timer is unref'd so it
|
|
4
|
-
* never holds the process open. */
|
|
5
|
-
export declare function startHostResources(send: (ev: HostResourcesEvent) => void, intervalMs?: number): () => void;
|
|
6
|
-
//# sourceMappingURL=node.d.ts.map
|
package/dist/node.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;oCACoC;AACpC,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,IAAI,EACtC,UAAU,SAAO,GAChB,MAAM,IAAI,CA2BZ"}
|
package/dist/node.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The pane's host-resources sampler — the ONLY node-bound entry in
|
|
3
|
-
* dev-tools. A dev-gated boot starts it beside the trace writer and sends
|
|
4
|
-
* each sample onto the harness event channel; the pane overlays the series
|
|
5
|
-
* on the pressure strip, so machine pressure and model pressure read on
|
|
6
|
-
* one axis.
|
|
7
|
-
*
|
|
8
|
-
* GPU is deliberately absent: neither Metal nor CUDA exposes a
|
|
9
|
-
* utilization number to an unprivileged process portably — honest
|
|
10
|
-
* omission over a fake gauge.
|
|
11
|
-
*/
|
|
12
|
-
import os from 'node:os';
|
|
13
|
-
import { execFile } from 'node:child_process';
|
|
14
|
-
import { readFile } from 'node:fs';
|
|
15
|
-
/** Start sampling; returns the stop function. The timer is unref'd so it
|
|
16
|
-
* never holds the process open. */
|
|
17
|
-
export function startHostResources(send, intervalMs = 2000) {
|
|
18
|
-
let lastCpu = process.cpuUsage();
|
|
19
|
-
let lastAt = Date.now();
|
|
20
|
-
const cores = Math.max(1, os.cpus().length);
|
|
21
|
-
const timer = setInterval(() => {
|
|
22
|
-
const cpu = process.cpuUsage();
|
|
23
|
-
const at = Date.now();
|
|
24
|
-
const busyUs = cpu.user - lastCpu.user + (cpu.system - lastCpu.system);
|
|
25
|
-
const wallUs = Math.max(1, (at - lastAt) * 1000);
|
|
26
|
-
lastCpu = cpu;
|
|
27
|
-
lastAt = at;
|
|
28
|
-
const ev = {
|
|
29
|
-
type: 'host:resources',
|
|
30
|
-
cpuPct: Math.min(100, Math.round((busyUs / (wallUs * cores)) * 100)),
|
|
31
|
-
rssMb: Math.round(process.memoryUsage.rss() / 1_048_576),
|
|
32
|
-
};
|
|
33
|
-
if (lastMemUsedMb !== null) {
|
|
34
|
-
ev.sysMemUsedMb = lastMemUsedMb;
|
|
35
|
-
ev.sysMemTotalMb = Math.round(os.totalmem() / 1_048_576);
|
|
36
|
-
}
|
|
37
|
-
send(ev);
|
|
38
|
-
readMemUsed((mb) => { lastMemUsedMb = mb; });
|
|
39
|
-
}, intervalMs);
|
|
40
|
-
timer.unref();
|
|
41
|
-
let lastMemUsedMb = null;
|
|
42
|
-
readMemUsed((mb) => { lastMemUsedMb = mb; });
|
|
43
|
-
return () => clearInterval(timer);
|
|
44
|
-
}
|
|
45
|
-
/** Honest system-memory accounting, per platform. `os.freemem()` counts
|
|
46
|
-
* file cache as used on macOS AND Linux, pinning a naive gauge at ~99% —
|
|
47
|
-
* the exact misreporting this pane exists to kill. darwin: vm_stat's
|
|
48
|
-
* active+wired+compressed over total; linux: 1 − MemAvailable/total;
|
|
49
|
-
* anywhere else (or on any failure): null, and the strip omits the line —
|
|
50
|
-
* absence over a fake number. */
|
|
51
|
-
function readMemUsed(cb) {
|
|
52
|
-
if (process.platform === 'darwin') {
|
|
53
|
-
execFile('vm_stat', (err, out) => {
|
|
54
|
-
if (err)
|
|
55
|
-
return cb(null);
|
|
56
|
-
const page = Number((out.match(/page size of (\d+)/) ?? [])[1]) || 16384;
|
|
57
|
-
const pages = (re) => Number((out.match(re) ?? [])[1]) || 0;
|
|
58
|
-
const used = (pages(/Pages active:\s+(\d+)/) +
|
|
59
|
-
pages(/Pages wired down:\s+(\d+)/) +
|
|
60
|
-
pages(/Pages occupied by compressor:\s+(\d+)/)) * page;
|
|
61
|
-
cb(used > 0 ? Math.round(used / 1_048_576) : null);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
else if (process.platform === 'linux') {
|
|
65
|
-
readFile('/proc/meminfo', 'utf8', (err, txt) => {
|
|
66
|
-
if (err)
|
|
67
|
-
return cb(null);
|
|
68
|
-
const kb = Number((txt.match(/MemAvailable:\s+(\d+) kB/) ?? [])[1]);
|
|
69
|
-
cb(Number.isFinite(kb) && kb > 0
|
|
70
|
-
? Math.round((os.totalmem() - kb * 1024) / 1_048_576)
|
|
71
|
-
: null);
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
cb(null);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
|