@xrkseek/harness-cli 0.1.0 → 0.1.2
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 +1 -1
- package/dist/port.d.ts.map +1 -1
- package/dist/port.js +1 -0
- package/dist/port.js.map +1 -1
- package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/xrk-file-reference/dist/grammar.d.ts +33 -0
- package/node_modules/@xrkseek/xrk-file-reference/dist/grammar.d.ts.map +1 -0
- package/node_modules/@xrkseek/xrk-file-reference/dist/grammar.js +43 -0
- package/node_modules/@xrkseek/xrk-file-reference/dist/grammar.js.map +1 -0
- package/node_modules/@xrkseek/xrk-file-reference/dist/types.d.ts +13 -0
- package/node_modules/@xrkseek/xrk-file-reference/dist/types.d.ts.map +1 -0
- package/node_modules/@xrkseek/xrk-file-reference/dist/types.js +7 -0
- package/node_modules/@xrkseek/xrk-file-reference/dist/types.js.map +1 -0
- package/node_modules/@xrkseek/xrk-file-reference/package.json +9 -46
- package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.d.ts +52 -0
- package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.d.ts.map +1 -0
- package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.js +258 -0
- package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.js.map +1 -0
- package/node_modules/@xrkseek/xrk-file-reference-local/package.json +7 -34
- package/node_modules/@xrkseek/xrk-session-reference/dist/config.d.ts +25 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/config.d.ts.map +1 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/config.js +18 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/config.js.map +1 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/types.d.ts +70 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/types.d.ts.map +1 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/types.js +11 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/types.js.map +1 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/uri.d.ts +40 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/uri.d.ts.map +1 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/uri.js +81 -0
- package/node_modules/@xrkseek/xrk-session-reference/dist/uri.js.map +1 -0
- package/node_modules/@xrkseek/xrk-session-reference/package.json +13 -53
- package/package.json +3 -2
- package/product-web/boot.json +1 -1
- package/product-web/plugins/@xrkseek/client-connection/client.js +1160 -367
- package/product-web/plugins/@xrkseek/client-locale/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-runtime/client.js +4 -13
- package/product-web/plugins/@xrkseek/client-ui-agent-preset/client.js +38 -38
- package/product-web/plugins/@xrkseek/client-ui-attachment/client.js +15 -15
- package/product-web/plugins/@xrkseek/client-ui-commands/client.js +8 -8
- package/product-web/plugins/@xrkseek/client-ui-conversation/client.js +169 -169
- package/product-web/plugins/@xrkseek/client-ui-deliverables/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-directory-picker-browse/client.js +26 -26
- package/product-web/plugins/@xrkseek/client-ui-goal/client.js +7 -7
- package/product-web/plugins/@xrkseek/client-ui-input-trigger/client.js +8 -8
- package/product-web/plugins/@xrkseek/client-ui-jobs/client.js +7 -7
- package/product-web/plugins/@xrkseek/client-ui-layout/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-message-feedback/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-model-selection/client.js +17 -17
- package/product-web/plugins/@xrkseek/client-ui-permission-presets/client.js +4 -4
- package/product-web/plugins/@xrkseek/client-ui-plan/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-settings-general/client.js +14 -14
- package/product-web/plugins/@xrkseek/client-ui-settings-models/client.js +57 -57
- package/product-web/plugins/@xrkseek/client-ui-settings-plugin-inventory/client.js +12 -12
- package/product-web/plugins/@xrkseek/client-ui-settings-plugins/client.js +41 -41
- package/product-web/plugins/@xrkseek/client-ui-sidebar/client.js +13 -13
- package/product-web/plugins/@xrkseek/client-ui-skill/client.js +10 -10
- package/product-web/plugins/@xrkseek/client-ui-subagent/client.js +21 -21
- package/product-web/plugins/@xrkseek/client-ui-theme/client.js +3 -3
- package/product-web/plugins/@xrkseek/client-ui-tool/client.js +40 -40
- package/product-web/plugins/@xrkseek/client-ui-trajectory/client.js +141 -141
- package/product-web/plugins/@xrkseek/client-ui-user-questions/client.js +27 -27
- package/product-web/plugins/@xrkseek/client-ui-workflow-run/client.js +14 -14
- package/product-web/plugins/@xrkseek/client-ui-workspace/client.js +54 -54
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe `@file` token grammar shared by terminal and web clients.
|
|
3
|
+
*
|
|
4
|
+
* @module @xrkseek/xrk-file-reference/grammar
|
|
5
|
+
*/
|
|
6
|
+
import type { FileReferenceCandidate } from './types.js';
|
|
7
|
+
/** Active `@` token ending at the editor cursor. */
|
|
8
|
+
export interface ActiveAtToken {
|
|
9
|
+
/** Complete token replaced when the user accepts a completion. */
|
|
10
|
+
prefix: string;
|
|
11
|
+
/** Path query after `@` or `@"`. */
|
|
12
|
+
query: string;
|
|
13
|
+
/** Whether the user opened a quoted path. */
|
|
14
|
+
quoted: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Extract an `@path` or `@"path with spaces` token at the cursor. An `@`
|
|
18
|
+
* inside another token, such as an email address, is not a completion trigger.
|
|
19
|
+
* @param line - current editor line.
|
|
20
|
+
* @param cursorCol - cursor column within that line.
|
|
21
|
+
* @returns the active token, or `undefined` outside an `@` token.
|
|
22
|
+
*/
|
|
23
|
+
export declare function activeAtToken(line: string, cursorCol: number): ActiveAtToken | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Format a selected path as prompt text. Whitespace uses the quoted
|
|
26
|
+
* `@"path"` grammar; a quoted directory keeps that quote open after its
|
|
27
|
+
* trailing slash so completion can descend another level.
|
|
28
|
+
* @param candidate - selected file or directory.
|
|
29
|
+
* @param preserveQuote - retain an explicitly opened quote even when unnecessary.
|
|
30
|
+
* @returns the insertion value, or `undefined` for a path the editor grammar cannot represent safely.
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatFileMention(candidate: FileReferenceCandidate, preserveQuote: boolean): string | undefined;
|
|
33
|
+
//# sourceMappingURL=grammar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammar.d.ts","sourceRoot":"","sources":["../src/grammar.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAExD,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CASxF;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,sBAAsB,EACjC,aAAa,EAAE,OAAO,GACrB,MAAM,GAAG,SAAS,CAOpB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe `@file` token grammar shared by terminal and web clients.
|
|
3
|
+
*
|
|
4
|
+
* @module @xrkseek/xrk-file-reference/grammar
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Extract an `@path` or `@"path with spaces` token at the cursor. An `@`
|
|
8
|
+
* inside another token, such as an email address, is not a completion trigger.
|
|
9
|
+
* @param line - current editor line.
|
|
10
|
+
* @param cursorCol - cursor column within that line.
|
|
11
|
+
* @returns the active token, or `undefined` outside an `@` token.
|
|
12
|
+
*/
|
|
13
|
+
export function activeAtToken(line, cursorCol) {
|
|
14
|
+
const beforeCursor = line.slice(0, cursorCol);
|
|
15
|
+
const quoted = /(?:^|\s)(@"([^"]*))$/u.exec(beforeCursor);
|
|
16
|
+
if (quoted?.[1] !== undefined && quoted[2] !== undefined) {
|
|
17
|
+
return { prefix: quoted[1], query: quoted[2], quoted: true };
|
|
18
|
+
}
|
|
19
|
+
const plain = /(?:^|\s)(@([^\s]*))$/u.exec(beforeCursor);
|
|
20
|
+
if (plain?.[1] === undefined || plain[2] === undefined)
|
|
21
|
+
return undefined;
|
|
22
|
+
return { prefix: plain[1], query: plain[2], quoted: false };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Format a selected path as prompt text. Whitespace uses the quoted
|
|
26
|
+
* `@"path"` grammar; a quoted directory keeps that quote open after its
|
|
27
|
+
* trailing slash so completion can descend another level.
|
|
28
|
+
* @param candidate - selected file or directory.
|
|
29
|
+
* @param preserveQuote - retain an explicitly opened quote even when unnecessary.
|
|
30
|
+
* @returns the insertion value, or `undefined` for a path the editor grammar cannot represent safely.
|
|
31
|
+
*/
|
|
32
|
+
export function formatFileMention(candidate, preserveQuote) {
|
|
33
|
+
const path = candidate.kind === 'directory' ? `${candidate.path}/` : candidate.path;
|
|
34
|
+
if (/[\u0000-\u001f\u007f-\u009f"]/u.test(path))
|
|
35
|
+
return undefined;
|
|
36
|
+
const quoted = preserveQuote || /\s/u.test(path);
|
|
37
|
+
if (!quoted)
|
|
38
|
+
return `@${path}`;
|
|
39
|
+
if (candidate.kind === 'directory')
|
|
40
|
+
return `@"${path}`;
|
|
41
|
+
return `@"${path}"`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=grammar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammar.js","sourceRoot":"","sources":["../src/grammar.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,SAAiB;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IAC7C,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACzD,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IAC9D,CAAC;IACD,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC7D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiC,EACjC,aAAsB;IAEtB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAA;IACnF,IAAI,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACjE,MAAM,MAAM,GAAG,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,IAAI,EAAE,CAAA;IAC9B,IAAI,SAAS,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,IAAI,EAAE,CAAA;IACtD,OAAO,KAAK,IAAI,GAAG,CAAA;AACrB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public file-reference discovery records. This module contains types only so
|
|
3
|
+
* generated Remote clients can consume it without Host runtime code.
|
|
4
|
+
* @module @xrkseek/xrk-file-reference/types
|
|
5
|
+
*/
|
|
6
|
+
/** One path-only completion candidate inside the target session cwd. */
|
|
7
|
+
export interface FileReferenceCandidate {
|
|
8
|
+
/** User-facing path accepted by normal prompts and filesystem tools. */
|
|
9
|
+
path: string;
|
|
10
|
+
/** Directories keep completion open; files finish the mention. */
|
|
11
|
+
kind: 'file' | 'directory';
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wEAAwE;AACxE,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -8,61 +8,24 @@
|
|
|
8
8
|
"directory": "packages/context/file-reference"
|
|
9
9
|
},
|
|
10
10
|
"type": "module",
|
|
11
|
-
"main": "lib/index.js",
|
|
12
|
-
"types": "lib/types/index.d.ts",
|
|
13
11
|
"exports": {
|
|
14
|
-
".": {
|
|
15
|
-
"types": "./lib/types/index.d.ts",
|
|
16
|
-
"default": "./lib/index.js"
|
|
17
|
-
},
|
|
18
12
|
"./grammar": {
|
|
19
|
-
"types": "./
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
"./invariant": {
|
|
23
|
-
"types": "./lib/types/invariant.d.ts",
|
|
24
|
-
"default": "./lib/invariant.js"
|
|
13
|
+
"types": "./dist/grammar.d.ts",
|
|
14
|
+
"import": "./dist/grammar.js",
|
|
15
|
+
"default": "./dist/grammar.js"
|
|
25
16
|
},
|
|
26
17
|
"./types": {
|
|
27
|
-
"types": "./
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
"./typert": {
|
|
31
|
-
"types": "./lib/typert.host.d.ts",
|
|
32
|
-
"default": "./lib/typert.host.js"
|
|
33
|
-
},
|
|
34
|
-
"./remote": {
|
|
35
|
-
"types": "./lib/typert.remote-client.d.ts",
|
|
36
|
-
"default": "./lib/typert.remote-client.js"
|
|
18
|
+
"types": "./dist/types.d.ts",
|
|
19
|
+
"import": "./dist/types.js",
|
|
20
|
+
"default": "./dist/types.js"
|
|
37
21
|
},
|
|
38
|
-
"./src/*": "./src/*",
|
|
39
22
|
"./package.json": "./package.json"
|
|
40
23
|
},
|
|
41
24
|
"files": [
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"lib/types/**/*.d.ts",
|
|
46
|
-
"lib/typert.host.js",
|
|
47
|
-
"lib/typert.host.d.ts",
|
|
48
|
-
"lib/typert.remote-client.js",
|
|
49
|
-
"lib/typert.remote-client.d.ts"
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md",
|
|
27
|
+
"README.zh.md"
|
|
50
28
|
],
|
|
51
29
|
"license": "MIT",
|
|
52
|
-
"peerDependencies": {
|
|
53
|
-
"@xrkseek/xrk-agent": "workspace:^",
|
|
54
|
-
"@xrkseek/xrk-invariants": "workspace:^",
|
|
55
|
-
"@xrkseek/xrk-typert-protocol": "workspace:^",
|
|
56
|
-
"@xrkseek/cordis": "workspace:^"
|
|
57
|
-
},
|
|
58
|
-
"devDependencies": {
|
|
59
|
-
"@xrkseek/xrk-agent": "workspace:^",
|
|
60
|
-
"@xrkseek/xrk-invariants": "workspace:^",
|
|
61
|
-
"@xrkseek/xrk-typert-protocol": "workspace:^",
|
|
62
|
-
"@xrkseek/cordis": "workspace:^"
|
|
63
|
-
},
|
|
64
|
-
"dependencies": {
|
|
65
|
-
"zod": "^4.4.3"
|
|
66
|
-
},
|
|
67
30
|
"private": true
|
|
68
31
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-workspace discovery for `@file` completion. The index contains paths
|
|
3
|
+
* only: selected values remain ordinary prompt text and file contents stay
|
|
4
|
+
* behind the model-facing `read` tool.
|
|
5
|
+
*
|
|
6
|
+
* @module @xrkseek/xrk-file-reference-local/search
|
|
7
|
+
*/
|
|
8
|
+
import type { FileReferenceCandidate } from '@xrkseek/xrk-file-reference/types';
|
|
9
|
+
export { activeAtToken, formatFileMention } from '@xrkseek/xrk-file-reference/grammar';
|
|
10
|
+
/** Default maximum file and directory candidates rendered for one query. */
|
|
11
|
+
export declare const DEFAULT_FILE_SEARCH_MAX_RESULTS = 20;
|
|
12
|
+
/** Default maximum entries retained in one workspace search index. */
|
|
13
|
+
export declare const DEFAULT_FILE_SEARCH_MAX_ENTRIES = 10000;
|
|
14
|
+
/** Directory basenames omitted from traversal unless the deployment overrides them. */
|
|
15
|
+
export declare const DEFAULT_FILE_SEARCH_EXCLUDED_DIRECTORIES: readonly [".git", "node_modules"];
|
|
16
|
+
/** Resolved limits and exclusions for one workspace index. */
|
|
17
|
+
export interface FileSearchConfig {
|
|
18
|
+
/** Maximum ranked candidates returned for one query. */
|
|
19
|
+
maxResults: number;
|
|
20
|
+
/** Maximum indexed files and directories. */
|
|
21
|
+
maxEntries: number;
|
|
22
|
+
/** Directory basenames never traversed or offered. */
|
|
23
|
+
excludedDirectories: readonly string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Cancellable, reusable fuzzy index rooted at one agent working directory.
|
|
27
|
+
* Directory-scoped queries list live state; bare fuzzy queries share one
|
|
28
|
+
* bounded traversal until the `@` interaction ends or a tool result invalidates it.
|
|
29
|
+
*/
|
|
30
|
+
export declare class WorkspaceFileSearch {
|
|
31
|
+
private readonly root;
|
|
32
|
+
private readonly config;
|
|
33
|
+
private readonly excludedDirectories;
|
|
34
|
+
private generation;
|
|
35
|
+
private disposed;
|
|
36
|
+
constructor(root: string, config: FileSearchConfig);
|
|
37
|
+
/**
|
|
38
|
+
* Return ranked path candidates for the current token.
|
|
39
|
+
* @param rawQuery - path text following `@` or `@"`.
|
|
40
|
+
* @param signal - cancels this caller's wait without killing an index shared by a newer query.
|
|
41
|
+
* @returns at most `maxResults` deterministic candidates.
|
|
42
|
+
*/
|
|
43
|
+
list(rawQuery: string, signal: AbortSignal): Promise<FileReferenceCandidate[]>;
|
|
44
|
+
/** Discard the current index so the next bare query observes a fresh tree. */
|
|
45
|
+
invalidate(): void;
|
|
46
|
+
/** Abort traversal and make later queries return no candidates. */
|
|
47
|
+
dispose(): void;
|
|
48
|
+
private ensureIndex;
|
|
49
|
+
private scanWorkspace;
|
|
50
|
+
private listDirectory;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAE/E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AAEtF,4EAA4E;AAC5E,eAAO,MAAM,+BAA+B,KAAK,CAAA;AACjD,sEAAsE;AACtE,eAAO,MAAM,+BAA+B,QAAS,CAAA;AACrD,uFAAuF;AACvF,eAAO,MAAM,wCAAwC,mCAAoC,CAAA;AAEzF,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAA;IAClB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAA;IAClB,sDAAsD;IACtD,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC;AAcD;;;;GAIG;AACH,qBAAa,mBAAmB;IAM5B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IACzD,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,QAAQ,CAAQ;gBAGL,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB;IAc3C;;;;;OAKG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAkBpF,8EAA8E;IAC9E,UAAU,IAAI,IAAI;IAKlB,mEAAmE;IACnE,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,WAAW;YAgBL,aAAa;YA2Bb,aAAa;CAqB5B"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-workspace discovery for `@file` completion. The index contains paths
|
|
3
|
+
* only: selected values remain ordinary prompt text and file contents stay
|
|
4
|
+
* behind the model-facing `read` tool.
|
|
5
|
+
*
|
|
6
|
+
* @module @xrkseek/xrk-file-reference-local/search
|
|
7
|
+
*/
|
|
8
|
+
import { lstat, readdir } from 'node:fs/promises';
|
|
9
|
+
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
10
|
+
export { activeAtToken, formatFileMention } from '@xrkseek/xrk-file-reference/grammar';
|
|
11
|
+
/** Default maximum file and directory candidates rendered for one query. */
|
|
12
|
+
export const DEFAULT_FILE_SEARCH_MAX_RESULTS = 20;
|
|
13
|
+
/** Default maximum entries retained in one workspace search index. */
|
|
14
|
+
export const DEFAULT_FILE_SEARCH_MAX_ENTRIES = 10_000;
|
|
15
|
+
/** Directory basenames omitted from traversal unless the deployment overrides them. */
|
|
16
|
+
export const DEFAULT_FILE_SEARCH_EXCLUDED_DIRECTORIES = ['.git', 'node_modules'];
|
|
17
|
+
/**
|
|
18
|
+
* Cancellable, reusable fuzzy index rooted at one agent working directory.
|
|
19
|
+
* Directory-scoped queries list live state; bare fuzzy queries share one
|
|
20
|
+
* bounded traversal until the `@` interaction ends or a tool result invalidates it.
|
|
21
|
+
*/
|
|
22
|
+
export class WorkspaceFileSearch {
|
|
23
|
+
root;
|
|
24
|
+
config;
|
|
25
|
+
excludedDirectories;
|
|
26
|
+
generation;
|
|
27
|
+
disposed = false;
|
|
28
|
+
constructor(root, config) {
|
|
29
|
+
this.root = root;
|
|
30
|
+
this.config = config;
|
|
31
|
+
if (!Number.isSafeInteger(config.maxResults) || config.maxResults <= 0) {
|
|
32
|
+
throw new Error('file search maxResults must be a positive safe integer');
|
|
33
|
+
}
|
|
34
|
+
if (!Number.isSafeInteger(config.maxEntries) || config.maxEntries <= 0) {
|
|
35
|
+
throw new Error('file search maxEntries must be a positive safe integer');
|
|
36
|
+
}
|
|
37
|
+
if (config.excludedDirectories.some(name => name.length === 0 || name.includes('/') || name.includes('\\'))) {
|
|
38
|
+
throw new Error('file search excludedDirectories entries must be non-empty directory basenames');
|
|
39
|
+
}
|
|
40
|
+
this.excludedDirectories = new Set(config.excludedDirectories);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Return ranked path candidates for the current token.
|
|
44
|
+
* @param rawQuery - path text following `@` or `@"`.
|
|
45
|
+
* @param signal - cancels this caller's wait without killing an index shared by a newer query.
|
|
46
|
+
* @returns at most `maxResults` deterministic candidates.
|
|
47
|
+
*/
|
|
48
|
+
async list(rawQuery, signal) {
|
|
49
|
+
signal.throwIfAborted();
|
|
50
|
+
if (this.disposed)
|
|
51
|
+
return [];
|
|
52
|
+
const query = rawQuery.replaceAll('\\', '/');
|
|
53
|
+
const slash = query.lastIndexOf('/');
|
|
54
|
+
if (query === '' || slash >= 0) {
|
|
55
|
+
const directory = slash < 0 ? '' : query.slice(0, slash + 1);
|
|
56
|
+
const fragment = slash < 0 ? '' : query.slice(slash + 1);
|
|
57
|
+
return this.listDirectory(directory, fragment, signal);
|
|
58
|
+
}
|
|
59
|
+
const indexed = await waitForPromise(this.ensureIndex(), signal);
|
|
60
|
+
return rankCandidates(indexed.filter(candidate => visibleForGlobalQuery(candidate.path, query)), query, this.config.maxResults);
|
|
61
|
+
}
|
|
62
|
+
/** Discard the current index so the next bare query observes a fresh tree. */
|
|
63
|
+
invalidate() {
|
|
64
|
+
this.generation?.controller.abort(new Error('file search index invalidated'));
|
|
65
|
+
this.generation = undefined;
|
|
66
|
+
}
|
|
67
|
+
/** Abort traversal and make later queries return no candidates. */
|
|
68
|
+
dispose() {
|
|
69
|
+
if (this.disposed)
|
|
70
|
+
return;
|
|
71
|
+
this.disposed = true;
|
|
72
|
+
this.invalidate();
|
|
73
|
+
}
|
|
74
|
+
ensureIndex() {
|
|
75
|
+
if (this.generation !== undefined)
|
|
76
|
+
return this.generation.promise;
|
|
77
|
+
const controller = new AbortController();
|
|
78
|
+
const generation = {
|
|
79
|
+
controller,
|
|
80
|
+
promise: Promise.resolve([]),
|
|
81
|
+
};
|
|
82
|
+
generation.promise = this.scanWorkspace(controller.signal).catch((error) => {
|
|
83
|
+
/* v8 ignore next -- every owned abort clears `generation` synchronously; this only protects an unexpected scan failure */
|
|
84
|
+
if (this.generation === generation)
|
|
85
|
+
this.generation = undefined;
|
|
86
|
+
throw error;
|
|
87
|
+
});
|
|
88
|
+
this.generation = generation;
|
|
89
|
+
return generation.promise;
|
|
90
|
+
}
|
|
91
|
+
async scanWorkspace(signal) {
|
|
92
|
+
const indexed = [];
|
|
93
|
+
const directories = [{ absolute: this.root, relative: '' }];
|
|
94
|
+
for (let cursor = 0; cursor < directories.length && indexed.length < this.config.maxEntries; cursor += 1) {
|
|
95
|
+
signal.throwIfAborted();
|
|
96
|
+
const directory = directories[cursor];
|
|
97
|
+
/* v8 ignore next 3 -- cursor is bounded by this exact queue's length. */
|
|
98
|
+
if (directory === undefined) {
|
|
99
|
+
throw new Error('file search selected a missing directory');
|
|
100
|
+
}
|
|
101
|
+
const entries = await readDirectory(directory.absolute, signal);
|
|
102
|
+
for (const entry of entries) {
|
|
103
|
+
signal.throwIfAborted();
|
|
104
|
+
const path = directory.relative === '' ? entry.name : `${directory.relative}/${entry.name}`;
|
|
105
|
+
if (entry.isDirectory()) {
|
|
106
|
+
if (this.excludedDirectories.has(entry.name))
|
|
107
|
+
continue;
|
|
108
|
+
indexed.push({ path, kind: 'directory' });
|
|
109
|
+
directories.push({ absolute: join(directory.absolute, entry.name), relative: path });
|
|
110
|
+
}
|
|
111
|
+
else if (entry.isFile()) {
|
|
112
|
+
indexed.push({ path, kind: 'file' });
|
|
113
|
+
}
|
|
114
|
+
if (indexed.length >= this.config.maxEntries)
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return indexed;
|
|
119
|
+
}
|
|
120
|
+
async listDirectory(displayDirectory, fragment, signal) {
|
|
121
|
+
if (displayDirectory.split('/').some(segment => this.excludedDirectories.has(segment)))
|
|
122
|
+
return [];
|
|
123
|
+
const absolute = await resolveDisplayDirectory(this.root, displayDirectory, signal);
|
|
124
|
+
if (absolute === undefined)
|
|
125
|
+
return [];
|
|
126
|
+
const entries = await readDirectory(absolute, signal);
|
|
127
|
+
const candidates = [];
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
if (entry.name.startsWith('.') && !fragment.startsWith('.'))
|
|
130
|
+
continue;
|
|
131
|
+
if (entry.isDirectory()) {
|
|
132
|
+
if (this.excludedDirectories.has(entry.name))
|
|
133
|
+
continue;
|
|
134
|
+
candidates.push({ path: `${displayDirectory}${entry.name}`, kind: 'directory' });
|
|
135
|
+
}
|
|
136
|
+
else if (entry.isFile()) {
|
|
137
|
+
candidates.push({ path: `${displayDirectory}${entry.name}`, kind: 'file' });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return rankCandidates(candidates, fragment, this.config.maxResults);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function resolveDisplayDirectory(root, displayDirectory, signal) {
|
|
144
|
+
const resolvedRoot = resolve(root);
|
|
145
|
+
const absolute = resolve(resolvedRoot, displayDirectory === '' ? '.' : displayDirectory);
|
|
146
|
+
const fromRoot = relative(resolvedRoot, absolute);
|
|
147
|
+
if (fromRoot === '..' || fromRoot.startsWith(`..${sep}`))
|
|
148
|
+
return undefined;
|
|
149
|
+
/* v8 ignore next -- only Windows can produce a cross-volume absolute relative path */
|
|
150
|
+
if (isAbsolute(fromRoot))
|
|
151
|
+
return undefined;
|
|
152
|
+
let current = resolvedRoot;
|
|
153
|
+
for (const segment of fromRoot.split(sep).filter(Boolean)) {
|
|
154
|
+
signal.throwIfAborted();
|
|
155
|
+
current = join(current, segment);
|
|
156
|
+
try {
|
|
157
|
+
const status = await lstat(current);
|
|
158
|
+
signal.throwIfAborted();
|
|
159
|
+
if (status.isSymbolicLink() || !status.isDirectory())
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
catch (_error) {
|
|
163
|
+
signal.throwIfAborted();
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return absolute;
|
|
168
|
+
}
|
|
169
|
+
async function readDirectory(absolute, signal) {
|
|
170
|
+
signal.throwIfAborted();
|
|
171
|
+
try {
|
|
172
|
+
const entries = await readdir(absolute, { withFileTypes: true });
|
|
173
|
+
signal.throwIfAborted();
|
|
174
|
+
return entries.sort((left, right) => compareText(left.name, right.name));
|
|
175
|
+
}
|
|
176
|
+
catch (_error) {
|
|
177
|
+
signal.throwIfAborted();
|
|
178
|
+
// An unreadable/missing subtree contributes no candidates; other readable
|
|
179
|
+
// branches remain useful and autocomplete is advisory.
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function visibleForGlobalQuery(path, query) {
|
|
184
|
+
if (query.startsWith('.') || query.includes('/.'))
|
|
185
|
+
return true;
|
|
186
|
+
return !path.split('/').some(segment => segment.startsWith('.'));
|
|
187
|
+
}
|
|
188
|
+
function rankCandidates(candidates, query, limit) {
|
|
189
|
+
const ranked = [];
|
|
190
|
+
for (const candidate of candidates) {
|
|
191
|
+
const score = scoreCandidate(candidate, query);
|
|
192
|
+
if (score !== undefined)
|
|
193
|
+
ranked.push({ candidate, score });
|
|
194
|
+
}
|
|
195
|
+
ranked.sort((left, right) => right.score - left.score
|
|
196
|
+
|| kindRank(left.candidate.kind) - kindRank(right.candidate.kind)
|
|
197
|
+
|| (query === '' ? 0 : left.candidate.path.length - right.candidate.path.length)
|
|
198
|
+
|| compareText(left.candidate.path, right.candidate.path));
|
|
199
|
+
return ranked.slice(0, limit).map(entry => entry.candidate);
|
|
200
|
+
}
|
|
201
|
+
function scoreCandidate(candidate, query) {
|
|
202
|
+
if (query === '')
|
|
203
|
+
return 0;
|
|
204
|
+
const path = candidate.path.toLowerCase();
|
|
205
|
+
const name = path.slice(path.lastIndexOf('/') + 1);
|
|
206
|
+
const needle = query.toLowerCase();
|
|
207
|
+
const directoryBonus = candidate.kind === 'directory' ? 25 : 0;
|
|
208
|
+
if (name === needle)
|
|
209
|
+
return 1_000 + directoryBonus;
|
|
210
|
+
if (name.startsWith(needle))
|
|
211
|
+
return 900 + directoryBonus;
|
|
212
|
+
if (name.includes(needle))
|
|
213
|
+
return 700 + directoryBonus;
|
|
214
|
+
if (path.includes(needle))
|
|
215
|
+
return 500 + directoryBonus;
|
|
216
|
+
const subsequence = subsequenceScore(path, needle);
|
|
217
|
+
return subsequence === undefined ? undefined : 300 + subsequence + directoryBonus;
|
|
218
|
+
}
|
|
219
|
+
function subsequenceScore(target, query) {
|
|
220
|
+
let targetIndex = 0;
|
|
221
|
+
let gap = 0;
|
|
222
|
+
for (const character of query) {
|
|
223
|
+
const found = target.indexOf(character, targetIndex);
|
|
224
|
+
if (found < 0)
|
|
225
|
+
return undefined;
|
|
226
|
+
gap += found - targetIndex;
|
|
227
|
+
targetIndex = found + 1;
|
|
228
|
+
}
|
|
229
|
+
return Math.max(0, 100 - gap);
|
|
230
|
+
}
|
|
231
|
+
function kindRank(kind) {
|
|
232
|
+
return kind === 'directory' ? 0 : 1;
|
|
233
|
+
}
|
|
234
|
+
function compareText(left, right) {
|
|
235
|
+
/* v8 ignore next -- entries and candidates are unique; host enumeration
|
|
236
|
+
* order determines which comparison direction sort requests. */
|
|
237
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
238
|
+
}
|
|
239
|
+
function waitForPromise(promise, signal) {
|
|
240
|
+
/* v8 ignore next -- `list()` checks this signal immediately before its synchronous call into this helper */
|
|
241
|
+
if (signal.aborted)
|
|
242
|
+
return Promise.reject(errorReason(signal.reason, 'file search aborted'));
|
|
243
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
244
|
+
const onAbort = () => { rejectPromise(errorReason(signal.reason, 'file search aborted')); };
|
|
245
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
246
|
+
promise.then((value) => {
|
|
247
|
+
signal.removeEventListener('abort', onAbort);
|
|
248
|
+
resolvePromise(value);
|
|
249
|
+
}, (error) => {
|
|
250
|
+
signal.removeEventListener('abort', onAbort);
|
|
251
|
+
rejectPromise(errorReason(error, 'file search index failed'));
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
function errorReason(reason, fallback) {
|
|
256
|
+
return reason instanceof Error ? reason : new Error(fallback, { cause: reason });
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,49 +8,22 @@
|
|
|
8
8
|
"directory": "packages/context/file-reference-local"
|
|
9
9
|
},
|
|
10
10
|
"type": "module",
|
|
11
|
-
"main": "lib/index.js",
|
|
12
|
-
"types": "lib/types/index.d.ts",
|
|
13
11
|
"exports": {
|
|
14
|
-
".": {
|
|
15
|
-
"types": "./lib/types/index.d.ts",
|
|
16
|
-
"default": "./lib/index.js"
|
|
17
|
-
},
|
|
18
12
|
"./search": {
|
|
19
|
-
"types": "./
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
"./invariant": {
|
|
23
|
-
"types": "./lib/types/invariant.d.ts",
|
|
24
|
-
"default": "./lib/invariant.js"
|
|
13
|
+
"types": "./dist/search.d.ts",
|
|
14
|
+
"import": "./dist/search.js",
|
|
15
|
+
"default": "./dist/search.js"
|
|
25
16
|
},
|
|
26
|
-
"./src/*": "./src/*",
|
|
27
17
|
"./package.json": "./package.json"
|
|
28
18
|
},
|
|
29
19
|
"files": [
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"lib/types/**/*.d.ts"
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md",
|
|
22
|
+
"README.zh.md"
|
|
34
23
|
],
|
|
35
24
|
"license": "MIT",
|
|
36
25
|
"dependencies": {
|
|
37
|
-
"@xrkseek/
|
|
38
|
-
},
|
|
39
|
-
"peerDependencies": {
|
|
40
|
-
"@xrkseek/xrk-agent": "workspace:^",
|
|
41
|
-
"@xrkseek/xrk-file-reference": "workspace:^",
|
|
42
|
-
"@xrkseek/xrk-invariants": "workspace:^",
|
|
43
|
-
"@xrkseek/xrk-system-prompt": "workspace:^",
|
|
44
|
-
"@xrkseek/xrk-tools": "workspace:^",
|
|
45
|
-
"@xrkseek/cordis": "workspace:^"
|
|
46
|
-
},
|
|
47
|
-
"devDependencies": {
|
|
48
|
-
"@xrkseek/xrk-agent": "workspace:^",
|
|
49
|
-
"@xrkseek/xrk-file-reference": "workspace:^",
|
|
50
|
-
"@xrkseek/xrk-invariants": "workspace:^",
|
|
51
|
-
"@xrkseek/xrk-system-prompt": "workspace:^",
|
|
52
|
-
"@xrkseek/xrk-tools": "workspace:^",
|
|
53
|
-
"@xrkseek/cordis": "workspace:^"
|
|
26
|
+
"@xrkseek/xrk-file-reference": "workspace:*"
|
|
54
27
|
},
|
|
55
28
|
"private": true
|
|
56
29
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Configuration and stable diagnostics for session references. */
|
|
2
|
+
/** Hard maximum references accepted by one message. */
|
|
3
|
+
export declare const MAX_REFERENCES = 3;
|
|
4
|
+
/** Default number of discovery candidates returned to a host. */
|
|
5
|
+
export declare const DEFAULT_CANDIDATE_LIMIT = 50;
|
|
6
|
+
/** Default UTF-8 budget for one rendered reference JSON object. */
|
|
7
|
+
export declare const DEFAULT_MAX_REFERENCE_BYTES = 65536;
|
|
8
|
+
/** Session-reference service configuration. */
|
|
9
|
+
export interface Config {
|
|
10
|
+
/** Maximum distinct source sessions referenced by one message, from one to three. */
|
|
11
|
+
maxReferences?: number;
|
|
12
|
+
/** Default host candidate-list limit. */
|
|
13
|
+
candidateLimit?: number;
|
|
14
|
+
/** Maximum rendered UTF-8 bytes for one source snapshot. */
|
|
15
|
+
maxReferenceBytes?: number;
|
|
16
|
+
}
|
|
17
|
+
/** Stable failure codes exposed to host adapters. */
|
|
18
|
+
export type SessionReferenceErrorCode = 'SESSION_REFERENCE_INVALID_CONFIG' | 'SESSION_REFERENCE_INVALID_REFERENCE' | 'SESSION_REFERENCE_SELF_REFERENCE' | 'SESSION_REFERENCE_TOO_MANY' | 'SESSION_REFERENCE_READ_FAILED' | 'SESSION_REFERENCE_BUDGET_EXCEEDED' | 'SESSION_REFERENCE_CANCELLED';
|
|
19
|
+
/** Typed session-reference failure suitable for host protocol error mapping. */
|
|
20
|
+
export declare class SessionReferenceError extends Error {
|
|
21
|
+
readonly code: SessionReferenceErrorCode;
|
|
22
|
+
/** @param message Human-readable diagnosis. @param code Stable routing code. @param options Optional cause. */
|
|
23
|
+
constructor(message: string, code: SessionReferenceErrorCode, options?: ErrorOptions);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,uDAAuD;AACvD,eAAO,MAAM,cAAc,IAAI,CAAA;AAC/B,iEAAiE;AACjE,eAAO,MAAM,uBAAuB,KAAK,CAAA;AACzC,mEAAmE;AACnE,eAAO,MAAM,2BAA2B,QAAS,CAAA;AAEjD,+CAA+C;AAC/C,MAAM,WAAW,MAAM;IACrB,qFAAqF;IACrF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,qDAAqD;AACrD,MAAM,MAAM,yBAAyB,GACjC,kCAAkC,GAClC,qCAAqC,GACrC,kCAAkC,GAClC,4BAA4B,GAC5B,+BAA+B,GAC/B,mCAAmC,GACnC,6BAA6B,CAAA;AAEjC,gFAAgF;AAChF,qBAAa,qBAAsB,SAAQ,KAAK;IAI5C,QAAQ,CAAC,IAAI,EAAE,yBAAyB;IAH1C,+GAA+G;gBAE7G,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,yBAAyB,EACxC,OAAO,CAAC,EAAE,YAAY;CAKzB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Configuration and stable diagnostics for session references. */
|
|
2
|
+
/** Hard maximum references accepted by one message. */
|
|
3
|
+
export const MAX_REFERENCES = 3;
|
|
4
|
+
/** Default number of discovery candidates returned to a host. */
|
|
5
|
+
export const DEFAULT_CANDIDATE_LIMIT = 50;
|
|
6
|
+
/** Default UTF-8 budget for one rendered reference JSON object. */
|
|
7
|
+
export const DEFAULT_MAX_REFERENCE_BYTES = 65_536;
|
|
8
|
+
/** Typed session-reference failure suitable for host protocol error mapping. */
|
|
9
|
+
export class SessionReferenceError extends Error {
|
|
10
|
+
code;
|
|
11
|
+
/** @param message Human-readable diagnosis. @param code Stable routing code. @param options Optional cause. */
|
|
12
|
+
constructor(message, code, options) {
|
|
13
|
+
super(message, options);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.name = 'SessionReferenceError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,uDAAuD;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAA;AAC/B,iEAAiE;AACjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAA;AACzC,mEAAmE;AACnE,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAA;AAsBjD,gFAAgF;AAChF,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAInC;IAHX,+GAA+G;IAC/G,YACE,OAAe,EACN,IAA+B,EACxC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAHd,SAAI,GAAJ,IAAI,CAA2B;QAIxC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF"}
|