codesesh 0.15.0 → 0.16.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.
- package/README.md +1 -0
- package/dist/chunk-EWC6IODK.js +166 -0
- package/dist/chunk-EWC6IODK.js.map +1 -0
- package/dist/{chunk-NBCLV4CX.js → chunk-MWSJTNOW.js} +682 -356
- package/dist/chunk-MWSJTNOW.js.map +1 -0
- package/dist/{dist-5356XOFP.js → dist-AIDCOQZO.js} +20 -2
- package/dist/index.js +131 -239
- package/dist/index.js.map +1 -1
- package/dist/scan-refresh-worker.js +2 -1
- package/dist/scan-refresh-worker.js.map +1 -1
- package/dist/search-index-worker.js +11 -2
- package/dist/search-index-worker.js.map +1 -1
- package/dist/smart-tag-worker.js +2 -1
- package/dist/smart-tag-worker.js.map +1 -1
- package/dist/web/assets/index-BpmbwB2_.js +113 -0
- package/dist/web/assets/index-Bxe686Vr.css +2 -0
- package/dist/web/assets/{syntax-C_RLNYQn.js → syntax-mZXQuVcd.js} +1 -1
- package/dist/web/assets/vendor-BVE7Fps8.js +41 -0
- package/dist/web/icon/agent/cursor.svg +1 -12
- package/dist/web/icon/agent/pi.svg +2 -2
- package/dist/web/index.html +55 -4
- package/package.json +1 -1
- package/dist/chunk-NBCLV4CX.js.map +0 -1
- package/dist/web/assets/index-B6p64k_Q.js +0 -113
- package/dist/web/assets/index-DiFr4_5-.css +0 -2
- package/dist/web/assets/vendor-CShgXaOi.js +0 -40
- /package/dist/{dist-5356XOFP.js.map → dist-AIDCOQZO.js.map} +0 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import "./chunk-EWC6IODK.js";
|
|
2
3
|
import {
|
|
3
4
|
FileSystemSessionSource,
|
|
4
5
|
attachMissingProjectIdentities,
|
|
5
6
|
createRegisteredAgents,
|
|
6
7
|
ensureSessionTagsSync,
|
|
7
8
|
matchesScanWindow
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-MWSJTNOW.js";
|
|
9
10
|
|
|
10
11
|
// src/scan-refresh-worker.ts
|
|
11
12
|
import { parentPort, workerData } from "worker_threads";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scan-refresh-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n attachMissingProjectIdentities,\n createRegisteredAgents,\n ensureSessionTagsSync,\n FileSystemSessionSource,\n matchesScanWindow,\n type AgentScanProgress,\n type BaseAgent,\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 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\n/**\n * Compare a live source fingerprint against the cached meta. A direct string\n * match is the fast path; the fallback tolerates older cache entries written by\n * a different fingerprint format as long as the underlying mtime (array slot 2)\n * is unchanged, so a fingerprint-format bump does not force a full rescan.\n */\nfunction sourceFingerprintMatches(\n source: SessionSourceRef,\n cachedSession: SessionHead,\n cached: SessionCacheMeta | undefined,\n): boolean {\n if (sourceFingerprintFromMeta(cached) === 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\n/**\n * A cached session outside the current scan window was never enumerated this\n * pass, so its absence from sourceRefs doesn't mean it was deleted on disk —\n * treat it as still present. Sessions with no recorded mtime predate this\n * field; keep them too rather than risk a false-positive removal.\n */\nfunction wasEnumeratedThisPass(\n cached: SessionCacheMeta | undefined,\n windowOptions: Pick<ScanOptions, \"from\" | \"to\"> | undefined,\n): boolean {\n if (windowOptions?.from == null && windowOptions?.to == null) return true;\n const mtimeMs = cached?.sourceMtimeMs;\n return typeof mtimeMs !== \"number\" || matchesScanWindow(mtimeMs, windowOptions);\n}\n\n/**\n * Source-level incremental sync, mirroring FileSystemSessionSource.incrementalScan.\n * Kept standalone because the worker cannot share the agent's live metaMap with\n * the main thread — it receives cached meta via workerData instead.\n */\nfunction syncAgentSources(\n agent: FileSystemSessionSource,\n cachedSessions: SessionHead[],\n cachedMeta: Record<string, SessionCacheMeta>,\n windowOptions?: Pick<ScanOptions, \"from\" | \"to\">,\n): { sessions: SessionHead[]; changedIds: string[] } {\n const sessionMap = new Map(cachedSessions.map((session) => [session.id, session]));\n const sourceRefs = agent.listSessionSources(windowOptions);\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)) continue;\n if (!wasEnumeratedThisPass(cachedMeta[session.id], windowOptions)) continue;\n sessionMap.delete(session.id);\n changedIds.add(session.id);\n }\n\n return { sessions: [...sessionMap.values()], changedIds: [...changedIds] };\n}\n\n/**\n * A session still receiving writes will be stale again within seconds, so\n * recomputing its tags every refresh cycle is wasted work — wait for it to\n * settle before paying the getSessionData() parse cost.\n */\nconst TAG_SETTLE_MS = 60_000;\n\nfunction isSettled(session: SessionHead, now: number): boolean {\n return now - (session.time_updated ?? session.time_created) >= TAG_SETTLE_MS;\n}\n\n/**\n * Runs identity resolution (spawns git) and stale smart-tag reclassification\n * on the worker thread, off the server's main event loop.\n */\nexport function finalizeSessions(agent: BaseAgent, sessions: SessionHead[]): SessionHead[] {\n const withIdentity = attachMissingProjectIdentities(sessions);\n\n const now = Date.now();\n const settled = withIdentity.filter((session) => isSettled(session, now));\n if (settled.length === 0) return withIdentity;\n\n const taggedById = new Map(\n ensureSessionTagsSync(agent, settled).sessions.map((session) => [session.id, session]),\n );\n return withIdentity.map((session) => taggedById.get(session.id) ?? session);\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 agent.setSessionMetaMap(new Map(Object.entries(data.meta)));\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 && agent instanceof FileSystemSessionSource) {\n const result = syncAgentSources(agent, data.previousSessions, data.meta, data.scanOptions);\n sessions = result.sessions;\n changedIds = result.changedIds;\n } else if (data.changedIds) {\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 sessions = finalizeSessions(agent, sessions);\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/scan-refresh-worker.ts"],"sourcesContent":["import \"./diagnostics-bridge.js\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport {\n attachMissingProjectIdentities,\n createRegisteredAgents,\n ensureSessionTagsSync,\n FileSystemSessionSource,\n matchesScanWindow,\n type AgentScanProgress,\n type BaseAgent,\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 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\n/**\n * Compare a live source fingerprint against the cached meta. A direct string\n * match is the fast path; the fallback tolerates older cache entries written by\n * a different fingerprint format as long as the underlying mtime (array slot 2)\n * is unchanged, so a fingerprint-format bump does not force a full rescan.\n */\nfunction sourceFingerprintMatches(\n source: SessionSourceRef,\n cachedSession: SessionHead,\n cached: SessionCacheMeta | undefined,\n): boolean {\n if (sourceFingerprintFromMeta(cached) === 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\n/**\n * A cached session outside the current scan window was never enumerated this\n * pass, so its absence from sourceRefs doesn't mean it was deleted on disk —\n * treat it as still present. Sessions with no recorded mtime predate this\n * field; keep them too rather than risk a false-positive removal.\n */\nfunction wasEnumeratedThisPass(\n cached: SessionCacheMeta | undefined,\n windowOptions: Pick<ScanOptions, \"from\" | \"to\"> | undefined,\n): boolean {\n if (windowOptions?.from == null && windowOptions?.to == null) return true;\n const mtimeMs = cached?.sourceMtimeMs;\n return typeof mtimeMs !== \"number\" || matchesScanWindow(mtimeMs, windowOptions);\n}\n\n/**\n * Source-level incremental sync, mirroring FileSystemSessionSource.incrementalScan.\n * Kept standalone because the worker cannot share the agent's live metaMap with\n * the main thread — it receives cached meta via workerData instead.\n */\nfunction syncAgentSources(\n agent: FileSystemSessionSource,\n cachedSessions: SessionHead[],\n cachedMeta: Record<string, SessionCacheMeta>,\n windowOptions?: Pick<ScanOptions, \"from\" | \"to\">,\n): { sessions: SessionHead[]; changedIds: string[] } {\n const sessionMap = new Map(cachedSessions.map((session) => [session.id, session]));\n const sourceRefs = agent.listSessionSources(windowOptions);\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)) continue;\n if (!wasEnumeratedThisPass(cachedMeta[session.id], windowOptions)) continue;\n sessionMap.delete(session.id);\n changedIds.add(session.id);\n }\n\n return { sessions: [...sessionMap.values()], changedIds: [...changedIds] };\n}\n\n/**\n * A session still receiving writes will be stale again within seconds, so\n * recomputing its tags every refresh cycle is wasted work — wait for it to\n * settle before paying the getSessionData() parse cost.\n */\nconst TAG_SETTLE_MS = 60_000;\n\nfunction isSettled(session: SessionHead, now: number): boolean {\n return now - (session.time_updated ?? session.time_created) >= TAG_SETTLE_MS;\n}\n\n/**\n * Runs identity resolution (spawns git) and stale smart-tag reclassification\n * on the worker thread, off the server's main event loop.\n */\nexport function finalizeSessions(agent: BaseAgent, sessions: SessionHead[]): SessionHead[] {\n const withIdentity = attachMissingProjectIdentities(sessions);\n\n const now = Date.now();\n const settled = withIdentity.filter((session) => isSettled(session, now));\n if (settled.length === 0) return withIdentity;\n\n const taggedById = new Map(\n ensureSessionTagsSync(agent, settled).sessions.map((session) => [session.id, session]),\n );\n return withIdentity.map((session) => taggedById.get(session.id) ?? session);\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 agent.setSessionMetaMap(new Map(Object.entries(data.meta)));\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 && agent instanceof FileSystemSessionSource) {\n const result = syncAgentSources(agent, data.previousSessions, data.meta, data.scanOptions);\n sessions = result.sessions;\n changedIds = result.changedIds;\n } else if (data.changedIds) {\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 sessions = finalizeSessions(agent, sessions);\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"]}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
appLogger
|
|
4
|
+
} from "./chunk-EWC6IODK.js";
|
|
2
5
|
import {
|
|
3
6
|
createRegisteredAgents,
|
|
4
7
|
getCachePath2,
|
|
@@ -8,7 +11,7 @@ import {
|
|
|
8
11
|
setFtsIntegrityCheckedPath,
|
|
9
12
|
syncSessionSearchIndex,
|
|
10
13
|
syncSessionSearchIndexChanges
|
|
11
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-MWSJTNOW.js";
|
|
12
15
|
|
|
13
16
|
// src/search-index-worker.ts
|
|
14
17
|
import { parentPort, workerData } from "worker_threads";
|
|
@@ -53,8 +56,14 @@ for (const job of jobs) {
|
|
|
53
56
|
(sessionId) => agent.getSessionData(sessionId),
|
|
54
57
|
job.searchIndexOptions
|
|
55
58
|
);
|
|
56
|
-
if (job.saveCache && result
|
|
59
|
+
if (job.saveCache && result) {
|
|
57
60
|
markAgentCacheInitialized(job.agentName);
|
|
61
|
+
if (result.skipped > 0) {
|
|
62
|
+
appLogger.warn("search_index.sync_incomplete", {
|
|
63
|
+
agent: job.agentName,
|
|
64
|
+
skipped: result.skipped
|
|
65
|
+
});
|
|
66
|
+
}
|
|
58
67
|
}
|
|
59
68
|
}
|
|
60
69
|
parentPort?.postMessage({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/search-index-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n getCachePath,\n markAgentCacheInitialized,\n saveCachedSessionChanges,\n saveCachedSessions,\n setFtsIntegrityCheckedPath,\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 /** Set once this process has already run the FTS integrity check in an earlier batch. */\n skipFtsIntegrityCheck?: boolean;\n}\n\nconst data = workerData as SearchIndexWorkerData;\nif (data.skipFtsIntegrityCheck) {\n setFtsIntegrityCheckedPath(getCachePath());\n}\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
|
|
1
|
+
{"version":3,"sources":["../src/search-index-worker.ts"],"sourcesContent":["import \"./diagnostics-bridge.js\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n getCachePath,\n markAgentCacheInitialized,\n saveCachedSessionChanges,\n saveCachedSessions,\n setFtsIntegrityCheckedPath,\n syncSessionSearchIndex,\n syncSessionSearchIndexChanges,\n type SearchIndexSyncResult,\n type SearchIndexSyncOptions,\n type SessionCacheMeta,\n type SessionHeadChange,\n type SessionHead,\n} from \"@codesesh/core\";\nimport { appLogger } from \"./logging.js\";\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 /** Set once this process has already run the FTS integrity check in an earlier batch. */\n skipFtsIntegrityCheck?: boolean;\n}\n\nconst data = workerData as SearchIndexWorkerData;\nif (data.skipFtsIntegrityCheck) {\n setFtsIntegrityCheckedPath(getCachePath());\n}\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 // Head cache init is decoupled from search-index completeness (CS-73): a\n // session that fails to load must not permanently block markAgentCacheInitialized,\n // or every future refresh would fall back to a full initializeAgent scan.\n // The skip is still surfaced as a warning so it stays visible.\n if (job.saveCache && result) {\n markAgentCacheInitialized(job.agentName);\n if (result.skipped > 0) {\n appLogger.warn(\"search_index.sync_incomplete\", {\n agent: job.agentName,\n skipped: result.skipped,\n });\n }\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":";;;;;;;;;;;;;;;;AACA,SAAS,YAAY,kBAAkB;AA6DvC,IAAM,OAAO;AACb,IAAI,KAAK,uBAAuB;AAC9B,6BAA2B,cAAa,CAAC;AAC3C;AACA,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;AAKA,QAAI,IAAI,aAAa,QAAQ;AAC3B,gCAA0B,IAAI,SAAS;AACvC,UAAI,OAAO,UAAU,GAAG;AACtB,kBAAU,KAAK,gCAAgC;AAAA,UAC7C,OAAO,IAAI;AAAA,UACX,SAAS,OAAO;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;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":[]}
|
package/dist/smart-tag-worker.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import "./chunk-EWC6IODK.js";
|
|
2
3
|
import {
|
|
3
4
|
classifySessionTags,
|
|
4
5
|
createRegisteredAgents,
|
|
5
6
|
getSmartTagSourceTimestamp
|
|
6
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-MWSJTNOW.js";
|
|
7
8
|
|
|
8
9
|
// src/smart-tag-worker.ts
|
|
9
10
|
import { parentPort, workerData } from "worker_threads";
|
|
@@ -1 +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":"
|
|
1
|
+
{"version":3,"sources":["../src/smart-tag-worker.ts"],"sourcesContent":["import \"./diagnostics-bridge.js\";\nimport { 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":";;;;;;;;;AACA,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":[]}
|