anki-mcp-http 0.3.0 → 0.5.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 +2 -0
- package/dist/app.module.js +12 -2
- package/dist/app.module.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +19 -5
- package/dist/cli.js.map +1 -1
- package/dist/main-http.js +1 -0
- package/dist/main-http.js.map +1 -1
- package/dist/mcp/primitives/essential/index.d.ts +1 -0
- package/dist/mcp/primitives/essential/index.js +5 -1
- package/dist/mcp/primitives/essential/index.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/add-note.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/add-note.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/create-deck.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js +2 -1
- package/dist/mcp/primitives/essential/tools/create-deck.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/create-model.tool.d.ts +3 -3
- package/dist/mcp/primitives/essential/tools/create-model.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/delete-notes.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/delete-notes.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/find-notes.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/find-notes.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/get-due-cards.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/get-due-cards.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/list-decks.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/list-decks.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.d.ts +10 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.js +18 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/deleteMediaFile.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.d.ts +12 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.js +22 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/getMediaFilesNames.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.d.ts +12 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.js +29 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/retrieveMediaFile.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.d.ts +15 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js +41 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/actions/storeMediaFile.action.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/index.d.ts +5 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/index.js +6 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/index.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.d.ts +89 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.js +135 -0
- package/dist/mcp/primitives/essential/tools/mediaActions/mediaActions.tool.js.map +1 -0
- package/dist/mcp/primitives/essential/tools/model-field-names.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/model-field-names.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/model-names.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/model-names.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/model-styling.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/model-styling.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/notes-info.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/notes-info.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/present-card.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/present-card.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/rate-card.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/rate-card.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/sync.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/sync.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/update-model-styling.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/update-model-styling.tool.js.map +1 -1
- package/dist/mcp/primitives/essential/tools/update-note-fields.tool.d.ts +2 -2
- package/dist/mcp/primitives/essential/tools/update-note-fields.tool.js.map +1 -1
- package/dist/mcp/primitives/gui/index.d.ts +21 -2
- package/dist/mcp/primitives/gui/index.js +73 -5
- package/dist/mcp/primitives/gui/index.js.map +1 -1
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.d.ts +88 -0
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.js +111 -0
- package/dist/mcp/primitives/gui/tools/gui-add-cards.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.d.ts +87 -0
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.js +98 -0
- package/dist/mcp/primitives/gui/tools/gui-browse.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.js +76 -0
- package/dist/mcp/primitives/gui/tools/gui-current-card.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.js +64 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-browser.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.d.ts +83 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.js +85 -0
- package/dist/mcp/primitives/gui/tools/gui-deck-overview.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.d.ts +83 -0
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.js +79 -0
- package/dist/mcp/primitives/gui/tools/gui-edit-note.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.d.ts +83 -0
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.js +87 -0
- package/dist/mcp/primitives/gui/tools/gui-select-card.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.js +82 -0
- package/dist/mcp/primitives/gui/tools/gui-selected-notes.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.js +74 -0
- package/dist/mcp/primitives/gui/tools/gui-show-answer.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.js +74 -0
- package/dist/mcp/primitives/gui/tools/gui-show-question.tool.js.map +1 -0
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.d.ts +81 -0
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.js +74 -0
- package/dist/mcp/primitives/gui/tools/gui-undo.tool.js.map +1 -0
- package/dist/mcp/types/anki.types.d.ts +28 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +13 -7
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var GuiCurrentCardTool_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.GuiCurrentCardTool = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const mcp_nest_1 = require("@rekog/mcp-nest");
|
|
16
|
+
const zod_1 = require("zod");
|
|
17
|
+
const anki_connect_client_1 = require("../../../clients/anki-connect.client");
|
|
18
|
+
const anki_utils_1 = require("../../../utils/anki.utils");
|
|
19
|
+
let GuiCurrentCardTool = GuiCurrentCardTool_1 = class GuiCurrentCardTool {
|
|
20
|
+
ankiClient;
|
|
21
|
+
logger = new common_1.Logger(GuiCurrentCardTool_1.name);
|
|
22
|
+
constructor(ankiClient) {
|
|
23
|
+
this.ankiClient = ankiClient;
|
|
24
|
+
}
|
|
25
|
+
async guiCurrentCard(_args, context) {
|
|
26
|
+
try {
|
|
27
|
+
this.logger.log('Getting current card information from GUI');
|
|
28
|
+
await context.reportProgress({ progress: 50, total: 100 });
|
|
29
|
+
const cardInfo = await this.ankiClient.invoke('guiCurrentCard');
|
|
30
|
+
await context.reportProgress({ progress: 100, total: 100 });
|
|
31
|
+
if (!cardInfo) {
|
|
32
|
+
this.logger.log('Not currently in review mode');
|
|
33
|
+
return (0, anki_utils_1.createSuccessResponse)({
|
|
34
|
+
success: true,
|
|
35
|
+
cardInfo: null,
|
|
36
|
+
inReview: false,
|
|
37
|
+
message: 'Not currently in review mode',
|
|
38
|
+
hint: 'Open a deck in Anki and start reviewing to see current card information.',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
this.logger.log(`Retrieved current card: ${cardInfo.cardId} from deck "${cardInfo.deckName}"`);
|
|
42
|
+
return (0, anki_utils_1.createSuccessResponse)({
|
|
43
|
+
success: true,
|
|
44
|
+
cardInfo,
|
|
45
|
+
inReview: true,
|
|
46
|
+
message: `Current card: ${cardInfo.cardId} from deck "${cardInfo.deckName}"`,
|
|
47
|
+
hint: 'Use guiEditNote to edit the note associated with this card.',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
this.logger.error('Failed to get current card information', error);
|
|
52
|
+
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
53
|
+
hint: 'Make sure Anki is running and the GUI is visible',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
exports.GuiCurrentCardTool = GuiCurrentCardTool;
|
|
59
|
+
__decorate([
|
|
60
|
+
(0, mcp_nest_1.Tool)({
|
|
61
|
+
name: 'guiCurrentCard',
|
|
62
|
+
description: 'Get information about the current card displayed in review mode. Returns card details (question, answer, deck, model, etc.) or null if not in review. ' +
|
|
63
|
+
'CRITICAL: This tool is ONLY for note editing/creation workflows when user needs to check what card is currently displayed in the GUI. ' +
|
|
64
|
+
'NEVER use this for conducting review sessions. Use the dedicated review tools (get_due_cards, present_card, rate_card) instead. ' +
|
|
65
|
+
'IMPORTANT: Only use when user explicitly requests current card information.',
|
|
66
|
+
parameters: zod_1.z.object({}),
|
|
67
|
+
}),
|
|
68
|
+
__metadata("design:type", Function),
|
|
69
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
70
|
+
__metadata("design:returntype", Promise)
|
|
71
|
+
], GuiCurrentCardTool.prototype, "guiCurrentCard", null);
|
|
72
|
+
exports.GuiCurrentCardTool = GuiCurrentCardTool = GuiCurrentCardTool_1 = __decorate([
|
|
73
|
+
(0, common_1.Injectable)(),
|
|
74
|
+
__metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
|
|
75
|
+
], GuiCurrentCardTool);
|
|
76
|
+
//# sourceMappingURL=gui-current-card.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gui-current-card.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/gui/tools/gui-current-card.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AAEtE,0DAAoF;AAM7E,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAGA;IAFZ,MAAM,GAAG,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;IAE9D,YAA6B,UAA6B;QAA7B,eAAU,GAAV,UAAU,CAAmB;IAAG,CAAC;IAWxD,AAAN,KAAK,CAAC,cAAc,CAAC,KAAS,EAAE,OAAgB;QAC9C,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YAC7D,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAG3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAA4B,gBAAgB,CAAC,CAAC;YAE3F,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAE5D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAChD,OAAO,IAAA,kCAAqB,EAAC;oBAC3B,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,8BAA8B;oBACvC,IAAI,EAAE,0EAA0E;iBACjF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,QAAQ,CAAC,MAAM,eAAe,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;YAE/F,OAAO,IAAA,kCAAqB,EAAC;gBAC3B,OAAO,EAAE,IAAI;gBACb,QAAQ;gBACR,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,iBAAiB,QAAQ,CAAC,MAAM,eAAe,QAAQ,CAAC,QAAQ,GAAG;gBAC5E,IAAI,EAAE,6DAA6D;aACpE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;YAEnE,OAAO,IAAA,gCAAmB,EAAC,KAAK,EAAE;gBAChC,IAAI,EAAE,kDAAkD;aACzD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAA;AApDY,gDAAkB;AAcvB;IATL,IAAA,eAAI,EAAC;QACJ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,wJAAwJ;YACxJ,wIAAwI;YACxI,kIAAkI;YAClI,6EAA6E;QAC/E,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB,CAAC;;;;wDAsCD;6BAnDU,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;qCAI8B,uCAAiB;GAH/C,kBAAkB,CAoD9B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Context } from '@rekog/mcp-nest';
|
|
2
|
+
import { AnkiConnectClient } from '@/mcp/clients/anki-connect.client';
|
|
3
|
+
export declare class GuiDeckBrowserTool {
|
|
4
|
+
private readonly ankiClient;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(ankiClient: AnkiConnectClient);
|
|
7
|
+
guiDeckBrowser(_args: {}, context: Context): Promise<{
|
|
8
|
+
[x: string]: unknown;
|
|
9
|
+
content: ({
|
|
10
|
+
[x: string]: unknown;
|
|
11
|
+
type: "text";
|
|
12
|
+
text: string;
|
|
13
|
+
_meta?: {
|
|
14
|
+
[x: string]: unknown;
|
|
15
|
+
} | undefined;
|
|
16
|
+
} | {
|
|
17
|
+
[x: string]: unknown;
|
|
18
|
+
type: "image";
|
|
19
|
+
data: string;
|
|
20
|
+
mimeType: string;
|
|
21
|
+
_meta?: {
|
|
22
|
+
[x: string]: unknown;
|
|
23
|
+
} | undefined;
|
|
24
|
+
} | {
|
|
25
|
+
[x: string]: unknown;
|
|
26
|
+
type: "audio";
|
|
27
|
+
data: string;
|
|
28
|
+
mimeType: string;
|
|
29
|
+
_meta?: {
|
|
30
|
+
[x: string]: unknown;
|
|
31
|
+
} | undefined;
|
|
32
|
+
} | {
|
|
33
|
+
[x: string]: unknown;
|
|
34
|
+
type: "resource_link";
|
|
35
|
+
name: string;
|
|
36
|
+
uri: string;
|
|
37
|
+
_meta?: {
|
|
38
|
+
[x: string]: unknown;
|
|
39
|
+
} | undefined;
|
|
40
|
+
mimeType?: string | undefined;
|
|
41
|
+
title?: string | undefined;
|
|
42
|
+
description?: string | undefined;
|
|
43
|
+
icons?: {
|
|
44
|
+
[x: string]: unknown;
|
|
45
|
+
src: string;
|
|
46
|
+
mimeType?: string | undefined;
|
|
47
|
+
sizes?: string[] | undefined;
|
|
48
|
+
}[] | undefined;
|
|
49
|
+
} | {
|
|
50
|
+
[x: string]: unknown;
|
|
51
|
+
type: "resource";
|
|
52
|
+
resource: {
|
|
53
|
+
[x: string]: unknown;
|
|
54
|
+
text: string;
|
|
55
|
+
uri: string;
|
|
56
|
+
_meta?: {
|
|
57
|
+
[x: string]: unknown;
|
|
58
|
+
} | undefined;
|
|
59
|
+
mimeType?: string | undefined;
|
|
60
|
+
} | {
|
|
61
|
+
[x: string]: unknown;
|
|
62
|
+
uri: string;
|
|
63
|
+
blob: string;
|
|
64
|
+
_meta?: {
|
|
65
|
+
[x: string]: unknown;
|
|
66
|
+
} | undefined;
|
|
67
|
+
mimeType?: string | undefined;
|
|
68
|
+
};
|
|
69
|
+
_meta?: {
|
|
70
|
+
[x: string]: unknown;
|
|
71
|
+
} | undefined;
|
|
72
|
+
})[];
|
|
73
|
+
_meta?: {
|
|
74
|
+
[x: string]: unknown;
|
|
75
|
+
} | undefined;
|
|
76
|
+
structuredContent?: {
|
|
77
|
+
[x: string]: unknown;
|
|
78
|
+
} | undefined;
|
|
79
|
+
isError?: boolean | undefined;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var GuiDeckBrowserTool_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.GuiDeckBrowserTool = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const mcp_nest_1 = require("@rekog/mcp-nest");
|
|
16
|
+
const zod_1 = require("zod");
|
|
17
|
+
const anki_connect_client_1 = require("../../../clients/anki-connect.client");
|
|
18
|
+
const anki_utils_1 = require("../../../utils/anki.utils");
|
|
19
|
+
let GuiDeckBrowserTool = GuiDeckBrowserTool_1 = class GuiDeckBrowserTool {
|
|
20
|
+
ankiClient;
|
|
21
|
+
logger = new common_1.Logger(GuiDeckBrowserTool_1.name);
|
|
22
|
+
constructor(ankiClient) {
|
|
23
|
+
this.ankiClient = ankiClient;
|
|
24
|
+
}
|
|
25
|
+
async guiDeckBrowser(_args, context) {
|
|
26
|
+
try {
|
|
27
|
+
this.logger.log('Opening Deck Browser');
|
|
28
|
+
await context.reportProgress({ progress: 50, total: 100 });
|
|
29
|
+
await this.ankiClient.invoke('guiDeckBrowser');
|
|
30
|
+
await context.reportProgress({ progress: 100, total: 100 });
|
|
31
|
+
this.logger.log('Deck Browser opened');
|
|
32
|
+
return (0, anki_utils_1.createSuccessResponse)({
|
|
33
|
+
success: true,
|
|
34
|
+
message: 'Deck Browser opened successfully',
|
|
35
|
+
hint: 'All decks are now visible in the Anki GUI. User can select a deck to study or manage.',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
this.logger.error('Failed to open Deck Browser', error);
|
|
40
|
+
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
41
|
+
hint: 'Make sure Anki is running and the GUI is visible',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
exports.GuiDeckBrowserTool = GuiDeckBrowserTool;
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, mcp_nest_1.Tool)({
|
|
49
|
+
name: 'guiDeckBrowser',
|
|
50
|
+
description: 'Open Anki Deck Browser dialog showing all decks. ' +
|
|
51
|
+
'IMPORTANT: Only use when user explicitly requests opening the deck browser. ' +
|
|
52
|
+
'This tool is for deck management and organization workflows, NOT for review sessions. ' +
|
|
53
|
+
'Use this when user wants to see all decks or manage deck structure.',
|
|
54
|
+
parameters: zod_1.z.object({}),
|
|
55
|
+
}),
|
|
56
|
+
__metadata("design:type", Function),
|
|
57
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
58
|
+
__metadata("design:returntype", Promise)
|
|
59
|
+
], GuiDeckBrowserTool.prototype, "guiDeckBrowser", null);
|
|
60
|
+
exports.GuiDeckBrowserTool = GuiDeckBrowserTool = GuiDeckBrowserTool_1 = __decorate([
|
|
61
|
+
(0, common_1.Injectable)(),
|
|
62
|
+
__metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
|
|
63
|
+
], GuiDeckBrowserTool);
|
|
64
|
+
//# sourceMappingURL=gui-deck-browser.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gui-deck-browser.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/gui/tools/gui-deck-browser.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AACtE,0DAAoF;AAM7E,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAGA;IAFZ,MAAM,GAAG,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;IAE9D,YAA6B,UAA6B;QAA7B,eAAU,GAAV,UAAU,CAAmB;IAAG,CAAC;IAWxD,AAAN,KAAK,CAAC,cAAc,CAAC,KAAS,EAAE,OAAgB;QAC9C,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACxC,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAG3D,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAO,gBAAgB,CAAC,CAAC;YAErD,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAEvC,OAAO,IAAA,kCAAqB,EAAC;gBAC3B,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,kCAAkC;gBAC3C,IAAI,EAAE,uFAAuF;aAC9F,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YAExD,OAAO,IAAA,gCAAmB,EAAC,KAAK,EAAE;gBAChC,IAAI,EAAE,kDAAkD;aACzD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAA;AAtCY,gDAAkB;AAcvB;IATL,IAAA,eAAI,EAAC;QACJ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,mDAAmD;YACnD,8EAA8E;YAC9E,wFAAwF;YACxF,qEAAqE;QACvE,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC;KACzB,CAAC;;;;wDAwBD;6BArCU,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;qCAI8B,uCAAiB;GAH/C,kBAAkB,CAsC9B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Context } from '@rekog/mcp-nest';
|
|
2
|
+
import { AnkiConnectClient } from '@/mcp/clients/anki-connect.client';
|
|
3
|
+
export declare class GuiDeckOverviewTool {
|
|
4
|
+
private readonly ankiClient;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(ankiClient: AnkiConnectClient);
|
|
7
|
+
guiDeckOverview({ name }: {
|
|
8
|
+
name: string;
|
|
9
|
+
}, context: Context): Promise<{
|
|
10
|
+
[x: string]: unknown;
|
|
11
|
+
content: ({
|
|
12
|
+
[x: string]: unknown;
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
_meta?: {
|
|
16
|
+
[x: string]: unknown;
|
|
17
|
+
} | undefined;
|
|
18
|
+
} | {
|
|
19
|
+
[x: string]: unknown;
|
|
20
|
+
type: "image";
|
|
21
|
+
data: string;
|
|
22
|
+
mimeType: string;
|
|
23
|
+
_meta?: {
|
|
24
|
+
[x: string]: unknown;
|
|
25
|
+
} | undefined;
|
|
26
|
+
} | {
|
|
27
|
+
[x: string]: unknown;
|
|
28
|
+
type: "audio";
|
|
29
|
+
data: string;
|
|
30
|
+
mimeType: string;
|
|
31
|
+
_meta?: {
|
|
32
|
+
[x: string]: unknown;
|
|
33
|
+
} | undefined;
|
|
34
|
+
} | {
|
|
35
|
+
[x: string]: unknown;
|
|
36
|
+
type: "resource_link";
|
|
37
|
+
name: string;
|
|
38
|
+
uri: string;
|
|
39
|
+
_meta?: {
|
|
40
|
+
[x: string]: unknown;
|
|
41
|
+
} | undefined;
|
|
42
|
+
mimeType?: string | undefined;
|
|
43
|
+
title?: string | undefined;
|
|
44
|
+
description?: string | undefined;
|
|
45
|
+
icons?: {
|
|
46
|
+
[x: string]: unknown;
|
|
47
|
+
src: string;
|
|
48
|
+
mimeType?: string | undefined;
|
|
49
|
+
sizes?: string[] | undefined;
|
|
50
|
+
}[] | undefined;
|
|
51
|
+
} | {
|
|
52
|
+
[x: string]: unknown;
|
|
53
|
+
type: "resource";
|
|
54
|
+
resource: {
|
|
55
|
+
[x: string]: unknown;
|
|
56
|
+
text: string;
|
|
57
|
+
uri: string;
|
|
58
|
+
_meta?: {
|
|
59
|
+
[x: string]: unknown;
|
|
60
|
+
} | undefined;
|
|
61
|
+
mimeType?: string | undefined;
|
|
62
|
+
} | {
|
|
63
|
+
[x: string]: unknown;
|
|
64
|
+
uri: string;
|
|
65
|
+
blob: string;
|
|
66
|
+
_meta?: {
|
|
67
|
+
[x: string]: unknown;
|
|
68
|
+
} | undefined;
|
|
69
|
+
mimeType?: string | undefined;
|
|
70
|
+
};
|
|
71
|
+
_meta?: {
|
|
72
|
+
[x: string]: unknown;
|
|
73
|
+
} | undefined;
|
|
74
|
+
})[];
|
|
75
|
+
_meta?: {
|
|
76
|
+
[x: string]: unknown;
|
|
77
|
+
} | undefined;
|
|
78
|
+
structuredContent?: {
|
|
79
|
+
[x: string]: unknown;
|
|
80
|
+
} | undefined;
|
|
81
|
+
isError?: boolean | undefined;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var GuiDeckOverviewTool_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.GuiDeckOverviewTool = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const mcp_nest_1 = require("@rekog/mcp-nest");
|
|
16
|
+
const zod_1 = require("zod");
|
|
17
|
+
const anki_connect_client_1 = require("../../../clients/anki-connect.client");
|
|
18
|
+
const anki_utils_1 = require("../../../utils/anki.utils");
|
|
19
|
+
let GuiDeckOverviewTool = GuiDeckOverviewTool_1 = class GuiDeckOverviewTool {
|
|
20
|
+
ankiClient;
|
|
21
|
+
logger = new common_1.Logger(GuiDeckOverviewTool_1.name);
|
|
22
|
+
constructor(ankiClient) {
|
|
23
|
+
this.ankiClient = ankiClient;
|
|
24
|
+
}
|
|
25
|
+
async guiDeckOverview({ name }, context) {
|
|
26
|
+
try {
|
|
27
|
+
this.logger.log(`Opening Deck Overview for deck "${name}"`);
|
|
28
|
+
await context.reportProgress({ progress: 50, total: 100 });
|
|
29
|
+
const success = await this.ankiClient.invoke('guiDeckOverview', { name });
|
|
30
|
+
await context.reportProgress({ progress: 100, total: 100 });
|
|
31
|
+
if (!success) {
|
|
32
|
+
this.logger.warn(`Failed to open Deck Overview for deck "${name}"`);
|
|
33
|
+
return (0, anki_utils_1.createErrorResponse)(new Error(`Failed to open Deck Overview for deck "${name}"`), {
|
|
34
|
+
deckName: name,
|
|
35
|
+
hint: 'Deck not found or Anki GUI is not responding. Use list_decks to see available decks.',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
this.logger.log(`Deck Overview opened for deck "${name}"`);
|
|
39
|
+
return (0, anki_utils_1.createSuccessResponse)({
|
|
40
|
+
success: true,
|
|
41
|
+
deckName: name,
|
|
42
|
+
message: `Deck Overview opened for deck "${name}"`,
|
|
43
|
+
hint: 'The deck statistics and study options are now visible in the Anki GUI.',
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
this.logger.error('Failed to open Deck Overview', error);
|
|
48
|
+
if (error instanceof Error) {
|
|
49
|
+
if (error.message.includes('not found') || error.message.includes('invalid')) {
|
|
50
|
+
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
51
|
+
deckName: name,
|
|
52
|
+
hint: 'Deck not found. Use list_decks to see available decks.',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
57
|
+
deckName: name,
|
|
58
|
+
hint: 'Make sure Anki is running and the deck name is correct',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
exports.GuiDeckOverviewTool = GuiDeckOverviewTool;
|
|
64
|
+
__decorate([
|
|
65
|
+
(0, mcp_nest_1.Tool)({
|
|
66
|
+
name: 'guiDeckOverview',
|
|
67
|
+
description: 'Open Anki Deck Overview dialog for a specific deck. Shows deck statistics and study options. Returns true if succeeded. ' +
|
|
68
|
+
'IMPORTANT: Only use when user explicitly requests opening deck overview. ' +
|
|
69
|
+
'This tool is for deck management and note organization workflows, NOT for review sessions.',
|
|
70
|
+
parameters: zod_1.z.object({
|
|
71
|
+
name: zod_1.z
|
|
72
|
+
.string()
|
|
73
|
+
.min(1)
|
|
74
|
+
.describe('Deck name to open (get from list_decks)'),
|
|
75
|
+
}),
|
|
76
|
+
}),
|
|
77
|
+
__metadata("design:type", Function),
|
|
78
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
79
|
+
__metadata("design:returntype", Promise)
|
|
80
|
+
], GuiDeckOverviewTool.prototype, "guiDeckOverview", null);
|
|
81
|
+
exports.GuiDeckOverviewTool = GuiDeckOverviewTool = GuiDeckOverviewTool_1 = __decorate([
|
|
82
|
+
(0, common_1.Injectable)(),
|
|
83
|
+
__metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
|
|
84
|
+
], GuiDeckOverviewTool);
|
|
85
|
+
//# sourceMappingURL=gui-deck-overview.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gui-deck-overview.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/gui/tools/gui-deck-overview.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AACtE,0DAAoF;AAM7E,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAGD;IAFZ,MAAM,GAAG,IAAI,eAAM,CAAC,qBAAmB,CAAC,IAAI,CAAC,CAAC;IAE/D,YAA6B,UAA6B;QAA7B,eAAU,GAAV,UAAU,CAAmB;IAAG,CAAC;IAexD,AAAN,KAAK,CAAC,eAAe,CAAC,EAAE,IAAI,EAAoB,EAAE,OAAgB;QAChE,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mCAAmC,IAAI,GAAG,CAAC,CAAC;YAC5D,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAG3D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAU,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAEnF,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAE5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,IAAI,GAAG,CAAC,CAAC;gBACpE,OAAO,IAAA,gCAAmB,EACxB,IAAI,KAAK,CAAC,0CAA0C,IAAI,GAAG,CAAC,EAC5D;oBACE,QAAQ,EAAE,IAAI;oBACd,IAAI,EAAE,sFAAsF;iBAC7F,CACF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kCAAkC,IAAI,GAAG,CAAC,CAAC;YAE3D,OAAO,IAAA,kCAAqB,EAAC;gBAC3B,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,kCAAkC,IAAI,GAAG;gBAClD,IAAI,EAAE,wEAAwE;aAC/E,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YAEzD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7E,OAAO,IAAA,gCAAmB,EAAC,KAAK,EAAE;wBAChC,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE,wDAAwD;qBAC/D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,IAAA,gCAAmB,EAAC,KAAK,EAAE;gBAChC,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,wDAAwD;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAA;AAjEY,kDAAmB;AAkBxB;IAbL,IAAA,eAAI,EAAC;QACJ,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,0HAA0H;YAC1H,2EAA2E;YAC3E,4FAA4F;QAC9F,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,OAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,yCAAyC,CAAC;SACvD,CAAC;KACH,CAAC;;;;0DA+CD;8BAhEU,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;qCAI8B,uCAAiB;GAH/C,mBAAmB,CAiE/B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Context } from '@rekog/mcp-nest';
|
|
2
|
+
import { AnkiConnectClient } from '@/mcp/clients/anki-connect.client';
|
|
3
|
+
export declare class GuiEditNoteTool {
|
|
4
|
+
private readonly ankiClient;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(ankiClient: AnkiConnectClient);
|
|
7
|
+
guiEditNote({ note }: {
|
|
8
|
+
note: number;
|
|
9
|
+
}, context: Context): Promise<{
|
|
10
|
+
[x: string]: unknown;
|
|
11
|
+
content: ({
|
|
12
|
+
[x: string]: unknown;
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
_meta?: {
|
|
16
|
+
[x: string]: unknown;
|
|
17
|
+
} | undefined;
|
|
18
|
+
} | {
|
|
19
|
+
[x: string]: unknown;
|
|
20
|
+
type: "image";
|
|
21
|
+
data: string;
|
|
22
|
+
mimeType: string;
|
|
23
|
+
_meta?: {
|
|
24
|
+
[x: string]: unknown;
|
|
25
|
+
} | undefined;
|
|
26
|
+
} | {
|
|
27
|
+
[x: string]: unknown;
|
|
28
|
+
type: "audio";
|
|
29
|
+
data: string;
|
|
30
|
+
mimeType: string;
|
|
31
|
+
_meta?: {
|
|
32
|
+
[x: string]: unknown;
|
|
33
|
+
} | undefined;
|
|
34
|
+
} | {
|
|
35
|
+
[x: string]: unknown;
|
|
36
|
+
type: "resource_link";
|
|
37
|
+
name: string;
|
|
38
|
+
uri: string;
|
|
39
|
+
_meta?: {
|
|
40
|
+
[x: string]: unknown;
|
|
41
|
+
} | undefined;
|
|
42
|
+
mimeType?: string | undefined;
|
|
43
|
+
title?: string | undefined;
|
|
44
|
+
description?: string | undefined;
|
|
45
|
+
icons?: {
|
|
46
|
+
[x: string]: unknown;
|
|
47
|
+
src: string;
|
|
48
|
+
mimeType?: string | undefined;
|
|
49
|
+
sizes?: string[] | undefined;
|
|
50
|
+
}[] | undefined;
|
|
51
|
+
} | {
|
|
52
|
+
[x: string]: unknown;
|
|
53
|
+
type: "resource";
|
|
54
|
+
resource: {
|
|
55
|
+
[x: string]: unknown;
|
|
56
|
+
text: string;
|
|
57
|
+
uri: string;
|
|
58
|
+
_meta?: {
|
|
59
|
+
[x: string]: unknown;
|
|
60
|
+
} | undefined;
|
|
61
|
+
mimeType?: string | undefined;
|
|
62
|
+
} | {
|
|
63
|
+
[x: string]: unknown;
|
|
64
|
+
uri: string;
|
|
65
|
+
blob: string;
|
|
66
|
+
_meta?: {
|
|
67
|
+
[x: string]: unknown;
|
|
68
|
+
} | undefined;
|
|
69
|
+
mimeType?: string | undefined;
|
|
70
|
+
};
|
|
71
|
+
_meta?: {
|
|
72
|
+
[x: string]: unknown;
|
|
73
|
+
} | undefined;
|
|
74
|
+
})[];
|
|
75
|
+
_meta?: {
|
|
76
|
+
[x: string]: unknown;
|
|
77
|
+
} | undefined;
|
|
78
|
+
structuredContent?: {
|
|
79
|
+
[x: string]: unknown;
|
|
80
|
+
} | undefined;
|
|
81
|
+
isError?: boolean | undefined;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var GuiEditNoteTool_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.GuiEditNoteTool = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const mcp_nest_1 = require("@rekog/mcp-nest");
|
|
16
|
+
const zod_1 = require("zod");
|
|
17
|
+
const anki_connect_client_1 = require("../../../clients/anki-connect.client");
|
|
18
|
+
const anki_utils_1 = require("../../../utils/anki.utils");
|
|
19
|
+
let GuiEditNoteTool = GuiEditNoteTool_1 = class GuiEditNoteTool {
|
|
20
|
+
ankiClient;
|
|
21
|
+
logger = new common_1.Logger(GuiEditNoteTool_1.name);
|
|
22
|
+
constructor(ankiClient) {
|
|
23
|
+
this.ankiClient = ankiClient;
|
|
24
|
+
}
|
|
25
|
+
async guiEditNote({ note }, context) {
|
|
26
|
+
try {
|
|
27
|
+
this.logger.log(`Opening note editor for note ${note}`);
|
|
28
|
+
await context.reportProgress({ progress: 50, total: 100 });
|
|
29
|
+
await this.ankiClient.invoke('guiEditNote', { note });
|
|
30
|
+
await context.reportProgress({ progress: 100, total: 100 });
|
|
31
|
+
this.logger.log(`Note editor opened for note ${note}`);
|
|
32
|
+
return (0, anki_utils_1.createSuccessResponse)({
|
|
33
|
+
success: true,
|
|
34
|
+
noteId: note,
|
|
35
|
+
message: `Note editor opened for note ${note}`,
|
|
36
|
+
hint: 'The user can now edit the note fields, tags, and cards in the Anki GUI. Changes will be saved when they close the editor.',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
this.logger.error('Failed to open note editor', error);
|
|
41
|
+
if (error instanceof Error) {
|
|
42
|
+
if (error.message.includes('not found') || error.message.includes('invalid')) {
|
|
43
|
+
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
44
|
+
noteId: note,
|
|
45
|
+
hint: 'Note not found. Use findNotes to search for notes and get valid note IDs.',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return (0, anki_utils_1.createErrorResponse)(error, {
|
|
50
|
+
noteId: note,
|
|
51
|
+
hint: 'Make sure Anki is running and the note ID is valid',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
exports.GuiEditNoteTool = GuiEditNoteTool;
|
|
57
|
+
__decorate([
|
|
58
|
+
(0, mcp_nest_1.Tool)({
|
|
59
|
+
name: 'guiEditNote',
|
|
60
|
+
description: 'Open Anki note editor dialog for a specific note ID. Allows manual editing of note fields, tags, and cards in the GUI. ' +
|
|
61
|
+
'IMPORTANT: Only use when user explicitly requests editing a note via GUI. ' +
|
|
62
|
+
'This tool is for note editing workflows when user wants to manually edit in Anki interface. ' +
|
|
63
|
+
'For programmatic editing, use updateNoteFields instead.',
|
|
64
|
+
parameters: zod_1.z.object({
|
|
65
|
+
note: zod_1.z
|
|
66
|
+
.number()
|
|
67
|
+
.positive()
|
|
68
|
+
.describe('Note ID to edit (get from findNotes or notesInfo)'),
|
|
69
|
+
}),
|
|
70
|
+
}),
|
|
71
|
+
__metadata("design:type", Function),
|
|
72
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
73
|
+
__metadata("design:returntype", Promise)
|
|
74
|
+
], GuiEditNoteTool.prototype, "guiEditNote", null);
|
|
75
|
+
exports.GuiEditNoteTool = GuiEditNoteTool = GuiEditNoteTool_1 = __decorate([
|
|
76
|
+
(0, common_1.Injectable)(),
|
|
77
|
+
__metadata("design:paramtypes", [anki_connect_client_1.AnkiConnectClient])
|
|
78
|
+
], GuiEditNoteTool);
|
|
79
|
+
//# sourceMappingURL=gui-edit-note.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gui-edit-note.tool.js","sourceRoot":"","sources":["../../../../../src/mcp/primitives/gui/tools/gui-edit-note.tool.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,8CAAuC;AAEvC,6BAAwB;AACxB,8EAAsE;AACtE,0DAAoF;AAM7E,IAAM,eAAe,uBAArB,MAAM,eAAe;IAGG;IAFZ,MAAM,GAAG,IAAI,eAAM,CAAC,iBAAe,CAAC,IAAI,CAAC,CAAC;IAE3D,YAA6B,UAA6B;QAA7B,eAAU,GAAV,UAAU,CAAmB;IAAG,CAAC;IAgBxD,AAAN,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI,EAAoB,EAAE,OAAgB;QAC5D,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAG3D,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAO,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5D,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;YAEvD,OAAO,IAAA,kCAAqB,EAAC;gBAC3B,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,+BAA+B,IAAI,EAAE;gBAC9C,IAAI,EAAE,2HAA2H;aAClI,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YAEvD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7E,OAAO,IAAA,gCAAmB,EAAC,KAAK,EAAE;wBAChC,MAAM,EAAE,IAAI;wBACZ,IAAI,EAAE,2EAA2E;qBAClF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,IAAA,gCAAmB,EAAC,KAAK,EAAE;gBAChC,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,oDAAoD;aAC3D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAA;AAtDY,0CAAe;AAmBpB;IAdL,IAAA,eAAI,EAAC;QACJ,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,yHAAyH;YACzH,4EAA4E;YAC5E,8FAA8F;YAC9F,yDAAyD;QAC3D,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,OAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mDAAmD,CAAC;SACjE,CAAC;KACH,CAAC;;;;kDAmCD;0BArDU,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAI8B,uCAAiB;GAH/C,eAAe,CAsD3B"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Context } from '@rekog/mcp-nest';
|
|
2
|
+
import { AnkiConnectClient } from '@/mcp/clients/anki-connect.client';
|
|
3
|
+
export declare class GuiSelectCardTool {
|
|
4
|
+
private readonly ankiClient;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(ankiClient: AnkiConnectClient);
|
|
7
|
+
guiSelectCard({ card }: {
|
|
8
|
+
card: number;
|
|
9
|
+
}, context: Context): Promise<{
|
|
10
|
+
[x: string]: unknown;
|
|
11
|
+
content: ({
|
|
12
|
+
[x: string]: unknown;
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
_meta?: {
|
|
16
|
+
[x: string]: unknown;
|
|
17
|
+
} | undefined;
|
|
18
|
+
} | {
|
|
19
|
+
[x: string]: unknown;
|
|
20
|
+
type: "image";
|
|
21
|
+
data: string;
|
|
22
|
+
mimeType: string;
|
|
23
|
+
_meta?: {
|
|
24
|
+
[x: string]: unknown;
|
|
25
|
+
} | undefined;
|
|
26
|
+
} | {
|
|
27
|
+
[x: string]: unknown;
|
|
28
|
+
type: "audio";
|
|
29
|
+
data: string;
|
|
30
|
+
mimeType: string;
|
|
31
|
+
_meta?: {
|
|
32
|
+
[x: string]: unknown;
|
|
33
|
+
} | undefined;
|
|
34
|
+
} | {
|
|
35
|
+
[x: string]: unknown;
|
|
36
|
+
type: "resource_link";
|
|
37
|
+
name: string;
|
|
38
|
+
uri: string;
|
|
39
|
+
_meta?: {
|
|
40
|
+
[x: string]: unknown;
|
|
41
|
+
} | undefined;
|
|
42
|
+
mimeType?: string | undefined;
|
|
43
|
+
title?: string | undefined;
|
|
44
|
+
description?: string | undefined;
|
|
45
|
+
icons?: {
|
|
46
|
+
[x: string]: unknown;
|
|
47
|
+
src: string;
|
|
48
|
+
mimeType?: string | undefined;
|
|
49
|
+
sizes?: string[] | undefined;
|
|
50
|
+
}[] | undefined;
|
|
51
|
+
} | {
|
|
52
|
+
[x: string]: unknown;
|
|
53
|
+
type: "resource";
|
|
54
|
+
resource: {
|
|
55
|
+
[x: string]: unknown;
|
|
56
|
+
text: string;
|
|
57
|
+
uri: string;
|
|
58
|
+
_meta?: {
|
|
59
|
+
[x: string]: unknown;
|
|
60
|
+
} | undefined;
|
|
61
|
+
mimeType?: string | undefined;
|
|
62
|
+
} | {
|
|
63
|
+
[x: string]: unknown;
|
|
64
|
+
uri: string;
|
|
65
|
+
blob: string;
|
|
66
|
+
_meta?: {
|
|
67
|
+
[x: string]: unknown;
|
|
68
|
+
} | undefined;
|
|
69
|
+
mimeType?: string | undefined;
|
|
70
|
+
};
|
|
71
|
+
_meta?: {
|
|
72
|
+
[x: string]: unknown;
|
|
73
|
+
} | undefined;
|
|
74
|
+
})[];
|
|
75
|
+
_meta?: {
|
|
76
|
+
[x: string]: unknown;
|
|
77
|
+
} | undefined;
|
|
78
|
+
structuredContent?: {
|
|
79
|
+
[x: string]: unknown;
|
|
80
|
+
} | undefined;
|
|
81
|
+
isError?: boolean | undefined;
|
|
82
|
+
}>;
|
|
83
|
+
}
|