@toolgrain/mcp 0.3.0-alpha.0 → 0.3.0-alpha.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/CHANGELOG.md +19 -0
- package/README.md +17 -3
- package/dist/apps.d.ts +9 -0
- package/dist/apps.d.ts.map +1 -0
- package/dist/apps.js +21 -0
- package/dist/apps.js.map +1 -0
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +9 -1
- package/dist/connection.js.map +1 -1
- package/dist/dispatcher.d.ts +2 -1
- package/dist/dispatcher.d.ts.map +1 -1
- package/dist/dispatcher.js +3 -3
- package/dist/dispatcher.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy/dispatcher.d.ts +2 -1
- package/dist/legacy/dispatcher.d.ts.map +1 -1
- package/dist/legacy/dispatcher.js +23 -8
- package/dist/legacy/dispatcher.js.map +1 -1
- package/dist/legacy/handlers.d.ts +1 -1
- package/dist/legacy/handlers.d.ts.map +1 -1
- package/dist/legacy/handlers.js +2 -2
- package/dist/legacy/handlers.js.map +1 -1
- package/dist/modern/dispatcher.d.ts +2 -1
- package/dist/modern/dispatcher.d.ts.map +1 -1
- package/dist/modern/dispatcher.js +22 -8
- package/dist/modern/dispatcher.js.map +1 -1
- package/dist/modern/handlers.d.ts +1 -1
- package/dist/modern/handlers.d.ts.map +1 -1
- package/dist/modern/handlers.js +2 -2
- package/dist/modern/handlers.js.map +1 -1
- package/dist/modern/results.d.ts +6 -0
- package/dist/modern/results.d.ts.map +1 -1
- package/dist/modern/results.js +9 -0
- package/dist/modern/results.js.map +1 -1
- package/dist/pending-requests.d.ts +2 -1
- package/dist/pending-requests.d.ts.map +1 -1
- package/dist/pending-requests.js +17 -0
- package/dist/pending-requests.js.map +1 -1
- package/dist/resources/definition.d.ts +45 -0
- package/dist/resources/definition.d.ts.map +1 -0
- package/dist/resources/definition.js +46 -0
- package/dist/resources/definition.js.map +1 -0
- package/dist/resources/registry.d.ts +13 -0
- package/dist/resources/registry.d.ts.map +1 -0
- package/dist/resources/registry.js +48 -0
- package/dist/resources/registry.js.map +1 -0
- package/dist/resources/requests.d.ts +13 -0
- package/dist/resources/requests.d.ts.map +1 -0
- package/dist/resources/requests.js +43 -0
- package/dist/resources/requests.js.map +1 -0
- package/dist/resources/validation.d.ts +33 -0
- package/dist/resources/validation.d.ts.map +1 -0
- package/dist/resources/validation.js +61 -0
- package/dist/resources/validation.js.map +1 -0
- package/dist/server.d.ts +7 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/context.d.ts +5 -4
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +1 -1
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/progress.d.ts +4 -2
- package/dist/tools/progress.d.ts.map +1 -1
- package/dist/tools/progress.js +40 -6
- package/dist/tools/progress.js.map +1 -1
- package/dist/tools/rich-result.d.ts +19 -19
- package/dist/tools/rich-result.d.ts.map +1 -1
- package/dist/tools/rich-result.js.map +1 -1
- package/package.json +2 -2
- package/src/apps.ts +23 -0
- package/src/connection.ts +15 -0
- package/src/dispatcher.ts +4 -0
- package/src/index.ts +9 -0
- package/src/legacy/dispatcher.ts +55 -13
- package/src/legacy/handlers.ts +2 -1
- package/src/modern/dispatcher.ts +57 -21
- package/src/modern/handlers.ts +2 -1
- package/src/modern/results.ts +10 -0
- package/src/pending-requests.ts +17 -1
- package/src/resources/definition.ts +92 -0
- package/src/resources/registry.ts +72 -0
- package/src/resources/requests.ts +59 -0
- package/src/resources/validation.ts +82 -0
- package/src/server.ts +11 -4
- package/src/tools/context.ts +5 -4
- package/src/tools/progress.ts +46 -8
- package/src/tools/rich-result.ts +53 -27
package/dist/pending-requests.js
CHANGED
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
/** Owns duplicate detection and cancellation signals for in-flight requests. */
|
|
2
2
|
export function createPendingRequests(isOpen) {
|
|
3
3
|
const pending = new Map();
|
|
4
|
+
const progressTokens = new Set();
|
|
4
5
|
return {
|
|
5
6
|
begin(id) {
|
|
6
7
|
if (pending.has(id))
|
|
7
8
|
return;
|
|
8
9
|
const controller = new AbortController();
|
|
9
10
|
pending.set(id, controller);
|
|
11
|
+
let releaseProgress;
|
|
10
12
|
return {
|
|
11
13
|
signal: controller.signal,
|
|
12
14
|
isActive: () => isOpen() && !controller.signal.aborted,
|
|
15
|
+
claimProgress(token) {
|
|
16
|
+
if (progressTokens.has(token))
|
|
17
|
+
return false;
|
|
18
|
+
progressTokens.add(token);
|
|
19
|
+
releaseProgress = () => {
|
|
20
|
+
progressTokens.delete(token);
|
|
21
|
+
controller.signal.removeEventListener("abort", release);
|
|
22
|
+
releaseProgress = undefined;
|
|
23
|
+
};
|
|
24
|
+
// Aborting releases the token even if the cancelled handler keeps running.
|
|
25
|
+
const release = () => releaseProgress?.();
|
|
26
|
+
controller.signal.addEventListener("abort", release, { once: true });
|
|
27
|
+
return true;
|
|
28
|
+
},
|
|
13
29
|
finish: () => {
|
|
30
|
+
releaseProgress?.();
|
|
14
31
|
pending.delete(id);
|
|
15
32
|
},
|
|
16
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pending-requests.js","sourceRoot":"","sources":["../src/pending-requests.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,OAAO;QACL,KAAK,CAAC,EAAa;YACjB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO;YAC5B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC5B,OAAO;gBACL,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;gBACtD,MAAM,EAAE,GAAG,EAAE;oBACX,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrB,CAAC;aACF,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,EAAa;YAClB,OAAO;iBACJ,GAAG,CAAC,EAAE,CAAC;gBACR,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK;YACH,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE;gBACvC,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"pending-requests.js","sourceRoot":"","sources":["../src/pending-requests.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAC;IAChD,OAAO;QACL,KAAK,CAAC,EAAa;YACjB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO;YAC5B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC5B,IAAI,eAAyC,CAAC;YAC9C,OAAO;gBACL,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;gBACtD,aAAa,CAAC,KAAoB;oBAChC,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAC;oBAC5C,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC1B,eAAe,GAAG,GAAG,EAAE;wBACrB,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC7B,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBACxD,eAAe,GAAG,SAAS,CAAC;oBAC9B,CAAC,CAAC;oBACF,2EAA2E;oBAC3E,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC;oBAC1C,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBACrE,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,EAAE,GAAG,EAAE;oBACX,eAAe,EAAE,EAAE,CAAC;oBACpB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrB,CAAC;aACF,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,EAAa;YAClB,OAAO;iBACJ,GAAG,CAAC,EAAE,CAAC;gBACR,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK;YACH,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE;gBACvC,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { BlobResourceContents, MetaObject, Resource as ProtocolResource, TextResourceContents } from "@toolgrain/protocol";
|
|
2
|
+
import type { ToolContext } from "../tools/context.js";
|
|
3
|
+
import type { DeepReadonly } from "../tools/json-value.js";
|
|
4
|
+
/** Readonly resource identity and display metadata, copied during server registration. */
|
|
5
|
+
export type ResourceMetadata = DeepReadonly<ProtocolResource>;
|
|
6
|
+
/** Explicit resource contents; each item supplies its own URI and exactly one payload. */
|
|
7
|
+
export interface ResourceReadResult {
|
|
8
|
+
/** Text or base64 binary entries; an existing resource may return an empty array. */
|
|
9
|
+
readonly contents: readonly ((DeepReadonly<TextResourceContents> & {
|
|
10
|
+
readonly blob?: never;
|
|
11
|
+
}) | (DeepReadonly<BlobResourceContents> & {
|
|
12
|
+
readonly text?: never;
|
|
13
|
+
}))[];
|
|
14
|
+
/** Optional result metadata, separate from each content item's metadata. */
|
|
15
|
+
readonly _meta?: DeepReadonly<MetaObject>;
|
|
16
|
+
}
|
|
17
|
+
type ReadResult = ResourceReadResult | PromiseLike<ResourceReadResult>;
|
|
18
|
+
/** A fixed resource and its application-owned reader. */
|
|
19
|
+
export interface ResourceDefinition<Result extends ReadResult = ReadResult> extends ResourceMetadata {
|
|
20
|
+
/**
|
|
21
|
+
* Read this URI using the request's auth, providers, and cancellation signal.
|
|
22
|
+
* Direct calls bypass server authorization and result validation.
|
|
23
|
+
*/
|
|
24
|
+
readonly read: (uri: string, ctx: ToolContext) => Result;
|
|
25
|
+
}
|
|
26
|
+
export declare const RESOURCE_METADATA_KEYS: readonly ["uri", "name", "title", "description", "mimeType", "annotations", "size", "icons", "_meta"];
|
|
27
|
+
/** Frozen reusable definition returned by `resource()`; direct reads remain raw. */
|
|
28
|
+
export type Resource<Result extends ReadResult = ReadResult> = ResourceDefinition<Result> & ResourceValue;
|
|
29
|
+
declare class ResourceValue {
|
|
30
|
+
constructor(definition: ResourceDefinition);
|
|
31
|
+
/** Structural brand shared by compatible package copies; object spreads drop it. */
|
|
32
|
+
"~toolgrain"(): "resource@1";
|
|
33
|
+
}
|
|
34
|
+
export declare function isResource(value: unknown): value is Resource;
|
|
35
|
+
/**
|
|
36
|
+
* Declare a reusable fixed-URI resource without reading its contents.
|
|
37
|
+
* Registration validates and snapshots metadata; server reads validate and copy results.
|
|
38
|
+
* No URI is fetched or mapped to a filesystem automatically.
|
|
39
|
+
* @param definition - Absolute URI, display metadata, and synchronous or async reader.
|
|
40
|
+
* @returns A frozen definition preserving the reader's inferred return type.
|
|
41
|
+
* @throws `TypeError` if the reader is not a function.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resource<Result extends ReadResult>(definition: ResourceDefinition<Result>): Resource<Result>;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/resources/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EACV,QAAQ,IAAI,gBAAgB,EAC5B,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAE9D,0FAA0F;AAC1F,MAAM,WAAW,kBAAkB;IACjC,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,SAAS,CACxB,CAAC,YAAY,CAAC,oBAAoB,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,GAChE,CAAC,YAAY,CAAC,oBAAoB,CAAC,GAAG;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,CACnE,EAAE,CAAC;IACJ,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;CAC3C;AAED,KAAK,UAAU,GAAG,kBAAkB,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;AAEvE,yDAAyD;AACzD,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,UAAU,GAAG,UAAU,CACxE,SAAQ,gBAAgB;IACxB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;CAC1D;AAED,eAAO,MAAM,sBAAsB,YACjC,KAAK,EACL,MAAM,EACN,OAAO,EACP,aAAa,EACb,UAAU,EACV,aAAa,EACb,MAAM,EACN,OAAO,EACP,OAAO,CACC,CAAC;AAGX,oFAAoF;AACpF,MAAM,MAAM,QAAQ,CAAC,MAAM,SAAS,UAAU,GAAG,UAAU,IACzD,kBAAkB,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC;AAE7C,cAAM,aAAa;IACjB,YAAY,UAAU,EAAE,kBAAkB,EAOzC;IAED,oFAAoF;IACpF,YAAY,IAAI,YAAY,CAE3B;CACF;AAGD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAM5D;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,MAAM,SAAS,UAAU,EAChD,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,GACrC,QAAQ,CAAC,MAAM,CAAC,CAIlB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export const RESOURCE_METADATA_KEYS = [
|
|
2
|
+
"uri",
|
|
3
|
+
"name",
|
|
4
|
+
"title",
|
|
5
|
+
"description",
|
|
6
|
+
"mimeType",
|
|
7
|
+
"annotations",
|
|
8
|
+
"size",
|
|
9
|
+
"icons",
|
|
10
|
+
"_meta",
|
|
11
|
+
];
|
|
12
|
+
const brand = Symbol.for("@toolgrain/mcp/resource@1");
|
|
13
|
+
class ResourceValue {
|
|
14
|
+
constructor(definition) {
|
|
15
|
+
for (const key of [...RESOURCE_METADATA_KEYS, "read"]) {
|
|
16
|
+
const value = definition[key];
|
|
17
|
+
if (value !== undefined)
|
|
18
|
+
Object.defineProperty(this, key, { value, enumerable: true });
|
|
19
|
+
}
|
|
20
|
+
Object.freeze(this);
|
|
21
|
+
}
|
|
22
|
+
/** Structural brand shared by compatible package copies; object spreads drop it. */
|
|
23
|
+
"~toolgrain"() {
|
|
24
|
+
return "resource@1";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
Object.defineProperty(ResourceValue.prototype, brand, { value: true });
|
|
28
|
+
export function isResource(value) {
|
|
29
|
+
return (typeof value === "object" &&
|
|
30
|
+
value !== null &&
|
|
31
|
+
value[brand] === true);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Declare a reusable fixed-URI resource without reading its contents.
|
|
35
|
+
* Registration validates and snapshots metadata; server reads validate and copy results.
|
|
36
|
+
* No URI is fetched or mapped to a filesystem automatically.
|
|
37
|
+
* @param definition - Absolute URI, display metadata, and synchronous or async reader.
|
|
38
|
+
* @returns A frozen definition preserving the reader's inferred return type.
|
|
39
|
+
* @throws `TypeError` if the reader is not a function.
|
|
40
|
+
*/
|
|
41
|
+
export function resource(definition) {
|
|
42
|
+
if (typeof definition?.read !== "function")
|
|
43
|
+
throw new TypeError("Resources require a read function");
|
|
44
|
+
return new ResourceValue(definition);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/resources/definition.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,KAAK;IACL,MAAM;IACN,OAAO;IACP,aAAa;IACb,UAAU;IACV,aAAa;IACb,MAAM;IACN,OAAO;IACP,OAAO;CACC,CAAC;AACX,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAMtD,MAAM,aAAa;IACjB,YAAY,UAA8B;QACxC,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,sBAAsB,EAAE,MAAM,CAAU,EAAE,CAAC;YAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS;gBACrB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,oFAAoF;IACpF,YAAY;QACV,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AACD,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEvE,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAA+B,CAAC,KAAK,CAAC,KAAK,IAAI,CACjD,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CACtB,UAAsC;IAEtC,IAAI,OAAO,UAAU,EAAE,IAAI,KAAK,UAAU;QACxC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,OAAO,IAAI,aAAa,CAAC,UAAU,CAAqB,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Resource as ProtocolResource } from "@toolgrain/protocol";
|
|
2
|
+
import { type ErrorHandler } from "../diagnostics.js";
|
|
3
|
+
import type { ToolContext } from "../tools/context.js";
|
|
4
|
+
import { type Resource } from "./definition.js";
|
|
5
|
+
import { type ResourceExecutionResult } from "./validation.js";
|
|
6
|
+
type Reader = (ctx: ToolContext) => Promise<ResourceExecutionResult | undefined>;
|
|
7
|
+
export interface ResourceRegistry {
|
|
8
|
+
list(): ProtocolResource[];
|
|
9
|
+
reader(uri: string): Reader | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare function createResourceRegistry(definitions: readonly Resource[], onError?: ErrorHandler): ResourceRegistry;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,IAAI,gBAAgB,EAClC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,KAAK,uBAAuB,EAE7B,MAAM,iBAAiB,CAAC;AAEzB,KAAK,MAAM,GAAG,CACZ,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC;AAClD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,SAAS,QAAQ,EAAE,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,gBAAgB,CAyClB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { INTERNAL_ERROR, } from "@toolgrain/protocol";
|
|
2
|
+
import { reportError } from "../diagnostics.js";
|
|
3
|
+
import { ProtocolError } from "../protocol/responses.js";
|
|
4
|
+
import { assertJSON } from "../tools/json-value.js";
|
|
5
|
+
import { isResource, RESOURCE_METADATA_KEYS, } from "./definition.js";
|
|
6
|
+
import { copyReadResult, resourceMetadata, } from "./validation.js";
|
|
7
|
+
export function createResourceRegistry(definitions, onError) {
|
|
8
|
+
const entries = new Map();
|
|
9
|
+
for (const definition of definitions) {
|
|
10
|
+
if (!isResource(definition))
|
|
11
|
+
throw new TypeError("Resources must be created with resource()");
|
|
12
|
+
const fields = {};
|
|
13
|
+
for (const key of RESOURCE_METADATA_KEYS)
|
|
14
|
+
if (definition[key] !== undefined)
|
|
15
|
+
fields[key] = definition[key];
|
|
16
|
+
assertJSON(fields);
|
|
17
|
+
const metadata = resourceMetadata.parse(structuredClone(fields));
|
|
18
|
+
if (entries.has(metadata.uri))
|
|
19
|
+
throw new TypeError(`Duplicate resource URI: ${metadata.uri}`);
|
|
20
|
+
if (typeof definition.read !== "function")
|
|
21
|
+
throw new TypeError("Resources require a read function");
|
|
22
|
+
entries.set(metadata.uri, {
|
|
23
|
+
metadata,
|
|
24
|
+
async read(ctx) {
|
|
25
|
+
if (ctx.signal.aborted)
|
|
26
|
+
return;
|
|
27
|
+
try {
|
|
28
|
+
const value = await definition.read(metadata.uri, ctx);
|
|
29
|
+
if (ctx.signal.aborted)
|
|
30
|
+
return;
|
|
31
|
+
const result = copyReadResult(value);
|
|
32
|
+
return ctx.signal.aborted ? undefined : result;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (ctx.signal.aborted)
|
|
36
|
+
return;
|
|
37
|
+
reportError(onError, error);
|
|
38
|
+
throw new ProtocolError(INTERNAL_ERROR, "Internal error");
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
list: () => structuredClone(Array.from(entries.values(), ({ metadata }) => metadata)),
|
|
45
|
+
reader: (uri) => entries.get(uri)?.read,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAqB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,UAAU,EACV,sBAAsB,GAEvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EAEd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAUzB,MAAM,UAAU,sBAAsB,CACpC,WAAgC,EAChC,OAAsB;IAEtB,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB,CAAC;IACJ,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YACzB,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACnE,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,GAAG,IAAI,sBAAsB;YACtC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACnE,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CACrC,eAAe,CAAC,MAAM,CAAC,CACJ,CAAC;QACtB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC3B,MAAM,IAAI,SAAS,CAAC,2BAA2B,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACjE,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU;YACvC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;YACxB,QAAQ;YACR,KAAK,CAAC,IAAI,CAAC,GAAG;gBACZ,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;oBAAE,OAAO;gBAC/B,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;oBACvD,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAO;oBAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;oBACrC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBACjD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAO;oBAC/B,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC5B,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CACT,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ToolContext } from "../tools/context.js";
|
|
2
|
+
import type { ResourceRegistry } from "./registry.js";
|
|
3
|
+
export declare function requireResources(resources: ResourceRegistry | undefined): ResourceRegistry;
|
|
4
|
+
export declare function listResources(params: unknown, resources: ResourceRegistry): {
|
|
5
|
+
resources: import("@toolgrain/protocol").Resource[];
|
|
6
|
+
};
|
|
7
|
+
export declare function listResourceTemplates(params: unknown, _resources: ResourceRegistry): {
|
|
8
|
+
resourceTemplates: never[];
|
|
9
|
+
};
|
|
10
|
+
export declare function readResource(params: unknown, resources: ResourceRegistry, ctx: (params: {
|
|
11
|
+
_meta?: Record<string, unknown> | undefined;
|
|
12
|
+
}) => ToolContext, notFoundCode: number): Promise<import("./validation.js").ResourceExecutionResult | undefined>;
|
|
13
|
+
//# sourceMappingURL=requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/resources/requests.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAYtD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,gBAAgB,GAAG,SAAS,GACtC,gBAAgB,CAGlB;AAQD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB;IAE/D,SAAS;EACnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,gBAAgB;IAGnB,iBAAiB;EAC3B;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,gBAAgB,EAC3B,GAAG,EAAE,CAAC,MAAM,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CAAE,KAAK,WAAW,EAC7E,YAAY,EAAE,MAAM,0EAWrB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { INVALID_PARAMS, METHOD_NOT_FOUND } from "@toolgrain/protocol";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { object } from "../protocol/messages.js";
|
|
4
|
+
import { ProtocolError } from "../protocol/responses.js";
|
|
5
|
+
import { resourceUri } from "./validation.js";
|
|
6
|
+
const listParams = z.looseObject({
|
|
7
|
+
_meta: object.optional(),
|
|
8
|
+
cursor: z.string().optional(),
|
|
9
|
+
});
|
|
10
|
+
const readParams = z.looseObject({
|
|
11
|
+
_meta: object.optional(),
|
|
12
|
+
uri: resourceUri,
|
|
13
|
+
});
|
|
14
|
+
export function requireResources(resources) {
|
|
15
|
+
if (!resources)
|
|
16
|
+
throw new ProtocolError(METHOD_NOT_FOUND, "Method not found");
|
|
17
|
+
return resources;
|
|
18
|
+
}
|
|
19
|
+
function validateList(params) {
|
|
20
|
+
const parsed = listParams.safeParse(params ?? {});
|
|
21
|
+
if (!parsed.success || parsed.data.cursor !== undefined)
|
|
22
|
+
throw new ProtocolError(INVALID_PARAMS, "Invalid resource list parameters");
|
|
23
|
+
}
|
|
24
|
+
export function listResources(params, resources) {
|
|
25
|
+
validateList(params);
|
|
26
|
+
return { resources: resources.list() };
|
|
27
|
+
}
|
|
28
|
+
export function listResourceTemplates(params, _resources) {
|
|
29
|
+
validateList(params);
|
|
30
|
+
return { resourceTemplates: [] };
|
|
31
|
+
}
|
|
32
|
+
export async function readResource(params, resources, ctx, notFoundCode) {
|
|
33
|
+
const parsed = readParams.safeParse(params);
|
|
34
|
+
if (!parsed.success)
|
|
35
|
+
throw new ProtocolError(INVALID_PARAMS, "Invalid resource read parameters");
|
|
36
|
+
const read = resources.reader(parsed.data.uri);
|
|
37
|
+
if (!read)
|
|
38
|
+
throw new ProtocolError(notFoundCode, "Resource not found", {
|
|
39
|
+
uri: parsed.data.uri,
|
|
40
|
+
});
|
|
41
|
+
return read(ctx(parsed.data));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../src/resources/requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AACH,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;IACxB,GAAG,EAAE,WAAW;CACjB,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAC9B,SAAuC;IAEvC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IAC9E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,MAAe;IACnC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;QACrD,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAe,EAAE,SAA2B;IACxE,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAe,EACf,UAA4B;IAE5B,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAe,EACf,SAA2B,EAC3B,GAA6E,EAC7E,YAAoB;IAEpB,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,OAAO;QACjB,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI;QACP,MAAM,IAAI,aAAa,CAAC,YAAY,EAAE,oBAAoB,EAAE;YAC1D,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;SACrB,CAAC,CAAC;IACL,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReadResourceResult } from "@toolgrain/protocol";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export type ResourceExecutionResult = Pick<ReadResourceResult, "contents" | "_meta">;
|
|
4
|
+
/** Validate URI components without normalizing registry identities or treating them as URLs. */
|
|
5
|
+
export declare const resourceUri: z.ZodString;
|
|
6
|
+
export declare const resourceMetadata: z.ZodObject<{
|
|
7
|
+
uri: z.ZodString;
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
title: z.ZodOptional<z.ZodString>;
|
|
10
|
+
description: z.ZodOptional<z.ZodString>;
|
|
11
|
+
mimeType: z.ZodOptional<z.ZodString>;
|
|
12
|
+
annotations: z.ZodOptional<z.ZodObject<{
|
|
13
|
+
audience: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
14
|
+
assistant: "assistant";
|
|
15
|
+
user: "user";
|
|
16
|
+
}>>>;
|
|
17
|
+
priority: z.ZodOptional<z.ZodNumber>;
|
|
18
|
+
lastModified: z.ZodOptional<z.ZodString>;
|
|
19
|
+
}, z.core.$loose>>;
|
|
20
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
icons: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
22
|
+
src: z.ZodString;
|
|
23
|
+
mimeType: z.ZodOptional<z.ZodString>;
|
|
24
|
+
sizes: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
25
|
+
theme: z.ZodOptional<z.ZodEnum<{
|
|
26
|
+
dark: "dark";
|
|
27
|
+
light: "light";
|
|
28
|
+
}>>;
|
|
29
|
+
}, z.core.$loose>>>;
|
|
30
|
+
_meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
31
|
+
}, z.core.$strict>;
|
|
32
|
+
export declare function copyReadResult(value: unknown): ResourceExecutionResult;
|
|
33
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/resources/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,kBAAkB,EAClB,UAAU,GAAG,OAAO,CACrB,CAAC;AAWF,gGAAgG;AAChG,eAAO,MAAM,WAAW,aAmBkB,CAAC;AAE3C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;kBAgB3B,CAAC;AAmBH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CAKtE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { icon } from "../protocol/icon.js";
|
|
3
|
+
import { object } from "../protocol/messages.js";
|
|
4
|
+
import { assertJSON } from "../tools/json-value.js";
|
|
5
|
+
// RFC 3986 components: percent-encoded bytes, unreserved characters, and sub-delimiters.
|
|
6
|
+
const atom = "(?:[A-Za-z0-9._~-]|%[A-Fa-f0-9]{2}|[!$&'()*+,;=])";
|
|
7
|
+
const path = new RegExp(`^(?:${atom}|[:@/])*$`);
|
|
8
|
+
const queryOrFragment = new RegExp(`^(?:${atom}|[:@/?])*$`);
|
|
9
|
+
const authority = new RegExp(`^(?:(?:${atom}|:)*@)?(?:${atom}*|\\[([^\\]]+)\\])(?::[0-9]*)?$`);
|
|
10
|
+
const ipFuture = /^v[A-Fa-f0-9]+\.[A-Za-z0-9._~!$&'()*+,;=:-]+$/i;
|
|
11
|
+
/** Validate URI components without normalizing registry identities or treating them as URLs. */
|
|
12
|
+
export const resourceUri = z.string().refine((value) => {
|
|
13
|
+
const parts = /^[A-Za-z][A-Za-z0-9+.-]*:(?:\/\/([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#([^#]*))?$/.exec(value);
|
|
14
|
+
if (!parts ||
|
|
15
|
+
!path.test(parts[2] ?? "") ||
|
|
16
|
+
!queryOrFragment.test(parts[3] ?? "") ||
|
|
17
|
+
!queryOrFragment.test(parts[4] ?? ""))
|
|
18
|
+
return false;
|
|
19
|
+
if (parts[1] === undefined)
|
|
20
|
+
return true;
|
|
21
|
+
const host = authority.exec(parts[1]);
|
|
22
|
+
if (!host)
|
|
23
|
+
return false;
|
|
24
|
+
const ip = host[1];
|
|
25
|
+
return (ip === undefined || ipFuture.test(ip) || URL.canParse(`https://[${ip}]/`));
|
|
26
|
+
}, "Resource URI must be an absolute URI");
|
|
27
|
+
export const resourceMetadata = z.strictObject({
|
|
28
|
+
uri: resourceUri,
|
|
29
|
+
name: z.string().min(1),
|
|
30
|
+
title: z.string().optional(),
|
|
31
|
+
description: z.string().optional(),
|
|
32
|
+
mimeType: z.string().optional(),
|
|
33
|
+
annotations: z
|
|
34
|
+
.looseObject({
|
|
35
|
+
audience: z.array(z.enum(["user", "assistant"])).optional(),
|
|
36
|
+
priority: z.number().min(0).max(1).optional(),
|
|
37
|
+
lastModified: z.string().optional(),
|
|
38
|
+
})
|
|
39
|
+
.optional(),
|
|
40
|
+
size: z.number().int().nonnegative().optional(),
|
|
41
|
+
icons: z.array(icon).optional(),
|
|
42
|
+
_meta: object.optional(),
|
|
43
|
+
});
|
|
44
|
+
const contents = z
|
|
45
|
+
.looseObject({
|
|
46
|
+
uri: resourceUri,
|
|
47
|
+
mimeType: z.string().optional(),
|
|
48
|
+
text: z.string().optional(),
|
|
49
|
+
blob: z.base64().optional(),
|
|
50
|
+
_meta: object.optional(),
|
|
51
|
+
})
|
|
52
|
+
.refine((value) => Object.hasOwn(value, "text") !== Object.hasOwn(value, "blob"), "Resource contents require exactly one of text or blob");
|
|
53
|
+
const readResult = z.strictObject({
|
|
54
|
+
contents: z.array(contents),
|
|
55
|
+
_meta: object.optional(),
|
|
56
|
+
});
|
|
57
|
+
export function copyReadResult(value) {
|
|
58
|
+
assertJSON(value, { omitUndefined: true });
|
|
59
|
+
return readResult.parse(JSON.parse(JSON.stringify(value)));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/resources/validation.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ import type { ProgressNotification, ProtocolResponse, Tool as ProtocolTool, Supp
|
|
|
2
2
|
import type { AuthMetadata, AuthProvider, AuthScope } from "./auth/types.js";
|
|
3
3
|
import type { RegisteredContextProvider } from "./context/definition.js";
|
|
4
4
|
import { type ErrorHandler } from "./diagnostics.js";
|
|
5
|
+
import type { Resource } from "./resources/definition.js";
|
|
5
6
|
import type { ToolMap } from "./tools/registry.js";
|
|
6
7
|
import { type RequestTransport, type Transport } from "./transport.js";
|
|
7
|
-
/** Tool registrations, identity, and shared configuration for an MCP server. */
|
|
8
|
+
/** Tool/resource registrations, identity, and shared configuration for an MCP server. */
|
|
8
9
|
export interface ServerOptions<Tools extends ToolMap = ToolMap> {
|
|
9
10
|
/** Server implementation name advertised to clients. */
|
|
10
11
|
name: string;
|
|
@@ -12,12 +13,14 @@ export interface ServerOptions<Tools extends ToolMap = ToolMap> {
|
|
|
12
13
|
version: string;
|
|
13
14
|
/** Tools made with `tool()`; each registration key becomes its exposed tool name. */
|
|
14
15
|
tools: Tools;
|
|
16
|
+
/** Fixed resources made with `resource()`; supplying an empty array enables an empty resource service. */
|
|
17
|
+
resources?: readonly Resource[];
|
|
15
18
|
/** Optional usage instructions advertised to clients during discovery or initialization. */
|
|
16
19
|
instructions?: string;
|
|
17
20
|
/**
|
|
18
21
|
* Receives original unexpected failures for private diagnostics. Tool failures
|
|
19
22
|
* include frozen tool/request details; auth and transport failures pass only
|
|
20
|
-
* the error. Throws and rejected promises from this callback are ignored.
|
|
23
|
+
* the error, as do resource failures. Throws and rejected promises from this callback are ignored.
|
|
21
24
|
*/
|
|
22
25
|
onError?: ErrorHandler;
|
|
23
26
|
/** Eager endpoint authorization; requires a request transport rather than stdio. */
|
|
@@ -87,8 +90,8 @@ export interface Server {
|
|
|
87
90
|
close(): Promise<void>;
|
|
88
91
|
}
|
|
89
92
|
/**
|
|
90
|
-
* Create a server from reusable tools, optional auth, and lazy context providers.
|
|
91
|
-
* Registration validates tool names,
|
|
93
|
+
* Create a server from reusable tools/resources, optional auth, and lazy context providers.
|
|
94
|
+
* Registration validates tool names/schemas, resource URIs, and metadata immediately.
|
|
92
95
|
* Creating the server does not start a transport or resolve context providers.
|
|
93
96
|
*
|
|
94
97
|
* @param options - Server identity and application-owned tool/provider registrations.
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,IAAI,IAAI,YAAY,EACpB,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,IAAI,IAAI,YAAY,EACpB,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,kBAAkB,CAAC;AAIlE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AASxB,yFAAyF;AACzF,MAAM,WAAW,aAAa,CAAC,KAAK,SAAS,OAAO,GAAG,OAAO;IAC5D,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,KAAK,EAAE,KAAK,CAAC;IACb,0GAA0G;IAC1G,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC,4FAA4F;IAC5F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,oFAAoF;IACpF,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,iGAAiG;IACjG,OAAO,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAChD;AAED,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC5B,oGAAoG;IACpG,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C,uFAAuF;IACvF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1E;AAED,sFAAsF;AACtF,MAAM,WAAW,MAAM;IACrB;;;;;;;;OAQG;IACH,MAAM,CACJ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IACzC,6EAA6E;IAC7E,kBAAkB,IAAI,YAAY,EAAE,CAAC;IACrC,yFAAyF;IACzF,eAAe,IAAI,YAAY,GAAG,SAAS,CAAC;IAC5C;;;;;;;;OAQG;IACH,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;QACP,gFAAgF;QAChF,QAAQ,EAAE,MAAM,CAAC;QACjB,kFAAkF;QAClF,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GACA,OAAO,CAAC,SAAS,CAAC,CAAC;IACtB;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,6FAA6F;IAC7F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,OAAO,EACtD,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,GAC5B,MAAM,CA8JR"}
|
package/dist/server.js
CHANGED
|
@@ -7,14 +7,15 @@ import { reportError } from "./diagnostics.js";
|
|
|
7
7
|
import { createDispatcher, formatErrorResponse } from "./dispatcher.js";
|
|
8
8
|
import { executeRequest } from "./execute-request.js";
|
|
9
9
|
import { decode } from "./protocol/decode.js";
|
|
10
|
+
import { createResourceRegistry } from "./resources/registry.js";
|
|
10
11
|
import { createToolAdapter } from "./tools/adapter.js";
|
|
11
12
|
import { isRequestTransport, } from "./transport.js";
|
|
12
13
|
// Internal adapter contract: final delivery remains part of the active request.
|
|
13
14
|
// A global symbol preserves the hook across compatible package copies.
|
|
14
15
|
const responseDelivery = Symbol.for("@toolgrain/mcp/response-delivery/v1");
|
|
15
16
|
/**
|
|
16
|
-
* Create a server from reusable tools, optional auth, and lazy context providers.
|
|
17
|
-
* Registration validates tool names,
|
|
17
|
+
* Create a server from reusable tools/resources, optional auth, and lazy context providers.
|
|
18
|
+
* Registration validates tool names/schemas, resource URIs, and metadata immediately.
|
|
18
19
|
* Creating the server does not start a transport or resolve context providers.
|
|
19
20
|
*
|
|
20
21
|
* @param options - Server identity and application-owned tool/provider registrations.
|
|
@@ -24,7 +25,9 @@ const responseDelivery = Symbol.for("@toolgrain/mcp/response-delivery/v1");
|
|
|
24
25
|
export function createServer(options) {
|
|
25
26
|
const authorization = createAuthorization(options.auth);
|
|
26
27
|
const tools = createToolAdapter(options.tools, options.onError);
|
|
27
|
-
const dispatch = createDispatcher(tools, { name: options.name, version: options.version }, options.instructions, createContextRegistry(options.context)
|
|
28
|
+
const dispatch = createDispatcher(tools, { name: options.name, version: options.version }, options.instructions, createContextRegistry(options.context), options.resources === undefined
|
|
29
|
+
? undefined
|
|
30
|
+
: createResourceRegistry(options.resources, options.onError));
|
|
28
31
|
let closed = false;
|
|
29
32
|
const running = new Set();
|
|
30
33
|
const closeIndependent = () => {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAqB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/context.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ export interface ToolRequest {
|
|
|
23
23
|
/** A deeply frozen copy of the request's `_meta`; empty when the request carried none. */
|
|
24
24
|
readonly meta: Readonly<Record<string, unknown>>;
|
|
25
25
|
}
|
|
26
|
-
/** Per-invocation data passed to tool handlers and lazy context resolvers. */
|
|
26
|
+
/** Per-invocation data passed to tool handlers, resource readers, and lazy context resolvers. */
|
|
27
27
|
export interface ToolContext {
|
|
28
28
|
/** Aborts when the client cancels or disconnects, or the transport or server closes. */
|
|
29
29
|
readonly signal: AbortSignal;
|
|
@@ -31,8 +31,9 @@ export interface ToolContext {
|
|
|
31
31
|
readonly request: ToolRequest;
|
|
32
32
|
/**
|
|
33
33
|
* Report request-scoped progress; safe to pass to helpers without binding.
|
|
34
|
-
* Await delivery/backpressure
|
|
35
|
-
* or delivery channel exists,
|
|
34
|
+
* Await delivery/backpressure; updates are spaced at least 100 ms per invocation.
|
|
35
|
+
* Resolves without sending when no progress token or delivery channel exists,
|
|
36
|
+
* or after cancellation/completion. Active updates
|
|
36
37
|
* require finite values and strictly increasing progress; invalid updates reject.
|
|
37
38
|
* Delivery failure cancels the request and reaches transport diagnostics.
|
|
38
39
|
*/
|
|
@@ -48,7 +49,7 @@ export interface ToolContextOptions {
|
|
|
48
49
|
context?: readonly RegisteredContextProvider[];
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
|
-
* Build an unauthenticated context for direct `execute()`
|
|
52
|
+
* Build an unauthenticated context for direct tool `execute()` or resource `read()` calls.
|
|
52
53
|
* Request metadata is copied and deeply frozen; each call creates a fresh provider cache.
|
|
53
54
|
* Direct execution still bypasses server authorization, validation, and MCP conversion.
|
|
54
55
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,kBAAkB,IAAI,wBAAwB,EAC9C,cAAc,IAAI,oBAAoB,EACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,gGAAgG;AAChG,MAAM,WAAW,UAAU;IACzB,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,cAAc,GAAG,oBAAoB,CAAC,CAAC;IACpE,sFAAsF;IACtF,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAClC,kBAAkB,GAAG,wBAAwB,CAC9C,CAAC;CACH;AAED,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;IACnD,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AAED,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,wBAAwB,EAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,kBAAkB,IAAI,wBAAwB,EAC9C,cAAc,IAAI,oBAAoB,EACvC,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,gGAAgG;AAChG,MAAM,WAAW,UAAU;IACzB,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,cAAc,GAAG,oBAAoB,CAAC,CAAC;IACpE,sFAAsF;IACtF,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAClC,kBAAkB,GAAG,wBAAwB,CAC9C,CAAC;CACH;AAED,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;IACnD,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAClD;AAED,iGAAiG;AACjG,MAAM,WAAW,WAAW;IAC1B,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,wFAAwF;AACxF,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gGAAgG;IAChG,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAChD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,WAAW,CAmBzE;AAED,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,EAAE,WAAW,EACnC,IAAI,CAAC,EAAE,YAAY,EACnB,SAAS,GAAE,eAAyC,EACpD,cAAc,GAAE,WAAW,CAAC,gBAAgB,CAA2B,GACtE,WAAW,CAkBb;AAED,4EAA4E;AAC5E,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EACxB,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,GACvC,UAAU,CAKZ"}
|
package/dist/tools/context.js
CHANGED
|
@@ -3,7 +3,7 @@ import { attachAuth } from "../auth/context.js";
|
|
|
3
3
|
import { createContextRegistry, } from "../context/registry.js";
|
|
4
4
|
import { createContextScope } from "../context/scope.js";
|
|
5
5
|
/**
|
|
6
|
-
* Build an unauthenticated context for direct `execute()`
|
|
6
|
+
* Build an unauthenticated context for direct tool `execute()` or resource `read()` calls.
|
|
7
7
|
* Request metadata is copied and deeply frozen; each call creates a fresh provider cache.
|
|
8
8
|
* Direct execution still bypasses server authorization, validation, and MCP conversion.
|
|
9
9
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAEL,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAEL,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAqDzD;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,OAAO,GAAuB,EAAE;IAC1D,mFAAmF;IACnF,MAAM,EACJ,EAAE,GAAG,CAAC,EACN,eAAe,GAAG,gBAAgB,EAClC,MAAM,EACN,IAAI,GAAG,EAAE,GACV,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAC1B,OAAO,iBAAiB,CACtB,OAAO,CAAC,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,EAC9C;QACE,EAAE;QACF,eAAe;QACf,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,IAAI;KACL,EACD,SAAS,EACT,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAC/B,MAAmB,EACnB,EAAE,MAAM,EAAE,GAAG,OAAO,EAAe,EACnC,IAAmB,EACnB,SAAS,GAAoB,qBAAqB,EAAE,EACpD,cAAc,GAAkC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;IAEvE,MAAM,GAAG,GAAG,UAAU,CACpB;QACE,MAAM;QACN,cAAc;QACd,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;YACrB,GAAG,OAAO;YACV,GAAG,CAAC,MAAM,KAAK,SAAS;gBACtB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;iBACjE,CAAC;YACN,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;SAC/B,CAAC;KACH,EACD,IAAI,CACL,CAAC;IACF,OAAO,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,UAAU,CACxB,IAAwB,EACxB,YAAwC;IAExC,OAAO;QACL,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,OAAO,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/tools/progress.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ProgressNotification } from "@toolgrain/protocol";
|
|
1
|
+
import type { ProgressNotification, ProgressToken } from "@toolgrain/protocol";
|
|
2
2
|
/** One progress update; values are finite numbers and progress must strictly increase. */
|
|
3
3
|
export interface ToolProgress {
|
|
4
4
|
/** Work completed so far, in application-defined units; the first value may be zero. */
|
|
@@ -8,8 +8,10 @@ export interface ToolProgress {
|
|
|
8
8
|
/** Optional public status message sent to the client. */
|
|
9
9
|
readonly message?: string;
|
|
10
10
|
}
|
|
11
|
+
/** Tokens share the request-ID wire format, but have a separate lifetime. */
|
|
12
|
+
export declare function isProgressToken(token: unknown): token is ProgressToken;
|
|
11
13
|
/** One invocation owns its reporter, ordering, and completion boundary. */
|
|
12
|
-
export declare function createProgressReporter(
|
|
14
|
+
export declare function createProgressReporter(requestSignal: AbortSignal, token: unknown, send?: (message: ProgressNotification) => void | Promise<void>): {
|
|
13
15
|
report: (value: ToolProgress) => Promise<void>;
|
|
14
16
|
finish(): Promise<void>;
|
|
15
17
|
close(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/tools/progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAI/E,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAQD,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOtE;AAkBD,2EAA2E;AAC3E,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,WAAW,EAC1B,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;oBASvC,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC;;;EA2DpD"}
|