@ai0x0/codex-ts 0.1.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 (130) hide show
  1. package/LICENSE +201 -0
  2. package/dist/core/src/codex_thread.d.ts +80 -0
  3. package/dist/core/src/codex_thread.d.ts.map +1 -0
  4. package/dist/core/src/codex_thread.js +167 -0
  5. package/dist/core/src/codex_thread.js.map +1 -0
  6. package/dist/core/src/index.d.ts +5 -0
  7. package/dist/core/src/index.d.ts.map +1 -0
  8. package/dist/core/src/index.js +4 -0
  9. package/dist/core/src/index.js.map +1 -0
  10. package/dist/core/src/session/turn.d.ts +34 -0
  11. package/dist/core/src/session/turn.d.ts.map +1 -0
  12. package/dist/core/src/session/turn.js +178 -0
  13. package/dist/core/src/session/turn.js.map +1 -0
  14. package/dist/core/src/tools/handlers/plan_spec.d.ts +14 -0
  15. package/dist/core/src/tools/handlers/plan_spec.d.ts.map +1 -0
  16. package/dist/core/src/tools/handlers/plan_spec.js +50 -0
  17. package/dist/core/src/tools/handlers/plan_spec.js.map +1 -0
  18. package/dist/core/src/tools/handlers/request_user_input.d.ts +17 -0
  19. package/dist/core/src/tools/handlers/request_user_input.d.ts.map +1 -0
  20. package/dist/core/src/tools/handlers/request_user_input.js +17 -0
  21. package/dist/core/src/tools/handlers/request_user_input.js.map +1 -0
  22. package/dist/core/src/tools/handlers/request_user_input_spec.d.ts +25 -0
  23. package/dist/core/src/tools/handlers/request_user_input_spec.d.ts.map +1 -0
  24. package/dist/core/src/tools/handlers/request_user_input_spec.js +51 -0
  25. package/dist/core/src/tools/handlers/request_user_input_spec.js.map +1 -0
  26. package/dist/core/src/tools/router.d.ts +30 -0
  27. package/dist/core/src/tools/router.d.ts.map +1 -0
  28. package/dist/core/src/tools/router.js +82 -0
  29. package/dist/core/src/tools/router.js.map +1 -0
  30. package/dist/core/tests/common/lib.d.ts +26 -0
  31. package/dist/core/tests/common/lib.d.ts.map +1 -0
  32. package/dist/core/tests/common/lib.js +97 -0
  33. package/dist/core/tests/common/lib.js.map +1 -0
  34. package/dist/core/tests/suite/goal.test.d.ts +6 -0
  35. package/dist/core/tests/suite/goal.test.d.ts.map +1 -0
  36. package/dist/core/tests/suite/goal.test.js +87 -0
  37. package/dist/core/tests/suite/goal.test.js.map +1 -0
  38. package/dist/core/tests/suite/plan.test.d.ts +5 -0
  39. package/dist/core/tests/suite/plan.test.d.ts.map +1 -0
  40. package/dist/core/tests/suite/plan.test.js +89 -0
  41. package/dist/core/tests/suite/plan.test.js.map +1 -0
  42. package/dist/core/tests/suite/request_user_input.test.d.ts +5 -0
  43. package/dist/core/tests/suite/request_user_input.test.d.ts.map +1 -0
  44. package/dist/core/tests/suite/request_user_input.test.js +151 -0
  45. package/dist/core/tests/suite/request_user_input.test.js.map +1 -0
  46. package/dist/core/tests/suite/resume.test.d.ts +8 -0
  47. package/dist/core/tests/suite/resume.test.d.ts.map +1 -0
  48. package/dist/core/tests/suite/resume.test.js +70 -0
  49. package/dist/core/tests/suite/resume.test.js.map +1 -0
  50. package/dist/ext/goal/src/index.d.ts +3 -0
  51. package/dist/ext/goal/src/index.d.ts.map +1 -0
  52. package/dist/ext/goal/src/index.js +3 -0
  53. package/dist/ext/goal/src/index.js.map +1 -0
  54. package/dist/ext/goal/src/spec.d.ts +13 -0
  55. package/dist/ext/goal/src/spec.d.ts.map +1 -0
  56. package/dist/ext/goal/src/spec.js +61 -0
  57. package/dist/ext/goal/src/spec.js.map +1 -0
  58. package/dist/ext/goal/src/tool.d.ts +34 -0
  59. package/dist/ext/goal/src/tool.d.ts.map +1 -0
  60. package/dist/ext/goal/src/tool.js +104 -0
  61. package/dist/ext/goal/src/tool.js.map +1 -0
  62. package/dist/protocol/src/index.d.ts +5 -0
  63. package/dist/protocol/src/index.d.ts.map +1 -0
  64. package/dist/protocol/src/index.js +2 -0
  65. package/dist/protocol/src/index.js.map +1 -0
  66. package/dist/protocol/src/plan_tool.d.ts +16 -0
  67. package/dist/protocol/src/plan_tool.d.ts.map +1 -0
  68. package/dist/protocol/src/plan_tool.js +5 -0
  69. package/dist/protocol/src/plan_tool.js.map +1 -0
  70. package/dist/protocol/src/protocol.d.ts +87 -0
  71. package/dist/protocol/src/protocol.d.ts.map +1 -0
  72. package/dist/protocol/src/protocol.js +8 -0
  73. package/dist/protocol/src/protocol.js.map +1 -0
  74. package/dist/protocol/src/request_user_input.d.ts +31 -0
  75. package/dist/protocol/src/request_user_input.d.ts.map +1 -0
  76. package/dist/protocol/src/request_user_input.js +3 -0
  77. package/dist/protocol/src/request_user_input.js.map +1 -0
  78. package/dist/protocol/src/user_input.d.ts +9 -0
  79. package/dist/protocol/src/user_input.d.ts.map +1 -0
  80. package/dist/protocol/src/user_input.js +3 -0
  81. package/dist/protocol/src/user_input.js.map +1 -0
  82. package/dist/state/src/index.d.ts +3 -0
  83. package/dist/state/src/index.d.ts.map +1 -0
  84. package/dist/state/src/index.js +2 -0
  85. package/dist/state/src/index.js.map +1 -0
  86. package/dist/state/src/runtime/goals.d.ts +48 -0
  87. package/dist/state/src/runtime/goals.d.ts.map +1 -0
  88. package/dist/state/src/runtime/goals.js +93 -0
  89. package/dist/state/src/runtime/goals.js.map +1 -0
  90. package/dist/thread-store/src/in_memory.d.ts +20 -0
  91. package/dist/thread-store/src/in_memory.d.ts.map +1 -0
  92. package/dist/thread-store/src/in_memory.js +70 -0
  93. package/dist/thread-store/src/in_memory.js.map +1 -0
  94. package/dist/thread-store/src/index.d.ts +8 -0
  95. package/dist/thread-store/src/index.d.ts.map +1 -0
  96. package/dist/thread-store/src/index.js +5 -0
  97. package/dist/thread-store/src/index.js.map +1 -0
  98. package/dist/thread-store/src/io_backend.d.ts +30 -0
  99. package/dist/thread-store/src/io_backend.d.ts.map +1 -0
  100. package/dist/thread-store/src/io_backend.js +31 -0
  101. package/dist/thread-store/src/io_backend.js.map +1 -0
  102. package/dist/thread-store/src/live_thread.d.ts +21 -0
  103. package/dist/thread-store/src/live_thread.d.ts.map +1 -0
  104. package/dist/thread-store/src/live_thread.js +42 -0
  105. package/dist/thread-store/src/live_thread.js.map +1 -0
  106. package/dist/thread-store/src/local_thread_store.d.ts +25 -0
  107. package/dist/thread-store/src/local_thread_store.d.ts.map +1 -0
  108. package/dist/thread-store/src/local_thread_store.js +96 -0
  109. package/dist/thread-store/src/local_thread_store.js.map +1 -0
  110. package/dist/thread-store/src/store.d.ts +22 -0
  111. package/dist/thread-store/src/store.d.ts.map +1 -0
  112. package/dist/thread-store/src/store.js +8 -0
  113. package/dist/thread-store/src/store.js.map +1 -0
  114. package/dist/thread-store/src/types.d.ts +72 -0
  115. package/dist/thread-store/src/types.d.ts.map +1 -0
  116. package/dist/thread-store/src/types.js +6 -0
  117. package/dist/thread-store/src/types.js.map +1 -0
  118. package/dist/tools/src/index.d.ts +5 -0
  119. package/dist/tools/src/index.d.ts.map +1 -0
  120. package/dist/tools/src/index.js +3 -0
  121. package/dist/tools/src/index.js.map +1 -0
  122. package/dist/tools/src/json_schema.d.ts +16 -0
  123. package/dist/tools/src/json_schema.d.ts.map +1 -0
  124. package/dist/tools/src/json_schema.js +26 -0
  125. package/dist/tools/src/json_schema.js.map +1 -0
  126. package/dist/tools/src/tool_spec.d.ts +21 -0
  127. package/dist/tools/src/tool_spec.d.ts.map +1 -0
  128. package/dist/tools/src/tool_spec.js +17 -0
  129. package/dist/tools/src/tool_spec.js.map +1 -0
  130. package/package.json +48 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/session/turn.rs
3
+ *
4
+ * runTurn() — the core agent sampling loop:
5
+ * 1. Build Responses API request (history + tool specs)
6
+ * 2. Stream SSE response
7
+ * 3. Collect assistant text and function calls
8
+ * 4. Dispatch tool calls via ToolRouter
9
+ * 5. Emit side-effect events
10
+ * 6. Loop until the model produces no more tool calls
11
+ */
12
+ import { toolSpecToRequestJson } from "../../../tools/src/tool_spec.js";
13
+ // ─── SSE stream parser ────────────────────────────────────────────────────────
14
+ async function* parseSseStream(body) {
15
+ const reader = body.getReader();
16
+ const decoder = new TextDecoder();
17
+ let buffer = "";
18
+ try {
19
+ for (;;) {
20
+ const { done, value } = await reader.read();
21
+ if (done)
22
+ break;
23
+ buffer += decoder.decode(value, { stream: true });
24
+ const lines = buffer.split("\n");
25
+ buffer = lines.pop() ?? "";
26
+ let dataLine = "";
27
+ for (const line of lines) {
28
+ if (line.startsWith("data: ")) {
29
+ dataLine = line.slice(6).trim();
30
+ }
31
+ else if (line === "" && dataLine) {
32
+ if (dataLine !== "[DONE]") {
33
+ try {
34
+ yield JSON.parse(dataLine);
35
+ }
36
+ catch {
37
+ /* malformed JSON — skip */
38
+ }
39
+ }
40
+ dataLine = "";
41
+ }
42
+ }
43
+ }
44
+ }
45
+ finally {
46
+ reader.releaseLock();
47
+ }
48
+ }
49
+ export async function runTurn(turnId, userItems, history, config, router, pendingInputs, emitEvent, liveThread) {
50
+ // Add user message to history (mutates the shared array)
51
+ const userContent = userItems
52
+ .map((item) => item.type === "text"
53
+ ? { type: "input_text", text: item.text }
54
+ : null)
55
+ .filter((x) => x !== null);
56
+ const userMsg = { role: "user", content: userContent };
57
+ history.push(userMsg);
58
+ await liveThread?.appendConversationItems([userMsg]);
59
+ const tools = router.toolSpecs().map(toolSpecToRequestJson);
60
+ let lastAgentMessage = "";
61
+ let itemIdCounter = 0;
62
+ for (;;) {
63
+ // ── Sample from the model ───────────────────────────────────────────────
64
+ const body = {
65
+ model: config.model,
66
+ input: history,
67
+ tools,
68
+ stream: true,
69
+ };
70
+ if (config.instructions)
71
+ body["instructions"] = config.instructions;
72
+ const res = await fetch(`${config.baseUrl}/responses`, {
73
+ method: "POST",
74
+ headers: {
75
+ "Content-Type": "application/json",
76
+ Authorization: `Bearer ${config.apiKey}`,
77
+ },
78
+ body: JSON.stringify(body),
79
+ });
80
+ if (!res.ok || !res.body) {
81
+ const text = res.body ? await res.text() : "(no body)";
82
+ throw new Error(`Responses API ${res.status}: ${text}`);
83
+ }
84
+ // ── Parse SSE stream ────────────────────────────────────────────────────
85
+ const functionCalls = [];
86
+ const partialArgs = new Map();
87
+ let assistantText = "";
88
+ let currentItemId = `item-${++itemIdCounter}`;
89
+ for await (const raw of parseSseStream(res.body)) {
90
+ switch (raw["type"]) {
91
+ case "response.output_item.added": {
92
+ const item = raw["item"];
93
+ if (item?.["type"] === "function_call") {
94
+ const cid = String(item["call_id"]);
95
+ partialArgs.set(cid, { name: String(item["name"]), args: "" });
96
+ }
97
+ else if (item?.["type"] === "message") {
98
+ currentItemId = String(item["id"] ?? currentItemId);
99
+ }
100
+ break;
101
+ }
102
+ case "response.output_text.delta": {
103
+ const delta = String(raw["delta"] ?? "");
104
+ assistantText += delta;
105
+ emitEvent({
106
+ type: "AgentMessageContentDelta",
107
+ event: { turn_id: turnId, item_id: currentItemId, delta },
108
+ });
109
+ break;
110
+ }
111
+ case "response.function_call_arguments.delta": {
112
+ const partial = partialArgs.get(String(raw["call_id"] ?? ""));
113
+ if (partial)
114
+ partial.args += String(raw["delta"] ?? "");
115
+ break;
116
+ }
117
+ case "response.output_item.done": {
118
+ const item = raw["item"];
119
+ if (item?.["type"] === "function_call") {
120
+ functionCalls.push({
121
+ call_id: String(item["call_id"]),
122
+ name: String(item["name"]),
123
+ arguments: String(item["arguments"] ?? "{}"),
124
+ });
125
+ }
126
+ break;
127
+ }
128
+ }
129
+ }
130
+ // ── Persist assistant message ────────────────────────────────────────────
131
+ if (assistantText) {
132
+ lastAgentMessage = assistantText;
133
+ const assistantItem = { role: "assistant", content: assistantText };
134
+ history.push(assistantItem);
135
+ await liveThread?.appendConversationItems([assistantItem]);
136
+ emitEvent({ type: "AgentMessage", event: { message: assistantText } });
137
+ }
138
+ // ── Persist function calls ───────────────────────────────────────────────
139
+ const callItems = functionCalls.map((call) => ({
140
+ type: "function_call",
141
+ call_id: call.call_id,
142
+ name: call.name,
143
+ arguments: call.arguments,
144
+ }));
145
+ for (const item of callItems) {
146
+ history.push(item);
147
+ }
148
+ if (callItems.length > 0)
149
+ await liveThread?.appendConversationItems(callItems);
150
+ // ── Done when no tool calls ─────────────────────────────────────────────
151
+ if (functionCalls.length === 0)
152
+ break;
153
+ // ── Dispatch tool calls ─────────────────────────────────────────────────
154
+ for (const call of functionCalls) {
155
+ let args;
156
+ try {
157
+ args = JSON.parse(call.arguments);
158
+ }
159
+ catch {
160
+ args = {};
161
+ }
162
+ const output = await router.dispatch(call.name, call.call_id, args, {
163
+ turnId,
164
+ pendingInputs,
165
+ emitEvent,
166
+ });
167
+ const outputItem = {
168
+ type: "function_call_output",
169
+ call_id: call.call_id,
170
+ output,
171
+ };
172
+ history.push(outputItem);
173
+ await liveThread?.appendConversationItems([outputItem]);
174
+ }
175
+ }
176
+ return { lastAgentMessage };
177
+ }
178
+ //# sourceMappingURL=turn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn.js","sourceRoot":"","sources":["../../../../core/src/session/turn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/tools/handlers/plan_spec.rs
3
+ */
4
+ import type { ToolSpec } from "../../../../tools/src/tool_spec.js";
5
+ export declare const UPDATE_PLAN_TOOL_NAME = "update_plan";
6
+ export declare function createUpdatePlanTool(): ToolSpec;
7
+ export declare function parseUpdatePlanArgs(rawArgs: unknown): {
8
+ ok: true;
9
+ args: import("../../../../protocol/src/plan_tool.js").UpdatePlanArgs;
10
+ } | {
11
+ ok: false;
12
+ error: string;
13
+ };
14
+ //# sourceMappingURL=plan_spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan_spec.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/handlers/plan_spec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAGnE,eAAO,MAAM,qBAAqB,gBAAgB,CAAC;AAEnD,wBAAgB,oBAAoB,IAAI,QAAQ,CA+B/C;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG;IACrD,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,OAAO,uCAAuC,EAAE,cAAc,CAAC;CACtE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA4B/B"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/tools/handlers/plan_spec.rs
3
+ */
4
+ import * as S from "../../../../tools/src/json_schema.js";
5
+ export const UPDATE_PLAN_TOOL_NAME = "update_plan";
6
+ export function createUpdatePlanTool() {
7
+ const planItemSchema = S.object({
8
+ step: S.string("Task step text."),
9
+ status: S.stringEnum(["pending", "in_progress", "completed"], "Step status."),
10
+ }, ["step", "status"], false);
11
+ return {
12
+ type: "function",
13
+ tool: {
14
+ name: UPDATE_PLAN_TOOL_NAME,
15
+ description: `Updates the task plan.
16
+ Provide an optional explanation and a list of plan items, each with a step and status.
17
+ At most one step can be in_progress at a time.`,
18
+ parameters: S.object({
19
+ explanation: S.string("Optional explanation for this plan update."),
20
+ plan: S.array(planItemSchema, "The list of steps"),
21
+ }, ["plan"], false),
22
+ strict: false,
23
+ },
24
+ };
25
+ }
26
+ export function parseUpdatePlanArgs(rawArgs) {
27
+ if (typeof rawArgs !== "object" || rawArgs === null) {
28
+ return { ok: false, error: "failed to parse function arguments: expected object" };
29
+ }
30
+ const obj = rawArgs;
31
+ if (!Array.isArray(obj["plan"])) {
32
+ return { ok: false, error: "failed to parse function arguments: plan must be an array" };
33
+ }
34
+ const plan = obj["plan"].map((item, i) => {
35
+ if (typeof item !== "object" || item === null) {
36
+ throw new Error(`plan[${i}] must be an object`);
37
+ }
38
+ const it = item;
39
+ if (typeof it["step"] !== "string")
40
+ throw new Error(`plan[${i}].step must be a string`);
41
+ const status = it["status"];
42
+ if (status !== "pending" && status !== "in_progress" && status !== "completed") {
43
+ throw new Error(`plan[${i}].status must be pending, in_progress, or completed`);
44
+ }
45
+ return { step: it["step"], status: status };
46
+ });
47
+ const explanation = typeof obj["explanation"] === "string" ? obj["explanation"] : undefined;
48
+ return { ok: true, args: { plan, ...(explanation !== undefined ? { explanation } : {}) } };
49
+ }
50
+ //# sourceMappingURL=plan_spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan_spec.js","sourceRoot":"","sources":["../../../../../core/src/tools/handlers/plan_spec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,CAAC,MAAM,sCAAsC,CAAC;AAE1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAEnD,MAAM,UAAU,oBAAoB;IAClC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAC7B;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,UAAU,CAClB,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,EACvC,cAAc,CACf;KACF,EACD,CAAC,MAAM,EAAE,QAAQ,CAAC,EAClB,KAAK,CACN,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE;YACJ,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE;;+CAE4B;YACzC,UAAU,EAAE,CAAC,CAAC,MAAM,CAClB;gBACE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,4CAA4C,CAAC;gBACnE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,mBAAmB,CAAC;aACnD,EACD,CAAC,MAAM,CAAC,EACR,KAAK,CACN;YACD,MAAM,EAAE,KAAK;SACd;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAIlD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qDAAqD,EAAE,CAAC;IACrF,CAAC;IAED,MAAM,GAAG,GAAG,OAAkC,CAAC;IAE/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2DAA2D,EAAE,CAAC;IAC3F,CAAC;IAED,MAAM,IAAI,GAAI,GAAG,CAAC,MAAM,CAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACtD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,EAAE,GAAG,IAA+B,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAW,EAAE,MAAM,EAAE,MAAoE,EAAE,CAAC;IACtH,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GACf,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/tools/handlers/request_user_input.rs
3
+ *
4
+ * Suspends the current turn until the client submits a UserInputAnswer op.
5
+ * The resolver is stored in a map keyed by turn_id and resolved when
6
+ * CodexThread.submit({ type: "UserInputAnswer", id: turn_id, response })
7
+ * is called.
8
+ */
9
+ import type { RequestUserInputQuestion, RequestUserInputResponse } from "../../../../protocol/src/request_user_input.js";
10
+ export type PendingInputs = Map<string, (response: RequestUserInputResponse) => void>;
11
+ export interface RequestUserInputContext {
12
+ turnId: string;
13
+ pendingInputs: PendingInputs;
14
+ }
15
+ export declare function handleRequestUserInput(ctx: RequestUserInputContext, _questions: RequestUserInputQuestion[]): Promise<RequestUserInputResponse>;
16
+ export declare function formatRequestUserInputOutput(response: RequestUserInputResponse): string;
17
+ //# sourceMappingURL=request_user_input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request_user_input.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/handlers/request_user_input.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACzB,MAAM,gDAAgD,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,GAAG,CAC7B,MAAM,EACN,CAAC,QAAQ,EAAE,wBAAwB,KAAK,IAAI,CAC7C,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,uBAAuB,EAC5B,UAAU,EAAE,wBAAwB,EAAE,GACrC,OAAO,CAAC,wBAAwB,CAAC,CAInC;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,wBAAwB,GACjC,MAAM,CAER"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/tools/handlers/request_user_input.rs
3
+ *
4
+ * Suspends the current turn until the client submits a UserInputAnswer op.
5
+ * The resolver is stored in a map keyed by turn_id and resolved when
6
+ * CodexThread.submit({ type: "UserInputAnswer", id: turn_id, response })
7
+ * is called.
8
+ */
9
+ export async function handleRequestUserInput(ctx, _questions) {
10
+ return new Promise((resolve) => {
11
+ ctx.pendingInputs.set(ctx.turnId, resolve);
12
+ });
13
+ }
14
+ export function formatRequestUserInputOutput(response) {
15
+ return JSON.stringify(response);
16
+ }
17
+ //# sourceMappingURL=request_user_input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request_user_input.js","sourceRoot":"","sources":["../../../../../core/src/tools/handlers/request_user_input.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAA4B,EAC5B,UAAsC;IAEtC,OAAO,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,EAAE;QACvD,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,QAAkC;IAElC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/tools/handlers/request_user_input_spec.rs
3
+ */
4
+ import type { ToolSpec } from "../../../../tools/src/tool_spec.js";
5
+ export declare const REQUEST_USER_INPUT_TOOL_NAME = "request_user_input";
6
+ export declare function createRequestUserInputTool(): ToolSpec;
7
+ /** Normalise args from the model: ensure options exist and set isOther = true */
8
+ export declare function normalizeRequestUserInputArgs(args: {
9
+ questions: {
10
+ id: string;
11
+ header: string;
12
+ question: string;
13
+ options?: {
14
+ label: string;
15
+ description: string;
16
+ }[];
17
+ isOther?: boolean;
18
+ isSecret?: boolean;
19
+ }[];
20
+ }): {
21
+ questions: import("../../../../protocol/src/request_user_input.js").RequestUserInputQuestion[];
22
+ } | {
23
+ error: string;
24
+ };
25
+ //# sourceMappingURL=request_user_input_spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request_user_input_spec.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/handlers/request_user_input_spec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAGnE,eAAO,MAAM,4BAA4B,uBAAuB,CAAC;AAEjE,wBAAgB,0BAA0B,IAAI,QAAQ,CAgDrD;AAED,iFAAiF;AACjF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,SAAS,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACnD,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,EAAE,CAAC;CACL,GAAG;IAAE,SAAS,EAAE,OAAO,gDAAgD,EAAE,wBAAwB,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAkBzH"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/tools/handlers/request_user_input_spec.rs
3
+ */
4
+ import * as S from "../../../../tools/src/json_schema.js";
5
+ export const REQUEST_USER_INPUT_TOOL_NAME = "request_user_input";
6
+ export function createRequestUserInputTool() {
7
+ const optionSchema = S.object({
8
+ label: S.string("User-facing label (1-5 words)."),
9
+ description: S.string("One short sentence explaining impact/tradeoff if selected."),
10
+ }, ["label", "description"], false);
11
+ const optionsSchema = S.array(optionSchema, 'Provide 2-3 mutually exclusive choices. Put the recommended option first and suffix its label with "(Recommended)". ' +
12
+ 'Do not include an "Other" option; the client adds one automatically.');
13
+ const questionSchema = S.object({
14
+ id: S.string("Stable identifier for mapping answers (snake_case)."),
15
+ header: S.string("Short header label shown in the UI (12 or fewer chars)."),
16
+ question: S.string("Single-sentence prompt shown to the user."),
17
+ options: optionsSchema,
18
+ }, ["id", "header", "question", "options"], false);
19
+ return {
20
+ type: "function",
21
+ tool: {
22
+ name: REQUEST_USER_INPUT_TOOL_NAME,
23
+ description: "Request user input for one to three short questions and wait for the response.",
24
+ parameters: S.object({
25
+ questions: S.array(questionSchema, "Questions to show the user. Prefer 1 and do not exceed 3."),
26
+ }, ["questions"], false),
27
+ strict: false,
28
+ },
29
+ };
30
+ }
31
+ /** Normalise args from the model: ensure options exist and set isOther = true */
32
+ export function normalizeRequestUserInputArgs(args) {
33
+ for (const q of args.questions) {
34
+ if (!q.options || q.options.length === 0) {
35
+ return {
36
+ error: "request_user_input requires non-empty options for every question",
37
+ };
38
+ }
39
+ }
40
+ return {
41
+ questions: args.questions.map((q) => ({
42
+ id: q.id,
43
+ header: q.header,
44
+ question: q.question,
45
+ options: q.options,
46
+ isOther: true,
47
+ isSecret: q.isSecret ?? false,
48
+ })),
49
+ };
50
+ }
51
+ //# sourceMappingURL=request_user_input_spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request_user_input_spec.js","sourceRoot":"","sources":["../../../../../core/src/tools/handlers/request_user_input_spec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,CAAC,MAAM,sCAAsC,CAAC;AAE1D,MAAM,CAAC,MAAM,4BAA4B,GAAG,oBAAoB,CAAC;AAEjE,MAAM,UAAU,0BAA0B;IACxC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAC3B;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,gCAAgC,CAAC;QACjD,WAAW,EAAE,CAAC,CAAC,MAAM,CACnB,4DAA4D,CAC7D;KACF,EACD,CAAC,OAAO,EAAE,aAAa,CAAC,EACxB,KAAK,CACN,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAC3B,YAAY,EACZ,sHAAsH;QACpH,sEAAsE,CACzE,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAC7B;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,qDAAqD,CAAC;QACnE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,yDAAyD,CAAC;QAC3E,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,2CAA2C,CAAC;QAC/D,OAAO,EAAE,aAAa;KACvB,EACD,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,EACvC,KAAK,CACN,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE;YACJ,IAAI,EAAE,4BAA4B;YAClC,WAAW,EACT,gFAAgF;YAClF,UAAU,EAAE,CAAC,CAAC,MAAM,CAClB;gBACE,SAAS,EAAE,CAAC,CAAC,KAAK,CAChB,cAAc,EACd,2DAA2D,CAC5D;aACF,EACD,CAAC,WAAW,CAAC,EACb,KAAK,CACN;YACD,MAAM,EAAE,KAAK;SACd;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,6BAA6B,CAAC,IAS7C;IACC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO;gBACL,KAAK,EAAE,kEAAkE;aAC1E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,KAAK;SAC9B,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/tools/router.rs
3
+ *
4
+ * Routes tool calls by name to the appropriate handler.
5
+ * Returns the tool output string + any side-effect EventMsgs to emit.
6
+ */
7
+ import type { EventMsg } from "../../../protocol/src/protocol.js";
8
+ import type { ToolSpec } from "../../../tools/src/tool_spec.js";
9
+ import { GoalToolExecutor } from "../../../ext/goal/src/tool.js";
10
+ import type { PendingInputs } from "./handlers/request_user_input.js";
11
+ export interface ToolRouterContext {
12
+ turnId: string;
13
+ pendingInputs: PendingInputs;
14
+ /** Emit an event immediately — used for events that must fire before suspension */
15
+ emitEvent: (msg: EventMsg) => void;
16
+ }
17
+ /** mirrors ToolRouter in router.rs */
18
+ export declare class ToolRouter {
19
+ private readonly goalExecutor;
20
+ constructor(goalExecutor: GoalToolExecutor);
21
+ /** All tool specs to include in Responses API requests */
22
+ toolSpecs(): ToolSpec[];
23
+ /**
24
+ * Dispatch a tool call; may suspend (request_user_input).
25
+ * Side-effect events are emitted immediately via ctx.emitEvent rather than
26
+ * returned, so RequestUserInput fires before the turn suspends.
27
+ */
28
+ dispatch(toolName: string, callId: string, rawArgs: unknown, ctx: ToolRouterContext): Promise<string>;
29
+ }
30
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../core/src/tools/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAkBjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAOtE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,mFAAmF;IACnF,SAAS,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC;AAED,sCAAsC;AACtC,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;gBAEpC,YAAY,EAAE,gBAAgB;IAI1C,0DAA0D;IAC1D,SAAS,IAAI,QAAQ,EAAE;IAUvB;;;;OAIG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,MAAM,CAAC;CA+DnB"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * mirrors codex-rs/core/src/tools/router.rs
3
+ *
4
+ * Routes tool calls by name to the appropriate handler.
5
+ * Returns the tool output string + any side-effect EventMsgs to emit.
6
+ */
7
+ import { CREATE_GOAL_TOOL_NAME, GET_GOAL_TOOL_NAME, UPDATE_GOAL_TOOL_NAME, createCreateGoalTool, createGetGoalTool, createUpdateGoalTool, } from "../../../ext/goal/src/spec.js";
8
+ import { REQUEST_USER_INPUT_TOOL_NAME, normalizeRequestUserInputArgs, createRequestUserInputTool, } from "./handlers/request_user_input_spec.js";
9
+ import { handleRequestUserInput, formatRequestUserInputOutput, } from "./handlers/request_user_input.js";
10
+ import { UPDATE_PLAN_TOOL_NAME, createUpdatePlanTool, parseUpdatePlanArgs, } from "./handlers/plan_spec.js";
11
+ /** mirrors ToolRouter in router.rs */
12
+ export class ToolRouter {
13
+ goalExecutor;
14
+ constructor(goalExecutor) {
15
+ this.goalExecutor = goalExecutor;
16
+ }
17
+ /** All tool specs to include in Responses API requests */
18
+ toolSpecs() {
19
+ return [
20
+ createGetGoalTool(),
21
+ createCreateGoalTool(),
22
+ createUpdateGoalTool(),
23
+ createRequestUserInputTool(),
24
+ createUpdatePlanTool(),
25
+ ];
26
+ }
27
+ /**
28
+ * Dispatch a tool call; may suspend (request_user_input).
29
+ * Side-effect events are emitted immediately via ctx.emitEvent rather than
30
+ * returned, so RequestUserInput fires before the turn suspends.
31
+ */
32
+ async dispatch(toolName, callId, rawArgs, ctx) {
33
+ const args = (typeof rawArgs === "object" && rawArgs !== null
34
+ ? rawArgs
35
+ : {});
36
+ switch (toolName) {
37
+ case GET_GOAL_TOOL_NAME: {
38
+ const { output } = await this.goalExecutor.get();
39
+ return output;
40
+ }
41
+ case CREATE_GOAL_TOOL_NAME: {
42
+ const { output, event } = await this.goalExecutor.create(args["objective"], args["token_budget"]);
43
+ if (event)
44
+ ctx.emitEvent({ type: "ThreadGoalUpdated", event });
45
+ return output;
46
+ }
47
+ case UPDATE_GOAL_TOOL_NAME: {
48
+ const { output, event } = await this.goalExecutor.update(args["status"]);
49
+ if (event)
50
+ ctx.emitEvent({ type: "ThreadGoalUpdated", event });
51
+ return output;
52
+ }
53
+ case REQUEST_USER_INPUT_TOOL_NAME: {
54
+ const normalized = normalizeRequestUserInputArgs(args);
55
+ if ("error" in normalized) {
56
+ return JSON.stringify({ error: normalized.error });
57
+ }
58
+ // Emit BEFORE suspending so the client can see the event and answer
59
+ ctx.emitEvent({
60
+ type: "RequestUserInput",
61
+ event: { call_id: callId, turn_id: ctx.turnId, questions: normalized.questions },
62
+ });
63
+ const response = await handleRequestUserInput({ turnId: ctx.turnId, pendingInputs: ctx.pendingInputs }, normalized.questions);
64
+ return formatRequestUserInputOutput(response);
65
+ }
66
+ case UPDATE_PLAN_TOOL_NAME: {
67
+ const parsed = parseUpdatePlanArgs(args);
68
+ if (!parsed.ok) {
69
+ return JSON.stringify({
70
+ error: parsed.error,
71
+ success: false,
72
+ });
73
+ }
74
+ ctx.emitEvent({ type: "PlanUpdate", event: parsed.args });
75
+ return "Plan updated";
76
+ }
77
+ default:
78
+ return JSON.stringify({ error: `Unknown tool: ${toolName}` });
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../core/src/tools/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * mirrors codex-rs/core/tests/common/lib.rs
3
+ *
4
+ * Shared test helpers: waitForEvent, mock SSE server helpers.
5
+ */
6
+ import type { EventMsg } from "../../../protocol/src/protocol.js";
7
+ import type { CodexThread } from "../../src/codex_thread.js";
8
+ /**
9
+ * Mirrors wait_for_event() in core_test_support.
10
+ * Polls nextEvent() until predicate returns true, then returns that EventMsg.
11
+ */
12
+ export declare function waitForEvent(codex: CodexThread, predicate: (msg: EventMsg) => boolean, timeoutMs?: number): Promise<EventMsg>;
13
+ /**
14
+ * Mirrors wait_for_event_match() — extracts a typed value from the matching event.
15
+ */
16
+ export declare function waitForEventMatch<T>(codex: CodexThread, matcher: (msg: EventMsg) => T | null, timeoutMs?: number): Promise<T>;
17
+ /** Build a raw SSE data payload string from an array of event objects */
18
+ export declare function sse(events: object[]): string;
19
+ export declare function evResponseCreated(id: string): object;
20
+ export declare function evFunctionCall(callId: string, name: string, args: object): object;
21
+ export declare function evAssistantMessage(text: string): object;
22
+ export declare function evCompleted(id: string): object;
23
+ /** Flatten nested arrays of SSE events into a single SSE string */
24
+ export declare function sseFlat(events: (object | object[])[]): string;
25
+ export declare function makeSseResponse(sseText: string): Response;
26
+ //# sourceMappingURL=lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../../../core/tests/common/lib.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D;;;GAGG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,EACrC,SAAS,SAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,CAAC,GAAG,IAAI,EACpC,SAAS,SAAO,GACf,OAAO,CAAC,CAAC,CAAC,CAGZ;AAID,yEAAyE;AACzE,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAE5C;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAiBR;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,MAAM,CAE7D;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAYzD"}