@qorejs/qore 1.0.4 → 1.0.6

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
@@ -80,6 +80,8 @@ Each selected stream is still a signal and an async iterable. A timeline can ren
80
80
 
81
81
  Qore can be used inside React without replacing your UI stack. The release-ready adapter lives in [`packages/react`](./packages/react) and subscribes to Qore streams through React's external store contract, so the stream remains the source of truth while React renders the view.
82
82
 
83
+ > Status: `@qorejs/react` is release-ready in this repository, but npm publishing is still waiting on `@qorejs/react` package access for the `@qorejs` scope. The adapter smoke test passes; the package will be announced as published only after npm accepts it.
84
+
83
85
  ```tsx
84
86
  import { stream } from '@qorejs/qore';
85
87
  import { useQoreStream } from '@qorejs/react';
@@ -108,13 +110,14 @@ import { createStreamInspector, stream } from '@qorejs/qore';
108
110
 
109
111
  const inspector = createStreamInspector({ maxEvents: 200 });
110
112
  const answer = stream(provider.chat(prompt), { name: 'answer' });
113
+ const trace = inspector.stream('answer');
111
114
 
112
115
  await answer.ready;
113
- console.table(inspector.streams());
116
+ console.log(trace()?.firstChunkLatencyMs, trace()?.chunksPerSecond);
114
117
  inspector.dispose();
115
118
  ```
116
119
 
117
- The inspector is zero-dependency and built on the same `__QORE_DEVTOOLS__` hook that custom panels can consume.
120
+ 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
121
 
119
122
  ## Documentation
120
123
 
@@ -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/docs/react.md CHANGED
@@ -2,7 +2,10 @@
2
2
 
3
3
  Qore's core runtime is framework-neutral. The React adapter lets React apps consume Qore streams without treating streaming as a special rendering case.
4
4
 
5
+ > Status: the adapter is release-ready in [`packages/react`](../packages/react), but the npm package is not published yet. Publishing currently fails with npm `E404` for `@qorejs/react`, which means the `@qorejs` npm scope/package access still needs to be provisioned before the install command below becomes valid.
6
+
5
7
  ```bash
8
+ # Available after npm package access is provisioned.
6
9
  npm i @qorejs/qore @qorejs/react
7
10
  ```
8
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qorejs/qore",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Qore is a reactive stream runtime for AI-native interfaces.",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",