claude-code-infinite 1.0.11 → 1.0.16

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 (136) hide show
  1. package/README.md +214 -47
  2. package/dist/cc-request.d.ts +94 -0
  3. package/dist/cc-request.d.ts.map +1 -0
  4. package/dist/cc-request.js +194 -0
  5. package/dist/cc-request.js.map +1 -0
  6. package/dist/claude-env.d.ts +30 -0
  7. package/dist/claude-env.d.ts.map +1 -0
  8. package/dist/claude-env.js +55 -0
  9. package/dist/claude-env.js.map +1 -0
  10. package/dist/cli-args.d.ts +32 -0
  11. package/dist/cli-args.d.ts.map +1 -0
  12. package/dist/cli-args.js +72 -0
  13. package/dist/cli-args.js.map +1 -0
  14. package/dist/cli-lifecycle.d.ts +17 -0
  15. package/dist/cli-lifecycle.d.ts.map +1 -0
  16. package/dist/cli-lifecycle.js +30 -0
  17. package/dist/cli-lifecycle.js.map +1 -0
  18. package/dist/cli-main.d.ts +15 -0
  19. package/dist/cli-main.d.ts.map +1 -0
  20. package/dist/cli-main.js +464 -0
  21. package/dist/cli-main.js.map +1 -0
  22. package/dist/cli.js +13 -178
  23. package/dist/cli.js.map +1 -1
  24. package/dist/config.d.ts +3 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +29 -3
  27. package/dist/config.js.map +1 -1
  28. package/dist/count-tokens.d.ts +78 -0
  29. package/dist/count-tokens.d.ts.map +1 -0
  30. package/dist/count-tokens.js +277 -0
  31. package/dist/count-tokens.js.map +1 -0
  32. package/dist/final-index.d.ts +10 -0
  33. package/dist/final-index.d.ts.map +1 -0
  34. package/dist/final-index.js +37 -0
  35. package/dist/final-index.js.map +1 -0
  36. package/dist/hooks.d.ts +239 -0
  37. package/dist/hooks.d.ts.map +1 -0
  38. package/dist/hooks.js +618 -0
  39. package/dist/hooks.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +8 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/memtree-fetch.d.ts +24 -0
  45. package/dist/memtree-fetch.d.ts.map +1 -0
  46. package/dist/memtree-fetch.js +121 -0
  47. package/dist/memtree-fetch.js.map +1 -0
  48. package/dist/memtree-finder.d.ts +99 -0
  49. package/dist/memtree-finder.d.ts.map +1 -0
  50. package/dist/memtree-finder.js +235 -0
  51. package/dist/memtree-finder.js.map +1 -0
  52. package/dist/memtree-links.d.ts +16 -0
  53. package/dist/memtree-links.d.ts.map +1 -0
  54. package/dist/memtree-links.js +66 -0
  55. package/dist/memtree-links.js.map +1 -0
  56. package/dist/memtree-mcp-config.d.ts +28 -0
  57. package/dist/memtree-mcp-config.d.ts.map +1 -0
  58. package/dist/memtree-mcp-config.js +121 -0
  59. package/dist/memtree-mcp-config.js.map +1 -0
  60. package/dist/memtree-mcp.d.ts +265 -0
  61. package/dist/memtree-mcp.d.ts.map +1 -0
  62. package/dist/memtree-mcp.js +667 -0
  63. package/dist/memtree-mcp.js.map +1 -0
  64. package/dist/memtree-newest.d.ts +74 -0
  65. package/dist/memtree-newest.d.ts.map +1 -0
  66. package/dist/memtree-newest.js +217 -0
  67. package/dist/memtree-newest.js.map +1 -0
  68. package/dist/memtree-tools.d.ts +105 -0
  69. package/dist/memtree-tools.d.ts.map +1 -0
  70. package/dist/memtree-tools.js +408 -0
  71. package/dist/memtree-tools.js.map +1 -0
  72. package/dist/memtree.d.ts +430 -0
  73. package/dist/memtree.d.ts.map +1 -0
  74. package/dist/memtree.js +1286 -0
  75. package/dist/memtree.js.map +1 -0
  76. package/dist/notices.d.ts +177 -0
  77. package/dist/notices.d.ts.map +1 -0
  78. package/dist/notices.js +469 -0
  79. package/dist/notices.js.map +1 -0
  80. package/dist/payment-gate.d.ts +53 -0
  81. package/dist/payment-gate.d.ts.map +1 -0
  82. package/dist/payment-gate.js +97 -0
  83. package/dist/payment-gate.js.map +1 -0
  84. package/dist/project-meta.d.ts +15 -0
  85. package/dist/project-meta.d.ts.map +1 -0
  86. package/dist/project-meta.js +80 -0
  87. package/dist/project-meta.js.map +1 -0
  88. package/dist/prompt-accounting.d.ts +12 -0
  89. package/dist/prompt-accounting.d.ts.map +1 -0
  90. package/dist/prompt-accounting.js +70 -0
  91. package/dist/prompt-accounting.js.map +1 -0
  92. package/dist/proxy.d.ts +204 -0
  93. package/dist/proxy.d.ts.map +1 -0
  94. package/dist/proxy.js +4299 -0
  95. package/dist/proxy.js.map +1 -0
  96. package/dist/reqlog.d.ts +427 -0
  97. package/dist/reqlog.d.ts.map +1 -0
  98. package/dist/reqlog.js +146 -0
  99. package/dist/reqlog.js.map +1 -0
  100. package/dist/request-sizing.d.ts +74 -0
  101. package/dist/request-sizing.d.ts.map +1 -0
  102. package/dist/request-sizing.js +121 -0
  103. package/dist/request-sizing.js.map +1 -0
  104. package/dist/resume-repair-file.d.ts +17 -0
  105. package/dist/resume-repair-file.d.ts.map +1 -0
  106. package/dist/resume-repair-file.js +100 -0
  107. package/dist/resume-repair-file.js.map +1 -0
  108. package/dist/resume-repair.d.ts +27 -0
  109. package/dist/resume-repair.d.ts.map +1 -0
  110. package/dist/resume-repair.js +198 -0
  111. package/dist/resume-repair.js.map +1 -0
  112. package/dist/route-cache.d.ts +5 -0
  113. package/dist/route-cache.d.ts.map +1 -0
  114. package/dist/route-cache.js +63 -0
  115. package/dist/route-cache.js.map +1 -0
  116. package/dist/route-fallback.d.ts +67 -0
  117. package/dist/route-fallback.d.ts.map +1 -0
  118. package/dist/route-fallback.js +126 -0
  119. package/dist/route-fallback.js.map +1 -0
  120. package/dist/route-identity.d.ts +6 -0
  121. package/dist/route-identity.d.ts.map +1 -0
  122. package/dist/route-identity.js +100 -0
  123. package/dist/route-identity.js.map +1 -0
  124. package/dist/transcript-usage.d.ts +57 -0
  125. package/dist/transcript-usage.d.ts.map +1 -0
  126. package/dist/transcript-usage.js +570 -0
  127. package/dist/transcript-usage.js.map +1 -0
  128. package/dist/turns.d.ts +77 -0
  129. package/dist/turns.d.ts.map +1 -0
  130. package/dist/turns.js +330 -0
  131. package/dist/turns.js.map +1 -0
  132. package/dist/update-check.d.ts +38 -0
  133. package/dist/update-check.d.ts.map +1 -0
  134. package/dist/update-check.js +67 -0
  135. package/dist/update-check.js.map +1 -0
  136. package/package.json +6 -2
@@ -0,0 +1,408 @@
1
+ /**
2
+ * Local queries over one MemTree page JSON (`/usage/memtree/<id>.json`): the
3
+ * logic behind the `memtree` MCP server's tools (memtree-mcp.ts).
4
+ *
5
+ * Page shape: `nodes` is a flat list, node 0 the root; each node has a summary
6
+ * `s` and child ids `k`; a leaf has `l = [block, start_line, end_line]`, a
7
+ * 1-based inclusive line range of `blocks[block]`, the raw transcript text the
8
+ * leaf summarizes. Summaries are lossy; leaf lines are ground truth.
9
+ *
10
+ * Search is plain lexical matching: query terms, case-insensitive substring,
11
+ * ranked by how many distinct terms a node covers, then how many one line
12
+ * covers, then total hits. No embeddings and no server calls.
13
+ */
14
+ export const SEARCH_DEFAULT_LIMIT = 10;
15
+ export const SEARCH_MAX_LIMIT = 50;
16
+ export const READ_LINES_MAX_LINES = 400;
17
+ export const READ_LINES_MAX_CHARS = 40_000;
18
+ const SNIPPETS_PER_LEAF = 3;
19
+ const SNIPPET_CHARS = 240;
20
+ const SUMMARY_CHARS = 600;
21
+ /** A page indexed for repeated queries: parent links, depths, split blocks. */
22
+ export class MemtreeIndex {
23
+ page;
24
+ nodes = new Map();
25
+ parent = new Map();
26
+ depth = new Map();
27
+ lines;
28
+ lowerLines;
29
+ constructor(page) {
30
+ this.page = page;
31
+ for (const node of page.nodes ?? []) {
32
+ if (node && Number.isInteger(node.id))
33
+ this.nodes.set(node.id, node);
34
+ }
35
+ // Breadth-first from the root; a node reached twice keeps its first
36
+ // (shallowest) parent, so a malformed tree cannot loop.
37
+ if (this.nodes.has(0)) {
38
+ this.depth.set(0, 0);
39
+ const queue = [0];
40
+ while (queue.length) {
41
+ const id = queue.shift();
42
+ for (const child of this.nodes.get(id)?.k ?? []) {
43
+ if (this.depth.has(child) || !this.nodes.has(child))
44
+ continue;
45
+ this.parent.set(child, id);
46
+ this.depth.set(child, this.depth.get(id) + 1);
47
+ queue.push(child);
48
+ }
49
+ }
50
+ }
51
+ this.lines = (page.blocks ?? []).map(splitLines);
52
+ this.lowerLines = this.lines.map((block) => block.map((line) => line.toLowerCase()));
53
+ }
54
+ get blockCount() {
55
+ return this.lines.length;
56
+ }
57
+ blockLines(block) {
58
+ return this.lines[block];
59
+ }
60
+ /** Root first, the node's parent last. */
61
+ ancestors(id) {
62
+ const path = [];
63
+ let current = this.parent.get(id);
64
+ while (current !== undefined && path.length < 1000) {
65
+ path.unshift(current);
66
+ current = this.parent.get(current);
67
+ }
68
+ return path;
69
+ }
70
+ isLeaf(node) {
71
+ return Array.isArray(node.l) && node.l.length === 3;
72
+ }
73
+ search(query, limit = SEARCH_DEFAULT_LIMIT) {
74
+ const terms = queryTerms(query);
75
+ if (!terms.length)
76
+ return [];
77
+ const hits = [];
78
+ for (const node of this.nodes.values()) {
79
+ const hit = this.scoreNode(node, terms);
80
+ if (hit)
81
+ hits.push(hit);
82
+ }
83
+ hits.sort((a, b) => b.score - a.score ||
84
+ // Later in the conversation first on ties: the newer state of a fact.
85
+ b.id - a.id);
86
+ return hits.slice(0, clampLimit(limit));
87
+ }
88
+ scoreNode(node, terms) {
89
+ const summary = node.s ?? "";
90
+ const summaryLower = summary.toLowerCase();
91
+ const covered = new Set();
92
+ for (const term of terms)
93
+ if (summaryLower.includes(term))
94
+ covered.add(term);
95
+ const summaryTerms = covered.size;
96
+ const lineMatches = [];
97
+ let totalHits = 0;
98
+ let bestLineTerms = 0;
99
+ let range;
100
+ if (this.isLeaf(node)) {
101
+ const [block, start, end] = node.l;
102
+ range = { block, start, end };
103
+ const lower = this.lowerLines[block] ?? [];
104
+ const last = Math.min(end, lower.length);
105
+ for (let n = Math.max(1, start); n <= last; n++) {
106
+ const text = lower[n - 1];
107
+ let lineTerms = 0;
108
+ for (const term of terms) {
109
+ const count = occurrences(text, term);
110
+ if (count) {
111
+ lineTerms++;
112
+ totalHits += count;
113
+ covered.add(term);
114
+ }
115
+ }
116
+ if (lineTerms) {
117
+ lineMatches.push({ line: n, terms: lineTerms });
118
+ if (lineTerms > bestLineTerms)
119
+ bestLineTerms = lineTerms;
120
+ }
121
+ }
122
+ }
123
+ if (!covered.size)
124
+ return undefined;
125
+ // Coverage of the query dominates; a single line holding several terms
126
+ // beats terms scattered across a leaf; raw hit count breaks the rest.
127
+ // A leaf with line hits outranks a summary-only match of equal coverage.
128
+ const score = covered.size * 100 +
129
+ bestLineTerms * 20 +
130
+ summaryTerms * 5 +
131
+ Math.min(totalHits, 50) * 0.1;
132
+ const snippets = lineMatches
133
+ .sort((a, b) => b.terms - a.terms || a.line - b.line)
134
+ .slice(0, SNIPPETS_PER_LEAF)
135
+ .sort((a, b) => a.line - b.line)
136
+ .map(({ line }) => ({
137
+ line,
138
+ text: snippet(this.lines[range.block][line - 1], terms),
139
+ }));
140
+ return {
141
+ id: node.id,
142
+ depth: this.depth.get(node.id),
143
+ leaf: this.isLeaf(node),
144
+ summary: truncate(summary, SUMMARY_CHARS),
145
+ matchedTerms: terms.filter((t) => covered.has(t)),
146
+ lineHits: lineMatches.length,
147
+ score,
148
+ ...(range ? { range } : {}),
149
+ snippets,
150
+ };
151
+ }
152
+ }
153
+ /** A node address, `<tree>#<node id>` (search hits carry them). */
154
+ export function parseNodeAddress(value) {
155
+ const match = typeof value === "string" ? /^([A-Za-z0-9-]{1,80})#(\d{1,9})$/.exec(value.trim()) : null;
156
+ if (!match)
157
+ throw new ToolInputError(`node must be an address like "<tree>#<id>" from search, got ${JSON.stringify(value)}`);
158
+ return { tree: match[1], id: Number(match[2]) };
159
+ }
160
+ const STOPWORDS = new Set("a an and are as at be by did do does for from how i in is it of on or that the this to was were what when where which who why with you your".split(" "));
161
+ /** Lowercased, de-duplicated terms; surrounding punctuation trimmed. */
162
+ export function queryTerms(query) {
163
+ const terms = [];
164
+ for (const raw of query.toLowerCase().split(/\s+/)) {
165
+ const term = raw.replace(/^[^\p{L}\p{N}_]+|[^\p{L}\p{N}_]+$/gu, "");
166
+ if (!term || STOPWORDS.has(term) || terms.includes(term))
167
+ continue;
168
+ terms.push(term);
169
+ }
170
+ return terms;
171
+ }
172
+ function occurrences(text, term) {
173
+ let count = 0;
174
+ for (let at = text.indexOf(term); at !== -1; at = text.indexOf(term, at + term.length)) {
175
+ count++;
176
+ }
177
+ return count;
178
+ }
179
+ /** A window of the line around its first hit. */
180
+ function snippet(line, terms) {
181
+ const clean = line.replace(/\s+/g, " ").trim();
182
+ if (clean.length <= SNIPPET_CHARS)
183
+ return clean;
184
+ const lower = clean.toLowerCase();
185
+ let first = -1;
186
+ for (const term of terms) {
187
+ const at = lower.indexOf(term);
188
+ if (at !== -1 && (first === -1 || at < first))
189
+ first = at;
190
+ }
191
+ const start = Math.max(0, Math.min(first - SNIPPET_CHARS / 3, clean.length - SNIPPET_CHARS));
192
+ const body = clean.slice(start, start + SNIPPET_CHARS);
193
+ return `${start > 0 ? "…" : ""}${body}${start + SNIPPET_CHARS < clean.length ? "…" : ""}`;
194
+ }
195
+ function truncate(text, max) {
196
+ return text.length <= max ? text : `${text.slice(0, max - 1)}…`;
197
+ }
198
+ function clampLimit(limit) {
199
+ if (!Number.isFinite(limit))
200
+ return SEARCH_DEFAULT_LIMIT;
201
+ return Math.max(1, Math.min(SEARCH_MAX_LIMIT, Math.floor(limit)));
202
+ }
203
+ /** Block text → lines, without the empty tail a final newline leaves. */
204
+ function splitLines(block) {
205
+ if (typeof block !== "string" || block === "")
206
+ return [];
207
+ const lines = block.split("\n");
208
+ if (lines.at(-1) === "")
209
+ lines.pop();
210
+ return lines;
211
+ }
212
+ // ---- Tool output (plain text for the model) -------------------------------
213
+ export class ToolInputError extends Error {
214
+ }
215
+ /** `"tree": "<id>", ` for follow-up calls on another session's tree; "" for this session's. */
216
+ function treeArg(tree) {
217
+ return tree ? `"tree": ${JSON.stringify(tree)}, ` : "";
218
+ }
219
+ export function formatSearch(index, query, limit, tree) {
220
+ const terms = queryTerms(query);
221
+ if (!terms.length)
222
+ throw new ToolInputError("search: the query has no searchable terms");
223
+ return formatSearchHits(index.search(query, limit ?? SEARCH_DEFAULT_LIMIT), query, terms, tree);
224
+ }
225
+ /**
226
+ * The hits of the server's term search over one tree
227
+ * (`GET /usage/memtree/<id>/search`, a port of MemtreeIndex.search), in the
228
+ * local shape; undefined when the body is not that endpoint's answer.
229
+ */
230
+ export function serverSearchHits(body) {
231
+ const json = body;
232
+ if (!json || !Array.isArray(json.hits) || !Array.isArray(json.terms))
233
+ return undefined;
234
+ const hits = [];
235
+ for (const raw of json.hits) {
236
+ if (!raw || !Number.isInteger(raw.id))
237
+ return undefined;
238
+ const range = raw.range;
239
+ hits.push({
240
+ id: raw.id,
241
+ depth: typeof raw.depth === "number" ? raw.depth : undefined,
242
+ leaf: raw.leaf === true,
243
+ summary: typeof raw.summary === "string" ? raw.summary : "",
244
+ matchedTerms: Array.isArray(raw.matched_terms) ? raw.matched_terms.map(String) : [],
245
+ lineHits: typeof raw.line_hits === "number" ? raw.line_hits : 0,
246
+ score: typeof raw.score === "number" ? raw.score : 0,
247
+ ...(range && Number.isInteger(range.block) ? { range } : {}),
248
+ snippets: Array.isArray(raw.snippets) ? raw.snippets : [],
249
+ ...(typeof raw.address === "string" ? { address: raw.address } : {}),
250
+ ...(Array.isArray(raw.path) ? { path: raw.path } : {}),
251
+ });
252
+ }
253
+ return { hits, terms: json.terms.map(String) };
254
+ }
255
+ export function formatSearchHits(hits, query, terms, tree) {
256
+ if (!terms.length)
257
+ throw new ToolInputError("search: the query has no searchable terms");
258
+ if (!hits.length) {
259
+ return `No node or transcript line matches ${JSON.stringify(query)} (terms: ${terms.join(", ")}). Try other words, fewer terms, or read_node {${treeArg(tree)}"id": 0} to browse from the root.`;
260
+ }
261
+ const out = [`${hits.length} best match${hits.length === 1 ? "" : "es"} for ${JSON.stringify(query)} (terms: ${terms.join(", ")}):`];
262
+ for (const hit of hits) {
263
+ const head = [
264
+ `node ${hit.id}`,
265
+ hit.leaf ? "leaf" : "branch",
266
+ hit.depth !== undefined ? `depth ${hit.depth}` : undefined,
267
+ hit.range ? `block ${hit.range.block} lines ${hit.range.start}-${hit.range.end}` : undefined,
268
+ `matched ${hit.matchedTerms.join(", ")}`,
269
+ hit.leaf ? `${hit.lineHits} matching line${hit.lineHits === 1 ? "" : "s"}` : undefined,
270
+ ]
271
+ .filter(Boolean)
272
+ .join(" · ");
273
+ out.push("", `[${head}]`, ` ${hit.summary}`);
274
+ if (hit.address)
275
+ out.push(` address: ${hit.address}`);
276
+ if (hit.path?.length) {
277
+ out.push(` path: ${hit.path.map((p) => `${truncate(p.summary, 80)} (node ${p.id})`).join(" › ")}`);
278
+ }
279
+ for (const s of hit.snippets)
280
+ out.push(` L${s.line}: ${s.text}`);
281
+ }
282
+ out.push("", tree
283
+ ? `Summaries are lossy; read_lines {"tree": ${JSON.stringify(tree)}, block, start, end} returns the exact transcript lines, read_node {"tree": ${JSON.stringify(tree)}, id} a node's children and path from the root.`
284
+ : "Summaries are lossy; read_lines {block, start, end} returns the exact transcript lines, read_node {id} a node's children and path from the root.");
285
+ return out.join("\n");
286
+ }
287
+ export function formatNode(index, id, tree) {
288
+ if (!Number.isInteger(id))
289
+ throw new ToolInputError("read_node: id must be an integer node id");
290
+ const node = index.nodes.get(id);
291
+ if (!node) {
292
+ throw new ToolInputError(`read_node: no node ${id} (this tree has ${index.nodes.size} nodes; node 0 is the root)`);
293
+ }
294
+ const out = [
295
+ `node ${id} · ${index.isLeaf(node) ? "leaf" : "branch"}` +
296
+ (index.depth.has(id) ? ` · depth ${index.depth.get(id)}` : ""),
297
+ `summary: ${node.s ?? ""}`,
298
+ ];
299
+ if (index.isLeaf(node)) {
300
+ const [block, start, end] = node.l;
301
+ out.push(`transcript: block ${block} lines ${start}-${end} (${end - start + 1} lines; read_lines {${treeArg(tree)}"block": ${block}, "start": ${start}, "end": ${end}})`);
302
+ }
303
+ const path = index.ancestors(id);
304
+ if (path.length) {
305
+ out.push("", "path from the root:");
306
+ for (const ancestor of path) {
307
+ out.push(` node ${ancestor}: ${truncate(index.nodes.get(ancestor)?.s ?? "", SUMMARY_CHARS)}`);
308
+ }
309
+ }
310
+ const children = (node.k ?? []).filter((child) => index.nodes.has(child));
311
+ if (children.length) {
312
+ out.push("", `children (${children.length}):`);
313
+ for (const child of children) {
314
+ const c = index.nodes.get(child);
315
+ const tag = index.isLeaf(c) ? `leaf, block ${c.l[0]} lines ${c.l[1]}-${c.l[2]}` : "branch";
316
+ out.push(` node ${child} (${tag}): ${truncate(c.s ?? "", SUMMARY_CHARS)}`);
317
+ }
318
+ }
319
+ return out.join("\n");
320
+ }
321
+ export function formatLines(index, block, start, end, tree) {
322
+ if (![block, start, end].every(Number.isInteger)) {
323
+ throw new ToolInputError("read_lines: block, start and end must be integers");
324
+ }
325
+ if (index.blockCount === 0) {
326
+ const note = typeof index.page.source_note === "string" ? ` (${index.page.source_note})` : "";
327
+ throw new ToolInputError(`read_lines: this MemTree page carries no transcript blocks${note}`);
328
+ }
329
+ const lines = index.blockLines(block);
330
+ if (!lines) {
331
+ throw new ToolInputError(`read_lines: no block ${block} (blocks 0-${index.blockCount - 1})`);
332
+ }
333
+ if (start < 1)
334
+ throw new ToolInputError("read_lines: start is 1-based and must be at least 1");
335
+ if (end < start)
336
+ throw new ToolInputError("read_lines: end must be at least start");
337
+ if (start > lines.length) {
338
+ throw new ToolInputError(`read_lines: block ${block} has ${lines.length} lines; start ${start} is past its end`);
339
+ }
340
+ const notes = [];
341
+ let last = end;
342
+ if (last > lines.length) {
343
+ last = lines.length;
344
+ notes.push(`block ${block} ends at line ${lines.length}`);
345
+ }
346
+ if (last - start + 1 > READ_LINES_MAX_LINES) {
347
+ last = start + READ_LINES_MAX_LINES - 1;
348
+ }
349
+ const out = [];
350
+ let chars = 0;
351
+ let shown = start - 1;
352
+ for (let n = start; n <= last; n++) {
353
+ let text = lines[n - 1];
354
+ const room = READ_LINES_MAX_CHARS - chars;
355
+ if (text.length > room) {
356
+ if (n > start)
357
+ break;
358
+ // A single line longer than the whole budget: show its head.
359
+ text = `${text.slice(0, room)}… [line truncated: ${lines[n - 1].length} chars]`;
360
+ }
361
+ out.push(`${n}\t${text}`);
362
+ chars += text.length + 1;
363
+ shown = n;
364
+ }
365
+ const wanted = Math.min(end, lines.length);
366
+ if (shown < wanted) {
367
+ notes.unshift(`capped at ${READ_LINES_MAX_LINES} lines / ${READ_LINES_MAX_CHARS} chars per call: showed ${start}-${shown}; ` +
368
+ `continue with read_lines {${treeArg(tree)}"block": ${block}, "start": ${shown + 1}, "end": ${wanted}}`);
369
+ }
370
+ const header = `block ${block} lines ${start}-${shown} (line number, tab, exact text):`;
371
+ return [header, ...out, ...(notes.length ? ["", `[${notes.join("; ")}]`] : [])].join("\n");
372
+ }
373
+ /**
374
+ * read_lines {"tail": true}: the messages after the tree that no tree covers
375
+ * yet, verbatim, by position in the conversation's newest record.
376
+ */
377
+ export function formatTail(body, tree) {
378
+ const page = body;
379
+ const messages = Array.isArray(page?.messages) ? page.messages : [];
380
+ if (!messages.length) {
381
+ return `No un-indexed messages in that range (the tail is messages ${page?.tail_start}-${page?.tail_end}).`;
382
+ }
383
+ const first = messages[0].i;
384
+ const last = messages[messages.length - 1].i;
385
+ const from = page.not_indexed_from;
386
+ const coverage = from === undefined || from === page.tail_start ? "no tree covers it yet"
387
+ : from === null ? "a newer tree of this conversation covers all of it (see later_trees)"
388
+ : `a newer tree covers it up to ${from - 1}; from ${from} on, no tree yet`;
389
+ const out = [
390
+ `After this tree: messages ${first}-${last} of the conversation's newest record ` +
391
+ `(the whole tail is ${page.tail_start}-${page.tail_end}; ${coverage}).`,
392
+ ];
393
+ for (const m of messages) {
394
+ const state = m.state === "in_newer_tree" ? " · in a newer tree" : "";
395
+ out.push("", `[${m.i}] ${m.k ?? "message"}${m.at ? ` · ${m.at}` : ""}${state}`, m.x ?? "");
396
+ }
397
+ const notes = [];
398
+ if (typeof page.tail_start === "number" && first > page.tail_start) {
399
+ notes.push(`earlier: read_lines {${treeArg(tree)}"tail": true, "end": ${first - 1}}`);
400
+ }
401
+ if (typeof page.tail_end === "number" && last < page.tail_end) {
402
+ notes.push(`later: read_lines {${treeArg(tree)}"tail": true, "start": ${last + 1}}`);
403
+ }
404
+ if (notes.length)
405
+ out.push("", `[${notes.join("; ")}]`);
406
+ return out.join("\n");
407
+ }
408
+ //# sourceMappingURL=memtree-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memtree-tools.js","sourceRoot":"","sources":["../src/memtree-tools.ts"],"names":[],"mappings":"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"}