promptkaizen-agent 0.2.0 → 0.3.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/README.md +5 -1
- package/dist/backfill/run.d.ts +15 -0
- package/dist/backfill/run.d.ts.map +1 -0
- package/dist/backfill/run.js +33 -0
- package/dist/backfill/run.js.map +1 -0
- package/dist/backfill/scanner.d.ts +82 -0
- package/dist/backfill/scanner.d.ts.map +1 -0
- package/dist/backfill/scanner.js +271 -0
- package/dist/backfill/scanner.js.map +1 -0
- package/dist/cli/detect.d.ts +2 -0
- package/dist/cli/detect.d.ts.map +1 -0
- package/dist/cli/detect.js +40 -0
- package/dist/cli/detect.js.map +1 -0
- package/dist/cli/disable.d.ts +2 -0
- package/dist/cli/disable.d.ts.map +1 -0
- package/dist/cli/disable.js +44 -0
- package/dist/cli/disable.js.map +1 -0
- package/dist/cli/enable.d.ts +2 -0
- package/dist/cli/enable.d.ts.map +1 -0
- package/dist/cli/enable.js +105 -0
- package/dist/cli/enable.js.map +1 -0
- package/dist/cli/hook.d.ts +2 -0
- package/dist/cli/hook.d.ts.map +1 -0
- package/dist/cli/hook.js +406 -0
- package/dist/cli/hook.js.map +1 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +70 -8
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/install-hooks.d.ts +5 -0
- package/dist/cli/install-hooks.d.ts.map +1 -0
- package/dist/cli/install-hooks.js +132 -0
- package/dist/cli/install-hooks.js.map +1 -0
- package/dist/cli/install-task.d.ts +28 -0
- package/dist/cli/install-task.d.ts.map +1 -0
- package/dist/cli/install-task.js +119 -0
- package/dist/cli/install-task.js.map +1 -0
- package/dist/cli/mcp.d.ts +2 -0
- package/dist/cli/mcp.d.ts.map +1 -0
- package/dist/cli/mcp.js +148 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/metrics.d.ts +2 -0
- package/dist/cli/metrics.d.ts.map +1 -0
- package/dist/cli/metrics.js +103 -0
- package/dist/cli/metrics.js.map +1 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +211 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.d.ts +2 -0
- package/dist/cli/scan.d.ts.map +1 -0
- package/dist/cli/scan.js +171 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/start.d.ts.map +1 -1
- package/dist/cli/start.js +70 -17
- package/dist/cli/start.js.map +1 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +82 -18
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/uninstall-task.d.ts +8 -0
- package/dist/cli/uninstall-task.d.ts.map +1 -0
- package/dist/cli/uninstall-task.js +44 -0
- package/dist/cli/uninstall-task.js.map +1 -0
- package/dist/config.d.ts +172 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +114 -2
- package/dist/config.js.map +1 -1
- package/dist/console-safe.d.ts +21 -0
- package/dist/console-safe.d.ts.map +1 -0
- package/dist/console-safe.js +71 -0
- package/dist/console-safe.js.map +1 -0
- package/dist/detection-secret.d.ts.map +1 -1
- package/dist/detection-secret.js +12 -0
- package/dist/detection-secret.js.map +1 -1
- package/dist/env-detect.d.ts +44 -0
- package/dist/env-detect.d.ts.map +1 -0
- package/dist/env-detect.js +151 -0
- package/dist/env-detect.js.map +1 -0
- package/dist/exec/executor.d.ts +42 -0
- package/dist/exec/executor.d.ts.map +1 -0
- package/dist/exec/executor.js +135 -0
- package/dist/exec/executor.js.map +1 -0
- package/dist/exec/pk-execute.d.ts +30 -0
- package/dist/exec/pk-execute.d.ts.map +1 -0
- package/dist/exec/pk-execute.js +174 -0
- package/dist/exec/pk-execute.js.map +1 -0
- package/dist/exec/policy-fetcher.d.ts +9 -0
- package/dist/exec/policy-fetcher.d.ts.map +1 -0
- package/dist/exec/policy-fetcher.js +46 -0
- package/dist/exec/policy-fetcher.js.map +1 -0
- package/dist/exec/policy.d.ts +32 -0
- package/dist/exec/policy.d.ts.map +1 -0
- package/dist/exec/policy.js +88 -0
- package/dist/exec/policy.js.map +1 -0
- package/dist/hooks/block-store.d.ts +14 -0
- package/dist/hooks/block-store.d.ts.map +1 -0
- package/dist/hooks/block-store.js +26 -0
- package/dist/hooks/block-store.js.map +1 -0
- package/dist/hooks/claude-hook.d.ts +55 -0
- package/dist/hooks/claude-hook.d.ts.map +1 -0
- package/dist/hooks/claude-hook.js +122 -0
- package/dist/hooks/claude-hook.js.map +1 -0
- package/dist/hooks/continuity.d.ts +48 -0
- package/dist/hooks/continuity.d.ts.map +1 -0
- package/dist/hooks/continuity.js +92 -0
- package/dist/hooks/continuity.js.map +1 -0
- package/dist/hooks/observation.d.ts +27 -0
- package/dist/hooks/observation.d.ts.map +1 -0
- package/dist/hooks/observation.js +0 -0
- package/dist/hooks/observation.js.map +1 -0
- package/dist/hooks/platforms.d.ts +24 -0
- package/dist/hooks/platforms.d.ts.map +1 -0
- package/dist/hooks/platforms.js +57 -0
- package/dist/hooks/platforms.js.map +1 -0
- package/dist/hooks/read-cache.d.ts +71 -0
- package/dist/hooks/read-cache.d.ts.map +1 -0
- package/dist/hooks/read-cache.js +166 -0
- package/dist/hooks/read-cache.js.map +1 -0
- package/dist/hooks/reduction.d.ts +78 -0
- package/dist/hooks/reduction.d.ts.map +1 -0
- package/dist/hooks/reduction.js +111 -0
- package/dist/hooks/reduction.js.map +1 -0
- package/dist/hooks/settings-merge.d.ts +32 -0
- package/dist/hooks/settings-merge.d.ts.map +1 -0
- package/dist/hooks/settings-merge.js +74 -0
- package/dist/hooks/settings-merge.js.map +1 -0
- package/dist/hooks/snapshot.d.ts +37 -0
- package/dist/hooks/snapshot.d.ts.map +1 -0
- package/dist/hooks/snapshot.js +180 -0
- package/dist/hooks/snapshot.js.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +118 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +240 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/onboarding-report.d.ts +66 -0
- package/dist/onboarding-report.d.ts.map +1 -0
- package/dist/onboarding-report.js +152 -0
- package/dist/onboarding-report.js.map +1 -0
- package/dist/onboarding.d.ts +55 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +98 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/pii-masker.d.ts +7 -0
- package/dist/pii-masker.d.ts.map +1 -1
- package/dist/pii-masker.js +27 -51
- package/dist/pii-masker.js.map +1 -1
- package/dist/privacy.d.ts +13 -0
- package/dist/privacy.d.ts.map +1 -0
- package/dist/privacy.js +67 -0
- package/dist/privacy.js.map +1 -0
- package/dist/residency.d.ts +21 -0
- package/dist/residency.d.ts.map +1 -0
- package/dist/residency.js +68 -0
- package/dist/residency.js.map +1 -0
- package/dist/secret-detector.d.ts +19 -0
- package/dist/secret-detector.d.ts.map +1 -1
- package/dist/secret-detector.js +116 -0
- package/dist/secret-detector.js.map +1 -1
- package/dist/store/local-store.d.ts +167 -0
- package/dist/store/local-store.d.ts.map +1 -0
- package/dist/store/local-store.js +538 -0
- package/dist/store/local-store.js.map +1 -0
- package/dist/store/schema.d.ts +38 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +189 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/types.d.ts +13 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/watcher.d.ts +6 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +13 -2
- package/dist/watcher.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,538 @@
|
|
|
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.LocalStore = exports.DEFAULT_DB_PATH = void 0;
|
|
7
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const secret_detector_1 = require("../secret-detector");
|
|
12
|
+
const schema_1 = require("./schema");
|
|
13
|
+
// =============================================
|
|
14
|
+
// ローカル SQLite ストア (Issue #68 / Epic #66 P2)
|
|
15
|
+
// =============================================
|
|
16
|
+
//
|
|
17
|
+
// 処理順の不変条件: 受信 → 正規化 → **PII マスク** → ここで保存 →(トークンあり時のみ)送信。
|
|
18
|
+
// 本ストアに渡る ParsedEntry は呼び出し側で必ずマスク済みであること。
|
|
19
|
+
// 生 PII / 生機密をローカル DB にも残さない (端末紛失リスク対策)。
|
|
20
|
+
exports.DEFAULT_DB_PATH = path_1.default.join(os_1.default.homedir(), '.promptkaizen', 'agent.db');
|
|
21
|
+
/**
|
|
22
|
+
* better-sqlite3 ベースのローカルストア。同期 API なので hook の同期判定にも使える。
|
|
23
|
+
*/
|
|
24
|
+
class LocalStore {
|
|
25
|
+
db;
|
|
26
|
+
dbPath;
|
|
27
|
+
constructor(dbPath = exports.DEFAULT_DB_PATH) {
|
|
28
|
+
this.dbPath = dbPath;
|
|
29
|
+
fs_1.default.mkdirSync(path_1.default.dirname(dbPath), { recursive: true });
|
|
30
|
+
this.db = new better_sqlite3_1.default(dbPath);
|
|
31
|
+
// DB ファイルは本人のみ読めるように (生 PII は持たないが session/cwd 等を保護)。
|
|
32
|
+
try {
|
|
33
|
+
fs_1.default.chmodSync(dbPath, 0o600);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
/* Windows 等で失敗しても致命ではない */
|
|
37
|
+
}
|
|
38
|
+
this.db.pragma('journal_mode = WAL');
|
|
39
|
+
this.db.pragma('busy_timeout = 5000');
|
|
40
|
+
this.db.pragma('synchronous = NORMAL');
|
|
41
|
+
this.migrate();
|
|
42
|
+
}
|
|
43
|
+
/** PRAGMA user_version を見て差分マイグレーションを適用する。 */
|
|
44
|
+
migrate() {
|
|
45
|
+
const current = this.db.pragma('user_version', { simple: true });
|
|
46
|
+
if (current < 1) {
|
|
47
|
+
this.db.exec(schema_1.SCHEMA_V1);
|
|
48
|
+
}
|
|
49
|
+
if (current < 2) {
|
|
50
|
+
this.db.exec(schema_1.SCHEMA_V2);
|
|
51
|
+
}
|
|
52
|
+
if (current < 3) {
|
|
53
|
+
this.db.exec(schema_1.SCHEMA_V3);
|
|
54
|
+
}
|
|
55
|
+
if (current < 4) {
|
|
56
|
+
// 列追加は冪等でないため存在確認してから (再マイグレーション耐性)。
|
|
57
|
+
for (const c of schema_1.SCHEMA_V4_COLUMNS)
|
|
58
|
+
this.addColumnIfMissing(c.table, c.column, c.def);
|
|
59
|
+
this.db.exec(schema_1.SCHEMA_V4);
|
|
60
|
+
}
|
|
61
|
+
if (current < schema_1.SCHEMA_VERSION) {
|
|
62
|
+
this.db.pragma(`user_version = ${schema_1.SCHEMA_VERSION}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** PRAGMA table_info を見て、未存在の列だけ ALTER TABLE ADD COLUMN する。 */
|
|
66
|
+
addColumnIfMissing(table, column, def) {
|
|
67
|
+
const cols = this.db.prepare(`PRAGMA table_info(${table})`).all();
|
|
68
|
+
if (!cols.some((c) => c.name === column)) {
|
|
69
|
+
this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${def}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------
|
|
73
|
+
// 書き込み
|
|
74
|
+
// ---------------------------------------------
|
|
75
|
+
/**
|
|
76
|
+
* マスク済み entry を 1 件保存し rowid を返す。session も upsert する。
|
|
77
|
+
* body は raw からマスク済み文字列を連結したもの (検索用)。
|
|
78
|
+
*/
|
|
79
|
+
recordEvent(entry, recordedAt = new Date().toISOString()) {
|
|
80
|
+
return this.txRecord([entry], recordedAt)[0] ?? -1;
|
|
81
|
+
}
|
|
82
|
+
/** 複数 entry をトランザクションで保存し rowid 配列を返す。 */
|
|
83
|
+
recordEvents(entries, recordedAt = new Date().toISOString()) {
|
|
84
|
+
if (entries.length === 0)
|
|
85
|
+
return [];
|
|
86
|
+
return this.txRecord(entries, recordedAt);
|
|
87
|
+
}
|
|
88
|
+
txRecord = (entries, recordedAt) => {
|
|
89
|
+
const insertEvent = this.db.prepare(`
|
|
90
|
+
INSERT INTO events
|
|
91
|
+
(session_id, source, type, tool_name, filepath, line_number, cwd, ts,
|
|
92
|
+
recorded_at, detections_json, masks_json, body, dedupe_key, sent)
|
|
93
|
+
VALUES
|
|
94
|
+
(@session_id, @source, @type, @tool_name, @filepath, @line_number, @cwd, @ts,
|
|
95
|
+
@recorded_at, @detections_json, @masks_json, @body, @dedupe_key, 0)
|
|
96
|
+
`);
|
|
97
|
+
const run = this.db.transaction((rows) => {
|
|
98
|
+
const ids = [];
|
|
99
|
+
for (const e of rows) {
|
|
100
|
+
const meta = extractMeta(e);
|
|
101
|
+
const info = insertEvent.run({
|
|
102
|
+
session_id: meta.sessionId,
|
|
103
|
+
source: e.source,
|
|
104
|
+
type: meta.type,
|
|
105
|
+
tool_name: meta.toolName,
|
|
106
|
+
filepath: e.filepath,
|
|
107
|
+
line_number: e.lineNumber,
|
|
108
|
+
cwd: meta.cwd,
|
|
109
|
+
ts: meta.ts,
|
|
110
|
+
recorded_at: recordedAt,
|
|
111
|
+
detections_json: e.detections ? JSON.stringify(e.detections) : null,
|
|
112
|
+
masks_json: e.masks ? JSON.stringify(e.masks) : null,
|
|
113
|
+
body: (0, secret_detector_1.collectStrings)(e.raw) || null,
|
|
114
|
+
dedupe_key: meta.dedupeKey,
|
|
115
|
+
});
|
|
116
|
+
const id = Number(info.lastInsertRowid);
|
|
117
|
+
ids.push(id);
|
|
118
|
+
this.bumpSession(meta.sessionId, e.source, meta.cwd, recordedAt, 1, 0);
|
|
119
|
+
}
|
|
120
|
+
return ids;
|
|
121
|
+
});
|
|
122
|
+
return run(entries);
|
|
123
|
+
};
|
|
124
|
+
/** PreToolUse の deny を記録し、session の block_count を増やす。 */
|
|
125
|
+
recordBlock(block) {
|
|
126
|
+
const insert = this.db.prepare(`
|
|
127
|
+
INSERT INTO blocks (recorded_at, session_id, cwd, tool_name, detections_json)
|
|
128
|
+
VALUES (@recorded_at, @session_id, @cwd, @tool_name, @detections_json)
|
|
129
|
+
`);
|
|
130
|
+
const run = this.db.transaction((b) => {
|
|
131
|
+
const info = insert.run({
|
|
132
|
+
recorded_at: b.recordedAt,
|
|
133
|
+
session_id: b.sessionId,
|
|
134
|
+
cwd: b.cwd,
|
|
135
|
+
tool_name: b.toolName,
|
|
136
|
+
detections_json: JSON.stringify(b.detections ?? []),
|
|
137
|
+
});
|
|
138
|
+
this.bumpSession(b.sessionId, 'hook', b.cwd, b.recordedAt, 0, 1);
|
|
139
|
+
return Number(info.lastInsertRowid);
|
|
140
|
+
});
|
|
141
|
+
return run(block);
|
|
142
|
+
}
|
|
143
|
+
bumpSession(sessionId, source, cwd, at, eventDelta, blockDelta) {
|
|
144
|
+
if (!sessionId)
|
|
145
|
+
return;
|
|
146
|
+
this.db
|
|
147
|
+
.prepare(`
|
|
148
|
+
INSERT INTO sessions (session_id, source, cwd, first_seen, last_seen, event_count, block_count)
|
|
149
|
+
VALUES (@sid, @source, @cwd, @at, @at, @ev, @bl)
|
|
150
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
151
|
+
last_seen = @at,
|
|
152
|
+
cwd = COALESCE(@cwd, sessions.cwd),
|
|
153
|
+
event_count = sessions.event_count + @ev,
|
|
154
|
+
block_count = sessions.block_count + @bl
|
|
155
|
+
`)
|
|
156
|
+
.run({ sid: sessionId, source, cwd, at, ev: eventDelta, bl: blockDelta });
|
|
157
|
+
}
|
|
158
|
+
// ---------------------------------------------
|
|
159
|
+
// 送信ゲート (トークン未設定時は呼ばれない → sent は常に 0 のまま)
|
|
160
|
+
// ---------------------------------------------
|
|
161
|
+
/** 未送信 event を取得 (送信対象の決定に使う)。 */
|
|
162
|
+
unsentEvents(limit = 500) {
|
|
163
|
+
const rows = this.db
|
|
164
|
+
.prepare(`SELECT * FROM events WHERE sent = 0 ORDER BY id ASC LIMIT ?`)
|
|
165
|
+
.all(limit);
|
|
166
|
+
return rows.map(toEventRow);
|
|
167
|
+
}
|
|
168
|
+
/** 送信済みフラグを立てる。 */
|
|
169
|
+
markSent(ids) {
|
|
170
|
+
if (ids.length === 0)
|
|
171
|
+
return;
|
|
172
|
+
const stmt = this.db.prepare(`UPDATE events SET sent = 1 WHERE id = ?`);
|
|
173
|
+
this.db.transaction((xs) => xs.forEach((id) => stmt.run(id)))(ids);
|
|
174
|
+
}
|
|
175
|
+
// ---------------------------------------------
|
|
176
|
+
// 検索 (FTS5 trigram)
|
|
177
|
+
// ---------------------------------------------
|
|
178
|
+
/**
|
|
179
|
+
* ローカル全文検索。trigram は 3 文字以上のクエリが必要なので、
|
|
180
|
+
* 2 文字以下は LIKE にフォールバックする。マスク済み本文のみが対象。
|
|
181
|
+
*/
|
|
182
|
+
search(query, opts = {}) {
|
|
183
|
+
const limit = opts.limit ?? 20;
|
|
184
|
+
const q = query.trim();
|
|
185
|
+
if (!q)
|
|
186
|
+
return [];
|
|
187
|
+
const useFts = [...q].length >= 3;
|
|
188
|
+
let rows;
|
|
189
|
+
if (useFts) {
|
|
190
|
+
const where = (opts.sessionId ? 'AND e.session_id = @sid ' : '') + (opts.cwd ? 'AND e.cwd = @cwd ' : '');
|
|
191
|
+
rows = this.db
|
|
192
|
+
.prepare(`
|
|
193
|
+
SELECT e.* FROM events_fts f
|
|
194
|
+
JOIN events e ON e.id = f.rowid
|
|
195
|
+
WHERE events_fts MATCH @q ${where}
|
|
196
|
+
ORDER BY e.id DESC LIMIT @limit
|
|
197
|
+
`)
|
|
198
|
+
.all({ q: ftsQuote(q), sid: opts.sessionId, cwd: opts.cwd, limit });
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
const where = (opts.sessionId ? 'AND session_id = @sid ' : '') + (opts.cwd ? 'AND cwd = @cwd ' : '');
|
|
202
|
+
rows = this.db
|
|
203
|
+
.prepare(`
|
|
204
|
+
SELECT * FROM events
|
|
205
|
+
WHERE body LIKE @like ${where}
|
|
206
|
+
ORDER BY id DESC LIMIT @limit
|
|
207
|
+
`)
|
|
208
|
+
.all({ like: `%${q}%`, sid: opts.sessionId, cwd: opts.cwd, limit });
|
|
209
|
+
}
|
|
210
|
+
return rows.map(toEventRow);
|
|
211
|
+
}
|
|
212
|
+
/** セッションの直近 event (PreToolUse の同期文脈参照用)。 */
|
|
213
|
+
recentBySession(sessionId, limit = 10) {
|
|
214
|
+
const rows = this.db
|
|
215
|
+
.prepare(`SELECT * FROM events WHERE session_id = ? ORDER BY id DESC LIMIT ?`)
|
|
216
|
+
.all(sessionId, limit);
|
|
217
|
+
return rows.map(toEventRow);
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------
|
|
220
|
+
// ツール出力の退避 (Issue #93 / Epic #91 R1)
|
|
221
|
+
// ---------------------------------------------
|
|
222
|
+
/** 退避したツール出力を 1 件保存する。body は呼び出し側で必ずマスク済みであること。 */
|
|
223
|
+
recordToolOutputRef(ref) {
|
|
224
|
+
this.db
|
|
225
|
+
.prepare(`
|
|
226
|
+
INSERT INTO tool_output_refs
|
|
227
|
+
(ref_id, session_id, tool_name, cwd, created_at,
|
|
228
|
+
original_bytes, original_tokens, replaced_tokens, saved_tokens, body,
|
|
229
|
+
file_path, content_hash, kind)
|
|
230
|
+
VALUES
|
|
231
|
+
(@ref_id, @session_id, @tool_name, @cwd, @created_at,
|
|
232
|
+
@original_bytes, @original_tokens, @replaced_tokens, @saved_tokens, @body,
|
|
233
|
+
@file_path, @content_hash, @kind)
|
|
234
|
+
`)
|
|
235
|
+
.run({
|
|
236
|
+
ref_id: ref.refId,
|
|
237
|
+
session_id: ref.sessionId,
|
|
238
|
+
tool_name: ref.toolName,
|
|
239
|
+
cwd: ref.cwd,
|
|
240
|
+
created_at: ref.createdAt,
|
|
241
|
+
original_bytes: ref.originalBytes,
|
|
242
|
+
original_tokens: ref.originalTokens,
|
|
243
|
+
replaced_tokens: ref.replacedTokens,
|
|
244
|
+
saved_tokens: ref.savedTokens,
|
|
245
|
+
body: ref.body,
|
|
246
|
+
file_path: ref.filePath ?? null,
|
|
247
|
+
content_hash: ref.contentHash ?? null,
|
|
248
|
+
kind: ref.kind ?? 'offload',
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
/** ref_id で退避内容を取得する (pk_fetch の全文取得)。 */
|
|
252
|
+
getToolOutputRef(refId) {
|
|
253
|
+
const r = this.db
|
|
254
|
+
.prepare(`SELECT * FROM tool_output_refs WHERE ref_id = ?`)
|
|
255
|
+
.get(refId);
|
|
256
|
+
if (!r)
|
|
257
|
+
return null;
|
|
258
|
+
return {
|
|
259
|
+
refId: r.ref_id,
|
|
260
|
+
sessionId: r.session_id ?? null,
|
|
261
|
+
toolName: r.tool_name ?? null,
|
|
262
|
+
cwd: r.cwd ?? null,
|
|
263
|
+
createdAt: r.created_at,
|
|
264
|
+
originalBytes: r.original_bytes,
|
|
265
|
+
originalTokens: r.original_tokens,
|
|
266
|
+
replacedTokens: r.replaced_tokens,
|
|
267
|
+
savedTokens: r.saved_tokens,
|
|
268
|
+
body: r.body,
|
|
269
|
+
filePath: r.file_path ?? null,
|
|
270
|
+
contentHash: r.content_hash ?? null,
|
|
271
|
+
kind: (r.kind ?? 'offload'),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
// ---------------------------------------------
|
|
275
|
+
// Read 再読込キャッシュ (Issue #110 / Epic #91 R1.5)
|
|
276
|
+
// ---------------------------------------------
|
|
277
|
+
/** (session, file) の直近 Read 状態を取得する。未記録なら null。 */
|
|
278
|
+
getReadCache(sessionId, filePath) {
|
|
279
|
+
const r = this.db
|
|
280
|
+
.prepare(`SELECT * FROM read_cache WHERE session_id = ? AND file_path = ?`)
|
|
281
|
+
.get(sessionId, filePath);
|
|
282
|
+
if (!r)
|
|
283
|
+
return null;
|
|
284
|
+
return {
|
|
285
|
+
sessionId: r.session_id,
|
|
286
|
+
filePath: r.file_path,
|
|
287
|
+
contentHash: r.content_hash,
|
|
288
|
+
refId: r.ref_id ?? null,
|
|
289
|
+
updatedAt: r.updated_at,
|
|
290
|
+
invalidated: Boolean(r.invalidated),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/** (session, file) の Read 状態を upsert する (内容ハッシュ更新時は invalidated を 0 に戻す)。 */
|
|
294
|
+
upsertReadCache(row) {
|
|
295
|
+
this.db
|
|
296
|
+
.prepare(`
|
|
297
|
+
INSERT INTO read_cache (session_id, file_path, content_hash, ref_id, updated_at, invalidated)
|
|
298
|
+
VALUES (@session_id, @file_path, @content_hash, @ref_id, @updated_at, 0)
|
|
299
|
+
ON CONFLICT(session_id, file_path) DO UPDATE SET
|
|
300
|
+
content_hash = excluded.content_hash,
|
|
301
|
+
ref_id = excluded.ref_id,
|
|
302
|
+
updated_at = excluded.updated_at,
|
|
303
|
+
invalidated = 0
|
|
304
|
+
`)
|
|
305
|
+
.run({
|
|
306
|
+
session_id: row.sessionId,
|
|
307
|
+
file_path: row.filePath,
|
|
308
|
+
content_hash: row.contentHash,
|
|
309
|
+
ref_id: row.refId,
|
|
310
|
+
updated_at: row.updatedAt,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/** (session, file) のキャッシュを無効化する (Edit/Write 後)。次回 Read は全文を返す。 */
|
|
314
|
+
invalidateReadCache(sessionId, filePath) {
|
|
315
|
+
this.db
|
|
316
|
+
.prepare(`UPDATE read_cache SET invalidated = 1 WHERE session_id = ? AND file_path = ?`)
|
|
317
|
+
.run(sessionId, filePath);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* ローカル衛生 (#110): TTL 超過の退避レコード / キャッシュ行を削除し、
|
|
321
|
+
* tool_output_refs が maxRefs を超える分を古い順に削除する。戻り値は削除した行数。
|
|
322
|
+
*/
|
|
323
|
+
pruneReductionStore(opts) {
|
|
324
|
+
const now = opts.now ?? new Date();
|
|
325
|
+
const cutoff = new Date(now.getTime() - opts.ttlDays * 24 * 3600 * 1000).toISOString();
|
|
326
|
+
let removed = 0;
|
|
327
|
+
removed += this.db.prepare(`DELETE FROM tool_output_refs WHERE created_at < ?`).run(cutoff).changes;
|
|
328
|
+
this.db.prepare(`DELETE FROM read_cache WHERE updated_at < ?`).run(cutoff);
|
|
329
|
+
// 件数上限: 新しい maxRefs 件を残して古いものを削除。
|
|
330
|
+
removed += this.db
|
|
331
|
+
.prepare(`
|
|
332
|
+
DELETE FROM tool_output_refs WHERE id NOT IN (
|
|
333
|
+
SELECT id FROM tool_output_refs ORDER BY id DESC LIMIT ?
|
|
334
|
+
)
|
|
335
|
+
`)
|
|
336
|
+
.run(opts.maxRefs).changes;
|
|
337
|
+
return removed;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* 退避内容を query で絞り込む (pk_fetch の絞り込み取得)。
|
|
341
|
+
* FTS5 (trigram) で該当 ref に query がヒットするか確認したうえで、
|
|
342
|
+
* マッチ行 ± contextLines 行を抜粋して返す (ログ向けには行コンテキストが有用)。
|
|
343
|
+
* 3 文字未満のクエリは trigram の制約により行スキャンのみで判定する。
|
|
344
|
+
*/
|
|
345
|
+
queryToolOutputRef(refId, query, opts = {}) {
|
|
346
|
+
const ref = this.getToolOutputRef(refId);
|
|
347
|
+
if (!ref)
|
|
348
|
+
return null;
|
|
349
|
+
const q = query.trim();
|
|
350
|
+
if (!q)
|
|
351
|
+
return { excerpts: [ref.body], totalMatches: 0 };
|
|
352
|
+
// FTS5 で当該 ref に query が存在するか先に確認 (大きな body の無駄スキャン回避)。
|
|
353
|
+
if ([...q].length >= 3) {
|
|
354
|
+
const hit = this.db
|
|
355
|
+
.prepare(`
|
|
356
|
+
SELECT 1 FROM tool_output_refs_fts f
|
|
357
|
+
JOIN tool_output_refs r ON r.id = f.rowid
|
|
358
|
+
WHERE tool_output_refs_fts MATCH @q AND r.ref_id = @ref
|
|
359
|
+
`)
|
|
360
|
+
.get({ q: ftsQuote(q), ref: refId });
|
|
361
|
+
if (!hit)
|
|
362
|
+
return { excerpts: [], totalMatches: 0 };
|
|
363
|
+
}
|
|
364
|
+
const maxMatches = opts.maxMatches ?? 50;
|
|
365
|
+
const contextLines = opts.contextLines ?? 2;
|
|
366
|
+
const lines = ref.body.split('\n');
|
|
367
|
+
const needle = q.toLowerCase();
|
|
368
|
+
const matched = [];
|
|
369
|
+
for (let i = 0; i < lines.length; i++) {
|
|
370
|
+
if (lines[i].toLowerCase().includes(needle))
|
|
371
|
+
matched.push(i);
|
|
372
|
+
}
|
|
373
|
+
const excerpts = [];
|
|
374
|
+
for (const i of matched.slice(0, maxMatches)) {
|
|
375
|
+
const from = Math.max(0, i - contextLines);
|
|
376
|
+
const to = Math.min(lines.length - 1, i + contextLines);
|
|
377
|
+
excerpts.push(lines
|
|
378
|
+
.slice(from, to + 1)
|
|
379
|
+
.map((l, j) => `${from + j + 1}: ${l}`)
|
|
380
|
+
.join('\n'));
|
|
381
|
+
}
|
|
382
|
+
return { excerpts, totalMatches: matched.length };
|
|
383
|
+
}
|
|
384
|
+
// ---------------------------------------------
|
|
385
|
+
// セッション状態スナップショット (Issue #95 / Epic #91 R3)
|
|
386
|
+
// ---------------------------------------------
|
|
387
|
+
/** スナップショットを保存する。summary / detailJson は必ずマスク済みであること。 */
|
|
388
|
+
recordSnapshot(s) {
|
|
389
|
+
const info = this.db
|
|
390
|
+
.prepare(`
|
|
391
|
+
INSERT INTO session_snapshots (session_id, cwd, trigger, created_at, summary, detail_json)
|
|
392
|
+
VALUES (@session_id, @cwd, @trigger, @created_at, @summary, @detail_json)
|
|
393
|
+
`)
|
|
394
|
+
.run({
|
|
395
|
+
session_id: s.sessionId,
|
|
396
|
+
cwd: s.cwd,
|
|
397
|
+
trigger: s.trigger,
|
|
398
|
+
created_at: s.createdAt,
|
|
399
|
+
summary: s.summary,
|
|
400
|
+
detail_json: s.detailJson,
|
|
401
|
+
});
|
|
402
|
+
return Number(info.lastInsertRowid);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* 復元対象のスナップショットを返す。同一セッションを優先し、無ければ
|
|
406
|
+
* 同一 cwd の最新を返す (maxAgeMs より古いものは対象外 = 古い文脈を注入しない)。
|
|
407
|
+
*/
|
|
408
|
+
latestSnapshot(p) {
|
|
409
|
+
const cutoff = new Date(Date.now() - (p.maxAgeMs ?? 14 * 24 * 3600 * 1000)).toISOString();
|
|
410
|
+
const bySession = p.sessionId
|
|
411
|
+
? this.db
|
|
412
|
+
.prepare(`
|
|
413
|
+
SELECT * FROM session_snapshots
|
|
414
|
+
WHERE session_id = ? AND created_at >= ?
|
|
415
|
+
ORDER BY created_at DESC, id DESC LIMIT 1
|
|
416
|
+
`)
|
|
417
|
+
.get(p.sessionId, cutoff)
|
|
418
|
+
: undefined;
|
|
419
|
+
const row = bySession ??
|
|
420
|
+
(p.cwd
|
|
421
|
+
? this.db
|
|
422
|
+
.prepare(`
|
|
423
|
+
SELECT * FROM session_snapshots
|
|
424
|
+
WHERE cwd = ? AND created_at >= ?
|
|
425
|
+
ORDER BY created_at DESC, id DESC LIMIT 1
|
|
426
|
+
`)
|
|
427
|
+
.get(p.cwd, cutoff)
|
|
428
|
+
: undefined);
|
|
429
|
+
return row ? toSnapshot(row) : null;
|
|
430
|
+
}
|
|
431
|
+
/** スナップショット要約の全文検索 (pk_recall 用)。3 文字未満は LIKE フォールバック。 */
|
|
432
|
+
searchSnapshots(query, opts = {}) {
|
|
433
|
+
const limit = opts.limit ?? 5;
|
|
434
|
+
const q = query.trim();
|
|
435
|
+
if (!q)
|
|
436
|
+
return [];
|
|
437
|
+
let rows;
|
|
438
|
+
if ([...q].length >= 3) {
|
|
439
|
+
const where = opts.cwd ? 'AND s.cwd = @cwd' : '';
|
|
440
|
+
rows = this.db
|
|
441
|
+
.prepare(`
|
|
442
|
+
SELECT s.* FROM session_snapshots_fts f
|
|
443
|
+
JOIN session_snapshots s ON s.id = f.rowid
|
|
444
|
+
WHERE session_snapshots_fts MATCH @q ${where}
|
|
445
|
+
ORDER BY s.created_at DESC LIMIT @limit
|
|
446
|
+
`)
|
|
447
|
+
.all({ q: ftsQuote(q), cwd: opts.cwd, limit });
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
const where = opts.cwd ? 'AND cwd = @cwd' : '';
|
|
451
|
+
rows = this.db
|
|
452
|
+
.prepare(`
|
|
453
|
+
SELECT * FROM session_snapshots
|
|
454
|
+
WHERE summary LIKE @like ${where}
|
|
455
|
+
ORDER BY created_at DESC LIMIT @limit
|
|
456
|
+
`)
|
|
457
|
+
.all({ like: `%${q}%`, cwd: opts.cwd, limit });
|
|
458
|
+
}
|
|
459
|
+
return rows.map(toSnapshot);
|
|
460
|
+
}
|
|
461
|
+
/** cwd の直近セッション ID (pk_recall の scope=current_session 用)。 */
|
|
462
|
+
latestSessionIdForCwd(cwd) {
|
|
463
|
+
const row = this.db
|
|
464
|
+
.prepare(`SELECT session_id FROM sessions WHERE cwd = ? ORDER BY last_seen DESC LIMIT 1`)
|
|
465
|
+
.get(cwd);
|
|
466
|
+
return row?.session_id ?? null;
|
|
467
|
+
}
|
|
468
|
+
// ---------------------------------------------
|
|
469
|
+
// 状態 / クリーンアップ
|
|
470
|
+
// ---------------------------------------------
|
|
471
|
+
stats() {
|
|
472
|
+
const count = (sql) => this.db.prepare(sql).get().c;
|
|
473
|
+
let sizeBytes = 0;
|
|
474
|
+
try {
|
|
475
|
+
sizeBytes = fs_1.default.statSync(this.dbPath).size;
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
/* noop */
|
|
479
|
+
}
|
|
480
|
+
return {
|
|
481
|
+
events: count('SELECT COUNT(*) c FROM events'),
|
|
482
|
+
sessions: count('SELECT COUNT(*) c FROM sessions'),
|
|
483
|
+
blocks: count('SELECT COUNT(*) c FROM blocks'),
|
|
484
|
+
unsent: count('SELECT COUNT(*) c FROM events WHERE sent = 0'),
|
|
485
|
+
dbPath: this.dbPath,
|
|
486
|
+
sizeBytes,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
close() {
|
|
490
|
+
this.db.close();
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
exports.LocalStore = LocalStore;
|
|
494
|
+
/** ParsedEntry.raw (マスク済み正規化オブジェクト) から保存用メタを取り出す。 */
|
|
495
|
+
function extractMeta(e) {
|
|
496
|
+
const r = (e.raw ?? {});
|
|
497
|
+
const str = (v) => (typeof v === 'string' ? v : null);
|
|
498
|
+
return {
|
|
499
|
+
sessionId: str(r.sessionId) ?? str(r.session_id),
|
|
500
|
+
type: str(r.type),
|
|
501
|
+
toolName: str(r.toolName) ?? str(r.tool_name),
|
|
502
|
+
cwd: str(r.cwd),
|
|
503
|
+
ts: str(r.timestamp) ?? str(r.ts) ?? e.parsedAt ?? null,
|
|
504
|
+
dedupeKey: str(r.dedupeKey),
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
function toSnapshot(r) {
|
|
508
|
+
return {
|
|
509
|
+
sessionId: r.session_id ?? null,
|
|
510
|
+
cwd: r.cwd ?? null,
|
|
511
|
+
trigger: r.trigger,
|
|
512
|
+
createdAt: r.created_at,
|
|
513
|
+
summary: r.summary,
|
|
514
|
+
detailJson: r.detail_json ?? null,
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
function toEventRow(r) {
|
|
518
|
+
return {
|
|
519
|
+
id: r.id,
|
|
520
|
+
sessionId: r.session_id ?? null,
|
|
521
|
+
source: r.source,
|
|
522
|
+
type: r.type ?? null,
|
|
523
|
+
toolName: r.tool_name ?? null,
|
|
524
|
+
cwd: r.cwd ?? null,
|
|
525
|
+
ts: r.ts ?? null,
|
|
526
|
+
recordedAt: r.recorded_at,
|
|
527
|
+
body: r.body ?? null,
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* FTS5 MATCH 用にクエリを安全な phrase にする。trigram では記号がトークン境界に
|
|
532
|
+
* なるため、ユーザー入力を二重引用符で囲んだ単一フレーズとして扱う
|
|
533
|
+
* (構文インジェクション・予期せぬ演算子解釈を防ぐ)。内部の " は "" にエスケープ。
|
|
534
|
+
*/
|
|
535
|
+
function ftsQuote(q) {
|
|
536
|
+
return `"${q.replace(/"/g, '""')}"`;
|
|
537
|
+
}
|
|
538
|
+
//# sourceMappingURL=local-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../src/store/local-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** スキーマバージョン (PRAGMA user_version)。破壊的変更時に +1 してマイグレーションを足す。 */
|
|
2
|
+
export declare const SCHEMA_VERSION = 4;
|
|
3
|
+
/**
|
|
4
|
+
* 初期スキーマ。冪等 (IF NOT EXISTS) で、起動のたびに安全に流せる。
|
|
5
|
+
* マイグレーションは applyMigrations() が user_version を見て差分のみ適用する。
|
|
6
|
+
*/
|
|
7
|
+
export declare const SCHEMA_V1 = "\nCREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT,\n source TEXT NOT NULL, -- claude_code | codex | hook\n type TEXT, -- user | assistant | hook_tool_result ...\n tool_name TEXT,\n filepath TEXT,\n line_number INTEGER,\n cwd TEXT,\n ts TEXT, -- entry \u306E\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7 (ISO, \u3042\u308C\u3070)\n recorded_at TEXT NOT NULL, -- \u30ED\u30FC\u30AB\u30EB\u4FDD\u5B58\u6642\u523B (ISO)\n detections_json TEXT, -- \u691C\u77E5\u30E1\u30BF (\u751F\u6A5F\u5BC6\u306A\u3057)\n masks_json TEXT, -- \u30DE\u30B9\u30AF\u5B9F\u7E3E (\u4EF6\u6570\u306E\u307F)\n body TEXT, -- \u30DE\u30B9\u30AF\u6E08\u307F\u672C\u6587 (\u691C\u7D22\u7528\u3002\u751F PII \u3092\u542B\u307E\u306A\u3044)\n dedupe_key TEXT, -- session + \u6B63\u898F\u5316\u672C\u6587\u306E sha256 (\u91CD\u8907\u6392\u9664\u7528)\n sent INTEGER NOT NULL DEFAULT 0 -- 0=\u672A\u9001\u4FE1, 1=\u9001\u4FE1\u6E08\u307F (\u30C8\u30FC\u30AF\u30F3\u672A\u8A2D\u5B9A\u6642\u306F\u5E38\u306B 0)\n);\nCREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);\nCREATE INDEX IF NOT EXISTS idx_events_recorded ON events(recorded_at);\nCREATE INDEX IF NOT EXISTS idx_events_dedupe ON events(dedupe_key);\nCREATE INDEX IF NOT EXISTS idx_events_sent ON events(sent);\n\nCREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n source TEXT,\n cwd TEXT,\n first_seen TEXT,\n last_seen TEXT,\n event_count INTEGER NOT NULL DEFAULT 0,\n block_count INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS blocks (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n recorded_at TEXT NOT NULL,\n session_id TEXT,\n cwd TEXT,\n tool_name TEXT,\n detections_json TEXT NOT NULL -- \u751F\u6A5F\u5BC6\u3092\u542B\u307E\u306A\u3044\u691C\u77E5\u30E1\u30BF\n);\nCREATE INDEX IF NOT EXISTS idx_blocks_session ON blocks(session_id);\nCREATE INDEX IF NOT EXISTS idx_blocks_recorded ON blocks(recorded_at);\n\n-- \u5916\u90E8\u30B3\u30F3\u30C6\u30F3\u30C4 FTS5 (trigram)\u3002events.body \u3092\u30DE\u30B9\u30AF\u6E08\u307F\u306E\u307E\u307E\u7D22\u5F15\u3059\u308B\u3002\nCREATE VIRTUAL TABLE IF NOT EXISTS events_fts USING fts5(\n body,\n content='events',\n content_rowid='id',\n tokenize='trigram'\n);\n\n-- events \u2194 events_fts \u540C\u671F\u30C8\u30EA\u30AC (\u5916\u90E8\u30B3\u30F3\u30C6\u30F3\u30C4\u306E\u5B9A\u77F3)\u3002\nCREATE TRIGGER IF NOT EXISTS events_ai AFTER INSERT ON events BEGIN\n INSERT INTO events_fts(rowid, body) VALUES (new.id, new.body);\nEND;\nCREATE TRIGGER IF NOT EXISTS events_ad AFTER DELETE ON events BEGIN\n INSERT INTO events_fts(events_fts, rowid, body) VALUES ('delete', old.id, old.body);\nEND;\nCREATE TRIGGER IF NOT EXISTS events_au AFTER UPDATE ON events BEGIN\n INSERT INTO events_fts(events_fts, rowid, body) VALUES ('delete', old.id, old.body);\n INSERT INTO events_fts(rowid, body) VALUES (new.id, new.body);\nEND;\n";
|
|
8
|
+
/**
|
|
9
|
+
* v2: ツール出力の退避 (Issue #93 / Epic #91 R1)。
|
|
10
|
+
* PostToolUse で閾値超過のツール出力を **マスキング後に** ここへ退避し、
|
|
11
|
+
* 元のツール結果は要約 + ref_id に差し替える。pk_fetch (MCP) が参照する。
|
|
12
|
+
* body はマスク済み (events と同じ不変条件)。FTS5 (trigram) で絞り込み取得に対応。
|
|
13
|
+
*/
|
|
14
|
+
export declare const SCHEMA_V2 = "\nCREATE TABLE IF NOT EXISTS tool_output_refs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ref_id TEXT NOT NULL UNIQUE, -- pk-XXXXXXXXXXXX (\u7F6E\u63DB\u30C6\u30AD\u30B9\u30C8\u306B\u57CB\u3081\u8FBC\u3080\u53C2\u7167ID)\n session_id TEXT,\n tool_name TEXT,\n cwd TEXT,\n created_at TEXT NOT NULL, -- ISO\n original_bytes INTEGER NOT NULL, -- \u9000\u907F\u524D\u306E UTF-8 \u30D0\u30A4\u30C8\u6570 (\u30DE\u30B9\u30AF\u5F8C\u672C\u6587\u57FA\u6E96)\n original_tokens INTEGER NOT NULL, -- \u9000\u907F\u524D\u306E\u63A8\u5B9A\u30C8\u30FC\u30AF\u30F3\n replaced_tokens INTEGER NOT NULL, -- \u5DEE\u3057\u66FF\u3048\u5F8C\u30C6\u30AD\u30B9\u30C8\u306E\u63A8\u5B9A\u30C8\u30FC\u30AF\u30F3\n saved_tokens INTEGER NOT NULL, -- original - replaced (\u524A\u6E1B\u5B9F\u7E3E)\n body TEXT NOT NULL -- \u30DE\u30B9\u30AF\u6E08\u307F\u5168\u6587\n);\nCREATE INDEX IF NOT EXISTS idx_refs_session ON tool_output_refs(session_id);\nCREATE INDEX IF NOT EXISTS idx_refs_created ON tool_output_refs(created_at);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS tool_output_refs_fts USING fts5(\n body,\n content='tool_output_refs',\n content_rowid='id',\n tokenize='trigram'\n);\n\nCREATE TRIGGER IF NOT EXISTS refs_ai AFTER INSERT ON tool_output_refs BEGIN\n INSERT INTO tool_output_refs_fts(rowid, body) VALUES (new.id, new.body);\nEND;\nCREATE TRIGGER IF NOT EXISTS refs_ad AFTER DELETE ON tool_output_refs BEGIN\n INSERT INTO tool_output_refs_fts(tool_output_refs_fts, rowid, body) VALUES ('delete', old.id, old.body);\nEND;\n";
|
|
15
|
+
/**
|
|
16
|
+
* v3: セッション状態スナップショット (Issue #95 / Epic #91 R3)。
|
|
17
|
+
* PreCompact (Claude Code) / Stop (Codex) で作業状態を保存し、
|
|
18
|
+
* SessionStart で要約を注入する。summary / detail_json は **マスク済み**
|
|
19
|
+
* (events と同じ不変条件)。summary は FTS5 (trigram) で pk_recall から検索できる。
|
|
20
|
+
*/
|
|
21
|
+
export declare const SCHEMA_V3 = "\nCREATE TABLE IF NOT EXISTS session_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT,\n cwd TEXT,\n trigger TEXT NOT NULL, -- pre_compact | stop\n created_at TEXT NOT NULL, -- ISO\n summary TEXT NOT NULL, -- \u30DE\u30B9\u30AF\u6E08\u307F\u8981\u7D04 (\u6CE8\u5165\u30FB\u691C\u7D22\u7528)\n detail_json TEXT -- \u30DE\u30B9\u30AF\u6E08\u307F\u69CB\u9020 (files/errors/tasks/commits)\n);\nCREATE INDEX IF NOT EXISTS idx_snapshots_cwd ON session_snapshots(cwd, created_at);\nCREATE INDEX IF NOT EXISTS idx_snapshots_session ON session_snapshots(session_id, created_at);\n\nCREATE VIRTUAL TABLE IF NOT EXISTS session_snapshots_fts USING fts5(\n summary,\n content='session_snapshots',\n content_rowid='id',\n tokenize='trigram'\n);\n\nCREATE TRIGGER IF NOT EXISTS snapshots_ai AFTER INSERT ON session_snapshots BEGIN\n INSERT INTO session_snapshots_fts(rowid, summary) VALUES (new.id, new.summary);\nEND;\nCREATE TRIGGER IF NOT EXISTS snapshots_ad AFTER DELETE ON session_snapshots BEGIN\n INSERT INTO session_snapshots_fts(session_snapshots_fts, rowid, summary) VALUES ('delete', old.id, old.summary);\nEND;\n";
|
|
22
|
+
/**
|
|
23
|
+
* v4: Read 特化の再読込キャッシュ (Issue #110 / Epic #91 R1.5)。
|
|
24
|
+
* - tool_output_refs に file_path / content_hash / kind 列を追加し、退避レコードを
|
|
25
|
+
* 「どのファイルの・どの内容ハッシュの・どの種別 (offload/cache_hit) か」で引けるようにする。
|
|
26
|
+
* - read_cache: (session_id, file_path) ごとの直近 Read の内容ハッシュ + ref_id を保持し、
|
|
27
|
+
* 2 回目以降の同一 Read を「前回と同一」と判定してキャッシュヒントに差し替える。
|
|
28
|
+
* Edit/Write 後は invalidated=1 にして古い内容での作業を防ぐ (品質ガードの核)。
|
|
29
|
+
* 列追加 (ALTER) は冪等でないため SCHEMA_V4_COLUMNS として分離し、migrate() が
|
|
30
|
+
* PRAGMA table_info で存在確認してから追加する (再マイグレーション耐性)。
|
|
31
|
+
*/
|
|
32
|
+
export declare const SCHEMA_V4_COLUMNS: Array<{
|
|
33
|
+
table: string;
|
|
34
|
+
column: string;
|
|
35
|
+
def: string;
|
|
36
|
+
}>;
|
|
37
|
+
export declare const SCHEMA_V4 = "\nCREATE INDEX IF NOT EXISTS idx_refs_filepath ON tool_output_refs(session_id, file_path);\n\nCREATE TABLE IF NOT EXISTS read_cache (\n session_id TEXT NOT NULL,\n file_path TEXT NOT NULL,\n content_hash TEXT NOT NULL, -- \u76F4\u8FD1 Read \u5185\u5BB9 (\u30DE\u30B9\u30AF\u5F8C) \u306E sha256\n ref_id TEXT, -- \u5BFE\u5FDC\u3059\u308B tool_output_refs.ref_id (\u5168\u6587\u53D6\u5F97\u7528)\n updated_at TEXT NOT NULL, -- ISO\n invalidated INTEGER NOT NULL DEFAULT 0,-- 1 = Edit/Write \u3067\u7121\u52B9\u5316\u6E08\u307F (\u6B21\u56DE Read \u306F\u5168\u6587)\n PRIMARY KEY (session_id, file_path)\n);\nCREATE INDEX IF NOT EXISTS idx_read_cache_updated ON read_cache(updated_at);\n";
|
|
38
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAgBA,gEAAgE;AAChE,eAAO,MAAM,cAAc,IAAI,CAAA;AAE/B;;;GAGG;AACH,eAAO,MAAM,SAAS,2pGA+DrB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,wnDA8BrB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,itCA0BrB,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAInF,CAAA;AAGD,eAAO,MAAM,SAAS,ovBAarB,CAAA"}
|