@quatcode/agent 0.1.2 → 0.2.1

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -0
  3. package/dist/args.d.ts +13 -1
  4. package/dist/args.d.ts.map +1 -1
  5. package/dist/args.js +25 -5
  6. package/dist/args.js.map +1 -1
  7. package/dist/cli.js +161 -98
  8. package/dist/cli.js.map +1 -1
  9. package/dist/clipboard.d.ts +5 -0
  10. package/dist/clipboard.d.ts.map +1 -0
  11. package/dist/clipboard.js +82 -0
  12. package/dist/clipboard.js.map +1 -0
  13. package/dist/gate.d.ts.map +1 -1
  14. package/dist/gate.js +1 -7
  15. package/dist/gate.js.map +1 -1
  16. package/dist/input.d.ts +61 -0
  17. package/dist/input.d.ts.map +1 -0
  18. package/dist/input.js +304 -0
  19. package/dist/input.js.map +1 -0
  20. package/dist/keyboard.d.ts +68 -0
  21. package/dist/keyboard.d.ts.map +1 -0
  22. package/dist/keyboard.js +390 -0
  23. package/dist/keyboard.js.map +1 -0
  24. package/dist/logo.d.ts +16 -0
  25. package/dist/logo.d.ts.map +1 -0
  26. package/dist/logo.js +131 -0
  27. package/dist/logo.js.map +1 -0
  28. package/dist/markdown.d.ts +14 -0
  29. package/dist/markdown.d.ts.map +1 -0
  30. package/dist/markdown.js +244 -0
  31. package/dist/markdown.js.map +1 -0
  32. package/dist/mcp.d.ts +19 -0
  33. package/dist/mcp.d.ts.map +1 -0
  34. package/dist/mcp.js +206 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/models.d.ts +44 -0
  37. package/dist/models.d.ts.map +1 -0
  38. package/dist/models.js +310 -0
  39. package/dist/models.js.map +1 -0
  40. package/dist/picker.d.ts +40 -0
  41. package/dist/picker.d.ts.map +1 -0
  42. package/dist/picker.js +171 -0
  43. package/dist/picker.js.map +1 -0
  44. package/dist/render.d.ts.map +1 -1
  45. package/dist/render.js +3 -1
  46. package/dist/render.js.map +1 -1
  47. package/dist/screen.d.ts +30 -0
  48. package/dist/screen.d.ts.map +1 -0
  49. package/dist/screen.js +123 -0
  50. package/dist/screen.js.map +1 -0
  51. package/dist/skills.d.ts +21 -0
  52. package/dist/skills.d.ts.map +1 -0
  53. package/dist/skills.js +173 -0
  54. package/dist/skills.js.map +1 -0
  55. package/dist/store.d.ts +41 -1
  56. package/dist/store.d.ts.map +1 -1
  57. package/dist/store.js +192 -1
  58. package/dist/store.js.map +1 -1
  59. package/dist/theme.d.ts +86 -0
  60. package/dist/theme.d.ts.map +1 -0
  61. package/dist/theme.js +315 -0
  62. package/dist/theme.js.map +1 -0
  63. package/dist/tui.d.ts +22 -0
  64. package/dist/tui.d.ts.map +1 -0
  65. package/dist/tui.js +2709 -0
  66. package/dist/tui.js.map +1 -0
  67. package/dist/turn.d.ts +45 -0
  68. package/dist/turn.d.ts.map +1 -0
  69. package/dist/turn.js +198 -0
  70. package/dist/turn.js.map +1 -0
  71. package/dist/version.d.ts +2 -0
  72. package/dist/version.d.ts.map +1 -0
  73. package/dist/version.js +13 -0
  74. package/dist/version.js.map +1 -0
  75. package/package.json +22 -6
package/dist/screen.js ADDED
@@ -0,0 +1,123 @@
1
+ import { clipAnsi, hexToRgb, palette, stringWidth } from "./theme.js";
2
+ function bgSequence() {
3
+ const [r, g, b] = hexToRgb(palette.void);
4
+ return `\u001b[48;2;${r};${g};${b}m`;
5
+ }
6
+ function oscBgSequence() {
7
+ const [r, g, b] = hexToRgb(palette.void);
8
+ const hex = (value) => value.toString(16).padStart(2, "0");
9
+ return `\u001b]11;rgb:${hex(r)}/${hex(g)}/${hex(b)}\u0007`;
10
+ }
11
+ const RESET_RE = /\u001b\[(?:0|22|23|24|39|49)m/g;
12
+ export function highlightRange(line, from, to) {
13
+ if (to < from)
14
+ return line;
15
+ let out = "";
16
+ let col = 0;
17
+ let started = false;
18
+ let i = 0;
19
+ while (i < line.length) {
20
+ if (line.startsWith("\u001b[", i)) {
21
+ const end = line.indexOf("m", i);
22
+ const seq = end === -1 ? line.slice(i) : line.slice(i, end + 1);
23
+ out += seq;
24
+ i += seq.length;
25
+ continue;
26
+ }
27
+ const cp = line.codePointAt(i);
28
+ if (cp === undefined)
29
+ break;
30
+ const ch = String.fromCodePoint(cp);
31
+ if (!started && col >= from) {
32
+ out += "\u001b[7m";
33
+ started = true;
34
+ }
35
+ if (started && col > to) {
36
+ out += "\u001b[27m";
37
+ started = false;
38
+ }
39
+ out += ch;
40
+ col += stringWidth(ch);
41
+ i += ch.length;
42
+ }
43
+ if (started)
44
+ out += "\u001b[27m";
45
+ return out;
46
+ }
47
+ export class Screen {
48
+ out;
49
+ active = false;
50
+ lastRows = 0;
51
+ lastColumns = 0;
52
+ constructor(out = process.stdout) {
53
+ this.out = out;
54
+ }
55
+ get columns() {
56
+ return Math.max(40, this.out.columns ?? 80);
57
+ }
58
+ get rows() {
59
+ return Math.max(10, this.out.rows ?? 24);
60
+ }
61
+ get width() {
62
+ return this.columns;
63
+ }
64
+ enter() {
65
+ if (this.active)
66
+ return;
67
+ this.active = true;
68
+ this.out.write(`\u001b[?1049h\u001b[2J\u001b[?25l\u001b[?1000h\u001b[?1003h\u001b[?1006h\u001b[>4;2m\u001b[>1u${oscBgSequence()}`);
69
+ }
70
+ exit() {
71
+ if (!this.active)
72
+ return;
73
+ this.active = false;
74
+ this.out.write("\u001b[<u\u001b[>4m\u001b]111\u0007\u001b[?1006l\u001b[?1003l\u001b[?1000l\u001b[?25h\u001b[?1049l");
75
+ }
76
+ applyBackground() {
77
+ if (!this.active)
78
+ return;
79
+ this.out.write(oscBgSequence());
80
+ }
81
+ render(frame) {
82
+ if (!this.active)
83
+ return;
84
+ const rows = this.rows;
85
+ const width = this.width;
86
+ const sizeChanged = rows !== this.lastRows || width !== this.lastColumns;
87
+ this.lastRows = rows;
88
+ this.lastColumns = width;
89
+ const bg = bgSequence();
90
+ const sync = Boolean(process.env.WT_SESSION);
91
+ let out = "\u001b[?25l";
92
+ if (sync)
93
+ out += "\u001b[?2026h";
94
+ out += "\u001b[H";
95
+ if (sizeChanged) {
96
+ out += "\u001b[2J";
97
+ out += oscBgSequence();
98
+ }
99
+ for (let i = 0; i < rows; i++) {
100
+ let line = clipAnsi(frame.lines[i] ?? "", width);
101
+ line += " ".repeat(Math.max(0, width - stringWidth(line)));
102
+ const selection = frame.selection;
103
+ if (selection && i >= selection.startRow && i <= selection.endRow) {
104
+ const from = i === selection.startRow ? selection.startCol : 0;
105
+ const to = i === selection.endRow ? selection.endCol : width - 1;
106
+ line = highlightRange(line, Math.max(0, from), Math.min(width - 1, to));
107
+ }
108
+ line = line.replace(RESET_RE, (match) => `${match}${bg}`);
109
+ out += `\u001b[2K${bg}${line}\u001b[49m`;
110
+ if (i < rows - 1)
111
+ out += "\r\n";
112
+ }
113
+ if (frame.cursor) {
114
+ const row = Math.max(1, Math.min(rows, frame.cursor.row + 1));
115
+ const col = Math.max(1, Math.min(width, frame.cursor.col + 1));
116
+ out += `\u001b[${row};${col}H\u001b[?25h`;
117
+ }
118
+ if (sync)
119
+ out += "\u001b[?2026l";
120
+ this.out.write(out);
121
+ }
122
+ }
123
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Tool } from "@quatcode/core";
2
+ export type Skill = {
3
+ name: string;
4
+ slug: string;
5
+ description: string;
6
+ path: string;
7
+ };
8
+ export declare function skillsRoot(): string;
9
+ export declare function slugify(name: string): string;
10
+ export declare function parseSkill(content: string, fallbackName?: string): {
11
+ name: string;
12
+ description: string;
13
+ };
14
+ export declare function listSkills(): Promise<Skill[]>;
15
+ export declare function saveSkill(name: string, content: string): Promise<Skill>;
16
+ export declare function importSkillFile(sourcePath: string): Promise<Skill>;
17
+ export declare function fetchSkillFromUrl(url: string): Promise<Skill>;
18
+ export declare function removeSkill(nameOrSlug: string): Promise<Skill | null>;
19
+ export declare function skillsSystemSection(skills: Skill[]): string;
20
+ export declare function createLoadSkillTool(): Tool;
21
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,gBAAgB,CAAC;AAGvD,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,YAAY,SAAK,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAmCvC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CA6BnD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAc7E;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAMxE;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAUnE;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAU3E;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAS3D;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAiC1C"}
package/dist/skills.js ADDED
@@ -0,0 +1,173 @@
1
+ import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { storeRoot } from "./store.js";
4
+ export function skillsRoot() {
5
+ return path.join(storeRoot(), "skills");
6
+ }
7
+ export function slugify(name) {
8
+ const slug = name
9
+ .trim()
10
+ .toLowerCase()
11
+ .replace(/[^\p{L}\p{N}]+/gu, "-")
12
+ .replace(/^-+|-+$/g, "")
13
+ .slice(0, 64);
14
+ return slug || "skill";
15
+ }
16
+ export function parseSkill(content, fallbackName = "") {
17
+ const clean = content.replace(/^\uFEFF/, "").replace(/\r\n?/g, "\n");
18
+ let frontmatterName = "";
19
+ let description = "";
20
+ let body = clean;
21
+ const frontmatter = /^---\n([\s\S]*?)\n---\n?/.exec(clean);
22
+ if (frontmatter) {
23
+ body = clean.slice(frontmatter[0].length);
24
+ for (const line of (frontmatter[1] ?? "").split("\n")) {
25
+ const match = /^([a-zA-Z_-]+)\s*:\s*(.+)$/.exec(line.trim());
26
+ if (!match)
27
+ continue;
28
+ const key = (match[1] ?? "").toLowerCase();
29
+ const value = (match[2] ?? "").trim().replace(/^["']|["']$/g, "");
30
+ if (key === "name" && value)
31
+ frontmatterName = value;
32
+ if (key === "description" && value)
33
+ description = value;
34
+ }
35
+ }
36
+ let headingName = "";
37
+ for (const line of body.split("\n")) {
38
+ const trimmed = line.trim();
39
+ if (!trimmed)
40
+ continue;
41
+ const heading = /^#\s+(.+)$/.exec(trimmed);
42
+ if (heading) {
43
+ if (!headingName)
44
+ headingName = (heading[1] ?? "").trim();
45
+ continue;
46
+ }
47
+ if (!description)
48
+ description = trimmed;
49
+ break;
50
+ }
51
+ if (description.length > 200)
52
+ description = `${description.slice(0, 197)}…`;
53
+ const name = frontmatterName || headingName || fallbackName;
54
+ return { name, description };
55
+ }
56
+ export async function listSkills() {
57
+ const root = skillsRoot();
58
+ let entries = [];
59
+ try {
60
+ entries = await readdir(root);
61
+ }
62
+ catch {
63
+ return [];
64
+ }
65
+ const skills = [];
66
+ for (const entry of entries) {
67
+ const dir = path.join(root, entry);
68
+ const file = path.join(dir, "SKILL.md");
69
+ try {
70
+ const info = await stat(file);
71
+ if (!info.isFile())
72
+ continue;
73
+ const content = await readFile(file, "utf8");
74
+ const parsed = parseSkill(content, entry);
75
+ skills.push({
76
+ name: parsed.name || entry,
77
+ slug: entry,
78
+ description: parsed.description,
79
+ path: file,
80
+ });
81
+ }
82
+ catch {
83
+ continue;
84
+ }
85
+ }
86
+ skills.sort((a, b) => a.name.localeCompare(b.name));
87
+ return skills;
88
+ }
89
+ export async function saveSkill(name, content) {
90
+ const slug = slugify(name);
91
+ const dir = path.join(skillsRoot(), slug);
92
+ await mkdir(dir, { recursive: true });
93
+ const file = path.join(dir, "SKILL.md");
94
+ const text = content.replace(/^\uFEFF/, "").replace(/\r\n?/g, "\n");
95
+ await writeFile(file, text.endsWith("\n") ? text : `${text}\n`, "utf8");
96
+ const parsed = parseSkill(text, name);
97
+ return {
98
+ name: parsed.name || name,
99
+ slug,
100
+ description: parsed.description,
101
+ path: file,
102
+ };
103
+ }
104
+ export async function importSkillFile(sourcePath) {
105
+ const resolved = path.resolve(sourcePath);
106
+ const content = await readFile(resolved, "utf8");
107
+ const base = path.basename(resolved).replace(/\.(md|markdown|txt)$/i, "");
108
+ const parsed = parseSkill(content, base);
109
+ return saveSkill(parsed.name || base, content);
110
+ }
111
+ export async function fetchSkillFromUrl(url) {
112
+ const res = await fetch(url, { signal: AbortSignal.timeout(15000) });
113
+ if (!res.ok)
114
+ throw new Error(`download failed: ${res.status} ${res.statusText}`);
115
+ const content = await res.text();
116
+ const base = decodeURIComponent(path.basename(new URL(url).pathname)).replace(/\.(md|markdown|txt)$/i, "");
117
+ const parsed = parseSkill(content, base);
118
+ return saveSkill(parsed.name || base || "skill", content);
119
+ }
120
+ export async function removeSkill(nameOrSlug) {
121
+ const skills = await listSkills();
122
+ const needle = nameOrSlug.trim().toLowerCase();
123
+ const target = skills.find((skill) => skill.slug === needle) ??
124
+ skills.find((skill) => skill.name.toLowerCase() === needle) ??
125
+ skills.find((skill) => skill.slug === slugify(nameOrSlug));
126
+ if (!target)
127
+ return null;
128
+ await rm(path.join(skillsRoot(), target.slug), { recursive: true, force: true });
129
+ return target;
130
+ }
131
+ export function skillsSystemSection(skills) {
132
+ if (skills.length === 0)
133
+ return "";
134
+ return [
135
+ "# skills",
136
+ "Reusable skills are available in this environment. When the user's task matches one of them, call the load_skill tool with the skill name to read its full instructions, then follow them.",
137
+ ...skills.map((skill) => `- ${skill.name}${skill.description ? ` — ${skill.description}` : ""}`),
138
+ ].join("\n");
139
+ }
140
+ export function createLoadSkillTool() {
141
+ return {
142
+ name: "load_skill",
143
+ description: "Load the full instructions of a skill by name. Call this when the current task matches a skill listed in the system prompt's skills section.",
144
+ inputSchema: {
145
+ type: "object",
146
+ properties: {
147
+ name: {
148
+ type: "string",
149
+ description: "Skill name exactly as listed in the skills section.",
150
+ },
151
+ },
152
+ required: ["name"],
153
+ },
154
+ async execute(input) {
155
+ const name = typeof input.name === "string" ? input.name.trim() : "";
156
+ if (!name)
157
+ return { content: "name is required", isError: true };
158
+ const skills = await listSkills();
159
+ const target = skills.find((skill) => skill.slug === slugify(name)) ??
160
+ skills.find((skill) => skill.name.toLowerCase() === name.toLowerCase());
161
+ if (!target) {
162
+ const available = skills.map((skill) => skill.name).join(", ");
163
+ return {
164
+ content: `Unknown skill: ${name}.${available ? ` Available skills: ${available}` : " No skills are installed."}`,
165
+ isError: true,
166
+ };
167
+ }
168
+ const content = await readFile(target.path, "utf8");
169
+ return { content };
170
+ },
171
+ };
172
+ }
173
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -1,9 +1,12 @@
1
- import type { AgentEvent, AgentStatus, Usage } from "@quatcode/core";
1
+ import type { AgentEvent, AgentStatus, ChatMessage, Usage } from "@quatcode/core";
2
+ import type { McpServerConfig } from "@quatcode/tools";
2
3
  export type SessionRecord = {
3
4
  id: string;
4
5
  createdAt: string;
5
6
  cwd: string;
6
7
  task: string;
8
+ title?: string;
9
+ pinned?: boolean;
7
10
  model: string;
8
11
  status: AgentStatus;
9
12
  steps: number;
@@ -13,11 +16,48 @@ export type SessionRecord = {
13
16
  text: string | null;
14
17
  error?: string;
15
18
  events: AgentEvent[];
19
+ conversationId?: string;
20
+ messages?: ChatMessage[];
21
+ };
22
+ export type CustomProviderConfig = {
23
+ label: string;
24
+ baseUrl: string;
25
+ envKey: string;
26
+ models: Array<{
27
+ id: string;
28
+ label?: string;
29
+ }>;
30
+ };
31
+ export type CliConfig = {
32
+ provider?: string;
33
+ model?: string;
34
+ effort?: string;
35
+ theme?: string;
36
+ keys?: Record<string, string>;
37
+ customProviders?: Record<string, CustomProviderConfig>;
38
+ mcp?: Record<string, McpServerConfig>;
39
+ updatedAt?: string;
16
40
  };
17
41
  export declare function storeRoot(): string;
18
42
  export declare function historyFile(): string;
43
+ export declare function configFile(): string;
44
+ export declare function loadConfig(): Promise<CliConfig>;
45
+ export declare function saveConfig(config: CliConfig): Promise<void>;
19
46
  export declare function makeSessionId(): string;
20
47
  export declare function saveSession(record: SessionRecord): Promise<void>;
48
+ export declare function deleteSession(id: string): Promise<boolean>;
49
+ export declare function updateConversation(key: string, patch: {
50
+ title?: string | null;
51
+ pinned?: boolean;
52
+ }): Promise<number>;
53
+ export declare function deleteConversation(key: string): Promise<number>;
21
54
  export declare function listSessions(limit?: number): Promise<SessionRecord[]>;
55
+ export declare function listSessionsForDir(dir: string, limit?: number): Promise<SessionRecord[]>;
22
56
  export declare function getSession(id: string): Promise<SessionRecord | null>;
57
+ export declare function conversationKey(record: SessionRecord): string;
58
+ export declare function sameDir(a: string | undefined, b: string | undefined): boolean;
59
+ export declare function latestPerConversation(records: SessionRecord[]): SessionRecord[];
60
+ export declare function sortConversations(records: SessionRecord[]): SessionRecord[];
61
+ export declare function displayTitle(record: SessionRecord): string;
62
+ export declare function messagesForStorage(messages: readonly ChatMessage[]): ChatMessage[];
23
63
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB,CAAC;AAEF,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED,wBAAsB,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAoBvE;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmB1E"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAOrD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA2BhE;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BrE;AAED,wBAAsB,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAoBvE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAG1F;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmB1E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE7D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAO7E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAU/E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAQ3E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAI1D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CAqBlF"}
package/dist/store.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { randomBytes } from "node:crypto";
2
- import { mkdir, readFile, appendFile } from "node:fs/promises";
2
+ import { mkdir, readFile, appendFile, writeFile } from "node:fs/promises";
3
3
  import { homedir } from "node:os";
4
4
  import path from "node:path";
5
5
  export function storeRoot() {
@@ -8,6 +8,24 @@ export function storeRoot() {
8
8
  export function historyFile() {
9
9
  return path.join(storeRoot(), "history", "sessions.jsonl");
10
10
  }
11
+ export function configFile() {
12
+ return path.join(storeRoot(), "config.json");
13
+ }
14
+ export async function loadConfig() {
15
+ try {
16
+ const raw = (await readFile(configFile(), "utf8")).replace(/^\uFEFF/, "");
17
+ return JSON.parse(raw);
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ }
23
+ export async function saveConfig(config) {
24
+ const file = configFile();
25
+ await mkdir(path.dirname(file), { recursive: true });
26
+ const payload = { ...config, updatedAt: new Date().toISOString() };
27
+ await writeFile(file, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
28
+ }
11
29
  export function makeSessionId() {
12
30
  const d = new Date();
13
31
  const pad = (n) => String(n).padStart(2, "0");
@@ -19,6 +37,115 @@ export async function saveSession(record) {
19
37
  await mkdir(path.dirname(file), { recursive: true });
20
38
  await appendFile(file, `${JSON.stringify(record)}\n`, "utf8");
21
39
  }
40
+ export async function deleteSession(id) {
41
+ const file = historyFile();
42
+ let raw = "";
43
+ try {
44
+ raw = await readFile(file, "utf8");
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ const kept = [];
50
+ let removed = false;
51
+ for (const line of raw.split("\n")) {
52
+ const trimmed = line.trim();
53
+ if (!trimmed)
54
+ continue;
55
+ try {
56
+ const record = JSON.parse(trimmed);
57
+ if (record.id === id) {
58
+ removed = true;
59
+ continue;
60
+ }
61
+ }
62
+ catch {
63
+ // keep corrupted lines untouched
64
+ }
65
+ kept.push(trimmed);
66
+ }
67
+ if (!removed)
68
+ return false;
69
+ await writeFile(file, kept.length > 0 ? `${kept.join("\n")}\n` : "", "utf8");
70
+ return true;
71
+ }
72
+ export async function updateConversation(key, patch) {
73
+ const file = historyFile();
74
+ let raw = "";
75
+ try {
76
+ raw = await readFile(file, "utf8");
77
+ }
78
+ catch {
79
+ return 0;
80
+ }
81
+ const kept = [];
82
+ let updated = 0;
83
+ for (const line of raw.split("\n")) {
84
+ const trimmed = line.trim();
85
+ if (!trimmed)
86
+ continue;
87
+ try {
88
+ const record = JSON.parse(trimmed);
89
+ if (conversationKey(record) === key) {
90
+ if (patch.title !== undefined) {
91
+ if (patch.title === null)
92
+ delete record.title;
93
+ else
94
+ record.title = patch.title;
95
+ }
96
+ if (patch.pinned !== undefined) {
97
+ if (patch.pinned)
98
+ record.pinned = true;
99
+ else
100
+ delete record.pinned;
101
+ }
102
+ kept.push(JSON.stringify(record));
103
+ updated += 1;
104
+ continue;
105
+ }
106
+ }
107
+ catch {
108
+ // keep corrupted lines untouched
109
+ }
110
+ kept.push(trimmed);
111
+ }
112
+ if (updated === 0)
113
+ return 0;
114
+ await writeFile(file, kept.length > 0 ? `${kept.join("\n")}\n` : "", "utf8");
115
+ return updated;
116
+ }
117
+ export async function deleteConversation(key) {
118
+ const file = historyFile();
119
+ let raw = "";
120
+ try {
121
+ raw = await readFile(file, "utf8");
122
+ }
123
+ catch {
124
+ return 0;
125
+ }
126
+ const kept = [];
127
+ let removed = 0;
128
+ for (const line of raw.split("\n")) {
129
+ const trimmed = line.trim();
130
+ if (!trimmed)
131
+ continue;
132
+ try {
133
+ const record = JSON.parse(trimmed);
134
+ if (conversationKey(record) === key) {
135
+ removed += 1;
136
+ continue;
137
+ }
138
+ }
139
+ catch {
140
+ // keep corrupted lines untouched
141
+ }
142
+ kept.push(trimmed);
143
+ }
144
+ if (removed === 0)
145
+ return 0;
146
+ await writeFile(file, kept.length > 0 ? `${kept.join("\n")}\n` : "", "utf8");
147
+ return removed;
148
+ }
22
149
  export async function listSessions(limit = 10) {
23
150
  const file = historyFile();
24
151
  let raw = "";
@@ -43,6 +170,10 @@ export async function listSessions(limit = 10) {
43
170
  records.reverse();
44
171
  return records.slice(0, limit);
45
172
  }
173
+ export async function listSessionsForDir(dir, limit = 40) {
174
+ const records = await listSessions(Number.MAX_SAFE_INTEGER);
175
+ return records.filter((record) => sameDir(record.cwd, dir)).slice(0, limit);
176
+ }
46
177
  export async function getSession(id) {
47
178
  const file = historyFile();
48
179
  let raw = "";
@@ -67,4 +198,64 @@ export async function getSession(id) {
67
198
  }
68
199
  return null;
69
200
  }
201
+ export function conversationKey(record) {
202
+ return record.conversationId ?? record.id;
203
+ }
204
+ export function sameDir(a, b) {
205
+ if (!a || !b)
206
+ return false;
207
+ const left = path.resolve(a);
208
+ const right = path.resolve(b);
209
+ return process.platform === "win32"
210
+ ? left.toLowerCase() === right.toLowerCase()
211
+ : left === right;
212
+ }
213
+ export function latestPerConversation(records) {
214
+ const seen = new Set();
215
+ const out = [];
216
+ for (const record of records) {
217
+ const key = conversationKey(record);
218
+ if (seen.has(key))
219
+ continue;
220
+ seen.add(key);
221
+ out.push(record);
222
+ }
223
+ return out;
224
+ }
225
+ export function sortConversations(records) {
226
+ const pinned = [];
227
+ const rest = [];
228
+ for (const record of records) {
229
+ if (record.pinned)
230
+ pinned.push(record);
231
+ else
232
+ rest.push(record);
233
+ }
234
+ return [...pinned, ...rest];
235
+ }
236
+ export function displayTitle(record) {
237
+ const title = record.title?.trim();
238
+ if (title)
239
+ return title;
240
+ return record.task.replace(/\s+/g, " ").trim() || "(untitled)";
241
+ }
242
+ export function messagesForStorage(messages) {
243
+ return messages.map((message) => {
244
+ if (message.role === "tool") {
245
+ const content = message.content.length > 4000
246
+ ? `${message.content.slice(0, 4000)}\n… [truncated in history]`
247
+ : message.content;
248
+ return { ...message, content, images: undefined };
249
+ }
250
+ if (message.role === "assistant") {
251
+ return {
252
+ ...message,
253
+ content: message.content.map((part) => part.type === "text" && part.text.length > 8000
254
+ ? { ...part, text: `${part.text.slice(0, 8000)}\n… [truncated in history]` }
255
+ : part),
256
+ };
257
+ }
258
+ return { ...message };
259
+ });
260
+ }
70
261
  //# sourceMappingURL=store.js.map
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}