@contractspec/lib.ai-agent 0.0.0-canary-20260113162409
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/LICENSE +21 -0
- package/README.md +49 -0
- package/dist/_virtual/rolldown_runtime.js +8 -0
- package/dist/agent/agent-factory.d.ts +104 -0
- package/dist/agent/agent-factory.d.ts.map +1 -0
- package/dist/agent/agent-factory.js +103 -0
- package/dist/agent/agent-factory.js.map +1 -0
- package/dist/agent/contract-spec-agent.d.ts +75 -0
- package/dist/agent/contract-spec-agent.d.ts.map +1 -0
- package/dist/agent/contract-spec-agent.js +148 -0
- package/dist/agent/contract-spec-agent.js.map +1 -0
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.js +4 -0
- package/dist/agent/unified-agent.d.ts +131 -0
- package/dist/agent/unified-agent.d.ts.map +1 -0
- package/dist/agent/unified-agent.js +267 -0
- package/dist/agent/unified-agent.js.map +1 -0
- package/dist/approval/index.d.ts +2 -0
- package/dist/approval/index.js +3 -0
- package/dist/approval/workflow.d.ts +156 -0
- package/dist/approval/workflow.d.ts.map +1 -0
- package/dist/approval/workflow.js +160 -0
- package/dist/approval/workflow.js.map +1 -0
- package/dist/exporters/claude-agent-exporter.d.ts +64 -0
- package/dist/exporters/claude-agent-exporter.d.ts.map +1 -0
- package/dist/exporters/claude-agent-exporter.js +210 -0
- package/dist/exporters/claude-agent-exporter.js.map +1 -0
- package/dist/exporters/index.d.ts +4 -0
- package/dist/exporters/index.js +4 -0
- package/dist/exporters/opencode-exporter.d.ts +64 -0
- package/dist/exporters/opencode-exporter.d.ts.map +1 -0
- package/dist/exporters/opencode-exporter.js +200 -0
- package/dist/exporters/opencode-exporter.js.map +1 -0
- package/dist/exporters/types.d.ts +239 -0
- package/dist/exporters/types.d.ts.map +1 -0
- package/dist/exporters/types.js +0 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +31 -0
- package/dist/interop/index.d.ts +4 -0
- package/dist/interop/index.js +4 -0
- package/dist/interop/spec-consumer.d.ts +81 -0
- package/dist/interop/spec-consumer.d.ts.map +1 -0
- package/dist/interop/spec-consumer.js +287 -0
- package/dist/interop/spec-consumer.js.map +1 -0
- package/dist/interop/tool-consumer.d.ts +68 -0
- package/dist/interop/tool-consumer.d.ts.map +1 -0
- package/dist/interop/tool-consumer.js +220 -0
- package/dist/interop/tool-consumer.js.map +1 -0
- package/dist/interop/types.d.ts +262 -0
- package/dist/interop/types.d.ts.map +1 -0
- package/dist/interop/types.js +0 -0
- package/dist/knowledge/index.d.ts +2 -0
- package/dist/knowledge/index.js +3 -0
- package/dist/knowledge/injector.d.ts +38 -0
- package/dist/knowledge/injector.d.ts.map +1 -0
- package/dist/knowledge/injector.js +58 -0
- package/dist/knowledge/injector.js.map +1 -0
- package/dist/memory/in-memory.d.ts +22 -0
- package/dist/memory/in-memory.d.ts.map +1 -0
- package/dist/memory/in-memory.js +48 -0
- package/dist/memory/in-memory.js.map +1 -0
- package/dist/memory/index.d.ts +3 -0
- package/dist/memory/index.js +4 -0
- package/dist/memory/manager.d.ts +42 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +80 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/providers/claude-agent-sdk/adapter.d.ts +58 -0
- package/dist/providers/claude-agent-sdk/adapter.d.ts.map +1 -0
- package/dist/providers/claude-agent-sdk/adapter.js +306 -0
- package/dist/providers/claude-agent-sdk/adapter.js.map +1 -0
- package/dist/providers/claude-agent-sdk/index.d.ts +4 -0
- package/dist/providers/claude-agent-sdk/index.js +5 -0
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts +101 -0
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +1 -0
- package/dist/providers/claude-agent-sdk/session-bridge.js +158 -0
- package/dist/providers/claude-agent-sdk/session-bridge.js.map +1 -0
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +110 -0
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +1 -0
- package/dist/providers/claude-agent-sdk/tool-bridge.js +122 -0
- package/dist/providers/claude-agent-sdk/tool-bridge.js.map +1 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/opencode-sdk/adapter.d.ts +54 -0
- package/dist/providers/opencode-sdk/adapter.d.ts.map +1 -0
- package/dist/providers/opencode-sdk/adapter.js +276 -0
- package/dist/providers/opencode-sdk/adapter.js.map +1 -0
- package/dist/providers/opencode-sdk/agent-bridge.d.ts +94 -0
- package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +1 -0
- package/dist/providers/opencode-sdk/agent-bridge.js +165 -0
- package/dist/providers/opencode-sdk/agent-bridge.js.map +1 -0
- package/dist/providers/opencode-sdk/index.d.ts +4 -0
- package/dist/providers/opencode-sdk/index.js +5 -0
- package/dist/providers/opencode-sdk/tool-bridge.d.ts +81 -0
- package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +1 -0
- package/dist/providers/opencode-sdk/tool-bridge.js +127 -0
- package/dist/providers/opencode-sdk/tool-bridge.js.map +1 -0
- package/dist/providers/registry.d.ts +22 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +52 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +243 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +44 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.js +4 -0
- package/dist/schema/json-schema-to-zod.d.ts +55 -0
- package/dist/schema/json-schema-to-zod.d.ts.map +1 -0
- package/dist/schema/json-schema-to-zod.js +124 -0
- package/dist/schema/json-schema-to-zod.js.map +1 -0
- package/dist/schema/schema-output.d.ts +77 -0
- package/dist/schema/schema-output.d.ts.map +1 -0
- package/dist/schema/schema-output.js +65 -0
- package/dist/schema/schema-output.js.map +1 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.js +3 -0
- package/dist/session/store.d.ts +74 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +79 -0
- package/dist/session/store.js.map +1 -0
- package/dist/spec/index.d.ts +3 -0
- package/dist/spec/index.js +4 -0
- package/dist/spec/registry.d.ts +47 -0
- package/dist/spec/registry.d.ts.map +1 -0
- package/dist/spec/registry.js +65 -0
- package/dist/spec/registry.js.map +1 -0
- package/dist/spec/spec.d.ts +127 -0
- package/dist/spec/spec.d.ts.map +1 -0
- package/dist/spec/spec.js +30 -0
- package/dist/spec/spec.js.map +1 -0
- package/dist/telemetry/adapter.d.ts +73 -0
- package/dist/telemetry/adapter.d.ts.map +1 -0
- package/dist/telemetry/adapter.js +103 -0
- package/dist/telemetry/adapter.js.map +1 -0
- package/dist/telemetry/index.d.ts +2 -0
- package/dist/telemetry/index.js +3 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/knowledge-tool.d.ts +21 -0
- package/dist/tools/knowledge-tool.d.ts.map +1 -0
- package/dist/tools/knowledge-tool.js +54 -0
- package/dist/tools/knowledge-tool.js.map +1 -0
- package/dist/tools/mcp-client.d.ts +59 -0
- package/dist/tools/mcp-client.d.ts.map +1 -0
- package/dist/tools/mcp-client.js +58 -0
- package/dist/tools/mcp-client.js.map +1 -0
- package/dist/tools/mcp-server.d.ts +46 -0
- package/dist/tools/mcp-server.d.ts.map +1 -0
- package/dist/tools/mcp-server.js +69 -0
- package/dist/tools/mcp-server.js.map +1 -0
- package/dist/tools/tool-adapter.d.ts +50 -0
- package/dist/tools/tool-adapter.d.ts.map +1 -0
- package/dist/tools/tool-adapter.js +80 -0
- package/dist/tools/tool-adapter.js.map +1 -0
- package/dist/types.d.ts +146 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +0 -0
- package/package.json +155 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
//#region src/approval/workflow.ts
|
|
4
|
+
/**
|
|
5
|
+
* In-memory approval store for development and testing.
|
|
6
|
+
*/
|
|
7
|
+
var InMemoryApprovalStore = class {
|
|
8
|
+
items = /* @__PURE__ */ new Map();
|
|
9
|
+
async create(request) {
|
|
10
|
+
this.items.set(request.id, request);
|
|
11
|
+
}
|
|
12
|
+
async get(id) {
|
|
13
|
+
return this.items.get(id) ?? null;
|
|
14
|
+
}
|
|
15
|
+
async getByToolCallId(toolCallId) {
|
|
16
|
+
for (const request of this.items.values()) if (request.toolCallId === toolCallId) return request;
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
async update(id, updates) {
|
|
20
|
+
const existing = this.items.get(id);
|
|
21
|
+
if (existing) this.items.set(id, {
|
|
22
|
+
...existing,
|
|
23
|
+
...updates
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async list(options) {
|
|
27
|
+
let results = [...this.items.values()];
|
|
28
|
+
if (options?.status) results = results.filter((r) => r.status === options.status);
|
|
29
|
+
if (options?.agentId) results = results.filter((r) => r.agentId === options.agentId);
|
|
30
|
+
if (options?.tenantId) results = results.filter((r) => r.tenantId === options.tenantId);
|
|
31
|
+
return results.sort((a, b) => b.requestedAt.getTime() - a.requestedAt.getTime());
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
this.items.clear();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Approval workflow for managing tool execution approvals.
|
|
39
|
+
*
|
|
40
|
+
* Integrates with AI SDK v6's `needsApproval` feature on tools.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const workflow = new ApprovalWorkflow();
|
|
45
|
+
*
|
|
46
|
+
* // When a tool needs approval
|
|
47
|
+
* const request = await workflow.requestApproval({
|
|
48
|
+
* sessionId: 'sess_123',
|
|
49
|
+
* agentId: 'support.bot.v1',
|
|
50
|
+
* toolName: 'delete_account',
|
|
51
|
+
* toolCallId: 'call_abc',
|
|
52
|
+
* toolArgs: { userId: 'user_123' },
|
|
53
|
+
* reason: 'Account deletion requires human approval',
|
|
54
|
+
* });
|
|
55
|
+
*
|
|
56
|
+
* // When approval is granted
|
|
57
|
+
* await workflow.approve(request.id, 'admin@example.com', 'Verified identity');
|
|
58
|
+
*
|
|
59
|
+
* // Or rejected
|
|
60
|
+
* await workflow.reject(request.id, 'admin@example.com', 'Suspicious activity');
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
var ApprovalWorkflow = class {
|
|
64
|
+
constructor(store = new InMemoryApprovalStore()) {
|
|
65
|
+
this.store = store;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Request approval for a tool execution.
|
|
69
|
+
*/
|
|
70
|
+
async requestApproval(params) {
|
|
71
|
+
const request = {
|
|
72
|
+
id: randomUUID(),
|
|
73
|
+
sessionId: params.sessionId,
|
|
74
|
+
agentId: params.agentId,
|
|
75
|
+
tenantId: params.tenantId,
|
|
76
|
+
toolName: params.toolName,
|
|
77
|
+
toolCallId: params.toolCallId,
|
|
78
|
+
toolArgs: params.toolArgs,
|
|
79
|
+
reason: params.reason,
|
|
80
|
+
requestedAt: /* @__PURE__ */ new Date(),
|
|
81
|
+
status: "pending",
|
|
82
|
+
payload: params.payload
|
|
83
|
+
};
|
|
84
|
+
await this.store.create(request);
|
|
85
|
+
return request;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Request approval from an AI SDK tool call.
|
|
89
|
+
*/
|
|
90
|
+
async requestApprovalFromToolCall(toolCall, context) {
|
|
91
|
+
return this.requestApproval({
|
|
92
|
+
sessionId: context.sessionId,
|
|
93
|
+
agentId: context.agentId,
|
|
94
|
+
tenantId: context.tenantId,
|
|
95
|
+
toolName: toolCall.toolName,
|
|
96
|
+
toolCallId: toolCall.toolCallId,
|
|
97
|
+
toolArgs: toolCall.args,
|
|
98
|
+
reason: context.reason ?? `Tool "${toolCall.toolName}" requires approval`
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Approve a pending request.
|
|
103
|
+
*/
|
|
104
|
+
async approve(id, reviewer, notes) {
|
|
105
|
+
await this.store.update(id, {
|
|
106
|
+
status: "approved",
|
|
107
|
+
reviewer,
|
|
108
|
+
resolvedAt: /* @__PURE__ */ new Date(),
|
|
109
|
+
notes
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Reject a pending request.
|
|
114
|
+
*/
|
|
115
|
+
async reject(id, reviewer, notes) {
|
|
116
|
+
await this.store.update(id, {
|
|
117
|
+
status: "rejected",
|
|
118
|
+
reviewer,
|
|
119
|
+
resolvedAt: /* @__PURE__ */ new Date(),
|
|
120
|
+
notes
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get approval status for a tool call.
|
|
125
|
+
*/
|
|
126
|
+
async getStatus(toolCallId) {
|
|
127
|
+
return (await this.store.getByToolCallId(toolCallId))?.status ?? null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if a tool call is approved.
|
|
131
|
+
*/
|
|
132
|
+
async isApproved(toolCallId) {
|
|
133
|
+
return await this.getStatus(toolCallId) === "approved";
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* List pending approvals.
|
|
137
|
+
*/
|
|
138
|
+
async listPending(options) {
|
|
139
|
+
return this.store.list({
|
|
140
|
+
...options,
|
|
141
|
+
status: "pending"
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get approval request by ID.
|
|
146
|
+
*/
|
|
147
|
+
async get(id) {
|
|
148
|
+
return this.store.get(id);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* Create an approval workflow instance.
|
|
153
|
+
*/
|
|
154
|
+
function createApprovalWorkflow(store) {
|
|
155
|
+
return new ApprovalWorkflow(store);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
//#endregion
|
|
159
|
+
export { ApprovalWorkflow, InMemoryApprovalStore, createApprovalWorkflow };
|
|
160
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","names":[],"sources":["../../src/approval/workflow.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { ToolCallInfo } from '../types';\n\nexport type ApprovalStatus = 'pending' | 'approved' | 'rejected';\n\n/**\n * Approval request for a tool execution.\n *\n * When a tool has `needsApproval: true` in AI SDK v6, the agent\n * will pause and wait for approval before executing the tool.\n */\nexport interface ApprovalRequest {\n /** Unique request ID */\n id: string;\n /** Agent session ID */\n sessionId: string;\n /** Agent ID */\n agentId: string;\n /** Tenant ID for scoping */\n tenantId?: string;\n /** Tool name requiring approval */\n toolName: string;\n /** Tool call ID from AI SDK */\n toolCallId: string;\n /** Tool arguments */\n toolArgs: unknown;\n /** Human-readable reason for approval */\n reason: string;\n /** When the approval was requested */\n requestedAt: Date;\n /** Current status */\n status: ApprovalStatus;\n /** Additional context payload */\n payload?: Record<string, unknown>;\n /** Who resolved the approval */\n reviewer?: string;\n /** When the approval was resolved */\n resolvedAt?: Date;\n /** Reviewer notes */\n notes?: string;\n}\n\n/**\n * Storage interface for approval requests.\n */\nexport interface ApprovalStore {\n create(request: ApprovalRequest): Promise<void>;\n get(id: string): Promise<ApprovalRequest | null>;\n getByToolCallId(toolCallId: string): Promise<ApprovalRequest | null>;\n update(\n id: string,\n updates: Partial<Omit<ApprovalRequest, 'id' | 'sessionId'>>\n ): Promise<void>;\n list(options?: {\n status?: ApprovalStatus;\n agentId?: string;\n tenantId?: string;\n }): Promise<ApprovalRequest[]>;\n}\n\n/**\n * In-memory approval store for development and testing.\n */\nexport class InMemoryApprovalStore implements ApprovalStore {\n private readonly items = new Map<string, ApprovalRequest>();\n\n async create(request: ApprovalRequest): Promise<void> {\n this.items.set(request.id, request);\n }\n\n async get(id: string): Promise<ApprovalRequest | null> {\n return this.items.get(id) ?? null;\n }\n\n async getByToolCallId(toolCallId: string): Promise<ApprovalRequest | null> {\n for (const request of this.items.values()) {\n if (request.toolCallId === toolCallId) {\n return request;\n }\n }\n return null;\n }\n\n async update(\n id: string,\n updates: Partial<Omit<ApprovalRequest, 'id' | 'sessionId'>>\n ): Promise<void> {\n const existing = this.items.get(id);\n if (existing) {\n this.items.set(id, { ...existing, ...updates });\n }\n }\n\n async list(options?: {\n status?: ApprovalStatus;\n agentId?: string;\n tenantId?: string;\n }): Promise<ApprovalRequest[]> {\n let results = [...this.items.values()];\n\n if (options?.status) {\n results = results.filter((r) => r.status === options.status);\n }\n if (options?.agentId) {\n results = results.filter((r) => r.agentId === options.agentId);\n }\n if (options?.tenantId) {\n results = results.filter((r) => r.tenantId === options.tenantId);\n }\n\n return results.sort(\n (a, b) => b.requestedAt.getTime() - a.requestedAt.getTime()\n );\n }\n\n clear(): void {\n this.items.clear();\n }\n}\n\n/**\n * Approval workflow for managing tool execution approvals.\n *\n * Integrates with AI SDK v6's `needsApproval` feature on tools.\n *\n * @example\n * ```typescript\n * const workflow = new ApprovalWorkflow();\n *\n * // When a tool needs approval\n * const request = await workflow.requestApproval({\n * sessionId: 'sess_123',\n * agentId: 'support.bot.v1',\n * toolName: 'delete_account',\n * toolCallId: 'call_abc',\n * toolArgs: { userId: 'user_123' },\n * reason: 'Account deletion requires human approval',\n * });\n *\n * // When approval is granted\n * await workflow.approve(request.id, 'admin@example.com', 'Verified identity');\n *\n * // Or rejected\n * await workflow.reject(request.id, 'admin@example.com', 'Suspicious activity');\n * ```\n */\nexport class ApprovalWorkflow {\n constructor(\n private readonly store: ApprovalStore = new InMemoryApprovalStore()\n ) {}\n\n /**\n * Request approval for a tool execution.\n */\n async requestApproval(params: {\n sessionId: string;\n agentId: string;\n tenantId?: string;\n toolName: string;\n toolCallId: string;\n toolArgs: unknown;\n reason: string;\n payload?: Record<string, unknown>;\n }): Promise<ApprovalRequest> {\n const request: ApprovalRequest = {\n id: randomUUID(),\n sessionId: params.sessionId,\n agentId: params.agentId,\n tenantId: params.tenantId,\n toolName: params.toolName,\n toolCallId: params.toolCallId,\n toolArgs: params.toolArgs,\n reason: params.reason,\n requestedAt: new Date(),\n status: 'pending',\n payload: params.payload,\n };\n\n await this.store.create(request);\n return request;\n }\n\n /**\n * Request approval from an AI SDK tool call.\n */\n async requestApprovalFromToolCall(\n toolCall: ToolCallInfo,\n context: {\n sessionId: string;\n agentId: string;\n tenantId?: string;\n reason?: string;\n }\n ): Promise<ApprovalRequest> {\n return this.requestApproval({\n sessionId: context.sessionId,\n agentId: context.agentId,\n tenantId: context.tenantId,\n toolName: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n toolArgs: toolCall.args,\n reason: context.reason ?? `Tool \"${toolCall.toolName}\" requires approval`,\n });\n }\n\n /**\n * Approve a pending request.\n */\n async approve(id: string, reviewer: string, notes?: string): Promise<void> {\n await this.store.update(id, {\n status: 'approved',\n reviewer,\n resolvedAt: new Date(),\n notes,\n });\n }\n\n /**\n * Reject a pending request.\n */\n async reject(id: string, reviewer: string, notes?: string): Promise<void> {\n await this.store.update(id, {\n status: 'rejected',\n reviewer,\n resolvedAt: new Date(),\n notes,\n });\n }\n\n /**\n * Get approval status for a tool call.\n */\n async getStatus(toolCallId: string): Promise<ApprovalStatus | null> {\n const request = await this.store.getByToolCallId(toolCallId);\n return request?.status ?? null;\n }\n\n /**\n * Check if a tool call is approved.\n */\n async isApproved(toolCallId: string): Promise<boolean> {\n const status = await this.getStatus(toolCallId);\n return status === 'approved';\n }\n\n /**\n * List pending approvals.\n */\n async listPending(options?: {\n agentId?: string;\n tenantId?: string;\n }): Promise<ApprovalRequest[]> {\n return this.store.list({ ...options, status: 'pending' });\n }\n\n /**\n * Get approval request by ID.\n */\n async get(id: string): Promise<ApprovalRequest | null> {\n return this.store.get(id);\n }\n}\n\n/**\n * Create an approval workflow instance.\n */\nexport function createApprovalWorkflow(\n store?: ApprovalStore\n): ApprovalWorkflow {\n return new ApprovalWorkflow(store);\n}\n"],"mappings":";;;;;;AA+DA,IAAa,wBAAb,MAA4D;CAC1D,AAAiB,wBAAQ,IAAI,KAA8B;CAE3D,MAAM,OAAO,SAAyC;AACpD,OAAK,MAAM,IAAI,QAAQ,IAAI,QAAQ;;CAGrC,MAAM,IAAI,IAA6C;AACrD,SAAO,KAAK,MAAM,IAAI,GAAG,IAAI;;CAG/B,MAAM,gBAAgB,YAAqD;AACzE,OAAK,MAAM,WAAW,KAAK,MAAM,QAAQ,CACvC,KAAI,QAAQ,eAAe,WACzB,QAAO;AAGX,SAAO;;CAGT,MAAM,OACJ,IACA,SACe;EACf,MAAM,WAAW,KAAK,MAAM,IAAI,GAAG;AACnC,MAAI,SACF,MAAK,MAAM,IAAI,IAAI;GAAE,GAAG;GAAU,GAAG;GAAS,CAAC;;CAInD,MAAM,KAAK,SAIoB;EAC7B,IAAI,UAAU,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC;AAEtC,MAAI,SAAS,OACX,WAAU,QAAQ,QAAQ,MAAM,EAAE,WAAW,QAAQ,OAAO;AAE9D,MAAI,SAAS,QACX,WAAU,QAAQ,QAAQ,MAAM,EAAE,YAAY,QAAQ,QAAQ;AAEhE,MAAI,SAAS,SACX,WAAU,QAAQ,QAAQ,MAAM,EAAE,aAAa,QAAQ,SAAS;AAGlE,SAAO,QAAQ,MACZ,GAAG,MAAM,EAAE,YAAY,SAAS,GAAG,EAAE,YAAY,SAAS,CAC5D;;CAGH,QAAc;AACZ,OAAK,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BtB,IAAa,mBAAb,MAA8B;CAC5B,YACE,AAAiB,QAAuB,IAAI,uBAAuB,EACnE;EADiB;;;;;CAMnB,MAAM,gBAAgB,QASO;EAC3B,MAAM,UAA2B;GAC/B,IAAI,YAAY;GAChB,WAAW,OAAO;GAClB,SAAS,OAAO;GAChB,UAAU,OAAO;GACjB,UAAU,OAAO;GACjB,YAAY,OAAO;GACnB,UAAU,OAAO;GACjB,QAAQ,OAAO;GACf,6BAAa,IAAI,MAAM;GACvB,QAAQ;GACR,SAAS,OAAO;GACjB;AAED,QAAM,KAAK,MAAM,OAAO,QAAQ;AAChC,SAAO;;;;;CAMT,MAAM,4BACJ,UACA,SAM0B;AAC1B,SAAO,KAAK,gBAAgB;GAC1B,WAAW,QAAQ;GACnB,SAAS,QAAQ;GACjB,UAAU,QAAQ;GAClB,UAAU,SAAS;GACnB,YAAY,SAAS;GACrB,UAAU,SAAS;GACnB,QAAQ,QAAQ,UAAU,SAAS,SAAS,SAAS;GACtD,CAAC;;;;;CAMJ,MAAM,QAAQ,IAAY,UAAkB,OAA+B;AACzE,QAAM,KAAK,MAAM,OAAO,IAAI;GAC1B,QAAQ;GACR;GACA,4BAAY,IAAI,MAAM;GACtB;GACD,CAAC;;;;;CAMJ,MAAM,OAAO,IAAY,UAAkB,OAA+B;AACxE,QAAM,KAAK,MAAM,OAAO,IAAI;GAC1B,QAAQ;GACR;GACA,4BAAY,IAAI,MAAM;GACtB;GACD,CAAC;;;;;CAMJ,MAAM,UAAU,YAAoD;AAElE,UADgB,MAAM,KAAK,MAAM,gBAAgB,WAAW,GAC5C,UAAU;;;;;CAM5B,MAAM,WAAW,YAAsC;AAErD,SADe,MAAM,KAAK,UAAU,WAAW,KAC7B;;;;;CAMpB,MAAM,YAAY,SAGa;AAC7B,SAAO,KAAK,MAAM,KAAK;GAAE,GAAG;GAAS,QAAQ;GAAW,CAAC;;;;;CAM3D,MAAM,IAAI,IAA6C;AACrD,SAAO,KAAK,MAAM,IAAI,GAAG;;;;;;AAO7B,SAAgB,uBACd,OACkB;AAClB,QAAO,IAAI,iBAAiB,MAAM"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { AgentSpec } from "../spec/spec.js";
|
|
2
|
+
import { ClaudeAgentExportOptions, ClaudeAgentExportResult, Exporter } from "./types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/exporters/claude-agent-exporter.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Claude Agent SDK Exporter.
|
|
8
|
+
*/
|
|
9
|
+
declare class ClaudeAgentExporter implements Exporter<ClaudeAgentExportOptions, ClaudeAgentExportResult> {
|
|
10
|
+
readonly format: "claude-agent";
|
|
11
|
+
/**
|
|
12
|
+
* Export an AgentSpec to Claude Agent SDK format.
|
|
13
|
+
*/
|
|
14
|
+
export(spec: AgentSpec, options?: ClaudeAgentExportOptions): ClaudeAgentExportResult;
|
|
15
|
+
/**
|
|
16
|
+
* Export multiple specs.
|
|
17
|
+
*/
|
|
18
|
+
exportMany(specs: AgentSpec[], options?: ClaudeAgentExportOptions): ClaudeAgentExportResult[];
|
|
19
|
+
/**
|
|
20
|
+
* Validate that a spec can be exported.
|
|
21
|
+
*/
|
|
22
|
+
validate(spec: AgentSpec): {
|
|
23
|
+
valid: boolean;
|
|
24
|
+
errors: string[];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Build Claude Agent SDK configuration.
|
|
28
|
+
*/
|
|
29
|
+
private buildConfig;
|
|
30
|
+
/**
|
|
31
|
+
* Build system prompt from spec.
|
|
32
|
+
*/
|
|
33
|
+
private buildSystemPrompt;
|
|
34
|
+
/**
|
|
35
|
+
* Export tools to Claude Agent SDK format.
|
|
36
|
+
*/
|
|
37
|
+
private exportTools;
|
|
38
|
+
/**
|
|
39
|
+
* Normalize schema to Claude Agent SDK format.
|
|
40
|
+
*/
|
|
41
|
+
private normalizeSchema;
|
|
42
|
+
/**
|
|
43
|
+
* Generate CLAUDE.md content for Claude Code CLI integration.
|
|
44
|
+
*/
|
|
45
|
+
private generateClaudeMd;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Export an AgentSpec to Claude Agent SDK format.
|
|
49
|
+
*/
|
|
50
|
+
declare function exportToClaudeAgent(spec: AgentSpec, options?: ClaudeAgentExportOptions): ClaudeAgentExportResult;
|
|
51
|
+
/**
|
|
52
|
+
* Generate CLAUDE.md content from an AgentSpec.
|
|
53
|
+
*/
|
|
54
|
+
declare function generateClaudeMd(spec: AgentSpec, options?: Omit<ClaudeAgentExportOptions, 'generateClaudeMd'>): string;
|
|
55
|
+
/**
|
|
56
|
+
* Validate an AgentSpec for Claude Agent SDK export.
|
|
57
|
+
*/
|
|
58
|
+
declare function validateForClaudeAgent(spec: AgentSpec): {
|
|
59
|
+
valid: boolean;
|
|
60
|
+
errors: string[];
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { ClaudeAgentExporter, exportToClaudeAgent, generateClaudeMd, validateForClaudeAgent };
|
|
64
|
+
//# sourceMappingURL=claude-agent-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-agent-exporter.d.ts","names":[],"sources":["../../src/exporters/claude-agent-exporter.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAyDa,cAjCA,mBAAA,YAA+B,QAiC/B,CAhCX,wBAgCW,EA/BX,uBA+BW,CAAA,CAAA;EACR,SAAA,MAAA,EAAA,cAAA;EAOY;;;EAgRD,MAAA,CAAA,IAAA,EA/SN,SA+SyB,EAAA,OAAA,CAAA,EA9StB,wBA8SsB,CAAA,EA7S9B,uBA6S8B;EAC3B;;;EAEkB,UAAA,CAAA,KAAA,EA5Rf,SA4Re,EAAA,EAAA,OAAA,CAAA,EA3Rb,wBA2Ra,CAAA,EA1RrB,uBA0RqB,EAAA;EAQV;;;EAEJ,QAAA,CAAA,IAAA,EA7RK,SA6RL,CAAA,EAAA;IAAI,KAAA,EAAA,OAAA;IAUA,MAAA,EAAA,MAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;iBAvBA,mBAAA,OACR,qBACI,2BACT;;;;iBAQa,gBAAA,OACR,qBACI,KAAK;;;;iBAUD,sBAAA,OAA6B"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { agentKey } from "../spec/spec.js";
|
|
2
|
+
|
|
3
|
+
//#region src/exporters/claude-agent-exporter.ts
|
|
4
|
+
/**
|
|
5
|
+
* Claude Agent SDK Exporter.
|
|
6
|
+
*/
|
|
7
|
+
var ClaudeAgentExporter = class {
|
|
8
|
+
format = "claude-agent";
|
|
9
|
+
/**
|
|
10
|
+
* Export an AgentSpec to Claude Agent SDK format.
|
|
11
|
+
*/
|
|
12
|
+
export(spec, options = {}) {
|
|
13
|
+
const tools = this.exportTools(spec);
|
|
14
|
+
return {
|
|
15
|
+
config: this.buildConfig(spec, tools, options),
|
|
16
|
+
claudeMd: options.generateClaudeMd ? this.generateClaudeMd(spec, options) : void 0,
|
|
17
|
+
tools,
|
|
18
|
+
exportedAt: /* @__PURE__ */ new Date(),
|
|
19
|
+
sourceSpec: agentKey(spec.meta)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Export multiple specs.
|
|
24
|
+
*/
|
|
25
|
+
exportMany(specs, options = {}) {
|
|
26
|
+
return specs.map((spec) => this.export(spec, options));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate that a spec can be exported.
|
|
30
|
+
*/
|
|
31
|
+
validate(spec) {
|
|
32
|
+
const errors = [];
|
|
33
|
+
if (!spec.meta?.key) errors.push("Spec must have a meta.key");
|
|
34
|
+
if (!spec.instructions) errors.push("Spec must have instructions");
|
|
35
|
+
if (!spec.tools || spec.tools.length === 0) errors.push("Spec must have at least one tool");
|
|
36
|
+
for (const tool of spec.tools ?? []) {
|
|
37
|
+
if (!tool.name) errors.push("All tools must have a name");
|
|
38
|
+
if (!tool.description && !tool.name) errors.push(`Tool must have a description or name`);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
valid: errors.length === 0,
|
|
42
|
+
errors
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build Claude Agent SDK configuration.
|
|
47
|
+
*/
|
|
48
|
+
buildConfig(spec, tools, options) {
|
|
49
|
+
const config = {
|
|
50
|
+
model: options.model ?? "claude-sonnet-4-20250514",
|
|
51
|
+
system: this.buildSystemPrompt(spec, options),
|
|
52
|
+
tools,
|
|
53
|
+
max_turns: spec.maxSteps ?? 10
|
|
54
|
+
};
|
|
55
|
+
if (options.computerUse) config.computer_use = true;
|
|
56
|
+
if (options.extendedThinking) config.extended_thinking = true;
|
|
57
|
+
if (options.mcpServers && options.mcpServers.length > 0) config.mcp_servers = options.mcpServers;
|
|
58
|
+
return config;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Build system prompt from spec.
|
|
62
|
+
*/
|
|
63
|
+
buildSystemPrompt(spec, options) {
|
|
64
|
+
const parts = [];
|
|
65
|
+
parts.push(spec.instructions);
|
|
66
|
+
if (spec.knowledge && spec.knowledge.length > 0) {
|
|
67
|
+
parts.push("");
|
|
68
|
+
parts.push("## Knowledge Sources");
|
|
69
|
+
for (const k of spec.knowledge) if (k.instructions) parts.push(`- ${k.key}: ${k.instructions}`);
|
|
70
|
+
}
|
|
71
|
+
if (spec.policy) {
|
|
72
|
+
parts.push("");
|
|
73
|
+
parts.push("## Policy");
|
|
74
|
+
if (spec.policy.confidence?.min) parts.push(`- Minimum confidence: ${spec.policy.confidence.min}`);
|
|
75
|
+
if (spec.policy.escalation) parts.push("- Escalation policy is configured");
|
|
76
|
+
}
|
|
77
|
+
if (options.metadata) {
|
|
78
|
+
parts.push("");
|
|
79
|
+
parts.push("## Additional Context");
|
|
80
|
+
for (const [key, value] of Object.entries(options.metadata)) parts.push(`- ${key}: ${String(value)}`);
|
|
81
|
+
}
|
|
82
|
+
return parts.join("\n");
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Export tools to Claude Agent SDK format.
|
|
86
|
+
*/
|
|
87
|
+
exportTools(spec) {
|
|
88
|
+
return spec.tools.map((tool) => ({
|
|
89
|
+
name: tool.name,
|
|
90
|
+
description: tool.description ?? `Execute ${tool.name}`,
|
|
91
|
+
input_schema: this.normalizeSchema(tool.schema),
|
|
92
|
+
requires_confirmation: tool.requiresApproval ?? !tool.automationSafe
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Normalize schema to Claude Agent SDK format.
|
|
97
|
+
*/
|
|
98
|
+
normalizeSchema(schema) {
|
|
99
|
+
if (!schema) return { type: "object" };
|
|
100
|
+
if (schema.type === "object") return {
|
|
101
|
+
type: "object",
|
|
102
|
+
properties: schema.properties,
|
|
103
|
+
required: schema.required
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
type: "object",
|
|
107
|
+
properties: { value: schema },
|
|
108
|
+
required: ["value"]
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Generate CLAUDE.md content for Claude Code CLI integration.
|
|
113
|
+
*/
|
|
114
|
+
generateClaudeMd(spec, options) {
|
|
115
|
+
const lines = [];
|
|
116
|
+
lines.push("# Agent Configuration");
|
|
117
|
+
lines.push("");
|
|
118
|
+
if (spec.description) {
|
|
119
|
+
lines.push(`> ${spec.description}`);
|
|
120
|
+
lines.push("");
|
|
121
|
+
}
|
|
122
|
+
lines.push("## Metadata");
|
|
123
|
+
lines.push("");
|
|
124
|
+
lines.push(`- **Name**: ${spec.meta.key}`);
|
|
125
|
+
lines.push(`- **Version**: ${spec.meta.version}`);
|
|
126
|
+
if (spec.meta.owners && spec.meta.owners.length > 0) lines.push(`- **Owners**: ${spec.meta.owners.join(", ")}`);
|
|
127
|
+
if (options.model) lines.push(`- **Model**: ${options.model}`);
|
|
128
|
+
lines.push("");
|
|
129
|
+
lines.push("## Instructions");
|
|
130
|
+
lines.push("");
|
|
131
|
+
lines.push(spec.instructions);
|
|
132
|
+
lines.push("");
|
|
133
|
+
if (spec.tools.length > 0) {
|
|
134
|
+
lines.push("## Available Tools");
|
|
135
|
+
lines.push("");
|
|
136
|
+
for (const tool of spec.tools) {
|
|
137
|
+
const flags = [];
|
|
138
|
+
if (tool.requiresApproval) flags.push("requires approval");
|
|
139
|
+
if (tool.automationSafe === false) flags.push("not automation safe");
|
|
140
|
+
const flagStr = flags.length > 0 ? ` (${flags.join(", ")})` : "";
|
|
141
|
+
lines.push(`### ${tool.name}${flagStr}`);
|
|
142
|
+
lines.push("");
|
|
143
|
+
if (tool.description) {
|
|
144
|
+
lines.push(tool.description);
|
|
145
|
+
lines.push("");
|
|
146
|
+
}
|
|
147
|
+
if (tool.schema) {
|
|
148
|
+
lines.push("**Parameters:**");
|
|
149
|
+
lines.push("```json");
|
|
150
|
+
lines.push(JSON.stringify(tool.schema, null, 2));
|
|
151
|
+
lines.push("```");
|
|
152
|
+
lines.push("");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (spec.knowledge && spec.knowledge.length > 0) {
|
|
157
|
+
lines.push("## Knowledge Sources");
|
|
158
|
+
lines.push("");
|
|
159
|
+
for (const k of spec.knowledge) {
|
|
160
|
+
const required = k.required ? "(required)" : "(optional)";
|
|
161
|
+
lines.push(`- **${k.key}** ${required}`);
|
|
162
|
+
if (k.instructions) lines.push(` - ${k.instructions}`);
|
|
163
|
+
}
|
|
164
|
+
lines.push("");
|
|
165
|
+
}
|
|
166
|
+
if (spec.policy) {
|
|
167
|
+
lines.push("## Policy");
|
|
168
|
+
lines.push("");
|
|
169
|
+
if (spec.policy.confidence?.min) lines.push(`- Minimum confidence: ${spec.policy.confidence.min}`);
|
|
170
|
+
if (spec.policy.escalation) lines.push("- Escalation policy configured");
|
|
171
|
+
if (spec.policy.flags && spec.policy.flags.length > 0) lines.push(`- Feature flags: ${spec.policy.flags.join(", ")}`);
|
|
172
|
+
lines.push("");
|
|
173
|
+
}
|
|
174
|
+
if (options.mcpServers && options.mcpServers.length > 0) {
|
|
175
|
+
lines.push("## MCP Servers");
|
|
176
|
+
lines.push("");
|
|
177
|
+
for (const server of options.mcpServers) lines.push(`- **${server.name}**: \`${server.command}${server.args ? " " + server.args.join(" ") : ""}\``);
|
|
178
|
+
lines.push("");
|
|
179
|
+
}
|
|
180
|
+
lines.push("---");
|
|
181
|
+
lines.push("");
|
|
182
|
+
lines.push(`*Generated from ContractSpec: ${agentKey(spec.meta)}*`);
|
|
183
|
+
return lines.join("\n");
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Export an AgentSpec to Claude Agent SDK format.
|
|
188
|
+
*/
|
|
189
|
+
function exportToClaudeAgent(spec, options) {
|
|
190
|
+
return new ClaudeAgentExporter().export(spec, options);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Generate CLAUDE.md content from an AgentSpec.
|
|
194
|
+
*/
|
|
195
|
+
function generateClaudeMd(spec, options) {
|
|
196
|
+
return new ClaudeAgentExporter().export(spec, {
|
|
197
|
+
...options,
|
|
198
|
+
generateClaudeMd: true
|
|
199
|
+
}).claudeMd ?? "";
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Validate an AgentSpec for Claude Agent SDK export.
|
|
203
|
+
*/
|
|
204
|
+
function validateForClaudeAgent(spec) {
|
|
205
|
+
return new ClaudeAgentExporter().validate(spec);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
//#endregion
|
|
209
|
+
export { ClaudeAgentExporter, exportToClaudeAgent, generateClaudeMd, validateForClaudeAgent };
|
|
210
|
+
//# sourceMappingURL=claude-agent-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-agent-exporter.js","names":[],"sources":["../../src/exporters/claude-agent-exporter.ts"],"sourcesContent":["/**\n * Claude Agent SDK Exporter\n *\n * Exports ContractSpec AgentSpec definitions to formats compatible with\n * @anthropic-ai/claude-agent-sdk and Claude Code CLI.\n */\n\nimport type { AgentSpec } from '../spec/spec';\nimport { agentKey } from '../spec/spec';\nimport type {\n Exporter,\n ClaudeAgentExportOptions,\n ClaudeAgentExportResult,\n ClaudeAgentConfig,\n ClaudeToolDefinition,\n} from './types';\n\n// ============================================================================\n// Exporter Implementation\n// ============================================================================\n\n/**\n * Claude Agent SDK Exporter.\n */\nexport class ClaudeAgentExporter implements Exporter<\n ClaudeAgentExportOptions,\n ClaudeAgentExportResult\n> {\n readonly format = 'claude-agent' as const;\n\n /**\n * Export an AgentSpec to Claude Agent SDK format.\n */\n export(\n spec: AgentSpec,\n options: ClaudeAgentExportOptions = {}\n ): ClaudeAgentExportResult {\n const tools = this.exportTools(spec);\n const config = this.buildConfig(spec, tools, options);\n const claudeMd = options.generateClaudeMd\n ? this.generateClaudeMd(spec, options)\n : undefined;\n\n return {\n config,\n claudeMd,\n tools,\n exportedAt: new Date(),\n sourceSpec: agentKey(spec.meta),\n };\n }\n\n /**\n * Export multiple specs.\n */\n exportMany(\n specs: AgentSpec[],\n options: ClaudeAgentExportOptions = {}\n ): ClaudeAgentExportResult[] {\n return specs.map((spec) => this.export(spec, options));\n }\n\n /**\n * Validate that a spec can be exported.\n */\n validate(spec: AgentSpec): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!spec.meta?.key) {\n errors.push('Spec must have a meta.key');\n }\n\n if (!spec.instructions) {\n errors.push('Spec must have instructions');\n }\n\n if (!spec.tools || spec.tools.length === 0) {\n errors.push('Spec must have at least one tool');\n }\n\n for (const tool of spec.tools ?? []) {\n if (!tool.name) {\n errors.push('All tools must have a name');\n }\n if (!tool.description && !tool.name) {\n errors.push(`Tool must have a description or name`);\n }\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Build Claude Agent SDK configuration.\n */\n private buildConfig(\n spec: AgentSpec,\n tools: ClaudeToolDefinition[],\n options: ClaudeAgentExportOptions\n ): ClaudeAgentConfig {\n const config: ClaudeAgentConfig = {\n model: options.model ?? 'claude-sonnet-4-20250514',\n system: this.buildSystemPrompt(spec, options),\n tools,\n max_turns: spec.maxSteps ?? 10,\n };\n\n if (options.computerUse) {\n config.computer_use = true;\n }\n\n if (options.extendedThinking) {\n config.extended_thinking = true;\n }\n\n if (options.mcpServers && options.mcpServers.length > 0) {\n config.mcp_servers = options.mcpServers;\n }\n\n return config;\n }\n\n /**\n * Build system prompt from spec.\n */\n private buildSystemPrompt(\n spec: AgentSpec,\n options: ClaudeAgentExportOptions\n ): string {\n const parts: string[] = [];\n\n // Base instructions\n parts.push(spec.instructions);\n\n // Add knowledge context if available\n if (spec.knowledge && spec.knowledge.length > 0) {\n parts.push('');\n parts.push('## Knowledge Sources');\n for (const k of spec.knowledge) {\n if (k.instructions) {\n parts.push(`- ${k.key}: ${k.instructions}`);\n }\n }\n }\n\n // Add policy information if available\n if (spec.policy) {\n parts.push('');\n parts.push('## Policy');\n if (spec.policy.confidence?.min) {\n parts.push(`- Minimum confidence: ${spec.policy.confidence.min}`);\n }\n if (spec.policy.escalation) {\n parts.push('- Escalation policy is configured');\n }\n }\n\n // Add custom metadata if provided\n if (options.metadata) {\n parts.push('');\n parts.push('## Additional Context');\n for (const [key, value] of Object.entries(options.metadata)) {\n parts.push(`- ${key}: ${String(value)}`);\n }\n }\n\n return parts.join('\\n');\n }\n\n /**\n * Export tools to Claude Agent SDK format.\n */\n private exportTools(spec: AgentSpec): ClaudeToolDefinition[] {\n return spec.tools.map((tool) => ({\n name: tool.name,\n description: tool.description ?? `Execute ${tool.name}`,\n input_schema: this.normalizeSchema(tool.schema),\n requires_confirmation: tool.requiresApproval ?? !tool.automationSafe,\n }));\n }\n\n /**\n * Normalize schema to Claude Agent SDK format.\n */\n private normalizeSchema(\n schema?: Record<string, unknown>\n ): ClaudeToolDefinition['input_schema'] {\n if (!schema) {\n return { type: 'object' };\n }\n\n if (schema.type === 'object') {\n return {\n type: 'object',\n properties: schema.properties as Record<string, unknown> | undefined,\n required: schema.required as string[] | undefined,\n };\n }\n\n // Wrap non-object schemas\n return {\n type: 'object',\n properties: { value: schema },\n required: ['value'],\n };\n }\n\n /**\n * Generate CLAUDE.md content for Claude Code CLI integration.\n */\n private generateClaudeMd(\n spec: AgentSpec,\n options: ClaudeAgentExportOptions\n ): string {\n const lines: string[] = [];\n\n // Header\n lines.push('# Agent Configuration');\n lines.push('');\n\n // Description\n if (spec.description) {\n lines.push(`> ${spec.description}`);\n lines.push('');\n }\n\n // Metadata\n lines.push('## Metadata');\n lines.push('');\n lines.push(`- **Name**: ${spec.meta.key}`);\n lines.push(`- **Version**: ${spec.meta.version}`);\n if (spec.meta.owners && spec.meta.owners.length > 0) {\n lines.push(`- **Owners**: ${spec.meta.owners.join(', ')}`);\n }\n if (options.model) {\n lines.push(`- **Model**: ${options.model}`);\n }\n lines.push('');\n\n // Instructions\n lines.push('## Instructions');\n lines.push('');\n lines.push(spec.instructions);\n lines.push('');\n\n // Tools\n if (spec.tools.length > 0) {\n lines.push('## Available Tools');\n lines.push('');\n for (const tool of spec.tools) {\n const flags: string[] = [];\n if (tool.requiresApproval) {\n flags.push('requires approval');\n }\n if (tool.automationSafe === false) {\n flags.push('not automation safe');\n }\n const flagStr = flags.length > 0 ? ` (${flags.join(', ')})` : '';\n\n lines.push(`### ${tool.name}${flagStr}`);\n lines.push('');\n if (tool.description) {\n lines.push(tool.description);\n lines.push('');\n }\n if (tool.schema) {\n lines.push('**Parameters:**');\n lines.push('```json');\n lines.push(JSON.stringify(tool.schema, null, 2));\n lines.push('```');\n lines.push('');\n }\n }\n }\n\n // Knowledge\n if (spec.knowledge && spec.knowledge.length > 0) {\n lines.push('## Knowledge Sources');\n lines.push('');\n for (const k of spec.knowledge) {\n const required = k.required ? '(required)' : '(optional)';\n lines.push(`- **${k.key}** ${required}`);\n if (k.instructions) {\n lines.push(` - ${k.instructions}`);\n }\n }\n lines.push('');\n }\n\n // Policy\n if (spec.policy) {\n lines.push('## Policy');\n lines.push('');\n if (spec.policy.confidence?.min) {\n lines.push(`- Minimum confidence: ${spec.policy.confidence.min}`);\n }\n if (spec.policy.escalation) {\n lines.push('- Escalation policy configured');\n }\n if (spec.policy.flags && spec.policy.flags.length > 0) {\n lines.push(`- Feature flags: ${spec.policy.flags.join(', ')}`);\n }\n lines.push('');\n }\n\n // MCP Servers\n if (options.mcpServers && options.mcpServers.length > 0) {\n lines.push('## MCP Servers');\n lines.push('');\n for (const server of options.mcpServers) {\n lines.push(\n `- **${server.name}**: \\`${server.command}${server.args ? ' ' + server.args.join(' ') : ''}\\``\n );\n }\n lines.push('');\n }\n\n // Footer\n lines.push('---');\n lines.push('');\n lines.push(`*Generated from ContractSpec: ${agentKey(spec.meta)}*`);\n\n return lines.join('\\n');\n }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Export an AgentSpec to Claude Agent SDK format.\n */\nexport function exportToClaudeAgent(\n spec: AgentSpec,\n options?: ClaudeAgentExportOptions\n): ClaudeAgentExportResult {\n const exporter = new ClaudeAgentExporter();\n return exporter.export(spec, options);\n}\n\n/**\n * Generate CLAUDE.md content from an AgentSpec.\n */\nexport function generateClaudeMd(\n spec: AgentSpec,\n options?: Omit<ClaudeAgentExportOptions, 'generateClaudeMd'>\n): string {\n const exporter = new ClaudeAgentExporter();\n const result = exporter.export(spec, { ...options, generateClaudeMd: true });\n return result.claudeMd ?? '';\n}\n\n/**\n * Validate an AgentSpec for Claude Agent SDK export.\n */\nexport function validateForClaudeAgent(spec: AgentSpec): {\n valid: boolean;\n errors: string[];\n} {\n const exporter = new ClaudeAgentExporter();\n return exporter.validate(spec);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ClaudeAgentConfig, ClaudeAgentExportOptions, ClaudeAgentExportResult, ClaudeToolDefinition, ExportFormat, ExportOptions, Exporter, MCPExportOptions, MCPExportResult, MCPPromptDefinition, MCPResourceDefinition, MCPServerDefinition, MCPToolDefinition, OpenCodeAgentJSON, OpenCodeExportOptions, OpenCodeExportResult, OpenCodeToolJSON } from "./types.js";
|
|
2
|
+
import { ClaudeAgentExporter, exportToClaudeAgent, generateClaudeMd, validateForClaudeAgent } from "./claude-agent-exporter.js";
|
|
3
|
+
import { OpenCodeExporter, exportToOpenCode, generateOpenCodeJSON, generateOpenCodeMarkdown, validateForOpenCode } from "./opencode-exporter.js";
|
|
4
|
+
export { ClaudeAgentConfig, ClaudeAgentExportOptions, ClaudeAgentExportResult, ClaudeAgentExporter, ClaudeToolDefinition, ExportFormat, ExportOptions, Exporter, MCPExportOptions, MCPExportResult, MCPPromptDefinition, MCPResourceDefinition, MCPServerDefinition, MCPToolDefinition, OpenCodeAgentJSON, OpenCodeExportOptions, OpenCodeExportResult, OpenCodeExporter, OpenCodeToolJSON, exportToClaudeAgent, exportToOpenCode, generateClaudeMd, generateOpenCodeJSON, generateOpenCodeMarkdown, validateForClaudeAgent, validateForOpenCode };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ClaudeAgentExporter, exportToClaudeAgent, generateClaudeMd, validateForClaudeAgent } from "./claude-agent-exporter.js";
|
|
2
|
+
import { OpenCodeExporter, exportToOpenCode, generateOpenCodeJSON, generateOpenCodeMarkdown, validateForOpenCode } from "./opencode-exporter.js";
|
|
3
|
+
|
|
4
|
+
export { ClaudeAgentExporter, OpenCodeExporter, exportToClaudeAgent, exportToOpenCode, generateClaudeMd, generateOpenCodeJSON, generateOpenCodeMarkdown, validateForClaudeAgent, validateForOpenCode };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { AgentSpec } from "../spec/spec.js";
|
|
2
|
+
import { Exporter, OpenCodeAgentJSON, OpenCodeExportOptions, OpenCodeExportResult } from "./types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/exporters/opencode-exporter.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* OpenCode SDK Exporter.
|
|
8
|
+
*/
|
|
9
|
+
declare class OpenCodeExporter implements Exporter<OpenCodeExportOptions, OpenCodeExportResult> {
|
|
10
|
+
readonly format: "opencode";
|
|
11
|
+
/**
|
|
12
|
+
* Export an AgentSpec to OpenCode SDK format.
|
|
13
|
+
*/
|
|
14
|
+
export(spec: AgentSpec, options?: OpenCodeExportOptions): OpenCodeExportResult;
|
|
15
|
+
/**
|
|
16
|
+
* Export multiple specs.
|
|
17
|
+
*/
|
|
18
|
+
exportMany(specs: AgentSpec[], options?: OpenCodeExportOptions): OpenCodeExportResult[];
|
|
19
|
+
/**
|
|
20
|
+
* Validate that a spec can be exported.
|
|
21
|
+
*/
|
|
22
|
+
validate(spec: AgentSpec): {
|
|
23
|
+
valid: boolean;
|
|
24
|
+
errors: string[];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Build OpenCode agent JSON configuration.
|
|
28
|
+
*/
|
|
29
|
+
private buildJsonConfig;
|
|
30
|
+
/**
|
|
31
|
+
* Export tools to OpenCode format.
|
|
32
|
+
*/
|
|
33
|
+
private exportTools;
|
|
34
|
+
/**
|
|
35
|
+
* Generate markdown agent file content.
|
|
36
|
+
*/
|
|
37
|
+
private generateMarkdown;
|
|
38
|
+
/**
|
|
39
|
+
* Get description for agent type.
|
|
40
|
+
*/
|
|
41
|
+
private getAgentTypeDescription;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Export an AgentSpec to OpenCode SDK format.
|
|
45
|
+
*/
|
|
46
|
+
declare function exportToOpenCode(spec: AgentSpec, options?: OpenCodeExportOptions): OpenCodeExportResult;
|
|
47
|
+
/**
|
|
48
|
+
* Generate OpenCode agent markdown from an AgentSpec.
|
|
49
|
+
*/
|
|
50
|
+
declare function generateOpenCodeMarkdown(spec: AgentSpec, options?: OpenCodeExportOptions): string;
|
|
51
|
+
/**
|
|
52
|
+
* Generate OpenCode agent JSON from an AgentSpec.
|
|
53
|
+
*/
|
|
54
|
+
declare function generateOpenCodeJSON(spec: AgentSpec, options?: OpenCodeExportOptions): OpenCodeAgentJSON;
|
|
55
|
+
/**
|
|
56
|
+
* Validate an AgentSpec for OpenCode SDK export.
|
|
57
|
+
*/
|
|
58
|
+
declare function validateForOpenCode(spec: AgentSpec): {
|
|
59
|
+
valid: boolean;
|
|
60
|
+
errors: string[];
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { OpenCodeExporter, exportToOpenCode, generateOpenCodeJSON, generateOpenCodeMarkdown, validateForOpenCode };
|
|
64
|
+
//# sourceMappingURL=opencode-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-exporter.d.ts","names":[],"sources":["../../src/exporters/opencode-exporter.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAuDa,cA7BA,gBAAA,YAA4B,QA6B5B,CA5BX,qBA4BW,EA3BX,oBA2BW,CAAA,CAAA;EACR,SAAA,MAAA,EAAA,UAAA;EAOY;;;EAgPD,MAAA,CAAA,IAAA,EA3QN,SA2QsB,EAAA,OAAA,CAAA,EA1QnB,qBA0QmB,CAAA,EAzQ3B,oBAyQ2B;EACxB;;;EAEe,UAAA,CAAA,KAAA,EA5PZ,SA4PY,EAAA,EAAA,OAAA,CAAA,EA3PV,qBA2PU,CAAA,EA1PlB,oBA0PkB,EAAA;EAQP;AAYhB;;EAEY,QAAA,CAAA,IAAA,EAzQK,SAyQL,CAAA,EAAA;IACT,KAAA,EAAA,OAAA;IAAiB,MAAA,EAAA,MAAA,EAAA;EASJ,CAAA;;;;;;;;;;;;;;;;;;;;;iBAnCA,gBAAA,OACR,qBACI,wBACT;;;;iBAQa,wBAAA,OACR,qBACI;;;;iBAUI,oBAAA,OACR,qBACI,wBACT;;;;iBASa,mBAAA,OAA0B"}
|