@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.
- package/README.md +31 -1
- package/dist/src/agent.d.ts +12 -1
- package/dist/src/agent.js +92 -14
- package/dist/src/agent.js.map +1 -1
- package/dist/src/app-meta.d.ts +3 -0
- package/dist/src/app-meta.js +4 -0
- package/dist/src/app-meta.js.map +1 -0
- package/dist/src/cli.js +28 -10
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +10 -1
- package/dist/src/config.js +160 -67
- package/dist/src/config.js.map +1 -1
- package/dist/src/edit-history.d.ts +4 -0
- package/dist/src/edit-history.js +77 -0
- package/dist/src/edit-history.js.map +1 -0
- package/dist/src/edits/diff.d.ts +1 -0
- package/dist/src/edits/diff.js +176 -0
- package/dist/src/edits/diff.js.map +1 -0
- package/dist/src/ink/command-suggestions.js +1 -0
- package/dist/src/ink/command-suggestions.js.map +1 -1
- package/dist/src/ink/ink-terminal-ui.d.ts +2 -2
- package/dist/src/ink/ink-terminal-ui.js +7 -3
- package/dist/src/ink/ink-terminal-ui.js.map +1 -1
- package/dist/src/ink/repl-app.d.ts +3 -2
- package/dist/src/ink/repl-app.js +419 -111
- package/dist/src/ink/repl-app.js.map +1 -1
- package/dist/src/process-utils.d.ts +1 -0
- package/dist/src/process-utils.js +3 -1
- package/dist/src/process-utils.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +29 -0
- package/dist/src/providers/catalog.js +121 -0
- package/dist/src/providers/catalog.js.map +1 -0
- package/dist/src/providers/index.d.ts +9 -0
- package/dist/src/providers/index.js +11 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/providers/openai-compatible-client.d.ts +23 -0
- package/dist/src/providers/openai-compatible-client.js +183 -0
- package/dist/src/providers/openai-compatible-client.js.map +1 -0
- package/dist/src/repl.d.ts +2 -1
- package/dist/src/repl.js +1 -1
- package/dist/src/repl.js.map +1 -1
- package/dist/src/runtime-profile.d.ts +16 -0
- package/dist/src/runtime-profile.js +112 -0
- package/dist/src/runtime-profile.js.map +1 -0
- package/dist/src/search-provider.d.ts +6 -1
- package/dist/src/search-provider.js +257 -0
- package/dist/src/search-provider.js.map +1 -1
- package/dist/src/session-store.d.ts +5 -3
- package/dist/src/session-store.js +75 -4
- package/dist/src/session-store.js.map +1 -1
- package/dist/src/terminal-ui.d.ts +3 -1
- package/dist/src/terminal-ui.js +13 -3
- package/dist/src/terminal-ui.js.map +1 -1
- package/dist/src/tools/filesystem.js +141 -143
- package/dist/src/tools/filesystem.js.map +1 -1
- package/dist/src/tools/index.js +2 -0
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/repo-search.d.ts +23 -0
- package/dist/src/tools/repo-search.js +221 -0
- package/dist/src/tools/repo-search.js.map +1 -0
- package/dist/src/tools/shell.js +26 -3
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/timing.d.ts +2 -0
- package/dist/src/tools/timing.js +58 -0
- package/dist/src/tools/timing.js.map +1 -0
- package/dist/src/tools/web.js +70 -5
- package/dist/src/tools/web.js.map +1 -1
- package/dist/src/types.d.ts +89 -17
- package/dist/src/update-notifier.d.ts +41 -0
- package/dist/src/update-notifier.js +145 -0
- package/dist/src/update-notifier.js.map +1 -0
- package/package.json +13 -2
- 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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"}
|
package/dist/src/repl.d.ts
CHANGED
|
@@ -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();
|
package/dist/src/repl.js.map
CHANGED
|
@@ -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;
|
|
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(/&/g, "&")
|
|
250
|
+
.replace(/"/g, "\"")
|
|
251
|
+
.replace(/'/g, "'")
|
|
252
|
+
.replace(/'/g, "'")
|
|
253
|
+
.replace(/</g, "<")
|
|
254
|
+
.replace(/>/g, ">")
|
|
255
|
+
.replace(///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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
}
|