@bolt-foundry/gambit-core 0.8.5-rc.6 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/cards/context.card.md +4 -4
- package/decks/anthropic/agent-sdk/PROMPT.md +9 -0
- package/decks/openai/codex-sdk/PROMPT.md +9 -0
- package/decks/openai/codex-sdk/codex_client.ts +109 -0
- package/decks/openai/codex-sdk/codex_sdk_bridge.deck.ts +36 -0
- package/esm/cards/context.card.md +9 -0
- package/esm/cards/end.card.md +10 -0
- package/esm/cards/generate-test-input.card.md +12 -0
- package/esm/cards/respond.card.md +10 -0
- package/esm/decks/anthropic/agent-sdk/PROMPT.md +9 -0
- package/esm/decks/openai/codex-sdk/PROMPT.md +9 -0
- package/esm/decks/openai/codex-sdk/codex_client.ts +109 -0
- package/esm/decks/openai/codex-sdk/codex_sdk_bridge.deck.ts +36 -0
- package/esm/mod.d.ts +1 -1
- package/esm/mod.d.ts.map +1 -1
- package/esm/schemas/graders/contexts/conversation.ts +40 -0
- package/esm/schemas/graders/contexts/conversation.zod.ts +1 -0
- package/esm/schemas/graders/contexts/conversation_tools.ts +63 -0
- package/esm/schemas/graders/contexts/conversation_tools.zod.ts +1 -0
- package/esm/schemas/graders/contexts/tools.ts +5 -0
- package/esm/schemas/graders/contexts/tools.zod.ts +1 -0
- package/esm/schemas/graders/contexts/turn.ts +17 -0
- package/esm/schemas/graders/contexts/turn.zod.ts +1 -0
- package/esm/schemas/graders/contexts/turn_tools.ts +63 -0
- package/esm/schemas/graders/contexts/turn_tools.zod.ts +1 -0
- package/esm/schemas/graders/grader_output.ts +15 -0
- package/esm/schemas/graders/grader_output.zod.ts +1 -0
- package/esm/schemas/graders/respond.ts +19 -0
- package/esm/schemas/graders/respond.zod.ts +1 -0
- package/esm/schemas/scenarios/plain_chat_input_optional.ts +6 -0
- package/esm/schemas/scenarios/plain_chat_input_optional.zod.ts +1 -0
- package/esm/schemas/scenarios/plain_chat_output.ts +5 -0
- package/esm/schemas/scenarios/plain_chat_output.zod.ts +1 -0
- package/esm/snippets/context.md +8 -0
- package/esm/snippets/end.md +10 -0
- package/esm/snippets/generate-test-input.md +12 -0
- package/esm/snippets/init.md +12 -0
- package/esm/snippets/respond.md +10 -0
- package/esm/snippets/scenario-participant.md +10 -0
- package/esm/src/constants.d.ts +0 -1
- package/esm/src/constants.d.ts.map +1 -1
- package/esm/src/constants.js +0 -4
- package/esm/src/loader.d.ts.map +1 -1
- package/esm/src/loader.js +101 -0
- package/esm/src/markdown.d.ts.map +1 -1
- package/esm/src/markdown.js +109 -9
- package/esm/src/runtime.d.ts +16 -1
- package/esm/src/runtime.d.ts.map +1 -1
- package/esm/src/runtime.js +1607 -311
- package/esm/src/types.d.ts +25 -1
- package/esm/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/script/cards/context.card.md +9 -0
- package/script/cards/end.card.md +10 -0
- package/script/cards/generate-test-input.card.md +12 -0
- package/script/cards/respond.card.md +10 -0
- package/script/decks/anthropic/agent-sdk/PROMPT.md +9 -0
- package/script/decks/openai/codex-sdk/PROMPT.md +9 -0
- package/script/decks/openai/codex-sdk/codex_client.ts +109 -0
- package/script/decks/openai/codex-sdk/codex_sdk_bridge.deck.ts +36 -0
- package/script/mod.d.ts +1 -1
- package/script/mod.d.ts.map +1 -1
- package/script/schemas/graders/contexts/conversation.ts +40 -0
- package/script/schemas/graders/contexts/conversation.zod.ts +1 -0
- package/script/schemas/graders/contexts/conversation_tools.ts +63 -0
- package/script/schemas/graders/contexts/conversation_tools.zod.ts +1 -0
- package/script/schemas/graders/contexts/tools.ts +5 -0
- package/script/schemas/graders/contexts/tools.zod.ts +1 -0
- package/script/schemas/graders/contexts/turn.ts +17 -0
- package/script/schemas/graders/contexts/turn.zod.ts +1 -0
- package/script/schemas/graders/contexts/turn_tools.ts +63 -0
- package/script/schemas/graders/contexts/turn_tools.zod.ts +1 -0
- package/script/schemas/graders/grader_output.ts +15 -0
- package/script/schemas/graders/grader_output.zod.ts +1 -0
- package/script/schemas/graders/respond.ts +19 -0
- package/script/schemas/graders/respond.zod.ts +1 -0
- package/script/schemas/scenarios/plain_chat_input_optional.ts +6 -0
- package/script/schemas/scenarios/plain_chat_input_optional.zod.ts +1 -0
- package/script/schemas/scenarios/plain_chat_output.ts +5 -0
- package/script/schemas/scenarios/plain_chat_output.zod.ts +1 -0
- package/script/snippets/context.md +8 -0
- package/script/snippets/end.md +10 -0
- package/script/snippets/generate-test-input.md +12 -0
- package/script/snippets/init.md +12 -0
- package/script/snippets/respond.md +10 -0
- package/script/snippets/scenario-participant.md +10 -0
- package/script/src/constants.d.ts +0 -1
- package/script/src/constants.d.ts.map +1 -1
- package/script/src/constants.js +1 -5
- package/script/src/loader.d.ts.map +1 -1
- package/script/src/loader.js +101 -0
- package/script/src/markdown.d.ts.map +1 -1
- package/script/src/markdown.js +109 -9
- package/script/src/runtime.d.ts +16 -1
- package/script/src/runtime.d.ts.map +1 -1
- package/script/src/runtime.js +1606 -310
- package/script/src/types.d.ts +25 -1
- package/script/src/types.d.ts.map +1 -1
- package/snippets/context.md +8 -0
- package/snippets/end.md +10 -0
- package/snippets/generate-test-input.md +12 -0
- package/snippets/init.md +12 -0
- package/snippets/respond.md +10 -0
- package/snippets/scenario-participant.md +10 -0
package/README.md
CHANGED
|
@@ -211,8 +211,9 @@ clarifying questions before choosing an action.
|
|
|
211
211
|
`loadDeck` normalizes relative paths, merges card fragments, enforces unique
|
|
212
212
|
action names, and warns about deprecated fields (`actions`,
|
|
213
213
|
`handlers.onInterval`, `intervalMs`). The Markdown loader also injects helper
|
|
214
|
-
text for built-in tools like `gambit_context
|
|
215
|
-
`gambit_end`
|
|
214
|
+
text for built-in tools like `gambit_context` when you add `gambit://` markers.
|
|
215
|
+
Legacy `gambit_respond` and `gambit_end` markers are migration-only and now
|
|
216
|
+
hard-fail in default runtime paths.
|
|
216
217
|
|
|
217
218
|
## Compatibility and utilities
|
|
218
219
|
|
|
@@ -224,9 +225,9 @@ text for built-in tools like `gambit_context`, `gambit_respond`, and
|
|
|
224
225
|
conforming to the `responses()` signature in `ModelProvider`.
|
|
225
226
|
- **Constants**:
|
|
226
227
|
[`GAMBIT_TOOL_CONTEXT`, `GAMBIT_TOOL_RESPOND`, `GAMBIT_TOOL_END`](src/constants.ts)
|
|
227
|
-
(`GAMBIT_TOOL_INIT` remains as a deprecated alias).
|
|
228
|
-
|
|
229
|
-
|
|
228
|
+
(`GAMBIT_TOOL_INIT` remains as a deprecated alias). `GAMBIT_TOOL_RESPOND` and
|
|
229
|
+
`GAMBIT_TOOL_END` remain for migration detection and legacy trace handling;
|
|
230
|
+
default runtime paths no longer expose them as callable synthetic tools.
|
|
230
231
|
|
|
231
232
|
## Persisted state and traces
|
|
232
233
|
|
package/cards/context.card.md
CHANGED
|
@@ -3,7 +3,7 @@ label = "Gambit context primer"
|
|
|
3
3
|
+++
|
|
4
4
|
|
|
5
5
|
You will automatically receive a `gambit_context` tool result at the start of
|
|
6
|
-
the run whenever the caller supplies `--context
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
the run whenever the caller supplies `--context`. This payload contains run
|
|
7
|
+
metadata or seeded inputs. Read it before you respond, treat it as trusted
|
|
8
|
+
context, and keep it on hand throughout the workflow so downstream actions have
|
|
9
|
+
the right data. Do not call `gambit_context` yourself; runtime injects it once.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
+++
|
|
2
|
+
label = "Anthropic agent SDK bridge"
|
|
3
|
+
contextSchema = "gambit://schemas/scenarios/plain_chat_input_optional.zod.ts"
|
|
4
|
+
responseSchema = "gambit://schemas/scenarios/plain_chat_output.zod.ts"
|
|
5
|
+
+++
|
|
6
|
+
|
|
7
|
+
This stdlib deck provides the default bridge between the Anthropic agent SDK
|
|
8
|
+
runtime and Gambit decks. It is intentionally minimal; downstream runners supply
|
|
9
|
+
the actual runtime behavior.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
+++
|
|
2
|
+
label = "Codex SDK bridge"
|
|
3
|
+
contextSchema = "gambit://schemas/scenarios/plain_chat_input_optional.zod.ts"
|
|
4
|
+
responseSchema = "gambit://schemas/scenarios/plain_chat_output.zod.ts"
|
|
5
|
+
+++
|
|
6
|
+
|
|
7
|
+
This stdlib deck provides the default bridge between the Codex SDK runtime and
|
|
8
|
+
Gambit decks. It is intentionally minimal; downstream runners supply the actual
|
|
9
|
+
runtime behavior.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export type CodexTurnInput = {
|
|
2
|
+
userText: string;
|
|
3
|
+
threadId?: string;
|
|
4
|
+
systemPrompt?: string;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export type CodexTurnOutput = {
|
|
8
|
+
threadId: string;
|
|
9
|
+
assistantText: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
type CodexEvent =
|
|
13
|
+
| { type: "thread.started"; thread_id?: unknown }
|
|
14
|
+
| {
|
|
15
|
+
type: "item.completed";
|
|
16
|
+
item?: { type?: unknown; text?: unknown };
|
|
17
|
+
}
|
|
18
|
+
| { type: string; [key: string]: unknown };
|
|
19
|
+
|
|
20
|
+
function runCwd(): string {
|
|
21
|
+
const botRoot = Deno.env.get("GAMBIT_BOT_ROOT");
|
|
22
|
+
if (typeof botRoot === "string" && botRoot.trim().length > 0) {
|
|
23
|
+
return botRoot.trim();
|
|
24
|
+
}
|
|
25
|
+
return Deno.cwd();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function parseCodexEvents(stdout: string): {
|
|
29
|
+
threadId?: string;
|
|
30
|
+
assistantText?: string;
|
|
31
|
+
} {
|
|
32
|
+
let threadId: string | undefined;
|
|
33
|
+
let assistantText: string | undefined;
|
|
34
|
+
|
|
35
|
+
for (const line of stdout.split(/\r?\n/)) {
|
|
36
|
+
const trimmed = line.trim();
|
|
37
|
+
if (!trimmed.startsWith("{")) continue;
|
|
38
|
+
let parsed: CodexEvent | null = null;
|
|
39
|
+
try {
|
|
40
|
+
parsed = JSON.parse(trimmed) as CodexEvent;
|
|
41
|
+
} catch {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!parsed || typeof parsed !== "object") continue;
|
|
45
|
+
if (parsed.type === "thread.started") {
|
|
46
|
+
if (typeof parsed.thread_id === "string" && parsed.thread_id.trim()) {
|
|
47
|
+
threadId = parsed.thread_id.trim();
|
|
48
|
+
}
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (parsed.type === "item.completed") {
|
|
52
|
+
const item = parsed.item;
|
|
53
|
+
if (!item || typeof item !== "object") continue;
|
|
54
|
+
const rec = item as Record<string, unknown>;
|
|
55
|
+
if (rec.type !== "agent_message") continue;
|
|
56
|
+
if (typeof rec.text !== "string") continue;
|
|
57
|
+
const next = rec.text.trim();
|
|
58
|
+
if (next) assistantText = next;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return { threadId, assistantText };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function sendCodexTurn(
|
|
66
|
+
input: CodexTurnInput,
|
|
67
|
+
): Promise<CodexTurnOutput> {
|
|
68
|
+
const prompt = input.systemPrompt && input.systemPrompt.trim()
|
|
69
|
+
? `${input.systemPrompt.trim()}\n\n${input.userText}`
|
|
70
|
+
: input.userText;
|
|
71
|
+
|
|
72
|
+
const args = input.threadId
|
|
73
|
+
? [
|
|
74
|
+
"exec",
|
|
75
|
+
"resume",
|
|
76
|
+
"--skip-git-repo-check",
|
|
77
|
+
"--json",
|
|
78
|
+
input.threadId,
|
|
79
|
+
prompt,
|
|
80
|
+
]
|
|
81
|
+
: ["exec", "--skip-git-repo-check", "--json", prompt];
|
|
82
|
+
|
|
83
|
+
const out = await new Deno.Command("codex", {
|
|
84
|
+
args,
|
|
85
|
+
cwd: runCwd(),
|
|
86
|
+
stdout: "piped",
|
|
87
|
+
stderr: "piped",
|
|
88
|
+
}).output();
|
|
89
|
+
|
|
90
|
+
const stdout = new TextDecoder().decode(out.stdout);
|
|
91
|
+
const stderr = new TextDecoder().decode(out.stderr);
|
|
92
|
+
if (!out.success) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
`codex exec failed (exit ${out.code}): ${stderr.trim() || stdout.trim()}`,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const parsed = parseCodexEvents(stdout);
|
|
99
|
+
const threadId = parsed.threadId ?? input.threadId;
|
|
100
|
+
if (!threadId) {
|
|
101
|
+
throw new Error(
|
|
102
|
+
`codex exec succeeded but no thread id found in output: ${stdout.trim()}`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
threadId,
|
|
107
|
+
assistantText: parsed.assistantText ?? "",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { defineDeck } from "../../../src/definitions.ts";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { sendCodexTurn } from "./codex_client.ts";
|
|
4
|
+
|
|
5
|
+
const CODEX_THREAD_META_KEY = "codex.threadId";
|
|
6
|
+
|
|
7
|
+
export default defineDeck({
|
|
8
|
+
label: "codex_sdk_bridge",
|
|
9
|
+
contextSchema: z.string().optional(),
|
|
10
|
+
responseSchema: z.string(),
|
|
11
|
+
async run(ctx) {
|
|
12
|
+
const userText = typeof ctx.initialUserMessage === "string" &&
|
|
13
|
+
ctx.initialUserMessage.trim()
|
|
14
|
+
? ctx.initialUserMessage.trim()
|
|
15
|
+
: typeof ctx.input === "string" && ctx.input.trim()
|
|
16
|
+
? ctx.input.trim()
|
|
17
|
+
: "";
|
|
18
|
+
|
|
19
|
+
if (!userText) return "";
|
|
20
|
+
|
|
21
|
+
const priorThreadId = ctx.getSessionMeta<string>(CODEX_THREAD_META_KEY);
|
|
22
|
+
const systemPrompt = ctx.getSessionMeta<string>("codex.systemPrompt");
|
|
23
|
+
|
|
24
|
+
ctx.appendMessage({ role: "user", content: userText });
|
|
25
|
+
|
|
26
|
+
const result = await sendCodexTurn({
|
|
27
|
+
userText,
|
|
28
|
+
threadId: priorThreadId,
|
|
29
|
+
systemPrompt,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
ctx.setSessionMeta(CODEX_THREAD_META_KEY, result.threadId);
|
|
33
|
+
ctx.appendMessage({ role: "assistant", content: result.assistantText });
|
|
34
|
+
return result.assistantText;
|
|
35
|
+
},
|
|
36
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
+++
|
|
2
|
+
label = "Gambit context primer"
|
|
3
|
+
+++
|
|
4
|
+
|
|
5
|
+
You will automatically receive a `gambit_context` tool result at the start of
|
|
6
|
+
the run whenever the caller supplies `--context`. This payload contains run
|
|
7
|
+
metadata or seeded inputs. Read it before you respond, treat it as trusted
|
|
8
|
+
context, and keep it on hand throughout the workflow so downstream actions have
|
|
9
|
+
the right data. Do not call `gambit_context` yourself; runtime injects it once.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
+++
|
|
2
|
+
label = "Explicitly end the run"
|
|
3
|
+
allowEnd = true
|
|
4
|
+
+++
|
|
5
|
+
|
|
6
|
+
If the entire conversation/workflow is complete and you must stop all further
|
|
7
|
+
turns, call the `gambit_end` tool with an optional `message`, `payload`,
|
|
8
|
+
`status`, `code`, or `meta`. Only use this when you want Gambit to halt entirely
|
|
9
|
+
(no more user messages). Otherwise continue with normal responses or
|
|
10
|
+
`gambit_respond`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
+++
|
|
2
|
+
label = "Generate test input"
|
|
3
|
+
+++
|
|
4
|
+
|
|
5
|
+
When you receive a user message with:
|
|
6
|
+
|
|
7
|
+
{ "type": "gambit_test_bot_init_fill", "missing": ["path.to.field", "..."],
|
|
8
|
+
"current": { ... }, "schemaHints": [ ... ] }
|
|
9
|
+
|
|
10
|
+
Return ONLY valid JSON that supplies values for the missing fields. Do not
|
|
11
|
+
include any fields that are not listed in "missing". If the only missing path is
|
|
12
|
+
"(root)", return the full init JSON value.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
+++
|
|
2
|
+
label = "Call gambit_respond"
|
|
3
|
+
respond = true
|
|
4
|
+
+++
|
|
5
|
+
|
|
6
|
+
When you finish this workflow, do **not** emit a normal assistant reply.
|
|
7
|
+
Instead, call the `gambit_respond` tool exactly once with a JSON envelope that
|
|
8
|
+
includes your validated `payload` plus optional `status`, `message`, `code`, or
|
|
9
|
+
`meta` fields. This keeps outputs structured and lets Gambit capture the result
|
|
10
|
+
even when guardrails stop the run early.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
+++
|
|
2
|
+
label = "Anthropic agent SDK bridge"
|
|
3
|
+
contextSchema = "gambit://schemas/scenarios/plain_chat_input_optional.zod.ts"
|
|
4
|
+
responseSchema = "gambit://schemas/scenarios/plain_chat_output.zod.ts"
|
|
5
|
+
+++
|
|
6
|
+
|
|
7
|
+
This stdlib deck provides the default bridge between the Anthropic agent SDK
|
|
8
|
+
runtime and Gambit decks. It is intentionally minimal; downstream runners supply
|
|
9
|
+
the actual runtime behavior.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
+++
|
|
2
|
+
label = "Codex SDK bridge"
|
|
3
|
+
contextSchema = "gambit://schemas/scenarios/plain_chat_input_optional.zod.ts"
|
|
4
|
+
responseSchema = "gambit://schemas/scenarios/plain_chat_output.zod.ts"
|
|
5
|
+
+++
|
|
6
|
+
|
|
7
|
+
This stdlib deck provides the default bridge between the Codex SDK runtime and
|
|
8
|
+
Gambit decks. It is intentionally minimal; downstream runners supply the actual
|
|
9
|
+
runtime behavior.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export type CodexTurnInput = {
|
|
2
|
+
userText: string;
|
|
3
|
+
threadId?: string;
|
|
4
|
+
systemPrompt?: string;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export type CodexTurnOutput = {
|
|
8
|
+
threadId: string;
|
|
9
|
+
assistantText: string;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
type CodexEvent =
|
|
13
|
+
| { type: "thread.started"; thread_id?: unknown }
|
|
14
|
+
| {
|
|
15
|
+
type: "item.completed";
|
|
16
|
+
item?: { type?: unknown; text?: unknown };
|
|
17
|
+
}
|
|
18
|
+
| { type: string; [key: string]: unknown };
|
|
19
|
+
|
|
20
|
+
function runCwd(): string {
|
|
21
|
+
const botRoot = Deno.env.get("GAMBIT_BOT_ROOT");
|
|
22
|
+
if (typeof botRoot === "string" && botRoot.trim().length > 0) {
|
|
23
|
+
return botRoot.trim();
|
|
24
|
+
}
|
|
25
|
+
return Deno.cwd();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function parseCodexEvents(stdout: string): {
|
|
29
|
+
threadId?: string;
|
|
30
|
+
assistantText?: string;
|
|
31
|
+
} {
|
|
32
|
+
let threadId: string | undefined;
|
|
33
|
+
let assistantText: string | undefined;
|
|
34
|
+
|
|
35
|
+
for (const line of stdout.split(/\r?\n/)) {
|
|
36
|
+
const trimmed = line.trim();
|
|
37
|
+
if (!trimmed.startsWith("{")) continue;
|
|
38
|
+
let parsed: CodexEvent | null = null;
|
|
39
|
+
try {
|
|
40
|
+
parsed = JSON.parse(trimmed) as CodexEvent;
|
|
41
|
+
} catch {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!parsed || typeof parsed !== "object") continue;
|
|
45
|
+
if (parsed.type === "thread.started") {
|
|
46
|
+
if (typeof parsed.thread_id === "string" && parsed.thread_id.trim()) {
|
|
47
|
+
threadId = parsed.thread_id.trim();
|
|
48
|
+
}
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (parsed.type === "item.completed") {
|
|
52
|
+
const item = parsed.item;
|
|
53
|
+
if (!item || typeof item !== "object") continue;
|
|
54
|
+
const rec = item as Record<string, unknown>;
|
|
55
|
+
if (rec.type !== "agent_message") continue;
|
|
56
|
+
if (typeof rec.text !== "string") continue;
|
|
57
|
+
const next = rec.text.trim();
|
|
58
|
+
if (next) assistantText = next;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return { threadId, assistantText };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function sendCodexTurn(
|
|
66
|
+
input: CodexTurnInput,
|
|
67
|
+
): Promise<CodexTurnOutput> {
|
|
68
|
+
const prompt = input.systemPrompt && input.systemPrompt.trim()
|
|
69
|
+
? `${input.systemPrompt.trim()}\n\n${input.userText}`
|
|
70
|
+
: input.userText;
|
|
71
|
+
|
|
72
|
+
const args = input.threadId
|
|
73
|
+
? [
|
|
74
|
+
"exec",
|
|
75
|
+
"resume",
|
|
76
|
+
"--skip-git-repo-check",
|
|
77
|
+
"--json",
|
|
78
|
+
input.threadId,
|
|
79
|
+
prompt,
|
|
80
|
+
]
|
|
81
|
+
: ["exec", "--skip-git-repo-check", "--json", prompt];
|
|
82
|
+
|
|
83
|
+
const out = await new Deno.Command("codex", {
|
|
84
|
+
args,
|
|
85
|
+
cwd: runCwd(),
|
|
86
|
+
stdout: "piped",
|
|
87
|
+
stderr: "piped",
|
|
88
|
+
}).output();
|
|
89
|
+
|
|
90
|
+
const stdout = new TextDecoder().decode(out.stdout);
|
|
91
|
+
const stderr = new TextDecoder().decode(out.stderr);
|
|
92
|
+
if (!out.success) {
|
|
93
|
+
throw new Error(
|
|
94
|
+
`codex exec failed (exit ${out.code}): ${stderr.trim() || stdout.trim()}`,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const parsed = parseCodexEvents(stdout);
|
|
99
|
+
const threadId = parsed.threadId ?? input.threadId;
|
|
100
|
+
if (!threadId) {
|
|
101
|
+
throw new Error(
|
|
102
|
+
`codex exec succeeded but no thread id found in output: ${stdout.trim()}`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
threadId,
|
|
107
|
+
assistantText: parsed.assistantText ?? "",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { defineDeck } from "../../../src/definitions.ts";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { sendCodexTurn } from "./codex_client.ts";
|
|
4
|
+
|
|
5
|
+
const CODEX_THREAD_META_KEY = "codex.threadId";
|
|
6
|
+
|
|
7
|
+
export default defineDeck({
|
|
8
|
+
label: "codex_sdk_bridge",
|
|
9
|
+
contextSchema: z.string().optional(),
|
|
10
|
+
responseSchema: z.string(),
|
|
11
|
+
async run(ctx) {
|
|
12
|
+
const userText = typeof ctx.initialUserMessage === "string" &&
|
|
13
|
+
ctx.initialUserMessage.trim()
|
|
14
|
+
? ctx.initialUserMessage.trim()
|
|
15
|
+
: typeof ctx.input === "string" && ctx.input.trim()
|
|
16
|
+
? ctx.input.trim()
|
|
17
|
+
: "";
|
|
18
|
+
|
|
19
|
+
if (!userText) return "";
|
|
20
|
+
|
|
21
|
+
const priorThreadId = ctx.getSessionMeta<string>(CODEX_THREAD_META_KEY);
|
|
22
|
+
const systemPrompt = ctx.getSessionMeta<string>("codex.systemPrompt");
|
|
23
|
+
|
|
24
|
+
ctx.appendMessage({ role: "user", content: userText });
|
|
25
|
+
|
|
26
|
+
const result = await sendCodexTurn({
|
|
27
|
+
userText,
|
|
28
|
+
threadId: priorThreadId,
|
|
29
|
+
systemPrompt,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
ctx.setSessionMeta(CODEX_THREAD_META_KEY, result.threadId);
|
|
33
|
+
ctx.appendMessage({ role: "assistant", content: result.assistantText });
|
|
34
|
+
return result.assistantText;
|
|
35
|
+
},
|
|
36
|
+
});
|
package/esm/mod.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export type { HandlersConfig } from "./src/types.js";
|
|
|
27
27
|
/** JSON-serializable value type used throughout Gambit. */
|
|
28
28
|
export type { JSONValue } from "./src/types.js";
|
|
29
29
|
/** Open Responses content payload types. */
|
|
30
|
-
export type { CreateResponseRequest, CreateResponseResponse, ResponseEvent, ResponseFunctionCallItem, ResponseFunctionCallOutputItem, ResponseItem, ResponseMessageItem, ResponseTextContent, ResponseToolChoice, ResponseToolDefinition, ResponseUsage, } from "./src/types.js";
|
|
30
|
+
export type { CreateResponseRequest, CreateResponseResponse, ResponseEvent, ResponseExtensionItem, ResponseFunctionCallItem, ResponseFunctionCallOutputItem, ResponseItem, ResponseItemExtensionDefinition, ResponseMessageItem, ResponseTextContent, ResponseToolChoice, ResponseToolDefinition, ResponseUsage, } from "./src/types.js";
|
|
31
31
|
/** Test deck definition shape. */
|
|
32
32
|
export type { TestDeckDefinition } from "./src/types.js";
|
|
33
33
|
/** Permission declaration shape used by deck metadata and config layers. */
|
package/esm/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
type GraderMessage = {
|
|
4
|
+
role: string;
|
|
5
|
+
content?: unknown;
|
|
6
|
+
name?: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
type GraderConversation = {
|
|
10
|
+
messages?: Array<GraderMessage>;
|
|
11
|
+
meta?: Record<string, unknown>;
|
|
12
|
+
notes?: {
|
|
13
|
+
text?: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type GraderConversationContext = {
|
|
18
|
+
session: GraderConversation;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const graderMessageSchema: z.ZodType<GraderMessage> = z.object({
|
|
22
|
+
role: z.string(),
|
|
23
|
+
content: z.any().optional(),
|
|
24
|
+
name: z.string().optional(),
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export const graderConversationSchema: z.ZodType<GraderConversation> = z.object(
|
|
28
|
+
{
|
|
29
|
+
messages: z.array(graderMessageSchema).optional(),
|
|
30
|
+
meta: z.record(z.any()).optional(),
|
|
31
|
+
notes: z.object({ text: z.string().optional() }).optional(),
|
|
32
|
+
},
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const graderConversationContextSchema: z.ZodType<GraderConversationContext> = z
|
|
36
|
+
.object({
|
|
37
|
+
session: graderConversationSchema,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export default graderConversationContextSchema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./conversation.ts";
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
type GraderToolCall = {
|
|
4
|
+
id?: string;
|
|
5
|
+
type?: string;
|
|
6
|
+
function: {
|
|
7
|
+
name: string;
|
|
8
|
+
arguments?: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
type GraderConversationMessageWithTools = {
|
|
13
|
+
role: string;
|
|
14
|
+
content?: unknown;
|
|
15
|
+
name?: string;
|
|
16
|
+
tool_calls?: Array<GraderToolCall>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
type GraderConversationWithTools = {
|
|
20
|
+
messages?: Array<GraderConversationMessageWithTools>;
|
|
21
|
+
meta?: Record<string, unknown>;
|
|
22
|
+
notes?: {
|
|
23
|
+
text?: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
type GraderConversationToolsContext = {
|
|
28
|
+
session: GraderConversationWithTools;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const graderToolCallSchema: z.ZodType<GraderToolCall> = z.object({
|
|
32
|
+
id: z.string().optional(),
|
|
33
|
+
type: z.string().optional(),
|
|
34
|
+
function: z.object({
|
|
35
|
+
name: z.string(),
|
|
36
|
+
arguments: z.string().optional(),
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export const graderConversationMessageWithToolsSchema: z.ZodType<
|
|
41
|
+
GraderConversationMessageWithTools
|
|
42
|
+
> = z.object({
|
|
43
|
+
role: z.string(),
|
|
44
|
+
content: z.any().optional(),
|
|
45
|
+
name: z.string().optional(),
|
|
46
|
+
tool_calls: z.array(graderToolCallSchema).optional(),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export const graderConversationWithToolsSchema: z.ZodType<
|
|
50
|
+
GraderConversationWithTools
|
|
51
|
+
> = z.object({
|
|
52
|
+
messages: z.array(graderConversationMessageWithToolsSchema).optional(),
|
|
53
|
+
meta: z.record(z.any()).optional(),
|
|
54
|
+
notes: z.object({ text: z.string().optional() }).optional(),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const graderConversationToolsContextSchema: z.ZodType<
|
|
58
|
+
GraderConversationToolsContext
|
|
59
|
+
> = z.object({
|
|
60
|
+
session: graderConversationWithToolsSchema,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
export default graderConversationToolsContextSchema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./conversation_tools.ts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./turn_tools.ts";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import {
|
|
3
|
+
graderConversationSchema,
|
|
4
|
+
graderMessageSchema,
|
|
5
|
+
} from "./conversation.ts";
|
|
6
|
+
|
|
7
|
+
type GraderTurnContext = {
|
|
8
|
+
session: z.infer<typeof graderConversationSchema>;
|
|
9
|
+
messageToGrade: z.infer<typeof graderMessageSchema>;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const graderTurnContextSchema: z.ZodType<GraderTurnContext> = z.object({
|
|
13
|
+
session: graderConversationSchema,
|
|
14
|
+
messageToGrade: graderMessageSchema,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export default graderTurnContextSchema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./turn.ts";
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
type GraderToolCall = {
|
|
4
|
+
id?: string;
|
|
5
|
+
type?: string;
|
|
6
|
+
function: {
|
|
7
|
+
name: string;
|
|
8
|
+
arguments?: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
type GraderMessageWithTools = {
|
|
13
|
+
role: string;
|
|
14
|
+
content?: unknown;
|
|
15
|
+
name?: string;
|
|
16
|
+
tool_calls?: Array<GraderToolCall>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
type GraderConversationWithTools = {
|
|
20
|
+
messages?: Array<GraderMessageWithTools>;
|
|
21
|
+
meta?: Record<string, unknown>;
|
|
22
|
+
notes?: {
|
|
23
|
+
text?: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
type GraderTurnToolsContext = {
|
|
28
|
+
session: GraderConversationWithTools;
|
|
29
|
+
messageToGrade: GraderMessageWithTools;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const graderToolCallSchema: z.ZodType<GraderToolCall> = z.object({
|
|
33
|
+
id: z.string().optional(),
|
|
34
|
+
type: z.string().optional(),
|
|
35
|
+
function: z.object({
|
|
36
|
+
name: z.string(),
|
|
37
|
+
arguments: z.string().optional(),
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export const graderMessageWithToolsSchema: z.ZodType<GraderMessageWithTools> = z
|
|
42
|
+
.object({
|
|
43
|
+
role: z.string(),
|
|
44
|
+
content: z.any().optional(),
|
|
45
|
+
name: z.string().optional(),
|
|
46
|
+
tool_calls: z.array(graderToolCallSchema).optional(),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export const graderConversationWithToolsSchema: z.ZodType<
|
|
50
|
+
GraderConversationWithTools
|
|
51
|
+
> = z.object({
|
|
52
|
+
messages: z.array(graderMessageWithToolsSchema).optional(),
|
|
53
|
+
meta: z.record(z.any()).optional(),
|
|
54
|
+
notes: z.object({ text: z.string().optional() }).optional(),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const graderTurnToolsContextSchema: z.ZodType<GraderTurnToolsContext> = z
|
|
58
|
+
.object({
|
|
59
|
+
session: graderConversationWithToolsSchema,
|
|
60
|
+
messageToGrade: graderMessageWithToolsSchema,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
export default graderTurnToolsContextSchema;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./turn_tools.ts";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
type GraderOutput = {
|
|
4
|
+
score: number;
|
|
5
|
+
reason: string;
|
|
6
|
+
evidence?: Array<string>;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const graderOutputSchema: z.ZodType<GraderOutput> = z.object({
|
|
10
|
+
score: z.number().int().min(-3).max(3),
|
|
11
|
+
reason: z.string(),
|
|
12
|
+
evidence: z.array(z.string()).optional(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export default graderOutputSchema;
|