codesesh 0.6.0 → 0.7.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.
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ createRegisteredAgents
4
+ } from "./chunk-JTHZVP6G.js";
5
+
6
+ // src/scan-refresh-worker.ts
7
+ import { parentPort, workerData } from "worker_threads";
8
+ function serializeMeta(agent) {
9
+ const metaMap = agent.getSessionMetaMap?.();
10
+ if (!metaMap) return {};
11
+ const meta = {};
12
+ for (const [id, data2] of metaMap.entries()) {
13
+ meta[id] = { id, ...data2 };
14
+ }
15
+ return meta;
16
+ }
17
+ var data = workerData;
18
+ var startedAt = performance.now();
19
+ try {
20
+ const agent = createRegisteredAgents().find((item) => item.name === data.agentName);
21
+ if (!agent) {
22
+ throw new Error(`Unknown agent: ${data.agentName}`);
23
+ }
24
+ if (agent.setSessionMetaMap) {
25
+ agent.setSessionMetaMap(new Map(Object.entries(data.meta)));
26
+ }
27
+ const isAvailable = agent.isAvailable();
28
+ const sessions = !isAvailable ? [] : data.changedIds && agent.incrementalScan ? agent.incrementalScan(data.previousSessions, data.changedIds) : agent.scan({
29
+ ...data.scanOptions,
30
+ onProgress: (progress) => {
31
+ parentPort?.postMessage({
32
+ type: "progress",
33
+ progress
34
+ });
35
+ }
36
+ });
37
+ parentPort?.postMessage({
38
+ type: "done",
39
+ sessions,
40
+ meta: serializeMeta(agent),
41
+ durationMs: performance.now() - startedAt
42
+ });
43
+ } catch (error) {
44
+ parentPort?.postMessage({
45
+ type: "error",
46
+ error: error instanceof Error ? error.message : String(error),
47
+ durationMs: performance.now() - startedAt
48
+ });
49
+ }
50
+ //# sourceMappingURL=scan-refresh-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/scan-refresh-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n type AgentScanProgress,\n type ScanOptions,\n type SessionCacheMeta,\n type SessionHead,\n} from \"@codesesh/core\";\n\nexport type ScanRefreshWorkerMessage =\n | {\n type: \"progress\";\n progress: AgentScanProgress;\n }\n | {\n type: \"done\";\n sessions: SessionHead[];\n meta: Record<string, SessionCacheMeta>;\n durationMs: number;\n }\n | {\n type: \"error\";\n error: string;\n durationMs: number;\n };\n\ninterface ScanRefreshWorkerData {\n agentName: string;\n previousSessions: SessionHead[];\n changedIds: string[] | null;\n scanOptions: Pick<ScanOptions, \"from\" | \"to\" | \"fast\">;\n meta: Record<string, SessionCacheMeta>;\n}\n\nfunction serializeMeta(agent: {\n getSessionMetaMap?: () => Map<string, SessionCacheMeta>;\n}): Record<string, SessionCacheMeta> {\n const metaMap = agent.getSessionMetaMap?.();\n if (!metaMap) return {};\n\n const meta: Record<string, SessionCacheMeta> = {};\n for (const [id, data] of metaMap.entries()) {\n meta[id] = { id, ...(data as Record<string, unknown>) } as SessionCacheMeta;\n }\n return meta;\n}\n\nconst data = workerData as ScanRefreshWorkerData;\nconst startedAt = performance.now();\n\ntry {\n const agent = createRegisteredAgents().find((item) => item.name === data.agentName);\n if (!agent) {\n throw new Error(`Unknown agent: ${data.agentName}`);\n }\n\n if (agent.setSessionMetaMap) {\n agent.setSessionMetaMap(new Map(Object.entries(data.meta)));\n }\n\n const isAvailable = agent.isAvailable();\n const sessions = !isAvailable\n ? []\n : data.changedIds && agent.incrementalScan\n ? agent.incrementalScan(data.previousSessions, data.changedIds)\n : agent.scan({\n ...data.scanOptions,\n onProgress: (progress) => {\n parentPort?.postMessage({\n type: \"progress\",\n progress,\n } satisfies ScanRefreshWorkerMessage);\n },\n });\n\n parentPort?.postMessage({\n type: \"done\",\n sessions,\n meta: serializeMeta(agent),\n durationMs: performance.now() - startedAt,\n } satisfies ScanRefreshWorkerMessage);\n} catch (error) {\n parentPort?.postMessage({\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startedAt,\n } satisfies ScanRefreshWorkerMessage);\n}\n"],"mappings":";;;;;;AAAA,SAAS,YAAY,kBAAkB;AAkCvC,SAAS,cAAc,OAEc;AACnC,QAAM,UAAU,MAAM,oBAAoB;AAC1C,MAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,QAAM,OAAyC,CAAC;AAChD,aAAW,CAAC,IAAIA,KAAI,KAAK,QAAQ,QAAQ,GAAG;AAC1C,SAAK,EAAE,IAAI,EAAE,IAAI,GAAIA,MAAiC;AAAA,EACxD;AACA,SAAO;AACT;AAEA,IAAM,OAAO;AACb,IAAM,YAAY,YAAY,IAAI;AAElC,IAAI;AACF,QAAM,QAAQ,uBAAuB,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,SAAS;AAClF,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,kBAAkB,KAAK,SAAS,EAAE;AAAA,EACpD;AAEA,MAAI,MAAM,mBAAmB;AAC3B,UAAM,kBAAkB,IAAI,IAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC;AAAA,EAC5D;AAEA,QAAM,cAAc,MAAM,YAAY;AACtC,QAAM,WAAW,CAAC,cACd,CAAC,IACD,KAAK,cAAc,MAAM,kBACvB,MAAM,gBAAgB,KAAK,kBAAkB,KAAK,UAAU,IAC5D,MAAM,KAAK;AAAA,IACT,GAAG,KAAK;AAAA,IACR,YAAY,CAAC,aAAa;AACxB,kBAAY,YAAY;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,MACF,CAAoC;AAAA,IACtC;AAAA,EACF,CAAC;AAEP,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN;AAAA,IACA,MAAM,cAAc,KAAK;AAAA,IACzB,YAAY,YAAY,IAAI,IAAI;AAAA,EAClC,CAAoC;AACtC,SAAS,OAAO;AACd,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC5D,YAAY,YAAY,IAAI,IAAI;AAAA,EAClC,CAAoC;AACtC;","names":["data"]}
@@ -1,30 +1,60 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createRegisteredAgents,
4
- syncSessionSearchIndex
5
- } from "./chunk-SQYHWMQV.js";
4
+ markAgentCacheInitialized,
5
+ saveCachedSessionChanges,
6
+ saveCachedSessions,
7
+ syncSessionSearchIndex,
8
+ syncSessionSearchIndexChanges
9
+ } from "./chunk-JTHZVP6G.js";
6
10
 
7
11
  // src/search-index-worker.ts
8
12
  import { parentPort, workerData } from "worker_threads";
9
13
  var data = workerData;
10
14
  var startedAt = performance.now();
11
15
  var agents = createRegisteredAgents();
12
- for (const agentName of data.agentNames) {
13
- const agent = agents.find((item) => item.name === agentName);
16
+ var jobs = data.jobs ?? data.agentNames.map(
17
+ (agentName) => ({
18
+ kind: "full",
19
+ context: data.context,
20
+ agentName,
21
+ sessions: data.sessionsByAgent[agentName] ?? [],
22
+ meta: data.metaByAgent[agentName] ?? {}
23
+ })
24
+ );
25
+ for (const job of jobs) {
26
+ const agent = agents.find((item) => item.name === job.agentName);
14
27
  if (!agent) continue;
15
- const meta = data.metaByAgent[agentName];
16
- if (meta && agent.setSessionMetaMap) {
17
- agent.setSessionMetaMap(new Map(Object.entries(meta)));
28
+ if (agent.setSessionMetaMap) {
29
+ agent.setSessionMetaMap(new Map(Object.entries(job.meta)));
30
+ }
31
+ let result;
32
+ if (job.kind === "changes") {
33
+ saveCachedSessionChanges(job.agentName, job.changes, job.removedSessionIds, job.meta);
34
+ result = syncSessionSearchIndexChanges(
35
+ job.agentName,
36
+ job.changes,
37
+ job.removedSessionIds,
38
+ (sessionId) => agent.getSessionData(sessionId),
39
+ job.searchIndexOptions
40
+ );
41
+ } else {
42
+ if (job.saveCache) {
43
+ saveCachedSessions(job.agentName, job.sessions, job.meta);
44
+ }
45
+ result = syncSessionSearchIndex(
46
+ job.agentName,
47
+ job.sessions,
48
+ (sessionId) => agent.getSessionData(sessionId),
49
+ job.searchIndexOptions
50
+ );
51
+ if (job.saveCache && result?.skipped === 0) {
52
+ markAgentCacheInitialized(job.agentName);
53
+ }
18
54
  }
19
- const sessions = data.sessionsByAgent[agentName] ?? [];
20
- const result = syncSessionSearchIndex(
21
- agentName,
22
- sessions,
23
- (sessionId) => agent.getSessionData(sessionId)
24
- );
25
55
  parentPort?.postMessage({
26
56
  type: "sync-result",
27
- context: data.context,
57
+ context: job.context,
28
58
  result
29
59
  });
30
60
  }
@@ -32,8 +62,8 @@ parentPort?.postMessage({
32
62
  type: "done",
33
63
  context: data.context,
34
64
  durationMs: performance.now() - startedAt,
35
- sessions: Object.values(data.sessionsByAgent).reduce(
36
- (total, sessions) => total + sessions.length,
65
+ sessions: jobs.reduce(
66
+ (total, job) => total + (job.kind === "full" ? job.sessions.length : job.changes.length),
37
67
  0
38
68
  )
39
69
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/search-index-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n syncSessionSearchIndex,\n type SearchIndexSyncResult,\n type SessionCacheMeta,\n type SessionHead,\n} from \"@codesesh/core\";\n\nexport type SearchIndexWorkerMessage =\n | {\n type: \"sync-result\";\n context: string;\n result: SearchIndexSyncResult | null;\n }\n | {\n type: \"done\";\n context: string;\n durationMs: number;\n sessions: number;\n };\n\ninterface SearchIndexWorkerData {\n context: string;\n agentNames: string[];\n sessionsByAgent: Record<string, SessionHead[]>;\n metaByAgent: Record<string, Record<string, SessionCacheMeta>>;\n}\n\nconst data = workerData as SearchIndexWorkerData;\nconst startedAt = performance.now();\nconst agents = createRegisteredAgents();\n\nfor (const agentName of data.agentNames) {\n const agent = agents.find((item) => item.name === agentName);\n if (!agent) continue;\n\n const meta = data.metaByAgent[agentName];\n if (meta && agent.setSessionMetaMap) {\n agent.setSessionMetaMap(new Map(Object.entries(meta)));\n }\n\n const sessions = data.sessionsByAgent[agentName] ?? [];\n const result = syncSessionSearchIndex(agentName, sessions, (sessionId) =>\n agent.getSessionData(sessionId),\n );\n parentPort?.postMessage({\n type: \"sync-result\",\n context: data.context,\n result,\n } satisfies SearchIndexWorkerMessage);\n}\n\nparentPort?.postMessage({\n type: \"done\",\n context: data.context,\n durationMs: performance.now() - startedAt,\n sessions: Object.values(data.sessionsByAgent).reduce(\n (total, sessions) => total + sessions.length,\n 0,\n ),\n} satisfies SearchIndexWorkerMessage);\n"],"mappings":";;;;;;;AAAA,SAAS,YAAY,kBAAkB;AA6BvC,IAAM,OAAO;AACb,IAAM,YAAY,YAAY,IAAI;AAClC,IAAM,SAAS,uBAAuB;AAEtC,WAAW,aAAa,KAAK,YAAY;AACvC,QAAM,QAAQ,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS;AAC3D,MAAI,CAAC,MAAO;AAEZ,QAAM,OAAO,KAAK,YAAY,SAAS;AACvC,MAAI,QAAQ,MAAM,mBAAmB;AACnC,UAAM,kBAAkB,IAAI,IAAI,OAAO,QAAQ,IAAI,CAAC,CAAC;AAAA,EACvD;AAEA,QAAM,WAAW,KAAK,gBAAgB,SAAS,KAAK,CAAC;AACrD,QAAM,SAAS;AAAA,IAAuB;AAAA,IAAW;AAAA,IAAU,CAAC,cAC1D,MAAM,eAAe,SAAS;AAAA,EAChC;AACA,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN,SAAS,KAAK;AAAA,IACd;AAAA,EACF,CAAoC;AACtC;AAEA,YAAY,YAAY;AAAA,EACtB,MAAM;AAAA,EACN,SAAS,KAAK;AAAA,EACd,YAAY,YAAY,IAAI,IAAI;AAAA,EAChC,UAAU,OAAO,OAAO,KAAK,eAAe,EAAE;AAAA,IAC5C,CAAC,OAAO,aAAa,QAAQ,SAAS;AAAA,IACtC;AAAA,EACF;AACF,CAAoC;","names":[]}
1
+ {"version":3,"sources":["../src/search-index-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n markAgentCacheInitialized,\n saveCachedSessionChanges,\n saveCachedSessions,\n syncSessionSearchIndex,\n syncSessionSearchIndexChanges,\n type SearchIndexSyncResult,\n type SearchIndexSyncOptions,\n type SessionCacheMeta,\n type SessionHeadChange,\n type SessionHead,\n} from \"@codesesh/core\";\n\nexport type SearchIndexWorkerMessage =\n | {\n type: \"sync-result\";\n context: string;\n result: SearchIndexSyncResult | null;\n }\n | {\n type: \"done\";\n context: string;\n durationMs: number;\n sessions: number;\n };\n\nexport type SearchIndexWorkerJob =\n | {\n kind: \"full\";\n context: string;\n agentName: string;\n sessions: SessionHead[];\n meta: Record<string, SessionCacheMeta>;\n saveCache?: boolean;\n searchIndexOptions?: SearchIndexSyncOptions;\n }\n | {\n kind: \"changes\";\n context: string;\n agentName: string;\n changes: SessionHeadChange[];\n removedSessionIds: string[];\n meta: Record<string, SessionCacheMeta>;\n searchIndexOptions?: SearchIndexSyncOptions;\n };\n\ninterface SearchIndexWorkerData {\n jobs?: SearchIndexWorkerJob[];\n context: string;\n agentNames: string[];\n sessionsByAgent: Record<string, SessionHead[]>;\n metaByAgent: Record<string, Record<string, SessionCacheMeta>>;\n}\n\nconst data = workerData as SearchIndexWorkerData;\nconst startedAt = performance.now();\nconst agents = createRegisteredAgents();\nconst jobs =\n data.jobs ??\n data.agentNames.map(\n (agentName): SearchIndexWorkerJob => ({\n kind: \"full\",\n context: data.context,\n agentName,\n sessions: data.sessionsByAgent[agentName] ?? [],\n meta: data.metaByAgent[agentName] ?? {},\n }),\n );\n\nfor (const job of jobs) {\n const agent = agents.find((item) => item.name === job.agentName);\n if (!agent) continue;\n\n if (agent.setSessionMetaMap) {\n agent.setSessionMetaMap(new Map(Object.entries(job.meta)));\n }\n\n let result: SearchIndexSyncResult | null;\n if (job.kind === \"changes\") {\n saveCachedSessionChanges(job.agentName, job.changes, job.removedSessionIds, job.meta);\n result = syncSessionSearchIndexChanges(\n job.agentName,\n job.changes,\n job.removedSessionIds,\n (sessionId) => agent.getSessionData(sessionId),\n job.searchIndexOptions,\n );\n } else {\n if (job.saveCache) {\n saveCachedSessions(job.agentName, job.sessions, job.meta);\n }\n result = syncSessionSearchIndex(\n job.agentName,\n job.sessions,\n (sessionId) => agent.getSessionData(sessionId),\n job.searchIndexOptions,\n );\n if (job.saveCache && result?.skipped === 0) {\n markAgentCacheInitialized(job.agentName);\n }\n }\n parentPort?.postMessage({\n type: \"sync-result\",\n context: job.context,\n result,\n } satisfies SearchIndexWorkerMessage);\n}\n\nparentPort?.postMessage({\n type: \"done\",\n context: data.context,\n durationMs: performance.now() - startedAt,\n sessions: jobs.reduce(\n (total, job) => total + (job.kind === \"full\" ? job.sessions.length : job.changes.length),\n 0,\n ),\n} satisfies SearchIndexWorkerMessage);\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AAwDvC,IAAM,OAAO;AACb,IAAM,YAAY,YAAY,IAAI;AAClC,IAAM,SAAS,uBAAuB;AACtC,IAAM,OACJ,KAAK,QACL,KAAK,WAAW;AAAA,EACd,CAAC,eAAqC;AAAA,IACpC,MAAM;AAAA,IACN,SAAS,KAAK;AAAA,IACd;AAAA,IACA,UAAU,KAAK,gBAAgB,SAAS,KAAK,CAAC;AAAA,IAC9C,MAAM,KAAK,YAAY,SAAS,KAAK,CAAC;AAAA,EACxC;AACF;AAEF,WAAW,OAAO,MAAM;AACtB,QAAM,QAAQ,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS;AAC/D,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM,mBAAmB;AAC3B,UAAM,kBAAkB,IAAI,IAAI,OAAO,QAAQ,IAAI,IAAI,CAAC,CAAC;AAAA,EAC3D;AAEA,MAAI;AACJ,MAAI,IAAI,SAAS,WAAW;AAC1B,6BAAyB,IAAI,WAAW,IAAI,SAAS,IAAI,mBAAmB,IAAI,IAAI;AACpF,aAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,CAAC,cAAc,MAAM,eAAe,SAAS;AAAA,MAC7C,IAAI;AAAA,IACN;AAAA,EACF,OAAO;AACL,QAAI,IAAI,WAAW;AACjB,yBAAmB,IAAI,WAAW,IAAI,UAAU,IAAI,IAAI;AAAA,IAC1D;AACA,aAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,CAAC,cAAc,MAAM,eAAe,SAAS;AAAA,MAC7C,IAAI;AAAA,IACN;AACA,QAAI,IAAI,aAAa,QAAQ,YAAY,GAAG;AAC1C,gCAA0B,IAAI,SAAS;AAAA,IACzC;AAAA,EACF;AACA,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,IACb;AAAA,EACF,CAAoC;AACtC;AAEA,YAAY,YAAY;AAAA,EACtB,MAAM;AAAA,EACN,SAAS,KAAK;AAAA,EACd,YAAY,YAAY,IAAI,IAAI;AAAA,EAChC,UAAU,KAAK;AAAA,IACb,CAAC,OAAO,QAAQ,SAAS,IAAI,SAAS,SAAS,IAAI,SAAS,SAAS,IAAI,QAAQ;AAAA,IACjF;AAAA,EACF;AACF,CAAoC;","names":[]}
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ classifySessionTags,
4
+ createRegisteredAgents,
5
+ getSmartTagSourceTimestamp
6
+ } from "./chunk-JTHZVP6G.js";
7
+
8
+ // src/smart-tag-worker.ts
9
+ import { parentPort, workerData } from "worker_threads";
10
+ var data = workerData;
11
+ var agents = createRegisteredAgents();
12
+ var agent = agents.find((a) => a.name === data.agentName);
13
+ var results = [];
14
+ if (agent && agent.setSessionMetaMap) {
15
+ agent.setSessionMetaMap(new Map(Object.entries(data.meta)));
16
+ for (const sessionId of data.sessionIds) {
17
+ try {
18
+ const sessionData = agent.getSessionData(sessionId);
19
+ results.push({
20
+ id: sessionId,
21
+ tags: classifySessionTags(sessionData),
22
+ sourceUpdatedAt: getSmartTagSourceTimestamp(sessionData)
23
+ });
24
+ } catch (error) {
25
+ results.push({
26
+ id: sessionId,
27
+ error: error instanceof Error ? error.message : String(error)
28
+ });
29
+ }
30
+ }
31
+ }
32
+ parentPort?.postMessage(results);
33
+ //# sourceMappingURL=smart-tag-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/smart-tag-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n classifySessionTags,\n getSmartTagSourceTimestamp,\n type SessionCacheMeta,\n} from \"@codesesh/core\";\n\ninterface SmartTagWorkerData {\n agentName: string;\n sessionIds: string[];\n meta: Record<string, Record<string, unknown>>;\n}\n\ninterface SmartTagWorkerResult {\n id: string;\n tags?: ReturnType<typeof classifySessionTags>;\n sourceUpdatedAt?: number;\n error?: string;\n}\n\nconst data = workerData as SmartTagWorkerData;\nconst agents = createRegisteredAgents();\nconst agent = agents.find((a) => a.name === data.agentName);\nconst results: SmartTagWorkerResult[] = [];\n\nif (agent && agent.setSessionMetaMap) {\n agent.setSessionMetaMap(new Map(Object.entries(data.meta)) as Map<string, SessionCacheMeta>);\n\n for (const sessionId of data.sessionIds) {\n try {\n const sessionData = agent.getSessionData(sessionId);\n results.push({\n id: sessionId,\n tags: classifySessionTags(sessionData),\n sourceUpdatedAt: getSmartTagSourceTimestamp(sessionData),\n });\n } catch (error) {\n results.push({\n id: sessionId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n\nparentPort?.postMessage(results);\n"],"mappings":";;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AAqBvC,IAAM,OAAO;AACb,IAAM,SAAS,uBAAuB;AACtC,IAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS;AAC1D,IAAM,UAAkC,CAAC;AAEzC,IAAI,SAAS,MAAM,mBAAmB;AACpC,QAAM,kBAAkB,IAAI,IAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAkC;AAE3F,aAAW,aAAa,KAAK,YAAY;AACvC,QAAI;AACF,YAAM,cAAc,MAAM,eAAe,SAAS;AAClD,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,MAAM,oBAAoB,WAAW;AAAA,QACrC,iBAAiB,2BAA2B,WAAW;AAAA,MACzD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK;AAAA,QACX,IAAI;AAAA,QACJ,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,YAAY,YAAY,OAAO;","names":[]}