@ankimcp/anki-mcp-server
Version:
Model Context Protocol server for Anki - enables AI assistants to interact with your Anki flashcards
74 lines • 2.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.suspensionCountsSchema = exports.cardSuspensionStatusSchema = exports.cardIdsSchema = void 0;
exports.fetchSuspensionStatuses = fetchSuspensionStatuses;
exports.summarizeSuspensionStatuses = summarizeSuspensionStatuses;
exports.findMissingCardIds = findMissingCardIds;
const zod_1 = require("zod");
exports.cardIdsSchema = zod_1.z
.array(zod_1.z.number().int().positive())
.min(1)
.max(500)
.describe("Array of card IDs (max 500). Card IDs (not note IDs) — use get_cards, " +
"get_due_cards, or notesInfo to obtain them.");
exports.cardSuspensionStatusSchema = zod_1.z.object({
cardId: zod_1.z.number(),
suspended: zod_1.z
.boolean()
.nullable()
.describe("true if suspended, false if not suspended, null if the card ID does not exist"),
});
exports.suspensionCountsSchema = zod_1.z.object({
total: zod_1.z.number(),
suspendedCount: zod_1.z.number(),
unsuspendedCount: zod_1.z.number(),
missingCount: zod_1.z.number(),
});
async function fetchSuspensionStatuses(cards, client) {
const results = await client.invoke("areSuspended", {
cards,
});
if (!Array.isArray(results) || results.length !== cards.length) {
throw new Error(`areSuspended returned ${Array.isArray(results)
? `${results.length} entries`
: results === null
? "null"
: typeof results} for ${cards.length} card(s)`);
}
return cards.map((cardId, index) => {
const suspended = results[index];
if (typeof suspended !== "boolean" && suspended !== null) {
throw new Error(`areSuspended returned ${JSON.stringify(suspended)} for card ${cardId}; ` +
`expected true, false, or null`);
}
return { cardId, suspended };
});
}
function summarizeSuspensionStatuses(statuses) {
let suspendedCount = 0;
let unsuspendedCount = 0;
let missingCount = 0;
for (const status of statuses) {
if (status.suspended === true) {
suspendedCount++;
}
else if (status.suspended === false) {
unsuspendedCount++;
}
else {
missingCount++;
}
}
return {
total: statuses.length,
suspendedCount,
unsuspendedCount,
missingCount,
};
}
function findMissingCardIds(statuses) {
return statuses
.filter((status) => status.suspended === null)
.map((status) => status.cardId);
}
//# sourceMappingURL=card-suspension.utils.js.map