@telepath-computer/autofile 0.3.0 → 0.4.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 +33 -19
- package/dist/blobs.d.ts +9 -22
- package/dist/blobs.js +35 -171
- package/dist/blobs.js.map +1 -1
- package/dist/cli.js +15 -9
- package/dist/cli.js.map +1 -1
- package/dist/http.d.ts +2 -2
- package/dist/http.js +10 -5
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +3 -1
- package/dist/json.js +81 -2
- package/dist/json.js.map +1 -1
- package/dist/mcp-resources.d.ts +31 -0
- package/dist/mcp-resources.js +111 -0
- package/dist/mcp-resources.js.map +1 -0
- package/dist/mcp-tools.d.ts +113 -0
- package/dist/mcp-tools.js +89 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/mcp-upload.d.ts +16 -0
- package/dist/mcp-upload.js +81 -0
- package/dist/mcp-upload.js.map +1 -0
- package/dist/mcp-watch.d.ts +18 -0
- package/dist/mcp-watch.js +165 -0
- package/dist/mcp-watch.js.map +1 -0
- package/dist/schema.d.ts +1 -1
- package/dist/schema.js +8 -2
- package/dist/schema.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.js +58 -38
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +90 -110
- package/dist/store.js +532 -524
- package/dist/store.js.map +1 -1
- package/dist/watch.d.ts +6 -18
- package/dist/watch.js +73 -191
- package/dist/watch.js.map +1 -1
- package/package.json +7 -1
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/** Derives MCP resource-list hints from the changes published by Autofile. */
|
|
2
|
+
import { buildResources } from "./mcp-resources.js";
|
|
3
|
+
const readFailed = Symbol("read failed");
|
|
4
|
+
const unknownMetadata = Symbol("unknown metadata");
|
|
5
|
+
/** Watches MCP metadata using the instance's existing change subscription API. */
|
|
6
|
+
export async function watchResources(store, onChange, onError, resources = buildResources(store)) {
|
|
7
|
+
const cache = new Map();
|
|
8
|
+
let pending = Promise.resolve();
|
|
9
|
+
let initializing = true;
|
|
10
|
+
const initialChanges = [];
|
|
11
|
+
let unsubscribe;
|
|
12
|
+
try {
|
|
13
|
+
unsubscribe = await store.watch((changes) => {
|
|
14
|
+
if (initializing) {
|
|
15
|
+
initialChanges.push(...changes);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
return enqueue(changes);
|
|
19
|
+
}, { onError });
|
|
20
|
+
for (const resource of await resources.listResources()) {
|
|
21
|
+
cache.set(resource.uri, resourceMetadata(resource));
|
|
22
|
+
}
|
|
23
|
+
initializing = false;
|
|
24
|
+
if (initialChanges.length > 0)
|
|
25
|
+
await enqueue(initialChanges);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
await unsubscribe?.();
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
let closing;
|
|
32
|
+
return { close: () => closing ??= closeWatcher() };
|
|
33
|
+
function enqueue(changes) {
|
|
34
|
+
const batch = new Map();
|
|
35
|
+
for (const { uri, kind } of changes)
|
|
36
|
+
addEvent(batch, uri, kind);
|
|
37
|
+
pending = pending.then(() => processBatch(batch))
|
|
38
|
+
.catch((error) => onError(toError(error)));
|
|
39
|
+
return pending;
|
|
40
|
+
}
|
|
41
|
+
async function processBatch(batch) {
|
|
42
|
+
const before = new Set(cache.keys());
|
|
43
|
+
const supplied = new Map();
|
|
44
|
+
const failedUris = new Set();
|
|
45
|
+
let focusedReadFailed = false;
|
|
46
|
+
const markReadFailed = (uri) => {
|
|
47
|
+
focusedReadFailed = true;
|
|
48
|
+
failedUris.add(uri);
|
|
49
|
+
cache.set(uri, unknownMetadata);
|
|
50
|
+
};
|
|
51
|
+
let metadataChanged = false;
|
|
52
|
+
const affectedTypes = new Set();
|
|
53
|
+
for (const uri of batch.keys()) {
|
|
54
|
+
const type = declarationType(uri);
|
|
55
|
+
if (type === undefined || affectedTypes.has(type) || failedUris.has(uri))
|
|
56
|
+
continue;
|
|
57
|
+
affectedTypes.add(type);
|
|
58
|
+
const declarationUri = `autofile:///_types/${type}`;
|
|
59
|
+
const recordPrefix = `autofile:///${type}/`;
|
|
60
|
+
const listed = await readSafely(() => resources.listTypeResources(type));
|
|
61
|
+
if (listed === readFailed) {
|
|
62
|
+
const affectedUris = new Set([...cache.keys(), ...batch.keys()]);
|
|
63
|
+
for (const scopedUri of affectedUris) {
|
|
64
|
+
if (scopedUri !== declarationUri && !scopedUri.startsWith(recordPrefix))
|
|
65
|
+
continue;
|
|
66
|
+
markReadFailed(scopedUri);
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const current = new Map(listed.map((resource) => [resource.uri, resource]));
|
|
71
|
+
const scope = new Set(current.keys());
|
|
72
|
+
for (const cachedUri of cache.keys()) {
|
|
73
|
+
if (cachedUri === declarationUri || cachedUri.startsWith(recordPrefix)) {
|
|
74
|
+
scope.add(cachedUri);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
for (const scopedUri of scope) {
|
|
78
|
+
const wasListed = cache.has(scopedUri);
|
|
79
|
+
const isListed = current.has(scopedUri);
|
|
80
|
+
if (scopedUri.startsWith(recordPrefix)
|
|
81
|
+
&& wasListed !== isListed
|
|
82
|
+
&& !batch.has(scopedUri)) {
|
|
83
|
+
addEvent(batch, scopedUri, isListed ? "created" : "deleted");
|
|
84
|
+
}
|
|
85
|
+
metadataChanged = updateCache(cache, scopedUri, current.get(scopedUri))
|
|
86
|
+
|| metadataChanged;
|
|
87
|
+
}
|
|
88
|
+
for (const [currentUri, resource] of current)
|
|
89
|
+
supplied.set(currentUri, resource);
|
|
90
|
+
}
|
|
91
|
+
for (const uri of [...batch.keys()]) {
|
|
92
|
+
if (declarationType(uri) !== undefined)
|
|
93
|
+
continue;
|
|
94
|
+
if (failedUris.has(uri))
|
|
95
|
+
continue;
|
|
96
|
+
const resource = supplied.get(uri)
|
|
97
|
+
?? await readSafely(() => resources.getResourceMetadata(uri));
|
|
98
|
+
if (resource === readFailed) {
|
|
99
|
+
markReadFailed(uri);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
metadataChanged = updateCache(cache, uri, resource) || metadataChanged;
|
|
103
|
+
}
|
|
104
|
+
for (const uri of batch.keys()) {
|
|
105
|
+
if (!before.has(uri) && !cache.has(uri) && !failedUris.has(uri))
|
|
106
|
+
batch.delete(uri);
|
|
107
|
+
}
|
|
108
|
+
const listChanged = focusedReadFailed
|
|
109
|
+
|| metadataChanged
|
|
110
|
+
|| [...batch.values()].some((event) => event.membershipChanged);
|
|
111
|
+
const changes = [...batch.entries()].map(([uri, event]) => ({
|
|
112
|
+
uri,
|
|
113
|
+
kind: event.lastEvent,
|
|
114
|
+
listChanged,
|
|
115
|
+
}));
|
|
116
|
+
if (changes.length > 0 || listChanged)
|
|
117
|
+
await onChange({ changes, listChanged });
|
|
118
|
+
}
|
|
119
|
+
async function closeWatcher() {
|
|
120
|
+
await unsubscribe?.();
|
|
121
|
+
await pending;
|
|
122
|
+
}
|
|
123
|
+
async function readSafely(read) {
|
|
124
|
+
try {
|
|
125
|
+
return await read();
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
onError(toError(error));
|
|
129
|
+
return readFailed;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function addEvent(batch, uri, event) {
|
|
134
|
+
const existing = batch.get(uri);
|
|
135
|
+
if (existing === undefined) {
|
|
136
|
+
batch.set(uri, { membershipChanged: event !== "changed", lastEvent: event });
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
existing.membershipChanged ||= event !== "changed";
|
|
140
|
+
existing.lastEvent = event;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function updateCache(cache, uri, resource) {
|
|
144
|
+
const previous = cache.get(uri);
|
|
145
|
+
const next = resource === undefined ? undefined : resourceMetadata(resource);
|
|
146
|
+
if (next === undefined)
|
|
147
|
+
cache.delete(uri);
|
|
148
|
+
else
|
|
149
|
+
cache.set(uri, next);
|
|
150
|
+
return previous === unknownMetadata
|
|
151
|
+
|| previous?.title !== next?.title
|
|
152
|
+
|| previous?.description !== next?.description
|
|
153
|
+
|| (previous === undefined) !== (next === undefined);
|
|
154
|
+
}
|
|
155
|
+
function resourceMetadata(resource) {
|
|
156
|
+
return { title: resource.title, description: resource.description };
|
|
157
|
+
}
|
|
158
|
+
function declarationType(uri) {
|
|
159
|
+
const match = /^autofile:\/\/\/_types\/([a-z][a-z0-9-]*)$/u.exec(uri);
|
|
160
|
+
return match?.[1];
|
|
161
|
+
}
|
|
162
|
+
function toError(error) {
|
|
163
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=mcp-watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-watch.js","sourceRoot":"","sources":["../src/mcp-watch.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* content and compiled once even when several store instances read them.
|
|
5
5
|
*/
|
|
6
6
|
import "@hyperjump/json-schema/formats";
|
|
7
|
-
import type
|
|
7
|
+
import { type JsonObject, type JsonValue } from "./json.js";
|
|
8
8
|
/** A compiled schema that returns all readable validation problems. */
|
|
9
9
|
export interface PreparedSchema {
|
|
10
10
|
validate(value: JsonValue): Promise<string[]>;
|
package/dist/schema.js
CHANGED
|
@@ -10,7 +10,8 @@ import { addFormat, setFormatHandler } from "@hyperjump/json-schema/experimental
|
|
|
10
10
|
import { annotate } from "@hyperjump/json-schema/annotations/experimental";
|
|
11
11
|
import { annotatedWith, annotation, value as instanceValue, } from "@hyperjump/json-schema/annotated-instance/experimental";
|
|
12
12
|
import { JSE } from "@hyperjump/json-schema-errors";
|
|
13
|
-
import {
|
|
13
|
+
import { BLOB_URI_PATTERN } from "./blobs.js";
|
|
14
|
+
import { jsonObjectProblem } from "./json.js";
|
|
14
15
|
const DIALECT = "https://json-schema.org/draft/2020-12/schema";
|
|
15
16
|
const FORMAT_KEYWORD = "https://json-schema.org/keyword/draft-2020-12/format";
|
|
16
17
|
const BLOB_FORMAT = "https://autofile.dev/formats/blob";
|
|
@@ -60,11 +61,16 @@ addFormat({
|
|
|
60
61
|
id: BLOB_FORMAT,
|
|
61
62
|
// JSON Schema formats ignore other instance types. Autofile's separate
|
|
62
63
|
// annotation check gives URI and blob values their stricter string rule.
|
|
63
|
-
handler: (value) => typeof value !== "string" ||
|
|
64
|
+
handler: (value) => typeof value !== "string" || BLOB_URI_PATTERN.test(value),
|
|
64
65
|
});
|
|
65
66
|
setFormatHandler(FORMAT_KEYWORD, "blob", BLOB_FORMAT);
|
|
66
67
|
/** Checks that a declaration schema is safe, valid 2020-12 JSON Schema. */
|
|
67
68
|
export async function prepareSchema(schema) {
|
|
69
|
+
// Parsed files can contain overflowing numbers or negative zero too. Check
|
|
70
|
+
// every schema before serialization can change its constants or cache key.
|
|
71
|
+
const problem = jsonObjectProblem(schema);
|
|
72
|
+
if (problem !== undefined)
|
|
73
|
+
throw new SchemaRefusal([`schema: ${problem}`]);
|
|
68
74
|
const inspectionErrors = inspectSchema(schema);
|
|
69
75
|
if (inspectionErrors.length > 0)
|
|
70
76
|
throw new SchemaRefusal(inspectionErrors);
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,yBAAyB,EACzB,uBAAuB,EACvB,gBAAgB,EAChB,QAAQ,GAET,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAkB,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EACL,aAAa,EACb,UAAU,EACV,KAAK,IAAI,aAAa,GACvB,MAAM,wDAAwD,CAAC;AAChE,OAAO,EAAE,GAAG,EAAoC,MAAM,+BAA+B,CAAC;AAEtF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* translates plain store values into MCP results.
|
|
5
5
|
*/
|
|
6
6
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
7
|
-
import {
|
|
7
|
+
import type { Autofile } from "./index.js";
|
|
8
8
|
/** Builds one MCP server around a store, without choosing its transport. */
|
|
9
|
-
export declare function buildServer(
|
|
9
|
+
export declare function buildServer(autofile: Autofile): Promise<McpServer>;
|
package/dist/server.js
CHANGED
|
@@ -5,15 +5,20 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { createRequire } from "node:module";
|
|
7
7
|
import { fromJsonSchema, McpServer, ProtocolError, ProtocolErrorCode, ResourceNotFoundError, } from "@modelcontextprotocol/server";
|
|
8
|
-
import {
|
|
9
|
-
|
|
8
|
+
import { buildTools, } from "./mcp-tools.js";
|
|
9
|
+
import { buildResources, isResourceUri } from "./mcp-resources.js";
|
|
10
|
+
const SERVER_DESCRIPTION = "Typed records that agents file and retrieve.";
|
|
10
11
|
const BASE_INSTRUCTIONS = "Autofile is where the user keeps durable information, as typed records. When information should outlive the current task, file it here. Call `list_types` to see the types and what belongs in each, and `get_type` for the schema of one. Search with `find_records` before creating a record, so the same thing is not filed twice. If no type fits, propose a new type to the user and create it only once they agree.";
|
|
11
12
|
const RESOURCE_PAGE_SIZE = 100;
|
|
12
13
|
const packageJson = createRequire(import.meta.url)("../package.json");
|
|
13
14
|
const findRecordsSchema = fromJsonSchema({
|
|
14
15
|
type: "object",
|
|
15
16
|
properties: {
|
|
16
|
-
type: {
|
|
17
|
+
type: {
|
|
18
|
+
type: ["string", "array"],
|
|
19
|
+
items: { type: "string" },
|
|
20
|
+
description: "The type or types to search. All types when absent.",
|
|
21
|
+
},
|
|
17
22
|
q: {
|
|
18
23
|
type: "string",
|
|
19
24
|
description: "Words that must all appear, ignoring case, in the string values of a record at any depth.",
|
|
@@ -36,10 +41,9 @@ const findRecordsSchema = fromJsonSchema({
|
|
|
36
41
|
},
|
|
37
42
|
cursor: {
|
|
38
43
|
type: "string",
|
|
39
|
-
description: "An opaque cursor returned by the previous page. The next page starts after the last record
|
|
44
|
+
description: "An opaque cursor returned by the previous page. The next page starts after the last record that page considered, even if that record was deleted.",
|
|
40
45
|
},
|
|
41
46
|
},
|
|
42
|
-
required: ["type"],
|
|
43
47
|
additionalProperties: false,
|
|
44
48
|
});
|
|
45
49
|
const getRecordSchema = fromJsonSchema({
|
|
@@ -58,7 +62,7 @@ const createRecordSchema = fromJsonSchema({
|
|
|
58
62
|
},
|
|
59
63
|
record: {
|
|
60
64
|
type: "object",
|
|
61
|
-
description: "The full record, which must match the schema of its type.
|
|
65
|
+
description: "The full record, which must match the schema of its type. Blob fields hold existing blob URIs returned by `upload_blob`; the same URI may be used by multiple records.",
|
|
62
66
|
},
|
|
63
67
|
},
|
|
64
68
|
required: ["type", "record"],
|
|
@@ -70,12 +74,21 @@ const updateRecordSchema = fromJsonSchema({
|
|
|
70
74
|
uri: { type: "string", description: "The URI of the record." },
|
|
71
75
|
patch: {
|
|
72
76
|
type: "object",
|
|
73
|
-
description: "A [JSON Merge Patch](https://www.rfc-editor.org/rfc/rfc7396): fields in the patch are set, a field set to `null` is removed, nested objects are merged, and arrays are replaced whole.
|
|
77
|
+
description: "A [JSON Merge Patch](https://www.rfc-editor.org/rfc/rfc7396): fields in the patch are set, a field set to `null` is removed, nested objects are merged, and arrays are replaced whole. Blob fields hold existing blob URIs returned by `upload_blob`; the same URI may be used by multiple records.",
|
|
74
78
|
},
|
|
75
79
|
},
|
|
76
80
|
required: ["uri", "patch"],
|
|
77
81
|
additionalProperties: false,
|
|
78
82
|
});
|
|
83
|
+
const uploadBlobSchema = fromJsonSchema({
|
|
84
|
+
type: "object",
|
|
85
|
+
properties: {
|
|
86
|
+
base64: { type: "string", description: "Canonical base64 contents. Requires mediaType; cannot be combined with path." },
|
|
87
|
+
path: { type: "string", description: "An absolute local file path, accepted only over stdio. Cannot be combined with base64." },
|
|
88
|
+
mediaType: { type: "string", description: "The media type of the contents. Required for base64; inferred from the file extension for a path when absent, falling back to application/octet-stream." },
|
|
89
|
+
},
|
|
90
|
+
additionalProperties: false,
|
|
91
|
+
});
|
|
79
92
|
const deleteRecordSchema = fromJsonSchema({
|
|
80
93
|
type: "object",
|
|
81
94
|
properties: { uri: { type: "string", description: "The URI of the record." } },
|
|
@@ -97,12 +110,16 @@ const createTypeSchema = fromJsonSchema({
|
|
|
97
110
|
type: "object",
|
|
98
111
|
properties: {
|
|
99
112
|
type: { type: "string", description: "The name of the type." },
|
|
100
|
-
description: { type: "string", description: "What belongs in the
|
|
113
|
+
description: { type: "string", description: "What belongs in the type." },
|
|
101
114
|
schema: { type: "object", description: "The JSON Schema for records of the type." },
|
|
102
115
|
titleField: {
|
|
103
116
|
type: "string",
|
|
104
117
|
description: "A top-level field of the record whose string value is shown as its title.",
|
|
105
118
|
},
|
|
119
|
+
title: {
|
|
120
|
+
type: "string",
|
|
121
|
+
description: "The name of the type in words, in the singular, such as \"Journal entry\", shown to people in place of the type name.",
|
|
122
|
+
},
|
|
106
123
|
},
|
|
107
124
|
required: ["type", "description", "schema"],
|
|
108
125
|
additionalProperties: false,
|
|
@@ -117,6 +134,10 @@ const updateTypeSchema = fromJsonSchema({
|
|
|
117
134
|
type: ["string", "null"],
|
|
118
135
|
description: "The new title field; `null` removes it.",
|
|
119
136
|
},
|
|
137
|
+
title: {
|
|
138
|
+
type: ["string", "null"],
|
|
139
|
+
description: "The new title; `null` removes it.",
|
|
140
|
+
},
|
|
120
141
|
},
|
|
121
142
|
required: ["type"],
|
|
122
143
|
additionalProperties: false,
|
|
@@ -128,8 +149,10 @@ const deleteTypeSchema = fromJsonSchema({
|
|
|
128
149
|
additionalProperties: false,
|
|
129
150
|
});
|
|
130
151
|
/** Builds one MCP server around a store, without choosing its transport. */
|
|
131
|
-
export async function buildServer(
|
|
132
|
-
const
|
|
152
|
+
export async function buildServer(autofile) {
|
|
153
|
+
const tools = buildTools(autofile);
|
|
154
|
+
const resources = buildResources(autofile);
|
|
155
|
+
const { types } = await tools.listTypes({});
|
|
133
156
|
const typeNames = types.map(({ type }) => type).sort();
|
|
134
157
|
const typeSummary = typeNames.length === 0 ? "none yet" : typeNames.join(", ");
|
|
135
158
|
const server = new McpServer({
|
|
@@ -140,43 +163,43 @@ export async function buildServer(store) {
|
|
|
140
163
|
instructions: `${BASE_INSTRUCTIONS}\n\nTypes: ${typeSummary}. This list was taken when the session began; call \`list_types\` for types created since.`,
|
|
141
164
|
});
|
|
142
165
|
server.registerTool("find_records", {
|
|
143
|
-
description: "Searches
|
|
166
|
+
description: "Searches records and returns matching records in URI order. It skips nonmatching records until the page has `limit` results, reaches 64 KB of JSON, or no records remain; the size cap never prevents the first result. `fields` selects top-level fields to return, while matching uses the whole record. A schema-invalid record is listed in `errors` only when it matches the search; a record that cannot be read is always listed. Autofile is where the user keeps durable information.",
|
|
144
167
|
inputSchema: findRecordsSchema,
|
|
145
|
-
}, async (input) => toolResult(await
|
|
168
|
+
}, async (input) => toolResult(await tools.findRecords(input)));
|
|
146
169
|
server.registerTool("get_record", {
|
|
147
|
-
description: "Returns one record by URI: its `uri`, `createdAt` and `updatedAt` times, and `value`. A record that does not match its type is still returned, with what must change in `error`.",
|
|
170
|
+
description: "Returns one record by URI: its `uri`, optional `title`, `createdAt` and `updatedAt` times, and `value`. A record that does not match its type is still returned, with what must change in `error`.",
|
|
148
171
|
inputSchema: getRecordSchema,
|
|
149
|
-
}, async (input) => toolResult(await
|
|
172
|
+
}, async (input) => toolResult(await tools.getRecord(input)));
|
|
150
173
|
server.registerTool("create_record", {
|
|
151
174
|
description: "Creates a record and returns its URI. `record` is the full record and must match the schema of its type, which `get_type` returns. `key` is optional and generated when absent. Autofile is where the user keeps durable information.",
|
|
152
175
|
inputSchema: createRecordSchema,
|
|
153
|
-
}, async (input
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
})));
|
|
176
|
+
}, async (input) => toolResult(await tools.createRecord(input)));
|
|
177
|
+
server.registerTool("update_record", { description: "Changes a record and returns its URI.", inputSchema: updateRecordSchema }, async (input) => toolResult(await tools.updateRecord(input)));
|
|
178
|
+
server.registerTool("upload_blob", {
|
|
179
|
+
description: "Uploads bytes and returns their blob URI for use in records. Supply canonical base64 and a media type, or an absolute local path over stdio. The maximum size is 7 MiB.",
|
|
180
|
+
inputSchema: uploadBlobSchema,
|
|
181
|
+
}, async (input, context) => toolResult(await tools.uploadBlob(input, { allowLocalPaths: context.http === undefined })));
|
|
159
182
|
server.registerTool("delete_record", {
|
|
160
183
|
description: "Deletes a record, removes the links to it from other records, and returns its URI.",
|
|
161
184
|
inputSchema: deleteRecordSchema,
|
|
162
|
-
}, async (input) => toolResult(await
|
|
185
|
+
}, async (input) => toolResult(await tools.deleteRecord(input)));
|
|
163
186
|
server.registerTool("list_types", {
|
|
164
|
-
description: "Returns every type, ordered by name, with the URI of its declaration and its
|
|
187
|
+
description: "Returns every type, ordered by name, with the URI of its declaration, its description, and its `title` when it has one.",
|
|
165
188
|
inputSchema: listTypesSchema,
|
|
166
|
-
}, async (input) => toolResult(await
|
|
167
|
-
server.registerTool("get_type", { description: "Returns the declaration of a type with its URI added.", inputSchema: getTypeSchema }, async (input) => toolResult(await
|
|
168
|
-
server.registerTool("create_type", { description: "Declares a type and returns the URI of its declaration.", inputSchema: createTypeSchema }, async (input) => toolResult(await
|
|
189
|
+
}, async (input) => toolResult(await tools.listTypes(input)));
|
|
190
|
+
server.registerTool("get_type", { description: "Returns the declaration of a type with its URI added.", inputSchema: getTypeSchema }, async (input) => toolResult(await tools.getType(input)));
|
|
191
|
+
server.registerTool("create_type", { description: "Declares a type and returns the URI of its declaration.", inputSchema: createTypeSchema }, async (input) => toolResult(await tools.createType(input)));
|
|
169
192
|
server.registerTool("update_type", {
|
|
170
|
-
description: "Replaces the description, schema or title
|
|
193
|
+
description: "Replaces the description, schema, title field or title of a type, or any of them.",
|
|
171
194
|
inputSchema: updateTypeSchema,
|
|
172
|
-
}, async (input) => toolResult(await
|
|
173
|
-
server.registerTool("delete_type", { description: "Deletes a type and returns its URI.", inputSchema: deleteTypeSchema }, async (input) => toolResult(await
|
|
195
|
+
}, async (input) => toolResult(await tools.updateType(input)));
|
|
196
|
+
server.registerTool("delete_type", { description: "Deletes a type and returns its URI.", inputSchema: deleteTypeSchema }, async (input) => toolResult(await tools.deleteType(input)));
|
|
174
197
|
// The high-level resource API returns every resource at once. These
|
|
175
198
|
// handlers stay at the low-level boundary where cursors remain explicit;
|
|
176
199
|
// the process-level watcher supplies the advertised change notices.
|
|
177
200
|
server.server.registerCapabilities({ resources: { subscribe: true, listChanged: true } });
|
|
178
201
|
server.server.setRequestHandler("resources/list", async (request) => {
|
|
179
|
-
const
|
|
202
|
+
const listed = await resources.listResources();
|
|
180
203
|
const cursor = request.params?.cursor;
|
|
181
204
|
let start = 0;
|
|
182
205
|
if (cursor !== undefined) {
|
|
@@ -184,17 +207,14 @@ export async function buildServer(store) {
|
|
|
184
207
|
if (previousUri === undefined) {
|
|
185
208
|
throw new ProtocolError(ProtocolErrorCode.InvalidParams, "Invalid resource cursor");
|
|
186
209
|
}
|
|
187
|
-
const nextIndex =
|
|
188
|
-
start = nextIndex < 0 ?
|
|
210
|
+
const nextIndex = listed.findIndex(({ uri }) => uri > previousUri);
|
|
211
|
+
start = nextIndex < 0 ? listed.length : nextIndex;
|
|
189
212
|
}
|
|
190
|
-
const page =
|
|
213
|
+
const page = listed.slice(start, start + RESOURCE_PAGE_SIZE);
|
|
191
214
|
const last = page.at(-1);
|
|
192
215
|
return {
|
|
193
|
-
resources: page
|
|
194
|
-
|
|
195
|
-
...(lastModified === undefined ? {} : { annotations: { lastModified } }),
|
|
196
|
-
})),
|
|
197
|
-
...(last !== undefined && start + page.length < resources.length
|
|
216
|
+
resources: page,
|
|
217
|
+
...(last !== undefined && start + page.length < listed.length
|
|
198
218
|
? { nextCursor: encodeCursor(last.uri) }
|
|
199
219
|
: {}),
|
|
200
220
|
ttlMs: 0,
|
|
@@ -202,7 +222,7 @@ export async function buildServer(store) {
|
|
|
202
222
|
};
|
|
203
223
|
});
|
|
204
224
|
server.server.setRequestHandler("resources/read", async (request) => {
|
|
205
|
-
const contents = await
|
|
225
|
+
const contents = await resources.readResource(request.params.uri);
|
|
206
226
|
if (contents === undefined)
|
|
207
227
|
throw new ResourceNotFoundError(request.params.uri);
|
|
208
228
|
return { contents: [contents], ttlMs: 0, cacheScope: "private" };
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EACL,cAAc,EACd,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,qBAAqB,GAItB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|