arcie 0.1.2 → 0.1.4
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 +34 -6
- package/dist/agent/index.d.ts +6 -3
- package/dist/agent/index.js +6 -6
- package/dist/agent/index.js.map +1 -1
- package/dist/auth/index.d.ts +6 -5
- package/dist/auth/index.js +8 -17
- package/dist/auth/index.js.map +1 -1
- package/dist/channels/index.d.ts +8 -5
- package/dist/channels/index.js +10 -12
- package/dist/channels/index.js.map +1 -1
- package/dist/chunk-2ZSKZYWK.js +1901 -0
- package/dist/chunk-2ZSKZYWK.js.map +1 -0
- package/dist/chunk-3CNQ6HQV.js +12 -0
- package/dist/chunk-3CNQ6HQV.js.map +1 -0
- package/dist/chunk-4L7WVCTU.js +12 -0
- package/dist/chunk-4L7WVCTU.js.map +1 -0
- package/dist/chunk-6XETPLIF.js +176 -0
- package/dist/chunk-6XETPLIF.js.map +1 -0
- package/dist/chunk-CKHBEZCT.js +24 -0
- package/dist/chunk-CKHBEZCT.js.map +1 -0
- package/dist/chunk-FQ7KDNV5.js +12 -0
- package/dist/chunk-FQ7KDNV5.js.map +1 -0
- package/dist/chunk-L3BTL5FM.js +39 -0
- package/dist/chunk-L3BTL5FM.js.map +1 -0
- package/dist/chunk-LQC65UHE.js +34 -0
- package/dist/chunk-LQC65UHE.js.map +1 -0
- package/dist/chunk-PHTJLJOV.js +25 -0
- package/dist/chunk-PHTJLJOV.js.map +1 -0
- package/dist/chunk-QE46QFID.js +92 -0
- package/dist/chunk-QE46QFID.js.map +1 -0
- package/dist/chunk-WAD7VLNI.js +51 -0
- package/dist/chunk-WAD7VLNI.js.map +1 -0
- package/dist/chunk-ZJNHQXMO.js +20 -0
- package/dist/chunk-ZJNHQXMO.js.map +1 -0
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.js +252 -36
- package/dist/cli/index.js.map +1 -1
- package/dist/context/index.d.ts +14 -11
- package/dist/context/index.js +22 -37
- package/dist/context/index.js.map +1 -1
- package/dist/discover/index.d.ts +17 -7
- package/dist/discover/index.js +6 -132
- package/dist/discover/index.js.map +1 -1
- package/dist/hooks/index.d.ts +6 -3
- package/dist/hooks/index.js +6 -6
- package/dist/hooks/index.js.map +1 -1
- package/dist/index-b4NcDl3m.d.ts +136 -0
- package/dist/index.d.ts +297 -18
- package/dist/index.js +158 -13
- package/dist/index.js.map +1 -1
- package/dist/instructions/index.d.ts +7 -4
- package/dist/instructions/index.js +8 -32
- package/dist/instructions/index.js.map +1 -1
- package/dist/protocol/events.d.ts +47 -39
- package/dist/protocol/events.js +46 -45
- package/dist/protocol/events.js.map +1 -1
- package/dist/runner/index.d.ts +4 -18
- package/dist/runner/index.js +10 -277
- package/dist/runner/index.js.map +1 -1
- package/dist/schedules/index.d.ts +6 -3
- package/dist/schedules/index.js +6 -6
- package/dist/schedules/index.js.map +1 -1
- package/dist/skills/index.d.ts +7 -4
- package/dist/skills/index.js +8 -27
- package/dist/skills/index.js.map +1 -1
- package/dist/tools/index.d.ts +13 -3
- package/dist/tools/index.js +8 -9
- package/dist/tools/index.js.map +1 -1
- package/dist/types-BxOQTzx1.d.ts +151 -0
- package/docs/getting-started.md +2 -2
- package/docs/index.md +3 -2
- package/docs/project-layout.md +2 -2
- package/docs/subagents.md +95 -0
- package/package.json +15 -10
- package/templates/default/agent/agent.ts +2 -2
- package/templates/default/package.json +3 -3
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/channels/index.d.ts.map +0 -1
- package/dist/cli/banner.d.ts +0 -2
- package/dist/cli/banner.d.ts.map +0 -1
- package/dist/cli/banner.js +0 -10
- package/dist/cli/banner.js.map +0 -1
- package/dist/cli/build.d.ts +0 -5
- package/dist/cli/build.d.ts.map +0 -1
- package/dist/cli/build.js +0 -54
- package/dist/cli/build.js.map +0 -1
- package/dist/cli/dev.d.ts +0 -5
- package/dist/cli/dev.d.ts.map +0 -1
- package/dist/cli/dev.js +0 -74
- package/dist/cli/dev.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/init.d.ts +0 -4
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js +0 -75
- package/dist/cli/init.js.map +0 -1
- package/dist/context/index.d.ts.map +0 -1
- package/dist/discover/index.d.ts.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/instructions/index.d.ts.map +0 -1
- package/dist/loader.d.ts +0 -7
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -102
- package/dist/loader.js.map +0 -1
- package/dist/protocol/events.d.ts.map +0 -1
- package/dist/runner/index.d.ts.map +0 -1
- package/dist/schedules/index.d.ts.map +0 -1
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/types.d.ts +0 -118
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { a as ScheduleConfig } from '../types-BxOQTzx1.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
declare function defineSchedule(config: ScheduleConfig): ScheduleConfig;
|
|
5
|
+
|
|
6
|
+
export { defineSchedule };
|
package/dist/schedules/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
defineSchedule
|
|
3
|
+
} from "../chunk-4L7WVCTU.js";
|
|
4
|
+
export {
|
|
5
|
+
defineSchedule
|
|
6
|
+
};
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/skills/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { b as SkillConfig } from '../types-BxOQTzx1.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
declare function defineSkill(config: SkillConfig): SkillConfig;
|
|
5
|
+
declare function getSkill(agentDir: string, name: string): SkillConfig | null;
|
|
6
|
+
|
|
7
|
+
export { defineSkill, getSkill };
|
package/dist/skills/index.js
CHANGED
|
@@ -1,28 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
export function getSkill(agentDir, name) {
|
|
10
|
-
const mdPath = resolve(agentDir, "knowledge", `${name}.md`);
|
|
11
|
-
const tsPath = resolve(agentDir, "knowledge", `${name}.ts`);
|
|
12
|
-
if (existsSync(mdPath)) {
|
|
13
|
-
return {
|
|
14
|
-
name,
|
|
15
|
-
description: "",
|
|
16
|
-
content: readFileSync(mdPath, "utf-8"),
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
if (existsSync(tsPath)) {
|
|
20
|
-
return {
|
|
21
|
-
name,
|
|
22
|
-
description: "",
|
|
23
|
-
content: readFileSync(tsPath, "utf-8"),
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
defineSkill,
|
|
3
|
+
getSkill
|
|
4
|
+
} from "../chunk-LQC65UHE.js";
|
|
5
|
+
export {
|
|
6
|
+
defineSkill,
|
|
7
|
+
getSkill
|
|
8
|
+
};
|
|
28
9
|
//# sourceMappingURL=index.js.map
|
package/dist/skills/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { c as ToolConfig } from '../types-BxOQTzx1.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
declare function defineTool<TInput = unknown, TOutput = unknown>(config: ToolConfig<TInput, TOutput>): ToolConfig<TInput, TOutput>;
|
|
5
|
+
interface ModelToolDefinition {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
input_schema?: Record<string, unknown>;
|
|
9
|
+
type: "function";
|
|
10
|
+
}
|
|
11
|
+
declare function toModelOutput(name: string, tool: ToolConfig): ModelToolDefinition;
|
|
12
|
+
|
|
13
|
+
export { type ModelToolDefinition, defineTool, toModelOutput };
|
package/dist/tools/index.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
defineTool,
|
|
3
|
+
toModelOutput
|
|
4
|
+
} from "../chunk-PHTJLJOV.js";
|
|
5
|
+
export {
|
|
6
|
+
defineTool,
|
|
7
|
+
toModelOutput
|
|
8
|
+
};
|
|
10
9
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
interface CencoriConfig {
|
|
4
|
+
project?: string;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
billing?: {
|
|
7
|
+
budget?: string;
|
|
8
|
+
endUserMarkup?: number;
|
|
9
|
+
};
|
|
10
|
+
security?: {
|
|
11
|
+
policy?: "strict" | "standard" | "permissive";
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
interface AgentConfig {
|
|
15
|
+
model: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
cencori?: CencoriConfig;
|
|
19
|
+
}
|
|
20
|
+
type ApprovalStrategy = "always" | "never" | "once";
|
|
21
|
+
interface ToolConfig<TInput = unknown, TOutput = unknown> {
|
|
22
|
+
name?: string;
|
|
23
|
+
description: string;
|
|
24
|
+
inputSchema?: z.ZodType<TInput>;
|
|
25
|
+
outputSchema?: z.ZodType<TOutput>;
|
|
26
|
+
sandbox?: boolean;
|
|
27
|
+
needsApproval?: ApprovalStrategy;
|
|
28
|
+
execute: (input: TInput) => TOutput | Promise<TOutput>;
|
|
29
|
+
}
|
|
30
|
+
interface InstructionsConfig {
|
|
31
|
+
content: string;
|
|
32
|
+
filePath?: string;
|
|
33
|
+
}
|
|
34
|
+
interface SkillConfig {
|
|
35
|
+
name: string;
|
|
36
|
+
description: string;
|
|
37
|
+
content: string;
|
|
38
|
+
}
|
|
39
|
+
interface HookConfig {
|
|
40
|
+
name: string;
|
|
41
|
+
event: HookEvent;
|
|
42
|
+
handler: (payload: HookPayload) => void | Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
type HookEvent = "beforeTurn" | "afterTurn" | "beforeToolCall" | "afterToolCall" | "onError" | "onStart" | "onEnd";
|
|
45
|
+
interface HookPayload {
|
|
46
|
+
turn?: TurnContext;
|
|
47
|
+
toolCall?: ToolCallContext;
|
|
48
|
+
error?: Error;
|
|
49
|
+
}
|
|
50
|
+
interface TurnContext {
|
|
51
|
+
id: string;
|
|
52
|
+
sessionId?: string;
|
|
53
|
+
input: string;
|
|
54
|
+
output?: string;
|
|
55
|
+
toolCalls?: ToolCallContext[];
|
|
56
|
+
}
|
|
57
|
+
interface ToolCallContext {
|
|
58
|
+
tool: string;
|
|
59
|
+
input: unknown;
|
|
60
|
+
output?: unknown;
|
|
61
|
+
durationMs?: number;
|
|
62
|
+
error?: Error;
|
|
63
|
+
}
|
|
64
|
+
interface ChannelConfig {
|
|
65
|
+
name: string;
|
|
66
|
+
type: "http" | "slack" | "discord" | "custom";
|
|
67
|
+
handler: (request: ChannelRequest) => ChannelResponse | Promise<ChannelResponse>;
|
|
68
|
+
}
|
|
69
|
+
interface ChannelRequest {
|
|
70
|
+
body: unknown;
|
|
71
|
+
headers: Record<string, string>;
|
|
72
|
+
method: string;
|
|
73
|
+
}
|
|
74
|
+
interface ChannelResponse {
|
|
75
|
+
status: number;
|
|
76
|
+
body: unknown;
|
|
77
|
+
}
|
|
78
|
+
interface ConnectionConfig {
|
|
79
|
+
name: string;
|
|
80
|
+
description: string;
|
|
81
|
+
auth: {
|
|
82
|
+
type: "oauth2" | "apiKey" | "basic";
|
|
83
|
+
authorizeUrl?: string;
|
|
84
|
+
tokenUrl?: string;
|
|
85
|
+
clientId?: string;
|
|
86
|
+
scopes?: string[];
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
interface ScheduleConfig {
|
|
90
|
+
name: string;
|
|
91
|
+
cron: string;
|
|
92
|
+
handler: () => void | Promise<void>;
|
|
93
|
+
timezone?: string;
|
|
94
|
+
}
|
|
95
|
+
interface SessionConfig {
|
|
96
|
+
maxTurns?: number;
|
|
97
|
+
idleTimeoutMs?: number;
|
|
98
|
+
requireApproval?: boolean;
|
|
99
|
+
memory?: {
|
|
100
|
+
strategy: "lastN" | "summary" | "keyFacts" | "semantic";
|
|
101
|
+
limit?: number;
|
|
102
|
+
workingMemory?: boolean;
|
|
103
|
+
workingMemoryTemplate?: string;
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
interface PolicyConfig {
|
|
107
|
+
inputGuards?: string[];
|
|
108
|
+
outputGuards?: string[];
|
|
109
|
+
allowedModels?: string[];
|
|
110
|
+
blockedTools?: string[];
|
|
111
|
+
budget?: {
|
|
112
|
+
maxSpendPerSession?: string;
|
|
113
|
+
maxSpendPerDay?: string;
|
|
114
|
+
maxSpendPerMonth?: string;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* A subagent is a fully self-contained child agent the orchestrator can
|
|
119
|
+
* delegate a focused subtask to. It runs in its own fresh, isolated session —
|
|
120
|
+
* it never inherits the parent's conversation history; the parent passes all
|
|
121
|
+
* needed context in via the delegation `message`.
|
|
122
|
+
*/
|
|
123
|
+
interface SubagentManifest {
|
|
124
|
+
/** The child agent's config. `description` is required (validated at load). */
|
|
125
|
+
config: AgentConfig;
|
|
126
|
+
instructions: string;
|
|
127
|
+
tools: Record<string, ToolConfig>;
|
|
128
|
+
skills: Record<string, SkillConfig>;
|
|
129
|
+
}
|
|
130
|
+
interface AgentManifest {
|
|
131
|
+
config: AgentConfig;
|
|
132
|
+
instructions: string;
|
|
133
|
+
tools: Record<string, ToolConfig>;
|
|
134
|
+
skills: Record<string, SkillConfig>;
|
|
135
|
+
hooks: Record<string, HookConfig>;
|
|
136
|
+
channels: Record<string, ChannelConfig>;
|
|
137
|
+
schedules: Record<string, ScheduleConfig>;
|
|
138
|
+
connections: Record<string, ConnectionConfig>;
|
|
139
|
+
/** Declared specialists under `subagents/<id>/`, keyed by directory name. */
|
|
140
|
+
subagents: Record<string, SubagentManifest>;
|
|
141
|
+
session?: SessionConfig;
|
|
142
|
+
policy?: PolicyConfig;
|
|
143
|
+
}
|
|
144
|
+
interface Session {
|
|
145
|
+
id: string;
|
|
146
|
+
created: Date;
|
|
147
|
+
turns: TurnContext[];
|
|
148
|
+
metadata: Record<string, unknown>;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export type { AgentConfig as A, ChannelConfig as C, HookConfig as H, InstructionsConfig as I, PolicyConfig as P, Session as S, TurnContext as T, ScheduleConfig as a, SkillConfig as b, ToolConfig as c, ConnectionConfig as d, SessionConfig as e, AgentManifest as f, ApprovalStrategy as g, CencoriConfig as h, ChannelRequest as i, ChannelResponse as j, HookEvent as k, HookPayload as l, SubagentManifest as m, ToolCallContext as n };
|
package/docs/getting-started.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Install
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npx
|
|
6
|
+
npx arcie@latest init my-agent
|
|
7
7
|
cd my-agent
|
|
8
8
|
npm install
|
|
9
9
|
```
|
|
@@ -27,7 +27,7 @@ curl -X POST http://localhost:3000 \
|
|
|
27
27
|
Create `agent/tools/get_weather.ts`:
|
|
28
28
|
|
|
29
29
|
```ts
|
|
30
|
-
import { defineTool } from "
|
|
30
|
+
import { defineTool } from "arcie/tools";
|
|
31
31
|
import { z } from "zod";
|
|
32
32
|
|
|
33
33
|
export default defineTool({
|
package/docs/index.md
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Arcie Documentation
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Arcie is a filesystem-first framework for production agents on Cencori.
|
|
4
4
|
|
|
5
5
|
## Getting Started
|
|
6
6
|
|
|
7
7
|
- [Getting Started](getting-started.md)
|
|
8
8
|
- [Project Layout](project-layout.md)
|
|
9
|
+
- [Subagents](subagents.md)
|
|
9
10
|
|
|
10
11
|
## Authoring
|
|
11
12
|
|
package/docs/project-layout.md
CHANGED
|
@@ -21,7 +21,7 @@ my-agent/
|
|
|
21
21
|
Required config. Defines the model and Cencori integration:
|
|
22
22
|
|
|
23
23
|
```ts
|
|
24
|
-
import { defineAgent } from "
|
|
24
|
+
import { defineAgent } from "arcie";
|
|
25
25
|
|
|
26
26
|
export default defineAgent({
|
|
27
27
|
model: "claude-sonnet-4-5",
|
|
@@ -41,7 +41,7 @@ Required. The system prompt that defines the agent's personality and behavior.
|
|
|
41
41
|
Optional. TypeScript files exporting a `defineTool` config:
|
|
42
42
|
|
|
43
43
|
```ts
|
|
44
|
-
import { defineTool } from "
|
|
44
|
+
import { defineTool } from "arcie/tools";
|
|
45
45
|
import { z } from "zod";
|
|
46
46
|
|
|
47
47
|
export default defineTool({
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Subagents
|
|
2
|
+
|
|
3
|
+
A subagent is a child agent that the orchestrator delegates a focused subtask to.
|
|
4
|
+
Each one runs in its own **fresh, isolated session** — it never sees the parent's
|
|
5
|
+
conversation history. The parent passes everything the child needs through a single
|
|
6
|
+
`message` and gets a result back. This keeps the orchestrator's context small and
|
|
7
|
+
each specialist sharply scoped.
|
|
8
|
+
|
|
9
|
+
## Two kinds
|
|
10
|
+
|
|
11
|
+
- **Declared subagents** — specialists you define under `agent/subagents/<id>/`.
|
|
12
|
+
Use one when the child needs a different prompt, a narrower tool surface, or its
|
|
13
|
+
own runtime context.
|
|
14
|
+
- **The built-in `agent` tool** — every agent can spawn a copy of itself for a
|
|
15
|
+
focused subtask. The copy inherits the parent's instructions, tools, and skills,
|
|
16
|
+
but starts with fresh state.
|
|
17
|
+
|
|
18
|
+
If the agent can keep its own identity and just needs an optional procedure, reach
|
|
19
|
+
for a skill instead of a subagent.
|
|
20
|
+
|
|
21
|
+
## Defining a subagent
|
|
22
|
+
|
|
23
|
+
A subagent is a directory that looks like a small agent:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
agent/subagents/researcher/
|
|
27
|
+
├── agent.ts # required — defineAgent({ model, description })
|
|
28
|
+
├── instructions.md # optional — the subagent's system prompt
|
|
29
|
+
├── tools/ # optional — the subagent's own tools
|
|
30
|
+
└── skills/ # optional — the subagent's own knowledge
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
// agent/subagents/researcher/agent.ts
|
|
35
|
+
import { defineAgent } from "arcie";
|
|
36
|
+
|
|
37
|
+
export default defineAgent({
|
|
38
|
+
model: "claude-sonnet-4-5",
|
|
39
|
+
description: "Investigate ambiguous questions before the parent agent responds.",
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The directory name (`researcher`) becomes the tool name the orchestrator calls.
|
|
44
|
+
|
|
45
|
+
### `description` is required
|
|
46
|
+
|
|
47
|
+
Unlike the root agent, a subagent **must** declare a `description` — it's how the
|
|
48
|
+
orchestrator decides when to delegate. Leaving it out is a hard error at load time:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
Subagent "researcher" must declare a description in agent.ts
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
A subagent directory with no `agent.ts` is reported by `arcie dev` / `arcie build` as
|
|
55
|
+
`SUBAGENT_MISSING_CONFIG`.
|
|
56
|
+
|
|
57
|
+
## Isolation
|
|
58
|
+
|
|
59
|
+
Declared subagents are isolated. They **inherit nothing** from the parent — absent
|
|
60
|
+
slots fall back to the framework default, not to the root agent's version. If two
|
|
61
|
+
subagents need the same procedure, copy it under each one's `skills/`.
|
|
62
|
+
|
|
63
|
+
This isolation is deliberate: each delegation spins up its own session, so the
|
|
64
|
+
subagent's work never pollutes the parent's context, and the parent only ever sees
|
|
65
|
+
the subagent's final result.
|
|
66
|
+
|
|
67
|
+
## How delegation works
|
|
68
|
+
|
|
69
|
+
The orchestrator perceives subagents as tools. Both declared subagents and the
|
|
70
|
+
built-in `agent` tool expose the same interface:
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
{
|
|
74
|
+
message: string; // all the context the child needs (it sees nothing else)
|
|
75
|
+
outputSchema?: object; // when set, the child returns structured output
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
When `outputSchema` is provided, the subagent runs in **task mode** and returns
|
|
80
|
+
structured output as the tool result — which is what makes fan-out / map-reduce
|
|
81
|
+
orchestration possible.
|
|
82
|
+
|
|
83
|
+
Each delegation emits two control-plane events in the parent's stream:
|
|
84
|
+
|
|
85
|
+
- `subagent.called` — `{ name, callId, childSessionId, turnId }`
|
|
86
|
+
- `subagent.completed` — `{ name, callId, output }`
|
|
87
|
+
|
|
88
|
+
## Status
|
|
89
|
+
|
|
90
|
+
Authoring and loading work today: subagents are discovered, validated (including the
|
|
91
|
+
`description` requirement), and loaded into the agent manifest with their own
|
|
92
|
+
instructions and tools — `arcie build` lists them under `subagents` in the manifest.
|
|
93
|
+
The runtime orchestration loop — the model invoking a subagent, spawning the isolated
|
|
94
|
+
child session, and feeding the result back into the parent turn — is being wired
|
|
95
|
+
through the Cencori Sessions API.
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "arcie",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.4",
|
|
5
5
|
"description": "The electronic line — build agents at the speed of light.",
|
|
6
6
|
"bin": {
|
|
7
|
-
"
|
|
7
|
+
"arcie": "dist/cli/index.js"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"./channels": "./dist/channels/index.js",
|
|
23
23
|
"./schedules": "./dist/schedules/index.js",
|
|
24
24
|
"./context": "./dist/context/index.js",
|
|
25
|
+
"./memory": "./dist/memory/index.js",
|
|
25
26
|
"./agent": "./dist/agent/index.js",
|
|
26
27
|
"./runner": "./dist/runner/index.js",
|
|
27
28
|
"./auth": "./dist/auth/index.js",
|
|
@@ -32,19 +33,21 @@
|
|
|
32
33
|
"*": {
|
|
33
34
|
"*": [
|
|
34
35
|
"./dist/*/index.d.ts",
|
|
36
|
+
"./dist/*.d.ts",
|
|
35
37
|
"./dist/index.d.ts"
|
|
36
38
|
]
|
|
37
39
|
}
|
|
38
40
|
},
|
|
39
41
|
"scripts": {
|
|
40
|
-
"build": "
|
|
41
|
-
"dev": "
|
|
42
|
+
"build": "tsup",
|
|
43
|
+
"dev": "tsup --watch",
|
|
44
|
+
"typecheck": "tsc -p tsconfig.build.json --noEmit",
|
|
42
45
|
"prepublishOnly": "npm run build",
|
|
43
46
|
"test": "vitest run",
|
|
44
47
|
"test:watch": "vitest"
|
|
45
48
|
},
|
|
46
49
|
"keywords": [
|
|
47
|
-
"
|
|
50
|
+
"arcie",
|
|
48
51
|
"ai",
|
|
49
52
|
"agent",
|
|
50
53
|
"framework",
|
|
@@ -55,10 +58,11 @@
|
|
|
55
58
|
"license": "MIT",
|
|
56
59
|
"repository": {
|
|
57
60
|
"type": "git",
|
|
58
|
-
"url": "git+https://github.com/cencori/
|
|
61
|
+
"url": "git+https://github.com/cencori/arcie.git"
|
|
59
62
|
},
|
|
60
|
-
"homepage": "https://cencori.com/
|
|
63
|
+
"homepage": "https://cencori.com/arcie",
|
|
61
64
|
"dependencies": {
|
|
65
|
+
"@libsql/client": "^0.17.4",
|
|
62
66
|
"chalk": "^5.3.0",
|
|
63
67
|
"commander": "^12.0.0",
|
|
64
68
|
"ora": "^8.0.1",
|
|
@@ -66,8 +70,9 @@
|
|
|
66
70
|
"zod-to-json-schema": "^3.25.2"
|
|
67
71
|
},
|
|
68
72
|
"devDependencies": {
|
|
69
|
-
"@types/node": "^
|
|
70
|
-
"
|
|
71
|
-
"
|
|
73
|
+
"@types/node": "^26.0.0",
|
|
74
|
+
"tsup": "^8.5.1",
|
|
75
|
+
"typescript": "^6.0.3",
|
|
76
|
+
"vitest": "^4.1.9"
|
|
72
77
|
}
|
|
73
78
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { defineAgent } from "
|
|
1
|
+
import { defineAgent } from "arcie";
|
|
2
2
|
|
|
3
3
|
export default defineAgent({
|
|
4
4
|
model: "claude-sonnet-4-5",
|
|
5
5
|
name: "my-agent",
|
|
6
|
-
description: "An
|
|
6
|
+
description: "An Arcie agent powered by Cencori.",
|
|
7
7
|
cencori: {
|
|
8
8
|
project: process.env.CENCORI_PROJECT_ID,
|
|
9
9
|
billing: {
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"dev": "
|
|
8
|
-
"build": "
|
|
7
|
+
"dev": "arcie dev",
|
|
8
|
+
"build": "arcie build"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"
|
|
11
|
+
"arcie": "^0.1.2",
|
|
12
12
|
"zod": "^3.23.0"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAK5D"}
|
package/dist/auth/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD,CAAC,CAAC;AAEH,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAMxD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,CAAC;CACtB,GAAG,cAAc,CAMjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAKlE;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAEhF;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAE/E"}
|
package/dist/cli/banner.d.ts
DELETED
package/dist/cli/banner.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CAQjC"}
|
package/dist/cli/banner.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export function showBanner() {
|
|
2
|
-
console.log();
|
|
3
|
-
console.log(" ╔══════════════════════════════════╗");
|
|
4
|
-
console.log(" ║ Eline ║");
|
|
5
|
-
console.log(" ║ The electronic line — build ║");
|
|
6
|
-
console.log(" ║ agents at the speed of light. ║");
|
|
7
|
-
console.log(" ╚══════════════════════════════════╝");
|
|
8
|
-
console.log();
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=banner.js.map
|
package/dist/cli/banner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/cli/build.d.ts
DELETED
package/dist/cli/build.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DhB"}
|
package/dist/cli/build.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync, existsSync } from "node:fs";
|
|
2
|
-
import { resolve, join } from "node:path";
|
|
3
|
-
import { loadAgent } from "../loader.js";
|
|
4
|
-
import { discoverAgent } from "../discover/index.js";
|
|
5
|
-
export async function buildCommand(options) {
|
|
6
|
-
const agentDirPath = resolve(process.cwd(), options.agentDir);
|
|
7
|
-
const outDir = resolve(process.cwd(), options.outDir);
|
|
8
|
-
console.log(`\n Building agent...\n`);
|
|
9
|
-
if (!existsSync(agentDirPath)) {
|
|
10
|
-
console.error(` Agent directory not found: ${agentDirPath}`);
|
|
11
|
-
process.exit(1);
|
|
12
|
-
}
|
|
13
|
-
const { agent: discovered, diagnostics } = discoverAgent(agentDirPath);
|
|
14
|
-
if (diagnostics.some((d) => d.severity === "error")) {
|
|
15
|
-
for (const d of diagnostics) {
|
|
16
|
-
console.error(` ✖ ${d.code}: ${d.message}`);
|
|
17
|
-
}
|
|
18
|
-
process.exit(1);
|
|
19
|
-
}
|
|
20
|
-
try {
|
|
21
|
-
const agent = await loadAgent(agentDirPath);
|
|
22
|
-
mkdirSync(outDir, { recursive: true });
|
|
23
|
-
const manifest = {
|
|
24
|
-
config: agent.manifest.config,
|
|
25
|
-
instructions: agent.manifest.instructions,
|
|
26
|
-
tools: Object.keys(agent.manifest.tools),
|
|
27
|
-
skills: Object.keys(agent.manifest.skills),
|
|
28
|
-
hooks: Object.keys(agent.manifest.hooks),
|
|
29
|
-
channels: Object.keys(agent.manifest.channels),
|
|
30
|
-
schedules: Object.keys(agent.manifest.schedules),
|
|
31
|
-
discovered: {
|
|
32
|
-
tools: discovered.tools.map((t) => t.name),
|
|
33
|
-
skills: discovered.skills.map((s) => s.name),
|
|
34
|
-
hooks: discovered.hooks.map((h) => h.name),
|
|
35
|
-
channels: discovered.channels.map((c) => c.name),
|
|
36
|
-
schedules: discovered.schedules.map((s) => s.name),
|
|
37
|
-
},
|
|
38
|
-
session: agent.manifest.session,
|
|
39
|
-
policy: agent.manifest.policy,
|
|
40
|
-
};
|
|
41
|
-
writeFileSync(join(outDir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
42
|
-
console.log(` Written to ${outDir}/manifest.json`);
|
|
43
|
-
console.log(` Tools: ${manifest.tools.length}`);
|
|
44
|
-
console.log(` Skills: ${manifest.skills.length}`);
|
|
45
|
-
console.log(` Channels: ${manifest.channels.length}`);
|
|
46
|
-
console.log(` Schedules: ${manifest.schedules.length}`);
|
|
47
|
-
console.log(`\n Done.\n`);
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
console.error(` Build failed:`, err);
|
|
51
|
-
process.exit(1);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=build.js.map
|
package/dist/cli/build.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/dev.d.ts
DELETED
package/dist/cli/dev.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AAQA,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EhB"}
|