/** * Storage Adapter Interface * * Every adapter implements this async interface. * SQLite adapters wrap sync calls in Promises for uniformity. * * Item shape: * @typedef {Object} Item * @property {string} id * @property {string} type - 'url' | 'text' | 'tagset' | 'image' * @property {string|null} content * @property {string|null} metadata - JSON string * @property {string} syncId * @property {string} syncSource * @property {number} syncedAt - Unix ms * @property {number} createdAt - Unix ms * @property {number} updatedAt - Unix ms * @property {number} deletedAt - Unix ms, 0 = active * * Tag shape: * @typedef {Object} Tag * @property {string|number} id * @property {string} name * @property {number} frequency * @property {number} lastUsed - Unix ms * @property {number} frecencyScore * @property {number} createdAt - Unix ms * @property {number} updatedAt - Unix ms * * Filter shape: * @typedef {Object} ItemFilter * @property {string} [type] * @property {number} [since] - Unix ms, return items with updatedAt > since * @property {boolean} [includeDeleted] * * @interface StorageAdapter */ /** * @method open * @param {Object} [config] * @returns {Promise} */ /** * @method close * @returns {Promise} */ // ==================== Items ==================== /** * @method getItem * @param {string} id * @returns {Promise} - null if not found or soft-deleted */ /** * @method getItems * @param {ItemFilter} [filter] * @returns {Promise} */ /** * @method insertItem * @param {Item} item - Complete item object with id already assigned * @returns {Promise} */ /** * @method updateItem * @param {string} id * @param {Partial} fields - Only provided fields are updated (undefined values skipped) * @returns {Promise} */ /** * @method deleteItem * @param {string} id - Soft delete: sets deletedAt * @returns {Promise} */ /** * @method hardDeleteItem * @param {string} id - Physical delete from storage * @returns {Promise} */ // ==================== Tags ==================== /** * @method getTag * @param {string|number} id * @returns {Promise} */ /** * @method getTagByName * @param {string} name - Case-insensitive match * @returns {Promise} */ /** * @method insertTag * @param {Tag} tag - Complete tag object with id already assigned * @returns {Promise} */ /** * @method updateTag * @param {string|number} id * @param {Partial} fields - Only provided fields are updated * @returns {Promise} */ // ==================== Item-Tags ==================== /** * @method getItemTags * @param {string} itemId * @returns {Promise} */ /** * @method getItemsByTag * @param {string|number} tagId * @returns {Promise} */ /** * @method tagItem * @param {string} itemId * @param {string|number} tagId * @returns {Promise} */ /** * @method untagItem * @param {string} itemId * @param {string|number} tagId * @returns {Promise} */ /** * @method clearItemTags * @param {string} itemId - Remove all tag associations for this item * @returns {Promise} */ // ==================== Settings ==================== /** * @method getSetting * @param {string} key * @returns {Promise} */ /** * @method setSetting * @param {string} key * @param {string} value * @returns {Promise} */ // ==================== Query Helpers ==================== /** * @method findItemBySyncId * @param {string} syncId - Checks both item.id and item.syncId fields * @returns {Promise} */ /** * @method getAllTags * @returns {Promise} */