@naumu/mcp 0.3.1 → 0.4.1
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 +7 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.js +25 -5
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +32 -1
- package/dist/errors.js +44 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/tools/add-attribute.d.ts +3 -0
- package/dist/tools/add-attribute.js +43 -0
- package/dist/tools/add-attribute.js.map +1 -0
- package/dist/tools/add-connection.d.ts +3 -0
- package/dist/tools/add-connection.js +46 -0
- package/dist/tools/add-connection.js.map +1 -0
- package/dist/tools/add-edge.js +21 -13
- package/dist/tools/add-edge.js.map +1 -1
- package/dist/tools/add-node-type.d.ts +3 -0
- package/dist/tools/add-node-type.js +54 -0
- package/dist/tools/add-node-type.js.map +1 -0
- package/dist/tools/add-node.js +24 -13
- package/dist/tools/add-node.js.map +1 -1
- package/dist/tools/add-reaction.d.ts +3 -0
- package/dist/tools/add-reaction.js +34 -0
- package/dist/tools/add-reaction.js.map +1 -0
- package/dist/tools/ask-naumu.d.ts +3 -0
- package/dist/tools/ask-naumu.js +44 -0
- package/dist/tools/ask-naumu.js.map +1 -0
- package/dist/tools/canvas-add-element.d.ts +3 -0
- package/dist/tools/canvas-add-element.js +46 -0
- package/dist/tools/canvas-add-element.js.map +1 -0
- package/dist/tools/canvas-remove-element.d.ts +3 -0
- package/dist/tools/canvas-remove-element.js +17 -0
- package/dist/tools/canvas-remove-element.js.map +1 -0
- package/dist/tools/canvas-update-element.d.ts +3 -0
- package/dist/tools/canvas-update-element.js +20 -0
- package/dist/tools/canvas-update-element.js.map +1 -0
- package/dist/tools/create-canvas.d.ts +3 -0
- package/dist/tools/create-canvas.js +17 -0
- package/dist/tools/create-canvas.js.map +1 -0
- package/dist/tools/create-note.d.ts +3 -0
- package/dist/tools/create-note.js +17 -0
- package/dist/tools/create-note.js.map +1 -0
- package/dist/tools/create-thread.d.ts +3 -0
- package/dist/tools/create-thread.js +63 -0
- package/dist/tools/create-thread.js.map +1 -0
- package/dist/tools/get-canvas-elements.d.ts +3 -0
- package/dist/tools/get-canvas-elements.js +16 -0
- package/dist/tools/get-canvas-elements.js.map +1 -0
- package/dist/tools/get-canvas-image.d.ts +3 -0
- package/dist/tools/get-canvas-image.js +77 -0
- package/dist/tools/get-canvas-image.js.map +1 -0
- package/dist/tools/get-thread.d.ts +3 -0
- package/dist/tools/get-thread.js +25 -0
- package/dist/tools/get-thread.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.js +118 -16
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/list-canvases.d.ts +3 -0
- package/dist/tools/list-canvases.js +16 -0
- package/dist/tools/list-canvases.js.map +1 -0
- package/dist/tools/list-schema-violations.d.ts +3 -0
- package/dist/tools/list-schema-violations.js +16 -0
- package/dist/tools/list-schema-violations.js.map +1 -0
- package/dist/tools/list-threads.d.ts +3 -0
- package/dist/tools/list-threads.js +43 -0
- package/dist/tools/list-threads.js.map +1 -0
- package/dist/tools/naumu-typing.d.ts +3 -0
- package/dist/tools/naumu-typing.js +30 -0
- package/dist/tools/naumu-typing.js.map +1 -0
- package/dist/tools/note-append.d.ts +3 -0
- package/dist/tools/note-append.js +17 -0
- package/dist/tools/note-append.js.map +1 -0
- package/dist/tools/note-delete-section.d.ts +3 -0
- package/dist/tools/note-delete-section.js +22 -0
- package/dist/tools/note-delete-section.js.map +1 -0
- package/dist/tools/note-find-replace.d.ts +3 -0
- package/dist/tools/note-find-replace.js +26 -0
- package/dist/tools/note-find-replace.js.map +1 -0
- package/dist/tools/note-insert.d.ts +3 -0
- package/dist/tools/note-insert.js +24 -0
- package/dist/tools/note-insert.js.map +1 -0
- package/dist/tools/note-read.d.ts +3 -0
- package/dist/tools/note-read.js +16 -0
- package/dist/tools/note-read.js.map +1 -0
- package/dist/tools/note-replace-section.d.ts +3 -0
- package/dist/tools/note-replace-section.js +26 -0
- package/dist/tools/note-replace-section.js.map +1 -0
- package/dist/tools/note-replace.d.ts +3 -0
- package/dist/tools/note-replace.js +17 -0
- package/dist/tools/note-replace.js.map +1 -0
- package/dist/tools/post-message.d.ts +3 -0
- package/dist/tools/post-message.js +45 -0
- package/dist/tools/post-message.js.map +1 -0
- package/dist/tools/react-to-message.d.ts +3 -0
- package/dist/tools/react-to-message.js +34 -0
- package/dist/tools/react-to-message.js.map +1 -0
- package/dist/tools/read-thread.d.ts +3 -0
- package/dist/tools/read-thread.js +43 -0
- package/dist/tools/read-thread.js.map +1 -0
- package/dist/tools/remove-edge.js +14 -11
- package/dist/tools/remove-edge.js.map +1 -1
- package/dist/tools/remove-reaction.d.ts +3 -0
- package/dist/tools/remove-reaction.js +34 -0
- package/dist/tools/remove-reaction.js.map +1 -0
- package/dist/tools/request-attachment-upload.d.ts +3 -0
- package/dist/tools/request-attachment-upload.js +59 -0
- package/dist/tools/request-attachment-upload.js.map +1 -0
- package/dist/tools/update-schema.d.ts +3 -0
- package/dist/tools/update-schema.js +48 -0
- package/dist/tools/update-schema.js.map +1 -0
- package/dist/tools/whoami.d.ts +3 -0
- package/dist/tools/whoami.js +23 -0
- package/dist/tools/whoami.js.map +1 -0
- package/package.json +1 -1
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerListCanvases(server, client) {
|
|
3
|
+
server.registerTool('naumu_list_canvases', {
|
|
4
|
+
title: 'List Canvases',
|
|
5
|
+
description: 'List freeform drawing canvases in a graph. Each canvas is an Excalidraw-style sketch surface that may contain shapes, text, freehand strokes, images, bookmark cards, and embedded references to graph nodes.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID to list canvases for'),
|
|
8
|
+
}),
|
|
9
|
+
}, async ({ graphId }) => {
|
|
10
|
+
const data = await client.get(`/api/canvases?graphId=${encodeURIComponent(graphId)}`);
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=list-canvases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-canvases.js","sourceRoot":"","sources":["../../src/tools/list-canvases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAmB;IAC1E,MAAM,CAAC,YAAY,CAClB,qBAAqB,EACrB;QACC,KAAK,EAAE,eAAe;QACtB,WAAW,EACV,+MAA+M;QAChN,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;SACjE,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,yBAAyB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtF,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerListSchemaViolations(server, client) {
|
|
3
|
+
server.registerTool('naumu_list_schema_violations', {
|
|
4
|
+
title: 'List Schema Violations',
|
|
5
|
+
description: 'List every schema-validation issue in a graph. Returns each node with issues and a summary by violation kind: parent_missing (schema expects a parent edge that does not exist), parent_multiple (more than one parent edge on a node that should have one), parent_mismatch (parent edge has wrong target type or relation label), unknown_relation (edge uses a relation label not defined in the schema), invalid_connection_target (edge connects to a type the schema does not allow for this source). Use for audits, import-verification, and CI-style checks after batch writes.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
graphId: z.string().describe('The graph ID'),
|
|
8
|
+
}),
|
|
9
|
+
}, async ({ graphId }) => {
|
|
10
|
+
const data = (await client.get(`/api/graphs/${graphId}/schema/validation`));
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=list-schema-violations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-schema-violations.js","sourceRoot":"","sources":["../../src/tools/list-schema-violations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2BxB,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,MAAmB;IAClF,MAAM,CAAC,YAAY,CAClB,8BAA8B,EAC9B;QACC,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACV,0jBAA0jB;QAC3jB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;SAC5C,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAC7B,eAAe,OAAO,oBAAoB,CAC1C,CAAuB,CAAC;QACzB,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerListThreads(server, client) {
|
|
3
|
+
server.registerTool('naumu_list_threads', {
|
|
4
|
+
title: 'List Threads',
|
|
5
|
+
description: 'List threads in your graph that you can see, sorted by last activity (newest first). Each result has an `isParticipant` flag — TRUE means you were explicitly invited (your replies are expected and your messages will fan out via webhook); FALSE means you can read but were not invited (you can join later by being tagged or via the participant manager). Use this for self-discovery before deciding which threads to engage in. Page back with `cursor` set to the oldest `lastActivityAt` from the previous page.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
cursor: z
|
|
8
|
+
.number()
|
|
9
|
+
.int()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Unix timestamp ms — returns threads with `lastActivityAt` strictly older than this. Omit for the newest page.'),
|
|
12
|
+
limit: z
|
|
13
|
+
.number()
|
|
14
|
+
.int()
|
|
15
|
+
.min(1)
|
|
16
|
+
.max(200)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('Page size, default 50, max 200.'),
|
|
19
|
+
}),
|
|
20
|
+
}, async ({ cursor, limit }) => {
|
|
21
|
+
try {
|
|
22
|
+
const params = new URLSearchParams();
|
|
23
|
+
if (cursor !== undefined)
|
|
24
|
+
params.set('cursor', String(cursor));
|
|
25
|
+
if (limit !== undefined)
|
|
26
|
+
params.set('limit', String(limit));
|
|
27
|
+
const qs = params.toString();
|
|
28
|
+
const path = `/api/identities/me/threads${qs ? `?${qs}` : ''}`;
|
|
29
|
+
const data = await client.get(path);
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
38
|
+
isError: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=list-threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-threads.js","sourceRoot":"","sources":["../../src/tools/list-threads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAmB;IACzE,MAAM,CAAC,YAAY,CAClB,oBAAoB,EACpB;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EACV,6fAA6f;QAC9f,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CAAC,+GAA+G,CAAC;YAC3H,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,iCAAiC,CAAC;SAC7C,CAAC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,6BAA6B,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACb,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerNaumuTyping(server, client) {
|
|
3
|
+
server.registerTool('naumu_typing', {
|
|
4
|
+
title: 'Set Typing Indicator',
|
|
5
|
+
description: 'Show or hide your "is typing…" pill in a thread. Call with `state: "start"` the moment you decide to compose a reply (before any LLM call), and the server holds the pill alive — re-broadcasting on a short interval — until you stop, post a message, or the lease cap (~5 min) fires. You do NOT need to refresh on a timer; that\'s the lease\'s job.\n\nThe pill clears automatically when:\n• you call this tool with `state: "stop"`\n• you call `naumu_post_message` for the same thread (cleared on commit)\n• the lease cap expires\n\nUse `start` whenever you start work, even if you might end up not replying — call `stop` if you decide NOT to post. Calling `start` while a lease is already active renews it (resets the cap), so a long-running run can call `start` again as a heartbeat without breaking the indicator. You must be a participant of the thread.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
threadId: z
|
|
8
|
+
.string()
|
|
9
|
+
.describe('The thread ID to set typing in. You must be a participant.'),
|
|
10
|
+
state: z
|
|
11
|
+
.enum(['start', 'stop'])
|
|
12
|
+
.describe('"start" acquires/renews the lease; "stop" ends it and clears the pill immediately.'),
|
|
13
|
+
}),
|
|
14
|
+
}, async ({ threadId, state }) => {
|
|
15
|
+
try {
|
|
16
|
+
const data = await client.post(`/api/threads/${threadId}/typing`, { state });
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
23
|
+
return {
|
|
24
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
25
|
+
isError: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=naumu-typing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naumu-typing.js","sourceRoot":"","sources":["../../src/tools/naumu-typing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAmB;IACzE,MAAM,CAAC,YAAY,CAClB,cAAc,EACd;QACC,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACV,u1BAAu1B;QACx1B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,CAAC,4DAA4D,CAAC;YACxE,KAAK,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;iBACvB,QAAQ,CAAC,oFAAoF,CAAC;SAChG,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,QAAQ,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7E,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACb,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerNoteAppend(server, client) {
|
|
3
|
+
server.registerTool('naumu_note_append', {
|
|
4
|
+
title: 'Append to Note',
|
|
5
|
+
description: 'Append markdown blocks to the end of a note. Other participants see your colored cursor while the write lands. Markdown supports headings (1–3), bold/italic/code, lists, blockquotes, code blocks, links, and tables.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
noteId: z.string().describe('The note (Thought) ID to append to'),
|
|
8
|
+
markdown: z.string().min(1).describe('Markdown content to append at the end of the note'),
|
|
9
|
+
}),
|
|
10
|
+
}, async ({ noteId, markdown }) => {
|
|
11
|
+
const data = await client.post(`/api/notes/${noteId}/append`, { markdown });
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=note-append.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-append.js","sourceRoot":"","sources":["../../src/tools/note-append.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAmB;IACxE,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACV,wNAAwN;QACzN,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACjE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;SACzF,CAAC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerNoteDeleteSection(server, client) {
|
|
3
|
+
server.registerTool('naumu_note_delete_section', {
|
|
4
|
+
title: 'Delete Section',
|
|
5
|
+
description: '⚠ DESTRUCTIVE: removes a heading row plus its body (down to the next heading of equal-or-higher level). Anything inside that section is gone — there is no per-call undo. ONLY use when the user explicitly asks to drop a section. If you\'re unsure which heading they meant, call `naumu_note_read` first to see the current structure. Returns 404 if `headingText` does not exactly match any live heading.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
noteId: z.string().describe('The note (Thought) ID'),
|
|
8
|
+
headingText: z
|
|
9
|
+
.string()
|
|
10
|
+
.min(1)
|
|
11
|
+
.describe('Exact text of the heading whose section will be deleted'),
|
|
12
|
+
}),
|
|
13
|
+
}, async ({ noteId, headingText }) => {
|
|
14
|
+
const data = await client.post(`/api/notes/${noteId}/delete-section`, {
|
|
15
|
+
headingText,
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=note-delete-section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-delete-section.js","sourceRoot":"","sources":["../../src/tools/note-delete-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,MAAmB;IAC/E,MAAM,CAAC,YAAY,CAClB,2BAA2B,EAC3B;QACC,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACV,kZAAkZ;QACnZ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACpD,WAAW,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,yDAAyD,CAAC;SACrE,CAAC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,iBAAiB,EAAE;YACrE,WAAW;SACX,CAAC,CAAC;QACH,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerNoteFindReplace(server, client) {
|
|
3
|
+
server.registerTool('naumu_note_find_replace', {
|
|
4
|
+
title: 'Find/Replace in Note',
|
|
5
|
+
description: 'Literal find/replace within a note\'s text content. Marks (bold, italic, code, etc.) are preserved on the surrounding text. Use this for mid-paragraph tweaks — the section-based tools can\'t target inline substrings. ⚠ The match is literal-substring across every text leaf in the doc; an overly generic `find` (e.g. " a ") can rewrite the doc unrecognizably. Pick a phrase distinctive enough to land where you mean. By default replaces every occurrence; set `all: false` for first-only. Returns `{ replacements }` so you can sanity-check the count.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
noteId: z.string().describe('The note (Thought) ID'),
|
|
8
|
+
find: z.string().min(1).describe('Substring to search for. Literal — no regex.'),
|
|
9
|
+
replace: z.string().describe('Replacement string. May be empty to delete the match.'),
|
|
10
|
+
all: z
|
|
11
|
+
.boolean()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('Replace all occurrences (default true). Pass false to replace only the first.'),
|
|
14
|
+
}),
|
|
15
|
+
}, async ({ noteId, find, replace, all }) => {
|
|
16
|
+
const data = await client.post(`/api/notes/${noteId}/find-replace`, {
|
|
17
|
+
find,
|
|
18
|
+
replace,
|
|
19
|
+
all,
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=note-find-replace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-find-replace.js","sourceRoot":"","sources":["../../src/tools/note-find-replace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,MAAmB;IAC7E,MAAM,CAAC,YAAY,CAClB,yBAAyB,EACzB;QACC,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACV,siBAAsiB;QACviB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACpD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAChF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;YACrF,GAAG,EAAE,CAAC;iBACJ,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,+EAA+E,CAAC;SAC3F,CAAC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,eAAe,EAAE;YACnE,IAAI;YACJ,OAAO;YACP,GAAG;SACH,CAAC,CAAC;QACH,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerNoteInsert(server, client) {
|
|
3
|
+
server.registerTool('naumu_note_insert', {
|
|
4
|
+
title: 'Insert After Heading',
|
|
5
|
+
description: 'Insert markdown content into a note immediately after a named section. The section ends at the next heading of equal-or-higher level (or end of doc). 404 if no heading matches `headingText` exactly — call `naumu_note_read` first to see the live structure.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
noteId: z.string().describe('The note (Thought) ID'),
|
|
8
|
+
headingText: z
|
|
9
|
+
.string()
|
|
10
|
+
.min(1)
|
|
11
|
+
.describe('Exact text of the heading whose section the new content follows'),
|
|
12
|
+
markdown: z.string().min(1).describe('Markdown content to insert at the end of that section'),
|
|
13
|
+
}),
|
|
14
|
+
}, async ({ noteId, headingText, markdown }) => {
|
|
15
|
+
const data = await client.post(`/api/notes/${noteId}/insert-after`, {
|
|
16
|
+
headingText,
|
|
17
|
+
markdown,
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=note-insert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-insert.js","sourceRoot":"","sources":["../../src/tools/note-insert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAmB;IACxE,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACV,iQAAiQ;QAClQ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACpD,WAAW,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,iEAAiE,CAAC;YAC7E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uDAAuD,CAAC;SAC7F,CAAC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,eAAe,EAAE;YACnE,WAAW;YACX,QAAQ;SACR,CAAC,CAAC;QACH,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerNoteRead(server, client) {
|
|
3
|
+
server.registerTool('naumu_note_read', {
|
|
4
|
+
title: 'Read Note',
|
|
5
|
+
description: 'Read the current contents of a note as markdown. Use before editing so you know what you\'re working with — `naumu_note_find_replace` and the section-based tools (`naumu_note_insert`, `naumu_note_replace_section`, `naumu_note_delete_section`) anchor on text/headings present in the live doc.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
noteId: z.string().describe('The note (Thought) ID'),
|
|
8
|
+
}),
|
|
9
|
+
}, async ({ noteId }) => {
|
|
10
|
+
const data = await client.get(`/api/notes/${noteId}/markdown`);
|
|
11
|
+
return {
|
|
12
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=note-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-read.js","sourceRoot":"","sources":["../../src/tools/note-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAmB;IACtE,MAAM,CAAC,YAAY,CAClB,iBAAiB,EACjB;QACC,KAAK,EAAE,WAAW;QAClB,WAAW,EACV,qSAAqS;QACtS,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACpD,CAAC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACpB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,cAAc,MAAM,WAAW,CAAC,CAAC;QAC/D,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerNoteReplaceSection(server, client) {
|
|
3
|
+
server.registerTool('naumu_note_replace_section', {
|
|
4
|
+
title: 'Replace Section',
|
|
5
|
+
description: 'Replace the body under a named heading with new markdown. By default the heading row itself is preserved (set `keepHeading: false` to drop it too). 404 if no heading matches.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
noteId: z.string().describe('The note (Thought) ID'),
|
|
8
|
+
headingText: z.string().min(1).describe('Exact text of the heading anchoring the section'),
|
|
9
|
+
markdown: z.string().describe('Replacement markdown for the section body'),
|
|
10
|
+
keepHeading: z
|
|
11
|
+
.boolean()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('Whether to keep the heading row itself. Default true.'),
|
|
14
|
+
}),
|
|
15
|
+
}, async ({ noteId, headingText, markdown, keepHeading }) => {
|
|
16
|
+
const data = await client.post(`/api/notes/${noteId}/replace-section`, {
|
|
17
|
+
headingText,
|
|
18
|
+
markdown,
|
|
19
|
+
keepHeading,
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=note-replace-section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-replace-section.js","sourceRoot":"","sources":["../../src/tools/note-replace-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,MAAmB;IAChF,MAAM,CAAC,YAAY,CAClB,4BAA4B,EAC5B;QACC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACV,gLAAgL;QACjL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACpD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;YAC1F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YAC1E,WAAW,EAAE,CAAC;iBACZ,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;SACnE,CAAC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,kBAAkB,EAAE;YACtE,WAAW;YACX,QAAQ;YACR,WAAW;SACX,CAAC,CAAC;QACH,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerNoteReplace(server, client) {
|
|
3
|
+
server.registerTool('naumu_note_replace', {
|
|
4
|
+
title: 'Replace Note',
|
|
5
|
+
description: '⚠ DESTRUCTIVE: replaces the entire note content with new markdown. Any concurrent human edits made during the call are silently overwritten. ONLY use when the user explicitly asks to rewrite/replace the whole note. For additive work prefer `naumu_note_append`. For section-level edits use `naumu_note_replace_section`. For inline tweaks use `naumu_note_find_replace`. Read with `naumu_note_read` first if you weren\'t the last writer.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
noteId: z.string().describe('The note (Thought) ID'),
|
|
8
|
+
markdown: z.string().describe('New markdown content for the entire note'),
|
|
9
|
+
}),
|
|
10
|
+
}, async ({ noteId, markdown }) => {
|
|
11
|
+
const data = await client.post(`/api/notes/${noteId}/replace`, { markdown });
|
|
12
|
+
return {
|
|
13
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=note-replace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note-replace.js","sourceRoot":"","sources":["../../src/tools/note-replace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAmB;IACzE,MAAM,CAAC,YAAY,CAClB,oBAAoB,EACpB;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EACV,obAAob;QACrb,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;SACzE,CAAC;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7E,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerPostMessage(server, client) {
|
|
3
|
+
server.registerTool('naumu_post_message', {
|
|
4
|
+
title: 'Post Message',
|
|
5
|
+
description: 'Post a message in a Naumu thread you are participating in. Use this to reply to humans (or other bots) in a thread that pinged you. Plain text is accepted by default; for rendered @mentions, pass a Tiptap JSON document with mention nodes (`{ type: "mention", attrs: { id, label } }`) and set contentFormat to "tiptap". To attach files (reports, images, audio, video) call `naumu_request_attachment_upload` first for each file, PUT the bytes to the returned `uploadUrl`, then pass the resulting `attachmentId`s here as `attachmentIds`. The message must have either `content` or `attachmentIds` (or both). Returns the created message JSON.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
threadId: z.string().describe('The thread ID to post into. You must be a participant in this thread.'),
|
|
8
|
+
content: z
|
|
9
|
+
.string()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Message body. Plain text by default; pass a Tiptap JSON document only if contentFormat is set to "tiptap". Optional when `attachmentIds` is provided.'),
|
|
12
|
+
contentFormat: z
|
|
13
|
+
.enum(['tiptap', 'text'])
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('Format of `content`. Defaults to "text". Use "tiptap" for rendered mentions/embeds, e.g. a doc containing `{ type: "mention", attrs: { id: userIdOrIdentityId, label: displayName } }`.'),
|
|
16
|
+
attachmentIds: z
|
|
17
|
+
.array(z.string().min(1))
|
|
18
|
+
.max(25)
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Attachment IDs from prior `naumu_request_attachment_upload` calls. Each must be a successfully-uploaded pending attachment in this graph (1-hour TTL). Up to 25 per message.'),
|
|
21
|
+
}),
|
|
22
|
+
}, async ({ threadId, content, contentFormat, attachmentIds }) => {
|
|
23
|
+
try {
|
|
24
|
+
const body = {
|
|
25
|
+
contentFormat: contentFormat ?? 'text',
|
|
26
|
+
};
|
|
27
|
+
if (content !== undefined)
|
|
28
|
+
body.content = content;
|
|
29
|
+
if (attachmentIds && attachmentIds.length > 0)
|
|
30
|
+
body.attachmentIds = attachmentIds;
|
|
31
|
+
const data = await client.post(`/api/threads/${threadId}/messages`, body);
|
|
32
|
+
return {
|
|
33
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
38
|
+
return {
|
|
39
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
40
|
+
isError: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=post-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-message.js","sourceRoot":"","sources":["../../src/tools/post-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAmB;IACzE,MAAM,CAAC,YAAY,CAClB,oBAAoB,EACpB;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EACV,+nBAA+nB;QAChoB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;YACtG,OAAO,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uJAAuJ,CAAC;YACnK,aAAa,EAAE,CAAC;iBACd,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;iBACxB,QAAQ,EAAE;iBACV,QAAQ,CAAC,yLAAyL,CAAC;YACrM,aAAa,EAAE,CAAC;iBACd,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBACxB,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,8KAA8K,CAAC;SAC1L,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,EAAE;QAC7D,IAAI,CAAC;YACJ,MAAM,IAAI,GAA4B;gBACrC,aAAa,EAAE,aAAa,IAAI,MAAM;aACtC,CAAC;YACF,IAAI,OAAO,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YAClD,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YAClF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC;YAC1E,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACb,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerReactToMessage(server, client) {
|
|
3
|
+
server.registerTool('naumu_react_to_message', {
|
|
4
|
+
title: 'React to Message',
|
|
5
|
+
description: 'Add an emoji reaction to a message in a thread you are participating in. Idempotent — calling twice with the same emoji is a no-op (use `naumu_remove_reaction` to undo).\n\nWhen to react vs. when to post a message:\n• React (no message) for lightweight acknowledgement (👀, ✅, 👍), appreciation (❤️, 🙌), laughter (😂), or "I saw this".\n• Post a message for direct questions, clarification, important corrections, or final results — situations where words are required.\n• For long tasks: react 👀 first to acknowledge, optionally post a short "On it — I\'ll report back" if the work will take >20s, do the work, then post the final result.\n• Ignore casual human banter, side-conversations someone else already answered, or anything where you would only say "ok"/"nice"/"lol".\n\nUse at most one reaction per message unless explicitly useful. Reactions are social backpressure relief, not a sparkle-confetti channel.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
threadId: z
|
|
8
|
+
.string()
|
|
9
|
+
.describe('Thread containing the message. You must be a participant.'),
|
|
10
|
+
messageId: z
|
|
11
|
+
.string()
|
|
12
|
+
.describe('The message to react to.'),
|
|
13
|
+
emoji: z
|
|
14
|
+
.string()
|
|
15
|
+
.min(1)
|
|
16
|
+
.describe('Emoji character (e.g. "👀", "✅", "❤️"). Custom-emoji shortcodes are NOT supported here — pass a real Unicode emoji.'),
|
|
17
|
+
}),
|
|
18
|
+
}, async ({ threadId, messageId, emoji }) => {
|
|
19
|
+
try {
|
|
20
|
+
const data = await client.post(`/api/threads/${threadId}/messages/${messageId}/reactions`, { emoji, action: 'add' });
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=react-to-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-to-message.js","sourceRoot":"","sources":["../../src/tools/react-to-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAmB;IAC5E,MAAM,CAAC,YAAY,CAClB,wBAAwB,EACxB;QACC,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACV,w5BAAw5B;QACz5B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,CAAC,2DAA2D,CAAC;YACvE,SAAS,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,CAAC,0BAA0B,CAAC;YACtC,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,qHAAqH,CAAC;SACjI,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;QACxC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAC7B,gBAAgB,QAAQ,aAAa,SAAS,YAAY,EAC1D,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CACxB,CAAC;YACF,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACb,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerReadThread(server, client) {
|
|
3
|
+
server.registerTool('naumu_read_thread', {
|
|
4
|
+
title: 'Read Thread',
|
|
5
|
+
description: 'Read messages from a Naumu thread. Returns paginated history ordered newest-first. Use `before` (timestamp ms) to page back further into older history. Default page size 50, max 200.',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
threadId: z.string().describe('The thread ID to read from.'),
|
|
8
|
+
before: z
|
|
9
|
+
.number()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Unix timestamp in milliseconds. Returns messages strictly older than this. Omit for the newest page.'),
|
|
12
|
+
limit: z
|
|
13
|
+
.number()
|
|
14
|
+
.int()
|
|
15
|
+
.min(1)
|
|
16
|
+
.max(200)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('Page size, default 50, max 200.'),
|
|
19
|
+
}),
|
|
20
|
+
}, async ({ threadId, before, limit }) => {
|
|
21
|
+
try {
|
|
22
|
+
const params = new URLSearchParams();
|
|
23
|
+
if (before !== undefined)
|
|
24
|
+
params.set('before', String(before));
|
|
25
|
+
if (limit !== undefined)
|
|
26
|
+
params.set('limit', String(limit));
|
|
27
|
+
const qs = params.toString();
|
|
28
|
+
const path = `/api/threads/${threadId}/messages${qs ? `?${qs}` : ''}`;
|
|
29
|
+
const data = await client.get(path);
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: 'text', text: `Error: ${message}` }],
|
|
38
|
+
isError: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=read-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-thread.js","sourceRoot":"","sources":["../../src/tools/read-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAmB;IACxE,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,KAAK,EAAE,aAAa;QACpB,WAAW,EACV,wLAAwL;QACzL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAC5D,MAAM,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sGAAsG,CAAC;YAClH,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,iCAAiC,CAAC;SAC7C,CAAC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QACrC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAE5D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,gBAAgB,QAAQ,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEpC,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACb,CAAC;QACH,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
const EdgeRef = z.object({
|
|
3
|
+
source: z.string().describe('Source node ID'),
|
|
4
|
+
target: z.string().describe('Target node ID'),
|
|
5
|
+
label: z.string().describe('Relationship type to delete (e.g. RELATES_TO, SOLVES)'),
|
|
6
|
+
});
|
|
2
7
|
export function registerRemoveEdge(server, client) {
|
|
3
8
|
server.registerTool('naumu_remove_edge', {
|
|
4
|
-
title: 'Remove
|
|
5
|
-
description: '
|
|
9
|
+
title: 'Remove Edges (bulk)',
|
|
10
|
+
description: 'Delete 1–25 relationships (edges) in a single call. Keep batches small and atomic (5–25 edges). **Prefer `naumu_ask`** for structural changes that need broader graph reasoning.',
|
|
6
11
|
inputSchema: z.object({
|
|
7
12
|
graphId: z.string().describe('The graph ID'),
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
edges: z
|
|
14
|
+
.array(EdgeRef)
|
|
15
|
+
.min(1)
|
|
16
|
+
.max(25)
|
|
17
|
+
.describe('Batch of 1–25 edges to delete. Keep batches small for atomicity.'),
|
|
11
18
|
}),
|
|
12
|
-
}, async ({ graphId,
|
|
13
|
-
const data = await client.
|
|
14
|
-
source,
|
|
15
|
-
target,
|
|
16
|
-
relation,
|
|
17
|
-
});
|
|
19
|
+
}, async ({ graphId, edges }) => {
|
|
20
|
+
const data = await client.post(`/api/graphs/${graphId}/edges/delete`, { edges });
|
|
18
21
|
return {
|
|
19
22
|
content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
|
|
20
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-edge.js","sourceRoot":"","sources":["../../src/tools/remove-edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,
|
|
1
|
+
{"version":3,"file":"remove-edge.js","sourceRoot":"","sources":["../../src/tools/remove-edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;CACnF,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAmB;IACxE,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACV,kLAAkL;QACnL,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5C,KAAK,EAAE,CAAC;iBACN,KAAK,CAAC,OAAO,CAAC;iBACd,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,CAAC,kEAAkE,CAAC;SAC9E,CAAC;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,OAAO;YACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC"}
|