@halo-sdk/react 1.0.0 → 2.0.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/dist/hooks.js +48 -0
- package/dist/hooks.js.map +1 -0
- package/dist/reducers.js +69 -0
- package/dist/reducers.js.map +1 -0
- package/package.json +3 -3
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
import { approvalsReducer, cacheStatsReducer, costReducer, initialApprovals, initialCacheStats, initialCost, initialLoopState, loopStateReducer, } from "./reducers.js";
|
|
3
|
+
/**
|
|
4
|
+
* Generic hook: fold the {@link HaloEvent} stream into derived state via a pure
|
|
5
|
+
* reducer. The building block for all the specific hooks below.
|
|
6
|
+
*/
|
|
7
|
+
export function useHaloState(subscribe, reducer, initial) {
|
|
8
|
+
const [state, setState] = useState(initial);
|
|
9
|
+
const reducerRef = useRef(reducer);
|
|
10
|
+
reducerRef.current = reducer;
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
return subscribe((event) => setState((prev) => reducerRef.current(prev, event)));
|
|
13
|
+
}, [subscribe]);
|
|
14
|
+
return state;
|
|
15
|
+
}
|
|
16
|
+
/** Live prefix-cache hit/miss/write tokens + hit rate. */
|
|
17
|
+
export function useCacheStats(subscribe) {
|
|
18
|
+
return useHaloState(subscribe, cacheStatsReducer, initialCacheStats);
|
|
19
|
+
}
|
|
20
|
+
/** Cumulative turns, tokens, and estimated USD spend. */
|
|
21
|
+
export function useCost(subscribe) {
|
|
22
|
+
return useHaloState(subscribe, costReducer, initialCost);
|
|
23
|
+
}
|
|
24
|
+
/** Current agent-loop step + status (idle/running/paused/error). */
|
|
25
|
+
export function useLoopState(subscribe) {
|
|
26
|
+
return useHaloState(subscribe, loopStateReducer, initialLoopState);
|
|
27
|
+
}
|
|
28
|
+
/** Pending human-in-the-loop tool approvals (for an approval UI). */
|
|
29
|
+
export function useApprovals(subscribe) {
|
|
30
|
+
return useHaloState(subscribe, approvalsReducer, initialApprovals);
|
|
31
|
+
}
|
|
32
|
+
/** A cacheability grade derived live from the hit rate (A–F). */
|
|
33
|
+
export function useCacheProfile(subscribe) {
|
|
34
|
+
const stats = useCacheStats(subscribe);
|
|
35
|
+
return { ...stats, grade: gradeFor(stats.hitRate) };
|
|
36
|
+
}
|
|
37
|
+
function gradeFor(hitRate) {
|
|
38
|
+
if (hitRate >= 0.9)
|
|
39
|
+
return "A";
|
|
40
|
+
if (hitRate >= 0.75)
|
|
41
|
+
return "B";
|
|
42
|
+
if (hitRate >= 0.5)
|
|
43
|
+
return "C";
|
|
44
|
+
if (hitRate >= 0.25)
|
|
45
|
+
return "D";
|
|
46
|
+
return "F";
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GAKjB,MAAM,eAAe,CAAC;AAQvB;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAoB,EACpB,OAA0C,EAC1C,OAAgB;IAEhB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAI,OAAO,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,SAAoB;IAChD,OAAO,YAAY,CAAC,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;AACvE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,OAAO,CAAC,SAAoB;IAC1C,OAAO,YAAY,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AAC3D,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,SAAoB;IAC/C,OAAO,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AACrE,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,YAAY,CAAC,SAAoB;IAC/C,OAAO,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AACrE,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,SAAoB;IAGlD,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAC/B,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC;IAChC,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAC/B,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC;IAChC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/reducers.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export const initialCacheStats = () => ({
|
|
2
|
+
hitTokens: 0,
|
|
3
|
+
missTokens: 0,
|
|
4
|
+
writeTokens: 0,
|
|
5
|
+
hitRate: 0,
|
|
6
|
+
});
|
|
7
|
+
export function cacheStatsReducer(state, event) {
|
|
8
|
+
if (event.type !== "cache:hit")
|
|
9
|
+
return state;
|
|
10
|
+
const hitTokens = state.hitTokens + event.hitTokens;
|
|
11
|
+
const missTokens = state.missTokens + event.missTokens;
|
|
12
|
+
const total = hitTokens + missTokens;
|
|
13
|
+
return {
|
|
14
|
+
hitTokens,
|
|
15
|
+
missTokens,
|
|
16
|
+
writeTokens: state.writeTokens,
|
|
17
|
+
hitRate: total > 0 ? hitTokens / total : 0,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export const initialCost = () => ({
|
|
21
|
+
turns: 0,
|
|
22
|
+
promptTokens: 0,
|
|
23
|
+
completionTokens: 0,
|
|
24
|
+
estimatedUsd: 0,
|
|
25
|
+
});
|
|
26
|
+
export function costReducer(state, event) {
|
|
27
|
+
switch (event.type) {
|
|
28
|
+
case "turn:end":
|
|
29
|
+
return { ...state, turns: state.turns + 1 };
|
|
30
|
+
case "cost":
|
|
31
|
+
return {
|
|
32
|
+
...state,
|
|
33
|
+
promptTokens: state.promptTokens + event.promptTokens,
|
|
34
|
+
completionTokens: state.completionTokens + event.completionTokens,
|
|
35
|
+
estimatedUsd: state.estimatedUsd + (event.estimatedUsd ?? 0),
|
|
36
|
+
};
|
|
37
|
+
default:
|
|
38
|
+
return state;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export const initialLoopState = () => ({ step: 0, status: "idle", lastError: null });
|
|
42
|
+
export function loopStateReducer(state, event) {
|
|
43
|
+
switch (event.type) {
|
|
44
|
+
case "loop:step":
|
|
45
|
+
return { ...state, step: event.step, status: "running" };
|
|
46
|
+
case "loop:paused":
|
|
47
|
+
return { ...state, status: "paused" };
|
|
48
|
+
case "loop:resumed":
|
|
49
|
+
return { ...state, status: "running" };
|
|
50
|
+
case "loop:error":
|
|
51
|
+
return { ...state, status: "error", lastError: event.error };
|
|
52
|
+
case "turn:end":
|
|
53
|
+
return state.status === "error" ? state : { ...state, status: "idle" };
|
|
54
|
+
default:
|
|
55
|
+
return state;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export const initialApprovals = () => [];
|
|
59
|
+
export function approvalsReducer(state, event) {
|
|
60
|
+
switch (event.type) {
|
|
61
|
+
case "hitl:pending":
|
|
62
|
+
return [...state, { toolCallId: event.call.id, call: event.call }];
|
|
63
|
+
case "hitl:resolved":
|
|
64
|
+
return state.filter((a) => a.toolCallId !== event.toolCallId);
|
|
65
|
+
default:
|
|
66
|
+
return state;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=reducers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducers.js","sourceRoot":"","sources":["../src/reducers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@halo-sdk/react",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Lightweight, strongly-typed React hooks for Halo SDK — observe cache, cost, loop, and HITL state in the UI",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -37,10 +37,10 @@
|
|
|
37
37
|
"react": "^19.0.0",
|
|
38
38
|
"typescript": "^5.8.0",
|
|
39
39
|
"vitest": "^3.0.0",
|
|
40
|
-
"@halo-sdk/core": "1.
|
|
40
|
+
"@halo-sdk/core": "1.2.0"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
-
"@halo-sdk/core": ">=1.
|
|
43
|
+
"@halo-sdk/core": ">=1.2.0",
|
|
44
44
|
"react": "^18.0.0 || ^19.0.0"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|