@agent-creator/core 0.4.2

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 ADDED
@@ -0,0 +1,24 @@
1
+ # @agent-creator/core
2
+
3
+ Composable Agent runtime for skills, memory, planning, execution, guards, traces, and OpenAI-compatible models.
4
+
5
+ ```ts
6
+ import { createAgent } from '@agent-creator/core';
7
+
8
+ const agent = createAgent({
9
+ model: {
10
+ baseUrl: 'https://api.openai.com/v1',
11
+ apiKey: process.env.OPENAI_API_KEY!,
12
+ model: 'gpt-4o-mini',
13
+ },
14
+ })
15
+ .useSkill(mySkill)
16
+ .useMemory(myMemory)
17
+ .usePlanner(myPlanner)
18
+ .useExecutor(myExecutor)
19
+ .build();
20
+
21
+ await agent.run({ input: 'Run my task', sessionId: 'session-1' });
22
+ ```
23
+
24
+ `baseUrl`, `apiKey`, and `model` are required. The package does not read environment variables automatically.
@@ -0,0 +1,21 @@
1
+ import type { AgentContext, AgentOutput, AgentPlan, Executor, ExecutorContext, Guard, MemoryMessage, MemoryProvider, Planner, TraceProvider, TraceRun } from './types.js';
2
+ export declare class InMemoryProvider implements MemoryProvider {
3
+ private readonly sessions;
4
+ append(sessionId: string, message: MemoryMessage): void;
5
+ get(sessionId: string): MemoryMessage[];
6
+ clear(sessionId?: string): void;
7
+ }
8
+ export declare class DefaultGuard implements Guard {
9
+ check(): {
10
+ allowed: true;
11
+ };
12
+ }
13
+ export declare class DefaultPlanner implements Planner {
14
+ plan(context: AgentContext): AgentPlan;
15
+ }
16
+ export declare class DefaultExecutor implements Executor {
17
+ execute(plan: AgentPlan, context: ExecutorContext): Promise<AgentOutput>;
18
+ }
19
+ export declare class NoopTraceProvider implements TraceProvider {
20
+ start(): TraceRun;
21
+ }
@@ -0,0 +1,101 @@
1
+ export class InMemoryProvider {
2
+ sessions = new Map();
3
+ append(sessionId, message) {
4
+ const messages = this.sessions.get(sessionId) ?? [];
5
+ messages.push(message);
6
+ this.sessions.set(sessionId, messages);
7
+ }
8
+ get(sessionId) {
9
+ return [...(this.sessions.get(sessionId) ?? [])];
10
+ }
11
+ clear(sessionId) {
12
+ if (sessionId)
13
+ this.sessions.delete(sessionId);
14
+ else
15
+ this.sessions.clear();
16
+ }
17
+ }
18
+ export class DefaultGuard {
19
+ check() {
20
+ return { allowed: true };
21
+ }
22
+ }
23
+ export class DefaultPlanner {
24
+ plan(context) {
25
+ const requestedSkill = findRequestedSkill(context);
26
+ if (requestedSkill) {
27
+ return {
28
+ goal: `Execute ${requestedSkill}`,
29
+ steps: [{ type: 'skill', skill: requestedSkill, input: context.input.metadata?.skillInput ?? context.input.input }],
30
+ };
31
+ }
32
+ return {
33
+ goal: 'Generate a response',
34
+ steps: [{ type: 'model', task: 'generate_response', input: context.input.input }],
35
+ };
36
+ }
37
+ }
38
+ export class DefaultExecutor {
39
+ async execute(plan, context) {
40
+ let lastOutput;
41
+ for (const step of plan.steps) {
42
+ if (step.type === 'response') {
43
+ lastOutput = { success: true, intent: 'response', message: step.message, data: step.data, traceId: context.traceId };
44
+ }
45
+ else if (step.type === 'skill') {
46
+ await context.trace.append({ type: 'skill.start', data: { name: step.skill } });
47
+ await context.emitProgress({ type: 'skill.started', message: `开始执行 ${step.skill}`, data: { skill: step.skill } });
48
+ const data = await context.skills.execute(step.skill, step.input, {
49
+ traceId: context.traceId,
50
+ sessionId: context.input.sessionId,
51
+ userId: context.input.userId,
52
+ metadata: context.input.metadata,
53
+ emitProgress: context.emitProgress,
54
+ });
55
+ await context.emitProgress({ type: 'skill.completed', message: `执行 ${step.skill} 完成.`, data: { skill: step.skill } });
56
+ lastOutput = {
57
+ success: true,
58
+ intent: 'skill',
59
+ message: `${step.skill} 调用成功.`,
60
+ data,
61
+ traceId: context.traceId,
62
+ };
63
+ }
64
+ else {
65
+ const memory = context.input.sessionId ? await context.memory.get(context.input.sessionId) : [];
66
+ await context.emitProgress({ type: 'model.started', message: '调用大模型分析', data: { task: step.task } });
67
+ const result = await context.model.generate({ task: step.task, input: step.input, memory });
68
+ await context.emitProgress({ type: 'model.completed', message: '大模型分析完成', data: { task: step.task } });
69
+ lastOutput = {
70
+ success: true,
71
+ intent: step.task,
72
+ message: result.text,
73
+ data: result.data,
74
+ traceId: context.traceId,
75
+ };
76
+ }
77
+ }
78
+ return lastOutput ?? {
79
+ success: false,
80
+ intent: 'empty_plan',
81
+ message: '没有可执行的步骤',
82
+ traceId: context.traceId,
83
+ };
84
+ }
85
+ }
86
+ export class NoopTraceProvider {
87
+ start() {
88
+ return {
89
+ append() { },
90
+ end() { },
91
+ };
92
+ }
93
+ }
94
+ function findRequestedSkill(context) {
95
+ const explicit = context.input.metadata?.skill;
96
+ if (typeof explicit === 'string' && context.availableSkills.some((skill) => skill.name === explicit))
97
+ return explicit;
98
+ if (context.availableSkills.length === 1)
99
+ return context.availableSkills[0]?.name;
100
+ return context.availableSkills.find((skill) => context.input.input.startsWith(`${skill.name}:`))?.name;
101
+ }
@@ -0,0 +1,5 @@
1
+ export { AgentBuilder, createAgent } from './runtime.js';
2
+ export { DefaultExecutor, DefaultGuard, DefaultPlanner, InMemoryProvider, NoopTraceProvider } from './defaults.js';
3
+ export { createOpenAICompatibleProvider, normalizeModelConfig } from './openAICompatibleProvider.js';
4
+ export { SkillRegistry, ToolRegistry, toolToSkill } from './skillRegistry.js';
5
+ export type { Agent, AgentContext, AgentInput, AgentOutput, AgentPlan, AgentPlanStep, AgentProgressEvent, AgentProgressHandler, CreateAgentOptions, Executor, ExecutorContext, Guard, GuardResult, MemoryMessage, MemoryProvider, ModelGenerateInput, ModelGenerateOutput, ModelProvider, OpenAICompatibleModelConfig, Planner, Skill, SkillContext, SkillRegistryLike, ToolDefinition, ToolRegistryLike, TraceEvent, TraceProvider, TraceRun, } from './types.js';
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { AgentBuilder, createAgent } from './runtime.js';
2
+ export { DefaultExecutor, DefaultGuard, DefaultPlanner, InMemoryProvider, NoopTraceProvider } from './defaults.js';
3
+ export { createOpenAICompatibleProvider, normalizeModelConfig } from './openAICompatibleProvider.js';
4
+ export { SkillRegistry, ToolRegistry, toolToSkill } from './skillRegistry.js';
@@ -0,0 +1,9 @@
1
+ import type { ModelProvider, OpenAICompatibleModelConfig } from './types.js';
2
+ export declare const DEFAULT_MODEL = "gpt-4o-mini";
3
+ export interface OpenAICompatibleProviderOptions {
4
+ fetch?: typeof globalThis.fetch;
5
+ }
6
+ export declare function normalizeModelConfig(config: OpenAICompatibleModelConfig): Required<Omit<OpenAICompatibleModelConfig, 'headers'>> & {
7
+ headers: Record<string, string>;
8
+ };
9
+ export declare function createOpenAICompatibleProvider(modelConfig: OpenAICompatibleModelConfig, options?: OpenAICompatibleProviderOptions): ModelProvider;
@@ -0,0 +1,74 @@
1
+ const DEFAULT_TIMEOUT_MS = 30_000;
2
+ const DEFAULT_MAX_RETRIES = 1;
3
+ export const DEFAULT_MODEL = 'gpt-4o-mini';
4
+ export function normalizeModelConfig(config) {
5
+ const baseUrl = requireValue(config.baseUrl, 'model.baseUrl').replace(/\/+$/, '');
6
+ const apiKey = requireValue(config.apiKey, 'model.apiKey');
7
+ const model = config.model?.trim() || DEFAULT_MODEL;
8
+ return {
9
+ baseUrl,
10
+ apiKey,
11
+ model,
12
+ timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,
13
+ maxRetries: config.maxRetries ?? DEFAULT_MAX_RETRIES,
14
+ headers: { ...(config.headers ?? {}) },
15
+ };
16
+ }
17
+ export function createOpenAICompatibleProvider(modelConfig, options = {}) {
18
+ const config = normalizeModelConfig(modelConfig);
19
+ const fetchImpl = options.fetch ?? globalThis.fetch;
20
+ if (!fetchImpl)
21
+ throw new Error('Global fetch is unavailable. Node.js 18 or newer is required.');
22
+ return {
23
+ async generate(input) {
24
+ let lastError;
25
+ for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {
26
+ const controller = new AbortController();
27
+ const timer = setTimeout(() => controller.abort(), config.timeoutMs);
28
+ try {
29
+ const response = await fetchImpl(`${config.baseUrl}/chat/completions`, {
30
+ method: 'POST',
31
+ headers: {
32
+ 'content-type': 'application/json',
33
+ authorization: `Bearer ${config.apiKey}`,
34
+ ...config.headers,
35
+ },
36
+ body: JSON.stringify({
37
+ model: config.model,
38
+ messages: [
39
+ ...input.memory.map((message) => ({ role: message.role, content: message.content })),
40
+ { role: 'user', content: stringifyInput(input.input) },
41
+ ],
42
+ }),
43
+ signal: controller.signal,
44
+ });
45
+ if (!response.ok)
46
+ throw new Error(`model_request_failed: ${response.status} ${await response.text()}`);
47
+ const payload = await response.json();
48
+ const text = payload.choices?.[0]?.message?.content;
49
+ if (!text)
50
+ throw new Error('model_response_invalid: choices[0].message.content is missing');
51
+ return { text };
52
+ }
53
+ catch (error) {
54
+ lastError = error;
55
+ if (attempt === config.maxRetries)
56
+ break;
57
+ }
58
+ finally {
59
+ clearTimeout(timer);
60
+ }
61
+ }
62
+ throw lastError instanceof Error ? lastError : new Error(String(lastError));
63
+ },
64
+ };
65
+ }
66
+ function requireValue(value, field) {
67
+ const normalized = value?.trim();
68
+ if (!normalized)
69
+ throw new Error(`${field} is required.`);
70
+ return normalized;
71
+ }
72
+ function stringifyInput(input) {
73
+ return typeof input === 'string' ? input : JSON.stringify(input);
74
+ }
@@ -0,0 +1,20 @@
1
+ import type { Agent, CreateAgentOptions, Executor, Guard, MemoryProvider, ModelProvider, Planner, Skill, TraceProvider } from './types.js';
2
+ export declare class AgentBuilder {
3
+ private readonly skills;
4
+ private memory;
5
+ private planner;
6
+ private executor;
7
+ private model;
8
+ private guard;
9
+ private trace;
10
+ constructor(options: CreateAgentOptions);
11
+ useSkill(skill: Skill): this;
12
+ useMemory(memory: MemoryProvider): this;
13
+ usePlanner(planner: Planner): this;
14
+ useExecutor(executor: Executor): this;
15
+ useModel(model: ModelProvider): this;
16
+ useGuard(guard: Guard): this;
17
+ useTrace(trace: TraceProvider): this;
18
+ build(): Agent;
19
+ }
20
+ export declare function createAgent(options: CreateAgentOptions): AgentBuilder;
@@ -0,0 +1,164 @@
1
+ import { DefaultExecutor, DefaultGuard, DefaultPlanner, InMemoryProvider, NoopTraceProvider } from './defaults.js';
2
+ import { createOpenAICompatibleProvider, normalizeModelConfig } from './openAICompatibleProvider.js';
3
+ import { SkillRegistry, toolToSkill } from './skillRegistry.js';
4
+ export class AgentBuilder {
5
+ skills = new SkillRegistry();
6
+ memory = new InMemoryProvider();
7
+ planner = new DefaultPlanner();
8
+ executor = new DefaultExecutor();
9
+ model;
10
+ guard = new DefaultGuard();
11
+ trace = new NoopTraceProvider();
12
+ constructor(options) {
13
+ const modelConfig = normalizeModelConfig(options.model);
14
+ this.model = createOpenAICompatibleProvider(modelConfig);
15
+ for (const tool of options.tools ?? [])
16
+ this.skills.register(toolToSkill(tool));
17
+ for (const tool of options.toolRegistry?.listTools() ?? []) {
18
+ this.skills.register('execute' in tool ? tool : toolToSkill(tool));
19
+ }
20
+ }
21
+ useSkill(skill) {
22
+ this.skills.register(skill);
23
+ return this;
24
+ }
25
+ useMemory(memory) {
26
+ this.memory = memory;
27
+ return this;
28
+ }
29
+ usePlanner(planner) {
30
+ this.planner = planner;
31
+ return this;
32
+ }
33
+ useExecutor(executor) {
34
+ this.executor = executor;
35
+ return this;
36
+ }
37
+ useModel(model) {
38
+ this.model = model;
39
+ return this;
40
+ }
41
+ useGuard(guard) {
42
+ this.guard = guard;
43
+ return this;
44
+ }
45
+ useTrace(trace) {
46
+ this.trace = trace;
47
+ return this;
48
+ }
49
+ build() {
50
+ assertFunction(this.memory, 'get', 'memory');
51
+ assertFunction(this.memory, 'append', 'memory');
52
+ assertFunction(this.planner, 'plan', 'planner');
53
+ assertFunction(this.executor, 'execute', 'executor');
54
+ assertFunction(this.model, 'generate', 'model');
55
+ assertFunction(this.guard, 'check', 'guard');
56
+ assertFunction(this.trace, 'start', 'trace');
57
+ const runtime = {
58
+ skills: this.skills,
59
+ memory: this.memory,
60
+ planner: this.planner,
61
+ executor: this.executor,
62
+ model: this.model,
63
+ guard: this.guard,
64
+ trace: this.trace,
65
+ };
66
+ return {
67
+ async run(input) {
68
+ if (!input.input?.trim())
69
+ throw new Error('input is required.');
70
+ const traceId = createId('trace');
71
+ const traceRun = runtime.trace.start(input, traceId);
72
+ const progress = progressEmitter(input, traceId);
73
+ try {
74
+ await progress({ type: 'agent.started', message: '智能体开始工作', data: { input: input.input } });
75
+ const memory = input.sessionId ? await runtime.memory.get(input.sessionId) : [];
76
+ const context = {
77
+ input,
78
+ memory,
79
+ availableSkills: runtime.skills.list().map(({ name, description }) => ({ name, description })),
80
+ };
81
+ await progress({ type: 'guard.started', message: '检查请求防护' });
82
+ const guardResult = await runtime.guard.check(context);
83
+ if (!guardResult.allowed) {
84
+ const output = {
85
+ success: false,
86
+ intent: 'safe_redirect',
87
+ message: guardResult.reason ?? 'The request was blocked by the guard.',
88
+ traceId,
89
+ };
90
+ await progress({ type: 'guard.blocked', message: output.message });
91
+ await traceRun.end(output);
92
+ await progress({ type: 'agent.completed', message: 'Agent completed.', data: output });
93
+ return output;
94
+ }
95
+ await progress({ type: 'guard.completed', message: '请求防护已通过' });
96
+ if (input.sessionId) {
97
+ await runtime.memory.append(input.sessionId, { role: 'user', content: input.input, at: new Date().toISOString() });
98
+ }
99
+ await progress({ type: 'planner.started', message: '正在规划后续步骤' });
100
+ const plan = await runtime.planner.plan(context);
101
+ await traceRun.append({ type: 'plan.created', data: plan });
102
+ await progress({ type: 'plan.created', message: '计划已创建', data: plan });
103
+ const output = await runtime.executor.execute(plan, {
104
+ input,
105
+ traceId,
106
+ memory: runtime.memory,
107
+ model: runtime.model,
108
+ skills: runtime.skills,
109
+ trace: traceRun,
110
+ emitProgress: progress,
111
+ });
112
+ if (input.sessionId) {
113
+ await runtime.memory.append(input.sessionId, {
114
+ role: 'agent',
115
+ content: output.message,
116
+ data: output.data,
117
+ at: new Date().toISOString(),
118
+ });
119
+ }
120
+ await traceRun.end(output);
121
+ await progress({ type: 'agent.completed', message: '智能体工作完成', data: output });
122
+ return output;
123
+ }
124
+ catch (error) {
125
+ const output = {
126
+ success: false,
127
+ intent: 'runtime_error',
128
+ message: 'Agent execution failed.',
129
+ errors: [error instanceof Error ? error.message : String(error)],
130
+ traceId,
131
+ };
132
+ await traceRun.end(output);
133
+ await progress({ type: 'agent.failed', message: 'Agent execution failed.', data: output });
134
+ return output;
135
+ }
136
+ },
137
+ };
138
+ }
139
+ }
140
+ export function createAgent(options) {
141
+ if (!options?.model)
142
+ throw new Error('model configuration is required.');
143
+ return new AgentBuilder(options);
144
+ }
145
+ function assertFunction(value, key, moduleName) {
146
+ if (typeof value[key] !== 'function') {
147
+ throw new Error(`${moduleName}.${key} must be a function.`);
148
+ }
149
+ }
150
+ function createId(prefix) {
151
+ return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
152
+ }
153
+ function progressEmitter(input, traceId) {
154
+ const handler = input.metadata?.onProgress;
155
+ return async (event) => {
156
+ if (typeof handler !== 'function')
157
+ return;
158
+ await handler({
159
+ ...event,
160
+ traceId,
161
+ at: new Date().toISOString(),
162
+ });
163
+ };
164
+ }
@@ -0,0 +1,20 @@
1
+ import type { Skill, SkillContext, SkillRegistryLike, ToolDefinition } from './types.js';
2
+ export declare class SkillRegistry implements SkillRegistryLike {
3
+ private readonly skills;
4
+ register(skill: Skill): void;
5
+ has(name: string): boolean;
6
+ get(name: string): Skill;
7
+ list(): Skill[];
8
+ execute(name: string, input: unknown, context: SkillContext): Promise<unknown>;
9
+ }
10
+ export declare function toolToSkill(tool: ToolDefinition): Skill;
11
+ /** @deprecated Use SkillRegistry. */
12
+ export declare class ToolRegistry {
13
+ private readonly registry;
14
+ registerTool(tool: ToolDefinition): void;
15
+ getTool(name: string): Skill;
16
+ listTools(): Skill[];
17
+ hasTool(name: string): boolean;
18
+ executeTool(name: string, input: unknown, context: SkillContext): Promise<unknown>;
19
+ toSkillRegistry(): SkillRegistry;
20
+ }
@@ -0,0 +1,63 @@
1
+ export class SkillRegistry {
2
+ skills = new Map();
3
+ register(skill) {
4
+ if (this.skills.has(skill.name)) {
5
+ throw new Error(`skill_already_registered: ${skill.name}`);
6
+ }
7
+ this.skills.set(skill.name, skill);
8
+ }
9
+ has(name) {
10
+ return this.skills.has(name);
11
+ }
12
+ get(name) {
13
+ const skill = this.skills.get(name);
14
+ if (!skill)
15
+ throw new Error(`skill_not_found: ${name}`);
16
+ return skill;
17
+ }
18
+ list() {
19
+ return [...this.skills.values()];
20
+ }
21
+ async execute(name, input, context) {
22
+ const skill = this.get(name);
23
+ const parsedInput = skill.inputSchema.safeParse(input);
24
+ if (!parsedInput.success)
25
+ throw new Error(`skill_input_invalid: ${parsedInput.error.message}`);
26
+ const output = await skill.execute(parsedInput.data, context);
27
+ const parsedOutput = skill.outputSchema.safeParse(output);
28
+ if (!parsedOutput.success)
29
+ throw new Error(`skill_output_invalid: ${parsedOutput.error.message}`);
30
+ return parsedOutput.data;
31
+ }
32
+ }
33
+ export function toolToSkill(tool) {
34
+ return {
35
+ name: tool.name,
36
+ description: tool.description,
37
+ inputSchema: tool.inputSchema,
38
+ outputSchema: tool.outputSchema,
39
+ execute: (input, context) => tool.handler(input, context),
40
+ };
41
+ }
42
+ /** @deprecated Use SkillRegistry. */
43
+ export class ToolRegistry {
44
+ registry = new SkillRegistry();
45
+ registerTool(tool) {
46
+ this.registry.register(toolToSkill(tool));
47
+ }
48
+ getTool(name) {
49
+ return this.registry.get(name);
50
+ }
51
+ listTools() {
52
+ return this.registry.list();
53
+ }
54
+ hasTool(name) {
55
+ return this.registry.has(name);
56
+ }
57
+ executeTool(name, input, context) {
58
+ return this.registry.execute(name, input, context);
59
+ }
60
+ toSkillRegistry() {
61
+ return this.registry;
62
+ }
63
+ }
@@ -0,0 +1,157 @@
1
+ import type { z } from 'zod';
2
+ export interface OpenAICompatibleModelConfig {
3
+ baseUrl: string;
4
+ apiKey: string;
5
+ model?: string;
6
+ timeoutMs?: number;
7
+ maxRetries?: number;
8
+ headers?: Record<string, string>;
9
+ }
10
+ export interface CreateAgentOptions {
11
+ model: OpenAICompatibleModelConfig;
12
+ /** @deprecated Register skills with builder.useSkill(). */
13
+ tools?: ToolDefinition[];
14
+ /** @deprecated Register skills with builder.useSkill(). */
15
+ toolRegistry?: ToolRegistryLike;
16
+ }
17
+ export interface AgentInput {
18
+ input: string;
19
+ userId?: string;
20
+ sessionId?: string;
21
+ metadata?: Record<string, unknown>;
22
+ }
23
+ export interface AgentProgressEvent {
24
+ type: string;
25
+ message: string;
26
+ data?: unknown;
27
+ traceId: string;
28
+ at: string;
29
+ }
30
+ export type AgentProgressHandler = (event: AgentProgressEvent) => void | Promise<void>;
31
+ export interface AgentOutput {
32
+ success: boolean;
33
+ intent: string;
34
+ message: string;
35
+ data?: unknown;
36
+ warnings?: string[];
37
+ errors?: string[];
38
+ traceId?: string;
39
+ }
40
+ export interface SkillContext {
41
+ traceId: string;
42
+ sessionId?: string;
43
+ userId?: string;
44
+ metadata?: Record<string, unknown>;
45
+ emitProgress?(event: Omit<AgentProgressEvent, 'traceId' | 'at'>): Promise<void>;
46
+ }
47
+ export interface Skill<I = unknown, O = unknown> {
48
+ name: string;
49
+ description: string;
50
+ inputSchema: z.ZodType<I>;
51
+ outputSchema: z.ZodType<O>;
52
+ execute(input: I, context: SkillContext): Promise<O>;
53
+ }
54
+ export interface MemoryMessage {
55
+ role: 'user' | 'agent' | 'system';
56
+ content: string;
57
+ data?: unknown;
58
+ at: string;
59
+ }
60
+ export interface MemoryProvider {
61
+ append(sessionId: string, message: MemoryMessage): void | Promise<void>;
62
+ get(sessionId: string): MemoryMessage[] | Promise<MemoryMessage[]>;
63
+ clear(sessionId?: string): void | Promise<void>;
64
+ }
65
+ export interface ModelGenerateInput {
66
+ task: string;
67
+ input: unknown;
68
+ memory: MemoryMessage[];
69
+ }
70
+ export interface ModelGenerateOutput {
71
+ text: string;
72
+ data?: unknown;
73
+ }
74
+ export interface ModelProvider {
75
+ generate(input: ModelGenerateInput): Promise<ModelGenerateOutput>;
76
+ }
77
+ export interface AgentContext {
78
+ input: AgentInput;
79
+ memory: MemoryMessage[];
80
+ availableSkills: ReadonlyArray<Pick<Skill, 'name' | 'description'>>;
81
+ }
82
+ export interface AgentPlan {
83
+ goal: string;
84
+ steps: AgentPlanStep[];
85
+ }
86
+ export type AgentPlanStep = {
87
+ type: 'model';
88
+ task: string;
89
+ input: unknown;
90
+ } | {
91
+ type: 'skill';
92
+ skill: string;
93
+ input: unknown;
94
+ } | {
95
+ type: 'response';
96
+ message: string;
97
+ data?: unknown;
98
+ };
99
+ export interface Planner {
100
+ plan(context: AgentContext): AgentPlan | Promise<AgentPlan>;
101
+ }
102
+ export interface ExecutorContext {
103
+ input: AgentInput;
104
+ traceId: string;
105
+ memory: MemoryProvider;
106
+ model: ModelProvider;
107
+ skills: SkillRegistryLike;
108
+ trace: TraceRun;
109
+ emitProgress(event: Omit<AgentProgressEvent, 'traceId' | 'at'>): Promise<void>;
110
+ }
111
+ export interface Executor {
112
+ execute(plan: AgentPlan, context: ExecutorContext): Promise<AgentOutput>;
113
+ }
114
+ export interface GuardResult {
115
+ allowed: boolean;
116
+ reason?: string;
117
+ }
118
+ export interface Guard {
119
+ check(context: AgentContext): GuardResult | Promise<GuardResult>;
120
+ }
121
+ export interface TraceEvent {
122
+ type: string;
123
+ data?: unknown;
124
+ at: string;
125
+ }
126
+ export interface TraceRun {
127
+ append(event: Omit<TraceEvent, 'at'>): void | Promise<void>;
128
+ end(output: AgentOutput): void | Promise<void>;
129
+ }
130
+ export interface TraceProvider {
131
+ start(input: AgentInput, traceId: string): TraceRun;
132
+ }
133
+ export interface Agent {
134
+ run(input: AgentInput): Promise<AgentOutput>;
135
+ }
136
+ export interface SkillRegistryLike {
137
+ register(skill: Skill): void;
138
+ has(name: string): boolean;
139
+ get(name: string): Skill;
140
+ list(): Skill[];
141
+ execute(name: string, input: unknown, context: SkillContext): Promise<unknown>;
142
+ }
143
+ /** @deprecated Use Skill. */
144
+ export interface ToolDefinition<I = unknown, O = unknown> {
145
+ name: string;
146
+ description: string;
147
+ inputSchema: z.ZodType<I>;
148
+ outputSchema: z.ZodType<O>;
149
+ permission?: 'public' | 'external_api' | 'user_private';
150
+ timeoutMs?: number;
151
+ retry?: number;
152
+ handler(input: I, context: SkillContext): Promise<O>;
153
+ }
154
+ /** @deprecated Use SkillRegistry. */
155
+ export interface ToolRegistryLike {
156
+ listTools(): Array<ToolDefinition | Skill>;
157
+ }
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@agent-creator/core",
3
+ "version": "0.4.2",
4
+ "description": "Composable Agent runtime with skills, memory, planning, execution, and OpenAI-compatible models.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md",
17
+ "package.json"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "test": "vitest run",
22
+ "check:package": "npm pack --dry-run --json"
23
+ },
24
+ "dependencies": {
25
+ "zod": "^3.23.8"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^20.14.12",
29
+ "typescript": "^5.9.3",
30
+ "vitest": "^2.0.5"
31
+ },
32
+ "engines": {
33
+ "node": ">=18"
34
+ }
35
+ }