@edihasaj/recall 0.5.2

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +409 -0
  3. package/dist/chunk-4CV4JOE5.js +27 -0
  4. package/dist/chunk-4CV4JOE5.js.map +1 -0
  5. package/dist/chunk-A5UIRZU6.js +469 -0
  6. package/dist/chunk-A5UIRZU6.js.map +1 -0
  7. package/dist/chunk-AYHFPCGY.js +964 -0
  8. package/dist/chunk-AYHFPCGY.js.map +1 -0
  9. package/dist/chunk-DNFKAHS6.js +204 -0
  10. package/dist/chunk-DNFKAHS6.js.map +1 -0
  11. package/dist/chunk-GC5XMBG4.js +551 -0
  12. package/dist/chunk-GC5XMBG4.js.map +1 -0
  13. package/dist/chunk-IILLSHLM.js +3021 -0
  14. package/dist/chunk-IILLSHLM.js.map +1 -0
  15. package/dist/chunk-LVQW6WHK.js +146 -0
  16. package/dist/chunk-LVQW6WHK.js.map +1 -0
  17. package/dist/chunk-LZ6PMQRX.js +955 -0
  18. package/dist/chunk-LZ6PMQRX.js.map +1 -0
  19. package/dist/chunk-PC43MBX5.js +2960 -0
  20. package/dist/chunk-PC43MBX5.js.map +1 -0
  21. package/dist/chunk-VEPXEHRZ.js +1763 -0
  22. package/dist/chunk-VEPXEHRZ.js.map +1 -0
  23. package/dist/cleanup-TVOX2S2S.js +28 -0
  24. package/dist/cleanup-TVOX2S2S.js.map +1 -0
  25. package/dist/cli.js +3425 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/daemon.js +1298 -0
  28. package/dist/daemon.js.map +1 -0
  29. package/dist/dispatcher-UGMU6THT.js +15 -0
  30. package/dist/dispatcher-UGMU6THT.js.map +1 -0
  31. package/dist/keychain-5QG52ANO.js +22 -0
  32. package/dist/keychain-5QG52ANO.js.map +1 -0
  33. package/dist/mcp.js +21 -0
  34. package/dist/mcp.js.map +1 -0
  35. package/dist/quality-Z7LPMMBC.js +17 -0
  36. package/dist/quality-Z7LPMMBC.js.map +1 -0
  37. package/dist/sync-server.js +225 -0
  38. package/dist/sync-server.js.map +1 -0
  39. package/dist/tasks-UOLSPXJQ.js +61 -0
  40. package/dist/tasks-UOLSPXJQ.js.map +1 -0
  41. package/dist/usage-CY3V72YN.js +101 -0
  42. package/dist/usage-CY3V72YN.js.map +1 -0
  43. package/drizzle/0000_initial_create.sql +240 -0
  44. package/drizzle/0001_rich_liz_osborn.sql +21 -0
  45. package/drizzle/0002_unknown_spot.sql +18 -0
  46. package/drizzle/0003_red_wendigo.sql +19 -0
  47. package/drizzle/0004_early_carlie_cooper.sql +1 -0
  48. package/drizzle/0005_simple_emma_frost.sql +96 -0
  49. package/drizzle/0006_keen_mongoose.sql +2 -0
  50. package/drizzle/0007_flawless_maximus.sql +15 -0
  51. package/drizzle/meta/0000_snapshot.json +1630 -0
  52. package/drizzle/meta/0001_snapshot.json +1773 -0
  53. package/drizzle/meta/0002_snapshot.json +1891 -0
  54. package/drizzle/meta/0003_snapshot.json +2014 -0
  55. package/drizzle/meta/0004_snapshot.json +2022 -0
  56. package/drizzle/meta/0005_snapshot.json +2064 -0
  57. package/drizzle/meta/0006_snapshot.json +2078 -0
  58. package/drizzle/meta/0007_snapshot.json +2183 -0
  59. package/drizzle/meta/_journal.json +62 -0
  60. package/package.json +64 -0
  61. package/scripts/recall-claude +7 -0
  62. package/scripts/recall-codex +7 -0
  63. package/scripts/recall-session +71 -0
@@ -0,0 +1,146 @@
1
+ import {
2
+ feedbackEvents,
3
+ historyInjections,
4
+ memories,
5
+ memoryInjections,
6
+ qualitySnapshots
7
+ } from "./chunk-A5UIRZU6.js";
8
+
9
+ // src/maintenance/quality.ts
10
+ import { and, desc, eq, gte, sql } from "drizzle-orm";
11
+ import { randomUUID } from "crypto";
12
+ function computeQualityReport(db, opts = {}) {
13
+ const now = /* @__PURE__ */ new Date();
14
+ const start = opts.sinceIso ?? new Date(now.getTime() - 14 * 864e5).toISOString();
15
+ const end = now.toISOString();
16
+ const injectionRows = db.select({
17
+ outcome: memoryInjections.outcome,
18
+ count: sql`count(*)`.as("count")
19
+ }).from(memoryInjections).where(gte(memoryInjections.injected_at, start)).groupBy(memoryInjections.outcome).all();
20
+ const injectionsByOutcome = {};
21
+ let injectionsTotal = 0;
22
+ let injectionsResolved = 0;
23
+ for (const row of injectionRows) {
24
+ injectionsTotal += row.count;
25
+ const key = row.outcome ?? "unresolved";
26
+ injectionsByOutcome[key] = row.count;
27
+ if (row.outcome) injectionsResolved += row.count;
28
+ }
29
+ const followed = injectionsByOutcome.followed ?? 0;
30
+ const followedRate = injectionsResolved > 0 ? followed / injectionsResolved : null;
31
+ const feedbackRows = db.select({
32
+ outcome: feedbackEvents.outcome,
33
+ count: sql`count(*)`.as("count")
34
+ }).from(feedbackEvents).where(and(gte(feedbackEvents.timestamp, start))).groupBy(feedbackEvents.outcome).all();
35
+ const feedbackByOutcome = {};
36
+ let feedbackTotal = 0;
37
+ for (const row of feedbackRows) {
38
+ feedbackTotal += row.count;
39
+ feedbackByOutcome[row.outcome] = row.count;
40
+ }
41
+ const historyRow = db.select({
42
+ total: sql`count(*)`.as("total"),
43
+ unique_snippets: sql`count(distinct ${historyInjections.snippet_id})`.as("unique_snippets")
44
+ }).from(historyInjections).where(gte(historyInjections.injected_at, start)).get();
45
+ return {
46
+ window_start: start,
47
+ window_end: end,
48
+ injections: {
49
+ total: injectionsTotal,
50
+ resolved: injectionsResolved,
51
+ unresolved: injectionsTotal - injectionsResolved,
52
+ by_outcome: injectionsByOutcome,
53
+ followed_rate_resolved: followedRate
54
+ },
55
+ feedback_events: {
56
+ total: feedbackTotal,
57
+ by_outcome: feedbackByOutcome
58
+ },
59
+ history_injections: {
60
+ total: Number(historyRow?.total ?? 0),
61
+ unique_snippets: Number(historyRow?.unique_snippets ?? 0)
62
+ }
63
+ };
64
+ }
65
+ function recordQualitySnapshot(db, report, notes) {
66
+ const counts = report.injections.by_outcome;
67
+ const ruleRow = db.select({ n: sql`count(*)` }).from(memories).where(and(eq(memories.status, "active"), eq(memories.type, "rule"))).get();
68
+ const cmdRow = db.select({ n: sql`count(*)` }).from(memories).where(and(eq(memories.status, "active"), eq(memories.type, "command"))).get();
69
+ const candRow = db.select({ n: sql`count(*)` }).from(memories).where(and(eq(memories.status, "candidate"), eq(memories.source, "user_correction"))).get();
70
+ const row = {
71
+ id: randomUUID(),
72
+ taken_at: (/* @__PURE__ */ new Date()).toISOString(),
73
+ window_start: report.window_start,
74
+ window_end: report.window_end,
75
+ injections_total: report.injections.total,
76
+ injections_resolved: report.injections.resolved,
77
+ injections_followed: counts.followed ?? 0,
78
+ injections_overridden: counts.overridden ?? 0,
79
+ injections_contradicted: counts.contradicted ?? 0,
80
+ injections_ignored: counts.ignored ?? 0,
81
+ followed_rate_resolved: report.injections.followed_rate_resolved,
82
+ active_rule_count: ruleRow?.n ?? 0,
83
+ active_command_count: cmdRow?.n ?? 0,
84
+ candidate_correction_count: candRow?.n ?? 0,
85
+ history_injections_total: report.history_injections.total,
86
+ history_snippets_injected: report.history_injections.unique_snippets,
87
+ notes: notes ?? null
88
+ };
89
+ db.insert(qualitySnapshots).values(row).run();
90
+ return row;
91
+ }
92
+ function listQualitySnapshots(db, limit = 20) {
93
+ return db.select().from(qualitySnapshots).orderBy(desc(qualitySnapshots.taken_at)).limit(limit).all();
94
+ }
95
+ function diffQualitySnapshots(prev, curr) {
96
+ const prevRate = prev.followed_rate_resolved ?? 0;
97
+ const currRate = curr.followed_rate_resolved ?? 0;
98
+ return {
99
+ days_apart: (new Date(curr.taken_at).getTime() - new Date(prev.taken_at).getTime()) / 864e5,
100
+ followed_rate_delta_pp: (currRate - prevRate) * 100,
101
+ resolved_delta: curr.injections_resolved - prev.injections_resolved,
102
+ followed_delta: curr.injections_followed - prev.injections_followed,
103
+ contradicted_delta: curr.injections_contradicted - prev.injections_contradicted,
104
+ active_rule_delta: curr.active_rule_count - prev.active_rule_count,
105
+ candidate_delta: curr.candidate_correction_count - prev.candidate_correction_count,
106
+ history_injections_delta: curr.history_injections_total - prev.history_injections_total,
107
+ history_snippets_delta: curr.history_snippets_injected - prev.history_snippets_injected
108
+ };
109
+ }
110
+ function formatQualityReport(r) {
111
+ const lines = [];
112
+ lines.push(`Quality window: ${r.window_start.slice(0, 10)} \u2192 ${r.window_end.slice(0, 10)}`);
113
+ lines.push("");
114
+ lines.push("Injections:");
115
+ lines.push(` total: ${r.injections.total}`);
116
+ lines.push(` resolved: ${r.injections.resolved}`);
117
+ lines.push(` unresolved: ${r.injections.unresolved}`);
118
+ for (const [k, v] of Object.entries(r.injections.by_outcome)) {
119
+ lines.push(` ${k.padEnd(12)} ${v}`);
120
+ }
121
+ if (r.injections.followed_rate_resolved != null) {
122
+ lines.push(` followed rate (of resolved): ${(r.injections.followed_rate_resolved * 100).toFixed(1)}%`);
123
+ } else {
124
+ lines.push(` followed rate (of resolved): n/a (no resolved injections in window)`);
125
+ }
126
+ lines.push("");
127
+ lines.push("Feedback events:");
128
+ lines.push(` total: ${r.feedback_events.total}`);
129
+ for (const [k, v] of Object.entries(r.feedback_events.by_outcome)) {
130
+ lines.push(` ${k.padEnd(12)} ${v}`);
131
+ }
132
+ lines.push("");
133
+ lines.push("History injections:");
134
+ lines.push(` total: ${r.history_injections.total}`);
135
+ lines.push(` snippets: ${r.history_injections.unique_snippets}`);
136
+ return lines.join("\n");
137
+ }
138
+
139
+ export {
140
+ computeQualityReport,
141
+ recordQualitySnapshot,
142
+ listQualitySnapshots,
143
+ diffQualitySnapshots,
144
+ formatQualityReport
145
+ };
146
+ //# sourceMappingURL=chunk-LVQW6WHK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/maintenance/quality.ts"],"sourcesContent":["import { and, desc, eq, gte, sql } from \"drizzle-orm\";\nimport { randomUUID } from \"node:crypto\";\nimport type { RecallDb } from \"../db/client.js\";\nimport { feedbackEvents, historyInjections, memories, memoryInjections, qualitySnapshots } from \"../db/schema.js\";\n\nexport interface QualityReport {\n window_start: string;\n window_end: string;\n injections: {\n total: number;\n resolved: number;\n unresolved: number;\n by_outcome: Record<string, number>;\n followed_rate_resolved: number | null;\n };\n feedback_events: {\n total: number;\n by_outcome: Record<string, number>;\n };\n history_injections: {\n total: number;\n unique_snippets: number;\n };\n}\n\nexport function computeQualityReport(\n db: RecallDb,\n opts: { sinceIso?: string } = {},\n): QualityReport {\n const now = new Date();\n const start = opts.sinceIso ?? new Date(now.getTime() - 14 * 86_400_000).toISOString();\n const end = now.toISOString();\n\n const injectionRows = db.select({\n outcome: memoryInjections.outcome,\n count: sql<number>`count(*)`.as(\"count\"),\n })\n .from(memoryInjections)\n .where(gte(memoryInjections.injected_at, start))\n .groupBy(memoryInjections.outcome)\n .all();\n\n const injectionsByOutcome: Record<string, number> = {};\n let injectionsTotal = 0;\n let injectionsResolved = 0;\n for (const row of injectionRows) {\n injectionsTotal += row.count;\n const key = row.outcome ?? \"unresolved\";\n injectionsByOutcome[key] = row.count;\n if (row.outcome) injectionsResolved += row.count;\n }\n const followed = injectionsByOutcome.followed ?? 0;\n const followedRate = injectionsResolved > 0 ? followed / injectionsResolved : null;\n\n const feedbackRows = db.select({\n outcome: feedbackEvents.outcome,\n count: sql<number>`count(*)`.as(\"count\"),\n })\n .from(feedbackEvents)\n .where(and(gte(feedbackEvents.timestamp, start)))\n .groupBy(feedbackEvents.outcome)\n .all();\n\n const feedbackByOutcome: Record<string, number> = {};\n let feedbackTotal = 0;\n for (const row of feedbackRows) {\n feedbackTotal += row.count;\n feedbackByOutcome[row.outcome] = row.count;\n }\n\n const historyRow = db.select({\n total: sql<number>`count(*)`.as(\"total\"),\n unique_snippets: sql<number>`count(distinct ${historyInjections.snippet_id})`.as(\"unique_snippets\"),\n })\n .from(historyInjections)\n .where(gte(historyInjections.injected_at, start))\n .get();\n\n return {\n window_start: start,\n window_end: end,\n injections: {\n total: injectionsTotal,\n resolved: injectionsResolved,\n unresolved: injectionsTotal - injectionsResolved,\n by_outcome: injectionsByOutcome,\n followed_rate_resolved: followedRate,\n },\n feedback_events: {\n total: feedbackTotal,\n by_outcome: feedbackByOutcome,\n },\n history_injections: {\n total: Number(historyRow?.total ?? 0),\n unique_snippets: Number(historyRow?.unique_snippets ?? 0),\n },\n };\n}\n\nexport interface QualitySnapshotRow {\n id: string;\n taken_at: string;\n window_start: string;\n window_end: string;\n injections_total: number;\n injections_resolved: number;\n injections_followed: number;\n injections_overridden: number;\n injections_contradicted: number;\n injections_ignored: number;\n followed_rate_resolved: number | null;\n active_rule_count: number;\n active_command_count: number;\n candidate_correction_count: number;\n history_injections_total: number;\n history_snippets_injected: number;\n notes: string | null;\n}\n\nexport function recordQualitySnapshot(\n db: RecallDb,\n report: QualityReport,\n notes?: string,\n): QualitySnapshotRow {\n const counts = report.injections.by_outcome;\n const ruleRow = db.select({ n: sql<number>`count(*)` }).from(memories)\n .where(and(eq(memories.status, \"active\"), eq(memories.type, \"rule\"))).get();\n const cmdRow = db.select({ n: sql<number>`count(*)` }).from(memories)\n .where(and(eq(memories.status, \"active\"), eq(memories.type, \"command\"))).get();\n const candRow = db.select({ n: sql<number>`count(*)` }).from(memories)\n .where(and(eq(memories.status, \"candidate\"), eq(memories.source, \"user_correction\"))).get();\n\n const row: QualitySnapshotRow = {\n id: randomUUID(),\n taken_at: new Date().toISOString(),\n window_start: report.window_start,\n window_end: report.window_end,\n injections_total: report.injections.total,\n injections_resolved: report.injections.resolved,\n injections_followed: counts.followed ?? 0,\n injections_overridden: counts.overridden ?? 0,\n injections_contradicted: counts.contradicted ?? 0,\n injections_ignored: counts.ignored ?? 0,\n followed_rate_resolved: report.injections.followed_rate_resolved,\n active_rule_count: ruleRow?.n ?? 0,\n active_command_count: cmdRow?.n ?? 0,\n candidate_correction_count: candRow?.n ?? 0,\n history_injections_total: report.history_injections.total,\n history_snippets_injected: report.history_injections.unique_snippets,\n notes: notes ?? null,\n };\n\n db.insert(qualitySnapshots).values(row).run();\n return row;\n}\n\nexport function listQualitySnapshots(db: RecallDb, limit = 20): QualitySnapshotRow[] {\n return db.select().from(qualitySnapshots)\n .orderBy(desc(qualitySnapshots.taken_at))\n .limit(limit)\n .all();\n}\n\nexport function diffQualitySnapshots(prev: QualitySnapshotRow, curr: QualitySnapshotRow) {\n const prevRate = prev.followed_rate_resolved ?? 0;\n const currRate = curr.followed_rate_resolved ?? 0;\n return {\n days_apart: (new Date(curr.taken_at).getTime() - new Date(prev.taken_at).getTime()) / 86_400_000,\n followed_rate_delta_pp: (currRate - prevRate) * 100,\n resolved_delta: curr.injections_resolved - prev.injections_resolved,\n followed_delta: curr.injections_followed - prev.injections_followed,\n contradicted_delta: curr.injections_contradicted - prev.injections_contradicted,\n active_rule_delta: curr.active_rule_count - prev.active_rule_count,\n candidate_delta: curr.candidate_correction_count - prev.candidate_correction_count,\n history_injections_delta: curr.history_injections_total - prev.history_injections_total,\n history_snippets_delta: curr.history_snippets_injected - prev.history_snippets_injected,\n };\n}\n\nexport function formatQualityReport(r: QualityReport): string {\n const lines: string[] = [];\n lines.push(`Quality window: ${r.window_start.slice(0, 10)} → ${r.window_end.slice(0, 10)}`);\n lines.push(\"\");\n lines.push(\"Injections:\");\n lines.push(` total: ${r.injections.total}`);\n lines.push(` resolved: ${r.injections.resolved}`);\n lines.push(` unresolved: ${r.injections.unresolved}`);\n for (const [k, v] of Object.entries(r.injections.by_outcome)) {\n lines.push(` ${k.padEnd(12)} ${v}`);\n }\n if (r.injections.followed_rate_resolved != null) {\n lines.push(` followed rate (of resolved): ${(r.injections.followed_rate_resolved * 100).toFixed(1)}%`);\n } else {\n lines.push(` followed rate (of resolved): n/a (no resolved injections in window)`);\n }\n lines.push(\"\");\n lines.push(\"Feedback events:\");\n lines.push(` total: ${r.feedback_events.total}`);\n for (const [k, v] of Object.entries(r.feedback_events.by_outcome)) {\n lines.push(` ${k.padEnd(12)} ${v}`);\n }\n lines.push(\"\");\n lines.push(\"History injections:\");\n lines.push(` total: ${r.history_injections.total}`);\n lines.push(` snippets: ${r.history_injections.unique_snippets}`);\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,KAAK,MAAM,IAAI,KAAK,WAAW;AACxC,SAAS,kBAAkB;AAwBpB,SAAS,qBACd,IACA,OAA8B,CAAC,GAChB;AACf,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,QAAQ,KAAK,YAAY,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAU,EAAE,YAAY;AACrF,QAAM,MAAM,IAAI,YAAY;AAE5B,QAAM,gBAAgB,GAAG,OAAO;AAAA,IAC9B,SAAS,iBAAiB;AAAA,IAC1B,OAAO,cAAsB,GAAG,OAAO;AAAA,EACzC,CAAC,EACE,KAAK,gBAAgB,EACrB,MAAM,IAAI,iBAAiB,aAAa,KAAK,CAAC,EAC9C,QAAQ,iBAAiB,OAAO,EAChC,IAAI;AAEP,QAAM,sBAA8C,CAAC;AACrD,MAAI,kBAAkB;AACtB,MAAI,qBAAqB;AACzB,aAAW,OAAO,eAAe;AAC/B,uBAAmB,IAAI;AACvB,UAAM,MAAM,IAAI,WAAW;AAC3B,wBAAoB,GAAG,IAAI,IAAI;AAC/B,QAAI,IAAI,QAAS,uBAAsB,IAAI;AAAA,EAC7C;AACA,QAAM,WAAW,oBAAoB,YAAY;AACjD,QAAM,eAAe,qBAAqB,IAAI,WAAW,qBAAqB;AAE9E,QAAM,eAAe,GAAG,OAAO;AAAA,IAC7B,SAAS,eAAe;AAAA,IACxB,OAAO,cAAsB,GAAG,OAAO;AAAA,EACzC,CAAC,EACE,KAAK,cAAc,EACnB,MAAM,IAAI,IAAI,eAAe,WAAW,KAAK,CAAC,CAAC,EAC/C,QAAQ,eAAe,OAAO,EAC9B,IAAI;AAEP,QAAM,oBAA4C,CAAC;AACnD,MAAI,gBAAgB;AACpB,aAAW,OAAO,cAAc;AAC9B,qBAAiB,IAAI;AACrB,sBAAkB,IAAI,OAAO,IAAI,IAAI;AAAA,EACvC;AAEA,QAAM,aAAa,GAAG,OAAO;AAAA,IAC3B,OAAO,cAAsB,GAAG,OAAO;AAAA,IACvC,iBAAiB,qBAA6B,kBAAkB,UAAU,IAAI,GAAG,iBAAiB;AAAA,EACpG,CAAC,EACE,KAAK,iBAAiB,EACtB,MAAM,IAAI,kBAAkB,aAAa,KAAK,CAAC,EAC/C,IAAI;AAEP,SAAO;AAAA,IACL,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY,kBAAkB;AAAA,MAC9B,YAAY;AAAA,MACZ,wBAAwB;AAAA,IAC1B;AAAA,IACA,iBAAiB;AAAA,MACf,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAAA,IACA,oBAAoB;AAAA,MAClB,OAAO,OAAO,YAAY,SAAS,CAAC;AAAA,MACpC,iBAAiB,OAAO,YAAY,mBAAmB,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAsBO,SAAS,sBACd,IACA,QACA,OACoB;AACpB,QAAM,SAAS,OAAO,WAAW;AACjC,QAAM,UAAU,GAAG,OAAO,EAAE,GAAG,cAAsB,CAAC,EAAE,KAAK,QAAQ,EAClE,MAAM,IAAI,GAAG,SAAS,QAAQ,QAAQ,GAAG,GAAG,SAAS,MAAM,MAAM,CAAC,CAAC,EAAE,IAAI;AAC5E,QAAM,SAAS,GAAG,OAAO,EAAE,GAAG,cAAsB,CAAC,EAAE,KAAK,QAAQ,EACjE,MAAM,IAAI,GAAG,SAAS,QAAQ,QAAQ,GAAG,GAAG,SAAS,MAAM,SAAS,CAAC,CAAC,EAAE,IAAI;AAC/E,QAAM,UAAU,GAAG,OAAO,EAAE,GAAG,cAAsB,CAAC,EAAE,KAAK,QAAQ,EAClE,MAAM,IAAI,GAAG,SAAS,QAAQ,WAAW,GAAG,GAAG,SAAS,QAAQ,iBAAiB,CAAC,CAAC,EAAE,IAAI;AAE5F,QAAM,MAA0B;AAAA,IAC9B,IAAI,WAAW;AAAA,IACf,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,IACjC,cAAc,OAAO;AAAA,IACrB,YAAY,OAAO;AAAA,IACnB,kBAAkB,OAAO,WAAW;AAAA,IACpC,qBAAqB,OAAO,WAAW;AAAA,IACvC,qBAAqB,OAAO,YAAY;AAAA,IACxC,uBAAuB,OAAO,cAAc;AAAA,IAC5C,yBAAyB,OAAO,gBAAgB;AAAA,IAChD,oBAAoB,OAAO,WAAW;AAAA,IACtC,wBAAwB,OAAO,WAAW;AAAA,IAC1C,mBAAmB,SAAS,KAAK;AAAA,IACjC,sBAAsB,QAAQ,KAAK;AAAA,IACnC,4BAA4B,SAAS,KAAK;AAAA,IAC1C,0BAA0B,OAAO,mBAAmB;AAAA,IACpD,2BAA2B,OAAO,mBAAmB;AAAA,IACrD,OAAO,SAAS;AAAA,EAClB;AAEA,KAAG,OAAO,gBAAgB,EAAE,OAAO,GAAG,EAAE,IAAI;AAC5C,SAAO;AACT;AAEO,SAAS,qBAAqB,IAAc,QAAQ,IAA0B;AACnF,SAAO,GAAG,OAAO,EAAE,KAAK,gBAAgB,EACrC,QAAQ,KAAK,iBAAiB,QAAQ,CAAC,EACvC,MAAM,KAAK,EACX,IAAI;AACT;AAEO,SAAS,qBAAqB,MAA0B,MAA0B;AACvF,QAAM,WAAW,KAAK,0BAA0B;AAChD,QAAM,WAAW,KAAK,0BAA0B;AAChD,SAAO;AAAA,IACL,aAAa,IAAI,KAAK,KAAK,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,KAAK,QAAQ,EAAE,QAAQ,KAAK;AAAA,IACtF,yBAAyB,WAAW,YAAY;AAAA,IAChD,gBAAgB,KAAK,sBAAsB,KAAK;AAAA,IAChD,gBAAgB,KAAK,sBAAsB,KAAK;AAAA,IAChD,oBAAoB,KAAK,0BAA0B,KAAK;AAAA,IACxD,mBAAmB,KAAK,oBAAoB,KAAK;AAAA,IACjD,iBAAiB,KAAK,6BAA6B,KAAK;AAAA,IACxD,0BAA0B,KAAK,2BAA2B,KAAK;AAAA,IAC/D,wBAAwB,KAAK,4BAA4B,KAAK;AAAA,EAChE;AACF;AAEO,SAAS,oBAAoB,GAA0B;AAC5D,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,mBAAmB,EAAE,aAAa,MAAM,GAAG,EAAE,CAAC,WAAM,EAAE,WAAW,MAAM,GAAG,EAAE,CAAC,EAAE;AAC1F,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,aAAa;AACxB,QAAM,KAAK,mBAAmB,EAAE,WAAW,KAAK,EAAE;AAClD,QAAM,KAAK,mBAAmB,EAAE,WAAW,QAAQ,EAAE;AACrD,QAAM,KAAK,mBAAmB,EAAE,WAAW,UAAU,EAAE;AACvD,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAE,WAAW,UAAU,GAAG;AAC5D,UAAM,KAAK,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;AAAA,EACvC;AACA,MAAI,EAAE,WAAW,0BAA0B,MAAM;AAC/C,UAAM,KAAK,mCAAmC,EAAE,WAAW,yBAAyB,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,EACxG,OAAO;AACL,UAAM,KAAK,uEAAuE;AAAA,EACpF;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,kBAAkB;AAC7B,QAAM,KAAK,mBAAmB,EAAE,gBAAgB,KAAK,EAAE;AACvD,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAE,gBAAgB,UAAU,GAAG;AACjE,UAAM,KAAK,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;AAAA,EACvC;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,qBAAqB;AAChC,QAAM,KAAK,mBAAmB,EAAE,mBAAmB,KAAK,EAAE;AAC1D,QAAM,KAAK,mBAAmB,EAAE,mBAAmB,eAAe,EAAE;AACpE,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}