@agent-creator/cli 0.4.2 → 0.5.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 CHANGED
@@ -1,4 +1,4 @@
1
- # agent-creator-cli
1
+ # @agent-creator/cli
2
2
 
3
3
  CLI for creating package or service projects powered by `@agent-creator/core`.
4
4
 
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "name": "agent-creator-cli",
3
- "version": "0.4.2",
2
+ "name": "@agent-creator/cli",
3
+ "version": "0.5.0",
4
4
  "description": "CLI for creating projects powered by @agent-creator/core.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,4 +1,6 @@
1
1
  LLM_BASE_URL=https://api.openai.com/v1
2
- OPENAI_API_KEY=
3
- # Optional. Defaults to gpt-4o-mini in agent.config.ts.
2
+ OPENAI_API_KEY=your-openai-api-key
4
3
  LLM_MODEL=gpt-4o-mini
4
+
5
+ # Optional. Used by context.webhook and the webhook skill adapter.
6
+ WEBHOOK_URL=
@@ -8,6 +8,38 @@ Config schema: `{{configVersion}}`
8
8
 
9
9
  This is an independent runnable Agent project powered by `@agent-creator/core`.
10
10
 
11
+ ## 5 Minute Integration
12
+
13
+ ```bash
14
+ npm install
15
+ cp .env.example .env
16
+ npm run dev
17
+ ```
18
+
19
+ Edit `.env` and set `OPENAI_API_KEY`. Service mode exposes:
20
+
21
+ ```bash
22
+ curl -X POST http://localhost:3000/api/agent \
23
+ -H "content-type: application/json" \
24
+ -d '{"input":"Hello agent","sessionId":"demo"}'
25
+ ```
26
+
27
+ TypeScript callers can use the generated HTTP client:
28
+
29
+ ```ts
30
+ import { runAgentHttp } from './src/client.js';
31
+
32
+ const output = await runAgentHttp({
33
+ baseUrl: 'http://localhost:3000',
34
+ input: 'Hello agent',
35
+ sessionId: 'demo',
36
+ });
37
+ ```
38
+
39
+ After publishing or linking this generated package, consumers can import the client as `{{projectName}}/client`.
40
+
41
+ See `docs/api.md` for the full HTTP contract, streaming format, optional `AGENT_API_KEY` auth, and production notes.
42
+
11
43
  ## Configure The Agent
12
44
 
13
45
  Open `agent.config.ts` and set the minimum model configuration:
@@ -29,6 +61,8 @@ export OPENAI_API_KEY=your-key
29
61
  export LLM_MODEL=gpt-4o-mini
30
62
  ```
31
63
 
64
+ The generated `.env.example` contains the same variables. Service mode also supports optional `AGENT_API_KEY` bearer-token authentication.
65
+
32
66
  ## Run
33
67
 
34
68
  Package mode starts a command-line chat:
@@ -58,6 +92,12 @@ Then open the printed local URL and chat in the browser. Service mode also keeps
58
92
  npm run dev:agent
59
93
  ```
60
94
 
95
+ Health check:
96
+
97
+ ```bash
98
+ curl http://localhost:3000/api/agent/health
99
+ ```
100
+
61
101
  ## Customize Capabilities
62
102
 
63
103
  Add skills and compose the Agent in `src/index.ts`:
@@ -67,3 +107,27 @@ agent add skill calendar
67
107
  ```
68
108
 
69
109
  `src/index.ts` creates the Builder, registers every Skill from `src/skills/index.ts`, and calls `build()`.
110
+
111
+ Webhook is available as a built-in optional Skill adapter:
112
+
113
+ ```bash
114
+ agent add skill webhook
115
+ ```
116
+
117
+ Then set `WEBHOOK_URL` in `.env`. You can call it directly with `metadata.skill = 'webhook'`, or configure `createAgent({ webhook: { url } })` in `src/index.ts` and call `context.webhook?.notify(...)` from your own Skills.
118
+
119
+ To call a specific Skill directly through the default planner, pass metadata:
120
+
121
+ ```ts
122
+ await runAgent({
123
+ input: 'Run calendar search',
124
+ metadata: {
125
+ skill: 'calendar',
126
+ skillInput: { query: 'today' },
127
+ },
128
+ });
129
+ ```
130
+
131
+ ## Production Notes
132
+
133
+ The default memory provider is process-local in-memory storage. It is useful for development, but production deployments should replace it with a persistent `MemoryProvider`.
@@ -21,6 +21,10 @@ const config = {
21
21
  timeoutMs: 30000,
22
22
  maxRetries: 1,
23
23
  },
24
+ webhook: {
25
+ url: process.env.WEBHOOK_URL ?? '',
26
+ timeoutMs: 10000,
27
+ },
24
28
  skills: {
25
29
  enabled: [
26
30
  // agent-creator:skills
@@ -0,0 +1,186 @@
1
+ # {{projectName}} API
2
+
3
+ This project exposes the Agent as both a TypeScript package entrypoint and, in service mode, a small HTTP API.
4
+
5
+ ## Environment
6
+
7
+ Copy `.env.example` to `.env` and set:
8
+
9
+ ```bash
10
+ LLM_BASE_URL=https://api.openai.com/v1
11
+ OPENAI_API_KEY=your-openai-api-key
12
+ LLM_MODEL=gpt-4o-mini
13
+ ```
14
+
15
+ Service mode also supports optional API authentication:
16
+
17
+ ```bash
18
+ AGENT_API_KEY=replace-with-a-random-secret
19
+ ```
20
+
21
+ When `AGENT_API_KEY` is set, HTTP callers must send:
22
+
23
+ ```http
24
+ Authorization: Bearer replace-with-a-random-secret
25
+ ```
26
+
27
+ ## Package Entrypoint
28
+
29
+ Use `runAgent()` when calling from another TypeScript or Node.js module in the same process:
30
+
31
+ ```ts
32
+ import { runAgent } from './src/index.js';
33
+
34
+ const output = await runAgent({
35
+ input: 'Summarize today\'s support tickets',
36
+ sessionId: 'support-session-1',
37
+ });
38
+ ```
39
+
40
+ The default memory provider is process-local in-memory storage. It is convenient for development, but production deployments should replace it with a persistent `MemoryProvider`.
41
+
42
+ ## POST /api/agent
43
+
44
+ Runs the Agent and returns the final output as JSON.
45
+
46
+ Request:
47
+
48
+ ```json
49
+ {
50
+ "input": "Hello agent",
51
+ "sessionId": "optional-session-id"
52
+ }
53
+ ```
54
+
55
+ Response:
56
+
57
+ ```json
58
+ {
59
+ "success": true,
60
+ "intent": "generate_response",
61
+ "message": "Hello! How can I help?",
62
+ "data": {},
63
+ "traceId": "trace_..."
64
+ }
65
+ ```
66
+
67
+ Example:
68
+
69
+ ```bash
70
+ curl -X POST http://localhost:3000/api/agent \
71
+ -H "content-type: application/json" \
72
+ -d '{"input":"Hello agent","sessionId":"demo"}'
73
+ ```
74
+
75
+ If `AGENT_API_KEY` is set:
76
+
77
+ ```bash
78
+ curl -X POST http://localhost:3000/api/agent \
79
+ -H "authorization: Bearer $AGENT_API_KEY" \
80
+ -H "content-type: application/json" \
81
+ -d '{"input":"Hello agent","sessionId":"demo"}'
82
+ ```
83
+
84
+ ## POST /api/agent/stream
85
+
86
+ Runs the Agent and streams progress as newline-delimited JSON (`application/x-ndjson`).
87
+
88
+ Each line is one of:
89
+
90
+ ```json
91
+ { "type": "progress", "event": { "type": "agent.started", "message": "Agent started", "traceId": "trace_...", "at": "..." } }
92
+ ```
93
+
94
+ ```json
95
+ { "type": "final", "output": { "success": true, "intent": "generate_response", "message": "Done", "traceId": "trace_..." } }
96
+ ```
97
+
98
+ Example:
99
+
100
+ ```bash
101
+ curl -N -X POST http://localhost:3000/api/agent/stream \
102
+ -H "content-type: application/json" \
103
+ -d '{"input":"Hello agent","sessionId":"demo"}'
104
+ ```
105
+
106
+ ## GET /api/agent/health
107
+
108
+ Returns service readiness metadata without exposing secrets.
109
+
110
+ Response:
111
+
112
+ ```json
113
+ {
114
+ "ok": true,
115
+ "name": "{{projectName}}",
116
+ "version": "{{capabilityVersion}}",
117
+ "service": {
118
+ "enabled": true,
119
+ "framework": "next"
120
+ },
121
+ "model": {
122
+ "configured": true,
123
+ "baseUrlConfigured": true,
124
+ "apiKeyConfigured": true,
125
+ "model": "gpt-4o-mini"
126
+ }
127
+ }
128
+ ```
129
+
130
+ `ok` is `false` when required model configuration is missing.
131
+
132
+ ## TypeScript HTTP Client
133
+
134
+ `src/client.ts` exports helpers for another frontend or backend to call the service:
135
+
136
+ ```ts
137
+ import { runAgentHttp, streamAgentHttp } from './src/client.js';
138
+
139
+ const output = await runAgentHttp({
140
+ baseUrl: 'http://localhost:3000',
141
+ input: 'Hello agent',
142
+ sessionId: 'demo',
143
+ });
144
+
145
+ for await (const event of streamAgentHttp({
146
+ baseUrl: 'http://localhost:3000',
147
+ input: 'Show progress',
148
+ sessionId: 'demo',
149
+ })) {
150
+ console.log(event);
151
+ }
152
+ ```
153
+
154
+ Pass `apiKey` when `AGENT_API_KEY` is enabled.
155
+
156
+ ## Webhook Skill And Runtime Service
157
+
158
+ Add the optional built-in webhook Skill adapter:
159
+
160
+ ```bash
161
+ agent add skill webhook
162
+ ```
163
+
164
+ Set the target URL in `.env`:
165
+
166
+ ```bash
167
+ WEBHOOK_URL=https://example.com/webhook
168
+ ```
169
+
170
+ Call it directly:
171
+
172
+ ```ts
173
+ await runAgent({
174
+ input: 'Notify webhook',
175
+ metadata: {
176
+ skill: 'webhook',
177
+ skillInput: {
178
+ event: 'build.completed',
179
+ message: 'Build finished',
180
+ logs: ['npm test passed'],
181
+ },
182
+ },
183
+ });
184
+ ```
185
+
186
+ For developer-controlled side effects inside your own Skills, configure the runtime service and call `context.webhook?.notify(...)`. Do not read webhook URLs from user input or model output.
@@ -11,6 +11,10 @@
11
11
  ".": {
12
12
  "types": "./dist/src/index.d.ts",
13
13
  "import": "./dist/src/index.js"
14
+ },
15
+ "./client": {
16
+ "types": "./dist/src/client.d.ts",
17
+ "import": "./dist/src/client.js"
14
18
  }
15
19
  },
16
20
  "scripts": {
@@ -0,0 +1,78 @@
1
+ import type { AgentOutput, AgentProgressEvent } from '@agent-creator/core';
2
+
3
+ export interface AgentHttpOptions {
4
+ baseUrl: string;
5
+ input: string;
6
+ sessionId?: string;
7
+ apiKey?: string;
8
+ fetch?: typeof globalThis.fetch;
9
+ }
10
+
11
+ export type AgentStreamEvent =
12
+ | { type: 'progress'; event: AgentProgressEvent }
13
+ | { type: 'final'; output: AgentOutput };
14
+
15
+ export async function runAgentHttp(options: AgentHttpOptions): Promise<AgentOutput> {
16
+ const fetchImpl = options.fetch ?? globalThis.fetch;
17
+ if (!fetchImpl) throw new Error('Global fetch is unavailable. Node.js 18 or newer is required.');
18
+ const response = await fetchImpl(`${normalizeBaseUrl(options.baseUrl)}/api/agent`, {
19
+ method: 'POST',
20
+ headers: requestHeaders(options.apiKey),
21
+ body: JSON.stringify({ input: options.input, sessionId: options.sessionId }),
22
+ });
23
+ if (!response.ok) throw new Error(`agent_request_failed: ${response.status} ${await response.text()}`);
24
+ return await response.json() as AgentOutput;
25
+ }
26
+
27
+ export async function* streamAgentHttp(options: AgentHttpOptions): AsyncGenerator<AgentStreamEvent> {
28
+ const fetchImpl = options.fetch ?? globalThis.fetch;
29
+ if (!fetchImpl) throw new Error('Global fetch is unavailable. Node.js 18 or newer is required.');
30
+ const response = await fetchImpl(`${normalizeBaseUrl(options.baseUrl)}/api/agent/stream`, {
31
+ method: 'POST',
32
+ headers: requestHeaders(options.apiKey),
33
+ body: JSON.stringify({ input: options.input, sessionId: options.sessionId }),
34
+ });
35
+ if (!response.ok) throw new Error(`agent_stream_failed: ${response.status} ${await response.text()}`);
36
+ if (!response.body) throw new Error('agent_stream_unavailable: response body is missing');
37
+
38
+ const reader = response.body.getReader();
39
+ const decoder = new TextDecoder();
40
+ let buffer = '';
41
+
42
+ while (true) {
43
+ const { done, value } = await reader.read();
44
+ if (done) break;
45
+ buffer += decoder.decode(value, { stream: true });
46
+ const lines = buffer.split('\n');
47
+ buffer = lines.pop() ?? '';
48
+ for (const line of lines) {
49
+ const event = parseStreamLine(line);
50
+ if (event) yield event;
51
+ }
52
+ }
53
+
54
+ const finalEvent = parseStreamLine(buffer);
55
+ if (finalEvent) yield finalEvent;
56
+ }
57
+
58
+ function requestHeaders(apiKey?: string): HeadersInit {
59
+ return {
60
+ 'content-type': 'application/json',
61
+ ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),
62
+ };
63
+ }
64
+
65
+ function normalizeBaseUrl(baseUrl: string): string {
66
+ const normalized = baseUrl.trim().replace(/\/+$/, '');
67
+ if (!normalized) throw new Error('baseUrl is required.');
68
+ return normalized;
69
+ }
70
+
71
+ function parseStreamLine(line: string): AgentStreamEvent | undefined {
72
+ if (!line.trim()) return undefined;
73
+ const event = JSON.parse(line) as AgentStreamEvent;
74
+ if (event.type !== 'progress' && event.type !== 'final') {
75
+ throw new Error(`agent_stream_invalid_event: ${event.type}`);
76
+ }
77
+ return event;
78
+ }
@@ -6,7 +6,7 @@ let configuredAgent: Agent | undefined;
6
6
 
7
7
  export function getAgent(): Agent {
8
8
  if (configuredAgent) return configuredAgent;
9
- const builder = createAgent({ model: config.model });
9
+ const builder = createAgent({ model: config.model, webhook: config.webhook });
10
10
  for (const skill of skills) builder.useSkill(skill);
11
11
  configuredAgent = builder.build();
12
12
  return configuredAgent;
@@ -0,0 +1,10 @@
1
+ LLM_BASE_URL=https://api.openai.com/v1
2
+ OPENAI_API_KEY=your-openai-api-key
3
+ LLM_MODEL=gpt-4o-mini
4
+
5
+ # Optional. Used by context.webhook and the webhook skill adapter.
6
+ WEBHOOK_URL=
7
+
8
+ # Optional. When set, HTTP callers must send:
9
+ # Authorization: Bearer <this-value>
10
+ AGENT_API_KEY=
@@ -2,6 +2,16 @@
2
2
  "name": "{{projectName}}",
3
3
  "version": "{{capabilityVersion}}",
4
4
  "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/src/index.d.ts",
8
+ "import": "./dist/src/index.js"
9
+ },
10
+ "./client": {
11
+ "types": "./dist/src/client.d.ts",
12
+ "import": "./dist/src/client.js"
13
+ }
14
+ },
5
15
  "scripts": {
6
16
  "dev": "next dev",
7
17
  "dev:agent": "tsx src/cli.ts",
@@ -0,0 +1,19 @@
1
+ import { NextResponse } from 'next/server';
2
+
3
+ export function requireAgentApiKey(request: Request): NextResponse | undefined {
4
+ const expected = process.env.AGENT_API_KEY?.trim();
5
+ if (!expected) return undefined;
6
+
7
+ const authorization = request.headers.get('authorization') ?? '';
8
+ const actual = authorization.startsWith('Bearer ') ? authorization.slice('Bearer '.length).trim() : '';
9
+ if (actual === expected) return undefined;
10
+
11
+ return NextResponse.json(
12
+ {
13
+ success: false,
14
+ intent: 'unauthorized',
15
+ message: 'Missing or invalid Agent API key.',
16
+ },
17
+ { status: 401 },
18
+ );
19
+ }
@@ -0,0 +1,23 @@
1
+ import { NextResponse } from 'next/server';
2
+ import config from '../../../../../agent.config';
3
+
4
+ export async function GET() {
5
+ const baseUrlConfigured = Boolean(config.model.baseUrl?.trim());
6
+ const apiKeyConfigured = Boolean(config.model.apiKey?.trim());
7
+
8
+ return NextResponse.json({
9
+ ok: baseUrlConfigured && apiKeyConfigured,
10
+ name: config.name,
11
+ version: config.version,
12
+ service: {
13
+ enabled: config.service.enabled,
14
+ framework: config.service.framework,
15
+ },
16
+ model: {
17
+ configured: baseUrlConfigured && apiKeyConfigured,
18
+ baseUrlConfigured,
19
+ apiKeyConfigured,
20
+ model: config.model.model,
21
+ },
22
+ });
23
+ }
@@ -1,7 +1,11 @@
1
1
  import { NextResponse } from 'next/server';
2
2
  import { runAgent } from '../../../index';
3
+ import { requireAgentApiKey } from './auth';
3
4
 
4
5
  export async function POST(request: Request) {
6
+ const unauthorized = requireAgentApiKey(request);
7
+ if (unauthorized) return unauthorized;
8
+
5
9
  const body = await request.json().catch(() => ({})) as Record<string, unknown>;
6
10
  const input = typeof body.input === 'string' ? body.input : '';
7
11
  const sessionId = typeof body.sessionId === 'string' ? body.sessionId : undefined;
@@ -1,11 +1,15 @@
1
1
  import type { AgentOutput, AgentProgressEvent } from '@agent-creator/core';
2
2
  import { runAgent } from '../../../../index';
3
+ import { requireAgentApiKey } from '../auth';
3
4
 
4
5
  type StreamEvent =
5
6
  | { type: 'progress'; event: AgentProgressEvent }
6
7
  | { type: 'final'; output: AgentOutput };
7
8
 
8
9
  export async function POST(request: Request) {
10
+ const unauthorized = requireAgentApiKey(request);
11
+ if (unauthorized) return unauthorized;
12
+
9
13
  const body = await request.json().catch(() => ({})) as Record<string, unknown>;
10
14
  const input = typeof body.input === 'string' ? body.input : '';
11
15
  const sessionId = typeof body.sessionId === 'string' ? body.sessionId : undefined;
@@ -9,19 +9,24 @@ export async function addSkillCommand(skillName, _options = {}) {
9
9
  }
10
10
  const fileName = toKebabCase(skillName);
11
11
  const symbolName = `${toCamelCase(skillName)}Skill`;
12
- const dottedName = toToolName(skillName);
12
+ const isWebhookSkill = toKebabCase(skillName) === 'webhook';
13
+ const dottedName = isWebhookSkill ? 'webhook' : toToolName(skillName);
13
14
  const target = path.join(process.cwd(), 'src/skills', `${fileName}.ts`);
14
15
  if (await pathExists(target))
15
16
  throw new Error(`Skill already exists: src/skills/${fileName}.ts`);
16
- await writeFileEnsured(target, skillFile(symbolName, dottedName));
17
+ await writeFileEnsured(target, isWebhookSkill ? webhookSkillFile(symbolName) : skillFile(symbolName, dottedName));
17
18
  await updateSkillsIndex(fileName, symbolName, dottedName);
18
19
  await updateAgentConfig(dottedName);
20
+ if (isWebhookSkill)
21
+ await updateEnvExample();
19
22
  logger.success(`Added skill ${dottedName}.`);
20
23
  }
21
24
  function skillFile(symbolName, dottedName) {
22
25
  return `import { z } from 'zod';
23
26
  import type { Skill } from '@agent-creator/core';
24
27
 
28
+ // Call this skill directly by passing:
29
+ // metadata: { skill: '${dottedName}', skillInput: { query: '...' } }
25
30
  const inputSchema = z.object({
26
31
  query: z.string().min(1),
27
32
  });
@@ -42,6 +47,19 @@ export const ${symbolName}: Skill<z.infer<typeof inputSchema>, z.infer<typeof ou
42
47
  };
43
48
  `;
44
49
  }
50
+ function webhookSkillFile(symbolName) {
51
+ return `import { createWebhookSkill } from '@agent-creator/core';
52
+
53
+ // Call this skill directly by passing:
54
+ // metadata: {
55
+ // skill: 'webhook',
56
+ // skillInput: { event: 'build.completed', message: 'Build finished' }
57
+ // }
58
+ export const ${symbolName} = createWebhookSkill({
59
+ url: process.env.WEBHOOK_URL ?? '',
60
+ });
61
+ `;
62
+ }
45
63
  async function updateSkillsIndex(fileName, symbolName, dottedName) {
46
64
  const indexPath = path.join(process.cwd(), 'src/skills/index.ts');
47
65
  let text = await readText(indexPath);
@@ -56,3 +74,13 @@ async function updateAgentConfig(dottedName) {
56
74
  text = text.replace('// agent-creator:skills', `// agent-creator:skills\n '${dottedName}',`);
57
75
  await writeFileEnsured(configPath, text);
58
76
  }
77
+ async function updateEnvExample() {
78
+ const envPath = path.join(process.cwd(), '.env.example');
79
+ if (!(await pathExists(envPath)))
80
+ return;
81
+ const text = await readText(envPath);
82
+ if (text.includes('WEBHOOK_URL='))
83
+ return;
84
+ const suffix = text.endsWith('\n') ? '' : '\n';
85
+ await writeFileEnsured(envPath, `${text}${suffix}\n# Optional webhook target used by the webhook skill/runtime service.\nWEBHOOK_URL=\n`);
86
+ }
@@ -75,7 +75,10 @@ async function validateServiceProject(cwd, issues) {
75
75
  const required = [
76
76
  'src/app/page.tsx',
77
77
  'src/app/api/agent/route.ts',
78
+ 'src/app/api/agent/auth.ts',
79
+ 'src/app/api/agent/health/route.ts',
78
80
  'src/components/AgentChat.tsx',
81
+ 'docs/api.md',
79
82
  ];
80
83
  for (const file of required) {
81
84
  if (!(await pathExists(path.join(cwd, file)))) {
@@ -44,6 +44,16 @@ export declare const agentConfigSchema: z.ZodObject<{
44
44
  timeoutMs: number;
45
45
  maxRetries: number;
46
46
  }>;
47
+ webhook: z.ZodOptional<z.ZodObject<{
48
+ url: z.ZodString;
49
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ url: string;
52
+ timeoutMs?: number | undefined;
53
+ }, {
54
+ url: string;
55
+ timeoutMs?: number | undefined;
56
+ }>>;
47
57
  skills: z.ZodObject<{
48
58
  enabled: z.ZodArray<z.ZodString, "many">;
49
59
  }, "strip", z.ZodTypeAny, {
@@ -75,6 +85,10 @@ export declare const agentConfigSchema: z.ZodObject<{
75
85
  skills: {
76
86
  enabled: string[];
77
87
  };
88
+ webhook?: {
89
+ url: string;
90
+ timeoutMs?: number | undefined;
91
+ } | undefined;
78
92
  }, {
79
93
  service: {
80
94
  enabled: boolean;
@@ -99,5 +113,9 @@ export declare const agentConfigSchema: z.ZodObject<{
99
113
  skills: {
100
114
  enabled: string[];
101
115
  };
116
+ webhook?: {
117
+ url: string;
118
+ timeoutMs?: number | undefined;
119
+ } | undefined;
102
120
  }>;
103
121
  export type AgentConfigShape = z.infer<typeof agentConfigSchema>;
@@ -20,6 +20,10 @@ export const agentConfigSchema = z.object({
20
20
  timeoutMs: z.number().positive(),
21
21
  maxRetries: z.number().int().nonnegative(),
22
22
  }),
23
+ webhook: z.object({
24
+ url: z.string(),
25
+ timeoutMs: z.number().positive().optional(),
26
+ }).optional(),
23
27
  skills: z.object({
24
28
  enabled: z.array(z.string().min(1)),
25
29
  }),
@@ -1,4 +1,4 @@
1
1
  export declare const CLI_VERSION: string;
2
2
  export declare const SUPPORTED_CONFIG_VERSIONS: readonly ["0.1"];
3
3
  export declare const CURRENT_CONFIG_VERSION = "0.1";
4
- export declare const AGENT_CORE_CAPABILITY_VERSION = "0.4.2";
4
+ export declare const AGENT_CORE_CAPABILITY_VERSION = "0.5.0";
@@ -2,4 +2,4 @@ import packageJson from '../package.json' with { type: 'json' };
2
2
  export const CLI_VERSION = packageJson.version;
3
3
  export const SUPPORTED_CONFIG_VERSIONS = ['0.1'];
4
4
  export const CURRENT_CONFIG_VERSION = '0.1';
5
- export const AGENT_CORE_CAPABILITY_VERSION = '0.4.2';
5
+ export const AGENT_CORE_CAPABILITY_VERSION = '0.5.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-creator/cli",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "CLI for creating projects powered by @agent-creator/core.",
5
5
  "type": "module",
6
6
  "bin": {