@lossless-claude/lcm 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/.claude-plugin/commands/lcm-compact.md +31 -0
  2. package/.claude-plugin/commands/lcm-curate.md +31 -0
  3. package/.claude-plugin/commands/lcm-diagnose.md +29 -0
  4. package/.claude-plugin/commands/lcm-doctor.md +23 -0
  5. package/.claude-plugin/commands/lcm-dogfood.md +101 -0
  6. package/.claude-plugin/commands/lcm-import.md +48 -0
  7. package/.claude-plugin/commands/lcm-promote.md +29 -0
  8. package/.claude-plugin/commands/lcm-sensitive.md +55 -0
  9. package/.claude-plugin/commands/lcm-stats.md +19 -0
  10. package/.claude-plugin/commands/lcm-status.md +27 -0
  11. package/.claude-plugin/hooks/README.md +47 -0
  12. package/.claude-plugin/marketplace.json +20 -0
  13. package/.claude-plugin/mcp.mjs +12 -0
  14. package/.claude-plugin/plugin.json +46 -0
  15. package/.claude-plugin/skills/lcm-context/SKILL.md +107 -0
  16. package/.claude-plugin/skills/lcm-dogfood/SKILL.md +102 -0
  17. package/.claude-plugin/skills/lcm-dogfood/references/checks.md +239 -0
  18. package/.claude-plugin/skills/lcm-dogfood/references/known-issues.md +11 -0
  19. package/.claude-plugin/skills/lcm-dogfood/scripts/db-integrity.js +40 -0
  20. package/.claude-plugin/skills/lcm-dogfood/scripts/prompt-search-test.js +35 -0
  21. package/.claude-plugin/skills/lcm-e2e/SKILL.md +61 -0
  22. package/.claude-plugin/skills/lcm-e2e/checklist.md +367 -0
  23. package/.claude-plugin/skills/lossless-claude-upgrade/SKILL.md +47 -0
  24. package/LICENSE +21 -0
  25. package/README.md +231 -0
  26. package/dist/bin/lcm.d.ts +2 -0
  27. package/dist/bin/lcm.js +461 -0
  28. package/dist/bin/lcm.js.map +1 -0
  29. package/dist/installer/dry-run-deps.d.ts +23 -0
  30. package/dist/installer/dry-run-deps.js +66 -0
  31. package/dist/installer/dry-run-deps.js.map +1 -0
  32. package/dist/installer/install.d.ts +39 -0
  33. package/dist/installer/install.js +236 -0
  34. package/dist/installer/install.js.map +1 -0
  35. package/dist/installer/uninstall.d.ts +11 -0
  36. package/dist/installer/uninstall.js +80 -0
  37. package/dist/installer/uninstall.js.map +1 -0
  38. package/dist/src/batch-compact.d.ts +16 -0
  39. package/dist/src/batch-compact.js +121 -0
  40. package/dist/src/batch-compact.js.map +1 -0
  41. package/dist/src/compaction.d.ts +198 -0
  42. package/dist/src/compaction.js +964 -0
  43. package/dist/src/compaction.js.map +1 -0
  44. package/dist/src/connectors/constants.d.ts +5 -0
  45. package/dist/src/connectors/constants.js +6 -0
  46. package/dist/src/connectors/constants.js.map +1 -0
  47. package/dist/src/connectors/installer.d.ts +16 -0
  48. package/dist/src/connectors/installer.js +200 -0
  49. package/dist/src/connectors/installer.js.map +1 -0
  50. package/dist/src/connectors/registry.d.ts +4 -0
  51. package/dist/src/connectors/registry.js +264 -0
  52. package/dist/src/connectors/registry.js.map +1 -0
  53. package/dist/src/connectors/template-service.d.ts +5 -0
  54. package/dist/src/connectors/template-service.js +54 -0
  55. package/dist/src/connectors/template-service.js.map +1 -0
  56. package/dist/src/connectors/templates/base.md +1 -0
  57. package/dist/src/connectors/templates/mcp-base.md +1 -0
  58. package/dist/src/connectors/templates/sections/command-reference.md +15 -0
  59. package/dist/src/connectors/templates/sections/mcp-workflow.md +18 -0
  60. package/dist/src/connectors/templates/sections/workflow.md +29 -0
  61. package/dist/src/connectors/templates/skill/SKILL.md +74 -0
  62. package/dist/src/connectors/types.d.ts +19 -0
  63. package/dist/src/connectors/types.js +10 -0
  64. package/dist/src/connectors/types.js.map +1 -0
  65. package/dist/src/daemon/client.d.ts +9 -0
  66. package/dist/src/daemon/client.js +28 -0
  67. package/dist/src/daemon/client.js.map +1 -0
  68. package/dist/src/daemon/config.d.ts +48 -0
  69. package/dist/src/daemon/config.js +67 -0
  70. package/dist/src/daemon/config.js.map +1 -0
  71. package/dist/src/daemon/lifecycle.d.ts +19 -0
  72. package/dist/src/daemon/lifecycle.js +102 -0
  73. package/dist/src/daemon/lifecycle.js.map +1 -0
  74. package/dist/src/daemon/orientation.d.ts +1 -0
  75. package/dist/src/daemon/orientation.js +9 -0
  76. package/dist/src/daemon/orientation.js.map +1 -0
  77. package/dist/src/daemon/project-queue.d.ts +1 -0
  78. package/dist/src/daemon/project-queue.js +17 -0
  79. package/dist/src/daemon/project-queue.js.map +1 -0
  80. package/dist/src/daemon/project.d.ts +7 -0
  81. package/dist/src/daemon/project.js +25 -0
  82. package/dist/src/daemon/project.js.map +1 -0
  83. package/dist/src/daemon/proxy-manager.d.ts +21 -0
  84. package/dist/src/daemon/proxy-manager.js +205 -0
  85. package/dist/src/daemon/proxy-manager.js.map +1 -0
  86. package/dist/src/daemon/routes/compact.d.ts +13 -0
  87. package/dist/src/daemon/routes/compact.js +195 -0
  88. package/dist/src/daemon/routes/compact.js.map +1 -0
  89. package/dist/src/daemon/routes/describe.d.ts +3 -0
  90. package/dist/src/daemon/routes/describe.js +39 -0
  91. package/dist/src/daemon/routes/describe.js.map +1 -0
  92. package/dist/src/daemon/routes/expand.d.ts +3 -0
  93. package/dist/src/daemon/routes/expand.js +41 -0
  94. package/dist/src/daemon/routes/expand.js.map +1 -0
  95. package/dist/src/daemon/routes/grep.d.ts +3 -0
  96. package/dist/src/daemon/routes/grep.js +43 -0
  97. package/dist/src/daemon/routes/grep.js.map +1 -0
  98. package/dist/src/daemon/routes/ingest.d.ts +3 -0
  99. package/dist/src/daemon/routes/ingest.js +101 -0
  100. package/dist/src/daemon/routes/ingest.js.map +1 -0
  101. package/dist/src/daemon/routes/promote.d.ts +4 -0
  102. package/dist/src/daemon/routes/promote.js +104 -0
  103. package/dist/src/daemon/routes/promote.js.map +1 -0
  104. package/dist/src/daemon/routes/prompt-search.d.ts +3 -0
  105. package/dist/src/daemon/routes/prompt-search.js +65 -0
  106. package/dist/src/daemon/routes/prompt-search.js.map +1 -0
  107. package/dist/src/daemon/routes/recent.d.ts +3 -0
  108. package/dist/src/daemon/routes/recent.js +37 -0
  109. package/dist/src/daemon/routes/recent.js.map +1 -0
  110. package/dist/src/daemon/routes/restore.d.ts +3 -0
  111. package/dist/src/daemon/routes/restore.js +120 -0
  112. package/dist/src/daemon/routes/restore.js.map +1 -0
  113. package/dist/src/daemon/routes/search.d.ts +2 -0
  114. package/dist/src/daemon/routes/search.js +66 -0
  115. package/dist/src/daemon/routes/search.js.map +1 -0
  116. package/dist/src/daemon/routes/status.d.ts +3 -0
  117. package/dist/src/daemon/routes/status.js +80 -0
  118. package/dist/src/daemon/routes/status.js.map +1 -0
  119. package/dist/src/daemon/routes/store.d.ts +2 -0
  120. package/dist/src/daemon/routes/store.js +46 -0
  121. package/dist/src/daemon/routes/store.js.map +1 -0
  122. package/dist/src/daemon/server.d.ts +19 -0
  123. package/dist/src/daemon/server.js +183 -0
  124. package/dist/src/daemon/server.js.map +1 -0
  125. package/dist/src/daemon/summarizer.d.ts +11 -0
  126. package/dist/src/daemon/summarizer.js +51 -0
  127. package/dist/src/daemon/summarizer.js.map +1 -0
  128. package/dist/src/db/config.d.ts +31 -0
  129. package/dist/src/db/config.js +83 -0
  130. package/dist/src/db/config.js.map +1 -0
  131. package/dist/src/db/connection.d.ts +3 -0
  132. package/dist/src/db/connection.js +62 -0
  133. package/dist/src/db/connection.js.map +1 -0
  134. package/dist/src/db/features.d.ts +11 -0
  135. package/dist/src/db/features.js +36 -0
  136. package/dist/src/db/features.js.map +1 -0
  137. package/dist/src/db/migration.d.ts +4 -0
  138. package/dist/src/db/migration.js +499 -0
  139. package/dist/src/db/migration.js.map +1 -0
  140. package/dist/src/db/promoted.d.ts +47 -0
  141. package/dist/src/db/promoted.js +96 -0
  142. package/dist/src/db/promoted.js.map +1 -0
  143. package/dist/src/db/redaction-stats.d.ts +6 -0
  144. package/dist/src/db/redaction-stats.js +16 -0
  145. package/dist/src/db/redaction-stats.js.map +1 -0
  146. package/dist/src/diagnose.d.ts +39 -0
  147. package/dist/src/diagnose.js +432 -0
  148. package/dist/src/diagnose.js.map +1 -0
  149. package/dist/src/doctor/doctor.d.ts +4 -0
  150. package/dist/src/doctor/doctor.js +378 -0
  151. package/dist/src/doctor/doctor.js.map +1 -0
  152. package/dist/src/doctor/types.d.ts +24 -0
  153. package/dist/src/doctor/types.js +2 -0
  154. package/dist/src/doctor/types.js.map +1 -0
  155. package/dist/src/expansion.d.ts +100 -0
  156. package/dist/src/expansion.js +268 -0
  157. package/dist/src/expansion.js.map +1 -0
  158. package/dist/src/hooks/auto-heal.d.ts +12 -0
  159. package/dist/src/hooks/auto-heal.js +49 -0
  160. package/dist/src/hooks/auto-heal.js.map +1 -0
  161. package/dist/src/hooks/compact.d.ts +5 -0
  162. package/dist/src/hooks/compact.js +22 -0
  163. package/dist/src/hooks/compact.js.map +1 -0
  164. package/dist/src/hooks/dispatch.d.ts +7 -0
  165. package/dist/src/hooks/dispatch.js +36 -0
  166. package/dist/src/hooks/dispatch.js.map +1 -0
  167. package/dist/src/hooks/probe-precompact.d.ts +2 -0
  168. package/dist/src/hooks/probe-precompact.js +17 -0
  169. package/dist/src/hooks/probe-precompact.js.map +1 -0
  170. package/dist/src/hooks/probe-sessionstart.d.ts +2 -0
  171. package/dist/src/hooks/probe-sessionstart.js +18 -0
  172. package/dist/src/hooks/probe-sessionstart.js.map +1 -0
  173. package/dist/src/hooks/restore.d.ts +5 -0
  174. package/dist/src/hooks/restore.js +19 -0
  175. package/dist/src/hooks/restore.js.map +1 -0
  176. package/dist/src/hooks/session-end.d.ts +16 -0
  177. package/dist/src/hooks/session-end.js +73 -0
  178. package/dist/src/hooks/session-end.js.map +1 -0
  179. package/dist/src/hooks/user-prompt.d.ts +5 -0
  180. package/dist/src/hooks/user-prompt.js +31 -0
  181. package/dist/src/hooks/user-prompt.js.map +1 -0
  182. package/dist/src/import.d.ts +24 -0
  183. package/dist/src/import.js +119 -0
  184. package/dist/src/import.js.map +1 -0
  185. package/dist/src/large-files.d.ts +28 -0
  186. package/dist/src/large-files.js +413 -0
  187. package/dist/src/large-files.js.map +1 -0
  188. package/dist/src/llm/anthropic.d.ts +9 -0
  189. package/dist/src/llm/anthropic.js +54 -0
  190. package/dist/src/llm/anthropic.js.map +1 -0
  191. package/dist/src/llm/claude-process.d.ts +2 -0
  192. package/dist/src/llm/claude-process.js +55 -0
  193. package/dist/src/llm/claude-process.js.map +1 -0
  194. package/dist/src/llm/codex-process.d.ts +15 -0
  195. package/dist/src/llm/codex-process.js +142 -0
  196. package/dist/src/llm/codex-process.js.map +1 -0
  197. package/dist/src/llm/mock-summarizer.d.ts +9 -0
  198. package/dist/src/llm/mock-summarizer.js +17 -0
  199. package/dist/src/llm/mock-summarizer.js.map +1 -0
  200. package/dist/src/llm/openai.d.ts +10 -0
  201. package/dist/src/llm/openai.js +52 -0
  202. package/dist/src/llm/openai.js.map +1 -0
  203. package/dist/src/llm/types.d.ts +6 -0
  204. package/dist/src/llm/types.js +2 -0
  205. package/dist/src/llm/types.js.map +1 -0
  206. package/dist/src/mcp/server.d.ts +9 -0
  207. package/dist/src/mcp/server.js +128 -0
  208. package/dist/src/mcp/server.js.map +1 -0
  209. package/dist/src/mcp/tools/lcm-describe.d.ts +14 -0
  210. package/dist/src/mcp/tools/lcm-describe.js +12 -0
  211. package/dist/src/mcp/tools/lcm-describe.js.map +1 -0
  212. package/dist/src/mcp/tools/lcm-doctor.d.ts +8 -0
  213. package/dist/src/mcp/tools/lcm-doctor.js +9 -0
  214. package/dist/src/mcp/tools/lcm-doctor.js.map +1 -0
  215. package/dist/src/mcp/tools/lcm-expand.d.ts +18 -0
  216. package/dist/src/mcp/tools/lcm-expand.js +13 -0
  217. package/dist/src/mcp/tools/lcm-expand.js.map +1 -0
  218. package/dist/src/mcp/tools/lcm-grep.d.ts +27 -0
  219. package/dist/src/mcp/tools/lcm-grep.js +15 -0
  220. package/dist/src/mcp/tools/lcm-grep.js.map +1 -0
  221. package/dist/src/mcp/tools/lcm-search.d.ts +33 -0
  222. package/dist/src/mcp/tools/lcm-search.js +15 -0
  223. package/dist/src/mcp/tools/lcm-search.js.map +1 -0
  224. package/dist/src/mcp/tools/lcm-stats.d.ts +14 -0
  225. package/dist/src/mcp/tools/lcm-stats.js +11 -0
  226. package/dist/src/mcp/tools/lcm-stats.js.map +1 -0
  227. package/dist/src/mcp/tools/lcm-store.d.ts +26 -0
  228. package/dist/src/mcp/tools/lcm-store.js +22 -0
  229. package/dist/src/mcp/tools/lcm-store.js.map +1 -0
  230. package/dist/src/memory/index.d.ts +22 -0
  231. package/dist/src/memory/index.js +21 -0
  232. package/dist/src/memory/index.js.map +1 -0
  233. package/dist/src/promotion/dedup.d.ts +19 -0
  234. package/dist/src/promotion/dedup.js +42 -0
  235. package/dist/src/promotion/dedup.js.map +1 -0
  236. package/dist/src/promotion/detector.d.ts +15 -0
  237. package/dist/src/promotion/detector.js +31 -0
  238. package/dist/src/promotion/detector.js.map +1 -0
  239. package/dist/src/prompts/condensed-d1.yaml +38 -0
  240. package/dist/src/prompts/condensed-d2.yaml +32 -0
  241. package/dist/src/prompts/condensed-d3plus.yaml +32 -0
  242. package/dist/src/prompts/leaf-aggressive.yaml +34 -0
  243. package/dist/src/prompts/leaf-normal.yaml +34 -0
  244. package/dist/src/prompts/loader.d.ts +9 -0
  245. package/dist/src/prompts/loader.js +37 -0
  246. package/dist/src/prompts/loader.js.map +1 -0
  247. package/dist/src/prompts/promoted-merge.yaml +18 -0
  248. package/dist/src/prompts/system.yaml +5 -0
  249. package/dist/src/retrieval.d.ts +122 -0
  250. package/dist/src/retrieval.js +214 -0
  251. package/dist/src/retrieval.js.map +1 -0
  252. package/dist/src/scrub.d.ts +46 -0
  253. package/dist/src/scrub.js +184 -0
  254. package/dist/src/scrub.js.map +1 -0
  255. package/dist/src/sensitive.d.ts +4 -0
  256. package/dist/src/sensitive.js +258 -0
  257. package/dist/src/sensitive.js.map +1 -0
  258. package/dist/src/stats.d.ts +34 -0
  259. package/dist/src/stats.js +260 -0
  260. package/dist/src/stats.js.map +1 -0
  261. package/dist/src/store/conversation-store.d.ts +115 -0
  262. package/dist/src/store/conversation-store.js +447 -0
  263. package/dist/src/store/conversation-store.js.map +1 -0
  264. package/dist/src/store/fts5-sanitize.d.ts +23 -0
  265. package/dist/src/store/fts5-sanitize.js +30 -0
  266. package/dist/src/store/fts5-sanitize.js.map +1 -0
  267. package/dist/src/store/full-text-fallback.d.ts +16 -0
  268. package/dist/src/store/full-text-fallback.js +60 -0
  269. package/dist/src/store/full-text-fallback.js.map +1 -0
  270. package/dist/src/store/index.d.ts +4 -0
  271. package/dist/src/store/index.js +3 -0
  272. package/dist/src/store/index.js.map +1 -0
  273. package/dist/src/store/summary-store.d.ts +118 -0
  274. package/dist/src/store/summary-store.js +570 -0
  275. package/dist/src/store/summary-store.js.map +1 -0
  276. package/dist/src/summarize.d.ts +59 -0
  277. package/dist/src/summarize.js +619 -0
  278. package/dist/src/summarize.js.map +1 -0
  279. package/dist/src/transcript.d.ts +7 -0
  280. package/dist/src/transcript.js +51 -0
  281. package/dist/src/transcript.js.map +1 -0
  282. package/dist/src/types.d.ts +116 -0
  283. package/dist/src/types.js +8 -0
  284. package/dist/src/types.js.map +1 -0
  285. package/docs/agent-tools.md +187 -0
  286. package/docs/architecture.md +224 -0
  287. package/docs/configuration.md +168 -0
  288. package/docs/fts5.md +161 -0
  289. package/docs/hook-protocol.md +41 -0
  290. package/docs/privacy.md +101 -0
  291. package/mcp.mjs +17 -0
  292. package/package.json +79 -0
@@ -0,0 +1,570 @@
1
+ import { sanitizeFts5Query } from "./fts5-sanitize.js";
2
+ import { buildLikeSearchPlan, createFallbackSnippet } from "./full-text-fallback.js";
3
+ // ── Row mappers ───────────────────────────────────────────────────────────────
4
+ function toSummaryRecord(row) {
5
+ let fileIds = [];
6
+ try {
7
+ fileIds = JSON.parse(row.file_ids);
8
+ }
9
+ catch {
10
+ // ignore malformed JSON
11
+ }
12
+ return {
13
+ summaryId: row.summary_id,
14
+ conversationId: row.conversation_id,
15
+ kind: row.kind,
16
+ depth: row.depth,
17
+ content: row.content,
18
+ tokenCount: row.token_count,
19
+ fileIds,
20
+ earliestAt: row.earliest_at ? new Date(row.earliest_at) : null,
21
+ latestAt: row.latest_at ? new Date(row.latest_at) : null,
22
+ descendantCount: typeof row.descendant_count === "number" &&
23
+ Number.isFinite(row.descendant_count) &&
24
+ row.descendant_count >= 0
25
+ ? Math.floor(row.descendant_count)
26
+ : 0,
27
+ descendantTokenCount: typeof row.descendant_token_count === "number" &&
28
+ Number.isFinite(row.descendant_token_count) &&
29
+ row.descendant_token_count >= 0
30
+ ? Math.floor(row.descendant_token_count)
31
+ : 0,
32
+ sourceMessageTokenCount: typeof row.source_message_token_count === "number" &&
33
+ Number.isFinite(row.source_message_token_count) &&
34
+ row.source_message_token_count >= 0
35
+ ? Math.floor(row.source_message_token_count)
36
+ : 0,
37
+ createdAt: new Date(row.created_at),
38
+ };
39
+ }
40
+ function toContextItemRecord(row) {
41
+ return {
42
+ conversationId: row.conversation_id,
43
+ ordinal: row.ordinal,
44
+ itemType: row.item_type,
45
+ messageId: row.message_id,
46
+ summaryId: row.summary_id,
47
+ createdAt: new Date(row.created_at),
48
+ };
49
+ }
50
+ function toSearchResult(row) {
51
+ return {
52
+ summaryId: row.summary_id,
53
+ conversationId: row.conversation_id,
54
+ kind: row.kind,
55
+ snippet: row.snippet,
56
+ createdAt: new Date(row.created_at),
57
+ rank: row.rank,
58
+ };
59
+ }
60
+ function toLargeFileRecord(row) {
61
+ return {
62
+ fileId: row.file_id,
63
+ conversationId: row.conversation_id,
64
+ fileName: row.file_name,
65
+ mimeType: row.mime_type,
66
+ byteSize: row.byte_size,
67
+ storageUri: row.storage_uri,
68
+ explorationSummary: row.exploration_summary,
69
+ createdAt: new Date(row.created_at),
70
+ };
71
+ }
72
+ // ── SummaryStore ──────────────────────────────────────────────────────────────
73
+ export class SummaryStore {
74
+ db;
75
+ fts5Available;
76
+ constructor(db, options) {
77
+ this.db = db;
78
+ this.fts5Available = options?.fts5Available ?? true;
79
+ }
80
+ // ── Summary CRUD ──────────────────────────────────────────────────────────
81
+ async insertSummary(input) {
82
+ const fileIds = JSON.stringify(input.fileIds ?? []);
83
+ const earliestAt = input.earliestAt instanceof Date ? input.earliestAt.toISOString() : null;
84
+ const latestAt = input.latestAt instanceof Date ? input.latestAt.toISOString() : null;
85
+ const descendantCount = typeof input.descendantCount === "number" &&
86
+ Number.isFinite(input.descendantCount) &&
87
+ input.descendantCount >= 0
88
+ ? Math.floor(input.descendantCount)
89
+ : 0;
90
+ const descendantTokenCount = typeof input.descendantTokenCount === "number" &&
91
+ Number.isFinite(input.descendantTokenCount) &&
92
+ input.descendantTokenCount >= 0
93
+ ? Math.floor(input.descendantTokenCount)
94
+ : 0;
95
+ const sourceMessageTokenCount = typeof input.sourceMessageTokenCount === "number" &&
96
+ Number.isFinite(input.sourceMessageTokenCount) &&
97
+ input.sourceMessageTokenCount >= 0
98
+ ? Math.floor(input.sourceMessageTokenCount)
99
+ : 0;
100
+ const depth = typeof input.depth === "number" && Number.isFinite(input.depth) && input.depth >= 0
101
+ ? Math.floor(input.depth)
102
+ : input.kind === "leaf"
103
+ ? 0
104
+ : 1;
105
+ this.db
106
+ .prepare(`INSERT INTO summaries (
107
+ summary_id,
108
+ conversation_id,
109
+ kind,
110
+ depth,
111
+ content,
112
+ token_count,
113
+ file_ids,
114
+ earliest_at,
115
+ latest_at,
116
+ descendant_count,
117
+ descendant_token_count,
118
+ source_message_token_count
119
+ )
120
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
121
+ .run(input.summaryId, input.conversationId, input.kind, depth, input.content, input.tokenCount, fileIds, earliestAt, latestAt, descendantCount, descendantTokenCount, sourceMessageTokenCount);
122
+ const row = this.db
123
+ .prepare(`SELECT summary_id, conversation_id, kind, depth, content, token_count, file_ids,
124
+ earliest_at, latest_at, descendant_count, created_at
125
+ , descendant_token_count, source_message_token_count
126
+ FROM summaries WHERE summary_id = ?`)
127
+ .get(input.summaryId);
128
+ // Index in FTS5 as best-effort; compaction flow must continue even if
129
+ // FTS indexing fails for any reason.
130
+ if (!this.fts5Available) {
131
+ return toSummaryRecord(row);
132
+ }
133
+ try {
134
+ this.db
135
+ .prepare(`INSERT INTO summaries_fts(summary_id, content) VALUES (?, ?)`)
136
+ .run(input.summaryId, input.content);
137
+ }
138
+ catch {
139
+ // FTS indexing failed — search won't find this summary but
140
+ // compaction and assembly will still work correctly.
141
+ }
142
+ return toSummaryRecord(row);
143
+ }
144
+ async getSummary(summaryId) {
145
+ const row = this.db
146
+ .prepare(`SELECT summary_id, conversation_id, kind, depth, content, token_count, file_ids,
147
+ earliest_at, latest_at, descendant_count, created_at
148
+ , descendant_token_count, source_message_token_count
149
+ FROM summaries WHERE summary_id = ?`)
150
+ .get(summaryId);
151
+ return row ? toSummaryRecord(row) : null;
152
+ }
153
+ async getSummariesByConversation(conversationId) {
154
+ const rows = this.db
155
+ .prepare(`SELECT summary_id, conversation_id, kind, depth, content, token_count, file_ids,
156
+ earliest_at, latest_at, descendant_count, created_at
157
+ , descendant_token_count, source_message_token_count
158
+ FROM summaries
159
+ WHERE conversation_id = ?
160
+ ORDER BY created_at`)
161
+ .all(conversationId);
162
+ return rows.map(toSummaryRecord);
163
+ }
164
+ // ── Lineage ───────────────────────────────────────────────────────────────
165
+ async linkSummaryToMessages(summaryId, messageIds) {
166
+ if (messageIds.length === 0) {
167
+ return;
168
+ }
169
+ const stmt = this.db.prepare(`INSERT INTO summary_messages (summary_id, message_id, ordinal)
170
+ VALUES (?, ?, ?)
171
+ ON CONFLICT (summary_id, message_id) DO NOTHING`);
172
+ for (let idx = 0; idx < messageIds.length; idx++) {
173
+ stmt.run(summaryId, messageIds[idx], idx);
174
+ }
175
+ }
176
+ async linkSummaryToParents(summaryId, parentSummaryIds) {
177
+ if (parentSummaryIds.length === 0) {
178
+ return;
179
+ }
180
+ const stmt = this.db.prepare(`INSERT INTO summary_parents (summary_id, parent_summary_id, ordinal)
181
+ VALUES (?, ?, ?)
182
+ ON CONFLICT (summary_id, parent_summary_id) DO NOTHING`);
183
+ for (let idx = 0; idx < parentSummaryIds.length; idx++) {
184
+ stmt.run(summaryId, parentSummaryIds[idx], idx);
185
+ }
186
+ }
187
+ async getSummaryMessages(summaryId) {
188
+ const rows = this.db
189
+ .prepare(`SELECT message_id FROM summary_messages
190
+ WHERE summary_id = ?
191
+ ORDER BY ordinal`)
192
+ .all(summaryId);
193
+ return rows.map((r) => r.message_id);
194
+ }
195
+ async getSummaryChildren(parentSummaryId) {
196
+ const rows = this.db
197
+ .prepare(`SELECT s.summary_id, s.conversation_id, s.kind, s.depth, s.content, s.token_count,
198
+ s.file_ids, s.earliest_at, s.latest_at, s.descendant_count, s.created_at
199
+ , s.descendant_token_count, s.source_message_token_count
200
+ FROM summaries s
201
+ JOIN summary_parents sp ON sp.summary_id = s.summary_id
202
+ WHERE sp.parent_summary_id = ?
203
+ ORDER BY sp.ordinal`)
204
+ .all(parentSummaryId);
205
+ return rows.map(toSummaryRecord);
206
+ }
207
+ async getSummaryParents(summaryId) {
208
+ const rows = this.db
209
+ .prepare(`SELECT s.summary_id, s.conversation_id, s.kind, s.depth, s.content, s.token_count,
210
+ s.file_ids, s.earliest_at, s.latest_at, s.descendant_count, s.created_at
211
+ , s.descendant_token_count, s.source_message_token_count
212
+ FROM summaries s
213
+ JOIN summary_parents sp ON sp.parent_summary_id = s.summary_id
214
+ WHERE sp.summary_id = ?
215
+ ORDER BY sp.ordinal`)
216
+ .all(summaryId);
217
+ return rows.map(toSummaryRecord);
218
+ }
219
+ async getSummarySubtree(summaryId) {
220
+ const rows = this.db
221
+ .prepare(`WITH RECURSIVE subtree(summary_id, parent_summary_id, depth_from_root, path) AS (
222
+ SELECT ?, NULL, 0, ''
223
+ UNION ALL
224
+ SELECT
225
+ sp.summary_id,
226
+ sp.parent_summary_id,
227
+ subtree.depth_from_root + 1,
228
+ CASE
229
+ WHEN subtree.path = '' THEN printf('%04d', sp.ordinal)
230
+ ELSE subtree.path || '.' || printf('%04d', sp.ordinal)
231
+ END
232
+ FROM summary_parents sp
233
+ JOIN subtree ON sp.parent_summary_id = subtree.summary_id
234
+ )
235
+ SELECT
236
+ s.summary_id,
237
+ s.conversation_id,
238
+ s.kind,
239
+ s.depth,
240
+ s.content,
241
+ s.token_count,
242
+ s.file_ids,
243
+ s.earliest_at,
244
+ s.latest_at,
245
+ s.descendant_count,
246
+ s.descendant_token_count,
247
+ s.source_message_token_count,
248
+ s.created_at,
249
+ subtree.depth_from_root,
250
+ subtree.parent_summary_id,
251
+ subtree.path,
252
+ (
253
+ SELECT COUNT(*) FROM summary_parents sp2
254
+ WHERE sp2.parent_summary_id = s.summary_id
255
+ ) AS child_count
256
+ FROM subtree
257
+ JOIN summaries s ON s.summary_id = subtree.summary_id
258
+ ORDER BY subtree.depth_from_root ASC, subtree.path ASC, s.created_at ASC`)
259
+ .all(summaryId);
260
+ const seen = new Set();
261
+ const output = [];
262
+ for (const row of rows) {
263
+ if (seen.has(row.summary_id)) {
264
+ continue;
265
+ }
266
+ seen.add(row.summary_id);
267
+ output.push({
268
+ ...toSummaryRecord(row),
269
+ depthFromRoot: Math.max(0, Math.floor(row.depth_from_root ?? 0)),
270
+ parentSummaryId: row.parent_summary_id ?? null,
271
+ path: typeof row.path === "string" ? row.path : "",
272
+ childCount: typeof row.child_count === "number" && Number.isFinite(row.child_count)
273
+ ? Math.max(0, Math.floor(row.child_count))
274
+ : 0,
275
+ });
276
+ }
277
+ return output;
278
+ }
279
+ // ── Context items ─────────────────────────────────────────────────────────
280
+ async getContextItems(conversationId) {
281
+ const rows = this.db
282
+ .prepare(`SELECT conversation_id, ordinal, item_type, message_id, summary_id, created_at
283
+ FROM context_items
284
+ WHERE conversation_id = ?
285
+ ORDER BY ordinal`)
286
+ .all(conversationId);
287
+ return rows.map(toContextItemRecord);
288
+ }
289
+ async getDistinctDepthsInContext(conversationId, options) {
290
+ const maxOrdinalExclusive = options?.maxOrdinalExclusive;
291
+ const useOrdinalBound = typeof maxOrdinalExclusive === "number" &&
292
+ Number.isFinite(maxOrdinalExclusive) &&
293
+ maxOrdinalExclusive !== Infinity;
294
+ const sql = useOrdinalBound
295
+ ? `SELECT DISTINCT s.depth
296
+ FROM context_items ci
297
+ JOIN summaries s ON s.summary_id = ci.summary_id
298
+ WHERE ci.conversation_id = ?
299
+ AND ci.item_type = 'summary'
300
+ AND ci.ordinal < ?
301
+ ORDER BY s.depth ASC`
302
+ : `SELECT DISTINCT s.depth
303
+ FROM context_items ci
304
+ JOIN summaries s ON s.summary_id = ci.summary_id
305
+ WHERE ci.conversation_id = ?
306
+ AND ci.item_type = 'summary'
307
+ ORDER BY s.depth ASC`;
308
+ const rows = useOrdinalBound
309
+ ? this.db
310
+ .prepare(sql)
311
+ .all(conversationId, Math.floor(maxOrdinalExclusive))
312
+ : this.db.prepare(sql).all(conversationId);
313
+ return rows.map((row) => row.depth);
314
+ }
315
+ async appendContextMessage(conversationId, messageId) {
316
+ const row = this.db
317
+ .prepare(`SELECT COALESCE(MAX(ordinal), -1) AS max_ordinal
318
+ FROM context_items WHERE conversation_id = ?`)
319
+ .get(conversationId);
320
+ this.db
321
+ .prepare(`INSERT INTO context_items (conversation_id, ordinal, item_type, message_id)
322
+ VALUES (?, ?, 'message', ?)`)
323
+ .run(conversationId, row.max_ordinal + 1, messageId);
324
+ }
325
+ async appendContextMessages(conversationId, messageIds) {
326
+ if (messageIds.length === 0) {
327
+ return;
328
+ }
329
+ const row = this.db
330
+ .prepare(`SELECT COALESCE(MAX(ordinal), -1) AS max_ordinal
331
+ FROM context_items WHERE conversation_id = ?`)
332
+ .get(conversationId);
333
+ const baseOrdinal = row.max_ordinal + 1;
334
+ const stmt = this.db.prepare(`INSERT INTO context_items (conversation_id, ordinal, item_type, message_id)
335
+ VALUES (?, ?, 'message', ?)`);
336
+ for (let idx = 0; idx < messageIds.length; idx++) {
337
+ stmt.run(conversationId, baseOrdinal + idx, messageIds[idx]);
338
+ }
339
+ }
340
+ async appendContextSummary(conversationId, summaryId) {
341
+ const row = this.db
342
+ .prepare(`SELECT COALESCE(MAX(ordinal), -1) AS max_ordinal
343
+ FROM context_items WHERE conversation_id = ?`)
344
+ .get(conversationId);
345
+ this.db
346
+ .prepare(`INSERT INTO context_items (conversation_id, ordinal, item_type, summary_id)
347
+ VALUES (?, ?, 'summary', ?)`)
348
+ .run(conversationId, row.max_ordinal + 1, summaryId);
349
+ }
350
+ async replaceContextRangeWithSummary(input) {
351
+ const { conversationId, startOrdinal, endOrdinal, summaryId } = input;
352
+ this.db.exec("BEGIN");
353
+ try {
354
+ // 1. Delete context items in the range [startOrdinal, endOrdinal]
355
+ this.db
356
+ .prepare(`DELETE FROM context_items
357
+ WHERE conversation_id = ?
358
+ AND ordinal >= ?
359
+ AND ordinal <= ?`)
360
+ .run(conversationId, startOrdinal, endOrdinal);
361
+ // 2. Insert the replacement summary item at startOrdinal
362
+ this.db
363
+ .prepare(`INSERT INTO context_items (conversation_id, ordinal, item_type, summary_id)
364
+ VALUES (?, ?, 'summary', ?)`)
365
+ .run(conversationId, startOrdinal, summaryId);
366
+ // 3. Resequence all ordinals to maintain contiguity (no gaps).
367
+ // Fetch current items, then update ordinals in order.
368
+ const items = this.db
369
+ .prepare(`SELECT ordinal FROM context_items
370
+ WHERE conversation_id = ?
371
+ ORDER BY ordinal`)
372
+ .all(conversationId);
373
+ const updateStmt = this.db.prepare(`UPDATE context_items
374
+ SET ordinal = ?
375
+ WHERE conversation_id = ? AND ordinal = ?`);
376
+ // Use negative temp ordinals first to avoid unique constraint conflicts
377
+ for (let i = 0; i < items.length; i++) {
378
+ updateStmt.run(-(i + 1), conversationId, items[i].ordinal);
379
+ }
380
+ for (let i = 0; i < items.length; i++) {
381
+ updateStmt.run(i, conversationId, -(i + 1));
382
+ }
383
+ this.db.exec("COMMIT");
384
+ }
385
+ catch (err) {
386
+ this.db.exec("ROLLBACK");
387
+ throw err;
388
+ }
389
+ }
390
+ async getContextTokenCount(conversationId) {
391
+ const row = this.db
392
+ .prepare(`SELECT COALESCE(SUM(token_count), 0) AS total
393
+ FROM (
394
+ SELECT m.token_count
395
+ FROM context_items ci
396
+ JOIN messages m ON m.message_id = ci.message_id
397
+ WHERE ci.conversation_id = ?
398
+ AND ci.item_type = 'message'
399
+
400
+ UNION ALL
401
+
402
+ SELECT s.token_count
403
+ FROM context_items ci
404
+ JOIN summaries s ON s.summary_id = ci.summary_id
405
+ WHERE ci.conversation_id = ?
406
+ AND ci.item_type = 'summary'
407
+ ) sub`)
408
+ .get(conversationId, conversationId);
409
+ return row?.total ?? 0;
410
+ }
411
+ // ── Search ────────────────────────────────────────────────────────────────
412
+ async searchSummaries(input) {
413
+ const limit = input.limit ?? 50;
414
+ if (input.mode === "full_text") {
415
+ if (this.fts5Available) {
416
+ try {
417
+ return this.searchFullText(input.query, limit, input.conversationId, input.since, input.before);
418
+ }
419
+ catch {
420
+ return this.searchLike(input.query, limit, input.conversationId, input.since, input.before);
421
+ }
422
+ }
423
+ return this.searchLike(input.query, limit, input.conversationId, input.since, input.before);
424
+ }
425
+ return this.searchRegex(input.query, limit, input.conversationId, input.since, input.before);
426
+ }
427
+ searchFullText(query, limit, conversationId, since, before) {
428
+ const where = ["summaries_fts MATCH ?"];
429
+ const args = [sanitizeFts5Query(query)];
430
+ if (conversationId != null) {
431
+ where.push("s.conversation_id = ?");
432
+ args.push(conversationId);
433
+ }
434
+ if (since) {
435
+ where.push("julianday(s.created_at) >= julianday(?)");
436
+ args.push(since.toISOString());
437
+ }
438
+ if (before) {
439
+ where.push("julianday(s.created_at) < julianday(?)");
440
+ args.push(before.toISOString());
441
+ }
442
+ args.push(limit);
443
+ const sql = `SELECT
444
+ summaries_fts.summary_id,
445
+ s.conversation_id,
446
+ s.kind,
447
+ snippet(summaries_fts, 1, '', '', '...', 32) AS snippet,
448
+ rank,
449
+ s.created_at
450
+ FROM summaries_fts
451
+ JOIN summaries s ON s.summary_id = summaries_fts.summary_id
452
+ WHERE ${where.join(" AND ")}
453
+ ORDER BY s.created_at DESC
454
+ LIMIT ?`;
455
+ const rows = this.db.prepare(sql).all(...args);
456
+ return rows.map(toSearchResult);
457
+ }
458
+ searchLike(query, limit, conversationId, since, before) {
459
+ const plan = buildLikeSearchPlan("content", query);
460
+ if (plan.terms.length === 0) {
461
+ return [];
462
+ }
463
+ const where = [...plan.where];
464
+ const args = [...plan.args];
465
+ if (conversationId != null) {
466
+ where.push("conversation_id = ?");
467
+ args.push(conversationId);
468
+ }
469
+ if (since) {
470
+ where.push("julianday(created_at) >= julianday(?)");
471
+ args.push(since.toISOString());
472
+ }
473
+ if (before) {
474
+ where.push("julianday(created_at) < julianday(?)");
475
+ args.push(before.toISOString());
476
+ }
477
+ args.push(limit);
478
+ const whereClause = where.length > 0 ? `WHERE ${where.join(" AND ")}` : "";
479
+ const rows = this.db
480
+ .prepare(`SELECT summary_id, conversation_id, kind, depth, content, token_count, file_ids,
481
+ earliest_at, latest_at, descendant_count, descendant_token_count,
482
+ source_message_token_count, created_at
483
+ FROM summaries
484
+ ${whereClause}
485
+ ORDER BY created_at DESC
486
+ LIMIT ?`)
487
+ .all(...args);
488
+ return rows.map((row) => ({
489
+ summaryId: row.summary_id,
490
+ conversationId: row.conversation_id,
491
+ kind: row.kind,
492
+ snippet: createFallbackSnippet(row.content, plan.terms),
493
+ createdAt: new Date(row.created_at),
494
+ rank: 0,
495
+ }));
496
+ }
497
+ searchRegex(pattern, limit, conversationId, since, before) {
498
+ const re = new RegExp(pattern);
499
+ const where = [];
500
+ const args = [];
501
+ if (conversationId != null) {
502
+ where.push("conversation_id = ?");
503
+ args.push(conversationId);
504
+ }
505
+ if (since) {
506
+ where.push("julianday(created_at) >= julianday(?)");
507
+ args.push(since.toISOString());
508
+ }
509
+ if (before) {
510
+ where.push("julianday(created_at) < julianday(?)");
511
+ args.push(before.toISOString());
512
+ }
513
+ const whereClause = where.length > 0 ? `WHERE ${where.join(" AND ")}` : "";
514
+ const rows = this.db
515
+ .prepare(`SELECT summary_id, conversation_id, kind, depth, content, token_count, file_ids,
516
+ earliest_at, latest_at, descendant_count, descendant_token_count,
517
+ source_message_token_count, created_at
518
+ FROM summaries
519
+ ${whereClause}
520
+ ORDER BY created_at DESC`)
521
+ .all(...args);
522
+ const results = [];
523
+ for (const row of rows) {
524
+ if (results.length >= limit) {
525
+ break;
526
+ }
527
+ const match = re.exec(row.content);
528
+ if (match) {
529
+ results.push({
530
+ summaryId: row.summary_id,
531
+ conversationId: row.conversation_id,
532
+ kind: row.kind,
533
+ snippet: match[0],
534
+ createdAt: new Date(row.created_at),
535
+ rank: 0,
536
+ });
537
+ }
538
+ }
539
+ return results;
540
+ }
541
+ // ── Large files ───────────────────────────────────────────────────────────
542
+ async insertLargeFile(input) {
543
+ this.db
544
+ .prepare(`INSERT INTO large_files (file_id, conversation_id, file_name, mime_type, byte_size, storage_uri, exploration_summary)
545
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
546
+ .run(input.fileId, input.conversationId, input.fileName ?? null, input.mimeType ?? null, input.byteSize ?? null, input.storageUri, input.explorationSummary ?? null);
547
+ const row = this.db
548
+ .prepare(`SELECT file_id, conversation_id, file_name, mime_type, byte_size, storage_uri, exploration_summary, created_at
549
+ FROM large_files WHERE file_id = ?`)
550
+ .get(input.fileId);
551
+ return toLargeFileRecord(row);
552
+ }
553
+ async getLargeFile(fileId) {
554
+ const row = this.db
555
+ .prepare(`SELECT file_id, conversation_id, file_name, mime_type, byte_size, storage_uri, exploration_summary, created_at
556
+ FROM large_files WHERE file_id = ?`)
557
+ .get(fileId);
558
+ return row ? toLargeFileRecord(row) : null;
559
+ }
560
+ async getLargeFilesByConversation(conversationId) {
561
+ const rows = this.db
562
+ .prepare(`SELECT file_id, conversation_id, file_name, mime_type, byte_size, storage_uri, exploration_summary, created_at
563
+ FROM large_files
564
+ WHERE conversation_id = ?
565
+ ORDER BY created_at`)
566
+ .all(conversationId);
567
+ return rows.map(toLargeFileRecord);
568
+ }
569
+ }
570
+ //# sourceMappingURL=summary-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary-store.js","sourceRoot":"","sources":["../../../src/store/summary-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAiKrF,iFAAiF;AAEjF,SAAS,eAAe,CAAC,GAAe;IACtC,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IACD,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,OAAO;QACP,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;QAC9D,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;QACxD,eAAe,EACb,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ;YACxC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACrC,GAAG,CAAC,gBAAgB,IAAI,CAAC;YACvB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAClC,CAAC,CAAC,CAAC;QACP,oBAAoB,EAClB,OAAO,GAAG,CAAC,sBAAsB,KAAK,QAAQ;YAC9C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC3C,GAAG,CAAC,sBAAsB,IAAI,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACxC,CAAC,CAAC,CAAC;QACP,uBAAuB,EACrB,OAAO,GAAG,CAAC,0BAA0B,KAAK,QAAQ;YAClD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAC/C,GAAG,CAAC,0BAA0B,IAAI,CAAC;YACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAC5C,CAAC,CAAC,CAAC;QACP,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAmB;IAC9C,OAAO;QACL,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAqB;IAC3C,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;QACnC,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAiB;IAC1C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,kBAAkB,EAAE,GAAG,CAAC,mBAAmB;QAC3C,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,OAAO,YAAY;IAIb;IAHO,aAAa,CAAU;IAExC,YACU,EAAgB,EACxB,OAAqC;QAD7B,OAAE,GAAF,EAAE,CAAc;QAGxB,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,aAAa,CAAC,KAAyB;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5F,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACtF,MAAM,eAAe,GACnB,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ;YACzC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC;YACtC,KAAK,CAAC,eAAe,IAAI,CAAC;YACxB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC;YACnC,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,oBAAoB,GACxB,OAAO,KAAK,CAAC,oBAAoB,KAAK,QAAQ;YAC9C,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC;YAC3C,KAAK,CAAC,oBAAoB,IAAI,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC;YACxC,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,uBAAuB,GAC3B,OAAO,KAAK,CAAC,uBAAuB,KAAK,QAAQ;YACjD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC;YAC9C,KAAK,CAAC,uBAAuB,IAAI,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC;YAC3C,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,KAAK,GACT,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC;YACjF,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YACzB,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;gBACrB,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC,CAAC;QAEV,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;;;;;;;;;;;;mDAc2C,CAC5C;aACA,GAAG,CACF,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,IAAI,EACV,KAAK,EACL,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,UAAU,EAChB,OAAO,EACP,UAAU,EACV,QAAQ,EACR,eAAe,EACf,oBAAoB,EACpB,uBAAuB,CACxB,CAAC;QAEJ,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;2CAGmC,CACpC;aACA,GAAG,CAAC,KAAK,CAAC,SAAS,CAA0B,CAAC;QAEjD,sEAAsE;QACtE,qCAAqC;QACrC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,EAAE;iBACJ,OAAO,CAAC,8DAA8D,CAAC;iBACvE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;YAC3D,qDAAqD;QACvD,CAAC;QAED,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;2CAGmC,CACpC;aACA,GAAG,CAAC,SAAS,CAAsC,CAAC;QACvD,OAAO,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,cAAsB;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;;2BAKmB,CACpB;aACA,GAAG,CAAC,cAAc,CAA4B,CAAC;QAClD,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,qBAAqB,CAAC,SAAiB,EAAE,UAAoB;QACjE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;uDAEiD,CAClD,CAAC;QAEF,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,SAAiB,EAAE,gBAA0B;QACtE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;8DAEwD,CACzD,CAAC;QAEF,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;wBAEgB,CACjB;aACA,GAAG,CAAC,SAAS,CAA8B,CAAC;QAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,eAAuB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;;;2BAMmB,CACpB;aACA,GAAG,CAAC,eAAe,CAA4B,CAAC;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;;;2BAMmB,CACpB;aACA,GAAG,CAAC,SAAS,CAA4B,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kFAqC0E,CAC3E;aACA,GAAG,CAAC,SAAS,CAAmC,CAAC;QAEpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAA+B,EAAE,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,eAAe,CAAC,GAAG,CAAC;gBACvB,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;gBAChE,eAAe,EAAE,GAAG,CAAC,iBAAiB,IAAI,IAAI;gBAC9C,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAClD,UAAU,EACR,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;oBACrE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBAC1C,CAAC,CAAC,CAAC;aACR,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,eAAe,CAAC,cAAsB;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;wBAGgB,CACjB;aACA,GAAG,CAAC,cAAc,CAAgC,CAAC;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,0BAA0B,CAC9B,cAAsB,EACtB,OAA0C;QAE1C,MAAM,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,CAAC;QACzD,MAAM,eAAe,GACnB,OAAO,mBAAmB,KAAK,QAAQ;YACvC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACpC,mBAAmB,KAAK,QAAQ,CAAC;QAEnC,MAAM,GAAG,GAAG,eAAe;YACzB,CAAC,CAAC;;;;;;8BAMsB;YACxB,CAAC,CAAC;;;;;8BAKsB,CAAC;QAE3B,MAAM,IAAI,GAAG,eAAe;YAC1B,CAAC,CAAE,IAAI,CAAC,EAAE;iBACL,OAAO,CAAC,GAAG,CAAC;iBACZ,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAmC;YAC3F,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAmC,CAAC;QAEhF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,cAAsB,EAAE,SAAiB;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;oDAC4C,CAC7C;aACA,GAAG,CAAC,cAAc,CAA6B,CAAC;QAEnD,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;mCAC2B,CAC5B;aACA,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,cAAsB,EAAE,UAAoB;QACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;oDAC4C,CAC7C;aACA,GAAG,CAAC,cAAc,CAA6B,CAAC;QACnD,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;mCAC6B,CAC9B,CAAC;QACF,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,GAAG,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,cAAsB,EAAE,SAAiB;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;oDAC4C,CAC7C;aACA,GAAG,CAAC,cAAc,CAA6B,CAAC;QAEnD,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;mCAC2B,CAC5B;aACA,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,8BAA8B,CAAC,KAKpC;QACC,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAEtE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,kEAAkE;YAClE,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;;;4BAGkB,CACnB;iBACA,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YAEjD,yDAAyD;YACzD,IAAI,CAAC,EAAE;iBACJ,OAAO,CACN;qCAC2B,CAC5B;iBACA,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;YAEhD,+DAA+D;YAC/D,yDAAyD;YACzD,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE;iBAClB,OAAO,CACN;;0BAEgB,CACjB;iBACA,GAAG,CAAC,cAAc,CAAqC,CAAC;YAE3D,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAChC;;mDAE2C,CAC5C,CAAC;YAEF,wEAAwE;YACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,cAAsB;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;;;;;;;;;;;;;;;aAeK,CACN;aACA,GAAG,CAAC,cAAc,EAAE,cAAc,CAA2B,CAAC;QACjE,OAAO,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,eAAe,CAAC,KAAyB;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAEhC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,cAAc,CACxB,KAAK,CAAC,KAAK,EACX,KAAK,EACL,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,CACb,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC,UAAU,CACpB,KAAK,CAAC,KAAK,EACX,KAAK,EACL,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,CACb,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/F,CAAC;IAEO,cAAc,CACpB,KAAa,EACb,KAAa,EACb,cAAuB,EACvB,KAAY,EACZ,MAAa;QAEb,MAAM,KAAK,GAAa,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,IAAI,GAA2B,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,MAAM,GAAG,GAAG;;;;;;;;;eASD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;;eAEnB,CAAC;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAkC,CAAC;QAChF,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAEO,UAAU,CAChB,KAAa,EACb,KAAa,EACb,cAAuB,EACvB,KAAY,EACZ,MAAa;QAEb,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,IAAI,GAA2B,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;WAIG,WAAW;;iBAEL,CACV;aACA,GAAG,CAAC,GAAG,IAAI,CAA4B,CAAC;QAE3C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,cAAc,EAAE,GAAG,CAAC,eAAe;YACnC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;YACvD,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YACnC,IAAI,EAAE,CAAC;SACR,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,WAAW,CACjB,OAAe,EACf,KAAa,EACb,cAAuB,EACvB,KAAY,EACZ,MAAa;QAEb,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAA2B,EAAE,CAAC;QACxC,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;;WAIG,WAAW;kCACY,CAC3B;aACA,GAAG,CAAC,GAAG,IAAI,CAA4B,CAAC;QAE3C,MAAM,OAAO,GAA0B,EAAE,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC5B,MAAM;YACR,CAAC;YACD,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC;oBACX,SAAS,EAAE,GAAG,CAAC,UAAU;oBACzB,cAAc,EAAE,GAAG,CAAC,eAAe;oBACnC,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;oBACjB,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;oBACnC,IAAI,EAAE,CAAC;iBACR,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,6EAA6E;IAE7E,KAAK,CAAC,eAAe,CAAC,KAA2B;QAC/C,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;oCAC4B,CAC7B;aACA,GAAG,CACF,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,QAAQ,IAAI,IAAI,EACtB,KAAK,CAAC,QAAQ,IAAI,IAAI,EACtB,KAAK,CAAC,QAAQ,IAAI,IAAI,EACtB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,kBAAkB,IAAI,IAAI,CACjC,CAAC;QAEJ,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;0CACkC,CACnC;aACA,GAAG,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC;QAEhD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN;0CACkC,CACnC;aACA,GAAG,CAAC,MAAM,CAAwC,CAAC;QACtD,OAAO,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,2BAA2B,CAAC,cAAsB;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN;;;2BAGmB,CACpB;aACA,GAAG,CAAC,cAAc,CAA8B,CAAC;QACpD,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,59 @@
1
+ import type { LcmDependencies } from "./types.js";
2
+ export type LcmSummarizeOptions = {
3
+ previousSummary?: string;
4
+ isCondensed?: boolean;
5
+ depth?: number;
6
+ };
7
+ export type LcmSummarizeFn = (text: string, aggressive?: boolean, options?: LcmSummarizeOptions) => Promise<string>;
8
+ export type LcmSummarizerLegacyParams = {
9
+ provider?: unknown;
10
+ model?: unknown;
11
+ config?: unknown;
12
+ agentDir?: unknown;
13
+ authProfileId?: unknown;
14
+ };
15
+ type SummaryMode = "normal" | "aggressive";
16
+ export declare const LCM_SUMMARIZER_SYSTEM_PROMPT: string;
17
+ /**
18
+ * Resolve a practical target token count for leaf and condensed summaries.
19
+ * Aggressive leaf mode intentionally aims lower so compaction converges faster.
20
+ */
21
+ export declare function resolveTargetTokens(params: {
22
+ inputTokens: number;
23
+ mode: SummaryMode;
24
+ isCondensed: boolean;
25
+ condensedTargetTokens: number;
26
+ }): number;
27
+ /**
28
+ * Build a leaf (segment) summarization prompt.
29
+ *
30
+ * Normal leaf mode preserves details; aggressive leaf mode keeps only the
31
+ * highest-value facts needed for follow-up turns.
32
+ */
33
+ export declare function buildLeafSummaryPrompt(params: {
34
+ text: string;
35
+ mode: SummaryMode;
36
+ targetTokens: number;
37
+ previousSummary?: string;
38
+ customInstructions?: string;
39
+ }): string;
40
+ /** Build a condensed prompt variant based on the output node depth. */
41
+ export declare function buildCondensedSummaryPrompt(params: {
42
+ text: string;
43
+ targetTokens: number;
44
+ depth: number;
45
+ previousSummary?: string;
46
+ customInstructions?: string;
47
+ }): string;
48
+ /**
49
+ * Builds a model-backed LCM summarize callback from runtime legacy params.
50
+ *
51
+ * Returns `undefined` when model/provider context is unavailable so callers can
52
+ * choose a fallback summarizer.
53
+ */
54
+ export declare function createLcmSummarizeFromLegacyParams(params: {
55
+ deps: LcmDependencies;
56
+ legacyParams: LcmSummarizerLegacyParams;
57
+ customInstructions?: string;
58
+ }): Promise<LcmSummarizeFn | undefined>;
59
+ export {};