@geminilight/mindos 1.1.7 → 1.1.9

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 (93) hide show
  1. package/dist/agent/index.d.ts +1 -1
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +1 -1
  4. package/dist/agent/index.js.map +1 -1
  5. package/dist/agent/prompt-builder.d.ts.map +1 -1
  6. package/dist/agent/prompt-builder.js +8 -12
  7. package/dist/agent/prompt-builder.js.map +1 -1
  8. package/dist/agent/prompts.d.ts +0 -4
  9. package/dist/agent/prompts.d.ts.map +1 -1
  10. package/dist/agent/prompts.js +0 -15
  11. package/dist/agent/prompts.js.map +1 -1
  12. package/dist/client.d.ts +1 -1
  13. package/dist/client.d.ts.map +1 -1
  14. package/dist/protocols/acp/index.js +7 -7
  15. package/dist/protocols/acp/registry.d.ts +3 -1
  16. package/dist/protocols/acp/registry.d.ts.map +1 -1
  17. package/dist/protocols/acp/registry.js +62 -10
  18. package/dist/protocols/acp/registry.js.map +1 -1
  19. package/dist/server/handlers/agent-activity.d.ts +1 -1
  20. package/dist/server/handlers/agent-activity.d.ts.map +1 -1
  21. package/dist/server/handlers/agent-activity.js +6 -8
  22. package/dist/server/handlers/agent-activity.js.map +1 -1
  23. package/dist/server/handlers/agent-capabilities.d.ts +2 -2
  24. package/dist/server/handlers/agent-capabilities.d.ts.map +1 -1
  25. package/dist/server/handlers/agent-capabilities.js +11 -11
  26. package/dist/server/handlers/agent-capabilities.js.map +1 -1
  27. package/dist/server/handlers/ask-sessions.d.ts.map +1 -1
  28. package/dist/server/handlers/ask-sessions.js +26 -145
  29. package/dist/server/handlers/ask-sessions.js.map +1 -1
  30. package/dist/server/handlers/ask.d.ts +1 -1
  31. package/dist/server/handlers/ask.d.ts.map +1 -1
  32. package/dist/server/handlers/ask.js +2 -2
  33. package/dist/server/handlers/ask.js.map +1 -1
  34. package/dist/server/handlers/changes.d.ts +1 -1
  35. package/dist/server/handlers/changes.d.ts.map +1 -1
  36. package/dist/server/handlers/changes.js +15 -27
  37. package/dist/server/handlers/changes.js.map +1 -1
  38. package/dist/server/handlers/file.d.ts.map +1 -1
  39. package/dist/server/handlers/file.js +48 -3
  40. package/dist/server/handlers/file.js.map +1 -1
  41. package/dist/server/handlers/graph.d.ts +5 -2
  42. package/dist/server/handlers/graph.d.ts.map +1 -1
  43. package/dist/server/handlers/graph.js +115 -6
  44. package/dist/server/handlers/graph.js.map +1 -1
  45. package/dist/server/handlers/monitoring.d.ts +0 -8
  46. package/dist/server/handlers/monitoring.d.ts.map +1 -1
  47. package/dist/server/handlers/monitoring.js +2 -25
  48. package/dist/server/handlers/monitoring.js.map +1 -1
  49. package/dist/server/handlers/sync.d.ts +0 -1
  50. package/dist/server/handlers/sync.d.ts.map +1 -1
  51. package/dist/server/handlers/sync.js +4 -35
  52. package/dist/server/handlers/sync.js.map +1 -1
  53. package/dist/server/http.d.ts +0 -4
  54. package/dist/server/http.d.ts.map +1 -1
  55. package/dist/server/http.js +5 -22
  56. package/dist/server/http.js.map +1 -1
  57. package/dist/server/index.d.ts +1 -1
  58. package/dist/server/index.d.ts.map +1 -1
  59. package/dist/server/index.js +1 -1
  60. package/dist/server/index.js.map +1 -1
  61. package/dist/server/runtime.d.ts +0 -4
  62. package/dist/server/runtime.d.ts.map +1 -1
  63. package/dist/server/runtime.js +1 -1
  64. package/dist/server/runtime.js.map +1 -1
  65. package/dist/session/index.d.ts +14 -4
  66. package/dist/session/index.d.ts.map +1 -1
  67. package/dist/session/index.js +16 -9
  68. package/dist/session/index.js.map +1 -1
  69. package/dist/session/pi-coding-agent-runtime.d.ts +1 -1
  70. package/dist/session/pi-coding-agent-runtime.d.ts.map +1 -1
  71. package/dist/session/pi-coding-agent-runtime.js +1 -2
  72. package/dist/session/pi-coding-agent-runtime.js.map +1 -1
  73. package/package.json +9 -9
  74. package/dist/server/handlers/audit-log.d.ts +0 -12
  75. package/dist/server/handlers/audit-log.d.ts.map +0 -1
  76. package/dist/server/handlers/audit-log.js +0 -265
  77. package/dist/server/handlers/audit-log.js.map +0 -1
  78. package/dist/server/handlers/change-log-store.d.ts +0 -13
  79. package/dist/server/handlers/change-log-store.d.ts.map +0 -1
  80. package/dist/server/handlers/change-log-store.js +0 -167
  81. package/dist/server/handlers/change-log-store.js.map +0 -1
  82. package/dist/server/handlers/jsonl-log.d.ts +0 -56
  83. package/dist/server/handlers/jsonl-log.d.ts.map +0 -1
  84. package/dist/server/handlers/jsonl-log.js +0 -153
  85. package/dist/server/handlers/jsonl-log.js.map +0 -1
  86. package/dist/server/link-index.d.ts +0 -29
  87. package/dist/server/link-index.d.ts.map +0 -1
  88. package/dist/server/link-index.js +0 -137
  89. package/dist/server/link-index.js.map +0 -1
  90. package/dist/server/tree-cache.d.ts +0 -35
  91. package/dist/server/tree-cache.d.ts.map +0 -1
  92. package/dist/server/tree-cache.js +0 -0
  93. package/dist/server/tree-cache.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"change-log-store.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/change-log-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AA4BxC,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AA8BD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,GACrC,kBAAkB,EAAE,CAuBtB;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,CAcrF;AAED,sEAAsE;AACtE,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMlE"}
@@ -1,167 +0,0 @@
1
- import { existsSync, readFileSync, rmSync } from 'node:fs';
2
- import * as path from 'node:path';
3
- import { resolveExistingSafe } from '../../foundation/security/index.js';
4
- import { appendJsonlEvents, ensureJsonlStore, readJsonlEvents, writeJsonlMeta, } from './jsonl-log.js';
5
- /**
6
- * Read side of the content change log backed by the shared JSONL store.
7
- *
8
- * On-disk format is shared with `packages/web/lib/core/content-changes.ts`
9
- * (the writer): `.mindos/change-log.json` holds one event per line
10
- * (oldest-first) and `.mindos/change-log.meta.json` carries `lastSeenAt` plus
11
- * legacy import counters, so marking changes seen no longer rewrites the
12
- * entire event log.
13
- */
14
- const MAX_EVENTS = 500;
15
- const MAX_TEXT_CHARS = 12_000;
16
- const COMPACTION = {
17
- maxEvents: MAX_EVENTS,
18
- maxBytes: 12_000_000,
19
- targetBytes: 6_000_000,
20
- };
21
- const LEGACY_AGENT_DIFF_FILE = 'Agent-Diff.md';
22
- function nowIso() {
23
- return new Date().toISOString();
24
- }
25
- function resolveKnowledgePath(mindRoot, relativePath) {
26
- if (existsSync(mindRoot)) {
27
- return resolveExistingSafe(mindRoot, relativePath);
28
- }
29
- return path.join(mindRoot, relativePath);
30
- }
31
- function changeLogPath(mindRoot) {
32
- return resolveKnowledgePath(mindRoot, path.posix.join('.mindos', 'change-log.json'));
33
- }
34
- function changeLogMetaPath(mindRoot) {
35
- return resolveKnowledgePath(mindRoot, path.posix.join('.mindos', 'change-log.meta.json'));
36
- }
37
- function readChangeEvents(mindRoot) {
38
- importLegacyAgentDiffIfNeeded(mindRoot);
39
- const { events, meta } = readJsonlEvents(changeLogPath(mindRoot), changeLogMetaPath(mindRoot));
40
- return {
41
- events: events.slice(0, MAX_EVENTS),
42
- lastSeenAt: meta.lastSeenAt,
43
- };
44
- }
45
- export function listContentChangesFromLog(mindRoot, options = {}) {
46
- try {
47
- const { events } = readChangeEvents(mindRoot);
48
- const limit = Math.max(1, Math.min(options.limit ?? 50, 200));
49
- const pathFilter = options.path?.trim();
50
- const sourceFilter = options.source;
51
- const opFilter = options.op?.trim();
52
- const q = options.q?.trim().toLowerCase();
53
- return events.filter((event) => {
54
- if (pathFilter && event.path !== pathFilter && event.beforePath !== pathFilter && event.afterPath !== pathFilter) {
55
- return false;
56
- }
57
- if (sourceFilter && event.source !== sourceFilter)
58
- return false;
59
- if (opFilter && event.op !== opFilter)
60
- return false;
61
- if (q) {
62
- const haystack = `${event.path} ${event.beforePath ?? ''} ${event.afterPath ?? ''} ${event.summary} ${event.op} ${event.source}`.toLowerCase();
63
- if (!haystack.includes(q))
64
- return false;
65
- }
66
- return true;
67
- }).slice(0, limit);
68
- }
69
- catch {
70
- return [];
71
- }
72
- }
73
- export function getContentChangeSummaryFromLog(mindRoot) {
74
- try {
75
- const { events, lastSeenAt } = readChangeEvents(mindRoot);
76
- const lastSeenAtMs = lastSeenAt ? new Date(lastSeenAt).getTime() : 0;
77
- const unreadCount = events.filter((event) => new Date(event.ts).getTime() > lastSeenAtMs).length;
78
- return {
79
- unreadCount,
80
- totalCount: events.length,
81
- lastSeenAt,
82
- latest: events[0] ?? null,
83
- };
84
- }
85
- catch {
86
- return { unreadCount: 0, totalCount: 0, lastSeenAt: null, latest: null };
87
- }
88
- }
89
- /** Marks all changes seen by updating only the small meta sidecar. */
90
- export function markContentChangesSeenInLog(mindRoot) {
91
- importLegacyAgentDiffIfNeeded(mindRoot);
92
- const metaFile = changeLogMetaPath(mindRoot);
93
- const meta = ensureJsonlStore(changeLogPath(mindRoot), metaFile, { persistIfMissing: true });
94
- meta.lastSeenAt = nowIso();
95
- writeJsonlMeta(metaFile, meta);
96
- }
97
- function parseLegacyAgentDiffBlocks(content) {
98
- const blocks = [];
99
- const re = /```agent-diff\s*\n([\s\S]*?)```/g;
100
- let m;
101
- while ((m = re.exec(content)) !== null) {
102
- if (!m[1])
103
- continue;
104
- try {
105
- blocks.push(JSON.parse(m[1].trim()));
106
- }
107
- catch {
108
- // Skip malformed block, keep import best-effort.
109
- }
110
- }
111
- return blocks;
112
- }
113
- function normalizeText(value) {
114
- if (typeof value !== 'string')
115
- return { value: undefined, truncated: false };
116
- if (value.length <= MAX_TEXT_CHARS)
117
- return { value, truncated: false };
118
- return { value: value.slice(0, MAX_TEXT_CHARS), truncated: true };
119
- }
120
- function toValidIso(ts) {
121
- if (!ts)
122
- return nowIso();
123
- const ms = new Date(ts).getTime();
124
- return Number.isFinite(ms) ? new Date(ms).toISOString() : nowIso();
125
- }
126
- function importLegacyAgentDiffIfNeeded(mindRoot) {
127
- try {
128
- const legacyPath = resolveKnowledgePath(mindRoot, LEGACY_AGENT_DIFF_FILE);
129
- if (!existsSync(legacyPath))
130
- return;
131
- const blocks = parseLegacyAgentDiffBlocks(readFileSync(legacyPath, 'utf-8'));
132
- if (blocks.length === 0)
133
- return;
134
- const file = changeLogPath(mindRoot);
135
- const metaFile = changeLogMetaPath(mindRoot);
136
- const meta = ensureJsonlStore(file, metaFile, { persistIfMissing: true });
137
- const importedCount = typeof meta.legacy.agentDiffImportedCount === 'number'
138
- ? meta.legacy.agentDiffImportedCount
139
- : 0;
140
- if (blocks.length > importedCount) {
141
- const imported = blocks.slice(importedCount).map((entry, idx) => {
142
- const before = normalizeText(entry.before);
143
- const after = normalizeText(entry.after);
144
- const toolName = typeof entry.tool === 'string' && entry.tool.trim() ? entry.tool.trim() : 'unknown-tool';
145
- return {
146
- id: `legacy-${Date.now().toString(36)}-${idx.toString(36)}`,
147
- ts: toValidIso(entry.ts),
148
- op: 'legacy_agent_diff_import',
149
- path: typeof entry.path === 'string' && entry.path.trim() ? entry.path : LEGACY_AGENT_DIFF_FILE,
150
- source: 'agent',
151
- summary: `Imported legacy agent diff (${toolName})`,
152
- before: before.value,
153
- after: after.value,
154
- truncated: before.truncated || after.truncated || undefined,
155
- };
156
- });
157
- appendJsonlEvents(file, metaFile, imported, COMPACTION);
158
- meta.legacy = { ...meta.legacy, agentDiffImportedCount: blocks.length, lastImportedAt: nowIso() };
159
- writeJsonlMeta(metaFile, meta);
160
- }
161
- rmSync(legacyPath, { force: true });
162
- }
163
- catch {
164
- // Legacy import is best-effort and must never break the main flow.
165
- }
166
- }
167
- //# sourceMappingURL=change-log-store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"change-log-store.js","sourceRoot":"","sources":["../../../src/server/handlers/change-log-store.ts"],"names":[],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- /**
2
- * Generic append-only JSONL log store.
3
- *
4
- * Replaces the previous "read whole file -> unshift -> pretty-print rewrite"
5
- * pattern (O(N) per event, O(N^2) per batch) with O(1) line appends plus an
6
- * amortized size-capped compaction.
7
- *
8
- * On-disk layout:
9
- * - `<file>`: one JSON object per line, oldest-first (newest at EOF).
10
- * - `<metaFile>`: small sidecar `{ version: 2, lastSeenAt, legacy }`. Its
11
- * presence marks that `<file>` is in JSONL format, so appends never need to
12
- * re-read the log to detect the legacy pretty-printed format.
13
- */
14
- export interface JsonlLogMeta {
15
- version: 2;
16
- lastSeenAt: string | null;
17
- legacy: Record<string, number | string | null>;
18
- }
19
- export interface JsonlCompactionConfig {
20
- /** Newest entries kept when the log is compacted. */
21
- maxEvents: number;
22
- /** Compaction triggers once the file grows beyond this many bytes. */
23
- maxBytes: number;
24
- /** Compaction additionally drops oldest entries until at most this size. */
25
- targetBytes: number;
26
- }
27
- export declare function readJsonlMeta(metaFile: string): JsonlLogMeta | null;
28
- export declare function writeJsonlMeta(metaFile: string, meta: JsonlLogMeta): void;
29
- /**
30
- * Guarantees the log file is in JSONL format and returns its sidecar meta.
31
- *
32
- * On first contact with a legacy pretty-printed `{ events: [...] }` state file
33
- * it rewrites the log once as JSONL. Legacy arrays are newest-first; on disk we
34
- * store oldest-first so plain appends keep chronological order. `lastSeenAt`
35
- * and legacy import counters are carried into the meta sidecar.
36
- *
37
- * Pure reads on a store that needs no migration do not write anything unless
38
- * `persistIfMissing` is set (used by appenders so later appends skip the scan).
39
- */
40
- export declare function ensureJsonlStore(file: string, metaFile: string, options?: {
41
- persistIfMissing?: boolean;
42
- }): JsonlLogMeta;
43
- /** Appends events (oldest-first input order) as a single write, then compacts if oversized. */
44
- export declare function appendJsonlEvents(file: string, metaFile: string, events: unknown[], config: JsonlCompactionConfig): void;
45
- /** Returns parsed events newest-first; corrupted lines are skipped. */
46
- export declare function readJsonlEvents(file: string, metaFile: string): {
47
- events: unknown[];
48
- meta: JsonlLogMeta;
49
- };
50
- /**
51
- * Rewrites the log keeping only the newest `maxEvents` entries (and at most
52
- * `targetBytes` of them) once it grows past `maxBytes`. Amortized: appends stay
53
- * O(1) and the occasional compaction is one bounded rewrite.
54
- */
55
- export declare function compactJsonlIfNeeded(file: string, config: JsonlCompactionConfig): void;
56
- //# sourceMappingURL=jsonl-log.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsonl-log.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/jsonl-log.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,qBAAqB;IACpC,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;CACrB;AAyCD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAenE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAEzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,YAAY,CAuBd;AAED,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EAAE,EACjB,MAAM,EAAE,qBAAqB,GAC5B,IAAI,CAMN;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf;IAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAgB3C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAmBtF"}
@@ -1,153 +0,0 @@
1
- import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
2
- import { dirname } from 'node:path';
3
- function defaultMeta() {
4
- return { version: 2, lastSeenAt: null, legacy: {} };
5
- }
6
- function parseLegacyStateFile(raw) {
7
- try {
8
- const parsed = JSON.parse(raw);
9
- if (parsed
10
- && typeof parsed === 'object'
11
- && !Array.isArray(parsed)
12
- && Array.isArray(parsed.events)) {
13
- return parsed;
14
- }
15
- }
16
- catch {
17
- // Not a single JSON document: already JSONL (or corrupted lines we skip on read).
18
- }
19
- return null;
20
- }
21
- function atomicWrite(file, content) {
22
- mkdirSync(dirname(file), { recursive: true });
23
- const tmp = `${file}.${process.pid}.${Date.now()}.tmp`;
24
- try {
25
- writeFileSync(tmp, content, 'utf-8');
26
- renameSync(tmp, file);
27
- }
28
- catch (error) {
29
- try {
30
- unlinkSync(tmp);
31
- }
32
- catch { /* ignore cleanup errors */ }
33
- throw error;
34
- }
35
- }
36
- export function readJsonlMeta(metaFile) {
37
- try {
38
- if (!existsSync(metaFile))
39
- return null;
40
- const parsed = JSON.parse(readFileSync(metaFile, 'utf-8'));
41
- if (!parsed || typeof parsed !== 'object')
42
- return null;
43
- return {
44
- version: 2,
45
- lastSeenAt: typeof parsed.lastSeenAt === 'string' ? parsed.lastSeenAt : null,
46
- legacy: parsed.legacy && typeof parsed.legacy === 'object' && !Array.isArray(parsed.legacy)
47
- ? { ...parsed.legacy }
48
- : {},
49
- };
50
- }
51
- catch {
52
- return null;
53
- }
54
- }
55
- export function writeJsonlMeta(metaFile, meta) {
56
- atomicWrite(metaFile, `${JSON.stringify(meta, null, 2)}\n`);
57
- }
58
- /**
59
- * Guarantees the log file is in JSONL format and returns its sidecar meta.
60
- *
61
- * On first contact with a legacy pretty-printed `{ events: [...] }` state file
62
- * it rewrites the log once as JSONL. Legacy arrays are newest-first; on disk we
63
- * store oldest-first so plain appends keep chronological order. `lastSeenAt`
64
- * and legacy import counters are carried into the meta sidecar.
65
- *
66
- * Pure reads on a store that needs no migration do not write anything unless
67
- * `persistIfMissing` is set (used by appenders so later appends skip the scan).
68
- */
69
- export function ensureJsonlStore(file, metaFile, options = {}) {
70
- const existing = readJsonlMeta(metaFile);
71
- if (existing)
72
- return existing;
73
- const meta = defaultMeta();
74
- let migrated = false;
75
- if (existsSync(file)) {
76
- const legacyState = parseLegacyStateFile(readFileSync(file, 'utf-8'));
77
- if (legacyState) {
78
- const lines = [...legacyState.events]
79
- .reverse()
80
- .filter((event) => event !== null && typeof event === 'object')
81
- .map((event) => JSON.stringify(event));
82
- if (typeof legacyState.lastSeenAt === 'string')
83
- meta.lastSeenAt = legacyState.lastSeenAt;
84
- if (legacyState.legacy && typeof legacyState.legacy === 'object' && !Array.isArray(legacyState.legacy)) {
85
- meta.legacy = { ...legacyState.legacy };
86
- }
87
- atomicWrite(file, lines.length > 0 ? `${lines.join('\n')}\n` : '');
88
- migrated = true;
89
- }
90
- }
91
- if (migrated || options.persistIfMissing)
92
- writeJsonlMeta(metaFile, meta);
93
- return meta;
94
- }
95
- /** Appends events (oldest-first input order) as a single write, then compacts if oversized. */
96
- export function appendJsonlEvents(file, metaFile, events, config) {
97
- ensureJsonlStore(file, metaFile, { persistIfMissing: true });
98
- if (events.length === 0)
99
- return;
100
- mkdirSync(dirname(file), { recursive: true });
101
- appendFileSync(file, events.map((event) => `${JSON.stringify(event)}\n`).join(''), 'utf-8');
102
- compactJsonlIfNeeded(file, config);
103
- }
104
- /** Returns parsed events newest-first; corrupted lines are skipped. */
105
- export function readJsonlEvents(file, metaFile) {
106
- const meta = ensureJsonlStore(file, metaFile);
107
- if (!existsSync(file))
108
- return { events: [], meta };
109
- const events = [];
110
- for (const line of readFileSync(file, 'utf-8').split('\n')) {
111
- const trimmed = line.trim();
112
- if (!trimmed)
113
- continue;
114
- try {
115
- const parsed = JSON.parse(trimmed);
116
- if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed))
117
- events.push(parsed);
118
- }
119
- catch {
120
- // Skip corrupted line: a partial append must not poison the whole log.
121
- }
122
- }
123
- events.reverse();
124
- return { events, meta };
125
- }
126
- /**
127
- * Rewrites the log keeping only the newest `maxEvents` entries (and at most
128
- * `targetBytes` of them) once it grows past `maxBytes`. Amortized: appends stay
129
- * O(1) and the occasional compaction is one bounded rewrite.
130
- */
131
- export function compactJsonlIfNeeded(file, config) {
132
- let size;
133
- try {
134
- size = statSync(file).size;
135
- }
136
- catch {
137
- return;
138
- }
139
- if (size <= config.maxBytes)
140
- return;
141
- const lines = readFileSync(file, 'utf-8').split('\n').filter((line) => line.trim().length > 0);
142
- let kept = lines.slice(-config.maxEvents);
143
- let bytes = kept.reduce((sum, line) => sum + Buffer.byteLength(line, 'utf-8') + 1, 0);
144
- let drop = 0;
145
- while (drop < kept.length - 1 && bytes > config.targetBytes) {
146
- bytes -= Buffer.byteLength(kept[drop] ?? '', 'utf-8') + 1;
147
- drop += 1;
148
- }
149
- if (drop > 0)
150
- kept = kept.slice(drop);
151
- atomicWrite(file, kept.length > 0 ? `${kept.join('\n')}\n` : '');
152
- }
153
- //# sourceMappingURL=jsonl-log.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsonl-log.js","sourceRoot":"","sources":["../../../src/server/handlers/jsonl-log.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- /**
2
- * Cached link scan for the standalone graph/backlinks handlers. Scanning reads
3
- * every markdown file in the library; before this cache the Backlinks panel
4
- * triggered a full re-read on every file open. The snapshot is keyed by the
5
- * services' `getTreeVersion` function and rebuilt lazily whenever the reported
6
- * tree version changes (the tree cache bumps it on writes / watcher events).
7
- */
8
- export type LinkHit = {
9
- source: string;
10
- target: string;
11
- snippet: string;
12
- };
13
- export type LinkScanServices = {
14
- mindRoot?: string;
15
- collectAllFiles?: () => string[];
16
- readTextFile?: (path: string) => string;
17
- /** Optional cheap change signal; when present, link scans are cached per version. */
18
- getTreeVersion?: () => number;
19
- };
20
- export type LinkSnapshot = {
21
- /** Normalized markdown file paths, sorted. */
22
- files: string[];
23
- /** Every resolved link occurrence with its source line snippet. */
24
- hits: LinkHit[];
25
- };
26
- export declare function getLinkSnapshot(services: LinkScanServices): LinkSnapshot;
27
- export declare function buildLinkSnapshot(services: LinkScanServices): LinkSnapshot;
28
- export declare function normalizeTargetPath(value: string | undefined): string | undefined;
29
- //# sourceMappingURL=link-index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-index.d.ts","sourceRoot":"","sources":["../../src/server/link-index.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB,CAAC;AAUF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,gBAAgB,GAAG,YAAY,CAiBxE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,YAAY,CAkB1E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAgBjF"}
@@ -1,137 +0,0 @@
1
- import { extname, posix } from 'node:path';
2
- import { collectAllFilesFromMindRoot, readTextFileFromMindRoot } from './runtime.js';
3
- // Keyed by the getTreeVersion function: stable for a long-lived services object
4
- // (standalone server), naturally absent for ad-hoc services (tests, callers
5
- // that build a fresh services literal per request stay uncached unless they
6
- // pass a stable version function).
7
- const snapshotCache = new WeakMap();
8
- export function getLinkSnapshot(services) {
9
- const versionFn = services.getTreeVersion;
10
- if (!versionFn)
11
- return buildLinkSnapshot(services);
12
- let version;
13
- try {
14
- version = versionFn();
15
- }
16
- catch {
17
- return buildLinkSnapshot(services);
18
- }
19
- const cached = snapshotCache.get(versionFn);
20
- if (cached && cached.version === version)
21
- return cached;
22
- const snapshot = { version, ...buildLinkSnapshot(services) };
23
- snapshotCache.set(versionFn, snapshot);
24
- return snapshot;
25
- }
26
- export function buildLinkSnapshot(services) {
27
- const files = collectMarkdownFiles(services);
28
- const fileSet = new Set(files);
29
- const basenameMap = buildBasenameMap(files);
30
- const hits = [];
31
- for (const source of files) {
32
- let content = '';
33
- try {
34
- content = readText(services, source);
35
- }
36
- catch {
37
- // File deleted (or unreadable) between listing and reading — skip it.
38
- continue;
39
- }
40
- hits.push(...extractLinkHits(content, source, fileSet, basenameMap));
41
- }
42
- return { files, hits };
43
- }
44
- export function normalizeTargetPath(value) {
45
- if (!value)
46
- return undefined;
47
- let normalized = value.trim();
48
- if (!normalized)
49
- return undefined;
50
- try {
51
- normalized = decodeURIComponent(normalized);
52
- }
53
- catch {
54
- // Keep the original value if it is not a valid URI component.
55
- }
56
- normalized = normalized.split('#')[0]?.trim() ?? '';
57
- normalized = normalized.replace(/\\/g, '/').replace(/^\/+/, '');
58
- normalized = posix.normalize(normalized);
59
- if (!normalized || normalized === '.' || normalized.startsWith('../') || normalized === '..')
60
- return undefined;
61
- return normalized;
62
- }
63
- function collectMarkdownFiles(services) {
64
- const files = services.collectAllFiles
65
- ? services.collectAllFiles()
66
- : services.mindRoot
67
- ? collectAllFilesFromMindRoot(services.mindRoot)
68
- : [];
69
- return files
70
- .filter((filePath) => extname(filePath).toLowerCase() === '.md')
71
- .map(normalizeTargetPath)
72
- .filter((filePath) => !!filePath)
73
- .sort((a, b) => a.localeCompare(b));
74
- }
75
- function readText(services, filePath) {
76
- if (services.readTextFile)
77
- return services.readTextFile(filePath);
78
- if (services.mindRoot)
79
- return readTextFileFromMindRoot(services.mindRoot, filePath);
80
- throw new Error('readTextFile service required');
81
- }
82
- function buildBasenameMap(files) {
83
- const map = new Map();
84
- for (const filePath of files) {
85
- const key = posix.basename(filePath).toLowerCase();
86
- const values = map.get(key) ?? [];
87
- values.push(filePath);
88
- map.set(key, values);
89
- }
90
- return map;
91
- }
92
- function extractLinkHits(content, source, fileSet, basenameMap) {
93
- const hits = [];
94
- const sourceDir = posix.dirname(source);
95
- const lines = content.split(/\r?\n/);
96
- for (const line of lines) {
97
- const snippet = line.trim();
98
- if (!snippet)
99
- continue;
100
- const wikiRe = /\[\[([^\]|#]+)(?:#[^\]|]+)?(?:\|[^\]]+)?\]\]/g;
101
- let match;
102
- while ((match = wikiRe.exec(line)) !== null) {
103
- const target = resolveLinkTarget(match[1], sourceDir, fileSet, basenameMap, false);
104
- if (target)
105
- hits.push({ source, target, snippet });
106
- }
107
- const markdownRe = /\[[^\]]+\]\(([^)#]+)(?:#[^)]+)?\)/g;
108
- while ((match = markdownRe.exec(line)) !== null) {
109
- const target = resolveLinkTarget(match[1], sourceDir, fileSet, basenameMap, true);
110
- if (target)
111
- hits.push({ source, target, snippet });
112
- }
113
- }
114
- return hits;
115
- }
116
- function resolveLinkTarget(rawTarget, sourceDir, fileSet, basenameMap, relativeToSource) {
117
- const target = normalizeTargetPath(rawTarget);
118
- if (!target || /^(https?:|mailto:|tel:)/i.test(target))
119
- return undefined;
120
- const candidates = new Set();
121
- candidates.add(target);
122
- candidates.add(target.endsWith('.md') ? target : `${target}.md`);
123
- if (relativeToSource) {
124
- candidates.add(posix.normalize(posix.join(sourceDir, target)));
125
- candidates.add(posix.normalize(posix.join(sourceDir, target.endsWith('.md') ? target : `${target}.md`)));
126
- }
127
- for (const candidate of candidates) {
128
- if (fileSet.has(candidate))
129
- return candidate;
130
- }
131
- const basename = posix.basename(target.endsWith('.md') ? target : `${target}.md`).toLowerCase();
132
- const basenameMatches = basenameMap.get(basename);
133
- if (basenameMatches?.length === 1)
134
- return basenameMatches[0];
135
- return undefined;
136
- }
137
- //# sourceMappingURL=link-index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-index.js","sourceRoot":"","sources":["../../src/server/link-index.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Cached view over the mind root file tree for the standalone (CLI/Desktop)
3
- * server. The frontend polls `/api/tree-version` every ~5s; without this cache
4
- * every poll walked the entire library with a recursive readdir + per-file
5
- * stat. The cache rebuilds only when:
6
- * - a recursive fs.watch event fires (darwin/win32, Linux on Node >= 20), or
7
- * - `invalidate()` is called (internal writes via the HTTP server), or
8
- * - a safety TTL expires (short fallback TTL when no watcher is available,
9
- * long TTL as a missed-event safety net when the watcher is active).
10
- */
11
- export type MindRootTreeCacheOptions = {
12
- /** Refresh interval when no recursive watcher could be installed. Default 2s. */
13
- fallbackTtlMs?: number;
14
- /** Safety refresh interval while the watcher is active. Default 30s. */
15
- watchedTtlMs?: number;
16
- /** Set false to disable the fs watcher (tests, constrained environments). Default true. */
17
- watch?: boolean;
18
- /** Clock injection for deterministic TTL tests. */
19
- now?: () => number;
20
- };
21
- export type MindRootTreeCache = {
22
- getTreeVersion(): number;
23
- collectAllFiles(): string[];
24
- getRecentlyModified(limit?: number): Array<{
25
- path: string;
26
- mtime: number;
27
- }>;
28
- /** Mark the cache dirty; the next read rebuilds. Cheap and synchronous. */
29
- invalidate(): void;
30
- isWatching(): boolean;
31
- /** Stop the watcher. The cache keeps working through the fallback TTL. */
32
- dispose(): void;
33
- };
34
- export declare function createMindRootTreeCache(mindRoot: string, options?: MindRootTreeCacheOptions): MindRootTreeCache;
35
- //# sourceMappingURL=tree-cache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree-cache.d.ts","sourceRoot":"","sources":["../../src/server/tree-cache.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,MAAM,MAAM,wBAAwB,GAAG;IACrC,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,IAAI,MAAM,CAAC;IACzB,eAAe,IAAI,MAAM,EAAE,CAAC;IAC5B,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,2EAA2E;IAC3E,UAAU,IAAI,IAAI,CAAC;IACnB,UAAU,IAAI,OAAO,CAAC;IACtB,0EAA0E;IAC1E,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAaF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CAsGnB"}
Binary file
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree-cache.js","sourceRoot":"","sources":["../../src/server/tree-cache.ts"],"names":[],"mappings":"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"}