coding-agent-forge 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.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/agent-forge.yaml +52 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +39 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/claude.d.ts +13 -0
- package/dist/runtime/claude.d.ts.map +1 -0
- package/dist/runtime/claude.js +73 -0
- package/dist/runtime/claude.js.map +1 -0
- package/dist/runtime/codex.d.ts +15 -0
- package/dist/runtime/codex.d.ts.map +1 -0
- package/dist/runtime/codex.js +112 -0
- package/dist/runtime/codex.js.map +1 -0
- package/dist/runtime/config.d.ts +19 -0
- package/dist/runtime/config.d.ts.map +1 -0
- package/dist/runtime/config.js +65 -0
- package/dist/runtime/config.js.map +1 -0
- package/dist/runtime/index.d.ts +5 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +20 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/opencode.d.ts +17 -0
- package/dist/runtime/opencode.d.ts.map +1 -0
- package/dist/runtime/opencode.js +119 -0
- package/dist/runtime/opencode.js.map +1 -0
- package/dist/runtime/qwen.d.ts +14 -0
- package/dist/runtime/qwen.d.ts.map +1 -0
- package/dist/runtime/qwen.js +80 -0
- package/dist/runtime/qwen.js.map +1 -0
- package/dist/runtime/types.d.ts +59 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +6 -0
- package/dist/runtime/types.js.map +1 -0
- package/package.json +50 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# coding-agent-forge
|
|
2
|
+
|
|
3
|
+
`coding-agent-forge` is a small TypeScript runtime wrapper for coding agents. The
|
|
4
|
+
lowest abstraction is `Runtime`, a thin wrapper around an existing coding-agent
|
|
5
|
+
SDK.
|
|
6
|
+
|
|
7
|
+
## Runtime kinds
|
|
8
|
+
|
|
9
|
+
- `codex`: wraps `@openai/codex-sdk`
|
|
10
|
+
- `claude`: wraps `@anthropic-ai/claude-agent-sdk`
|
|
11
|
+
- `qwen`: wraps `@qwen-code/sdk`
|
|
12
|
+
- `opencode`: wraps `@opencode-ai/sdk`
|
|
13
|
+
|
|
14
|
+
The workflow layer gets records with a `runtime` marker added:
|
|
15
|
+
`{ runtime: "codex", input }`, `{ runtime: "codex", event }`,
|
|
16
|
+
`{ runtime: "claude", message }`, `{ runtime: "qwen", message }`,
|
|
17
|
+
`{ runtime: "opencode", request }`, or `{ runtime: "opencode", event }`.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Build and checks
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm run check
|
|
29
|
+
npm run lint
|
|
30
|
+
npm run format:check
|
|
31
|
+
npm run build
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Config
|
|
35
|
+
|
|
36
|
+
Use `agent-forge.yaml` to configure the runtime models/providers you want.
|
|
37
|
+
|
|
38
|
+
```yaml
|
|
39
|
+
runtimes:
|
|
40
|
+
codex-default:
|
|
41
|
+
kind: codex
|
|
42
|
+
|
|
43
|
+
threads:
|
|
44
|
+
runner:
|
|
45
|
+
runtime: codex-default
|
|
46
|
+
options:
|
|
47
|
+
model: gpt-5.4
|
|
48
|
+
workingDirectory: .
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Put private provider credentials in `secret.yaml` and pass it after the base
|
|
52
|
+
config so it can override sensitive fields locally.
|
|
53
|
+
|
|
54
|
+
## Library usage
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { createRuntime, loadConfig, startThread } from "coding-agent-forge";
|
|
58
|
+
|
|
59
|
+
const config = await loadConfig("agent-forge.yaml");
|
|
60
|
+
const threadDefinition = config.threads.runner;
|
|
61
|
+
const runtimeDefinition = config.runtimes[threadDefinition.runtime];
|
|
62
|
+
const runtime = createRuntime(runtimeDefinition);
|
|
63
|
+
const thread = await startThread(runtime, threadDefinition);
|
|
64
|
+
|
|
65
|
+
const finalResponse = await thread.runStreamed("Inspect this repo.", (event) => {
|
|
66
|
+
console.log(event);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
console.log(finalResponse);
|
|
70
|
+
await runtime.close();
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## CLI
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm run dev -- --config agent-forge.yaml --config secret.yaml --thread codex-runner "Inspect this repo" "What did you just do? Is this a new conversation?"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Pass multiple `--config` files to merge them in order; object fields in later
|
|
80
|
+
files are merged into earlier files. Omit `--thread` to run the first thread in
|
|
81
|
+
the merged config. Pass multiple quoted prompts to run a multi-turn conversation
|
|
82
|
+
on the same thread.
|
|
83
|
+
|
|
84
|
+
The CLI prints one JSON event per line, followed by the final response text for
|
|
85
|
+
each prompt.
|
package/agent-forge.yaml
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
runtimes:
|
|
2
|
+
codex:
|
|
3
|
+
kind: codex
|
|
4
|
+
|
|
5
|
+
claude:
|
|
6
|
+
kind: claude
|
|
7
|
+
|
|
8
|
+
qwen:
|
|
9
|
+
kind: qwen
|
|
10
|
+
|
|
11
|
+
opencode:
|
|
12
|
+
kind: opencode
|
|
13
|
+
options:
|
|
14
|
+
config:
|
|
15
|
+
model: deepseek/deepseek-reasoner
|
|
16
|
+
small_model: deepseek/deepseek-reasoner
|
|
17
|
+
enabled_providers:
|
|
18
|
+
- deepseek
|
|
19
|
+
provider:
|
|
20
|
+
deepseek:
|
|
21
|
+
name: DeepSeek
|
|
22
|
+
options:
|
|
23
|
+
baseURL: https://api.deepseek.com
|
|
24
|
+
models:
|
|
25
|
+
deepseek-chat:
|
|
26
|
+
options:
|
|
27
|
+
reasoningEffort: high
|
|
28
|
+
|
|
29
|
+
threads:
|
|
30
|
+
codex-runner:
|
|
31
|
+
runtime: codex
|
|
32
|
+
options:
|
|
33
|
+
model: gpt-5.3-codex
|
|
34
|
+
workingDirectory: .
|
|
35
|
+
sandboxMode: danger-full-access
|
|
36
|
+
|
|
37
|
+
opencode-runner:
|
|
38
|
+
runtime: opencode
|
|
39
|
+
options:
|
|
40
|
+
query:
|
|
41
|
+
directory: .
|
|
42
|
+
|
|
43
|
+
qwen-runner:
|
|
44
|
+
runtime: qwen
|
|
45
|
+
options:
|
|
46
|
+
cwd: .
|
|
47
|
+
authType: openai
|
|
48
|
+
model: deepseek-reasoner
|
|
49
|
+
env:
|
|
50
|
+
OPENAI_BASE_URL: https://api.deepseek.com
|
|
51
|
+
OPENAI_MODEL: deepseek-reasoner
|
|
52
|
+
OPENAI_REASONING_EFFORT: high
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { createRuntime, loadConfig, startThread } from "./index.js";
|
|
4
|
+
const { values, positionals: prompts } = parseArgs({
|
|
5
|
+
args: process.argv.slice(2),
|
|
6
|
+
options: {
|
|
7
|
+
config: { type: "string", multiple: true },
|
|
8
|
+
thread: { type: "string" },
|
|
9
|
+
},
|
|
10
|
+
allowPositionals: true,
|
|
11
|
+
});
|
|
12
|
+
const configPaths = values.config ?? [];
|
|
13
|
+
if (prompts.length === 0) {
|
|
14
|
+
console.error('Usage: agent-forge --config base.yaml [--config override.yaml] [--thread runner] "prompt" ["follow up"]');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const config = await loadConfig(...(configPaths.length > 0 ? configPaths : ["agent-forge.yaml"]));
|
|
18
|
+
const [defaultThreadName = ""] = Object.keys(config.threads);
|
|
19
|
+
const threadName = values.thread ?? defaultThreadName;
|
|
20
|
+
const threadDefinition = config.threads[threadName];
|
|
21
|
+
if (!threadDefinition) {
|
|
22
|
+
throw new Error(`Unknown thread: ${threadName}`);
|
|
23
|
+
}
|
|
24
|
+
const runtimeDefinition = config.runtimes[threadDefinition.runtime];
|
|
25
|
+
if (!runtimeDefinition) {
|
|
26
|
+
throw new Error(`Unknown runtime for thread ${threadName}: ${threadDefinition.runtime}`);
|
|
27
|
+
}
|
|
28
|
+
const runtime = createRuntime(runtimeDefinition);
|
|
29
|
+
try {
|
|
30
|
+
const thread = await startThread(runtime, threadDefinition);
|
|
31
|
+
for (const prompt of prompts) {
|
|
32
|
+
const response = await thread.runStreamed(prompt);
|
|
33
|
+
process.stdout.write(`${response}\n`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
await runtime.close();
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IACjD,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC3B;IACD,gBAAgB,EAAE,IAAI;CACvB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;AAExC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IACzB,OAAO,CAAC,KAAK,CACX,yGAAyG,CAC1G,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAClG,MAAM,CAAC,iBAAiB,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,IAAI,iBAAiB,CAAC;AAEtD,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACpD,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACtB,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACpE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,OAAO,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAEjD,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAE5D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;QAAS,CAAC;IACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { loadConfig } from "./runtime/config.js";
|
|
2
|
+
export type { Config, RuntimeDefinition, ThreadDefinition } from "./runtime/config.js";
|
|
3
|
+
export { createRuntime, startThread } from "./runtime/index.js";
|
|
4
|
+
export { CodexRuntime, CodexThread } from "./runtime/codex.js";
|
|
5
|
+
export { ClaudeRuntime, ClaudeThread } from "./runtime/claude.js";
|
|
6
|
+
export { QwenRuntime, QwenThread } from "./runtime/qwen.js";
|
|
7
|
+
export { OpencodeRuntime, OpencodeThread } from "./runtime/opencode.js";
|
|
8
|
+
export type { RuntimeKind, Runtime, RuntimeOptions, BaseRuntime, Thread, ThreadOptions, Record, RecordCallback, } from "./runtime/types.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACxE,YAAY,EACV,WAAW,EACX,OAAO,EACP,cAAc,EACd,WAAW,EACX,MAAM,EACN,aAAa,EACb,MAAM,EACN,cAAc,GACf,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { loadConfig } from "./runtime/config.js";
|
|
2
|
+
export { createRuntime, startThread } from "./runtime/index.js";
|
|
3
|
+
export { CodexRuntime, CodexThread } from "./runtime/codex.js";
|
|
4
|
+
export { ClaudeRuntime, ClaudeThread } from "./runtime/claude.js";
|
|
5
|
+
export { QwenRuntime, QwenThread } from "./runtime/qwen.js";
|
|
6
|
+
export { OpencodeRuntime, OpencodeThread } from "./runtime/opencode.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseRuntime } from "./types.js";
|
|
2
|
+
import type { Record as RuntimeRecord, RecordCallback, Thread, ThreadOptions } from "./types.js";
|
|
3
|
+
export declare class ClaudeRuntime extends BaseRuntime<"claude"> {
|
|
4
|
+
startThread(options?: ThreadOptions<"claude">): Promise<Thread<"claude">>;
|
|
5
|
+
}
|
|
6
|
+
export declare class ClaudeThread implements Thread<"claude"> {
|
|
7
|
+
#private;
|
|
8
|
+
private readonly options;
|
|
9
|
+
constructor(options: ThreadOptions<"claude">);
|
|
10
|
+
runStreamed(prompt: string, onRecord?: RecordCallback<"claude">): Promise<string>;
|
|
11
|
+
recordToPrettyString(record: RuntimeRecord<"claude">): string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/runtime/claude.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EACV,MAAM,IAAI,aAAa,EACvB,cAAc,EACd,MAAM,EACN,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,aAAc,SAAQ,WAAW,CAAC,QAAQ,CAAC;IACtD,WAAW,CAAC,OAAO,GAAE,aAAa,CAAC,QAAQ,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;CAG9E;AAED,qBAAa,YAAa,YAAW,MAAM,CAAC,QAAQ,CAAC;;IAGvC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC;IAEvD,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,cAAc,CAAC,QAAQ,CAEhC,GACA,OAAO,CAAC,MAAM,CAAC;IAmClB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,MAAM;CA2B9D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
import { BaseRuntime } from "./types.js";
|
|
3
|
+
export class ClaudeRuntime extends BaseRuntime {
|
|
4
|
+
startThread(options = {}) {
|
|
5
|
+
return Promise.resolve(new ClaudeThread(options));
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class ClaudeThread {
|
|
9
|
+
options;
|
|
10
|
+
#sessionId;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
14
|
+
async runStreamed(prompt, onRecord = (record) => {
|
|
15
|
+
process.stdout.write(`${this.recordToPrettyString(record)}\n`);
|
|
16
|
+
}) {
|
|
17
|
+
const options = { ...this.options };
|
|
18
|
+
if (this.#sessionId) {
|
|
19
|
+
delete options.continue;
|
|
20
|
+
delete options.forkSession;
|
|
21
|
+
delete options.resumeSessionAt;
|
|
22
|
+
delete options.sessionId;
|
|
23
|
+
options.resume = this.#sessionId;
|
|
24
|
+
}
|
|
25
|
+
const stream = query({
|
|
26
|
+
prompt,
|
|
27
|
+
options,
|
|
28
|
+
});
|
|
29
|
+
let finalResponse = "";
|
|
30
|
+
for await (const message of stream) {
|
|
31
|
+
if ("session_id" in message && typeof message.session_id === "string") {
|
|
32
|
+
this.#sessionId = message.session_id;
|
|
33
|
+
}
|
|
34
|
+
await onRecord({ runtime: "claude", message });
|
|
35
|
+
if (message.type === "result") {
|
|
36
|
+
if (message.subtype === "success") {
|
|
37
|
+
finalResponse = message.result;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw new Error(message.errors.join("\n"));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return finalResponse;
|
|
45
|
+
}
|
|
46
|
+
recordToPrettyString(record) {
|
|
47
|
+
const formatValue = (value) => {
|
|
48
|
+
return typeof value === "string" ? value : JSON.stringify(value, null, 2);
|
|
49
|
+
};
|
|
50
|
+
const { message } = record;
|
|
51
|
+
switch (message.type) {
|
|
52
|
+
case "assistant":
|
|
53
|
+
if (message.error) {
|
|
54
|
+
return `[claude] assistant error\n${message.error}`;
|
|
55
|
+
}
|
|
56
|
+
return `[claude] assistant\n${formatValue(message.message.content)}`;
|
|
57
|
+
case "user":
|
|
58
|
+
return `[claude] user\n${formatValue(message.message.content)}`;
|
|
59
|
+
case "system":
|
|
60
|
+
return `[claude] system ${message.subtype}`;
|
|
61
|
+
case "result":
|
|
62
|
+
if (message.subtype === "success") {
|
|
63
|
+
return `[claude] result success (${String(message.num_turns)} turns, $${String(message.total_cost_usd)})\n${message.result}`;
|
|
64
|
+
}
|
|
65
|
+
return `[claude] result error (${message.subtype})\n${message.errors.join("\n")}`;
|
|
66
|
+
case "stream_event":
|
|
67
|
+
return `[claude] stream event ${message.event.type}`;
|
|
68
|
+
default:
|
|
69
|
+
return `[claude] ${message.type}`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/runtime/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Thread as CodexSdkThread } from "@openai/codex-sdk";
|
|
2
|
+
import { BaseRuntime } from "./types.js";
|
|
3
|
+
import type { Record as RuntimeRecord, RecordCallback, RuntimeOptions, Thread, ThreadOptions } from "./types.js";
|
|
4
|
+
export declare class CodexRuntime extends BaseRuntime<"codex"> {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(options?: RuntimeOptions<"codex">);
|
|
7
|
+
startThread(options?: ThreadOptions<"codex">): Promise<Thread<"codex">>;
|
|
8
|
+
}
|
|
9
|
+
export declare class CodexThread implements Thread<"codex"> {
|
|
10
|
+
private readonly thread;
|
|
11
|
+
constructor(thread: CodexSdkThread);
|
|
12
|
+
runStreamed(prompt: string, onRecord?: RecordCallback<"codex">): Promise<string>;
|
|
13
|
+
recordToPrettyString(record: RuntimeRecord<"codex">): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/runtime/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,IAAI,cAAc,EAE9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EACV,MAAM,IAAI,aAAa,EACvB,cAAc,EACd,cAAc,EACd,MAAM,EACN,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAa,SAAQ,WAAW,CAAC,OAAO,CAAC;;gBAGxC,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC;IAK7C,WAAW,CAAC,OAAO,GAAE,aAAa,CAAC,OAAO,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;CAI5E;AAED,qBAAa,WAAY,YAAW,MAAM,CAAC,OAAO,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE7C,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,cAAc,CAAC,OAAO,CAE/B,GACA,OAAO,CAAC,MAAM,CAAC;IAyBlB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM;CA2E7D"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Codex, } from "@openai/codex-sdk";
|
|
2
|
+
import { BaseRuntime } from "./types.js";
|
|
3
|
+
export class CodexRuntime extends BaseRuntime {
|
|
4
|
+
#codex;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
super();
|
|
7
|
+
this.#codex = new Codex(options);
|
|
8
|
+
}
|
|
9
|
+
startThread(options = {}) {
|
|
10
|
+
const thread = this.#codex.startThread(options);
|
|
11
|
+
return Promise.resolve(new CodexThread(thread));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class CodexThread {
|
|
15
|
+
thread;
|
|
16
|
+
constructor(thread) {
|
|
17
|
+
this.thread = thread;
|
|
18
|
+
}
|
|
19
|
+
async runStreamed(prompt, onRecord = (record) => {
|
|
20
|
+
process.stdout.write(`${this.recordToPrettyString(record)}\n`);
|
|
21
|
+
}) {
|
|
22
|
+
await onRecord({ runtime: "codex", input: prompt });
|
|
23
|
+
const { events } = await this.thread.runStreamed(prompt);
|
|
24
|
+
let finalResponse = "";
|
|
25
|
+
for await (const event of events) {
|
|
26
|
+
await onRecord({ runtime: "codex", event });
|
|
27
|
+
if (event.type === "item.completed" && event.item.type === "agent_message") {
|
|
28
|
+
finalResponse = event.item.text;
|
|
29
|
+
}
|
|
30
|
+
if (event.type === "turn.failed") {
|
|
31
|
+
throw new Error(event.error.message);
|
|
32
|
+
}
|
|
33
|
+
if (event.type === "error") {
|
|
34
|
+
throw new Error(event.message);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return finalResponse;
|
|
38
|
+
}
|
|
39
|
+
recordToPrettyString(record) {
|
|
40
|
+
const formatValue = (value) => {
|
|
41
|
+
return typeof value === "string" ? value : JSON.stringify(value, null, 2);
|
|
42
|
+
};
|
|
43
|
+
const previewText = (text, maxLength = 240) => {
|
|
44
|
+
const trimmed = text.trim();
|
|
45
|
+
if (trimmed.length <= maxLength) {
|
|
46
|
+
return trimmed;
|
|
47
|
+
}
|
|
48
|
+
return `${trimmed.slice(0, maxLength - 3)}...`;
|
|
49
|
+
};
|
|
50
|
+
const summarizeItem = (item) => {
|
|
51
|
+
switch (item.type) {
|
|
52
|
+
case "agent_message":
|
|
53
|
+
return item.text ? `\n${previewText(item.text)}` : "";
|
|
54
|
+
case "reasoning":
|
|
55
|
+
return item.text ? `\n${previewText(item.text)}` : "";
|
|
56
|
+
case "command_execution": {
|
|
57
|
+
const exitCode = item.exit_code === undefined ? "" : ` exit=${String(item.exit_code)}`;
|
|
58
|
+
const output = item.aggregated_output ? `\n${previewText(item.aggregated_output)}` : "";
|
|
59
|
+
return ` status=${item.status}${exitCode}\n${item.command}${output}`;
|
|
60
|
+
}
|
|
61
|
+
case "file_change": {
|
|
62
|
+
const changes = item.changes.map((change) => `${change.kind}:${change.path}`).join(", ");
|
|
63
|
+
return ` status=${item.status} changes=${changes || "none"}`;
|
|
64
|
+
}
|
|
65
|
+
case "mcp_tool_call": {
|
|
66
|
+
const error = item.error ? ` error=${item.error.message}` : "";
|
|
67
|
+
const result = item.result
|
|
68
|
+
? ` result=${String(item.result.content.length)} block(s)`
|
|
69
|
+
: "";
|
|
70
|
+
return ` ${item.server}.${item.tool} status=${item.status}${result}${error}\n${formatValue(item.arguments)}`;
|
|
71
|
+
}
|
|
72
|
+
case "web_search":
|
|
73
|
+
return item.query ? ` query=${item.query}` : " query=<empty>";
|
|
74
|
+
case "todo_list": {
|
|
75
|
+
const done = item.items.filter((todo) => todo.completed).length;
|
|
76
|
+
const todos = item.items
|
|
77
|
+
.map((todo) => `[${todo.completed ? "x" : " "}] ${todo.text}`)
|
|
78
|
+
.join("\n");
|
|
79
|
+
return ` ${String(done)}/${String(item.items.length)} completed${todos ? `\n${todos}` : ""}`;
|
|
80
|
+
}
|
|
81
|
+
case "error":
|
|
82
|
+
return `\n${item.message}`;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
if ("input" in record) {
|
|
86
|
+
return `[codex] input\n${formatValue(record.input)}`;
|
|
87
|
+
}
|
|
88
|
+
const { event } = record;
|
|
89
|
+
switch (event.type) {
|
|
90
|
+
case "thread.started":
|
|
91
|
+
return `[codex] thread started ${event.thread_id}`;
|
|
92
|
+
case "turn.started":
|
|
93
|
+
return "[codex] turn started";
|
|
94
|
+
case "turn.completed":
|
|
95
|
+
return `[codex] turn completed ${formatValue(event.usage)}`;
|
|
96
|
+
case "turn.failed":
|
|
97
|
+
return `[codex] turn failed\n${event.error.message}`;
|
|
98
|
+
case "error":
|
|
99
|
+
return `[codex] error\n${event.message}`;
|
|
100
|
+
case "item.started":
|
|
101
|
+
return `[codex] ${event.item.type} started${summarizeItem(event.item)}`;
|
|
102
|
+
case "item.completed":
|
|
103
|
+
if (event.item.type === "agent_message") {
|
|
104
|
+
return `[codex] assistant\n${event.item.text}`;
|
|
105
|
+
}
|
|
106
|
+
return `[codex] ${event.item.type} completed${summarizeItem(event.item)}`;
|
|
107
|
+
default:
|
|
108
|
+
return `[codex] ${event.type}`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/runtime/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RuntimeKind, RuntimeOptions, ThreadOptions } from "./types.js";
|
|
2
|
+
export type RuntimeDefinition<K extends RuntimeKind = RuntimeKind> = {
|
|
3
|
+
[P in K]: RuntimeOptions<P> extends never ? {
|
|
4
|
+
kind: P;
|
|
5
|
+
} : {
|
|
6
|
+
kind: P;
|
|
7
|
+
options?: RuntimeOptions<P>;
|
|
8
|
+
};
|
|
9
|
+
}[K];
|
|
10
|
+
export type ThreadDefinition = {
|
|
11
|
+
runtime: string;
|
|
12
|
+
options?: ThreadOptions;
|
|
13
|
+
};
|
|
14
|
+
export type Config = {
|
|
15
|
+
runtimes: Record<string, RuntimeDefinition>;
|
|
16
|
+
threads: Record<string, ThreadDefinition>;
|
|
17
|
+
};
|
|
18
|
+
export declare function loadConfig(...paths: string[]): Promise<Config>;
|
|
19
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7E,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI;KAClE,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS,KAAK,GACrC;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,GACX;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;KAAE;CAC7C,CAAC,CAAC,CAAC,CAAC;AAEL,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC3C,CAAC;AA+BF,wBAAsB,UAAU,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CpE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { parse } from "yaml";
|
|
3
|
+
const runtimeKinds = new Set(["codex", "claude", "qwen", "opencode"]);
|
|
4
|
+
function isPlainObject(value) {
|
|
5
|
+
if (typeof value !== "object" || value === null) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
const prototype = Object.getPrototypeOf(value);
|
|
9
|
+
return prototype === Object.prototype || prototype === null;
|
|
10
|
+
}
|
|
11
|
+
function mergeObjects(base, override) {
|
|
12
|
+
const merged = { ...base };
|
|
13
|
+
for (const [key, value] of Object.entries(override)) {
|
|
14
|
+
const existing = merged[key];
|
|
15
|
+
merged[key] =
|
|
16
|
+
isPlainObject(existing) && isPlainObject(value) ? mergeObjects(existing, value) : value;
|
|
17
|
+
}
|
|
18
|
+
return merged;
|
|
19
|
+
}
|
|
20
|
+
function isRuntimeKind(value) {
|
|
21
|
+
return typeof value === "string" && runtimeKinds.has(value);
|
|
22
|
+
}
|
|
23
|
+
export async function loadConfig(...paths) {
|
|
24
|
+
if (paths.length === 0) {
|
|
25
|
+
throw new Error("loadConfig requires at least one path");
|
|
26
|
+
}
|
|
27
|
+
let config = {};
|
|
28
|
+
for (const path of paths) {
|
|
29
|
+
const nextConfig = parse(await readFile(path, "utf8"));
|
|
30
|
+
if (!isPlainObject(nextConfig)) {
|
|
31
|
+
throw new Error(`Config file must contain an object: ${path}`);
|
|
32
|
+
}
|
|
33
|
+
config = mergeObjects(config, nextConfig);
|
|
34
|
+
}
|
|
35
|
+
if (!isPlainObject(config.runtimes)) {
|
|
36
|
+
throw new Error("Config must define a runtimes object");
|
|
37
|
+
}
|
|
38
|
+
if (!isPlainObject(config.threads)) {
|
|
39
|
+
throw new Error("Config must define a threads object");
|
|
40
|
+
}
|
|
41
|
+
if (Object.keys(config.threads).length === 0) {
|
|
42
|
+
throw new Error("Config must define at least one thread");
|
|
43
|
+
}
|
|
44
|
+
for (const [name, runtime] of Object.entries(config.runtimes)) {
|
|
45
|
+
if (!isPlainObject(runtime)) {
|
|
46
|
+
throw new Error(`Runtime ${name} must be an object`);
|
|
47
|
+
}
|
|
48
|
+
if (!isRuntimeKind(runtime.kind)) {
|
|
49
|
+
throw new Error(`Runtime ${name} must use kind codex, claude, qwen, or opencode`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const [name, thread] of Object.entries(config.threads)) {
|
|
53
|
+
if (!isPlainObject(thread)) {
|
|
54
|
+
throw new Error(`Thread ${name} must be an object`);
|
|
55
|
+
}
|
|
56
|
+
if (typeof thread.runtime !== "string") {
|
|
57
|
+
throw new Error(`Thread ${name} must define a runtime`);
|
|
58
|
+
}
|
|
59
|
+
if (!config.runtimes[thread.runtime]) {
|
|
60
|
+
throw new Error(`Unknown runtime for thread ${name}: ${thread.runtime}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return config;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/runtime/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RuntimeDefinition, ThreadDefinition } from "./config.js";
|
|
2
|
+
import type { Runtime, Thread } from "./types.js";
|
|
3
|
+
export declare function createRuntime(runtime: RuntimeDefinition): Runtime;
|
|
4
|
+
export declare function startThread(runtime: Runtime, thread: ThreadDefinition): Promise<Thread>;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAWjE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ClaudeRuntime } from "./claude.js";
|
|
2
|
+
import { CodexRuntime } from "./codex.js";
|
|
3
|
+
import { OpencodeRuntime } from "./opencode.js";
|
|
4
|
+
import { QwenRuntime } from "./qwen.js";
|
|
5
|
+
export function createRuntime(runtime) {
|
|
6
|
+
switch (runtime.kind) {
|
|
7
|
+
case "codex":
|
|
8
|
+
return new CodexRuntime(runtime.options);
|
|
9
|
+
case "claude":
|
|
10
|
+
return new ClaudeRuntime();
|
|
11
|
+
case "qwen":
|
|
12
|
+
return new QwenRuntime();
|
|
13
|
+
case "opencode":
|
|
14
|
+
return new OpencodeRuntime(runtime.options);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function startThread(runtime, thread) {
|
|
18
|
+
return runtime.startThread(thread.options ?? {});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAIxC,MAAM,UAAU,aAAa,CAAC,OAA0B;IACtD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,KAAK,MAAM;YACT,OAAO,IAAI,WAAW,EAAE,CAAC;QAC3B,KAAK,UAAU;YACb,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,MAAwB;IACpE,OAAO,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type OpencodeClient } from "@opencode-ai/sdk";
|
|
2
|
+
import { BaseRuntime } from "./types.js";
|
|
3
|
+
import type { Record as RuntimeRecord, RecordCallback, RuntimeOptions, Thread, ThreadOptions } from "./types.js";
|
|
4
|
+
export declare class OpencodeRuntime extends BaseRuntime<"opencode"> {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(options?: RuntimeOptions<"opencode">);
|
|
7
|
+
startThread(options?: ThreadOptions<"opencode">): Promise<Thread<"opencode">>;
|
|
8
|
+
close(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare class OpencodeThread implements Thread<"opencode"> {
|
|
11
|
+
private readonly client;
|
|
12
|
+
private readonly sessionId;
|
|
13
|
+
constructor(client: OpencodeClient, sessionId: string);
|
|
14
|
+
runStreamed(prompt: string, onRecord?: RecordCallback<"opencode">): Promise<string>;
|
|
15
|
+
recordToPrettyString(record: RuntimeRecord<"opencode">): string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/runtime/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EACV,MAAM,IAAI,aAAa,EACvB,cAAc,EACd,cAAc,EACd,MAAM,EACN,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,qBAAa,eAAgB,SAAQ,WAAW,CAAC,UAAU,CAAC;;gBAG9C,OAAO,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC;IAK1C,WAAW,CAAC,OAAO,GAAE,aAAa,CAAC,UAAU,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAUjF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B;AAED,qBAAa,cAAe,YAAW,MAAM,CAAC,UAAU,CAAC;IAErD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM;IAG9B,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,cAAc,CAAC,UAAU,CAElC,GACA,OAAO,CAAC,MAAM,CAAC;IAuDlB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM;CA6ChE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createOpencode } from "@opencode-ai/sdk";
|
|
2
|
+
import { BaseRuntime } from "./types.js";
|
|
3
|
+
export class OpencodeRuntime extends BaseRuntime {
|
|
4
|
+
#opencode;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
super();
|
|
7
|
+
this.#opencode = createOpencode(options);
|
|
8
|
+
}
|
|
9
|
+
async startThread(options = {}) {
|
|
10
|
+
const opencode = await this.#opencode;
|
|
11
|
+
const session = await opencode.client.session.create({
|
|
12
|
+
...options,
|
|
13
|
+
throwOnError: true,
|
|
14
|
+
});
|
|
15
|
+
return new OpencodeThread(opencode.client, session.data.id);
|
|
16
|
+
}
|
|
17
|
+
async close() {
|
|
18
|
+
const opencode = await this.#opencode;
|
|
19
|
+
opencode.server.close();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class OpencodeThread {
|
|
23
|
+
client;
|
|
24
|
+
sessionId;
|
|
25
|
+
constructor(client, sessionId) {
|
|
26
|
+
this.client = client;
|
|
27
|
+
this.sessionId = sessionId;
|
|
28
|
+
}
|
|
29
|
+
async runStreamed(prompt, onRecord = (record) => {
|
|
30
|
+
process.stdout.write(`${this.recordToPrettyString(record)}\n`);
|
|
31
|
+
}) {
|
|
32
|
+
const request = {
|
|
33
|
+
path: { id: this.sessionId },
|
|
34
|
+
body: {
|
|
35
|
+
parts: [{ type: "text", text: prompt }],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
await onRecord({ runtime: "opencode", request: prompt });
|
|
39
|
+
const { stream } = await this.client.event.subscribe({
|
|
40
|
+
throwOnError: true,
|
|
41
|
+
});
|
|
42
|
+
await this.client.session.promptAsync({
|
|
43
|
+
...request,
|
|
44
|
+
throwOnError: true,
|
|
45
|
+
});
|
|
46
|
+
for await (const event of stream) {
|
|
47
|
+
if ("sessionID" in event.properties && event.properties.sessionID === this.sessionId) {
|
|
48
|
+
await onRecord({ runtime: "opencode", event });
|
|
49
|
+
if (event.type === "session.error") {
|
|
50
|
+
throw new Error(event.properties.error?.name ?? "Opencode session error");
|
|
51
|
+
}
|
|
52
|
+
if (event.type === "session.idle") {
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const response = await this.client.session.messages({
|
|
58
|
+
path: { id: this.sessionId },
|
|
59
|
+
throwOnError: true,
|
|
60
|
+
});
|
|
61
|
+
const message = [...response.data]
|
|
62
|
+
.reverse()
|
|
63
|
+
.find((message) => message.info.role === "assistant");
|
|
64
|
+
if (!message) {
|
|
65
|
+
throw new Error("No assistant message found");
|
|
66
|
+
}
|
|
67
|
+
if (message.info.role === "assistant" && message.info.error) {
|
|
68
|
+
throw new Error(message.info.error.name);
|
|
69
|
+
}
|
|
70
|
+
return message.parts
|
|
71
|
+
.filter((part) => part.type === "text")
|
|
72
|
+
.map((part) => part.text)
|
|
73
|
+
.join("");
|
|
74
|
+
}
|
|
75
|
+
recordToPrettyString(record) {
|
|
76
|
+
const formatValue = (value) => {
|
|
77
|
+
return typeof value === "string" ? value : JSON.stringify(value, null, 2);
|
|
78
|
+
};
|
|
79
|
+
if ("request" in record) {
|
|
80
|
+
return `[opencode] request\n${record.request}`;
|
|
81
|
+
}
|
|
82
|
+
const { event } = record;
|
|
83
|
+
switch (event.type) {
|
|
84
|
+
case "session.created":
|
|
85
|
+
return `[opencode] session created ${event.properties.info.id}`;
|
|
86
|
+
case "session.updated":
|
|
87
|
+
return `[opencode] session updated ${event.properties.info.id}`;
|
|
88
|
+
case "session.idle":
|
|
89
|
+
return `[opencode] session idle ${event.properties.sessionID}`;
|
|
90
|
+
case "session.status":
|
|
91
|
+
return `[opencode] session status ${event.properties.status.type}`;
|
|
92
|
+
case "session.error":
|
|
93
|
+
return `[opencode] session error\n${formatValue(event.properties.error)}`;
|
|
94
|
+
case "message.updated":
|
|
95
|
+
return `[opencode] ${event.properties.info.role} message updated ${event.properties.info.id}`;
|
|
96
|
+
case "message.part.updated":
|
|
97
|
+
if (event.properties.part.type === "text") {
|
|
98
|
+
return `[opencode] text\n${event.properties.delta ?? event.properties.part.text}`;
|
|
99
|
+
}
|
|
100
|
+
if (event.properties.part.type === "tool") {
|
|
101
|
+
return `[opencode] tool ${event.properties.part.tool} ${event.properties.part.state.status}`;
|
|
102
|
+
}
|
|
103
|
+
return `[opencode] ${event.properties.part.type} part updated`;
|
|
104
|
+
case "permission.updated":
|
|
105
|
+
return `[opencode] permission requested ${event.properties.title}`;
|
|
106
|
+
case "permission.replied":
|
|
107
|
+
return `[opencode] permission ${event.properties.response}`;
|
|
108
|
+
case "file.edited":
|
|
109
|
+
return `[opencode] file edited ${event.properties.file}`;
|
|
110
|
+
case "todo.updated":
|
|
111
|
+
return `[opencode] todo updated ${String(event.properties.todos.length)} item(s)`;
|
|
112
|
+
case "command.executed":
|
|
113
|
+
return `[opencode] command executed ${event.properties.name}`;
|
|
114
|
+
default:
|
|
115
|
+
return `[opencode] ${event.type}`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/runtime/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type QueryOptions } from "@qwen-code/sdk";
|
|
2
|
+
import { BaseRuntime } from "./types.js";
|
|
3
|
+
import type { Record as RuntimeRecord, RecordCallback, Thread, ThreadOptions } from "./types.js";
|
|
4
|
+
export declare class QwenRuntime extends BaseRuntime<"qwen"> {
|
|
5
|
+
startThread(options?: ThreadOptions<"qwen">): Promise<Thread<"qwen">>;
|
|
6
|
+
}
|
|
7
|
+
export declare class QwenThread implements Thread<"qwen"> {
|
|
8
|
+
#private;
|
|
9
|
+
private readonly options;
|
|
10
|
+
constructor(options: QueryOptions);
|
|
11
|
+
runStreamed(prompt: string, onRecord?: RecordCallback<"qwen">): Promise<string>;
|
|
12
|
+
recordToPrettyString(record: RuntimeRecord<"qwen">): string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=qwen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen.d.ts","sourceRoot":"","sources":["../../src/runtime/qwen.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EACV,MAAM,IAAI,aAAa,EACvB,cAAc,EACd,MAAM,EACN,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAY,SAAQ,WAAW,CAAC,MAAM,CAAC;IAClD,WAAW,CAAC,OAAO,GAAE,aAAa,CAAC,MAAM,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CAG1E;AAED,qBAAa,UAAW,YAAW,MAAM,CAAC,MAAM,CAAC;;IAGnC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAE5C,WAAW,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,cAAc,CAAC,MAAM,CAE9B,GACA,OAAO,CAAC,MAAM,CAAC;IAgClB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM;CAwC5D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { query } from "@qwen-code/sdk";
|
|
2
|
+
import { BaseRuntime } from "./types.js";
|
|
3
|
+
export class QwenRuntime extends BaseRuntime {
|
|
4
|
+
startThread(options = {}) {
|
|
5
|
+
return Promise.resolve(new QwenThread(options));
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class QwenThread {
|
|
9
|
+
options;
|
|
10
|
+
#sessionId;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
14
|
+
async runStreamed(prompt, onRecord = (record) => {
|
|
15
|
+
process.stdout.write(`${this.recordToPrettyString(record)}\n`);
|
|
16
|
+
}) {
|
|
17
|
+
const options = { ...this.options };
|
|
18
|
+
if (this.#sessionId) {
|
|
19
|
+
delete options.sessionId;
|
|
20
|
+
options.resume = this.#sessionId;
|
|
21
|
+
}
|
|
22
|
+
const stream = query({
|
|
23
|
+
prompt,
|
|
24
|
+
options,
|
|
25
|
+
});
|
|
26
|
+
let finalResponse = "";
|
|
27
|
+
for await (const message of stream) {
|
|
28
|
+
if ("session_id" in message && typeof message.session_id === "string") {
|
|
29
|
+
this.#sessionId = message.session_id;
|
|
30
|
+
}
|
|
31
|
+
await onRecord({ runtime: "qwen", message });
|
|
32
|
+
if (message.type === "result") {
|
|
33
|
+
if (!message.is_error) {
|
|
34
|
+
finalResponse = message.result;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
throw new Error(message.error?.message ?? message.subtype);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return finalResponse;
|
|
42
|
+
}
|
|
43
|
+
recordToPrettyString(record) {
|
|
44
|
+
const formatValue = (value) => {
|
|
45
|
+
return typeof value === "string" ? value : JSON.stringify(value, null, 2);
|
|
46
|
+
};
|
|
47
|
+
const formatContentBlock = (block) => {
|
|
48
|
+
switch (block.type) {
|
|
49
|
+
case "text":
|
|
50
|
+
return block.text;
|
|
51
|
+
case "thinking":
|
|
52
|
+
return `[thinking]\n${block.thinking}`;
|
|
53
|
+
case "tool_use":
|
|
54
|
+
return `[tool:${block.name}]\n${formatValue(block.input)}`;
|
|
55
|
+
case "tool_result":
|
|
56
|
+
return `[tool_result:${block.tool_use_id}]${block.is_error ? " error" : ""}\n${formatValue(block.content ?? "")}`;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const formatContent = (content) => {
|
|
60
|
+
return typeof content === "string" ? content : content.map(formatContentBlock).join("\n");
|
|
61
|
+
};
|
|
62
|
+
const { message } = record;
|
|
63
|
+
switch (message.type) {
|
|
64
|
+
case "assistant":
|
|
65
|
+
return `[qwen] assistant\n${formatContent(message.message.content)}`;
|
|
66
|
+
case "user":
|
|
67
|
+
return `[qwen] user\n${formatContent(message.message.content)}`;
|
|
68
|
+
case "system":
|
|
69
|
+
return `[qwen] system ${message.subtype}`;
|
|
70
|
+
case "result":
|
|
71
|
+
if (!message.is_error) {
|
|
72
|
+
return `[qwen] result success (${String(message.num_turns)} turns)\n${message.result}`;
|
|
73
|
+
}
|
|
74
|
+
return `[qwen] result error (${message.subtype})\n${message.error?.message ?? ""}`;
|
|
75
|
+
case "stream_event":
|
|
76
|
+
return `[qwen] stream event ${message.event.type}`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=qwen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../src/runtime/qwen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { CodexOptions as CodexSdkRuntimeOptions, Input, ThreadEvent, ThreadOptions as CodexSdkThreadOptions } from "@openai/codex-sdk";
|
|
2
|
+
import type { Options as ClaudeSdkThreadOptions, SDKMessage as ClaudeSDKMessage } from "@anthropic-ai/claude-agent-sdk";
|
|
3
|
+
import type { QueryOptions as QwenSdkThreadOptions, SDKMessage as QwenSdkMessage } from "@qwen-code/sdk";
|
|
4
|
+
import type { Event as OpencodeEvent, OpencodeClient, ServerOptions as OpencodeSdkRuntimeOptions } from "@opencode-ai/sdk";
|
|
5
|
+
type ClaudeSdkRuntimeOptions = never;
|
|
6
|
+
type QwenSdkRuntimeOptions = never;
|
|
7
|
+
type OpencodeSdkThreadOptions = Parameters<OpencodeClient["session"]["create"]>[0];
|
|
8
|
+
export type RuntimeKind = "codex" | "claude" | "qwen" | "opencode";
|
|
9
|
+
export type RuntimeOptions<K extends RuntimeKind = RuntimeKind> = {
|
|
10
|
+
codex: CodexSdkRuntimeOptions;
|
|
11
|
+
claude: ClaudeSdkRuntimeOptions;
|
|
12
|
+
qwen: QwenSdkRuntimeOptions;
|
|
13
|
+
opencode: OpencodeSdkRuntimeOptions;
|
|
14
|
+
}[K];
|
|
15
|
+
export type ThreadOptions<K extends RuntimeKind = RuntimeKind> = {
|
|
16
|
+
codex: CodexSdkThreadOptions;
|
|
17
|
+
claude: ClaudeSdkThreadOptions;
|
|
18
|
+
qwen: QwenSdkThreadOptions;
|
|
19
|
+
opencode: OpencodeSdkThreadOptions;
|
|
20
|
+
}[K];
|
|
21
|
+
export type Record<K extends RuntimeKind = RuntimeKind> = {
|
|
22
|
+
codex: {
|
|
23
|
+
runtime: "codex";
|
|
24
|
+
input: Input;
|
|
25
|
+
} | {
|
|
26
|
+
runtime: "codex";
|
|
27
|
+
event: ThreadEvent;
|
|
28
|
+
};
|
|
29
|
+
claude: {
|
|
30
|
+
runtime: "claude";
|
|
31
|
+
message: ClaudeSDKMessage;
|
|
32
|
+
};
|
|
33
|
+
qwen: {
|
|
34
|
+
runtime: "qwen";
|
|
35
|
+
message: QwenSdkMessage;
|
|
36
|
+
};
|
|
37
|
+
opencode: {
|
|
38
|
+
runtime: "opencode";
|
|
39
|
+
request: string;
|
|
40
|
+
} | {
|
|
41
|
+
runtime: "opencode";
|
|
42
|
+
event: OpencodeEvent;
|
|
43
|
+
};
|
|
44
|
+
}[K];
|
|
45
|
+
export interface Runtime<K extends RuntimeKind = RuntimeKind> {
|
|
46
|
+
startThread(options: ThreadOptions<K>): Promise<Thread<K>>;
|
|
47
|
+
close(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export declare abstract class BaseRuntime<K extends RuntimeKind = RuntimeKind> implements Runtime<K> {
|
|
50
|
+
abstract startThread(options: ThreadOptions<K>): Promise<Thread<K>>;
|
|
51
|
+
close(): Promise<void>;
|
|
52
|
+
}
|
|
53
|
+
export type RecordCallback<K extends RuntimeKind = RuntimeKind> = (record: Record<K>) => void | Promise<void>;
|
|
54
|
+
export interface Thread<K extends RuntimeKind = RuntimeKind> {
|
|
55
|
+
recordToPrettyString(record: Record<K>): string;
|
|
56
|
+
runStreamed(prompt: string, onRecord?: RecordCallback<K>): Promise<string>;
|
|
57
|
+
}
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAsDA,MAAM,OAAgB,WAAW;IAG/B,KAAK;QACH,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "coding-agent-forge",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A small runtime wrapper for Codex, Claude, Qwen Code, and opencode.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20.19"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"agent-forge": "dist/cli.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"agent-forge.yaml",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
26
|
+
"build": "npm run clean && tsc -p tsconfig.json",
|
|
27
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
28
|
+
"lint": "eslint .",
|
|
29
|
+
"format": "prettier . --write",
|
|
30
|
+
"format:check": "prettier . --check",
|
|
31
|
+
"dev": "tsx src/cli.ts"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.154",
|
|
35
|
+
"@openai/codex-sdk": "^0.134.0",
|
|
36
|
+
"@opencode-ai/sdk": "^1.15.12",
|
|
37
|
+
"@qwen-code/sdk": "^0.1.7",
|
|
38
|
+
"opencode-ai": "^1.15.12",
|
|
39
|
+
"yaml": "^2.8.2"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@eslint/js": "^9.39.4",
|
|
43
|
+
"@types/node": "^24.10.1",
|
|
44
|
+
"eslint": "^9.39.4",
|
|
45
|
+
"prettier": "^3.8.3",
|
|
46
|
+
"tsx": "^4.21.0",
|
|
47
|
+
"typescript": "^6.0.3",
|
|
48
|
+
"typescript-eslint": "^8.60.0"
|
|
49
|
+
}
|
|
50
|
+
}
|