opcode-pg-memory 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +42 -0
- package/README.md +132 -0
- package/dist/cli.js +165 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20938 -0
- package/dist/mcp-server.d.ts +8 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +24047 -0
- package/dist/src/cache/semantic-cache.d.ts +120 -0
- package/dist/src/cache/semantic-cache.d.ts.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/config.d.ts +39 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/db/init-db.d.ts +45 -0
- package/dist/src/db/init-db.d.ts.map +1 -0
- package/dist/src/hooks/message-part-updated.d.ts +24 -0
- package/dist/src/hooks/message-part-updated.d.ts.map +1 -0
- package/dist/src/hooks/message-updated.d.ts +24 -0
- package/dist/src/hooks/message-updated.d.ts.map +1 -0
- package/dist/src/hooks/session-compacting.d.ts +50 -0
- package/dist/src/hooks/session-compacting.d.ts.map +1 -0
- package/dist/src/hooks/session-completed.d.ts +36 -0
- package/dist/src/hooks/session-completed.d.ts.map +1 -0
- package/dist/src/hooks/session-created.d.ts +23 -0
- package/dist/src/hooks/session-created.d.ts.map +1 -0
- package/dist/src/hooks/tool-execute.d.ts +32 -0
- package/dist/src/hooks/tool-execute.d.ts.map +1 -0
- package/dist/src/index.d.ts +64 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/mcp/hindsight-reflect-omo.d.ts +64 -0
- package/dist/src/mcp/hindsight-reflect-omo.d.ts.map +1 -0
- package/dist/src/mcp/hindsight-reflect.d.ts +75 -0
- package/dist/src/mcp/hindsight-reflect.d.ts.map +1 -0
- package/dist/src/mcp/recall-memory-omo.d.ts +47 -0
- package/dist/src/mcp/recall-memory-omo.d.ts.map +1 -0
- package/dist/src/mcp/recall-memory.d.ts +89 -0
- package/dist/src/mcp/recall-memory.d.ts.map +1 -0
- package/dist/src/omo/adapter.d.ts +144 -0
- package/dist/src/omo/adapter.d.ts.map +1 -0
- package/dist/src/omo/types.d.ts +132 -0
- package/dist/src/omo/types.d.ts.map +1 -0
- package/dist/src/services/keyword.d.ts +4 -0
- package/dist/src/services/keyword.d.ts.map +1 -0
- package/dist/src/services/logger.d.ts +8 -0
- package/dist/src/services/logger.d.ts.map +1 -0
- package/dist/src/services/privacy.d.ts +4 -0
- package/dist/src/services/privacy.d.ts.map +1 -0
- package/dist/src/topic/segment-manager.d.ts +165 -0
- package/dist/src/topic/segment-manager.d.ts.map +1 -0
- package/dist/src/types.d.ts +405 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/utils/embedding.d.ts +44 -0
- package/dist/src/utils/embedding.d.ts.map +1 -0
- package/dist/src/utils/token-budget.d.ts +68 -0
- package/dist/src/utils/token-budget.d.ts.map +1 -0
- package/package.json +68 -0
- package/scripts/migration-v2.sql +187 -0
package/.env.example
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# ============================================================
|
|
2
|
+
# opcode-pg-memory 环境配置
|
|
3
|
+
# 复制此文件为 .env 并修改
|
|
4
|
+
# ============================================================
|
|
5
|
+
|
|
6
|
+
# === PostgreSQL 连接 ===
|
|
7
|
+
PG_HOST=localhost
|
|
8
|
+
PG_PORT=5432
|
|
9
|
+
PG_DATABASE=PGOMO
|
|
10
|
+
PG_USER=opencode
|
|
11
|
+
PG_PASSWORD=your_password_here
|
|
12
|
+
PG_SSL=false
|
|
13
|
+
|
|
14
|
+
# === 嵌入模型(三选一)===
|
|
15
|
+
# 方案 A: 本地 Ollama(推荐,免费)
|
|
16
|
+
EMBEDDING_PROVIDER=ollama
|
|
17
|
+
EMBEDDING_MODEL=qwen3-embedding:0.6b
|
|
18
|
+
EMBEDDING_DIMENSIONS=1024
|
|
19
|
+
|
|
20
|
+
# 方案 B: DeepSeek API
|
|
21
|
+
# EMBEDDING_PROVIDER=deepseek
|
|
22
|
+
# EMBEDDING_MODEL=text-embedding-v2
|
|
23
|
+
# EMBEDDING_DIMENSIONS=1536
|
|
24
|
+
# DEEPSEEK_API_KEY=sk-...
|
|
25
|
+
# DEEPSEEK_BASE_URL=https://api.deepseek.com
|
|
26
|
+
|
|
27
|
+
# 方案 C: OpenAI API
|
|
28
|
+
# EMBEDDING_PROVIDER=openai
|
|
29
|
+
# EMBEDDING_MODEL=text-embedding-3-small
|
|
30
|
+
# EMBEDDING_DIMENSIONS=1536
|
|
31
|
+
# OPENAI_API_KEY=sk-...
|
|
32
|
+
|
|
33
|
+
# === 嵌入批处理 ===
|
|
34
|
+
EMBEDDING_BATCH_SIZE=10
|
|
35
|
+
|
|
36
|
+
# === OmO 多 Agent 集成(可选)===
|
|
37
|
+
# OMO_ENABLED=true
|
|
38
|
+
# OMO_INTEGRATION=enabled
|
|
39
|
+
|
|
40
|
+
# === DeepSeek API(仅在使用 DeepSeek 嵌入时)===
|
|
41
|
+
# DEEPSEEK_API_KEY=sk-...
|
|
42
|
+
# DEEPSEEK_BASE_URL=https://api.deepseek.com
|
package/README.md
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# opcode-pg-memory
|
|
2
|
+
|
|
3
|
+
**OpenCode 长期记忆插件** — PostgreSQL + pgvector 四层记忆架构,话题隔离 · Agent 自主调用 · OmO 多 Agent 协调
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/opcode-pg-memory)
|
|
6
|
+
[](./LICENSE)
|
|
7
|
+
|
|
8
|
+
## 特性
|
|
9
|
+
|
|
10
|
+
- **四层记忆** — Retain · Recall · Reflect · Semantic Cache
|
|
11
|
+
- **话题段隔离** — 滑动窗口检测会话内话题切换,防止跨话题实体污染
|
|
12
|
+
- **语义向量检索** — HNSW + BM25 + Graph + Keyword 四策略并行
|
|
13
|
+
- **Agent 自主调用** — `caller_context` 上下文融合,关键词自动触发
|
|
14
|
+
- **隐私过滤** — `<private>` 标签自动 [REDACTED]
|
|
15
|
+
- **MCP 工具** — `recall_memory` / `hindsight_reflect`
|
|
16
|
+
|
|
17
|
+
## 安装
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# npm 安装(推荐)
|
|
21
|
+
bunx opcode-pg-memory install
|
|
22
|
+
|
|
23
|
+
# 或从 GitHub
|
|
24
|
+
git clone https://github.com/Vbs313/opcode-pg-memory.git && cd opcode-pg-memory
|
|
25
|
+
.\scripts\setup.ps1
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`bunx install` 会自动注册插件到 `opencode.jsonc` 并创建 `/pg-memory-init` 命令。
|
|
29
|
+
|
|
30
|
+
## 注册
|
|
31
|
+
|
|
32
|
+
在 `~/.config/opencode/opencode.jsonc` 中确认 MCP 配置:
|
|
33
|
+
|
|
34
|
+
```jsonc
|
|
35
|
+
{
|
|
36
|
+
"mcp": {
|
|
37
|
+
"pg-memory": {
|
|
38
|
+
"type": "local",
|
|
39
|
+
"command": ["bun", "path/to/opcode-pg-memory/dist/mcp-server.js"],
|
|
40
|
+
"enabled": true,
|
|
41
|
+
"environment": {
|
|
42
|
+
"PG_HOST": "localhost", "PG_PORT": "5432",
|
|
43
|
+
"PG_DATABASE": "PGOMO", "PG_USER": "opencode",
|
|
44
|
+
"PG_PASSWORD": "你的密码",
|
|
45
|
+
"EMBEDDING_PROVIDER": "ollama",
|
|
46
|
+
"EMBEDDING_MODEL": "qwen3-embedding:0.6b",
|
|
47
|
+
"EMBEDDING_DIMENSIONS": "1024"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
验证:`opencode --print-logs --log-level INFO | findstr "PG Memory"` → 看到 `Plugin initialized successfully`
|
|
55
|
+
|
|
56
|
+
## 配置
|
|
57
|
+
|
|
58
|
+
三重优先级:**MCP environment > ~/.config/opencode/pg-memory.jsonc > 默认值**
|
|
59
|
+
|
|
60
|
+
```jsonc
|
|
61
|
+
// ~/.config/opencode/pg-memory.jsonc(可选)
|
|
62
|
+
{
|
|
63
|
+
"similarityThreshold": 0.7,
|
|
64
|
+
"maxMemories": 15,
|
|
65
|
+
"logLevel": "info",
|
|
66
|
+
"compactionThreshold": 0.85
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
| Provider | 模型 | 维度 |
|
|
71
|
+
|----------|------|------|
|
|
72
|
+
| `ollama` | `qwen3-embedding:0.6b` | 1024 |
|
|
73
|
+
| `deepseek` | `text-embedding-v2` | 1536 |
|
|
74
|
+
| `openai` | `text-embedding-3-small` | 1536 |
|
|
75
|
+
|
|
76
|
+
## MCP 工具
|
|
77
|
+
|
|
78
|
+
### recall_memory
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
// Agent 自主调用
|
|
82
|
+
recall_memory({
|
|
83
|
+
"query": "数据库连接池配置",
|
|
84
|
+
"caller_context": { "type": "omo_agent", "current_goal": "性能调优" },
|
|
85
|
+
"retrieval_strategies": ["semantic", "graph"],
|
|
86
|
+
"filters": { "tier": "project" }
|
|
87
|
+
})
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### hindsight_reflect
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
// 跨会话反思
|
|
94
|
+
hindsight_reflect({ "omo_task_id": "task_123", "aggregate": true })
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 架构
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
session_map → topic_segments → entities / observations / relations / reflections
|
|
101
|
+
→ semantic_cache (HNSW 动态阈值)
|
|
102
|
+
→ token_usage_log
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 项目结构
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
src/
|
|
109
|
+
├── index.ts # 插件入口(chat.message + event hook)
|
|
110
|
+
├── config.ts # 集中配置(文件+环境+默认值)
|
|
111
|
+
├── cli.ts # CLI(install 命令)
|
|
112
|
+
├── types.ts # 类型定义
|
|
113
|
+
├── db/init-db.ts # 数据库初始化 + 迁移
|
|
114
|
+
├── hooks/ # 生命周期钩子
|
|
115
|
+
├── mcp/ # MCP 工具实现
|
|
116
|
+
├── topic/ # 话题段管理器
|
|
117
|
+
├── services/ # 日志 · 关键词 · 隐私过滤
|
|
118
|
+
├── cache/ # 语义缓存
|
|
119
|
+
└── omo/ # OmO 适配器
|
|
120
|
+
mcp-server.ts # MCP 服务入口
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 文档
|
|
124
|
+
|
|
125
|
+
| 文档 | 内容 |
|
|
126
|
+
|------|------|
|
|
127
|
+
| [USAGE_GUIDE.md](./USAGE_GUIDE.md) | 完整使用指南 — 配置 · 工具 · 运维 |
|
|
128
|
+
| [PLUGIN_DOCUMENTATION.md](./PLUGIN_DOCUMENTATION.md) | 架构详解 — 钩子系统 · 数据库设计 |
|
|
129
|
+
|
|
130
|
+
## License
|
|
131
|
+
|
|
132
|
+
MIT
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/cli.ts
|
|
4
|
+
import { mkdirSync, writeFileSync, readFileSync, existsSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
var OPENCODE_CONFIG_DIR = join(homedir(), ".config", "opencode");
|
|
8
|
+
var OPENCODE_COMMAND_DIR = join(OPENCODE_CONFIG_DIR, "command");
|
|
9
|
+
var PLUGIN_NAME = "opcode-pg-memory";
|
|
10
|
+
var REPO_URL = "https://github.com/Vbs313/opcode-pg-memory";
|
|
11
|
+
var PG_MEMORY_INIT_COMMAND = `---
|
|
12
|
+
description: Initialize pg-memory with codebase knowledge
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Initializing PG Memory
|
|
16
|
+
|
|
17
|
+
You are bootstrapping the pg-memory plugin for this project. This plugin provides:
|
|
18
|
+
|
|
19
|
+
- **Semantic memory search** via recall_memory MCP tool
|
|
20
|
+
- **Automatic observation recording** from tool executions
|
|
21
|
+
- **Topic segmentation** within sessions
|
|
22
|
+
- **Cross-session reflection** via hindsight_reflect
|
|
23
|
+
|
|
24
|
+
## Steps
|
|
25
|
+
|
|
26
|
+
1. Run \`recall_memory\` with a test query to verify connectivity
|
|
27
|
+
2. The plugin will automatically start recording observations as you work
|
|
28
|
+
3. After significant work, run \`hindsight_reflect\` to generate reflections
|
|
29
|
+
|
|
30
|
+
## Setup Verification
|
|
31
|
+
\`\`\`bash
|
|
32
|
+
opencode --print-logs --log-level INFO | findstr "PG Memory"
|
|
33
|
+
\`\`\`
|
|
34
|
+
`;
|
|
35
|
+
function stripJsoncComments(content) {
|
|
36
|
+
return content.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "");
|
|
37
|
+
}
|
|
38
|
+
function findOpencodeConfig() {
|
|
39
|
+
const candidates = [
|
|
40
|
+
join(OPENCODE_CONFIG_DIR, "opencode.jsonc"),
|
|
41
|
+
join(OPENCODE_CONFIG_DIR, "opencode.json")
|
|
42
|
+
];
|
|
43
|
+
for (const path of candidates) {
|
|
44
|
+
if (existsSync(path))
|
|
45
|
+
return path;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function addPluginToConfig(configPath) {
|
|
50
|
+
try {
|
|
51
|
+
const content = readFileSync(configPath, "utf-8");
|
|
52
|
+
if (content.includes(PLUGIN_NAME)) {
|
|
53
|
+
console.log("Plugin already registered");
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
const jsonContent = stripJsoncComments(content);
|
|
57
|
+
let config;
|
|
58
|
+
try {
|
|
59
|
+
config = JSON.parse(jsonContent);
|
|
60
|
+
} catch {
|
|
61
|
+
console.error("Failed to parse config");
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const plugins = config.plugin || [];
|
|
65
|
+
plugins.push(PLUGIN_NAME);
|
|
66
|
+
config.plugin = plugins;
|
|
67
|
+
if (configPath.endsWith(".jsonc")) {
|
|
68
|
+
if (content.includes('"plugin"')) {
|
|
69
|
+
const newContent = content.replace(/("plugin"\s*:\s*\[)([^\]]*?)(\])/, (_match, start, middle, end) => {
|
|
70
|
+
const trimmed = middle.trim();
|
|
71
|
+
return trimmed === "" ? `${start}
|
|
72
|
+
"${PLUGIN_NAME}"
|
|
73
|
+
${end}` : `${start}${middle.trimEnd()},
|
|
74
|
+
"${PLUGIN_NAME}"
|
|
75
|
+
${end}`;
|
|
76
|
+
});
|
|
77
|
+
writeFileSync(configPath, newContent);
|
|
78
|
+
} else {
|
|
79
|
+
const newContent = content.replace(/^(\s*\{)/, `$1
|
|
80
|
+
"plugin": ["${PLUGIN_NAME}"],`);
|
|
81
|
+
writeFileSync(configPath, newContent);
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
85
|
+
}
|
|
86
|
+
console.log(`Added plugin to ${configPath}`);
|
|
87
|
+
return true;
|
|
88
|
+
} catch (err) {
|
|
89
|
+
console.error("Failed to update config:", err);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function createNewConfig() {
|
|
94
|
+
const configPath = join(OPENCODE_CONFIG_DIR, "opencode.jsonc");
|
|
95
|
+
mkdirSync(OPENCODE_CONFIG_DIR, { recursive: true });
|
|
96
|
+
const config = `{
|
|
97
|
+
"plugin": ["${PLUGIN_NAME}"]
|
|
98
|
+
}
|
|
99
|
+
`;
|
|
100
|
+
writeFileSync(configPath, config);
|
|
101
|
+
console.log(`Created ${configPath}`);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
function createInitCommand() {
|
|
105
|
+
mkdirSync(OPENCODE_COMMAND_DIR, { recursive: true });
|
|
106
|
+
const initPath = join(OPENCODE_COMMAND_DIR, "pg-memory-init.md");
|
|
107
|
+
writeFileSync(initPath, PG_MEMORY_INIT_COMMAND);
|
|
108
|
+
console.log("Created /pg-memory-init command");
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
function printHelp() {
|
|
112
|
+
console.log(`
|
|
113
|
+
pg-memory - PostgreSQL-backed long-term memory for OpenCode
|
|
114
|
+
|
|
115
|
+
Commands:
|
|
116
|
+
install Register plugin and create /pg-memory-init command
|
|
117
|
+
|
|
118
|
+
Examples:
|
|
119
|
+
bunx opcode-pg-memory install
|
|
120
|
+
git clone ${REPO_URL} && cd opcode-pg-memory && bun run build
|
|
121
|
+
|
|
122
|
+
After installation, configure the MCP server in opencode.jsonc:
|
|
123
|
+
"mcp": {
|
|
124
|
+
"pg-memory": {
|
|
125
|
+
"type": "local",
|
|
126
|
+
"command": ["bun", "path/to/dist/mcp-server.js"],
|
|
127
|
+
"enabled": true,
|
|
128
|
+
"environment": { ... }
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
`);
|
|
132
|
+
}
|
|
133
|
+
var args = process.argv.slice(2);
|
|
134
|
+
var cmd = args[0];
|
|
135
|
+
if (!cmd || cmd === "help" || cmd === "--help" || cmd === "-h") {
|
|
136
|
+
printHelp();
|
|
137
|
+
process.exit(0);
|
|
138
|
+
}
|
|
139
|
+
if (cmd === "install") {
|
|
140
|
+
console.log(`
|
|
141
|
+
OpenCode PG Memory installer
|
|
142
|
+
`);
|
|
143
|
+
const configPath = findOpencodeConfig();
|
|
144
|
+
if (configPath) {
|
|
145
|
+
console.log(`Found config: ${configPath}`);
|
|
146
|
+
addPluginToConfig(configPath);
|
|
147
|
+
} else {
|
|
148
|
+
console.log("No config found, creating...");
|
|
149
|
+
createNewConfig();
|
|
150
|
+
}
|
|
151
|
+
createInitCommand();
|
|
152
|
+
console.log(`
|
|
153
|
+
Setup complete!`);
|
|
154
|
+
console.log(`
|
|
155
|
+
Next steps:`);
|
|
156
|
+
console.log(` 1. cd ${process.cwd()}`);
|
|
157
|
+
console.log(" 2. cp .env.example .env && edit .env");
|
|
158
|
+
console.log(" 3. bun install && bun run build");
|
|
159
|
+
console.log(` 4. Restart OpenCode
|
|
160
|
+
`);
|
|
161
|
+
process.exit(0);
|
|
162
|
+
}
|
|
163
|
+
console.error(`Unknown command: ${cmd}`);
|
|
164
|
+
printHelp();
|
|
165
|
+
process.exit(1);
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,aAAa,CAAC"}
|