@fabric-harness/react 0.2.0
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/LICENSE +17 -0
- package/NOTICE +4 -0
- package/README.md +22 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +326 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
Copyright 2026 Fabric
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
package/NOTICE
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @fabric-harness/react
|
|
2
|
+
|
|
3
|
+
React provider and hooks for Fabric Harness agents and finite jobs.
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import { FabricProvider, useFabricAgent } from '@fabric-harness/react';
|
|
7
|
+
|
|
8
|
+
function Chat() {
|
|
9
|
+
const chat = useFabricAgent({ agent: 'support', id: 'customer-42' });
|
|
10
|
+
return <button onClick={() => chat.send('Hello')}>Send</button>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function App() {
|
|
14
|
+
return (
|
|
15
|
+
<FabricProvider options={{ baseUrl: 'http://localhost:4317' }}>
|
|
16
|
+
<Chat />
|
|
17
|
+
</FabricProvider>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Apache-2.0
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type AgentAddress, type FabricClient, type FabricClientOptions, type JobRun, type JobRunReceipt, type SubmissionStatus, type WaitOptions } from '@fabric-harness/client';
|
|
3
|
+
import type { ConversationStreamRecord, DeliveredMessage, SessionEntry } from '@fabric-harness/sdk';
|
|
4
|
+
export interface OptimisticAgentMessage {
|
|
5
|
+
id: string;
|
|
6
|
+
message: string | DeliveredMessage;
|
|
7
|
+
status: 'sending' | 'admitted' | 'failed';
|
|
8
|
+
submissionId?: string;
|
|
9
|
+
error?: Error | undefined;
|
|
10
|
+
}
|
|
11
|
+
export interface FabricAgentSnapshot {
|
|
12
|
+
status: 'idle' | 'connecting' | 'sending' | 'error';
|
|
13
|
+
records: readonly ConversationStreamRecord[];
|
|
14
|
+
transcript: readonly SessionEntry[];
|
|
15
|
+
pending: readonly OptimisticAgentMessage[];
|
|
16
|
+
error?: Error | undefined;
|
|
17
|
+
}
|
|
18
|
+
export interface FabricAgentStore {
|
|
19
|
+
getSnapshot(): FabricAgentSnapshot;
|
|
20
|
+
subscribe(listener: () => void): () => void;
|
|
21
|
+
connect(): () => void;
|
|
22
|
+
send(message: string | DeliveredMessage): Promise<string>;
|
|
23
|
+
wait(submissionId: string, options?: WaitOptions): Promise<SubmissionStatus>;
|
|
24
|
+
prompt(message: string | DeliveredMessage): Promise<unknown>;
|
|
25
|
+
retry(id?: string): Promise<string>;
|
|
26
|
+
abort(): Promise<string[]>;
|
|
27
|
+
}
|
|
28
|
+
export interface FabricStoreOptions {
|
|
29
|
+
/** Called when the store has no subscribers, no observers, and no in-flight work. */
|
|
30
|
+
onEvict?: () => void;
|
|
31
|
+
}
|
|
32
|
+
export declare function createFabricAgentStore(client: FabricClient, address: AgentAddress, storeOptions?: FabricStoreOptions): FabricAgentStore;
|
|
33
|
+
export interface FabricJobSnapshot<TOutput = unknown> {
|
|
34
|
+
status: 'idle' | 'submitting' | JobRun['status'] | 'error';
|
|
35
|
+
receipt?: JobRunReceipt;
|
|
36
|
+
run?: JobRun<TOutput>;
|
|
37
|
+
events: readonly Record<string, unknown>[];
|
|
38
|
+
error?: Error;
|
|
39
|
+
}
|
|
40
|
+
export interface FabricJobStore<TInput = unknown, TOutput = unknown> {
|
|
41
|
+
getSnapshot(): FabricJobSnapshot<TOutput>;
|
|
42
|
+
subscribe(listener: () => void): () => void;
|
|
43
|
+
invoke(input: TInput, options?: {
|
|
44
|
+
idempotencyKey?: string;
|
|
45
|
+
parentRunId?: string;
|
|
46
|
+
}): Promise<JobRunReceipt>;
|
|
47
|
+
invokeSync(input: TInput): Promise<TOutput>;
|
|
48
|
+
retry(): Promise<JobRunReceipt>;
|
|
49
|
+
abort(): Promise<boolean>;
|
|
50
|
+
}
|
|
51
|
+
export declare function createFabricJobStore<TInput = unknown, TOutput = unknown>(client: FabricClient, job: string, storeOptions?: FabricStoreOptions): FabricJobStore<TInput, TOutput>;
|
|
52
|
+
interface FabricReactContextValue {
|
|
53
|
+
client: FabricClient;
|
|
54
|
+
agents: Map<string, FabricAgentStore>;
|
|
55
|
+
jobs: Map<string, FabricJobStore<unknown, unknown>>;
|
|
56
|
+
}
|
|
57
|
+
export interface FabricProviderProps {
|
|
58
|
+
children?: ReactNode;
|
|
59
|
+
client?: FabricClient;
|
|
60
|
+
options?: FabricClientOptions;
|
|
61
|
+
}
|
|
62
|
+
export declare function FabricProvider({ children, client: provided, options }: FabricProviderProps): import("react").FunctionComponentElement<import("react").ProviderProps<FabricReactContextValue | undefined>>;
|
|
63
|
+
export declare function useFabricClient(): FabricClient;
|
|
64
|
+
export declare function useFabricAgent(address: AgentAddress): {
|
|
65
|
+
send: (message: string | DeliveredMessage) => Promise<string>;
|
|
66
|
+
wait: (submissionId: string, options?: WaitOptions) => Promise<SubmissionStatus>;
|
|
67
|
+
prompt: (message: string | DeliveredMessage) => Promise<unknown>;
|
|
68
|
+
retry: (id?: string) => Promise<string>;
|
|
69
|
+
abort: () => Promise<string[]>;
|
|
70
|
+
status: "idle" | "connecting" | "sending" | "error";
|
|
71
|
+
records: readonly ConversationStreamRecord[];
|
|
72
|
+
transcript: readonly SessionEntry[];
|
|
73
|
+
pending: readonly OptimisticAgentMessage[];
|
|
74
|
+
error?: Error | undefined;
|
|
75
|
+
};
|
|
76
|
+
export declare function useFabricJob<TInput = unknown, TOutput = unknown>(name: string): {
|
|
77
|
+
invoke: (input: TInput, options?: {
|
|
78
|
+
idempotencyKey?: string;
|
|
79
|
+
parentRunId?: string;
|
|
80
|
+
}) => Promise<JobRunReceipt>;
|
|
81
|
+
invokeSync: (input: TInput) => Promise<TOutput>;
|
|
82
|
+
retry: () => Promise<JobRunReceipt>;
|
|
83
|
+
abort: () => Promise<boolean>;
|
|
84
|
+
status: "idle" | "submitting" | JobRun["status"] | "error";
|
|
85
|
+
receipt?: JobRunReceipt;
|
|
86
|
+
run?: JobRun<TOutput>;
|
|
87
|
+
events: readonly Record<string, unknown>[];
|
|
88
|
+
error?: Error;
|
|
89
|
+
};
|
|
90
|
+
export {};
|
|
91
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { createContext, createElement, useContext, useEffect, useMemo, useRef, useSyncExternalStore, } from 'react';
|
|
2
|
+
import { createFabricClient, } from '@fabric-harness/client';
|
|
3
|
+
const EMPTY_AGENT_SNAPSHOT = {
|
|
4
|
+
status: 'idle',
|
|
5
|
+
records: [],
|
|
6
|
+
transcript: [],
|
|
7
|
+
pending: [],
|
|
8
|
+
};
|
|
9
|
+
const RECONNECT_BASE_DELAY_MS = 500;
|
|
10
|
+
const RECONNECT_MAX_DELAY_MS = 15_000;
|
|
11
|
+
function reconnectDelayMs(attempt) {
|
|
12
|
+
return Math.min(RECONNECT_BASE_DELAY_MS * 2 ** attempt, RECONNECT_MAX_DELAY_MS);
|
|
13
|
+
}
|
|
14
|
+
export function createFabricAgentStore(client, address, storeOptions = {}) {
|
|
15
|
+
let snapshot = EMPTY_AGENT_SNAPSHOT;
|
|
16
|
+
const listeners = new Set();
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
let observers = 0;
|
|
19
|
+
let observerAbort;
|
|
20
|
+
let reconnectTimer;
|
|
21
|
+
let reconnectAttempts = 0;
|
|
22
|
+
let inFlightSends = 0;
|
|
23
|
+
const publish = (next) => {
|
|
24
|
+
snapshot = next;
|
|
25
|
+
for (const listener of listeners)
|
|
26
|
+
listener();
|
|
27
|
+
};
|
|
28
|
+
const maybeEvict = () => {
|
|
29
|
+
if (listeners.size === 0 && observers === 0 && !observerAbort && !reconnectTimer && inFlightSends === 0) {
|
|
30
|
+
storeOptions.onEvict?.();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const append = (record) => {
|
|
34
|
+
const key = record.kind === 'entry'
|
|
35
|
+
? `entry:${record.entry.id}`
|
|
36
|
+
: `truncated:${record.rewoundTo}:${record.newLeafId}`;
|
|
37
|
+
if (seen.has(key))
|
|
38
|
+
return;
|
|
39
|
+
seen.add(key);
|
|
40
|
+
const records = [...snapshot.records, record];
|
|
41
|
+
let transcript = [...snapshot.transcript];
|
|
42
|
+
if (record.kind === 'entry') {
|
|
43
|
+
transcript.push(record.entry);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const index = record.rewoundTo ? transcript.findIndex((entry) => entry.id === record.rewoundTo) : -1;
|
|
47
|
+
transcript = index >= 0 ? transcript.slice(0, index + 1) : [];
|
|
48
|
+
}
|
|
49
|
+
const submissionId = record.kind === 'entry' && typeof record.entry.data?.submissionId === 'string'
|
|
50
|
+
? record.entry.data.submissionId
|
|
51
|
+
: undefined;
|
|
52
|
+
const pending = submissionId
|
|
53
|
+
? snapshot.pending.filter((item) => item.submissionId !== submissionId)
|
|
54
|
+
: snapshot.pending;
|
|
55
|
+
publish({ ...snapshot, status: snapshot.status === 'connecting' ? 'idle' : snapshot.status, records, transcript, pending, error: undefined });
|
|
56
|
+
};
|
|
57
|
+
const observe = async () => {
|
|
58
|
+
if (observerAbort || observers === 0)
|
|
59
|
+
return;
|
|
60
|
+
observerAbort = new AbortController();
|
|
61
|
+
publish({ ...snapshot, status: 'connecting', error: undefined });
|
|
62
|
+
try {
|
|
63
|
+
for await (const record of client.agents.observe(address, { pollIntervalMs: 250, signal: observerAbort.signal })) {
|
|
64
|
+
reconnectAttempts = 0;
|
|
65
|
+
append(record);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (!observerAbort.signal.aborted)
|
|
70
|
+
publish({ ...snapshot, status: 'error', error: asError(error) });
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
observerAbort = undefined;
|
|
74
|
+
if (observers > 0) {
|
|
75
|
+
const delay = reconnectDelayMs(reconnectAttempts);
|
|
76
|
+
reconnectAttempts += 1;
|
|
77
|
+
reconnectTimer = setTimeout(() => {
|
|
78
|
+
reconnectTimer = undefined;
|
|
79
|
+
void observe();
|
|
80
|
+
}, delay);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
maybeEvict();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const send = async (message) => {
|
|
88
|
+
const id = localId();
|
|
89
|
+
const optimistic = { id, message, status: 'sending' };
|
|
90
|
+
inFlightSends += 1;
|
|
91
|
+
publish({ ...snapshot, status: 'sending', pending: [...snapshot.pending, optimistic], error: undefined });
|
|
92
|
+
try {
|
|
93
|
+
const receipt = await client.agents.send({ ...address, message });
|
|
94
|
+
const alreadyCanonical = snapshot.transcript.some((entry) => entry.data?.submissionId === receipt.submissionId);
|
|
95
|
+
publish({
|
|
96
|
+
...snapshot,
|
|
97
|
+
status: 'idle',
|
|
98
|
+
pending: alreadyCanonical
|
|
99
|
+
? snapshot.pending.filter((item) => item.id !== id)
|
|
100
|
+
: snapshot.pending.map((item) => item.id === id ? { ...item, status: 'admitted', submissionId: receipt.submissionId } : item),
|
|
101
|
+
});
|
|
102
|
+
return receipt.submissionId;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const failure = asError(error);
|
|
106
|
+
publish({
|
|
107
|
+
...snapshot,
|
|
108
|
+
status: 'error',
|
|
109
|
+
error: failure,
|
|
110
|
+
pending: snapshot.pending.map((item) => item.id === id ? { ...item, status: 'failed', error: failure } : item),
|
|
111
|
+
});
|
|
112
|
+
throw failure;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
inFlightSends -= 1;
|
|
116
|
+
maybeEvict();
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return {
|
|
120
|
+
getSnapshot: () => snapshot,
|
|
121
|
+
subscribe(listener) {
|
|
122
|
+
listeners.add(listener);
|
|
123
|
+
return () => {
|
|
124
|
+
listeners.delete(listener);
|
|
125
|
+
maybeEvict();
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
connect() {
|
|
129
|
+
observers += 1;
|
|
130
|
+
void observe();
|
|
131
|
+
return () => {
|
|
132
|
+
observers = Math.max(0, observers - 1);
|
|
133
|
+
if (observers === 0) {
|
|
134
|
+
if (reconnectTimer)
|
|
135
|
+
clearTimeout(reconnectTimer);
|
|
136
|
+
reconnectTimer = undefined;
|
|
137
|
+
observerAbort?.abort();
|
|
138
|
+
maybeEvict();
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
send,
|
|
143
|
+
wait(submissionId, options) {
|
|
144
|
+
return client.agents.wait({ agent: address.agent, id: address.id, submissionId }, options);
|
|
145
|
+
},
|
|
146
|
+
async prompt(message) {
|
|
147
|
+
return (await client.agents.prompt({ ...address, message })).result;
|
|
148
|
+
},
|
|
149
|
+
async retry(id) {
|
|
150
|
+
const failed = id
|
|
151
|
+
? snapshot.pending.find((item) => item.id === id && item.status === 'failed')
|
|
152
|
+
: [...snapshot.pending].reverse().find((item) => item.status === 'failed');
|
|
153
|
+
if (!failed)
|
|
154
|
+
throw new Error('No failed agent message is available to retry.');
|
|
155
|
+
publish({ ...snapshot, pending: snapshot.pending.filter((item) => item.id !== failed.id) });
|
|
156
|
+
return send(failed.message);
|
|
157
|
+
},
|
|
158
|
+
async abort() {
|
|
159
|
+
const result = await client.agents.abort(address);
|
|
160
|
+
return result.aborted;
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
export function createFabricJobStore(client, job, storeOptions = {}) {
|
|
165
|
+
let snapshot = { status: 'idle', events: [] };
|
|
166
|
+
let previousInput;
|
|
167
|
+
let previousOptions;
|
|
168
|
+
let observation;
|
|
169
|
+
let inFlightInvokes = 0;
|
|
170
|
+
const listeners = new Set();
|
|
171
|
+
const publish = (next) => {
|
|
172
|
+
snapshot = next;
|
|
173
|
+
for (const listener of listeners)
|
|
174
|
+
listener();
|
|
175
|
+
};
|
|
176
|
+
const maybeEvict = () => {
|
|
177
|
+
if (listeners.size === 0 && !observation && inFlightInvokes === 0)
|
|
178
|
+
storeOptions.onEvict?.();
|
|
179
|
+
};
|
|
180
|
+
const follow = async (receipt) => {
|
|
181
|
+
observation?.abort();
|
|
182
|
+
// Capture this invocation's controller: a later invoke aborts and replaces
|
|
183
|
+
// `observation`, and every publish below must bail once superseded so a
|
|
184
|
+
// stale follow cannot stomp the newer run's snapshot.
|
|
185
|
+
const controller = new AbortController();
|
|
186
|
+
observation = controller;
|
|
187
|
+
const superseded = () => observation !== controller;
|
|
188
|
+
try {
|
|
189
|
+
const events = [];
|
|
190
|
+
for await (const event of client.runs.observe(receipt.runId, { pollIntervalMs: 250, signal: controller.signal })) {
|
|
191
|
+
if (superseded())
|
|
192
|
+
return;
|
|
193
|
+
events.push(event);
|
|
194
|
+
publish({ ...snapshot, events: [...events] });
|
|
195
|
+
}
|
|
196
|
+
if (superseded())
|
|
197
|
+
return;
|
|
198
|
+
const run = await client.runs.get(receipt.runId);
|
|
199
|
+
if (superseded())
|
|
200
|
+
return;
|
|
201
|
+
publish({ ...snapshot, status: run.status, run, events });
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
if (!superseded() && !controller.signal.aborted)
|
|
205
|
+
publish({ ...snapshot, status: 'error', error: asError(error) });
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
if (!superseded()) {
|
|
209
|
+
observation = undefined;
|
|
210
|
+
maybeEvict();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
const invoke = async (input, options = {}) => {
|
|
215
|
+
previousInput = input;
|
|
216
|
+
previousOptions = options;
|
|
217
|
+
inFlightInvokes += 1;
|
|
218
|
+
publish({ status: 'submitting', events: [] });
|
|
219
|
+
try {
|
|
220
|
+
const receipt = await client.jobs.invoke(job, input, { wait: false, ...options });
|
|
221
|
+
publish({ status: receipt.status, receipt, events: [] });
|
|
222
|
+
void follow(receipt);
|
|
223
|
+
return receipt;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
const failure = asError(error);
|
|
227
|
+
publish({ status: 'error', events: [], error: failure });
|
|
228
|
+
throw failure;
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
inFlightInvokes -= 1;
|
|
232
|
+
maybeEvict();
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
return {
|
|
236
|
+
getSnapshot: () => snapshot,
|
|
237
|
+
subscribe(listener) {
|
|
238
|
+
listeners.add(listener);
|
|
239
|
+
return () => {
|
|
240
|
+
listeners.delete(listener);
|
|
241
|
+
maybeEvict();
|
|
242
|
+
};
|
|
243
|
+
},
|
|
244
|
+
invoke,
|
|
245
|
+
invokeSync: (input) => client.jobs.invoke(job, input),
|
|
246
|
+
async retry() {
|
|
247
|
+
if (previousInput === undefined)
|
|
248
|
+
throw new Error('No finite job input is available to retry.');
|
|
249
|
+
return invoke(previousInput, previousOptions);
|
|
250
|
+
},
|
|
251
|
+
async abort() {
|
|
252
|
+
if (!snapshot.receipt)
|
|
253
|
+
return false;
|
|
254
|
+
const result = await client.runs.abort(snapshot.receipt.runId);
|
|
255
|
+
observation?.abort();
|
|
256
|
+
const run = await client.runs.get(snapshot.receipt.runId);
|
|
257
|
+
publish({ ...snapshot, status: run.status, run });
|
|
258
|
+
return result.aborted;
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
const FabricReactContext = createContext(undefined);
|
|
263
|
+
export function FabricProvider({ children, client: provided, options }) {
|
|
264
|
+
const created = useRef(undefined);
|
|
265
|
+
if (!provided && !created.current) {
|
|
266
|
+
if (!options)
|
|
267
|
+
throw new Error('FabricProvider requires client or options.');
|
|
268
|
+
created.current = createFabricClient(options);
|
|
269
|
+
}
|
|
270
|
+
const client = provided ?? created.current;
|
|
271
|
+
if (!client)
|
|
272
|
+
throw new Error('FabricProvider requires client or options.');
|
|
273
|
+
const value = useMemo(() => ({ client, agents: new Map(), jobs: new Map() }), [client]);
|
|
274
|
+
return createElement(FabricReactContext.Provider, { value }, children);
|
|
275
|
+
}
|
|
276
|
+
export function useFabricClient() {
|
|
277
|
+
return useFabricContext().client;
|
|
278
|
+
}
|
|
279
|
+
export function useFabricAgent(address) {
|
|
280
|
+
const context = useFabricContext();
|
|
281
|
+
const key = `${address.agent}\0${address.id}\0${address.session ?? 'default'}`;
|
|
282
|
+
let store = context.agents.get(key);
|
|
283
|
+
if (!store) {
|
|
284
|
+
const created = createFabricAgentStore(context.client, address, {
|
|
285
|
+
onEvict: () => {
|
|
286
|
+
if (context.agents.get(key) === created)
|
|
287
|
+
context.agents.delete(key);
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
store = created;
|
|
291
|
+
context.agents.set(key, store);
|
|
292
|
+
}
|
|
293
|
+
const activeStore = store;
|
|
294
|
+
const snapshot = useSyncExternalStore(activeStore.subscribe, activeStore.getSnapshot, activeStore.getSnapshot);
|
|
295
|
+
useEffect(() => activeStore.connect(), [activeStore]);
|
|
296
|
+
return { ...snapshot, send: store.send, wait: store.wait, prompt: store.prompt, retry: store.retry, abort: store.abort };
|
|
297
|
+
}
|
|
298
|
+
export function useFabricJob(name) {
|
|
299
|
+
const context = useFabricContext();
|
|
300
|
+
let store = context.jobs.get(name);
|
|
301
|
+
if (!store) {
|
|
302
|
+
const created = createFabricJobStore(context.client, name, {
|
|
303
|
+
onEvict: () => {
|
|
304
|
+
if (context.jobs.get(name) === created)
|
|
305
|
+
context.jobs.delete(name);
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
store = created;
|
|
309
|
+
context.jobs.set(name, store);
|
|
310
|
+
}
|
|
311
|
+
const snapshot = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
312
|
+
return { ...snapshot, invoke: store.invoke, invokeSync: store.invokeSync, retry: store.retry, abort: store.abort };
|
|
313
|
+
}
|
|
314
|
+
function useFabricContext() {
|
|
315
|
+
const value = useContext(FabricReactContext);
|
|
316
|
+
if (!value)
|
|
317
|
+
throw new Error('Fabric hooks must be used inside FabricProvider.');
|
|
318
|
+
return value;
|
|
319
|
+
}
|
|
320
|
+
function asError(error) {
|
|
321
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
322
|
+
}
|
|
323
|
+
function localId() {
|
|
324
|
+
return globalThis.crypto?.randomUUID?.() ?? `local-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fabric-harness/react",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "React provider and hooks for Fabric Harness agents and finite jobs.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": "Fabric",
|
|
7
|
+
"homepage": "https://github.com/Fabric-Pro/fabric-harness#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/Fabric-Pro/fabric-harness.git",
|
|
11
|
+
"directory": "packages/react"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"sideEffects": false,
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20.18.0"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"registry": "https://registry.npmjs.org",
|
|
20
|
+
"access": "public",
|
|
21
|
+
"provenance": false
|
|
22
|
+
},
|
|
23
|
+
"main": "dist/index.js",
|
|
24
|
+
"types": "dist/index.d.ts",
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md",
|
|
28
|
+
"LICENSE",
|
|
29
|
+
"NOTICE"
|
|
30
|
+
],
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@fabric-harness/client": "^2.2.0",
|
|
33
|
+
"@fabric-harness/sdk": "^2.2.0"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"react": ">=18 <20"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/react": "^19.2.14",
|
|
40
|
+
"react": "^19.2.5",
|
|
41
|
+
"typescript": "^5.8.3",
|
|
42
|
+
"vitest": "^4.1.5"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc -p tsconfig.json",
|
|
46
|
+
"check": "tsc -b tsconfig.json",
|
|
47
|
+
"test": "vitest run"
|
|
48
|
+
}
|
|
49
|
+
}
|