@perstack/react 0.0.56 → 0.0.58

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.
Files changed (47) hide show
  1. package/README.md +1 -3
  2. package/dist/src/hooks/index.d.ts +4 -0
  3. package/dist/src/hooks/index.d.ts.map +1 -0
  4. package/dist/src/hooks/index.js +4 -0
  5. package/dist/src/hooks/index.js.map +1 -0
  6. package/dist/src/hooks/use-job-stream.d.ts +17 -0
  7. package/dist/src/hooks/use-job-stream.d.ts.map +1 -0
  8. package/dist/src/hooks/use-job-stream.js +45 -0
  9. package/dist/src/hooks/use-job-stream.js.map +1 -0
  10. package/dist/src/hooks/use-job-streams.d.ts +14 -0
  11. package/dist/src/hooks/use-job-streams.d.ts.map +1 -0
  12. package/dist/src/hooks/use-job-streams.js +89 -0
  13. package/dist/src/hooks/use-job-streams.js.map +1 -0
  14. package/dist/src/hooks/use-run.d.ts +38 -0
  15. package/dist/src/hooks/use-run.d.ts.map +1 -0
  16. package/dist/src/hooks/use-run.js +200 -0
  17. package/dist/src/hooks/use-run.js.map +1 -0
  18. package/dist/src/index.d.ts +3 -156
  19. package/dist/src/index.d.ts.map +1 -0
  20. package/dist/src/index.js +4 -660
  21. package/dist/src/index.js.map +1 -1
  22. package/dist/src/types/index.d.ts +2 -0
  23. package/dist/src/types/index.d.ts.map +1 -0
  24. package/dist/src/types/index.js +2 -0
  25. package/dist/src/types/index.js.map +1 -0
  26. package/dist/src/types/runtime-state.d.ts +19 -0
  27. package/dist/src/types/runtime-state.d.ts.map +1 -0
  28. package/dist/src/types/runtime-state.js +2 -0
  29. package/dist/src/types/runtime-state.js.map +1 -0
  30. package/dist/src/utils/event-to-activity.d.ts +67 -0
  31. package/dist/src/utils/event-to-activity.d.ts.map +1 -0
  32. package/dist/src/utils/event-to-activity.js +337 -0
  33. package/dist/src/utils/event-to-activity.js.map +1 -0
  34. package/dist/src/utils/group-by-run.d.ts +24 -0
  35. package/dist/src/utils/group-by-run.d.ts.map +1 -0
  36. package/dist/src/utils/group-by-run.js +43 -0
  37. package/dist/src/utils/group-by-run.js.map +1 -0
  38. package/dist/src/utils/index.d.ts +4 -0
  39. package/dist/src/utils/index.d.ts.map +1 -0
  40. package/dist/src/utils/index.js +4 -0
  41. package/dist/src/utils/index.js.map +1 -0
  42. package/dist/src/utils/stream.d.ts +13 -0
  43. package/dist/src/utils/stream.d.ts.map +1 -0
  44. package/dist/src/utils/stream.js +18 -0
  45. package/dist/src/utils/stream.js.map +1 -0
  46. package/package.json +21 -19
  47. package/LICENSE +0 -202
package/README.md CHANGED
@@ -5,9 +5,7 @@ Reusable React hooks and utilities for Perstack integration. This is the shared
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
- npm install @perstack/react
9
- # or
10
- pnpm add @perstack/react
8
+ bun add @perstack/react
11
9
  ```
12
10
 
13
11
  ## Usage
@@ -0,0 +1,4 @@
1
+ export { type JobStreamState, type StreamConnector, useJobStream, } from "./use-job-stream.js";
2
+ export { type JobStreamSummary, useJobStreams } from "./use-job-streams.js";
3
+ export { type ActivityProcessState, type RunResult, useRun } from "./use-run.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,KAAK,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { useJobStream, } from "./use-job-stream.js";
2
+ export { useJobStreams } from "./use-job-streams.js";
3
+ export { useRun } from "./use-run.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,GACb,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAyB,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAA6C,MAAM,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,17 @@
1
+ import type { ActivityOrGroup } from "@perstack/core";
2
+ import type { StreamingState } from "../types/index.js";
3
+ import { type StreamConnector } from "../utils/stream.js";
4
+ export type { StreamConnector };
5
+ export type JobStreamState = {
6
+ activities: ActivityOrGroup[];
7
+ streaming: StreamingState;
8
+ latestActivity: ActivityOrGroup | null;
9
+ isConnected: boolean;
10
+ error: Error | null;
11
+ };
12
+ export declare function useJobStream(options: {
13
+ jobId: string | null;
14
+ connect: StreamConnector;
15
+ enabled?: boolean;
16
+ }): JobStreamState;
17
+ //# sourceMappingURL=use-job-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-job-stream.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-job-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAA+B,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGtF,YAAY,EAAE,eAAe,EAAE,CAAA;AAE/B,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,SAAS,EAAE,cAAc,CAAA;IACzB,cAAc,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB,CAAA;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,eAAe,CAAA;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,GAAG,cAAc,CA8CjB"}
@@ -0,0 +1,45 @@
1
+ import { useEffect, useMemo, useRef, useState } from "react";
2
+ import { consumeStream, isAbortError } from "../utils/stream.js";
3
+ import { useRun } from "./use-run.js";
4
+ export function useJobStream(options) {
5
+ const { jobId, connect, enabled = true } = options;
6
+ const shouldConnect = Boolean(jobId && enabled);
7
+ const { activities, streaming, addEvent } = useRun();
8
+ const [isConnected, setIsConnected] = useState(false);
9
+ const [error, setError] = useState(null);
10
+ const addEventRef = useRef(addEvent);
11
+ addEventRef.current = addEvent;
12
+ const connectRef = useRef(connect);
13
+ connectRef.current = connect;
14
+ useEffect(() => {
15
+ if (!shouldConnect || !jobId) {
16
+ setIsConnected(false);
17
+ return;
18
+ }
19
+ const controller = new AbortController();
20
+ async function run() {
21
+ setError(null);
22
+ setIsConnected(true);
23
+ try {
24
+ await consumeStream(connectRef.current, jobId, controller.signal, (event) => {
25
+ addEventRef.current(event);
26
+ });
27
+ }
28
+ catch (err) {
29
+ if (isAbortError(err))
30
+ return;
31
+ setError(err instanceof Error ? err : new Error(String(err)));
32
+ }
33
+ finally {
34
+ setIsConnected(false);
35
+ }
36
+ }
37
+ run();
38
+ return () => {
39
+ controller.abort();
40
+ };
41
+ }, [shouldConnect, jobId]);
42
+ const latestActivity = useMemo(() => (activities.length > 0 ? activities[activities.length - 1] : null), [activities]);
43
+ return { activities, streaming, latestActivity, isConnected, error };
44
+ }
45
+ //# sourceMappingURL=use-job-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-job-stream.js","sourceRoot":"","sources":["../../../src/hooks/use-job-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAwB,MAAM,oBAAoB,CAAA;AACtF,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAYrC,MAAM,UAAU,YAAY,CAAC,OAI5B;IACC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;IAClD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,CAAA;IAC/C,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAA;IACpD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAA;IACtD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IACpC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAA;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,cAAc,CAAC,KAAK,CAAC,CAAA;YACrB,OAAM;QACR,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QAExC,KAAK,UAAU,GAAG;YAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;YACd,cAAc,CAAC,IAAI,CAAC,CAAA;YACpB,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,KAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC3E,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC5B,CAAC,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,YAAY,CAAC,GAAG,CAAC;oBAAE,OAAM;gBAC7B,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YAC/D,CAAC;oBAAS,CAAC;gBACT,cAAc,CAAC,KAAK,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QAED,GAAG,EAAE,CAAA;QACL,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAA;IAE1B,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EACxE,CAAC,UAAU,CAAC,CACb,CAAA;IAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;AACtE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ActivityOrGroup } from "@perstack/core";
2
+ import { type StreamConnector } from "../utils/stream.js";
3
+ export type JobStreamSummary = {
4
+ latestActivity: ActivityOrGroup | null;
5
+ isConnected: boolean;
6
+ };
7
+ export declare function useJobStreams(options: {
8
+ jobs: Array<{
9
+ id: string;
10
+ enabled: boolean;
11
+ }>;
12
+ connect: StreamConnector;
13
+ }): Map<string, JobStreamSummary>;
14
+ //# sourceMappingURL=use-job-streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-job-streams.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-job-streams.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAOrD,OAAO,EAA+B,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEtF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,eAAe,GAAG,IAAI,CAAA;IACtC,WAAW,EAAE,OAAO,CAAA;CACrB,CAAA;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAC7C,OAAO,EAAE,eAAe,CAAA;CACzB,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAwFhC"}
@@ -0,0 +1,89 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { createInitialActivityProcessState, processRunEventToActivity, } from "../utils/event-to-activity.js";
3
+ import { consumeStream, isAbortError } from "../utils/stream.js";
4
+ export function useJobStreams(options) {
5
+ const { jobs, connect } = options;
6
+ const [states, setStates] = useState(new Map());
7
+ const controllersRef = useRef(new Map());
8
+ const activityStateRef = useRef(new Map());
9
+ const connectRef = useRef(connect);
10
+ connectRef.current = connect;
11
+ const connectToJob = useCallback(async (jobId, signal) => {
12
+ setStates((prev) => {
13
+ const next = new Map(prev);
14
+ next.set(jobId, { latestActivity: null, isConnected: true });
15
+ return next;
16
+ });
17
+ let state = activityStateRef.current.get(jobId);
18
+ if (!state) {
19
+ state = createInitialActivityProcessState();
20
+ activityStateRef.current.set(jobId, state);
21
+ }
22
+ try {
23
+ await consumeStream(connectRef.current, jobId, signal, (event) => {
24
+ let latestActivity = null;
25
+ processRunEventToActivity(state, event, (activity) => {
26
+ latestActivity = activity;
27
+ });
28
+ if (latestActivity) {
29
+ setStates((prev) => {
30
+ const next = new Map(prev);
31
+ next.set(jobId, { latestActivity, isConnected: true });
32
+ return next;
33
+ });
34
+ }
35
+ });
36
+ }
37
+ catch (err) {
38
+ if (isAbortError(err))
39
+ return;
40
+ console.error(`Stream connection failed for job ${jobId}:`, err);
41
+ }
42
+ finally {
43
+ setStates((prev) => {
44
+ const current = prev.get(jobId);
45
+ if (!current)
46
+ return prev;
47
+ const next = new Map(prev);
48
+ next.set(jobId, { ...current, isConnected: false });
49
+ return next;
50
+ });
51
+ }
52
+ }, []);
53
+ useEffect(() => {
54
+ const enabledIds = new Set(jobs.filter((j) => j.enabled).map((j) => j.id));
55
+ // Disconnect removed/disabled jobs
56
+ for (const [jobId, controller] of controllersRef.current) {
57
+ if (!enabledIds.has(jobId)) {
58
+ controller.abort();
59
+ controllersRef.current.delete(jobId);
60
+ activityStateRef.current.delete(jobId);
61
+ setStates((prev) => {
62
+ const next = new Map(prev);
63
+ next.delete(jobId);
64
+ return next;
65
+ });
66
+ }
67
+ }
68
+ // Connect new jobs
69
+ for (const jobId of enabledIds) {
70
+ if (!controllersRef.current.has(jobId)) {
71
+ const controller = new AbortController();
72
+ controllersRef.current.set(jobId, controller);
73
+ connectToJob(jobId, controller.signal);
74
+ }
75
+ }
76
+ }, [jobs, connectToJob]);
77
+ // Cleanup on unmount only
78
+ useEffect(() => {
79
+ return () => {
80
+ for (const controller of controllersRef.current.values()) {
81
+ controller.abort();
82
+ }
83
+ controllersRef.current.clear();
84
+ activityStateRef.current.clear();
85
+ };
86
+ }, []);
87
+ return states;
88
+ }
89
+ //# sourceMappingURL=use-job-streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-job-streams.js","sourceRoot":"","sources":["../../../src/hooks/use-job-streams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { ActivityOrGroup, PerstackEvent, StreamingEvent } from "@perstack/core";
2
+ import type { StreamingState } from "../types/index.js";
3
+ import { type ActivityProcessState } from "../utils/event-to-activity.js";
4
+ export type { ActivityProcessState };
5
+ export declare const isStreamingEvent: (event: PerstackEvent) => event is StreamingEvent;
6
+ export type ProcessStreamingEventResult = {
7
+ newState: StreamingState;
8
+ handled: boolean;
9
+ };
10
+ export declare function processStreamingEvent(event: StreamingEvent, prevState: StreamingState): ProcessStreamingEventResult;
11
+ export type RunResult = {
12
+ /** Accumulated activities from RunEvent (may include ParallelActivitiesGroup) */
13
+ activities: ActivityOrGroup[];
14
+ /** Current streaming state */
15
+ streaming: StreamingState;
16
+ /** Whether the run is complete */
17
+ isComplete: boolean;
18
+ /** Number of events processed */
19
+ eventCount: number;
20
+ /** Add a new event to be processed */
21
+ addEvent: (event: PerstackEvent) => void;
22
+ /** Append historical events (processes and appends to activities) */
23
+ appendHistoricalEvents: (events: PerstackEvent[]) => void;
24
+ /** Clear streaming state */
25
+ clearStreaming: () => void;
26
+ };
27
+ /**
28
+ * Hook for managing Run state from RunEvent stream.
29
+ *
30
+ * Architecture:
31
+ * - ExpertStateEvent → ActivityOrGroup[] (accumulated, append-only)
32
+ * - StreamingEvent → StreamingState (latest only, for display)
33
+ *
34
+ * IMPORTANT: activities are append-only and never cleared.
35
+ * This is required for compatibility with Ink's <Static> component.
36
+ */
37
+ export declare function useRun(): RunResult;
38
+ //# sourceMappingURL=use-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-run.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EACL,KAAK,oBAAoB,EAG1B,MAAM,+BAA+B,CAAA;AAEtC,YAAY,EAAE,oBAAoB,EAAE,CAAA;AAWpC,eAAO,MAAM,gBAAgB,GAAI,OAAO,aAAa,KAAG,KAAK,IAAI,cACiB,CAAA;AAElF,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,cAAc,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,cAAc,GACxB,2BAA2B,CA+G7B;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,iFAAiF;IACjF,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,8BAA8B;IAC9B,SAAS,EAAE,cAAc,CAAA;IACzB,kCAAkC;IAClC,UAAU,EAAE,OAAO,CAAA;IACnB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,sCAAsC;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IACxC,qEAAqE;IACrE,sBAAsB,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,IAAI,CAAA;IACzD,4BAA4B;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,MAAM,IAAI,SAAS,CAiGlC"}
@@ -0,0 +1,200 @@
1
+ import { useCallback, useRef, useState } from "react";
2
+ import { createInitialActivityProcessState, processRunEventToActivity, } from "../utils/event-to-activity.js";
3
+ const STREAMING_EVENT_TYPES = new Set([
4
+ "startStreamingReasoning",
5
+ "streamReasoning",
6
+ "completeStreamingReasoning",
7
+ "startStreamingRunResult",
8
+ "streamRunResult",
9
+ "completeStreamingRunResult",
10
+ ]);
11
+ export const isStreamingEvent = (event) => "type" in event && "expertKey" in event && STREAMING_EVENT_TYPES.has(event.type);
12
+ export function processStreamingEvent(event, prevState) {
13
+ const { runId, expertKey } = event;
14
+ switch (event.type) {
15
+ case "startStreamingReasoning": {
16
+ return {
17
+ newState: {
18
+ ...prevState,
19
+ runs: {
20
+ ...prevState.runs,
21
+ [runId]: {
22
+ expertKey,
23
+ reasoning: "",
24
+ isReasoningActive: true,
25
+ },
26
+ },
27
+ },
28
+ handled: true,
29
+ };
30
+ }
31
+ case "streamReasoning": {
32
+ return {
33
+ newState: {
34
+ ...prevState,
35
+ runs: {
36
+ ...prevState.runs,
37
+ [runId]: {
38
+ ...prevState.runs[runId],
39
+ expertKey,
40
+ reasoning: (prevState.runs[runId]?.reasoning ?? "") + event.delta,
41
+ },
42
+ },
43
+ },
44
+ handled: true,
45
+ };
46
+ }
47
+ case "completeStreamingReasoning": {
48
+ return {
49
+ newState: {
50
+ ...prevState,
51
+ runs: {
52
+ ...prevState.runs,
53
+ [runId]: {
54
+ ...prevState.runs[runId],
55
+ expertKey,
56
+ isReasoningActive: false,
57
+ },
58
+ },
59
+ },
60
+ handled: false,
61
+ };
62
+ }
63
+ case "startStreamingRunResult": {
64
+ return {
65
+ newState: {
66
+ ...prevState,
67
+ runs: {
68
+ ...prevState.runs,
69
+ [runId]: {
70
+ expertKey,
71
+ reasoning: undefined,
72
+ isReasoningActive: false,
73
+ runResult: "",
74
+ isRunResultActive: true,
75
+ },
76
+ },
77
+ },
78
+ handled: true,
79
+ };
80
+ }
81
+ case "streamRunResult": {
82
+ return {
83
+ newState: {
84
+ ...prevState,
85
+ runs: {
86
+ ...prevState.runs,
87
+ [runId]: {
88
+ ...prevState.runs[runId],
89
+ expertKey,
90
+ runResult: (prevState.runs[runId]?.runResult ?? "") + event.delta,
91
+ },
92
+ },
93
+ },
94
+ handled: true,
95
+ };
96
+ }
97
+ case "completeStreamingRunResult": {
98
+ return {
99
+ newState: {
100
+ ...prevState,
101
+ runs: {
102
+ ...prevState.runs,
103
+ [runId]: {
104
+ ...prevState.runs[runId],
105
+ expertKey,
106
+ isRunResultActive: false,
107
+ },
108
+ },
109
+ },
110
+ handled: true,
111
+ };
112
+ }
113
+ default:
114
+ return { newState: prevState, handled: false };
115
+ }
116
+ }
117
+ /**
118
+ * Hook for managing Run state from RunEvent stream.
119
+ *
120
+ * Architecture:
121
+ * - ExpertStateEvent → ActivityOrGroup[] (accumulated, append-only)
122
+ * - StreamingEvent → StreamingState (latest only, for display)
123
+ *
124
+ * IMPORTANT: activities are append-only and never cleared.
125
+ * This is required for compatibility with Ink's <Static> component.
126
+ */
127
+ export function useRun() {
128
+ const [activities, setActivities] = useState([]);
129
+ const [streaming, setStreaming] = useState({ runs: {} });
130
+ const [eventCount, setEventCount] = useState(0);
131
+ const [isComplete, setIsComplete] = useState(false);
132
+ const stateRef = useRef(createInitialActivityProcessState());
133
+ const clearStreaming = useCallback(() => {
134
+ setStreaming({ runs: {} });
135
+ }, []);
136
+ const handleStreamingEvent = useCallback((event) => {
137
+ let handled = false;
138
+ setStreaming((prev) => {
139
+ const result = processStreamingEvent(event, prev);
140
+ handled = result.handled;
141
+ return result.newState;
142
+ });
143
+ return handled;
144
+ }, []);
145
+ const processEvent = useCallback((event) => {
146
+ const newActivities = [];
147
+ const addActivity = (activity) => newActivities.push(activity);
148
+ processRunEventToActivity(stateRef.current, event, addActivity);
149
+ if (newActivities.length > 0) {
150
+ setActivities((prev) => [...prev, ...newActivities]);
151
+ }
152
+ const rootRunComplete = Array.from(stateRef.current.runStates.values()).some((rs) => rs.isComplete && !rs.delegatedBy);
153
+ setIsComplete(rootRunComplete);
154
+ }, []);
155
+ const clearRunStreaming = useCallback((runId) => {
156
+ setStreaming((prev) => {
157
+ const { [runId]: _, ...rest } = prev.runs;
158
+ return { runs: rest };
159
+ });
160
+ }, []);
161
+ const addEvent = useCallback((event) => {
162
+ if (isStreamingEvent(event)) {
163
+ const handled = handleStreamingEvent(event);
164
+ if (handled) {
165
+ setEventCount((prev) => prev + 1);
166
+ return;
167
+ }
168
+ }
169
+ if ("type" in event &&
170
+ "runId" in event &&
171
+ (event.type === "completeRun" || event.type === "stopRunByError")) {
172
+ clearRunStreaming(event.runId);
173
+ }
174
+ processEvent(event);
175
+ setEventCount((prev) => prev + 1);
176
+ }, [handleStreamingEvent, clearRunStreaming, processEvent]);
177
+ const appendHistoricalEvents = useCallback((historicalEvents) => {
178
+ const newActivities = [];
179
+ const addActivity = (activity) => newActivities.push(activity);
180
+ for (const event of historicalEvents) {
181
+ processRunEventToActivity(stateRef.current, event, addActivity);
182
+ }
183
+ if (newActivities.length > 0) {
184
+ setActivities((prev) => [...prev, ...newActivities]);
185
+ }
186
+ setEventCount((prev) => prev + historicalEvents.length);
187
+ const rootRunComplete = Array.from(stateRef.current.runStates.values()).some((rs) => rs.isComplete && !rs.delegatedBy);
188
+ setIsComplete(rootRunComplete);
189
+ }, []);
190
+ return {
191
+ activities,
192
+ streaming,
193
+ isComplete,
194
+ eventCount,
195
+ addEvent,
196
+ appendHistoricalEvents,
197
+ clearStreaming,
198
+ };
199
+ }
200
+ //# sourceMappingURL=use-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-run.js","sourceRoot":"","sources":["../../../src/hooks/use-run.ts"],"names":[],"mappings":"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"}
@@ -1,157 +1,4 @@
1
- import { Activity, ActivityOrGroup, PerstackEvent, ToolCall, ToolResult } from "@perstack/core";
2
-
3
- //#region src/types/runtime-state.d.ts
4
- /** Per-run streaming state for real-time display */
5
- type PerRunStreamingState = {
6
- /** Expert key for this run */expertKey: string; /** Accumulated reasoning text during extended thinking */
7
- reasoning?: string; /** Accumulated run result text during generation */
8
- runResult?: string; /** Whether reasoning is currently streaming */
9
- isReasoningActive?: boolean; /** Whether run result is currently streaming */
10
- isRunResultActive?: boolean;
11
- };
12
- /** Streaming state organized by run ID to support parallel execution */
13
- type StreamingState = {
14
- /** Per-run streaming state, keyed by runId */runs: Record<string, PerRunStreamingState>;
15
- };
16
- //#endregion
17
- //#region src/utils/stream.d.ts
18
- type StreamConnector = (jobId: string, signal: AbortSignal) => Promise<AsyncIterable<PerstackEvent>>;
19
- //#endregion
20
- //#region src/hooks/use-job-stream.d.ts
21
- type JobStreamState = {
22
- activities: ActivityOrGroup[];
23
- streaming: StreamingState;
24
- latestActivity: ActivityOrGroup | null;
25
- isConnected: boolean;
26
- error: Error | null;
27
- };
28
- declare function useJobStream(options: {
29
- jobId: string | null;
30
- connect: StreamConnector;
31
- enabled?: boolean;
32
- }): JobStreamState;
33
- //#endregion
34
- //#region src/hooks/use-job-streams.d.ts
35
- type JobStreamSummary = {
36
- latestActivity: ActivityOrGroup | null;
37
- isConnected: boolean;
38
- };
39
- declare function useJobStreams(options: {
40
- jobs: Array<{
41
- id: string;
42
- enabled: boolean;
43
- }>;
44
- connect: StreamConnector;
45
- }): Map<string, JobStreamSummary>;
46
- //#endregion
47
- //#region src/utils/event-to-activity.d.ts
48
- /**
49
- * Converts a tool call and result to an Activity.
50
- * Delegates to core's createBaseToolActivity/createGeneralToolActivity to avoid duplication.
51
- */
52
- declare function toolToActivity(toolCall: ToolCall, toolResult: ToolResult, reasoning: string | undefined, meta: {
53
- id: string;
54
- expertKey: string;
55
- runId: string;
56
- previousActivityId?: string;
57
- delegatedBy?: {
58
- expertKey: string;
59
- runId: string;
60
- };
61
- }): Activity;
62
- type ToolState = {
63
- id: string;
64
- toolCall: ToolCall;
65
- logged: boolean;
66
- };
67
- /**
68
- * Per-run state to support parallel execution.
69
- * Each run maintains its own independent state.
70
- */
71
- type RunState = {
72
- expertKey: string;
73
- queryLogged: boolean;
74
- completionLogged: boolean;
75
- isComplete: boolean;
76
- completedReasoning?: string;
77
- lastActivityId?: string;
78
- delegatedBy?: {
79
- expertKey: string;
80
- runId: string;
81
- }; /** Track if this run has pending delegate tool calls (for delegation complete detection) */
82
- pendingDelegateCount: number;
83
- };
84
- /**
85
- * State for processing RunEvent stream into Activity[].
86
- * This state tracks tool calls and their results to create complete Activity items.
87
- *
88
- * Supports the daisy chain architecture:
89
- * - Within-Run ordering via lastActivityId (per-run state)
90
- * - Cross-Run ordering via delegatedBy (per-run state)
91
- *
92
- * Note: `tools` is NOT cleared on new run to support delegation results
93
- * that arrive after parent expert resumes with a new runId.
94
- */
95
- type ActivityProcessState = {
96
- /** Tool calls indexed by toolCallId - persisted across runs for delegation handling */tools: Map<string, ToolState>; /** Per-run state to support parallel execution */
97
- runStates: Map<string, RunState>;
98
- };
99
- declare function createInitialActivityProcessState(): ActivityProcessState;
100
- /**
101
- * Processes a RunEvent and produces Activity or ParallelActivitiesGroup items.
102
- * Only processes RunEvent (state machine transitions), not RuntimeEvent.
103
- *
104
- * @param state - Mutable processing state
105
- * @param event - The event to process
106
- * @param addActivity - Callback to add a new Activity or ParallelActivitiesGroup
107
- */
108
- declare function processRunEventToActivity(state: ActivityProcessState, event: PerstackEvent, addActivity: (activity: ActivityOrGroup) => void): void;
109
- //#endregion
110
- //#region src/hooks/use-run.d.ts
111
- type RunResult = {
112
- /** Accumulated activities from RunEvent (may include ParallelActivitiesGroup) */activities: ActivityOrGroup[]; /** Current streaming state */
113
- streaming: StreamingState; /** Whether the run is complete */
114
- isComplete: boolean; /** Number of events processed */
115
- eventCount: number; /** Add a new event to be processed */
116
- addEvent: (event: PerstackEvent) => void; /** Append historical events (processes and appends to activities) */
117
- appendHistoricalEvents: (events: PerstackEvent[]) => void; /** Clear streaming state */
118
- clearStreaming: () => void;
119
- };
120
- /**
121
- * Hook for managing Run state from RunEvent stream.
122
- *
123
- * Architecture:
124
- * - ExpertStateEvent → ActivityOrGroup[] (accumulated, append-only)
125
- * - StreamingEvent → StreamingState (latest only, for display)
126
- *
127
- * IMPORTANT: activities are append-only and never cleared.
128
- * This is required for compatibility with Ink's <Static> component.
129
- */
130
- declare function useRun(): RunResult;
131
- //#endregion
132
- //#region src/utils/group-by-run.d.ts
133
- /**
134
- * Represents a group of activities belonging to the same run
135
- */
136
- type RunGroup = {
137
- runId: string;
138
- expertKey: string;
139
- activities: ActivityOrGroup[];
140
- delegatedBy?: {
141
- expertKey: string;
142
- runId: string;
143
- };
144
- };
145
- /**
146
- * Groups activities by their runId while preserving order.
147
- *
148
- * This function groups activities so that each run can be displayed in its own
149
- * visual section (e.g., separate <Static> components in Ink).
150
- *
151
- * @param activities - Array of activities or groups to group
152
- * @returns Array of RunGroup objects, ordered by first appearance
153
- */
154
- declare function groupActivitiesByRun(activities: ActivityOrGroup[]): RunGroup[];
155
- //#endregion
156
- export { type ActivityProcessState, type ActivityProcessState as UtilActivityProcessState, type JobStreamState, type JobStreamSummary, type PerRunStreamingState, type RunGroup, type RunResult, type StreamConnector, type StreamingState, createInitialActivityProcessState, groupActivitiesByRun, processRunEventToActivity, toolToActivity, useJobStream, useJobStreams, useRun };
1
+ export { type ActivityProcessState, type JobStreamState, type JobStreamSummary, type RunResult, type StreamConnector, useJobStream, useJobStreams, useRun, } from "./hooks/index.js";
2
+ export type { PerRunStreamingState, StreamingState } from "./types/index.js";
3
+ export { type ActivityProcessState as UtilActivityProcessState, createInitialActivityProcessState, groupActivitiesByRun, processRunEventToActivity, type RunGroup, toolToActivity, } from "./utils/index.js";
157
4
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,YAAY,EACZ,aAAa,EACb,MAAM,GACP,MAAM,kBAAkB,CAAA;AAGzB,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAG5E,OAAO,EACL,KAAK,oBAAoB,IAAI,wBAAwB,EACrD,iCAAiC,EACjC,oBAAoB,EACpB,yBAAyB,EACzB,KAAK,QAAQ,EACb,cAAc,GACf,MAAM,kBAAkB,CAAA"}