@zackbart/connecta 0.10.0 → 0.10.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/AGENTS.md +113 -0
- package/CHANGELOG.md +83 -0
- package/README.md +62 -12
- package/bin/connecta.mjs +272 -0
- package/dist/access-tokens.d.ts +32 -0
- package/dist/access-tokens.d.ts.map +1 -0
- package/dist/access-tokens.js +225 -0
- package/dist/access-tokens.js.map +1 -0
- package/dist/catalog-service.d.ts +39 -1
- package/dist/catalog-service.d.ts.map +1 -1
- package/dist/catalog-service.js +133 -11
- package/dist/catalog-service.js.map +1 -1
- package/dist/catalog.d.ts +17 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +113 -13
- package/dist/catalog.js.map +1 -1
- package/dist/execute.d.ts +45 -1
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +265 -68
- package/dist/execute.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/invocation.d.ts.map +1 -1
- package/dist/invocation.js +1 -5
- package/dist/invocation.js.map +1 -1
- package/dist/meta-tools.d.ts +1 -0
- package/dist/meta-tools.d.ts.map +1 -1
- package/dist/meta-tools.js +410 -12
- package/dist/meta-tools.js.map +1 -1
- package/dist/operator-ui/generated.d.ts +2 -2
- package/dist/operator-ui/generated.d.ts.map +1 -1
- package/dist/operator-ui/generated.js +2 -2
- package/dist/operator-ui/generated.js.map +1 -1
- package/dist/operator-ui/model.d.ts +2 -0
- package/dist/operator-ui/model.d.ts.map +1 -1
- package/dist/operator-ui/model.js.map +1 -1
- package/dist/routes/access-tokens.d.ts +7 -0
- package/dist/routes/access-tokens.d.ts.map +1 -0
- package/dist/routes/access-tokens.js +84 -0
- package/dist/routes/access-tokens.js.map +1 -0
- package/dist/routes/shared.d.ts +3 -0
- package/dist/routes/shared.d.ts.map +1 -1
- package/dist/routes/shared.js.map +1 -1
- package/dist/routes/ui.d.ts.map +1 -1
- package/dist/routes/ui.js +9 -1
- package/dist/routes/ui.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +5 -0
- package/dist/server.js.map +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +1 -1
- package/dist/storage/file.d.ts.map +1 -1
- package/dist/storage/file.js +5 -0
- package/dist/storage/file.js.map +1 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +8 -0
- package/dist/storage/memory.js.map +1 -1
- package/dist/tool-safety.d.ts +10 -0
- package/dist/tool-safety.d.ts.map +1 -0
- package/dist/tool-safety.js +12 -0
- package/dist/tool-safety.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts +4 -4
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +44 -1
- package/dist/ui.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/documentation/architecture.md +7 -0
- package/documentation/auth.md +58 -0
- package/documentation/call-admission.md +7 -0
- package/documentation/code-first-exploration.md +292 -0
- package/documentation/code-mode.md +697 -0
- package/documentation/connector-guides.md +7 -0
- package/documentation/connectors.md +63 -0
- package/documentation/mcp-2026-07-28.md +46 -0
- package/documentation/meta-tools.md +167 -0
- package/documentation/operations.md +7 -0
- package/documentation/operator-ui.md +7 -0
- package/documentation/request-admission.md +7 -0
- package/documentation/storage-and-credentials.md +54 -0
- package/ethos.md +132 -0
- package/examples/node/README.md +53 -0
- package/examples/node/src/index.ts +73 -0
- package/examples/worker/README.md +160 -0
- package/examples/worker/src/cloudflare-kv.ts +43 -0
- package/examples/worker/src/d1-activity-row.ts +100 -0
- package/examples/worker/src/d1-activity.ts +144 -0
- package/examples/worker/src/index.ts +136 -0
- package/examples/worker/wrangler.jsonc +26 -0
- package/package.json +11 -1
- package/src/access-tokens.ts +289 -0
- package/src/catalog-service.ts +177 -15
- package/src/catalog.ts +143 -12
- package/src/execute.ts +372 -96
- package/src/index.ts +33 -1
- package/src/invocation.ts +1 -8
- package/src/meta-tools.ts +504 -11
- package/src/operator-ui/browser.css +63 -0
- package/src/operator-ui/browser.ts +288 -2
- package/src/operator-ui/generated.ts +2 -2
- package/src/operator-ui/model.ts +6 -0
- package/src/routes/access-tokens.ts +115 -0
- package/src/routes/shared.ts +3 -0
- package/src/routes/ui.ts +9 -0
- package/src/server.ts +5 -0
- package/src/skills.ts +1 -1
- package/src/storage/file.ts +5 -0
- package/src/storage/memory.ts +8 -0
- package/src/tool-safety.ts +15 -0
- package/src/types.ts +5 -0
- package/src/ui.ts +50 -1
- package/src/version.ts +1 -1
- package/templates/node/.env.example +5 -0
- package/templates/node/AGENTS.md +19 -0
- package/templates/node/README.md +33 -0
- package/templates/node/package.json +23 -0
- package/templates/node/src/index.ts +43 -0
- package/templates/node/tsconfig.json +12 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
const TOKEN_PREFIX = "cta_";
|
|
2
|
+
const TOKEN_BYTES = 32;
|
|
3
|
+
const TOKEN_VALUE_RE = /^cta_[A-Za-z0-9_-]{43}$/;
|
|
4
|
+
const RECORD_PREFIX = "access-token:v1:record:";
|
|
5
|
+
const LOOKUP_PREFIX = "access-token:v1:lookup:";
|
|
6
|
+
const MAX_NAME_CHARACTERS = 80;
|
|
7
|
+
const DEFAULT_MAX_ACTIVE = 100;
|
|
8
|
+
const MAX_CONFIGURED_ACTIVE = 1_000;
|
|
9
|
+
const encoder = new TextEncoder();
|
|
10
|
+
function recordKey(id) {
|
|
11
|
+
return `${RECORD_PREFIX}${id}`;
|
|
12
|
+
}
|
|
13
|
+
function lookupKey(hash) {
|
|
14
|
+
return `${LOOKUP_PREFIX}${hash}`;
|
|
15
|
+
}
|
|
16
|
+
function bytesToBase64Url(bytes) {
|
|
17
|
+
let binary = "";
|
|
18
|
+
for (const byte of bytes)
|
|
19
|
+
binary += String.fromCharCode(byte);
|
|
20
|
+
return btoa(binary)
|
|
21
|
+
.replaceAll("+", "-")
|
|
22
|
+
.replaceAll("/", "_")
|
|
23
|
+
.replace(/=+$/u, "");
|
|
24
|
+
}
|
|
25
|
+
function bytesToHex(bytes) {
|
|
26
|
+
return [...bytes]
|
|
27
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
28
|
+
.join("");
|
|
29
|
+
}
|
|
30
|
+
async function hashToken(token) {
|
|
31
|
+
return bytesToHex(new Uint8Array(await crypto.subtle.digest("SHA-256", encoder.encode(token))));
|
|
32
|
+
}
|
|
33
|
+
function normalizeName(value) {
|
|
34
|
+
if (typeof value !== "string") {
|
|
35
|
+
throw new Error("Token name must be a string");
|
|
36
|
+
}
|
|
37
|
+
const compact = value.replace(/\s+/gu, " ").trim();
|
|
38
|
+
if (!compact)
|
|
39
|
+
throw new Error("Token name cannot be empty");
|
|
40
|
+
if (Array.from(compact).length > MAX_NAME_CHARACTERS) {
|
|
41
|
+
throw new Error(`Token name cannot exceed ${MAX_NAME_CHARACTERS} characters`);
|
|
42
|
+
}
|
|
43
|
+
return compact;
|
|
44
|
+
}
|
|
45
|
+
function parseRecord(raw) {
|
|
46
|
+
try {
|
|
47
|
+
const value = JSON.parse(raw);
|
|
48
|
+
if (value.version !== 1 ||
|
|
49
|
+
typeof value.id !== "string" ||
|
|
50
|
+
!/^[0-9a-f-]{36}$/u.test(value.id) ||
|
|
51
|
+
typeof value.name !== "string" ||
|
|
52
|
+
typeof value.tokenHash !== "string" ||
|
|
53
|
+
!/^[0-9a-f]{64}$/u.test(value.tokenHash) ||
|
|
54
|
+
typeof value.tokenPrefix !== "string" ||
|
|
55
|
+
typeof value.createdAt !== "string" ||
|
|
56
|
+
typeof value.createdBy !== "string" ||
|
|
57
|
+
(value.revokedAt !== undefined &&
|
|
58
|
+
typeof value.revokedAt !== "string") ||
|
|
59
|
+
(value.revokedBy !== undefined &&
|
|
60
|
+
typeof value.revokedBy !== "string")) {
|
|
61
|
+
throw new Error("invalid token record");
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new Error("Stored access token metadata is invalid or corrupted");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function parseLookup(raw) {
|
|
70
|
+
try {
|
|
71
|
+
const value = JSON.parse(raw);
|
|
72
|
+
return value.version === 1 && typeof value.id === "string"
|
|
73
|
+
? { version: 1, id: value.id }
|
|
74
|
+
: null;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function metadata(record) {
|
|
81
|
+
return {
|
|
82
|
+
id: record.id,
|
|
83
|
+
name: record.name,
|
|
84
|
+
tokenPrefix: record.tokenPrefix,
|
|
85
|
+
createdAt: record.createdAt,
|
|
86
|
+
...(record.revokedAt ? { revokedAt: record.revokedAt } : {}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function unauthorized() {
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
response: new Response(JSON.stringify({ error: "unauthorized" }), {
|
|
93
|
+
status: 401,
|
|
94
|
+
headers: {
|
|
95
|
+
"Content-Type": "application/json",
|
|
96
|
+
"WWW-Authenticate": "Bearer",
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Deployment-scoped personal access tokens. Secret material is never
|
|
103
|
+
* recoverable: authentication indexes a SHA-256 digest of a random 256-bit
|
|
104
|
+
* token, while separately enumerable metadata powers operator management.
|
|
105
|
+
*/
|
|
106
|
+
export class AccessTokenManager {
|
|
107
|
+
storage;
|
|
108
|
+
auth;
|
|
109
|
+
maxActive;
|
|
110
|
+
constructor(storage, options = {}) {
|
|
111
|
+
this.storage = storage;
|
|
112
|
+
if (!storage.list) {
|
|
113
|
+
throw new Error("accessTokens requires a storage adapter that implements list(prefix)");
|
|
114
|
+
}
|
|
115
|
+
const maxActive = options.maxActive ?? DEFAULT_MAX_ACTIVE;
|
|
116
|
+
if (!Number.isInteger(maxActive) ||
|
|
117
|
+
maxActive < 1 ||
|
|
118
|
+
maxActive > MAX_CONFIGURED_ACTIVE) {
|
|
119
|
+
throw new Error(`accessTokens.maxActive must be a whole number from 1 to ${MAX_CONFIGURED_ACTIVE}`);
|
|
120
|
+
}
|
|
121
|
+
this.maxActive = maxActive;
|
|
122
|
+
this.auth = {
|
|
123
|
+
kind: "access_token",
|
|
124
|
+
activityActorNamespace: "connecta:access-tokens:v1",
|
|
125
|
+
activityActorLabel: async (id) => {
|
|
126
|
+
try {
|
|
127
|
+
return (await this.read(id))?.name;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
authorize: (request) => this.authorize(request),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
async read(id) {
|
|
137
|
+
const raw = await this.storage.get(recordKey(id));
|
|
138
|
+
return raw ? parseRecord(raw) : null;
|
|
139
|
+
}
|
|
140
|
+
async list() {
|
|
141
|
+
const keys = await this.storage.list(RECORD_PREFIX);
|
|
142
|
+
const records = await Promise.all(keys.map(async (key) => {
|
|
143
|
+
const raw = await this.storage.get(key);
|
|
144
|
+
return raw ? parseRecord(raw) : null;
|
|
145
|
+
}));
|
|
146
|
+
return records
|
|
147
|
+
.filter((record) => Boolean(record))
|
|
148
|
+
.sort((a, b) => b.createdAt.localeCompare(a.createdAt))
|
|
149
|
+
.map(metadata);
|
|
150
|
+
}
|
|
151
|
+
async create(name, createdBy) {
|
|
152
|
+
const normalizedName = normalizeName(name);
|
|
153
|
+
const active = (await this.list()).filter((token) => !token.revokedAt);
|
|
154
|
+
if (active.length >= this.maxActive) {
|
|
155
|
+
throw new Error(`This deployment already has the maximum of ${this.maxActive} active access tokens`);
|
|
156
|
+
}
|
|
157
|
+
const secretBytes = crypto.getRandomValues(new Uint8Array(TOKEN_BYTES));
|
|
158
|
+
const token = TOKEN_PREFIX + bytesToBase64Url(secretBytes);
|
|
159
|
+
const hash = await hashToken(token);
|
|
160
|
+
if (await this.storage.get(lookupKey(hash))) {
|
|
161
|
+
throw new Error("Access token collision; create another token");
|
|
162
|
+
}
|
|
163
|
+
const record = {
|
|
164
|
+
version: 1,
|
|
165
|
+
id: crypto.randomUUID(),
|
|
166
|
+
name: normalizedName,
|
|
167
|
+
tokenHash: hash,
|
|
168
|
+
tokenPrefix: token.slice(0, 12),
|
|
169
|
+
createdAt: new Date().toISOString(),
|
|
170
|
+
createdBy,
|
|
171
|
+
};
|
|
172
|
+
await this.storage.set(recordKey(record.id), JSON.stringify(record));
|
|
173
|
+
try {
|
|
174
|
+
await this.storage.set(lookupKey(hash), JSON.stringify({ version: 1, id: record.id }));
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
await this.storage.delete(recordKey(record.id)).catch(() => { });
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
return { token, accessToken: metadata(record) };
|
|
181
|
+
}
|
|
182
|
+
async rename(id, name) {
|
|
183
|
+
const record = await this.read(id);
|
|
184
|
+
if (!record)
|
|
185
|
+
return null;
|
|
186
|
+
record.name = normalizeName(name);
|
|
187
|
+
await this.storage.set(recordKey(id), JSON.stringify(record));
|
|
188
|
+
return metadata(record);
|
|
189
|
+
}
|
|
190
|
+
async revoke(id, revokedBy) {
|
|
191
|
+
const record = await this.read(id);
|
|
192
|
+
if (!record)
|
|
193
|
+
return null;
|
|
194
|
+
if (!record.revokedAt) {
|
|
195
|
+
// Admission disappears first. A metadata-write failure may leave the UI
|
|
196
|
+
// calling the record active, but can never leave a token labelled
|
|
197
|
+
// revoked while its lookup still admits requests.
|
|
198
|
+
await this.storage.delete(lookupKey(record.tokenHash));
|
|
199
|
+
record.revokedAt = new Date().toISOString();
|
|
200
|
+
record.revokedBy = revokedBy;
|
|
201
|
+
await this.storage.set(recordKey(id), JSON.stringify(record));
|
|
202
|
+
}
|
|
203
|
+
return metadata(record);
|
|
204
|
+
}
|
|
205
|
+
async authorize(request) {
|
|
206
|
+
const header = request.headers.get("authorization") ?? "";
|
|
207
|
+
const match = /^Bearer\s+(.+)$/iu.exec(header);
|
|
208
|
+
const token = match?.[1];
|
|
209
|
+
if (!token || !TOKEN_VALUE_RE.test(token))
|
|
210
|
+
return unauthorized();
|
|
211
|
+
const hash = await hashToken(token);
|
|
212
|
+
const lookupRaw = await this.storage.get(lookupKey(hash));
|
|
213
|
+
if (!lookupRaw)
|
|
214
|
+
return unauthorized();
|
|
215
|
+
const lookup = parseLookup(lookupRaw);
|
|
216
|
+
if (!lookup)
|
|
217
|
+
return unauthorized();
|
|
218
|
+
const record = await this.read(lookup.id);
|
|
219
|
+
if (!record || record.revokedAt || record.tokenHash !== hash) {
|
|
220
|
+
return unauthorized();
|
|
221
|
+
}
|
|
222
|
+
return { ok: true, subjectId: record.id };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=access-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-tokens.js","sourceRoot":"","sources":["../src/access-tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,11 @@ export declare function boundedDiscoveryText(value: unknown, hint: string): stri
|
|
|
14
14
|
export interface CatalogSearchArgs {
|
|
15
15
|
query?: string;
|
|
16
16
|
connector?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Result classification only; never changes which tools exist or what may
|
|
19
|
+
* execute. Omitted and "all" preserve the complete configured catalog.
|
|
20
|
+
*/
|
|
21
|
+
safety?: "readOnly" | "approvalRequired" | "all";
|
|
17
22
|
limit?: number;
|
|
18
23
|
offset?: number;
|
|
19
24
|
fullDescriptions?: boolean;
|
|
@@ -35,6 +40,8 @@ interface CatalogSearchEntry {
|
|
|
35
40
|
description?: string;
|
|
36
41
|
inputSchema?: unknown;
|
|
37
42
|
outputSchema?: unknown;
|
|
43
|
+
inputSchemaTruncated?: true;
|
|
44
|
+
outputSchemaTruncated?: true;
|
|
38
45
|
inputKeys?: string[];
|
|
39
46
|
requiredInputKeys?: string[];
|
|
40
47
|
outputKeys?: string[];
|
|
@@ -49,6 +56,16 @@ export interface CatalogSearchPage {
|
|
|
49
56
|
hasMore: boolean;
|
|
50
57
|
nextOffset?: number;
|
|
51
58
|
matchMode?: "partial";
|
|
59
|
+
queryAnalysis?: {
|
|
60
|
+
representedTerms: string[];
|
|
61
|
+
otherResultTerms: string[];
|
|
62
|
+
unmatchedTerms: string[];
|
|
63
|
+
truncated?: true;
|
|
64
|
+
connectorScope?: string;
|
|
65
|
+
unknownConnector?: true;
|
|
66
|
+
unavailableConnectorCount?: number;
|
|
67
|
+
guidance?: string;
|
|
68
|
+
};
|
|
52
69
|
}
|
|
53
70
|
export interface CatalogDescription {
|
|
54
71
|
address: string;
|
|
@@ -108,12 +125,21 @@ export declare class CatalogService {
|
|
|
108
125
|
describe(args: CatalogDescribeArgs): Promise<CatalogDescription[]>;
|
|
109
126
|
}
|
|
110
127
|
export declare function groupedSearchResult(page: CatalogSearchPage): {
|
|
128
|
+
queryAnalysis?: {
|
|
129
|
+
representedTerms: string[];
|
|
130
|
+
otherResultTerms: string[];
|
|
131
|
+
unmatchedTerms: string[];
|
|
132
|
+
truncated?: true;
|
|
133
|
+
connectorScope?: string;
|
|
134
|
+
unknownConnector?: true;
|
|
135
|
+
unavailableConnectorCount?: number;
|
|
136
|
+
guidance?: string;
|
|
137
|
+
};
|
|
111
138
|
matchMode?: "partial";
|
|
112
139
|
nextOffset?: number;
|
|
113
140
|
connectors: {
|
|
114
141
|
id: string;
|
|
115
142
|
title?: string;
|
|
116
|
-
description?: string;
|
|
117
143
|
guide?: string;
|
|
118
144
|
tools: CatalogSearchEntry["tool"][];
|
|
119
145
|
}[];
|
|
@@ -123,6 +149,16 @@ export declare function groupedSearchResult(page: CatalogSearchPage): {
|
|
|
123
149
|
hasMore: boolean;
|
|
124
150
|
};
|
|
125
151
|
export declare function flatSearchResult(page: CatalogSearchPage): {
|
|
152
|
+
queryAnalysis?: {
|
|
153
|
+
representedTerms: string[];
|
|
154
|
+
otherResultTerms: string[];
|
|
155
|
+
unmatchedTerms: string[];
|
|
156
|
+
truncated?: true;
|
|
157
|
+
connectorScope?: string;
|
|
158
|
+
unknownConnector?: true;
|
|
159
|
+
unavailableConnectorCount?: number;
|
|
160
|
+
guidance?: string;
|
|
161
|
+
};
|
|
126
162
|
matchMode?: "partial";
|
|
127
163
|
nextOffset?: number;
|
|
128
164
|
tools: {
|
|
@@ -131,6 +167,8 @@ export declare function flatSearchResult(page: CatalogSearchPage): {
|
|
|
131
167
|
description?: string;
|
|
132
168
|
inputSchema?: unknown;
|
|
133
169
|
outputSchema?: unknown;
|
|
170
|
+
inputSchemaTruncated?: true;
|
|
171
|
+
outputSchemaTruncated?: true;
|
|
134
172
|
inputKeys?: string[];
|
|
135
173
|
requiredInputKeys?: string[];
|
|
136
174
|
outputKeys?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-service.d.ts","sourceRoot":"","sources":["../src/catalog-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog-service.d.ts","sourceRoot":"","sources":["../src/catalog-service.ts"],"names":[],"mappings":"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"}
|
package/dist/catalog-service.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import { compactSchema, lexicalCorpusStatistics, lexicalSearchQuery, rankTools, schemaObjectKeys, summarizeDescription, } from "./catalog.js";
|
|
1
|
+
import { compactDiscoverySchema, compactSchema, lexicalCorpusStatistics, lexicalQueryTerms, lexicalSearchQuery, rankTools, schemaObjectKeys, summarizeDiscoveryDescription, summarizeDescription, } from "./catalog.js";
|
|
2
2
|
import { mapSettledWithConcurrency, resolveDiscoveryConcurrency, } from "./concurrency.js";
|
|
3
3
|
import { classifyCallError, framingError } from "./errors.js";
|
|
4
4
|
import { connectorGuide, connectorSkillName, } from "./skills.js";
|
|
5
5
|
import { DEFAULT_PROBE_TIMEOUT_MS, normalizeTimeoutMs, withAbortableTimeout, } from "./timeout.js";
|
|
6
|
+
import { isExplicitlyReadOnly } from "./tool-safety.js";
|
|
6
7
|
export const DEFAULT_SEARCH_LIMIT = 8;
|
|
7
8
|
export const MAX_SEARCH_LIMIT = 100;
|
|
8
9
|
export const MAX_DESCRIBE_ADDRESSES = 100;
|
|
9
10
|
export const MAX_DISCOVERY_RESULT_BYTES = 256_000;
|
|
11
|
+
const MAX_QUERY_ANALYSIS_TERMS = 8;
|
|
12
|
+
const MAX_QUERY_ANALYSIS_TERM_LENGTH = 64;
|
|
10
13
|
const encoder = new TextEncoder();
|
|
11
14
|
export class DiscoveryPolicyError extends Error {
|
|
12
15
|
code;
|
|
@@ -50,6 +53,23 @@ export function boundedDiscoveryText(value, hint) {
|
|
|
50
53
|
}
|
|
51
54
|
return text;
|
|
52
55
|
}
|
|
56
|
+
function discoverySafety(value) {
|
|
57
|
+
if (value === undefined)
|
|
58
|
+
return "all";
|
|
59
|
+
if (value !== "readOnly" &&
|
|
60
|
+
value !== "approvalRequired" &&
|
|
61
|
+
value !== "all") {
|
|
62
|
+
throw new DiscoveryPolicyError("invalid_args", 'safety must be "readOnly", "approvalRequired", or "all".');
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function toolsForSafety(tools, safety) {
|
|
67
|
+
if (safety === "all")
|
|
68
|
+
return tools;
|
|
69
|
+
return tools.filter((tool) => safety === "readOnly"
|
|
70
|
+
? isExplicitlyReadOnly(tool)
|
|
71
|
+
: !isExplicitlyReadOnly(tool));
|
|
72
|
+
}
|
|
53
73
|
/**
|
|
54
74
|
* Code-mode key metadata for one match. Each half is omitted when its schema
|
|
55
75
|
* does not resolve to an object shape, so a program reads "no metadata, use the
|
|
@@ -71,6 +91,12 @@ function schemaKeyMetadata(input, output) {
|
|
|
71
91
|
function renderSchema(schema, format) {
|
|
72
92
|
return format === "json" ? schema : compactSchema(schema);
|
|
73
93
|
}
|
|
94
|
+
function renderSearchSchema(schema, format) {
|
|
95
|
+
if (format === "json")
|
|
96
|
+
return { schema, truncated: false };
|
|
97
|
+
const compact = compactDiscoverySchema(schema);
|
|
98
|
+
return { schema: compact.text, truncated: compact.truncated };
|
|
99
|
+
}
|
|
74
100
|
/**
|
|
75
101
|
* Request-local catalog operations shared by MCP meta-tools and code mode.
|
|
76
102
|
* Successful catalogs may be reused inside this request; failures are not
|
|
@@ -230,19 +256,31 @@ export class CatalogService {
|
|
|
230
256
|
async search(args) {
|
|
231
257
|
const query = args.query ?? "";
|
|
232
258
|
const retrievalQuery = lexicalSearchQuery(query);
|
|
259
|
+
const safety = discoverySafety(args.safety);
|
|
233
260
|
const limit = discoverySearchLimit(args.limit);
|
|
234
261
|
const offset = Math.max(0, Math.trunc(args.offset ?? 0));
|
|
262
|
+
const scopedConnector = args.connector
|
|
263
|
+
? this.registry.getConnector(args.connector)
|
|
264
|
+
: undefined;
|
|
235
265
|
const connectors = args.connector
|
|
236
|
-
?
|
|
266
|
+
? scopedConnector
|
|
267
|
+
? [scopedConnector]
|
|
268
|
+
: []
|
|
237
269
|
: this.registry.listConnectors();
|
|
238
270
|
const catalogs = await mapSettledWithConcurrency(connectors, this.concurrency, (connector) => this.loadForDiscovery(connector.id, `search_tools probe of "${connector.id}"`));
|
|
271
|
+
const searchableCatalogs = catalogs.map((catalog) => catalog.status === "fulfilled"
|
|
272
|
+
? {
|
|
273
|
+
status: "fulfilled",
|
|
274
|
+
value: toolsForSafety(catalog.value, safety),
|
|
275
|
+
}
|
|
276
|
+
: catalog);
|
|
239
277
|
const matches = [];
|
|
240
278
|
let matchMode = "all";
|
|
241
|
-
const statistics = lexicalCorpusStatistics(
|
|
279
|
+
const statistics = lexicalCorpusStatistics(searchableCatalogs.flatMap((catalog) => catalog.status === "fulfilled" ? [catalog.value] : []), retrievalQuery);
|
|
242
280
|
const collectMatches = (mode) => {
|
|
243
281
|
matches.length = 0;
|
|
244
282
|
let orderBase = 0;
|
|
245
|
-
|
|
283
|
+
searchableCatalogs.forEach((catalog, connectorIndex) => {
|
|
246
284
|
const connector = connectors[connectorIndex];
|
|
247
285
|
if (!connector) {
|
|
248
286
|
throw new Error("Catalog result has no corresponding connector");
|
|
@@ -267,9 +305,16 @@ export class CatalogService {
|
|
|
267
305
|
collectMatches(matchMode);
|
|
268
306
|
}
|
|
269
307
|
matches.sort((a, b) => b.score - a.score || a.order - b.order);
|
|
270
|
-
const
|
|
308
|
+
const pageMatches = matches.slice(offset, offset + limit);
|
|
309
|
+
const entries = pageMatches.map((match) => {
|
|
271
310
|
const input = match.tool.inputSchema ?? { type: "object" };
|
|
272
|
-
const
|
|
311
|
+
const renderedInput = args.includeSchemas
|
|
312
|
+
? renderSearchSchema(input, args.includeSchemas)
|
|
313
|
+
: undefined;
|
|
314
|
+
const renderedOutput = args.includeSchemas && match.tool.outputSchema
|
|
315
|
+
? renderSearchSchema(match.tool.outputSchema, args.includeSchemas)
|
|
316
|
+
: undefined;
|
|
317
|
+
const description = summarizeDiscoveryDescription(match.tool.description, args.fullDescriptions === true);
|
|
273
318
|
return {
|
|
274
319
|
connector: match.connector,
|
|
275
320
|
...(connectorGuide(match.connector)
|
|
@@ -281,14 +326,20 @@ export class CatalogService {
|
|
|
281
326
|
...(description !== undefined ? { description } : {}),
|
|
282
327
|
...(args.includeSchemas
|
|
283
328
|
? {
|
|
284
|
-
inputSchema:
|
|
329
|
+
inputSchema: renderedInput?.schema,
|
|
285
330
|
}
|
|
286
331
|
: {}),
|
|
332
|
+
...(renderedInput?.truncated
|
|
333
|
+
? { inputSchemaTruncated: true }
|
|
334
|
+
: {}),
|
|
287
335
|
...(args.includeSchemas && match.tool.outputSchema
|
|
288
336
|
? {
|
|
289
|
-
outputSchema:
|
|
337
|
+
outputSchema: renderedOutput?.schema,
|
|
290
338
|
}
|
|
291
339
|
: {}),
|
|
340
|
+
...(renderedOutput?.truncated
|
|
341
|
+
? { outputSchemaTruncated: true }
|
|
342
|
+
: {}),
|
|
292
343
|
...(args.includeSchemas && args.includeSchemaKeys
|
|
293
344
|
? schemaKeyMetadata(input, match.tool.outputSchema)
|
|
294
345
|
: {}),
|
|
@@ -301,6 +352,57 @@ export class CatalogService {
|
|
|
301
352
|
const nextOffset = offset + entries.length < matches.length
|
|
302
353
|
? offset + entries.length
|
|
303
354
|
: undefined;
|
|
355
|
+
const queryTerms = lexicalQueryTerms(retrievalQuery);
|
|
356
|
+
const analyzedTerms = queryTerms.slice(0, MAX_QUERY_ANALYSIS_TERMS);
|
|
357
|
+
const displayTerm = (term) => term.length <= MAX_QUERY_ANALYSIS_TERM_LENGTH
|
|
358
|
+
? term
|
|
359
|
+
: `${term.slice(0, MAX_QUERY_ANALYSIS_TERM_LENGTH - 1)}…`;
|
|
360
|
+
const pageTools = new Set(pageMatches.map((match) => match.tool));
|
|
361
|
+
const matchingTools = (term) => new Set([
|
|
362
|
+
...(statistics.nameMatches.get(term) ?? []),
|
|
363
|
+
...(statistics.descriptionMatches.get(term) ?? []),
|
|
364
|
+
]);
|
|
365
|
+
const representedTerms = [];
|
|
366
|
+
const otherResultTerms = [];
|
|
367
|
+
const unmatchedTerms = [];
|
|
368
|
+
for (const term of analyzedTerms) {
|
|
369
|
+
const termTools = matchingTools(term);
|
|
370
|
+
if ([...termTools].some((tool) => pageTools.has(tool))) {
|
|
371
|
+
representedTerms.push(displayTerm(term));
|
|
372
|
+
}
|
|
373
|
+
else if (termTools.size > 0) {
|
|
374
|
+
otherResultTerms.push(displayTerm(term));
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
unmatchedTerms.push(displayTerm(term));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
const unavailableCatalogs = catalogs.filter((catalog) => catalog.status === "rejected").length;
|
|
381
|
+
const safetyLabel = safety === "readOnly"
|
|
382
|
+
? "read-only "
|
|
383
|
+
: safety === "approvalRequired"
|
|
384
|
+
? "approval-required "
|
|
385
|
+
: "";
|
|
386
|
+
const filterRecovery = safety === "all" ? "" : " Change safety to inspect the other tools.";
|
|
387
|
+
const guidance = queryTerms.length === 0
|
|
388
|
+
? undefined
|
|
389
|
+
: matches.length === 0
|
|
390
|
+
? args.connector && !scopedConnector
|
|
391
|
+
? `Connector "${args.connector}" is not configured in this deployment. Omit connector to search all configured tools.`
|
|
392
|
+
: scopedConnector
|
|
393
|
+
? unavailableCatalogs > 0
|
|
394
|
+
? `Connector "${scopedConnector.id}" could not be searched because its catalog was unavailable. Retry later.`
|
|
395
|
+
: `No matching ${safetyLabel}capability was found on connector "${scopedConnector.id}". Refine terms or browse it with an empty query.${filterRecovery}`
|
|
396
|
+
: unavailableCatalogs === 0
|
|
397
|
+
? `No matching ${safetyLabel}capability is configured in this deployment. Refine terms, scope by connector, or browse with an empty query.${filterRecovery}`
|
|
398
|
+
: `No matching ${safetyLabel}capability was found in the catalogs that answered; ${unavailableCatalogs} connector catalog${unavailableCatalogs === 1 ? " was" : "s were"} unavailable. Refine terms, scope by connector, or browse with an empty query.${filterRecovery}`
|
|
399
|
+
: matchMode === "partial"
|
|
400
|
+
? scopedConnector
|
|
401
|
+
? `No single tool on connector "${scopedConnector.id}" matched every term. Split distinct intents into separate searches.`
|
|
402
|
+
: unavailableCatalogs === 0
|
|
403
|
+
? "No single tool matched every term. Split distinct intents into separate searches."
|
|
404
|
+
: "No single tool matched every term in the catalogs that answered. Split distinct intents into separate searches."
|
|
405
|
+
: undefined;
|
|
304
406
|
return {
|
|
305
407
|
entries,
|
|
306
408
|
total: matches.length,
|
|
@@ -311,6 +413,27 @@ export class CatalogService {
|
|
|
311
413
|
...(matchMode === "partial" && matches.length > 0
|
|
312
414
|
? { matchMode }
|
|
313
415
|
: {}),
|
|
416
|
+
...(queryTerms.length > 0 && matchMode === "partial"
|
|
417
|
+
? {
|
|
418
|
+
queryAnalysis: {
|
|
419
|
+
representedTerms,
|
|
420
|
+
otherResultTerms,
|
|
421
|
+
unmatchedTerms,
|
|
422
|
+
...(queryTerms.length > analyzedTerms.length ||
|
|
423
|
+
analyzedTerms.some((term) => term.length > MAX_QUERY_ANALYSIS_TERM_LENGTH)
|
|
424
|
+
? { truncated: true }
|
|
425
|
+
: {}),
|
|
426
|
+
...(args.connector ? { connectorScope: args.connector } : {}),
|
|
427
|
+
...(args.connector && !scopedConnector
|
|
428
|
+
? { unknownConnector: true }
|
|
429
|
+
: {}),
|
|
430
|
+
...(unavailableCatalogs > 0
|
|
431
|
+
? { unavailableConnectorCount: unavailableCatalogs }
|
|
432
|
+
: {}),
|
|
433
|
+
...(guidance ? { guidance } : {}),
|
|
434
|
+
},
|
|
435
|
+
}
|
|
436
|
+
: {}),
|
|
314
437
|
};
|
|
315
438
|
}
|
|
316
439
|
async describe(args) {
|
|
@@ -385,9 +508,6 @@ export function groupedSearchResult(page) {
|
|
|
385
508
|
const group = {
|
|
386
509
|
id: entry.connector.id,
|
|
387
510
|
...(entry.connector.title ? { title: entry.connector.title } : {}),
|
|
388
|
-
...(entry.connector.description !== undefined
|
|
389
|
-
? { description: entry.connector.description }
|
|
390
|
-
: {}),
|
|
391
511
|
...(entry.guide ? { guide: entry.guide } : {}),
|
|
392
512
|
tools: [],
|
|
393
513
|
};
|
|
@@ -404,6 +524,7 @@ export function groupedSearchResult(page) {
|
|
|
404
524
|
hasMore: page.hasMore,
|
|
405
525
|
...(page.nextOffset !== undefined ? { nextOffset: page.nextOffset } : {}),
|
|
406
526
|
...(page.matchMode ? { matchMode: page.matchMode } : {}),
|
|
527
|
+
...(page.queryAnalysis ? { queryAnalysis: page.queryAnalysis } : {}),
|
|
407
528
|
};
|
|
408
529
|
}
|
|
409
530
|
export function flatSearchResult(page) {
|
|
@@ -415,6 +536,7 @@ export function flatSearchResult(page) {
|
|
|
415
536
|
hasMore: page.hasMore,
|
|
416
537
|
...(page.nextOffset !== undefined ? { nextOffset: page.nextOffset } : {}),
|
|
417
538
|
...(page.matchMode ? { matchMode: page.matchMode } : {}),
|
|
539
|
+
...(page.queryAnalysis ? { queryAnalysis: page.queryAnalysis } : {}),
|
|
418
540
|
};
|
|
419
541
|
}
|
|
420
542
|
//# sourceMappingURL=catalog-service.js.map
|