opc-agent 4.2.12 → 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.
- package/.opc/memory.db +0 -0
- package/STUDIO-FIX-5678.md +57 -0
- package/TASK.md +49 -0
- package/data/brain.db/deepbrain.sqlite +0 -0
- package/dist/channels/api.d.ts +14 -0
- package/dist/channels/api.d.ts.map +1 -0
- package/dist/channels/api.js +58 -0
- package/dist/channels/api.js.map +1 -0
- package/dist/cli.js +144 -52
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-loop.d.ts +3 -0
- package/dist/core/agent-loop.d.ts.map +1 -0
- package/dist/core/agent-loop.js +51 -0
- package/dist/core/agent-loop.js.map +1 -0
- package/dist/core/context-assembler.d.ts +12 -0
- package/dist/core/context-assembler.d.ts.map +1 -0
- package/dist/core/context-assembler.js +81 -0
- package/dist/core/context-assembler.js.map +1 -0
- package/dist/core/guardrails.d.ts +16 -0
- package/dist/core/guardrails.d.ts.map +1 -0
- package/dist/core/guardrails.js +62 -0
- package/dist/core/guardrails.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/iteration-budget.d.ts +12 -0
- package/dist/core/iteration-budget.d.ts.map +1 -0
- package/dist/core/iteration-budget.js +26 -0
- package/dist/core/iteration-budget.js.map +1 -0
- package/dist/core/types.d.ts +412 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/deepbrain/embedding.d.ts +7 -0
- package/dist/deepbrain/embedding.d.ts.map +1 -0
- package/dist/deepbrain/embedding.js +108 -0
- package/dist/deepbrain/embedding.js.map +1 -0
- package/dist/deepbrain/index.d.ts +8 -0
- package/dist/deepbrain/index.d.ts.map +1 -0
- package/dist/deepbrain/index.js +19 -0
- package/dist/deepbrain/index.js.map +1 -0
- package/dist/deepbrain/migrate.d.ts +2 -0
- package/dist/deepbrain/migrate.d.ts.map +1 -0
- package/dist/deepbrain/migrate.js +139 -0
- package/dist/deepbrain/migrate.js.map +1 -0
- package/dist/deepbrain/provider.d.ts +13 -0
- package/dist/deepbrain/provider.d.ts.map +1 -0
- package/dist/deepbrain/provider.js +85 -0
- package/dist/deepbrain/provider.js.map +1 -0
- package/dist/deepbrain/recall.d.ts +9 -0
- package/dist/deepbrain/recall.d.ts.map +1 -0
- package/dist/deepbrain/recall.js +48 -0
- package/dist/deepbrain/recall.js.map +1 -0
- package/dist/deepbrain/store.d.ts +36 -0
- package/dist/deepbrain/store.d.ts.map +1 -0
- package/dist/deepbrain/store.js +342 -0
- package/dist/deepbrain/store.js.map +1 -0
- package/dist/deepbrain/workspace-files.d.ts +5 -0
- package/dist/deepbrain/workspace-files.d.ts.map +1 -0
- package/dist/deepbrain/workspace-files.js +159 -0
- package/dist/deepbrain/workspace-files.js.map +1 -0
- package/dist/evolution/index.d.ts +1 -0
- package/dist/evolution/index.d.ts.map +1 -0
- package/dist/evolution/index.js +3 -0
- package/dist/evolution/index.js.map +1 -0
- package/dist/evolution/l1-experience.d.ts +5 -0
- package/dist/evolution/l1-experience.d.ts.map +1 -0
- package/dist/evolution/l1-experience.js +117 -0
- package/dist/evolution/l1-experience.js.map +1 -0
- package/dist/evolution/l2-consolidation.d.ts +4 -0
- package/dist/evolution/l2-consolidation.d.ts.map +1 -0
- package/dist/evolution/l2-consolidation.js +106 -0
- package/dist/evolution/l2-consolidation.js.map +1 -0
- package/dist/evolution/l2-memskill.d.ts +12 -0
- package/dist/evolution/l2-memskill.d.ts.map +1 -0
- package/dist/evolution/l2-memskill.js +57 -0
- package/dist/evolution/l2-memskill.js.map +1 -0
- package/dist/evolution/l3-skill-discover.d.ts +4 -0
- package/dist/evolution/l3-skill-discover.d.ts.map +1 -0
- package/dist/evolution/l3-skill-discover.js +139 -0
- package/dist/evolution/l3-skill-discover.js.map +1 -0
- package/dist/evolution/l3-skill-verify.d.ts +12 -0
- package/dist/evolution/l3-skill-verify.d.ts.map +1 -0
- package/dist/evolution/l3-skill-verify.js +122 -0
- package/dist/evolution/l3-skill-verify.js.map +1 -0
- package/dist/evolution/l4-desensitize.d.ts +7 -0
- package/dist/evolution/l4-desensitize.d.ts.map +1 -0
- package/dist/evolution/l4-desensitize.js +30 -0
- package/dist/evolution/l4-desensitize.js.map +1 -0
- package/dist/evolution/l4-group-evolve.d.ts +8 -0
- package/dist/evolution/l4-group-evolve.d.ts.map +1 -0
- package/dist/evolution/l4-group-evolve.js +15 -0
- package/dist/evolution/l4-group-evolve.js.map +1 -0
- package/dist/evolution/maturity-scorer.d.ts +11 -0
- package/dist/evolution/maturity-scorer.d.ts.map +1 -0
- package/dist/evolution/maturity-scorer.js +21 -0
- package/dist/evolution/maturity-scorer.js.map +1 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -5
- package/dist/index.js.map +1 -1
- package/dist/providers/agentkits.d.ts +20 -0
- package/dist/providers/agentkits.d.ts.map +1 -0
- package/dist/providers/agentkits.js +173 -0
- package/dist/providers/agentkits.js.map +1 -0
- package/dist/providers/index.js +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/model-provider.d.ts +16 -0
- package/dist/providers/model-provider.d.ts.map +1 -0
- package/dist/providers/model-provider.js +13 -0
- package/dist/providers/model-provider.js.map +1 -0
- package/dist/providers/model-recommender.d.ts +15 -0
- package/dist/providers/model-recommender.d.ts.map +1 -0
- package/dist/providers/model-recommender.js +71 -0
- package/dist/providers/model-recommender.js.map +1 -0
- package/dist/providers/ollama.d.ts +22 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +176 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +23 -0
- package/dist/providers/openai-compat.d.ts.map +1 -0
- package/dist/providers/openai-compat.js +184 -0
- package/dist/providers/openai-compat.js.map +1 -0
- package/dist/providers/router.d.ts +11 -0
- package/dist/providers/router.d.ts.map +1 -0
- package/dist/providers/router.js +48 -0
- package/dist/providers/router.js.map +1 -0
- package/dist/scheduler/cron.d.ts +19 -0
- package/dist/scheduler/cron.d.ts.map +1 -0
- package/dist/scheduler/cron.js +64 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/schema/oad.d.ts +72 -72
- package/dist/skills/loader.d.ts +16 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +114 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/matcher.d.ts +18 -0
- package/dist/skills/matcher.d.ts.map +1 -0
- package/dist/skills/matcher.js +70 -0
- package/dist/skills/matcher.js.map +1 -0
- package/dist/studio/agent-pool.d.ts +17 -0
- package/dist/studio/agent-pool.d.ts.map +1 -0
- package/dist/studio/agent-pool.js +35 -0
- package/dist/studio/agent-pool.js.map +1 -0
- package/dist/studio/assistant-tools.d.ts +4 -0
- package/dist/studio/assistant-tools.d.ts.map +1 -0
- package/dist/studio/assistant-tools.js +36 -0
- package/dist/studio/assistant-tools.js.map +1 -0
- package/dist/studio/index.d.ts +1 -0
- package/dist/studio/index.d.ts.map +1 -0
- package/dist/studio/index.js +3 -0
- package/dist/studio/index.js.map +1 -0
- package/dist/studio/server.d.ts.map +1 -1
- package/dist/studio/server.js +38 -17
- package/dist/studio/server.js.map +1 -1
- package/dist/templates/index.d.ts +1 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +3 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/roles/index.d.ts +4 -0
- package/dist/templates/roles/index.d.ts.map +1 -0
- package/dist/templates/roles/index.js +46 -0
- package/dist/templates/roles/index.js.map +1 -0
- package/dist/templates/template-provider.d.ts +16 -0
- package/dist/templates/template-provider.d.ts.map +1 -0
- package/dist/templates/template-provider.js +60 -0
- package/dist/templates/template-provider.js.map +1 -0
- package/dist/tools/builtin/definitions.d.ts +7 -0
- package/dist/tools/builtin/definitions.d.ts.map +1 -0
- package/dist/tools/builtin/definitions.js +60 -0
- package/dist/tools/builtin/definitions.js.map +1 -0
- package/dist/tools/execute-code.d.ts +20 -0
- package/dist/tools/execute-code.d.ts.map +1 -0
- package/dist/tools/execute-code.js +92 -0
- package/dist/tools/execute-code.js.map +1 -0
- package/dist/tools/hooks.d.ts +47 -0
- package/dist/tools/hooks.d.ts.map +1 -0
- package/dist/tools/hooks.js +69 -0
- package/dist/tools/hooks.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/permission.d.ts +20 -0
- package/dist/tools/permission.d.ts.map +1 -0
- package/dist/tools/permission.js +35 -0
- package/dist/tools/permission.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +42 -0
- package/dist/tools/registry.js.map +1 -0
- package/package.json +1 -1
package/.opc/memory.db
CHANGED
|
Binary file
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Studio 修复任务 — 4 项
|
|
2
|
+
|
|
3
|
+
## 项目路径
|
|
4
|
+
C:\Users\mingjwan\opc-agent
|
|
5
|
+
|
|
6
|
+
## 关键约束
|
|
7
|
+
- deepbrain/agentkits 是 ESM-only,必须用 `dynamicImport()` 加载(helper 在 `src/utils/dynamic-import.js`)
|
|
8
|
+
- agent-workstation 是 CJS,可以用 `require()`
|
|
9
|
+
- 所有中文字符串必须正确 UTF-8
|
|
10
|
+
- 修改完必须 `npm run build` 通过
|
|
11
|
+
|
|
12
|
+
## 任务 6: Agent 设置 tab 数据加载
|
|
13
|
+
Agent 详情页有多个 tab(记忆、知识库、技能等),但 tab 内容全是空的。
|
|
14
|
+
|
|
15
|
+
需要:
|
|
16
|
+
- 记忆 tab:调 `/api/memory/list` 或从 agent 的 `.opc/memory.json` 读取,显示记忆列表
|
|
17
|
+
- 知识库 tab:调 `/api/memory/stats` 显示 DeepBrain 连接状态和页面数
|
|
18
|
+
- 技能 tab:读 agent 目录下的 skills/,列出已有 skill
|
|
19
|
+
- 每个 tab 在切换时 fetch 对应 API 加载数据
|
|
20
|
+
|
|
21
|
+
前端在 `src/studio-ui/index.html`,后端在 `src/studio/server.ts`。
|
|
22
|
+
|
|
23
|
+
## 任务 7: Workstation 模板展示 Skill
|
|
24
|
+
模板列表和模板详情页需要展示该模板自带的 Skills。
|
|
25
|
+
|
|
26
|
+
agent-workstation 的 `getRole(category, roleName)` 返回的对象里应该有 skills 字段。
|
|
27
|
+
在前端模板卡片和详情里展示 skills 列表。
|
|
28
|
+
|
|
29
|
+
验证:
|
|
30
|
+
```bash
|
|
31
|
+
node -e "const ws=require('agent-workstation');const cats=ws.getCategories();const role=ws.getRole(cats[0].name,cats[0].roles[0]);console.log(JSON.stringify(role,null,2))"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 任务 8: DeepBrain 拖拽上传
|
|
35
|
+
在 DeepBrain/知识库页面,用户应该能拖拽文件上传。
|
|
36
|
+
|
|
37
|
+
需要:
|
|
38
|
+
- 前端:在知识库区域添加 drag & drop zone
|
|
39
|
+
- 前端:拖入文件后调 POST `/api/memory/upload`(multipart/form-data)
|
|
40
|
+
- 后端:`/api/memory/upload` 路由接收文件,用 DeepBrain 的 `brain.learn()` 或 `DocumentParser` 解析并存入
|
|
41
|
+
- 支持 .md, .txt, .pdf 文件
|
|
42
|
+
- 上传后刷新知识库列表
|
|
43
|
+
|
|
44
|
+
后端已有 `handleDocumentUpload` 方法(server.ts),检查是否完整。
|
|
45
|
+
|
|
46
|
+
## 任务 5: OPC 助手 Function Calling(标记 TODO,不实现)
|
|
47
|
+
在 `handleAgentChat` 的 opc-assistant 分支里加注释:
|
|
48
|
+
```
|
|
49
|
+
// TODO: Add function calling tools for OPC assistant
|
|
50
|
+
// Tools needed: createAgent, deleteAgent, listAgents, configureChannel, updateAgent
|
|
51
|
+
// Reference: Hermes Agent pattern - expose Studio APIs as LLM tools
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 完成后
|
|
55
|
+
1. `npm run build` 必须通过
|
|
56
|
+
2. 启动 Studio 验证每个功能
|
|
57
|
+
3. 列出测试结果
|
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
|
|
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(
|
|
1578
|
-
return;
|
|
1617
|
+
console.log(` ${icon.success} OAD is already up to date.\n`);
|
|
1579
1618
|
}
|
|
1580
|
-
if (opts.dryRun) {
|
|
1581
|
-
console.log(
|
|
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(
|
|
1626
|
+
console.log(` ${icon.success} Migrated ${color.bold(opts.file)} (backup: ${opts.file}.bak)\n`);
|
|
1589
1627
|
}
|
|
1590
1628
|
}
|
|
1591
1629
|
catch (err) {
|
|
1592
|
-
|
|
1593
|
-
|
|
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
|