Project Files
src / toolsProvider.ts
import type { ToolsProvider, ToolsProviderController } from "@lmstudio/sdk";
import { configSchematics } from "./config.js";
import { IndexManager } from "./indexManager.js";
import { createRecallTool } from "./tools/recall.js";
import { createReadTool } from "./tools/read.js";
import { createMemorizeTool } from "./tools/memorize.js";
import { createRewriteTool } from "./tools/rewrite.js";
import { createForgetTool } from "./tools/forget.js";
import path from "node:path";
export const toolsProvider: ToolsProvider = async (ctl: ToolsProviderController) => {
const config = ctl.getGlobalPluginConfig(configSchematics);
const playbookDirectory = config.get("playbookDirectory");
const embeddingModel = config.get("embeddingModel");
const lmStudioBaseUrl = config.get("lmStudioBaseUrl");
const maxRecallDocuments = config.get("maxRecallDocuments");
const minRecallScore = config.get("minRecallScore");
// Data directory for the SQLite index file (relative to plugin working dir)
const dataDir = path.join(process.cwd(), "playbook-db");
const resolvedConfig = {
playbookDirectory,
embeddingModel,
lmStudioBaseUrl,
maxRecallDocuments,
minRecallScore,
};
const index = new IndexManager(resolvedConfig, dataDir, lmStudioBaseUrl);
if (playbookDirectory) {
index.initialize().catch((err) => {
console.error("[playbook] IndexManager initialization failed:", err);
});
} else {
console.warn("[playbook] playbookDirectory not configured — tools are registered but inoperative.");
}
return [
createRecallTool(ctl, index),
createReadTool(ctl, index),
createMemorizeTool(ctl, index),
createRewriteTool(ctl, index),
createForgetTool(ctl, index),
];
};