codesesh 1.0.4 → 1.0.6

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 (59) hide show
  1. package/README.md +5 -4
  2. package/dist/{chunk-W4PZHL2C.js → chunk-4ND6AT6W.js} +154 -92
  3. package/dist/chunk-4ND6AT6W.js.map +1 -0
  4. package/dist/chunk-4QFNZCBR.js +1271 -0
  5. package/dist/chunk-4QFNZCBR.js.map +1 -0
  6. package/dist/{chunk-MBZ4VV4C.js → chunk-A3MT6L6Z.js} +3 -3
  7. package/dist/chunk-COZSWVCH.js +89 -0
  8. package/dist/chunk-COZSWVCH.js.map +1 -0
  9. package/dist/{chunk-YCUN52HA.js → chunk-L3DDWTYV.js} +81 -115
  10. package/dist/chunk-L3DDWTYV.js.map +1 -0
  11. package/dist/{chunk-BYB77UAJ.js → chunk-XQDYKKRC.js} +139 -80
  12. package/dist/chunk-XQDYKKRC.js.map +1 -0
  13. package/dist/{chunk-3SXCTDD6.js → chunk-YZ6XCSVQ.js} +4 -3
  14. package/dist/{discovery-K3GLISI6.js → discovery-ADSQARBV.js} +11 -5
  15. package/dist/index.js +1538 -1030
  16. package/dist/index.js.map +1 -1
  17. package/dist/project-identity-worker.js +4 -4
  18. package/dist/scan-refresh-worker.js +17 -7
  19. package/dist/scan-refresh-worker.js.map +1 -1
  20. package/dist/search-index-worker.js +16 -8
  21. package/dist/search-index-worker.js.map +1 -1
  22. package/dist/session-detail-worker.js +79 -0
  23. package/dist/session-detail-worker.js.map +1 -0
  24. package/dist/smart-tag-worker.js +3 -3
  25. package/dist/web/assets/CustomTimeWindowDialog-D2bx7uDv.js +1 -0
  26. package/dist/web/assets/InteractiveReceipt-BFpIdno8.js +1 -0
  27. package/dist/web/assets/OverviewScreen-D_KXfiJi.js +1 -0
  28. package/dist/web/assets/{PrismHighlighter-B1a2dPJO.js → PrismHighlighter-BgVkYu_S.js} +1 -1
  29. package/dist/web/assets/Projects-CN44UpuR.js +1 -0
  30. package/dist/web/assets/SearchResultsPanel-CWD01v-a.js +1 -0
  31. package/dist/web/assets/SessionDetail-D8taQ6Tl.js +53 -0
  32. package/dist/web/assets/api-B9lJtVbO.js +1 -0
  33. package/dist/web/assets/index-XpolWMY4.js +1423 -0
  34. package/dist/web/assets/index-xbEEMszv.css +1 -0
  35. package/dist/web/assets/session-indexes-fib48ZKn.js +4 -0
  36. package/dist/web/assets/translate-Dmym1ZDl.js +2 -0
  37. package/dist/web/assets/utils-Bk66u8b3.js +1 -0
  38. package/dist/web/index.html +7 -7
  39. package/package.json +3 -3
  40. package/dist/chunk-BYB77UAJ.js.map +0 -1
  41. package/dist/chunk-G4HRD3AR.js +0 -246
  42. package/dist/chunk-G4HRD3AR.js.map +0 -1
  43. package/dist/chunk-W4PZHL2C.js.map +0 -1
  44. package/dist/chunk-YCUN52HA.js.map +0 -1
  45. package/dist/web/assets/InteractiveReceipt-Dk50TBsH.js +0 -1
  46. package/dist/web/assets/OverviewScreen-5hvQVp4H.js +0 -1
  47. package/dist/web/assets/Projects-Cy_v2yep.js +0 -1
  48. package/dist/web/assets/SearchResultsPanel-DfheEwpz.js +0 -1
  49. package/dist/web/assets/SessionDetail-DRI8R3st.js +0 -53
  50. package/dist/web/assets/api-GP9UCedC.js +0 -1
  51. package/dist/web/assets/contract-xJyW5u7a.js +0 -2
  52. package/dist/web/assets/index-Bd-YkWkZ.css +0 -1
  53. package/dist/web/assets/index-DEjvzumm.js +0 -1410
  54. package/dist/web/assets/panel-ND0J63d3.js +0 -1
  55. package/dist/web/assets/session-indexes-BsgjUoc1.js +0 -4
  56. package/dist/web/assets/utils-C7BqyxxV.js +0 -1
  57. /package/dist/{chunk-MBZ4VV4C.js.map → chunk-A3MT6L6Z.js.map} +0 -0
  58. /package/dist/{chunk-3SXCTDD6.js.map → chunk-YZ6XCSVQ.js.map} +0 -0
  59. /package/dist/{discovery-K3GLISI6.js.map → discovery-ADSQARBV.js.map} +0 -0
@@ -1,246 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- WORKER_LOG_MESSAGE_TYPE,
4
- ensurePrivateDirectory,
5
- isWorkerLogMessage,
6
- restrictExistingPrivateFiles,
7
- restrictPrivateFile,
8
- setCoreDiagnostics
9
- } from "./chunk-W4PZHL2C.js";
10
-
11
- // src/logging.ts
12
- import { appendFileSync, existsSync, readdirSync, renameSync, statSync, unlinkSync } from "fs";
13
- import { homedir } from "os";
14
- import { join } from "path";
15
- var LEVEL_WEIGHT = {
16
- debug: 10,
17
- info: 20,
18
- warn: 30,
19
- error: 40
20
- };
21
- function parseLevel(value) {
22
- if (value === "debug" || value === "info" || value === "warn" || value === "error") {
23
- return value;
24
- }
25
- return "info";
26
- }
27
- function parsePositiveInt(value, fallback) {
28
- const parsed = Number(value);
29
- return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
30
- }
31
- function getDefaultLogDir() {
32
- const base = process.env.XDG_CACHE_HOME ?? join(homedir(), ".cache");
33
- return join(base, "codesesh", "logs");
34
- }
35
- function toLogValue(value, depth = 0) {
36
- if (value == null || typeof value === "string" || typeof value === "number") return value;
37
- if (typeof value === "boolean") return value;
38
- if (typeof value === "bigint") return value.toString();
39
- if (value instanceof Error) {
40
- return {
41
- name: value.name,
42
- message: value.message,
43
- stack: value.stack
44
- };
45
- }
46
- if (depth >= 4) return "[truncated]";
47
- if (Array.isArray(value)) return value.slice(0, 50).map((item) => toLogValue(item, depth + 1));
48
- if (typeof value === "object") {
49
- return Object.fromEntries(
50
- Object.entries(value).map(([key, item]) => [
51
- key,
52
- toLogValue(item, depth + 1)
53
- ])
54
- );
55
- }
56
- return String(value);
57
- }
58
- function timestampForFile(date = /* @__PURE__ */ new Date()) {
59
- return date.toISOString().replace(/[:.]/g, "-");
60
- }
61
- var AppLogger = class {
62
- logDir;
63
- level;
64
- maxBytes;
65
- maxFiles;
66
- currentPath;
67
- rotationIndex = 0;
68
- restrictedExistingLogs = false;
69
- workerTarget = null;
70
- writeFailureReported = false;
71
- constructor(options = {}) {
72
- this.logDir = options.logDir ?? process.env.CODESESH_LOG_DIR ?? getDefaultLogDir();
73
- this.level = options.level ?? parseLevel(process.env.CODESESH_LOG_LEVEL);
74
- this.maxBytes = options.maxBytes ?? parsePositiveInt(process.env.CODESESH_LOG_MAX_BYTES, 5e6);
75
- this.maxFiles = options.maxFiles ?? parsePositiveInt(process.env.CODESESH_LOG_MAX_FILES, 5);
76
- this.currentPath = join(this.logDir, `codesesh-${process.pid}.log`);
77
- }
78
- getLogPath() {
79
- return this.currentPath;
80
- }
81
- forwardToParent(port, threadId2) {
82
- this.workerTarget = { port, threadId: threadId2 };
83
- }
84
- consumeWorkerMessage(message) {
85
- if (!isWorkerLogMessage(message)) return false;
86
- if (LEVEL_WEIGHT[message.level] < LEVEL_WEIGHT[this.level]) return true;
87
- this.appendRecord({
88
- ...message.data,
89
- ts: message.ts,
90
- level: message.level,
91
- event: message.event,
92
- pid: message.pid,
93
- thread_id: message.threadId
94
- });
95
- return true;
96
- }
97
- debug(event, data = {}) {
98
- this.write("debug", event, data);
99
- }
100
- info(event, data = {}) {
101
- this.write("info", event, data);
102
- }
103
- warn(event, data = {}) {
104
- this.write("warn", event, data);
105
- }
106
- error(event, data = {}) {
107
- this.write("error", event, data);
108
- }
109
- write(level, event, data) {
110
- if (LEVEL_WEIGHT[level] < LEVEL_WEIGHT[this.level]) return;
111
- const ts = (/* @__PURE__ */ new Date()).toISOString();
112
- const normalizedData = toLogValue(data);
113
- if (this.workerTarget) {
114
- try {
115
- this.workerTarget.port.postMessage({
116
- type: WORKER_LOG_MESSAGE_TYPE,
117
- ts,
118
- level,
119
- event,
120
- pid: process.pid,
121
- threadId: this.workerTarget.threadId,
122
- data: normalizedData
123
- });
124
- } catch (error) {
125
- this.reportWriteFailure(error);
126
- }
127
- return;
128
- }
129
- this.appendRecord({
130
- ...normalizedData,
131
- ts,
132
- level,
133
- event,
134
- pid: process.pid
135
- });
136
- }
137
- appendRecord(record) {
138
- try {
139
- ensurePrivateDirectory(this.logDir);
140
- this.restrictExistingLogs();
141
- const line = `${JSON.stringify(record)}
142
- `;
143
- const restrictCurrentFile = this.rotateIfNeeded(Buffer.byteLength(line));
144
- appendFileSync(this.currentPath, line, "utf8");
145
- if (restrictCurrentFile) restrictPrivateFile(this.currentPath);
146
- this.writeFailureReported = false;
147
- } catch (error) {
148
- this.reportWriteFailure(error);
149
- }
150
- }
151
- reportWriteFailure(error) {
152
- if (this.writeFailureReported) return;
153
- this.writeFailureReported = true;
154
- const message = error instanceof Error ? error.message : String(error);
155
- try {
156
- process.stderr.write(`[codesesh] Failed to write log ${this.currentPath}: ${message}
157
- `);
158
- } catch {
159
- }
160
- }
161
- /** Logs rotated by an earlier run predate the owner-only policy. */
162
- restrictExistingLogs() {
163
- if (this.restrictedExistingLogs) return;
164
- this.restrictedExistingLogs = true;
165
- restrictExistingPrivateFiles(
166
- this.logDir,
167
- (name) => name.startsWith("codesesh") && name.endsWith(".log")
168
- );
169
- }
170
- rotateIfNeeded(nextBytes) {
171
- if (!existsSync(this.currentPath)) {
172
- this.removeExpiredLogs();
173
- return true;
174
- }
175
- const currentSize = statSync(this.currentPath).size;
176
- if (currentSize + nextBytes <= this.maxBytes) return false;
177
- this.rotationIndex += 1;
178
- const rotatedPath = join(
179
- this.logDir,
180
- `codesesh-${process.pid}-${timestampForFile()}-${this.rotationIndex}.log`
181
- );
182
- renameSync(this.currentPath, rotatedPath);
183
- restrictPrivateFile(rotatedPath);
184
- this.removeExpiredLogs();
185
- return true;
186
- }
187
- removeExpiredLogs() {
188
- const ownedPrefix = `codesesh-${process.pid}-`;
189
- const rotated = readdirSync(this.logDir).filter((name) => name.startsWith(ownedPrefix) && name.endsWith(".log")).map((name) => {
190
- const path = join(this.logDir, name);
191
- return { path, mtimeMs: statSync(path).mtimeMs };
192
- }).toSorted((a, b) => b.mtimeMs - a.mtimeMs);
193
- for (const item of rotated.slice(Math.max(0, this.maxFiles - 1))) {
194
- unlinkSync(item.path);
195
- }
196
- }
197
- };
198
- var appLogger = new AppLogger();
199
- function logSearchIndexSync(context, result, data = {}) {
200
- if (result?.failures?.length) {
201
- appLogger.warn("search_index.sessions_skipped", {
202
- context,
203
- agent: result.agentName,
204
- failures: result.failures
205
- });
206
- }
207
- if (!result) return;
208
- const detail = {
209
- context,
210
- agent: result.agentName,
211
- mode: result.mode,
212
- sessions: result.sessions,
213
- changed: result.changed,
214
- deleted: result.deleted,
215
- indexed: result.indexed,
216
- skipped: result.skipped,
217
- duration_ms: Math.round(result.durationMs),
218
- planning_ms: Math.round(result.planningDurationMs),
219
- get_session_data_calls: result.getSessionDataCalls,
220
- reused_materializations: result.reusedMaterializations,
221
- get_session_data_ms: Math.round(result.getSessionDataDurationMs),
222
- materialization_ms: Math.round(result.materializationDurationMs),
223
- rebuild_duration_ms: result.rebuildDurationMs != null ? Math.round(result.rebuildDurationMs) : void 0,
224
- ...data
225
- };
226
- if (result.mode === "bulk") appLogger.info("search_index.sync", detail);
227
- else appLogger.debug("search_index.sync", detail);
228
- }
229
-
230
- // src/diagnostics-bridge.ts
231
- import { parentPort, threadId } from "worker_threads";
232
- if (parentPort) appLogger.forwardToParent(parentPort, threadId);
233
- setCoreDiagnostics({
234
- info(event, detail) {
235
- appLogger.info(event, detail);
236
- },
237
- warn(event, detail) {
238
- appLogger.warn(event, detail);
239
- }
240
- });
241
-
242
- export {
243
- appLogger,
244
- logSearchIndexSync
245
- };
246
- //# sourceMappingURL=chunk-G4HRD3AR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/logging.ts","../src/diagnostics-bridge.ts"],"sourcesContent":["import { appendFileSync, existsSync, readdirSync, renameSync, statSync, unlinkSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n ensurePrivateDirectory,\n isWorkerLogMessage,\n restrictExistingPrivateFiles,\n restrictPrivateFile,\n WORKER_LOG_MESSAGE_TYPE,\n type WorkerLogLevel,\n type WorkerLogMessage,\n} from \"@codesesh/core/runtime/diagnostics\";\nimport type { SearchIndexSyncResult } from \"@codesesh/core/runtime/discovery\";\n\ntype LogLevel = WorkerLogLevel;\n\ninterface WorkerLogPort {\n postMessage(message: WorkerLogMessage): void;\n}\n\nconst LEVEL_WEIGHT: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport interface LoggerOptions {\n logDir?: string;\n level?: LogLevel;\n maxBytes?: number;\n maxFiles?: number;\n}\n\nfunction parseLevel(value: string | undefined): LogLevel {\n if (value === \"debug\" || value === \"info\" || value === \"warn\" || value === \"error\") {\n return value;\n }\n return \"info\";\n}\n\nfunction parsePositiveInt(value: string | undefined, fallback: number): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;\n}\n\nfunction getDefaultLogDir(): string {\n const base = process.env.XDG_CACHE_HOME ?? join(homedir(), \".cache\");\n return join(base, \"codesesh\", \"logs\");\n}\n\nfunction toLogValue(value: unknown, depth = 0): unknown {\n if (value == null || typeof value === \"string\" || typeof value === \"number\") return value;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"bigint\") return value.toString();\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n if (depth >= 4) return \"[truncated]\";\n if (Array.isArray(value)) return value.slice(0, 50).map((item) => toLogValue(item, depth + 1));\n if (typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n toLogValue(item, depth + 1),\n ]),\n );\n }\n return String(value);\n}\n\nfunction timestampForFile(date = new Date()): string {\n return date.toISOString().replace(/[:.]/g, \"-\");\n}\n\nexport class AppLogger {\n private readonly logDir: string;\n private readonly level: LogLevel;\n private readonly maxBytes: number;\n private readonly maxFiles: number;\n private readonly currentPath: string;\n private rotationIndex = 0;\n private restrictedExistingLogs = false;\n private workerTarget: { port: WorkerLogPort; threadId: number } | null = null;\n private writeFailureReported = false;\n\n constructor(options: LoggerOptions = {}) {\n this.logDir = options.logDir ?? process.env.CODESESH_LOG_DIR ?? getDefaultLogDir();\n this.level = options.level ?? parseLevel(process.env.CODESESH_LOG_LEVEL);\n this.maxBytes =\n options.maxBytes ?? parsePositiveInt(process.env.CODESESH_LOG_MAX_BYTES, 5_000_000);\n this.maxFiles = options.maxFiles ?? parsePositiveInt(process.env.CODESESH_LOG_MAX_FILES, 5);\n this.currentPath = join(this.logDir, `codesesh-${process.pid}.log`);\n }\n\n getLogPath(): string {\n return this.currentPath;\n }\n\n forwardToParent(port: WorkerLogPort, threadId: number): void {\n this.workerTarget = { port, threadId };\n }\n\n consumeWorkerMessage(message: unknown): boolean {\n if (!isWorkerLogMessage(message)) return false;\n if (LEVEL_WEIGHT[message.level] < LEVEL_WEIGHT[this.level]) return true;\n this.appendRecord({\n ...message.data,\n ts: message.ts,\n level: message.level,\n event: message.event,\n pid: message.pid,\n thread_id: message.threadId,\n });\n return true;\n }\n\n debug(event: string, data: Record<string, unknown> = {}): void {\n this.write(\"debug\", event, data);\n }\n\n info(event: string, data: Record<string, unknown> = {}): void {\n this.write(\"info\", event, data);\n }\n\n warn(event: string, data: Record<string, unknown> = {}): void {\n this.write(\"warn\", event, data);\n }\n\n error(event: string, data: Record<string, unknown> = {}): void {\n this.write(\"error\", event, data);\n }\n\n private write(level: LogLevel, event: string, data: Record<string, unknown>): void {\n if (LEVEL_WEIGHT[level] < LEVEL_WEIGHT[this.level]) return;\n\n const ts = new Date().toISOString();\n const normalizedData = toLogValue(data) as Record<string, unknown>;\n if (this.workerTarget) {\n try {\n this.workerTarget.port.postMessage({\n type: WORKER_LOG_MESSAGE_TYPE,\n ts,\n level,\n event,\n pid: process.pid,\n threadId: this.workerTarget.threadId,\n data: normalizedData,\n });\n } catch (error) {\n this.reportWriteFailure(error);\n }\n return;\n }\n\n this.appendRecord({\n ...normalizedData,\n ts,\n level,\n event,\n pid: process.pid,\n });\n }\n\n private appendRecord(record: Record<string, unknown>): void {\n try {\n ensurePrivateDirectory(this.logDir);\n this.restrictExistingLogs();\n const line = `${JSON.stringify(record)}\\n`;\n const restrictCurrentFile = this.rotateIfNeeded(Buffer.byteLength(line));\n appendFileSync(this.currentPath, line, \"utf8\");\n if (restrictCurrentFile) restrictPrivateFile(this.currentPath);\n this.writeFailureReported = false;\n } catch (error) {\n this.reportWriteFailure(error);\n }\n }\n\n private reportWriteFailure(error: unknown): void {\n if (this.writeFailureReported) return;\n this.writeFailureReported = true;\n const message = error instanceof Error ? error.message : String(error);\n try {\n process.stderr.write(`[codesesh] Failed to write log ${this.currentPath}: ${message}\\n`);\n } catch {}\n }\n\n /** Logs rotated by an earlier run predate the owner-only policy. */\n private restrictExistingLogs(): void {\n if (this.restrictedExistingLogs) return;\n this.restrictedExistingLogs = true;\n restrictExistingPrivateFiles(\n this.logDir,\n (name) => name.startsWith(\"codesesh\") && name.endsWith(\".log\"),\n );\n }\n\n private rotateIfNeeded(nextBytes: number): boolean {\n if (!existsSync(this.currentPath)) {\n this.removeExpiredLogs();\n return true;\n }\n\n const currentSize = statSync(this.currentPath).size;\n if (currentSize + nextBytes <= this.maxBytes) return false;\n\n this.rotationIndex += 1;\n const rotatedPath = join(\n this.logDir,\n `codesesh-${process.pid}-${timestampForFile()}-${this.rotationIndex}.log`,\n );\n renameSync(this.currentPath, rotatedPath);\n restrictPrivateFile(rotatedPath);\n this.removeExpiredLogs();\n return true;\n }\n\n private removeExpiredLogs(): void {\n const ownedPrefix = `codesesh-${process.pid}-`;\n const rotated = readdirSync(this.logDir)\n .filter((name) => name.startsWith(ownedPrefix) && name.endsWith(\".log\"))\n .map((name) => {\n const path = join(this.logDir, name);\n return { path, mtimeMs: statSync(path).mtimeMs };\n })\n .toSorted((a, b) => b.mtimeMs - a.mtimeMs);\n\n for (const item of rotated.slice(Math.max(0, this.maxFiles - 1))) {\n unlinkSync(item.path);\n }\n }\n}\n\nexport const appLogger = new AppLogger();\n\nexport function logSearchIndexSync(\n context: string,\n result: SearchIndexSyncResult | null,\n data: Record<string, unknown> = {},\n): void {\n if (result?.failures?.length) {\n appLogger.warn(\"search_index.sessions_skipped\", {\n context,\n agent: result.agentName,\n failures: result.failures,\n });\n }\n if (!result) return;\n\n const detail = {\n context,\n agent: result.agentName,\n mode: result.mode,\n sessions: result.sessions,\n changed: result.changed,\n deleted: result.deleted,\n indexed: result.indexed,\n skipped: result.skipped,\n duration_ms: Math.round(result.durationMs),\n planning_ms: Math.round(result.planningDurationMs),\n get_session_data_calls: result.getSessionDataCalls,\n reused_materializations: result.reusedMaterializations,\n get_session_data_ms: Math.round(result.getSessionDataDurationMs),\n materialization_ms: Math.round(result.materializationDurationMs),\n rebuild_duration_ms:\n result.rebuildDurationMs != null ? Math.round(result.rebuildDurationMs) : undefined,\n ...data,\n };\n if (result.mode === \"bulk\") appLogger.info(\"search_index.sync\", detail);\n else appLogger.debug(\"search_index.sync\", detail);\n}\n","import { setCoreDiagnostics } from \"@codesesh/core/runtime/diagnostics\";\nimport { parentPort, threadId } from \"node:worker_threads\";\nimport { appLogger } from \"./logging.js\";\n\n/**\n * Bridges core's diagnostics sink to appLogger. Import this once, for its\n * side effect, from every entry point that gets its own module graph — the\n * main CLI thread and each worker_threads script (scan-refresh-worker,\n * search-index-worker, smart-tag-worker) — since core's module-level\n * diagnostics singleton is per-thread, not shared across workers.\n */\nif (parentPort) appLogger.forwardToParent(parentPort, threadId);\n\nsetCoreDiagnostics({\n info(event, detail) {\n appLogger.info(event, detail);\n },\n warn(event, detail) {\n appLogger.warn(event, detail);\n },\n});\n"],"mappings":"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","names":["threadId"]}