@oscardvs/zoteus
Advanced tools
@@ -10,2 +10,15 @@ import type { WebApiClient, LibraryRef } from './web-client.js'; | ||
| } | ||
| export interface UploadBytesOptions { | ||
| bytes: Uint8Array; | ||
| /** Bare file name to store under; Zotero joins it onto the storage directory. */ | ||
| filename: string; | ||
| parentItem?: string; | ||
| title?: string; | ||
| contentType?: string; | ||
| linkMode?: string; | ||
| /** Where the bytes came from. Kept on the attachment, and implies `imported_url`. */ | ||
| url?: string; | ||
| /** Modification time in ms since the epoch; defaults to now for in-memory bytes. */ | ||
| mtime?: number; | ||
| } | ||
| export interface UploadResult { | ||
@@ -16,2 +29,10 @@ key: string; | ||
| } | ||
| /** | ||
| * Run the full 5-step Zotero File Storage upload for bytes already in memory. | ||
| * | ||
| * This is the only file-write path that works without the Zotero desktop app, so it is | ||
| * what a remote/hosted Zoteus uses: the desktop local API listens on the *user's* | ||
| * loopback interface, which a server elsewhere has no route to. | ||
| */ | ||
| export declare function uploadAttachmentBytes(web: WebApiClient, lib: LibraryRef, opts: UploadBytesOptions): Promise<UploadResult>; | ||
| /** Run the full 5-step Zotero File Storage upload for a local file. */ | ||
@@ -18,0 +39,0 @@ export declare function uploadFile(web: WebApiClient, lib: LibraryRef, opts: UploadOptions): Promise<UploadResult>; |
@@ -30,14 +30,20 @@ import { createHash } from 'node:crypto'; | ||
| } | ||
| /** Run the full 5-step Zotero File Storage upload for a local file. */ | ||
| export async function uploadFile(web, lib, opts) { | ||
| const bytes = new Uint8Array(await readFile(opts.filePath)); | ||
| const st = await stat(opts.filePath); | ||
| const filename = basename(opts.filePath); | ||
| /** | ||
| * Run the full 5-step Zotero File Storage upload for bytes already in memory. | ||
| * | ||
| * This is the only file-write path that works without the Zotero desktop app, so it is | ||
| * what a remote/hosted Zoteus uses: the desktop local API listens on the *user's* | ||
| * loopback interface, which a server elsewhere has no route to. | ||
| */ | ||
| export async function uploadAttachmentBytes(web, lib, opts) { | ||
| const { bytes, filename } = opts; | ||
| const md5 = createHash('md5').update(bytes).digest('hex'); | ||
| const mtime = Math.floor(st.mtimeMs); | ||
| const mtime = opts.mtime ?? Date.now(); | ||
| const contentType = opts.contentType ?? guessContentType(filename); | ||
| // Step 1: create the attachment item. | ||
| // Step 1: create the attachment item. A file fetched from the web is an | ||
| // `imported_url` (what Zotero itself records for a downloaded PDF), which keeps the | ||
| // source URL on the attachment; bytes read off disk stay `imported_file`. | ||
| const itemObj = { | ||
| itemType: 'attachment', | ||
| linkMode: opts.linkMode ?? 'imported_file', | ||
| linkMode: opts.linkMode ?? (opts.url ? 'imported_url' : 'imported_file'), | ||
| title: opts.title ?? filename, | ||
@@ -49,2 +55,4 @@ filename, | ||
| itemObj.parentItem = opts.parentItem; | ||
| if (opts.url) | ||
| itemObj.url = opts.url; | ||
| const created = await web.writeItems(lib, [itemObj]); | ||
@@ -68,2 +76,16 @@ if (!created.successful.length) { | ||
| } | ||
| /** Run the full 5-step Zotero File Storage upload for a local file. */ | ||
| export async function uploadFile(web, lib, opts) { | ||
| const bytes = new Uint8Array(await readFile(opts.filePath)); | ||
| const st = await stat(opts.filePath); | ||
| return uploadAttachmentBytes(web, lib, { | ||
| bytes, | ||
| filename: basename(opts.filePath), | ||
| mtime: Math.floor(st.mtimeMs), | ||
| parentItem: opts.parentItem, | ||
| title: opts.title, | ||
| contentType: opts.contentType, | ||
| linkMode: opts.linkMode, | ||
| }); | ||
| } | ||
| export async function downloadFile(web, lib, key, savePath) { | ||
@@ -70,0 +92,0 @@ const { bytes, contentType } = await web.downloadFileBytes(lib, key); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/api/attachments.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/api/attachments.ts"],"names":[],"mappings":"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"} |
| import type { ToolContext } from '../../registry/registry.js'; | ||
| import type { LibraryRef } from '../../api/web-client.js'; | ||
| /** | ||
@@ -33,2 +34,33 @@ * Zotero rejects anything that is not a bare file name, since it joins the value onto | ||
| /** | ||
| * Resolve everything a store needs from either a local path or a URL: the bytes, a bare | ||
| * file name Zotero will accept, and a settled MIME type. Shared so `path` and `url` | ||
| * behave identically whichever backend the attachment ends up on. | ||
| * | ||
| * `titleHint` names the file when the URL yields nothing usable (a trailing-slash URL), | ||
| * and the extension implied by the content type is appended when the name carries none, | ||
| * since arXiv-style PDF URLs do not carry one. | ||
| */ | ||
| export declare function readAttachmentSource(ctx: Pick<ToolContext, 'fetcher'>, src: { | ||
| path?: string; | ||
| url?: string; | ||
| filename?: string; | ||
| contentType?: string; | ||
| titleHint?: string; | ||
| fallbackType?: string; | ||
| }): Promise<{ | ||
| bytes: Uint8Array; | ||
| filename: string; | ||
| contentType: string; | ||
| }>; | ||
| /** | ||
| * The attachment item was created but its bytes never landed. Kept distinct from a | ||
| * failure before creation, so callers know that retrying elsewhere would leave an empty | ||
| * attachment behind rather than being a clean second attempt. | ||
| */ | ||
| export declare class AttachmentUploadError extends Error { | ||
| readonly attachmentKey: string; | ||
| readonly reason: unknown; | ||
| constructor(attachmentKey: string, reason: unknown); | ||
| } | ||
| /** | ||
| * Create an `imported_file` attachment under `parent` and store the bytes on it | ||
@@ -46,1 +78,21 @@ * (authorize -> POST bytes -> register). Returns the new attachment key; throws with a | ||
| }): Promise<string>; | ||
| /** | ||
| * Cloud sibling of `storeLocalAttachment`: create the attachment under `parent` and push | ||
| * the bytes through the Web API's File Storage protocol. Needs an API key with file | ||
| * access and consumes the account's storage quota, but requires nothing running on the | ||
| * user's machine, so it is what remote deployments and group libraries use. | ||
| * | ||
| * Returns the new key plus whether Zotero already had those exact bytes in storage, in | ||
| * which case the upload short-circuits and only the item is new. | ||
| */ | ||
| export declare function storeCloudAttachment(ctx: Pick<ToolContext, 'web'>, lib: LibraryRef, file: { | ||
| parent?: string; | ||
| bytes: Uint8Array; | ||
| filename: string; | ||
| contentType: string; | ||
| title?: string; | ||
| url?: string; | ||
| }): Promise<{ | ||
| key: string; | ||
| exists: boolean; | ||
| }>; |
@@ -1,11 +0,19 @@ | ||
| import { guessContentType } from '../../api/attachments.js'; | ||
| import { readFile } from 'node:fs/promises'; | ||
| import { guessContentType, uploadAttachmentBytes } from '../../api/attachments.js'; | ||
| /** | ||
| * Shared plumbing for storing a file as an `imported_file` attachment through the | ||
| * Zotero 10+ desktop local API: download the bytes, create the attachment item under | ||
| * a parent, then push the bytes with the local API's 3-phase upload. | ||
| * Shared plumbing for storing a file as a child attachment: resolve the bytes (from a | ||
| * local path or a URL), create the attachment item under a parent, then push the bytes | ||
| * with the 3-phase upload both Zotero backends implement. | ||
| * | ||
| * Used by `zotero_attach_file` and by `zotero_import`'s local-API save path | ||
| * (`attach_url`), which would otherwise duplicate the same dance. The connector | ||
| * protocol has its own equivalent (a single saveAttachment call inside the save | ||
| * session), so only the local-API side lives here. | ||
| * Two destinations live here, and callers pick one per request: | ||
| * - `storeLocalAttachment` writes through the Zotero 10+ desktop local API. Preferred | ||
| * when the app is reachable: no cloud key, no storage quota, bytes stay on the box. | ||
| * - `storeCloudAttachment` writes through the Web API's File Storage protocol. The | ||
| * only option when Zoteus runs somewhere the user's desktop is not, which is every | ||
| * hosted/remote deployment. | ||
| * | ||
| * Used by `zotero_attach_file`, `zotero_attachment`, and `zotero_import`'s `attach_url`, | ||
| * which would otherwise each duplicate the same dance. The connector protocol has its | ||
| * own equivalent (a single saveAttachment call inside the save session), so it is the | ||
| * one path that does not route through here. | ||
| */ | ||
@@ -86,2 +94,51 @@ const GENERIC_TYPE = 'application/octet-stream'; | ||
| /** | ||
| * Resolve everything a store needs from either a local path or a URL: the bytes, a bare | ||
| * file name Zotero will accept, and a settled MIME type. Shared so `path` and `url` | ||
| * behave identically whichever backend the attachment ends up on. | ||
| * | ||
| * `titleHint` names the file when the URL yields nothing usable (a trailing-slash URL), | ||
| * and the extension implied by the content type is appended when the name carries none, | ||
| * since arXiv-style PDF URLs do not carry one. | ||
| */ | ||
| export async function readAttachmentSource(ctx, src) { | ||
| let bytes; | ||
| let inferredName; | ||
| let served; | ||
| if (src.path) { | ||
| bytes = new Uint8Array(await readFile(src.path)); | ||
| inferredName = bareFilename(src.path); | ||
| } | ||
| else if (src.url) { | ||
| const file = await downloadAttachment(ctx, src.url); | ||
| ({ bytes, contentType: served } = file); | ||
| inferredName = file.filename === 'attachment' && src.titleHint ? bareFilename(src.titleHint) : file.filename; | ||
| } | ||
| else { | ||
| throw new Error('Provide `path` or `url`.'); | ||
| } | ||
| const name = bareFilename(src.filename ?? inferredName, inferredName); | ||
| const contentType = resolveContentType(name, { | ||
| explicit: src.contentType, | ||
| served, | ||
| fallback: src.fallbackType, | ||
| }); | ||
| return { bytes, filename: withExtensionFor(name, contentType), contentType }; | ||
| } | ||
| /** | ||
| * The attachment item was created but its bytes never landed. Kept distinct from a | ||
| * failure before creation, so callers know that retrying elsewhere would leave an empty | ||
| * attachment behind rather than being a clean second attempt. | ||
| */ | ||
| export class AttachmentUploadError extends Error { | ||
| attachmentKey; | ||
| reason; | ||
| constructor(attachmentKey, reason) { | ||
| super(`Attachment ${attachmentKey} was created, but storing its bytes failed: ` + | ||
| (reason instanceof Error ? reason.message : String(reason))); | ||
| this.attachmentKey = attachmentKey; | ||
| this.reason = reason; | ||
| this.name = 'AttachmentUploadError'; | ||
| } | ||
| } | ||
| /** | ||
| * Create an `imported_file` attachment under `parent` and store the bytes on it | ||
@@ -112,9 +169,34 @@ * (authorize -> POST bytes -> register). Returns the new attachment key; throws with a | ||
| throw new Error('Local write returned no attachment key.'); | ||
| await ctx.localWrites.uploadFile(attachmentKey, { | ||
| try { | ||
| await ctx.localWrites.uploadFile(attachmentKey, { | ||
| bytes: file.bytes, | ||
| filename: file.filename, | ||
| contentType: file.contentType, | ||
| }); | ||
| } | ||
| catch (e) { | ||
| throw new AttachmentUploadError(attachmentKey, e); | ||
| } | ||
| return attachmentKey; | ||
| } | ||
| /** | ||
| * Cloud sibling of `storeLocalAttachment`: create the attachment under `parent` and push | ||
| * the bytes through the Web API's File Storage protocol. Needs an API key with file | ||
| * access and consumes the account's storage quota, but requires nothing running on the | ||
| * user's machine, so it is what remote deployments and group libraries use. | ||
| * | ||
| * Returns the new key plus whether Zotero already had those exact bytes in storage, in | ||
| * which case the upload short-circuits and only the item is new. | ||
| */ | ||
| export async function storeCloudAttachment(ctx, lib, file) { | ||
| const result = await uploadAttachmentBytes(ctx.web, lib, { | ||
| bytes: file.bytes, | ||
| filename: file.filename, | ||
| contentType: file.contentType, | ||
| parentItem: file.parent, | ||
| title: file.title ?? file.filename, | ||
| url: file.url, | ||
| }); | ||
| return attachmentKey; | ||
| return { key: result.key, exists: result.exists }; | ||
| } | ||
| //# sourceMappingURL=store.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/features/attachments/store.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/features/attachments/store.ts"],"names":[],"mappings":"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"} |
| import type { ToolDefinition } from '../registry/registry.js'; | ||
| /** | ||
| * Attach a file (local path or URL) to an item as a stored (imported_file) | ||
| * attachment. Requires the Zotero desktop app (Zotero 10+ local API writes), since | ||
| * the cloud client here does not implement the storage upload flow. | ||
| * Attach a file (local path or URL) to an item as a stored attachment. | ||
| * | ||
| * Two backends, chosen per call: the Zotero desktop app's local API when it is reachable | ||
| * (Zotero 10+, key-free, no storage quota), otherwise the cloud Web API's File Storage | ||
| * protocol. The cloud path matters most for remote deployments, where the desktop app is | ||
| * on the user's loopback and structurally out of reach; there, `url` is the way in, since | ||
| * the server downloads the bytes itself and never needs a file on its own disk. | ||
| */ | ||
| declare const attachFile: ToolDefinition; | ||
| export default attachFile; |
| import { z } from 'zod'; | ||
| import { readFile } from 'node:fs/promises'; | ||
| import { ok, ensureLocalApi } from '../registry/registry.js'; | ||
| import { AttachmentDownloadError, bareFilename, downloadAttachment, resolveContentType, storeLocalAttachment, } from '../features/attachments/store.js'; | ||
| import { ok, ensureLocalApi, isLocalWritesUnavailable, requireCloudLibrary } from '../registry/registry.js'; | ||
| import { AttachmentDownloadError, AttachmentUploadError, readAttachmentSource, storeCloudAttachment, storeLocalAttachment, } from '../features/attachments/store.js'; | ||
| function err(text) { | ||
| return { content: [{ type: 'text', text }], isError: true }; | ||
| } | ||
| /** | ||
| * Attach a file (local path or URL) to an item as a stored (imported_file) | ||
| * attachment. Requires the Zotero desktop app (Zotero 10+ local API writes), since | ||
| * the cloud client here does not implement the storage upload flow. | ||
| * Attach a file (local path or URL) to an item as a stored attachment. | ||
| * | ||
| * Two backends, chosen per call: the Zotero desktop app's local API when it is reachable | ||
| * (Zotero 10+, key-free, no storage quota), otherwise the cloud Web API's File Storage | ||
| * protocol. The cloud path matters most for remote deployments, where the desktop app is | ||
| * on the user's loopback and structurally out of reach; there, `url` is the way in, since | ||
| * the server downloads the bytes itself and never needs a file on its own disk. | ||
| */ | ||
@@ -13,46 +19,65 @@ const attachFile = { | ||
| title: 'Attach a file (PDF, snapshot) to an item', | ||
| description: 'Add a stored file attachment (e.g. a PDF full text) under an existing item. Give `parent` (the item key) and either `path` (a local file the Zoteus process can read) or `url` (downloaded first). `filename` and `content_type` are inferred when omitted. Runs against the Zotero desktop app\u2019s local API (Zotero 10+; you may be asked once to allow Zoteus write access — choose "Always Allow"). Returns the new attachment key.', | ||
| description: 'Add a stored file attachment (e.g. a PDF full text) under an existing item. Give `parent` (the item key) and either `url` (Zoteus downloads it, then stores it) or `path` (a file on the machine running Zoteus). `filename` and `content_type` are inferred when omitted. Saves through the Zotero desktop app when one is reachable (Zotero 10+ local API; you may be asked once to allow Zoteus write access, choose "Always Allow"), and otherwise through the cloud Web API, which needs ZOTERO_API_KEY with file access and uses your Zotero file-storage quota. `url` works on every setup including a remote/hosted Zoteus that cannot see your desktop, so prefer it over `path` unless the file really is on the server. Returns the new attachment key.', | ||
| inputSchema: { | ||
| parent: z.string().describe('Key of the parent item to attach the file to.'), | ||
| path: z.string().optional().describe('Local filesystem path to the file.'), | ||
| url: z.string().url().optional().describe('URL to download the file from.'), | ||
| path: z.string().optional().describe('Filesystem path to the file, on the machine running Zoteus.'), | ||
| url: z.string().url().optional().describe('URL to download the file from; works on remote/hosted servers.'), | ||
| filename: z.string().optional().describe('File name to store; inferred from path/url if omitted.'), | ||
| content_type: z.string().optional().describe('MIME type; inferred from the extension if omitted (pdf -> application/pdf).'), | ||
| title: z.string().optional().describe('Attachment title, e.g. "Full Text PDF".'), | ||
| library_type: z.enum(['user', 'group']).optional(), | ||
| library_id: z.number().int().optional().describe('Group library to attach in; forces the cloud path.'), | ||
| }, | ||
| annotations: { readOnlyHint: false, openWorldHint: true }, | ||
| handler: async (args, ctx) => { | ||
| if (!ctx.localWrites || !(await ensureLocalApi(ctx))) { | ||
| return { | ||
| content: [{ type: 'text', text: 'Storing files needs Zotero desktop write access, which the local API provides from Zotero 10. Grant it once when Zotero asks (or pre-provision ZOTEUS_LOCAL_API_KEY). On Zotero 9 and earlier, attach files DURING import instead — zotero_import supports `attach_url`, which streams the file into the same save session. Otherwise set ZOTERO_API_KEY and use the cloud flow.' }], | ||
| isError: true, | ||
| }; | ||
| } | ||
| if (!args.path && !args.url) { | ||
| return { content: [{ type: 'text', text: 'Provide `path` or `url`.' }], isError: true }; | ||
| return err('Provide `path` or `url`.'); | ||
| } | ||
| let bytes; | ||
| let inferredName; | ||
| let served; | ||
| if (args.path) { | ||
| bytes = new Uint8Array(await readFile(args.path)); | ||
| inferredName = bareFilename(args.path); | ||
| // Desktop first for the personal library: no cloud key, no quota, bytes never leave | ||
| // the machine. Group libraries the app may not have are cloud-only either way. | ||
| const useLocal = !args.library_id && Boolean(ctx.localWrites) && (await ensureLocalApi(ctx)); | ||
| if (!useLocal && !args.library_id && !ctx.capabilities.cloud) { | ||
| return err('Storing a file needs one of two write paths, and neither is available: the Zotero desktop app (Zotero 10+ with the local API enabled, granted once when Zotero asks), or a cloud API key with file access (ZOTERO_API_KEY). ' + | ||
| 'If Zoteus is running on a different machine than Zotero, only the cloud key can work, since the desktop local API listens on your own loopback address.'); | ||
| } | ||
| else { | ||
| let source; | ||
| try { | ||
| source = await readAttachmentSource(ctx, { | ||
| path: args.path, | ||
| url: args.url, | ||
| filename: args.filename, | ||
| contentType: args.content_type, | ||
| titleHint: args.title, | ||
| }); | ||
| } | ||
| catch (e) { | ||
| if (!(e instanceof AttachmentDownloadError)) | ||
| throw e; | ||
| return err(e.message); | ||
| } | ||
| const { bytes, filename, contentType } = source; | ||
| if (useLocal) { | ||
| try { | ||
| const file = await downloadAttachment(ctx, args.url); | ||
| ({ bytes, contentType: served } = file); | ||
| inferredName = file.filename; | ||
| const attachmentKey = await storeLocalAttachment(ctx, { | ||
| parent: args.parent, | ||
| bytes, | ||
| filename, | ||
| contentType, | ||
| title: args.title, | ||
| url: args.url, | ||
| }); | ||
| return ok({ attachment: attachmentKey, parent: args.parent, filename, bytes: bytes.length, contentType, target: 'local' }, `Attached ${filename} (${bytes.length} bytes) to item ${args.parent} as ${attachmentKey}.`); | ||
| } | ||
| catch (e) { | ||
| if (!(e instanceof AttachmentDownloadError)) | ||
| // Zotero 9 and earlier answer the write endpoints with 404/501. That fails before | ||
| // anything is created, so with a cloud key the same bytes can still go up the Web | ||
| // API instead of dead-ending. A failure after the item exists must not retry: | ||
| // a second attempt would leave the empty first attachment behind. | ||
| if (e instanceof AttachmentUploadError || !isLocalWritesUnavailable(e) || !ctx.capabilities.cloud) | ||
| throw e; | ||
| return { content: [{ type: 'text', text: e.message }], isError: true }; | ||
| ctx.logger.info(`Local-API attachment writes unavailable (${e instanceof Error ? e.message : e}); using the cloud Web API.`); | ||
| } | ||
| } | ||
| const filename = bareFilename(args.filename ?? inferredName, inferredName); | ||
| const contentType = resolveContentType(filename, { explicit: args.content_type, served }); | ||
| // 1) Create the attachment item, 2) upload + register the file bytes. A refusal | ||
| // from Zotero surfaces as a tool error through the registry's error mapping. | ||
| const attachmentKey = await storeLocalAttachment(ctx, { | ||
| const lib = requireCloudLibrary(ctx, args); | ||
| const result = await storeCloudAttachment(ctx, lib, { | ||
| parent: args.parent, | ||
@@ -65,3 +90,13 @@ bytes, | ||
| }); | ||
| return ok({ attachment: attachmentKey, parent: args.parent, filename, bytes: bytes.length, contentType, target: 'local' }, `Attached ${filename} (${bytes.length} bytes) to item ${args.parent} as ${attachmentKey}.`); | ||
| return ok({ | ||
| attachment: result.key, | ||
| parent: args.parent, | ||
| filename, | ||
| bytes: bytes.length, | ||
| contentType, | ||
| target: 'cloud', | ||
| alreadyInStorage: result.exists, | ||
| }, result.exists | ||
| ? `${filename} was already in Zotero file storage; attached to item ${args.parent} as ${result.key}.` | ||
| : `Uploaded ${filename} (${bytes.length} bytes) to Zotero file storage and attached it to item ${args.parent} as ${result.key}.`); | ||
| }, | ||
@@ -68,0 +103,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"attach-file.js","sourceRoot":"","sources":["../../src/tools/attach-file.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"attach-file.js","sourceRoot":"","sources":["../../src/tools/attach-file.ts"],"names":[],"mappings":"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"} |
@@ -6,2 +6,3 @@ import { z } from 'zod'; | ||
| import { uploadFile, downloadFile } from '../api/attachments.js'; | ||
| import { AttachmentDownloadError, readAttachmentSource, storeCloudAttachment } from '../features/attachments/store.js'; | ||
| function err(text) { | ||
@@ -13,6 +14,7 @@ return { content: [{ type: 'text', text }], isError: true }; | ||
| title: 'Zotero attachments (files)', | ||
| description: "Upload, download, or inspect attachment files. `action`: \"upload\" stores a local file as a Zotero attachment using the full File Storage protocol (provide `file_path`; optional `parent_item` to attach it under an item, `title`, `content_type`) and returns the new attachment key; \"download\" fetches an attachment's file to a local path (provide `item_key`; optional `save_path`, default under the Zoteus data dir) and returns the path and byte count; \"info\" returns an attachment item's metadata. File bytes are written to / read from disk — they are never streamed through the conversation. Upload/download use the cloud Web API and your file-storage quota.", | ||
| description: "Upload, download, or inspect attachment files. `action`: \"upload\" stores a file as a Zotero attachment using the full File Storage protocol (provide `url` to have Zoteus fetch it, or `file_path` for a file on the machine running Zoteus; optional `parent_item` to attach it under an item, `title`, `content_type`) and returns the new attachment key; \"download\" fetches an attachment's file to a local path (provide `item_key`; optional `save_path`, default under the Zoteus data dir) and returns the path and byte count; \"info\" returns an attachment item's metadata. File bytes are written to / read from disk, never streamed through the conversation. Upload/download use the cloud Web API and your file-storage quota. When Zoteus runs on a different machine than Zotero, `file_path` refers to the server's disk, so use `url` instead.", | ||
| inputSchema: { | ||
| action: z.enum(['upload', 'download', 'info']), | ||
| file_path: z.string().optional().describe('Local file to upload.'), | ||
| file_path: z.string().optional().describe('File to upload, on the machine running Zoteus.'), | ||
| url: z.string().url().optional().describe('URL to download and upload instead of `file_path`; works on remote/hosted servers.'), | ||
| parent_item: z.string().optional().describe('Parent item key to attach under (upload).'), | ||
@@ -39,4 +41,33 @@ title: z.string().optional(), | ||
| if (args.action === 'upload') { | ||
| if (!args.file_path) | ||
| return err('`file_path` is required for upload.'); | ||
| if (!args.file_path && !args.url) | ||
| return err('`file_path` or `url` is required for upload.'); | ||
| // A URL is fetched here and uploaded from memory, so the bytes never have to exist | ||
| // on the server's disk; a path still goes through the file reader, which picks up | ||
| // the real mtime. | ||
| if (args.url) { | ||
| let source; | ||
| try { | ||
| source = await readAttachmentSource(ctx, { | ||
| url: args.url, | ||
| contentType: args.content_type, | ||
| titleHint: args.title, | ||
| }); | ||
| } | ||
| catch (e) { | ||
| if (!(e instanceof AttachmentDownloadError)) | ||
| throw e; | ||
| return err(e.message); | ||
| } | ||
| const stored = await storeCloudAttachment(ctx, lib, { | ||
| parent: args.parent_item, | ||
| bytes: source.bytes, | ||
| filename: source.filename, | ||
| contentType: source.contentType, | ||
| title: args.title, | ||
| url: args.url, | ||
| }); | ||
| return ok({ key: stored.key, exists: stored.exists, filename: source.filename, bytes: source.bytes.length }, stored.exists | ||
| ? `File already in storage; attachment item ${stored.key} created for ${source.filename}.` | ||
| : `Uploaded ${source.filename} (${source.bytes.length} bytes) as attachment ${stored.key}.`); | ||
| } | ||
| const result = await uploadFile(ctx.web, lib, { | ||
@@ -43,0 +74,0 @@ filePath: args.file_path, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEjE,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,GAAmB;IACjC,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,4BAA4B;IACnC,WAAW,EACT,0pBAA0pB;IAC5pB,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAClE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAChF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAChF,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACxC;IACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;IACzD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO,GAAG,CAAC,kCAAkC,CAAC,CAAC;YACnE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU;gBAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,CAAqB,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE;gBACnF,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAClE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,cAAc,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,WAAW,GAAG,CAAC,CAAC;QAC/H,CAAC;QAED,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE3C,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;gBAC5C,QAAQ,EAAE,IAAI,CAAC,SAAS;gBACxB,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,YAAY;aAC/B,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM;gBACvB,CAAC,CAAC,4CAA4C,MAAM,CAAC,GAAG,gBAAgB,MAAM,CAAC,QAAQ,GAAG;gBAC1F,CAAC,CAAC,YAAY,MAAM,CAAC,QAAQ,kBAAkB,MAAM,CAAC,GAAG,GAAG,CAAC;YAC/D,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;QACxF,CAAC;QAED,WAAW;QACX,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1F,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpE,OAAO,EAAE,CACP,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,EACpE,cAAc,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,QAAQ,GAAG,CAChD,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"} | ||
| {"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"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"} |
+60
-18
| import { z } from 'zod'; | ||
| import { ok, requireCloudLibrary, isLocalWritesUnavailable, ensureLocalApi } from '../registry/registry.js'; | ||
| import { arxivItem, fromScholarWork, parseIdentifier, bareDoi } from '../features/resolve/resolve.js'; | ||
| import { AttachmentDownloadError, bareFilename, downloadAttachment, resolveContentType, storeLocalAttachment, withExtensionFor, } from '../features/attachments/store.js'; | ||
| import { AttachmentDownloadError, downloadAttachment, readAttachmentSource, storeCloudAttachment, storeLocalAttachment, } from '../features/attachments/store.js'; | ||
| function err(text) { | ||
@@ -53,3 +53,3 @@ return { content: [{ type: 'text', text }], isError: true }; | ||
| collection_key: z.string().optional().describe('Collection to add saved items to: an 8-char collection key or a Zotero treeViewID like "C20".'), | ||
| attach_url: z.string().url().optional().describe('File URL (e.g. an arXiv PDF) to download and attach as a stored attachment to the (single) imported item when saving to the desktop app.'), | ||
| attach_url: z.string().url().optional().describe('File URL (e.g. an arXiv PDF) to download and attach as a stored attachment to the (single) imported item. Works on every save path: the desktop app when one is reachable, otherwise the cloud Web API.'), | ||
| attach_title: z.string().optional().describe('Title for the attached file, e.g. "Full Text PDF".'), | ||
@@ -228,4 +228,26 @@ library_type: z.enum(['user', 'group']).optional(), | ||
| const result = await ctx.web.writeItems(lib, payload); | ||
| const created = result.successful.map((s) => s.key); | ||
| // The cloud has its own file-storage upload, so attach_url is not desktop-only: the | ||
| // bytes are fetched here and pushed to Zotero storage. As on the desktop paths, a | ||
| // failure degrades to a warning, since the items are already saved and re-running | ||
| // would duplicate them. | ||
| let attached; | ||
| let warning; | ||
| if (args.attach_url) { | ||
| if (!created[0]) { | ||
| warning = `No item key came back from the save, so ${args.attach_url} was not attached.`; | ||
| } | ||
| else { | ||
| try { | ||
| attached = await attachUrlToCloud(ctx, lib, created[0], args.attach_url, args.attach_title); | ||
| } | ||
| catch (e) { | ||
| const why = e instanceof Error ? e.message : String(e); | ||
| ctx.logger.warn(`Attaching ${args.attach_url} to ${created[0]} failed: ${why}`); | ||
| warning = `Item saved, but attaching ${args.attach_url} failed: ${why}`; | ||
| } | ||
| } | ||
| } | ||
| return ok({ | ||
| created: result.successful.map((s) => s.key), | ||
| created, | ||
| failed: result.failed, | ||
@@ -235,25 +257,28 @@ resolved: payload.length, | ||
| target: 'cloud', | ||
| warning: args.attach_url ? 'attach_url is only supported for desktop-app saves; the file was not attached.' : undefined, | ||
| }, `Imported ${result.successful.length} of ${payload.length} resolved item(s) via ${source} into the library.`); | ||
| attached, | ||
| warning, | ||
| }, `Imported ${result.successful.length} of ${payload.length} resolved item(s) via ${source} into the library` + | ||
| (attached ? `, with ${attached.bytes}-byte ${attached.filename} attached` : '') + | ||
| '.' + | ||
| (warning ? ` ${warning}` : '')); | ||
| } | ||
| export default importTool; | ||
| /** | ||
| * Fetch `attach_url` the way both non-connector save paths need it. attach_url is | ||
| * documented as a full-text file (typically a PDF), so that is the content type assumed | ||
| * when neither the server nor the URL says what it is, and `attach_title` names the file | ||
| * when the URL yields nothing usable. | ||
| */ | ||
| function fetchAttachUrl(ctx, url, title) { | ||
| return readAttachmentSource(ctx, { url, titleHint: title, fallbackType: 'application/pdf' }); | ||
| } | ||
| /** | ||
| * Local-API equivalent of the connector protocol's in-session saveAttachment: download | ||
| * `attach_url` and store it as an `imported_file` child of the item just saved. | ||
| * | ||
| * `attach_title` names the attachment (the connector path defaults to "Full Text PDF"); | ||
| * the stored file name comes from the URL, since Zotero needs a bare name and titles may | ||
| * contain path separators. arXiv-style URLs carry no extension, so one is appended from | ||
| * the content type. | ||
| */ | ||
| async function attachUrlLocally(ctx, parent, url, title) { | ||
| const file = await downloadAttachment(ctx, url); | ||
| const name = file.filename === 'attachment' && title ? bareFilename(title) : file.filename; | ||
| // attach_url is documented as a full-text file (typically a PDF); fall back to that | ||
| // when neither the server nor the URL says what it is. | ||
| const contentType = resolveContentType(name, { served: file.contentType, fallback: 'application/pdf' }); | ||
| const filename = withExtensionFor(name, contentType); | ||
| const { bytes, filename, contentType } = await fetchAttachUrl(ctx, url, title); | ||
| const key = await storeLocalAttachment(ctx, { | ||
| parent, | ||
| bytes: file.bytes, | ||
| bytes, | ||
| filename, | ||
@@ -264,5 +289,22 @@ contentType, | ||
| }); | ||
| return { key, bytes: file.bytes.length, contentType, filename }; | ||
| return { key, bytes: bytes.length, contentType, filename }; | ||
| } | ||
| /** | ||
| * Cloud equivalent of the same step, for saves that did not go through the desktop app: | ||
| * push the downloaded bytes into Zotero file storage under the item just created. This | ||
| * is the only attach path a remote/hosted Zoteus has, since it cannot reach the desktop. | ||
| */ | ||
| async function attachUrlToCloud(ctx, lib, parent, url, title) { | ||
| const { bytes, filename, contentType } = await fetchAttachUrl(ctx, url, title); | ||
| const stored = await storeCloudAttachment(ctx, lib, { | ||
| parent, | ||
| bytes, | ||
| filename, | ||
| contentType, | ||
| title: title ?? 'Full Text PDF', | ||
| url, | ||
| }); | ||
| return { key: stored.key, bytes: bytes.length, contentType, filename, alreadyInStorage: stored.exists }; | ||
| } | ||
| /** | ||
| * Resolve a caller-supplied collection to the connector protocol's treeViewID | ||
@@ -269,0 +311,0 @@ * ("L1" for My Library, "C<id>" for collections). Accepts a treeViewID directly, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/tools/import.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/tools/import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAqB,MAAM,gCAAgC,CAAC;AACzH,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;AAG1C,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAAC,GAAgB,EAAE,EAAU;IACxD,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,oBAAoB,EAAE,+IAA+I,CACtK,CAAC;IACJ,CAAC;IACD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/H,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAC9E,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC5C,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,IAAI,CAAC,CAAC;YAC1E,OAAO,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACpE,CAAC;QACD,KAAK,MAAM;YACT,MAAM,IAAI,KAAK,CAAC,iIAAiI,CAAC,CAAC;QACrJ,KAAK,MAAM;YACT,MAAM,IAAI,KAAK,CAAC,iIAAiI,CAAC,CAAC;QACrJ,KAAK,SAAS;YACZ,MAAM,IAAI,KAAK,CAAC,wIAAwI,CAAC,CAAC;QAC5J;YACE,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAmB;IACjC,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,mCAAmC;IAC1C,WAAW,EACT,46BAA46B;IAC96B,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QAC5G,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QAC3F,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mIAAmI,CAAC;QACrL,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+FAA+F,CAAC;QAC/I,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yMAAyM,CAAC;QAC3P,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QAClG,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACxC;IACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;IACzD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9B,gFAAgF;YAChF,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO,GAAG,CACR,6CAA6C,GAAG,CAAC,MAAM,CAAC,oBAAoB,0KAA0K,CACvP,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CACR,6CAA6C,GAAG,CAAC,MAAM,CAAC,oBAAoB,0NAA0N,CACvS,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,OAAO,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAChF,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC5D,IAAI,KAAK,CAAC,MAAM;oBAAE,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC;YACnF,CAAC;YACD,6EAA6E;YAC7E,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrE,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,SAAS;QACT,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,OAAO,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,EAAE,CACP,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAC7B,mIAAmI,CACpI,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,GAAG,CAAC,qBAAqB,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QAChE,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC;IACjE,CAAC;CACF,CAAC;AAEF,yEAAyE;AACzE,KAAK,UAAU,SAAS,CAAC,GAAgB,EAAE,IAAS,EAAE,KAAY,EAAE,MAAc;IAChF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAChC,GAAG,EAAE;QACL,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACpE,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,OAAO,EAAE,CACP,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAC/D,YAAY,OAAO,CAAC,MAAM,gBAAgB,MAAM,0BAA0B,CAC3E,CAAC;IACJ,CAAC;IACD,yEAAyE;IACzE,4CAA4C;IAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,KAAK,MAAM,EAAE,IAAI,OAAO;oBAAE,EAAE,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9F,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACpD,iFAAiF;YACjF,+EAA+E;YAC/E,6EAA6E;YAC7E,wEAAwE;YACxE,IAAI,QAA2F,CAAC;YAChG,IAAI,OAA2B,CAAC;YAChC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChB,OAAO,GAAG,2CAA2C,IAAI,CAAC,UAAU,oBAAoB,CAAC;gBAC3F,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC;wBACH,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBACzF,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBACvD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,OAAO,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;wBAChF,OAAO,GAAG,6BAA6B,IAAI,CAAC,UAAU,YAAY,GAAG,EAAE,CAAC;oBAC1E,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CACP,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EACxG,YAAY,MAAM,CAAC,UAAU,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,yBAAyB,MAAM,oCAAoC;gBAC1H,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,KAAK,SAAS,QAAQ,CAAC,QAAQ,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,GAAG;gBACH,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACjC,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,CAAC;YAC1C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,eAAe,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC3E,gFAAgF;QAChF,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE;YAChF,GAAG,EAAE,wBAAwB;SAC9B,CAAC,CAAC;QACH,IAAI,QAA4B,CAAC;QACjC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBACjE,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,GAAG,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC/D,QAAQ,GAAG,MAAM,CAAC;gBACpB,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,EAAE,CACP,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EACvF,SAAS,QAAQ,CAAC,MAAM,gBAAgB,MAAM,kCAAkC,IAAI,CAAC,cAAc,MAAM,CAAC,EAAE,CAC7G,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,QAA4D,CAAC;QACjE,IAAI,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,IAAiD,CAAC;YACtD,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,CAAC,CAAC,YAAY,uBAAuB,CAAC;oBAAE,MAAM,CAAC,CAAC;gBACrD,OAAO,EAAE,CACP,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC,MAAM,SAAS,IAAI,CAAC,UAAU,EAAE,EAAE,EACzI,SAAS,QAAQ,CAAC,MAAM,gBAAgB,MAAM,iCAAiC,CAAC,CAAC,MAAM,IAAI,CAC5F,CAAC;YACJ,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,iBAAiB,CAAC;YAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,MAAM,GAAG,CAAC,eAAe,CAAC,cAAc,CAAC;gBACvC,SAAS;gBACT,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;gBAClC,GAAG,EAAE,IAAI,CAAC,UAAU;gBACpB,KAAK,EAAE,IAAI,CAAC,YAAY,IAAI,eAAe;gBAC3C,KAAK;gBACL,WAAW;aACZ,CAAC,CAAC;YACH,QAAQ,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QAClD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvD,OAAO,EAAE,CACP;YACE,SAAS;YACT,OAAO;YACP,QAAQ,EAAE,QAAQ,CAAC,MAAM;YACzB,MAAM;YACN,MAAM,EAAE,SAAS;YACjB,QAAQ;YACR,QAAQ;YACR,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;gBACpC,CAAC,CAAC,4EAA4E;gBAC9E,CAAC,CAAC,SAAS;SACd,EACD,YAAY,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,yBAAyB,MAAM,sCAAsC;YAChH,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,KAAK,MAAM,EAAE,IAAI,OAAO;YAAE,EAAE,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,GAA2C,CAAC;IAChD,IAAI,CAAC;QACH,GAAG,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,0HAA0H;iBACtK,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,oFAAoF;IACpF,kFAAkF;IAClF,kFAAkF;IAClF,wBAAwB;IACxB,IAAI,QAAsH,CAAC;IAC3H,IAAI,OAA2B,CAAC;IAChC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,2CAA2C,IAAI,CAAC,UAAU,oBAAoB,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9F,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,OAAO,OAAO,CAAC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;gBAChF,OAAO,GAAG,6BAA6B,IAAI,CAAC,UAAU,YAAY,GAAG,EAAE,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CACP;QACE,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,OAAO,CAAC,MAAM;QACxB,MAAM;QACN,MAAM,EAAE,OAAO;QACf,QAAQ;QACR,OAAO;KACR,EACD,YAAY,MAAM,CAAC,UAAU,CAAC,MAAM,OAAO,OAAO,CAAC,MAAM,yBAAyB,MAAM,mBAAmB;QACzG,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,KAAK,SAAS,QAAQ,CAAC,QAAQ,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG;QACH,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACjC,CAAC;AACJ,CAAC;AAED,eAAe,UAAU,CAAC;AAE1B;;;;;GAKG;AACH,SAAS,cAAc,CAAC,GAAgB,EAAE,GAAW,EAAE,KAAc;IACnE,OAAO,oBAAoB,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAC7B,GAAgB,EAChB,MAAc,EACd,GAAW,EACX,KAAc;IAEd,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE;QAC1C,MAAM;QACN,KAAK;QACL,QAAQ;QACR,WAAW;QACX,KAAK,EAAE,KAAK,IAAI,eAAe;QAC/B,GAAG;KACJ,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,gBAAgB,CAC7B,GAAgB,EAChB,GAAe,EACf,MAAc,EACd,GAAW,EACX,KAAc;IAEd,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE;QAClD,MAAM;QACN,KAAK;QACL,QAAQ;QACR,WAAW;QACX,KAAK,EAAE,KAAK,IAAI,eAAe;QAC/B,GAAG;KACJ,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC1G,CAAC;AAGD;;;;GAIG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAgB,EAAE,aAAqB;IACtE,IAAI,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;QAAE,OAAO,aAAa,CAAC;IAC1D,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI;SAC3B,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;SAC7B,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,aAAa,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,aAAa,4BAA4B,CAAC,CAAC;IACzF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,CAAC,eAAgB,CAAC,qBAAqB,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,CAAC,IAAI,YAAY,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yCAAyC,CACjI,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACvB,CAAC;AAED,wFAAwF;AACxF,KAAK,UAAU,iBAAiB,CAAC,GAAgB,EAAE,IAA+B;IAChF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,KAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAS,CAAC,CAAC;YACnG,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACrB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;QACD,IAAI,MAAM,CAAC,IAAI;YAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"} |
+1
-1
| { | ||
| "name": "@oscardvs/zoteus", | ||
| "version": "1.4.2", | ||
| "version": "1.5.0", | ||
| "description": "The everything Zotero MCP server — complete Zotero Web API v3 + desktop local API for Claude and any MCP client.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
858640
2.32%10666
2.79%