opc-agent 1.3.2 → 2.0.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.
Files changed (226) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +14 -0
  3. package/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  4. package/.github/workflows/ci.yml +24 -0
  5. package/CHANGELOG.md +48 -63
  6. package/CONTRIBUTING.md +21 -60
  7. package/README.md +284 -348
  8. package/README.zh-CN.md +415 -415
  9. package/dist/channels/slack.js +93 -10
  10. package/dist/channels/telegram.d.ts +30 -9
  11. package/dist/channels/telegram.js +125 -33
  12. package/dist/channels/web.d.ts +10 -0
  13. package/dist/channels/web.js +33 -2
  14. package/dist/cli.js +667 -65
  15. package/dist/core/agent.d.ts +23 -0
  16. package/dist/core/agent.js +120 -3
  17. package/dist/core/runtime.d.ts +5 -0
  18. package/dist/core/runtime.js +71 -0
  19. package/dist/core/scheduler.d.ts +52 -0
  20. package/dist/core/scheduler.js +168 -0
  21. package/dist/core/subagent.d.ts +28 -0
  22. package/dist/core/subagent.js +65 -0
  23. package/dist/daemon.d.ts +3 -0
  24. package/dist/daemon.js +134 -0
  25. package/dist/deploy/hermes.js +22 -22
  26. package/dist/deploy/openclaw.js +31 -40
  27. package/dist/index.d.ts +10 -10
  28. package/dist/index.js +22 -15
  29. package/dist/providers/index.d.ts +6 -2
  30. package/dist/providers/index.js +22 -9
  31. package/dist/schema/oad.d.ts +180 -6
  32. package/dist/schema/oad.js +12 -1
  33. package/dist/skills/auto-learn.d.ts +28 -0
  34. package/dist/skills/auto-learn.js +257 -0
  35. package/dist/templates/code-reviewer.d.ts +0 -8
  36. package/dist/templates/code-reviewer.js +5 -9
  37. package/dist/templates/customer-service.d.ts +0 -8
  38. package/dist/templates/customer-service.js +2 -6
  39. package/dist/templates/data-analyst.d.ts +0 -8
  40. package/dist/templates/data-analyst.js +5 -9
  41. package/dist/templates/knowledge-base.d.ts +0 -8
  42. package/dist/templates/knowledge-base.js +2 -6
  43. package/dist/templates/sales-assistant.d.ts +0 -8
  44. package/dist/templates/sales-assistant.js +4 -8
  45. package/dist/templates/teacher.d.ts +0 -8
  46. package/dist/templates/teacher.js +6 -10
  47. package/dist/tools/builtin/datetime.d.ts +3 -0
  48. package/dist/tools/builtin/datetime.js +44 -0
  49. package/dist/tools/builtin/file.d.ts +3 -0
  50. package/dist/tools/builtin/file.js +151 -0
  51. package/dist/tools/builtin/index.d.ts +15 -0
  52. package/dist/tools/builtin/index.js +30 -0
  53. package/dist/tools/builtin/shell.d.ts +3 -0
  54. package/dist/tools/builtin/shell.js +43 -0
  55. package/dist/tools/builtin/web.d.ts +3 -0
  56. package/dist/tools/builtin/web.js +37 -0
  57. package/dist/tools/mcp-client.d.ts +24 -0
  58. package/dist/tools/mcp-client.js +119 -0
  59. package/dist/traces/index.d.ts +49 -0
  60. package/dist/traces/index.js +102 -0
  61. package/docs/.vitepress/config.ts +103 -103
  62. package/docs/api/cli.md +48 -48
  63. package/docs/api/oad-schema.md +64 -64
  64. package/docs/api/sdk.md +80 -80
  65. package/docs/guide/concepts.md +51 -51
  66. package/docs/guide/configuration.md +79 -79
  67. package/docs/guide/deployment.md +42 -42
  68. package/docs/guide/getting-started.md +44 -44
  69. package/docs/guide/templates.md +28 -28
  70. package/docs/guide/testing.md +84 -84
  71. package/docs/index.md +27 -27
  72. package/docs/zh/api/cli.md +54 -54
  73. package/docs/zh/api/oad-schema.md +87 -87
  74. package/docs/zh/api/sdk.md +102 -102
  75. package/docs/zh/guide/concepts.md +104 -104
  76. package/docs/zh/guide/configuration.md +135 -135
  77. package/docs/zh/guide/deployment.md +81 -81
  78. package/docs/zh/guide/getting-started.md +82 -82
  79. package/docs/zh/guide/templates.md +84 -84
  80. package/docs/zh/guide/testing.md +88 -88
  81. package/docs/zh/index.md +27 -27
  82. package/examples/README.md +22 -0
  83. package/examples/basic-agent.ts +90 -0
  84. package/examples/brain-integration.ts +71 -0
  85. package/examples/customer-service-demo/README.md +90 -90
  86. package/examples/customer-service-demo/oad.yaml +107 -107
  87. package/examples/multi-channel.ts +74 -0
  88. package/package.json +1 -1
  89. package/src/analytics/index.ts +66 -66
  90. package/src/channels/discord.ts +192 -192
  91. package/src/channels/email.ts +177 -177
  92. package/src/channels/feishu.ts +236 -236
  93. package/src/channels/index.ts +15 -15
  94. package/src/channels/slack.ts +217 -160
  95. package/src/channels/telegram.ts +155 -33
  96. package/src/channels/voice.ts +106 -106
  97. package/src/channels/web.ts +38 -2
  98. package/src/channels/webhook.ts +199 -199
  99. package/src/channels/websocket.ts +87 -87
  100. package/src/channels/wechat.ts +149 -149
  101. package/src/cli.ts +697 -63
  102. package/src/core/a2a.ts +143 -143
  103. package/src/core/agent.ts +146 -3
  104. package/src/core/analytics-engine.ts +186 -186
  105. package/src/core/auth.ts +57 -57
  106. package/src/core/cache.ts +141 -141
  107. package/src/core/compose.ts +77 -77
  108. package/src/core/config.ts +14 -14
  109. package/src/core/errors.ts +148 -148
  110. package/src/core/hitl.ts +138 -138
  111. package/src/core/logger.ts +57 -57
  112. package/src/core/orchestrator.ts +215 -215
  113. package/src/core/performance.ts +187 -187
  114. package/src/core/rate-limiter.ts +128 -128
  115. package/src/core/room.ts +109 -109
  116. package/src/core/runtime.ts +230 -152
  117. package/src/core/sandbox.ts +101 -101
  118. package/src/core/scheduler.ts +187 -0
  119. package/src/core/security.ts +171 -171
  120. package/src/core/subagent.ts +98 -0
  121. package/src/core/types.ts +68 -68
  122. package/src/core/versioning.ts +106 -106
  123. package/src/core/watch.ts +178 -178
  124. package/src/core/workflow.ts +235 -235
  125. package/src/daemon.ts +96 -0
  126. package/src/deploy/hermes.ts +156 -156
  127. package/src/deploy/openclaw.ts +190 -200
  128. package/src/i18n/index.ts +216 -216
  129. package/src/index.ts +14 -10
  130. package/src/memory/deepbrain.ts +108 -108
  131. package/src/memory/index.ts +34 -34
  132. package/src/plugins/index.ts +208 -208
  133. package/src/providers/index.ts +354 -331
  134. package/src/schema/oad.ts +14 -2
  135. package/src/skills/auto-learn.ts +262 -0
  136. package/src/skills/base.ts +16 -16
  137. package/src/skills/document.ts +100 -100
  138. package/src/skills/http.ts +35 -35
  139. package/src/skills/index.ts +27 -27
  140. package/src/skills/scheduler.ts +80 -80
  141. package/src/skills/webhook-trigger.ts +59 -59
  142. package/src/templates/code-reviewer.ts +30 -34
  143. package/src/templates/customer-service.ts +76 -80
  144. package/src/templates/data-analyst.ts +66 -70
  145. package/src/templates/executive-assistant.ts +71 -71
  146. package/src/templates/financial-advisor.ts +60 -60
  147. package/src/templates/knowledge-base.ts +27 -31
  148. package/src/templates/legal-assistant.ts +71 -71
  149. package/src/templates/sales-assistant.ts +75 -79
  150. package/src/templates/teacher.ts +75 -79
  151. package/src/testing/index.ts +181 -181
  152. package/src/tools/builtin/datetime.ts +41 -0
  153. package/src/tools/builtin/file.ts +107 -0
  154. package/src/tools/builtin/index.ts +28 -0
  155. package/src/tools/builtin/shell.ts +43 -0
  156. package/src/tools/builtin/web.ts +35 -0
  157. package/src/tools/calculator.ts +73 -73
  158. package/src/tools/datetime.ts +149 -149
  159. package/src/tools/json-transform.ts +187 -187
  160. package/src/tools/mcp-client.ts +131 -0
  161. package/src/tools/mcp.ts +76 -76
  162. package/src/tools/text-analysis.ts +116 -116
  163. package/src/traces/index.ts +132 -0
  164. package/templates/Dockerfile +15 -15
  165. package/templates/code-reviewer/README.md +27 -27
  166. package/templates/code-reviewer/oad.yaml +41 -41
  167. package/templates/customer-service/README.md +22 -22
  168. package/templates/customer-service/oad.yaml +36 -36
  169. package/templates/docker-compose.yml +21 -21
  170. package/templates/ecommerce-assistant/README.md +45 -45
  171. package/templates/ecommerce-assistant/oad.yaml +47 -47
  172. package/templates/knowledge-base/README.md +28 -28
  173. package/templates/knowledge-base/oad.yaml +38 -38
  174. package/templates/sales-assistant/README.md +26 -26
  175. package/templates/sales-assistant/oad.yaml +43 -43
  176. package/templates/tech-support/README.md +43 -43
  177. package/templates/tech-support/oad.yaml +45 -45
  178. package/test-agent/Dockerfile +9 -0
  179. package/test-agent/README.md +50 -0
  180. package/test-agent/agent.yaml +23 -0
  181. package/test-agent/docker-compose.yml +11 -0
  182. package/test-agent/oad.yaml +31 -0
  183. package/test-agent/package-lock.json +1492 -0
  184. package/test-agent/package.json +18 -0
  185. package/test-agent/src/index.ts +24 -0
  186. package/test-agent/src/skills/echo.ts +15 -0
  187. package/test-agent/tsconfig.json +25 -0
  188. package/tests/a2a.test.ts +66 -66
  189. package/tests/agent.test.ts +72 -72
  190. package/tests/analytics.test.ts +50 -50
  191. package/tests/auto-learn.test.ts +105 -0
  192. package/tests/builtin-tools.test.ts +83 -0
  193. package/tests/channel.test.ts +39 -39
  194. package/tests/cli.test.ts +46 -0
  195. package/tests/e2e.test.ts +134 -134
  196. package/tests/errors.test.ts +83 -83
  197. package/tests/hitl.test.ts +71 -71
  198. package/tests/i18n.test.ts +41 -41
  199. package/tests/mcp.test.ts +54 -54
  200. package/tests/oad.test.ts +68 -68
  201. package/tests/performance.test.ts +115 -115
  202. package/tests/plugin.test.ts +74 -74
  203. package/tests/room.test.ts +106 -106
  204. package/tests/runtime.test.ts +42 -42
  205. package/tests/sandbox.test.ts +46 -46
  206. package/tests/security.test.ts +60 -60
  207. package/tests/subagent.test.ts +130 -0
  208. package/tests/telegram-discord.test.ts +60 -0
  209. package/tests/templates.test.ts +77 -77
  210. package/tests/v070.test.ts +76 -76
  211. package/tests/versioning.test.ts +75 -75
  212. package/tests/voice.test.ts +61 -61
  213. package/tests/webhook.test.ts +29 -29
  214. package/tests/workflow.test.ts +143 -143
  215. package/tsconfig.json +19 -19
  216. package/vitest.config.ts +9 -9
  217. package/dist/core/dashboard.d.ts +0 -35
  218. package/dist/core/dashboard.js +0 -157
  219. package/dist/core/priority.d.ts +0 -52
  220. package/dist/core/priority.js +0 -102
  221. package/src/core/dashboard.ts +0 -219
  222. package/src/core/priority.ts +0 -140
  223. package/src/dtv/data.ts +0 -29
  224. package/src/dtv/trust.ts +0 -43
  225. package/src/dtv/value.ts +0 -47
  226. package/src/marketplace/index.ts +0 -223
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubAgentManager = void 0;
4
+ const agent_1 = require("./agent");
5
+ const memory_1 = require("../memory");
6
+ class SubAgentManager {
7
+ agents = new Map();
8
+ async spawn(config, parentProvider) {
9
+ const id = `sub_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
10
+ const timeout = config.timeout ?? 300000;
11
+ const isolated = config.isolated !== false;
12
+ const agent = new agent_1.BaseAgent({
13
+ name: config.name,
14
+ systemPrompt: config.systemPrompt ?? 'You are a helpful sub-agent.',
15
+ provider: config.provider ?? 'openai',
16
+ model: config.model,
17
+ memory: isolated ? new memory_1.InMemoryStore() : undefined,
18
+ });
19
+ this.agents.set(id, { agent, status: 'running', name: config.name });
20
+ const message = {
21
+ id: `msg_${Date.now()}`,
22
+ role: 'user',
23
+ content: config.task,
24
+ timestamp: Date.now(),
25
+ metadata: { subAgentId: id },
26
+ };
27
+ const start = Date.now();
28
+ try {
29
+ const result = await Promise.race([
30
+ agent.handleMessage(message),
31
+ new Promise((_, reject) => setTimeout(() => reject(new Error('SubAgent timeout')), timeout)),
32
+ ]);
33
+ const duration = Date.now() - start;
34
+ this.agents.set(id, { agent, status: 'completed', name: config.name });
35
+ return { id, name: config.name, status: 'completed', result: result.content, duration };
36
+ }
37
+ catch (err) {
38
+ const duration = Date.now() - start;
39
+ const isTimeout = err.message.includes('timeout');
40
+ const status = isTimeout ? 'timeout' : 'failed';
41
+ this.agents.set(id, { agent, status, name: config.name });
42
+ return { id, name: config.name, status, result: err.message, duration };
43
+ }
44
+ }
45
+ async spawnParallel(configs, parentProvider) {
46
+ return Promise.all(configs.map((c) => this.spawn(c, parentProvider)));
47
+ }
48
+ list() {
49
+ return Array.from(this.agents.entries()).map(([id, entry]) => ({
50
+ id,
51
+ name: entry.name,
52
+ status: entry.status,
53
+ }));
54
+ }
55
+ kill(id) {
56
+ const entry = this.agents.get(id);
57
+ if (!entry)
58
+ return false;
59
+ entry.status = 'killed';
60
+ this.agents.set(id, entry);
61
+ return true;
62
+ }
63
+ }
64
+ exports.SubAgentManager = SubAgentManager;
65
+ //# sourceMappingURL=subagent.js.map
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=daemon.d.ts.map
package/dist/daemon.js ADDED
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ /**
38
+ * Daemon entry point — spawned by `opc start` as a detached background process.
39
+ * Loads agent.yaml, creates runtime, starts all channels, writes heartbeat.
40
+ */
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const runtime_1 = require("./core/runtime");
44
+ const OPC_DIR = path.resolve('.opc');
45
+ const HEARTBEAT_FILE = path.join(OPC_DIR, 'heartbeat');
46
+ const LOG_FILE = path.join(OPC_DIR, 'agent.log');
47
+ const PID_FILE = path.join(OPC_DIR, 'agent.pid');
48
+ const HEARTBEAT_INTERVAL = 30_000;
49
+ function ensureDir(dir) {
50
+ if (!fs.existsSync(dir))
51
+ fs.mkdirSync(dir, { recursive: true });
52
+ }
53
+ function log(msg) {
54
+ const line = `[${new Date().toISOString()}] ${msg}\n`;
55
+ try {
56
+ fs.appendFileSync(LOG_FILE, line);
57
+ }
58
+ catch { /* ignore */ }
59
+ }
60
+ async function main() {
61
+ ensureDir(OPC_DIR);
62
+ // Redirect stdout/stderr to log file
63
+ const logStream = fs.createWriteStream(LOG_FILE, { flags: 'a' });
64
+ process.stdout.write = logStream.write.bind(logStream);
65
+ process.stderr.write = logStream.write.bind(logStream);
66
+ // Write PID
67
+ fs.writeFileSync(PID_FILE, String(process.pid));
68
+ log(`Daemon started, PID=${process.pid}`);
69
+ // Write start time for uptime calculation
70
+ fs.writeFileSync(path.join(OPC_DIR, 'started'), String(Date.now()));
71
+ // Heartbeat
72
+ const heartbeatTimer = setInterval(() => {
73
+ try {
74
+ fs.writeFileSync(HEARTBEAT_FILE, String(Date.now()));
75
+ }
76
+ catch { /* ignore */ }
77
+ }, HEARTBEAT_INTERVAL);
78
+ fs.writeFileSync(HEARTBEAT_FILE, String(Date.now()));
79
+ // Load .env
80
+ const envPath = path.resolve('.env');
81
+ if (fs.existsSync(envPath)) {
82
+ try {
83
+ const content = fs.readFileSync(envPath, 'utf-8');
84
+ for (const line of content.split('\n')) {
85
+ const trimmed = line.trim();
86
+ if (!trimmed || trimmed.startsWith('#'))
87
+ continue;
88
+ const eqIdx = trimmed.indexOf('=');
89
+ if (eqIdx === -1)
90
+ continue;
91
+ const key = trimmed.slice(0, eqIdx).trim();
92
+ const value = trimmed.slice(eqIdx + 1).trim();
93
+ if (!process.env[key])
94
+ process.env[key] = value;
95
+ }
96
+ }
97
+ catch { /* ignore */ }
98
+ }
99
+ // Determine config file
100
+ const configFile = fs.existsSync('agent.yaml') ? 'agent.yaml' : 'oad.yaml';
101
+ const runtime = new runtime_1.AgentRuntime();
102
+ await runtime.loadConfig(configFile);
103
+ await runtime.initialize();
104
+ await runtime.start();
105
+ log(`Agent running (config=${configFile})`);
106
+ // Graceful shutdown
107
+ const shutdown = async (signal) => {
108
+ log(`Received ${signal}, shutting down...`);
109
+ clearInterval(heartbeatTimer);
110
+ await runtime.stop();
111
+ try {
112
+ fs.unlinkSync(PID_FILE);
113
+ }
114
+ catch { /* ignore */ }
115
+ log('Daemon stopped');
116
+ process.exit(0);
117
+ };
118
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
119
+ process.on('SIGINT', () => shutdown('SIGINT'));
120
+ // On Windows, handle the message-based kill
121
+ process.on('message', (msg) => {
122
+ if (msg === 'shutdown')
123
+ shutdown('message:shutdown');
124
+ });
125
+ }
126
+ main().catch((err) => {
127
+ log(`Fatal error: ${err instanceof Error ? err.message : String(err)}`);
128
+ try {
129
+ fs.unlinkSync(PID_FILE);
130
+ }
131
+ catch { /* ignore */ }
132
+ process.exit(1);
133
+ });
134
+ //# sourceMappingURL=daemon.js.map
@@ -113,32 +113,32 @@ function deployToHermes(options) {
113
113
  fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
114
114
  files.push('settings.json');
115
115
  // .env template
116
- const envContent = `# Hermes Agent Environment
117
- HERMES_CHARACTER=${oad.metadata.name}
118
- HERMES_MODEL=${oad.spec.model}
119
- HERMES_PROVIDER=${oad.spec.provider?.default ?? 'openai'}
120
- # Add your API keys below:
121
- # OPENAI_API_KEY=
122
- # DEEPSEEK_API_KEY=
116
+ const envContent = `# Hermes Agent Environment
117
+ HERMES_CHARACTER=${oad.metadata.name}
118
+ HERMES_MODEL=${oad.spec.model}
119
+ HERMES_PROVIDER=${oad.spec.provider?.default ?? 'openai'}
120
+ # Add your API keys below:
121
+ # OPENAI_API_KEY=
122
+ # DEEPSEEK_API_KEY=
123
123
  `;
124
124
  fs.writeFileSync(path.join(outputDir, '.env.hermes'), envContent, 'utf-8');
125
125
  files.push('.env.hermes');
126
126
  // README
127
- const readme = `# ${oad.metadata.name} - Hermes Agent
128
-
129
- Converted from OAD format using \`opc deploy --target hermes\`.
130
-
131
- ## Usage
132
-
133
- 1. Copy \`character.json\` to your Hermes agents directory
134
- 2. Configure \`.env.hermes\` with your API keys
135
- 3. Start Hermes with this character
136
-
137
- ## Files
138
-
139
- - \`character.json\` - Agent character definition
140
- - \`settings.json\` - Runtime settings
141
- - \`.env.hermes\` - Environment template
127
+ const readme = `# ${oad.metadata.name} - Hermes Agent
128
+
129
+ Converted from OAD format using \`opc deploy --target hermes\`.
130
+
131
+ ## Usage
132
+
133
+ 1. Copy \`character.json\` to your Hermes agents directory
134
+ 2. Configure \`.env.hermes\` with your API keys
135
+ 3. Start Hermes with this character
136
+
137
+ ## Files
138
+
139
+ - \`character.json\` - Agent character definition
140
+ - \`settings.json\` - Runtime settings
141
+ - \`.env.hermes\` - Environment template
142
142
  `;
143
143
  fs.writeFileSync(path.join(outputDir, 'README.md'), readme, 'utf-8');
144
144
  files.push('README.md');
@@ -41,27 +41,27 @@ const fs = __importStar(require("fs"));
41
41
  const path = __importStar(require("path"));
42
42
  function generateIdentityMd(oad) {
43
43
  const m = oad.metadata;
44
- return `# IDENTITY.md
45
-
46
- - **Name:** ${m.name}
47
- - **Version:** ${m.version}
48
- - **Description:** ${m.description ?? 'An AI agent'}
49
- - **Author:** ${m.author ?? 'Unknown'}
50
- - **License:** ${m.license}
44
+ return `# IDENTITY.md
45
+
46
+ - **Name:** ${m.name}
47
+ - **Version:** ${m.version}
48
+ - **Description:** ${m.description ?? 'An AI agent'}
49
+ - **Author:** ${m.author ?? 'Unknown'}
50
+ - **License:** ${m.license}
51
51
  `;
52
52
  }
53
53
  function generateSoulMd(oad) {
54
54
  const prompt = oad.spec.systemPrompt ?? 'You are a helpful AI assistant.';
55
- return `# SOUL.md - ${oad.metadata.name}
56
-
57
- ## System Prompt
58
-
59
- ${prompt}
60
-
61
- ## Model Configuration
62
-
63
- - **Model:** ${oad.spec.model}
64
- - **Provider:** ${oad.spec.provider?.default ?? 'deepseek'}
55
+ return `# SOUL.md - ${oad.metadata.name}
56
+
57
+ ## System Prompt
58
+
59
+ ${prompt}
60
+
61
+ ## Model Configuration
62
+
63
+ - **Model:** ${oad.spec.model}
64
+ - **Provider:** ${oad.spec.provider?.default ?? 'deepseek'}
65
65
  `;
66
66
  }
67
67
  function generateAgentsMd(oad) {
@@ -100,35 +100,26 @@ function generateAgentsMd(oad) {
100
100
  md += `Default memory settings.\n`;
101
101
  }
102
102
  md += `\n`;
103
- // DTV
104
- if (dtv) {
105
- md += `## Trust & Value\n\n`;
106
- md += `- Trust Level: ${dtv.trust?.level ?? 'sandbox'}\n`;
107
- if (dtv.value?.metrics?.length) {
108
- md += `- Metrics: ${dtv.value.metrics.join(', ')}\n`;
109
- }
110
- md += `\n`;
111
- }
112
103
  return md;
113
104
  }
114
105
  function generateUserMd(oad) {
115
- return `# USER.md
116
-
117
- - **Name:** (your name)
118
- - **Role:** User
119
- - **Notes:** Configure this file with your preferences for ${oad.metadata.name}.
106
+ return `# USER.md
107
+
108
+ - **Name:** (your name)
109
+ - **Role:** User
110
+ - **Notes:** Configure this file with your preferences for ${oad.metadata.name}.
120
111
  `;
121
112
  }
122
113
  function generateMemoryMd(oad) {
123
- return `# MEMORY.md - ${oad.metadata.name}
124
-
125
- ## Persistent Knowledge
126
-
127
- (Agent will store learned information here)
128
-
129
- ## User Preferences
130
-
131
- (Discovered user preferences will be noted here)
114
+ return `# MEMORY.md - ${oad.metadata.name}
115
+
116
+ ## Persistent Knowledge
117
+
118
+ (Agent will store learned information here)
119
+
120
+ ## User Preferences
121
+
122
+ (Discovered user preferences will be noted here)
132
123
  `;
133
124
  }
134
125
  function generateOpenClawConfig(oad, agentDir) {
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { AgentRuntime, truncateOutput } from './core/runtime';
3
3
  export { Logger } from './core/logger';
4
4
  export { loadOAD, validateOAD } from './core/config';
5
5
  export { OADSchema } from './schema/oad';
6
- export type { OADDocument, Metadata, Spec, DTVConfig, TrustLevelType } from './schema/oad';
6
+ export type { OADDocument, Metadata, Spec } from './schema/oad';
7
7
  export type { IAgent, IChannel, ISkill, Message, AgentContext, SkillResult, MemoryStore, AgentState } from './core/types';
8
8
  export { BaseChannel } from './channels';
9
9
  export { WebChannel } from './channels/web';
@@ -13,9 +13,6 @@ export { BaseSkill } from './skills/base';
13
13
  export { SkillRegistry } from './skills';
14
14
  export { InMemoryStore } from './memory';
15
15
  export { DeepBrainMemoryStore } from './memory/deepbrain';
16
- export { TrustManager } from './dtv/trust';
17
- export { ValueTracker } from './dtv/value';
18
- export { MRGConfigReader } from './dtv/data';
19
16
  export { createProvider, SUPPORTED_PROVIDERS } from './providers';
20
17
  export { Room } from './core/room';
21
18
  export type { RoomMessage } from './core/room';
@@ -45,8 +42,6 @@ export type { Locale } from './i18n';
45
42
  export { KnowledgeBase } from './core/knowledge';
46
43
  export { deployToHermes } from './deploy/hermes';
47
44
  export type { HermesDeployOptions, HermesDeployResult } from './deploy/hermes';
48
- export { publishAgent, installAgent } from './marketplace';
49
- export type { AgentManifest, PublishOptions, InstallOptions } from './marketplace';
50
45
  export { createAuthMiddleware, getActiveSessions } from './core/auth';
51
46
  export type { AuthConfig, AuthSession } from './core/auth';
52
47
  export { Orchestrator } from './core/orchestrator';
@@ -70,6 +65,8 @@ export { SchedulerSkill } from './skills/scheduler';
70
65
  export type { ScheduledTask } from './skills/scheduler';
71
66
  export { DocumentSkill } from './skills/document';
72
67
  export type { DocumentChunk } from './skills/document';
68
+ export { SkillLearner, skillToMarkdown, parseSkillMarkdown } from './skills/auto-learn';
69
+ export type { LearnedSkill } from './skills/auto-learn';
73
70
  export { runTests, loadTestCases, formatReport } from './testing';
74
71
  export type { TestCase, TestResult, TestReport } from './testing';
75
72
  export { AnalyticsEngine } from './core/analytics-engine';
@@ -95,8 +92,11 @@ export { ToolGateway } from './tools/gateway';
95
92
  export type { ToolGatewayConfig, GatewayToolName } from './tools/gateway';
96
93
  export { StreamingManager, StreamableResponse } from './core/streaming';
97
94
  export type { StreamChunk, StreamOptions } from './core/streaming';
98
- export { Dashboard } from './core/dashboard';
99
- export type { DashboardConfig } from './core/dashboard';
100
- export { PriorityRouter } from './core/priority';
101
- export type { PriorityConfig, PriorityTier, PriorityProviderConfig } from './core/priority';
95
+ export { TraceCollector, ConsoleExporter, DeepBrainExporter } from './traces';
96
+ export type { Span, SpanEvent, TraceExporter } from './traces';
97
+ export { Scheduler, parseCron, cronMatches } from './core/scheduler';
98
+ export type { CronJob, JobHandler } from './core/scheduler';
99
+ export { getBuiltinTools, getBuiltinToolsByName } from './tools/builtin';
100
+ export { MCPClient } from './tools/mcp-client';
101
+ export type { MCPServerConfig } from './tools/mcp-client';
102
102
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EmailChannel = exports.compose = exports.AgentPipeline = exports.Orchestrator = exports.getActiveSessions = exports.createAuthMiddleware = exports.installAgent = exports.publishAgent = exports.deployToHermes = exports.KnowledgeBase = exports.addMessages = exports.detectLocale = exports.getLocale = exports.setLocale = exports.t = exports.LazyLoader = exports.RequestBatcher = exports.ConnectionPool = exports.VersionManager = exports.WebhookChannel = exports.VoiceChannel = exports.HITLManager = exports.AgentRegistry = exports.WorkflowEngine = exports.Analytics = exports.Sandbox = exports.PluginManager = exports.createMCPTool = exports.MCPToolRegistry = exports.Room = exports.SUPPORTED_PROVIDERS = exports.createProvider = exports.MRGConfigReader = exports.ValueTracker = exports.TrustManager = exports.DeepBrainMemoryStore = exports.InMemoryStore = exports.SkillRegistry = exports.BaseSkill = exports.WebSocketChannel = exports.TelegramChannel = exports.WebChannel = exports.BaseChannel = exports.OADSchema = exports.validateOAD = exports.loadOAD = exports.Logger = exports.truncateOutput = exports.AgentRuntime = exports.BaseAgent = void 0;
4
- exports.PriorityRouter = exports.Dashboard = exports.StreamableResponse = exports.StreamingManager = exports.ToolGateway = exports.ProcessWatcher = exports.DiscordChannel = exports.FeishuChannel = exports.createRateLimitPlugin = exports.createAnalyticsPlugin = exports.createLoggingPlugin = exports.inputValidation = exports.APIKeyManager = exports.corsMiddleware = exports.securityHeaders = exports.detectInjection = exports.sanitizeInput = exports.formatErrorForUser = exports.wrapError = exports.TimeoutError = exports.SecurityError = exports.RateLimitError = exports.PluginError = exports.ChannelError = exports.ConfigError = exports.ValidationError = exports.ProviderError = exports.OPCError = exports.createTeacherConfig = exports.createDataAnalystConfig = exports.getSupportedLocales = exports.LLMCache = exports.RateLimiter = exports.AnalyticsEngine = exports.formatReport = exports.loadTestCases = exports.runTests = exports.DocumentSkill = exports.SchedulerSkill = exports.WebhookTriggerSkill = exports.HttpSkill = exports.TextAnalysisTool = exports.JsonTransformTool = exports.DateTimeTool = exports.CalculatorTool = exports.WeChatChannel = exports.SlackChannel = void 0;
3
+ exports.JsonTransformTool = exports.DateTimeTool = exports.CalculatorTool = exports.WeChatChannel = exports.SlackChannel = exports.EmailChannel = exports.compose = exports.AgentPipeline = exports.Orchestrator = exports.getActiveSessions = exports.createAuthMiddleware = exports.deployToHermes = exports.KnowledgeBase = exports.addMessages = exports.detectLocale = exports.getLocale = exports.setLocale = exports.t = exports.LazyLoader = exports.RequestBatcher = exports.ConnectionPool = exports.VersionManager = exports.WebhookChannel = exports.VoiceChannel = exports.HITLManager = exports.AgentRegistry = exports.WorkflowEngine = exports.Analytics = exports.Sandbox = exports.PluginManager = exports.createMCPTool = exports.MCPToolRegistry = exports.Room = exports.SUPPORTED_PROVIDERS = exports.createProvider = exports.DeepBrainMemoryStore = exports.InMemoryStore = exports.SkillRegistry = exports.BaseSkill = exports.WebSocketChannel = exports.TelegramChannel = exports.WebChannel = exports.BaseChannel = exports.OADSchema = exports.validateOAD = exports.loadOAD = exports.Logger = exports.truncateOutput = exports.AgentRuntime = exports.BaseAgent = void 0;
4
+ exports.getBuiltinTools = exports.cronMatches = exports.parseCron = exports.Scheduler = exports.DeepBrainExporter = exports.ConsoleExporter = exports.TraceCollector = exports.StreamableResponse = exports.StreamingManager = exports.ToolGateway = exports.ProcessWatcher = exports.DiscordChannel = exports.FeishuChannel = exports.createRateLimitPlugin = exports.createAnalyticsPlugin = exports.createLoggingPlugin = exports.inputValidation = exports.APIKeyManager = exports.corsMiddleware = exports.securityHeaders = exports.detectInjection = exports.sanitizeInput = exports.formatErrorForUser = exports.wrapError = exports.TimeoutError = exports.SecurityError = exports.RateLimitError = exports.PluginError = exports.ChannelError = exports.ConfigError = exports.ValidationError = exports.ProviderError = exports.OPCError = exports.createTeacherConfig = exports.createDataAnalystConfig = exports.getSupportedLocales = exports.LLMCache = exports.RateLimiter = exports.AnalyticsEngine = exports.formatReport = exports.loadTestCases = exports.runTests = exports.parseSkillMarkdown = exports.skillToMarkdown = exports.SkillLearner = exports.DocumentSkill = exports.SchedulerSkill = exports.WebhookTriggerSkill = exports.HttpSkill = exports.TextAnalysisTool = void 0;
5
+ exports.MCPClient = exports.getBuiltinToolsByName = void 0;
5
6
  // OPC Agent — Open Agent Framework
6
7
  var agent_1 = require("./core/agent");
7
8
  Object.defineProperty(exports, "BaseAgent", { enumerable: true, get: function () { return agent_1.BaseAgent; } });
@@ -31,12 +32,6 @@ var memory_1 = require("./memory");
31
32
  Object.defineProperty(exports, "InMemoryStore", { enumerable: true, get: function () { return memory_1.InMemoryStore; } });
32
33
  var deepbrain_1 = require("./memory/deepbrain");
33
34
  Object.defineProperty(exports, "DeepBrainMemoryStore", { enumerable: true, get: function () { return deepbrain_1.DeepBrainMemoryStore; } });
34
- var trust_1 = require("./dtv/trust");
35
- Object.defineProperty(exports, "TrustManager", { enumerable: true, get: function () { return trust_1.TrustManager; } });
36
- var value_1 = require("./dtv/value");
37
- Object.defineProperty(exports, "ValueTracker", { enumerable: true, get: function () { return value_1.ValueTracker; } });
38
- var data_1 = require("./dtv/data");
39
- Object.defineProperty(exports, "MRGConfigReader", { enumerable: true, get: function () { return data_1.MRGConfigReader; } });
40
35
  var providers_1 = require("./providers");
41
36
  Object.defineProperty(exports, "createProvider", { enumerable: true, get: function () { return providers_1.createProvider; } });
42
37
  Object.defineProperty(exports, "SUPPORTED_PROVIDERS", { enumerable: true, get: function () { return providers_1.SUPPORTED_PROVIDERS; } });
@@ -80,9 +75,6 @@ var knowledge_1 = require("./core/knowledge");
80
75
  Object.defineProperty(exports, "KnowledgeBase", { enumerable: true, get: function () { return knowledge_1.KnowledgeBase; } });
81
76
  var hermes_1 = require("./deploy/hermes");
82
77
  Object.defineProperty(exports, "deployToHermes", { enumerable: true, get: function () { return hermes_1.deployToHermes; } });
83
- var marketplace_1 = require("./marketplace");
84
- Object.defineProperty(exports, "publishAgent", { enumerable: true, get: function () { return marketplace_1.publishAgent; } });
85
- Object.defineProperty(exports, "installAgent", { enumerable: true, get: function () { return marketplace_1.installAgent; } });
86
78
  // v0.7.0 modules
87
79
  var auth_1 = require("./core/auth");
88
80
  Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_1.createAuthMiddleware; } });
@@ -115,6 +107,10 @@ var scheduler_1 = require("./skills/scheduler");
115
107
  Object.defineProperty(exports, "SchedulerSkill", { enumerable: true, get: function () { return scheduler_1.SchedulerSkill; } });
116
108
  var document_1 = require("./skills/document");
117
109
  Object.defineProperty(exports, "DocumentSkill", { enumerable: true, get: function () { return document_1.DocumentSkill; } });
110
+ var auto_learn_1 = require("./skills/auto-learn");
111
+ Object.defineProperty(exports, "SkillLearner", { enumerable: true, get: function () { return auto_learn_1.SkillLearner; } });
112
+ Object.defineProperty(exports, "skillToMarkdown", { enumerable: true, get: function () { return auto_learn_1.skillToMarkdown; } });
113
+ Object.defineProperty(exports, "parseSkillMarkdown", { enumerable: true, get: function () { return auto_learn_1.parseSkillMarkdown; } });
118
114
  // v0.9.0 modules
119
115
  var testing_1 = require("./testing");
120
116
  Object.defineProperty(exports, "runTests", { enumerable: true, get: function () { return testing_1.runTests; } });
@@ -170,8 +166,19 @@ var streaming_1 = require("./core/streaming");
170
166
  Object.defineProperty(exports, "StreamingManager", { enumerable: true, get: function () { return streaming_1.StreamingManager; } });
171
167
  Object.defineProperty(exports, "StreamableResponse", { enumerable: true, get: function () { return streaming_1.StreamableResponse; } });
172
168
  // v1.3.0 modules
173
- var dashboard_1 = require("./core/dashboard");
174
- Object.defineProperty(exports, "Dashboard", { enumerable: true, get: function () { return dashboard_1.Dashboard; } });
175
- var priority_1 = require("./core/priority");
176
- Object.defineProperty(exports, "PriorityRouter", { enumerable: true, get: function () { return priority_1.PriorityRouter; } });
169
+ var traces_1 = require("./traces");
170
+ Object.defineProperty(exports, "TraceCollector", { enumerable: true, get: function () { return traces_1.TraceCollector; } });
171
+ Object.defineProperty(exports, "ConsoleExporter", { enumerable: true, get: function () { return traces_1.ConsoleExporter; } });
172
+ Object.defineProperty(exports, "DeepBrainExporter", { enumerable: true, get: function () { return traces_1.DeepBrainExporter; } });
173
+ // v1.4.0 modules
174
+ var scheduler_2 = require("./core/scheduler");
175
+ Object.defineProperty(exports, "Scheduler", { enumerable: true, get: function () { return scheduler_2.Scheduler; } });
176
+ Object.defineProperty(exports, "parseCron", { enumerable: true, get: function () { return scheduler_2.parseCron; } });
177
+ Object.defineProperty(exports, "cronMatches", { enumerable: true, get: function () { return scheduler_2.cronMatches; } });
178
+ // v1.5.0 — built-in tools + MCP client
179
+ var builtin_1 = require("./tools/builtin");
180
+ Object.defineProperty(exports, "getBuiltinTools", { enumerable: true, get: function () { return builtin_1.getBuiltinTools; } });
181
+ Object.defineProperty(exports, "getBuiltinToolsByName", { enumerable: true, get: function () { return builtin_1.getBuiltinToolsByName; } });
182
+ var mcp_client_1 = require("./tools/mcp-client");
183
+ Object.defineProperty(exports, "MCPClient", { enumerable: true, get: function () { return mcp_client_1.MCPClient; } });
177
184
  //# sourceMappingURL=index.js.map
@@ -1,9 +1,13 @@
1
1
  import type { Message } from '../core/types';
2
+ import type { MCPToolDefinition } from '../tools/mcp';
3
+ export interface ChatOptions {
4
+ tools?: MCPToolDefinition[];
5
+ }
2
6
  export interface LLMProvider {
3
7
  name: string;
4
- chat(messages: Message[], systemPrompt?: string): Promise<string>;
8
+ chat(messages: Message[], systemPrompt?: string, options?: ChatOptions): Promise<string>;
5
9
  chatStream(messages: Message[], systemPrompt?: string): AsyncIterable<string>;
6
10
  }
7
11
  export declare function createProvider(name?: string, model?: string, baseUrl?: string, apiKey?: string): LLMProvider;
8
- export declare const SUPPORTED_PROVIDERS: readonly ["openai", "deepseek", "qwen", "gemini", "dashscope", "zhipu", "moonshot"];
12
+ export declare const SUPPORTED_PROVIDERS: readonly ["openai", "ollama", "deepseek", "qwen", "gemini", "dashscope", "zhipu", "moonshot"];
9
13
  //# sourceMappingURL=index.d.ts.map
@@ -43,6 +43,10 @@ function getApiKey() {
43
43
  function getBaseUrl() {
44
44
  return process.env.OPC_LLM_BASE_URL || 'https://api.openai.com/v1';
45
45
  }
46
+ function buildToolPrompt(tools) {
47
+ const toolsDesc = tools.map(t => `- ${t.name}: ${t.description}\n Input schema: ${JSON.stringify(t.inputSchema)}`).join('\n');
48
+ return `\n\nYou have access to the following tools. To use a tool, respond with ONLY a JSON object in this format:\n<tool_call>{"name": "tool_name", "arguments": {...}}</tool_call>\n\nAvailable tools:\n${toolsDesc}\n\nIf you don't need a tool, respond normally with text.`;
49
+ }
46
50
  class OpenAICompatibleProvider {
47
51
  name;
48
52
  model;
@@ -111,13 +115,16 @@ class OpenAICompatibleProvider {
111
115
  req.end();
112
116
  });
113
117
  }
114
- async chat(messages, systemPrompt) {
118
+ async chat(messages, systemPrompt, options) {
115
119
  if (!this.apiKey) {
116
- // Stub mode when no API key
117
120
  const last = messages[messages.length - 1];
118
121
  return `[${this.name}/${this.model} - no API key] Echo: ${last?.content ?? ''}`;
119
122
  }
120
- const formatted = this.formatMessages(messages, systemPrompt);
123
+ let effectivePrompt = systemPrompt;
124
+ if (options?.tools && options.tools.length > 0) {
125
+ effectivePrompt = (systemPrompt || '') + buildToolPrompt(options.tools);
126
+ }
127
+ const formatted = this.formatMessages(messages, effectivePrompt);
121
128
  const result = await this.request({
122
129
  model: this.model,
123
130
  messages: formatted,
@@ -220,12 +227,16 @@ class GeminiNativeProvider {
220
227
  }
221
228
  return result;
222
229
  }
223
- async chat(messages, systemPrompt) {
230
+ async chat(messages, systemPrompt, options) {
224
231
  if (!this.apiKey) {
225
232
  const last = messages[messages.length - 1];
226
233
  return `[gemini/${this.model} - no API key] Echo: ${last?.content ?? ''}`;
227
234
  }
228
- const body = this.formatContents(messages, systemPrompt);
235
+ let effectivePrompt = systemPrompt;
236
+ if (options?.tools && options.tools.length > 0) {
237
+ effectivePrompt = (systemPrompt || '') + buildToolPrompt(options.tools);
238
+ }
239
+ const body = this.formatContents(messages, effectivePrompt);
229
240
  const url = this.buildUrl(false);
230
241
  const postData = JSON.stringify(body);
231
242
  return new Promise((resolve, reject) => {
@@ -310,18 +321,20 @@ class GeminiNativeProvider {
310
321
  function isGeminiNative() {
311
322
  const baseUrl = process.env.OPC_LLM_BASE_URL || '';
312
323
  const key = getApiKey();
313
- // Use native Gemini API when: key starts with AQ. (new format) OR base URL points to googleapis
314
324
  return key.startsWith('AQ.') || (baseUrl.includes('googleapis.com') && !baseUrl.includes('/openai'));
315
325
  }
316
326
  function createProvider(name = 'openai', model, baseUrl, apiKey) {
317
327
  const finalModel = model || process.env.OPC_LLM_MODEL || 'gpt-4o-mini';
328
+ if (name === 'ollama') {
329
+ const ollamaBase = baseUrl || process.env.OPC_LLM_BASE_URL || 'http://localhost:11434/v1';
330
+ const ollamaKey = apiKey || process.env.OPC_LLM_API_KEY || 'ollama';
331
+ return new OpenAICompatibleProvider('ollama', finalModel, ollamaBase, ollamaKey);
332
+ }
318
333
  const finalKey = apiKey || getApiKey();
319
334
  const finalBaseUrl = baseUrl || getBaseUrl();
320
- // Auto-detect Gemini native when key is new format or base URL points to googleapis
321
335
  if (finalKey.startsWith('AQ.') || isGeminiNative()) {
322
336
  return new GeminiNativeProvider(finalModel, finalKey);
323
337
  }
324
- // Auto-detect provider name from base URL
325
338
  let resolvedName = name;
326
339
  if (finalBaseUrl.includes('deepseek.com')) {
327
340
  resolvedName = 'deepseek';
@@ -331,5 +344,5 @@ function createProvider(name = 'openai', model, baseUrl, apiKey) {
331
344
  }
332
345
  return new OpenAICompatibleProvider(resolvedName, finalModel, baseUrl, apiKey);
333
346
  }
334
- exports.SUPPORTED_PROVIDERS = ['openai', 'deepseek', 'qwen', 'gemini', 'dashscope', 'zhipu', 'moonshot'];
347
+ exports.SUPPORTED_PROVIDERS = ['openai', 'ollama', 'deepseek', 'qwen', 'gemini', 'dashscope', 'zhipu', 'moonshot'];
335
348
  //# sourceMappingURL=index.js.map