opc-agent 4.2.13 → 5.0.0-alpha.1

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 (188) hide show
  1. package/.opc/memory.db +0 -0
  2. package/TASK.md +49 -0
  3. package/data/brain.db/deepbrain.sqlite +0 -0
  4. package/dist/channels/api.d.ts +14 -0
  5. package/dist/channels/api.d.ts.map +1 -0
  6. package/dist/channels/api.js +58 -0
  7. package/dist/channels/api.js.map +1 -0
  8. package/dist/cli.js +144 -52
  9. package/dist/cli.js.map +1 -1
  10. package/dist/core/agent-loop.d.ts +3 -0
  11. package/dist/core/agent-loop.d.ts.map +1 -0
  12. package/dist/core/agent-loop.js +51 -0
  13. package/dist/core/agent-loop.js.map +1 -0
  14. package/dist/core/context-assembler.d.ts +12 -0
  15. package/dist/core/context-assembler.d.ts.map +1 -0
  16. package/dist/core/context-assembler.js +81 -0
  17. package/dist/core/context-assembler.js.map +1 -0
  18. package/dist/core/guardrails.d.ts +16 -0
  19. package/dist/core/guardrails.d.ts.map +1 -0
  20. package/dist/core/guardrails.js +62 -0
  21. package/dist/core/guardrails.js.map +1 -0
  22. package/dist/core/index.d.ts +1 -0
  23. package/dist/core/index.d.ts.map +1 -0
  24. package/dist/core/index.js +3 -0
  25. package/dist/core/index.js.map +1 -0
  26. package/dist/core/iteration-budget.d.ts +12 -0
  27. package/dist/core/iteration-budget.d.ts.map +1 -0
  28. package/dist/core/iteration-budget.js +26 -0
  29. package/dist/core/iteration-budget.js.map +1 -0
  30. package/dist/core/types.d.ts +412 -0
  31. package/dist/core/types.d.ts.map +1 -1
  32. package/dist/deepbrain/embedding.d.ts +7 -0
  33. package/dist/deepbrain/embedding.d.ts.map +1 -0
  34. package/dist/deepbrain/embedding.js +108 -0
  35. package/dist/deepbrain/embedding.js.map +1 -0
  36. package/dist/deepbrain/index.d.ts +8 -0
  37. package/dist/deepbrain/index.d.ts.map +1 -0
  38. package/dist/deepbrain/index.js +19 -0
  39. package/dist/deepbrain/index.js.map +1 -0
  40. package/dist/deepbrain/migrate.d.ts +2 -0
  41. package/dist/deepbrain/migrate.d.ts.map +1 -0
  42. package/dist/deepbrain/migrate.js +139 -0
  43. package/dist/deepbrain/migrate.js.map +1 -0
  44. package/dist/deepbrain/provider.d.ts +13 -0
  45. package/dist/deepbrain/provider.d.ts.map +1 -0
  46. package/dist/deepbrain/provider.js +85 -0
  47. package/dist/deepbrain/provider.js.map +1 -0
  48. package/dist/deepbrain/recall.d.ts +9 -0
  49. package/dist/deepbrain/recall.d.ts.map +1 -0
  50. package/dist/deepbrain/recall.js +48 -0
  51. package/dist/deepbrain/recall.js.map +1 -0
  52. package/dist/deepbrain/store.d.ts +36 -0
  53. package/dist/deepbrain/store.d.ts.map +1 -0
  54. package/dist/deepbrain/store.js +342 -0
  55. package/dist/deepbrain/store.js.map +1 -0
  56. package/dist/deepbrain/workspace-files.d.ts +5 -0
  57. package/dist/deepbrain/workspace-files.d.ts.map +1 -0
  58. package/dist/deepbrain/workspace-files.js +159 -0
  59. package/dist/deepbrain/workspace-files.js.map +1 -0
  60. package/dist/evolution/index.d.ts +1 -0
  61. package/dist/evolution/index.d.ts.map +1 -0
  62. package/dist/evolution/index.js +3 -0
  63. package/dist/evolution/index.js.map +1 -0
  64. package/dist/evolution/l1-experience.d.ts +5 -0
  65. package/dist/evolution/l1-experience.d.ts.map +1 -0
  66. package/dist/evolution/l1-experience.js +117 -0
  67. package/dist/evolution/l1-experience.js.map +1 -0
  68. package/dist/evolution/l2-consolidation.d.ts +4 -0
  69. package/dist/evolution/l2-consolidation.d.ts.map +1 -0
  70. package/dist/evolution/l2-consolidation.js +106 -0
  71. package/dist/evolution/l2-consolidation.js.map +1 -0
  72. package/dist/evolution/l2-memskill.d.ts +12 -0
  73. package/dist/evolution/l2-memskill.d.ts.map +1 -0
  74. package/dist/evolution/l2-memskill.js +57 -0
  75. package/dist/evolution/l2-memskill.js.map +1 -0
  76. package/dist/evolution/l3-skill-discover.d.ts +4 -0
  77. package/dist/evolution/l3-skill-discover.d.ts.map +1 -0
  78. package/dist/evolution/l3-skill-discover.js +139 -0
  79. package/dist/evolution/l3-skill-discover.js.map +1 -0
  80. package/dist/evolution/l3-skill-verify.d.ts +12 -0
  81. package/dist/evolution/l3-skill-verify.d.ts.map +1 -0
  82. package/dist/evolution/l3-skill-verify.js +122 -0
  83. package/dist/evolution/l3-skill-verify.js.map +1 -0
  84. package/dist/evolution/l4-desensitize.d.ts +7 -0
  85. package/dist/evolution/l4-desensitize.d.ts.map +1 -0
  86. package/dist/evolution/l4-desensitize.js +30 -0
  87. package/dist/evolution/l4-desensitize.js.map +1 -0
  88. package/dist/evolution/l4-group-evolve.d.ts +8 -0
  89. package/dist/evolution/l4-group-evolve.d.ts.map +1 -0
  90. package/dist/evolution/l4-group-evolve.js +15 -0
  91. package/dist/evolution/l4-group-evolve.js.map +1 -0
  92. package/dist/evolution/maturity-scorer.d.ts +11 -0
  93. package/dist/evolution/maturity-scorer.d.ts.map +1 -0
  94. package/dist/evolution/maturity-scorer.js +21 -0
  95. package/dist/evolution/maturity-scorer.js.map +1 -0
  96. package/dist/index.d.ts +7 -1
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +33 -5
  99. package/dist/index.js.map +1 -1
  100. package/dist/providers/agentkits.d.ts +20 -0
  101. package/dist/providers/agentkits.d.ts.map +1 -0
  102. package/dist/providers/agentkits.js +173 -0
  103. package/dist/providers/agentkits.js.map +1 -0
  104. package/dist/providers/model-provider.d.ts +16 -0
  105. package/dist/providers/model-provider.d.ts.map +1 -0
  106. package/dist/providers/model-provider.js +13 -0
  107. package/dist/providers/model-provider.js.map +1 -0
  108. package/dist/providers/model-recommender.d.ts +15 -0
  109. package/dist/providers/model-recommender.d.ts.map +1 -0
  110. package/dist/providers/model-recommender.js +71 -0
  111. package/dist/providers/model-recommender.js.map +1 -0
  112. package/dist/providers/ollama.d.ts +22 -0
  113. package/dist/providers/ollama.d.ts.map +1 -0
  114. package/dist/providers/ollama.js +176 -0
  115. package/dist/providers/ollama.js.map +1 -0
  116. package/dist/providers/openai-compat.d.ts +23 -0
  117. package/dist/providers/openai-compat.d.ts.map +1 -0
  118. package/dist/providers/openai-compat.js +184 -0
  119. package/dist/providers/openai-compat.js.map +1 -0
  120. package/dist/providers/router.d.ts +11 -0
  121. package/dist/providers/router.d.ts.map +1 -0
  122. package/dist/providers/router.js +48 -0
  123. package/dist/providers/router.js.map +1 -0
  124. package/dist/scheduler/cron.d.ts +19 -0
  125. package/dist/scheduler/cron.d.ts.map +1 -0
  126. package/dist/scheduler/cron.js +64 -0
  127. package/dist/scheduler/cron.js.map +1 -0
  128. package/dist/schema/oad.d.ts +72 -72
  129. package/dist/skills/loader.d.ts +16 -0
  130. package/dist/skills/loader.d.ts.map +1 -0
  131. package/dist/skills/loader.js +114 -0
  132. package/dist/skills/loader.js.map +1 -0
  133. package/dist/skills/matcher.d.ts +18 -0
  134. package/dist/skills/matcher.d.ts.map +1 -0
  135. package/dist/skills/matcher.js +70 -0
  136. package/dist/skills/matcher.js.map +1 -0
  137. package/dist/studio/agent-pool.d.ts +17 -0
  138. package/dist/studio/agent-pool.d.ts.map +1 -0
  139. package/dist/studio/agent-pool.js +35 -0
  140. package/dist/studio/agent-pool.js.map +1 -0
  141. package/dist/studio/assistant-tools.d.ts +4 -0
  142. package/dist/studio/assistant-tools.d.ts.map +1 -0
  143. package/dist/studio/assistant-tools.js +36 -0
  144. package/dist/studio/assistant-tools.js.map +1 -0
  145. package/dist/studio/index.d.ts +1 -0
  146. package/dist/studio/index.d.ts.map +1 -0
  147. package/dist/studio/index.js +3 -0
  148. package/dist/studio/index.js.map +1 -0
  149. package/dist/studio/server.d.ts.map +1 -1
  150. package/dist/studio/server.js +13 -18
  151. package/dist/studio/server.js.map +1 -1
  152. package/dist/templates/index.d.ts +1 -0
  153. package/dist/templates/index.d.ts.map +1 -0
  154. package/dist/templates/index.js +3 -0
  155. package/dist/templates/index.js.map +1 -0
  156. package/dist/templates/roles/index.d.ts +4 -0
  157. package/dist/templates/roles/index.d.ts.map +1 -0
  158. package/dist/templates/roles/index.js +46 -0
  159. package/dist/templates/roles/index.js.map +1 -0
  160. package/dist/templates/template-provider.d.ts +16 -0
  161. package/dist/templates/template-provider.d.ts.map +1 -0
  162. package/dist/templates/template-provider.js +60 -0
  163. package/dist/templates/template-provider.js.map +1 -0
  164. package/dist/tools/builtin/definitions.d.ts +7 -0
  165. package/dist/tools/builtin/definitions.d.ts.map +1 -0
  166. package/dist/tools/builtin/definitions.js +60 -0
  167. package/dist/tools/builtin/definitions.js.map +1 -0
  168. package/dist/tools/execute-code.d.ts +20 -0
  169. package/dist/tools/execute-code.d.ts.map +1 -0
  170. package/dist/tools/execute-code.js +92 -0
  171. package/dist/tools/execute-code.js.map +1 -0
  172. package/dist/tools/hooks.d.ts +47 -0
  173. package/dist/tools/hooks.d.ts.map +1 -0
  174. package/dist/tools/hooks.js +69 -0
  175. package/dist/tools/hooks.js.map +1 -0
  176. package/dist/tools/index.d.ts +9 -0
  177. package/dist/tools/index.d.ts.map +1 -0
  178. package/dist/tools/index.js +16 -0
  179. package/dist/tools/index.js.map +1 -0
  180. package/dist/tools/permission.d.ts +20 -0
  181. package/dist/tools/permission.d.ts.map +1 -0
  182. package/dist/tools/permission.js +35 -0
  183. package/dist/tools/permission.js.map +1 -0
  184. package/dist/tools/registry.d.ts +25 -0
  185. package/dist/tools/registry.d.ts.map +1 -0
  186. package/dist/tools/registry.js +42 -0
  187. package/dist/tools/registry.js.map +1 -0
  188. package/package.json +1 -1
package/.opc/memory.db CHANGED
Binary file
package/TASK.md ADDED
@@ -0,0 +1,49 @@
1
+ # Task: E2E 跑通 — opc init → opc run → opc studio
2
+
3
+ 目标:让 v2 代码真正能跑起来,不是只编译通过。
4
+
5
+ ## 测试流程
6
+ 在一个干净的临时目录里执行:
7
+
8
+ ```bash
9
+ mkdir /tmp/opc-e2e-test && cd /tmp/opc-e2e-test
10
+ node C:\Users\mingjwan\opc-agent\dist\cli.js init --yes
11
+ node C:\Users\mingjwan\opc-agent\dist\cli.js studio
12
+ # Studio 应该在 localhost:4000 启动
13
+ ```
14
+
15
+ ## 需要修复的问题
16
+
17
+ ### 1. opc init
18
+ 确保 init 命令能正常运行:
19
+ - 创建 EGO.md(如果用户没有 SOUL.md 也没有 EGO.md)
20
+ - 创建 DEEPBRAIN.md(或兼容已有 MEMORY.md)
21
+ - 创建 .opc/ 目录
22
+ - 创建 oad.yaml 配置文件
23
+ - 如果有 SOUL.md/MEMORY.md 不要覆盖,保持兼容
24
+
25
+ ### 2. opc studio
26
+ 确保 studio 命令能启动 Express server:
27
+ - server.ts 中的 StudioServer class 必须有 start() 方法
28
+ - 绑定端口 4000
29
+ - 返回 studio-ui/index.html
30
+ - API routes: /api/agents, /api/models, /api/brain/stats 等
31
+ - 不要因为 Ollama 不可用就崩溃
32
+
33
+ ### 3. opc chat
34
+ 确保 TUI 聊天能工作(至少不崩溃):
35
+ - 读取 EGO.md/DEEPBRAIN.md
36
+ - 初始化 DeepBrain
37
+ - 连接 model provider(Ollama 优先,不可用就报错提示)
38
+ - readline 循环
39
+
40
+ ### 4. opc brain recall/stats
41
+ - brain recall "test" → 应该返回空结果(新数据库)
42
+ - brain stats → 应该返回 {total: 0, byLayer: {}, bySource: {}}
43
+
44
+ ## 关键约束
45
+ - 不要改 tsconfig.json
46
+ - 修复运行时错误(import 路径、missing exports、undefined 变量等)
47
+ - 每修一个问题就重新 build (`npx tsc`) 验证
48
+ - 最终 `npx tsc` 零报错 + 上述 4 个命令都能跑
49
+ - 完成后 git commit
Binary file
@@ -0,0 +1,14 @@
1
+ import type { ApiChannelConfig, IChannel, Message } from '../core/types';
2
+ export declare class ApiChannel implements IChannel {
3
+ private config;
4
+ readonly type = "api";
5
+ private app;
6
+ private handler?;
7
+ private server?;
8
+ constructor(config: ApiChannelConfig);
9
+ private setupRoutes;
10
+ onMessage(handler: (msg: Message) => Promise<Message>): void;
11
+ start(): Promise<void>;
12
+ stop(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/channels/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIzE,qBAAa,UAAW,YAAW,QAAQ;IAM7B,OAAO,CAAC,MAAM;IAL1B,QAAQ,CAAC,IAAI,SAAS;IACtB,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,OAAO,CAAC,CAAqC;IACrD,OAAO,CAAC,MAAM,CAAC,CAAgC;gBAE3B,MAAM,EAAE,gBAAgB;IAM5C,OAAO,CAAC,WAAW;IAiBnB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAItD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAM5B"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ApiChannel = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ class ApiChannel {
9
+ config;
10
+ type = 'api';
11
+ app;
12
+ handler;
13
+ server;
14
+ constructor(config) {
15
+ this.config = config;
16
+ this.app = (0, express_1.default)();
17
+ this.app.use(express_1.default.json());
18
+ this.setupRoutes();
19
+ }
20
+ setupRoutes() {
21
+ const base = this.config.basePath ?? '/api';
22
+ this.app.post(`${base}/chat`, async (req, res) => {
23
+ if (!this.handler) {
24
+ res.status(503).json({ error: 'no handler' });
25
+ return;
26
+ }
27
+ try {
28
+ const msg = { id: Date.now().toString(), role: 'user', content: req.body.content ?? '', timestamp: Date.now() };
29
+ const reply = await this.handler(msg);
30
+ res.json(reply);
31
+ }
32
+ catch (err) {
33
+ res.status(500).json({ error: String(err) });
34
+ }
35
+ });
36
+ this.app.get(`${base}/health`, (_req, res) => { res.json({ status: 'ok' }); });
37
+ }
38
+ onMessage(handler) {
39
+ this.handler = handler;
40
+ }
41
+ async start() {
42
+ const port = this.config.port ?? 8080;
43
+ return new Promise((resolve) => {
44
+ this.server = this.app.listen(port, resolve);
45
+ });
46
+ }
47
+ async stop() {
48
+ return new Promise((resolve, reject) => {
49
+ if (!this.server) {
50
+ resolve();
51
+ return;
52
+ }
53
+ this.server.close((err) => (err ? reject(err) : resolve()));
54
+ });
55
+ }
56
+ }
57
+ exports.ApiChannel = ApiChannel;
58
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/channels/api.ts"],"names":[],"mappings":";;;;;;AAEA,sDAA8B;AAG9B,MAAa,UAAU;IAMD;IALX,IAAI,GAAG,KAAK,CAAC;IACd,GAAG,CAAU;IACb,OAAO,CAAsC;IAC7C,MAAM,CAAiC;IAE/C,YAAoB,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;QAC1C,IAAI,CAAC,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEO,WAAW;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;QAE5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC7E,IAAI,CAAC;gBACH,MAAM,GAAG,GAAY,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACtC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,SAAS,CAAC,OAA2C;QACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,OAAO,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA9CD,gCA8CC"}
package/dist/cli.js CHANGED
@@ -244,6 +244,10 @@ spec:
244
244
  // CONTEXT.md
245
245
  const readmeContent = roleData.files['README.md'] || '';
246
246
  fs.writeFileSync(path.join(dir, 'CONTEXT.md'), `# Project Context\n\n## Role: ${roleDisplayName}\n\n${readmeContent}\n`);
247
+ // .opc/ directory — runtime state
248
+ fs.mkdirSync(path.join(dir, '.opc'), { recursive: true });
249
+ // DEEPBRAIN.md — long-term memory seed
250
+ fs.writeFileSync(path.join(dir, 'DEEPBRAIN.md'), `# DeepBrain Memory\n\nThis file seeds the agent's long-term knowledge store.\n`);
247
251
  // data/brain-seed.md if available
248
252
  if (roleData.files['brain-seed.md']) {
249
253
  fs.writeFileSync(path.join(dir, 'data', 'brain-seed.md'), roleData.files['brain-seed.md']);
@@ -774,6 +778,18 @@ on startup to understand the project context.
774
778
  - Add domain knowledge here
775
779
  - Add FAQ items here
776
780
  - Add company policies here
781
+ `);
782
+ // .opc/ directory — runtime state (brain DB, cache, etc.)
783
+ fs.mkdirSync(path.join(dir, '.opc'), { recursive: true });
784
+ // DEEPBRAIN.md — long-term memory seed (compat with MEMORY.md)
785
+ fs.writeFileSync(path.join(dir, 'DEEPBRAIN.md'), `# DeepBrain Memory
786
+
787
+ This file seeds the agent's long-term knowledge store (DeepBrain).
788
+ Add knowledge entries below — they will be loaded on first run.
789
+
790
+ ## Core Knowledge
791
+
792
+ <!-- Add domain knowledge, FAQs, policies, etc. here -->
777
793
  `);
778
794
  console.log(`\n${icon.success} Created agent project: ${color.bold(name + '/')}`);
779
795
  console.log(` ${icon.file} oad.yaml - Agent 配置 (${llmProvider}/${llmModel})`);
@@ -782,6 +798,8 @@ on startup to understand the project context.
782
798
  console.log(` ${icon.file} src/skills/echo.ts - Example skill`);
783
799
  console.log(` ${icon.file} SOUL.md - Agent personality`);
784
800
  console.log(` ${icon.file} CONTEXT.md - Project context`);
801
+ console.log(` ${icon.file} DEEPBRAIN.md - Long-term memory seed`);
802
+ console.log(` ${icon.file} .opc/ - Runtime state directory`);
785
803
  console.log(` ${icon.file} package.json - Dependencies`);
786
804
  console.log(` ${icon.file} tsconfig.json - TypeScript config`);
787
805
  console.log(` ${icon.file} .env.example - Environment template`);
@@ -1532,65 +1550,89 @@ protocolCmd.command('disable')
1532
1550
  // 🔄 Migrate command ────────────────────────────────────────
1533
1551
  program
1534
1552
  .command('migrate')
1535
- .description('Migrate OAD to latest schema version')
1553
+ .description('Migrate project: MEMORY.md → DEEPBRAIN.md and OAD to latest schema')
1536
1554
  .option('-f, --file <file>', 'OAD file', 'oad.yaml')
1537
1555
  .option('--dry-run', 'Show changes without writing')
1556
+ .option('--schema-only', 'Only migrate OAD schema (skip MEMORY.md → DEEPBRAIN.md)')
1538
1557
  .action(async (opts) => {
1558
+ // Step 1: MEMORY.md → DEEPBRAIN.md migration
1559
+ if (!opts.schemaOnly) {
1560
+ console.log(`\n${icon.gear} ${color.bold('DeepBrain Migration')} (MEMORY.md → DEEPBRAIN.md)\n`);
1561
+ try {
1562
+ if (opts.dryRun) {
1563
+ const memExists = fs.existsSync(path.join(process.cwd(), 'MEMORY.md'));
1564
+ const soulExists = fs.existsSync(path.join(process.cwd(), 'SOUL.md'));
1565
+ const dbExists = fs.existsSync(path.join(process.cwd(), '.opc', 'brain.db'));
1566
+ console.log(` MEMORY.md: ${memExists ? color.cyan('found — would migrate to DEEPBRAIN.md') : color.dim('not found')}`);
1567
+ console.log(` SOUL.md: ${soulExists ? color.cyan('found — would migrate to EGO.md') : color.dim('not found')}`);
1568
+ console.log(` .opc/brain.db:${dbExists ? color.dim(' already exists') : color.cyan(' would create')}`);
1569
+ console.log(`\n ${icon.info} Dry run — no changes.\n`);
1570
+ }
1571
+ else {
1572
+ const { migrate: deepbrainMigrate } = require('./deepbrain/migrate');
1573
+ await deepbrainMigrate(process.cwd());
1574
+ console.log(` ${icon.success} MEMORY.md → DEEPBRAIN.md migration complete.`);
1575
+ console.log(` ${icon.success} SOUL.md → EGO.md migration complete.`);
1576
+ console.log(` ${icon.success} Knowledge seeded into .opc/brain.db.\n`);
1577
+ }
1578
+ }
1579
+ catch (e) {
1580
+ console.log(` ${icon.warn} DeepBrain migration: ${e.message}\n`);
1581
+ }
1582
+ }
1583
+ // Step 2: OAD schema migration
1584
+ console.log(`${icon.gear} ${color.bold('OAD Schema Migration')}\n`);
1539
1585
  try {
1540
1586
  const raw = fs.readFileSync(opts.file, 'utf-8');
1541
1587
  const config = yaml.load(raw);
1542
1588
  let changed = false;
1543
- // Migration: add apiVersion if missing
1544
1589
  if (!config.apiVersion) {
1545
1590
  config.apiVersion = 'opc/v1';
1546
1591
  changed = true;
1547
1592
  }
1548
- // Migration: add kind if missing
1549
1593
  if (!config.kind) {
1550
1594
  config.kind = 'Agent';
1551
1595
  changed = true;
1552
1596
  }
1553
- // Migration: ensure metadata.version
1554
1597
  if (!config.metadata?.version) {
1555
1598
  if (!config.metadata)
1556
1599
  config.metadata = {};
1557
1600
  config.metadata.version = '1.0.0';
1558
1601
  changed = true;
1559
1602
  }
1560
- // Migration: ensure spec.channels is array
1561
1603
  if (config.spec?.channels && !Array.isArray(config.spec.channels)) {
1562
1604
  config.spec.channels = [config.spec.channels];
1563
1605
  changed = true;
1564
1606
  }
1565
- // Migration: ensure spec.skills is array
1566
1607
  if (config.spec?.skills && !Array.isArray(config.spec.skills)) {
1567
1608
  config.spec.skills = [config.spec.skills];
1568
1609
  changed = true;
1569
1610
  }
1570
- // Migration: old model format
1571
1611
  if (config.spec?.llm?.model && !config.spec?.model) {
1572
1612
  config.spec.model = config.spec.llm.model;
1573
1613
  delete config.spec.llm;
1574
1614
  changed = true;
1575
1615
  }
1576
1616
  if (!changed) {
1577
- console.log(`${icon.success} OAD is already up to date.`);
1578
- return;
1617
+ console.log(` ${icon.success} OAD is already up to date.\n`);
1579
1618
  }
1580
- if (opts.dryRun) {
1581
- console.log(`\n${icon.info} Would migrate:\n`);
1619
+ else if (opts.dryRun) {
1620
+ console.log(` ${icon.info} Would migrate:\n`);
1582
1621
  console.log(yaml.dump(config, { lineWidth: 120 }));
1583
1622
  }
1584
1623
  else {
1585
- // Backup
1586
1624
  fs.writeFileSync(opts.file + '.bak', raw);
1587
1625
  fs.writeFileSync(opts.file, yaml.dump(config, { lineWidth: 120 }));
1588
- console.log(`${icon.success} Migrated ${color.bold(opts.file)} (backup: ${opts.file}.bak)`);
1626
+ console.log(` ${icon.success} Migrated ${color.bold(opts.file)} (backup: ${opts.file}.bak)\n`);
1589
1627
  }
1590
1628
  }
1591
1629
  catch (err) {
1592
- console.error(`${icon.error} Migration failed:`, err instanceof Error ? err.message : err);
1593
- process.exit(1);
1630
+ if (err.code !== 'ENOENT') {
1631
+ console.error(` ${icon.error} OAD migration failed:`, err instanceof Error ? err.message : err);
1632
+ }
1633
+ else {
1634
+ console.log(` ${color.dim(`No OAD file found (${opts.file}) — skipping schema migration.`)}\n`);
1635
+ }
1594
1636
  }
1595
1637
  });
1596
1638
  // ── Brain command ────────────────────────────────────────────
@@ -1701,6 +1743,58 @@ brainCmd
1701
1743
  }
1702
1744
  console.log();
1703
1745
  });
1746
+ brainCmd
1747
+ .command('recall')
1748
+ .argument('<query>', 'Search query')
1749
+ .description('Query DeepBrain knowledge base')
1750
+ .option('--top-k <n>', 'Number of results', '5')
1751
+ .option('--layer <layer>', 'Filter by layer (l1/l2/l3/l4/workstation/job/industry)')
1752
+ .action(async (query, opts) => {
1753
+ console.log(`\n${icon.search} ${color.bold('DeepBrain Recall')} — ${color.cyan(query)}\n`);
1754
+ try {
1755
+ const { DeepBrain } = require('./deepbrain/provider');
1756
+ const brain = new DeepBrain({ dbPath: path.join(process.cwd(), '.opc', 'brain.db'), embeddingProvider: 'none' });
1757
+ await brain.init();
1758
+ const result = await brain.recall({ query, topK: parseInt(opts.topK) || 5, layer: opts.layer });
1759
+ if (result.entries.length === 0) {
1760
+ console.log(` ${icon.info} No results found.\n`);
1761
+ return;
1762
+ }
1763
+ for (const entry of result.entries) {
1764
+ console.log(` ${color.cyan(`[${entry.layer}]`)} ${color.dim(entry.source)} — maturity: ${entry.maturityScore.toFixed(2)}`);
1765
+ const preview = entry.content.length > 200 ? entry.content.slice(0, 200) + '…' : entry.content;
1766
+ console.log(` ${preview}`);
1767
+ console.log();
1768
+ }
1769
+ console.log(` ${color.dim(`${result.entries.length} result(s) in ${result.elapsedMs}ms`)}\n`);
1770
+ }
1771
+ catch (e) {
1772
+ console.log(` ${icon.warn} ${e.message}\n`);
1773
+ }
1774
+ });
1775
+ brainCmd
1776
+ .command('stats')
1777
+ .description('Show DeepBrain knowledge base statistics')
1778
+ .action(async () => {
1779
+ console.log(`\n${icon.gear} ${color.bold('DeepBrain Stats')}\n`);
1780
+ try {
1781
+ const { DeepBrain } = require('./deepbrain/provider');
1782
+ const brain = new DeepBrain({ dbPath: path.join(process.cwd(), '.opc', 'brain.db'), embeddingProvider: 'none' });
1783
+ await brain.init();
1784
+ const stats = await brain.getStats();
1785
+ console.log(` ${color.cyan('Total Entries'.padEnd(18))} ${stats.totalEntries}`);
1786
+ const layers = stats.entriesByLayer;
1787
+ for (const [layer, count] of Object.entries(layers)) {
1788
+ console.log(` ${color.cyan(layer.padEnd(18))} ${count}`);
1789
+ }
1790
+ console.log(` ${color.cyan('Avg Maturity'.padEnd(18))} ${(stats.avgMaturityScore ?? 0).toFixed(3)}`);
1791
+ console.log(` ${color.cyan('Last Evolution'.padEnd(18))} ${stats.lastEvolution ?? 'never'}`);
1792
+ console.log();
1793
+ }
1794
+ catch (e) {
1795
+ console.log(` ${icon.warn} ${e.message}\n`);
1796
+ }
1797
+ });
1704
1798
  // ── Logs command ─────────────────────────────────────────────
1705
1799
  program
1706
1800
  .command('logs')
@@ -2108,6 +2202,7 @@ program
2108
2202
  catch { }
2109
2203
  }
2110
2204
  console.log(color.dim('Press Ctrl+C to stop'));
2205
+ await new Promise(() => { });
2111
2206
  });
2112
2207
  program
2113
2208
  .command('doctor')
@@ -2316,43 +2411,6 @@ program
2316
2411
  }
2317
2412
  console.log();
2318
2413
  });
2319
- // ── Search command ──────────────────────────────────────────
2320
- program
2321
- .command('memory-search <query>')
2322
- .description('Search conversation history (requires SQLite memory)')
2323
- .option('-n, --limit <n>', 'Max results', '10')
2324
- .option('--json', 'Output as JSON')
2325
- .action(async (query, opts) => {
2326
- try {
2327
- const { SQLiteStore } = await Promise.resolve().then(() => __importStar(require('./memory/sqlite-store')));
2328
- const store = new SQLiteStore();
2329
- const results = await store.search(query, parseInt(opts.limit, 10));
2330
- const stats = await store.stats();
2331
- if (opts.json) {
2332
- console.log(JSON.stringify({ query, results, stats }, null, 2));
2333
- await store.close();
2334
- return;
2335
- }
2336
- console.log(`\n🔍 搜索: "${query}" (${results.length} 条结果, 共 ${stats.totalMessages} 条消息)\n`);
2337
- if (results.length === 0) {
2338
- console.log(' 未找到匹配结果。\n');
2339
- await store.close();
2340
- return;
2341
- }
2342
- for (const msg of results) {
2343
- const time = new Date(msg.timestamp).toLocaleString();
2344
- const role = msg.role === 'user' ? '👤' : '🤖';
2345
- const preview = msg.content.length > 120 ? msg.content.slice(0, 120) + '...' : msg.content;
2346
- console.log(` ${role} [${time}] ${preview}`);
2347
- }
2348
- console.log(`\n 💾 数据库: ${stats.dbSizeKB}KB, ${stats.sessions} 个会话\n`);
2349
- await store.close();
2350
- }
2351
- catch (err) {
2352
- console.error(`${icon.error} 搜索失败: ${err instanceof Error ? err.message : err}`);
2353
- console.log(' 提示: 需要 sql.js 支持。运行: npm install sql.js');
2354
- }
2355
- });
2356
2414
  // ── Keys command ──────────────────────────────────────────────
2357
2415
  const keys_1 = require("./security/keys");
2358
2416
  const approval_1 = require("./security/approval");
@@ -2661,6 +2719,40 @@ mcpCmd
2661
2719
  await server.serveStdio();
2662
2720
  }
2663
2721
  });
2722
+ // ── Memory Search command ────────────────────────────────────
2723
+ program
2724
+ .command('memory-search')
2725
+ .argument('<query>', 'Search query')
2726
+ .description('Search agent memory (DeepBrain knowledge base)')
2727
+ .option('--top-k <n>', 'Number of results', '5')
2728
+ .option('--json', 'Output as JSON')
2729
+ .action(async (query, opts) => {
2730
+ try {
2731
+ const { DeepBrain } = require('./deepbrain/provider');
2732
+ const brain = new DeepBrain({ dbPath: path.join(process.cwd(), '.opc', 'brain.db'), embeddingProvider: 'none' });
2733
+ await brain.init();
2734
+ const result = await brain.recall({ query, topK: parseInt(opts.topK) || 5 });
2735
+ if (opts.json) {
2736
+ console.log(JSON.stringify(result, null, 2));
2737
+ return;
2738
+ }
2739
+ console.log(`\n${icon.search} ${color.bold('Memory Search')} — ${color.cyan(query)}\n`);
2740
+ if (result.entries.length === 0) {
2741
+ console.log(` ${icon.info} No results found.\n`);
2742
+ return;
2743
+ }
2744
+ for (const entry of result.entries) {
2745
+ console.log(` ${color.cyan(`[${entry.layer}]`)} ${color.dim(entry.source)}`);
2746
+ const preview = entry.content.length > 200 ? entry.content.slice(0, 200) + '…' : entry.content;
2747
+ console.log(` ${preview}\n`);
2748
+ }
2749
+ console.log(` ${color.dim(`${result.entries.length} result(s) in ${result.elapsedMs}ms`)}\n`);
2750
+ }
2751
+ catch (e) {
2752
+ console.error(`${icon.error} Memory search failed: ${e.message}`);
2753
+ process.exit(1);
2754
+ }
2755
+ });
2664
2756
  // ── Parse CLI ────────────────────────────────────────────────
2665
2757
  program.parse();
2666
2758
  //# sourceMappingURL=cli.js.map