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.
Files changed (163) hide show
  1. package/dist/REPL-CI5ET6VF.js +50 -0
  2. package/dist/{acp-VH2FWCMR.js → acp-5G7LPADD.js} +32 -32
  3. package/dist/{agentsValidate-4E7AHAMS.js → agentsValidate-BIRAVXBL.js} +7 -7
  4. package/dist/{ask-R3YZ5B44.js → ask-XQZT6WIO.js} +31 -31
  5. package/dist/{autoUpdater-DCNAXD4F.js → autoUpdater-DDJAJPKA.js} +3 -3
  6. package/dist/{chunk-GIXE5FJ2.js → chunk-2GHNW642.js} +1 -1
  7. package/dist/{chunk-NRQHLVJJ.js → chunk-2SVUNNJB.js} +2 -2
  8. package/dist/{chunk-6UNYL6XK.js → chunk-3CC7QXCN.js} +222 -75
  9. package/dist/chunk-3CC7QXCN.js.map +7 -0
  10. package/dist/{chunk-H2ZE5QDY.js → chunk-4ZZYPG6P.js} +4 -4
  11. package/dist/{chunk-TBEA6BY3.js → chunk-5B7UCAYL.js} +1 -1
  12. package/dist/{chunk-ZQR3MM2D.js → chunk-652OMXEE.js} +2 -2
  13. package/dist/{chunk-EP62LHB7.js → chunk-6QGIRDZS.js} +1 -1
  14. package/dist/{chunk-BED7SG2Q.js → chunk-76BOJQUE.js} +1 -1
  15. package/dist/{chunk-TXZ5UTGP.js → chunk-7SYDIES4.js} +1 -1
  16. package/dist/{chunk-TXZ5UTGP.js.map → chunk-7SYDIES4.js.map} +1 -1
  17. package/dist/{chunk-CSONCQLF.js → chunk-A6QEPK5J.js} +2 -2
  18. package/dist/{chunk-X5LLT4P2.js → chunk-ABJT5MG2.js} +1 -1
  19. package/dist/{chunk-56IL2VXC.js → chunk-C2GNLGBM.js} +1 -1
  20. package/dist/{chunk-2OOER4FR.js → chunk-CNMNKSWQ.js} +3 -3
  21. package/dist/{chunk-QE7PZPHW.js → chunk-CT7LWVB7.js} +1 -1
  22. package/dist/{chunk-P5NTGZ5H.js → chunk-CZZKRPE2.js} +1 -1
  23. package/dist/{chunk-P5NTGZ5H.js.map → chunk-CZZKRPE2.js.map} +1 -1
  24. package/dist/chunk-G5MP72ZL.js +515 -0
  25. package/dist/chunk-G5MP72ZL.js.map +7 -0
  26. package/dist/{chunk-25GZITCX.js → chunk-GU4XA76N.js} +3 -3
  27. package/dist/chunk-KQZAS4DO.js +582 -0
  28. package/dist/chunk-KQZAS4DO.js.map +7 -0
  29. package/dist/{chunk-VP5A6FKG.js → chunk-LBDLSBXN.js} +4 -1
  30. package/dist/{chunk-SE7UGQCE.js → chunk-M7FEUIHO.js} +2 -2
  31. package/dist/{chunk-HA7FKBZI.js → chunk-MMW6MLFR.js} +2 -2
  32. package/dist/{chunk-XRLMQN3Q.js → chunk-MN77HNBB.js} +4 -4
  33. package/dist/{chunk-VY5KEHU5.js → chunk-N7GEPTZB.js} +3 -3
  34. package/dist/{chunk-MMMMRMOG.js → chunk-O7LWCCRJ.js} +3 -3
  35. package/dist/{chunk-5VO2CFAL.js → chunk-PUPDIRI6.js} +2 -2
  36. package/dist/{chunk-YQ2RQUQF.js → chunk-QCI5HPTA.js} +1 -1
  37. package/dist/{chunk-KMCUZUZG.js → chunk-QSMZLK7K.js} +3 -3
  38. package/dist/{chunk-4ZGZTWMR.js → chunk-S65MIABQ.js} +4 -4
  39. package/dist/{chunk-3UWTN6DM.js → chunk-V22PQM4W.js} +3 -3
  40. package/dist/{chunk-RQ5X6LFM.js → chunk-VVXC3SNP.js} +4 -4
  41. package/dist/{chunk-LRL3MYKR.js → chunk-W7VIESST.js} +3 -3
  42. package/dist/{chunk-CPYDPN2J.js → chunk-XEVB4WON.js} +15 -15
  43. package/dist/chunk-ZB3ZWD2K.js +96 -0
  44. package/dist/chunk-ZB3ZWD2K.js.map +7 -0
  45. package/dist/{cli-RBMZQ5KF.js → cli-YIANCHDD.js} +130 -103
  46. package/dist/cli-YIANCHDD.js.map +7 -0
  47. package/dist/commands-4YMZW52K.js +54 -0
  48. package/dist/{config-7TO5SQU5.js → config-QVH3VNUQ.js} +4 -4
  49. package/dist/{context-LRA2DKJT.js → context-5VXEWH3G.js} +6 -6
  50. package/dist/{conversationPersistence-Z4QSI5NB.js → conversationPersistence-INUNJHOV.js} +3 -3
  51. package/dist/{conversationTracker-B3DMEHMA.js → conversationTracker-H25IOHBE.js} +4 -4
  52. package/dist/{customCommands-6JZ2VUO2.js → customCommands-7RZHKH2K.js} +4 -4
  53. package/dist/{env-37ALKFXU.js → env-DPJTGHMP.js} +2 -2
  54. package/dist/{file-7EOMBX72.js → file-D7W2FBZP.js} +4 -4
  55. package/dist/index.js +3 -3
  56. package/dist/{llm-3KQG5NEP.js → llm-TOU5REY5.js} +32 -32
  57. package/dist/{llmLazy-ENEH3KAB.js → llmLazy-HSKKIGLC.js} +1 -1
  58. package/dist/{loader-D6V3WFL6.js → loader-YUP6OJTJ.js} +4 -4
  59. package/dist/{lsp-CTPOMI7O.js → lsp-7QKC4DVK.js} +6 -6
  60. package/dist/{lspAnchor-PPPTHRQH.js → lspAnchor-LCRZ23GA.js} +6 -6
  61. package/dist/{mcp-6M34WBA5.js → mcp-KK6BOD6I.js} +7 -7
  62. package/dist/{mentionProcessor-TS4SITI3.js → mentionProcessor-V6JH6HUD.js} +5 -5
  63. package/dist/{messages-BINU6SYX.js → messages-7NVTXWIJ.js} +1 -1
  64. package/dist/{model-6IW224UU.js → model-QSDSUJDB.js} +5 -5
  65. package/dist/{openai-O6CGVMYK.js → openai-JC3KJN3H.js} +5 -5
  66. package/dist/{outputStyles-7PPMLSV6.js → outputStyles-TPH3CCB4.js} +4 -4
  67. package/dist/{pluginRuntime-RU5STQ6F.js → pluginRuntime-7EK4LQDD.js} +6 -6
  68. package/dist/{pluginValidation-JTJTB3TB.js → pluginValidation-BJWCS55I.js} +6 -6
  69. package/dist/prompts-KQNPPEOG.js +56 -0
  70. package/dist/{pybAgentSessionLoad-ZXQAHTQS.js → pybAgentSessionLoad-V3IAJJPS.js} +4 -6
  71. package/dist/{pybAgentSessionResume-R73KFN3V.js → pybAgentSessionResume-WE7ET356.js} +4 -4
  72. package/dist/{pybAgentStreamJsonSession-N4SMTC64.js → pybAgentStreamJsonSession-VWDYV4XL.js} +1 -1
  73. package/dist/{pybHooks-NGJ5OFAI.js → pybHooks-UV7BTIVT.js} +4 -4
  74. package/dist/query-KAZY5LOW.js +54 -0
  75. package/dist/{registry-FKY6JQ3L.js → registry-FK6UGJPV.js} +5 -5
  76. package/dist/{ripgrep-O7MOW25M.js → ripgrep-CXJ4DFPU.js} +3 -3
  77. package/dist/{skillMarketplace-VK3AYR6Q.js → skillMarketplace-QUJXDKZK.js} +3 -3
  78. package/dist/{state-T57IG35V.js → state-GC3XELIE.js} +2 -2
  79. package/dist/{theme-ZEFQIPVH.js → theme-24PLJSPD.js} +5 -5
  80. package/dist/{toolPermissionSettings-ERNXVP7A.js → toolPermissionSettings-S6NJPBKT.js} +6 -6
  81. package/dist/tools-NC5R4I6F.js +55 -0
  82. package/dist/{userInput-JBAUBHGI.js → userInput-4VZSNII7.js} +34 -34
  83. package/package.json +1 -1
  84. package/dist/REPL-64WF5V7K.js +0 -50
  85. package/dist/chunk-6UNYL6XK.js.map +0 -7
  86. package/dist/chunk-BRSPPFSY.js +0 -196
  87. package/dist/chunk-BRSPPFSY.js.map +0 -7
  88. package/dist/chunk-N3T2WAYN.js +0 -138
  89. package/dist/chunk-N3T2WAYN.js.map +0 -7
  90. package/dist/chunk-TSAURYF2.js +0 -81
  91. package/dist/chunk-TSAURYF2.js.map +0 -7
  92. package/dist/cli-RBMZQ5KF.js.map +0 -7
  93. package/dist/commands-WPHK776A.js +0 -54
  94. package/dist/prompts-CAPCICF3.js +0 -56
  95. package/dist/query-CYTIVMQ6.js +0 -54
  96. package/dist/tools-2XLLIKZM.js +0 -55
  97. /package/dist/{REPL-64WF5V7K.js.map → REPL-CI5ET6VF.js.map} +0 -0
  98. /package/dist/{acp-VH2FWCMR.js.map → acp-5G7LPADD.js.map} +0 -0
  99. /package/dist/{agentsValidate-4E7AHAMS.js.map → agentsValidate-BIRAVXBL.js.map} +0 -0
  100. /package/dist/{ask-R3YZ5B44.js.map → ask-XQZT6WIO.js.map} +0 -0
  101. /package/dist/{autoUpdater-DCNAXD4F.js.map → autoUpdater-DDJAJPKA.js.map} +0 -0
  102. /package/dist/{chunk-GIXE5FJ2.js.map → chunk-2GHNW642.js.map} +0 -0
  103. /package/dist/{chunk-NRQHLVJJ.js.map → chunk-2SVUNNJB.js.map} +0 -0
  104. /package/dist/{chunk-H2ZE5QDY.js.map → chunk-4ZZYPG6P.js.map} +0 -0
  105. /package/dist/{chunk-TBEA6BY3.js.map → chunk-5B7UCAYL.js.map} +0 -0
  106. /package/dist/{chunk-ZQR3MM2D.js.map → chunk-652OMXEE.js.map} +0 -0
  107. /package/dist/{chunk-EP62LHB7.js.map → chunk-6QGIRDZS.js.map} +0 -0
  108. /package/dist/{chunk-BED7SG2Q.js.map → chunk-76BOJQUE.js.map} +0 -0
  109. /package/dist/{chunk-CSONCQLF.js.map → chunk-A6QEPK5J.js.map} +0 -0
  110. /package/dist/{chunk-X5LLT4P2.js.map → chunk-ABJT5MG2.js.map} +0 -0
  111. /package/dist/{chunk-56IL2VXC.js.map → chunk-C2GNLGBM.js.map} +0 -0
  112. /package/dist/{chunk-2OOER4FR.js.map → chunk-CNMNKSWQ.js.map} +0 -0
  113. /package/dist/{chunk-QE7PZPHW.js.map → chunk-CT7LWVB7.js.map} +0 -0
  114. /package/dist/{chunk-25GZITCX.js.map → chunk-GU4XA76N.js.map} +0 -0
  115. /package/dist/{chunk-VP5A6FKG.js.map → chunk-LBDLSBXN.js.map} +0 -0
  116. /package/dist/{chunk-SE7UGQCE.js.map → chunk-M7FEUIHO.js.map} +0 -0
  117. /package/dist/{chunk-HA7FKBZI.js.map → chunk-MMW6MLFR.js.map} +0 -0
  118. /package/dist/{chunk-XRLMQN3Q.js.map → chunk-MN77HNBB.js.map} +0 -0
  119. /package/dist/{chunk-VY5KEHU5.js.map → chunk-N7GEPTZB.js.map} +0 -0
  120. /package/dist/{chunk-MMMMRMOG.js.map → chunk-O7LWCCRJ.js.map} +0 -0
  121. /package/dist/{chunk-5VO2CFAL.js.map → chunk-PUPDIRI6.js.map} +0 -0
  122. /package/dist/{chunk-YQ2RQUQF.js.map → chunk-QCI5HPTA.js.map} +0 -0
  123. /package/dist/{chunk-KMCUZUZG.js.map → chunk-QSMZLK7K.js.map} +0 -0
  124. /package/dist/{chunk-4ZGZTWMR.js.map → chunk-S65MIABQ.js.map} +0 -0
  125. /package/dist/{chunk-3UWTN6DM.js.map → chunk-V22PQM4W.js.map} +0 -0
  126. /package/dist/{chunk-RQ5X6LFM.js.map → chunk-VVXC3SNP.js.map} +0 -0
  127. /package/dist/{chunk-LRL3MYKR.js.map → chunk-W7VIESST.js.map} +0 -0
  128. /package/dist/{chunk-CPYDPN2J.js.map → chunk-XEVB4WON.js.map} +0 -0
  129. /package/dist/{commands-WPHK776A.js.map → commands-4YMZW52K.js.map} +0 -0
  130. /package/dist/{config-7TO5SQU5.js.map → config-QVH3VNUQ.js.map} +0 -0
  131. /package/dist/{context-LRA2DKJT.js.map → context-5VXEWH3G.js.map} +0 -0
  132. /package/dist/{conversationPersistence-Z4QSI5NB.js.map → conversationPersistence-INUNJHOV.js.map} +0 -0
  133. /package/dist/{conversationTracker-B3DMEHMA.js.map → conversationTracker-H25IOHBE.js.map} +0 -0
  134. /package/dist/{customCommands-6JZ2VUO2.js.map → customCommands-7RZHKH2K.js.map} +0 -0
  135. /package/dist/{env-37ALKFXU.js.map → env-DPJTGHMP.js.map} +0 -0
  136. /package/dist/{file-7EOMBX72.js.map → file-D7W2FBZP.js.map} +0 -0
  137. /package/dist/{llm-3KQG5NEP.js.map → llm-TOU5REY5.js.map} +0 -0
  138. /package/dist/{llmLazy-ENEH3KAB.js.map → llmLazy-HSKKIGLC.js.map} +0 -0
  139. /package/dist/{loader-D6V3WFL6.js.map → loader-YUP6OJTJ.js.map} +0 -0
  140. /package/dist/{lsp-CTPOMI7O.js.map → lsp-7QKC4DVK.js.map} +0 -0
  141. /package/dist/{lspAnchor-PPPTHRQH.js.map → lspAnchor-LCRZ23GA.js.map} +0 -0
  142. /package/dist/{mcp-6M34WBA5.js.map → mcp-KK6BOD6I.js.map} +0 -0
  143. /package/dist/{mentionProcessor-TS4SITI3.js.map → mentionProcessor-V6JH6HUD.js.map} +0 -0
  144. /package/dist/{messages-BINU6SYX.js.map → messages-7NVTXWIJ.js.map} +0 -0
  145. /package/dist/{model-6IW224UU.js.map → model-QSDSUJDB.js.map} +0 -0
  146. /package/dist/{openai-O6CGVMYK.js.map → openai-JC3KJN3H.js.map} +0 -0
  147. /package/dist/{outputStyles-7PPMLSV6.js.map → outputStyles-TPH3CCB4.js.map} +0 -0
  148. /package/dist/{pluginRuntime-RU5STQ6F.js.map → pluginRuntime-7EK4LQDD.js.map} +0 -0
  149. /package/dist/{pluginValidation-JTJTB3TB.js.map → pluginValidation-BJWCS55I.js.map} +0 -0
  150. /package/dist/{prompts-CAPCICF3.js.map → prompts-KQNPPEOG.js.map} +0 -0
  151. /package/dist/{pybAgentSessionLoad-ZXQAHTQS.js.map → pybAgentSessionLoad-V3IAJJPS.js.map} +0 -0
  152. /package/dist/{pybAgentSessionResume-R73KFN3V.js.map → pybAgentSessionResume-WE7ET356.js.map} +0 -0
  153. /package/dist/{pybAgentStreamJsonSession-N4SMTC64.js.map → pybAgentStreamJsonSession-VWDYV4XL.js.map} +0 -0
  154. /package/dist/{pybHooks-NGJ5OFAI.js.map → pybHooks-UV7BTIVT.js.map} +0 -0
  155. /package/dist/{query-CYTIVMQ6.js.map → query-KAZY5LOW.js.map} +0 -0
  156. /package/dist/{registry-FKY6JQ3L.js.map → registry-FK6UGJPV.js.map} +0 -0
  157. /package/dist/{ripgrep-O7MOW25M.js.map → ripgrep-CXJ4DFPU.js.map} +0 -0
  158. /package/dist/{skillMarketplace-VK3AYR6Q.js.map → skillMarketplace-QUJXDKZK.js.map} +0 -0
  159. /package/dist/{state-T57IG35V.js.map → state-GC3XELIE.js.map} +0 -0
  160. /package/dist/{theme-ZEFQIPVH.js.map → theme-24PLJSPD.js.map} +0 -0
  161. /package/dist/{toolPermissionSettings-ERNXVP7A.js.map → toolPermissionSettings-S6NJPBKT.js.map} +0 -0
  162. /package/dist/{tools-2XLLIKZM.js.map → tools-NC5R4I6F.js.map} +0 -0
  163. /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": ";;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,YAAY,iBAAiB;AACtC,SAAS,eAAe;;;ACMxB,IAAI,cAAwC;AAE5C,SAAS,iBACP,UACA,cACS;AACT,QAAM,aAAa,OAAO,YAAY,EAAE,EACrC,KAAK,EACL,YAAY;AACf,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,UAAU,EAAG,QAAO;AAC5D,MAAI,CAAC,KAAK,SAAS,MAAM,KAAK,EAAE,SAAS,UAAU,EAAG,QAAO;AAC7D,SAAO;AACT;AAEO,SAAS,uBAA0C;AACxD,MAAI,YAAa,QAAO;AACxB,gBAAc;AAAA,IACZ,iBAAiB;AAAA,MACf,QAAQ,IAAI;AAAA,MACZ;AAAA,IACF;AAAA,IACA,gBAAgB,iBAAiB,QAAQ,IAAI,4BAA4B,IAAI;AAAA,IAC7E,mBAAmB;AAAA,MACjB,QAAQ,IAAI;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,wBAAgC;AAC9C,QAAM,WAAW,OAAO,QAAQ,IAAI,6BAA6B,EAAE,EAAE,KAAK;AAC1E,MAAI,SAAU,QAAO;AACrB,SAAO,mBAAmB,2BAA2B;AACvD;;;ACzCO,IAAM,+BAA+B;AAE5C,SAAS,oBAAoB,IAAuB;AAClD,KAAG,KAAK,0BAA0B;AAClC,KAAG,KAAK,4BAA4B;AACpC,KAAG,KAAK,2BAA2B;AACnC,KAAG,KAAK,yBAAyB;AACnC;AAEO,SAAS,yBAAyB,IAAuB;AAC9D,sBAAoB,EAAE;AACtB,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAUP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAeP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAaP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAUP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAUP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA,GAGP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA,GAGP;AACD,KAAG,KAAK;AAAA;AAAA;AAAA,GAGP;AACD,QAAM,MAAM,KAAK,IAAI;AACrB,KAAG;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,EAAE,IAAI,iBAAiB,8BAA8B,GAAG;AAC1D;;;AF5FA,IAAM,mBAAmB,cAAc,YAAY,GAAG;AACtD,IAAI;AAEJ,SAAS,kBAAgD;AACvD,MAAI,uBAAuB,OAAW,QAAO;AAC7C,MAAI;AACF,UAAM,MAAM,iBAAiB,YAAY;AAGzC,QAAI,OAAO,KAAK,aAAa,YAAY;AACvC,2BAAqB,IAAI;AACzB,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,uBAAqB;AACrB,SAAO;AACT;AAEA,SAAS,yBAAgD;AACvD,QAAM,WAAW,gBAAgB;AACjC,MAAI,SAAU,QAAO;AACrB,QAAM,QAAQ,IAAI;AAAA,IAChB;AAAA,EACF;AACA,QAAM,OAAO;AACb,QAAM;AACR;AAEA,SAAS,eAAe,OAA+B;AACrD,QAAM,OAAO,OAAO,SAAS,EAAE,EAAE,KAAK;AACtC,SAAO,OAAO,OAAO;AACvB;AAEA,SAAS,OAAO,OAAmD;AACjE,SAAO,UAAU,eAAe,UAAU,aAAa,QAAQ;AACjE;AAEO,SAAS,sBAAsB,SAAiD;AACrF,QAAM,aAAa,SAAS,cAAc,sBAAsB;AAChE,MAAI,CAAC,WAAW,QAAQ,UAAU,CAAC,GAAG;AACpC,cAAU,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EACpD;AACA,QAAM,WAAW,uBAAuB;AACxC,QAAM,KAAK,IAAI,SAAS,YAAY,EAAE,QAAQ,KAAK,CAAC;AACpD,2BAAyB,EAAE;AAC3B,QAAM,gBAAgB,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,GAKhC;AACD,QAAM,gBAAgB,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAiBhC;AACD,QAAM,aAAa,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAa7B;AACD,QAAM,gBAAgB,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWhC;AACD,QAAM,kBAAkB,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAWlC;AACD,QAAM,4BAA4B,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAY5C;AACD,QAAM,iBAAiB,CAAC,aAA+C;AACrE,QAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,EAAG,QAAO;AAC9D,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,KAAK,GAAG,YAAY,CAAC,SAA2C;AACpE,iBAAW,QAAQ,MAAM;AACvB,cAAM,YAAY,OAAO,KAAK,aAAa,EAAE,EAAE,KAAK;AACpD,cAAM,OAAO,OAAO,KAAK,QAAQ,EAAE,EAAE,KAAK;AAC1C,YAAI,CAAC,aAAa,CAAC,KAAM;AACzB,cAAM,cAAc,OAAO,KAAK,WAAW,KAAK;AAChD,sBAAc,IAAI,WAAW,aAAa,GAAG;AAC7C,sBAAc;AAAA,UACZ;AAAA,UACA;AAAA,UACA,eAAe,KAAK,OAAO;AAAA,UAC3B,OAAO,KAAK,IAAI;AAAA,UAChB,eAAe,KAAK,UAAU;AAAA,UAC9B,eAAe,KAAK,iBAAiB;AAAA,UACrC,eAAe,KAAK,SAAS;AAAA,UAC7B,KAAK,aAAa,IAAI;AAAA,UACtB;AAAA,UACA,KAAK,UAAU,KAAK,cAAc,CAAC,CAAC;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,OAAG,QAAQ;AACX,WAAO,SAAS;AAAA,EAClB;AACA,QAAM,cAAc,CAAC,UAAyC;AAC5D,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG,QAAO;AACxD,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,KAAK,GAAG,YAAY,CAAC,SAAwC;AACjE,iBAAW,QAAQ,MAAM;AACvB,cAAM,KAAK,OAAO,KAAK,MAAM,EAAE,EAAE,KAAK;AACtC,cAAM,cAAc,OAAO,KAAK,eAAe,EAAE,EAAE,KAAK;AACxD,cAAM,YAAY,OAAO,KAAK,aAAa,EAAE,EAAE,KAAK;AACpD,YAAI,CAAC,MAAM,CAAC,eAAe,CAAC,UAAW;AACvC,cAAM,cAAc,OAAO,KAAK,WAAW,KAAK;AAChD,sBAAc,IAAI,WAAW,aAAa,GAAG;AAC7C,mBAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,KAAK,SAAS,KAAK;AAAA,UAC1B,OAAO,KAAK,YAAY,SAAS;AAAA,UACjC,KAAK,UAAU,KAAK,WAAW,CAAC,CAAC;AAAA,UACjC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,OAAG,KAAK;AACR,WAAO,MAAM;AAAA,EACf;AACA,QAAM,yBAAyB,CAAC,YAA8C;AAC5E,QAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,KAAK,GAAG,YAAY,CAAC,SAA2C;AACpE,iBAAW,QAAQ,MAAM;AACvB,cAAM,KAAK,OAAO,KAAK,MAAM,EAAE,EAAE,KAAK;AACtC,cAAM,YAAY,OAAO,KAAK,aAAa,EAAE,EAAE,KAAK;AACpD,YAAI,CAAC,MAAM,CAAC,UAAW;AACvB,cAAM,cAAc,OAAO,KAAK,WAAW,KAAK;AAChD,sBAAc,IAAI,WAAW,aAAa,GAAG;AAC7C,sBAAc;AAAA,UACZ;AAAA,UACA;AAAA,UACA,eAAe,KAAK,QAAQ;AAAA,UAC5B,OAAO,KAAK,WAAW,EAAE;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,OAAG,OAAO;AACV,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,0BAA0B,CAAC,YAAgD;AAC/E,QAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,KAAK,GAAG,YAAY,CAAC,SAA6C;AACtE,iBAAW,QAAQ,MAAM;AACvB,cAAM,KAAK,OAAO,KAAK,MAAM,EAAE,EAAE,KAAK;AACtC,cAAM,YAAY,OAAO,KAAK,aAAa,EAAE,EAAE,KAAK;AACpD,YAAI,CAAC,MAAM,CAAC,UAAW;AACvB,cAAM,cAAc,OAAO,KAAK,WAAW,KAAK;AAChD,sBAAc,IAAI,WAAW,aAAa,GAAG;AAC7C,wBAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACA,OAAO,KAAK,aAAa,SAAS;AAAA,UAClC,KAAK,UAAU,KAAK,WAAW,CAAC,CAAC;AAAA,UACjC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,OAAG,OAAO;AACV,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,6BAA6B,CACjC,YACG;AACH,QAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,KAAK,GAAG,YAAY,CAAC,SAAuD;AAChF,iBAAW,QAAQ,MAAM;AACvB,cAAM,KAAK,OAAO,KAAK,MAAM,EAAE,EAAE,KAAK;AACtC,cAAM,YAAY,OAAO,KAAK,aAAa,EAAE,EAAE,KAAK;AACpD,YAAI,CAAC,MAAM,CAAC,UAAW;AACvB,cAAM,cAAc,OAAO,KAAK,WAAW,KAAK;AAChD,sBAAc,IAAI,WAAW,aAAa,GAAG;AAC7C,kCAA0B;AAAA,UACxB;AAAA,UACA;AAAA,UACA,eAAe,KAAK,WAAW;AAAA,UAC/B,KAAK,UAAU,KAAK,YAAY,CAAC,CAAC;AAAA,UAClC,KAAK,mBAAmB,IAAI;AAAA,UAC5B;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,OAAG,OAAO;AACV,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,eAAe,CACnB,WACAA,WAAmC,CAAC,MACJ;AAChC,UAAM,SAAS,OAAO,aAAa,EAAE,EAAE,KAAK;AAC5C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,WAAW,OAAO,SAASA,SAAQ,QAAQ,IAAI,OAAOA,SAAQ,QAAQ,IAAI;AAChF,UAAM,SAAS,OAAO,SAASA,SAAQ,MAAM,IAAI,OAAOA,SAAQ,MAAM,IAAI;AAC1E,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUF,EACC,IAAI,QAAQ,UAAU,MAAM;AAC/B,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,MAAM,OAAO,IAAI,IAAI;AAAA,MACrB,MAAM,OAAO,IAAI,IAAI;AAAA,MACrB,aAAa,OAAO,IAAI,YAAY,KAAK;AAAA,MACzC,YAAY,KAAK,MAAM,OAAO,IAAI,oBAAoB,IAAI,CAAC;AAAA,MAC3D,SAAS,eAAe,IAAI,QAAQ;AAAA,MACpC,YAAY,eAAe,IAAI,WAAW;AAAA,MAC1C,mBAAmB,eAAe,IAAI,mBAAmB;AAAA,MACzD,WAAW,eAAe,IAAI,UAAU;AAAA,MACxC,YAAY,OAAO,IAAI,gBAAgB,CAAC,IAAI;AAAA,IAC9C,EAAE;AAAA,EACJ;AACA,QAAM,uBAAuB,CAAC,cAAmD;AAC/E,UAAM,SAAS,OAAO,aAAa,EAAE,EAAE,KAAK;AAC5C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMF,EACC,IAAI,MAAM;AACb,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,UAAU,eAAe,IAAI,SAAS;AAAA,MACtC,SAAS,OAAO,IAAI,WAAW,EAAE;AAAA,MACjC,aAAa,OAAO,IAAI,YAAY,KAAK;AAAA,IAC3C,EAAE;AAAA,EACJ;AACA,QAAM,wBAAwB,CAAC,cAAqD;AAClF,UAAM,SAAS,OAAO,aAAa,EAAE,EAAE,KAAK;AAC5C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMF,EACC,IAAI,MAAM;AACb,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,WAAW,OAAO,IAAI,cAAc,EAAE;AAAA,MACtC,SAAS,KAAK,MAAM,OAAO,IAAI,gBAAgB,IAAI,CAAC;AAAA,MACpD,aAAa,OAAO,IAAI,YAAY,KAAK;AAAA,IAC3C,EAAE;AAAA,EACJ;AACA,QAAM,2BAA2B,CAC/B,cAC4C;AAC5C,UAAM,SAAS,OAAO,aAAa,EAAE,EAAE,KAAK;AAC5C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,OAAO,GACV;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMF,EACC,IAAI,MAAM;AACb,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,aAAa,eAAe,IAAI,YAAY;AAAA,MAC5C,UAAU,KAAK,MAAM,OAAO,IAAI,iBAAiB,IAAI,CAAC;AAAA,MACtD,kBAAkB,OAAO,IAAI,aAAa,CAAC,IAAI;AAAA,MAC/C,aAAa,OAAO,IAAI,YAAY,KAAK;AAAA,IAC3C,EAAE;AAAA,EACJ;AACA,QAAM,sBAAsB,MAAqB;AAC/C,UAAM,MAAM,GACT;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMF,EACC,IAAI;AACP,WAAO,eAAe,KAAK,UAAU;AAAA,EACvC;AACA,QAAM,QAAQ,MAAM;AAClB,OAAG,MAAM;AAAA,EACX;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;",
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-3UWTN6DM.js";
6
+ } from "./chunk-V22PQM4W.js";
7
7
  import {
8
8
  debug
9
- } from "./chunk-TBEA6BY3.js";
9
+ } from "./chunk-5B7UCAYL.js";
10
10
  import {
11
11
  logError
12
- } from "./chunk-VP5A6FKG.js";
12
+ } from "./chunk-LBDLSBXN.js";
13
13
 
14
14
  // src/utils/model/index.ts
15
15
  import { memoize } from "lodash-es";