@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.
Files changed (81) hide show
  1. package/dist/component/_generated/component.d.ts +10 -0
  2. package/dist/component/_generated/component.d.ts.map +1 -1
  3. package/dist/component/index.d.ts +1 -0
  4. package/dist/component/index.d.ts.map +1 -1
  5. package/dist/component/index.js +1 -0
  6. package/dist/component/index.js.map +1 -1
  7. package/dist/component/schema.d.ts +40 -0
  8. package/dist/component/schema.d.ts.map +1 -1
  9. package/dist/component/schema.js +21 -0
  10. package/dist/component/schema.js.map +1 -1
  11. package/dist/component/streamStats.d.ts +7 -0
  12. package/dist/component/streamStats.d.ts.map +1 -1
  13. package/dist/component/streamStats.js +20 -2
  14. package/dist/component/streamStats.js.map +1 -1
  15. package/dist/component/streams.d.ts.map +1 -1
  16. package/dist/component/streams.js +31 -0
  17. package/dist/component/streams.js.map +1 -1
  18. package/dist/component/threads.d.ts +10 -0
  19. package/dist/component/threads.d.ts.map +1 -1
  20. package/dist/component/threads.js +49 -1
  21. package/dist/component/threads.js.map +1 -1
  22. package/dist/component/tokenUsage.d.ts +43 -0
  23. package/dist/component/tokenUsage.d.ts.map +1 -0
  24. package/dist/component/tokenUsage.js +107 -0
  25. package/dist/component/tokenUsage.js.map +1 -0
  26. package/dist/host/convexPreset.d.ts +54 -0
  27. package/dist/host/convexPreset.d.ts.map +1 -1
  28. package/dist/host/convexPreset.js +39 -1
  29. package/dist/host/convexPreset.js.map +1 -1
  30. package/dist/host/convexSlice.d.ts +27 -1
  31. package/dist/host/convexSlice.d.ts.map +1 -1
  32. package/dist/host/convexSlice.js +24 -0
  33. package/dist/host/convexSlice.js.map +1 -1
  34. package/dist/host/index.d.ts +1 -1
  35. package/dist/host/index.d.ts.map +1 -1
  36. package/dist/host/index.js +1 -1
  37. package/dist/host/index.js.map +1 -1
  38. package/dist/host/runtime.d.ts +16 -0
  39. package/dist/host/runtime.d.ts.map +1 -1
  40. package/dist/host/runtime.js +46 -0
  41. package/dist/host/runtime.js.map +1 -1
  42. package/dist/host/surfaceManifest.d.ts +4 -4
  43. package/dist/host/surfaceManifest.d.ts.map +1 -1
  44. package/dist/host/surfaceManifest.js +4 -0
  45. package/dist/host/surfaceManifest.js.map +1 -1
  46. package/dist/protocol/events.d.ts.map +1 -1
  47. package/dist/protocol/events.js +58 -6
  48. package/dist/protocol/events.js.map +1 -1
  49. package/dist/react/activityAuthority.d.ts +50 -0
  50. package/dist/react/activityAuthority.d.ts.map +1 -0
  51. package/dist/react/activityAuthority.js +185 -0
  52. package/dist/react/activityAuthority.js.map +1 -0
  53. package/dist/react/branchActivity.d.ts.map +1 -1
  54. package/dist/react/branchActivity.js +4 -0
  55. package/dist/react/branchActivity.js.map +1 -1
  56. package/dist/react/index.d.ts +3 -0
  57. package/dist/react/index.d.ts.map +1 -1
  58. package/dist/react/index.js +2 -0
  59. package/dist/react/index.js.map +1 -1
  60. package/dist/react/threadActivity.d.ts +2 -33
  61. package/dist/react/threadActivity.d.ts.map +1 -1
  62. package/dist/react/threadActivity.js +2 -144
  63. package/dist/react/threadActivity.js.map +1 -1
  64. package/dist/react/tokenUsage.d.ts +32 -0
  65. package/dist/react/tokenUsage.d.ts.map +1 -0
  66. package/dist/react/tokenUsage.js +17 -0
  67. package/dist/react/tokenUsage.js.map +1 -0
  68. package/dist/react/useCodexRuntimeBridge.d.ts.map +1 -1
  69. package/dist/react/useCodexRuntimeBridge.js +7 -3
  70. package/dist/react/useCodexRuntimeBridge.js.map +1 -1
  71. package/dist/react/useCodexTokenUsage.d.ts +7 -0
  72. package/dist/react/useCodexTokenUsage.d.ts.map +1 -0
  73. package/dist/react/useCodexTokenUsage.js +10 -0
  74. package/dist/react/useCodexTokenUsage.js.map +1 -0
  75. package/dist/shared/streamLifecycle.d.ts +2 -0
  76. package/dist/shared/streamLifecycle.d.ts.map +1 -0
  77. package/dist/shared/streamLifecycle.js +2 -0
  78. package/dist/shared/streamLifecycle.js.map +1 -0
  79. package/docs/CLIENT_AND_REACT_HOOKS.md +3 -1
  80. package/docs/HOST_PRESET_MATRIX.md +2 -0
  81. package/package.json +1 -1
@@ -1,35 +1,4 @@
1
- export type CodexThreadActivityPhase = "idle" | "streaming" | "awaiting_approval" | "failed" | "interrupted";
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,MAAM,MAAM,wBAAwB,GAChC,MAAM,GACN,WAAW,GACX,mBAAmB,GACnB,QAAQ,GACR,aAAa,CAAC;AAElB,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,wBAAwB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,CAAC;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,KAAK,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,8BAA8B,EAAE,GAAG,IAAI,CAAC;IACzD,UAAU,CAAC,EAAE,+BAA+B,EAAE,GAAG,IAAI,CAAC;IACtD,WAAW,CAAC,EAAE,iCAAiC,EAAE,GAAG,IAAI,CAAC;IACzD,KAAK,CAAC,EAAE,2BAA2B,EAAE,GAAG,IAAI,CAAC;CAC9C,CAAC;AAwGF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,8BAA8B,GAAG,IAAI,GAAG,SAAS,GACvD,mBAAmB,CAgFrB"}
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
- const IN_FLIGHT_DISPATCH_STATUSES = new Set(["queued", "claimed", "started"]);
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
- const messages = state?.recentMessages ?? [];
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":"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"}
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;;;;;kBAiCc,SAAS;;;qBAyBT,QAAQ;;EA+BxB"}
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 state;
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, state]);
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":"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"}
1
+ {"version":3,"file":"useCodexRuntimeBridge.js","sourceRoot":"","sources":["../../src/react/useCodexRuntimeBridge.ts"],"names":[],"mappings":"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"}
@@ -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,2 @@
1
+ export declare const STREAM_DRAIN_COMPLETE_KIND = "stream/drain_complete";
2
+ //# sourceMappingURL=streamLifecycle.d.ts.map
@@ -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,2 @@
1
+ export const STREAM_DRAIN_COMPLETE_KIND = "stream/drain_complete";
2
+ //# sourceMappingURL=streamLifecycle.js.map
@@ -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 | Prevents precedence bugs and "stuck streaming" regressions. |
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:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zakstam/codex-local-component",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",