@vetala/vetala 0.1.0-dev → 0.2.1-dev

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 (73) hide show
  1. package/README.md +31 -1
  2. package/dist/src/agent.d.ts +12 -1
  3. package/dist/src/agent.js +92 -14
  4. package/dist/src/agent.js.map +1 -1
  5. package/dist/src/app-meta.d.ts +3 -0
  6. package/dist/src/app-meta.js +4 -0
  7. package/dist/src/app-meta.js.map +1 -0
  8. package/dist/src/cli.js +28 -10
  9. package/dist/src/cli.js.map +1 -1
  10. package/dist/src/config.d.ts +10 -1
  11. package/dist/src/config.js +160 -67
  12. package/dist/src/config.js.map +1 -1
  13. package/dist/src/edit-history.d.ts +4 -0
  14. package/dist/src/edit-history.js +77 -0
  15. package/dist/src/edit-history.js.map +1 -0
  16. package/dist/src/edits/diff.d.ts +1 -0
  17. package/dist/src/edits/diff.js +176 -0
  18. package/dist/src/edits/diff.js.map +1 -0
  19. package/dist/src/ink/command-suggestions.js +1 -0
  20. package/dist/src/ink/command-suggestions.js.map +1 -1
  21. package/dist/src/ink/ink-terminal-ui.d.ts +2 -2
  22. package/dist/src/ink/ink-terminal-ui.js +7 -3
  23. package/dist/src/ink/ink-terminal-ui.js.map +1 -1
  24. package/dist/src/ink/repl-app.d.ts +3 -2
  25. package/dist/src/ink/repl-app.js +419 -111
  26. package/dist/src/ink/repl-app.js.map +1 -1
  27. package/dist/src/process-utils.d.ts +1 -0
  28. package/dist/src/process-utils.js +3 -1
  29. package/dist/src/process-utils.js.map +1 -1
  30. package/dist/src/providers/catalog.d.ts +29 -0
  31. package/dist/src/providers/catalog.js +121 -0
  32. package/dist/src/providers/catalog.js.map +1 -0
  33. package/dist/src/providers/index.d.ts +9 -0
  34. package/dist/src/providers/index.js +11 -0
  35. package/dist/src/providers/index.js.map +1 -0
  36. package/dist/src/providers/openai-compatible-client.d.ts +23 -0
  37. package/dist/src/providers/openai-compatible-client.js +183 -0
  38. package/dist/src/providers/openai-compatible-client.js.map +1 -0
  39. package/dist/src/repl.d.ts +2 -1
  40. package/dist/src/repl.js +1 -1
  41. package/dist/src/repl.js.map +1 -1
  42. package/dist/src/runtime-profile.d.ts +16 -0
  43. package/dist/src/runtime-profile.js +112 -0
  44. package/dist/src/runtime-profile.js.map +1 -0
  45. package/dist/src/search-provider.d.ts +6 -1
  46. package/dist/src/search-provider.js +257 -0
  47. package/dist/src/search-provider.js.map +1 -1
  48. package/dist/src/session-store.d.ts +5 -3
  49. package/dist/src/session-store.js +75 -4
  50. package/dist/src/session-store.js.map +1 -1
  51. package/dist/src/terminal-ui.d.ts +3 -1
  52. package/dist/src/terminal-ui.js +13 -3
  53. package/dist/src/terminal-ui.js.map +1 -1
  54. package/dist/src/tools/filesystem.js +141 -143
  55. package/dist/src/tools/filesystem.js.map +1 -1
  56. package/dist/src/tools/index.js +2 -0
  57. package/dist/src/tools/index.js.map +1 -1
  58. package/dist/src/tools/repo-search.d.ts +23 -0
  59. package/dist/src/tools/repo-search.js +221 -0
  60. package/dist/src/tools/repo-search.js.map +1 -0
  61. package/dist/src/tools/shell.js +26 -3
  62. package/dist/src/tools/shell.js.map +1 -1
  63. package/dist/src/tools/timing.d.ts +2 -0
  64. package/dist/src/tools/timing.js +58 -0
  65. package/dist/src/tools/timing.js.map +1 -0
  66. package/dist/src/tools/web.js +70 -5
  67. package/dist/src/tools/web.js.map +1 -1
  68. package/dist/src/types.d.ts +89 -17
  69. package/dist/src/update-notifier.d.ts +41 -0
  70. package/dist/src/update-notifier.js +145 -0
  71. package/dist/src/update-notifier.js.map +1 -0
  72. package/package.json +13 -2
  73. package/terminal.png +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible-client.js","sourceRoot":"","sources":["../../../src/providers/openai-compatible-client.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { SessionStore } from "./session-store.js";
2
2
  import { TerminalUI } from "./terminal-ui.js";
3
- import type { SessionState } from "./types.js";
3
+ import type { RuntimeHostProfile, SessionState } from "./types.js";
4
4
  interface ReplDependencies {
5
5
  ui: TerminalUI;
6
6
  store: SessionStore;
7
+ runtimeProfile: RuntimeHostProfile;
7
8
  }
8
9
  export declare function startRepl(initialSession: SessionState, dependencies: ReplDependencies): Promise<void>;
9
10
  export {};
package/dist/src/repl.js CHANGED
@@ -5,7 +5,7 @@ import { ReplApp } from "./ink/repl-app.js";
5
5
  export async function startRepl(initialSession, dependencies) {
6
6
  void dependencies.ui;
7
7
  const config = await loadConfig();
8
- const app = render(_jsx(ReplApp, { initialConfig: config, initialSession: initialSession, store: dependencies.store }), {
8
+ const app = render(_jsx(ReplApp, { initialConfig: config, initialSession: initialSession, runtimeProfile: dependencies.runtimeProfile, store: dependencies.store }), {
9
9
  exitOnCtrlC: false
10
10
  });
11
11
  await app.waitUntilExit();
@@ -1 +1 @@
1
- {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/repl.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAU5C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,cAA4B,EAAE,YAA8B;IAC1F,KAAK,YAAY,CAAC,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAChB,KAAC,OAAO,IACN,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,YAAY,CAAC,KAAK,GACzB,EACF;QACE,WAAW,EAAE,KAAK;KACnB,CACF,CAAC;IAEF,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/repl.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAW5C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,cAA4B,EAAE,YAA8B;IAC1F,KAAK,YAAY,CAAC,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,CAChB,KAAC,OAAO,IACN,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,YAAY,CAAC,cAAc,EAC3C,KAAK,EAAE,YAAY,CAAC,KAAK,GACzB,EACF;QACE,WAAW,EAAE,KAAK;KACnB,CACF,CAAC;IAEF,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { RuntimeHostProfile } from "./types.js";
2
+ interface RuntimeProfileOptions {
3
+ env?: NodeJS.ProcessEnv;
4
+ platform?: NodeJS.Platform;
5
+ arch?: string;
6
+ release?: string;
7
+ osVersion?: string;
8
+ stdinIsTTY?: boolean;
9
+ stdoutIsTTY?: boolean;
10
+ columns?: number | null;
11
+ rows?: number | null;
12
+ }
13
+ export declare function detectRuntimeHostProfile(options?: RuntimeProfileOptions): RuntimeHostProfile;
14
+ export declare function formatRuntimeHostSummary(profile: RuntimeHostProfile): string;
15
+ export declare function formatRuntimeTerminalSummary(profile: RuntimeHostProfile): string;
16
+ export {};
@@ -0,0 +1,112 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export function detectRuntimeHostProfile(options = {}) {
4
+ const env = options.env ?? process.env;
5
+ const platform = options.platform ?? process.platform;
6
+ const arch = options.arch ?? process.arch;
7
+ const release = options.release ?? os.release();
8
+ const osVersion = options.osVersion ?? safeOsVersion();
9
+ const shell = detectShell(env);
10
+ const terminalProgram = detectTerminalProgram(env);
11
+ const terminalType = env.TERM ?? "unknown";
12
+ const colorSupport = detectColorSupport(env, terminalType);
13
+ const stdinIsTTY = options.stdinIsTTY ?? Boolean(process.stdin.isTTY);
14
+ const stdoutIsTTY = options.stdoutIsTTY ?? Boolean(process.stdout.isTTY);
15
+ const columns = options.columns ?? process.stdout.columns ?? null;
16
+ const rows = options.rows ?? process.stdout.rows ?? null;
17
+ return {
18
+ platform,
19
+ arch,
20
+ release,
21
+ osVersion,
22
+ shell,
23
+ terminalProgram,
24
+ terminalType,
25
+ colorSupport,
26
+ stdinIsTTY,
27
+ stdoutIsTTY,
28
+ columns,
29
+ rows
30
+ };
31
+ }
32
+ export function formatRuntimeHostSummary(profile) {
33
+ return `${platformLabel(profile.platform)} ${profile.arch} (${profile.release})`;
34
+ }
35
+ export function formatRuntimeTerminalSummary(profile) {
36
+ const shellLabel = profile.shell;
37
+ const terminalLabel = profile.terminalProgram === "unknown"
38
+ ? profile.terminalType
39
+ : `${profile.terminalProgram} / ${profile.terminalType}`;
40
+ const sizeLabel = profile.stdoutIsTTY && profile.columns && profile.rows
41
+ ? `${profile.columns}x${profile.rows}`
42
+ : "non-interactive";
43
+ return `${shellLabel} · ${terminalLabel} · ${sizeLabel}`;
44
+ }
45
+ function detectShell(env) {
46
+ return path.basename(env.SHELL ?? env.COMSPEC ?? env.PWSH_EXE ?? "unknown");
47
+ }
48
+ function detectTerminalProgram(env) {
49
+ if (env.TERM_PROGRAM) {
50
+ return env.TERM_PROGRAM_VERSION
51
+ ? `${env.TERM_PROGRAM} ${env.TERM_PROGRAM_VERSION}`
52
+ : env.TERM_PROGRAM;
53
+ }
54
+ if (env.WT_SESSION) {
55
+ return "Windows Terminal";
56
+ }
57
+ if (env.KITTY_PID) {
58
+ return "kitty";
59
+ }
60
+ if (env.ALACRITTY_SOCKET || env.ALACRITTY_LOG) {
61
+ return "Alacritty";
62
+ }
63
+ if (env.KONSOLE_VERSION) {
64
+ return "Konsole";
65
+ }
66
+ if (env.GNOME_TERMINAL_SCREEN || env.VTE_VERSION) {
67
+ return "VTE terminal";
68
+ }
69
+ if (env.TMUX) {
70
+ return "tmux";
71
+ }
72
+ if (env.STY) {
73
+ return "screen";
74
+ }
75
+ if (env.TERMINAL_EMULATOR) {
76
+ return env.TERMINAL_EMULATOR;
77
+ }
78
+ return "unknown";
79
+ }
80
+ function detectColorSupport(env, terminalType) {
81
+ if (env.COLORTERM) {
82
+ return env.COLORTERM;
83
+ }
84
+ if (terminalType.includes("truecolor")) {
85
+ return "truecolor";
86
+ }
87
+ if (terminalType.includes("256color")) {
88
+ return "256color";
89
+ }
90
+ return "basic";
91
+ }
92
+ function platformLabel(platform) {
93
+ switch (platform) {
94
+ case "darwin":
95
+ return "macOS";
96
+ case "win32":
97
+ return "Windows";
98
+ case "linux":
99
+ return "Linux";
100
+ default:
101
+ return platform;
102
+ }
103
+ }
104
+ function safeOsVersion() {
105
+ try {
106
+ return os.version();
107
+ }
108
+ catch {
109
+ return os.release();
110
+ }
111
+ }
112
+ //# sourceMappingURL=runtime-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-profile.js","sourceRoot":"","sources":["../../src/runtime-profile.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,11 @@
1
- import type { SearchProvider, SearchResult } from "./types.js";
1
+ import type { SearchProvider, SearchProviderName, SearchResult } from "./types.js";
2
+ export declare const SEARCH_PROVIDER_NAMES: SearchProviderName[];
2
3
  export declare class DisabledSearchProvider implements SearchProvider {
3
4
  readonly name = "disabled";
4
5
  readonly configured = false;
5
6
  search(_query: string, _limit: number): Promise<SearchResult[]>;
6
7
  }
8
+ export declare function createSearchProvider(name: SearchProviderName): SearchProvider;
9
+ export declare function normalizeSearchProviderName(value: unknown): SearchProviderName | undefined;
10
+ export declare function extractDuckDuckGoResults(html: string, limit: number): SearchResult[];
11
+ export declare function extractStackOverflowResults(html: string, limit: number): SearchResult[];
@@ -1,3 +1,12 @@
1
+ const REQUEST_TIMEOUT_MS = 15_000;
2
+ const SEARCH_USER_AGENT = "vetala/0.1";
3
+ export const SEARCH_PROVIDER_NAMES = [
4
+ "disabled",
5
+ "duckduckgo",
6
+ "stack_overflow",
7
+ "brave",
8
+ "bing"
9
+ ];
1
10
  export class DisabledSearchProvider {
2
11
  name = "disabled";
3
12
  configured = false;
@@ -5,4 +14,252 @@ export class DisabledSearchProvider {
5
14
  throw new Error("web_search is disabled. Configure a search provider in the Vetala config to enable it.");
6
15
  }
7
16
  }
17
+ class HtmlSearchProvider {
18
+ name;
19
+ configured = true;
20
+ constructor(name) {
21
+ this.name = name;
22
+ }
23
+ async search(query, limit) {
24
+ const controller = new AbortController();
25
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
26
+ try {
27
+ const response = await fetch(this.buildUrl(query), {
28
+ method: "GET",
29
+ signal: controller.signal,
30
+ headers: {
31
+ "user-agent": SEARCH_USER_AGENT,
32
+ "accept-language": "en-US,en;q=0.8"
33
+ }
34
+ });
35
+ if (!response.ok) {
36
+ throw new Error(`${this.name} search failed: ${response.status} ${response.statusText}`);
37
+ }
38
+ const html = await response.text();
39
+ const results = this.parseResults(html, limit);
40
+ if (results.length === 0) {
41
+ throw new Error(`${this.name} search returned no parsable results.`);
42
+ }
43
+ return results.slice(0, limit);
44
+ }
45
+ finally {
46
+ clearTimeout(timeout);
47
+ }
48
+ }
49
+ }
50
+ class DuckDuckGoSearchProvider extends HtmlSearchProvider {
51
+ constructor() {
52
+ super("duckduckgo");
53
+ }
54
+ buildUrl(query) {
55
+ return `https://duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
56
+ }
57
+ parseResults(html, limit) {
58
+ return extractDuckDuckGoResults(html, limit);
59
+ }
60
+ }
61
+ class StackOverflowSearchProvider extends HtmlSearchProvider {
62
+ constructor() {
63
+ super("stack_overflow");
64
+ }
65
+ buildUrl(query) {
66
+ return `https://stackoverflow.com/search?q=${encodeURIComponent(query)}`;
67
+ }
68
+ parseResults(html, limit) {
69
+ return extractStackOverflowResults(html, limit);
70
+ }
71
+ }
72
+ class BraveSearchProvider extends HtmlSearchProvider {
73
+ constructor() {
74
+ super("brave");
75
+ }
76
+ buildUrl(query) {
77
+ return `https://search.brave.com/search?q=${encodeURIComponent(query)}&source=web`;
78
+ }
79
+ parseResults(html, limit) {
80
+ return extractGenericHtmlResults(html, limit, ["result-header", "heading"]);
81
+ }
82
+ }
83
+ class BingSearchProvider extends HtmlSearchProvider {
84
+ constructor() {
85
+ super("bing");
86
+ }
87
+ buildUrl(query) {
88
+ return `https://www.bing.com/search?q=${encodeURIComponent(query)}`;
89
+ }
90
+ parseResults(html, limit) {
91
+ return extractBingResults(html, limit);
92
+ }
93
+ }
94
+ export function createSearchProvider(name) {
95
+ switch (name) {
96
+ case "disabled":
97
+ return new DisabledSearchProvider();
98
+ case "duckduckgo":
99
+ return new DuckDuckGoSearchProvider();
100
+ case "stack_overflow":
101
+ return new StackOverflowSearchProvider();
102
+ case "brave":
103
+ return new BraveSearchProvider();
104
+ case "bing":
105
+ return new BingSearchProvider();
106
+ }
107
+ }
108
+ export function normalizeSearchProviderName(value) {
109
+ return typeof value === "string"
110
+ ? SEARCH_PROVIDER_NAMES.find((candidate) => candidate === value.trim().toLowerCase())
111
+ : undefined;
112
+ }
113
+ export function extractDuckDuckGoResults(html, limit) {
114
+ const results = [];
115
+ const anchorRe = /<a[^>]+class="[^"]*result__a[^"]*"[^>]+href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/gi;
116
+ let match;
117
+ while ((match = anchorRe.exec(html)) && results.length < limit) {
118
+ const anchorIndex = match.index + match[0].length;
119
+ const snippet = extractNearbySnippet(html, anchorIndex, /class="[^"]*result__snippet[^"]*"[^>]*>([\s\S]*?)</i);
120
+ const url = resolveDuckDuckGoHref(match[1] ?? "");
121
+ if (!url) {
122
+ continue;
123
+ }
124
+ pushResult(results, {
125
+ title: cleanText(match[2] ?? ""),
126
+ url,
127
+ snippet
128
+ });
129
+ }
130
+ return results;
131
+ }
132
+ export function extractStackOverflowResults(html, limit) {
133
+ const results = [];
134
+ const anchorRe = /<a[^>]+href="([^"]*\/questions\/[^"]+)"[^>]*class="[^"]*s-link[^"]*"[^>]*>([\s\S]*?)<\/a>/gi;
135
+ let match;
136
+ while ((match = anchorRe.exec(html)) && results.length < limit) {
137
+ const anchorIndex = match.index + match[0].length;
138
+ const snippet = extractNearbySnippet(html, anchorIndex, /class="[^"]*s-post-summary--content-excerpt[^"]*"[^>]*>([\s\S]*?)</i) || extractNearbySnippet(html, anchorIndex, /class="[^"]*excerpt[^"]*"[^>]*>([\s\S]*?)</i);
139
+ pushResult(results, {
140
+ title: cleanText(match[2] ?? ""),
141
+ url: absolutizeUrl("https://stackoverflow.com", match[1] ?? ""),
142
+ snippet
143
+ });
144
+ }
145
+ return results;
146
+ }
147
+ function extractBingResults(html, limit) {
148
+ const results = [];
149
+ const blockRe = /<li[^>]+class="[^"]*b_algo[^"]*"[^>]*>([\s\S]*?)<\/li>/gi;
150
+ let match;
151
+ while ((match = blockRe.exec(html)) && results.length < limit) {
152
+ const block = match[1] ?? "";
153
+ const anchor = block.match(/<a[^>]+href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/i);
154
+ const snippet = extractFirst(block, /<p[^>]*>([\s\S]*?)<\/p>/i);
155
+ if (!anchor) {
156
+ continue;
157
+ }
158
+ pushResult(results, {
159
+ title: cleanText(anchor[2] ?? ""),
160
+ url: anchor[1] ?? "",
161
+ snippet: cleanText(snippet)
162
+ });
163
+ }
164
+ return results;
165
+ }
166
+ function extractGenericHtmlResults(html, limit, classHints) {
167
+ const results = [];
168
+ const anchorRe = /<a([^>]+)>([\s\S]*?)<\/a>/gi;
169
+ let match;
170
+ while ((match = anchorRe.exec(html)) && results.length < limit) {
171
+ const attrs = match[1] ?? "";
172
+ const title = cleanText(match[2] ?? "");
173
+ const href = extractAttribute(attrs, "href");
174
+ const className = extractAttribute(attrs, "class");
175
+ if (!href || !title || href.startsWith("/") || href.startsWith("#")) {
176
+ continue;
177
+ }
178
+ if (!classHints.some((hint) => className.includes(hint))) {
179
+ continue;
180
+ }
181
+ const snippet = extractNearbySnippet(html, match.index + match[0].length, /<p[^>]*>([\s\S]*?)<\/p>/i);
182
+ pushResult(results, {
183
+ title,
184
+ url: href,
185
+ snippet
186
+ });
187
+ }
188
+ return results;
189
+ }
190
+ function resolveDuckDuckGoHref(rawHref) {
191
+ if (!rawHref) {
192
+ return null;
193
+ }
194
+ const href = rawHref.startsWith("//") ? `https:${rawHref}` : rawHref;
195
+ try {
196
+ const parsed = new URL(href, "https://duckduckgo.com");
197
+ if (parsed.hostname.includes("duckduckgo.com") && parsed.pathname === "/l/") {
198
+ return parsed.searchParams.get("uddg");
199
+ }
200
+ return parsed.toString();
201
+ }
202
+ catch {
203
+ return null;
204
+ }
205
+ }
206
+ function extractNearbySnippet(html, startIndex, pattern) {
207
+ const slice = html.slice(startIndex, startIndex + 1600);
208
+ return cleanText(extractFirst(slice, pattern));
209
+ }
210
+ function extractFirst(value, pattern) {
211
+ const match = value.match(pattern);
212
+ return match?.[1] ?? "";
213
+ }
214
+ function extractAttribute(attrs, name) {
215
+ const match = attrs.match(new RegExp(`${name}="([^"]*)"`, "i"));
216
+ return decodeHtmlEntities(match?.[1] ?? "");
217
+ }
218
+ function absolutizeUrl(origin, href) {
219
+ try {
220
+ return new URL(href, origin).toString();
221
+ }
222
+ catch {
223
+ return href;
224
+ }
225
+ }
226
+ function pushResult(target, result) {
227
+ if (!result.title || !result.url) {
228
+ return;
229
+ }
230
+ if (target.some((entry) => entry.url === result.url)) {
231
+ return;
232
+ }
233
+ target.push({
234
+ title: result.title,
235
+ url: result.url,
236
+ snippet: result.snippet || "(no snippet)"
237
+ });
238
+ }
239
+ function cleanText(value) {
240
+ return decodeHtmlEntities(value
241
+ .replace(/<script[\s\S]*?<\/script>/gi, "")
242
+ .replace(/<style[\s\S]*?<\/style>/gi, "")
243
+ .replace(/<[^>]+>/g, " ")
244
+ .replace(/\s+/g, " ")
245
+ .trim());
246
+ }
247
+ function decodeHtmlEntities(value) {
248
+ return value
249
+ .replace(/&amp;/g, "&")
250
+ .replace(/&quot;/g, "\"")
251
+ .replace(/&#39;/g, "'")
252
+ .replace(/&apos;/g, "'")
253
+ .replace(/&lt;/g, "<")
254
+ .replace(/&gt;/g, ">")
255
+ .replace(/&#x2F;/gi, "/")
256
+ .replace(/&#(\d+);/g, (_match, digits) => {
257
+ const code = Number(digits);
258
+ return Number.isNaN(code) ? "" : String.fromCodePoint(code);
259
+ })
260
+ .replace(/&#x([0-9a-f]+);/gi, (_match, hex) => {
261
+ const code = Number.parseInt(hex, 16);
262
+ return Number.isNaN(code) ? "" : String.fromCodePoint(code);
263
+ });
264
+ }
8
265
  //# sourceMappingURL=search-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-provider.js","sourceRoot":"","sources":["../../src/search-provider.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,sBAAsB;IACxB,IAAI,GAAG,UAAU,CAAC;IAClB,UAAU,GAAG,KAAK,CAAC;IAE5B,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,MAAc;QACzC,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC5G,CAAC;CACF"}
1
+ {"version":3,"file":"search-provider.js","sourceRoot":"","sources":["../../src/search-provider.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import type { ApprovalEvent, PersistedMessage, SessionListItem, SessionState } from "./types.js";
1
+ import type { ApprovalEvent, FileEdit, PersistedMessage, ProviderName, SessionListItem, SessionState } from "./types.js";
2
2
  export declare class SessionStore {
3
- createSession(workspaceRoot: string, model: string): Promise<SessionState>;
3
+ createSession(workspaceRoot: string, providerOrModel: ProviderName | string, maybeModel?: string): Promise<SessionState>;
4
4
  loadSession(sessionId: string): Promise<SessionState>;
5
5
  loadLatestForWorkspace(workspaceRoot: string): Promise<SessionState | null>;
6
6
  listSessions(): Promise<SessionListItem[]>;
@@ -8,7 +8,9 @@ export declare class SessionStore {
8
8
  appendApproval(session: SessionState, approval: ApprovalEvent): Promise<void>;
9
9
  appendReference(session: SessionState, targetPath: string): Promise<void>;
10
10
  appendReadFile(session: SessionState, targetPath: string): Promise<void>;
11
- updateModel(session: SessionState, model: string): Promise<void>;
11
+ updateModel(session: SessionState, providerOrModel: ProviderName | string, maybeModel?: string): Promise<void>;
12
+ appendEdit(session: SessionState, input: Omit<FileEdit, "id" | "timestamp" | "revertedAt">): Promise<FileEdit>;
13
+ markEditReverted(session: SessionState, editId: string): Promise<void>;
12
14
  pinSkill(session: SessionState, skillName: string): Promise<void>;
13
15
  unpinSkill(session: SessionState, skillName: string): Promise<void>;
14
16
  clearPinnedSkills(session: SessionState): Promise<void>;
@@ -8,13 +8,15 @@ const EMPTY_APPROVALS = {
8
8
  webAccess: false
9
9
  };
10
10
  export class SessionStore {
11
- async createSession(workspaceRoot, model) {
11
+ async createSession(workspaceRoot, providerOrModel, maybeModel) {
12
12
  const paths = await ensureAppPaths();
13
13
  const id = createSessionId();
14
14
  const createdAt = new Date().toISOString();
15
+ const { provider, model } = normalizeProviderAndModel(providerOrModel, maybeModel);
15
16
  const state = {
16
17
  id,
17
18
  workspaceRoot,
19
+ provider,
18
20
  model,
19
21
  createdAt,
20
22
  updatedAt: createdAt,
@@ -22,12 +24,14 @@ export class SessionStore {
22
24
  messages: [],
23
25
  referencedFiles: [],
24
26
  readFiles: [],
25
- pinnedSkills: []
27
+ pinnedSkills: [],
28
+ edits: []
26
29
  };
27
30
  const record = {
28
31
  type: "meta",
29
32
  id,
30
33
  workspaceRoot,
34
+ provider,
31
35
  model,
32
36
  createdAt
33
37
  };
@@ -48,6 +52,7 @@ export class SessionStore {
48
52
  state = {
49
53
  id: record.id,
50
54
  workspaceRoot: record.workspaceRoot,
55
+ provider: record.provider ?? "sarvam",
51
56
  model: record.model,
52
57
  createdAt: record.createdAt,
53
58
  updatedAt: record.createdAt,
@@ -55,7 +60,8 @@ export class SessionStore {
55
60
  messages: [],
56
61
  referencedFiles: [],
57
62
  readFiles: [],
58
- pinnedSkills: []
63
+ pinnedSkills: [],
64
+ edits: []
59
65
  };
60
66
  break;
61
67
  case "message":
@@ -87,6 +93,9 @@ export class SessionStore {
87
93
  break;
88
94
  case "model":
89
95
  ensureState(state, sessionId);
96
+ if (record.provider) {
97
+ state.provider = record.provider;
98
+ }
90
99
  state.model = record.model;
91
100
  state.updatedAt = record.timestamp;
92
101
  break;
@@ -95,6 +104,16 @@ export class SessionStore {
95
104
  applySkillRecord(state, record);
96
105
  state.updatedAt = record.timestamp;
97
106
  break;
107
+ case "edit":
108
+ ensureState(state, sessionId);
109
+ state.edits.push(record.edit);
110
+ state.updatedAt = record.edit.timestamp;
111
+ break;
112
+ case "edit_revert":
113
+ ensureState(state, sessionId);
114
+ markEditReverted(state, record.editId, record.timestamp);
115
+ state.updatedAt = record.timestamp;
116
+ break;
98
117
  default:
99
118
  exhaustive(record);
100
119
  }
@@ -131,6 +150,7 @@ export class SessionStore {
131
150
  .map((session) => ({
132
151
  id: session.id,
133
152
  workspaceRoot: session.workspaceRoot,
153
+ provider: session.provider,
134
154
  model: session.model,
135
155
  createdAt: session.createdAt,
136
156
  updatedAt: session.updatedAt
@@ -193,18 +213,51 @@ export class SessionStore {
193
213
  await appendFile(this.sessionPath(paths.sessionsDir, session.id), `${JSON.stringify(record)}\n`, "utf8");
194
214
  await this.updateLatestWorkspace(session.workspaceRoot, session.id);
195
215
  }
196
- async updateModel(session, model) {
216
+ async updateModel(session, providerOrModel, maybeModel) {
197
217
  const paths = await ensureAppPaths();
198
218
  const timestamp = new Date().toISOString();
219
+ const { provider, model } = normalizeProviderAndModel(providerOrModel, maybeModel, session.provider);
199
220
  const record = {
200
221
  type: "model",
222
+ provider,
201
223
  model,
202
224
  timestamp
203
225
  };
226
+ session.provider = provider;
204
227
  session.model = model;
205
228
  session.updatedAt = timestamp;
206
229
  await appendFile(this.sessionPath(paths.sessionsDir, session.id), `${JSON.stringify(record)}\n`, "utf8");
207
230
  }
231
+ async appendEdit(session, input) {
232
+ const paths = await ensureAppPaths();
233
+ const edit = {
234
+ ...input,
235
+ id: crypto.randomUUID(),
236
+ timestamp: new Date().toISOString()
237
+ };
238
+ const record = {
239
+ type: "edit",
240
+ edit
241
+ };
242
+ session.edits.push(edit);
243
+ session.updatedAt = edit.timestamp;
244
+ await appendFile(this.sessionPath(paths.sessionsDir, session.id), `${JSON.stringify(record)}\n`, "utf8");
245
+ await this.updateLatestWorkspace(session.workspaceRoot, session.id);
246
+ return edit;
247
+ }
248
+ async markEditReverted(session, editId) {
249
+ const paths = await ensureAppPaths();
250
+ const timestamp = new Date().toISOString();
251
+ const record = {
252
+ type: "edit_revert",
253
+ editId,
254
+ timestamp
255
+ };
256
+ markEditReverted(session, editId, timestamp);
257
+ session.updatedAt = timestamp;
258
+ await appendFile(this.sessionPath(paths.sessionsDir, session.id), `${JSON.stringify(record)}\n`, "utf8");
259
+ await this.updateLatestWorkspace(session.workspaceRoot, session.id);
260
+ }
208
261
  async pinSkill(session, skillName) {
209
262
  if (session.pinnedSkills.includes(skillName)) {
210
263
  return;
@@ -304,6 +357,18 @@ function applySkillRecord(state, record) {
304
357
  function createSessionId() {
305
358
  return crypto.randomUUID();
306
359
  }
360
+ function normalizeProviderAndModel(providerOrModel, maybeModel, fallbackProvider = "sarvam") {
361
+ if (maybeModel !== undefined) {
362
+ return {
363
+ provider: providerOrModel,
364
+ model: maybeModel
365
+ };
366
+ }
367
+ return {
368
+ provider: fallbackProvider,
369
+ model: providerOrModel
370
+ };
371
+ }
307
372
  function ensureState(state, sessionId) {
308
373
  if (!state) {
309
374
  throw new Error(`Session ${sessionId} is missing a meta record before other records.`);
@@ -312,6 +377,12 @@ function ensureState(state, sessionId) {
312
377
  function exhaustive(_) {
313
378
  throw new Error("Unexpected session record.");
314
379
  }
380
+ function markEditReverted(state, editId, timestamp) {
381
+ const edit = state.edits.find((candidate) => candidate.id === editId);
382
+ if (edit) {
383
+ edit.revertedAt = timestamp;
384
+ }
385
+ }
315
386
  function isMissingFile(error) {
316
387
  return error !== null && typeof error === "object" && "code" in error && error.code === "ENOENT";
317
388
  }