codesesh 0.7.1 → 0.8.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.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createRegisteredAgents
4
- } from "./chunk-7GQEIPVK.js";
4
+ } from "./chunk-XANARSZG.js";
5
5
 
6
6
  // src/scan-refresh-worker.ts
7
7
  import { parentPort, workerData } from "worker_threads";
@@ -14,9 +14,60 @@ function serializeMeta(agent) {
14
14
  }
15
15
  return meta;
16
16
  }
17
+ function sourceFingerprintFromMeta(meta) {
18
+ return typeof meta?.sourceFingerprint === "string" ? meta.sourceFingerprint : null;
19
+ }
20
+ function parseSourceFingerprint(fingerprint) {
21
+ try {
22
+ const parsed = JSON.parse(fingerprint);
23
+ return Array.isArray(parsed) ? parsed : null;
24
+ } catch {
25
+ return null;
26
+ }
27
+ }
28
+ function sourceFingerprintMatches(source, cachedSession, cached) {
29
+ const cachedFingerprint = sourceFingerprintFromMeta(cached);
30
+ if (cachedFingerprint === source.fingerprint) return true;
31
+ const current = parseSourceFingerprint(source.fingerprint);
32
+ if (!current || current.length < 5) return false;
33
+ return typeof cached?.sourceMtimeMs === "number" && cached.sourceMtimeMs === current[2] && (current[4] == null || cachedSession.title === current[4]);
34
+ }
35
+ function sourcePathFromMeta(meta) {
36
+ return typeof meta?.sourcePath === "string" ? meta.sourcePath : null;
37
+ }
38
+ function canSyncSources(agent) {
39
+ return typeof agent === "object" && agent !== null && "listSessionSources" in agent && "scanSessionSource" in agent && typeof agent.listSessionSources === "function" && typeof agent.scanSessionSource === "function";
40
+ }
41
+ function syncAgentSources(agent, cachedSessions, cachedMeta) {
42
+ const sessionMap = new Map(cachedSessions.map((session) => [session.id, session]));
43
+ const sourceRefs = agent.listSessionSources();
44
+ const currentIds = new Set(sourceRefs.map((source) => source.sessionId));
45
+ const changedIds = /* @__PURE__ */ new Set();
46
+ for (const source of sourceRefs) {
47
+ const cachedSession = sessionMap.get(source.sessionId);
48
+ const cached = cachedMeta[source.sessionId];
49
+ const sameSource = sourcePathFromMeta(cached) === source.sourcePath;
50
+ const sameFingerprint = cachedSession && sourceFingerprintMatches(source, cachedSession, cached);
51
+ if (cachedSession && sameSource && sameFingerprint) continue;
52
+ const next = agent.scanSessionSource(source.sourcePath);
53
+ changedIds.add(source.sessionId);
54
+ if (next) {
55
+ sessionMap.set(next.id, next);
56
+ } else {
57
+ sessionMap.delete(source.sessionId);
58
+ }
59
+ }
60
+ for (const session of cachedSessions) {
61
+ if (!currentIds.has(session.id)) {
62
+ sessionMap.delete(session.id);
63
+ changedIds.add(session.id);
64
+ }
65
+ }
66
+ return { sessions: [...sessionMap.values()], changedIds: [...changedIds] };
67
+ }
17
68
  var data = workerData;
18
69
  var startedAt = performance.now();
19
- try {
70
+ async function run() {
20
71
  const agent = createRegisteredAgents().find((item) => item.name === data.agentName);
21
72
  if (!agent) {
22
73
  throw new Error(`Unknown agent: ${data.agentName}`);
@@ -25,21 +76,39 @@ try {
25
76
  agent.setSessionMetaMap(new Map(Object.entries(data.meta)));
26
77
  }
27
78
  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
- });
79
+ let sessions;
80
+ let changedIds;
81
+ if (!isAvailable) {
82
+ sessions = [];
83
+ } else if (data.sourceSync && canSyncSources(agent)) {
84
+ const result = syncAgentSources(agent, data.previousSessions, data.meta);
85
+ sessions = result.sessions;
86
+ changedIds = result.changedIds;
87
+ } else if (data.changedIds && agent.incrementalScan) {
88
+ sessions = await Promise.resolve(agent.incrementalScan(data.previousSessions, data.changedIds));
89
+ } else {
90
+ sessions = await Promise.resolve(
91
+ agent.scan({
92
+ ...data.scanOptions,
93
+ onProgress: (progress) => {
94
+ parentPort?.postMessage({
95
+ type: "progress",
96
+ progress
97
+ });
98
+ }
99
+ })
100
+ );
101
+ }
37
102
  parentPort?.postMessage({
38
103
  type: "done",
39
104
  sessions,
40
105
  meta: serializeMeta(agent),
106
+ changedIds,
41
107
  durationMs: performance.now() - startedAt
42
108
  });
109
+ }
110
+ try {
111
+ await run();
43
112
  } catch (error) {
44
113
  parentPort?.postMessage({
45
114
  type: "error",
@@ -1 +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
+ {"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 type SessionSourceRef,\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 changedIds?: string[];\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 sourceSync?: boolean;\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\nfunction sourceFingerprintFromMeta(meta: SessionCacheMeta | undefined): string | null {\n return typeof meta?.sourceFingerprint === \"string\" ? meta.sourceFingerprint : null;\n}\n\nfunction parseSourceFingerprint(fingerprint: string): unknown[] | null {\n try {\n const parsed = JSON.parse(fingerprint);\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nfunction sourceFingerprintMatches(\n source: SessionSourceRef,\n cachedSession: SessionHead,\n cached: SessionCacheMeta | undefined,\n): boolean {\n const cachedFingerprint = sourceFingerprintFromMeta(cached);\n if (cachedFingerprint === source.fingerprint) return true;\n\n const current = parseSourceFingerprint(source.fingerprint);\n if (!current || current.length < 5) return false;\n\n return (\n typeof cached?.sourceMtimeMs === \"number\" &&\n cached.sourceMtimeMs === current[2] &&\n (current[4] == null || cachedSession.title === current[4])\n );\n}\n\nfunction sourcePathFromMeta(meta: SessionCacheMeta | undefined): string | null {\n return typeof meta?.sourcePath === \"string\" ? meta.sourcePath : null;\n}\n\nfunction canSyncSources(agent: unknown): agent is {\n listSessionSources: () => SessionSourceRef[];\n scanSessionSource: (sourcePath: string) => SessionHead | null;\n} {\n return (\n typeof agent === \"object\" &&\n agent !== null &&\n \"listSessionSources\" in agent &&\n \"scanSessionSource\" in agent &&\n typeof agent.listSessionSources === \"function\" &&\n typeof agent.scanSessionSource === \"function\"\n );\n}\n\nfunction syncAgentSources(\n agent: {\n listSessionSources: () => SessionSourceRef[];\n scanSessionSource: (sourcePath: string) => SessionHead | null;\n },\n cachedSessions: SessionHead[],\n cachedMeta: Record<string, SessionCacheMeta>,\n): { sessions: SessionHead[]; changedIds: string[] } {\n const sessionMap = new Map(cachedSessions.map((session) => [session.id, session]));\n const sourceRefs = agent.listSessionSources();\n const currentIds = new Set(sourceRefs.map((source) => source.sessionId));\n const changedIds = new Set<string>();\n\n for (const source of sourceRefs) {\n const cachedSession = sessionMap.get(source.sessionId);\n const cached = cachedMeta[source.sessionId];\n const sameSource = sourcePathFromMeta(cached) === source.sourcePath;\n const sameFingerprint =\n cachedSession && sourceFingerprintMatches(source, cachedSession, cached);\n if (cachedSession && sameSource && sameFingerprint) continue;\n\n const next = agent.scanSessionSource(source.sourcePath);\n changedIds.add(source.sessionId);\n if (next) {\n sessionMap.set(next.id, next);\n } else {\n sessionMap.delete(source.sessionId);\n }\n }\n\n for (const session of cachedSessions) {\n if (!currentIds.has(session.id)) {\n sessionMap.delete(session.id);\n changedIds.add(session.id);\n }\n }\n\n return { sessions: [...sessionMap.values()], changedIds: [...changedIds] };\n}\n\nconst data = workerData as ScanRefreshWorkerData;\nconst startedAt = performance.now();\n\nasync function run(): Promise<void> {\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 let sessions: SessionHead[];\n let changedIds: string[] | undefined;\n\n if (!isAvailable) {\n sessions = [];\n } else if (data.sourceSync && canSyncSources(agent)) {\n const result = syncAgentSources(agent, data.previousSessions, data.meta);\n sessions = result.sessions;\n changedIds = result.changedIds;\n } else if (data.changedIds && agent.incrementalScan) {\n sessions = await Promise.resolve(agent.incrementalScan(data.previousSessions, data.changedIds));\n } else {\n sessions = await Promise.resolve(\n agent.scan({\n ...data.scanOptions,\n onProgress: (progress) => {\n parentPort?.postMessage({\n type: \"progress\",\n progress,\n } satisfies ScanRefreshWorkerMessage);\n },\n }),\n );\n }\n\n parentPort?.postMessage({\n type: \"done\",\n sessions,\n meta: serializeMeta(agent),\n changedIds,\n durationMs: performance.now() - startedAt,\n } satisfies ScanRefreshWorkerMessage);\n}\n\ntry {\n await run();\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":"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","names":["data"]}
@@ -6,7 +6,7 @@ import {
6
6
  saveCachedSessions,
7
7
  syncSessionSearchIndex,
8
8
  syncSessionSearchIndexChanges
9
- } from "./chunk-7GQEIPVK.js";
9
+ } from "./chunk-XANARSZG.js";
10
10
 
11
11
  // src/search-index-worker.ts
12
12
  import { parentPort, workerData } from "worker_threads";
@@ -3,7 +3,7 @@ import {
3
3
  classifySessionTags,
4
4
  createRegisteredAgents,
5
5
  getSmartTagSourceTimestamp
6
- } from "./chunk-7GQEIPVK.js";
6
+ } from "./chunk-XANARSZG.js";
7
7
 
8
8
  // src/smart-tag-worker.ts
9
9
  import { parentPort, workerData } from "worker_threads";