@hham21/circe 0.4.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 +185 -0
- package/dist/agent.d.ts +73 -0
- package/dist/agent.js +334 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli/agents-cmd.d.ts +2 -0
- package/dist/cli/agents-cmd.js +77 -0
- package/dist/cli/agents-cmd.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +20 -0
- package/dist/cli/output.js +136 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/run.d.ts +10 -0
- package/dist/cli/run.js +90 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/skills-cmd.d.ts +2 -0
- package/dist/cli/skills-cmd.js +95 -0
- package/dist/cli/skills-cmd.js.map +1 -0
- package/dist/cli/workflows-cmd.d.ts +2 -0
- package/dist/cli/workflows-cmd.js +61 -0
- package/dist/cli/workflows-cmd.js.map +1 -0
- package/dist/context.d.ts +8 -0
- package/dist/context.js +23 -0
- package/dist/context.js.map +1 -0
- package/dist/events.d.ts +134 -0
- package/dist/events.js +127 -0
- package/dist/events.js.map +1 -0
- package/dist/handoff.d.ts +153 -0
- package/dist/handoff.js +42 -0
- package/dist/handoff.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestration/contract.d.ts +27 -0
- package/dist/orchestration/contract.js +104 -0
- package/dist/orchestration/contract.js.map +1 -0
- package/dist/orchestration/index.d.ts +10 -0
- package/dist/orchestration/index.js +6 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/loop.d.ts +25 -0
- package/dist/orchestration/loop.js +81 -0
- package/dist/orchestration/loop.js.map +1 -0
- package/dist/orchestration/parallel.d.ts +27 -0
- package/dist/orchestration/parallel.js +78 -0
- package/dist/orchestration/parallel.js.map +1 -0
- package/dist/orchestration/pipeline.d.ts +23 -0
- package/dist/orchestration/pipeline.js +100 -0
- package/dist/orchestration/pipeline.js.map +1 -0
- package/dist/orchestration/sprint.d.ts +21 -0
- package/dist/orchestration/sprint.js +56 -0
- package/dist/orchestration/sprint.js.map +1 -0
- package/dist/presets/frontend.d.ts +8 -0
- package/dist/presets/frontend.js +113 -0
- package/dist/presets/frontend.js.map +1 -0
- package/dist/presets/fullstack.d.ts +9 -0
- package/dist/presets/fullstack.js +118 -0
- package/dist/presets/fullstack.js.map +1 -0
- package/dist/presets/index.d.ts +2 -0
- package/dist/presets/index.js +3 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/session/index.d.ts +1 -0
- package/dist/session/index.js +2 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +17 -0
- package/dist/session/manager.js +50 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/tools/custom.d.ts +5 -0
- package/dist/tools/custom.js +7 -0
- package/dist/tools/custom.js.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/skills.d.ts +18 -0
- package/dist/tools/skills.js +99 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +24 -0
- package/dist/utils.js +85 -0
- package/dist/utils.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Circe
|
|
2
|
+
|
|
3
|
+
GAN-style multi-agent framework that turns prompts into full-stack applications.
|
|
4
|
+
|
|
5
|
+
Inspired by Anthropic's [Harness Design for Long-Running Application Development](https://www.anthropic.com/engineering/harness-design-long-running-apps) — a Planner, Generator, and Evaluator work together in an adversarial loop to build, test, and refine applications autonomously.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git clone https://github.com/hham21/circe.git
|
|
11
|
+
cd circe
|
|
12
|
+
npm install
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Requires Node.js 22+ and [Claude Code](https://claude.ai/code) authenticated via OAuth or API key:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Run examples with `npx tsx` (see [examples/README.md](examples/README.md) for the full list):
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx tsx examples/01-single-agent.ts
|
|
25
|
+
npx tsx examples/06-compose.ts # the money shot — nested primitives
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { Pipeline, Loop, agent } from "circe";
|
|
32
|
+
|
|
33
|
+
const planner = agent({
|
|
34
|
+
name: "planner",
|
|
35
|
+
prompt: "Expand the user prompt into a detailed product spec.",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const generator = agent({
|
|
39
|
+
name: "generator",
|
|
40
|
+
prompt: "Build the app based on the spec or QA feedback.",
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const evaluator = agent({
|
|
44
|
+
name: "evaluator",
|
|
45
|
+
prompt: "Test the app with Playwright. FAIL with feedback if issues found.",
|
|
46
|
+
tools: ["Read", "Bash", "Glob", "Grep"],
|
|
47
|
+
skills: ["qa", "browse"],
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const app = new Pipeline(
|
|
51
|
+
planner,
|
|
52
|
+
new Loop(generator, evaluator, { maxRounds: 3, stopWhen: (r: any) => r.passed }),
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
await app.run("Build a retro game maker");
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Concepts
|
|
59
|
+
|
|
60
|
+
### Agents
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
import { Agent, agent } from "circe";
|
|
64
|
+
|
|
65
|
+
// Factory function (simple)
|
|
66
|
+
const reviewer = agent({
|
|
67
|
+
name: "reviewer",
|
|
68
|
+
prompt: "Review code for bugs.",
|
|
69
|
+
tools: ["Read", "Grep"],
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Class (fine-grained control)
|
|
73
|
+
const evaluator = new Agent({
|
|
74
|
+
name: "evaluator",
|
|
75
|
+
prompt: "Strict QA engineer.",
|
|
76
|
+
tools: ["Read", "Bash"],
|
|
77
|
+
skills: ["qa"],
|
|
78
|
+
contextStrategy: "reset",
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
All Claude Agent SDK built-in tools (Read, Write, Edit, Bash, Glob, Grep, WebSearch, WebFetch, Agent) are available by default. Restrict with `tools`.
|
|
83
|
+
|
|
84
|
+
### Orchestrators
|
|
85
|
+
|
|
86
|
+
Five composable building blocks, all generic: `Runnable<TIn, TOut>`.
|
|
87
|
+
|
|
88
|
+
| Orchestrator | Purpose | Example |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `Pipeline` | Sequential execution | `new Pipeline(planner, builder)` or `pipe(a, b, c)` |
|
|
91
|
+
| `Loop` | Repeat until condition | `new Loop(gen, eval, { maxRounds: 3, stopWhen: ... })` |
|
|
92
|
+
| `Parallel` | Concurrent execution | `new Parallel(frontend, backend)` |
|
|
93
|
+
| `Contract` | Pre-build negotiation | `new Contract(proposer, reviewer)` |
|
|
94
|
+
| `Sprint` | Feature decomposition | `new Sprint(runner)` |
|
|
95
|
+
|
|
96
|
+
Loop and Contract return **producer output on success** (the content, not the evaluation). Access evaluation via `.lastEvaluatorResult`. All orchestrators expose `.lastMetrics` for cost tracking.
|
|
97
|
+
|
|
98
|
+
Compose freely:
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { pipe } from "circe";
|
|
102
|
+
|
|
103
|
+
// Type-safe pipeline — compiler checks that output types chain correctly
|
|
104
|
+
pipe(planner, new Loop(generator, evaluator, { maxRounds: 3 }));
|
|
105
|
+
|
|
106
|
+
// With negotiation
|
|
107
|
+
pipe(planner, new Contract(proposer, reviewer), new Loop(generator, evaluator));
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Tools
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import { tool } from "circe";
|
|
114
|
+
|
|
115
|
+
const searchNpm = tool(function searchNpm(query: string): string {
|
|
116
|
+
// Search npm packages
|
|
117
|
+
return `results for ${query}`;
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
MCP servers are supported via the `mcpServers` parameter on agents.
|
|
122
|
+
|
|
123
|
+
### Skills
|
|
124
|
+
|
|
125
|
+
Skills are on-demand prompt templates. Agents load them when needed:
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
const evaluator = agent({
|
|
129
|
+
name: "evaluator",
|
|
130
|
+
prompt: "QA engineer.",
|
|
131
|
+
skills: ["qa", "browse"],
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The agent sees a skill list in its prompt and calls `use_skill("qa")` to load the full methodology.
|
|
136
|
+
|
|
137
|
+
### Context Strategy
|
|
138
|
+
|
|
139
|
+
| Strategy | When to use |
|
|
140
|
+
|---|---|
|
|
141
|
+
| `compaction` (default) | Most cases. Agent SDK auto-summarizes context. |
|
|
142
|
+
| `reset` | Weaker models or long Sprint-based builds. Clean context per sprint. |
|
|
143
|
+
|
|
144
|
+
### Handoff Schemas
|
|
145
|
+
|
|
146
|
+
Zod schemas for structured agent-to-agent data passing:
|
|
147
|
+
|
|
148
|
+
- `ProductSpecSchema` — Planner output
|
|
149
|
+
- `BuildResultSchema` — Generator output
|
|
150
|
+
- `QAReportSchema` — Evaluator output
|
|
151
|
+
|
|
152
|
+
## CLI
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Run a workflow file
|
|
156
|
+
circe run workflow.js -i "prompt or spec file"
|
|
157
|
+
|
|
158
|
+
# Agent management
|
|
159
|
+
circe agents create my-reviewer --prompt "Review code." --tools "Read,Grep"
|
|
160
|
+
circe agents list
|
|
161
|
+
circe agents info my-reviewer
|
|
162
|
+
circe agents delete my-reviewer
|
|
163
|
+
|
|
164
|
+
# Workflow management
|
|
165
|
+
circe workflows create my-pipe --agents "planner,generator,evaluator"
|
|
166
|
+
circe workflows list
|
|
167
|
+
circe workflows delete my-pipe
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Architecture
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
CLI Layer circe run, agents, workflows
|
|
174
|
+
Orchestration Pipeline, Loop, Parallel, Sprint, Contract
|
|
175
|
+
Agent Layer Agent, agent(), Handoff, Context Strategy
|
|
176
|
+
Tool Layer SDK built-ins, tool(), MCP servers, Skills
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Development
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
npm install
|
|
183
|
+
npm test
|
|
184
|
+
npm run build
|
|
185
|
+
```
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { ZodSchema } from "zod";
|
|
2
|
+
import type { Runnable } from "./types.js";
|
|
3
|
+
export interface AgentConfig {
|
|
4
|
+
name: string;
|
|
5
|
+
prompt: string;
|
|
6
|
+
/** Auto-approve list, NOT a restriction. Unlisted tools fall through to permissionMode. */
|
|
7
|
+
tools?: string[] | null;
|
|
8
|
+
/** Tools to always deny. Checked before allowedTools and permissionMode. */
|
|
9
|
+
disallowedTools?: string[];
|
|
10
|
+
skills?: string[];
|
|
11
|
+
mcpServers?: Record<string, unknown>;
|
|
12
|
+
contextStrategy?: "compaction" | "reset";
|
|
13
|
+
permissionMode?: string;
|
|
14
|
+
continueSession?: boolean;
|
|
15
|
+
inputSchema?: ZodSchema;
|
|
16
|
+
outputSchema?: ZodSchema;
|
|
17
|
+
model?: string;
|
|
18
|
+
costPerMTokens?: {
|
|
19
|
+
input: number;
|
|
20
|
+
output: number;
|
|
21
|
+
};
|
|
22
|
+
timeout?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ResultMetrics {
|
|
25
|
+
resultText: string;
|
|
26
|
+
cost: number;
|
|
27
|
+
inputTokens: number;
|
|
28
|
+
outputTokens: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class Agent<TIn = string, TOut = string> implements Runnable<TIn, TOut> {
|
|
31
|
+
name: string;
|
|
32
|
+
prompt: string;
|
|
33
|
+
tools: string[] | null;
|
|
34
|
+
disallowedTools: string[];
|
|
35
|
+
skills: string[];
|
|
36
|
+
mcpServers: Record<string, unknown>;
|
|
37
|
+
contextStrategy: "compaction" | "reset";
|
|
38
|
+
permissionMode: string;
|
|
39
|
+
continueSession: boolean;
|
|
40
|
+
inputSchema: ZodSchema | null;
|
|
41
|
+
outputSchema: ZodSchema | null;
|
|
42
|
+
model: string | undefined;
|
|
43
|
+
private costPerMTokens;
|
|
44
|
+
private timeout;
|
|
45
|
+
private sessionId;
|
|
46
|
+
private _lastMetrics;
|
|
47
|
+
private _jsonSchema;
|
|
48
|
+
get lastMetrics(): ResultMetrics | null;
|
|
49
|
+
constructor(config: AgentConfig);
|
|
50
|
+
buildSystemPrompt(): string;
|
|
51
|
+
run(input: TIn): Promise<TOut>;
|
|
52
|
+
private executeQuery;
|
|
53
|
+
buildUserPrompt(input: TIn): string;
|
|
54
|
+
extractJson(text: string): string | null;
|
|
55
|
+
parseResult(raw: string): unknown;
|
|
56
|
+
private tryParseWithSchema;
|
|
57
|
+
estimateCost(inputTokens: number, outputTokens: number): number;
|
|
58
|
+
private validateInput;
|
|
59
|
+
private describeInputForError;
|
|
60
|
+
private validateSkills;
|
|
61
|
+
private handleSessionInit;
|
|
62
|
+
private handleAssistantMessage;
|
|
63
|
+
private extractResultMetrics;
|
|
64
|
+
private extractTokenCounts;
|
|
65
|
+
private finalize;
|
|
66
|
+
private buildSdkOptions;
|
|
67
|
+
private buildSkillMcpServer;
|
|
68
|
+
private loadSkillContent;
|
|
69
|
+
private stripCodeBlock;
|
|
70
|
+
private summarizeToolCall;
|
|
71
|
+
}
|
|
72
|
+
export declare function agent<TOut = string>(config: AgentConfig): Agent<string, TOut>;
|
|
73
|
+
export declare function loadAgent(name: string): Promise<Agent>;
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { query, createSdkMcpServer, tool as sdkTool } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
4
|
+
import { getFormatter, getWorkDir, getSkillRegistry } from "./context.js";
|
|
5
|
+
import { findJsonString, circeHome } from "./utils.js";
|
|
6
|
+
const DEFAULT_COST_PER_M_TOKENS = { input: 15, output: 75 };
|
|
7
|
+
const BYPASS_PERMISSIONS_MODE = "bypassPermissions";
|
|
8
|
+
const SKILL_SERVER_NAME = "circe-skills";
|
|
9
|
+
const INPUT_PREVIEW_MAX_LENGTH = 80;
|
|
10
|
+
export class Agent {
|
|
11
|
+
name;
|
|
12
|
+
prompt;
|
|
13
|
+
tools;
|
|
14
|
+
disallowedTools;
|
|
15
|
+
skills;
|
|
16
|
+
mcpServers;
|
|
17
|
+
contextStrategy;
|
|
18
|
+
permissionMode;
|
|
19
|
+
continueSession;
|
|
20
|
+
inputSchema;
|
|
21
|
+
outputSchema;
|
|
22
|
+
model;
|
|
23
|
+
costPerMTokens;
|
|
24
|
+
timeout;
|
|
25
|
+
sessionId = null;
|
|
26
|
+
_lastMetrics = null;
|
|
27
|
+
_jsonSchema = null;
|
|
28
|
+
get lastMetrics() {
|
|
29
|
+
return this._lastMetrics;
|
|
30
|
+
}
|
|
31
|
+
constructor(config) {
|
|
32
|
+
this.name = config.name;
|
|
33
|
+
this.prompt = config.prompt;
|
|
34
|
+
this.tools = config.tools ?? null;
|
|
35
|
+
this.disallowedTools = config.disallowedTools ?? [];
|
|
36
|
+
this.skills = config.skills ?? [];
|
|
37
|
+
this.mcpServers = config.mcpServers ?? {};
|
|
38
|
+
this.contextStrategy = config.contextStrategy ?? "compaction";
|
|
39
|
+
this.permissionMode = config.permissionMode ?? BYPASS_PERMISSIONS_MODE;
|
|
40
|
+
this.continueSession = config.continueSession ?? false;
|
|
41
|
+
this.inputSchema = config.inputSchema ?? null;
|
|
42
|
+
this.outputSchema = config.outputSchema ?? null;
|
|
43
|
+
this.model = config.model;
|
|
44
|
+
this.costPerMTokens = config.costPerMTokens ?? DEFAULT_COST_PER_M_TOKENS;
|
|
45
|
+
this.timeout = config.timeout ?? 0;
|
|
46
|
+
if (this.outputSchema) {
|
|
47
|
+
this._jsonSchema = zodToJsonSchema(this.outputSchema);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// --- Public methods ---
|
|
51
|
+
buildSystemPrompt() {
|
|
52
|
+
const registry = getSkillRegistry();
|
|
53
|
+
if (!registry || this.skills.length === 0)
|
|
54
|
+
return this.prompt;
|
|
55
|
+
const summary = registry.promptSummary(this.skills);
|
|
56
|
+
return summary ? `${this.prompt}\n\n${summary}` : this.prompt;
|
|
57
|
+
}
|
|
58
|
+
async run(input) {
|
|
59
|
+
this.validateInput(input);
|
|
60
|
+
this.validateSkills();
|
|
61
|
+
if (this.timeout <= 0)
|
|
62
|
+
return this.executeQuery(input);
|
|
63
|
+
const abortController = new AbortController();
|
|
64
|
+
const timer = setTimeout(() => abortController.abort(), this.timeout);
|
|
65
|
+
try {
|
|
66
|
+
return await this.executeQuery(input, abortController);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (abortController.signal.aborted) {
|
|
70
|
+
throw new Error(`[${this.name}] timed out after ${this.timeout}ms`);
|
|
71
|
+
}
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
clearTimeout(timer);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async executeQuery(input, abortController) {
|
|
79
|
+
const formatter = getFormatter();
|
|
80
|
+
const workDir = getWorkDir();
|
|
81
|
+
formatter?.agentStart?.(this.name, this.prompt.slice(0, 60));
|
|
82
|
+
const userPrompt = this.buildUserPrompt(input);
|
|
83
|
+
const options = this.buildSdkOptions(workDir, abortController);
|
|
84
|
+
let metrics = { resultText: "", cost: 0, inputTokens: 0, outputTokens: 0 };
|
|
85
|
+
let structuredOutput = undefined;
|
|
86
|
+
try {
|
|
87
|
+
for await (const message of query({ prompt: userPrompt, options })) {
|
|
88
|
+
this.handleSessionInit(message);
|
|
89
|
+
this.handleAssistantMessage(message, formatter);
|
|
90
|
+
if (message.type === "result") {
|
|
91
|
+
metrics = this.extractResultMetrics(message);
|
|
92
|
+
structuredOutput = message.structured_output;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
const { inputTokens, outputTokens, cost } = metrics;
|
|
98
|
+
formatter?.agentDone?.(this.name, `ERROR: ${err.message}`, [inputTokens, outputTokens], cost);
|
|
99
|
+
throw new Error(`[${this.name}] ${err.message}`);
|
|
100
|
+
}
|
|
101
|
+
return this.finalize(metrics, structuredOutput, formatter);
|
|
102
|
+
}
|
|
103
|
+
buildUserPrompt(input) {
|
|
104
|
+
const workDir = getWorkDir();
|
|
105
|
+
const workDirRule = workDir
|
|
106
|
+
? `IMPORTANT: Your working directory is ${workDir}. All file operations MUST use this directory. Do NOT cd to other directories.`
|
|
107
|
+
: "IMPORTANT: Use relative paths from the working directory.";
|
|
108
|
+
const rules = [workDirRule, "Never create files inside an 'output/' subdirectory."].join("\n");
|
|
109
|
+
if (input == null)
|
|
110
|
+
return rules;
|
|
111
|
+
const inputStr = typeof input === "string" ? input : JSON.stringify(input, null, 2);
|
|
112
|
+
return `${rules}\n\n${inputStr}`;
|
|
113
|
+
}
|
|
114
|
+
extractJson(text) {
|
|
115
|
+
return findJsonString(text);
|
|
116
|
+
}
|
|
117
|
+
parseResult(raw) {
|
|
118
|
+
if (!this.outputSchema)
|
|
119
|
+
return raw;
|
|
120
|
+
const jsonStr = this.extractJson(raw);
|
|
121
|
+
if (!jsonStr)
|
|
122
|
+
return raw;
|
|
123
|
+
try {
|
|
124
|
+
return this.tryParseWithSchema(JSON.parse(jsonStr));
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return raw;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
tryParseWithSchema(data) {
|
|
131
|
+
if (!this.outputSchema)
|
|
132
|
+
return data;
|
|
133
|
+
try {
|
|
134
|
+
return this.outputSchema.parse(data);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return data;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
estimateCost(inputTokens, outputTokens) {
|
|
141
|
+
return (inputTokens * this.costPerMTokens.input + outputTokens * this.costPerMTokens.output) / 1_000_000;
|
|
142
|
+
}
|
|
143
|
+
// --- run() implementation details ---
|
|
144
|
+
validateInput(input) {
|
|
145
|
+
if (!this.inputSchema)
|
|
146
|
+
return;
|
|
147
|
+
const result = this.inputSchema.safeParse(input);
|
|
148
|
+
if (result.success)
|
|
149
|
+
return;
|
|
150
|
+
const received = this.describeInputForError(input);
|
|
151
|
+
const issues = result.error.issues.map((i) => i.message).join(", ");
|
|
152
|
+
throw new Error(`[${this.name}] input validation failed — ${issues} (received ${received})`);
|
|
153
|
+
}
|
|
154
|
+
describeInputForError(input) {
|
|
155
|
+
if (typeof input !== "string")
|
|
156
|
+
return typeof input;
|
|
157
|
+
const preview = input.slice(0, INPUT_PREVIEW_MAX_LENGTH);
|
|
158
|
+
const truncated = input.length > INPUT_PREVIEW_MAX_LENGTH ? "…" : "";
|
|
159
|
+
return `string: "${preview}${truncated}"`;
|
|
160
|
+
}
|
|
161
|
+
validateSkills() {
|
|
162
|
+
const registry = getSkillRegistry();
|
|
163
|
+
if (registry && this.skills.length > 0) {
|
|
164
|
+
registry.validateSkills(this.skills);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
handleSessionInit(message) {
|
|
168
|
+
if (message.type === "system" && message.subtype === "init" && this.continueSession) {
|
|
169
|
+
this.sessionId = message.session_id ?? null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
handleAssistantMessage(message, formatter) {
|
|
173
|
+
if (message.type !== "assistant")
|
|
174
|
+
return;
|
|
175
|
+
if (!formatter?.logActivity || !message.message?.content)
|
|
176
|
+
return;
|
|
177
|
+
for (const block of message.message.content) {
|
|
178
|
+
if (block.type === "tool_use") {
|
|
179
|
+
formatter.logActivity(this.name, this.summarizeToolCall(block));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
extractResultMetrics(message) {
|
|
184
|
+
if (message.is_error) {
|
|
185
|
+
throw new Error(`[${this.name}] SDK error: ${message.result ?? "unknown"}`);
|
|
186
|
+
}
|
|
187
|
+
const resultText = typeof message.result === "string" ? message.result : JSON.stringify(message.result);
|
|
188
|
+
const { inputTokens, outputTokens } = this.extractTokenCounts(message.usage);
|
|
189
|
+
const cost = message.total_cost_usd ?? this.estimateCost(inputTokens, outputTokens);
|
|
190
|
+
return { resultText, cost, inputTokens, outputTokens };
|
|
191
|
+
}
|
|
192
|
+
extractTokenCounts(usage) {
|
|
193
|
+
if (!usage)
|
|
194
|
+
return { inputTokens: 0, outputTokens: 0 };
|
|
195
|
+
const inputTokens = (usage.input_tokens ?? 0) +
|
|
196
|
+
(usage.cache_creation_input_tokens ?? 0) +
|
|
197
|
+
(usage.cache_read_input_tokens ?? 0);
|
|
198
|
+
const outputTokens = usage.output_tokens ?? 0;
|
|
199
|
+
return { inputTokens, outputTokens };
|
|
200
|
+
}
|
|
201
|
+
finalize(metrics, structuredOutput, formatter) {
|
|
202
|
+
this._lastMetrics = metrics;
|
|
203
|
+
const { resultText, cost, inputTokens, outputTokens } = metrics;
|
|
204
|
+
const parsed = structuredOutput !== undefined ? this.tryParseWithSchema(structuredOutput) : this.parseResult(resultText);
|
|
205
|
+
if (formatter?.agentDone) {
|
|
206
|
+
const formattedOutput = typeof parsed === "string" ? this.stripCodeBlock(parsed) : JSON.stringify(parsed);
|
|
207
|
+
formatter.agentDone(this.name, formattedOutput, [inputTokens, outputTokens], cost);
|
|
208
|
+
}
|
|
209
|
+
return parsed;
|
|
210
|
+
}
|
|
211
|
+
// --- SDK option builders ---
|
|
212
|
+
buildSdkOptions(workDir, abortController) {
|
|
213
|
+
const options = {
|
|
214
|
+
systemPrompt: this.buildSystemPrompt(),
|
|
215
|
+
permissionMode: this.permissionMode,
|
|
216
|
+
};
|
|
217
|
+
if (this.model) {
|
|
218
|
+
options.model = this.model;
|
|
219
|
+
}
|
|
220
|
+
if (abortController) {
|
|
221
|
+
options.abortController = abortController;
|
|
222
|
+
}
|
|
223
|
+
if (this.permissionMode === BYPASS_PERMISSIONS_MODE) {
|
|
224
|
+
options.allowDangerouslySkipPermissions = true;
|
|
225
|
+
}
|
|
226
|
+
if (this.tools) {
|
|
227
|
+
options.allowedTools = this.tools;
|
|
228
|
+
}
|
|
229
|
+
if (this.disallowedTools.length > 0) {
|
|
230
|
+
options.disallowedTools = this.disallowedTools;
|
|
231
|
+
}
|
|
232
|
+
if (Object.keys(this.mcpServers).length > 0) {
|
|
233
|
+
options.mcpServers = this.mcpServers;
|
|
234
|
+
}
|
|
235
|
+
if (workDir) {
|
|
236
|
+
options.cwd = workDir;
|
|
237
|
+
}
|
|
238
|
+
if (this.continueSession && this.sessionId) {
|
|
239
|
+
options.resume = this.sessionId;
|
|
240
|
+
}
|
|
241
|
+
if (this._jsonSchema) {
|
|
242
|
+
options.outputFormat = { type: "json_schema", schema: this._jsonSchema };
|
|
243
|
+
}
|
|
244
|
+
const skillServer = this.skills.length > 0 ? this.buildSkillMcpServer() : null;
|
|
245
|
+
if (skillServer) {
|
|
246
|
+
const existingServers = options.mcpServers ?? {};
|
|
247
|
+
options.mcpServers = { ...existingServers, [SKILL_SERVER_NAME]: skillServer };
|
|
248
|
+
}
|
|
249
|
+
return options;
|
|
250
|
+
}
|
|
251
|
+
buildSkillMcpServer() {
|
|
252
|
+
const registry = getSkillRegistry();
|
|
253
|
+
if (!registry)
|
|
254
|
+
return null;
|
|
255
|
+
return createSdkMcpServer({
|
|
256
|
+
name: SKILL_SERVER_NAME,
|
|
257
|
+
tools: [
|
|
258
|
+
sdkTool("use_skill", "Load a skill's full content by name. Use this to access detailed methodology.", { name: z.string().describe("Name of the skill to load") }, async (args) => this.loadSkillContent(registry, args.name)),
|
|
259
|
+
],
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
loadSkillContent(registry, skillName) {
|
|
263
|
+
const content = registry.getSkill(skillName);
|
|
264
|
+
if (content) {
|
|
265
|
+
console.error(`[skill] Loaded: ${skillName}`);
|
|
266
|
+
return { content: [{ type: "text", text: content }] };
|
|
267
|
+
}
|
|
268
|
+
console.error(`[skill] Not found: ${skillName}`);
|
|
269
|
+
return {
|
|
270
|
+
content: [{ type: "text", text: `Skill '${skillName}' not found. Continuing without it.` }],
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
// --- Output formatting helpers ---
|
|
274
|
+
stripCodeBlock(text) {
|
|
275
|
+
const match = text.match(/```(?:\w*)\s*\n([\s\S]*?)\n```/);
|
|
276
|
+
return match ? match[1].trim() : text;
|
|
277
|
+
}
|
|
278
|
+
summarizeToolCall(block) {
|
|
279
|
+
const name = block.name ?? "unknown";
|
|
280
|
+
const input = block.input ?? {};
|
|
281
|
+
if (name === "Bash" && input.command)
|
|
282
|
+
return `$ ${input.command}`;
|
|
283
|
+
if (name === "Read" && input.file_path)
|
|
284
|
+
return `Read ${input.file_path}`;
|
|
285
|
+
if (name === "Write" && input.file_path)
|
|
286
|
+
return `Write ${input.file_path}`;
|
|
287
|
+
if (name === "Edit" && input.file_path)
|
|
288
|
+
return `Edit ${input.file_path}`;
|
|
289
|
+
return name;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
export function agent(config) {
|
|
293
|
+
return new Agent(config);
|
|
294
|
+
}
|
|
295
|
+
const AgentConfigFileSchema = z.object({
|
|
296
|
+
name: z.string(),
|
|
297
|
+
prompt: z.string(),
|
|
298
|
+
tools: z.array(z.string()).nullable().optional(),
|
|
299
|
+
disallowedTools: z.array(z.string()).optional(),
|
|
300
|
+
skills: z.array(z.string()).optional(),
|
|
301
|
+
mcpServers: z.record(z.unknown()).optional(),
|
|
302
|
+
contextStrategy: z.enum(["compaction", "reset"]).optional(),
|
|
303
|
+
permissionMode: z.string().optional(),
|
|
304
|
+
continueSession: z.boolean().optional(),
|
|
305
|
+
model: z.string().optional(),
|
|
306
|
+
costPerMTokens: z.object({ input: z.number(), output: z.number() }).optional(),
|
|
307
|
+
timeout: z.number().optional(),
|
|
308
|
+
});
|
|
309
|
+
export async function loadAgent(name) {
|
|
310
|
+
const home = circeHome();
|
|
311
|
+
const agentPath = `${home}/agents/${name}.json`;
|
|
312
|
+
const { readFileSync } = await import("node:fs");
|
|
313
|
+
let raw;
|
|
314
|
+
try {
|
|
315
|
+
raw = readFileSync(agentPath, "utf-8");
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
throw new Error(`Agent file not found: ${agentPath}`);
|
|
319
|
+
}
|
|
320
|
+
let parsed;
|
|
321
|
+
try {
|
|
322
|
+
parsed = JSON.parse(raw);
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
throw new Error(`Invalid JSON in agent file: ${agentPath}`);
|
|
326
|
+
}
|
|
327
|
+
const result = AgentConfigFileSchema.safeParse(parsed);
|
|
328
|
+
if (!result.success) {
|
|
329
|
+
const issues = result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ");
|
|
330
|
+
throw new Error(`Invalid agent config in ${agentPath}: ${issues}`);
|
|
331
|
+
}
|
|
332
|
+
return new Agent(result.data);
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|