p-spore 0.1.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 (261) hide show
  1. package/README.md +97 -0
  2. package/dist/agents/agent-manager.d.ts +57 -0
  3. package/dist/agents/agent-manager.d.ts.map +1 -0
  4. package/dist/agents/agent-manager.js +559 -0
  5. package/dist/agents/agent-manager.js.map +1 -0
  6. package/dist/agents/agent-tools.d.ts +4 -0
  7. package/dist/agents/agent-tools.d.ts.map +1 -0
  8. package/dist/agents/agent-tools.js +111 -0
  9. package/dist/agents/agent-tools.js.map +1 -0
  10. package/dist/agents/types.d.ts +52 -0
  11. package/dist/agents/types.d.ts.map +1 -0
  12. package/dist/agents/types.js +2 -0
  13. package/dist/agents/types.js.map +1 -0
  14. package/dist/application/agent-application.d.ts +89 -0
  15. package/dist/application/agent-application.d.ts.map +1 -0
  16. package/dist/application/agent-application.js +542 -0
  17. package/dist/application/agent-application.js.map +1 -0
  18. package/dist/automation/automation-tools.d.ts +4 -0
  19. package/dist/automation/automation-tools.d.ts.map +1 -0
  20. package/dist/automation/automation-tools.js +35 -0
  21. package/dist/automation/automation-tools.js.map +1 -0
  22. package/dist/automation/cron-adapter.d.ts +11 -0
  23. package/dist/automation/cron-adapter.d.ts.map +1 -0
  24. package/dist/automation/cron-adapter.js +48 -0
  25. package/dist/automation/cron-adapter.js.map +1 -0
  26. package/dist/automation/daemon-run-executor.d.ts +18 -0
  27. package/dist/automation/daemon-run-executor.d.ts.map +1 -0
  28. package/dist/automation/daemon-run-executor.js +69 -0
  29. package/dist/automation/daemon-run-executor.js.map +1 -0
  30. package/dist/automation/job-store.d.ts +12 -0
  31. package/dist/automation/job-store.d.ts.map +1 -0
  32. package/dist/automation/job-store.js +185 -0
  33. package/dist/automation/job-store.js.map +1 -0
  34. package/dist/automation/run-ledger.d.ts +25 -0
  35. package/dist/automation/run-ledger.d.ts.map +1 -0
  36. package/dist/automation/run-ledger.js +148 -0
  37. package/dist/automation/run-ledger.js.map +1 -0
  38. package/dist/automation/scheduler.d.ts +36 -0
  39. package/dist/automation/scheduler.d.ts.map +1 -0
  40. package/dist/automation/scheduler.js +300 -0
  41. package/dist/automation/scheduler.js.map +1 -0
  42. package/dist/automation/types.d.ts +81 -0
  43. package/dist/automation/types.d.ts.map +1 -0
  44. package/dist/automation/types.js +2 -0
  45. package/dist/automation/types.js.map +1 -0
  46. package/dist/cli/main.d.ts +4 -0
  47. package/dist/cli/main.d.ts.map +1 -0
  48. package/dist/cli/main.js +768 -0
  49. package/dist/cli/main.js.map +1 -0
  50. package/dist/config/config.d.ts +52 -0
  51. package/dist/config/config.d.ts.map +1 -0
  52. package/dist/config/config.js +345 -0
  53. package/dist/config/config.js.map +1 -0
  54. package/dist/daemon/daemon.d.ts +30 -0
  55. package/dist/daemon/daemon.d.ts.map +1 -0
  56. package/dist/daemon/daemon.js +437 -0
  57. package/dist/daemon/daemon.js.map +1 -0
  58. package/dist/daemon/supervisor.d.ts +18 -0
  59. package/dist/daemon/supervisor.d.ts.map +1 -0
  60. package/dist/daemon/supervisor.js +37 -0
  61. package/dist/daemon/supervisor.js.map +1 -0
  62. package/dist/desktop/daemon-bridge.d.ts +32 -0
  63. package/dist/desktop/daemon-bridge.d.ts.map +1 -0
  64. package/dist/desktop/daemon-bridge.js +204 -0
  65. package/dist/desktop/daemon-bridge.js.map +1 -0
  66. package/dist/desktop/daemon-supervisor.d.ts +2 -0
  67. package/dist/desktop/daemon-supervisor.d.ts.map +1 -0
  68. package/dist/desktop/daemon-supervisor.js +2 -0
  69. package/dist/desktop/daemon-supervisor.js.map +1 -0
  70. package/dist/desktop/ipc-contract.d.ts +153 -0
  71. package/dist/desktop/ipc-contract.d.ts.map +1 -0
  72. package/dist/desktop/ipc-contract.js +219 -0
  73. package/dist/desktop/ipc-contract.js.map +1 -0
  74. package/dist/desktop/main.d.ts +2 -0
  75. package/dist/desktop/main.d.ts.map +1 -0
  76. package/dist/desktop/main.js +594 -0
  77. package/dist/desktop/main.js.map +1 -0
  78. package/dist/desktop/preload.cjs +32 -0
  79. package/dist/desktop/renderer/index.html +284 -0
  80. package/dist/desktop/renderer/renderer.d.ts +2 -0
  81. package/dist/desktop/renderer/renderer.d.ts.map +1 -0
  82. package/dist/desktop/renderer/renderer.js +895 -0
  83. package/dist/desktop/renderer/renderer.js.map +1 -0
  84. package/dist/desktop/renderer/store.d.ts +33 -0
  85. package/dist/desktop/renderer/store.d.ts.map +1 -0
  86. package/dist/desktop/renderer/store.js +144 -0
  87. package/dist/desktop/renderer/store.js.map +1 -0
  88. package/dist/desktop/renderer/styles.css +540 -0
  89. package/dist/desktop/security.d.ts +5 -0
  90. package/dist/desktop/security.d.ts.map +1 -0
  91. package/dist/desktop/security.js +49 -0
  92. package/dist/desktop/security.js.map +1 -0
  93. package/dist/desktop/smoke-fixture.d.ts +3 -0
  94. package/dist/desktop/smoke-fixture.d.ts.map +1 -0
  95. package/dist/desktop/smoke-fixture.js +223 -0
  96. package/dist/desktop/smoke-fixture.js.map +1 -0
  97. package/dist/desktop/validation.d.ts +8 -0
  98. package/dist/desktop/validation.d.ts.map +1 -0
  99. package/dist/desktop/validation.js +341 -0
  100. package/dist/desktop/validation.js.map +1 -0
  101. package/dist/domain/runtime.d.ts +116 -0
  102. package/dist/domain/runtime.d.ts.map +1 -0
  103. package/dist/domain/runtime.js +2 -0
  104. package/dist/domain/runtime.js.map +1 -0
  105. package/dist/gateway/local-gateway.d.ts +23 -0
  106. package/dist/gateway/local-gateway.d.ts.map +1 -0
  107. package/dist/gateway/local-gateway.js +265 -0
  108. package/dist/gateway/local-gateway.js.map +1 -0
  109. package/dist/kernel/loop.d.ts +10 -0
  110. package/dist/kernel/loop.d.ts.map +1 -0
  111. package/dist/kernel/loop.js +41 -0
  112. package/dist/kernel/loop.js.map +1 -0
  113. package/dist/kernel/reducer.d.ts +3 -0
  114. package/dist/kernel/reducer.d.ts.map +1 -0
  115. package/dist/kernel/reducer.js +102 -0
  116. package/dist/kernel/reducer.js.map +1 -0
  117. package/dist/kernel/state.d.ts +93 -0
  118. package/dist/kernel/state.d.ts.map +1 -0
  119. package/dist/kernel/state.js +15 -0
  120. package/dist/kernel/state.js.map +1 -0
  121. package/dist/mcp/mcp-manager.d.ts +55 -0
  122. package/dist/mcp/mcp-manager.d.ts.map +1 -0
  123. package/dist/mcp/mcp-manager.js +591 -0
  124. package/dist/mcp/mcp-manager.js.map +1 -0
  125. package/dist/mcp/mcp-tools.d.ts +4 -0
  126. package/dist/mcp/mcp-tools.d.ts.map +1 -0
  127. package/dist/mcp/mcp-tools.js +53 -0
  128. package/dist/mcp/mcp-tools.js.map +1 -0
  129. package/dist/mcp/types.d.ts +73 -0
  130. package/dist/mcp/types.d.ts.map +1 -0
  131. package/dist/mcp/types.js +2 -0
  132. package/dist/mcp/types.js.map +1 -0
  133. package/dist/memory/bm25.d.ts +14 -0
  134. package/dist/memory/bm25.d.ts.map +1 -0
  135. package/dist/memory/bm25.js +40 -0
  136. package/dist/memory/bm25.js.map +1 -0
  137. package/dist/memory/context-loader.d.ts +26 -0
  138. package/dist/memory/context-loader.d.ts.map +1 -0
  139. package/dist/memory/context-loader.js +97 -0
  140. package/dist/memory/context-loader.js.map +1 -0
  141. package/dist/memory/memory-service.d.ts +30 -0
  142. package/dist/memory/memory-service.d.ts.map +1 -0
  143. package/dist/memory/memory-service.js +133 -0
  144. package/dist/memory/memory-service.js.map +1 -0
  145. package/dist/memory/memory-tools.d.ts +4 -0
  146. package/dist/memory/memory-tools.d.ts.map +1 -0
  147. package/dist/memory/memory-tools.js +49 -0
  148. package/dist/memory/memory-tools.js.map +1 -0
  149. package/dist/memory/search-service.d.ts +38 -0
  150. package/dist/memory/search-service.d.ts.map +1 -0
  151. package/dist/memory/search-service.js +463 -0
  152. package/dist/memory/search-service.js.map +1 -0
  153. package/dist/memory/tokenizer.d.ts +5 -0
  154. package/dist/memory/tokenizer.d.ts.map +1 -0
  155. package/dist/memory/tokenizer.js +42 -0
  156. package/dist/memory/tokenizer.js.map +1 -0
  157. package/dist/notifications/notification-service.d.ts +47 -0
  158. package/dist/notifications/notification-service.d.ts.map +1 -0
  159. package/dist/notifications/notification-service.js +163 -0
  160. package/dist/notifications/notification-service.js.map +1 -0
  161. package/dist/notifications/notification-tools.d.ts +4 -0
  162. package/dist/notifications/notification-tools.d.ts.map +1 -0
  163. package/dist/notifications/notification-tools.js +31 -0
  164. package/dist/notifications/notification-tools.js.map +1 -0
  165. package/dist/pi/pi-runtime-adapter.d.ts +38 -0
  166. package/dist/pi/pi-runtime-adapter.d.ts.map +1 -0
  167. package/dist/pi/pi-runtime-adapter.js +483 -0
  168. package/dist/pi/pi-runtime-adapter.js.map +1 -0
  169. package/dist/plugins/extension-manager.d.ts +32 -0
  170. package/dist/plugins/extension-manager.d.ts.map +1 -0
  171. package/dist/plugins/extension-manager.js +562 -0
  172. package/dist/plugins/extension-manager.js.map +1 -0
  173. package/dist/plugins/resource-inspector.d.ts +18 -0
  174. package/dist/plugins/resource-inspector.d.ts.map +1 -0
  175. package/dist/plugins/resource-inspector.js +386 -0
  176. package/dist/plugins/resource-inspector.js.map +1 -0
  177. package/dist/plugins/types.d.ts +96 -0
  178. package/dist/plugins/types.d.ts.map +1 -0
  179. package/dist/plugins/types.js +2 -0
  180. package/dist/plugins/types.js.map +1 -0
  181. package/dist/policy/approval-service.d.ts +68 -0
  182. package/dist/policy/approval-service.d.ts.map +1 -0
  183. package/dist/policy/approval-service.js +349 -0
  184. package/dist/policy/approval-service.js.map +1 -0
  185. package/dist/policy/policy.d.ts +26 -0
  186. package/dist/policy/policy.d.ts.map +1 -0
  187. package/dist/policy/policy.js +228 -0
  188. package/dist/policy/policy.js.map +1 -0
  189. package/dist/protocol/client.d.ts +25 -0
  190. package/dist/protocol/client.d.ts.map +1 -0
  191. package/dist/protocol/client.js +188 -0
  192. package/dist/protocol/client.js.map +1 -0
  193. package/dist/protocol/errors.d.ts +5 -0
  194. package/dist/protocol/errors.d.ts.map +1 -0
  195. package/dist/protocol/errors.js +9 -0
  196. package/dist/protocol/errors.js.map +1 -0
  197. package/dist/protocol/schema.d.ts +71 -0
  198. package/dist/protocol/schema.d.ts.map +1 -0
  199. package/dist/protocol/schema.js +155 -0
  200. package/dist/protocol/schema.js.map +1 -0
  201. package/dist/settings/llm-settings-service.d.ts +9 -0
  202. package/dist/settings/llm-settings-service.d.ts.map +1 -0
  203. package/dist/settings/llm-settings-service.js +199 -0
  204. package/dist/settings/llm-settings-service.js.map +1 -0
  205. package/dist/settings/llm-settings.d.ts +29 -0
  206. package/dist/settings/llm-settings.d.ts.map +1 -0
  207. package/dist/settings/llm-settings.js +113 -0
  208. package/dist/settings/llm-settings.js.map +1 -0
  209. package/dist/shell/shell-service.d.ts +88 -0
  210. package/dist/shell/shell-service.d.ts.map +1 -0
  211. package/dist/shell/shell-service.js +459 -0
  212. package/dist/shell/shell-service.js.map +1 -0
  213. package/dist/storage/atomic.d.ts +4 -0
  214. package/dist/storage/atomic.d.ts.map +1 -0
  215. package/dist/storage/atomic.js +49 -0
  216. package/dist/storage/atomic.js.map +1 -0
  217. package/dist/storage/daemon-lock.d.ts +17 -0
  218. package/dist/storage/daemon-lock.d.ts.map +1 -0
  219. package/dist/storage/daemon-lock.js +97 -0
  220. package/dist/storage/daemon-lock.js.map +1 -0
  221. package/dist/storage/home.d.ts +29 -0
  222. package/dist/storage/home.d.ts.map +1 -0
  223. package/dist/storage/home.js +108 -0
  224. package/dist/storage/home.js.map +1 -0
  225. package/dist/storage/jsonl.d.ts +2 -0
  226. package/dist/storage/jsonl.d.ts.map +1 -0
  227. package/dist/storage/jsonl.js +45 -0
  228. package/dist/storage/jsonl.js.map +1 -0
  229. package/dist/tools/core-tools.d.ts +16 -0
  230. package/dist/tools/core-tools.d.ts.map +1 -0
  231. package/dist/tools/core-tools.js +283 -0
  232. package/dist/tools/core-tools.js.map +1 -0
  233. package/dist/ui/shared/presentation.d.ts +46 -0
  234. package/dist/ui/shared/presentation.d.ts.map +1 -0
  235. package/dist/ui/shared/presentation.js +81 -0
  236. package/dist/ui/shared/presentation.js.map +1 -0
  237. package/dist/ui/shared/protocol-state.d.ts +30 -0
  238. package/dist/ui/shared/protocol-state.d.ts.map +1 -0
  239. package/dist/ui/shared/protocol-state.js +165 -0
  240. package/dist/ui/shared/protocol-state.js.map +1 -0
  241. package/dist/ui/tui/commands.d.ts +2 -0
  242. package/dist/ui/tui/commands.d.ts.map +1 -0
  243. package/dist/ui/tui/commands.js +33 -0
  244. package/dist/ui/tui/commands.js.map +1 -0
  245. package/dist/ui/tui/store.d.ts +32 -0
  246. package/dist/ui/tui/store.d.ts.map +1 -0
  247. package/dist/ui/tui/store.js +62 -0
  248. package/dist/ui/tui/store.js.map +1 -0
  249. package/dist/ui/tui/tui-app.d.ts +21 -0
  250. package/dist/ui/tui/tui-app.d.ts.map +1 -0
  251. package/dist/ui/tui/tui-app.js +643 -0
  252. package/dist/ui/tui/tui-app.js.map +1 -0
  253. package/dist/ui/tui/view.d.ts +29 -0
  254. package/dist/ui/tui/view.d.ts.map +1 -0
  255. package/dist/ui/tui/view.js +255 -0
  256. package/dist/ui/tui/view.js.map +1 -0
  257. package/dist/version.d.ts +5 -0
  258. package/dist/version.d.ts.map +1 -0
  259. package/dist/version.js +5 -0
  260. package/dist/version.js.map +1 -0
  261. package/package.json +62 -0
@@ -0,0 +1,38 @@
1
+ export type SearchScope = "memory" | "sessions" | "workspace" | "project";
2
+ export type SearchMode = "auto" | "exact" | "bm25";
3
+ export interface SearchQuery {
4
+ query: string;
5
+ scopes?: readonly SearchScope[];
6
+ mode?: SearchMode;
7
+ pathPrefix?: string;
8
+ glob?: string;
9
+ maxResults: number;
10
+ maxReturnedTokens: number;
11
+ }
12
+ export interface SearchHit {
13
+ ref: string;
14
+ scope: SearchScope;
15
+ path: string;
16
+ line: number;
17
+ heading?: string;
18
+ score: number;
19
+ mtimeMs: number;
20
+ snippet: string;
21
+ contentSha256: string;
22
+ }
23
+ export interface SearchServiceOptions {
24
+ workspaceRoot: string;
25
+ sessionsRoot: string;
26
+ cachePath: string;
27
+ projectRoot?: string;
28
+ maxFileBytes?: number;
29
+ chunkTargetTokens?: number;
30
+ chunkOverlapTokens?: number;
31
+ }
32
+ export declare class SearchService {
33
+ #private;
34
+ constructor(options: SearchServiceOptions);
35
+ search(query: SearchQuery, signal?: AbortSignal): Promise<SearchHit[]>;
36
+ ensureIndexed(signal?: AbortSignal): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=search-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-service.d.ts","sourceRoot":"","sources":["../../src/memory/search-service.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AA8ED,qBAAa,aAAa;;gBAKZ,OAAO,EAAE,oBAAoB;IAInC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0E5E,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAkDnD"}
@@ -0,0 +1,463 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readdir, readFile, realpath, stat } from "node:fs/promises";
3
+ import { extname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
+ import { atomicWriteJson } from "../storage/atomic.js";
5
+ import { rankBm25 } from "./bm25.js";
6
+ import { estimateTokens, tokenize } from "./tokenizer.js";
7
+ const SKIP_DIRECTORIES = new Set([
8
+ ".git",
9
+ "node_modules",
10
+ "dist",
11
+ "build",
12
+ "coverage",
13
+ "cache",
14
+ ".cache",
15
+ "credentials",
16
+ ".ssh",
17
+ ".gnupg",
18
+ "trash",
19
+ ]);
20
+ const TEXT_EXTENSIONS = new Set([
21
+ ".md",
22
+ ".txt",
23
+ ".jsonl",
24
+ ".json",
25
+ ".ts",
26
+ ".tsx",
27
+ ".js",
28
+ ".jsx",
29
+ ".mjs",
30
+ ".cjs",
31
+ ".py",
32
+ ".rs",
33
+ ".go",
34
+ ".java",
35
+ ".c",
36
+ ".h",
37
+ ".cpp",
38
+ ".hpp",
39
+ ".sh",
40
+ ".bash",
41
+ ".zsh",
42
+ ".yaml",
43
+ ".yml",
44
+ ".toml",
45
+ ".ini",
46
+ ".sql",
47
+ ".css",
48
+ ".html",
49
+ ".xml",
50
+ ]);
51
+ const SENSITIVE_FILE = /(^\.env(?:\.|$)|credentials?|secrets?|id_(?:rsa|ed25519)|\.(?:pem|key|p12|pfx|crt|cer)$)/i;
52
+ export class SearchService {
53
+ #options;
54
+ #cache;
55
+ #indexing;
56
+ constructor(options) {
57
+ this.#options = options;
58
+ }
59
+ async search(query, signal) {
60
+ validateQuery(query);
61
+ throwIfAborted(signal);
62
+ await this.ensureIndexed(signal);
63
+ const cache = this.#cache ?? { version: 1, files: {} };
64
+ const scopes = new Set(query.scopes ?? ["memory", "sessions", "workspace", "project"]);
65
+ const prefix = query.pathPrefix ? await canonicalPrefix(query.pathPrefix, this.#options.workspaceRoot) : undefined;
66
+ const chunks = Object.values(cache.files)
67
+ .flatMap((file) => file.chunks)
68
+ .filter((chunk) => scopes.has(chunk.scope) &&
69
+ (!prefix || isWithin(prefix, chunk.path)) &&
70
+ (!query.glob || matchesGlob(chunk.path, query.glob)));
71
+ const bm25 = new Map(rankBm25(query.query, chunks.map((chunk) => ({ id: chunk.id, text: `${chunk.heading ?? ""}\n${chunk.text}` }))).map((score) => [score.id, score.score]));
72
+ const normalizedQuery = query.query.normalize("NFKC").toLocaleLowerCase("und");
73
+ const queryTokens = [...new Set(tokenize(query.query))];
74
+ const ranked = chunks
75
+ .map((chunk) => {
76
+ const searchable = `${chunk.heading ?? ""}\n${chunk.text}`.normalize("NFKC").toLocaleLowerCase("und");
77
+ const exact = searchable.includes(normalizedQuery);
78
+ const lexicalOverlap = queryTokens.filter((token) => searchable.includes(token)).length;
79
+ const lexicalScore = bm25.get(chunk.id) ?? 0;
80
+ const score = lexicalScore + (exact ? 8 : 0) + lexicalOverlap * 0.05;
81
+ return { chunk, exact, score };
82
+ })
83
+ .filter((item) => {
84
+ const mode = query.mode ?? "auto";
85
+ if (mode === "exact")
86
+ return item.exact;
87
+ if (mode === "bm25")
88
+ return (bm25.get(item.chunk.id) ?? 0) > 0;
89
+ return item.score > 0;
90
+ })
91
+ .sort((left, right) => right.score - left.score ||
92
+ left.chunk.path.localeCompare(right.chunk.path) ||
93
+ left.chunk.line - right.chunk.line);
94
+ const hits = [];
95
+ let returnedTokens = 0;
96
+ for (const item of ranked) {
97
+ if (hits.length >= query.maxResults)
98
+ break;
99
+ throwIfAborted(signal);
100
+ let snippet = makeSnippet(item.chunk.text, query.query, 900);
101
+ let tokens = estimateTokens(snippet);
102
+ const remainingTokens = query.maxReturnedTokens - returnedTokens;
103
+ if (remainingTokens <= 0)
104
+ break;
105
+ if (tokens > remainingTokens) {
106
+ snippet = limitTextByTokens(snippet, remainingTokens);
107
+ tokens = estimateTokens(snippet);
108
+ }
109
+ returnedTokens += tokens;
110
+ hits.push({
111
+ ref: `source:${item.chunk.contentSha256.slice(0, 16)}:${item.chunk.line}`,
112
+ scope: item.chunk.scope,
113
+ path: item.chunk.path,
114
+ line: item.chunk.line,
115
+ ...(item.chunk.heading === undefined ? {} : { heading: item.chunk.heading }),
116
+ score: Number(item.score.toFixed(6)),
117
+ mtimeMs: item.chunk.mtimeMs,
118
+ snippet,
119
+ contentSha256: item.chunk.contentSha256,
120
+ });
121
+ }
122
+ return hits;
123
+ }
124
+ ensureIndexed(signal) {
125
+ this.#indexing ??= this.#refresh(signal).finally(() => {
126
+ this.#indexing = undefined;
127
+ });
128
+ return this.#indexing;
129
+ }
130
+ async #refresh(signal) {
131
+ const previous = this.#cache ?? (await loadCache(this.#options.cachePath));
132
+ const candidates = await discoverCandidates(this.#options, signal);
133
+ const files = {};
134
+ let changed = Object.keys(previous.files).length !== candidates.length;
135
+ for (const candidate of candidates) {
136
+ throwIfAborted(signal);
137
+ const metadata = await stat(candidate.path);
138
+ const maxFileBytes = this.#options.maxFileBytes ?? 2 * 1024 * 1024;
139
+ if (!metadata.isFile() || metadata.size > maxFileBytes)
140
+ continue;
141
+ const content = await readFile(candidate.path);
142
+ if (content.includes(0))
143
+ continue;
144
+ const contentSha256 = createHash("sha256").update(content).digest("hex");
145
+ const cached = previous.files[candidate.path];
146
+ if (cached &&
147
+ cached.scope === candidate.scope &&
148
+ cached.size === metadata.size &&
149
+ cached.mtimeMs === metadata.mtimeMs &&
150
+ cached.contentSha256 === contentSha256) {
151
+ files[candidate.path] = cached;
152
+ continue;
153
+ }
154
+ changed = true;
155
+ const text = content.toString("utf8");
156
+ const chunks = chunkDocument(candidate, text, contentSha256, metadata.mtimeMs, {
157
+ targetTokens: this.#options.chunkTargetTokens ?? 600,
158
+ overlapTokens: this.#options.chunkOverlapTokens ?? 80,
159
+ });
160
+ files[candidate.path] = {
161
+ path: candidate.path,
162
+ scope: candidate.scope,
163
+ size: metadata.size,
164
+ mtimeMs: metadata.mtimeMs,
165
+ contentSha256,
166
+ chunks,
167
+ };
168
+ }
169
+ const next = { version: 1, files };
170
+ this.#cache = next;
171
+ if (changed || !(await cacheExists(this.#options.cachePath)))
172
+ await atomicWriteJson(this.#options.cachePath, next, 0o600);
173
+ }
174
+ }
175
+ async function discoverCandidates(options, signal) {
176
+ const workspace = await realpath(options.workspaceRoot);
177
+ const sessions = await realpath(options.sessionsRoot);
178
+ const roots = [
179
+ { root: workspace, defaultScope: "workspace" },
180
+ { root: sessions, defaultScope: "sessions" },
181
+ ];
182
+ if (options.projectRoot) {
183
+ const project = await realpath(options.projectRoot);
184
+ if (project !== workspace && project !== sessions)
185
+ roots.push({ root: project, defaultScope: "project" });
186
+ }
187
+ const found = new Map();
188
+ for (const source of roots)
189
+ await walk(source.root, source.root, source.defaultScope, found, signal);
190
+ return [...found.values()].sort((left, right) => left.path.localeCompare(right.path));
191
+ }
192
+ async function walk(root, directory, defaultScope, found, signal) {
193
+ throwIfAborted(signal);
194
+ const entries = await readdir(directory, { withFileTypes: true });
195
+ entries.sort((left, right) => left.name.localeCompare(right.name));
196
+ for (const entry of entries) {
197
+ throwIfAborted(signal);
198
+ if (entry.isSymbolicLink())
199
+ continue;
200
+ const path = join(directory, entry.name);
201
+ if (entry.isDirectory()) {
202
+ if (!SKIP_DIRECTORIES.has(entry.name))
203
+ await walk(root, path, defaultScope, found, signal);
204
+ continue;
205
+ }
206
+ if (!entry.isFile() || !isTextCandidate(entry.name))
207
+ continue;
208
+ const canonical = await realpath(path);
209
+ if (!isWithin(root, canonical))
210
+ continue;
211
+ const relativePath = relative(root, canonical).split(sep).join("/");
212
+ const scope = defaultScope === "workspace" && (relativePath === "MEMORY.md" || relativePath.startsWith("memory/"))
213
+ ? "memory"
214
+ : defaultScope;
215
+ const existing = found.get(canonical);
216
+ if (!existing || scopePriority(scope) < scopePriority(existing.scope))
217
+ found.set(canonical, { path: canonical, scope });
218
+ }
219
+ }
220
+ function chunkDocument(candidate, text, contentSha256, mtimeMs, budget) {
221
+ const extension = extname(candidate.path).toLowerCase();
222
+ const units = extension === ".jsonl" ? jsonlUnits(text) : textUnits(text, extension === ".md");
223
+ const chunks = [];
224
+ let current = [];
225
+ let currentTokens = 0;
226
+ const flush = () => {
227
+ if (current.length === 0)
228
+ return;
229
+ const content = current.map((unit) => unit.text).join("\n\n");
230
+ const first = current[0];
231
+ if (!first)
232
+ return;
233
+ const index = chunks.length;
234
+ chunks.push({
235
+ id: createHash("sha256").update(`${candidate.path}\0${contentSha256}\0${index}`).digest("hex"),
236
+ scope: candidate.scope,
237
+ path: candidate.path,
238
+ line: first.line,
239
+ ...(first.heading ? { heading: first.heading } : {}),
240
+ text: content,
241
+ contentSha256,
242
+ mtimeMs,
243
+ });
244
+ };
245
+ for (const unit of units) {
246
+ const unitTokens = estimateTokens(unit.text);
247
+ if (current.length > 0 && currentTokens + unitTokens > budget.targetTokens) {
248
+ flush();
249
+ const overlap = [];
250
+ let overlapTokens = 0;
251
+ for (const prior of [...current].reverse()) {
252
+ const priorTokens = estimateTokens(prior.text);
253
+ if (overlap.length > 0 && overlapTokens + priorTokens > budget.overlapTokens)
254
+ break;
255
+ overlap.unshift(prior);
256
+ overlapTokens += priorTokens;
257
+ }
258
+ current = overlap;
259
+ currentTokens = overlapTokens;
260
+ }
261
+ current.push(unit);
262
+ currentTokens += unitTokens;
263
+ }
264
+ flush();
265
+ return chunks;
266
+ }
267
+ function textUnits(text, markdown) {
268
+ const lines = text.split("\n");
269
+ const units = [];
270
+ let heading;
271
+ let paragraph = [];
272
+ let paragraphLine = 1;
273
+ const flush = () => {
274
+ const content = paragraph.join("\n").trim();
275
+ if (content)
276
+ units.push({ line: paragraphLine, ...(heading ? { heading } : {}), text: content });
277
+ paragraph = [];
278
+ };
279
+ for (let index = 0; index < lines.length; index++) {
280
+ const line = lines[index] ?? "";
281
+ const match = markdown ? /^(#{1,6})\s+(.+)$/.exec(line) : undefined;
282
+ if (match) {
283
+ flush();
284
+ heading = match[2]?.trim();
285
+ paragraphLine = index + 2;
286
+ continue;
287
+ }
288
+ if (!line.trim()) {
289
+ flush();
290
+ paragraphLine = index + 2;
291
+ }
292
+ else {
293
+ if (paragraph.length === 0)
294
+ paragraphLine = index + 1;
295
+ paragraph.push(line);
296
+ }
297
+ }
298
+ flush();
299
+ return units;
300
+ }
301
+ function jsonlUnits(text) {
302
+ const lines = text.split("\n");
303
+ const lastContentIndex = lines.findLastIndex((line) => Boolean(line?.trim()));
304
+ const units = [];
305
+ for (let index = 0; index <= lastContentIndex; index++) {
306
+ const line = lines[index]?.trim();
307
+ if (!line)
308
+ continue;
309
+ let value;
310
+ try {
311
+ value = JSON.parse(line);
312
+ }
313
+ catch {
314
+ if (index === lastContentIndex)
315
+ break;
316
+ throw new Error(`Malformed JSONL at line ${index + 1}`);
317
+ }
318
+ const rendered = renderJsonlEntry(value);
319
+ if (rendered)
320
+ units.push({ line: index + 1, heading: rendered.heading, text: rendered.text });
321
+ }
322
+ return units;
323
+ }
324
+ function renderJsonlEntry(value) {
325
+ if (!isRecord(value))
326
+ return undefined;
327
+ const type = typeof value["type"] === "string" ? value["type"] : "entry";
328
+ const message = isRecord(value["message"]) ? value["message"] : value;
329
+ const role = typeof message["role"] === "string" ? message["role"] : type;
330
+ const text = extractText(message["content"] ?? message["text"] ?? value["summary"]);
331
+ return text ? { heading: `${type}:${role}`, text } : undefined;
332
+ }
333
+ function extractText(value) {
334
+ if (typeof value === "string")
335
+ return value;
336
+ if (!Array.isArray(value))
337
+ return "";
338
+ return value
339
+ .map((item) => (isRecord(item) && typeof item["text"] === "string" ? item["text"] : ""))
340
+ .filter(Boolean)
341
+ .join("\n");
342
+ }
343
+ function makeSnippet(text, query, maxCharacters) {
344
+ if (text.length <= maxCharacters)
345
+ return text;
346
+ const normalizedText = text.normalize("NFKC").toLocaleLowerCase("und");
347
+ const normalizedQuery = query.normalize("NFKC").toLocaleLowerCase("und");
348
+ const match = normalizedText.indexOf(normalizedQuery);
349
+ const center = match >= 0 ? match : 0;
350
+ const start = Math.max(0, center - Math.floor(maxCharacters / 3));
351
+ const end = Math.min(text.length, start + maxCharacters);
352
+ return `${start > 0 ? "…" : ""}${text.slice(start, end)}${end < text.length ? "…" : ""}`;
353
+ }
354
+ async function loadCache(path) {
355
+ try {
356
+ const value = JSON.parse(await readFile(path, "utf8"));
357
+ if (!isSearchCache(value))
358
+ return { version: 1, files: {} };
359
+ return value;
360
+ }
361
+ catch {
362
+ return { version: 1, files: {} };
363
+ }
364
+ }
365
+ async function cacheExists(path) {
366
+ try {
367
+ await stat(path);
368
+ return true;
369
+ }
370
+ catch {
371
+ return false;
372
+ }
373
+ }
374
+ function isTextCandidate(name) {
375
+ if (SENSITIVE_FILE.test(name))
376
+ return false;
377
+ return TEXT_EXTENSIONS.has(extname(name).toLowerCase());
378
+ }
379
+ function scopePriority(scope) {
380
+ return { memory: 0, sessions: 1, workspace: 2, project: 3 }[scope];
381
+ }
382
+ function validateQuery(query) {
383
+ if (!query.query.trim() || query.query.length > 4_096)
384
+ throw new Error("Search query must contain 1 to 4096 characters");
385
+ if (!Number.isSafeInteger(query.maxResults) || query.maxResults < 1 || query.maxResults > 500) {
386
+ throw new Error("Search maxResults must be between 1 and 500");
387
+ }
388
+ if (!Number.isSafeInteger(query.maxReturnedTokens) || query.maxReturnedTokens < 1) {
389
+ throw new Error("Search maxReturnedTokens must be a positive safe integer");
390
+ }
391
+ }
392
+ function matchesGlob(path, glob) {
393
+ const normalizedPath = path.split(sep).join("/");
394
+ const escaped = glob
395
+ .split("")
396
+ .map((character, index, all) => {
397
+ if (character === "*" && all[index + 1] === "*")
398
+ return "__DOUBLE_STAR__";
399
+ if (character === "*" && all[index - 1] === "*")
400
+ return "";
401
+ if (character === "*")
402
+ return "[^/]*";
403
+ if (character === "?")
404
+ return "[^/]";
405
+ return character.replace(/[.+^${}()|[\]\\]/g, "\\$&");
406
+ })
407
+ .join("")
408
+ .replaceAll("__DOUBLE_STAR__", ".*");
409
+ const expression = new RegExp(`(?:^|/)${escaped}$`);
410
+ return expression.test(normalizedPath);
411
+ }
412
+ function limitTextByTokens(text, maxTokens) {
413
+ if (estimateTokens(text) <= maxTokens)
414
+ return text;
415
+ let low = 0;
416
+ let high = text.length;
417
+ while (low < high) {
418
+ const middle = Math.ceil((low + high) / 2);
419
+ if (estimateTokens(text.slice(0, middle)) <= maxTokens)
420
+ low = middle;
421
+ else
422
+ high = middle - 1;
423
+ }
424
+ let result = `${text.slice(0, low).trimEnd()}…`;
425
+ while (result.length > 1 && estimateTokens(result) > maxTokens)
426
+ result = `${result.slice(0, -2).trimEnd()}…`;
427
+ return result;
428
+ }
429
+ async function canonicalPrefix(path, workspace) {
430
+ return realpath(isAbsolute(path) ? path : resolve(workspace, path));
431
+ }
432
+ function isWithin(root, target) {
433
+ const path = relative(root, target);
434
+ return path === "" || (!path.startsWith(`..${sep}`) && path !== ".." && !isAbsolute(path));
435
+ }
436
+ function throwIfAborted(signal) {
437
+ if (signal?.aborted)
438
+ throw signal.reason instanceof Error ? signal.reason : new Error("Search aborted");
439
+ }
440
+ function isRecord(value) {
441
+ return typeof value === "object" && value !== null && !Array.isArray(value);
442
+ }
443
+ function isSearchCache(value) {
444
+ if (!isRecord(value) || value["version"] !== 1 || !isRecord(value["files"]))
445
+ return false;
446
+ return Object.entries(value["files"]).every(([path, file]) => {
447
+ if (!isRecord(file) || file["path"] !== path || !Array.isArray(file["chunks"]))
448
+ return false;
449
+ return (typeof file["scope"] === "string" &&
450
+ typeof file["size"] === "number" &&
451
+ typeof file["mtimeMs"] === "number" &&
452
+ typeof file["contentSha256"] === "string" &&
453
+ file["chunks"].every((chunk) => isRecord(chunk) &&
454
+ typeof chunk["id"] === "string" &&
455
+ typeof chunk["path"] === "string" &&
456
+ typeof chunk["scope"] === "string" &&
457
+ typeof chunk["line"] === "number" &&
458
+ typeof chunk["text"] === "string" &&
459
+ typeof chunk["contentSha256"] === "string" &&
460
+ typeof chunk["mtimeMs"] === "number"));
461
+ });
462
+ }
463
+ //# sourceMappingURL=search-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-service.js","sourceRoot":"","sources":["../../src/memory/search-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAmE1D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM;IACN,cAAc;IACd,MAAM;IACN,OAAO;IACP,UAAU;IACV,OAAO;IACP,QAAQ;IACR,aAAa;IACb,MAAM;IACN,QAAQ;IACR,OAAO;CACR,CAAC,CAAC;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,KAAK;IACL,MAAM;IACN,QAAQ;IACR,OAAO;IACP,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;CACP,CAAC,CAAC;AACH,MAAM,cAAc,GAAG,2FAA2F,CAAC;AAEnH,MAAM,OAAO,aAAa;IACf,QAAQ,CAAuB;IACxC,MAAM,CAA0B;IAChC,SAAS,CAA4B;IAErC,YAAY,OAA6B;QACvC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB,EAAE,MAAoB;QACnD,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;QACvF,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;aACtC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;aAC9B,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACvB,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CACvD,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,QAAQ,CACN,KAAK,CAAC,KAAK,EACX,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,KAAK,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CACzF,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAC1C,CAAC;QACF,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC/E,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM;aAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,UAAU,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACtG,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YACnD,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YACxF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC;YACrE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACjC,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACf,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC;YAClC,IAAI,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;YACxC,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC;aACD,IAAI,CACH,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;YACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CACrC,CAAC;QAEJ,MAAM,IAAI,GAAgB,EAAE,CAAC;QAC7B,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU;gBAAE,MAAM;YAC3C,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC7D,IAAI,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,eAAe,GAAG,KAAK,CAAC,iBAAiB,GAAG,cAAc,CAAC;YACjE,IAAI,eAAe,IAAI,CAAC;gBAAE,MAAM;YAChC,IAAI,MAAM,GAAG,eAAe,EAAE,CAAC;gBAC7B,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;gBACtD,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YACD,cAAc,IAAI,MAAM,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC;gBACR,GAAG,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBACzE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;gBACvB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACrB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;gBACrB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC5E,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACpC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;gBAC3B,OAAO;gBACP,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;aACxC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,MAAoB;QAChC,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACpD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAA+B;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,KAAK,GAAgC,EAAE,CAAC;QAC9C,IAAI,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC;QACvE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;YACnE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,GAAG,YAAY;gBAAE,SAAS;YACjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAS;YAClC,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9C,IACE,MAAM;gBACN,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK;gBAChC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;gBAC7B,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;gBACnC,MAAM,CAAC,aAAa,KAAK,aAAa,EACtC,CAAC;gBACD,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;gBAC/B,SAAS;YACX,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,OAAO,EAAE;gBAC7E,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,GAAG;gBACpD,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,IAAI,EAAE;aACtD,CAAC,CAAC;YACH,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;gBACtB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,aAAa;gBACb,MAAM;aACP,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAgB,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,OAAO,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAAE,MAAM,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5H,CAAC;CACF;AAED,KAAK,UAAU,kBAAkB,CAAC,OAA6B,EAAE,MAA+B;IAC9F,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,KAAK,GAAuD;QAChE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE;QAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE;KAC7C,CAAC;IACF,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,KAAK,MAAM,MAAM,IAAI,KAAK;QAAE,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,IAAY,EACZ,SAAiB,EACjB,YAAyB,EACzB,KAA6B,EAC7B,MAA+B;IAE/B,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,KAAK,CAAC,cAAc,EAAE;YAAE,SAAS;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3F,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9D,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;YAAE,SAAS;QACzC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,KAAK,GACT,YAAY,KAAK,WAAW,IAAI,CAAC,YAAY,KAAK,WAAW,IAAI,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAClG,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,YAAY,CAAC;QACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1H,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,SAAoB,EACpB,IAAY,EACZ,aAAqB,EACrB,OAAe,EACf,MAAuD;IAEvD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxD,MAAM,KAAK,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,OAAO,GAAmB,EAAE,CAAC;IACjC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,KAAK,aAAa,KAAK,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC9F,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,IAAI,EAAE,OAAO;YACb,aAAa;YACb,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;YAC3E,KAAK,EAAE,CAAC;YACR,MAAM,OAAO,GAAmB,EAAE,CAAC;YACnC,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC,aAAa;oBAAE,MAAM;gBACpF,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACvB,aAAa,IAAI,WAAW,CAAC;YAC/B,CAAC;YACD,OAAO,GAAG,OAAO,CAAC;YAClB,aAAa,GAAG,aAAa,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,aAAa,IAAI,UAAU,CAAC;IAC9B,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,SAAS,SAAS,CAAC,IAAY,EAAE,QAAiB;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,IAAI,OAA2B,CAAC;IAChC,IAAI,SAAS,GAAa,EAAE,CAAC;IAC7B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjG,SAAS,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC;IACF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC3B,aAAa,GAAG,KAAK,GAAG,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,KAAK,EAAE,CAAC;YACR,aAAa,GAAG,KAAK,GAAG,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,aAAa,GAAG,KAAK,GAAG,CAAC,CAAC;YACtD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,gBAAgB,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,KAAK,KAAK,gBAAgB;gBAAE,MAAM;YACtC,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACzE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACpF,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACvF,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa,EAAE,aAAqB;IACrE,IAAI,IAAI,CAAC,MAAM,IAAI,aAAa;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,aAAa,CAAC,CAAC;IACzD,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC5D,OAAO,KAA+B,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,KAAkB;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,aAAa,CAAC,KAAkB;IACvC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACzH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;QAC9F,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI;SACjB,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,IAAI,SAAS,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,iBAAiB,CAAC;QAC1E,IAAI,SAAS,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,EAAE,CAAC;QAC3D,IAAI,SAAS,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC;QACtC,IAAI,SAAS,KAAK,GAAG;YAAE,OAAO,MAAM,CAAC;QACrC,OAAO,SAAS,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC;SACR,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,UAAU,OAAO,GAAG,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,SAAiB;IACxD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACvB,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,SAAS;YAAE,GAAG,GAAG,MAAM,CAAC;;YAChE,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS;QAAE,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;IAC7G,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB;IAC5D,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,MAAc;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,cAAc,CAAC,MAA+B;IACrD,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAC1G,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1F,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7F,OAAO,CACL,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ;YACjC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ;YAChC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ;YACnC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,QAAQ;YACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAClB,CAAC,KAAK,EAAE,EAAE,CACR,QAAQ,CAAC,KAAK,CAAC;gBACf,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ;gBAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ;gBACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ;gBAClC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ;gBACjC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ;gBACjC,OAAO,KAAK,CAAC,eAAe,CAAC,KAAK,QAAQ;gBAC1C,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ,CACvC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function tokenize(text: string, options?: {
2
+ forceCjkBigramFallback?: boolean;
3
+ }): string[];
4
+ export declare function estimateTokens(text: string): number;
5
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/memory/tokenizer.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,EAAE,CAYnG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQnD"}
@@ -0,0 +1,42 @@
1
+ const WORD_PATTERN = /[\p{L}\p{N}_]+/gu;
2
+ const HAN_PATTERN = /\p{Script=Han}/u;
3
+ export function tokenize(text, options = {}) {
4
+ const normalized = text.normalize("NFKC").toLocaleLowerCase("und");
5
+ const tokens = [];
6
+ for (const match of normalized.matchAll(WORD_PATTERN)) {
7
+ const value = match[0];
8
+ if (!HAN_PATTERN.test(value)) {
9
+ tokens.push(value);
10
+ continue;
11
+ }
12
+ tokens.push(...tokenizeCjk(value, options.forceCjkBigramFallback ?? false));
13
+ }
14
+ return tokens;
15
+ }
16
+ export function estimateTokens(text) {
17
+ let cjk = 0;
18
+ let other = 0;
19
+ for (const character of text.normalize("NFC")) {
20
+ if (/\p{Script=Han}|\p{Script=Hiragana}|\p{Script=Katakana}|\p{Script=Hangul}/u.test(character))
21
+ cjk += 1;
22
+ else
23
+ other += Buffer.byteLength(character, "utf8") > 1 ? 1 : character.trim() ? 1 : 0;
24
+ }
25
+ return Math.max(1, cjk + Math.ceil(other / 4));
26
+ }
27
+ function tokenizeCjk(value, forceFallback) {
28
+ if (!forceFallback && typeof Intl.Segmenter === "function") {
29
+ const segments = new Intl.Segmenter("zh", { granularity: "word" }).segment(value);
30
+ const words = [...segments]
31
+ .filter((segment) => segment.isWordLike)
32
+ .map((segment) => segment.segment)
33
+ .filter(Boolean);
34
+ if (words.length > 0)
35
+ return words;
36
+ }
37
+ const characters = [...value].filter((character) => HAN_PATTERN.test(character));
38
+ if (characters.length <= 1)
39
+ return characters;
40
+ return characters.slice(0, -1).map((character, index) => `${character}${characters[index + 1] ?? ""}`);
41
+ }
42
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/memory/tokenizer.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC;AACxC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,UAAgD,EAAE;IACvF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,sBAAsB,IAAI,KAAK,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,2EAA2E,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,GAAG,IAAI,CAAC,CAAC;;YACrG,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,aAAsB;IACxD,IAAI,CAAC,aAAa,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClF,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC;aACxB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;aACvC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;aACjC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IACrC,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACjF,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAC9C,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,SAAS,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACzG,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { RunRecord } from "../automation/types.js";
2
+ export type NotificationLevel = "info" | "success" | "warning" | "error";
3
+ export interface NotificationRecord {
4
+ version: 1;
5
+ id: string;
6
+ ts: string;
7
+ level: NotificationLevel;
8
+ title: string;
9
+ body: string;
10
+ source: {
11
+ kind: "agent";
12
+ sessionId: string;
13
+ } | {
14
+ kind: "run";
15
+ runId: string;
16
+ jobId?: string;
17
+ };
18
+ target: {
19
+ kind: "local-notification";
20
+ } | {
21
+ kind: "session";
22
+ sessionId: string;
23
+ };
24
+ }
25
+ export interface NotificationServiceOptions {
26
+ path: string;
27
+ recoveryDirectory: string;
28
+ clock?: () => Date;
29
+ idFactory?: () => string;
30
+ onNotification?: (record: NotificationRecord) => void | Promise<void>;
31
+ retainedRecords?: number;
32
+ }
33
+ export declare class NotificationService {
34
+ #private;
35
+ constructor(options: NotificationServiceOptions);
36
+ initialize(): Promise<void>;
37
+ notify(input: {
38
+ level: NotificationLevel;
39
+ title: string;
40
+ body: string;
41
+ source: NotificationRecord["source"];
42
+ target?: NotificationRecord["target"];
43
+ }): Promise<NotificationRecord>;
44
+ deliverRun(run: RunRecord): Promise<void>;
45
+ list(): NotificationRecord[];
46
+ }
47
+ //# sourceMappingURL=notification-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service.d.ts","sourceRoot":"","sources":["../../src/notifications/notification-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9F,MAAM,EAAE;QAAE,IAAI,EAAE,oBAAoB,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,mBAAmB;;gBAUlB,OAAO,EAAE,0BAA0B;IASzC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC,MAAM,CAAC,KAAK,EAAE;QACZ,KAAK,EAAE,iBAAiB,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;KACvC,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBzB,UAAU,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/C,IAAI,IAAI,kBAAkB,EAAE;CAyB7B"}