@elizaos/plugin-scratchpad 2.0.0-alpha

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.
Files changed (45) hide show
  1. package/README.md +161 -0
  2. package/dist/__tests__/scratchpad-plugin.test.d.ts +3 -0
  3. package/dist/__tests__/scratchpad-plugin.test.d.ts.map +1 -0
  4. package/dist/__tests__/scratchpad-service.test.d.ts +3 -0
  5. package/dist/__tests__/scratchpad-service.test.d.ts.map +1 -0
  6. package/dist/actions/append.d.ts +4 -0
  7. package/dist/actions/append.d.ts.map +1 -0
  8. package/dist/actions/delete.d.ts +4 -0
  9. package/dist/actions/delete.d.ts.map +1 -0
  10. package/dist/actions/list.d.ts +4 -0
  11. package/dist/actions/list.d.ts.map +1 -0
  12. package/dist/actions/read.d.ts +4 -0
  13. package/dist/actions/read.d.ts.map +1 -0
  14. package/dist/actions/search.d.ts +4 -0
  15. package/dist/actions/search.d.ts.map +1 -0
  16. package/dist/actions/write.d.ts +4 -0
  17. package/dist/actions/write.d.ts.map +1 -0
  18. package/dist/browser/index.browser.js +3 -0
  19. package/dist/browser/index.browser.js.map +10 -0
  20. package/dist/browser/index.d.ts +2 -0
  21. package/dist/build.d.ts +4 -0
  22. package/dist/build.d.ts.map +1 -0
  23. package/dist/cjs/index.d.ts +2 -0
  24. package/dist/cjs/index.node.cjs +1121 -0
  25. package/dist/cjs/index.node.js.map +19 -0
  26. package/dist/generated/specs/specs.d.ts +15 -0
  27. package/dist/generated/specs/specs.d.ts.map +1 -0
  28. package/dist/index.browser.d.ts +11 -0
  29. package/dist/index.browser.d.ts.map +1 -0
  30. package/dist/index.d.ts +31 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.node.d.ts +6 -0
  33. package/dist/index.node.d.ts.map +1 -0
  34. package/dist/node/index.d.ts +2 -0
  35. package/dist/node/index.node.js +1100 -0
  36. package/dist/node/index.node.js.map +19 -0
  37. package/dist/providers/scratchpad.d.ts +8 -0
  38. package/dist/providers/scratchpad.d.ts.map +1 -0
  39. package/dist/services/scratchpadService.d.ts +63 -0
  40. package/dist/services/scratchpadService.d.ts.map +1 -0
  41. package/dist/tests.d.ts +6 -0
  42. package/dist/tests.d.ts.map +1 -0
  43. package/dist/types.d.ts +60 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/package.json +99 -0
@@ -0,0 +1,19 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../index.ts", "../../actions/append.ts", "../../generated/specs/specs.ts", "../../services/scratchpadService.ts", "../../actions/delete.ts", "../../actions/list.ts", "../../actions/read.ts", "../../actions/search.ts", "../../actions/write.ts", "../../providers/scratchpad.ts"],
4
+ "sourcesContent": [
5
+ "import type { Plugin } from \"@elizaos/core\";\nimport { type IAgentRuntime, logger } from \"@elizaos/core\";\nimport { scratchpadAppendAction } from \"./actions/append\";\nimport { scratchpadDeleteAction } from \"./actions/delete\";\nimport { scratchpadListAction } from \"./actions/list\";\nimport { scratchpadReadAction } from \"./actions/read\";\nimport { scratchpadSearchAction } from \"./actions/search\";\n// Actions\nimport { scratchpadWriteAction } from \"./actions/write\";\n\n// Providers\nimport { scratchpadProvider } from \"./providers/scratchpad\";\n\n/**\n * Scratchpad Plugin for ElizaOS\n *\n * Provides file-based memory storage that persists across sessions.\n * The agent can write, read, search, and manage scratchpad entries\n * which are stored as markdown files.\n *\n * Actions:\n * - SCRATCHPAD_WRITE: Create a new scratchpad entry\n * - SCRATCHPAD_READ: Read a specific entry by ID\n * - SCRATCHPAD_SEARCH: Search entries by content\n * - SCRATCHPAD_LIST: List all entries\n * - SCRATCHPAD_DELETE: Delete an entry\n * - SCRATCHPAD_APPEND: Append content to an existing entry\n *\n * Provider:\n * - scratchpad: Provides summary of entries to agent context\n */\nexport const scratchpadPlugin: Plugin = {\n name: \"scratchpad\",\n description:\n \"File-based memory storage for persistent notes and memories that can be written, read, searched, and managed across sessions.\",\n\n providers: [scratchpadProvider],\n\n actions: [\n scratchpadWriteAction,\n scratchpadReadAction,\n scratchpadSearchAction,\n scratchpadListAction,\n scratchpadDeleteAction,\n scratchpadAppendAction,\n ],\n\n async init(_config: Record<string, string>, _runtime: IAgentRuntime): Promise<void> {\n try {\n logger.info(\"[ScratchpadPlugin] Initializing...\");\n\n // The service will create the directory on first use\n logger.info(\"[ScratchpadPlugin] Initialized successfully\");\n } catch (error) {\n logger.error(\n \"[ScratchpadPlugin] Error initializing:\",\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n },\n};\n\nexport default scratchpadPlugin;\n\nexport { scratchpadAppendAction } from \"./actions/append\";\nexport { scratchpadDeleteAction } from \"./actions/delete\";\nexport { scratchpadListAction } from \"./actions/list\";\nexport { scratchpadReadAction } from \"./actions/read\";\nexport { scratchpadSearchAction } from \"./actions/search\";\n// Export actions\nexport { scratchpadWriteAction } from \"./actions/write\";\n// Export provider\nexport { scratchpadProvider } from \"./providers/scratchpad\";\n// Export service\nexport { createScratchpadService, ScratchpadService } from \"./services/scratchpadService\";\n// Export types\nexport type {\n ScratchpadConfig,\n ScratchpadEntry,\n ScratchpadReadOptions,\n ScratchpadSearchOptions,\n ScratchpadSearchResult,\n ScratchpadWriteOptions,\n} from \"./types\";\n",
6
+ "import {\n type Action,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/specs\";\nimport { createScratchpadService } from \"../services/scratchpadService\";\n\ninterface AppendInput {\n id: string;\n content: string;\n}\n\nfunction isValidAppendInput(obj: Record<string, unknown>): boolean {\n return (\n typeof obj.id === \"string\" &&\n obj.id.length > 0 &&\n typeof obj.content === \"string\" &&\n obj.content.length > 0\n );\n}\n\nconst EXTRACT_TEMPLATE = `Extract the scratchpad entry ID and content to append from the user's message.\n\nUser message: {{text}}\n\nAvailable scratchpad entries:\n{{entries}}\n\nRespond with XML containing:\n- id: The ID of the scratchpad entry to append to (required)\n- content: The new content to append (required)\n\n<response>\n<id>entry-id</id>\n<content>Content to append</content>\n</response>`;\n\nasync function extractAppendInfo(\n runtime: IAgentRuntime,\n message: Memory,\n availableEntries: string\n): Promise<AppendInput | null> {\n const prompt = EXTRACT_TEMPLATE.replace(\"{{text}}\", message.content.text ?? \"\").replace(\n \"{{entries}}\",\n availableEntries\n );\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n logger.debug(\"[ScratchpadAppend] Extract result:\", result);\n\n const parsed = parseKeyValueXml(String(result)) as Record<string, unknown> | null;\n\n if (!parsed || !isValidAppendInput(parsed)) {\n logger.error(\"[ScratchpadAppend] Failed to extract valid append info\");\n return null;\n }\n\n return {\n id: String(parsed.id),\n content: String(parsed.content),\n };\n}\n\nconst spec = requireActionSpec(\"SCRATCHPAD_APPEND\");\n\nexport const scratchpadAppendAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n\n validate: async (_runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _stateFromTrigger: State | undefined,\n _options: HandlerOptions | undefined,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ) => {\n const service = createScratchpadService(runtime);\n\n // Get list of available entries for context\n const entries = await service.list();\n const entriesContext = entries.map((e) => `- ${e.id}: \"${e.title}\"`).join(\"\\n\");\n\n if (entries.length === 0) {\n if (callback) {\n await callback({\n text: \"There are no scratchpad entries to append to. Create one first with SCRATCHPAD_WRITE.\",\n actions: [\"SCRATCHPAD_APPEND_EMPTY\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"No entries available\" };\n }\n\n const appendInfo = await extractAppendInfo(runtime, message, entriesContext);\n\n if (!appendInfo) {\n if (callback) {\n await callback({\n text: `I couldn't determine which note to update or what to add. Available entries:\\n${entriesContext}`,\n actions: [\"SCRATCHPAD_APPEND_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to extract append info\" };\n }\n\n try {\n // Check if entry exists\n const exists = await service.exists(appendInfo.id);\n if (!exists) {\n if (callback) {\n await callback({\n text: `Scratchpad entry \"${appendInfo.id}\" not found. Available entries:\\n${entriesContext}`,\n actions: [\"SCRATCHPAD_APPEND_NOT_FOUND\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Entry not found\" };\n }\n\n // Get existing entry to preserve title\n const existingEntry = await service.read(appendInfo.id);\n\n // Write with append option\n const entry = await service.write(existingEntry.title, appendInfo.content, {\n append: true,\n tags: existingEntry.tags,\n });\n\n const successMessage = `Successfully appended content to \"${entry.title}\" (${entry.id}).`;\n\n if (callback) {\n await callback({\n text: successMessage,\n actions: [\"SCRATCHPAD_APPEND_SUCCESS\"],\n source: message.content.source,\n });\n }\n\n return { success: true, text: successMessage, entry };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadAppend] Error:\", errorMsg);\n if (callback) {\n await callback({\n text: `Failed to append to the note: ${errorMsg}`,\n actions: [\"SCRATCHPAD_APPEND_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to append to scratchpad entry\" };\n }\n },\n\n examples: [],\n};\n\nexport default scratchpadAppendAction;\n",
7
+ "/**\n * Generated action specs for plugin-scratchpad\n */\n\nexport interface ActionSpec {\n name: string;\n description: string;\n similes?: string[];\n examples?: Array<Array<{ role: string; content: string }>>;\n}\n\nexport const actionSpecs: Record<string, ActionSpec> = {\n SCRATCHPAD_WRITE: {\n name: \"SCRATCHPAD_WRITE\",\n description:\n \"Write a new note or memory to the scratchpad. Use this to save information for later retrieval.\",\n similes: [\n \"SAVE_NOTE\",\n \"CREATE_NOTE\",\n \"WRITE_NOTE\",\n \"REMEMBER_THIS\",\n \"SAVE_MEMORY\",\n \"JOT_DOWN\",\n \"NOTE_THIS\",\n ],\n examples: [\n [\n {\n role: \"user\",\n content:\n \"Please save a note about the meeting tomorrow at 3pm with John about the marketing strategy.\",\n },\n {\n role: \"assistant\",\n content:\n \"I've saved a note about your meeting. Title: 'Meeting with John - Marketing Strategy'. You can retrieve it later.\",\n },\n ],\n [\n {\n role: \"user\",\n content: \"Remember that the API key for the service is stored in the .env file.\",\n },\n {\n role: \"assistant\",\n content:\n \"I've noted that the API key is stored in the .env file. I'll remember this for future reference.\",\n },\n ],\n ],\n },\n\n SCRATCHPAD_READ: {\n name: \"SCRATCHPAD_READ\",\n description:\n \"Read the content of a specific scratchpad entry. Use after searching to retrieve full details.\",\n similes: [\"GET_NOTE\", \"READ_NOTE\", \"RETRIEVE_NOTE\", \"GET_MEMORY\", \"FETCH_NOTE\", \"OPEN_NOTE\"],\n examples: [\n [\n {\n role: \"user\",\n content: \"Can you show me the note about the marketing meeting?\",\n },\n {\n role: \"assistant\",\n content:\n \"Here's the note 'Meeting with John - Marketing Strategy': Meeting scheduled for tomorrow at 3pm...\",\n },\n ],\n ],\n },\n\n SCRATCHPAD_SEARCH: {\n name: \"SCRATCHPAD_SEARCH\",\n description:\n \"Search through scratchpad entries for relevant information. Returns matching snippets with relevance scores.\",\n similes: [\n \"FIND_NOTE\",\n \"SEARCH_NOTES\",\n \"LOOKUP_MEMORY\",\n \"FIND_MEMORY\",\n \"SEARCH_MEMORY\",\n \"RECALL\",\n ],\n examples: [\n [\n {\n role: \"user\",\n content: \"What notes do I have about marketing?\",\n },\n {\n role: \"assistant\",\n content:\n \"I found 2 scratchpad entries mentioning marketing: 1) 'Meeting with John - Marketing Strategy' (score: 0.85)...\",\n },\n ],\n ],\n },\n\n SCRATCHPAD_LIST: {\n name: \"SCRATCHPAD_LIST\",\n description: \"List all scratchpad entries with their titles and modification dates.\",\n similes: [\"SHOW_NOTES\", \"LIST_NOTES\", \"ALL_NOTES\", \"MY_NOTES\", \"SHOW_MEMORIES\"],\n examples: [\n [\n {\n role: \"user\",\n content: \"Show me all my saved notes.\",\n },\n {\n role: \"assistant\",\n content:\n \"You have 5 scratchpad entries: 1) Meeting notes (modified today), 2) API documentation (modified yesterday)...\",\n },\n ],\n ],\n },\n\n SCRATCHPAD_DELETE: {\n name: \"SCRATCHPAD_DELETE\",\n description: \"Delete a scratchpad entry by its ID.\",\n similes: [\"REMOVE_NOTE\", \"DELETE_NOTE\", \"FORGET_NOTE\", \"ERASE_NOTE\", \"REMOVE_MEMORY\"],\n examples: [\n [\n {\n role: \"user\",\n content: \"Delete the note about the old meeting.\",\n },\n {\n role: \"assistant\",\n content: \"I've deleted the scratchpad entry 'old-meeting'. The note has been removed.\",\n },\n ],\n ],\n },\n\n SCRATCHPAD_APPEND: {\n name: \"SCRATCHPAD_APPEND\",\n description: \"Append additional content to an existing scratchpad entry.\",\n similes: [\"ADD_TO_NOTE\", \"UPDATE_NOTE\", \"APPEND_NOTE\", \"EXTEND_NOTE\", \"ADD_MORE\"],\n examples: [\n [\n {\n role: \"user\",\n content: \"Add to the meeting notes that we decided on a $50k budget.\",\n },\n {\n role: \"assistant\",\n content:\n \"I've appended the budget decision to the meeting notes. The note now includes the $50k budget information.\",\n },\n ],\n ],\n },\n};\n\nexport function requireActionSpec(name: string): ActionSpec {\n const spec = actionSpecs[name];\n if (!spec) {\n throw new Error(`Action spec not found: ${name}`);\n }\n return spec;\n}\n",
8
+ "import * as fs from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport type {\n ScratchpadConfig,\n ScratchpadEntry,\n ScratchpadReadOptions,\n ScratchpadSearchOptions,\n ScratchpadSearchResult,\n ScratchpadWriteOptions,\n} from \"../types\";\n\nconst DEFAULT_CONFIG: ScratchpadConfig = {\n basePath: path.join(os.homedir(), \".eliza\", \"scratchpad\"),\n maxFileSize: 1024 * 1024, // 1MB\n allowedExtensions: [\".md\", \".txt\"],\n};\n\n/**\n * Service for managing file-based scratchpad memories.\n * Provides write, read, search, list, and delete operations.\n */\nexport class ScratchpadService {\n private config: ScratchpadConfig;\n\n constructor(_runtime: IAgentRuntime, config?: Partial<ScratchpadConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Ensures the scratchpad directory exists\n */\n private async ensureDirectory(): Promise<void> {\n try {\n await fs.mkdir(this.config.basePath, { recursive: true });\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadService] Failed to create directory:\", errorMsg);\n throw error;\n }\n }\n\n /**\n * Generates a safe filename from a title\n */\n private sanitizeFilename(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .substring(0, 100);\n }\n\n /**\n * Gets the full path for a scratchpad entry\n */\n private getFilePath(id: string): string {\n const filename = id.endsWith(\".md\") ? id : `${id}.md`;\n return path.join(this.config.basePath, filename);\n }\n\n /**\n * Extracts entry ID from a filename\n */\n private getEntryId(filename: string): string {\n return path.basename(filename, path.extname(filename));\n }\n\n /**\n * Writes or appends content to a scratchpad entry\n */\n async write(\n title: string,\n content: string,\n options: ScratchpadWriteOptions = {}\n ): Promise<ScratchpadEntry> {\n await this.ensureDirectory();\n\n const id = this.sanitizeFilename(title);\n const filePath = this.getFilePath(id);\n const now = new Date();\n\n let finalContent: string;\n let createdAt = now;\n\n const exists = await this.exists(id);\n if (exists && options.append) {\n const existing = await this.read(id);\n finalContent = `${existing.content}\\n\\n---\\n\\n${content}`;\n createdAt = existing.createdAt;\n } else {\n // Create frontmatter with metadata\n const tagsLine = options.tags?.length ? `tags: [${options.tags.join(\", \")}]` : \"\";\n const frontmatter = [\n \"---\",\n `title: \"${title}\"`,\n `created: ${now.toISOString()}`,\n `modified: ${now.toISOString()}`,\n tagsLine,\n \"---\",\n \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n finalContent = `${frontmatter}\\n${content}`;\n }\n\n // Check file size\n if (Buffer.byteLength(finalContent, \"utf8\") > (this.config.maxFileSize ?? 1024 * 1024)) {\n throw new Error(`Content exceeds maximum file size of ${this.config.maxFileSize} bytes`);\n }\n\n await fs.writeFile(filePath, finalContent, \"utf8\");\n\n logger.info(`[ScratchpadService] Wrote entry: ${id}`);\n\n return {\n id,\n path: filePath,\n title,\n content: finalContent,\n createdAt,\n modifiedAt: now,\n tags: options.tags,\n };\n }\n\n /**\n * Reads a scratchpad entry by ID\n */\n async read(id: string, options: ScratchpadReadOptions = {}): Promise<ScratchpadEntry> {\n const filePath = this.getFilePath(id);\n\n try {\n const stat = await fs.stat(filePath);\n let content = await fs.readFile(filePath, \"utf8\");\n\n // Handle line range reading\n if (options.from !== undefined || options.lines !== undefined) {\n const lines = content.split(\"\\n\");\n const fromLine = Math.max(1, options.from ?? 1) - 1; // Convert to 0-indexed\n const numLines = options.lines ?? lines.length - fromLine;\n content = lines.slice(fromLine, fromLine + numLines).join(\"\\n\");\n }\n\n // Parse frontmatter for metadata\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n let title = id;\n let tags: string[] = [];\n let createdAt = stat.birthtime;\n\n if (frontmatterMatch) {\n const frontmatter = frontmatterMatch[1];\n const titleMatch = frontmatter.match(/title:\\s*\"?([^\"\\n]+)\"?/);\n const tagsMatch = frontmatter.match(/tags:\\s*\\[([^\\]]+)\\]/);\n const createdMatch = frontmatter.match(/created:\\s*(.+)/);\n\n if (titleMatch) title = titleMatch[1];\n if (tagsMatch) tags = tagsMatch[1].split(\",\").map((t) => t.trim());\n if (createdMatch) createdAt = new Date(createdMatch[1]);\n }\n\n return {\n id,\n path: filePath,\n title,\n content,\n createdAt,\n modifiedAt: stat.mtime,\n tags,\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Scratchpad entry not found: ${id}`);\n }\n throw error;\n }\n }\n\n /**\n * Checks if a scratchpad entry exists\n */\n async exists(id: string): Promise<boolean> {\n const filePath = this.getFilePath(id);\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Lists all scratchpad entries\n */\n async list(): Promise<ScratchpadEntry[]> {\n await this.ensureDirectory();\n\n try {\n const files = await fs.readdir(this.config.basePath);\n const entries: ScratchpadEntry[] = [];\n\n for (const file of files) {\n const ext = path.extname(file);\n if (!this.config.allowedExtensions?.includes(ext)) continue;\n\n try {\n const id = this.getEntryId(file);\n const entry = await this.read(id);\n entries.push(entry);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.warn(`[ScratchpadService] Failed to read entry ${file}:`, errorMsg);\n }\n }\n\n // Sort by modified date, most recent first\n return entries.sort((a, b) => b.modifiedAt.getTime() - a.modifiedAt.getTime());\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadService] Failed to list entries:\", errorMsg);\n return [];\n }\n }\n\n /**\n * Searches scratchpad entries using text matching\n */\n async search(\n query: string,\n options: ScratchpadSearchOptions = {}\n ): Promise<ScratchpadSearchResult[]> {\n const entries = await this.list();\n const results: ScratchpadSearchResult[] = [];\n\n const maxResults = options.maxResults ?? 10;\n const minScore = options.minScore ?? 0.1;\n\n // Tokenize and lowercase the query\n const queryTerms = query\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n\n for (const entry of entries) {\n const lines = entry.content.split(\"\\n\");\n const contentLower = entry.content.toLowerCase();\n\n // Calculate relevance score based on term frequency\n let matchCount = 0;\n for (const term of queryTerms) {\n const regex = new RegExp(term, \"gi\");\n const matches = contentLower.match(regex);\n if (matches) matchCount += matches.length;\n }\n\n if (matchCount === 0) continue;\n\n // Calculate score (simple TF-based scoring)\n const score = Math.min(1, matchCount / (queryTerms.length * 3));\n if (score < minScore) continue;\n\n // Find the best matching snippet\n let bestSnippetStart = 0;\n let bestSnippetEnd = Math.min(lines.length, 5);\n\n for (let i = 0; i < lines.length; i++) {\n const lineLower = lines[i].toLowerCase();\n for (const term of queryTerms) {\n if (lineLower.includes(term)) {\n bestSnippetStart = Math.max(0, i - 2);\n bestSnippetEnd = Math.min(lines.length, i + 3);\n break;\n }\n }\n }\n\n const snippet = lines.slice(bestSnippetStart, bestSnippetEnd).join(\"\\n\");\n\n results.push({\n path: entry.path,\n startLine: bestSnippetStart + 1,\n endLine: bestSnippetEnd,\n score,\n snippet,\n entryId: entry.id,\n });\n }\n\n // Sort by score descending and limit results\n return results.sort((a, b) => b.score - a.score).slice(0, maxResults);\n }\n\n /**\n * Deletes a scratchpad entry\n */\n async delete(id: string): Promise<boolean> {\n const filePath = this.getFilePath(id);\n\n try {\n await fs.unlink(filePath);\n logger.info(`[ScratchpadService] Deleted entry: ${id}`);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * Gets a summary of all scratchpad content\n */\n async getSummary(): Promise<string> {\n const entries = await this.list();\n\n if (entries.length === 0) {\n return \"No scratchpad entries found.\";\n }\n\n const summaryParts = [`**Scratchpad Summary** (${entries.length} entries)`, \"\"];\n\n for (const entry of entries.slice(0, 10)) {\n const preview = entry.content\n .replace(/^---[\\s\\S]*?---\\n*/m, \"\") // Remove frontmatter\n .substring(0, 100)\n .replace(/\\n/g, \" \")\n .trim();\n\n summaryParts.push(`- **${entry.title}** (${entry.id})`);\n summaryParts.push(` ${preview}${preview.length >= 100 ? \"...\" : \"\"}`);\n summaryParts.push(` _Modified: ${entry.modifiedAt.toLocaleDateString()}_`);\n }\n\n if (entries.length > 10) {\n summaryParts.push(`\\n_...and ${entries.length - 10} more entries_`);\n }\n\n return summaryParts.join(\"\\n\");\n }\n\n /**\n * Gets the base path for scratchpad files\n */\n getBasePath(): string {\n return this.config.basePath;\n }\n}\n\n/**\n * Factory function to create a ScratchpadService instance\n */\nexport function createScratchpadService(\n runtime: IAgentRuntime,\n config?: Partial<ScratchpadConfig>\n): ScratchpadService {\n return new ScratchpadService(runtime, config);\n}\n",
9
+ "import {\n type Action,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/specs\";\nimport { createScratchpadService } from \"../services/scratchpadService\";\n\ninterface DeleteInput {\n id: string;\n}\n\nfunction isValidDeleteInput(obj: Record<string, unknown>): boolean {\n return typeof obj.id === \"string\" && obj.id.length > 0;\n}\n\nconst EXTRACT_TEMPLATE = `Extract the scratchpad entry ID to delete from the user's message.\n\nUser message: {{text}}\n\nAvailable scratchpad entries:\n{{entries}}\n\nRespond with XML containing:\n- id: The ID of the scratchpad entry to delete (required)\n\n<response>\n<id>entry-id</id>\n</response>`;\n\nasync function extractDeleteInfo(\n runtime: IAgentRuntime,\n message: Memory,\n availableEntries: string\n): Promise<DeleteInput | null> {\n const prompt = EXTRACT_TEMPLATE.replace(\"{{text}}\", message.content.text ?? \"\").replace(\n \"{{entries}}\",\n availableEntries\n );\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n logger.debug(\"[ScratchpadDelete] Extract result:\", result);\n\n const parsed = parseKeyValueXml(String(result)) as Record<string, unknown> | null;\n\n if (!parsed || !isValidDeleteInput(parsed)) {\n logger.error(\"[ScratchpadDelete] Failed to extract valid delete info\");\n return null;\n }\n\n return {\n id: String(parsed.id),\n };\n}\n\nconst spec = requireActionSpec(\"SCRATCHPAD_DELETE\");\n\nexport const scratchpadDeleteAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n\n validate: async (_runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _stateFromTrigger: State | undefined,\n _options: HandlerOptions | undefined,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ) => {\n const service = createScratchpadService(runtime);\n\n // Get list of available entries for context\n const entries = await service.list();\n const entriesContext = entries.map((e) => `- ${e.id}: \"${e.title}\"`).join(\"\\n\");\n\n if (entries.length === 0) {\n if (callback) {\n await callback({\n text: \"There are no scratchpad entries to delete.\",\n actions: [\"SCRATCHPAD_DELETE_EMPTY\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"No entries available\" };\n }\n\n const deleteInfo = await extractDeleteInfo(runtime, message, entriesContext);\n\n if (!deleteInfo) {\n if (callback) {\n await callback({\n text: `I couldn't determine which note to delete. Available entries:\\n${entriesContext}`,\n actions: [\"SCRATCHPAD_DELETE_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to extract delete info\" };\n }\n\n try {\n const deleted = await service.delete(deleteInfo.id);\n\n if (!deleted) {\n if (callback) {\n await callback({\n text: `Scratchpad entry \"${deleteInfo.id}\" not found.`,\n actions: [\"SCRATCHPAD_DELETE_NOT_FOUND\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Entry not found\" };\n }\n\n const successMessage = `Successfully deleted scratchpad entry \"${deleteInfo.id}\".`;\n\n if (callback) {\n await callback({\n text: successMessage,\n actions: [\"SCRATCHPAD_DELETE_SUCCESS\"],\n source: message.content.source,\n });\n }\n\n return { success: true, text: successMessage };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadDelete] Error:\", errorMsg);\n if (callback) {\n await callback({\n text: `Failed to delete the note: ${errorMsg}`,\n actions: [\"SCRATCHPAD_DELETE_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to delete scratchpad entry\" };\n }\n },\n\n examples: [],\n};\n\nexport default scratchpadDeleteAction;\n",
10
+ "import {\n type Action,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/specs\";\nimport { createScratchpadService } from \"../services/scratchpadService\";\n\nconst spec = requireActionSpec(\"SCRATCHPAD_LIST\");\n\nexport const scratchpadListAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n\n validate: async (_runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _stateFromTrigger: State | undefined,\n _options: HandlerOptions | undefined,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ) => {\n try {\n const service = createScratchpadService(runtime);\n const entries = await service.list();\n\n if (entries.length === 0) {\n if (callback) {\n await callback({\n text: \"You don't have any scratchpad entries yet. Use SCRATCHPAD_WRITE to create one.\",\n actions: [\"SCRATCHPAD_LIST_EMPTY\"],\n source: message.content.source,\n });\n }\n return { success: true, text: \"No entries\", entries: [] };\n }\n\n const listText = entries\n .map((e, i) => {\n const tagsStr = e.tags?.length ? ` [${e.tags.join(\", \")}]` : \"\";\n return `${i + 1}. **${e.title}** (${e.id})${tagsStr}\\n _Modified: ${e.modifiedAt.toLocaleDateString()}_`;\n })\n .join(\"\\n\");\n\n const successMessage = `**Your Scratchpad Entries** (${entries.length} total):\\n\\n${listText}`;\n\n if (callback) {\n await callback({\n text: successMessage,\n actions: [\"SCRATCHPAD_LIST_SUCCESS\"],\n source: message.content.source,\n });\n }\n\n return { success: true, text: successMessage, entries };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadList] Error:\", errorMsg);\n if (callback) {\n await callback({\n text: `Failed to list scratchpad entries: ${errorMsg}`,\n actions: [\"SCRATCHPAD_LIST_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to list scratchpad entries\" };\n }\n },\n\n examples: [],\n};\n\nexport default scratchpadListAction;\n",
11
+ "import {\n type Action,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/specs\";\nimport { createScratchpadService } from \"../services/scratchpadService\";\n\ninterface ReadInput {\n id: string;\n from?: number;\n lines?: number;\n}\n\nfunction isValidReadInput(obj: Record<string, unknown>): boolean {\n return typeof obj.id === \"string\" && obj.id.length > 0;\n}\n\nconst EXTRACT_TEMPLATE = `Extract the scratchpad entry ID and optional line range from the user's message.\n\nUser message: {{text}}\n\nAvailable scratchpad entries:\n{{entries}}\n\nRespond with XML containing:\n- id: The ID of the scratchpad entry to read (required)\n- from: Starting line number (optional)\n- lines: Number of lines to read (optional)\n\n<response>\n<id>entry-id</id>\n<from>1</from>\n<lines>10</lines>\n</response>`;\n\nasync function extractReadInfo(\n runtime: IAgentRuntime,\n message: Memory,\n availableEntries: string\n): Promise<ReadInput | null> {\n const prompt = EXTRACT_TEMPLATE.replace(\"{{text}}\", message.content.text ?? \"\").replace(\n \"{{entries}}\",\n availableEntries\n );\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n logger.debug(\"[ScratchpadRead] Extract result:\", result);\n\n const parsed = parseKeyValueXml(String(result)) as Record<string, unknown> | null;\n\n if (!parsed || !isValidReadInput(parsed)) {\n logger.error(\"[ScratchpadRead] Failed to extract valid read info\");\n return null;\n }\n\n return {\n id: String(parsed.id),\n from: parsed.from ? Number(parsed.from) : undefined,\n lines: parsed.lines ? Number(parsed.lines) : undefined,\n };\n}\n\nconst spec = requireActionSpec(\"SCRATCHPAD_READ\");\n\nexport const scratchpadReadAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n\n validate: async (_runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _stateFromTrigger: State | undefined,\n _options: HandlerOptions | undefined,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ) => {\n const service = createScratchpadService(runtime);\n\n // Get list of available entries for context\n const entries = await service.list();\n const entriesContext = entries.map((e) => `- ${e.id}: \"${e.title}\"`).join(\"\\n\");\n\n if (entries.length === 0) {\n if (callback) {\n await callback({\n text: \"There are no scratchpad entries to read. You can create one first.\",\n actions: [\"SCRATCHPAD_READ_EMPTY\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"No entries available\" };\n }\n\n const readInfo = await extractReadInfo(runtime, message, entriesContext);\n\n if (!readInfo) {\n if (callback) {\n await callback({\n text: `I couldn't determine which note to read. Available entries:\\n${entriesContext}`,\n actions: [\"SCRATCHPAD_READ_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to extract read info\" };\n }\n\n try {\n const entry = await service.read(readInfo.id, {\n from: readInfo.from,\n lines: readInfo.lines,\n });\n\n const lineInfo =\n readInfo.from !== undefined\n ? ` (lines ${readInfo.from}-${(readInfo.from ?? 1) + (readInfo.lines ?? 10)})`\n : \"\";\n\n const successMessage = `**${entry.title}**${lineInfo}\\n\\n${entry.content}`;\n\n if (callback) {\n await callback({\n text: successMessage,\n actions: [\"SCRATCHPAD_READ_SUCCESS\"],\n source: message.content.source,\n });\n }\n\n return { success: true, text: successMessage, entry };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadRead] Error:\", errorMsg);\n if (callback) {\n await callback({\n text: `Failed to read the note: ${errorMsg}`,\n actions: [\"SCRATCHPAD_READ_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to read scratchpad entry\" };\n }\n },\n\n examples: [],\n};\n\nexport default scratchpadReadAction;\n",
12
+ "import {\n type Action,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/specs\";\nimport { createScratchpadService } from \"../services/scratchpadService\";\n\ninterface SearchInput {\n query: string;\n maxResults?: number;\n}\n\nfunction isValidSearchInput(obj: Record<string, unknown>): boolean {\n return typeof obj.query === \"string\" && obj.query.length > 0;\n}\n\nconst EXTRACT_TEMPLATE = `Extract the search query from the user's message.\n\nUser message: {{text}}\n\nRespond with XML containing:\n- query: The search terms to find in scratchpad entries (required)\n- maxResults: Maximum number of results to return (optional, default 5)\n\n<response>\n<query>search terms</query>\n<maxResults>5</maxResults>\n</response>`;\n\nasync function extractSearchInfo(\n runtime: IAgentRuntime,\n message: Memory\n): Promise<SearchInput | null> {\n const prompt = EXTRACT_TEMPLATE.replace(\"{{text}}\", message.content.text ?? \"\");\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n logger.debug(\"[ScratchpadSearch] Extract result:\", result);\n\n const parsed = parseKeyValueXml(String(result)) as Record<string, unknown> | null;\n\n if (!parsed || !isValidSearchInput(parsed)) {\n logger.error(\"[ScratchpadSearch] Failed to extract valid search info\");\n return null;\n }\n\n return {\n query: String(parsed.query),\n maxResults: parsed.maxResults ? Number(parsed.maxResults) : 5,\n };\n}\n\nconst spec = requireActionSpec(\"SCRATCHPAD_SEARCH\");\n\nexport const scratchpadSearchAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n\n validate: async (_runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _stateFromTrigger: State | undefined,\n _options: HandlerOptions | undefined,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ) => {\n const searchInfo = await extractSearchInfo(runtime, message);\n\n if (!searchInfo) {\n if (callback) {\n await callback({\n text: \"I couldn't understand what you're searching for. Please provide search terms.\",\n actions: [\"SCRATCHPAD_SEARCH_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to extract search info\" };\n }\n\n try {\n const service = createScratchpadService(runtime);\n const results = await service.search(searchInfo.query, {\n maxResults: searchInfo.maxResults,\n });\n\n if (results.length === 0) {\n if (callback) {\n await callback({\n text: `No scratchpad entries found matching \"${searchInfo.query}\".`,\n actions: [\"SCRATCHPAD_SEARCH_EMPTY\"],\n source: message.content.source,\n });\n }\n return { success: true, text: \"No results found\", results: [] };\n }\n\n const resultText = results\n .map((r, i) => {\n const scorePercent = Math.round(r.score * 100);\n return `**${i + 1}. ${r.entryId}** (${scorePercent}% match, lines ${r.startLine}-${r.endLine})\\n\\`\\`\\`\\n${r.snippet.substring(0, 200)}${r.snippet.length > 200 ? \"...\" : \"\"}\\n\\`\\`\\``;\n })\n .join(\"\\n\\n\");\n\n const successMessage = `Found ${results.length} matching scratchpad entries for \"${searchInfo.query}\":\\n\\n${resultText}\\n\\nUse SCRATCHPAD_READ with an entry ID to view the full content.`;\n\n if (callback) {\n await callback({\n text: successMessage,\n actions: [\"SCRATCHPAD_SEARCH_SUCCESS\"],\n source: message.content.source,\n });\n }\n\n return { success: true, text: successMessage, results };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadSearch] Error:\", errorMsg);\n if (callback) {\n await callback({\n text: `Failed to search scratchpad: ${errorMsg}`,\n actions: [\"SCRATCHPAD_SEARCH_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to search scratchpad\" };\n }\n },\n\n examples: [],\n};\n\nexport default scratchpadSearchAction;\n",
13
+ "import {\n type Action,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseKeyValueXml,\n type State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/specs\";\nimport { createScratchpadService } from \"../services/scratchpadService\";\n\ninterface WriteInput {\n title: string;\n content: string;\n tags?: string[];\n}\n\nfunction isValidWriteInput(obj: Record<string, unknown>): boolean {\n return (\n typeof obj.title === \"string\" &&\n obj.title.length > 0 &&\n typeof obj.content === \"string\" &&\n obj.content.length > 0\n );\n}\n\nconst EXTRACT_TEMPLATE = `Extract the following information from the user's message to save to the scratchpad:\n\nUser message: {{text}}\n\nRecent conversation:\n{{messageHistory}}\n\nRespond with XML containing:\n- title: A short, descriptive title for the note (required)\n- content: The main content to save (required)\n- tags: Comma-separated tags for categorization (optional)\n\n<response>\n<title>The note title</title>\n<content>The content to save</content>\n<tags>tag1, tag2</tags>\n</response>`;\n\nasync function extractWriteInfo(\n runtime: IAgentRuntime,\n message: Memory,\n _state: State\n): Promise<WriteInput | null> {\n const prompt = EXTRACT_TEMPLATE.replace(\"{{text}}\", message.content.text ?? \"\").replace(\n \"{{messageHistory}}\",\n \"\"\n );\n\n const result = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n stopSequences: [],\n });\n\n logger.debug(\"[ScratchpadWrite] Extract result:\", result);\n\n const parsed = parseKeyValueXml(String(result)) as Record<string, unknown> | null;\n\n if (!parsed || !isValidWriteInput(parsed)) {\n logger.error(\"[ScratchpadWrite] Failed to extract valid write info\");\n return null;\n }\n\n const tags = parsed.tags\n ? String(parsed.tags)\n .split(\",\")\n .map((t: string) => t.trim())\n .filter(Boolean)\n : undefined;\n\n return {\n title: String(parsed.title),\n content: String(parsed.content),\n tags,\n };\n}\n\nconst spec = requireActionSpec(\"SCRATCHPAD_WRITE\");\n\nexport const scratchpadWriteAction: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n\n validate: async (_runtime: IAgentRuntime, _message: Memory): Promise<boolean> => {\n return true;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n stateFromTrigger: State | undefined,\n _options: HandlerOptions | undefined,\n callback?: HandlerCallback,\n _responses?: Memory[]\n ) => {\n const state = stateFromTrigger ?? (await runtime.composeState(message, []));\n const writeInfo = await extractWriteInfo(runtime, message, state);\n\n if (!writeInfo) {\n if (callback) {\n await callback({\n text: \"I couldn't understand what you want me to save. Please provide a clear title and content for the note.\",\n actions: [\"SCRATCHPAD_WRITE_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to extract write info\" };\n }\n\n try {\n const service = createScratchpadService(runtime);\n const entry = await service.write(writeInfo.title, writeInfo.content, {\n tags: writeInfo.tags,\n });\n\n const successMessage = `I've saved a note titled \"${entry.title}\" (ID: ${entry.id}).${\n entry.tags?.length ? ` Tags: ${entry.tags.join(\", \")}` : \"\"\n } You can retrieve it later using the ID or by searching for it.`;\n\n if (callback) {\n await callback({\n text: successMessage,\n actions: [\"SCRATCHPAD_WRITE_SUCCESS\"],\n source: message.content.source,\n });\n }\n\n return { success: true, text: successMessage, entryId: entry.id };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadWrite] Error:\", errorMsg);\n if (callback) {\n await callback({\n text: `Failed to save the note: ${errorMsg}`,\n actions: [\"SCRATCHPAD_WRITE_FAILED\"],\n source: message.content.source,\n });\n }\n return { success: false, text: \"Failed to write to scratchpad\" };\n }\n },\n\n examples: [],\n};\n\nexport default scratchpadWriteAction;\n",
14
+ "import {\n type IAgentRuntime,\n logger,\n type Memory,\n type Provider,\n type ProviderResult,\n type State,\n} from \"@elizaos/core\";\nimport { createScratchpadService } from \"../services/scratchpadService\";\n\n/**\n * Provider that exposes scratchpad state to the agent's context.\n * This allows the agent to be aware of saved notes and memories.\n */\nexport const scratchpadProvider: Provider = {\n name: \"scratchpad\",\n description:\n \"Provides information about the user's scratchpad entries - file-based notes and memories that persist across sessions.\",\n\n get: async (runtime: IAgentRuntime, _message: Memory, _state: State): Promise<ProviderResult> => {\n try {\n const service = createScratchpadService(runtime);\n const entries = await service.list();\n\n if (entries.length === 0) {\n return {\n text: \"No scratchpad entries available.\",\n data: { entries: [], count: 0 },\n values: { scratchpadCount: 0 },\n };\n }\n\n // Build summary text\n const summaryLines = [`**Scratchpad** (${entries.length} entries available):`, \"\"];\n\n // Show up to 5 most recent entries with previews\n const recentEntries = entries.slice(0, 5);\n for (const entry of recentEntries) {\n // Get content preview (strip frontmatter, limit length)\n const contentWithoutFrontmatter = entry.content.replace(/^---[\\s\\S]*?---\\n*/m, \"\").trim();\n const preview = contentWithoutFrontmatter.substring(0, 80).replace(/\\n/g, \" \");\n\n const tagsStr = entry.tags?.length ? ` [${entry.tags.join(\", \")}]` : \"\";\n\n summaryLines.push(`- **${entry.title}** (${entry.id})${tagsStr}`);\n summaryLines.push(` ${preview}${contentWithoutFrontmatter.length > 80 ? \"...\" : \"\"}`);\n }\n\n if (entries.length > 5) {\n summaryLines.push(`\\n_...and ${entries.length - 5} more entries_`);\n }\n\n summaryLines.push(\n \"\\n_Use SCRATCHPAD_SEARCH to find specific entries or SCRATCHPAD_READ to view full content._\"\n );\n\n // Build data payload\n const entryData = entries.map((e) => ({\n id: e.id,\n title: e.title,\n modifiedAt: e.modifiedAt.toISOString(),\n tags: e.tags ?? [],\n }));\n\n return {\n text: summaryLines.join(\"\\n\"),\n data: {\n entries: entryData,\n count: entries.length,\n basePath: service.getBasePath(),\n },\n values: {\n scratchpadCount: entries.length,\n scratchpadEntryIds: entries.map((e) => e.id).join(\", \"),\n },\n };\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(\"[ScratchpadProvider] Error:\", errorMsg);\n return {\n text: \"Scratchpad service unavailable.\",\n data: { error: errorMsg },\n values: { scratchpadCount: 0 },\n };\n }\n },\n};\n\nexport default scratchpadProvider;\n"
15
+ ],
16
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAC2C,IAA3C;;;ACSO,IAVP;;;ACWO,IAAM,cAA0C;AAAA,EACrD,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,aACE;AAAA,IACF,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,aACE;AAAA,IACF,SAAS,CAAC,YAAY,aAAa,iBAAiB,cAAc,cAAc,WAAW;AAAA,IAC3F,UAAU;AAAA,MACR;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,aACE;AAAA,IACF,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,cAAc,cAAc,aAAa,YAAY,eAAe;AAAA,IAC9E,UAAU;AAAA,MACR;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,eAAe,eAAe,eAAe,cAAc,eAAe;AAAA,IACpF,UAAU;AAAA,MACR;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,CAAC,eAAe,eAAe,eAAe,eAAe,UAAU;AAAA,IAChF,UAAU;AAAA,MACR;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,CAAC,MAA0B;AAAA,EAC1D,MAAM,OAAO,YAAY;AAAA,EACzB,IAAI,CAAC,MAAM;AAAA,IACT,MAAM,IAAI,MAAM,0BAA0B,MAAM;AAAA,EAClD;AAAA,EACA,OAAO;AAAA;;;ACjKW,IAApB;AACoB,IAApB;AACsB,IAAtB;AAEuB,IAAvB;AAUA,IAAM,iBAAmC;AAAA,EACvC,UAAe,UAAQ,WAAQ,GAAG,UAAU,YAAY;AAAA,EACxD,aAAa,OAAO;AAAA,EACpB,mBAAmB,CAAC,OAAO,MAAM;AACnC;AAAA;AAMO,MAAM,kBAAkB;AAAA,EACrB;AAAA,EAER,WAAW,CAAC,UAAyB,QAAoC;AAAA,IACvE,KAAK,SAAS,KAAK,mBAAmB,OAAO;AAAA;AAAA,OAMjC,gBAAe,GAAkB;AAAA,IAC7C,IAAI;AAAA,MACF,MAAS,SAAM,KAAK,OAAO,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MACxD,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,mBAAO,MAAM,mDAAmD,QAAQ;AAAA,MACxE,MAAM;AAAA;AAAA;AAAA,EAOF,gBAAgB,CAAC,OAAuB;AAAA,IAC9C,OAAO,MACJ,YAAY,EACZ,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG,EAClB,UAAU,GAAG,GAAG;AAAA;AAAA,EAMb,WAAW,CAAC,IAAoB;AAAA,IACtC,MAAM,WAAW,GAAG,SAAS,KAAK,IAAI,KAAK,GAAG;AAAA,IAC9C,OAAY,UAAK,KAAK,OAAO,UAAU,QAAQ;AAAA;AAAA,EAMzC,UAAU,CAAC,UAA0B;AAAA,IAC3C,OAAY,cAAS,UAAe,aAAQ,QAAQ,CAAC;AAAA;AAAA,OAMjD,MAAK,CACT,OACA,SACA,UAAkC,CAAC,GACT;AAAA,IAC1B,MAAM,KAAK,gBAAgB;AAAA,IAE3B,MAAM,KAAK,KAAK,iBAAiB,KAAK;AAAA,IACtC,MAAM,WAAW,KAAK,YAAY,EAAE;AAAA,IACpC,MAAM,MAAM,IAAI;AAAA,IAEhB,IAAI;AAAA,IACJ,IAAI,YAAY;AAAA,IAEhB,MAAM,SAAS,MAAM,KAAK,OAAO,EAAE;AAAA,IACnC,IAAI,UAAU,QAAQ,QAAQ;AAAA,MAC5B,MAAM,WAAW,MAAM,KAAK,KAAK,EAAE;AAAA,MACnC,eAAe,GAAG,SAAS;AAAA;AAAA;AAAA;AAAA,EAAqB;AAAA,MAChD,YAAY,SAAS;AAAA,IACvB,EAAO;AAAA,MAEL,MAAM,WAAW,QAAQ,MAAM,SAAS,UAAU,QAAQ,KAAK,KAAK,IAAI,OAAO;AAAA,MAC/E,MAAM,cAAc;AAAA,QAClB;AAAA,QACA,WAAW;AAAA,QACX,YAAY,IAAI,YAAY;AAAA,QAC5B,aAAa,IAAI,YAAY;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK;AAAA,CAAI;AAAA,MAEZ,eAAe,GAAG;AAAA,EAAgB;AAAA;AAAA,IAIpC,IAAI,OAAO,WAAW,cAAc,MAAM,KAAK,KAAK,OAAO,eAAe,OAAO,OAAO;AAAA,MACtF,MAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO,mBAAmB;AAAA,IACzF;AAAA,IAEA,MAAS,aAAU,UAAU,cAAc,MAAM;AAAA,IAEjD,mBAAO,KAAK,oCAAoC,IAAI;AAAA,IAEpD,OAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,YAAY;AAAA,MACZ,MAAM,QAAQ;AAAA,IAChB;AAAA;AAAA,OAMI,KAAI,CAAC,IAAY,UAAiC,CAAC,GAA6B;AAAA,IACpF,MAAM,WAAW,KAAK,YAAY,EAAE;AAAA,IAEpC,IAAI;AAAA,MACF,MAAM,QAAO,MAAS,QAAK,QAAQ;AAAA,MACnC,IAAI,UAAU,MAAS,YAAS,UAAU,MAAM;AAAA,MAGhD,IAAI,QAAQ,SAAS,aAAa,QAAQ,UAAU,WAAW;AAAA,QAC7D,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,QAChC,MAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,QAAQ,CAAC,IAAI;AAAA,QAClD,MAAM,WAAW,QAAQ,SAAS,MAAM,SAAS;AAAA,QACjD,UAAU,MAAM,MAAM,UAAU,WAAW,QAAQ,EAAE,KAAK;AAAA,CAAI;AAAA,MAChE;AAAA,MAGA,MAAM,mBAAmB,QAAQ,MAAM,uBAAuB;AAAA,MAC9D,IAAI,QAAQ;AAAA,MACZ,IAAI,OAAiB,CAAC;AAAA,MACtB,IAAI,YAAY,MAAK;AAAA,MAErB,IAAI,kBAAkB;AAAA,QACpB,MAAM,cAAc,iBAAiB;AAAA,QACrC,MAAM,aAAa,YAAY,MAAM,wBAAwB;AAAA,QAC7D,MAAM,YAAY,YAAY,MAAM,sBAAsB;AAAA,QAC1D,MAAM,eAAe,YAAY,MAAM,iBAAiB;AAAA,QAExD,IAAI;AAAA,UAAY,QAAQ,WAAW;AAAA,QACnC,IAAI;AAAA,UAAW,OAAO,UAAU,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,QACjE,IAAI;AAAA,UAAc,YAAY,IAAI,KAAK,aAAa,EAAE;AAAA,MACxD;AAAA,MAEA,OAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,MAAK;AAAA,QACjB;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,IAAK,MAAgC,SAAS,UAAU;AAAA,QACtD,MAAM,IAAI,MAAM,+BAA+B,IAAI;AAAA,MACrD;AAAA,MACA,MAAM;AAAA;AAAA;AAAA,OAOJ,OAAM,CAAC,IAA8B;AAAA,IACzC,MAAM,WAAW,KAAK,YAAY,EAAE;AAAA,IACpC,IAAI;AAAA,MACF,MAAS,UAAO,QAAQ;AAAA,MACxB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAOL,KAAI,GAA+B;AAAA,IACvC,MAAM,KAAK,gBAAgB;AAAA,IAE3B,IAAI;AAAA,MACF,MAAM,QAAQ,MAAS,WAAQ,KAAK,OAAO,QAAQ;AAAA,MACnD,MAAM,UAA6B,CAAC;AAAA,MAEpC,WAAW,QAAQ,OAAO;AAAA,QACxB,MAAM,MAAW,aAAQ,IAAI;AAAA,QAC7B,IAAI,CAAC,KAAK,OAAO,mBAAmB,SAAS,GAAG;AAAA,UAAG;AAAA,QAEnD,IAAI;AAAA,UACF,MAAM,KAAK,KAAK,WAAW,IAAI;AAAA,UAC/B,MAAM,QAAQ,MAAM,KAAK,KAAK,EAAE;AAAA,UAChC,QAAQ,KAAK,KAAK;AAAA,UAClB,OAAO,OAAO;AAAA,UACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UACtE,mBAAO,KAAK,4CAA4C,SAAS,QAAQ;AAAA;AAAA,MAE7E;AAAA,MAGA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,QAAQ,IAAI,EAAE,WAAW,QAAQ,CAAC;AAAA,MAC7E,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,mBAAO,MAAM,+CAA+C,QAAQ;AAAA,MACpE,OAAO,CAAC;AAAA;AAAA;AAAA,OAON,OAAM,CACV,OACA,UAAmC,CAAC,GACD;AAAA,IACnC,MAAM,UAAU,MAAM,KAAK,KAAK;AAAA,IAChC,MAAM,UAAoC,CAAC;AAAA,IAE3C,MAAM,aAAa,QAAQ,cAAc;AAAA,IACzC,MAAM,WAAW,QAAQ,YAAY;AAAA,IAGrC,MAAM,aAAa,MAChB,YAAY,EACZ,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAE7B,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,CAAI;AAAA,MACtC,MAAM,eAAe,MAAM,QAAQ,YAAY;AAAA,MAG/C,IAAI,aAAa;AAAA,MACjB,WAAW,QAAQ,YAAY;AAAA,QAC7B,MAAM,QAAQ,IAAI,OAAO,MAAM,IAAI;AAAA,QACnC,MAAM,UAAU,aAAa,MAAM,KAAK;AAAA,QACxC,IAAI;AAAA,UAAS,cAAc,QAAQ;AAAA,MACrC;AAAA,MAEA,IAAI,eAAe;AAAA,QAAG;AAAA,MAGtB,MAAM,QAAQ,KAAK,IAAI,GAAG,cAAc,WAAW,SAAS,EAAE;AAAA,MAC9D,IAAI,QAAQ;AAAA,QAAU;AAAA,MAGtB,IAAI,mBAAmB;AAAA,MACvB,IAAI,iBAAiB,KAAK,IAAI,MAAM,QAAQ,CAAC;AAAA,MAE7C,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,QACrC,MAAM,YAAY,MAAM,GAAG,YAAY;AAAA,QACvC,WAAW,QAAQ,YAAY;AAAA,UAC7B,IAAI,UAAU,SAAS,IAAI,GAAG;AAAA,YAC5B,mBAAmB,KAAK,IAAI,GAAG,IAAI,CAAC;AAAA,YACpC,iBAAiB,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,UAAU,MAAM,MAAM,kBAAkB,cAAc,EAAE,KAAK;AAAA,CAAI;AAAA,MAEvE,QAAQ,KAAK;AAAA,QACX,MAAM,MAAM;AAAA,QACZ,WAAW,mBAAmB;AAAA,QAC9B,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,IAGA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU;AAAA;AAAA,OAMhE,OAAM,CAAC,IAA8B;AAAA,IACzC,MAAM,WAAW,KAAK,YAAY,EAAE;AAAA,IAEpC,IAAI;AAAA,MACF,MAAS,UAAO,QAAQ;AAAA,MACxB,mBAAO,KAAK,sCAAsC,IAAI;AAAA,MACtD,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,IAAK,MAAgC,SAAS,UAAU;AAAA,QACtD,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA;AAAA;AAAA,OAOJ,WAAU,GAAoB;AAAA,IAClC,MAAM,UAAU,MAAM,KAAK,KAAK;AAAA,IAEhC,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,eAAe,CAAC,2BAA2B,QAAQ,mBAAmB,EAAE;AAAA,IAE9E,WAAW,SAAS,QAAQ,MAAM,GAAG,EAAE,GAAG;AAAA,MACxC,MAAM,UAAU,MAAM,QACnB,QAAQ,uBAAuB,EAAE,EACjC,UAAU,GAAG,GAAG,EAChB,QAAQ,OAAO,GAAG,EAClB,KAAK;AAAA,MAER,aAAa,KAAK,OAAO,MAAM,YAAY,MAAM,KAAK;AAAA,MACtD,aAAa,KAAK,KAAK,UAAU,QAAQ,UAAU,MAAM,QAAQ,IAAI;AAAA,MACrE,aAAa,KAAK,gBAAgB,MAAM,WAAW,mBAAmB,IAAI;AAAA,IAC5E;AAAA,IAEA,IAAI,QAAQ,SAAS,IAAI;AAAA,MACvB,aAAa,KAAK;AAAA,UAAa,QAAQ,SAAS,kBAAkB;AAAA,IACpE;AAAA,IAEA,OAAO,aAAa,KAAK;AAAA,CAAI;AAAA;AAAA,EAM/B,WAAW,GAAW;AAAA,IACpB,OAAO,KAAK,OAAO;AAAA;AAEvB;AAKO,SAAS,uBAAuB,CACrC,SACA,QACmB;AAAA,EACnB,OAAO,IAAI,kBAAkB,SAAS,MAAM;AAAA;;;AFtV9C,SAAS,kBAAkB,CAAC,KAAuC;AAAA,EACjE,OACE,OAAO,IAAI,OAAO,YAClB,IAAI,GAAG,SAAS,KAChB,OAAO,IAAI,YAAY,YACvB,IAAI,QAAQ,SAAS;AAAA;AAIzB,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBzB,eAAe,iBAAiB,CAC9B,SACA,SACA,kBAC6B;AAAA,EAC7B,MAAM,SAAS,iBAAiB,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,EAAE,EAAE,QAC9E,eACA,gBACF;AAAA,EAEA,MAAM,SAAS,MAAM,QAAQ,SAAS,uBAAU,YAAY;AAAA,IAC1D;AAAA,IACA,eAAe,CAAC;AAAA,EAClB,CAAC;AAAA,EAED,oBAAO,MAAM,sCAAsC,MAAM;AAAA,EAEzD,MAAM,SAAS,8BAAiB,OAAO,MAAM,CAAC;AAAA,EAE9C,IAAI,CAAC,UAAU,CAAC,mBAAmB,MAAM,GAAG;AAAA,IAC1C,oBAAO,MAAM,wDAAwD;AAAA,IACrE,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA,IACL,IAAI,OAAO,OAAO,EAAE;AAAA,IACpB,SAAS,OAAO,OAAO,OAAO;AAAA,EAChC;AAAA;AAGF,IAAM,OAAO,kBAAkB,mBAAmB;AAE3C,IAAM,yBAAiC;AAAA,EAC5C,MAAM,KAAK;AAAA,EACX,SAAS,KAAK,UAAU,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC;AAAA,EAC7C,aAAa,KAAK;AAAA,EAElB,UAAU,OAAO,UAAyB,aAAuC;AAAA,IAC/E,OAAO;AAAA;AAAA,EAGT,SAAS,OACP,SACA,SACA,mBACA,UACA,UACA,eACG;AAAA,IACH,MAAM,UAAU,wBAAwB,OAAO;AAAA,IAG/C,MAAM,UAAU,MAAM,QAAQ,KAAK;AAAA,IACnC,MAAM,iBAAiB,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK;AAAA,CAAI;AAAA,IAE9E,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,yBAAyB;AAAA,UACnC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,uBAAuB;AAAA,IACxD;AAAA,IAEA,MAAM,aAAa,MAAM,kBAAkB,SAAS,SAAS,cAAc;AAAA,IAE3E,IAAI,CAAC,YAAY;AAAA,MACf,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,EAAiF;AAAA,UACvF,SAAS,CAAC,0BAA0B;AAAA,UACpC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,gCAAgC;AAAA,IACjE;AAAA,IAEA,IAAI;AAAA,MAEF,MAAM,SAAS,MAAM,QAAQ,OAAO,WAAW,EAAE;AAAA,MACjD,IAAI,CAAC,QAAQ;AAAA,QACX,IAAI,UAAU;AAAA,UACZ,MAAM,SAAS;AAAA,YACb,MAAM,qBAAqB,WAAW;AAAA,EAAsC;AAAA,YAC5E,SAAS,CAAC,6BAA6B;AAAA,YACvC,QAAQ,QAAQ,QAAQ;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,QACA,OAAO,EAAE,SAAS,OAAO,MAAM,kBAAkB;AAAA,MACnD;AAAA,MAGA,MAAM,gBAAgB,MAAM,QAAQ,KAAK,WAAW,EAAE;AAAA,MAGtD,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,OAAO,WAAW,SAAS;AAAA,QACzE,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,MACtB,CAAC;AAAA,MAED,MAAM,iBAAiB,qCAAqC,MAAM,WAAW,MAAM;AAAA,MAEnF,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,2BAA2B;AAAA,UACrC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MAEA,OAAO,EAAE,SAAS,MAAM,MAAM,gBAAgB,MAAM;AAAA,MACpD,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,oBAAO,MAAM,6BAA6B,QAAQ;AAAA,MAClD,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM,iCAAiC;AAAA,UACvC,SAAS,CAAC,0BAA0B;AAAA,UACpC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,uCAAuC;AAAA;AAAA;AAAA,EAI1E,UAAU,CAAC;AACb;;;AGlKO,IAVP;AAkBA,SAAS,kBAAkB,CAAC,KAAuC;AAAA,EACjE,OAAO,OAAO,IAAI,OAAO,YAAY,IAAI,GAAG,SAAS;AAAA;AAGvD,IAAM,oBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAczB,eAAe,iBAAiB,CAC9B,SACA,SACA,kBAC6B;AAAA,EAC7B,MAAM,SAAS,kBAAiB,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,EAAE,EAAE,QAC9E,eACA,gBACF;AAAA,EAEA,MAAM,SAAS,MAAM,QAAQ,SAAS,uBAAU,YAAY;AAAA,IAC1D;AAAA,IACA,eAAe,CAAC;AAAA,EAClB,CAAC;AAAA,EAED,oBAAO,MAAM,sCAAsC,MAAM;AAAA,EAEzD,MAAM,SAAS,8BAAiB,OAAO,MAAM,CAAC;AAAA,EAE9C,IAAI,CAAC,UAAU,CAAC,mBAAmB,MAAM,GAAG;AAAA,IAC1C,oBAAO,MAAM,wDAAwD;AAAA,IACrE,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA,IACL,IAAI,OAAO,OAAO,EAAE;AAAA,EACtB;AAAA;AAGF,IAAM,QAAO,kBAAkB,mBAAmB;AAE3C,IAAM,yBAAiC;AAAA,EAC5C,MAAM,MAAK;AAAA,EACX,SAAS,MAAK,UAAU,CAAC,GAAG,MAAK,OAAO,IAAI,CAAC;AAAA,EAC7C,aAAa,MAAK;AAAA,EAElB,UAAU,OAAO,UAAyB,aAAuC;AAAA,IAC/E,OAAO;AAAA;AAAA,EAGT,SAAS,OACP,SACA,SACA,mBACA,UACA,UACA,eACG;AAAA,IACH,MAAM,UAAU,wBAAwB,OAAO;AAAA,IAG/C,MAAM,UAAU,MAAM,QAAQ,KAAK;AAAA,IACnC,MAAM,iBAAiB,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK;AAAA,CAAI;AAAA,IAE9E,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,yBAAyB;AAAA,UACnC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,uBAAuB;AAAA,IACxD;AAAA,IAEA,MAAM,aAAa,MAAM,kBAAkB,SAAS,SAAS,cAAc;AAAA,IAE3E,IAAI,CAAC,YAAY;AAAA,MACf,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,EAAkE;AAAA,UACxE,SAAS,CAAC,0BAA0B;AAAA,UACpC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,gCAAgC;AAAA,IACjE;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,QAAQ,OAAO,WAAW,EAAE;AAAA,MAElD,IAAI,CAAC,SAAS;AAAA,QACZ,IAAI,UAAU;AAAA,UACZ,MAAM,SAAS;AAAA,YACb,MAAM,qBAAqB,WAAW;AAAA,YACtC,SAAS,CAAC,6BAA6B;AAAA,YACvC,QAAQ,QAAQ,QAAQ;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,QACA,OAAO,EAAE,SAAS,OAAO,MAAM,kBAAkB;AAAA,MACnD;AAAA,MAEA,MAAM,iBAAiB,0CAA0C,WAAW;AAAA,MAE5E,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,2BAA2B;AAAA,UACrC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MAEA,OAAO,EAAE,SAAS,MAAM,MAAM,eAAe;AAAA,MAC7C,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,oBAAO,MAAM,6BAA6B,QAAQ;AAAA,MAClD,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM,8BAA8B;AAAA,UACpC,SAAS,CAAC,0BAA0B;AAAA,UACpC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,oCAAoC;AAAA;AAAA;AAAA,EAIvE,UAAU,CAAC;AACb;;;AClJO,IARP;AAYA,IAAM,QAAO,kBAAkB,iBAAiB;AAEzC,IAAM,uBAA+B;AAAA,EAC1C,MAAM,MAAK;AAAA,EACX,SAAS,MAAK,UAAU,CAAC,GAAG,MAAK,OAAO,IAAI,CAAC;AAAA,EAC7C,aAAa,MAAK;AAAA,EAElB,UAAU,OAAO,UAAyB,aAAuC;AAAA,IAC/E,OAAO;AAAA;AAAA,EAGT,SAAS,OACP,SACA,SACA,mBACA,UACA,UACA,eACG;AAAA,IACH,IAAI;AAAA,MACF,MAAM,UAAU,wBAAwB,OAAO;AAAA,MAC/C,MAAM,UAAU,MAAM,QAAQ,KAAK;AAAA,MAEnC,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,IAAI,UAAU;AAAA,UACZ,MAAM,SAAS;AAAA,YACb,MAAM;AAAA,YACN,SAAS,CAAC,uBAAuB;AAAA,YACjC,QAAQ,QAAQ,QAAQ;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,QACA,OAAO,EAAE,SAAS,MAAM,MAAM,cAAc,SAAS,CAAC,EAAE;AAAA,MAC1D;AAAA,MAEA,MAAM,WAAW,QACd,IAAI,CAAC,GAAG,MAAM;AAAA,QACb,MAAM,UAAU,EAAE,MAAM,SAAS,KAAK,EAAE,KAAK,KAAK,IAAI,OAAO;AAAA,QAC7D,OAAO,GAAG,IAAI,QAAQ,EAAE,YAAY,EAAE,MAAM;AAAA,gBAA0B,EAAE,WAAW,mBAAmB;AAAA,OACvG,EACA,KAAK;AAAA,CAAI;AAAA,MAEZ,MAAM,iBAAiB,gCAAgC,QAAQ;AAAA;AAAA,EAAqB;AAAA,MAEpF,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,yBAAyB;AAAA,UACnC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MAEA,OAAO,EAAE,SAAS,MAAM,MAAM,gBAAgB,QAAQ;AAAA,MACtD,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,oBAAO,MAAM,2BAA2B,QAAQ;AAAA,MAChD,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM,sCAAsC;AAAA,UAC5C,SAAS,CAAC,wBAAwB;AAAA,UAClC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,oCAAoC;AAAA;AAAA;AAAA,EAIvE,UAAU,CAAC;AACb;;;ACrEO,IAVP;AAoBA,SAAS,gBAAgB,CAAC,KAAuC;AAAA,EAC/D,OAAO,OAAO,IAAI,OAAO,YAAY,IAAI,GAAG,SAAS;AAAA;AAGvD,IAAM,oBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBzB,eAAe,eAAe,CAC5B,SACA,SACA,kBAC2B;AAAA,EAC3B,MAAM,SAAS,kBAAiB,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,EAAE,EAAE,QAC9E,eACA,gBACF;AAAA,EAEA,MAAM,SAAS,MAAM,QAAQ,SAAS,uBAAU,YAAY;AAAA,IAC1D;AAAA,IACA,eAAe,CAAC;AAAA,EAClB,CAAC;AAAA,EAED,oBAAO,MAAM,oCAAoC,MAAM;AAAA,EAEvD,MAAM,SAAS,8BAAiB,OAAO,MAAM,CAAC;AAAA,EAE9C,IAAI,CAAC,UAAU,CAAC,iBAAiB,MAAM,GAAG;AAAA,IACxC,oBAAO,MAAM,oDAAoD;AAAA,IACjE,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA,IACL,IAAI,OAAO,OAAO,EAAE;AAAA,IACpB,MAAM,OAAO,OAAO,OAAO,OAAO,IAAI,IAAI;AAAA,IAC1C,OAAO,OAAO,QAAQ,OAAO,OAAO,KAAK,IAAI;AAAA,EAC/C;AAAA;AAGF,IAAM,QAAO,kBAAkB,iBAAiB;AAEzC,IAAM,uBAA+B;AAAA,EAC1C,MAAM,MAAK;AAAA,EACX,SAAS,MAAK,UAAU,CAAC,GAAG,MAAK,OAAO,IAAI,CAAC;AAAA,EAC7C,aAAa,MAAK;AAAA,EAElB,UAAU,OAAO,UAAyB,aAAuC;AAAA,IAC/E,OAAO;AAAA;AAAA,EAGT,SAAS,OACP,SACA,SACA,mBACA,UACA,UACA,eACG;AAAA,IACH,MAAM,UAAU,wBAAwB,OAAO;AAAA,IAG/C,MAAM,UAAU,MAAM,QAAQ,KAAK;AAAA,IACnC,MAAM,iBAAiB,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK;AAAA,CAAI;AAAA,IAE9E,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,uBAAuB;AAAA,UACjC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,uBAAuB;AAAA,IACxD;AAAA,IAEA,MAAM,WAAW,MAAM,gBAAgB,SAAS,SAAS,cAAc;AAAA,IAEvE,IAAI,CAAC,UAAU;AAAA,MACb,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,EAAgE;AAAA,UACtE,SAAS,CAAC,wBAAwB;AAAA,UAClC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,8BAA8B;AAAA,IAC/D;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,QAAQ,MAAM,QAAQ,KAAK,SAAS,IAAI;AAAA,QAC5C,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,MAClB,CAAC;AAAA,MAED,MAAM,WACJ,SAAS,SAAS,YACd,WAAW,SAAS,SAAS,SAAS,QAAQ,MAAM,SAAS,SAAS,SACtE;AAAA,MAEN,MAAM,iBAAiB,KAAK,MAAM,UAAU;AAAA;AAAA,EAAe,MAAM;AAAA,MAEjE,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,yBAAyB;AAAA,UACnC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MAEA,OAAO,EAAE,SAAS,MAAM,MAAM,gBAAgB,MAAM;AAAA,MACpD,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,oBAAO,MAAM,2BAA2B,QAAQ;AAAA,MAChD,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM,4BAA4B;AAAA,UAClC,SAAS,CAAC,wBAAwB;AAAA,UAClC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,kCAAkC;AAAA;AAAA;AAAA,EAIrE,UAAU,CAAC;AACb;;;ACrJO,IAVP;AAmBA,SAAS,kBAAkB,CAAC,KAAuC;AAAA,EACjE,OAAO,OAAO,IAAI,UAAU,YAAY,IAAI,MAAM,SAAS;AAAA;AAG7D,IAAM,oBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazB,eAAe,iBAAiB,CAC9B,SACA,SAC6B;AAAA,EAC7B,MAAM,SAAS,kBAAiB,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAE9E,MAAM,SAAS,MAAM,QAAQ,SAAS,uBAAU,YAAY;AAAA,IAC1D;AAAA,IACA,eAAe,CAAC;AAAA,EAClB,CAAC;AAAA,EAED,oBAAO,MAAM,sCAAsC,MAAM;AAAA,EAEzD,MAAM,SAAS,8BAAiB,OAAO,MAAM,CAAC;AAAA,EAE9C,IAAI,CAAC,UAAU,CAAC,mBAAmB,MAAM,GAAG;AAAA,IAC1C,oBAAO,MAAM,wDAAwD;AAAA,IACrE,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,OAAO,OAAO,KAAK;AAAA,IAC1B,YAAY,OAAO,aAAa,OAAO,OAAO,UAAU,IAAI;AAAA,EAC9D;AAAA;AAGF,IAAM,QAAO,kBAAkB,mBAAmB;AAE3C,IAAM,yBAAiC;AAAA,EAC5C,MAAM,MAAK;AAAA,EACX,SAAS,MAAK,UAAU,CAAC,GAAG,MAAK,OAAO,IAAI,CAAC;AAAA,EAC7C,aAAa,MAAK;AAAA,EAElB,UAAU,OAAO,UAAyB,aAAuC;AAAA,IAC/E,OAAO;AAAA;AAAA,EAGT,SAAS,OACP,SACA,SACA,mBACA,UACA,UACA,eACG;AAAA,IACH,MAAM,aAAa,MAAM,kBAAkB,SAAS,OAAO;AAAA,IAE3D,IAAI,CAAC,YAAY;AAAA,MACf,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,0BAA0B;AAAA,UACpC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,gCAAgC;AAAA,IACjE;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,UAAU,wBAAwB,OAAO;AAAA,MAC/C,MAAM,UAAU,MAAM,QAAQ,OAAO,WAAW,OAAO;AAAA,QACrD,YAAY,WAAW;AAAA,MACzB,CAAC;AAAA,MAED,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,IAAI,UAAU;AAAA,UACZ,MAAM,SAAS;AAAA,YACb,MAAM,yCAAyC,WAAW;AAAA,YAC1D,SAAS,CAAC,yBAAyB;AAAA,YACnC,QAAQ,QAAQ,QAAQ;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,QACA,OAAO,EAAE,SAAS,MAAM,MAAM,oBAAoB,SAAS,CAAC,EAAE;AAAA,MAChE;AAAA,MAEA,MAAM,aAAa,QAChB,IAAI,CAAC,GAAG,MAAM;AAAA,QACb,MAAM,eAAe,KAAK,MAAM,EAAE,QAAQ,GAAG;AAAA,QAC7C,OAAO,KAAK,IAAI,MAAM,EAAE,cAAc,8BAA8B,EAAE,aAAa,EAAE;AAAA;AAAA,EAAqB,EAAE,QAAQ,UAAU,GAAG,GAAG,IAAI,EAAE,QAAQ,SAAS,MAAM,QAAQ;AAAA;AAAA,OAC1K,EACA,KAAK;AAAA;AAAA,CAAM;AAAA,MAEd,MAAM,iBAAiB,SAAS,QAAQ,2CAA2C,WAAW;AAAA;AAAA,EAAc;AAAA;AAAA;AAAA,MAE5G,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,2BAA2B;AAAA,UACrC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MAEA,OAAO,EAAE,SAAS,MAAM,MAAM,gBAAgB,QAAQ;AAAA,MACtD,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,oBAAO,MAAM,6BAA6B,QAAQ;AAAA,MAClD,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM,gCAAgC;AAAA,UACtC,SAAS,CAAC,0BAA0B;AAAA,UACpC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,8BAA8B;AAAA;AAAA;AAAA,EAIjE,UAAU,CAAC;AACb;;;ACtIO,IAVP;AAoBA,SAAS,iBAAiB,CAAC,KAAuC;AAAA,EAChE,OACE,OAAO,IAAI,UAAU,YACrB,IAAI,MAAM,SAAS,KACnB,OAAO,IAAI,YAAY,YACvB,IAAI,QAAQ,SAAS;AAAA;AAIzB,IAAM,oBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBzB,eAAe,gBAAgB,CAC7B,SACA,SACA,QAC4B;AAAA,EAC5B,MAAM,SAAS,kBAAiB,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,EAAE,EAAE,QAC9E,sBACA,EACF;AAAA,EAEA,MAAM,SAAS,MAAM,QAAQ,SAAS,uBAAU,YAAY;AAAA,IAC1D;AAAA,IACA,eAAe,CAAC;AAAA,EAClB,CAAC;AAAA,EAED,oBAAO,MAAM,qCAAqC,MAAM;AAAA,EAExD,MAAM,SAAS,8BAAiB,OAAO,MAAM,CAAC;AAAA,EAE9C,IAAI,CAAC,UAAU,CAAC,kBAAkB,MAAM,GAAG;AAAA,IACzC,oBAAO,MAAM,sDAAsD;AAAA,IACnE,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAAO,OAChB,OAAO,OAAO,IAAI,EACf,MAAM,GAAG,EACT,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC,EAC3B,OAAO,OAAO,IACjB;AAAA,EAEJ,OAAO;AAAA,IACL,OAAO,OAAO,OAAO,KAAK;AAAA,IAC1B,SAAS,OAAO,OAAO,OAAO;AAAA,IAC9B;AAAA,EACF;AAAA;AAGF,IAAM,QAAO,kBAAkB,kBAAkB;AAE1C,IAAM,wBAAgC;AAAA,EAC3C,MAAM,MAAK;AAAA,EACX,SAAS,MAAK,UAAU,CAAC,GAAG,MAAK,OAAO,IAAI,CAAC;AAAA,EAC7C,aAAa,MAAK;AAAA,EAElB,UAAU,OAAO,UAAyB,aAAuC;AAAA,IAC/E,OAAO;AAAA;AAAA,EAGT,SAAS,OACP,SACA,SACA,kBACA,UACA,UACA,eACG;AAAA,IACH,MAAM,QAAQ,oBAAqB,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AAAA,IACzE,MAAM,YAAY,MAAM,iBAAiB,SAAS,SAAS,KAAK;AAAA,IAEhE,IAAI,CAAC,WAAW;AAAA,MACd,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,yBAAyB;AAAA,UACnC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,+BAA+B;AAAA,IAChE;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,UAAU,wBAAwB,OAAO;AAAA,MAC/C,MAAM,QAAQ,MAAM,QAAQ,MAAM,UAAU,OAAO,UAAU,SAAS;AAAA,QACpE,MAAM,UAAU;AAAA,MAClB,CAAC;AAAA,MAED,MAAM,iBAAiB,6BAA6B,MAAM,eAAe,MAAM,OAC7E,MAAM,MAAM,SAAS,UAAU,MAAM,KAAK,KAAK,IAAI,MAAM;AAAA,MAG3D,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,SAAS,CAAC,0BAA0B;AAAA,UACpC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MAEA,OAAO,EAAE,SAAS,MAAM,MAAM,gBAAgB,SAAS,MAAM,GAAG;AAAA,MAChE,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,oBAAO,MAAM,4BAA4B,QAAQ;AAAA,MACjD,IAAI,UAAU;AAAA,QACZ,MAAM,SAAS;AAAA,UACb,MAAM,4BAA4B;AAAA,UAClC,SAAS,CAAC,yBAAyB;AAAA,UACnC,QAAQ,QAAQ,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,SAAS,OAAO,MAAM,gCAAgC;AAAA;AAAA;AAAA,EAInE,UAAU,CAAC;AACb;;;ACjJO,IAPP;AAcO,IAAM,qBAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,aACE;AAAA,EAEF,KAAK,OAAO,SAAwB,UAAkB,WAA2C;AAAA,IAC/F,IAAI;AAAA,MACF,MAAM,UAAU,wBAAwB,OAAO;AAAA,MAC/C,MAAM,UAAU,MAAM,QAAQ,KAAK;AAAA,MAEnC,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,EAAE,SAAS,CAAC,GAAG,OAAO,EAAE;AAAA,UAC9B,QAAQ,EAAE,iBAAiB,EAAE;AAAA,QAC/B;AAAA,MACF;AAAA,MAGA,MAAM,eAAe,CAAC,mBAAmB,QAAQ,8BAA8B,EAAE;AAAA,MAGjF,MAAM,gBAAgB,QAAQ,MAAM,GAAG,CAAC;AAAA,MACxC,WAAW,SAAS,eAAe;AAAA,QAEjC,MAAM,4BAA4B,MAAM,QAAQ,QAAQ,uBAAuB,EAAE,EAAE,KAAK;AAAA,QACxF,MAAM,UAAU,0BAA0B,UAAU,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAG;AAAA,QAE7E,MAAM,UAAU,MAAM,MAAM,SAAS,KAAK,MAAM,KAAK,KAAK,IAAI,OAAO;AAAA,QAErE,aAAa,KAAK,OAAO,MAAM,YAAY,MAAM,MAAM,SAAS;AAAA,QAChE,aAAa,KAAK,KAAK,UAAU,0BAA0B,SAAS,KAAK,QAAQ,IAAI;AAAA,MACvF;AAAA,MAEA,IAAI,QAAQ,SAAS,GAAG;AAAA,QACtB,aAAa,KAAK;AAAA,UAAa,QAAQ,SAAS,iBAAiB;AAAA,MACnE;AAAA,MAEA,aAAa,KACX;AAAA,0FACF;AAAA,MAGA,MAAM,YAAY,QAAQ,IAAI,CAAC,OAAO;AAAA,QACpC,IAAI,EAAE;AAAA,QACN,OAAO,EAAE;AAAA,QACT,YAAY,EAAE,WAAW,YAAY;AAAA,QACrC,MAAM,EAAE,QAAQ,CAAC;AAAA,MACnB,EAAE;AAAA,MAEF,OAAO;AAAA,QACL,MAAM,aAAa,KAAK;AAAA,CAAI;AAAA,QAC5B,MAAM;AAAA,UACJ,SAAS;AAAA,UACT,OAAO,QAAQ;AAAA,UACf,UAAU,QAAQ,YAAY;AAAA,QAChC;AAAA,QACA,QAAQ;AAAA,UACN,iBAAiB,QAAQ;AAAA,UACzB,oBAAoB,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI;AAAA,QACxD;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,MAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACtE,oBAAO,MAAM,+BAA+B,QAAQ;AAAA,MACpD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,EAAE,OAAO,SAAS;AAAA,QACxB,QAAQ,EAAE,iBAAiB,EAAE;AAAA,MAC/B;AAAA;AAAA;AAGN;;;ATvDO,IAAM,mBAA2B;AAAA,EACtC,MAAM;AAAA,EACN,aACE;AAAA,EAEF,WAAW,CAAC,kBAAkB;AAAA,EAE9B,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,OAEM,KAAI,CAAC,SAAiC,UAAwC;AAAA,IAClF,IAAI;AAAA,MACF,oBAAO,KAAK,oCAAoC;AAAA,MAGhD,oBAAO,KAAK,6CAA6C;AAAA,MACzD,OAAO,OAAO;AAAA,MACd,oBAAO,MACL,0CACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,MACA,MAAM;AAAA;AAAA;AAGZ;AAEA,IAAe;",
17
+ "debugId": "3C48A2EDC93D045364756E2164756E21",
18
+ "names": []
19
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Generated action specs for plugin-scratchpad
3
+ */
4
+ export interface ActionSpec {
5
+ name: string;
6
+ description: string;
7
+ similes?: string[];
8
+ examples?: Array<Array<{
9
+ role: string;
10
+ content: string;
11
+ }>>;
12
+ }
13
+ export declare const actionSpecs: Record<string, ActionSpec>;
14
+ export declare function requireActionSpec(name: string): ActionSpec;
15
+ //# sourceMappingURL=specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../../generated/specs/specs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CAC5D;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA+IlD,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAM1D"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Browser entry point for plugin-scratchpad
3
+ *
4
+ * Note: The file-based scratchpad functionality is only available in Node.js.
5
+ * This browser entry provides a stub that throws if used in browser context.
6
+ */
7
+ import type { Plugin } from "@elizaos/core";
8
+ export declare const scratchpadPlugin: Plugin;
9
+ export default scratchpadPlugin;
10
+ export type { ScratchpadConfig, ScratchpadEntry, ScratchpadReadOptions, ScratchpadSearchOptions, ScratchpadSearchResult, ScratchpadWriteOptions, } from "./types";
11
+ //# sourceMappingURL=index.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../index.browser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,gBAAgB,EAAE,MAU9B,CAAC;AAEF,eAAe,gBAAgB,CAAC;AAGhC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Plugin } from "@elizaos/core";
2
+ /**
3
+ * Scratchpad Plugin for ElizaOS
4
+ *
5
+ * Provides file-based memory storage that persists across sessions.
6
+ * The agent can write, read, search, and manage scratchpad entries
7
+ * which are stored as markdown files.
8
+ *
9
+ * Actions:
10
+ * - SCRATCHPAD_WRITE: Create a new scratchpad entry
11
+ * - SCRATCHPAD_READ: Read a specific entry by ID
12
+ * - SCRATCHPAD_SEARCH: Search entries by content
13
+ * - SCRATCHPAD_LIST: List all entries
14
+ * - SCRATCHPAD_DELETE: Delete an entry
15
+ * - SCRATCHPAD_APPEND: Append content to an existing entry
16
+ *
17
+ * Provider:
18
+ * - scratchpad: Provides summary of entries to agent context
19
+ */
20
+ export declare const scratchpadPlugin: Plugin;
21
+ export default scratchpadPlugin;
22
+ export { scratchpadAppendAction } from "./actions/append";
23
+ export { scratchpadDeleteAction } from "./actions/delete";
24
+ export { scratchpadListAction } from "./actions/list";
25
+ export { scratchpadReadAction } from "./actions/read";
26
+ export { scratchpadSearchAction } from "./actions/search";
27
+ export { scratchpadWriteAction } from "./actions/write";
28
+ export { scratchpadProvider } from "./providers/scratchpad";
29
+ export { createScratchpadService, ScratchpadService } from "./services/scratchpadService";
30
+ export type { ScratchpadConfig, ScratchpadEntry, ScratchpadReadOptions, ScratchpadSearchOptions, ScratchpadSearchResult, ScratchpadWriteOptions, } from "./types";
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAa5C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,gBAAgB,EAAE,MA8B9B,CAAC;AAEF,eAAe,gBAAgB,CAAC;AAEhC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAE1F,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Node.js entry point for plugin-scratchpad
3
+ */
4
+ export * from "./index";
5
+ export { default } from "./index";
6
+ //# sourceMappingURL=index.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.node.d.ts","sourceRoot":"","sources":["../index.node.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from '../index';
2
+ export { default } from '../index';