{"_id":"@aichatkit/localstorage-adapter","_rev":"7-2fd624fbf4e552aec442c469a042b71b","name":"@aichatkit/localstorage-adapter","dist-tags":{"latest":"0.0.0-alpha.6"},"versions":{"0.0.0-alpha.0":{"name":"@aichatkit/localstorage-adapter","version":"0.0.0-alpha.0","keywords":["chat","storage","localstorage","adapter","browser","hypermode"],"author":{"name":"Hypermode"},"license":"MIT","_id":"@aichatkit/localstorage-adapter@0.0.0-alpha.0","maintainers":[{"name":"danstarns","email":"danielstarns@hotmail.com"}],"homepage":"https://github.com/hypermodeinc/chatkit/tree/main/packages/localstorage-adapter#readme","dist":{"shasum":"3e254cbe0d7fc161cc772fda3914b8cc11e9e02e","tarball":"https://registry.npmjs.org/@aichatkit/localstorage-adapter/-/localstorage-adapter-0.0.0-alpha.0.tgz","fileCount":7,"integrity":"sha512-WJ4+ZtsYGJFVfWElW2Rs//MrR6+RtWMLiVy2r/PTwIm031Cnt9lirgg4hHoSz0lbA+nK5u/A7V0Ckt+3VpG6Cw==","signatures":[{"sig":"MEUCIA9+U6AXKKf7F7AKCmSP+/byh9/h2x71dWFZNLjIQutrAiEAyKrjsWoZDhfdpj1nkUWMRQgbOdE4V4ITNiuPqL0a2LA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40042},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"ff46453f845c886e2819a16bfcee93f01706eabf","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"danstarns","email":"danielstarns@hotmail.com"},"_npmVersion":"10.9.2","description":"LocalStorage adapter for Hypermode ChatKit","directories":{},"_nodeVersion":"22.14.0","dependencies":{"@aichatkit/types":"workspace:^","@aichatkit/storage-adapter":"workspace:^"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/localstorage-adapter_0.0.0-alpha.0_1748541634270_0.8851754808046952","host":"s3://npm-registry-packages-npm-production"}},"0.0.0-alpha.1":{"name":"@aichatkit/localstorage-adapter","version":"0.0.0-alpha.1","keywords":["chat","storage","localstorage","adapter","browser","hypermode"],"author":{"name":"Hypermode"},"license":"MIT","_id":"@aichatkit/localstorage-adapter@0.0.0-alpha.1","maintainers":[{"name":"danstarns","email":"danielstarns@hotmail.com"}],"homepage":"https://github.com/hypermodeinc/chatkit/tree/main/packages/localstorage-adapter#readme","dist":{"shasum":"cc560f08313d52071492a2922e53d9282596bec0","tarball":"https://registry.npmjs.org/@aichatkit/localstorage-adapter/-/localstorage-adapter-0.0.0-alpha.1.tgz","fileCount":4,"integrity":"sha512-NcdLxO68ZbMi6TeRPiJ8LOyvjMfM39kPb1W2wboVU93DvoR2tNOd20pb+pRJOMYry2uHdHD5XU69pEVFVeBTCg==","signatures":[{"sig":"MEUCIQDcM3bg1aP/bS6l8Fh9Lw2XQKcw4i64nmDiwQXRfosSiQIgF7l5uaJEFX4xvI87ioJhFzchLiqkJCfPnwNMKBIJ3uw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14297},"main":"dist/index.js","_from":"file:aichatkit-localstorage-adapter-0.0.0-alpha.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"danstarns","email":"danielstarns@hotmail.com"},"_resolved":"/tmp/af97c3ac689f85e8ea7920da10c3b338/aichatkit-localstorage-adapter-0.0.0-alpha.1.tgz","_integrity":"sha512-NcdLxO68ZbMi6TeRPiJ8LOyvjMfM39kPb1W2wboVU93DvoR2tNOd20pb+pRJOMYry2uHdHD5XU69pEVFVeBTCg==","_npmVersion":"10.9.2","description":"LocalStorage adapter for Hypermode ChatKit","directories":{},"_nodeVersion":"22.13.0","dependencies":{"@aichatkit/types":"0.0.0-alpha.1","@aichatkit/storage-adapter":"0.0.0-alpha.1"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/localstorage-adapter_0.0.0-alpha.1_1748543215138_0.8361858859805149","host":"s3://npm-registry-packages-npm-production"}},"0.0.0-alpha.2":{"name":"@aichatkit/localstorage-adapter","version":"0.0.0-alpha.2","keywords":["chat","storage","localstorage","adapter","browser","hypermode"],"author":{"name":"Hypermode"},"license":"MIT","_id":"@aichatkit/localstorage-adapter@0.0.0-alpha.2","maintainers":[{"name":"danstarns","email":"danielstarns@hotmail.com"}],"homepage":"https://github.com/hypermodeinc/chatkit/tree/main/packages/localstorage-adapter#readme","dist":{"shasum":"97ea30a920e05730dbc27c000b6cde6a5077f6e8","tarball":"https://registry.npmjs.org/@aichatkit/localstorage-adapter/-/localstorage-adapter-0.0.0-alpha.2.tgz","fileCount":8,"integrity":"sha512-LuQwda7tP5XnbM2gy9FPWFQKvzmu/yLtqAGy0cZ6PzAmw2vzFLPRAO3Q7o1T63vogUhfV1FeSdzK6QYE8gABbQ==","signatures":[{"sig":"MEUCIEzdF6asLqEUhbo/5mbcfiJhRXhbV9CI9rMFDQBManUUAiEA01HScn5n+5sdNspJP/tjVim0zPfE0EtHcH9MskQodEA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41111},"main":"dist/index.js","_from":"file:aichatkit-localstorage-adapter-0.0.0-alpha.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"danstarns","email":"danielstarns@hotmail.com"},"_resolved":"/tmp/62d0c4afe52c576b82bddba97a2ce43e/aichatkit-localstorage-adapter-0.0.0-alpha.2.tgz","_integrity":"sha512-LuQwda7tP5XnbM2gy9FPWFQKvzmu/yLtqAGy0cZ6PzAmw2vzFLPRAO3Q7o1T63vogUhfV1FeSdzK6QYE8gABbQ==","_npmVersion":"10.9.2","description":"LocalStorage adapter for Hypermode ChatKit","directories":{},"_nodeVersion":"22.13.0","dependencies":{"@aichatkit/types":"0.0.0-alpha.2","@aichatkit/storage-adapter":"0.0.0-alpha.2"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/localstorage-adapter_0.0.0-alpha.2_1748544024125_0.0815258287239975","host":"s3://npm-registry-packages-npm-production"}},"0.0.0-alpha.3":{"name":"@aichatkit/localstorage-adapter","version":"0.0.0-alpha.3","keywords":["chat","storage","localstorage","adapter","browser","hypermode"],"author":{"name":"Hypermode"},"license":"MIT","_id":"@aichatkit/localstorage-adapter@0.0.0-alpha.3","maintainers":[{"name":"danstarns","email":"danielstarns@hotmail.com"}],"homepage":"https://github.com/hypermodeinc/chatkit/tree/main/packages/localstorage-adapter#readme","dist":{"shasum":"6216a933ae17c271955b89c91a58d86957eceaf3","tarball":"https://registry.npmjs.org/@aichatkit/localstorage-adapter/-/localstorage-adapter-0.0.0-alpha.3.tgz","fileCount":8,"integrity":"sha512-vIU+vdAPECuqATPBFy8hgebL7xrTDAooHr0RllOGTm30tkM9Er9rZ4zCfXDlqKIe+cx2+hhj971twJYAXZdIgA==","signatures":[{"sig":"MEYCIQDf586g/AbCyDDUaeLMK7g5GtqnPSAICXYoQLNZgv1c6AIhAOsFy8xCg8zaU3iQ2W6Rpa00UESKZOBhW/RaPZgLZKt0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41111},"main":"dist/index.js","_from":"file:aichatkit-localstorage-adapter-0.0.0-alpha.3.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"danstarns","email":"danielstarns@hotmail.com"},"_resolved":"/tmp/9b54a0582245831fb8043b97e8c79e3d/aichatkit-localstorage-adapter-0.0.0-alpha.3.tgz","_integrity":"sha512-vIU+vdAPECuqATPBFy8hgebL7xrTDAooHr0RllOGTm30tkM9Er9rZ4zCfXDlqKIe+cx2+hhj971twJYAXZdIgA==","_npmVersion":"10.9.2","description":"LocalStorage adapter for Hypermode ChatKit","directories":{},"_nodeVersion":"22.13.0","dependencies":{"@aichatkit/types":"0.0.0-alpha.3","@aichatkit/storage-adapter":"0.0.0-alpha.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/localstorage-adapter_0.0.0-alpha.3_1748544378360_0.9361983481197782","host":"s3://npm-registry-packages-npm-production"}},"0.0.0-alpha.4":{"name":"@aichatkit/localstorage-adapter","version":"0.0.0-alpha.4","keywords":["chat","storage","localstorage","adapter","browser","hypermode"],"author":{"name":"Hypermode"},"license":"MIT","_id":"@aichatkit/localstorage-adapter@0.0.0-alpha.4","maintainers":[{"name":"danstarns","email":"danielstarns@hotmail.com"}],"homepage":"https://github.com/hypermodeinc/chatkit/tree/main/packages/localstorage-adapter#readme","dist":{"shasum":"5d0d82b23cc4c9f1fa5502e710bd38cbc22a68a1","tarball":"https://registry.npmjs.org/@aichatkit/localstorage-adapter/-/localstorage-adapter-0.0.0-alpha.4.tgz","fileCount":8,"integrity":"sha512-HicmPnbyG+qhlM1FB/slHaLkb4/EpqVVnXO12TNrCHxftbB2yuIcYPFvsQqgAxx/aTQ/Px1fvLhSQKLcCdg5xw==","signatures":[{"sig":"MEYCIQDyUcWHPc6K/0quWtk0fNXHIzn9uaabFQmR2Yr5whdLKQIhAMuhe4vqYCa7o9FI5BTXdQfFZWC+B4MDSY0z3ZMpw4I/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34346},"main":"dist/index.js","_from":"file:aichatkit-localstorage-adapter-0.0.0-alpha.4.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"danstarns","email":"danielstarns@hotmail.com"},"_resolved":"/tmp/412edd66fe305c978821d13b745bae02/aichatkit-localstorage-adapter-0.0.0-alpha.4.tgz","_integrity":"sha512-HicmPnbyG+qhlM1FB/slHaLkb4/EpqVVnXO12TNrCHxftbB2yuIcYPFvsQqgAxx/aTQ/Px1fvLhSQKLcCdg5xw==","_npmVersion":"10.9.2","description":"LocalStorage adapter for Hypermode ChatKit","directories":{},"_nodeVersion":"22.13.0","dependencies":{"@aichatkit/types":"0.0.0-alpha.4","@aichatkit/storage-adapter":"0.0.0-alpha.4"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/localstorage-adapter_0.0.0-alpha.4_1748599501506_0.2789093767930455","host":"s3://npm-registry-packages-npm-production"}},"0.0.0-alpha.5":{"name":"@aichatkit/localstorage-adapter","version":"0.0.0-alpha.5","keywords":["chat","storage","localstorage","adapter","browser","hypermode"],"author":{"name":"Hypermode"},"license":"MIT","_id":"@aichatkit/localstorage-adapter@0.0.0-alpha.5","maintainers":[{"name":"danstarns","email":"danielstarns@hotmail.com"}],"homepage":"https://github.com/hypermodeinc/chatkit/tree/main/packages/localstorage-adapter#readme","dist":{"shasum":"93830e19df488ae07173bf3031448b01200761db","tarball":"https://registry.npmjs.org/@aichatkit/localstorage-adapter/-/localstorage-adapter-0.0.0-alpha.5.tgz","fileCount":8,"integrity":"sha512-ChK5lHdweDHLDNiizVJbi5DTGK+Tps5oOYMibDG5F5m2ah6pLnKFa1SztVcjh0zKfJplx3liKH5Yw6PkYMTINw==","signatures":[{"sig":"MEUCIQCo12nBUye6XAcT14w4SHno4+WETvuJvO/uYGT8q6zL7gIgCnOVIF5dq8TMuQEW8zW9NpNlRtr79GhXzpDt1ke7q0I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40823},"main":"dist/index.js","_from":"file:aichatkit-localstorage-adapter-0.0.0-alpha.5.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"danstarns","actor":{"name":"danstarns","type":"user","email":"danielstarns@hotmail.com"},"email":"danielstarns@hotmail.com"},"_resolved":"/tmp/bdf04523e9e8c383163ec764e3da4aee/aichatkit-localstorage-adapter-0.0.0-alpha.5.tgz","_integrity":"sha512-ChK5lHdweDHLDNiizVJbi5DTGK+Tps5oOYMibDG5F5m2ah6pLnKFa1SztVcjh0zKfJplx3liKH5Yw6PkYMTINw==","_npmVersion":"10.9.2","description":"LocalStorage adapter for Hypermode ChatKit","directories":{},"_nodeVersion":"22.13.0","dependencies":{"@aichatkit/types":"0.0.0-alpha.5","@aichatkit/storage-adapter":"0.0.0-alpha.5"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/localstorage-adapter_0.0.0-alpha.5_1750312724849_0.20222101688343286","host":"s3://npm-registry-packages-npm-production"}},"0.0.0-alpha.6":{"name":"@aichatkit/localstorage-adapter","version":"0.0.0-alpha.6","description":"LocalStorage adapter for Hypermode ChatKit","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","keywords":["chat","storage","localstorage","adapter","browser","hypermode"],"author":{"name":"Hypermode"},"license":"MIT","homepage":"https://github.com/hypermodeinc/chatkit/tree/main/packages/localstorage-adapter#readme","dependencies":{"@aichatkit/storage-adapter":"0.0.0-alpha.6","@aichatkit/types":"0.0.0-alpha.6"},"devDependencies":{"typescript":"^5.0.0","tsup":"^8.0.0"},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts","dev":"tsup src/index.ts --format cjs,esm --dts --watch"},"_id":"@aichatkit/localstorage-adapter@0.0.0-alpha.6","_integrity":"sha512-5BBMxc7YgMRYDlev3r8BkwOaqsmv1Ore+5O4ZuwePS7qzSD7UFCo0GbvE1XuRBF5h1Q8qGp6z2q70LXl2A9Jrw==","_resolved":"/tmp/f67fefdc1979cc65398866b0ecaef389/aichatkit-localstorage-adapter-0.0.0-alpha.6.tgz","_from":"file:aichatkit-localstorage-adapter-0.0.0-alpha.6.tgz","_nodeVersion":"22.13.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-5BBMxc7YgMRYDlev3r8BkwOaqsmv1Ore+5O4ZuwePS7qzSD7UFCo0GbvE1XuRBF5h1Q8qGp6z2q70LXl2A9Jrw==","shasum":"653dd0f9f96c43c21231af322d45c9706f339980","tarball":"https://registry.npmjs.org/@aichatkit/localstorage-adapter/-/localstorage-adapter-0.0.0-alpha.6.tgz","fileCount":8,"unpackedSize":76199,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBGFjK6tDtEUthWGMqLWWMGxiKa5AK6mskpaDcOf+GsHAiBr6HqJrlGV+W731tmAHFA/V/XXzFus2/qRpyBBFICkTA=="}]},"_npmUser":{"name":"danstarns","email":"danielstarns@hotmail.com","actor":{"name":"danstarns","email":"danielstarns@hotmail.com","type":"user"}},"directories":{},"maintainers":[{"name":"danstarns","email":"danielstarns@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/localstorage-adapter_0.0.0-alpha.6_1751223237708_0.1434226958802498"},"_hasShrinkwrap":false}},"time":{"created":"2025-05-29T18:00:34.134Z","modified":"2025-06-29T18:53:58.096Z","0.0.0-alpha.0":"2025-05-29T18:00:34.450Z","0.0.0-alpha.1":"2025-05-29T18:26:55.316Z","0.0.0-alpha.2":"2025-05-29T18:40:24.299Z","0.0.0-alpha.3":"2025-05-29T18:46:18.540Z","0.0.0-alpha.4":"2025-05-30T10:05:01.708Z","0.0.0-alpha.5":"2025-06-19T05:58:45.040Z","0.0.0-alpha.6":"2025-06-29T18:53:57.897Z"},"author":{"name":"Hypermode"},"license":"MIT","homepage":"https://github.com/hypermodeinc/chatkit/tree/main/packages/localstorage-adapter#readme","keywords":["chat","storage","localstorage","adapter","browser","hypermode"],"description":"LocalStorage adapter for Hypermode ChatKit","maintainers":[{"name":"danstarns","email":"danielstarns@hotmail.com"}],"readme":"# @aichatkit/localstorage-adapter\n\nLocalStorage implementation of the storage adapter for Hypermode ChatKit with backend\nsynchronization support and rich response items.\n\n## Installation\n\n```bash\nnpm install @aichatkit/localstorage-adapter\n```\n\n## Usage\n\n```typescript\nimport { LocalStorageAdapter } from \"@aichatkit/localstorage-adapter\";\nimport { ApolloAdapter } from \"@aichatkit/apollo-adapter\";\nimport { ChatInterface } from \"@aichatkit/ui\";\n\n// Create and initialize the adapter\nconst storageAdapter = new LocalStorageAdapter({\n  // Optional custom configuration\n  conversationPrefix: \"my-app-chat_\",\n  conversationIdsKey: \"my-app-conversation-ids\",\n  activeConversationKey: \"my-app-active-conversation\",\n});\n\n// Initialize the adapter\nawait storageAdapter.initialize();\n\n// Set up network callbacks for backend synchronization\nconst networkAdapter = new ApolloAdapter();\nstorageAdapter.setNetworkCallbacks({\n  getConversationItems: (agentId) =>\n    networkAdapter.getConversationItems(agentId),\n  clearConversationHistory: (agentId) =>\n    networkAdapter.clearConversationHistory(agentId),\n});\n\n// Use with ChatInterface\nfunction ChatApp() {\n  return (\n    <ChatInterface\n      storageAdapter={storageAdapter}\n      networkAdapter={networkAdapter}\n      // other props...\n    />\n  );\n}\n```\n\n## Configuration Options\n\nThe `LocalStorageAdapter` constructor accepts an optional configuration object:\n\n- `conversationPrefix`: Key prefix for conversations in localStorage (default:\n  'chatkit*conversation*')\n- `conversationIdsKey`: Key for storing the list of conversation IDs (default:\n  'chatkit_conversation_ids')\n- `activeConversationKey`: Key for storing the active conversation ID (default:\n  'chatkit_active_conversation')\n- `agentMappingKey`: Key for storing conversation-to-agent ID mapping (default:\n  'chatkit_agent_mapping')\n\n## API Methods\n\n### Core Storage Methods\n\n#### saveConversation(conversation: Conversation): Promise<void>\n\nSaves a conversation with all its response items to localStorage.\n\n```typescript\nawait storageAdapter.saveConversation({\n  id: \"conv-1\",\n  title: \"My Conversation\",\n  items: [\n    {\n      id: \"msg_1\",\n      type: \"message\",\n      content: \"Hello\",\n      role: \"user\",\n    },\n    {\n      id: \"tool_1\",\n      type: \"tool_call\",\n      toolCall: {\n        id: \"call_1\",\n        name: \"get_weather\",\n        arguments: { location: \"NYC\" },\n        status: \"completed\",\n        result: { temperature: \"22°C\" },\n      },\n    },\n  ],\n})\n```\n\n#### getConversation(id: string): Promise<Conversation | null>\n\nRetrieves a conversation by ID with all its response items.\n\n```typescript\nconst conversation = await storageAdapter.getConversation(\"conv-1\")\n// Returns conversation with messages, tool calls, cards, etc.\n```\n\n#### getAllConversations(): Promise<Conversation[]>\n\nRetrieves all conversations with their complete response items.\n\n```typescript\nconst conversations = await storageAdapter.getAllConversations()\n```\n\n#### deleteConversation(id: string): Promise<boolean>\n\nDeletes a conversation and its associated agent mapping.\n\n```typescript\nconst success = await storageAdapter.deleteConversation(\"conv-1\")\n```\n\n#### addItem(conversationId: string, item: ChatResponseItem): Promise<Conversation | null>\n\nAdds any type of response item to a conversation.\n\n```typescript\n// Add a message\nawait storageAdapter.addItem(\"conv-1\", {\n  id: \"msg-2\",\n  type: \"message\",\n  content: \"Hello\",\n  role: \"user\",\n  timestamp: new Date().toISOString(),\n})\n\n// Add a tool call\nawait storageAdapter.addItem(\"conv-1\", {\n  id: \"tool-2\",\n  type: \"tool_call\",\n  toolCall: {\n    id: \"call-2\",\n    name: \"search_web\",\n    arguments: { query: \"AI news\" },\n    status: \"executing\",\n  },\n})\n\n// Add a card\nawait storageAdapter.addItem(\"conv-1\", {\n  id: \"card-1\",\n  type: \"card\",\n  card: {\n    id: \"weather-card\",\n    type: \"weather\",\n    title: \"Current Weather\",\n    content: { temperature: \"22°C\", condition: \"Sunny\" },\n    actions: [\n      {\n        id: \"forecast\",\n        label: \"View Forecast\",\n        type: \"button\",\n        action: \"show_forecast\",\n      },\n    ],\n  },\n})\n```\n\n#### addMessage(conversationId: string, message: Message): Promise<Conversation | null>\n\nConvenience method for adding message items.\n\n```typescript\nawait storageAdapter.addMessage(\"conv-1\", {\n  id: \"msg-1\",\n  content: \"Hello\",\n  role: \"user\",\n  timestamp: new Date().toISOString(),\n})\n```\n\n### Active Conversation Management\n\n#### getActiveConversationId(): string\n\nGets the currently active conversation ID.\n\n```typescript\nconst activeId = storageAdapter.getActiveConversationId()\n```\n\n#### setActiveConversationId(id: string): void\n\nSets the active conversation ID.\n\n```typescript\nstorageAdapter.setActiveConversationId(\"conv-1\")\n```\n\n### Agent Mapping\n\n#### setConversationAgent(conversationId: string, agentId: string): Promise<void>\n\nMaps a conversation to a backend agent ID.\n\n```typescript\nawait storageAdapter.setConversationAgent(\"conv-1\", \"agent-123\")\n```\n\n#### getConversationAgent(conversationId: string): Promise<string | null>\n\nGets the agent ID for a conversation.\n\n```typescript\nconst agentId = await storageAdapter.getConversationAgent(\"conv-1\")\n```\n\n### Backend Synchronization\n\n#### getConversationItems(conversationId: string): Promise<ChatResponseItem[]>\n\nGets all conversation items, syncing with backend if available.\n\n```typescript\nconst items = await storageAdapter.getConversationItems(\"conv-1\")\n// Returns array of messages, tool calls, cards, etc.\n```\n\n#### getConversationHistory(conversationId: string): Promise<Message[]>\n\nGets only message items, syncing with backend if available.\n\n```typescript\nconst messages = await storageAdapter.getConversationHistory(\"conv-1\")\n// Returns only message items, filtered from all response items\n```\n\n#### clearConversationHistory(conversationId: string): Promise<void>\n\nClears conversation history both locally and on backend.\n\n```typescript\nawait storageAdapter.clearConversationHistory(\"conv-1\")\n```\n\n#### syncAllConversationsWithBackend(): Promise<void>\n\nSyncs all conversations with backend on app initialization.\n\n```typescript\nawait storageAdapter.syncAllConversationsWithBackend()\n```\n\n### Setting Network Callbacks\n\nThe adapter supports automatic synchronization with backend agents:\n\n```typescript\nimport { NetworkAdapter } from \"@aichatkit/network-adapter\"\n\n// Set callbacks for backend communication\nstorageAdapter.setNetworkCallbacks({\n  getConversationItems: async (agentId: string) => {\n    // Fetch all response items from your backend\n    return await networkAdapter.getConversationItems(agentId)\n  },\n  clearConversationHistory: async (agentId: string) => {\n    // Clear on your backend\n    await networkAdapter.clearConversationHistory(agentId)\n  },\n})\n```\n\n### Sync Behavior\n\n- **On App Load**: `syncAllConversationsWithBackend()` is called to get the latest state\n- **On Conversation Switch**: Items are synced when switching between conversations\n- **On Items Request**: Backend is queried for latest items if agent ID exists\n- **Fallback**: Falls back to local storage if backend sync fails\n\n## Data Structure\n\n### Conversation\n\n```typescript\ninterface Conversation {\n  id: string\n  title: string\n  items: ChatResponseItem[] // Mixed array of messages, tool calls, cards, etc.\n}\n```\n\n### ChatResponseItem\n\nUnion type supporting multiple item types:\n\n```typescript\ntype ChatResponseItem = MessageItem | ToolCallItem | CardItem\n\ninterface MessageItem {\n  id: string | number\n  type: \"message\"\n  content: string\n  role: \"user\" | \"assistant\"\n  timestamp?: string\n}\n\ninterface ToolCallItem {\n  id: string | number\n  type: \"tool_call\"\n  toolCall: {\n    id: string\n    name: string\n    arguments: Record<string, any>\n    status: \"pending\" | \"executing\" | \"completed\" | \"error\"\n    result?: any\n    error?: string\n  }\n}\n\ninterface CardItem {\n  id: string | number\n  type: \"card\"\n  card: {\n    id: string\n    type: string\n    title?: string\n    content: Record<string, any>\n    actions?: CardAction[]\n  }\n}\n```\n\n### Storage Keys\n\nDefault localStorage keys used:\n\n- `chatkit_conversation_ids`: Array of conversation IDs\n- `chatkit_active_conversation`: Currently active conversation ID\n- `chatkit_agent_mapping`: Object mapping conversation IDs to agent IDs\n- `chatkit_conversation_{id}`: Individual conversation data with all item types\n\n## Error Handling\n\nThe adapter includes robust error handling:\n\n```typescript\ntry {\n  await storageAdapter.saveConversation(conversation)\n} catch (error) {\n  console.error(\"Failed to save conversation:\", error)\n  // Handle error appropriately\n}\n\n// Backend sync failures fall back to local storage\nconst items = await storageAdapter.getConversationItems(\"conv-1\")\n// Will return local items if backend sync fails\n```\n\n## Browser Support\n\nRequires browsers with localStorage support:\n\n- Chrome 4+\n- Firefox 3.5+\n- Safari 4+\n- Internet Explorer 8+\n- All modern browsers\n\n## Advanced Usage\n\n### Custom Storage Keys\n\n```typescript\nconst adapter = new LocalStorageAdapter({\n  conversationPrefix: \"myapp_chat_\",\n  conversationIdsKey: \"myapp_conversations\",\n  activeConversationKey: \"myapp_active_chat\",\n  agentMappingKey: \"myapp_agents\",\n})\n```\n\n### Manual Sync\n\n```typescript\n// Manually sync a specific conversation\nconst agentId = await storageAdapter.getConversationAgent(\"conv-1\")\nif (agentId && networkAdapter) {\n  const latestItems = await networkAdapter.getConversationItems(agentId)\n  // Update local storage with latest items\n  const conversation = await storageAdapter.getConversation(\"conv-1\")\n  if (conversation) {\n    conversation.items = latestItems\n    await storageAdapter.saveConversation(conversation)\n  }\n}\n```\n\n### Cleanup\n\n```typescript\n// Clear all data\nawait storageAdapter.clearAllConversations()\n\n// Remove specific conversation and agent\nawait storageAdapter.deleteConversation(\"conv-1\")\n```\n\n## License\n\n[MIT](../../LICENSE) © Hypermode\n","readmeFilename":"README.md"}