wardo 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/README.md +82 -0
- package/dist/agents/claude.d.ts +25 -0
- package/dist/agents/claude.d.ts.map +1 -0
- package/dist/agents/claude.js +83 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/codex.d.ts +26 -0
- package/dist/agents/codex.d.ts.map +1 -0
- package/dist/agents/codex.js +81 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +3 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +128 -0
- package/dist/config.js.map +1 -0
- package/dist/environment.d.ts +10 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +80 -0
- package/dist/environment.js.map +1 -0
- package/dist/events.d.ts +16 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +41 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.d.ts +42 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +95 -0
- package/dist/llm.js.map +1 -0
- package/dist/planner.d.ts +19 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +39 -0
- package/dist/planner.js.map +1 -0
- package/dist/renderer.d.ts +8 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +22 -0
- package/dist/renderer.js.map +1 -0
- package/dist/retry.d.ts +12 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +35 -0
- package/dist/retry.js.map +1 -0
- package/dist/review.d.ts +21 -0
- package/dist/review.d.ts.map +1 -0
- package/dist/review.js +47 -0
- package/dist/review.js.map +1 -0
- package/dist/skill-install.d.ts +7 -0
- package/dist/skill-install.d.ts.map +1 -0
- package/dist/skill-install.js +25 -0
- package/dist/skill-install.js.map +1 -0
- package/dist/store.d.ts +14 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +65 -0
- package/dist/store.js.map +1 -0
- package/dist/task-agent.d.ts +22 -0
- package/dist/task-agent.d.ts.map +1 -0
- package/dist/task-agent.js +160 -0
- package/dist/task-agent.js.map +1 -0
- package/dist/types.d.ts +115 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow.d.ts +33 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +212 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +40 -0
- package/skill/SKILL.md +65 -0
- package/templates/workflow.ts +9 -0
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# wardo
|
|
2
|
+
|
|
3
|
+
`wardo` turns a complex prompt into a durable TypeScript workflow that can run Codex and Claude Code agents. It stores the plan, task state, events, attempt results and judge decisions in the workspace `.wardo` directory.
|
|
4
|
+
|
|
5
|
+
## Install and build
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run check
|
|
10
|
+
npm run build
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Node.js 20 or newer is required. No Python runtime is used.
|
|
14
|
+
|
|
15
|
+
Install the skill into the detected host with:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm run build
|
|
19
|
+
node dist/cli.js install-skill
|
|
20
|
+
# or choose one explicitly:
|
|
21
|
+
node dist/cli.js install-skill --agent codex
|
|
22
|
+
node dist/cli.js install-skill --agent claude
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
At runtime Wardo records the installed agents, detected active host, versions and detection source in `.wardo/workflow.json`. Automatic tasks use that active host first. Set `WARDO_ACTIVE_AGENT=codex` or `WARDO_ACTIVE_AGENT=claude` when the parent environment does not expose a host marker.
|
|
26
|
+
|
|
27
|
+
## Configure providers
|
|
28
|
+
|
|
29
|
+
Create `~/.wardo/config.yml`:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
maxConcurrency: 3
|
|
33
|
+
modelPreferences:
|
|
34
|
+
- anthropic:claude-haiku-4-5
|
|
35
|
+
- openai:gpt-5-mini
|
|
36
|
+
providers:
|
|
37
|
+
openai:
|
|
38
|
+
type: openai
|
|
39
|
+
apiKey: ${OPENAI_API_KEY}
|
|
40
|
+
baseUrl: ${OPENAI_BASE_URL}
|
|
41
|
+
models: [gpt-5-mini]
|
|
42
|
+
anthropic:
|
|
43
|
+
type: anthropic
|
|
44
|
+
apiKey: ${ANTHROPIC_API_KEY}
|
|
45
|
+
baseUrl: ${ANTHROPIC_BASE_URL}
|
|
46
|
+
models: [claude-haiku-4-5]
|
|
47
|
+
local:
|
|
48
|
+
type: openai-compatible
|
|
49
|
+
apiKey: ${LOCAL_LLM_API_KEY}
|
|
50
|
+
baseUrl: ${LOCAL_LLM_BASE_URL}
|
|
51
|
+
models: [local-fast]
|
|
52
|
+
retry:
|
|
53
|
+
delaysMs: [60000, 180000, 480000, 1200000]
|
|
54
|
+
maxAttempts: 5
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Environment variables override file values. Supported overrides include `WARDO_MAX_CONCURRENCY`, `WARDO_MODEL_PREFERENCES`, `WARDO_PROVIDER_<NAME>_API_KEY`, `WARDO_PROVIDER_<NAME>_BASE_URL`, `WARDO_PROVIDER_<NAME>_MODELS`, `OPENAI_API_KEY`, `OPENAI_BASE_URL`, `ANTHROPIC_API_KEY`, and `ANTHROPIC_BASE_URL`.
|
|
58
|
+
|
|
59
|
+
## Run a workflow
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
import { execute } from "wardo";
|
|
63
|
+
|
|
64
|
+
await execute({
|
|
65
|
+
prompt: "检查项目中的认证错误,修复并运行测试",
|
|
66
|
+
workspace: process.cwd(),
|
|
67
|
+
maxConcurrency: 3,
|
|
68
|
+
resume: true,
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
需要让 planner 自动拆分任务时加入 `plan: "auto"`:
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
await execute({ prompt: "完成一个需要分析、实现和测试的复杂改造", plan: "auto", resume: true });
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
For a stable multi-step plan, use `defineWorkflow`, `defineTask`, and `runWorkflow` from the package. Use `reviewScript` at a checkpoint when the workflow script needs an agent review and update.
|
|
79
|
+
|
|
80
|
+
The CLI supports `wardo run`, `wardo run --plan auto`, `wardo resume`, `wardo status`, `wardo env`, and `wardo fork <destination>`. Pressing `Ctrl-C` persists the current task as paused; `wardo resume` continues from the saved `.wardo` state.
|
|
81
|
+
|
|
82
|
+
The current implementation includes planner-driven decomposition, a durable scheduler, provider adapters, judge requests, retry classification, event storage, resume loading, configuration loading and the `reviewScript` checkpoint helper. Interactive pause commands and automatic review triggers are the next implementation slice.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentEvent, AgentInput, AgentSession } from "../types.js";
|
|
2
|
+
export interface ClaudeAdapterOptions {
|
|
3
|
+
model?: string;
|
|
4
|
+
fallbackModel?: string;
|
|
5
|
+
permissionMode?: string;
|
|
6
|
+
additionalDirectories?: string[];
|
|
7
|
+
maxTurns?: number;
|
|
8
|
+
maxBudgetUsd?: number;
|
|
9
|
+
allowDangerouslySkipPermissions?: boolean;
|
|
10
|
+
env?: Record<string, string | undefined>;
|
|
11
|
+
}
|
|
12
|
+
export declare class ClaudeAdapter implements AgentAdapter {
|
|
13
|
+
private readonly options;
|
|
14
|
+
readonly provider: "claude";
|
|
15
|
+
private readonly queries;
|
|
16
|
+
constructor(options?: ClaudeAdapterOptions);
|
|
17
|
+
start(input: AgentInput & {
|
|
18
|
+
cwd: string;
|
|
19
|
+
additionalDirectories?: string[];
|
|
20
|
+
}): Promise<AgentSession>;
|
|
21
|
+
resume(session: AgentSession, _input: AgentInput): Promise<AgentSession>;
|
|
22
|
+
stream(session: AgentSession, input: AgentInput): AsyncIterable<AgentEvent>;
|
|
23
|
+
cancel(session: AgentSession, reason?: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMtF,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AAID,qBAAa,aAAc,YAAW,YAAY;IAIpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;gBAE7B,OAAO,GAAE,oBAAyB;IAEzD,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAInG,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAIvE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;IAkD5E,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
function id() {
|
|
3
|
+
return `claude-${crypto.randomUUID()}`;
|
|
4
|
+
}
|
|
5
|
+
export class ClaudeAdapter {
|
|
6
|
+
options;
|
|
7
|
+
provider = "claude";
|
|
8
|
+
queries = new Map();
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
async start(input) {
|
|
13
|
+
return { provider: "claude", sessionId: id(), cwd: input.cwd, ...(input.model ? { model: input.model } : {}) };
|
|
14
|
+
}
|
|
15
|
+
async resume(session, _input) {
|
|
16
|
+
return session;
|
|
17
|
+
}
|
|
18
|
+
async *stream(session, input) {
|
|
19
|
+
const abortController = new AbortController();
|
|
20
|
+
const abort = () => abortController.abort(input.signal?.reason);
|
|
21
|
+
input.signal?.addEventListener("abort", abort, { once: true });
|
|
22
|
+
const options = {
|
|
23
|
+
cwd: session.cwd,
|
|
24
|
+
additionalDirectories: this.options.additionalDirectories,
|
|
25
|
+
model: input.model ?? session.model ?? this.options.model,
|
|
26
|
+
fallbackModel: this.options.fallbackModel,
|
|
27
|
+
permissionMode: this.options.permissionMode,
|
|
28
|
+
maxTurns: this.options.maxTurns,
|
|
29
|
+
maxBudgetUsd: this.options.maxBudgetUsd,
|
|
30
|
+
allowDangerouslySkipPermissions: this.options.allowDangerouslySkipPermissions,
|
|
31
|
+
env: this.options.env,
|
|
32
|
+
abortController,
|
|
33
|
+
includePartialMessages: true,
|
|
34
|
+
...(session.sessionId.startsWith("claude-") ? {} : { resume: session.sessionId }),
|
|
35
|
+
...(input.outputSchema ? { outputFormat: { type: "json_schema", schema: input.outputSchema } } : {}),
|
|
36
|
+
};
|
|
37
|
+
const active = query({ prompt: input.prompt, options: options });
|
|
38
|
+
this.queries.set(session.sessionId, active);
|
|
39
|
+
try {
|
|
40
|
+
for await (const message of active) {
|
|
41
|
+
const rawType = String(message.type ?? message.subtype ?? "status");
|
|
42
|
+
const subtype = typeof message.subtype === "string" ? message.subtype : "";
|
|
43
|
+
const content = message.message && typeof message.message === "object" ? message.message.content : undefined;
|
|
44
|
+
const text = typeof message.text === "string"
|
|
45
|
+
? message.text
|
|
46
|
+
: Array.isArray(content)
|
|
47
|
+
? content.filter((part) => !!part && typeof part === "object").map((part) => typeof part.text === "string" ? part.text : "").join("") || undefined
|
|
48
|
+
: typeof message.result === "string" ? message.result : undefined;
|
|
49
|
+
if (rawType === "system" && subtype === "init" && typeof message.session_id === "string")
|
|
50
|
+
session.sessionId = message.session_id;
|
|
51
|
+
yield {
|
|
52
|
+
provider: "claude",
|
|
53
|
+
rawType,
|
|
54
|
+
type: rawType === "result" || subtype.startsWith("error") ? "turn_completed"
|
|
55
|
+
: rawType === "assistant" || rawType === "stream_event" ? "text_delta"
|
|
56
|
+
: rawType.includes("tool") || rawType.includes("task") ? "tool_call"
|
|
57
|
+
: rawType === "system" && subtype === "init" ? "session_started" : "status",
|
|
58
|
+
...(text ? { text } : {}),
|
|
59
|
+
payload: message,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
input.signal?.removeEventListener("abort", abort);
|
|
65
|
+
this.queries.delete(session.sessionId);
|
|
66
|
+
await active.close?.();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async cancel(session, reason) {
|
|
70
|
+
const active = this.queries.get(session.sessionId);
|
|
71
|
+
if (active?.interrupt)
|
|
72
|
+
await active.interrupt();
|
|
73
|
+
await active?.close?.();
|
|
74
|
+
if (!active)
|
|
75
|
+
return;
|
|
76
|
+
throwIfCancelled(reason);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function throwIfCancelled(reason) {
|
|
80
|
+
if (reason)
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentEvent, AgentInput, AgentSession } from "../types.js";
|
|
2
|
+
export interface CodexAdapterOptions {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
sandboxMode?: "read-only" | "workspace-write" | "danger-full-access";
|
|
7
|
+
approvalPolicy?: "never" | "on-request" | "on-failure" | "untrusted";
|
|
8
|
+
additionalDirectories?: string[];
|
|
9
|
+
skipGitRepoCheck?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class CodexAdapter implements AgentAdapter {
|
|
12
|
+
private readonly options;
|
|
13
|
+
readonly provider: "codex";
|
|
14
|
+
private readonly client;
|
|
15
|
+
private readonly threads;
|
|
16
|
+
private readonly controllers;
|
|
17
|
+
constructor(options?: CodexAdapterOptions);
|
|
18
|
+
start(input: AgentInput & {
|
|
19
|
+
cwd: string;
|
|
20
|
+
additionalDirectories?: string[];
|
|
21
|
+
}): Promise<AgentSession>;
|
|
22
|
+
resume(session: AgentSession, input: AgentInput): Promise<AgentSession>;
|
|
23
|
+
stream(session: AgentSession, input: AgentInput): AsyncIterable<AgentEvent>;
|
|
24
|
+
cancel(session: AgentSession, reason?: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMtF,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,WAAW,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;IACrE,cAAc,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;IACrE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,qBAAa,YAAa,YAAW,YAAY;IAMnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,QAAQ,CAAC,QAAQ,EAAG,OAAO,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;gBAErC,OAAO,GAAE,mBAAwB;IAOxD,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAcnG,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAMtE,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC;IAwC5E,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Codex } from "@openai/codex-sdk";
|
|
2
|
+
function id() {
|
|
3
|
+
return `codex-${crypto.randomUUID()}`;
|
|
4
|
+
}
|
|
5
|
+
export class CodexAdapter {
|
|
6
|
+
options;
|
|
7
|
+
provider = "codex";
|
|
8
|
+
client;
|
|
9
|
+
threads = new Map();
|
|
10
|
+
controllers = new Map();
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
this.client = new Codex({
|
|
14
|
+
...(options.apiKey ? { apiKey: options.apiKey } : {}),
|
|
15
|
+
...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async start(input) {
|
|
19
|
+
const session = { provider: "codex", sessionId: id(), cwd: input.cwd, ...(input.model ? { model: input.model } : {}) };
|
|
20
|
+
const thread = this.client.startThread({
|
|
21
|
+
...(input.model ?? this.options.model ? { model: input.model ?? this.options.model } : {}),
|
|
22
|
+
workingDirectory: input.cwd,
|
|
23
|
+
sandboxMode: this.options.sandboxMode ?? "workspace-write",
|
|
24
|
+
approvalPolicy: this.options.approvalPolicy ?? "on-request",
|
|
25
|
+
additionalDirectories: input.additionalDirectories ?? this.options.additionalDirectories,
|
|
26
|
+
skipGitRepoCheck: this.options.skipGitRepoCheck ?? false,
|
|
27
|
+
});
|
|
28
|
+
this.threads.set(session.sessionId, thread);
|
|
29
|
+
return session;
|
|
30
|
+
}
|
|
31
|
+
async resume(session, input) {
|
|
32
|
+
const thread = this.client.resumeThread(session.sessionId);
|
|
33
|
+
this.threads.set(session.sessionId, thread);
|
|
34
|
+
return session;
|
|
35
|
+
}
|
|
36
|
+
async *stream(session, input) {
|
|
37
|
+
const thread = this.threads.get(session.sessionId);
|
|
38
|
+
if (!thread)
|
|
39
|
+
throw new Error(`Unknown Codex session: ${session.sessionId}`);
|
|
40
|
+
const controller = new AbortController();
|
|
41
|
+
const abort = () => controller.abort(input.signal?.reason);
|
|
42
|
+
input.signal?.addEventListener("abort", abort, { once: true });
|
|
43
|
+
this.controllers.set(session.sessionId, controller);
|
|
44
|
+
try {
|
|
45
|
+
const streamed = await thread.runStreamed(input.prompt, { signal: controller.signal, ...(input.outputSchema ? { outputSchema: input.outputSchema } : {}) });
|
|
46
|
+
for await (const event of streamed.events) {
|
|
47
|
+
const raw = event;
|
|
48
|
+
if (raw.type === "thread.started" && typeof raw.thread_id === "string") {
|
|
49
|
+
const old = session.sessionId;
|
|
50
|
+
session.sessionId = raw.thread_id;
|
|
51
|
+
this.threads.set(session.sessionId, thread);
|
|
52
|
+
this.threads.delete(old);
|
|
53
|
+
}
|
|
54
|
+
const type = String(raw.type ?? "status");
|
|
55
|
+
const item = raw.item;
|
|
56
|
+
const text = typeof item?.text === "string" ? item.text : typeof raw.message === "string" ? raw.message : undefined;
|
|
57
|
+
yield {
|
|
58
|
+
provider: "codex",
|
|
59
|
+
rawType: type,
|
|
60
|
+
type: type.includes("error") || type.includes("failed") ? "error"
|
|
61
|
+
: type === "turn.completed" ? "turn_completed"
|
|
62
|
+
: type === "turn.started" ? "turn_started"
|
|
63
|
+
: type.includes("file_change") ? "file_change"
|
|
64
|
+
: item?.type === "reasoning" ? "reasoning"
|
|
65
|
+
: item?.type === "command_execution" || item?.type === "mcp_tool_call" ? "tool_call"
|
|
66
|
+
: text ? "text_delta" : "status",
|
|
67
|
+
...(text ? { text } : {}),
|
|
68
|
+
payload: event,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
input.signal?.removeEventListener("abort", abort);
|
|
74
|
+
this.controllers.delete(session.sessionId);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async cancel(session, reason) {
|
|
78
|
+
this.controllers.get(session.sessionId)?.abort(new Error(reason ?? "Cancelled"));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
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,80 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { execute, forkWorkflow, runWorkflow } from "./workflow.js";
|
|
5
|
+
import { installSkill } from "./skill-install.js";
|
|
6
|
+
import { detectAgentEnvironment } from "./environment.js";
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
const command = args[0];
|
|
9
|
+
if (command === "run") {
|
|
10
|
+
const autoPlan = args.includes("--plan=auto") || args.includes("--plan") && args[args.indexOf("--plan") + 1] === "auto";
|
|
11
|
+
const stream = !args.includes("--no-stream");
|
|
12
|
+
const prompt = args.filter((arg, index) => !arg.startsWith("--") && args[index - 1] !== "--plan").slice(1).join(" ").trim();
|
|
13
|
+
if (!prompt) {
|
|
14
|
+
console.error("Usage: wardo run <prompt>");
|
|
15
|
+
process.exitCode = 2;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
process.once("SIGINT", () => controller.abort(new Error("Paused by SIGINT")));
|
|
20
|
+
await execute({ prompt, workspace: process.cwd(), resume: true, plan: autoPlan ? "auto" : "single", stream, signal: controller.signal });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (command === "resume") {
|
|
24
|
+
const prompt = await readFile(join(process.cwd(), ".wardo/prompt.md"), "utf8");
|
|
25
|
+
const controller = new AbortController();
|
|
26
|
+
process.once("SIGINT", () => controller.abort(new Error("Paused by SIGINT")));
|
|
27
|
+
let plan;
|
|
28
|
+
try {
|
|
29
|
+
plan = JSON.parse(await readFile(join(process.cwd(), ".wardo/plan.json"), "utf8"));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
plan = undefined;
|
|
33
|
+
}
|
|
34
|
+
if (Array.isArray(plan?.tasks)) {
|
|
35
|
+
await runWorkflow({ id: "resumed", objective: plan?.objective ?? prompt, tasks: plan.tasks }, { workspace: process.cwd(), resume: true, signal: controller.signal });
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
await execute({ prompt, workspace: process.cwd(), resume: true, signal: controller.signal });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (command === "status") {
|
|
42
|
+
try {
|
|
43
|
+
console.log(await readFile(join(process.cwd(), ".wardo/state.json"), "utf8"));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
console.error("No .wardo run state found");
|
|
47
|
+
process.exitCode = 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (command === "fork") {
|
|
51
|
+
const destination = args[1];
|
|
52
|
+
if (!destination) {
|
|
53
|
+
console.error("Usage: wardo fork <destination>");
|
|
54
|
+
process.exitCode = 2;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log(await forkWorkflow(process.cwd(), destination));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (command === "install-skill") {
|
|
61
|
+
const requested = args[1] === "--agent" ? args[2] : undefined;
|
|
62
|
+
if (requested !== undefined && requested !== "codex" && requested !== "claude") {
|
|
63
|
+
console.error("--agent must be codex or claude");
|
|
64
|
+
process.exitCode = 2;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
for (const result of await installSkill(requested))
|
|
68
|
+
console.log(`${result.agent}: ${result.target}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (command === "env") {
|
|
72
|
+
console.log(JSON.stringify(await detectAgentEnvironment(), null, 2));
|
|
73
|
+
}
|
|
74
|
+
else if (command === "config") {
|
|
75
|
+
console.log("Wardo config: ~/.wardo/config.yml");
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.log("Usage: wardo run [--plan auto] <prompt> | wardo resume | wardo status | wardo fork <destination> | wardo env | wardo install-skill");
|
|
79
|
+
}
|
|
80
|
+
//# 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":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { WardoConfig } from "./types.js";
|
|
2
|
+
export interface LoadConfigOptions {
|
|
3
|
+
path?: string;
|
|
4
|
+
env?: NodeJS.ProcessEnv;
|
|
5
|
+
workspace?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function defaultConfig(): WardoConfig;
|
|
8
|
+
export declare function loadConfig(options?: LoadConfigOptions): Promise<WardoConfig>;
|
|
9
|
+
export declare function configFilePath(): string;
|
|
10
|
+
export declare function configDirectory(): string;
|
|
11
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9D,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoDD,wBAAgB,aAAa,IAAI,WAAW,CAW3C;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqDtF;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { parse } from "yaml";
|
|
5
|
+
const defaultRetry = [60_000, 180_000, 480_000, 1_200_000];
|
|
6
|
+
function expand(value, env) {
|
|
7
|
+
if (typeof value === "string") {
|
|
8
|
+
return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_, key) => env[key] ?? "");
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return value.map((item) => expand(item, env));
|
|
12
|
+
if (value && typeof value === "object") {
|
|
13
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, expand(v, env)]));
|
|
14
|
+
}
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
function asStringArray(value) {
|
|
18
|
+
if (!Array.isArray(value))
|
|
19
|
+
return [];
|
|
20
|
+
return value.filter((item) => typeof item === "string" && item.length > 0);
|
|
21
|
+
}
|
|
22
|
+
function asNumberArray(value) {
|
|
23
|
+
if (!Array.isArray(value))
|
|
24
|
+
return [];
|
|
25
|
+
return value.map((item) => typeof item === "number" || typeof item === "string" ? Number(item) : NaN).filter(Number.isFinite);
|
|
26
|
+
}
|
|
27
|
+
function normalizeProvider(value) {
|
|
28
|
+
const raw = (value && typeof value === "object" ? value : {});
|
|
29
|
+
const type = raw.type === "anthropic" || raw.type === "openai-compatible" ? raw.type : "openai";
|
|
30
|
+
const headers = raw.headers && typeof raw.headers === "object"
|
|
31
|
+
? Object.fromEntries(Object.entries(raw.headers).filter((entry) => typeof entry[1] === "string"))
|
|
32
|
+
: undefined;
|
|
33
|
+
return {
|
|
34
|
+
type,
|
|
35
|
+
...(typeof raw.apiKey === "string" && raw.apiKey ? { apiKey: raw.apiKey } : {}),
|
|
36
|
+
...(typeof raw.baseUrl === "string" && raw.baseUrl ? { baseUrl: raw.baseUrl } : {}),
|
|
37
|
+
...(asStringArray(raw.models).length ? { models: asStringArray(raw.models) } : {}),
|
|
38
|
+
...(headers ? { headers } : {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function envProvider(env, name, type) {
|
|
42
|
+
const upper = name.toUpperCase().replace(/[^A-Z0-9]/g, "_");
|
|
43
|
+
const standard = name === "openai" ? "OPENAI" : name === "anthropic" ? "ANTHROPIC" : undefined;
|
|
44
|
+
const apiKey = env[`WARDO_PROVIDER_${upper}_API_KEY`] ?? (standard ? env[`${standard}_API_KEY`] : undefined);
|
|
45
|
+
const baseUrl = env[`WARDO_PROVIDER_${upper}_BASE_URL`] ?? (standard ? env[`${standard}_BASE_URL`] : undefined);
|
|
46
|
+
const models = (env[`WARDO_PROVIDER_${upper}_MODELS`] ?? "").split(",").map((x) => x.trim()).filter(Boolean);
|
|
47
|
+
return {
|
|
48
|
+
type,
|
|
49
|
+
...(apiKey ? { apiKey } : {}),
|
|
50
|
+
...(baseUrl ? { baseUrl } : {}),
|
|
51
|
+
...(models.length ? { models } : {}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function defaultConfig() {
|
|
55
|
+
return {
|
|
56
|
+
maxConcurrency: 3,
|
|
57
|
+
retry: { delaysMs: [...defaultRetry], maxAttempts: 5 },
|
|
58
|
+
providers: {
|
|
59
|
+
openai: { type: "openai" },
|
|
60
|
+
anthropic: { type: "anthropic" },
|
|
61
|
+
},
|
|
62
|
+
modelPreferences: [],
|
|
63
|
+
agentDefaults: {},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export async function loadConfig(options = {}) {
|
|
67
|
+
const env = options.env ?? process.env;
|
|
68
|
+
const configPath = options.path
|
|
69
|
+
? resolve(options.path)
|
|
70
|
+
: env.WARDO_CONFIG
|
|
71
|
+
? resolve(env.WARDO_CONFIG)
|
|
72
|
+
: join(env.WARDO_HOME ? resolve(env.WARDO_HOME) : join(homedir(), ".wardo"), "config.yml");
|
|
73
|
+
let fileConfig = {};
|
|
74
|
+
try {
|
|
75
|
+
const text = await readFile(configPath, "utf8");
|
|
76
|
+
const parsed = parse(text);
|
|
77
|
+
if (parsed && typeof parsed === "object")
|
|
78
|
+
fileConfig = expand(parsed, env);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
|
|
82
|
+
if (code !== "ENOENT")
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
const base = defaultConfig();
|
|
86
|
+
const rawProviders = fileConfig.providers && typeof fileConfig.providers === "object"
|
|
87
|
+
? fileConfig.providers
|
|
88
|
+
: {};
|
|
89
|
+
const providers = {};
|
|
90
|
+
for (const [name, value] of Object.entries(rawProviders))
|
|
91
|
+
providers[name] = normalizeProvider(value);
|
|
92
|
+
for (const [name, type] of [["openai", "openai"], ["anthropic", "anthropic"]]) {
|
|
93
|
+
providers[name] = {
|
|
94
|
+
...providers[name],
|
|
95
|
+
...envProvider(env, name, type),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const retryRaw = fileConfig.retry && typeof fileConfig.retry === "object" ? fileConfig.retry : {};
|
|
99
|
+
const delays = asNumberArray(retryRaw.delaysMs);
|
|
100
|
+
const maxConcurrency = Number(env.WARDO_MAX_CONCURRENCY ?? fileConfig.maxConcurrency ?? base.maxConcurrency);
|
|
101
|
+
const preferences = (env.WARDO_MODEL_PREFERENCES ?? asStringArray(fileConfig.modelPreferences).join(","))
|
|
102
|
+
.split(",").map((x) => x.trim()).filter(Boolean);
|
|
103
|
+
const workspace = options.workspace ? resolve(options.workspace) : typeof fileConfig.workspace === "string" ? resolve(fileConfig.workspace) : undefined;
|
|
104
|
+
return {
|
|
105
|
+
workspace,
|
|
106
|
+
maxConcurrency: Number.isFinite(maxConcurrency) && maxConcurrency > 0 ? Math.floor(maxConcurrency) : 3,
|
|
107
|
+
...(fileConfig.providerConcurrency && typeof fileConfig.providerConcurrency === "object"
|
|
108
|
+
? { providerConcurrency: fileConfig.providerConcurrency }
|
|
109
|
+
: {}),
|
|
110
|
+
retry: {
|
|
111
|
+
delaysMs: delays.length ? delays : [...base.retry.delaysMs],
|
|
112
|
+
maxAttempts: Number(retryRaw.maxAttempts ?? base.retry.maxAttempts),
|
|
113
|
+
},
|
|
114
|
+
providers: Object.keys(providers).length ? providers : base.providers,
|
|
115
|
+
modelPreferences: preferences,
|
|
116
|
+
agentDefaults: (fileConfig.agentDefaults && typeof fileConfig.agentDefaults === "object"
|
|
117
|
+
? fileConfig.agentDefaults
|
|
118
|
+
: {}),
|
|
119
|
+
...(fileConfig.judge && typeof fileConfig.judge === "object" ? { judge: fileConfig.judge } : {}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function configFilePath() {
|
|
123
|
+
return join(homedir(), ".wardo", "config.yml");
|
|
124
|
+
}
|
|
125
|
+
export function configDirectory() {
|
|
126
|
+
return dirname(configFilePath());
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAG7B,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AAQ3D,SAAS,MAAM,CAAC,KAAc,EAAE,GAAsB;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,iCAAiC,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACxE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChI,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAC;IACzF,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChG,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC5D,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC5H,CAAC,CAAC,SAAS,CAAC;IACd,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAsB,EAAE,IAAY,EAAE,IAA4B;IACrF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,KAAK,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7G,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,KAAK,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAChH,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7G,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;QACtD,SAAS,EAAE;YACT,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;SACjC;QACD,gBAAgB,EAAE,EAAE;QACpB,aAAa,EAAE,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAA6B,EAAE;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI;QAC7B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,GAAG,CAAC,YAAY;YAChB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;IAC/F,IAAI,UAAU,GAA4B,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAA4B,CAAC;IACxG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5F,IAAI,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ;QACnF,CAAC,CAAC,UAAU,CAAC,SAAoC;QACjD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,SAAS,GAAmC,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACrG,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAU,EAAE,CAAC;QACvF,SAAS,CAAC,IAAI,CAAC,GAAG;YAChB,GAAG,SAAS,CAAC,IAAI,CAAC;YAClB,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7H,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,qBAAqB,IAAI,UAAU,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7G,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,uBAAuB,IAAI,aAAa,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACtG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxJ,OAAO;QACL,SAAS;QACT,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,GAAG,CAAC,UAAU,CAAC,mBAAmB,IAAI,OAAO,UAAU,CAAC,mBAAmB,KAAK,QAAQ;YACtF,CAAC,CAAC,EAAE,mBAAmB,EAAE,UAAU,CAAC,mBAAyD,EAAE;YAC/F,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC3D,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;SACpE;QACD,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;QACrE,gBAAgB,EAAE,WAAW;QAC7B,aAAa,EAAE,CAAC,UAAU,CAAC,aAAa,IAAI,OAAO,UAAU,CAAC,aAAa,KAAK,QAAQ;YACtF,CAAC,CAAC,UAAU,CAAC,aAA6C;YAC1D,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAA6B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type AgentName = "codex" | "claude";
|
|
2
|
+
export interface AgentEnvironment {
|
|
3
|
+
active?: AgentName;
|
|
4
|
+
installed: Record<AgentName, boolean>;
|
|
5
|
+
versions: Partial<Record<AgentName, string>>;
|
|
6
|
+
detectedBy: string[];
|
|
7
|
+
skillDirectory?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function detectAgentEnvironment(env?: NodeJS.ProcessEnv): Promise<AgentEnvironment>;
|
|
10
|
+
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAgCD,wBAAsB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqC5G"}
|