agentdev 0.1.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/dist/index.js ADDED
@@ -0,0 +1,273 @@
1
+ import {
2
+ ViewerWorker
3
+ } from "./chunk-FZGM6EMW.js";
4
+ import {
5
+ ExplorerAgent
6
+ } from "./chunk-DI5EGMGG.js";
7
+ import {
8
+ BasicAgent
9
+ } from "./chunk-XAJ6L4GA.js";
10
+ import {
11
+ AgentBase,
12
+ AgentPool,
13
+ AnthropicLLM,
14
+ CallStart,
15
+ Context,
16
+ DataSourceRegistry,
17
+ ExampleFeature,
18
+ FileSessionStore,
19
+ MCPClient,
20
+ MCPConnectionManager,
21
+ MCPConnectionState,
22
+ MCPFeature,
23
+ MCPToolAdapter,
24
+ OpenAILLM,
25
+ OpencodeBasicFeature,
26
+ SkillFeature,
27
+ SubAgentFeature,
28
+ TemplateComposer,
29
+ TemplateLoader,
30
+ TodoFeature,
31
+ ToolRegistry,
32
+ UserInputFeature,
33
+ assistant,
34
+ compileContextForAnthropic,
35
+ createAnthropicLLM,
36
+ createDefaultMCPToolName,
37
+ createLLM,
38
+ createListRenderer,
39
+ createMCPTool,
40
+ createMCPToolAdapters,
41
+ createMCPToolsFromClient,
42
+ createManagedMCPToolsFromClient,
43
+ createMessage,
44
+ createOpenAILLM,
45
+ createTool,
46
+ discover,
47
+ discoverMCPTools,
48
+ discoverManagedMCPTools,
49
+ getDefaultMCPConfigDir,
50
+ getDefaultSessionStore,
51
+ getPackageInfoFromSource,
52
+ listConfigs,
53
+ loadAllMCPConfigs,
54
+ loadConfig,
55
+ loadConfigSync,
56
+ loadMCPConfigFromInput,
57
+ mountMCPToolsFromConfig,
58
+ system,
59
+ toolResult,
60
+ user
61
+ } from "./chunk-N7J76R5P.js";
62
+ import {
63
+ PlaceholderResolver
64
+ } from "./chunk-BVF7RUXV.js";
65
+ import {
66
+ DebugHub,
67
+ getClawRuntimeUrl,
68
+ getDebugCapabilities,
69
+ resolveDebugTransportMode
70
+ } from "./chunk-3BPSNNK3.js";
71
+ import {
72
+ getDefaultUDSPath
73
+ } from "./chunk-TSASFMRF.js";
74
+ import "./chunk-BDS2QGZ5.js";
75
+
76
+ // src/template/types.ts
77
+ var TemplateError = class extends Error {
78
+ constructor(message, code, path) {
79
+ super(message);
80
+ this.code = code;
81
+ this.path = path;
82
+ this.name = "TemplateError";
83
+ }
84
+ };
85
+
86
+ // src/mcp/render.ts
87
+ function escapeHtml(text) {
88
+ const str = String(text);
89
+ const map = {
90
+ "&": "&",
91
+ "<": "&lt;",
92
+ ">": "&gt;",
93
+ '"': "&quot;",
94
+ "'": "&#39;"
95
+ };
96
+ return str.replace(/[&<>"']/g, (m) => map[m]);
97
+ }
98
+ var MCP_RENDER_TEMPLATES = {
99
+ /**
100
+ * MCP 工具调用显示
101
+ */
102
+ "mcp-tool": {
103
+ call: (args) => {
104
+ const server = args._server || "unknown";
105
+ const name = args._name || "unknown";
106
+ return `
107
+ <div class="bash-command" style="
108
+ border-left: 3px solid #ff6b6b;
109
+ padding-left: 8px;
110
+ margin: 4px 0;
111
+ ">
112
+ <span style="
113
+ color: #ff6b6b;
114
+ font-weight: bold;
115
+ font-size: 11px;
116
+ text-transform: uppercase;
117
+ ">MCP</span>
118
+ <span class="file-path" style="color: #c068ff;">${escapeHtml(server)}</span>
119
+ <span style="color: #888;">::</span>
120
+ <span style="color: #fff;">${escapeHtml(name)}</span>
121
+ </div>
122
+ `.trim();
123
+ },
124
+ result: (data, success = true) => {
125
+ if (!success || data.error) {
126
+ return `
127
+ <div class="bash-output" style="
128
+ border-left: 3px solid #ff4444;
129
+ padding-left: 8px;
130
+ color: #ff6b6b;
131
+ ">
132
+ <div style="font-weight: bold; margin-bottom: 4px;">MCP Error</div>
133
+ <pre style="margin: 0; white-space: pre-wrap;">${escapeHtml(data.error || "Unknown error")}</pre>
134
+ </div>
135
+ `.trim();
136
+ }
137
+ let content = "";
138
+ if (data.content) {
139
+ content += `<pre class="bash-output" style="max-height: 400px; overflow: auto;">${escapeHtml(data.content)}</pre>`;
140
+ }
141
+ if (data.structuredContent) {
142
+ content += `<details style="margin-top: 8px;">
143
+ <summary style="cursor: pointer; color: var(--accent-color);">Structured Data</summary>
144
+ <pre style="margin: 4px 0; padding: 8px; background: var(--bg-secondary);">${escapeHtml(JSON.stringify(data.structuredContent, null, 2))}</pre>
145
+ </details>`;
146
+ }
147
+ if (data.images && data.images.length > 0) {
148
+ content += `<div style="margin-top: 8px;">`;
149
+ data.images.forEach((img) => {
150
+ content += `<img src="data:${img.mimeType};base64,${img.data}" style="max-width: 100%; border-radius: 4px;" />`;
151
+ });
152
+ content += `</div>`;
153
+ }
154
+ if (data.resources && data.resources.length > 0) {
155
+ content += `<div style="margin-top: 8px;">
156
+ <div style="font-weight: bold; margin-bottom: 4px;">Resources:</div>`;
157
+ data.resources.forEach((res) => {
158
+ content += `<div style="padding: 4px; background: var(--bg-secondary); margin: 4px 0;">
159
+ <div style="font-size: 11px; color: var(--text-secondary);">${escapeHtml(res.uri)}</div>
160
+ ${res.text ? `<pre style="margin: 4px 0 0 0;">${escapeHtml(res.text)}</pre>` : ""}
161
+ </div>`;
162
+ });
163
+ content += `</div>`;
164
+ }
165
+ const meta = `
166
+ <div style="
167
+ font-size: 11px;
168
+ opacity: 0.6;
169
+ margin-top: 8px;
170
+ display: flex;
171
+ gap: 12px;
172
+ ">
173
+ <span>Server: ${escapeHtml(data.server)}</span>
174
+ <span>Duration: ${data.duration}ms</span>
175
+ </div>
176
+ `;
177
+ return content + meta;
178
+ }
179
+ },
180
+ /**
181
+ * MCP 结果 (简化版)
182
+ */
183
+ "mcp-result": {
184
+ call: () => '<div class="bash-command">MCP Tool Call</div>',
185
+ result: (data, success = true) => {
186
+ return MCP_RENDER_TEMPLATES["mcp-tool"].result(data, success);
187
+ }
188
+ }
189
+ };
190
+ function getMCPRenderTemplate(toolName) {
191
+ return "mcp-tool";
192
+ }
193
+ function renderMCPToolCall(serverName, toolName, args) {
194
+ const template = MCP_RENDER_TEMPLATES["mcp-tool"].call;
195
+ if (typeof template === "function") {
196
+ return template({ _server: serverName, _name: toolName, ...args });
197
+ }
198
+ return template;
199
+ }
200
+ function renderMCPToolResult(result, success = true) {
201
+ const template = MCP_RENDER_TEMPLATES["mcp-tool"].result;
202
+ if (typeof template === "function") {
203
+ return template(result, success);
204
+ }
205
+ return template;
206
+ }
207
+ export {
208
+ AgentBase as Agent,
209
+ AgentPool,
210
+ AnthropicLLM,
211
+ BasicAgent,
212
+ CallStart,
213
+ Context,
214
+ DataSourceRegistry,
215
+ DebugHub,
216
+ ExampleFeature,
217
+ ExplorerAgent,
218
+ FileSessionStore,
219
+ MCPClient,
220
+ MCPConnectionManager,
221
+ MCPConnectionState,
222
+ MCPFeature,
223
+ MCPToolAdapter,
224
+ MCP_RENDER_TEMPLATES,
225
+ OpenAILLM,
226
+ OpencodeBasicFeature,
227
+ PlaceholderResolver,
228
+ SkillFeature,
229
+ SubAgentFeature,
230
+ TemplateComposer,
231
+ TemplateError,
232
+ TemplateLoader,
233
+ TodoFeature,
234
+ ToolRegistry,
235
+ UserInputFeature,
236
+ ViewerWorker,
237
+ assistant,
238
+ compileContextForAnthropic,
239
+ createAnthropicLLM,
240
+ createDefaultMCPToolName,
241
+ createLLM,
242
+ createListRenderer,
243
+ createMCPTool,
244
+ createMCPToolAdapters,
245
+ createMCPToolsFromClient,
246
+ createManagedMCPToolsFromClient,
247
+ createMessage,
248
+ createOpenAILLM,
249
+ createTool,
250
+ discover,
251
+ discoverMCPTools,
252
+ discoverManagedMCPTools,
253
+ getClawRuntimeUrl,
254
+ getDebugCapabilities,
255
+ getDefaultMCPConfigDir,
256
+ getDefaultSessionStore,
257
+ getDefaultUDSPath,
258
+ getMCPRenderTemplate,
259
+ getPackageInfoFromSource,
260
+ listConfigs,
261
+ loadAllMCPConfigs,
262
+ loadConfig,
263
+ loadConfigSync,
264
+ loadMCPConfigFromInput,
265
+ mountMCPToolsFromConfig,
266
+ renderMCPToolCall,
267
+ renderMCPToolResult,
268
+ resolveDebugTransportMode,
269
+ system,
270
+ toolResult,
271
+ user
272
+ };
273
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/template/types.ts","../src/mcp/render.ts"],"sourcesContent":["/**\n * 提示词模板系统 - 核心类型定义\n */\n\n/**\n * 模板源\n * - string: 硬编码字符串\n * - { file: string }: 文件路径\n * - [dataSourceName: string]: 数据源名称(如 skills, tasks 等)\n * - TemplateComposer: 组合模板\n *\n * @example\n * ```typescript\n * // 静态字符串\n * 'Hello {{name}}'\n *\n * // 文件\n * { file: 'prompts/system.md' }\n *\n * // 数据源(列表渲染)\n * { skills: '- **{{name}}**: {{description}}' }\n * { tasks: '- [{{title}}](#{{id}}) ({{priority}})' }\n *\n * // 条件渲染\n * { conditional: { part: { file: 'advanced.md' }, condition: (ctx) => ctx.advanced } }\n * ```\n */\nexport type TemplateSource =\n | string\n | { file: string }\n | { conditional: ConditionalSource }\n | { [dataSourceName: string]: string } // 数据源 -> 模板\n | import('./composer.js').TemplateComposer;\n\n/**\n * 条件源配置\n */\nexport interface ConditionalSource {\n /** 条件模板源 */\n part: TemplateSource;\n /** 条件函数(true 时渲染) */\n condition: (context: PlaceholderContext) => boolean;\n}\n\n/**\n * 占位符上下文 - 变量替换的键值对\n * 支持原始类型和复杂对象(用于数据源渲染)\n */\nexport type PlaceholderContext = Record<string, string | number | boolean | undefined | object>;\n\n/**\n * 模板渲染结果\n */\nexport interface TemplateResult {\n /** 渲染后的内容 */\n content: string;\n /** 使用的源文件列表(用于调试) */\n sources: string[];\n}\n\n/**\n * 模板加载器配置\n */\nexport interface TemplateLoaderOptions {\n /** 缓存启用状态,默认 true */\n cacheEnabled?: boolean;\n /** 模板搜索目录(相对于项目根目录) */\n searchDirs?: string[];\n /** 项目根目录(自动检测) */\n projectRoot?: string;\n}\n\n/**\n * 缓存统计\n */\nexport interface CacheStats {\n size: number; // 缓存条目数\n hits: number; // 命中次数\n misses: number; // 未命中次数\n hitRate: number; // 命中率\n}\n\n/**\n * 模板相关错误\n */\nexport class TemplateError extends Error {\n constructor(\n message: string,\n public code:\n | 'FILE_NOT_FOUND'\n | 'INVALID_PATH'\n | 'READ_ERROR'\n | 'UNSUPPORTED_FORMAT',\n public path?: string\n ) {\n super(message);\n this.name = 'TemplateError';\n }\n}\n","/**\n * MCP 工具渲染模板\n *\n * 定义 MCP 工具在 DebugHub 中的显示样式\n */\n\n/**\n * 转义 HTML\n */\nfunction escapeHtml(text: any): string {\n const str = String(text);\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n };\n return str.replace(/[&<>\"']/g, m => map[m]);\n}\n\n/**\n * MCP 工具渲染模板\n */\nexport const MCP_RENDER_TEMPLATES = {\n /**\n * MCP 工具调用显示\n */\n 'mcp-tool': {\n call: (args: any) => {\n const server = args._server || 'unknown';\n const name = args._name || 'unknown';\n return `\n <div class=\"bash-command\" style=\"\n border-left: 3px solid #ff6b6b;\n padding-left: 8px;\n margin: 4px 0;\n \">\n <span style=\"\n color: #ff6b6b;\n font-weight: bold;\n font-size: 11px;\n text-transform: uppercase;\n \">MCP</span>\n <span class=\"file-path\" style=\"color: #c068ff;\">${escapeHtml(server)}</span>\n <span style=\"color: #888;\">::</span>\n <span style=\"color: #fff;\">${escapeHtml(name)}</span>\n </div>\n `.trim();\n },\n result: (data: any, success = true) => {\n if (!success || data.error) {\n return `\n <div class=\"bash-output\" style=\"\n border-left: 3px solid #ff4444;\n padding-left: 8px;\n color: #ff6b6b;\n \">\n <div style=\"font-weight: bold; margin-bottom: 4px;\">MCP Error</div>\n <pre style=\"margin: 0; white-space: pre-wrap;\">${escapeHtml(data.error || 'Unknown error')}</pre>\n </div>\n `.trim();\n }\n\n let content = '';\n\n // 文本内容\n if (data.content) {\n content += `<pre class=\"bash-output\" style=\"max-height: 400px; overflow: auto;\">${escapeHtml(data.content)}</pre>`;\n }\n\n // 结构化数据\n if (data.structuredContent) {\n content += `<details style=\"margin-top: 8px;\">\n <summary style=\"cursor: pointer; color: var(--accent-color);\">Structured Data</summary>\n <pre style=\"margin: 4px 0; padding: 8px; background: var(--bg-secondary);\">${escapeHtml(JSON.stringify(data.structuredContent, null, 2))}</pre>\n </details>`;\n }\n\n // 图像\n if (data.images && data.images.length > 0) {\n content += `<div style=\"margin-top: 8px;\">`;\n data.images.forEach((img: any) => {\n content += `<img src=\"data:${img.mimeType};base64,${img.data}\" style=\"max-width: 100%; border-radius: 4px;\" />`;\n });\n content += `</div>`;\n }\n\n // 资源\n if (data.resources && data.resources.length > 0) {\n content += `<div style=\"margin-top: 8px;\">\n <div style=\"font-weight: bold; margin-bottom: 4px;\">Resources:</div>`;\n data.resources.forEach((res: any) => {\n content += `<div style=\"padding: 4px; background: var(--bg-secondary); margin: 4px 0;\">\n <div style=\"font-size: 11px; color: var(--text-secondary);\">${escapeHtml(res.uri)}</div>\n ${res.text ? `<pre style=\"margin: 4px 0 0 0;\">${escapeHtml(res.text)}</pre>` : ''}\n </div>`;\n });\n content += `</div>`;\n }\n\n // 元数据\n const meta = `\n <div style=\"\n font-size: 11px;\n opacity: 0.6;\n margin-top: 8px;\n display: flex;\n gap: 12px;\n \">\n <span>Server: ${escapeHtml(data.server)}</span>\n <span>Duration: ${data.duration}ms</span>\n </div>\n `;\n\n return content + meta;\n },\n },\n\n /**\n * MCP 结果 (简化版)\n */\n 'mcp-result': {\n call: () => '<div class=\"bash-command\">MCP Tool Call</div>',\n result: (data: any, success = true) => {\n return MCP_RENDER_TEMPLATES['mcp-tool'].result(data, success);\n },\n },\n} as const;\n\n/**\n * 获取 MCP 渲染模板\n */\nexport function getMCPRenderTemplate(toolName: string): string {\n return 'mcp-tool';\n}\n\n/**\n * 渲染 MCP 工具调用\n */\nexport function renderMCPToolCall(\n serverName: string,\n toolName: string,\n args: Record<string, any>\n): string {\n const template = MCP_RENDER_TEMPLATES['mcp-tool'].call;\n if (typeof template === 'function') {\n return template({ _server: serverName, _name: toolName, ...args });\n }\n return template;\n}\n\n/**\n * 渲染 MCP 工具结果\n */\nexport function renderMCPToolResult(\n result: any,\n success = true\n): string {\n const template = MCP_RENDER_TEMPLATES['mcp-tool'].result;\n if (typeof template === 'function') {\n return template(result, success);\n }\n return template;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,89 @@
1
+ import {
2
+ DebugHub
3
+ } from "./chunk-3BPSNNK3.js";
4
+ import "./chunk-TSASFMRF.js";
5
+ import "./chunk-BDS2QGZ5.js";
6
+
7
+ // src/core/notification.ts
8
+ var currentAgentId = null;
9
+ var lastNotificationTime = 0;
10
+ var THROTTLE_INTERVAL = 100;
11
+ function _setNotificationAgent(agentId) {
12
+ currentAgentId = agentId;
13
+ }
14
+ function _clearNotificationAgent() {
15
+ currentAgentId = null;
16
+ lastNotificationTime = 0;
17
+ }
18
+ function _getCurrentNotificationAgent() {
19
+ return currentAgentId;
20
+ }
21
+ function emitNotification(notification) {
22
+ if (!currentAgentId) {
23
+ return;
24
+ }
25
+ const now = Date.now();
26
+ if (notification.category === "state") {
27
+ const timeSinceLast = now - lastNotificationTime;
28
+ if (timeSinceLast < THROTTLE_INTERVAL) {
29
+ return;
30
+ }
31
+ lastNotificationTime = now;
32
+ }
33
+ const debugHub = DebugHub.getInstance();
34
+ debugHub.pushNotification(currentAgentId, notification);
35
+ }
36
+ function createLLMCharCount(charCount, phase) {
37
+ return {
38
+ type: "llm.char_count",
39
+ category: "state",
40
+ timestamp: Date.now(),
41
+ data: {
42
+ charCount,
43
+ phase
44
+ }
45
+ };
46
+ }
47
+ function createLLMComplete(totalChars) {
48
+ return {
49
+ type: "llm.complete",
50
+ category: "state",
51
+ timestamp: Date.now(),
52
+ data: {
53
+ totalChars
54
+ }
55
+ };
56
+ }
57
+ function createToolStart(toolName) {
58
+ return {
59
+ type: "tool.start",
60
+ category: "event",
61
+ timestamp: Date.now(),
62
+ data: {
63
+ toolName
64
+ }
65
+ };
66
+ }
67
+ function createToolComplete(toolName, success, duration) {
68
+ return {
69
+ type: "tool.complete",
70
+ category: "event",
71
+ timestamp: Date.now(),
72
+ data: {
73
+ toolName,
74
+ success,
75
+ duration
76
+ }
77
+ };
78
+ }
79
+ export {
80
+ _clearNotificationAgent,
81
+ _getCurrentNotificationAgent,
82
+ _setNotificationAgent,
83
+ createLLMCharCount,
84
+ createLLMComplete,
85
+ createToolComplete,
86
+ createToolStart,
87
+ emitNotification
88
+ };
89
+ //# sourceMappingURL=notification-3VEAP7YF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/notification.ts"],"sourcesContent":["/**\n * Notification System - 核心通知系统\n *\n * 职责:\n * - 定义通知类型和分类\n * - 提供通知发送接口\n * - 管理通知上下文(当前 Agent ID)\n * - 节流高频通知\n */\n\nimport type { Notification, NotificationCategory, LLMPhase } from './types.js';\nimport { DebugHub } from './debug-hub.js';\n\n// ========== 模块级状态 ==========\n\n/**\n * 当前通知上下文的 Agent ID\n */\nlet currentAgentId: string | null = null;\n\n/**\n * 节流控制:上次发送通知的时间戳\n */\nlet lastNotificationTime: number = 0;\n\n/**\n * 节流间隔(毫秒)\n */\nconst THROTTLE_INTERVAL = 100;\n\n// ========== 公开 API ==========\n\n/**\n * 设置通知上下文\n * @param agentId Agent ID\n */\nexport function _setNotificationAgent(agentId: string): void {\n currentAgentId = agentId;\n}\n\n/**\n * 清除通知上下文\n */\nexport function _clearNotificationAgent(): void {\n currentAgentId = null;\n // 重置节流状态\n lastNotificationTime = 0;\n}\n\n/**\n * 获取当前通知上下文的 Agent ID\n */\nexport function _getCurrentNotificationAgent(): string | null {\n return currentAgentId;\n}\n\n/**\n * 发送通知到 DebugHub\n * @param notification 通知对象\n */\nexport function emitNotification(notification: Notification): void {\n if (!currentAgentId) {\n // 没有通知上下文,静默忽略\n return;\n }\n\n const now = Date.now();\n\n // 节流:状态类通知需要节流,事件类通知不需要\n if (notification.category === 'state') {\n const timeSinceLast = now - lastNotificationTime;\n if (timeSinceLast < THROTTLE_INTERVAL) {\n // 跳过此次通知\n return;\n }\n lastNotificationTime = now;\n }\n\n // 推送到 DebugHub\n const debugHub = DebugHub.getInstance();\n debugHub.pushNotification(currentAgentId, notification);\n}\n\n// ========== 通知构造函数 ==========\n\n/**\n * 创建 LLM 字符计数通知\n * @param charCount 当前累积字符数\n * @param phase LLM 生成阶段\n */\nexport function createLLMCharCount(\n charCount: number,\n phase: LLMPhase\n): Notification {\n return {\n type: 'llm.char_count',\n category: 'state',\n timestamp: Date.now(),\n data: {\n charCount,\n phase,\n },\n };\n}\n\n/**\n * 创建 LLM 完成通知\n * @param totalChars 总字符数\n */\nexport function createLLMComplete(totalChars: number): Notification {\n return {\n type: 'llm.complete',\n category: 'state',\n timestamp: Date.now(),\n data: {\n totalChars,\n },\n };\n}\n\n/**\n * 创建工具开始通知\n * @param toolName 工具名称\n */\nexport function createToolStart(toolName: string): Notification {\n return {\n type: 'tool.start',\n category: 'event',\n timestamp: Date.now(),\n data: {\n toolName,\n },\n };\n}\n\n/**\n * 创建工具完成通知\n * @param toolName 工具名称\n * @param success 是否成功\n * @param duration 耗时(毫秒)\n */\nexport function createToolComplete(\n toolName: string,\n success: boolean,\n duration: number\n): Notification {\n return {\n type: 'tool.complete',\n category: 'event',\n timestamp: Date.now(),\n data: {\n toolName,\n success,\n duration,\n },\n };\n}\n"],"mappings":";;;;;;;AAkBA,IAAI,iBAAgC;AAKpC,IAAI,uBAA+B;AAKnC,IAAM,oBAAoB;AAQnB,SAAS,sBAAsB,SAAuB;AAC3D,mBAAiB;AACnB;AAKO,SAAS,0BAAgC;AAC9C,mBAAiB;AAEjB,yBAAuB;AACzB;AAKO,SAAS,+BAA8C;AAC5D,SAAO;AACT;AAMO,SAAS,iBAAiB,cAAkC;AACjE,MAAI,CAAC,gBAAgB;AAEnB;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,IAAI;AAGrB,MAAI,aAAa,aAAa,SAAS;AACrC,UAAM,gBAAgB,MAAM;AAC5B,QAAI,gBAAgB,mBAAmB;AAErC;AAAA,IACF;AACA,2BAAuB;AAAA,EACzB;AAGA,QAAM,WAAW,SAAS,YAAY;AACtC,WAAS,iBAAiB,gBAAgB,YAAY;AACxD;AASO,SAAS,mBACd,WACA,OACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW,KAAK,IAAI;AAAA,IACpB,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,kBAAkB,YAAkC;AAClE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW,KAAK,IAAI;AAAA,IACpB,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,gBAAgB,UAAgC;AAC9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW,KAAK,IAAI;AAAA,IACpB,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AAQO,SAAS,mBACd,UACA,SACA,UACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW,KAAK,IAAI;AAAA,IACpB,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ PlaceholderResolver
3
+ } from "./chunk-BVF7RUXV.js";
4
+ import "./chunk-BDS2QGZ5.js";
5
+ export {
6
+ PlaceholderResolver
7
+ };
8
+ //# sourceMappingURL=resolver-5H6QIGVA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "agentdev",
3
+ "version": "0.1.0",
4
+ "description": "A lightweight, decoupled AI agent framework with built-in debugger",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "agentdev-viewer": "dist/cli/viewer.cmd",
10
+ "agentdev-server": "dist/cli/server.cmd"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsup && node scripts/generate-bin-cmds.mjs",
19
+ "dev": "tsup --watch",
20
+ "prepublishOnly": "npm run build",
21
+ "create-feature": "node packages/create-feature/dist/cli.js",
22
+ "copy-example": "node scripts/copy-example-feature.mjs",
23
+ "server": "node dist/cli/server.js"
24
+ },
25
+ "tsup": {
26
+ "entry": [
27
+ "src/index.ts",
28
+ "src/cli/viewer.ts",
29
+ "src/cli/server.ts"
30
+ ],
31
+ "format": "esm",
32
+ "dts": true,
33
+ "clean": true,
34
+ "sourcemap": true,
35
+ "assets": [
36
+ "src/**/*",
37
+ "!src/**/*.ts",
38
+ "!src/**/*.tsx"
39
+ ]
40
+ },
41
+ "dependencies": {
42
+ "@modelcontextprotocol/sdk": "^1.26.0",
43
+ "@openai/agents": "^0.4.6",
44
+ "diff": "^8.0.3",
45
+ "glob": "^13.0.6",
46
+ "js-yaml": "^4.1.0",
47
+ "open": "^11.0.0",
48
+ "openai": "^4.73.0",
49
+ "zod": "^4.1.5"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^20.11.0",
53
+ "tsx": "^4.7.0",
54
+ "tsup": "^8.3.5",
55
+ "typescript": "^5.3.3"
56
+ },
57
+ "engines": {
58
+ "node": ">=18.0.0"
59
+ },
60
+ "keywords": [
61
+ "ai",
62
+ "agent",
63
+ "llm",
64
+ "openai",
65
+ "anthropic",
66
+ "mcp",
67
+ "debugger"
68
+ ],
69
+ "repository": {
70
+ "type": "git",
71
+ "url": "https://github.com/your-org/agentdev.git"
72
+ },
73
+ "license": "MIT"
74
+ }