@zakstam/codex-local-component 0.8.0 → 0.9.1

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 (100) hide show
  1. package/LLMS.md +8 -1
  2. package/README.md +2 -0
  3. package/dist/component/threads.d.ts +1 -0
  4. package/dist/component/threads.d.ts.map +1 -1
  5. package/dist/component/threads.js +2 -0
  6. package/dist/component/threads.js.map +1 -1
  7. package/dist/errors.d.ts +13 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +42 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/host/convex-entry.d.ts +2 -1
  12. package/dist/host/convex-entry.d.ts.map +1 -1
  13. package/dist/host/convex-entry.js +2 -1
  14. package/dist/host/convex-entry.js.map +1 -1
  15. package/dist/host/convexPreset.d.ts +14 -0
  16. package/dist/host/convexPreset.d.ts.map +1 -1
  17. package/dist/host/convexPreset.js +8 -1
  18. package/dist/host/convexPreset.js.map +1 -1
  19. package/dist/host/convexSlice.d.ts +1 -0
  20. package/dist/host/convexSlice.d.ts.map +1 -1
  21. package/dist/host/convexSlice.js +15 -0
  22. package/dist/host/convexSlice.js.map +1 -1
  23. package/dist/host/index.d.ts +2 -1
  24. package/dist/host/index.d.ts.map +1 -1
  25. package/dist/host/index.js +2 -1
  26. package/dist/host/index.js.map +1 -1
  27. package/dist/host/runtime.d.ts.map +1 -1
  28. package/dist/host/runtime.js +9 -0
  29. package/dist/host/runtime.js.map +1 -1
  30. package/dist/host/surfaceManifest.d.ts +2 -2
  31. package/dist/host/surfaceManifest.d.ts.map +1 -1
  32. package/dist/host/surfaceManifest.js +2 -0
  33. package/dist/host/surfaceManifest.js.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/protocol/events.d.ts.map +1 -1
  39. package/dist/protocol/events.js +58 -6
  40. package/dist/protocol/events.js.map +1 -1
  41. package/dist/react/branchActivity.d.ts +16 -0
  42. package/dist/react/branchActivity.d.ts.map +1 -0
  43. package/dist/react/branchActivity.js +70 -0
  44. package/dist/react/branchActivity.js.map +1 -0
  45. package/dist/react/dynamicTools.d.ts +34 -0
  46. package/dist/react/dynamicTools.d.ts.map +1 -0
  47. package/dist/react/dynamicTools.js +56 -0
  48. package/dist/react/dynamicTools.js.map +1 -0
  49. package/dist/react/index.d.ts +16 -0
  50. package/dist/react/index.d.ts.map +1 -1
  51. package/dist/react/index.js +12 -0
  52. package/dist/react/index.js.map +1 -1
  53. package/dist/react/ingestHealth.d.ts +35 -0
  54. package/dist/react/ingestHealth.d.ts.map +1 -0
  55. package/dist/react/ingestHealth.js +102 -0
  56. package/dist/react/ingestHealth.js.map +1 -0
  57. package/dist/react/threadActivity.d.ts +35 -0
  58. package/dist/react/threadActivity.d.ts.map +1 -0
  59. package/dist/react/threadActivity.js +161 -0
  60. package/dist/react/threadActivity.js.map +1 -0
  61. package/dist/react/useCodexAccountAuth.d.ts +43 -0
  62. package/dist/react/useCodexAccountAuth.d.ts.map +1 -0
  63. package/dist/react/useCodexAccountAuth.js +59 -0
  64. package/dist/react/useCodexAccountAuth.js.map +1 -0
  65. package/dist/react/useCodexBranchActivity.d.ts +7 -0
  66. package/dist/react/useCodexBranchActivity.d.ts.map +1 -0
  67. package/dist/react/useCodexBranchActivity.js +9 -0
  68. package/dist/react/useCodexBranchActivity.js.map +1 -0
  69. package/dist/react/useCodexConversationController.d.ts +83 -0
  70. package/dist/react/useCodexConversationController.d.ts.map +1 -0
  71. package/dist/react/useCodexConversationController.js +152 -0
  72. package/dist/react/useCodexConversationController.js.map +1 -0
  73. package/dist/react/useCodexDynamicTools.d.ts +26 -0
  74. package/dist/react/useCodexDynamicTools.d.ts.map +1 -0
  75. package/dist/react/useCodexDynamicTools.js +91 -0
  76. package/dist/react/useCodexDynamicTools.js.map +1 -0
  77. package/dist/react/useCodexIngestHealth.d.ts +6 -0
  78. package/dist/react/useCodexIngestHealth.d.ts.map +1 -0
  79. package/dist/react/useCodexIngestHealth.js +9 -0
  80. package/dist/react/useCodexIngestHealth.js.map +1 -0
  81. package/dist/react/useCodexRuntimeBridge.d.ts +28 -0
  82. package/dist/react/useCodexRuntimeBridge.d.ts.map +1 -0
  83. package/dist/react/useCodexRuntimeBridge.js +82 -0
  84. package/dist/react/useCodexRuntimeBridge.js.map +1 -0
  85. package/dist/react/useCodexThreadActivity.d.ts +6 -0
  86. package/dist/react/useCodexThreadActivity.d.ts.map +1 -0
  87. package/dist/react/useCodexThreadActivity.js +9 -0
  88. package/dist/react/useCodexThreadActivity.js.map +1 -0
  89. package/dist/react/useCodexThreads.d.ts +30 -0
  90. package/dist/react/useCodexThreads.d.ts.map +1 -0
  91. package/dist/react/useCodexThreads.js +65 -0
  92. package/dist/react/useCodexThreads.js.map +1 -0
  93. package/dist/react-integration/index.d.ts +101 -0
  94. package/dist/react-integration/index.d.ts.map +1 -0
  95. package/dist/react-integration/index.js +62 -0
  96. package/dist/react-integration/index.js.map +1 -0
  97. package/docs/CLIENT_AND_REACT_HOOKS.md +63 -0
  98. package/docs/HOST_PRESET_MATRIX.md +1 -0
  99. package/docs/OPERATIONS_AND_ERRORS.md +8 -0
  100. package/package.json +9 -1
@@ -0,0 +1,91 @@
1
+ "use client";
2
+ import { useQuery } from "convex/react";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+ import { deriveCodexDynamicToolCalls, } from "./dynamicTools.js";
5
+ function requestKey(requestId) {
6
+ return `${typeof requestId}:${String(requestId)}`;
7
+ }
8
+ export function useCodexDynamicTools(query, args, options) {
9
+ const queryArgs = (args === "skip" ? ["skip"] : [args]);
10
+ const requests = useQuery(query, ...queryArgs);
11
+ const calls = useMemo(() => deriveCodexDynamicToolCalls(requests ?? []), [requests]);
12
+ const [runningRequestIds, setRunningRequestIds] = useState([]);
13
+ const [lastError, setLastError] = useState(null);
14
+ const handledRequestIdsRef = useRef(new Set());
15
+ const respond = useCallback(async (call, result) => {
16
+ if (!options.respond) {
17
+ throw new Error("Dynamic tool response handler is not configured.");
18
+ }
19
+ await options.respond({
20
+ requestId: call.requestId,
21
+ success: result.success,
22
+ contentItems: result.contentItems,
23
+ });
24
+ handledRequestIdsRef.current.add(requestKey(call.requestId));
25
+ }, [options]);
26
+ const runCall = useCallback(async (call) => {
27
+ const handler = options.handlers?.[call.toolName];
28
+ if (!handler) {
29
+ return false;
30
+ }
31
+ const key = requestKey(call.requestId);
32
+ if (handledRequestIdsRef.current.has(key)) {
33
+ return true;
34
+ }
35
+ setRunningRequestIds((current) => (current.includes(key) ? current : [...current, key]));
36
+ setLastError(null);
37
+ try {
38
+ const result = await handler(call);
39
+ await respond(call, result);
40
+ return true;
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof Error ? error.message : String(error);
44
+ setLastError(message);
45
+ throw error;
46
+ }
47
+ finally {
48
+ setRunningRequestIds((current) => current.filter((id) => id !== key));
49
+ }
50
+ }, [options.handlers, respond]);
51
+ useEffect(() => {
52
+ if ((options.enabled ?? true) !== true) {
53
+ return;
54
+ }
55
+ if ((options.autoHandle ?? true) !== true) {
56
+ return;
57
+ }
58
+ if (!options.respond) {
59
+ return;
60
+ }
61
+ if (!options.handlers || Object.keys(options.handlers).length === 0) {
62
+ return;
63
+ }
64
+ void (async () => {
65
+ for (const call of calls) {
66
+ const key = requestKey(call.requestId);
67
+ if (handledRequestIdsRef.current.has(key) || runningRequestIds.includes(key)) {
68
+ continue;
69
+ }
70
+ const handler = options.handlers?.[call.toolName];
71
+ if (!handler) {
72
+ continue;
73
+ }
74
+ await runCall(call);
75
+ }
76
+ })().catch((error) => {
77
+ const message = error instanceof Error ? error.message : String(error);
78
+ setLastError(message);
79
+ });
80
+ }, [calls, options.autoHandle, options.enabled, options.handlers, runCall, runningRequestIds]);
81
+ return useMemo(() => ({
82
+ requests: requests ?? [],
83
+ calls,
84
+ pendingCount: calls.length,
85
+ runningRequestIds,
86
+ lastError,
87
+ runCall,
88
+ respond,
89
+ }), [calls, lastError, requests, respond, runCall, runningRequestIds]);
90
+ }
91
+ //# sourceMappingURL=useCodexDynamicTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexDynamicTools.js","sourceRoot":"","sources":["../../src/react/useCodexDynamicTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { FunctionArgs } from "convex/server";
2
+ import { type CodexThreadStateQuery } from "./useCodexThreadState.js";
3
+ import { type CodexIngestHealth, type CodexIngestHealthThreadState } from "./ingestHealth.js";
4
+ export type CodexIngestHealthQuery<Args = Record<string, unknown>, Result extends CodexIngestHealthThreadState = CodexIngestHealthThreadState> = CodexThreadStateQuery<Args, Result>;
5
+ export declare function useCodexIngestHealth<Query extends CodexIngestHealthQuery<unknown, CodexIngestHealthThreadState>>(query: Query, args: FunctionArgs<Query> | "skip"): CodexIngestHealth;
6
+ //# sourceMappingURL=useCodexIngestHealth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexIngestHealth.d.ts","sourceRoot":"","sources":["../../src/react/useCodexIngestHealth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,4BAA4B,EAClC,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,sBAAsB,CAChC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,SAAS,4BAA4B,GAAG,4BAA4B,IACxE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAExC,wBAAgB,oBAAoB,CAAC,KAAK,SAAS,sBAAsB,CAAC,OAAO,EAAE,4BAA4B,CAAC,EAC9G,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,GACjC,iBAAiB,CAGnB"}
@@ -0,0 +1,9 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { useCodexThreadState } from "./useCodexThreadState.js";
4
+ import { deriveCodexIngestHealth, } from "./ingestHealth.js";
5
+ export function useCodexIngestHealth(query, args) {
6
+ const threadState = useCodexThreadState(query, args);
7
+ return useMemo(() => deriveCodexIngestHealth(threadState), [threadState]);
8
+ }
9
+ //# sourceMappingURL=useCodexIngestHealth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexIngestHealth.js","sourceRoot":"","sources":["../../src/react/useCodexIngestHealth.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAA8B,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EACL,uBAAuB,GAGxB,MAAM,mBAAmB,CAAC;AAO3B,MAAM,UAAU,oBAAoB,CAClC,KAAY,EACZ,IAAkC;IAElC,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,28 @@
1
+ export type CodexRuntimeBridgeState = {
2
+ running: boolean;
3
+ threadId?: string | null;
4
+ turnId?: string | null;
5
+ lastError?: string | null;
6
+ [key: string]: unknown;
7
+ };
8
+ export type CodexRuntimeBridgeControls<StartArgs, SendArgs = string> = {
9
+ start: (args: StartArgs) => Promise<unknown>;
10
+ stop: () => Promise<unknown>;
11
+ getState?: () => Promise<CodexRuntimeBridgeState>;
12
+ sendTurn?: (args: SendArgs) => Promise<unknown>;
13
+ interrupt?: () => Promise<unknown>;
14
+ };
15
+ export declare function useCodexRuntimeBridge<StartArgs, SendArgs = string>(controls: CodexRuntimeBridgeControls<StartArgs, SendArgs>, options?: {
16
+ initialState?: CodexRuntimeBridgeState;
17
+ }): {
18
+ state: CodexRuntimeBridgeState;
19
+ error: string | null;
20
+ busyAction: "start" | "interrupt" | "stop" | "refresh" | "send" | null;
21
+ isBusy: boolean;
22
+ start: (args: StartArgs) => Promise<unknown>;
23
+ stop: () => Promise<unknown>;
24
+ refresh: () => Promise<CodexRuntimeBridgeState>;
25
+ sendTurn: (args: SendArgs) => Promise<unknown>;
26
+ interrupt: () => Promise<unknown>;
27
+ };
28
+ //# sourceMappingURL=useCodexRuntimeBridge.d.ts.map
@@ -0,0 +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;;;;;kBAsCc,SAAS;;;qBAyBT,QAAQ;;EA+BxB"}
@@ -0,0 +1,82 @@
1
+ "use client";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
+ export function useCodexRuntimeBridge(controls, options) {
4
+ const [state, setState] = useState(options?.initialState ?? { running: false, threadId: null, turnId: null, lastError: null });
5
+ const stateRef = useRef(state);
6
+ const [busyAction, setBusyAction] = useState(null);
7
+ const [error, setError] = useState(null);
8
+ useEffect(() => {
9
+ stateRef.current = state;
10
+ }, [state]);
11
+ const runAction = useCallback(async (action, fn) => {
12
+ setBusyAction(action);
13
+ setError(null);
14
+ try {
15
+ const result = await fn();
16
+ return result;
17
+ }
18
+ catch (nextError) {
19
+ const message = nextError instanceof Error ? nextError.message : String(nextError);
20
+ setError(message);
21
+ throw nextError;
22
+ }
23
+ finally {
24
+ setBusyAction((current) => (current === action ? null : current));
25
+ }
26
+ }, []);
27
+ const refresh = useCallback(async () => {
28
+ if (!controls.getState) {
29
+ return stateRef.current;
30
+ }
31
+ const next = await runAction("refresh", controls.getState);
32
+ setState(next);
33
+ return next;
34
+ }, [controls.getState, runAction]);
35
+ const start = useCallback(async (args) => {
36
+ const result = await runAction("start", () => controls.start(args));
37
+ if (controls.getState) {
38
+ const next = await controls.getState();
39
+ setState(next);
40
+ }
41
+ else {
42
+ setState((current) => ({ ...current, running: true }));
43
+ }
44
+ return result;
45
+ }, [controls, runAction]);
46
+ const stop = useCallback(async () => {
47
+ const result = await runAction("stop", controls.stop);
48
+ if (controls.getState) {
49
+ const next = await controls.getState();
50
+ setState(next);
51
+ }
52
+ else {
53
+ setState((current) => ({ ...current, running: false }));
54
+ }
55
+ return result;
56
+ }, [controls, runAction]);
57
+ const sendTurn = useCallback(async (args) => {
58
+ const sendTurnControl = controls.sendTurn;
59
+ if (!sendTurnControl) {
60
+ return;
61
+ }
62
+ return runAction("send", () => sendTurnControl(args));
63
+ }, [controls.sendTurn, runAction]);
64
+ const interrupt = useCallback(async () => {
65
+ if (!controls.interrupt) {
66
+ return;
67
+ }
68
+ return runAction("interrupt", controls.interrupt);
69
+ }, [controls.interrupt, runAction]);
70
+ return useMemo(() => ({
71
+ state,
72
+ error,
73
+ busyAction,
74
+ isBusy: busyAction !== null,
75
+ start,
76
+ stop,
77
+ refresh,
78
+ sendTurn,
79
+ interrupt,
80
+ }), [busyAction, error, interrupt, refresh, sendTurn, start, state, stop]);
81
+ }
82
+ //# sourceMappingURL=useCodexRuntimeBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexRuntimeBridge.js","sourceRoot":"","sources":["../../src/react/useCodexRuntimeBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { FunctionArgs } from "convex/server";
2
+ import { type CodexThreadStateQuery } from "./useCodexThreadState.js";
3
+ import { type CodexThreadActivity, type CodexThreadActivityThreadState } from "./threadActivity.js";
4
+ export type CodexThreadActivityQuery<Args = Record<string, unknown>, Result extends CodexThreadActivityThreadState = CodexThreadActivityThreadState> = CodexThreadStateQuery<Args, Result>;
5
+ export declare function useCodexThreadActivity<Query extends CodexThreadActivityQuery<unknown, CodexThreadActivityThreadState>>(query: Query, args: FunctionArgs<Query> | "skip"): CodexThreadActivity;
6
+ //# sourceMappingURL=useCodexThreadActivity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexThreadActivity.d.ts","sourceRoot":"","sources":["../../src/react/useCodexThreadActivity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAA6B,KAAK,mBAAmB,EAAE,KAAK,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAE/H,MAAM,MAAM,wBAAwB,CAClC,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,SAAS,8BAA8B,GAAG,8BAA8B,IAC5E,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAExC,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,wBAAwB,CAAC,OAAO,EAAE,8BAA8B,CAAC,EACpH,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,GACjC,mBAAmB,CAGrB"}
@@ -0,0 +1,9 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { useCodexThreadState } from "./useCodexThreadState.js";
4
+ import { deriveCodexThreadActivity } from "./threadActivity.js";
5
+ export function useCodexThreadActivity(query, args) {
6
+ const threadState = useCodexThreadState(query, args);
7
+ return useMemo(() => deriveCodexThreadActivity(threadState), [threadState]);
8
+ }
9
+ //# sourceMappingURL=useCodexThreadActivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexThreadActivity.js","sourceRoot":"","sources":["../../src/react/useCodexThreadActivity.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAA8B,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAiE,MAAM,qBAAqB,CAAC;AAO/H,MAAM,UAAU,sBAAsB,CACpC,KAAY,EACZ,IAAkC;IAElC,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { FunctionArgs, FunctionReference } from "convex/server";
2
+ export type CodexThreadsListQuery<Args extends Record<string, unknown> = Record<string, unknown>, Result = unknown> = FunctionReference<"query", "public", Args, Result>;
3
+ export type CodexThreadsControls = {
4
+ createThread?: (args?: Record<string, unknown>) => Promise<unknown>;
5
+ resolveThread?: (args: {
6
+ localThreadId: string;
7
+ }) => Promise<unknown>;
8
+ resumeThread?: (args: {
9
+ threadId: string;
10
+ }) => Promise<unknown>;
11
+ };
12
+ export declare function useCodexThreads<Query extends CodexThreadsListQuery<Record<string, unknown>, unknown>>(config: {
13
+ list: {
14
+ query: Query;
15
+ args: FunctionArgs<Query> | "skip";
16
+ };
17
+ controls?: CodexThreadsControls;
18
+ initialSelectedThreadId?: string | null;
19
+ }): {
20
+ threads: Query["_returnType"] | undefined;
21
+ selectedThreadId: string | null;
22
+ setSelectedThreadId: import("react").Dispatch<import("react").SetStateAction<string | null>>;
23
+ busyAction: "resolve" | "create" | "resume" | null;
24
+ isBusy: boolean;
25
+ error: string | null;
26
+ create: (args?: Record<string, unknown>) => Promise<unknown>;
27
+ resolve: (localThreadId: string) => Promise<unknown>;
28
+ resume: (threadId: string) => Promise<unknown>;
29
+ };
30
+ //# sourceMappingURL=useCodexThreads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexThreads.d.ts","sourceRoot":"","sources":["../../src/react/useCodexThreads.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGrE,MAAM,MAAM,qBAAqB,CAC/B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,MAAM,GAAG,OAAO,IACd,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEvD,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjE,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,SAAS,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EACnG,MAAM,EAAE;IACN,IAAI,EAAE;QACJ,KAAK,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;;;;;;;oBA6Be,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;6BAWf,MAAM;uBAaX,MAAM;EA0B1B"}
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { useQuery } from "convex/react";
3
+ import { useCallback, useMemo, useState } from "react";
4
+ export function useCodexThreads(config) {
5
+ const listQueryArgs = config.list.args === "skip"
6
+ ? ["skip"]
7
+ : [config.list.args];
8
+ const listArgs = listQueryArgs;
9
+ const listed = useQuery(config.list.query, ...listArgs);
10
+ const [selectedThreadId, setSelectedThreadId] = useState(config.initialSelectedThreadId ?? null);
11
+ const [busyAction, setBusyAction] = useState(null);
12
+ const [error, setError] = useState(null);
13
+ const run = useCallback(async (action, fn) => {
14
+ setBusyAction(action);
15
+ setError(null);
16
+ try {
17
+ return await fn();
18
+ }
19
+ catch (nextError) {
20
+ const message = nextError instanceof Error ? nextError.message : String(nextError);
21
+ setError(message);
22
+ throw nextError;
23
+ }
24
+ finally {
25
+ setBusyAction((current) => (current === action ? null : current));
26
+ }
27
+ }, []);
28
+ const create = useCallback(async (args) => {
29
+ const createThread = config.controls?.createThread;
30
+ if (!createThread) {
31
+ return null;
32
+ }
33
+ return run("create", () => createThread(args));
34
+ }, [config.controls, run]);
35
+ const resolve = useCallback(async (localThreadId) => {
36
+ const resolveThread = config.controls?.resolveThread;
37
+ if (!resolveThread) {
38
+ return null;
39
+ }
40
+ const result = await run("resolve", () => resolveThread({ localThreadId }));
41
+ setSelectedThreadId(localThreadId);
42
+ return result;
43
+ }, [config.controls, run]);
44
+ const resume = useCallback(async (threadId) => {
45
+ const resumeThread = config.controls?.resumeThread;
46
+ if (!resumeThread) {
47
+ return null;
48
+ }
49
+ const result = await run("resume", () => resumeThread({ threadId }));
50
+ setSelectedThreadId(threadId);
51
+ return result;
52
+ }, [config.controls, run]);
53
+ return useMemo(() => ({
54
+ threads: listed,
55
+ selectedThreadId,
56
+ setSelectedThreadId,
57
+ busyAction,
58
+ isBusy: busyAction !== null,
59
+ error,
60
+ create,
61
+ resolve,
62
+ resume,
63
+ }), [busyAction, create, error, listed, resolve, resume, selectedThreadId]);
64
+ }
65
+ //# sourceMappingURL=useCodexThreads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodexThreads.js","sourceRoot":"","sources":["../../src/react/useCodexThreads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { CodexDynamicToolHandler, CodexDynamicToolsQuery, CodexDynamicToolsRespond } from "../react/useCodexDynamicTools.js";
2
+ import type { CodexMessagesQuery } from "../react/types.js";
3
+ import type { CodexThreadActivityQuery } from "../react/useCodexThreadActivity.js";
4
+ import type { CodexThreadActivity, CodexThreadActivityThreadState } from "../react/threadActivity.js";
5
+ import type { CodexBranchActivityOptions } from "../react/branchActivity.js";
6
+ import type { CodexConversationApprovalDecision, CodexConversationApprovalItem } from "../react/useCodexConversationController.js";
7
+ export type CodexThreadScopeArgs<Actor extends Record<string, unknown>> = {
8
+ actor: Actor;
9
+ threadId: string;
10
+ };
11
+ export type CodexThreadTurnScopeArgs<Actor extends Record<string, unknown>> = CodexThreadScopeArgs<Actor> & {
12
+ turnId: string;
13
+ };
14
+ export type CodexReactHostHooks<Actor extends Record<string, unknown>> = {
15
+ listThreadMessagesForHooks: CodexMessagesQuery<{
16
+ actor: Actor;
17
+ }>;
18
+ threadSnapshotSafe: CodexThreadActivityQuery<{
19
+ actor: Actor;
20
+ }, CodexThreadActivityThreadState>;
21
+ listPendingServerRequestsForHooks?: CodexDynamicToolsQuery<{
22
+ actor: Actor;
23
+ threadId: string;
24
+ limit?: number;
25
+ }>;
26
+ };
27
+ export type CodexReactConversationControllerOptions = {
28
+ initialNumItems: number;
29
+ stream?: boolean;
30
+ branchOptions?: CodexBranchActivityOptions;
31
+ composer?: {
32
+ initialValue?: string;
33
+ onSend: (text: string) => Promise<unknown>;
34
+ };
35
+ approvals?: {
36
+ onResolve: (approval: CodexConversationApprovalItem, decision: CodexConversationApprovalDecision) => Promise<unknown>;
37
+ };
38
+ dynamicTools?: {
39
+ respond?: CodexDynamicToolsRespond;
40
+ handlers?: Record<string, CodexDynamicToolHandler>;
41
+ autoHandle?: boolean;
42
+ enabled?: boolean;
43
+ limit?: number;
44
+ };
45
+ interrupt?: {
46
+ onInterrupt: (activity: CodexThreadActivity) => Promise<unknown>;
47
+ };
48
+ };
49
+ export declare function codexThreadScopeArgs<Actor extends Record<string, unknown>>(actor: Actor, threadId: string | null | undefined): CodexThreadScopeArgs<Actor> | "skip";
50
+ export declare function codexThreadTurnScopeArgs<Actor extends Record<string, unknown>>(actor: Actor, threadId: string | null | undefined, turnId: string | null | undefined): CodexThreadTurnScopeArgs<Actor> | "skip";
51
+ export declare function createCodexReactConvexAdapter<Actor extends Record<string, unknown>>(config: {
52
+ actor: Actor;
53
+ hooks: CodexReactHostHooks<Actor>;
54
+ }): {
55
+ threadArgs: (threadId: string | null | undefined) => "skip" | CodexThreadScopeArgs<Actor>;
56
+ threadTurnArgs: (threadId: string | null | undefined, turnId: string | null | undefined) => "skip" | CodexThreadTurnScopeArgs<Actor>;
57
+ useThreadMessages: (threadId: string | null | undefined, options: {
58
+ initialNumItems: number;
59
+ stream?: boolean;
60
+ }) => import("convex/react").UsePaginatedQueryResult<import("../index.js").CodexUIMessage>;
61
+ useThreadActivity: (threadId: string | null | undefined) => CodexThreadActivity;
62
+ useBranchActivity: (threadId: string | null | undefined, options?: CodexBranchActivityOptions) => CodexThreadActivity;
63
+ useIngestHealth: (threadId: string | null | undefined) => import("../react/ingestHealth.js").CodexIngestHealth;
64
+ useConversationController: (threadId: string | null | undefined, options: CodexReactConversationControllerOptions) => {
65
+ messages: import("convex/react").UsePaginatedQueryResult<import("../index.js").CodexUIMessage>;
66
+ activity: CodexThreadActivity;
67
+ ingestHealth: import("../react/ingestHealth.js").CodexIngestHealth;
68
+ branchActivity: CodexThreadActivity;
69
+ approvals: {
70
+ pending: CodexConversationApprovalItem[];
71
+ pendingCount: number;
72
+ approvingItemId: string | null;
73
+ error: string | null;
74
+ canResolve: boolean;
75
+ resolve: (approval: CodexConversationApprovalItem, decision: CodexConversationApprovalDecision) => Promise<void>;
76
+ accept: (approval: CodexConversationApprovalItem) => Promise<void>;
77
+ decline: (approval: CodexConversationApprovalItem) => Promise<void>;
78
+ };
79
+ dynamicTools: {
80
+ requests: never[] | import("../react/dynamicTools.js").CodexDynamicToolServerRequest[];
81
+ calls: import("../react/dynamicTools.js").CodexDynamicToolCall[];
82
+ pendingCount: number;
83
+ runningRequestIds: string[];
84
+ lastError: string | null;
85
+ runCall: (call: import("../react/dynamicTools.js").CodexDynamicToolCall) => Promise<boolean>;
86
+ respond: (call: import("../react/dynamicTools.js").CodexDynamicToolCall, result: import("../react/dynamicTools.js").CodexDynamicToolResponse) => Promise<void>;
87
+ };
88
+ composer: {
89
+ value: string;
90
+ setValue: import("react").Dispatch<import("react").SetStateAction<string>>;
91
+ error: string | null;
92
+ isSending: boolean;
93
+ canSend: boolean;
94
+ send: (overrideText?: string) => Promise<void>;
95
+ };
96
+ interrupt: () => Promise<void>;
97
+ canInterrupt: boolean;
98
+ isInterrupting: boolean;
99
+ };
100
+ };
101
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react-integration/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { useCodexMessages } from "../react/useCodexMessages.js";
3
+ import { useCodexBranchActivity } from "../react/useCodexBranchActivity.js";
4
+ import { useCodexConversationController } from "../react/useCodexConversationController.js";
5
+ import { useCodexIngestHealth } from "../react/useCodexIngestHealth.js";
6
+ import { useCodexThreadActivity } from "../react/useCodexThreadActivity.js";
7
+ export function codexThreadScopeArgs(actor, threadId) {
8
+ if (!threadId) {
9
+ return "skip";
10
+ }
11
+ return { actor, threadId };
12
+ }
13
+ export function codexThreadTurnScopeArgs(actor, threadId, turnId) {
14
+ if (!threadId || !turnId) {
15
+ return "skip";
16
+ }
17
+ return { actor, threadId, turnId };
18
+ }
19
+ export function createCodexReactConvexAdapter(config) {
20
+ return {
21
+ threadArgs: (threadId) => codexThreadScopeArgs(config.actor, threadId),
22
+ threadTurnArgs: (threadId, turnId) => codexThreadTurnScopeArgs(config.actor, threadId, turnId),
23
+ useThreadMessages: (threadId, options) => {
24
+ const args = codexThreadScopeArgs(config.actor, threadId);
25
+ return useCodexMessages(config.hooks.listThreadMessagesForHooks, args, options);
26
+ },
27
+ useThreadActivity: (threadId) => useCodexThreadActivity(config.hooks.threadSnapshotSafe, codexThreadScopeArgs(config.actor, threadId)),
28
+ useBranchActivity: (threadId, options) => useCodexBranchActivity(config.hooks.threadSnapshotSafe, codexThreadScopeArgs(config.actor, threadId), options),
29
+ useIngestHealth: (threadId) => useCodexIngestHealth(config.hooks.threadSnapshotSafe, codexThreadScopeArgs(config.actor, threadId)),
30
+ useConversationController: (threadId, options) => useCodexConversationController({
31
+ messages: {
32
+ query: config.hooks.listThreadMessagesForHooks,
33
+ args: codexThreadScopeArgs(config.actor, threadId),
34
+ initialNumItems: options.initialNumItems,
35
+ ...(options.stream !== undefined ? { stream: options.stream } : {}),
36
+ },
37
+ threadState: {
38
+ query: config.hooks.threadSnapshotSafe,
39
+ args: codexThreadScopeArgs(config.actor, threadId),
40
+ ...(options.branchOptions !== undefined ? { branchOptions: options.branchOptions } : {}),
41
+ },
42
+ ...(options.approvals !== undefined ? { approvals: options.approvals } : {}),
43
+ ...(options.dynamicTools !== undefined && config.hooks.listPendingServerRequestsForHooks !== undefined
44
+ ? {
45
+ dynamicTools: {
46
+ query: config.hooks.listPendingServerRequestsForHooks,
47
+ args: threadId
48
+ ? { actor: config.actor, threadId, ...(options.dynamicTools.limit !== undefined ? { limit: options.dynamicTools.limit } : {}) }
49
+ : "skip",
50
+ ...(options.dynamicTools.respond !== undefined ? { respond: options.dynamicTools.respond } : {}),
51
+ ...(options.dynamicTools.handlers !== undefined ? { handlers: options.dynamicTools.handlers } : {}),
52
+ ...(options.dynamicTools.autoHandle !== undefined ? { autoHandle: options.dynamicTools.autoHandle } : {}),
53
+ ...(options.dynamicTools.enabled !== undefined ? { enabled: options.dynamicTools.enabled } : {}),
54
+ },
55
+ }
56
+ : {}),
57
+ ...(options.composer !== undefined ? { composer: options.composer } : {}),
58
+ ...(options.interrupt !== undefined ? { interrupt: options.interrupt } : {}),
59
+ }),
60
+ };
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react-integration/index.ts"],"names":[],"mappings":"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"}