@yadsh/dsh-qa-surface 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +251 -12
- package/lib/access/service.js +49 -10
- package/lib/access/service.js.map +1 -1
- package/lib/account-remotes.js +41 -0
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/database.js +140 -0
- package/lib/accounts/database.js.map +1 -1
- package/lib/accounts/errors.js.map +1 -1
- package/lib/accounts/service-token.js +103 -0
- package/lib/accounts/service-token.js.map +1 -0
- package/lib/accounts/store.js +291 -5
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/conversation-log.js +14 -8
- package/lib/admin/conversation-log.js.map +1 -1
- package/lib/admin/permissions.js +5 -0
- package/lib/admin/permissions.js.map +1 -1
- package/lib/admin/quality-store.js +4 -0
- package/lib/admin/quality-store.js.map +1 -1
- package/lib/admin/service.js +173 -0
- package/lib/admin/service.js.map +1 -1
- package/lib/admin/session-log.js +39 -8
- package/lib/admin/session-log.js.map +1 -1
- package/lib/attachment-rules.js +39 -6
- package/lib/attachment-rules.js.map +1 -1
- package/lib/cli.js +83 -1
- package/lib/cli.js.map +1 -1
- package/lib/client/QaAccountsController.js +213 -4
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaSessionController.js +37 -21
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +28 -4
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +9 -1
- package/lib/client/admin/QaAdmin.js.map +1 -1
- package/lib/client/admin/pages/SkillFiles.js +78 -0
- package/lib/client/admin/pages/SkillFiles.js.map +1 -0
- package/lib/client/admin/pages/Users.js +65 -1
- package/lib/client/admin/pages/Users.js.map +1 -1
- package/lib/client/admin/routes.js +8 -1
- package/lib/client/admin/routes.js.map +1 -1
- package/lib/client/admin/styles.js +2 -0
- package/lib/client/admin/styles.js.map +1 -1
- package/lib/client/attachments.js +41 -11
- package/lib/client/attachments.js.map +1 -1
- package/lib/client/components/QaAuthGate.js +19 -10
- package/lib/client/components/QaAuthGate.js.map +1 -1
- package/lib/client/components/QaChangelog.js +27 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/index.js +13 -0
- package/lib/client/index.js.map +1 -1
- package/lib/client/lineage.js +64 -0
- package/lib/client/lineage.js.map +1 -1
- package/lib/client/settings/sections/attachments.js +6 -5
- package/lib/client/settings/sections/attachments.js.map +1 -1
- package/lib/client/settings/sections/notes.js +22 -4
- package/lib/client/settings/sections/notes.js.map +1 -1
- package/lib/client/styles.js +9 -0
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client/user-settings/IntegrationTokensPage.js +150 -0
- package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -0
- package/lib/client/user-settings/PasswordSettingsPage.js +48 -0
- package/lib/client/user-settings/PasswordSettingsPage.js.map +1 -0
- package/lib/client/user-settings/SkillCatalog.js +2 -2
- package/lib/client/user-settings/SkillCatalog.js.map +1 -1
- package/lib/client/user-settings/UserSettingsDialog.js +17 -2
- package/lib/client/user-settings/UserSettingsDialog.js.map +1 -1
- package/lib/client/user-settings/copy.js +20 -0
- package/lib/client/user-settings/copy.js.map +1 -1
- package/lib/client.js +2466 -137
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/attachments.js +6 -5
- package/lib/config-resolvers/attachments.js.map +1 -1
- package/lib/config-resolvers/defaults.js +23 -2
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/integration.js +94 -0
- package/lib/config-resolvers/integration.js.map +1 -0
- package/lib/config-resolvers/notes.js +2 -0
- package/lib/config-resolvers/notes.js.map +1 -1
- package/lib/config.js +72 -0
- package/lib/config.js.map +1 -1
- package/lib/index.js +197 -2
- package/lib/index.js.map +1 -1
- package/lib/integration/answer.js +100 -0
- package/lib/integration/answer.js.map +1 -0
- package/lib/integration/attachments.js +231 -0
- package/lib/integration/attachments.js.map +1 -0
- package/lib/integration/contract.js +53 -0
- package/lib/integration/contract.js.map +1 -0
- package/lib/integration/host-runner.js +243 -0
- package/lib/integration/host-runner.js.map +1 -0
- package/lib/integration/http.js +538 -0
- package/lib/integration/http.js.map +1 -0
- package/lib/integration/service.js +331 -0
- package/lib/integration/service.js.map +1 -0
- package/lib/integration/transcript-reader.js +202 -0
- package/lib/integration/transcript-reader.js.map +1 -0
- package/lib/integration/transcript.js +148 -0
- package/lib/integration/transcript.js.map +1 -0
- package/lib/personal-skills/index.js +2 -2
- package/lib/personal-skills/index.js.map +1 -1
- package/lib/personal-skills/paths.js +14 -8
- package/lib/personal-skills/paths.js.map +1 -1
- package/lib/personal-skills/provider.js +16 -4
- package/lib/personal-skills/provider.js.map +1 -1
- package/lib/personal-skills/service.js +240 -30
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/prompt-notes.js +58 -0
- package/lib/prompt-notes.js.map +1 -1
- package/lib/provenance/document-preview.js +10 -1
- package/lib/provenance/document-preview.js.map +1 -1
- package/lib/qa-tools/catalog.js +12 -1
- package/lib/qa-tools/catalog.js.map +1 -1
- package/lib/qa-tools/docs-tools.js +563 -0
- package/lib/qa-tools/docs-tools.js.map +1 -0
- package/lib/resolve-config.js +4 -0
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +83 -3
- package/lib/secure-session.js.map +1 -1
- package/lib/shared/integration-tokens.js +23 -0
- package/lib/shared/integration-tokens.js.map +1 -0
- package/lib/typert.host.js +1176 -213
- package/lib/typert.remote-client.d.ts +27 -1
- package/lib/typert.remote-client.js +911 -69
- package/lib/types/access/service.d.ts +33 -2
- package/lib/types/account-remotes.d.ts +30 -1
- package/lib/types/accounts/database.d.ts +53 -0
- package/lib/types/accounts/errors.d.ts +5 -1
- package/lib/types/accounts/service-token.d.ts +70 -0
- package/lib/types/accounts/store.d.ts +131 -1
- package/lib/types/admin/conversation-log.d.ts +12 -0
- package/lib/types/admin/service.d.ts +56 -1
- package/lib/types/admin/session-log.d.ts +21 -0
- package/lib/types/attachment-rules.d.ts +26 -3
- package/lib/types/client/QaAccountsController.d.ts +64 -5
- package/lib/types/client/QaSessionController.d.ts +24 -2
- package/lib/types/client/admin/pages/SkillFiles.d.ts +17 -0
- package/lib/types/client/admin/routes.d.ts +2 -0
- package/lib/types/client/attachments.d.ts +21 -4
- package/lib/types/client/lineage.d.ts +42 -0
- package/lib/types/client/settings/sections/notes.d.ts +5 -3
- package/lib/types/client/types.d.ts +71 -1
- package/lib/types/client/user-settings/IntegrationTokensPage.d.ts +21 -0
- package/lib/types/client/user-settings/PasswordSettingsPage.d.ts +19 -0
- package/lib/types/client/user-settings/UserSettingsDialog.d.ts +11 -2
- package/lib/types/client/user-settings/copy.d.ts +10 -1
- package/lib/types/config-resolvers/integration.d.ts +47 -0
- package/lib/types/config.d.ts +10 -0
- package/lib/types/index.d.ts +73 -1
- package/lib/types/integration/answer.d.ts +65 -0
- package/lib/types/integration/attachments.d.ts +85 -0
- package/lib/types/integration/contract.d.ts +196 -0
- package/lib/types/integration/host-runner.d.ts +44 -0
- package/lib/types/integration/http.d.ts +79 -0
- package/lib/types/integration/service.d.ts +120 -0
- package/lib/types/integration/transcript-reader.d.ts +100 -0
- package/lib/types/integration/transcript.d.ts +59 -0
- package/lib/types/personal-skills/index.d.ts +2 -2
- package/lib/types/personal-skills/paths.d.ts +15 -3
- package/lib/types/personal-skills/provider.d.ts +14 -2
- package/lib/types/personal-skills/service.d.ts +89 -14
- package/lib/types/prompt-notes.d.ts +28 -0
- package/lib/types/provenance/document-preview.d.ts +4 -0
- package/lib/types/qa-tools/catalog.d.ts +1 -1
- package/lib/types/qa-tools/docs-tools.d.ts +160 -0
- package/lib/types/secure-session.d.ts +52 -1
- package/lib/types/shared/integration-tokens.d.ts +24 -0
- package/lib/types/types.d.ts +170 -2
- package/package.json +4 -4
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
import { lstat, readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
3
|
+
import { defineTool } from "@deepseek-ai/dsh-tools";
|
|
4
|
+
import { canonicalCandidate, pathIsInside } from "../user-workspace.js";
|
|
5
|
+
/**
|
|
6
|
+
* `docs_search` and `docs_read` — the documentation surface of the QA catalog.
|
|
7
|
+
*
|
|
8
|
+
* A QA chat answers questions from the stand's documentation, and until now the
|
|
9
|
+
* model had no tool that said where that documentation is: the path in a
|
|
10
|
+
* reviewer's remark (`docs/platform/3.8/…`) was something the model had to
|
|
11
|
+
* guess its way to with a glob sweep, and a miss read as "the document does
|
|
12
|
+
* not exist" rather than "wrong tree". These two tools make the tree a
|
|
13
|
+
* first-class surface. Both are read-only, both are fenced to the
|
|
14
|
+
* documentation directory inside the calling chat's workspace
|
|
15
|
+
* (`<session cwd>/docs`, the directory the stand publishes its documentation
|
|
16
|
+
* into), and both name the documentation as what they search, so the tool
|
|
17
|
+
* description itself answers "where do I look for documentation?".
|
|
18
|
+
*
|
|
19
|
+
* The tree is read as a shallow layout convention, not a schema: hits carry
|
|
20
|
+
* the `version` and `module` parsed out of the path (`docs/<module>/<version>/…`)
|
|
21
|
+
* so the model can stay inside one edition of one module, and the same two
|
|
22
|
+
* names are accepted as filters. A path the convention does not describe is
|
|
23
|
+
* still searched and still read — it simply carries no identity.
|
|
24
|
+
*
|
|
25
|
+
* Nothing here is destructive and building it registers nothing: like the rest
|
|
26
|
+
* of the catalog these are side-effect-free definitions, and the workspace root
|
|
27
|
+
* is read from `exec.agent` at call time.
|
|
28
|
+
*/
|
|
29
|
+
/** The documentation directory inside a chat workspace. */
|
|
30
|
+
export const QA_DOCS_DIRECTORY = "docs";
|
|
31
|
+
/** Search defaults and budgets, all fixed: a chat cannot raise them. */
|
|
32
|
+
export const QA_DOCS_SEARCH_DEFAULT_LIMIT = 8;
|
|
33
|
+
export const QA_DOCS_SEARCH_MAX_LIMIT = 40;
|
|
34
|
+
export const QA_DOCS_SEARCH_BYTE_BUDGET = 4_000;
|
|
35
|
+
export const QA_DOCS_READ_DEFAULT_LINES = 120;
|
|
36
|
+
export const QA_DOCS_READ_MAX_LINES = 400;
|
|
37
|
+
/** One file larger than this is not documentation a chat needs to search. */
|
|
38
|
+
const MAX_FILE_BYTES = 2 * 1024 * 1024;
|
|
39
|
+
/** Bound on the walk itself, so a huge tree cannot stall the turn. */
|
|
40
|
+
const MAX_FILES_SCANNED = 2_000;
|
|
41
|
+
/** A matched line is trimmed to this many characters before it is reported. */
|
|
42
|
+
const MAX_LINE_CHARS = 240;
|
|
43
|
+
const TEXT_DECODER = new TextDecoder("utf-8", { fatal: true });
|
|
44
|
+
/**
|
|
45
|
+
* A typed refusal of one documentation call.
|
|
46
|
+
*
|
|
47
|
+
* The message is what the model reads. It names the reason in words and never
|
|
48
|
+
* echoes an absolute host path, so a refusal cannot leak the deployment's
|
|
49
|
+
* layout into the conversation.
|
|
50
|
+
*/
|
|
51
|
+
export class QaDocsError extends Error {
|
|
52
|
+
code;
|
|
53
|
+
constructor(code, message, options = {}) {
|
|
54
|
+
super(message, options);
|
|
55
|
+
this.code = code;
|
|
56
|
+
this.name = "QaDocsError";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const WORKSPACE_UNAVAILABLE = "the calling session's workspace root is not available to this execution, so the documentation tree cannot be located. Report that documentation is unavailable rather than guessing its contents.";
|
|
60
|
+
const DOCS_UNAVAILABLE = `this chat's workspace has no ${QA_DOCS_DIRECTORY}/ directory, so there is no documentation tree to read. Documentation is published there (${QA_DOCS_DIRECTORY}/<module>/<version>/…); if it is missing, ask the operator instead of substituting a memory or workspace search.`;
|
|
61
|
+
const DOCS_NOT_A_DIRECTORY = `the ${QA_DOCS_DIRECTORY}/ entry in this chat's workspace is not a real directory (it is a file or a link), and documentation is never followed through a link.`;
|
|
62
|
+
const DOCS_ESCAPE = `the ${QA_DOCS_DIRECTORY}/ directory resolves outside the calling chat's workspace, so the documentation tree is refused.`;
|
|
63
|
+
const INVALID_QUERY = "no query was given: pass the phrase to look for.";
|
|
64
|
+
const OUTSIDE_DOCS = `this path resolves outside the documentation directory (${QA_DOCS_DIRECTORY}/) of the calling chat's workspace. Documentation is only read where the stand publishes it; pass a path inside ${QA_DOCS_DIRECTORY}/.`;
|
|
65
|
+
const SYMLINK_ESCAPE = "this path leaves the documentation tree through a symbolic link, and links are not followed out of it.";
|
|
66
|
+
const NOT_FOUND = "no documentation file or directory exists at this path. Check the spelling against a path docs_search reported.";
|
|
67
|
+
const NOT_A_FILE = "this path is a directory, not a documentation file: pass the file to read, or use docs_search to find one.";
|
|
68
|
+
const NOT_TEXT = "this path does not read as UTF-8 text (or is larger than the readable limit), so it is not documentation this tool can return.";
|
|
69
|
+
const VERSION_SEGMENT = /^v?\d+(?:\.\d+)*$/iu;
|
|
70
|
+
function normalizeVersion(value) {
|
|
71
|
+
return value.replace(/^v/u, "").toLowerCase();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Identity of one documentation path, read relative to the documentation root.
|
|
75
|
+
*
|
|
76
|
+
* The documented layout is `docs/<module>/<version>/…`: the version is the
|
|
77
|
+
* first directory segment that parses as one (`3.8`, `v2`, `2024.1`), and the
|
|
78
|
+
* module is the directory segment immediately before it. A path with no
|
|
79
|
+
* version segment keeps its first directory segment as the module; a file
|
|
80
|
+
* directly in `docs/` carries neither, and is still searched and read.
|
|
81
|
+
*/
|
|
82
|
+
export function docsIdentityOf(pathFromDocsRoot) {
|
|
83
|
+
const segments = pathFromDocsRoot
|
|
84
|
+
.split(/[\\/]/u)
|
|
85
|
+
.slice(0, -1)
|
|
86
|
+
.filter((segment) => segment !== "");
|
|
87
|
+
if (segments.length === 0)
|
|
88
|
+
return identityOf(undefined, undefined);
|
|
89
|
+
const versionIndex = segments.findIndex((segment) => VERSION_SEGMENT.test(segment));
|
|
90
|
+
if (versionIndex === -1)
|
|
91
|
+
return identityOf(undefined, segments[0]);
|
|
92
|
+
return identityOf(segments[versionIndex], versionIndex > 0 ? segments[versionIndex - 1] : undefined);
|
|
93
|
+
}
|
|
94
|
+
function identityOf(version, module) {
|
|
95
|
+
return {
|
|
96
|
+
...(version === undefined ? {} : { version }),
|
|
97
|
+
...(module === undefined ? {} : { module }),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function versionMatches(identity, wanted) {
|
|
101
|
+
if (identity.version === undefined)
|
|
102
|
+
return false;
|
|
103
|
+
return normalizeVersion(identity.version) === normalizeVersion(wanted);
|
|
104
|
+
}
|
|
105
|
+
function moduleMatches(identity, wanted) {
|
|
106
|
+
if (identity.module === undefined)
|
|
107
|
+
return false;
|
|
108
|
+
return identity.module.toLowerCase() === wanted.toLowerCase();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The canonical documentation root of one call.
|
|
112
|
+
*
|
|
113
|
+
* The root is a real directory inside the canonical workspace: a `docs` entry
|
|
114
|
+
* that is a link or a file is refused rather than followed, because the fence
|
|
115
|
+
* is the point of the tool and a link is how a fence is left.
|
|
116
|
+
*/
|
|
117
|
+
export async function docsRootOf(exec) {
|
|
118
|
+
const cwd = exec.agent?.session.header.cwd;
|
|
119
|
+
if (typeof cwd !== "string" || cwd.trim() === "") {
|
|
120
|
+
throw new QaDocsError("workspace-unavailable", WORKSPACE_UNAVAILABLE);
|
|
121
|
+
}
|
|
122
|
+
let workspace;
|
|
123
|
+
try {
|
|
124
|
+
workspace = canonicalCandidate(cwd);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
throw new QaDocsError("workspace-unavailable", WORKSPACE_UNAVAILABLE);
|
|
128
|
+
}
|
|
129
|
+
const candidate = join(workspace, QA_DOCS_DIRECTORY);
|
|
130
|
+
const entry = await lstat(candidate).catch((error) => error);
|
|
131
|
+
if (entry instanceof Error) {
|
|
132
|
+
if (entry.code === "ENOENT") {
|
|
133
|
+
throw new QaDocsError("docs-unavailable", DOCS_UNAVAILABLE);
|
|
134
|
+
}
|
|
135
|
+
throw new QaDocsError("workspace-unavailable", WORKSPACE_UNAVAILABLE);
|
|
136
|
+
}
|
|
137
|
+
if (entry.isSymbolicLink() || !entry.isDirectory()) {
|
|
138
|
+
throw new QaDocsError("docs-unavailable", DOCS_NOT_A_DIRECTORY);
|
|
139
|
+
}
|
|
140
|
+
let docs;
|
|
141
|
+
try {
|
|
142
|
+
docs = canonicalCandidate(candidate);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
throw new QaDocsError("workspace-unavailable", WORKSPACE_UNAVAILABLE);
|
|
146
|
+
}
|
|
147
|
+
if (!pathIsInside(docs, workspace)) {
|
|
148
|
+
throw new QaDocsError("symlink-escape", DOCS_ESCAPE);
|
|
149
|
+
}
|
|
150
|
+
return { workspace, docs };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Resolve one tool path against the documentation root.
|
|
154
|
+
*
|
|
155
|
+
* A path starting with `docs/` is read relative to the workspace; anything
|
|
156
|
+
* else is read relative to the documentation directory. Both spellings are
|
|
157
|
+
* ones the model already sees: `docs_search` reports the first, and a
|
|
158
|
+
* reviewer's remark uses it too.
|
|
159
|
+
*/
|
|
160
|
+
async function docsTargetOf(root, input) {
|
|
161
|
+
const trimmed = input.trim();
|
|
162
|
+
if (trimmed === "" || isAbsolute(trimmed)) {
|
|
163
|
+
throw new QaDocsError("outside-docs", OUTSIDE_DOCS);
|
|
164
|
+
}
|
|
165
|
+
const normalized = trimmed.replace(/\\/gu, "/").replace(/^\.\//u, "");
|
|
166
|
+
const inside = normalized === QA_DOCS_DIRECTORY ||
|
|
167
|
+
normalized.startsWith(`${QA_DOCS_DIRECTORY}/`)
|
|
168
|
+
? normalized
|
|
169
|
+
: `${QA_DOCS_DIRECTORY}/${normalized}`;
|
|
170
|
+
const spelled = resolve(root.workspace, inside);
|
|
171
|
+
if (!pathIsInside(spelled, root.docs)) {
|
|
172
|
+
throw new QaDocsError("outside-docs", OUTSIDE_DOCS);
|
|
173
|
+
}
|
|
174
|
+
let canonical;
|
|
175
|
+
try {
|
|
176
|
+
canonical = canonicalCandidate(spelled);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
throw new QaDocsError("outside-docs", OUTSIDE_DOCS);
|
|
180
|
+
}
|
|
181
|
+
if (!pathIsInside(canonical, root.docs)) {
|
|
182
|
+
throw new QaDocsError("symlink-escape", SYMLINK_ESCAPE);
|
|
183
|
+
}
|
|
184
|
+
return { absolute: canonical, pathFromDocs: relative(root.docs, canonical) };
|
|
185
|
+
}
|
|
186
|
+
/** A workspace-relative report path: `docs/<…>` with forward slashes. */
|
|
187
|
+
function reportPath(pathFromDocsRoot) {
|
|
188
|
+
return [QA_DOCS_DIRECTORY, ...pathFromDocsRoot.split(/[\\/]/u)]
|
|
189
|
+
.filter((segment) => segment !== "")
|
|
190
|
+
.join("/");
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* The lines of one documentation file.
|
|
194
|
+
*
|
|
195
|
+
* A file that is missing is a plain error, not an empty read: the model has to
|
|
196
|
+
* know that the path is wrong rather than believe a document is empty.
|
|
197
|
+
* @throws QaDocsError with `not-found` or `not-text`.
|
|
198
|
+
*/
|
|
199
|
+
async function readDocLines(absolute) {
|
|
200
|
+
const bytes = await readFile(absolute).catch(() => undefined);
|
|
201
|
+
if (bytes === undefined) {
|
|
202
|
+
throw new QaDocsError("not-found", NOT_FOUND);
|
|
203
|
+
}
|
|
204
|
+
if (bytes.byteLength > MAX_FILE_BYTES) {
|
|
205
|
+
throw new QaDocsError("not-text", NOT_TEXT);
|
|
206
|
+
}
|
|
207
|
+
let text;
|
|
208
|
+
try {
|
|
209
|
+
text = TEXT_DECODER.decode(bytes);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
throw new QaDocsError("not-text", NOT_TEXT);
|
|
213
|
+
}
|
|
214
|
+
if (text.includes("\u0000")) {
|
|
215
|
+
throw new QaDocsError("not-text", NOT_TEXT);
|
|
216
|
+
}
|
|
217
|
+
const lines = text.split(/\r?\n/u);
|
|
218
|
+
// A file that ends with a newline has no trailing empty line of its own.
|
|
219
|
+
if (lines.length > 1 && lines[lines.length - 1] === "")
|
|
220
|
+
lines.pop();
|
|
221
|
+
return lines;
|
|
222
|
+
}
|
|
223
|
+
function boundedLine(line) {
|
|
224
|
+
const trimmed = line.trim();
|
|
225
|
+
return trimmed.length > MAX_LINE_CHARS
|
|
226
|
+
? `${trimmed.slice(0, MAX_LINE_CHARS)}…`
|
|
227
|
+
: trimmed;
|
|
228
|
+
}
|
|
229
|
+
function clamp(value, low, high) {
|
|
230
|
+
if (value === undefined || !Number.isFinite(value))
|
|
231
|
+
return low;
|
|
232
|
+
return Math.min(Math.max(Math.trunc(value), low), high);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Visit every documentation file of one target, in path order.
|
|
236
|
+
*
|
|
237
|
+
* Symbolic links are counted as skipped and never followed. The visitor
|
|
238
|
+
* returns `stop` to end the walk, which is how the output budget ends it
|
|
239
|
+
* early.
|
|
240
|
+
*/
|
|
241
|
+
async function visitDocumentation(target, visit) {
|
|
242
|
+
let filesScanned = 0;
|
|
243
|
+
let skipped = 0;
|
|
244
|
+
const info = await lstat(target.absolute).catch(() => undefined);
|
|
245
|
+
if (info === undefined) {
|
|
246
|
+
throw new QaDocsError("not-found", NOT_FOUND);
|
|
247
|
+
}
|
|
248
|
+
if (info.isFile()) {
|
|
249
|
+
return {
|
|
250
|
+
filesScanned: 1,
|
|
251
|
+
skipped,
|
|
252
|
+
stopped: (await visit(target.absolute, target.pathFromDocs, true)) === "stop",
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (!info.isDirectory()) {
|
|
256
|
+
throw new QaDocsError("not-found", NOT_FOUND);
|
|
257
|
+
}
|
|
258
|
+
const pending = [target];
|
|
259
|
+
while (pending.length > 0) {
|
|
260
|
+
const scope = pending.shift();
|
|
261
|
+
const entries = await readdir(scope.absolute, {
|
|
262
|
+
withFileTypes: true,
|
|
263
|
+
}).catch(() => []);
|
|
264
|
+
entries.sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0);
|
|
265
|
+
for (const entry of entries) {
|
|
266
|
+
const child = join(scope.absolute, entry.name);
|
|
267
|
+
const pathFromDocs = join(scope.pathFromDocs, entry.name);
|
|
268
|
+
if (entry.isSymbolicLink()) {
|
|
269
|
+
skipped += 1;
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
if (entry.isDirectory()) {
|
|
273
|
+
pending.push({ absolute: child, pathFromDocs });
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
if (!entry.isFile())
|
|
277
|
+
continue;
|
|
278
|
+
filesScanned += 1;
|
|
279
|
+
if (filesScanned > MAX_FILES_SCANNED) {
|
|
280
|
+
return { filesScanned, skipped, stopped: true };
|
|
281
|
+
}
|
|
282
|
+
const outcome = await visit(child, pathFromDocs, false);
|
|
283
|
+
if (outcome === "stop") {
|
|
284
|
+
return { filesScanned, skipped, stopped: true };
|
|
285
|
+
}
|
|
286
|
+
if (outcome === "skip")
|
|
287
|
+
skipped += 1;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return { filesScanned, skipped, stopped: false };
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Search the documentation tree of one chat workspace.
|
|
294
|
+
*
|
|
295
|
+
* Matching is a case-insensitive substring test, line by line: a hit is a
|
|
296
|
+
* line, not a file, so the caller can cite it. The result is bounded twice —
|
|
297
|
+
* by `limit` hits and by the byte budget of the rendered report — and reports
|
|
298
|
+
* which bound cut it short instead of silently dropping matches.
|
|
299
|
+
* @throws QaDocsError when the tree is missing, the scope path is wrong, or the query is empty.
|
|
300
|
+
*/
|
|
301
|
+
export async function searchDocumentation(root, request) {
|
|
302
|
+
const query = request.query.trim();
|
|
303
|
+
if (query === "") {
|
|
304
|
+
throw new QaDocsError("invalid-request", INVALID_QUERY);
|
|
305
|
+
}
|
|
306
|
+
const needle = query.toLowerCase();
|
|
307
|
+
const limit = clamp(request.limit ?? QA_DOCS_SEARCH_DEFAULT_LIMIT, 1, QA_DOCS_SEARCH_MAX_LIMIT);
|
|
308
|
+
const version = request.version?.trim() ?? "";
|
|
309
|
+
const module = request.module?.trim() ?? "";
|
|
310
|
+
const scope = request.path === undefined || request.path.trim() === ""
|
|
311
|
+
? { absolute: root.docs, pathFromDocs: "" }
|
|
312
|
+
: await docsTargetOf(root, request.path);
|
|
313
|
+
const hits = [];
|
|
314
|
+
let usedBytes = 0;
|
|
315
|
+
let truncated = false;
|
|
316
|
+
const wanted = (pathFromDocs) => {
|
|
317
|
+
const identity = docsIdentityOf(pathFromDocs);
|
|
318
|
+
if (version !== "" && !versionMatches(identity, version))
|
|
319
|
+
return false;
|
|
320
|
+
if (module !== "" && !moduleMatches(identity, module))
|
|
321
|
+
return false;
|
|
322
|
+
return true;
|
|
323
|
+
};
|
|
324
|
+
const visit = async (file, pathFromDocs, explicit) => {
|
|
325
|
+
if (!wanted(pathFromDocs))
|
|
326
|
+
return "continue";
|
|
327
|
+
let lines;
|
|
328
|
+
try {
|
|
329
|
+
lines = await readDocLines(file);
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
// A file the walk merely met — binary, unreadable, gone — is skipped;
|
|
333
|
+
// a path the caller named explicitly gets the honest refusal.
|
|
334
|
+
if (explicit)
|
|
335
|
+
throw error;
|
|
336
|
+
return "skip";
|
|
337
|
+
}
|
|
338
|
+
const identity = docsIdentityOf(pathFromDocs);
|
|
339
|
+
for (const [index, line] of lines.entries()) {
|
|
340
|
+
if (!line.toLowerCase().includes(needle))
|
|
341
|
+
continue;
|
|
342
|
+
const hit = {
|
|
343
|
+
path: reportPath(pathFromDocs),
|
|
344
|
+
line: index + 1,
|
|
345
|
+
text: boundedLine(line),
|
|
346
|
+
...identity,
|
|
347
|
+
};
|
|
348
|
+
const size = Buffer.byteLength(`${hit.path}:${hit.line}: ${hit.text}`) + 1;
|
|
349
|
+
if (hits.length >= limit ||
|
|
350
|
+
usedBytes + size > QA_DOCS_SEARCH_BYTE_BUDGET) {
|
|
351
|
+
truncated = true;
|
|
352
|
+
return "stop";
|
|
353
|
+
}
|
|
354
|
+
hits.push(hit);
|
|
355
|
+
usedBytes += size;
|
|
356
|
+
}
|
|
357
|
+
return "continue";
|
|
358
|
+
};
|
|
359
|
+
const walk = await visitDocumentation(scope, visit);
|
|
360
|
+
return {
|
|
361
|
+
...identityOf(version === "" ? undefined : version, module === "" ? undefined : module),
|
|
362
|
+
query,
|
|
363
|
+
root: QA_DOCS_DIRECTORY,
|
|
364
|
+
hits,
|
|
365
|
+
truncated: truncated || walk.stopped,
|
|
366
|
+
filesScanned: walk.filesScanned,
|
|
367
|
+
skipped: walk.skipped,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Read one window of one documentation file of a chat workspace.
|
|
372
|
+
* @throws QaDocsError when the path is outside the tree, missing, a directory, or not text.
|
|
373
|
+
*/
|
|
374
|
+
export async function readDocumentation(root, request) {
|
|
375
|
+
const target = await docsTargetOf(root, request.path);
|
|
376
|
+
const info = await lstat(target.absolute).catch(() => undefined);
|
|
377
|
+
if (info === undefined) {
|
|
378
|
+
throw new QaDocsError("not-found", NOT_FOUND);
|
|
379
|
+
}
|
|
380
|
+
if (info.isDirectory()) {
|
|
381
|
+
throw new QaDocsError("not-a-file", NOT_A_FILE);
|
|
382
|
+
}
|
|
383
|
+
if (!info.isFile()) {
|
|
384
|
+
throw new QaDocsError("not-found", NOT_FOUND);
|
|
385
|
+
}
|
|
386
|
+
const lines = await readDocLines(target.absolute);
|
|
387
|
+
const from = Math.max(1, Math.trunc(request.from ?? 1) || 1);
|
|
388
|
+
const window = clamp(request.lines ?? QA_DOCS_READ_DEFAULT_LINES, 1, QA_DOCS_READ_MAX_LINES);
|
|
389
|
+
const to = Math.min(from + window - 1, lines.length);
|
|
390
|
+
return {
|
|
391
|
+
...docsIdentityOf(target.pathFromDocs),
|
|
392
|
+
path: reportPath(target.pathFromDocs),
|
|
393
|
+
from,
|
|
394
|
+
to,
|
|
395
|
+
totalLines: lines.length,
|
|
396
|
+
truncated: to < lines.length || from > 1,
|
|
397
|
+
text: lines.slice(from - 1, Math.max(to, from - 1)).join("\n"),
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
function filtersOf(identity) {
|
|
401
|
+
const parts = [];
|
|
402
|
+
if (identity.version !== undefined && identity.version !== "") {
|
|
403
|
+
parts.push(`version ${identity.version}`);
|
|
404
|
+
}
|
|
405
|
+
if (identity.module !== undefined && identity.module !== "") {
|
|
406
|
+
parts.push(`module ${identity.module}`);
|
|
407
|
+
}
|
|
408
|
+
return parts.length === 0 ? "" : ` (${parts.join(", ")})`;
|
|
409
|
+
}
|
|
410
|
+
function identityLabel(identity) {
|
|
411
|
+
return filtersOf(identity);
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* `docs_search` — the catalog's documentation search.
|
|
415
|
+
*
|
|
416
|
+
* The description is part of the tool's job: it states that documentation is
|
|
417
|
+
* read here, from `docs/`, and that memory is not a documentation source. The
|
|
418
|
+
* version/module facets exist so a model that has been told "3.8" stops
|
|
419
|
+
* sweeping the whole tree.
|
|
420
|
+
*/
|
|
421
|
+
export function createDocsSearchTool() {
|
|
422
|
+
return defineTool({
|
|
423
|
+
name: "docs_search",
|
|
424
|
+
description: `Search the stand's documentation, which lives in the ${QA_DOCS_DIRECTORY}/ directory of this chat's workspace. Use it — not memory and not a glob sweep over guessed paths — whenever a question is about the product, a version or a module. Hits are lines, tagged with the module and version parsed from the path (${QA_DOCS_DIRECTORY}/<module>/<version>/…); pass version and module to stay inside one edition, and path to stay inside one subtree. Output is bounded by limit and by a byte budget, and a truncated result says so.`,
|
|
425
|
+
parameters: {
|
|
426
|
+
query: {
|
|
427
|
+
type: "string",
|
|
428
|
+
required: true,
|
|
429
|
+
description: "Phrase to look for, matched case-insensitively inside single lines of documentation files.",
|
|
430
|
+
},
|
|
431
|
+
version: {
|
|
432
|
+
type: "string",
|
|
433
|
+
description: "Keep only documentation from this version, e.g. `3.8` (the directory segment the path carries).",
|
|
434
|
+
},
|
|
435
|
+
module: {
|
|
436
|
+
type: "string",
|
|
437
|
+
description: "Keep only documentation from this module, e.g. `platform` (the directory segment before the version).",
|
|
438
|
+
},
|
|
439
|
+
path: {
|
|
440
|
+
type: "string",
|
|
441
|
+
description: `Narrow the search to one subtree, e.g. \`${QA_DOCS_DIRECTORY}/platform/3.8\` or \`platform/3.8\`.`,
|
|
442
|
+
},
|
|
443
|
+
limit: {
|
|
444
|
+
type: "number",
|
|
445
|
+
description: `Maximum hits to return (default ${QA_DOCS_SEARCH_DEFAULT_LIMIT}, at most ${QA_DOCS_SEARCH_MAX_LIMIT}).`,
|
|
446
|
+
},
|
|
447
|
+
},
|
|
448
|
+
output: {
|
|
449
|
+
schema: {
|
|
450
|
+
type: "object",
|
|
451
|
+
additionalProperties: false,
|
|
452
|
+
properties: {
|
|
453
|
+
query: { type: "string", required: true },
|
|
454
|
+
root: { type: "string", required: true },
|
|
455
|
+
hits: {
|
|
456
|
+
type: "array",
|
|
457
|
+
required: true,
|
|
458
|
+
items: {
|
|
459
|
+
type: "object",
|
|
460
|
+
additionalProperties: false,
|
|
461
|
+
properties: {
|
|
462
|
+
path: { type: "string", required: true },
|
|
463
|
+
line: { type: "number", required: true },
|
|
464
|
+
text: { type: "string", required: true },
|
|
465
|
+
version: { type: "string" },
|
|
466
|
+
module: { type: "string" },
|
|
467
|
+
},
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
truncated: { type: "boolean", required: true },
|
|
471
|
+
filesScanned: { type: "integer", required: true },
|
|
472
|
+
skipped: { type: "integer", required: true },
|
|
473
|
+
},
|
|
474
|
+
},
|
|
475
|
+
render: (_args, value) => {
|
|
476
|
+
const result = value;
|
|
477
|
+
const filters = filtersOf(result);
|
|
478
|
+
if (result.hits.length === 0) {
|
|
479
|
+
return [
|
|
480
|
+
{
|
|
481
|
+
type: "text",
|
|
482
|
+
text: `No documentation under ${QA_DOCS_DIRECTORY}/ matches "${result.query}"${filters} (${result.filesScanned} file(s) scanned). Try another phrase, or widen version/module/path.`,
|
|
483
|
+
},
|
|
484
|
+
];
|
|
485
|
+
}
|
|
486
|
+
const lines = [
|
|
487
|
+
`${result.hits.length} match(es) for "${result.query}" in ${QA_DOCS_DIRECTORY}/${filters === "" ? "" : filters} (${result.filesScanned} file(s) scanned)${result.truncated ? " — truncated, narrow with version, module or path" : ""}:`,
|
|
488
|
+
];
|
|
489
|
+
for (const hit of result.hits) {
|
|
490
|
+
lines.push(` ${hit.path}:${hit.line}${identityLabel(hit)} ${hit.text}`);
|
|
491
|
+
}
|
|
492
|
+
return [{ type: "text", text: lines.join("\n") }];
|
|
493
|
+
},
|
|
494
|
+
},
|
|
495
|
+
execute: async (args, exec) => {
|
|
496
|
+
const root = await docsRootOf(exec);
|
|
497
|
+
return searchDocumentation(root, {
|
|
498
|
+
query: args.query,
|
|
499
|
+
version: args.version,
|
|
500
|
+
module: args.module,
|
|
501
|
+
path: args.path,
|
|
502
|
+
limit: args.limit,
|
|
503
|
+
});
|
|
504
|
+
},
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
/** `docs_read` — open one documentation file at a bounded window of lines. */
|
|
508
|
+
export function createDocsReadTool() {
|
|
509
|
+
return defineTool({
|
|
510
|
+
name: "docs_read",
|
|
511
|
+
description: `Read one documentation file of this chat's workspace, ${QA_DOCS_DIRECTORY}/, at a bounded window of lines. Use it after docs_search reports a path, to read the passage a hit belongs to. Only files inside ${QA_DOCS_DIRECTORY}/ can be read; directories, paths outside the tree and paths that leave it through a symbolic link are refused with the reason.`,
|
|
512
|
+
parameters: {
|
|
513
|
+
path: {
|
|
514
|
+
type: "string",
|
|
515
|
+
required: true,
|
|
516
|
+
description: `The documentation file, as docs_search reports it (\`${QA_DOCS_DIRECTORY}/<module>/<version>/<file>\`) or relative to ${QA_DOCS_DIRECTORY}/.`,
|
|
517
|
+
},
|
|
518
|
+
from: {
|
|
519
|
+
type: "number",
|
|
520
|
+
description: "First line to read, 1-based (default 1).",
|
|
521
|
+
},
|
|
522
|
+
lines: {
|
|
523
|
+
type: "number",
|
|
524
|
+
description: `How many lines to read (default ${QA_DOCS_READ_DEFAULT_LINES}, at most ${QA_DOCS_READ_MAX_LINES}).`,
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
output: {
|
|
528
|
+
schema: {
|
|
529
|
+
type: "object",
|
|
530
|
+
additionalProperties: false,
|
|
531
|
+
properties: {
|
|
532
|
+
path: { type: "string", required: true },
|
|
533
|
+
from: { type: "number", required: true },
|
|
534
|
+
to: { type: "number", required: true },
|
|
535
|
+
totalLines: { type: "number", required: true },
|
|
536
|
+
truncated: { type: "boolean", required: true },
|
|
537
|
+
text: { type: "string", required: true },
|
|
538
|
+
version: { type: "string" },
|
|
539
|
+
module: { type: "string" },
|
|
540
|
+
},
|
|
541
|
+
},
|
|
542
|
+
render: (_args, value) => {
|
|
543
|
+
const result = value;
|
|
544
|
+
const lines = [
|
|
545
|
+
`${result.path} (lines ${result.from}–${result.to} of ${result.totalLines}${identityLabel(result)})${result.truncated ? " — window truncated, read on with from" : ""}:`,
|
|
546
|
+
];
|
|
547
|
+
result.text.split("\n").forEach((line, index) => {
|
|
548
|
+
lines.push(`${result.from + index} ${line}`);
|
|
549
|
+
});
|
|
550
|
+
return [{ type: "text", text: lines.join("\n") }];
|
|
551
|
+
},
|
|
552
|
+
},
|
|
553
|
+
execute: async (args, exec) => {
|
|
554
|
+
const root = await docsRootOf(exec);
|
|
555
|
+
return readDocumentation(root, {
|
|
556
|
+
path: args.path,
|
|
557
|
+
from: args.from,
|
|
558
|
+
lines: args.lines,
|
|
559
|
+
});
|
|
560
|
+
},
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=docs-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-tools.js","sourceRoot":"","sources":["../../src/qa-tools/docs-tools.ts"],"names":[],"mappings":"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"}
|
package/lib/resolve-config.js
CHANGED
|
@@ -2,6 +2,7 @@ import { resolveAccounts } from "./config-resolvers/accounts.js";
|
|
|
2
2
|
import { resolveAttachments } from "./config-resolvers/attachments.js";
|
|
3
3
|
import { normalizeRoutePath, resolveBasics, } from "./config-resolvers/basics.js";
|
|
4
4
|
import { DEFAULT_QA_SURFACE_CONFIG } from "./config-resolvers/defaults.js";
|
|
5
|
+
import { resolveIntegration } from "./config-resolvers/integration.js";
|
|
5
6
|
import { resolveLockdown } from "./config-resolvers/lockdown.js";
|
|
6
7
|
import { resolveNotes } from "./config-resolvers/notes.js";
|
|
7
8
|
import { resolveSession } from "./config-resolvers/session.js";
|
|
@@ -46,6 +47,9 @@ export function resolveConfig(input = {}) {
|
|
|
46
47
|
attachments,
|
|
47
48
|
tools,
|
|
48
49
|
notes: resolveNotes(input.notes),
|
|
50
|
+
// Last, because it reads the resolved accounts domain: the API cannot be
|
|
51
|
+
// switched on without an account store to authenticate against.
|
|
52
|
+
integration: resolveIntegration(input.integration, accounts),
|
|
49
53
|
});
|
|
50
54
|
}
|
|
51
55
|
//# sourceMappingURL=resolve-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAK,GAAoB,EAAE;IAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,yEAAyE;IACzE,iEAAiE;IACjE,MAAM,aAAa,GAAG,oBAAoB,CACxC,KAAK,EACL,QAAQ,CAAC,kBAAkB,CAC5B,CAAC;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,EAAE;QACF,kBAAkB,EAAE,eAAe,CACjC,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,CAAC,kBAAkB,CACzE;QACD,eAAe,EAAE,aAAa,CAC5B,KAAK,CAAC,eAAe,IAAI,yBAAyB,CAAC,eAAe,CACnE;QACD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;QACR,aAAa;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO;QACP,WAAW;QACX,KAAK;QACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAK,GAAoB,EAAE;IAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,yEAAyE;IACzE,iEAAiE;IACjE,MAAM,aAAa,GAAG,oBAAoB,CACxC,KAAK,EACL,QAAQ,CAAC,kBAAkB,CAC5B,CAAC;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,EAAE;QACF,kBAAkB,EAAE,eAAe,CACjC,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,CAAC,kBAAkB,CACzE;QACD,eAAe,EAAE,aAAa,CAC5B,KAAK,CAAC,eAAe,IAAI,yBAAyB,CAAC,eAAe,CACnE;QACD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;QACR,aAAa;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO;QACP,WAAW;QACX,KAAK;QACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;QAChC,yEAAyE;QACzE,gEAAgE;QAChE,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC;KAC7D,CAAC,CAAC;AACL,CAAC"}
|