@qorejs/qore 1.0.4 → 1.0.5
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/README.md +3 -2
- package/dist/src/core/devtools.d.ts +6 -0
- package/dist/src/core/devtools.d.ts.map +1 -1
- package/dist/src/core/devtools.js +35 -2
- package/dist/src/core/devtools.js.map +1 -1
- package/docs/api.md +2 -0
- package/docs/devtools.md +21 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -108,13 +108,14 @@ import { createStreamInspector, stream } from '@qorejs/qore';
|
|
|
108
108
|
|
|
109
109
|
const inspector = createStreamInspector({ maxEvents: 200 });
|
|
110
110
|
const answer = stream(provider.chat(prompt), { name: 'answer' });
|
|
111
|
+
const trace = inspector.stream('answer');
|
|
111
112
|
|
|
112
113
|
await answer.ready;
|
|
113
|
-
console.
|
|
114
|
+
console.log(trace()?.firstChunkLatencyMs, trace()?.chunksPerSecond);
|
|
114
115
|
inspector.dispose();
|
|
115
116
|
```
|
|
116
117
|
|
|
117
|
-
The inspector is zero-dependency and built on the same `__QORE_DEVTOOLS__` hook that custom panels can consume.
|
|
118
|
+
The inspector is zero-dependency and built on the same `__QORE_DEVTOOLS__` hook that custom panels can consume. It reports lifecycle events, terminal state, first-chunk latency, total duration, and chunk throughput.
|
|
118
119
|
|
|
119
120
|
## Documentation
|
|
120
121
|
|
|
@@ -27,7 +27,12 @@ export interface QoreInspectedStream<TValue = unknown> {
|
|
|
27
27
|
chunkCount: number;
|
|
28
28
|
createdAt: number;
|
|
29
29
|
updatedAt: number;
|
|
30
|
+
firstChunkAt?: number;
|
|
30
31
|
finishedAt?: number;
|
|
32
|
+
durationMs?: number;
|
|
33
|
+
firstChunkLatencyMs?: number;
|
|
34
|
+
chunksPerSecond?: number;
|
|
35
|
+
terminal: boolean;
|
|
31
36
|
error?: Error | null;
|
|
32
37
|
}
|
|
33
38
|
export interface StreamInspectorOptions {
|
|
@@ -37,6 +42,7 @@ export interface StreamInspectorOptions {
|
|
|
37
42
|
export interface QoreStreamInspector {
|
|
38
43
|
events: ReadonlySignal<readonly QoreDevtoolsEvent[]>;
|
|
39
44
|
streams: ReadonlySignal<readonly QoreInspectedStream[]>;
|
|
45
|
+
stream(idOrName: string): ReadonlySignal<QoreInspectedStream | undefined>;
|
|
40
46
|
clear(): void;
|
|
41
47
|
dispose(): void;
|
|
42
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../../../src/core/devtools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../../../src/core/devtools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEzF,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAErG,MAAM,WAAW,uBAAuB,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO;IACzE,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,uBAAuB,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,IAAI,CAAC,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB,CAAC,MAAM,GAAG,OAAO;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IACrD,OAAO,EAAE,cAAc,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAC1E,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,KAAK,kBAAkB,GAAG,gBAAgB,GAAG,CAAC,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;AAE9F,OAAO,CAAC,MAAM,CAAC;IAGb,IAAI,iBAAiB,EAAE,kBAAkB,CAAC;CAC3C;AAID,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAsBpE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,mBAAmB,CAgH/F"}
|
|
@@ -28,6 +28,7 @@ export function createStreamInspector(options = {}) {
|
|
|
28
28
|
const { maxEvents = 500, capturePayloads = true } = options;
|
|
29
29
|
const previousHook = globalThis.__QORE_DEVTOOLS__;
|
|
30
30
|
const recordedEvents = signal([]);
|
|
31
|
+
const streamSelectors = new Map();
|
|
31
32
|
function record(event) {
|
|
32
33
|
const nextEvent = capturePayloads ? event : withoutPayload(event);
|
|
33
34
|
recordedEvents.update((currentEvents) => {
|
|
@@ -47,15 +48,20 @@ export function createStreamInspector(options = {}) {
|
|
|
47
48
|
const createdAt = previous?.createdAt ?? event.timestamp;
|
|
48
49
|
const updatedAt = event.timestamp;
|
|
49
50
|
const chunkCount = event.chunkCount ?? previous?.chunkCount ?? 0;
|
|
51
|
+
const terminal = previous?.terminal === true || isTerminalPhase(event.phase);
|
|
50
52
|
const nextStreamInput = {
|
|
51
53
|
id: event.id,
|
|
52
54
|
chunkCount,
|
|
53
55
|
createdAt,
|
|
54
|
-
updatedAt
|
|
56
|
+
updatedAt,
|
|
57
|
+
terminal
|
|
55
58
|
};
|
|
56
59
|
const name = event.name ?? previous?.name;
|
|
57
60
|
const status = event.status ?? previous?.status;
|
|
58
61
|
const value = event.value ?? previous?.value;
|
|
62
|
+
const firstChunkAt = event.phase === 'chunk'
|
|
63
|
+
? previous?.firstChunkAt ?? event.timestamp
|
|
64
|
+
: previous?.firstChunkAt;
|
|
59
65
|
const finishedAt = isTerminalPhase(event.phase) ? event.timestamp : previous?.finishedAt;
|
|
60
66
|
const error = event.error ?? previous?.error;
|
|
61
67
|
if (name !== undefined) {
|
|
@@ -67,6 +73,9 @@ export function createStreamInspector(options = {}) {
|
|
|
67
73
|
if (value !== undefined) {
|
|
68
74
|
nextStreamInput.value = value;
|
|
69
75
|
}
|
|
76
|
+
if (firstChunkAt !== undefined) {
|
|
77
|
+
nextStreamInput.firstChunkAt = firstChunkAt;
|
|
78
|
+
}
|
|
70
79
|
if (finishedAt !== undefined) {
|
|
71
80
|
nextStreamInput.finishedAt = finishedAt;
|
|
72
81
|
}
|
|
@@ -81,11 +90,24 @@ export function createStreamInspector(options = {}) {
|
|
|
81
90
|
return {
|
|
82
91
|
events: recordedEvents,
|
|
83
92
|
streams: inspectedStreams,
|
|
93
|
+
stream(idOrName) {
|
|
94
|
+
const existingSelector = streamSelectors.get(idOrName);
|
|
95
|
+
if (existingSelector) {
|
|
96
|
+
return existingSelector;
|
|
97
|
+
}
|
|
98
|
+
const selector = computed(() => inspectedStreams().find((stream) => stream.id === idOrName || stream.name === idOrName));
|
|
99
|
+
streamSelectors.set(idOrName, selector);
|
|
100
|
+
return selector;
|
|
101
|
+
},
|
|
84
102
|
clear() {
|
|
85
103
|
recordedEvents([]);
|
|
86
104
|
},
|
|
87
105
|
dispose() {
|
|
88
106
|
inspectedStreams.stop();
|
|
107
|
+
for (const selector of streamSelectors.values()) {
|
|
108
|
+
selector.stop();
|
|
109
|
+
}
|
|
110
|
+
streamSelectors.clear();
|
|
89
111
|
if (globalThis.__QORE_DEVTOOLS__ === record) {
|
|
90
112
|
globalThis.__QORE_DEVTOOLS__ = previousHook;
|
|
91
113
|
}
|
|
@@ -97,7 +119,8 @@ function createInspectedStream(input) {
|
|
|
97
119
|
id: input.id,
|
|
98
120
|
chunkCount: input.chunkCount,
|
|
99
121
|
createdAt: input.createdAt,
|
|
100
|
-
updatedAt: input.updatedAt
|
|
122
|
+
updatedAt: input.updatedAt,
|
|
123
|
+
terminal: input.terminal
|
|
101
124
|
};
|
|
102
125
|
if (input.name !== undefined) {
|
|
103
126
|
stream.name = input.name;
|
|
@@ -111,6 +134,16 @@ function createInspectedStream(input) {
|
|
|
111
134
|
if (input.finishedAt !== undefined) {
|
|
112
135
|
stream.finishedAt = input.finishedAt;
|
|
113
136
|
}
|
|
137
|
+
if (input.firstChunkAt !== undefined) {
|
|
138
|
+
stream.firstChunkAt = input.firstChunkAt;
|
|
139
|
+
stream.firstChunkLatencyMs = Math.max(0, input.firstChunkAt - input.createdAt);
|
|
140
|
+
}
|
|
141
|
+
const durationEnd = input.finishedAt ?? input.updatedAt;
|
|
142
|
+
const durationMs = Math.max(0, durationEnd - input.createdAt);
|
|
143
|
+
stream.durationMs = durationMs;
|
|
144
|
+
if (input.chunkCount > 0) {
|
|
145
|
+
stream.chunksPerSecond = input.chunkCount / (Math.max(1, durationMs) / 1000);
|
|
146
|
+
}
|
|
114
147
|
if (input.error !== undefined) {
|
|
115
148
|
stream.error = input.error;
|
|
116
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.js","sourceRoot":"","sources":["../../../src/core/devtools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"devtools.js","sourceRoot":"","sources":["../../../src/core/devtools.ts"],"names":[],"mappings":"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"}
|
package/docs/api.md
CHANGED
|
@@ -89,4 +89,6 @@ const answer = stream(source, { name: 'answer' });
|
|
|
89
89
|
- `createStreamInspector(options?)`: install a disposable inspector over the global DevTools hook.
|
|
90
90
|
- `QoreStreamInspector.events()`: recent raw stream lifecycle events.
|
|
91
91
|
- `QoreStreamInspector.streams()`: derived stream summaries for custom panels and tests.
|
|
92
|
+
- `QoreStreamInspector.stream(idOrName)`: subscribe to one stream summary by runtime id or name.
|
|
93
|
+
- `QoreInspectedStream`: includes status, chunk count, terminal state, first-chunk latency, duration, and chunks-per-second metrics.
|
|
92
94
|
- `QoreDevtoolsEvent`: exported TypeScript event type for custom inspectors.
|
package/docs/devtools.md
CHANGED
|
@@ -20,7 +20,27 @@ console.log(inspector.events());
|
|
|
20
20
|
inspector.dispose();
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
`inspector.events()` is a readonly signal containing the recent raw DevTools events. `inspector.streams()` is a derived readonly signal summarizing each observed stream by `id`, `name`, `status`, `chunkCount`, timestamps, and
|
|
23
|
+
`inspector.events()` is a readonly signal containing the recent raw DevTools events. `inspector.streams()` is a derived readonly signal summarizing each observed stream by `id`, `name`, `status`, `chunkCount`, timestamps, latest value, and runtime metrics.
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
const answerSummary = inspector.stream('answer');
|
|
27
|
+
|
|
28
|
+
console.log({
|
|
29
|
+
status: answerSummary()?.status,
|
|
30
|
+
firstChunkLatencyMs: answerSummary()?.firstChunkLatencyMs,
|
|
31
|
+
durationMs: answerSummary()?.durationMs,
|
|
32
|
+
chunksPerSecond: answerSummary()?.chunksPerSecond,
|
|
33
|
+
terminal: answerSummary()?.terminal
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The summary includes:
|
|
38
|
+
|
|
39
|
+
- `firstChunkAt`: timestamp for the first observed chunk
|
|
40
|
+
- `firstChunkLatencyMs`: time from stream creation to first chunk
|
|
41
|
+
- `durationMs`: time from stream creation to terminal state, or latest update while active
|
|
42
|
+
- `chunksPerSecond`: observed chunk throughput, using a 1ms minimum window for instant streams
|
|
43
|
+
- `terminal`: whether the stream reached `complete`, `error`, or `abort`
|
|
24
44
|
|
|
25
45
|
Use `capturePayloads: false` when you want lifecycle timing without retaining token payloads:
|
|
26
46
|
|