@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 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.table(inspector.streams());
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,EAAoB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpE,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,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,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,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,CAqF/F"}
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":"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"}
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 latest value.
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qorejs/qore",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Qore is a reactive stream runtime for AI-native interfaces.",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",