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
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { EntityTier, RetrievedFact } from '../types';
|
|
2
|
+
export interface TokenBudgetConfig {
|
|
3
|
+
contextLimitRatio: number;
|
|
4
|
+
minTokens: number;
|
|
5
|
+
maxTokens: number;
|
|
6
|
+
tierWeights: {
|
|
7
|
+
permanent: number;
|
|
8
|
+
project: number;
|
|
9
|
+
session: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare const DEFAULT_TOKEN_BUDGET_CONFIG: TokenBudgetConfig;
|
|
13
|
+
/**
|
|
14
|
+
* 计算 Token 预算
|
|
15
|
+
* Formula: MAX_INJECT_TOKENS = clamp(modelContextLimit * 0.05, 500, 4000)
|
|
16
|
+
*/
|
|
17
|
+
export declare function calculateTokenBudget(modelContextLimit: number, config?: Partial<TokenBudgetConfig>): number;
|
|
18
|
+
/**
|
|
19
|
+
* 估算文本的 token 数量
|
|
20
|
+
* 简化版:假设平均每个 token 约 4 个字符(英文)或 2 个字符(中文)
|
|
21
|
+
*/
|
|
22
|
+
export declare function estimateTokens(text: string): number;
|
|
23
|
+
/**
|
|
24
|
+
* 格式化实体为注入文本
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatEntity(entity: {
|
|
27
|
+
name: string;
|
|
28
|
+
type: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
tier: EntityTier;
|
|
31
|
+
weight: number;
|
|
32
|
+
}): string;
|
|
33
|
+
/**
|
|
34
|
+
* 格式化反思为注入文本
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatReflection(reflection: {
|
|
37
|
+
summary: string;
|
|
38
|
+
pattern_type?: string;
|
|
39
|
+
confidence: number;
|
|
40
|
+
}): string;
|
|
41
|
+
/**
|
|
42
|
+
* 按 token 预算检索事实
|
|
43
|
+
* 优先顺序:permanent > project > session
|
|
44
|
+
*/
|
|
45
|
+
export declare function retrieveFactsWithBudget<T>(sessionId: string, modelContextLimit: number, fetchers: {
|
|
46
|
+
fetchByTier: (sessionId: string, tier: EntityTier, limit: number) => Promise<T[]>;
|
|
47
|
+
extractContent: (item: T) => {
|
|
48
|
+
text: string;
|
|
49
|
+
tokens: number;
|
|
50
|
+
};
|
|
51
|
+
}, config?: Partial<TokenBudgetConfig>): Promise<RetrievedFact[]>;
|
|
52
|
+
/**
|
|
53
|
+
* 截断文本以适应 token 预算
|
|
54
|
+
*/
|
|
55
|
+
export declare function truncateToTokenLimit(text: string, maxTokens: number): string;
|
|
56
|
+
/**
|
|
57
|
+
* 计算注入内容的总 token 数
|
|
58
|
+
*/
|
|
59
|
+
export declare function calculateTotalTokens(facts: RetrievedFact[]): number;
|
|
60
|
+
/**
|
|
61
|
+
* 检查是否超出预算并提供警告
|
|
62
|
+
*/
|
|
63
|
+
export declare function checkBudgetOverflow(facts: RetrievedFact[], budget: number): {
|
|
64
|
+
withinBudget: boolean;
|
|
65
|
+
overflowTokens: number;
|
|
66
|
+
warning?: string;
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=token-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-budget.d.ts","sourceRoot":"","sources":["../../../src/utils/token-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,eAAO,MAAM,2BAA2B,EAAE,iBASzC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,iBAAiB,EAAE,MAAM,EACzB,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACtC,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,MAAM,CAUT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAWT;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,EAC7C,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE;IACR,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAClF,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D,EACD,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACtC,OAAO,CAAC,aAAa,EAAE,CAAC,CA4C1B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAY5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,EAAE,EACtB,MAAM,EAAE,MAAM,GACb;IAAE,YAAY,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAWrE"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "opcode-pg-memory",
|
|
3
|
+
"version": "2.2.0",
|
|
4
|
+
"description": "OpenCode plugin for persistent memory using PostgreSQL + pgvector — four-layer memory architecture with topic segmentation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"opcode-pg-memory": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "bun build ./src/index.ts --outdir ./dist --target node && bun build ./src/cli.ts --outfile ./dist/cli.js --target node && bun build ./mcp-server.ts --outfile ./dist/mcp-server.js --target node && tsc --emitDeclarationOnly",
|
|
13
|
+
"typecheck": "tsc --noEmit",
|
|
14
|
+
"clean": "rimraf dist"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"opencode",
|
|
18
|
+
"plugin",
|
|
19
|
+
"memory",
|
|
20
|
+
"postgresql",
|
|
21
|
+
"pgvector",
|
|
22
|
+
"hindsight",
|
|
23
|
+
"mcp",
|
|
24
|
+
"agent"
|
|
25
|
+
],
|
|
26
|
+
"author": "Vbs313",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/Vbs313/opcode-pg-memory"
|
|
31
|
+
},
|
|
32
|
+
"opencode": {
|
|
33
|
+
"type": "plugin",
|
|
34
|
+
"hooks": [
|
|
35
|
+
"chat.message",
|
|
36
|
+
"event",
|
|
37
|
+
"tool.execute.before",
|
|
38
|
+
"tool.execute.after",
|
|
39
|
+
"experimental.session.compacting"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist",
|
|
44
|
+
"scripts/migration-v2.sql",
|
|
45
|
+
".env.example",
|
|
46
|
+
"README.md"
|
|
47
|
+
],
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"pg": "^8.11.3",
|
|
50
|
+
"pgvector": "^0.1.8",
|
|
51
|
+
"@modelcontextprotocol/sdk": "^0.5.0",
|
|
52
|
+
"uuid": "^9.0.1",
|
|
53
|
+
"crypto-js": "^4.2.0",
|
|
54
|
+
"openai": "^4.20.0",
|
|
55
|
+
"dotenv": "^16.3.1"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "^20.10.0",
|
|
59
|
+
"@types/pg": "^8.10.9",
|
|
60
|
+
"@types/uuid": "^9.0.7",
|
|
61
|
+
"@types/crypto-js": "^4.2.1",
|
|
62
|
+
"typescript": "^5.3.2",
|
|
63
|
+
"rimraf": "^5.0.5"
|
|
64
|
+
},
|
|
65
|
+
"engines": {
|
|
66
|
+
"node": ">=18.0.0"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
-- ============================================================
|
|
2
|
+
-- Migration: opcode-pg-memory v1.0 → v2.0
|
|
3
|
+
-- Date: 2026-05-06
|
|
4
|
+
-- ============================================================
|
|
5
|
+
--
|
|
6
|
+
-- Changes:
|
|
7
|
+
-- 1. Create session_map table (replaces sessions table)
|
|
8
|
+
-- 2. Create topic_segments table (NEW)
|
|
9
|
+
-- 3. Add topic_segment_id FK to entities, observations, relations, reflections
|
|
10
|
+
-- 4. Add omo_task_id to session_map
|
|
11
|
+
-- 5. Migrate data from old sessions to session_map
|
|
12
|
+
-- 6. Update indexes for new FK columns
|
|
13
|
+
-- ============================================================
|
|
14
|
+
|
|
15
|
+
BEGIN;
|
|
16
|
+
|
|
17
|
+
-- ============================================================
|
|
18
|
+
-- Step 1: Create session_map table
|
|
19
|
+
-- ============================================================
|
|
20
|
+
CREATE TABLE IF NOT EXISTS session_map (
|
|
21
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
22
|
+
opencode_session_id VARCHAR(255) UNIQUE NOT NULL,
|
|
23
|
+
omo_task_id VARCHAR(255),
|
|
24
|
+
project_id VARCHAR(255),
|
|
25
|
+
model_context_limit INTEGER NOT NULL DEFAULT 128000,
|
|
26
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
27
|
+
last_active_at TIMESTAMPTZ DEFAULT NOW(),
|
|
28
|
+
metadata JSONB DEFAULT '{}'
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
-- ============================================================
|
|
32
|
+
-- Step 2: Migrate data from sessions to session_map
|
|
33
|
+
-- ============================================================
|
|
34
|
+
INSERT INTO session_map (opencode_session_id, project_id, model_context_limit, created_at, last_active_at, metadata)
|
|
35
|
+
SELECT
|
|
36
|
+
external_id,
|
|
37
|
+
project_id,
|
|
38
|
+
model_context_limit,
|
|
39
|
+
created_at,
|
|
40
|
+
updated_at,
|
|
41
|
+
metadata
|
|
42
|
+
FROM sessions
|
|
43
|
+
ON CONFLICT (opencode_session_id) DO NOTHING;
|
|
44
|
+
|
|
45
|
+
-- ============================================================
|
|
46
|
+
-- Step 3: Create topic_segments table
|
|
47
|
+
-- ============================================================
|
|
48
|
+
CREATE TABLE IF NOT EXISTS topic_segments (
|
|
49
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
50
|
+
session_map_id UUID NOT NULL REFERENCES session_map(id) ON DELETE CASCADE,
|
|
51
|
+
segment_index INTEGER NOT NULL,
|
|
52
|
+
summary TEXT,
|
|
53
|
+
embedding vector(1536),
|
|
54
|
+
start_message_external_id VARCHAR(255),
|
|
55
|
+
end_message_external_id VARCHAR(255),
|
|
56
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
57
|
+
closed_at TIMESTAMPTZ,
|
|
58
|
+
observation_count INTEGER DEFAULT 0,
|
|
59
|
+
metadata JSONB DEFAULT '{}',
|
|
60
|
+
UNIQUE(session_map_id, segment_index)
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- ============================================================
|
|
64
|
+
-- Step 4: Add topic_segment_id to entities
|
|
65
|
+
-- ============================================================
|
|
66
|
+
ALTER TABLE entities
|
|
67
|
+
ADD COLUMN IF NOT EXISTS topic_segment_id UUID REFERENCES topic_segments(id) ON DELETE SET NULL;
|
|
68
|
+
|
|
69
|
+
-- ============================================================
|
|
70
|
+
-- Step 5: Add topic_segment_id to observations
|
|
71
|
+
-- ============================================================
|
|
72
|
+
ALTER TABLE observations
|
|
73
|
+
ADD COLUMN IF NOT EXISTS topic_segment_id UUID REFERENCES topic_segments(id) ON DELETE SET NULL;
|
|
74
|
+
|
|
75
|
+
-- ============================================================
|
|
76
|
+
-- Step 6: Add topic_segment_id to relations
|
|
77
|
+
-- ============================================================
|
|
78
|
+
ALTER TABLE relations
|
|
79
|
+
ADD COLUMN IF NOT EXISTS topic_segment_id UUID REFERENCES topic_segments(id) ON DELETE SET NULL;
|
|
80
|
+
|
|
81
|
+
-- ============================================================
|
|
82
|
+
-- Step 7: Add topic_segment_id to reflections
|
|
83
|
+
-- ============================================================
|
|
84
|
+
ALTER TABLE reflections
|
|
85
|
+
ADD COLUMN IF NOT EXISTS topic_segment_id UUID REFERENCES topic_segments(id) ON DELETE SET NULL;
|
|
86
|
+
|
|
87
|
+
-- ============================================================
|
|
88
|
+
-- Step 8: Add topic_segment_id to semantic_cache
|
|
89
|
+
-- ============================================================
|
|
90
|
+
ALTER TABLE semantic_cache
|
|
91
|
+
ADD COLUMN IF NOT EXISTS topic_segment_id UUID REFERENCES topic_segments(id) ON DELETE SET NULL;
|
|
92
|
+
|
|
93
|
+
-- ============================================================
|
|
94
|
+
-- Step 9: Update semantic_cache to reference session_map
|
|
95
|
+
-- (add new column, migrate data, drop old)
|
|
96
|
+
-- ============================================================
|
|
97
|
+
ALTER TABLE semantic_cache
|
|
98
|
+
ADD COLUMN IF NOT EXISTS session_map_id UUID REFERENCES session_map(id) ON DELETE SET NULL;
|
|
99
|
+
|
|
100
|
+
-- ============================================================
|
|
101
|
+
-- Step 10: Update token_usage_log to reference session_map
|
|
102
|
+
-- ============================================================
|
|
103
|
+
ALTER TABLE token_usage_log
|
|
104
|
+
ADD COLUMN IF NOT EXISTS session_map_id UUID REFERENCES session_map(id) ON DELETE CASCADE;
|
|
105
|
+
|
|
106
|
+
-- ============================================================
|
|
107
|
+
-- Step 11: Update reflection_errors to reference session_map
|
|
108
|
+
-- ============================================================
|
|
109
|
+
ALTER TABLE reflection_errors
|
|
110
|
+
ADD COLUMN IF NOT EXISTS session_map_id UUID REFERENCES session_map(id) ON DELETE CASCADE;
|
|
111
|
+
|
|
112
|
+
-- ============================================================
|
|
113
|
+
-- Step 12: Create indexes
|
|
114
|
+
-- ============================================================
|
|
115
|
+
|
|
116
|
+
-- session_map indexes
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_session_map_opencode_id ON session_map(opencode_session_id);
|
|
118
|
+
CREATE INDEX IF NOT EXISTS idx_session_map_omo_task_id ON session_map(omo_task_id);
|
|
119
|
+
CREATE INDEX IF NOT EXISTS idx_session_map_project_id ON session_map(project_id);
|
|
120
|
+
|
|
121
|
+
-- topic_segments indexes
|
|
122
|
+
CREATE INDEX IF NOT EXISTS idx_topic_segments_session ON topic_segments(session_map_id);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_topic_segments_embedding ON topic_segments
|
|
124
|
+
USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);
|
|
125
|
+
CREATE INDEX IF NOT EXISTS idx_topic_segments_closed ON topic_segments(closed_at) WHERE closed_at IS NULL;
|
|
126
|
+
|
|
127
|
+
-- entities indexes (updated)
|
|
128
|
+
CREATE INDEX IF NOT EXISTS idx_entities_topic ON entities(topic_segment_id);
|
|
129
|
+
|
|
130
|
+
-- observations indexes (updated)
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_observations_topic ON observations(topic_segment_id);
|
|
132
|
+
|
|
133
|
+
-- relations indexes (updated)
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_relations_topic ON relations(topic_segment_id);
|
|
135
|
+
|
|
136
|
+
-- reflections indexes (updated)
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_reflections_topic ON reflections(topic_segment_id);
|
|
138
|
+
|
|
139
|
+
-- semantic_cache indexes (updated)
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_semantic_cache_topic ON semantic_cache(topic_segment_id);
|
|
141
|
+
CREATE INDEX IF NOT EXISTS idx_semantic_cache_session_map ON semantic_cache(session_map_id);
|
|
142
|
+
|
|
143
|
+
-- ============================================================
|
|
144
|
+
-- Step 13: Add OmO support columns (if OmO is enabled)
|
|
145
|
+
-- ============================================================
|
|
146
|
+
DO $$
|
|
147
|
+
BEGIN
|
|
148
|
+
-- Add source_agent to relevant tables
|
|
149
|
+
ALTER TABLE entities ADD COLUMN IF NOT EXISTS source_agent VARCHAR(255);
|
|
150
|
+
ALTER TABLE observations ADD COLUMN IF NOT EXISTS source_agent VARCHAR(255);
|
|
151
|
+
ALTER TABLE reflections ADD COLUMN IF NOT EXISTS source_agent VARCHAR(255);
|
|
152
|
+
ALTER TABLE topic_segments ADD COLUMN IF NOT EXISTS source_agent VARCHAR(255);
|
|
153
|
+
EXCEPTION WHEN OTHERS THEN
|
|
154
|
+
-- Column already exists or table doesn't have it yet
|
|
155
|
+
NULL;
|
|
156
|
+
END $$;
|
|
157
|
+
|
|
158
|
+
-- ============================================================
|
|
159
|
+
-- Verification queries (run after migration)
|
|
160
|
+
-- ============================================================
|
|
161
|
+
-- Check row counts:
|
|
162
|
+
-- SELECT 'session_map' as table_name, COUNT(*) FROM session_map
|
|
163
|
+
-- UNION ALL SELECT 'topic_segments', COUNT(*) FROM topic_segments
|
|
164
|
+
-- UNION ALL SELECT 'entities (with topic)', COUNT(*) FROM entities WHERE topic_segment_id IS NOT NULL;
|
|
165
|
+
--
|
|
166
|
+
-- Check that session_map has the same rows as old sessions:
|
|
167
|
+
-- SELECT
|
|
168
|
+
-- (SELECT COUNT(*) FROM sessions) as old_count,
|
|
169
|
+
-- (SELECT COUNT(*) FROM session_map) as new_count;
|
|
170
|
+
|
|
171
|
+
COMMIT;
|
|
172
|
+
|
|
173
|
+
-- ============================================================
|
|
174
|
+
-- Rollback script (save separately as migration_rollback.sql)
|
|
175
|
+
-- ============================================================
|
|
176
|
+
-- BEGIN;
|
|
177
|
+
-- DROP TABLE IF EXISTS topic_segments CASCADE;
|
|
178
|
+
-- DROP TABLE IF EXISTS session_map CASCADE;
|
|
179
|
+
-- ALTER TABLE entities DROP COLUMN IF EXISTS topic_segment_id;
|
|
180
|
+
-- ALTER TABLE observations DROP COLUMN IF EXISTS topic_segment_id;
|
|
181
|
+
-- ALTER TABLE relations DROP COLUMN IF EXISTS topic_segment_id;
|
|
182
|
+
-- ALTER TABLE reflections DROP COLUMN IF EXISTS topic_segment_id;
|
|
183
|
+
-- ALTER TABLE semantic_cache DROP COLUMN IF EXISTS topic_segment_id;
|
|
184
|
+
-- ALTER TABLE semantic_cache DROP COLUMN IF EXISTS session_map_id;
|
|
185
|
+
-- ALTER TABLE token_usage_log DROP COLUMN IF EXISTS session_map_id;
|
|
186
|
+
-- ALTER TABLE reflection_errors DROP COLUMN IF EXISTS session_map_id;
|
|
187
|
+
-- COMMIT;
|