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.
@@ -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 '&amp;';
14
+ case '<': return '&lt;';
15
+ case '>': return '&gt;';
16
+ case '"': return '&quot;';
17
+ default: return '&#39;';
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 '&amp;';
26
+ case '<': return '&lt;';
27
+ case '>': return '&gt;';
28
+ case '"': return '&quot;';
29
+ default: return '&#39;';
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(/&amp;/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(/&amp;/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":"AAAA,+EAA+E;AAC/E,gFAAgF;AAChF,8EAA8E;AAC9E,0EAA0E;AAC1E,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAC5E,wBAAwB;AAExB,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QAChD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC;YACzB,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC;YACxB,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC;YACxB,KAAK,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC1B,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,KAAc,EAAU,EAAE,CACrC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QAC9D,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC;YACzB,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC;YACxB,KAAK,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC;YACxB,KAAK,GAAG,CAAC,CAAC,OAAO,QAAQ,CAAC;YAC1B,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAEvE,+EAA+E;IAC/E,sEAAsE;IACtE,0CAA0C;IAC1C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oCAAoC,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,IAAY,EAAE,EAAE;QAC/F,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,0BAA0B,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,UAAU,CAAC,IAAI,CACb,0BAA0B,GAAG,SAAS,GAAG,4DAA4D;cACjG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;cACpC,eAAe,CACpB,CAAC;QACF,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,uEAAuE;IACvE,MAAM,MAAM,GAAG,CAAC,GAAW,EAAU,EAAE;QACrC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,kDAAkD;QAClD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,IAAY,EAAE,EAAE,CAAC,4BAA4B,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;QACrG,0CAA0C;QAC1C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC;QACzD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;QACrD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,eAAe,CAAC,CAAC;QACzD,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,eAAe,CAAC,CAAC;QACvD,iBAAiB;QACjB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAC/C,+DAA+D;QAC/D,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,uCAAuC,EAAE,CAAC,EAAE,EAAE,KAAa,EAAE,IAAY,EAAE,EAAE;YACzF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1E,OAAO,WAAW,GAAG,QAAQ,GAAG,8CAA8C,GAAG,KAAK,GAAG,MAAM,CAAC;QAClG,CAAC,CAAC,CAAC;QACH,4EAA4E;QAC5E,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/G,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,8BAA8B,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpH,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/D,OAAO,WAAW,GAAG,IAAI,GAAG,8CAA8C,GAAG,KAAK,GAAG,MAAM,CAAC;QAC9F,CAAC,CAAC,CAAC;QACH,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClG,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEzE,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE;QAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC,CAAC;IACF,4EAA4E;IAC5E,+DAA+D;IAC/D,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/G,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CACjC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;IAEnG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACxC,iEAAiE;QACjE,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACjE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACxE,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;YACtF,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS;QACnB,CAAC;QACD,0DAA0D;QAC1D,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAC7F,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAC7B,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,IAAI,GAAG,qCAAqC;kBAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC;YACpF,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,IAAI,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;YACvG,IAAI,IAAI,kBAAkB,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC,GAAG,CAAC,CAAC;YAAC,SAAS;QAClB,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACnD,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC1D,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC;YAC7F,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACf,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC5C,IAAI,EAAE,EAAE,CAAC;oBACP,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;oBAC/C,OAAO,oBAAoB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI;0BACjE,iCAAiC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI;0BACtE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC;gBAClC,CAAC;gBACD,OAAO,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;YACrC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACf,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;YACtG,SAAS;QACX,CAAC;QACD,qEAAqE;QACrE,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACrF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,8BAA8B;IAC9B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnH,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,18 +1,21 @@
1
1
  /**
2
- * Project context loader mirrors Claude Code's CLAUDE.md memory hierarchy.
2
+ * Project context loader (CLAUDE.md / AGENTS.md hierarchy).
3
3
  *
4
- * Loads, in order (so nearer-to-cwd files append last):
5
- * 1. User memory: `~/.claude/CLAUDE.md`
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
- * Each file may pull in other files via `@<path>` include lines (relative to
10
- * the file's own directory, recursive, cycle-safe). The combined context is
11
- * size-capped so a runaway CLAUDE.md can't blow the prompt.
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
- * The result is injected into the system prompt so the agent picks up
14
- * project-specific instructions ("don't touch X", coding standards, etc.) —
15
- * the canonical Claude Code convention that the SDK previously ignored.
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. Returns an empty
25
- * `text` when no CLAUDE.md is present anywhere (the common case for arbitrary
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;;;;;;;;;;;;;;;GAeG;AAuCH,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,CAgDxE"}
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 mirrors Claude Code's CLAUDE.md memory hierarchy.
2
+ * Project context loader (CLAUDE.md / AGENTS.md hierarchy).
3
3
  *
4
- * Loads, in order (so nearer-to-cwd files append last):
5
- * 1. User memory: `~/.claude/CLAUDE.md`
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
- * Each file may pull in other files via `@<path>` include lines (relative to
10
- * the file's own directory, recursive, cycle-safe). The combined context is
11
- * size-capped so a runaway CLAUDE.md can't blow the prompt.
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
- * The result is injected into the system prompt so the agent picks up
14
- * project-specific instructions ("don't touch X", coding standards, etc.) —
15
- * the canonical Claude Code convention that the SDK previously ignored.
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 INCLUDE_RE = /^\s*@([\w./\\-]+)\s*$/;
22
- function processIncludes(content, baseDir, seen) {
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 m = line.match(INCLUDE_RE);
27
- if (!m)
53
+ const target = resolveInclude(line, baseDir);
54
+ if (!target || seen.has(target) || !existsSync(target))
28
55
  return line;
29
- const includePath = path.resolve(baseDir, m[1]);
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(includePath, 'utf-8');
35
- return processIncludes(sub, path.dirname(includePath), seen);
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. Returns an empty
57
- * `text` when no CLAUDE.md is present anywhere (the common case for arbitrary
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 — ancestors from farthest (just under home) to the cwd,
70
- // so the cwd's own CLAUDE.md lands last (most prominent in the prompt).
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
- for (const rel of ['CLAUDE.md', path.join('.claude', 'CLAUDE.md')]) {
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":"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"}
1
+ {"version":3,"file":"projectContext.js","sourceRoot":"","sources":["../../../src/memory/projectContext.ts"],"names":[],"mappings":"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"}
@@ -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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"}