pybao-cli 1.5.21 → 1.5.23
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/dist/REPL-CI5ET6VF.js +50 -0
- package/dist/{acp-VH2FWCMR.js → acp-5G7LPADD.js} +32 -32
- package/dist/{agentsValidate-4E7AHAMS.js → agentsValidate-BIRAVXBL.js} +7 -7
- package/dist/{ask-R3YZ5B44.js → ask-XQZT6WIO.js} +31 -31
- package/dist/{autoUpdater-DCNAXD4F.js → autoUpdater-DDJAJPKA.js} +3 -3
- package/dist/{chunk-GIXE5FJ2.js → chunk-2GHNW642.js} +1 -1
- package/dist/{chunk-NRQHLVJJ.js → chunk-2SVUNNJB.js} +2 -2
- package/dist/{chunk-6UNYL6XK.js → chunk-3CC7QXCN.js} +222 -75
- package/dist/chunk-3CC7QXCN.js.map +7 -0
- package/dist/{chunk-H2ZE5QDY.js → chunk-4ZZYPG6P.js} +4 -4
- package/dist/{chunk-TBEA6BY3.js → chunk-5B7UCAYL.js} +1 -1
- package/dist/{chunk-ZQR3MM2D.js → chunk-652OMXEE.js} +2 -2
- package/dist/{chunk-EP62LHB7.js → chunk-6QGIRDZS.js} +1 -1
- package/dist/{chunk-BED7SG2Q.js → chunk-76BOJQUE.js} +1 -1
- package/dist/{chunk-TXZ5UTGP.js → chunk-7SYDIES4.js} +1 -1
- package/dist/{chunk-TXZ5UTGP.js.map → chunk-7SYDIES4.js.map} +1 -1
- package/dist/{chunk-CSONCQLF.js → chunk-A6QEPK5J.js} +2 -2
- package/dist/{chunk-X5LLT4P2.js → chunk-ABJT5MG2.js} +1 -1
- package/dist/{chunk-56IL2VXC.js → chunk-C2GNLGBM.js} +1 -1
- package/dist/{chunk-2OOER4FR.js → chunk-CNMNKSWQ.js} +3 -3
- package/dist/{chunk-QE7PZPHW.js → chunk-CT7LWVB7.js} +1 -1
- package/dist/{chunk-P5NTGZ5H.js → chunk-CZZKRPE2.js} +1 -1
- package/dist/{chunk-P5NTGZ5H.js.map → chunk-CZZKRPE2.js.map} +1 -1
- package/dist/chunk-G5MP72ZL.js +515 -0
- package/dist/chunk-G5MP72ZL.js.map +7 -0
- package/dist/{chunk-25GZITCX.js → chunk-GU4XA76N.js} +3 -3
- package/dist/chunk-KQZAS4DO.js +582 -0
- package/dist/chunk-KQZAS4DO.js.map +7 -0
- package/dist/{chunk-VP5A6FKG.js → chunk-LBDLSBXN.js} +4 -1
- package/dist/{chunk-SE7UGQCE.js → chunk-M7FEUIHO.js} +2 -2
- package/dist/{chunk-HA7FKBZI.js → chunk-MMW6MLFR.js} +2 -2
- package/dist/{chunk-XRLMQN3Q.js → chunk-MN77HNBB.js} +4 -4
- package/dist/{chunk-VY5KEHU5.js → chunk-N7GEPTZB.js} +3 -3
- package/dist/{chunk-MMMMRMOG.js → chunk-O7LWCCRJ.js} +3 -3
- package/dist/{chunk-5VO2CFAL.js → chunk-PUPDIRI6.js} +2 -2
- package/dist/{chunk-YQ2RQUQF.js → chunk-QCI5HPTA.js} +1 -1
- package/dist/{chunk-KMCUZUZG.js → chunk-QSMZLK7K.js} +3 -3
- package/dist/{chunk-4ZGZTWMR.js → chunk-S65MIABQ.js} +4 -4
- package/dist/{chunk-3UWTN6DM.js → chunk-V22PQM4W.js} +3 -3
- package/dist/{chunk-RQ5X6LFM.js → chunk-VVXC3SNP.js} +4 -4
- package/dist/{chunk-LRL3MYKR.js → chunk-W7VIESST.js} +3 -3
- package/dist/{chunk-CPYDPN2J.js → chunk-XEVB4WON.js} +15 -15
- package/dist/chunk-ZB3ZWD2K.js +96 -0
- package/dist/chunk-ZB3ZWD2K.js.map +7 -0
- package/dist/{cli-RBMZQ5KF.js → cli-YIANCHDD.js} +130 -103
- package/dist/cli-YIANCHDD.js.map +7 -0
- package/dist/commands-4YMZW52K.js +54 -0
- package/dist/{config-7TO5SQU5.js → config-QVH3VNUQ.js} +4 -4
- package/dist/{context-LRA2DKJT.js → context-5VXEWH3G.js} +6 -6
- package/dist/{conversationPersistence-Z4QSI5NB.js → conversationPersistence-INUNJHOV.js} +3 -3
- package/dist/{conversationTracker-B3DMEHMA.js → conversationTracker-H25IOHBE.js} +4 -4
- package/dist/{customCommands-6JZ2VUO2.js → customCommands-7RZHKH2K.js} +4 -4
- package/dist/{env-37ALKFXU.js → env-DPJTGHMP.js} +2 -2
- package/dist/{file-7EOMBX72.js → file-D7W2FBZP.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-3KQG5NEP.js → llm-TOU5REY5.js} +32 -32
- package/dist/{llmLazy-ENEH3KAB.js → llmLazy-HSKKIGLC.js} +1 -1
- package/dist/{loader-D6V3WFL6.js → loader-YUP6OJTJ.js} +4 -4
- package/dist/{lsp-CTPOMI7O.js → lsp-7QKC4DVK.js} +6 -6
- package/dist/{lspAnchor-PPPTHRQH.js → lspAnchor-LCRZ23GA.js} +6 -6
- package/dist/{mcp-6M34WBA5.js → mcp-KK6BOD6I.js} +7 -7
- package/dist/{mentionProcessor-TS4SITI3.js → mentionProcessor-V6JH6HUD.js} +5 -5
- package/dist/{messages-BINU6SYX.js → messages-7NVTXWIJ.js} +1 -1
- package/dist/{model-6IW224UU.js → model-QSDSUJDB.js} +5 -5
- package/dist/{openai-O6CGVMYK.js → openai-JC3KJN3H.js} +5 -5
- package/dist/{outputStyles-7PPMLSV6.js → outputStyles-TPH3CCB4.js} +4 -4
- package/dist/{pluginRuntime-RU5STQ6F.js → pluginRuntime-7EK4LQDD.js} +6 -6
- package/dist/{pluginValidation-JTJTB3TB.js → pluginValidation-BJWCS55I.js} +6 -6
- package/dist/prompts-KQNPPEOG.js +56 -0
- package/dist/{pybAgentSessionLoad-ZXQAHTQS.js → pybAgentSessionLoad-V3IAJJPS.js} +4 -6
- package/dist/{pybAgentSessionResume-R73KFN3V.js → pybAgentSessionResume-WE7ET356.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-N4SMTC64.js → pybAgentStreamJsonSession-VWDYV4XL.js} +1 -1
- package/dist/{pybHooks-NGJ5OFAI.js → pybHooks-UV7BTIVT.js} +4 -4
- package/dist/query-KAZY5LOW.js +54 -0
- package/dist/{registry-FKY6JQ3L.js → registry-FK6UGJPV.js} +5 -5
- package/dist/{ripgrep-O7MOW25M.js → ripgrep-CXJ4DFPU.js} +3 -3
- package/dist/{skillMarketplace-VK3AYR6Q.js → skillMarketplace-QUJXDKZK.js} +3 -3
- package/dist/{state-T57IG35V.js → state-GC3XELIE.js} +2 -2
- package/dist/{theme-ZEFQIPVH.js → theme-24PLJSPD.js} +5 -5
- package/dist/{toolPermissionSettings-ERNXVP7A.js → toolPermissionSettings-S6NJPBKT.js} +6 -6
- package/dist/tools-NC5R4I6F.js +55 -0
- package/dist/{userInput-JBAUBHGI.js → userInput-4VZSNII7.js} +34 -34
- package/package.json +1 -1
- package/dist/REPL-64WF5V7K.js +0 -50
- package/dist/chunk-6UNYL6XK.js.map +0 -7
- package/dist/chunk-BRSPPFSY.js +0 -196
- package/dist/chunk-BRSPPFSY.js.map +0 -7
- package/dist/chunk-N3T2WAYN.js +0 -138
- package/dist/chunk-N3T2WAYN.js.map +0 -7
- package/dist/chunk-TSAURYF2.js +0 -81
- package/dist/chunk-TSAURYF2.js.map +0 -7
- package/dist/cli-RBMZQ5KF.js.map +0 -7
- package/dist/commands-WPHK776A.js +0 -54
- package/dist/prompts-CAPCICF3.js +0 -56
- package/dist/query-CYTIVMQ6.js +0 -54
- package/dist/tools-2XLLIKZM.js +0 -55
- /package/dist/{REPL-64WF5V7K.js.map → REPL-CI5ET6VF.js.map} +0 -0
- /package/dist/{acp-VH2FWCMR.js.map → acp-5G7LPADD.js.map} +0 -0
- /package/dist/{agentsValidate-4E7AHAMS.js.map → agentsValidate-BIRAVXBL.js.map} +0 -0
- /package/dist/{ask-R3YZ5B44.js.map → ask-XQZT6WIO.js.map} +0 -0
- /package/dist/{autoUpdater-DCNAXD4F.js.map → autoUpdater-DDJAJPKA.js.map} +0 -0
- /package/dist/{chunk-GIXE5FJ2.js.map → chunk-2GHNW642.js.map} +0 -0
- /package/dist/{chunk-NRQHLVJJ.js.map → chunk-2SVUNNJB.js.map} +0 -0
- /package/dist/{chunk-H2ZE5QDY.js.map → chunk-4ZZYPG6P.js.map} +0 -0
- /package/dist/{chunk-TBEA6BY3.js.map → chunk-5B7UCAYL.js.map} +0 -0
- /package/dist/{chunk-ZQR3MM2D.js.map → chunk-652OMXEE.js.map} +0 -0
- /package/dist/{chunk-EP62LHB7.js.map → chunk-6QGIRDZS.js.map} +0 -0
- /package/dist/{chunk-BED7SG2Q.js.map → chunk-76BOJQUE.js.map} +0 -0
- /package/dist/{chunk-CSONCQLF.js.map → chunk-A6QEPK5J.js.map} +0 -0
- /package/dist/{chunk-X5LLT4P2.js.map → chunk-ABJT5MG2.js.map} +0 -0
- /package/dist/{chunk-56IL2VXC.js.map → chunk-C2GNLGBM.js.map} +0 -0
- /package/dist/{chunk-2OOER4FR.js.map → chunk-CNMNKSWQ.js.map} +0 -0
- /package/dist/{chunk-QE7PZPHW.js.map → chunk-CT7LWVB7.js.map} +0 -0
- /package/dist/{chunk-25GZITCX.js.map → chunk-GU4XA76N.js.map} +0 -0
- /package/dist/{chunk-VP5A6FKG.js.map → chunk-LBDLSBXN.js.map} +0 -0
- /package/dist/{chunk-SE7UGQCE.js.map → chunk-M7FEUIHO.js.map} +0 -0
- /package/dist/{chunk-HA7FKBZI.js.map → chunk-MMW6MLFR.js.map} +0 -0
- /package/dist/{chunk-XRLMQN3Q.js.map → chunk-MN77HNBB.js.map} +0 -0
- /package/dist/{chunk-VY5KEHU5.js.map → chunk-N7GEPTZB.js.map} +0 -0
- /package/dist/{chunk-MMMMRMOG.js.map → chunk-O7LWCCRJ.js.map} +0 -0
- /package/dist/{chunk-5VO2CFAL.js.map → chunk-PUPDIRI6.js.map} +0 -0
- /package/dist/{chunk-YQ2RQUQF.js.map → chunk-QCI5HPTA.js.map} +0 -0
- /package/dist/{chunk-KMCUZUZG.js.map → chunk-QSMZLK7K.js.map} +0 -0
- /package/dist/{chunk-4ZGZTWMR.js.map → chunk-S65MIABQ.js.map} +0 -0
- /package/dist/{chunk-3UWTN6DM.js.map → chunk-V22PQM4W.js.map} +0 -0
- /package/dist/{chunk-RQ5X6LFM.js.map → chunk-VVXC3SNP.js.map} +0 -0
- /package/dist/{chunk-LRL3MYKR.js.map → chunk-W7VIESST.js.map} +0 -0
- /package/dist/{chunk-CPYDPN2J.js.map → chunk-XEVB4WON.js.map} +0 -0
- /package/dist/{commands-WPHK776A.js.map → commands-4YMZW52K.js.map} +0 -0
- /package/dist/{config-7TO5SQU5.js.map → config-QVH3VNUQ.js.map} +0 -0
- /package/dist/{context-LRA2DKJT.js.map → context-5VXEWH3G.js.map} +0 -0
- /package/dist/{conversationPersistence-Z4QSI5NB.js.map → conversationPersistence-INUNJHOV.js.map} +0 -0
- /package/dist/{conversationTracker-B3DMEHMA.js.map → conversationTracker-H25IOHBE.js.map} +0 -0
- /package/dist/{customCommands-6JZ2VUO2.js.map → customCommands-7RZHKH2K.js.map} +0 -0
- /package/dist/{env-37ALKFXU.js.map → env-DPJTGHMP.js.map} +0 -0
- /package/dist/{file-7EOMBX72.js.map → file-D7W2FBZP.js.map} +0 -0
- /package/dist/{llm-3KQG5NEP.js.map → llm-TOU5REY5.js.map} +0 -0
- /package/dist/{llmLazy-ENEH3KAB.js.map → llmLazy-HSKKIGLC.js.map} +0 -0
- /package/dist/{loader-D6V3WFL6.js.map → loader-YUP6OJTJ.js.map} +0 -0
- /package/dist/{lsp-CTPOMI7O.js.map → lsp-7QKC4DVK.js.map} +0 -0
- /package/dist/{lspAnchor-PPPTHRQH.js.map → lspAnchor-LCRZ23GA.js.map} +0 -0
- /package/dist/{mcp-6M34WBA5.js.map → mcp-KK6BOD6I.js.map} +0 -0
- /package/dist/{mentionProcessor-TS4SITI3.js.map → mentionProcessor-V6JH6HUD.js.map} +0 -0
- /package/dist/{messages-BINU6SYX.js.map → messages-7NVTXWIJ.js.map} +0 -0
- /package/dist/{model-6IW224UU.js.map → model-QSDSUJDB.js.map} +0 -0
- /package/dist/{openai-O6CGVMYK.js.map → openai-JC3KJN3H.js.map} +0 -0
- /package/dist/{outputStyles-7PPMLSV6.js.map → outputStyles-TPH3CCB4.js.map} +0 -0
- /package/dist/{pluginRuntime-RU5STQ6F.js.map → pluginRuntime-7EK4LQDD.js.map} +0 -0
- /package/dist/{pluginValidation-JTJTB3TB.js.map → pluginValidation-BJWCS55I.js.map} +0 -0
- /package/dist/{prompts-CAPCICF3.js.map → prompts-KQNPPEOG.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-ZXQAHTQS.js.map → pybAgentSessionLoad-V3IAJJPS.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-R73KFN3V.js.map → pybAgentSessionResume-WE7ET356.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-N4SMTC64.js.map → pybAgentStreamJsonSession-VWDYV4XL.js.map} +0 -0
- /package/dist/{pybHooks-NGJ5OFAI.js.map → pybHooks-UV7BTIVT.js.map} +0 -0
- /package/dist/{query-CYTIVMQ6.js.map → query-KAZY5LOW.js.map} +0 -0
- /package/dist/{registry-FKY6JQ3L.js.map → registry-FK6UGJPV.js.map} +0 -0
- /package/dist/{ripgrep-O7MOW25M.js.map → ripgrep-CXJ4DFPU.js.map} +0 -0
- /package/dist/{skillMarketplace-VK3AYR6Q.js.map → skillMarketplace-QUJXDKZK.js.map} +0 -0
- /package/dist/{state-T57IG35V.js.map → state-GC3XELIE.js.map} +0 -0
- /package/dist/{theme-ZEFQIPVH.js.map → theme-24PLJSPD.js.map} +0 -0
- /package/dist/{toolPermissionSettings-ERNXVP7A.js.map → toolPermissionSettings-S6NJPBKT.js.map} +0 -0
- /package/dist/{tools-2XLLIKZM.js.map → tools-NC5R4I6F.js.map} +0 -0
- /package/dist/{userInput-JBAUBHGI.js.map → userInput-4VZSNII7.js.map} +0 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
import { createRequire as __pybCreateRequire } from "node:module";
|
|
2
|
+
const require = __pybCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
resolveXdgDataPath
|
|
5
|
+
} from "./chunk-LBDLSBXN.js";
|
|
6
|
+
|
|
7
|
+
// src/utils/session/sessionSqlStore.ts
|
|
8
|
+
import { createRequire } from "node:module";
|
|
9
|
+
import { existsSync, mkdirSync } from "fs";
|
|
10
|
+
import { dirname } from "path";
|
|
11
|
+
|
|
12
|
+
// src/utils/session/sessionStoreConfig.ts
|
|
13
|
+
var cachedFlags = null;
|
|
14
|
+
function parseBooleanFlag(rawValue, defaultValue) {
|
|
15
|
+
const normalized = String(rawValue ?? "").trim().toLowerCase();
|
|
16
|
+
if (!normalized) return defaultValue;
|
|
17
|
+
if (["1", "true", "yes", "on"].includes(normalized)) return true;
|
|
18
|
+
if (["0", "false", "no", "off"].includes(normalized)) return false;
|
|
19
|
+
return defaultValue;
|
|
20
|
+
}
|
|
21
|
+
function getSessionStoreFlags() {
|
|
22
|
+
if (cachedFlags) return cachedFlags;
|
|
23
|
+
cachedFlags = {
|
|
24
|
+
sqlWriteEnabled: parseBooleanFlag(
|
|
25
|
+
process.env.PYB_SESSION_STORE_SQL_WRITE,
|
|
26
|
+
true
|
|
27
|
+
),
|
|
28
|
+
sqlReadEnabled: parseBooleanFlag(process.env.PYB_SESSION_STORE_SQL_READ, true),
|
|
29
|
+
jsonlWriteEnabled: parseBooleanFlag(
|
|
30
|
+
process.env.PYB_SESSION_STORE_JSONL_WRITE,
|
|
31
|
+
false
|
|
32
|
+
)
|
|
33
|
+
};
|
|
34
|
+
return cachedFlags;
|
|
35
|
+
}
|
|
36
|
+
function getSessionStoreDbPath() {
|
|
37
|
+
const override = String(process.env.PYB_SESSION_STORE_DB_PATH ?? "").trim();
|
|
38
|
+
if (override) return override;
|
|
39
|
+
return resolveXdgDataPath("sessions/session-store.db");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/utils/session/sessionStoreSchema.ts
|
|
43
|
+
var SESSION_STORE_SCHEMA_VERSION = 1;
|
|
44
|
+
function applyRuntimePragmas(db) {
|
|
45
|
+
db.exec(`PRAGMA journal_mode=WAL;`);
|
|
46
|
+
db.exec(`PRAGMA synchronous=NORMAL;`);
|
|
47
|
+
db.exec(`PRAGMA busy_timeout=5000;`);
|
|
48
|
+
db.exec(`PRAGMA foreign_keys=ON;`);
|
|
49
|
+
}
|
|
50
|
+
function ensureSessionStoreSchema(db) {
|
|
51
|
+
applyRuntimePragmas(db);
|
|
52
|
+
db.exec(`
|
|
53
|
+
CREATE TABLE IF NOT EXISTS schema_version (
|
|
54
|
+
name TEXT PRIMARY KEY,
|
|
55
|
+
version INTEGER NOT NULL,
|
|
56
|
+
updated_at INTEGER NOT NULL
|
|
57
|
+
);
|
|
58
|
+
`);
|
|
59
|
+
db.exec(`
|
|
60
|
+
CREATE TABLE IF NOT EXISTS session (
|
|
61
|
+
id TEXT PRIMARY KEY,
|
|
62
|
+
cwd TEXT,
|
|
63
|
+
slug TEXT,
|
|
64
|
+
git_branch TEXT,
|
|
65
|
+
user_type TEXT,
|
|
66
|
+
created_at INTEGER NOT NULL,
|
|
67
|
+
updated_at INTEGER NOT NULL
|
|
68
|
+
);
|
|
69
|
+
`);
|
|
70
|
+
db.exec(`
|
|
71
|
+
CREATE TABLE IF NOT EXISTS message (
|
|
72
|
+
uuid TEXT PRIMARY KEY,
|
|
73
|
+
session_id TEXT NOT NULL,
|
|
74
|
+
agent_id TEXT,
|
|
75
|
+
role TEXT NOT NULL,
|
|
76
|
+
parent_uuid TEXT,
|
|
77
|
+
logical_parent_uuid TEXT,
|
|
78
|
+
request_id TEXT,
|
|
79
|
+
is_api_error INTEGER NOT NULL DEFAULT 0,
|
|
80
|
+
time_created INTEGER NOT NULL,
|
|
81
|
+
raw_message_json TEXT NOT NULL,
|
|
82
|
+
updated_at INTEGER NOT NULL,
|
|
83
|
+
FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE
|
|
84
|
+
);
|
|
85
|
+
`);
|
|
86
|
+
db.exec(`
|
|
87
|
+
CREATE TABLE IF NOT EXISTS part (
|
|
88
|
+
id TEXT PRIMARY KEY,
|
|
89
|
+
message_uuid TEXT NOT NULL,
|
|
90
|
+
session_id TEXT NOT NULL,
|
|
91
|
+
part_index INTEGER NOT NULL,
|
|
92
|
+
part_type TEXT NOT NULL,
|
|
93
|
+
raw_part_json TEXT NOT NULL,
|
|
94
|
+
time_created INTEGER NOT NULL,
|
|
95
|
+
updated_at INTEGER NOT NULL,
|
|
96
|
+
FOREIGN KEY(message_uuid) REFERENCES message(uuid) ON DELETE CASCADE,
|
|
97
|
+
FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE
|
|
98
|
+
);
|
|
99
|
+
`);
|
|
100
|
+
db.exec(`
|
|
101
|
+
CREATE TABLE IF NOT EXISTS session_meta_event (
|
|
102
|
+
id TEXT PRIMARY KEY,
|
|
103
|
+
session_id TEXT NOT NULL,
|
|
104
|
+
event_type TEXT NOT NULL,
|
|
105
|
+
payload_json TEXT NOT NULL,
|
|
106
|
+
time_created INTEGER NOT NULL,
|
|
107
|
+
updated_at INTEGER NOT NULL,
|
|
108
|
+
FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE
|
|
109
|
+
);
|
|
110
|
+
`);
|
|
111
|
+
db.exec(`
|
|
112
|
+
CREATE TABLE IF NOT EXISTS session_summary (
|
|
113
|
+
id TEXT PRIMARY KEY,
|
|
114
|
+
session_id TEXT NOT NULL,
|
|
115
|
+
leaf_uuid TEXT,
|
|
116
|
+
summary TEXT NOT NULL,
|
|
117
|
+
time_created INTEGER NOT NULL,
|
|
118
|
+
updated_at INTEGER NOT NULL,
|
|
119
|
+
FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE
|
|
120
|
+
);
|
|
121
|
+
`);
|
|
122
|
+
db.exec(`
|
|
123
|
+
CREATE TABLE IF NOT EXISTS file_history_snapshot (
|
|
124
|
+
id TEXT PRIMARY KEY,
|
|
125
|
+
session_id TEXT NOT NULL,
|
|
126
|
+
message_uuid TEXT,
|
|
127
|
+
snapshot_json TEXT NOT NULL,
|
|
128
|
+
is_update INTEGER NOT NULL DEFAULT 0,
|
|
129
|
+
time_created INTEGER NOT NULL,
|
|
130
|
+
updated_at INTEGER NOT NULL,
|
|
131
|
+
FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE
|
|
132
|
+
);
|
|
133
|
+
`);
|
|
134
|
+
db.exec(`
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_message_session_time_uuid
|
|
136
|
+
ON message(session_id, time_created, uuid);
|
|
137
|
+
`);
|
|
138
|
+
db.exec(`
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_part_session_message_part_index
|
|
140
|
+
ON part(session_id, message_uuid, part_index);
|
|
141
|
+
`);
|
|
142
|
+
db.exec(`
|
|
143
|
+
CREATE INDEX IF NOT EXISTS idx_meta_event_session_time
|
|
144
|
+
ON session_meta_event(session_id, time_created);
|
|
145
|
+
`);
|
|
146
|
+
const now = Date.now();
|
|
147
|
+
db.prepare(
|
|
148
|
+
`
|
|
149
|
+
INSERT INTO schema_version (name, version, updated_at)
|
|
150
|
+
VALUES (?1, ?2, ?3)
|
|
151
|
+
ON CONFLICT(name) DO UPDATE SET
|
|
152
|
+
version = excluded.version,
|
|
153
|
+
updated_at = excluded.updated_at
|
|
154
|
+
`
|
|
155
|
+
).run("session_store", SESSION_STORE_SCHEMA_VERSION, now);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// src/utils/session/sessionSqlStore.ts
|
|
159
|
+
var requireForSqlite = createRequire(import.meta.url);
|
|
160
|
+
var cachedDatabaseCtor;
|
|
161
|
+
function getDatabaseCtor() {
|
|
162
|
+
if (cachedDatabaseCtor !== void 0) return cachedDatabaseCtor;
|
|
163
|
+
try {
|
|
164
|
+
const mod = requireForSqlite("bun:sqlite");
|
|
165
|
+
if (typeof mod?.Database === "function") {
|
|
166
|
+
cachedDatabaseCtor = mod.Database;
|
|
167
|
+
return cachedDatabaseCtor;
|
|
168
|
+
}
|
|
169
|
+
} catch {
|
|
170
|
+
}
|
|
171
|
+
cachedDatabaseCtor = null;
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
function getDatabaseCtorOrThrow() {
|
|
175
|
+
const Database = getDatabaseCtor();
|
|
176
|
+
if (Database) return Database;
|
|
177
|
+
const error = new Error(
|
|
178
|
+
"PYB_SESSION_SQL_UNAVAILABLE: bun:sqlite is unavailable for session store"
|
|
179
|
+
);
|
|
180
|
+
error.code = "PYB_SESSION_SQL_UNAVAILABLE";
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
function asNullableText(value) {
|
|
184
|
+
const text = String(value ?? "").trim();
|
|
185
|
+
return text ? text : null;
|
|
186
|
+
}
|
|
187
|
+
function asRole(value) {
|
|
188
|
+
return value === "assistant" || value === "progress" ? value : "user";
|
|
189
|
+
}
|
|
190
|
+
function createSessionSqlStore(options) {
|
|
191
|
+
const dbFilePath = options?.dbFilePath ?? getSessionStoreDbPath();
|
|
192
|
+
if (!existsSync(dirname(dbFilePath))) {
|
|
193
|
+
mkdirSync(dirname(dbFilePath), { recursive: true });
|
|
194
|
+
}
|
|
195
|
+
const Database = getDatabaseCtorOrThrow();
|
|
196
|
+
const db = new Database(dbFilePath, { create: true });
|
|
197
|
+
ensureSessionStoreSchema(db);
|
|
198
|
+
const upsertSession = db.prepare(`
|
|
199
|
+
INSERT INTO session (id, created_at, updated_at)
|
|
200
|
+
VALUES (?1, ?2, ?3)
|
|
201
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
202
|
+
updated_at = excluded.updated_at
|
|
203
|
+
`);
|
|
204
|
+
const upsertMessage = db.prepare(`
|
|
205
|
+
INSERT INTO message (
|
|
206
|
+
uuid, session_id, agent_id, role, parent_uuid, logical_parent_uuid,
|
|
207
|
+
request_id, is_api_error, time_created, raw_message_json, updated_at
|
|
208
|
+
)
|
|
209
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)
|
|
210
|
+
ON CONFLICT(uuid) DO UPDATE SET
|
|
211
|
+
session_id = excluded.session_id,
|
|
212
|
+
agent_id = excluded.agent_id,
|
|
213
|
+
role = excluded.role,
|
|
214
|
+
parent_uuid = excluded.parent_uuid,
|
|
215
|
+
logical_parent_uuid = excluded.logical_parent_uuid,
|
|
216
|
+
request_id = excluded.request_id,
|
|
217
|
+
is_api_error = excluded.is_api_error,
|
|
218
|
+
time_created = excluded.time_created,
|
|
219
|
+
raw_message_json = excluded.raw_message_json,
|
|
220
|
+
updated_at = excluded.updated_at
|
|
221
|
+
`);
|
|
222
|
+
const upsertPart = db.prepare(`
|
|
223
|
+
INSERT INTO part (
|
|
224
|
+
id, message_uuid, session_id, part_index, part_type, raw_part_json, time_created, updated_at
|
|
225
|
+
)
|
|
226
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)
|
|
227
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
228
|
+
message_uuid = excluded.message_uuid,
|
|
229
|
+
session_id = excluded.session_id,
|
|
230
|
+
part_index = excluded.part_index,
|
|
231
|
+
part_type = excluded.part_type,
|
|
232
|
+
raw_part_json = excluded.raw_part_json,
|
|
233
|
+
time_created = excluded.time_created,
|
|
234
|
+
updated_at = excluded.updated_at
|
|
235
|
+
`);
|
|
236
|
+
const upsertSummary = db.prepare(`
|
|
237
|
+
INSERT INTO session_summary (
|
|
238
|
+
id, session_id, leaf_uuid, summary, time_created, updated_at
|
|
239
|
+
)
|
|
240
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6)
|
|
241
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
242
|
+
session_id = excluded.session_id,
|
|
243
|
+
leaf_uuid = excluded.leaf_uuid,
|
|
244
|
+
summary = excluded.summary,
|
|
245
|
+
time_created = excluded.time_created,
|
|
246
|
+
updated_at = excluded.updated_at
|
|
247
|
+
`);
|
|
248
|
+
const upsertMetaEvent = db.prepare(`
|
|
249
|
+
INSERT INTO session_meta_event (
|
|
250
|
+
id, session_id, event_type, payload_json, time_created, updated_at
|
|
251
|
+
)
|
|
252
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6)
|
|
253
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
254
|
+
session_id = excluded.session_id,
|
|
255
|
+
event_type = excluded.event_type,
|
|
256
|
+
payload_json = excluded.payload_json,
|
|
257
|
+
time_created = excluded.time_created,
|
|
258
|
+
updated_at = excluded.updated_at
|
|
259
|
+
`);
|
|
260
|
+
const upsertFileHistorySnapshot = db.prepare(`
|
|
261
|
+
INSERT INTO file_history_snapshot (
|
|
262
|
+
id, session_id, message_uuid, snapshot_json, is_update, time_created, updated_at
|
|
263
|
+
)
|
|
264
|
+
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)
|
|
265
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
266
|
+
session_id = excluded.session_id,
|
|
267
|
+
message_uuid = excluded.message_uuid,
|
|
268
|
+
snapshot_json = excluded.snapshot_json,
|
|
269
|
+
is_update = excluded.is_update,
|
|
270
|
+
time_created = excluded.time_created,
|
|
271
|
+
updated_at = excluded.updated_at
|
|
272
|
+
`);
|
|
273
|
+
const appendMessages = (messages) => {
|
|
274
|
+
if (!Array.isArray(messages) || messages.length === 0) return 0;
|
|
275
|
+
const now = Date.now();
|
|
276
|
+
const tx = db.transaction((list) => {
|
|
277
|
+
for (const item of list) {
|
|
278
|
+
const sessionId = String(item.sessionId ?? "").trim();
|
|
279
|
+
const uuid = String(item.uuid ?? "").trim();
|
|
280
|
+
if (!sessionId || !uuid) continue;
|
|
281
|
+
const timeCreated = Number(item.timeCreated) || now;
|
|
282
|
+
upsertSession.run(sessionId, timeCreated, now);
|
|
283
|
+
upsertMessage.run(
|
|
284
|
+
uuid,
|
|
285
|
+
sessionId,
|
|
286
|
+
asNullableText(item.agentId),
|
|
287
|
+
asRole(item.role),
|
|
288
|
+
asNullableText(item.parentUuid),
|
|
289
|
+
asNullableText(item.logicalParentUuid),
|
|
290
|
+
asNullableText(item.requestId),
|
|
291
|
+
item.isApiError ? 1 : 0,
|
|
292
|
+
timeCreated,
|
|
293
|
+
JSON.stringify(item.rawMessage ?? {}),
|
|
294
|
+
now
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
tx(messages);
|
|
299
|
+
return messages.length;
|
|
300
|
+
};
|
|
301
|
+
const appendParts = (parts) => {
|
|
302
|
+
if (!Array.isArray(parts) || parts.length === 0) return 0;
|
|
303
|
+
const now = Date.now();
|
|
304
|
+
const tx = db.transaction((list) => {
|
|
305
|
+
for (const item of list) {
|
|
306
|
+
const id = String(item.id ?? "").trim();
|
|
307
|
+
const messageUuid = String(item.messageUuid ?? "").trim();
|
|
308
|
+
const sessionId = String(item.sessionId ?? "").trim();
|
|
309
|
+
if (!id || !messageUuid || !sessionId) continue;
|
|
310
|
+
const timeCreated = Number(item.timeCreated) || now;
|
|
311
|
+
upsertSession.run(sessionId, timeCreated, now);
|
|
312
|
+
upsertPart.run(
|
|
313
|
+
id,
|
|
314
|
+
messageUuid,
|
|
315
|
+
sessionId,
|
|
316
|
+
Number(item.partIndex) || 0,
|
|
317
|
+
String(item.partType ?? "unknown"),
|
|
318
|
+
JSON.stringify(item.rawPart ?? {}),
|
|
319
|
+
timeCreated,
|
|
320
|
+
now
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
tx(parts);
|
|
325
|
+
return parts.length;
|
|
326
|
+
};
|
|
327
|
+
const appendSessionSummaries = (records) => {
|
|
328
|
+
if (!Array.isArray(records) || records.length === 0) return 0;
|
|
329
|
+
const now = Date.now();
|
|
330
|
+
const tx = db.transaction((list) => {
|
|
331
|
+
for (const item of list) {
|
|
332
|
+
const id = String(item.id ?? "").trim();
|
|
333
|
+
const sessionId = String(item.sessionId ?? "").trim();
|
|
334
|
+
if (!id || !sessionId) continue;
|
|
335
|
+
const timeCreated = Number(item.timeCreated) || now;
|
|
336
|
+
upsertSession.run(sessionId, timeCreated, now);
|
|
337
|
+
upsertSummary.run(
|
|
338
|
+
id,
|
|
339
|
+
sessionId,
|
|
340
|
+
asNullableText(item.leafUuid),
|
|
341
|
+
String(item.summary ?? ""),
|
|
342
|
+
timeCreated,
|
|
343
|
+
now
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
tx(records);
|
|
348
|
+
return records.length;
|
|
349
|
+
};
|
|
350
|
+
const appendSessionMetaEvents = (records) => {
|
|
351
|
+
if (!Array.isArray(records) || records.length === 0) return 0;
|
|
352
|
+
const now = Date.now();
|
|
353
|
+
const tx = db.transaction((list) => {
|
|
354
|
+
for (const item of list) {
|
|
355
|
+
const id = String(item.id ?? "").trim();
|
|
356
|
+
const sessionId = String(item.sessionId ?? "").trim();
|
|
357
|
+
if (!id || !sessionId) continue;
|
|
358
|
+
const timeCreated = Number(item.timeCreated) || now;
|
|
359
|
+
upsertSession.run(sessionId, timeCreated, now);
|
|
360
|
+
upsertMetaEvent.run(
|
|
361
|
+
id,
|
|
362
|
+
sessionId,
|
|
363
|
+
String(item.eventType ?? "unknown"),
|
|
364
|
+
JSON.stringify(item.payload ?? {}),
|
|
365
|
+
timeCreated,
|
|
366
|
+
now
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
tx(records);
|
|
371
|
+
return records.length;
|
|
372
|
+
};
|
|
373
|
+
const appendFileHistorySnapshots = (records) => {
|
|
374
|
+
if (!Array.isArray(records) || records.length === 0) return 0;
|
|
375
|
+
const now = Date.now();
|
|
376
|
+
const tx = db.transaction((list) => {
|
|
377
|
+
for (const item of list) {
|
|
378
|
+
const id = String(item.id ?? "").trim();
|
|
379
|
+
const sessionId = String(item.sessionId ?? "").trim();
|
|
380
|
+
if (!id || !sessionId) continue;
|
|
381
|
+
const timeCreated = Number(item.timeCreated) || now;
|
|
382
|
+
upsertSession.run(sessionId, timeCreated, now);
|
|
383
|
+
upsertFileHistorySnapshot.run(
|
|
384
|
+
id,
|
|
385
|
+
sessionId,
|
|
386
|
+
asNullableText(item.messageUuid),
|
|
387
|
+
JSON.stringify(item.snapshot ?? {}),
|
|
388
|
+
item.isSnapshotUpdate ? 1 : 0,
|
|
389
|
+
timeCreated,
|
|
390
|
+
now
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
tx(records);
|
|
395
|
+
return records.length;
|
|
396
|
+
};
|
|
397
|
+
const loadMessages = (sessionId, options2 = {}) => {
|
|
398
|
+
const target = String(sessionId ?? "").trim();
|
|
399
|
+
if (!target) return [];
|
|
400
|
+
const fromTime = Number.isFinite(options2.fromTime) ? Number(options2.fromTime) : null;
|
|
401
|
+
const toTime = Number.isFinite(options2.toTime) ? Number(options2.toTime) : null;
|
|
402
|
+
const rows = db.prepare(
|
|
403
|
+
`
|
|
404
|
+
SELECT
|
|
405
|
+
session_id, uuid, role, time_created, raw_message_json,
|
|
406
|
+
agent_id, parent_uuid, logical_parent_uuid, request_id, is_api_error
|
|
407
|
+
FROM message
|
|
408
|
+
WHERE session_id = ?1
|
|
409
|
+
AND (?2 IS NULL OR time_created >= ?2)
|
|
410
|
+
AND (?3 IS NULL OR time_created <= ?3)
|
|
411
|
+
ORDER BY time_created ASC, uuid ASC
|
|
412
|
+
`
|
|
413
|
+
).all(target, fromTime, toTime);
|
|
414
|
+
return rows.map((row) => ({
|
|
415
|
+
sessionId: String(row.session_id),
|
|
416
|
+
uuid: String(row.uuid),
|
|
417
|
+
role: asRole(row.role),
|
|
418
|
+
timeCreated: Number(row.time_created) || 0,
|
|
419
|
+
rawMessage: JSON.parse(String(row.raw_message_json ?? "{}")),
|
|
420
|
+
agentId: asNullableText(row.agent_id),
|
|
421
|
+
parentUuid: asNullableText(row.parent_uuid),
|
|
422
|
+
logicalParentUuid: asNullableText(row.logical_parent_uuid),
|
|
423
|
+
requestId: asNullableText(row.request_id),
|
|
424
|
+
isApiError: Number(row.is_api_error ?? 0) > 0
|
|
425
|
+
}));
|
|
426
|
+
};
|
|
427
|
+
const loadSessionSummaries = (sessionId) => {
|
|
428
|
+
const target = String(sessionId ?? "").trim();
|
|
429
|
+
if (!target) return [];
|
|
430
|
+
const rows = db.prepare(
|
|
431
|
+
`
|
|
432
|
+
SELECT session_id, leaf_uuid, summary, time_created
|
|
433
|
+
FROM session_summary
|
|
434
|
+
WHERE session_id = ?1
|
|
435
|
+
ORDER BY time_created ASC, id ASC
|
|
436
|
+
`
|
|
437
|
+
).all(target);
|
|
438
|
+
return rows.map((row) => ({
|
|
439
|
+
sessionId: String(row.session_id),
|
|
440
|
+
leafUuid: asNullableText(row.leaf_uuid),
|
|
441
|
+
summary: String(row.summary ?? ""),
|
|
442
|
+
timeCreated: Number(row.time_created) || 0
|
|
443
|
+
}));
|
|
444
|
+
};
|
|
445
|
+
const loadSessionMetaEvents = (sessionId) => {
|
|
446
|
+
const target = String(sessionId ?? "").trim();
|
|
447
|
+
if (!target) return [];
|
|
448
|
+
const rows = db.prepare(
|
|
449
|
+
`
|
|
450
|
+
SELECT session_id, event_type, payload_json, time_created
|
|
451
|
+
FROM session_meta_event
|
|
452
|
+
WHERE session_id = ?1
|
|
453
|
+
ORDER BY time_created ASC, id ASC
|
|
454
|
+
`
|
|
455
|
+
).all(target);
|
|
456
|
+
return rows.map((row) => ({
|
|
457
|
+
sessionId: String(row.session_id),
|
|
458
|
+
eventType: String(row.event_type ?? ""),
|
|
459
|
+
payload: JSON.parse(String(row.payload_json ?? "{}")),
|
|
460
|
+
timeCreated: Number(row.time_created) || 0
|
|
461
|
+
}));
|
|
462
|
+
};
|
|
463
|
+
const loadFileHistorySnapshots = (sessionId) => {
|
|
464
|
+
const target = String(sessionId ?? "").trim();
|
|
465
|
+
if (!target) return [];
|
|
466
|
+
const rows = db.prepare(
|
|
467
|
+
`
|
|
468
|
+
SELECT session_id, message_uuid, snapshot_json, is_update, time_created
|
|
469
|
+
FROM file_history_snapshot
|
|
470
|
+
WHERE session_id = ?1
|
|
471
|
+
ORDER BY time_created ASC, id ASC
|
|
472
|
+
`
|
|
473
|
+
).all(target);
|
|
474
|
+
return rows.map((row) => ({
|
|
475
|
+
sessionId: String(row.session_id),
|
|
476
|
+
messageUuid: asNullableText(row.message_uuid),
|
|
477
|
+
snapshot: JSON.parse(String(row.snapshot_json ?? "{}")),
|
|
478
|
+
isSnapshotUpdate: Number(row.is_update ?? 0) > 0,
|
|
479
|
+
timeCreated: Number(row.time_created) || 0
|
|
480
|
+
}));
|
|
481
|
+
};
|
|
482
|
+
const findLatestSessionId = () => {
|
|
483
|
+
const row = db.prepare(
|
|
484
|
+
`
|
|
485
|
+
SELECT session_id
|
|
486
|
+
FROM message
|
|
487
|
+
ORDER BY time_created DESC, uuid DESC
|
|
488
|
+
LIMIT 1
|
|
489
|
+
`
|
|
490
|
+
).get();
|
|
491
|
+
return asNullableText(row?.session_id);
|
|
492
|
+
};
|
|
493
|
+
const close = () => {
|
|
494
|
+
db.close();
|
|
495
|
+
};
|
|
496
|
+
return {
|
|
497
|
+
appendMessages,
|
|
498
|
+
appendParts,
|
|
499
|
+
appendSessionSummaries,
|
|
500
|
+
appendSessionMetaEvents,
|
|
501
|
+
appendFileHistorySnapshots,
|
|
502
|
+
loadSessionSummaries,
|
|
503
|
+
loadSessionMetaEvents,
|
|
504
|
+
loadFileHistorySnapshots,
|
|
505
|
+
loadMessages,
|
|
506
|
+
findLatestSessionId,
|
|
507
|
+
close
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
export {
|
|
512
|
+
getSessionStoreFlags,
|
|
513
|
+
getSessionStoreDbPath,
|
|
514
|
+
createSessionSqlStore
|
|
515
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/session/sessionSqlStore.ts", "../src/utils/session/sessionStoreConfig.ts", "../src/utils/session/sessionStoreSchema.ts"],
|
|
4
|
+
"sourcesContent": ["import { createRequire } from 'node:module'\nimport { existsSync, mkdirSync } from 'fs'\nimport { dirname } from 'path'\nimport type {\n SessionStoreLoadedFileHistorySnapshot,\n SessionStoreLoadedMetaEvent,\n SessionStoreLoadedSummary,\n SessionStore,\n SessionStoreAppendFileHistorySnapshotInput,\n SessionStoreAppendMessageInput,\n SessionStoreAppendMetaEventInput,\n SessionStoreAppendPartInput,\n SessionStoreAppendSummaryInput,\n SessionStoreLoadOptions,\n SessionStoreLoadedMessage,\n} from './sessionStore'\nimport { getSessionStoreDbPath } from './sessionStoreConfig'\nimport { ensureSessionStoreSchema } from './sessionStoreSchema'\n\ntype BunSqliteDatabase = any\ntype BunSqliteDatabaseCtor = new (\n filePath: string,\n options?: { create?: boolean },\n) => BunSqliteDatabase\n\nconst requireForSqlite = createRequire(import.meta.url)\nlet cachedDatabaseCtor: BunSqliteDatabaseCtor | null | undefined\n\nfunction getDatabaseCtor(): BunSqliteDatabaseCtor | null {\n if (cachedDatabaseCtor !== undefined) return cachedDatabaseCtor\n try {\n const mod = requireForSqlite('bun:sqlite') as {\n Database?: BunSqliteDatabaseCtor\n }\n if (typeof mod?.Database === 'function') {\n cachedDatabaseCtor = mod.Database\n return cachedDatabaseCtor\n }\n } catch {}\n cachedDatabaseCtor = null\n return null\n}\n\nfunction getDatabaseCtorOrThrow(): BunSqliteDatabaseCtor {\n const Database = getDatabaseCtor()\n if (Database) return Database\n const error = new Error(\n 'PYB_SESSION_SQL_UNAVAILABLE: bun:sqlite is unavailable for session store',\n ) as Error & { code?: string }\n error.code = 'PYB_SESSION_SQL_UNAVAILABLE'\n throw error\n}\n\nfunction asNullableText(value: unknown): string | null {\n const text = String(value ?? '').trim()\n return text ? text : null\n}\n\nfunction asRole(value: unknown): 'user' | 'assistant' | 'progress' {\n return value === 'assistant' || value === 'progress' ? value : 'user'\n}\n\nexport function createSessionSqlStore(options?: { dbFilePath?: string }): SessionStore {\n const dbFilePath = options?.dbFilePath ?? getSessionStoreDbPath()\n if (!existsSync(dirname(dbFilePath))) {\n mkdirSync(dirname(dbFilePath), { recursive: true })\n }\n const Database = getDatabaseCtorOrThrow()\n const db = new Database(dbFilePath, { create: true })\n ensureSessionStoreSchema(db)\n const upsertSession = db.prepare(`\n INSERT INTO session (id, created_at, updated_at)\n VALUES (?1, ?2, ?3)\n ON CONFLICT(id) DO UPDATE SET\n updated_at = excluded.updated_at\n `)\n const upsertMessage = db.prepare(`\n INSERT INTO message (\n uuid, session_id, agent_id, role, parent_uuid, logical_parent_uuid,\n request_id, is_api_error, time_created, raw_message_json, updated_at\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)\n ON CONFLICT(uuid) DO UPDATE SET\n session_id = excluded.session_id,\n agent_id = excluded.agent_id,\n role = excluded.role,\n parent_uuid = excluded.parent_uuid,\n logical_parent_uuid = excluded.logical_parent_uuid,\n request_id = excluded.request_id,\n is_api_error = excluded.is_api_error,\n time_created = excluded.time_created,\n raw_message_json = excluded.raw_message_json,\n updated_at = excluded.updated_at\n `)\n const upsertPart = db.prepare(`\n INSERT INTO part (\n id, message_uuid, session_id, part_index, part_type, raw_part_json, time_created, updated_at\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)\n ON CONFLICT(id) DO UPDATE SET\n message_uuid = excluded.message_uuid,\n session_id = excluded.session_id,\n part_index = excluded.part_index,\n part_type = excluded.part_type,\n raw_part_json = excluded.raw_part_json,\n time_created = excluded.time_created,\n updated_at = excluded.updated_at\n `)\n const upsertSummary = db.prepare(`\n INSERT INTO session_summary (\n id, session_id, leaf_uuid, summary, time_created, updated_at\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6)\n ON CONFLICT(id) DO UPDATE SET\n session_id = excluded.session_id,\n leaf_uuid = excluded.leaf_uuid,\n summary = excluded.summary,\n time_created = excluded.time_created,\n updated_at = excluded.updated_at\n `)\n const upsertMetaEvent = db.prepare(`\n INSERT INTO session_meta_event (\n id, session_id, event_type, payload_json, time_created, updated_at\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6)\n ON CONFLICT(id) DO UPDATE SET\n session_id = excluded.session_id,\n event_type = excluded.event_type,\n payload_json = excluded.payload_json,\n time_created = excluded.time_created,\n updated_at = excluded.updated_at\n `)\n const upsertFileHistorySnapshot = db.prepare(`\n INSERT INTO file_history_snapshot (\n id, session_id, message_uuid, snapshot_json, is_update, time_created, updated_at\n )\n VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)\n ON CONFLICT(id) DO UPDATE SET\n session_id = excluded.session_id,\n message_uuid = excluded.message_uuid,\n snapshot_json = excluded.snapshot_json,\n is_update = excluded.is_update,\n time_created = excluded.time_created,\n updated_at = excluded.updated_at\n `)\n const appendMessages = (messages: SessionStoreAppendMessageInput[]) => {\n if (!Array.isArray(messages) || messages.length === 0) return 0\n const now = Date.now()\n const tx = db.transaction((list: SessionStoreAppendMessageInput[]) => {\n for (const item of list) {\n const sessionId = String(item.sessionId ?? '').trim()\n const uuid = String(item.uuid ?? '').trim()\n if (!sessionId || !uuid) continue\n const timeCreated = Number(item.timeCreated) || now\n upsertSession.run(sessionId, timeCreated, now)\n upsertMessage.run(\n uuid,\n sessionId,\n asNullableText(item.agentId),\n asRole(item.role),\n asNullableText(item.parentUuid),\n asNullableText(item.logicalParentUuid),\n asNullableText(item.requestId),\n item.isApiError ? 1 : 0,\n timeCreated,\n JSON.stringify(item.rawMessage ?? {}),\n now,\n )\n }\n })\n tx(messages)\n return messages.length\n }\n const appendParts = (parts: SessionStoreAppendPartInput[]) => {\n if (!Array.isArray(parts) || parts.length === 0) return 0\n const now = Date.now()\n const tx = db.transaction((list: SessionStoreAppendPartInput[]) => {\n for (const item of list) {\n const id = String(item.id ?? '').trim()\n const messageUuid = String(item.messageUuid ?? '').trim()\n const sessionId = String(item.sessionId ?? '').trim()\n if (!id || !messageUuid || !sessionId) continue\n const timeCreated = Number(item.timeCreated) || now\n upsertSession.run(sessionId, timeCreated, now)\n upsertPart.run(\n id,\n messageUuid,\n sessionId,\n Number(item.partIndex) || 0,\n String(item.partType ?? 'unknown'),\n JSON.stringify(item.rawPart ?? {}),\n timeCreated,\n now,\n )\n }\n })\n tx(parts)\n return parts.length\n }\n const appendSessionSummaries = (records: SessionStoreAppendSummaryInput[]) => {\n if (!Array.isArray(records) || records.length === 0) return 0\n const now = Date.now()\n const tx = db.transaction((list: SessionStoreAppendSummaryInput[]) => {\n for (const item of list) {\n const id = String(item.id ?? '').trim()\n const sessionId = String(item.sessionId ?? '').trim()\n if (!id || !sessionId) continue\n const timeCreated = Number(item.timeCreated) || now\n upsertSession.run(sessionId, timeCreated, now)\n upsertSummary.run(\n id,\n sessionId,\n asNullableText(item.leafUuid),\n String(item.summary ?? ''),\n timeCreated,\n now,\n )\n }\n })\n tx(records)\n return records.length\n }\n const appendSessionMetaEvents = (records: SessionStoreAppendMetaEventInput[]) => {\n if (!Array.isArray(records) || records.length === 0) return 0\n const now = Date.now()\n const tx = db.transaction((list: SessionStoreAppendMetaEventInput[]) => {\n for (const item of list) {\n const id = String(item.id ?? '').trim()\n const sessionId = String(item.sessionId ?? '').trim()\n if (!id || !sessionId) continue\n const timeCreated = Number(item.timeCreated) || now\n upsertSession.run(sessionId, timeCreated, now)\n upsertMetaEvent.run(\n id,\n sessionId,\n String(item.eventType ?? 'unknown'),\n JSON.stringify(item.payload ?? {}),\n timeCreated,\n now,\n )\n }\n })\n tx(records)\n return records.length\n }\n const appendFileHistorySnapshots = (\n records: SessionStoreAppendFileHistorySnapshotInput[],\n ) => {\n if (!Array.isArray(records) || records.length === 0) return 0\n const now = Date.now()\n const tx = db.transaction((list: SessionStoreAppendFileHistorySnapshotInput[]) => {\n for (const item of list) {\n const id = String(item.id ?? '').trim()\n const sessionId = String(item.sessionId ?? '').trim()\n if (!id || !sessionId) continue\n const timeCreated = Number(item.timeCreated) || now\n upsertSession.run(sessionId, timeCreated, now)\n upsertFileHistorySnapshot.run(\n id,\n sessionId,\n asNullableText(item.messageUuid),\n JSON.stringify(item.snapshot ?? {}),\n item.isSnapshotUpdate ? 1 : 0,\n timeCreated,\n now,\n )\n }\n })\n tx(records)\n return records.length\n }\n const loadMessages = (\n sessionId: string,\n options: SessionStoreLoadOptions = {},\n ): SessionStoreLoadedMessage[] => {\n const target = String(sessionId ?? '').trim()\n if (!target) return []\n const fromTime = Number.isFinite(options.fromTime) ? Number(options.fromTime) : null\n const toTime = Number.isFinite(options.toTime) ? Number(options.toTime) : null\n const rows = db\n .prepare(\n `\n SELECT\n session_id, uuid, role, time_created, raw_message_json,\n agent_id, parent_uuid, logical_parent_uuid, request_id, is_api_error\n FROM message\n WHERE session_id = ?1\n AND (?2 IS NULL OR time_created >= ?2)\n AND (?3 IS NULL OR time_created <= ?3)\n ORDER BY time_created ASC, uuid ASC\n `,\n )\n .all(target, fromTime, toTime) as Array<Record<string, any>>\n return rows.map(row => ({\n sessionId: String(row.session_id),\n uuid: String(row.uuid),\n role: asRole(row.role),\n timeCreated: Number(row.time_created) || 0,\n rawMessage: JSON.parse(String(row.raw_message_json ?? '{}')),\n agentId: asNullableText(row.agent_id),\n parentUuid: asNullableText(row.parent_uuid),\n logicalParentUuid: asNullableText(row.logical_parent_uuid),\n requestId: asNullableText(row.request_id),\n isApiError: Number(row.is_api_error ?? 0) > 0,\n }))\n }\n const loadSessionSummaries = (sessionId: string): SessionStoreLoadedSummary[] => {\n const target = String(sessionId ?? '').trim()\n if (!target) return []\n const rows = db\n .prepare(\n `\n SELECT session_id, leaf_uuid, summary, time_created\n FROM session_summary\n WHERE session_id = ?1\n ORDER BY time_created ASC, id ASC\n `,\n )\n .all(target) as Array<Record<string, any>>\n return rows.map(row => ({\n sessionId: String(row.session_id),\n leafUuid: asNullableText(row.leaf_uuid),\n summary: String(row.summary ?? ''),\n timeCreated: Number(row.time_created) || 0,\n }))\n }\n const loadSessionMetaEvents = (sessionId: string): SessionStoreLoadedMetaEvent[] => {\n const target = String(sessionId ?? '').trim()\n if (!target) return []\n const rows = db\n .prepare(\n `\n SELECT session_id, event_type, payload_json, time_created\n FROM session_meta_event\n WHERE session_id = ?1\n ORDER BY time_created ASC, id ASC\n `,\n )\n .all(target) as Array<Record<string, any>>\n return rows.map(row => ({\n sessionId: String(row.session_id),\n eventType: String(row.event_type ?? ''),\n payload: JSON.parse(String(row.payload_json ?? '{}')),\n timeCreated: Number(row.time_created) || 0,\n }))\n }\n const loadFileHistorySnapshots = (\n sessionId: string,\n ): SessionStoreLoadedFileHistorySnapshot[] => {\n const target = String(sessionId ?? '').trim()\n if (!target) return []\n const rows = db\n .prepare(\n `\n SELECT session_id, message_uuid, snapshot_json, is_update, time_created\n FROM file_history_snapshot\n WHERE session_id = ?1\n ORDER BY time_created ASC, id ASC\n `,\n )\n .all(target) as Array<Record<string, any>>\n return rows.map(row => ({\n sessionId: String(row.session_id),\n messageUuid: asNullableText(row.message_uuid),\n snapshot: JSON.parse(String(row.snapshot_json ?? '{}')),\n isSnapshotUpdate: Number(row.is_update ?? 0) > 0,\n timeCreated: Number(row.time_created) || 0,\n }))\n }\n const findLatestSessionId = (): string | null => {\n const row = db\n .prepare(\n `\n SELECT session_id\n FROM message\n ORDER BY time_created DESC, uuid DESC\n LIMIT 1\n `,\n )\n .get() as { session_id?: string } | null\n return asNullableText(row?.session_id)\n }\n const close = () => {\n db.close()\n }\n return {\n appendMessages,\n appendParts,\n appendSessionSummaries,\n appendSessionMetaEvents,\n appendFileHistorySnapshots,\n loadSessionSummaries,\n loadSessionMetaEvents,\n loadFileHistorySnapshots,\n loadMessages,\n findLatestSessionId,\n close,\n }\n}\n", "import { resolveXdgDataPath } from '@utils/config/env'\n\nexport type SessionStoreFlags = {\n sqlWriteEnabled: boolean\n sqlReadEnabled: boolean\n jsonlWriteEnabled: boolean\n}\n\nlet cachedFlags: SessionStoreFlags | null = null\n\nfunction parseBooleanFlag(\n rawValue: string | undefined,\n defaultValue: boolean,\n): boolean {\n const normalized = String(rawValue ?? '')\n .trim()\n .toLowerCase()\n if (!normalized) return defaultValue\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n return defaultValue\n}\n\nexport function getSessionStoreFlags(): SessionStoreFlags {\n if (cachedFlags) return cachedFlags\n cachedFlags = {\n sqlWriteEnabled: parseBooleanFlag(\n process.env.PYB_SESSION_STORE_SQL_WRITE,\n true,\n ),\n sqlReadEnabled: parseBooleanFlag(process.env.PYB_SESSION_STORE_SQL_READ, true),\n jsonlWriteEnabled: parseBooleanFlag(\n process.env.PYB_SESSION_STORE_JSONL_WRITE,\n false,\n ),\n }\n return cachedFlags\n}\n\nexport function getSessionStoreDbPath(): string {\n const override = String(process.env.PYB_SESSION_STORE_DB_PATH ?? '').trim()\n if (override) return override\n return resolveXdgDataPath('sessions/session-store.db')\n}\n\nexport function resetSessionStoreFlagsForTest() {\n cachedFlags = null\n}\n", "type BunSqliteDatabase = any\n\nexport const SESSION_STORE_SCHEMA_VERSION = 1\n\nfunction applyRuntimePragmas(db: BunSqliteDatabase) {\n db.exec(`PRAGMA journal_mode=WAL;`)\n db.exec(`PRAGMA synchronous=NORMAL;`)\n db.exec(`PRAGMA busy_timeout=5000;`)\n db.exec(`PRAGMA foreign_keys=ON;`)\n}\n\nexport function ensureSessionStoreSchema(db: BunSqliteDatabase) {\n applyRuntimePragmas(db)\n db.exec(`\n CREATE TABLE IF NOT EXISTS schema_version (\n name TEXT PRIMARY KEY,\n version INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n `)\n db.exec(`\n CREATE TABLE IF NOT EXISTS session (\n id TEXT PRIMARY KEY,\n cwd TEXT,\n slug TEXT,\n git_branch TEXT,\n user_type TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n `)\n db.exec(`\n CREATE TABLE IF NOT EXISTS message (\n uuid TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n agent_id TEXT,\n role TEXT NOT NULL,\n parent_uuid TEXT,\n logical_parent_uuid TEXT,\n request_id TEXT,\n is_api_error INTEGER NOT NULL DEFAULT 0,\n time_created INTEGER NOT NULL,\n raw_message_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE\n );\n `)\n db.exec(`\n CREATE TABLE IF NOT EXISTS part (\n id TEXT PRIMARY KEY,\n message_uuid TEXT NOT NULL,\n session_id TEXT NOT NULL,\n part_index INTEGER NOT NULL,\n part_type TEXT NOT NULL,\n raw_part_json TEXT NOT NULL,\n time_created INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY(message_uuid) REFERENCES message(uuid) ON DELETE CASCADE,\n FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE\n );\n `)\n db.exec(`\n CREATE TABLE IF NOT EXISTS session_meta_event (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n event_type TEXT NOT NULL,\n payload_json TEXT NOT NULL,\n time_created INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE\n );\n `)\n db.exec(`\n CREATE TABLE IF NOT EXISTS session_summary (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n leaf_uuid TEXT,\n summary TEXT NOT NULL,\n time_created INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE\n );\n `)\n db.exec(`\n CREATE TABLE IF NOT EXISTS file_history_snapshot (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n message_uuid TEXT,\n snapshot_json TEXT NOT NULL,\n is_update INTEGER NOT NULL DEFAULT 0,\n time_created INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY(session_id) REFERENCES session(id) ON DELETE CASCADE\n );\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_message_session_time_uuid\n ON message(session_id, time_created, uuid);\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_part_session_message_part_index\n ON part(session_id, message_uuid, part_index);\n `)\n db.exec(`\n CREATE INDEX IF NOT EXISTS idx_meta_event_session_time\n ON session_meta_event(session_id, time_created);\n `)\n const now = Date.now()\n db.prepare(\n `\n INSERT INTO schema_version (name, version, updated_at)\n VALUES (?1, ?2, ?3)\n ON CONFLICT(name) DO UPDATE SET\n version = excluded.version,\n updated_at = excluded.updated_at\n `,\n ).run('session_store', SESSION_STORE_SCHEMA_VERSION, now)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["options"]
|
|
7
|
+
}
|
|
@@ -3,13 +3,13 @@ const require = __pybCreateRequire(import.meta.url);
|
|
|
3
3
|
import {
|
|
4
4
|
getGlobalConfig,
|
|
5
5
|
saveGlobalConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-V22PQM4W.js";
|
|
7
7
|
import {
|
|
8
8
|
debug
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-5B7UCAYL.js";
|
|
10
10
|
import {
|
|
11
11
|
logError
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-LBDLSBXN.js";
|
|
13
13
|
|
|
14
14
|
// src/utils/model/index.ts
|
|
15
15
|
import { memoize } from "lodash-es";
|