@zakstam/codex-local-component 0.9.0 → 0.10.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/component/_generated/component.d.ts +10 -0
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/index.d.ts +1 -0
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/index.js +1 -0
- package/dist/component/index.js.map +1 -1
- package/dist/component/schema.d.ts +40 -0
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +21 -0
- package/dist/component/schema.js.map +1 -1
- package/dist/component/streamStats.d.ts +7 -0
- package/dist/component/streamStats.d.ts.map +1 -1
- package/dist/component/streamStats.js +20 -2
- package/dist/component/streamStats.js.map +1 -1
- package/dist/component/streams.d.ts.map +1 -1
- package/dist/component/streams.js +31 -0
- package/dist/component/streams.js.map +1 -1
- package/dist/component/threads.d.ts +10 -0
- package/dist/component/threads.d.ts.map +1 -1
- package/dist/component/threads.js +49 -1
- package/dist/component/threads.js.map +1 -1
- package/dist/component/tokenUsage.d.ts +43 -0
- package/dist/component/tokenUsage.d.ts.map +1 -0
- package/dist/component/tokenUsage.js +107 -0
- package/dist/component/tokenUsage.js.map +1 -0
- package/dist/host/convexPreset.d.ts +54 -0
- package/dist/host/convexPreset.d.ts.map +1 -1
- package/dist/host/convexPreset.js +39 -1
- package/dist/host/convexPreset.js.map +1 -1
- package/dist/host/convexSlice.d.ts +27 -1
- package/dist/host/convexSlice.d.ts.map +1 -1
- package/dist/host/convexSlice.js +24 -0
- package/dist/host/convexSlice.js.map +1 -1
- package/dist/host/index.d.ts +1 -1
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +1 -1
- package/dist/host/index.js.map +1 -1
- package/dist/host/runtime.d.ts +16 -0
- package/dist/host/runtime.d.ts.map +1 -1
- package/dist/host/runtime.js +46 -0
- package/dist/host/runtime.js.map +1 -1
- package/dist/host/surfaceManifest.d.ts +4 -4
- package/dist/host/surfaceManifest.d.ts.map +1 -1
- package/dist/host/surfaceManifest.js +4 -0
- package/dist/host/surfaceManifest.js.map +1 -1
- package/dist/protocol/events.d.ts.map +1 -1
- package/dist/protocol/events.js +58 -6
- package/dist/protocol/events.js.map +1 -1
- package/dist/react/activityAuthority.d.ts +50 -0
- package/dist/react/activityAuthority.d.ts.map +1 -0
- package/dist/react/activityAuthority.js +185 -0
- package/dist/react/activityAuthority.js.map +1 -0
- package/dist/react/branchActivity.d.ts.map +1 -1
- package/dist/react/branchActivity.js +4 -0
- package/dist/react/branchActivity.js.map +1 -1
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/threadActivity.d.ts +2 -33
- package/dist/react/threadActivity.d.ts.map +1 -1
- package/dist/react/threadActivity.js +2 -144
- package/dist/react/threadActivity.js.map +1 -1
- package/dist/react/tokenUsage.d.ts +32 -0
- package/dist/react/tokenUsage.d.ts.map +1 -0
- package/dist/react/tokenUsage.js +17 -0
- package/dist/react/tokenUsage.js.map +1 -0
- package/dist/react/useCodexRuntimeBridge.d.ts.map +1 -1
- package/dist/react/useCodexRuntimeBridge.js +7 -3
- package/dist/react/useCodexRuntimeBridge.js.map +1 -1
- package/dist/react/useCodexTokenUsage.d.ts +7 -0
- package/dist/react/useCodexTokenUsage.d.ts.map +1 -0
- package/dist/react/useCodexTokenUsage.js +10 -0
- package/dist/react/useCodexTokenUsage.js.map +1 -0
- package/dist/shared/streamLifecycle.d.ts +2 -0
- package/dist/shared/streamLifecycle.d.ts.map +1 -0
- package/dist/shared/streamLifecycle.js +2 -0
- package/dist/shared/streamLifecycle.js.map +1 -0
- package/docs/CLIENT_AND_REACT_HOOKS.md +3 -1
- package/docs/HOST_PRESET_MATRIX.md +2 -0
- package/package.json +1 -1
|
@@ -1,35 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export type CodexThreadActivity
|
|
3
|
-
phase: CodexThreadActivityPhase;
|
|
4
|
-
activeTurnId?: string;
|
|
5
|
-
activeMessageId?: string;
|
|
6
|
-
};
|
|
7
|
-
export type CodexThreadActivityMessageLike = {
|
|
8
|
-
messageId?: string;
|
|
9
|
-
turnId?: string;
|
|
10
|
-
status?: "streaming" | "completed" | "failed" | "interrupted" | string;
|
|
11
|
-
createdAt?: number;
|
|
12
|
-
};
|
|
13
|
-
export type CodexThreadActivityDispatchLike = {
|
|
14
|
-
turnId?: string;
|
|
15
|
-
status?: "queued" | "claimed" | "started" | "completed" | "failed" | "cancelled" | string;
|
|
16
|
-
updatedAt?: number;
|
|
17
|
-
createdAt?: number;
|
|
18
|
-
};
|
|
19
|
-
export type CodexThreadActivityStreamStatLike = {
|
|
20
|
-
state?: "streaming" | "finished" | "aborted" | string;
|
|
21
|
-
};
|
|
22
|
-
export type CodexThreadActivityTurnLike = {
|
|
23
|
-
turnId?: string;
|
|
24
|
-
status?: string;
|
|
25
|
-
startedAt?: number;
|
|
26
|
-
};
|
|
27
|
-
export type CodexThreadActivityThreadState = {
|
|
28
|
-
pendingApprovals?: unknown[] | null;
|
|
29
|
-
recentMessages?: CodexThreadActivityMessageLike[] | null;
|
|
30
|
-
dispatches?: CodexThreadActivityDispatchLike[] | null;
|
|
31
|
-
streamStats?: CodexThreadActivityStreamStatLike[] | null;
|
|
32
|
-
turns?: CodexThreadActivityTurnLike[] | null;
|
|
33
|
-
};
|
|
1
|
+
import { type CodexThreadActivity, type CodexThreadActivityActiveStreamLike, type CodexThreadActivityDispatchLike, type CodexThreadActivityLifecycleMarkerLike, type CodexThreadActivityMessageLike, type CodexThreadActivityPhase, type CodexThreadActivityStreamStatLike, type CodexThreadActivityThreadState, type CodexThreadActivityTurnLike } from "./activityAuthority.js";
|
|
2
|
+
export type { CodexThreadActivity, CodexThreadActivityPhase, CodexThreadActivityMessageLike, CodexThreadActivityDispatchLike, CodexThreadActivityStreamStatLike, CodexThreadActivityTurnLike, CodexThreadActivityActiveStreamLike, CodexThreadActivityLifecycleMarkerLike, CodexThreadActivityThreadState, };
|
|
34
3
|
export declare function deriveCodexThreadActivity(state: CodexThreadActivityThreadState | null | undefined): CodexThreadActivity;
|
|
35
4
|
//# sourceMappingURL=threadActivity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threadActivity.d.ts","sourceRoot":"","sources":["../../src/react/threadActivity.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"threadActivity.d.ts","sourceRoot":"","sources":["../../src/react/threadActivity.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mCAAmC,EACxC,KAAK,+BAA+B,EACpC,KAAK,sCAAsC,EAC3C,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,iCAAiC,EACtC,KAAK,8BAA8B,EACnC,KAAK,2BAA2B,EACjC,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,8BAA8B,EAC9B,+BAA+B,EAC/B,iCAAiC,EACjC,2BAA2B,EAC3B,mCAAmC,EACnC,sCAAsC,EACtC,8BAA8B,GAC/B,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,8BAA8B,GAAG,IAAI,GAAG,SAAS,GACvD,mBAAmB,CAErB"}
|
|
@@ -1,148 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
3
|
-
const IN_FLIGHT_TURN_STATUSES = new Set(["queued", "inProgress", "started", "streaming"]);
|
|
4
|
-
const FAILED_TURN_STATUSES = new Set(["failed"]);
|
|
5
|
-
const INTERRUPTED_TURN_STATUSES = new Set(["interrupted", "cancelled"]);
|
|
6
|
-
function candidateTimestamp(input) {
|
|
7
|
-
return typeof input === "number" ? input : 0;
|
|
8
|
-
}
|
|
9
|
-
function pickLatest(candidates) {
|
|
10
|
-
let latest = null;
|
|
11
|
-
for (const candidate of candidates) {
|
|
12
|
-
if (!candidate) {
|
|
13
|
-
continue;
|
|
14
|
-
}
|
|
15
|
-
if (!latest || candidate.timestamp > latest.timestamp) {
|
|
16
|
-
latest = candidate;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return latest;
|
|
20
|
-
}
|
|
21
|
-
function latestMessageByStatus(messages, status) {
|
|
22
|
-
let latest = null;
|
|
23
|
-
for (const message of messages) {
|
|
24
|
-
if (message.status !== status) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
const candidate = {
|
|
28
|
-
timestamp: candidateTimestamp(message.createdAt),
|
|
29
|
-
...(message.turnId !== undefined ? { activeTurnId: message.turnId } : {}),
|
|
30
|
-
...(message.messageId !== undefined ? { activeMessageId: message.messageId } : {}),
|
|
31
|
-
};
|
|
32
|
-
if (!latest || candidate.timestamp > latest.timestamp) {
|
|
33
|
-
latest = candidate;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return latest;
|
|
37
|
-
}
|
|
38
|
-
function latestDispatchByStatus(dispatches, predicate) {
|
|
39
|
-
let latest = null;
|
|
40
|
-
for (const dispatch of dispatches) {
|
|
41
|
-
if (typeof dispatch.status !== "string" || !predicate(dispatch.status)) {
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
const candidate = {
|
|
45
|
-
timestamp: candidateTimestamp(dispatch.updatedAt ?? dispatch.createdAt),
|
|
46
|
-
...(dispatch.turnId !== undefined ? { activeTurnId: dispatch.turnId } : {}),
|
|
47
|
-
};
|
|
48
|
-
if (!latest || candidate.timestamp > latest.timestamp) {
|
|
49
|
-
latest = candidate;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return latest;
|
|
53
|
-
}
|
|
54
|
-
function latestTurnByStatus(turns, predicate) {
|
|
55
|
-
let latest = null;
|
|
56
|
-
for (const turn of turns) {
|
|
57
|
-
if (typeof turn.status !== "string" || !predicate(turn.status)) {
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
const candidate = {
|
|
61
|
-
timestamp: candidateTimestamp(turn.startedAt),
|
|
62
|
-
...(turn.turnId !== undefined ? { activeTurnId: turn.turnId } : {}),
|
|
63
|
-
};
|
|
64
|
-
if (!latest || candidate.timestamp > latest.timestamp) {
|
|
65
|
-
latest = candidate;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return latest;
|
|
69
|
-
}
|
|
70
|
-
function activeFromInFlightState(input) {
|
|
71
|
-
return pickLatest([
|
|
72
|
-
latestMessageByStatus(input.messages, "streaming"),
|
|
73
|
-
latestDispatchByStatus(input.dispatches, (status) => IN_FLIGHT_DISPATCH_STATUSES.has(status)),
|
|
74
|
-
latestTurnByStatus(input.turns, (status) => IN_FLIGHT_TURN_STATUSES.has(status)),
|
|
75
|
-
]);
|
|
76
|
-
}
|
|
2
|
+
import { deriveCodexActivityByAuthorityRules, } from "./activityAuthority.js";
|
|
77
3
|
export function deriveCodexThreadActivity(state) {
|
|
78
|
-
|
|
79
|
-
const dispatches = state?.dispatches ?? [];
|
|
80
|
-
const turns = state?.turns ?? [];
|
|
81
|
-
const pendingApprovals = state?.pendingApprovals ?? [];
|
|
82
|
-
const streamStats = state?.streamStats ?? [];
|
|
83
|
-
if (pendingApprovals.length > 0) {
|
|
84
|
-
const active = activeFromInFlightState({ messages, dispatches, turns });
|
|
85
|
-
return {
|
|
86
|
-
phase: "awaiting_approval",
|
|
87
|
-
...(active?.activeTurnId !== undefined ? { activeTurnId: active.activeTurnId } : {}),
|
|
88
|
-
...(active?.activeMessageId !== undefined ? { activeMessageId: active.activeMessageId } : {}),
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
const activeStreamingMessage = latestMessageByStatus(messages, "streaming");
|
|
92
|
-
if (activeStreamingMessage) {
|
|
93
|
-
return {
|
|
94
|
-
phase: "streaming",
|
|
95
|
-
...(activeStreamingMessage.activeTurnId !== undefined
|
|
96
|
-
? { activeTurnId: activeStreamingMessage.activeTurnId }
|
|
97
|
-
: {}),
|
|
98
|
-
...(activeStreamingMessage.activeMessageId !== undefined
|
|
99
|
-
? { activeMessageId: activeStreamingMessage.activeMessageId }
|
|
100
|
-
: {}),
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
const hasStreamingStat = streamStats.some((stat) => stat.state === "streaming");
|
|
104
|
-
if (hasStreamingStat) {
|
|
105
|
-
const inFlight = activeFromInFlightState({ messages, dispatches, turns });
|
|
106
|
-
return {
|
|
107
|
-
phase: "streaming",
|
|
108
|
-
...(inFlight?.activeTurnId !== undefined ? { activeTurnId: inFlight.activeTurnId } : {}),
|
|
109
|
-
...(inFlight?.activeMessageId !== undefined ? { activeMessageId: inFlight.activeMessageId } : {}),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
const inFlightDispatch = latestDispatchByStatus(dispatches, (status) => IN_FLIGHT_DISPATCH_STATUSES.has(status));
|
|
113
|
-
if (inFlightDispatch) {
|
|
114
|
-
return {
|
|
115
|
-
phase: "streaming",
|
|
116
|
-
...(inFlightDispatch.activeTurnId !== undefined ? { activeTurnId: inFlightDispatch.activeTurnId } : {}),
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
const inFlightTurn = latestTurnByStatus(turns, (status) => IN_FLIGHT_TURN_STATUSES.has(status));
|
|
120
|
-
if (inFlightTurn) {
|
|
121
|
-
return {
|
|
122
|
-
phase: "streaming",
|
|
123
|
-
...(inFlightTurn.activeTurnId !== undefined ? { activeTurnId: inFlightTurn.activeTurnId } : {}),
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
const failed = pickLatest([
|
|
127
|
-
latestMessageByStatus(messages, "failed"),
|
|
128
|
-
latestDispatchByStatus(dispatches, (status) => status === "failed"),
|
|
129
|
-
latestTurnByStatus(turns, (status) => FAILED_TURN_STATUSES.has(status)),
|
|
130
|
-
]);
|
|
131
|
-
const interrupted = pickLatest([
|
|
132
|
-
latestMessageByStatus(messages, "interrupted"),
|
|
133
|
-
latestTurnByStatus(turns, (status) => INTERRUPTED_TURN_STATUSES.has(status)),
|
|
134
|
-
]);
|
|
135
|
-
const terminal = pickLatest([
|
|
136
|
-
failed ? { ...failed, phase: "failed" } : null,
|
|
137
|
-
interrupted ? { ...interrupted, phase: "interrupted" } : null,
|
|
138
|
-
]);
|
|
139
|
-
if (terminal?.phase) {
|
|
140
|
-
return {
|
|
141
|
-
phase: terminal.phase,
|
|
142
|
-
...(terminal.activeTurnId !== undefined ? { activeTurnId: terminal.activeTurnId } : {}),
|
|
143
|
-
...(terminal.activeMessageId !== undefined ? { activeMessageId: terminal.activeMessageId } : {}),
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
return { phase: "idle" };
|
|
4
|
+
return deriveCodexActivityByAuthorityRules(state);
|
|
147
5
|
}
|
|
148
6
|
//# sourceMappingURL=threadActivity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threadActivity.js","sourceRoot":"","sources":["../../src/react/threadActivity.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"threadActivity.js","sourceRoot":"","sources":["../../src/react/threadActivity.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EACL,mCAAmC,GAUpC,MAAM,wBAAwB,CAAC;AAchC,MAAM,UAAU,yBAAyB,CACvC,KAAwD;IAExD,OAAO,mCAAmC,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type CodexTokenUsageBreakdown = {
|
|
2
|
+
totalTokens: number;
|
|
3
|
+
inputTokens: number;
|
|
4
|
+
cachedInputTokens: number;
|
|
5
|
+
outputTokens: number;
|
|
6
|
+
reasoningOutputTokens: number;
|
|
7
|
+
};
|
|
8
|
+
export type CodexTurnTokenUsage = {
|
|
9
|
+
turnId: string;
|
|
10
|
+
total: CodexTokenUsageBreakdown;
|
|
11
|
+
last: CodexTokenUsageBreakdown;
|
|
12
|
+
modelContextWindow?: number;
|
|
13
|
+
updatedAt: number;
|
|
14
|
+
};
|
|
15
|
+
export type CodexTokenUsage = {
|
|
16
|
+
status: "loading";
|
|
17
|
+
turns: [];
|
|
18
|
+
cumulative: null;
|
|
19
|
+
modelContextWindow: null;
|
|
20
|
+
} | {
|
|
21
|
+
status: "empty";
|
|
22
|
+
turns: [];
|
|
23
|
+
cumulative: null;
|
|
24
|
+
modelContextWindow: null;
|
|
25
|
+
} | {
|
|
26
|
+
status: "ready";
|
|
27
|
+
turns: CodexTurnTokenUsage[];
|
|
28
|
+
cumulative: CodexTokenUsageBreakdown;
|
|
29
|
+
modelContextWindow: number | null;
|
|
30
|
+
};
|
|
31
|
+
export declare function deriveCodexTokenUsage(rawTurns: CodexTurnTokenUsage[] | null | undefined): CodexTokenUsage;
|
|
32
|
+
//# sourceMappingURL=tokenUsage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenUsage.d.ts","sourceRoot":"","sources":["../../src/react/tokenUsage.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,wBAAwB,CAAC;IAChC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,EAAE,CAAC;IAAC,UAAU,EAAE,IAAI,CAAC;IAAC,kBAAkB,EAAE,IAAI,CAAA;CAAE,GAC5E;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,EAAE,CAAC;IAAC,UAAU,EAAE,IAAI,CAAC;IAAC,kBAAkB,EAAE,IAAI,CAAA;CAAE,GAC1E;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,UAAU,EAAE,wBAAwB,CAAC;IACrC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC,CAAC;AAEN,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI,GAAG,SAAS,GACjD,eAAe,CAgBjB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
export function deriveCodexTokenUsage(rawTurns) {
|
|
3
|
+
if (rawTurns === undefined) {
|
|
4
|
+
return { status: "loading", turns: [], cumulative: null, modelContextWindow: null };
|
|
5
|
+
}
|
|
6
|
+
if (rawTurns === null || rawTurns.length === 0) {
|
|
7
|
+
return { status: "empty", turns: [], cumulative: null, modelContextWindow: null };
|
|
8
|
+
}
|
|
9
|
+
const latest = rawTurns[rawTurns.length - 1];
|
|
10
|
+
return {
|
|
11
|
+
status: "ready",
|
|
12
|
+
turns: rawTurns,
|
|
13
|
+
cumulative: latest.total,
|
|
14
|
+
modelContextWindow: latest.modelContextWindow ?? null,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=tokenUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenUsage.js","sourceRoot":"","sources":["../../src/react/tokenUsage.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AA4Bb,MAAM,UAAU,qBAAqB,CACnC,QAAkD;IAElD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAE9C,OAAO;QACL,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,MAAM,CAAC,KAAK;QACxB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,IAAI;KACtD,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCodexRuntimeBridge.d.ts","sourceRoot":"","sources":["../../src/react/useCodexRuntimeBridge.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,IAAI;IACrE,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,EAChE,QAAQ,EAAE,0BAA0B,CAAC,SAAS,EAAE,QAAQ,CAAC,EACzD,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,uBAAuB,CAAC;CACxC;;;;;
|
|
1
|
+
{"version":3,"file":"useCodexRuntimeBridge.d.ts","sourceRoot":"","sources":["../../src/react/useCodexRuntimeBridge.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,IAAI;IACrE,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,EAChE,QAAQ,EAAE,0BAA0B,CAAC,SAAS,EAAE,QAAQ,CAAC,EACzD,OAAO,CAAC,EAAE;IACR,YAAY,CAAC,EAAE,uBAAuB,CAAC;CACxC;;;;;kBAsCc,SAAS;;;qBAyBT,QAAQ;;EA+BxB"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useCallback, useMemo, useState } from "react";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
export function useCodexRuntimeBridge(controls, options) {
|
|
4
4
|
const [state, setState] = useState(options?.initialState ?? { running: false, threadId: null, turnId: null, lastError: null });
|
|
5
|
+
const stateRef = useRef(state);
|
|
5
6
|
const [busyAction, setBusyAction] = useState(null);
|
|
6
7
|
const [error, setError] = useState(null);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
stateRef.current = state;
|
|
10
|
+
}, [state]);
|
|
7
11
|
const runAction = useCallback(async (action, fn) => {
|
|
8
12
|
setBusyAction(action);
|
|
9
13
|
setError(null);
|
|
@@ -22,12 +26,12 @@ export function useCodexRuntimeBridge(controls, options) {
|
|
|
22
26
|
}, []);
|
|
23
27
|
const refresh = useCallback(async () => {
|
|
24
28
|
if (!controls.getState) {
|
|
25
|
-
return
|
|
29
|
+
return stateRef.current;
|
|
26
30
|
}
|
|
27
31
|
const next = await runAction("refresh", controls.getState);
|
|
28
32
|
setState(next);
|
|
29
33
|
return next;
|
|
30
|
-
}, [controls.getState, runAction
|
|
34
|
+
}, [controls.getState, runAction]);
|
|
31
35
|
const start = useCallback(async (args) => {
|
|
32
36
|
const result = await runAction("start", () => controls.start(args));
|
|
33
37
|
if (controls.getState) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCodexRuntimeBridge.js","sourceRoot":"","sources":["../../src/react/useCodexRuntimeBridge.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useCodexRuntimeBridge.js","sourceRoot":"","sources":["../../src/react/useCodexRuntimeBridge.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAkB1E,MAAM,UAAU,qBAAqB,CACnC,QAAyD,EACzD,OAEC;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAChC,OAAO,EAAE,YAAY,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAC3F,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAA6D,IAAI,CAAC,CAAC;IAC/G,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAC3B,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAM,MAAyB,EAAE,EAAoB,EAAc,EAAE;QACtG,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACnF,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClB,MAAM,SAAS,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,WAAW,CACvB,KAAK,EAAE,IAAe,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,CAAC,QAAQ,EAAE,SAAS,CAAC,CACtB,CAAC;IAEF,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAClC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1B,MAAM,QAAQ,GAAG,WAAW,CAC1B,KAAK,EAAE,IAAc,EAAE,EAAE;QACvB,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,OAAO,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC,EACD,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAC/B,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QACD,OAAO,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEpC,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,KAAK;QACL,KAAK;QACL,UAAU;QACV,MAAM,EAAE,UAAU,KAAK,IAAI;QAC3B,KAAK;QACL,IAAI;QACJ,OAAO;QACP,QAAQ;QACR,SAAS;KACV,CAAC,EACF,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CACtE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FunctionArgs, FunctionReference } from "convex/server";
|
|
2
|
+
import { type CodexTokenUsage, type CodexTurnTokenUsage } from "./tokenUsage.js";
|
|
3
|
+
export type CodexTokenUsageQuery<Args = Record<string, unknown>> = FunctionReference<"query", "public", {
|
|
4
|
+
threadId: string;
|
|
5
|
+
} & Args, CodexTurnTokenUsage[]>;
|
|
6
|
+
export declare function useCodexTokenUsage<Query extends CodexTokenUsageQuery<unknown>>(query: Query, args: FunctionArgs<Query> | "skip"): CodexTokenUsage;
|
|
7
|
+
//# sourceMappingURL=useCodexTokenUsage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCodexTokenUsage.d.ts","sourceRoot":"","sources":["../../src/react/useCodexTokenUsage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,oBAAoB,CAC9B,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5B,iBAAiB,CACnB,OAAO,EACP,QAAQ,EACR;IACE,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,EACR,mBAAmB,EAAE,CACtB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,KAAK,SAAS,oBAAoB,CAAC,OAAO,CAAC,EAC5E,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,GACjC,eAAe,CAIjB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useQuery } from "convex/react";
|
|
4
|
+
import { deriveCodexTokenUsage, } from "./tokenUsage.js";
|
|
5
|
+
export function useCodexTokenUsage(query, args) {
|
|
6
|
+
const queryArgs = (args === "skip" ? ["skip"] : [args]);
|
|
7
|
+
const rawTurns = useQuery(query, ...queryArgs);
|
|
8
|
+
return useMemo(() => deriveCodexTokenUsage(rawTurns), [rawTurns]);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=useCodexTokenUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCodexTokenUsage.js","sourceRoot":"","sources":["../../src/react/useCodexTokenUsage.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,QAAQ,EAA+B,MAAM,cAAc,CAAC;AAErE,OAAO,EACL,qBAAqB,GAGtB,MAAM,iBAAiB,CAAC;AAazB,MAAM,UAAU,kBAAkB,CAChC,KAAY,EACZ,IAAkC;IAElC,MAAM,SAAS,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAA6C,CAAC;IACpG,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,CAAC;IAC/C,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamLifecycle.d.ts","sourceRoot":"","sources":["../../src/shared/streamLifecycle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamLifecycle.js","sourceRoot":"","sources":["../../src/shared/streamLifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,uBAAuB,CAAC"}
|
|
@@ -60,6 +60,7 @@ Common helpers used by consumers:
|
|
|
60
60
|
- `useCodexInterruptTurn`
|
|
61
61
|
- `useCodexAutoResume`
|
|
62
62
|
- `useCodexComposer`
|
|
63
|
+
- `useCodexTokenUsage`
|
|
63
64
|
- `optimisticallySendCodexMessage`
|
|
64
65
|
|
|
65
66
|
## `useCodexMessages` Host Query Contract
|
|
@@ -93,6 +94,7 @@ Return shape:
|
|
|
93
94
|
- `useCodexThreads` -> app thread-list query + thread lifecycle mutations
|
|
94
95
|
- `useCodexInterruptTurn` -> `chat.interruptTurnForHooks`
|
|
95
96
|
- `useCodexComposer` -> `chat.enqueueTurnDispatch`
|
|
97
|
+
- `useCodexTokenUsage` -> `chat.listTokenUsageForHooks`
|
|
96
98
|
|
|
97
99
|
## Reference React Integration Adapter
|
|
98
100
|
|
|
@@ -136,7 +138,7 @@ It demonstrates generated host wrappers plus React-first hook composition (`useC
|
|
|
136
138
|
|
|
137
139
|
| UI Signal | Source of truth | Ignore for this signal | Why |
|
|
138
140
|
| --- | --- | --- | --- |
|
|
139
|
-
| Thread activity badge (`idle/streaming/awaiting_approval/failed/interrupted`) | `useCodexThreadActivity(chat.threadSnapshotSafe, ...)` | Raw `messages`, `dispatches`, `turns`, `streamStats` stitching in app code |
|
|
141
|
+
| Thread activity badge (`idle/streaming/awaiting_approval/failed/interrupted`) | `useCodexThreadActivity(chat.threadSnapshotSafe, ...)` | Raw `messages`, `dispatches`, `turns`, `streamStats`, `activeStreams` stitching in app code | Uses canonical precedence: `pending approvals > streaming message > active stream > in-flight newer than terminal > terminal > idle`, including stream-drain lifecycle markers to prevent stuck streaming. |
|
|
140
142
|
| Show "needs approval" UI | `activity.phase === "awaiting_approval"` (or `pendingApprovals` count if not using activity hook) | Dispatch status alone | Dispatch lifecycle does not encode approval waits. |
|
|
141
143
|
| Render assistant text deltas | `useCodexMessages(..., { stream: true })` | `dispatches` and `turns` | Dispatch/turn state tracks orchestration, not message text continuity. |
|
|
142
144
|
| Enable cancel/interruption affordance | `activity.phase === "streaming"` with `activity.activeTurnId` | `threadStatus`, `dispatches` alone | Active turn identity should come from normalized activity. |
|
|
@@ -25,6 +25,7 @@ All focused preset builders include:
|
|
|
25
25
|
- `listThreadMessagesForHooks`
|
|
26
26
|
- `listTurnMessagesForHooks`
|
|
27
27
|
- `listPendingApprovalsForHooks`
|
|
28
|
+
- `listTokenUsageForHooks`
|
|
28
29
|
|
|
29
30
|
Additional query endpoints:
|
|
30
31
|
|
|
@@ -46,6 +47,7 @@ All focused preset builders include:
|
|
|
46
47
|
- `ingestEvent`
|
|
47
48
|
- `ingestBatch`
|
|
48
49
|
- `respondApprovalForHooks`
|
|
50
|
+
- `upsertTokenUsageForHooks`
|
|
49
51
|
- `interruptTurnForHooks`
|
|
50
52
|
|
|
51
53
|
Dispatch-managed additionally includes:
|