actoviq-agent-sdk 0.4.5 → 0.4.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.
- package/dist/src/gui/actoviqGui.d.ts +29 -0
- package/dist/src/gui/actoviqGui.d.ts.map +1 -0
- package/dist/src/gui/actoviqGui.js +5319 -0
- package/dist/src/gui/actoviqGui.js.map +1 -0
- package/dist/src/gui/electronMain.d.ts +3 -0
- package/dist/src/gui/electronMain.d.ts.map +1 -0
- package/dist/src/gui/electronMain.js +176 -0
- package/dist/src/gui/electronMain.js.map +1 -0
- package/dist/src/gui/guiMarkdown.d.ts +3 -0
- package/dist/src/gui/guiMarkdown.d.ts.map +1 -0
- package/dist/src/gui/guiMarkdown.js +188 -0
- package/dist/src/gui/guiMarkdown.js.map +1 -0
- package/dist/src/memory/projectContext.d.ts +17 -14
- package/dist/src/memory/projectContext.d.ts.map +1 -1
- package/dist/src/memory/projectContext.js +99 -31
- package/dist/src/memory/projectContext.js.map +1 -1
- package/dist/src/memory/sessionHistory.d.ts +21 -0
- package/dist/src/memory/sessionHistory.d.ts.map +1 -0
- package/dist/src/memory/sessionHistory.js +83 -0
- package/dist/src/memory/sessionHistory.js.map +1 -0
- package/dist/src/parity/bridgeConfigs.d.ts +29 -0
- package/dist/src/parity/bridgeConfigs.d.ts.map +1 -1
- package/dist/src/parity/bridgeConfigs.js +25 -1
- package/dist/src/parity/bridgeConfigs.js.map +1 -1
- package/dist/src/tui/actoviqTui.js +9 -3
- package/dist/src/tui/actoviqTui.js.map +1 -1
- package/package.json +34 -1
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// Minimal, dependency-free, XSS-safe markdown renderer for the GUI transcript.
|
|
2
|
+
// `renderMarkdown` is intentionally self-contained (it inlines its own escaper)
|
|
3
|
+
// so its source can be shipped to the browser via `renderMarkdown.toString()`
|
|
4
|
+
// without depending on any other module-level symbol surviving the build.
|
|
5
|
+
//
|
|
6
|
+
// Block-aware: fenced code, headings, horizontal rules, blockquotes, tables,
|
|
7
|
+
// ordered/unordered lists (incl. GFM task lists), and paragraphs. Inline:
|
|
8
|
+
// code, bold/italic (both **/__ and */_), strikethrough, http(s) links, and
|
|
9
|
+
// bare-URL autolinking.
|
|
10
|
+
export function escapeHtml(value) {
|
|
11
|
+
return String(value).replace(/[&<>"']/g, (char) => {
|
|
12
|
+
switch (char) {
|
|
13
|
+
case '&': return '&';
|
|
14
|
+
case '<': return '<';
|
|
15
|
+
case '>': return '>';
|
|
16
|
+
case '"': return '"';
|
|
17
|
+
default: return ''';
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function renderMarkdown(source) {
|
|
22
|
+
const nul = String.fromCharCode(0);
|
|
23
|
+
const esc = (value) => String(value == null ? '' : value).replace(/[&<>"']/g, (char) => {
|
|
24
|
+
switch (char) {
|
|
25
|
+
case '&': return '&';
|
|
26
|
+
case '<': return '<';
|
|
27
|
+
case '>': return '>';
|
|
28
|
+
case '"': return '"';
|
|
29
|
+
default: return ''';
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const codeBlocks = [];
|
|
33
|
+
let text = String(source == null ? '' : source).replace(/\r\n/g, '\n');
|
|
34
|
+
// Fenced code blocks -> NUL-delimited placeholders (escaped body + copy button
|
|
35
|
+
// + optional language label). NUL never appears in model text, so the
|
|
36
|
+
// placeholder can't collide with content.
|
|
37
|
+
text = text.replace(/```[ \t]*([\w-]*)\n?([\s\S]*?)```/g, (_match, lang, code) => {
|
|
38
|
+
const index = codeBlocks.length;
|
|
39
|
+
const langLabel = lang ? '<span class="code-lang">' + esc(lang) + '</span>' : '';
|
|
40
|
+
codeBlocks.push('<pre class="code-block">' + langLabel + '<button type="button" class="copy-btn">Copy</button><code>'
|
|
41
|
+
+ esc(String(code).replace(/\n$/, ''))
|
|
42
|
+
+ '</code></pre>');
|
|
43
|
+
return nul + index + nul;
|
|
44
|
+
});
|
|
45
|
+
// Inline formatting (operates on already-escaped text). `flow` additionally
|
|
46
|
+
// turns single newlines into <br> for soft line breaks within a block.
|
|
47
|
+
const inline = (raw) => {
|
|
48
|
+
let t = esc(raw);
|
|
49
|
+
// Inline code (content is already escaped above).
|
|
50
|
+
t = t.replace(/`([^`\n]+)`/g, (_m, code) => '<code class="inline-code">' + code + '</code>');
|
|
51
|
+
// Bold, then italic (both **/__ and */_).
|
|
52
|
+
t = t.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
|
|
53
|
+
t = t.replace(/__([^_]+)__/g, '<strong>$1</strong>');
|
|
54
|
+
t = t.replace(/(^|[^*])\*([^*\n]+)\*/g, '$1<em>$2</em>');
|
|
55
|
+
t = t.replace(/(^|[^_])_([^_\n]+)_/g, '$1<em>$2</em>');
|
|
56
|
+
// Strikethrough.
|
|
57
|
+
t = t.replace(/~~([^~]+)~~/g, '<del>$1</del>');
|
|
58
|
+
// Markdown links — http/https only (rejects javascript: etc.).
|
|
59
|
+
t = t.replace(/\[([^\]]+)\]\((https?:\/\/[^\s)]+)\)/g, (_m, label, href) => {
|
|
60
|
+
const safeHref = String(href).replace(/&/g, '&').replace(/"/g, '%22');
|
|
61
|
+
return '<a href="' + safeHref + '" target="_blank" rel="noopener noreferrer">' + label + '</a>';
|
|
62
|
+
});
|
|
63
|
+
// Autolink bare http(s) URLs, but never inside an existing <a>/<code> span.
|
|
64
|
+
const guarded = [];
|
|
65
|
+
t = t.replace(/<a [^>]*>[\s\S]*?<\/a>/g, (m) => { guarded.push(m); return nul + (guarded.length - 1) + nul; });
|
|
66
|
+
t = t.replace(/<code[^>]*>[\s\S]*?<\/code>/g, (m) => { guarded.push(m); return nul + (guarded.length - 1) + nul; });
|
|
67
|
+
t = t.replace(/https?:\/\/[^\s<)\]]+/g, (url) => {
|
|
68
|
+
const clean = url.replace(/[.,;:!?]+$/, '');
|
|
69
|
+
const safe = clean.replace(/&/g, '&').replace(/"/g, '%22');
|
|
70
|
+
return '<a href="' + safe + '" target="_blank" rel="noopener noreferrer">' + clean + '</a>';
|
|
71
|
+
});
|
|
72
|
+
t = t.replace(new RegExp(nul + '(\\d+)' + nul, 'g'), (_m, i) => guarded[Number(i)] ?? '');
|
|
73
|
+
return t;
|
|
74
|
+
};
|
|
75
|
+
const flow = (raw) => inline(raw).replace(/\n/g, '<br>');
|
|
76
|
+
const isBlank = (l) => /^\s*$/.test(l);
|
|
77
|
+
const isHr = (l) => /^\s*([-*_])\1{2,}\s*$/.test(l);
|
|
78
|
+
const isHeading = (l) => /^(#{1,6})\s+\S/.test(l);
|
|
79
|
+
const isUl = (l) => /^\s*[-*+]\s+/.test(l);
|
|
80
|
+
const isOl = (l) => /^\s*\d+\.\s+/.test(l);
|
|
81
|
+
const isQuote = (l) => /^\s*>\s?/.test(l);
|
|
82
|
+
const isTableRow = (l) => /^\s*\|.*\|\s*$/.test(l);
|
|
83
|
+
const isSeparator = (l) => {
|
|
84
|
+
const stripped = l.replace(/[\s|:]/g, '');
|
|
85
|
+
return stripped.length > 0 && /^[ -]+$/.test(stripped) && stripped.includes('-');
|
|
86
|
+
};
|
|
87
|
+
// A fenced-code placeholder line is exactly <NUL><digits><NUL>. Checking by
|
|
88
|
+
// char code avoids embedding a literal NUL byte in the source.
|
|
89
|
+
const isPlaceholder = (l) => l.length > 2 && l.charCodeAt(0) === 0 && l.charCodeAt(l.length - 1) === 0;
|
|
90
|
+
const isBlockStart = (l) => isHr(l) || isHeading(l) || isUl(l) || isOl(l) || isQuote(l) || isTableRow(l) || isPlaceholder(l);
|
|
91
|
+
const lines = text.split('\n');
|
|
92
|
+
const blocks = [];
|
|
93
|
+
let i = 0;
|
|
94
|
+
while (i < lines.length) {
|
|
95
|
+
const line = lines[i] ?? '';
|
|
96
|
+
if (isBlank(line)) {
|
|
97
|
+
i += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
// Standalone fenced code block — emit raw (restored at the end).
|
|
101
|
+
if (isPlaceholder(line)) {
|
|
102
|
+
blocks.push(line);
|
|
103
|
+
i += 1;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (isHr(line)) {
|
|
107
|
+
blocks.push('<hr class="md-hr">');
|
|
108
|
+
i += 1;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (isHeading(line)) {
|
|
112
|
+
const m = line.match(/^(#{1,6})\s+(.*)$/);
|
|
113
|
+
const level = m[1].length;
|
|
114
|
+
blocks.push('<h' + level + ' class="md-h">' + flow(m[2] ?? '') + '</h' + level + '>');
|
|
115
|
+
i += 1;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
// GFM table: a header row whose next line is a separator.
|
|
119
|
+
if (isTableRow(line) && i + 1 < lines.length && isSeparator(lines[i + 1] ?? '')) {
|
|
120
|
+
const rows = [];
|
|
121
|
+
let j = i;
|
|
122
|
+
while (j < lines.length && isTableRow(lines[j] ?? '')) {
|
|
123
|
+
rows.push(lines[j] ?? '');
|
|
124
|
+
j += 1;
|
|
125
|
+
}
|
|
126
|
+
const parseRow = (r) => r.replace(/^\s*\|/, '').replace(/\|\s*$/, '').split('|').map((c) => c.trim());
|
|
127
|
+
const header = parseRow(rows[0] ?? '');
|
|
128
|
+
const body = rows.slice(2).map(parseRow);
|
|
129
|
+
let html = '<table class="md-table"><thead><tr>'
|
|
130
|
+
+ header.map((c) => '<th>' + flow(c) + '</th>').join('') + '</tr></thead><tbody>';
|
|
131
|
+
for (const row of body)
|
|
132
|
+
html += '<tr>' + row.map((c) => '<td>' + flow(c) + '</td>').join('') + '</tr>';
|
|
133
|
+
html += '</tbody></table>';
|
|
134
|
+
blocks.push(html);
|
|
135
|
+
i = j;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (isQuote(line)) {
|
|
139
|
+
const quoteLines = [];
|
|
140
|
+
while (i < lines.length && isQuote(lines[i] ?? '')) {
|
|
141
|
+
quoteLines.push((lines[i] ?? '').replace(/^\s*>\s?/, ''));
|
|
142
|
+
i += 1;
|
|
143
|
+
}
|
|
144
|
+
blocks.push('<blockquote class="md-quote">' + flow(quoteLines.join('\n')) + '</blockquote>');
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (isUl(line)) {
|
|
148
|
+
const items = [];
|
|
149
|
+
while (i < lines.length && isUl(lines[i] ?? '')) {
|
|
150
|
+
items.push((lines[i] ?? '').replace(/^\s*[-*+]\s+/, ''));
|
|
151
|
+
i += 1;
|
|
152
|
+
}
|
|
153
|
+
const lis = items.map((it) => {
|
|
154
|
+
const tm = it.match(/^\[([ xX])\]\s+(.*)$/);
|
|
155
|
+
if (tm) {
|
|
156
|
+
const checked = tm[1] === 'x' || tm[1] === 'X';
|
|
157
|
+
return '<li class="md-task' + (checked ? ' md-task-done' : '') + '">'
|
|
158
|
+
+ '<input type="checkbox" disabled' + (checked ? ' checked' : '') + '> '
|
|
159
|
+
+ flow(tm[2] ?? '') + '</li>';
|
|
160
|
+
}
|
|
161
|
+
return '<li>' + flow(it) + '</li>';
|
|
162
|
+
});
|
|
163
|
+
blocks.push('<ul class="md-ul">' + lis.join('') + '</ul>');
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (isOl(line)) {
|
|
167
|
+
const items = [];
|
|
168
|
+
while (i < lines.length && isOl(lines[i] ?? '')) {
|
|
169
|
+
items.push((lines[i] ?? '').replace(/^\s*\d+\.\s+/, ''));
|
|
170
|
+
i += 1;
|
|
171
|
+
}
|
|
172
|
+
blocks.push('<ol class="md-ol">' + items.map((it) => '<li>' + flow(it) + '</li>').join('') + '</ol>');
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// Paragraph: gather consecutive non-blank, non-block-starting lines.
|
|
176
|
+
const para = [];
|
|
177
|
+
while (i < lines.length && !isBlank(lines[i] ?? '') && !isBlockStart(lines[i] ?? '')) {
|
|
178
|
+
para.push(lines[i] ?? '');
|
|
179
|
+
i += 1;
|
|
180
|
+
}
|
|
181
|
+
blocks.push('<p class="md-p">' + flow(para.join('\n')) + '</p>');
|
|
182
|
+
}
|
|
183
|
+
let html = blocks.join('');
|
|
184
|
+
// Restore fenced code blocks.
|
|
185
|
+
html = html.replace(new RegExp(nul + '(\\d+)' + nul, 'g'), (_m, index) => codeBlocks[Number(index)] ?? '');
|
|
186
|
+
return html;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=guiMarkdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guiMarkdown.js","sourceRoot":"","sources":["../../../src/gui/guiMarkdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project context loader
|
|
2
|
+
* Project context loader (CLAUDE.md / AGENTS.md hierarchy).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 2. Project memory: `CLAUDE.md` and `.claude/CLAUDE.md` at the working dir
|
|
7
|
-
* and each ancestor up to (but not including) the home directory.
|
|
4
|
+
* Aligned with Claude Code's discovery rules (`src/utils/claudemd.ts`) and
|
|
5
|
+
* Codex's AGENTS.md fallback, kept lightweight:
|
|
8
6
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* 1. Managed (system) — not applicable for the SDK; skipped.
|
|
8
|
+
* 2. User memory: `~/.claude/CLAUDE.md`
|
|
9
|
+
* 3. Project memory: `CLAUDE.md`, `.claude/CLAUDE.md`,
|
|
10
|
+
* `.claude/rules/*.md`, `AGENTS.md` at the
|
|
11
|
+
* working dir and each ancestor up to (but not
|
|
12
|
+
* including) the home directory.
|
|
13
|
+
* 4. Local (private): `CLAUDE.local.md` in the same ancestor walk.
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
15
|
+
* Each file may pull in other files via `@<path>` include lines (relative to
|
|
16
|
+
* the file's own directory; `@~/path` resolves from the home directory).
|
|
17
|
+
* Include depth is capped at 5 to prevent cycles. The combined context is
|
|
18
|
+
* size-capped so a runaway instruction file can't blow the prompt.
|
|
16
19
|
*/
|
|
17
20
|
export interface LoadedProjectContext {
|
|
18
21
|
/** The assembled, size-capped context text (empty if nothing was found). */
|
|
@@ -21,9 +24,9 @@ export interface LoadedProjectContext {
|
|
|
21
24
|
sources: string[];
|
|
22
25
|
}
|
|
23
26
|
/**
|
|
24
|
-
* Load the CLAUDE.md hierarchy for a working directory.
|
|
25
|
-
* `text` when
|
|
26
|
-
* dirs), so callers can no-op cheaply.
|
|
27
|
+
* Load the CLAUDE.md / AGENTS.md hierarchy for a working directory.
|
|
28
|
+
* Returns an empty `text` when nothing is found (the common case for
|
|
29
|
+
* arbitrary dirs), so callers can no-op cheaply.
|
|
27
30
|
*/
|
|
28
31
|
export declare function loadProjectContext(workDir: string): LoadedProjectContext;
|
|
29
32
|
//# sourceMappingURL=projectContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectContext.d.ts","sourceRoot":"","sources":["../../../src/memory/projectContext.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"projectContext.d.ts","sourceRoot":"","sources":["../../../src/memory/projectContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAmEH,MAAM,WAAW,oBAAoB;IACnC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAyExE"}
|
|
@@ -1,38 +1,62 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project context loader
|
|
2
|
+
* Project context loader (CLAUDE.md / AGENTS.md hierarchy).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 2. Project memory: `CLAUDE.md` and `.claude/CLAUDE.md` at the working dir
|
|
7
|
-
* and each ancestor up to (but not including) the home directory.
|
|
4
|
+
* Aligned with Claude Code's discovery rules (`src/utils/claudemd.ts`) and
|
|
5
|
+
* Codex's AGENTS.md fallback, kept lightweight:
|
|
8
6
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* 1. Managed (system) — not applicable for the SDK; skipped.
|
|
8
|
+
* 2. User memory: `~/.claude/CLAUDE.md`
|
|
9
|
+
* 3. Project memory: `CLAUDE.md`, `.claude/CLAUDE.md`,
|
|
10
|
+
* `.claude/rules/*.md`, `AGENTS.md` at the
|
|
11
|
+
* working dir and each ancestor up to (but not
|
|
12
|
+
* including) the home directory.
|
|
13
|
+
* 4. Local (private): `CLAUDE.local.md` in the same ancestor walk.
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
15
|
+
* Each file may pull in other files via `@<path>` include lines (relative to
|
|
16
|
+
* the file's own directory; `@~/path` resolves from the home directory).
|
|
17
|
+
* Include depth is capped at 5 to prevent cycles. The combined context is
|
|
18
|
+
* size-capped so a runaway instruction file can't blow the prompt.
|
|
16
19
|
*/
|
|
17
|
-
import { readFileSync, existsSync } from 'node:fs';
|
|
20
|
+
import { readFileSync, existsSync, readdirSync } from 'node:fs';
|
|
18
21
|
import os from 'node:os';
|
|
19
22
|
import path from 'node:path';
|
|
20
23
|
const MAX_TOTAL_CHARS = 50_000;
|
|
21
|
-
const
|
|
22
|
-
|
|
24
|
+
const MAX_INCLUDE_DEPTH = 5;
|
|
25
|
+
// Matches: @relative/path, @./path, @~/path, @/absolute/path
|
|
26
|
+
const INCLUDE_RE = /^\s*@(?:\.\/|~\/|\/)?([^\s]+)\s*$/;
|
|
27
|
+
/**
|
|
28
|
+
* Resolve an `@path` include reference. `@~/x` maps to `~/x`;
|
|
29
|
+
* `@/x` is absolute; otherwise relative to `baseDir`.
|
|
30
|
+
*/
|
|
31
|
+
function resolveInclude(raw, baseDir) {
|
|
32
|
+
const m = raw.trim().match(INCLUDE_RE);
|
|
33
|
+
if (!m)
|
|
34
|
+
return null;
|
|
35
|
+
let target = m[1];
|
|
36
|
+
if (raw.trim().startsWith('@~/')) {
|
|
37
|
+
target = path.join(os.homedir(), target);
|
|
38
|
+
}
|
|
39
|
+
else if (raw.trim().startsWith('@/')) {
|
|
40
|
+
target = path.resolve('/' + target);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
target = path.resolve(baseDir, raw.trim().startsWith('@./') ? target : m[1]);
|
|
44
|
+
}
|
|
45
|
+
return target;
|
|
46
|
+
}
|
|
47
|
+
function processIncludes(content, baseDir, seen, depth) {
|
|
48
|
+
if (depth >= MAX_INCLUDE_DEPTH)
|
|
49
|
+
return content;
|
|
23
50
|
return content
|
|
24
51
|
.split('\n')
|
|
25
52
|
.map((line) => {
|
|
26
|
-
const
|
|
27
|
-
if (!
|
|
53
|
+
const target = resolveInclude(line, baseDir);
|
|
54
|
+
if (!target || seen.has(target) || !existsSync(target))
|
|
28
55
|
return line;
|
|
29
|
-
|
|
30
|
-
if (seen.has(includePath) || !existsSync(includePath))
|
|
31
|
-
return line;
|
|
32
|
-
seen.add(includePath);
|
|
56
|
+
seen.add(target);
|
|
33
57
|
try {
|
|
34
|
-
const sub = readFileSync(
|
|
35
|
-
return processIncludes(sub, path.dirname(
|
|
58
|
+
const sub = readFileSync(target, 'utf-8');
|
|
59
|
+
return processIncludes(sub, path.dirname(target), seen, depth + 1);
|
|
36
60
|
}
|
|
37
61
|
catch {
|
|
38
62
|
return line;
|
|
@@ -40,34 +64,34 @@ function processIncludes(content, baseDir, seen) {
|
|
|
40
64
|
})
|
|
41
65
|
.join('\n');
|
|
42
66
|
}
|
|
43
|
-
function readContextFile(filePath, seen) {
|
|
67
|
+
function readContextFile(filePath, seen, depth = 0) {
|
|
44
68
|
if (seen.has(filePath) || !existsSync(filePath))
|
|
45
69
|
return null;
|
|
46
70
|
seen.add(filePath);
|
|
47
71
|
try {
|
|
48
72
|
const raw = readFileSync(filePath, 'utf-8');
|
|
49
|
-
return processIncludes(raw, path.dirname(filePath), seen);
|
|
73
|
+
return processIncludes(raw, path.dirname(filePath), seen, depth);
|
|
50
74
|
}
|
|
51
75
|
catch {
|
|
52
76
|
return null;
|
|
53
77
|
}
|
|
54
78
|
}
|
|
55
79
|
/**
|
|
56
|
-
* Load the CLAUDE.md hierarchy for a working directory.
|
|
57
|
-
* `text` when
|
|
58
|
-
* dirs), so callers can no-op cheaply.
|
|
80
|
+
* Load the CLAUDE.md / AGENTS.md hierarchy for a working directory.
|
|
81
|
+
* Returns an empty `text` when nothing is found (the common case for
|
|
82
|
+
* arbitrary dirs), so callers can no-op cheaply.
|
|
59
83
|
*/
|
|
60
84
|
export function loadProjectContext(workDir) {
|
|
61
85
|
const seen = new Set();
|
|
62
86
|
const parts = [];
|
|
63
87
|
const home = os.homedir();
|
|
64
|
-
// 1. User memory.
|
|
88
|
+
// 1. User memory — ~/.claude/CLAUDE.md (Claude Code convention).
|
|
65
89
|
const userFile = path.join(home, '.claude', 'CLAUDE.md');
|
|
66
90
|
const userContent = readContextFile(userFile, seen);
|
|
67
91
|
if (userContent?.trim())
|
|
68
92
|
parts.push({ label: '~/.claude/CLAUDE.md', content: userContent });
|
|
69
|
-
// 2. Project memory —
|
|
70
|
-
// so the cwd's own
|
|
93
|
+
// 2. Project + local memory — walk from farthest ancestor (just under home)
|
|
94
|
+
// to the cwd so the cwd's own files land last (most prominent).
|
|
71
95
|
const ancestors = [];
|
|
72
96
|
let dir = path.resolve(workDir);
|
|
73
97
|
while (dir && dir !== home && path.dirname(dir) !== dir) {
|
|
@@ -75,7 +99,8 @@ export function loadProjectContext(workDir) {
|
|
|
75
99
|
dir = path.dirname(dir);
|
|
76
100
|
}
|
|
77
101
|
for (const anc of ancestors) {
|
|
78
|
-
|
|
102
|
+
// Project: canonical names (Claude Code + Codex fallback).
|
|
103
|
+
for (const rel of ['CLAUDE.md', path.join('.claude', 'CLAUDE.md'), 'AGENTS.md']) {
|
|
79
104
|
const f = path.join(anc, rel);
|
|
80
105
|
const c = readContextFile(f, seen);
|
|
81
106
|
if (c?.trim()) {
|
|
@@ -83,6 +108,28 @@ export function loadProjectContext(workDir) {
|
|
|
83
108
|
parts.push({ label, content: c });
|
|
84
109
|
}
|
|
85
110
|
}
|
|
111
|
+
// Project: .claude/rules/*.md (Claude Code convention).
|
|
112
|
+
const rulesDir = path.join(anc, '.claude', 'rules');
|
|
113
|
+
try {
|
|
114
|
+
const entries = readRuleEntries(rulesDir);
|
|
115
|
+
for (const entry of entries) {
|
|
116
|
+
const c = readContextFile(entry, seen);
|
|
117
|
+
if (c?.trim()) {
|
|
118
|
+
const label = path.relative(home, entry) || entry;
|
|
119
|
+
parts.push({ label, content: c });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// rules dir may not exist — that's fine.
|
|
125
|
+
}
|
|
126
|
+
// Local: user-private, not checked into the repo (Claude Code convention).
|
|
127
|
+
const localFile = path.join(anc, 'CLAUDE.local.md');
|
|
128
|
+
const localContent = readContextFile(localFile, seen);
|
|
129
|
+
if (localContent?.trim()) {
|
|
130
|
+
const label = path.relative(home, localFile) || localFile;
|
|
131
|
+
parts.push({ label, content: localContent });
|
|
132
|
+
}
|
|
86
133
|
}
|
|
87
134
|
if (parts.length === 0)
|
|
88
135
|
return { text: '', sources: [] };
|
|
@@ -104,4 +151,25 @@ export function loadProjectContext(workDir) {
|
|
|
104
151
|
}
|
|
105
152
|
return { text: sections.join('\n\n'), sources };
|
|
106
153
|
}
|
|
154
|
+
// ── Rule directory helper ────────────────────────────────────────────────
|
|
155
|
+
function readRuleEntries(rulesDir) {
|
|
156
|
+
const paths = [];
|
|
157
|
+
// Only process files directly inside rules/ (no recursion into subdirs).
|
|
158
|
+
const dirents = readDirSafe(rulesDir);
|
|
159
|
+
for (const name of dirents) {
|
|
160
|
+
if (!name.endsWith('.md'))
|
|
161
|
+
continue;
|
|
162
|
+
paths.push(path.join(rulesDir, name));
|
|
163
|
+
}
|
|
164
|
+
paths.sort(); // deterministic order
|
|
165
|
+
return paths;
|
|
166
|
+
}
|
|
167
|
+
function readDirSafe(dirPath) {
|
|
168
|
+
try {
|
|
169
|
+
return readdirSync(dirPath);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
107
175
|
//# sourceMappingURL=projectContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectContext.js","sourceRoot":"","sources":["../../../src/memory/projectContext.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"projectContext.js","sourceRoot":"","sources":["../../../src/memory/projectContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,6DAA6D;AAC7D,MAAM,UAAU,GAAG,mCAAmC,CAAC;AAEvD;;;GAGG;AACH,SAAS,cAAc,CAAC,GAAW,EAAE,OAAe;IAClD,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACnB,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CACtB,OAAe,EACf,OAAe,EACf,IAAiB,EACjB,KAAa;IAEb,IAAI,KAAK,IAAI,iBAAiB;QAAE,OAAO,OAAO,CAAC;IAC/C,OAAO,OAAO;SACX,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1C,OAAO,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CACtB,QAAgB,EAChB,IAAiB,EACjB,KAAK,GAAG,CAAC;IAET,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAyC,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE1B,iEAAiE;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,WAAW,EAAE,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAE5F,4EAA4E;IAC5E,mEAAmE;IACnE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QACxD,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,2DAA2D;QAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;YAChF,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9B,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;oBACd,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC;oBAClD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QAED,2EAA2E;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACtD,IAAI,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,SAAS,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEzD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,IAAI,IAAI,eAAe,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,wDAAwD,CAAC,CAAC;YACrF,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACxB,MAAM,SAAS,GAAG,eAAe,GAAG,IAAI,CAAC;QACzC,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,gDAAgD,CAAC;QAC3F,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,OAAO,EAAE,CAAC,CAAC;QAC7C,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED,4EAA4E;AAE5E,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,yEAAyE;IACzE,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,sBAAsB;IACpC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight global session history (mirrors Codex's `~/.codex/history.jsonl`
|
|
3
|
+
* and Claude Code's `~/.claude/history.jsonl`).
|
|
4
|
+
*
|
|
5
|
+
* Append-only JSONL — one line per user turn, minimal metadata. Used for
|
|
6
|
+
* cross-session search and resume-picker previews. Trimmed to a soft cap
|
|
7
|
+
* so the file stays compact.
|
|
8
|
+
*/
|
|
9
|
+
export interface HistoryEntry {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
/** Unix timestamp in seconds. */
|
|
12
|
+
ts: number;
|
|
13
|
+
text: string;
|
|
14
|
+
/** If the turn was answered by a bridge/routed model, which one. */
|
|
15
|
+
model?: string;
|
|
16
|
+
}
|
|
17
|
+
/** Append one turn to the global history file. */
|
|
18
|
+
export declare function recordTurn(entry: HistoryEntry, homeDir?: string): void;
|
|
19
|
+
/** Read back the most recent N turns (useful for resume-picker previews). */
|
|
20
|
+
export declare function readHistory(limit?: number, homeDir?: string): HistoryEntry[];
|
|
21
|
+
//# sourceMappingURL=sessionHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionHistory.d.ts","sourceRoot":"","sources":["../../../src/memory/sessionHistory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAWtE;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,KAAK,SAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAqBzE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight global session history (mirrors Codex's `~/.codex/history.jsonl`
|
|
3
|
+
* and Claude Code's `~/.claude/history.jsonl`).
|
|
4
|
+
*
|
|
5
|
+
* Append-only JSONL — one line per user turn, minimal metadata. Used for
|
|
6
|
+
* cross-session search and resume-picker previews. Trimmed to a soft cap
|
|
7
|
+
* so the file stays compact.
|
|
8
|
+
*/
|
|
9
|
+
import { appendFileSync, readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
10
|
+
import os from 'node:os';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
const MAX_HISTORY_BYTES = 512_000; // ~500 KB soft limit
|
|
13
|
+
const SOFT_CAP_RATIO = 0.8; // trim back to this fraction when over the cap
|
|
14
|
+
function historyPath(homeDir) {
|
|
15
|
+
return path.join(homeDir ?? os.homedir(), '.actoviq', 'history.jsonl');
|
|
16
|
+
}
|
|
17
|
+
function ensureDir(dir) {
|
|
18
|
+
try {
|
|
19
|
+
mkdirSync(dir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
catch { /* ok */ }
|
|
22
|
+
}
|
|
23
|
+
/** Append one turn to the global history file. */
|
|
24
|
+
export function recordTurn(entry, homeDir) {
|
|
25
|
+
const filePath = historyPath(homeDir);
|
|
26
|
+
ensureDir(path.dirname(filePath));
|
|
27
|
+
const line = JSON.stringify({
|
|
28
|
+
sessionId: entry.sessionId,
|
|
29
|
+
ts: entry.ts,
|
|
30
|
+
text: entry.text,
|
|
31
|
+
...(entry.model ? { model: entry.model } : {}),
|
|
32
|
+
}) + '\n';
|
|
33
|
+
appendFileSync(filePath, line, 'utf-8');
|
|
34
|
+
maybeTrim(filePath);
|
|
35
|
+
}
|
|
36
|
+
/** Read back the most recent N turns (useful for resume-picker previews). */
|
|
37
|
+
export function readHistory(limit = 100, homeDir) {
|
|
38
|
+
const filePath = historyPath(homeDir);
|
|
39
|
+
if (!existsSync(filePath))
|
|
40
|
+
return [];
|
|
41
|
+
try {
|
|
42
|
+
const lines = readFileSync(filePath, 'utf-8').split('\n').filter(Boolean);
|
|
43
|
+
const entries = [];
|
|
44
|
+
for (let i = lines.length - 1; i >= 0 && entries.length < limit; i--) {
|
|
45
|
+
const line = lines[i];
|
|
46
|
+
try {
|
|
47
|
+
const obj = JSON.parse(line);
|
|
48
|
+
if (obj.sessionId && typeof obj.ts === 'number' && obj.text) {
|
|
49
|
+
entries.push({ sessionId: obj.sessionId, ts: obj.ts, text: obj.text, model: obj.model });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// skip corrupt lines
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return entries;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Trim the oldest lines when the file exceeds MAX_HISTORY_BYTES so the
|
|
64
|
+
* history file stays small without any background cleanup daemon.
|
|
65
|
+
*/
|
|
66
|
+
function maybeTrim(filePath) {
|
|
67
|
+
if (!existsSync(filePath))
|
|
68
|
+
return;
|
|
69
|
+
try {
|
|
70
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
71
|
+
if (content.length <= MAX_HISTORY_BYTES)
|
|
72
|
+
return;
|
|
73
|
+
const lines = content.split('\n').filter(Boolean);
|
|
74
|
+
const target = Math.floor(lines.length * SOFT_CAP_RATIO);
|
|
75
|
+
if (target >= lines.length)
|
|
76
|
+
return;
|
|
77
|
+
writeFileSync(filePath, lines.slice(-target).join('\n') + '\n', 'utf-8');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// best-effort — do not break the turn for a history trim failure
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=sessionHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionHistory.js","sourceRoot":"","sources":["../../../src/memory/sessionHistory.ts"],"names":[],"mappings":"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"}
|