@antaif3ng/til-work 0.1.0
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/README.md +573 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent.d.ts +78 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +372 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/compaction.d.ts +40 -0
- package/dist/core/compaction.d.ts.map +1 -0
- package/dist/core/compaction.js +228 -0
- package/dist/core/compaction.js.map +1 -0
- package/dist/core/config.d.ts +54 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +257 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/llm.d.ts +29 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +553 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/markdown.d.ts +20 -0
- package/dist/core/markdown.d.ts.map +1 -0
- package/dist/core/markdown.js +173 -0
- package/dist/core/markdown.js.map +1 -0
- package/dist/core/memory.d.ts +30 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +163 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/pricing.d.ts +21 -0
- package/dist/core/pricing.d.ts.map +1 -0
- package/dist/core/pricing.js +70 -0
- package/dist/core/pricing.js.map +1 -0
- package/dist/core/session-manager.d.ts +83 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +250 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/session.d.ts +76 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +270 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/skills.d.ts +49 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +232 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/system-prompt.d.ts +17 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +77 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/tool-permissions.d.ts +12 -0
- package/dist/core/tool-permissions.d.ts.map +1 -0
- package/dist/core/tool-permissions.js +71 -0
- package/dist/core/tool-permissions.js.map +1 -0
- package/dist/core/types.d.ts +157 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +21 -0
- package/dist/core/types.js.map +1 -0
- package/dist/extensions/builtin/mcp.d.ts +61 -0
- package/dist/extensions/builtin/mcp.d.ts.map +1 -0
- package/dist/extensions/builtin/mcp.js +407 -0
- package/dist/extensions/builtin/mcp.js.map +1 -0
- package/dist/extensions/index.d.ts +4 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +19 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +118 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/runner.d.ts +28 -0
- package/dist/extensions/runner.d.ts.map +1 -0
- package/dist/extensions/runner.js +77 -0
- package/dist/extensions/runner.js.map +1 -0
- package/dist/extensions/types.d.ts +84 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +6 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +5 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +355 -0
- package/dist/main.js.map +1 -0
- package/dist/modes/interactive.d.ts +6 -0
- package/dist/modes/interactive.d.ts.map +1 -0
- package/dist/modes/interactive.js +961 -0
- package/dist/modes/interactive.js.map +1 -0
- package/dist/modes/oneshot.d.ts +8 -0
- package/dist/modes/oneshot.d.ts.map +1 -0
- package/dist/modes/oneshot.js +71 -0
- package/dist/modes/oneshot.js.map +1 -0
- package/dist/tools/bash.d.ts +3 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +104 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +3 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +63 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/file-manager.d.ts +3 -0
- package/dist/tools/file-manager.d.ts.map +1 -0
- package/dist/tools/file-manager.js +85 -0
- package/dist/tools/file-manager.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +42 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read.d.ts +3 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +65 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/system-info.d.ts +3 -0
- package/dist/tools/system-info.d.ts.map +1 -0
- package/dist/tools/system-info.js +101 -0
- package/dist/tools/system-info.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +3 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +117 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +9 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +124 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +3 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +30 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/utils/autocomplete.d.ts +23 -0
- package/dist/utils/autocomplete.d.ts.map +1 -0
- package/dist/utils/autocomplete.js +191 -0
- package/dist/utils/autocomplete.js.map +1 -0
- package/dist/utils/file-processor.d.ts +19 -0
- package/dist/utils/file-processor.d.ts.map +1 -0
- package/dist/utils/file-processor.js +86 -0
- package/dist/utils/file-processor.js.map +1 -0
- package/dist/utils/path.d.ts +8 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +60 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/shell.d.ts +6 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +64 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/truncate.d.ts +12 -0
- package/dist/utils/truncate.d.ts.map +1 -0
- package/dist/utils/truncate.js +46 -0
- package/dist/utils/truncate.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Markdown renderer.
|
|
3
|
+
* Converts Markdown to ANSI-formatted terminal output with syntax highlighting.
|
|
4
|
+
* Inspired by pi-mono packages/tui/src/components/markdown.ts.
|
|
5
|
+
*/
|
|
6
|
+
import { marked } from "marked";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { createRequire } from "node:module";
|
|
9
|
+
const require = createRequire(import.meta.url);
|
|
10
|
+
const { highlight, supportsLanguage } = require("cli-highlight");
|
|
11
|
+
export class MarkdownRenderer {
|
|
12
|
+
width;
|
|
13
|
+
constructor(width) {
|
|
14
|
+
this.width = width ?? Math.min(process.stdout.columns || 80, 100);
|
|
15
|
+
}
|
|
16
|
+
render(text) {
|
|
17
|
+
const tokens = marked.lexer(text);
|
|
18
|
+
const lines = [];
|
|
19
|
+
for (const token of tokens) {
|
|
20
|
+
lines.push(...this.renderToken(token));
|
|
21
|
+
}
|
|
22
|
+
return lines.join("\n");
|
|
23
|
+
}
|
|
24
|
+
renderToken(token) {
|
|
25
|
+
switch (token.type) {
|
|
26
|
+
case "heading":
|
|
27
|
+
return this.renderHeading(token);
|
|
28
|
+
case "paragraph":
|
|
29
|
+
return this.renderParagraph(token);
|
|
30
|
+
case "code":
|
|
31
|
+
return this.renderCodeBlock(token);
|
|
32
|
+
case "blockquote":
|
|
33
|
+
return this.renderBlockquote(token);
|
|
34
|
+
case "list":
|
|
35
|
+
return this.renderList(token);
|
|
36
|
+
case "hr":
|
|
37
|
+
return [chalk.dim("─".repeat(Math.min(this.width, 40))), ""];
|
|
38
|
+
case "space":
|
|
39
|
+
return [""];
|
|
40
|
+
case "html":
|
|
41
|
+
return [this.inlineStyle(token.raw)];
|
|
42
|
+
default:
|
|
43
|
+
if ("text" in token && typeof token.text === "string") {
|
|
44
|
+
return this.wrapText(this.inlineStyle(token.text));
|
|
45
|
+
}
|
|
46
|
+
if ("raw" in token && typeof token.raw === "string") {
|
|
47
|
+
return [token.raw];
|
|
48
|
+
}
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
renderHeading(token) {
|
|
53
|
+
const prefix = token.depth <= 2
|
|
54
|
+
? chalk.bold.cyan
|
|
55
|
+
: chalk.bold;
|
|
56
|
+
const marker = "#".repeat(token.depth);
|
|
57
|
+
return [prefix(`${marker} ${this.inlineStyle(token.text)}`), ""];
|
|
58
|
+
}
|
|
59
|
+
renderParagraph(token) {
|
|
60
|
+
const styled = this.inlineStyle(token.text);
|
|
61
|
+
return [...this.wrapText(styled), ""];
|
|
62
|
+
}
|
|
63
|
+
renderCodeBlock(token) {
|
|
64
|
+
const lines = [];
|
|
65
|
+
const lang = token.lang || "";
|
|
66
|
+
const border = chalk.dim("│");
|
|
67
|
+
lines.push(chalk.dim(`┌─ ${lang || "code"} ${"─".repeat(Math.max(0, 30 - (lang || "code").length))}`));
|
|
68
|
+
let codeLines;
|
|
69
|
+
if (lang && supportsLanguage(lang)) {
|
|
70
|
+
try {
|
|
71
|
+
codeLines = highlight(token.text, {
|
|
72
|
+
language: lang,
|
|
73
|
+
ignoreIllegals: true,
|
|
74
|
+
}).split("\n");
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
codeLines = token.text.split("\n");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
codeLines = token.text.split("\n");
|
|
82
|
+
}
|
|
83
|
+
for (const codeLine of codeLines) {
|
|
84
|
+
lines.push(`${border} ${codeLine}`);
|
|
85
|
+
}
|
|
86
|
+
lines.push(chalk.dim("└" + "─".repeat(34)));
|
|
87
|
+
lines.push("");
|
|
88
|
+
return lines;
|
|
89
|
+
}
|
|
90
|
+
renderBlockquote(token) {
|
|
91
|
+
const lines = [];
|
|
92
|
+
for (const child of token.tokens) {
|
|
93
|
+
const childLines = this.renderToken(child);
|
|
94
|
+
for (const line of childLines) {
|
|
95
|
+
lines.push(`${chalk.dim("│")} ${chalk.italic(line)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
lines.push("");
|
|
99
|
+
return lines;
|
|
100
|
+
}
|
|
101
|
+
renderList(token) {
|
|
102
|
+
const lines = [];
|
|
103
|
+
let idx = 1;
|
|
104
|
+
for (const item of token.items) {
|
|
105
|
+
const bullet = token.ordered
|
|
106
|
+
? chalk.dim(`${idx++}.`)
|
|
107
|
+
: chalk.dim("•");
|
|
108
|
+
const itemText = item.tokens
|
|
109
|
+
.map((t) => this.renderToken(t).join("\n"))
|
|
110
|
+
.join("\n")
|
|
111
|
+
.trim();
|
|
112
|
+
const firstLine = ` ${bullet} ${itemText.split("\n")[0]}`;
|
|
113
|
+
lines.push(firstLine);
|
|
114
|
+
const rest = itemText.split("\n").slice(1);
|
|
115
|
+
for (const r of rest) {
|
|
116
|
+
lines.push(` ${r}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
lines.push("");
|
|
120
|
+
return lines;
|
|
121
|
+
}
|
|
122
|
+
inlineStyle(text) {
|
|
123
|
+
return text
|
|
124
|
+
// Bold
|
|
125
|
+
.replace(/\*\*(.+?)\*\*/g, (_, t) => chalk.bold(t))
|
|
126
|
+
.replace(/__(.+?)__/g, (_, t) => chalk.bold(t))
|
|
127
|
+
// Italic
|
|
128
|
+
.replace(/\*(.+?)\*/g, (_, t) => chalk.italic(t))
|
|
129
|
+
.replace(/_(.+?)_/g, (_, t) => chalk.italic(t))
|
|
130
|
+
// Strikethrough
|
|
131
|
+
.replace(/~~(.+?)~~/g, (_, t) => chalk.strikethrough(t))
|
|
132
|
+
// Inline code
|
|
133
|
+
.replace(/`([^`]+)`/g, (_, t) => chalk.cyan(t))
|
|
134
|
+
// Links
|
|
135
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_, label, url) => `${chalk.underline.blue(label)} ${chalk.dim(`(${url})`)}`)
|
|
136
|
+
// HTML entities
|
|
137
|
+
.replace(/</g, "<")
|
|
138
|
+
.replace(/>/g, ">")
|
|
139
|
+
.replace(/&/g, "&");
|
|
140
|
+
}
|
|
141
|
+
wrapText(text, maxWidth) {
|
|
142
|
+
const w = maxWidth ?? this.width;
|
|
143
|
+
if (stripAnsiLength(text) <= w)
|
|
144
|
+
return [text];
|
|
145
|
+
const words = text.split(" ");
|
|
146
|
+
const lines = [];
|
|
147
|
+
let current = "";
|
|
148
|
+
for (const word of words) {
|
|
149
|
+
const test = current ? `${current} ${word}` : word;
|
|
150
|
+
if (stripAnsiLength(test) > w && current) {
|
|
151
|
+
lines.push(current);
|
|
152
|
+
current = word;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
current = test;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (current)
|
|
159
|
+
lines.push(current);
|
|
160
|
+
return lines;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function stripAnsiLength(str) {
|
|
164
|
+
// eslint-disable-next-line no-control-regex
|
|
165
|
+
return str.replace(/\x1b\[[0-9;]*m/g, "").length;
|
|
166
|
+
}
|
|
167
|
+
let _renderer;
|
|
168
|
+
export function renderMarkdown(text) {
|
|
169
|
+
if (!_renderer)
|
|
170
|
+
_renderer = new MarkdownRenderer();
|
|
171
|
+
return _renderer.render(text);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/core/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory system for TIL.
|
|
3
|
+
*
|
|
4
|
+
* Two layers (matching pi-mono):
|
|
5
|
+
*
|
|
6
|
+
* 1. **MEMORY.md** — Working memory written by the LLM via write/edit tools.
|
|
7
|
+
* - ~/.til/MEMORY.md (global, shared across all projects)
|
|
8
|
+
* - .til/MEMORY.md (project-local)
|
|
9
|
+
* The LLM is instructed to persist useful context here; contents are
|
|
10
|
+
* re-read at the start of each prompt turn so updates take effect immediately.
|
|
11
|
+
*
|
|
12
|
+
* 2. **AGENTS.md** — Project context files (read-only from the LLM's perspective).
|
|
13
|
+
* Loaded from every ancestor directory between cwd and /, plus ~/.til/AGENTS.md.
|
|
14
|
+
* These contain project-specific instructions and conventions.
|
|
15
|
+
*/
|
|
16
|
+
export interface MemoryContent {
|
|
17
|
+
global?: string;
|
|
18
|
+
project?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function getConfigDir(): string;
|
|
21
|
+
export declare function loadMemory(cwd: string): MemoryContent;
|
|
22
|
+
export declare function formatMemoryForPrompt(memory: MemoryContent, cwd: string): string;
|
|
23
|
+
export declare function getMemoryDisplay(memory: MemoryContent, cwd: string): string | null;
|
|
24
|
+
export interface ContextFile {
|
|
25
|
+
path: string;
|
|
26
|
+
content: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function loadProjectContextFiles(cwd: string): ContextFile[];
|
|
29
|
+
export declare function formatContextFilesForPrompt(files: ContextFile[]): string;
|
|
30
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,MAAM,WAAW,aAAa;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAoBrD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAiDhF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAclF;AAQD,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAiBD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAwBlE;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAiBxE"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory system for TIL.
|
|
3
|
+
*
|
|
4
|
+
* Two layers (matching pi-mono):
|
|
5
|
+
*
|
|
6
|
+
* 1. **MEMORY.md** — Working memory written by the LLM via write/edit tools.
|
|
7
|
+
* - ~/.til/MEMORY.md (global, shared across all projects)
|
|
8
|
+
* - .til/MEMORY.md (project-local)
|
|
9
|
+
* The LLM is instructed to persist useful context here; contents are
|
|
10
|
+
* re-read at the start of each prompt turn so updates take effect immediately.
|
|
11
|
+
*
|
|
12
|
+
* 2. **AGENTS.md** — Project context files (read-only from the LLM's perspective).
|
|
13
|
+
* Loaded from every ancestor directory between cwd and /, plus ~/.til/AGENTS.md.
|
|
14
|
+
* These contain project-specific instructions and conventions.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
17
|
+
import { dirname, join, resolve } from "node:path";
|
|
18
|
+
import { homedir } from "node:os";
|
|
19
|
+
export function getConfigDir() {
|
|
20
|
+
return join(homedir(), ".til");
|
|
21
|
+
}
|
|
22
|
+
export function loadMemory(cwd) {
|
|
23
|
+
const result = {};
|
|
24
|
+
const globalPath = join(getConfigDir(), "MEMORY.md");
|
|
25
|
+
if (existsSync(globalPath)) {
|
|
26
|
+
try {
|
|
27
|
+
const content = readFileSync(globalPath, "utf-8").trim();
|
|
28
|
+
if (content)
|
|
29
|
+
result.global = content;
|
|
30
|
+
}
|
|
31
|
+
catch { /* unreadable */ }
|
|
32
|
+
}
|
|
33
|
+
const projectPath = join(cwd, ".til", "MEMORY.md");
|
|
34
|
+
if (existsSync(projectPath)) {
|
|
35
|
+
try {
|
|
36
|
+
const content = readFileSync(projectPath, "utf-8").trim();
|
|
37
|
+
if (content)
|
|
38
|
+
result.project = content;
|
|
39
|
+
}
|
|
40
|
+
catch { /* unreadable */ }
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
export function formatMemoryForPrompt(memory, cwd) {
|
|
45
|
+
const globalPath = join(getConfigDir(), "MEMORY.md");
|
|
46
|
+
const projectPath = join(cwd, ".til", "MEMORY.md");
|
|
47
|
+
const parts = [];
|
|
48
|
+
parts.push("## Memory");
|
|
49
|
+
parts.push("");
|
|
50
|
+
parts.push("You MUST proactively use the write tool to persist important context to MEMORY.md files.");
|
|
51
|
+
parts.push("Do NOT wait for the user to ask — save memory automatically whenever you learn something worth remembering.");
|
|
52
|
+
parts.push("");
|
|
53
|
+
parts.push("### When to save memory");
|
|
54
|
+
parts.push("");
|
|
55
|
+
parts.push("- User states a preference (language, style, conventions, habits)");
|
|
56
|
+
parts.push("- You discover project structure, tech stack, or architecture details");
|
|
57
|
+
parts.push("- A decision is made about how to approach a problem");
|
|
58
|
+
parts.push("- You complete a significant task and there are notes for future reference");
|
|
59
|
+
parts.push("- The user explicitly asks you to remember something");
|
|
60
|
+
parts.push("- You encounter an error and find the fix (save the pattern for next time)");
|
|
61
|
+
parts.push("");
|
|
62
|
+
parts.push("### Memory files");
|
|
63
|
+
parts.push("");
|
|
64
|
+
parts.push(`- **Global** (${globalPath}): user preferences, recurring patterns, learned skills — shared across all projects`);
|
|
65
|
+
parts.push(`- **Project** (${projectPath}): project-specific decisions, architecture notes, ongoing work, tech stack`);
|
|
66
|
+
parts.push("");
|
|
67
|
+
parts.push("When writing memory, use the write tool. Append to existing content (read first if the file exists), using markdown with clear section headers.");
|
|
68
|
+
parts.push("Keep entries concise — use bullet points, not full sentences.");
|
|
69
|
+
parts.push("");
|
|
70
|
+
if (memory.global || memory.project) {
|
|
71
|
+
parts.push("### Current Memory");
|
|
72
|
+
parts.push("");
|
|
73
|
+
if (memory.global) {
|
|
74
|
+
parts.push(`**Global memory** (${globalPath}):`);
|
|
75
|
+
parts.push(memory.global);
|
|
76
|
+
parts.push("");
|
|
77
|
+
}
|
|
78
|
+
if (memory.project) {
|
|
79
|
+
parts.push(`**Project memory** (${projectPath}):`);
|
|
80
|
+
parts.push(memory.project);
|
|
81
|
+
parts.push("");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
parts.push("### Current Memory");
|
|
86
|
+
parts.push("");
|
|
87
|
+
parts.push("_(no memory yet — start saving important context as you learn it!)_");
|
|
88
|
+
parts.push("");
|
|
89
|
+
}
|
|
90
|
+
return parts.join("\n");
|
|
91
|
+
}
|
|
92
|
+
export function getMemoryDisplay(memory, cwd) {
|
|
93
|
+
const parts = [];
|
|
94
|
+
if (memory.global) {
|
|
95
|
+
parts.push(chalk_free_header("全局记忆", join(getConfigDir(), "MEMORY.md")));
|
|
96
|
+
parts.push(memory.global);
|
|
97
|
+
}
|
|
98
|
+
if (memory.project) {
|
|
99
|
+
if (parts.length > 0)
|
|
100
|
+
parts.push("");
|
|
101
|
+
parts.push(chalk_free_header("项目记忆", join(cwd, ".til", "MEMORY.md")));
|
|
102
|
+
parts.push(memory.project);
|
|
103
|
+
}
|
|
104
|
+
return parts.length > 0 ? parts.join("\n") : null;
|
|
105
|
+
}
|
|
106
|
+
function chalk_free_header(label, path) {
|
|
107
|
+
return `── ${label} (${path}) ──`;
|
|
108
|
+
}
|
|
109
|
+
const CONTEXT_FILE_NAMES = ["AGENTS.md", "CLAUDE.md"];
|
|
110
|
+
function loadContextFileFromDir(dir) {
|
|
111
|
+
for (const filename of CONTEXT_FILE_NAMES) {
|
|
112
|
+
const filePath = join(dir, filename);
|
|
113
|
+
if (existsSync(filePath)) {
|
|
114
|
+
try {
|
|
115
|
+
const content = readFileSync(filePath, "utf-8").trim();
|
|
116
|
+
if (content)
|
|
117
|
+
return { path: filePath, content };
|
|
118
|
+
}
|
|
119
|
+
catch { /* unreadable */ }
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
export function loadProjectContextFiles(cwd) {
|
|
125
|
+
const contextFiles = [];
|
|
126
|
+
// Global: ~/.til/AGENTS.md
|
|
127
|
+
const globalContext = loadContextFileFromDir(getConfigDir());
|
|
128
|
+
if (globalContext)
|
|
129
|
+
contextFiles.push(globalContext);
|
|
130
|
+
// Walk ancestors from cwd to /
|
|
131
|
+
const seen = new Set();
|
|
132
|
+
let currentDir = resolve(cwd);
|
|
133
|
+
while (true) {
|
|
134
|
+
if (seen.has(currentDir))
|
|
135
|
+
break;
|
|
136
|
+
seen.add(currentDir);
|
|
137
|
+
const contextFile = loadContextFileFromDir(currentDir);
|
|
138
|
+
if (contextFile)
|
|
139
|
+
contextFiles.push(contextFile);
|
|
140
|
+
const parentDir = dirname(currentDir);
|
|
141
|
+
if (parentDir === currentDir)
|
|
142
|
+
break;
|
|
143
|
+
currentDir = parentDir;
|
|
144
|
+
}
|
|
145
|
+
return contextFiles;
|
|
146
|
+
}
|
|
147
|
+
export function formatContextFilesForPrompt(files) {
|
|
148
|
+
if (files.length === 0)
|
|
149
|
+
return "";
|
|
150
|
+
const parts = [];
|
|
151
|
+
parts.push("## Project Context");
|
|
152
|
+
parts.push("");
|
|
153
|
+
parts.push("Project-specific instructions and guidelines:");
|
|
154
|
+
parts.push("");
|
|
155
|
+
for (const { path, content } of files) {
|
|
156
|
+
parts.push(`### ${path}`);
|
|
157
|
+
parts.push("");
|
|
158
|
+
parts.push(content);
|
|
159
|
+
parts.push("");
|
|
160
|
+
}
|
|
161
|
+
return parts.join("\n");
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/core/memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AASlC,MAAM,UAAU,YAAY;IAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACrC,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,OAAO;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAqB,EAAE,GAAW;IACvE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0FAA0F,CAAC,CAAC;IACvG,KAAK,CAAC,IAAI,CAAC,6GAA6G,CAAC,CAAC;IAC1H,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACpF,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,sFAAsF,CAAC,CAAC;IAC9H,KAAK,CAAC,IAAI,CAAC,kBAAkB,WAAW,6EAA6E,CAAC,CAAC;IACvH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iJAAiJ,CAAC,CAAC;IAC9J,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,sBAAsB,UAAU,IAAI,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,uBAAuB,WAAW,IAAI,CAAC,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;IACF,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAqB,EAAE,GAAW;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,IAAY;IACrD,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC;AACnC,CAAC;AASD,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAEtD,SAAS,sBAAsB,CAAC,GAAW;IAC1C,KAAK,MAAM,QAAQ,IAAI,kBAAkB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACvD,IAAI,OAAO;oBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YACjD,CAAC;YAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IAClD,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,2BAA2B;IAC3B,MAAM,aAAa,GAAG,sBAAsB,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7D,IAAI,aAAa;QAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAEpD,+BAA+B;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9B,OAAO,IAAI,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,MAAM;QAChC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAErB,MAAM,WAAW,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;QACvD,IAAI,WAAW;YAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,SAAS,KAAK,UAAU;YAAE,MAAM;QACpC,UAAU,GAAG,SAAS,CAAC;IACxB,CAAC;IAED,OAAO,YAAY,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAoB;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model pricing and usage formatting.
|
|
3
|
+
* Prices are in USD per million tokens.
|
|
4
|
+
*/
|
|
5
|
+
import type { Usage } from "./types.js";
|
|
6
|
+
export interface ModelPricing {
|
|
7
|
+
input: number;
|
|
8
|
+
output: number;
|
|
9
|
+
cacheRead: number;
|
|
10
|
+
cacheWrite: number;
|
|
11
|
+
}
|
|
12
|
+
export declare const MODEL_PRICING: Record<string, ModelPricing>;
|
|
13
|
+
export declare function calculateCost(modelId: string, usage: Usage): Usage["cost"];
|
|
14
|
+
export declare function formatTokenCount(n: number): string;
|
|
15
|
+
export declare function formatCost(cost: number): string;
|
|
16
|
+
export declare function formatUsage(usage: Usage, _modelId?: string): string;
|
|
17
|
+
export declare function formatContextPercent(contextTokens: number, contextWindow: number): {
|
|
18
|
+
percent: number;
|
|
19
|
+
display: string;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/core/pricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB;AAGD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAYtD,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAe1E;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CASnE;AAED,wBAAgB,oBAAoB,CACnC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACnB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAItC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model pricing and usage formatting.
|
|
3
|
+
* Prices are in USD per million tokens.
|
|
4
|
+
*/
|
|
5
|
+
// Prices in $/million tokens
|
|
6
|
+
export const MODEL_PRICING = {
|
|
7
|
+
"claude-sonnet-4-20250514": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
|
|
8
|
+
"claude-opus-4-20250514": { input: 15, output: 75, cacheRead: 1.5, cacheWrite: 18.75 },
|
|
9
|
+
"claude-3-5-sonnet-20241022": { input: 3, output: 15, cacheRead: 0.3, cacheWrite: 3.75 },
|
|
10
|
+
"gpt-4o": { input: 2.5, output: 10, cacheRead: 1.25, cacheWrite: 2.5 },
|
|
11
|
+
"gpt-4o-mini": { input: 0.15, output: 0.6, cacheRead: 0.075, cacheWrite: 0.15 },
|
|
12
|
+
"o3-mini": { input: 1.1, output: 4.4, cacheRead: 0.55, cacheWrite: 1.1 },
|
|
13
|
+
"gemini-2.0-flash": { input: 0.1, output: 0.4, cacheRead: 0.025, cacheWrite: 0.1 },
|
|
14
|
+
"gemini-2.5-pro-preview-06-05": { input: 1.25, output: 10, cacheRead: 0.3125, cacheWrite: 1.25 },
|
|
15
|
+
// GLM series (BigModel.cn)
|
|
16
|
+
"glm-4-plus": { input: 0.7, output: 0.7, cacheRead: 0, cacheWrite: 0 },
|
|
17
|
+
"glm-5": { input: 0.7, output: 0.7, cacheRead: 0, cacheWrite: 0 },
|
|
18
|
+
};
|
|
19
|
+
export function calculateCost(modelId, usage) {
|
|
20
|
+
const pricing = MODEL_PRICING[modelId];
|
|
21
|
+
if (!pricing) {
|
|
22
|
+
return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 };
|
|
23
|
+
}
|
|
24
|
+
const cost = {
|
|
25
|
+
input: (pricing.input / 1_000_000) * usage.input,
|
|
26
|
+
output: (pricing.output / 1_000_000) * usage.output,
|
|
27
|
+
cacheRead: (pricing.cacheRead / 1_000_000) * usage.cacheRead,
|
|
28
|
+
cacheWrite: (pricing.cacheWrite / 1_000_000) * usage.cacheWrite,
|
|
29
|
+
total: 0,
|
|
30
|
+
};
|
|
31
|
+
cost.total = cost.input + cost.output + cost.cacheRead + cost.cacheWrite;
|
|
32
|
+
return cost;
|
|
33
|
+
}
|
|
34
|
+
export function formatTokenCount(n) {
|
|
35
|
+
if (n < 1000)
|
|
36
|
+
return String(n);
|
|
37
|
+
if (n < 10_000)
|
|
38
|
+
return `${(n / 1000).toFixed(1)}k`;
|
|
39
|
+
if (n < 1_000_000)
|
|
40
|
+
return `${Math.round(n / 1000)}k`;
|
|
41
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
42
|
+
}
|
|
43
|
+
export function formatCost(cost) {
|
|
44
|
+
if (cost < 0.001)
|
|
45
|
+
return "$0.00";
|
|
46
|
+
if (cost < 0.01)
|
|
47
|
+
return `$${cost.toFixed(4)}`;
|
|
48
|
+
if (cost < 1)
|
|
49
|
+
return `$${cost.toFixed(3)}`;
|
|
50
|
+
return `$${cost.toFixed(2)}`;
|
|
51
|
+
}
|
|
52
|
+
export function formatUsage(usage, _modelId) {
|
|
53
|
+
const parts = [];
|
|
54
|
+
if (usage.input)
|
|
55
|
+
parts.push(`in:${formatTokenCount(usage.input)}`);
|
|
56
|
+
if (usage.output)
|
|
57
|
+
parts.push(`out:${formatTokenCount(usage.output)}`);
|
|
58
|
+
if (usage.cacheRead)
|
|
59
|
+
parts.push(`cache_r:${formatTokenCount(usage.cacheRead)}`);
|
|
60
|
+
if (usage.cacheWrite)
|
|
61
|
+
parts.push(`cache_w:${formatTokenCount(usage.cacheWrite)}`);
|
|
62
|
+
return parts.join(" ");
|
|
63
|
+
}
|
|
64
|
+
export function formatContextPercent(contextTokens, contextWindow) {
|
|
65
|
+
if (!contextWindow)
|
|
66
|
+
return { percent: 0, display: "?" };
|
|
67
|
+
const percent = Math.round((contextTokens / contextWindow) * 100);
|
|
68
|
+
return { percent, display: `${percent}%` };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/core/pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session persistence manager.
|
|
3
|
+
* Stores conversations as append-only JSONL files (matching pi-mono pattern).
|
|
4
|
+
*
|
|
5
|
+
* File layout:
|
|
6
|
+
* ~/.til/sessions/--<encoded-cwd>--/<timestamp>_<sessionId>.jsonl
|
|
7
|
+
*
|
|
8
|
+
* Each line is one of:
|
|
9
|
+
* { type: "session", id, timestamp, cwd, model } — header (first line)
|
|
10
|
+
* { type: "message", id, message } — user/assistant/toolResult
|
|
11
|
+
* { type: "model_change", from, to, timestamp } — model switch event
|
|
12
|
+
*/
|
|
13
|
+
import type { Message } from "./types.js";
|
|
14
|
+
export interface SessionHeader {
|
|
15
|
+
type: "session";
|
|
16
|
+
id: string;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
cwd: string;
|
|
19
|
+
model: string;
|
|
20
|
+
}
|
|
21
|
+
export interface SessionMessageEntry {
|
|
22
|
+
type: "message";
|
|
23
|
+
id: string;
|
|
24
|
+
message: Message;
|
|
25
|
+
}
|
|
26
|
+
export interface SessionModelChange {
|
|
27
|
+
type: "model_change";
|
|
28
|
+
from: string;
|
|
29
|
+
to: string;
|
|
30
|
+
timestamp: string;
|
|
31
|
+
}
|
|
32
|
+
export type SessionEntry = SessionHeader | SessionMessageEntry | SessionModelChange;
|
|
33
|
+
export interface SessionInfo {
|
|
34
|
+
id: string;
|
|
35
|
+
shortId: string;
|
|
36
|
+
filePath: string;
|
|
37
|
+
timestamp: string;
|
|
38
|
+
cwd: string;
|
|
39
|
+
model: string;
|
|
40
|
+
messageCount: number;
|
|
41
|
+
mtime: Date;
|
|
42
|
+
}
|
|
43
|
+
export declare class SessionManager {
|
|
44
|
+
private _sessionId;
|
|
45
|
+
private _filePath;
|
|
46
|
+
private _cwd;
|
|
47
|
+
private _isResumed;
|
|
48
|
+
private _restoredMessageCount;
|
|
49
|
+
private constructor();
|
|
50
|
+
get sessionId(): string;
|
|
51
|
+
get shortId(): string;
|
|
52
|
+
get filePath(): string;
|
|
53
|
+
get cwd(): string;
|
|
54
|
+
get isResumed(): boolean;
|
|
55
|
+
get restoredMessageCount(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Create a new session and write the header.
|
|
58
|
+
*/
|
|
59
|
+
static create(cwd: string, modelId: string): SessionManager;
|
|
60
|
+
/**
|
|
61
|
+
* Continue the most recent session for the given cwd.
|
|
62
|
+
* Returns null if no sessions exist.
|
|
63
|
+
*/
|
|
64
|
+
static continueRecent(cwd: string): SessionManager | null;
|
|
65
|
+
/**
|
|
66
|
+
* Open a session by short ID (or full UUID prefix).
|
|
67
|
+
* Searches both cwd-specific dir and all session dirs.
|
|
68
|
+
*/
|
|
69
|
+
static open(idPrefix: string, cwd: string): SessionManager | null;
|
|
70
|
+
/**
|
|
71
|
+
* List sessions for the given cwd (most recent first).
|
|
72
|
+
*/
|
|
73
|
+
static list(cwd: string): SessionInfo[];
|
|
74
|
+
/**
|
|
75
|
+
* Load from a specific JSONL file.
|
|
76
|
+
*/
|
|
77
|
+
private static loadFromFile;
|
|
78
|
+
appendMessage(message: Message): void;
|
|
79
|
+
appendModelChange(from: string, to: string): void;
|
|
80
|
+
loadMessages(): Message[];
|
|
81
|
+
loadHeader(): SessionHeader | null;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAIpF,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,IAAI,CAAC;CACZ;AA8BD,qBAAa,cAAc;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,qBAAqB,CAAS;IAEtC,OAAO;IAcP,IAAI,SAAS,IAAI,MAAM,CAA4B;IACnD,IAAI,OAAO,IAAI,MAAM,CAAwC;IAC7D,IAAI,QAAQ,IAAI,MAAM,CAA2B;IACjD,IAAI,GAAG,IAAI,MAAM,CAAsB;IACvC,IAAI,SAAS,IAAI,OAAO,CAA4B;IACpD,IAAI,oBAAoB,IAAI,MAAM,CAAuC;IAEzE;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc;IAkB3D;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAOzD;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IASjE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE;IAIvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAa3B,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IASrC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAYjD,YAAY,IAAI,OAAO,EAAE;IAOzB,UAAU,IAAI,aAAa,GAAG,IAAI;CAIlC"}
|