diff --git a/dist/bundle/index.d.ts b/dist/bundle/index.d.ts index 5291d68..5398ae1 100644 --- a/dist/bundle/index.d.ts +++ b/dist/bundle/index.d.ts @@ -22,6 +22,7 @@ export * from './tools/write_record.js'; export * from './tools/unlink_record.js'; export * from './tools/list_reports.js'; export * from './tools/download_report.js'; +export * from './tools/download_file.js'; export * from './tools/get_info.js'; export * from './tools/get_environment.js'; export * from './tools/trace_ui_path.js'; diff --git a/dist/bundle/index.js b/dist/bundle/index.js index c7e2946..def2ad9 100644 --- a/dist/bundle/index.js +++ b/dist/bundle/index.js @@ -8068,7 +8068,7 @@ function escapeJsonPtr(str) { /***/ }), -/***/ 6906: +/***/ 4525: /***/ (function(module, __unused_webpack_exports, __nccwpck_require__) { // Generated by CoffeeScript 1.10.0 @@ -8237,7 +8237,7 @@ function escapeJsonPtr(str) { XMLDTDAttList = __nccwpck_require__(3742); - XMLDTDEntity = __nccwpck_require__(6906); + XMLDTDEntity = __nccwpck_require__(4525); XMLDTDElement = __nccwpck_require__(6189); @@ -8419,7 +8419,7 @@ function escapeJsonPtr(str) { XMLDTDAttList = __nccwpck_require__(3742); - XMLDTDEntity = __nccwpck_require__(6906); + XMLDTDEntity = __nccwpck_require__(4525); XMLDTDElement = __nccwpck_require__(6189); @@ -9467,7 +9467,7 @@ function escapeJsonPtr(str) { XMLDTDElement = __nccwpck_require__(6189); - XMLDTDEntity = __nccwpck_require__(6906); + XMLDTDEntity = __nccwpck_require__(4525); XMLDTDNotation = __nccwpck_require__(7083); @@ -9752,7 +9752,7 @@ function escapeJsonPtr(str) { XMLDTDElement = __nccwpck_require__(6189); - XMLDTDEntity = __nccwpck_require__(6906); + XMLDTDEntity = __nccwpck_require__(4525); XMLDTDNotation = __nccwpck_require__(7083); @@ -38612,6 +38612,18 @@ const DOWNLOAD_REPORT_SCHEMA = { }, required: ["model", "id", "report_name"], }; +const DOWNLOAD_FILE_SCHEMA = { + type: "object", + properties: { + model: { type: "string", description: "Technical name of the Odoo model containing the binary field (defaults to 'ir.attachment')." }, + res_id: { type: "number", description: "Database ID of the record containing the file field." }, + field: { type: "string", description: "The technical name of the binary field (e.g., 'datas' or 'raw', defaults to 'datas')." }, + destination_path: { type: "string", description: "Absolute local file path where the file should be saved." }, + justification: { type: "string", description: "Business justification for downloading this file." }, + instance_alias: { type: "string", description: "Optional alias to use an instance other than the active one." }, + }, + required: ["res_id", "destination_path", "justification"], +}; const GET_INFO_SCHEMA = { type: "object", properties: {}, @@ -40354,6 +40366,56 @@ async function downloadReport(manager, input) { return destination_path; } +;// CONCATENATED MODULE: ./src/tools/download_file.ts + + + +/** + * Zod schema for download_file tool input. + */ +const DownloadFileSchema = schemas_object({ + model: classic_schemas_string().default('ir.attachment').describe('Technical name of the Odoo model containing the binary field.'), + res_id: classic_coerce_number().describe('Database ID of the record containing the file field.'), + field: classic_schemas_string().default('datas').describe('The technical name of the binary field (e.g., "datas" or "raw").'), + destination_path: classic_schemas_string().describe('Absolute local file path where the file should be saved.'), + justification: classic_schemas_string().min(1).describe('Business justification for downloading this file.'), + instance_alias: classic_schemas_string().optional().describe('Optional alias of the Odoo instance to use.'), +}); +/** + * Tool to download any file or attachment from an Odoo database to the local workspace. + * @param manager The InstanceManager instance. + * @param input The DownloadFileInput parameters. + * @returns The absolute path to the saved file. + */ +async function downloadFile(manager, input) { + // Validate and parse the input using the schema to populate defaults + const parsedInput = DownloadFileSchema.parse(input); + const { model, res_id, field, destination_path, justification, instance_alias } = parsedInput; + const client = await manager.getClient(instance_alias); + const audit = await manager.getAudit(instance_alias); + if (!(0,external_path_.isAbsolute)(destination_path)) { + throw new Error(`The destination_path must be an absolute path: ${destination_path}`); + } + // Fetch only the requested binary field + const records = await client.executeKw(model, 'read', [[res_id], [field]]); + if (!records || !records[0]) { + throw new Error(`Record with ID ${res_id} not found in model ${model}`); + } + const record = records[0]; + const base64Data = record[field]; + if (base64Data === undefined || base64Data === null || base64Data === false || base64Data === '') { + throw new Error(`Field '${field}' is empty or not present on record ${res_id} in model ${model}`); + } + if (typeof base64Data !== 'string') { + throw new Error(`Field '${field}' on record ${res_id} in model ${model} did not return a valid base64-encoded string (got type ${typeof base64Data}).`); + } + const buffer = Buffer.from(base64Data, 'base64'); + await (0,promises_.writeFile)(destination_path, buffer); + // Log the action for traceability + await audit.logSystemEvent(`Downloaded file from model '${model}' ID ${res_id} field '${field}' to '${destination_path}': ${justification}`); + return destination_path; +} + ;// CONCATENATED MODULE: external "fs" const external_fs_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("fs"); var external_fs_default = /*#__PURE__*/__nccwpck_require__.n(external_fs_namespaceObject); @@ -40710,6 +40772,7 @@ async function getAuditLog(manager, input) { + // The extension manifest will typically be handled by the Gemini CLI @@ -40730,7 +40793,7 @@ async function getAuditLog(manager, input) { const mcp_server_dirname = external_path_default().dirname((0,external_url_.fileURLToPath)(import.meta.url)); // Read package.json for metadata -let mcp_server_version = "1.5.0"; +let mcp_server_version = "1.5.1"; try { // Try both possible locations (source vs bundled) const pkgPaths = [ @@ -40863,6 +40926,12 @@ const toolRegistry = { description: "Generate and retrieve report data (e.g., PDFs).", deps: 'manager' }, + download_file: { + handler: downloadFile, + schema: DOWNLOAD_FILE_SCHEMA, + description: "Download any file or attachment from an Odoo database to the local workspace.", + deps: 'manager' + }, get_info: { handler: getInfo, schema: GET_INFO_SCHEMA, diff --git a/dist/bundle/package.json b/dist/bundle/package.json index c90dc11..e3431f0 100644 --- a/dist/bundle/package.json +++ b/dist/bundle/package.json @@ -1 +1 @@ -{"name":"brass-monkey","version":"1.5.0","type":"module","main":"dist/index.js","scripts":{"build":"tsc && npm run bundle","bundle":"ncc build src/mcp-server.ts -o dist/bundle","test":"vitest run","test:watch":"vitest","lint":"eslint src/**/*.ts"},"keywords":["odoo","gemini","gemini-cli","cli","extension","mcp","ai-agent","xml-rpc","erp","crm"],"author":"Actinon","license":"MIT","description":"A high-fidelity Gemini CLI extension and MCP bridge for Odoo ERP/CRM.","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","keytar":"^7.9.0","xmlrpc":"^1.3.2","zod":"^4.3.6","zod-to-json-schema":"^3.25.2"},"devDependencies":{"@types/keytar":"^4.4.0","@types/node":"^25.6.0","@types/xmlrpc":"^1.3.10","@vercel/ncc":"^0.38.4","esbuild":"^0.28.0","typescript":"^6.0.3","vitest":"^4.1.4"}} \ No newline at end of file +{"name":"brass-monkey","version":"1.5.1","type":"module","main":"dist/index.js","scripts":{"build":"tsc && npm run bundle","bundle":"ncc build src/mcp-server.ts -o dist/bundle","test":"vitest run","test:watch":"vitest","lint":"eslint src/**/*.ts"},"keywords":["odoo","gemini","gemini-cli","cli","extension","mcp","ai-agent","xml-rpc","erp","crm"],"author":"Actinon","license":"MIT","description":"A high-fidelity Gemini CLI extension and MCP bridge for Odoo ERP/CRM.","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","keytar":"^7.9.0","xmlrpc":"^1.3.2","zod":"^4.3.6","zod-to-json-schema":"^3.25.2"},"devDependencies":{"@types/keytar":"^4.4.0","@types/node":"^25.6.0","@types/xmlrpc":"^1.3.10","@vercel/ncc":"^0.38.4","esbuild":"^0.28.0","typescript":"^6.0.3","vitest":"^4.1.4"}} \ No newline at end of file diff --git a/dist/bundle/tools/download_file.d.ts b/dist/bundle/tools/download_file.d.ts new file mode 100644 index 0000000..65faafc --- /dev/null +++ b/dist/bundle/tools/download_file.d.ts @@ -0,0 +1,21 @@ +import { z } from 'zod'; +import { InstanceManager } from '../services/instance-manager.js'; +/** + * Zod schema for download_file tool input. + */ +export declare const DownloadFileSchema: z.ZodObject<{ + model: z.ZodDefault; + res_id: z.ZodCoercedNumber; + field: z.ZodDefault; + destination_path: z.ZodString; + justification: z.ZodString; + instance_alias: z.ZodOptional; +}, z.core.$strip>; +export type DownloadFileInput = z.infer; +/** + * Tool to download any file or attachment from an Odoo database to the local workspace. + * @param manager The InstanceManager instance. + * @param input The DownloadFileInput parameters. + * @returns The absolute path to the saved file. + */ +export declare function downloadFile(manager: InstanceManager, input: DownloadFileInput): Promise; diff --git a/dist/bundle/tools/schemas.d.ts b/dist/bundle/tools/schemas.d.ts index 69fa8f3..adba78e 100644 --- a/dist/bundle/tools/schemas.d.ts +++ b/dist/bundle/tools/schemas.d.ts @@ -572,6 +572,36 @@ export declare const DOWNLOAD_REPORT_SCHEMA: { }; required: string[]; }; +export declare const DOWNLOAD_FILE_SCHEMA: { + type: string; + properties: { + model: { + type: string; + description: string; + }; + res_id: { + type: string; + description: string; + }; + field: { + type: string; + description: string; + }; + destination_path: { + type: string; + description: string; + }; + justification: { + type: string; + description: string; + }; + instance_alias: { + type: string; + description: string; + }; + }; + required: string[]; +}; export declare const GET_INFO_SCHEMA: { type: string; properties: {}; diff --git a/dist/index.d.ts b/dist/index.d.ts index 5291d68..5398ae1 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -22,6 +22,7 @@ export * from './tools/write_record.js'; export * from './tools/unlink_record.js'; export * from './tools/list_reports.js'; export * from './tools/download_report.js'; +export * from './tools/download_file.js'; export * from './tools/get_info.js'; export * from './tools/get_environment.js'; export * from './tools/trace_ui_path.js'; diff --git a/dist/index.js b/dist/index.js index 59d64ca..a058176 100644 --- a/dist/index.js +++ b/dist/index.js @@ -24,6 +24,7 @@ export * from './tools/write_record.js'; export * from './tools/unlink_record.js'; export * from './tools/list_reports.js'; export * from './tools/download_report.js'; +export * from './tools/download_file.js'; export * from './tools/get_info.js'; export * from './tools/get_environment.js'; export * from './tools/trace_ui_path.js'; diff --git a/dist/index.js.map b/dist/index.js.map index 8faecc2..bf3d175 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAEhD,QAAQ;AACR,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AAEzC,sEAAsE;AACtE,+DAA+D"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAEhD,QAAQ;AACR,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AAEzC,sEAAsE;AACtE,+DAA+D"} \ No newline at end of file diff --git a/dist/mcp-server.js b/dist/mcp-server.js index e44d9b5..862fb6a 100644 --- a/dist/mcp-server.js +++ b/dist/mcp-server.js @@ -12,7 +12,7 @@ import path from 'path'; import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Read package.json for metadata -let version = "1.5.0"; +let version = "1.5.1"; try { // Try both possible locations (source vs bundled) const pkgPaths = [ @@ -145,6 +145,12 @@ const toolRegistry = { description: "Generate and retrieve report data (e.g., PDFs).", deps: 'manager' }, + download_file: { + handler: tools.downloadFile, + schema: schemas.DOWNLOAD_FILE_SCHEMA, + description: "Download any file or attachment from an Odoo database to the local workspace.", + deps: 'manager' + }, get_info: { handler: tools.getInfo, schema: schemas.GET_INFO_SCHEMA, diff --git a/dist/mcp-server.js.map b/dist/mcp-server.js.map index 9fb206a..d587fd0 100644 --- a/dist/mcp-server.js.map +++ b/dist/mcp-server.js.map @@ -1 +1 @@ -{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tools/download_file.d.ts b/dist/tools/download_file.d.ts new file mode 100644 index 0000000..65faafc --- /dev/null +++ b/dist/tools/download_file.d.ts @@ -0,0 +1,21 @@ +import { z } from 'zod'; +import { InstanceManager } from '../services/instance-manager.js'; +/** + * Zod schema for download_file tool input. + */ +export declare const DownloadFileSchema: z.ZodObject<{ + model: z.ZodDefault; + res_id: z.ZodCoercedNumber; + field: z.ZodDefault; + destination_path: z.ZodString; + justification: z.ZodString; + instance_alias: z.ZodOptional; +}, z.core.$strip>; +export type DownloadFileInput = z.infer; +/** + * Tool to download any file or attachment from an Odoo database to the local workspace. + * @param manager The InstanceManager instance. + * @param input The DownloadFileInput parameters. + * @returns The absolute path to the saved file. + */ +export declare function downloadFile(manager: InstanceManager, input: DownloadFileInput): Promise; diff --git a/dist/tools/download_file.js b/dist/tools/download_file.js new file mode 100644 index 0000000..2a271a3 --- /dev/null +++ b/dist/tools/download_file.js @@ -0,0 +1,49 @@ +import { z } from 'zod'; +import { writeFile } from 'fs/promises'; +import { isAbsolute } from 'path'; +/** + * Zod schema for download_file tool input. + */ +export const DownloadFileSchema = z.object({ + model: z.string().default('ir.attachment').describe('Technical name of the Odoo model containing the binary field.'), + res_id: z.coerce.number().describe('Database ID of the record containing the file field.'), + field: z.string().default('datas').describe('The technical name of the binary field (e.g., "datas" or "raw").'), + destination_path: z.string().describe('Absolute local file path where the file should be saved.'), + justification: z.string().min(1).describe('Business justification for downloading this file.'), + instance_alias: z.string().optional().describe('Optional alias of the Odoo instance to use.'), +}); +/** + * Tool to download any file or attachment from an Odoo database to the local workspace. + * @param manager The InstanceManager instance. + * @param input The DownloadFileInput parameters. + * @returns The absolute path to the saved file. + */ +export async function downloadFile(manager, input) { + // Validate and parse the input using the schema to populate defaults + const parsedInput = DownloadFileSchema.parse(input); + const { model, res_id, field, destination_path, justification, instance_alias } = parsedInput; + const client = await manager.getClient(instance_alias); + const audit = await manager.getAudit(instance_alias); + if (!isAbsolute(destination_path)) { + throw new Error(`The destination_path must be an absolute path: ${destination_path}`); + } + // Fetch only the requested binary field + const records = await client.executeKw(model, 'read', [[res_id], [field]]); + if (!records || !records[0]) { + throw new Error(`Record with ID ${res_id} not found in model ${model}`); + } + const record = records[0]; + const base64Data = record[field]; + if (base64Data === undefined || base64Data === null || base64Data === false || base64Data === '') { + throw new Error(`Field '${field}' is empty or not present on record ${res_id} in model ${model}`); + } + if (typeof base64Data !== 'string') { + throw new Error(`Field '${field}' on record ${res_id} in model ${model} did not return a valid base64-encoded string (got type ${typeof base64Data}).`); + } + const buffer = Buffer.from(base64Data, 'base64'); + await writeFile(destination_path, buffer); + // Log the action for traceability + await audit.logSystemEvent(`Downloaded file from model '${model}' ID ${res_id} field '${field}' to '${destination_path}': ${justification}`); + return destination_path; +} +//# sourceMappingURL=download_file.js.map \ No newline at end of file diff --git a/dist/tools/download_file.js.map b/dist/tools/download_file.js.map new file mode 100644 index 0000000..789eba5 --- /dev/null +++ b/dist/tools/download_file.js.map @@ -0,0 +1 @@ +{"version":3,"file":"download_file.js","sourceRoot":"","sources":["../../src/tools/download_file.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tools/schemas.d.ts b/dist/tools/schemas.d.ts index 69fa8f3..adba78e 100644 --- a/dist/tools/schemas.d.ts +++ b/dist/tools/schemas.d.ts @@ -572,6 +572,36 @@ export declare const DOWNLOAD_REPORT_SCHEMA: { }; required: string[]; }; +export declare const DOWNLOAD_FILE_SCHEMA: { + type: string; + properties: { + model: { + type: string; + description: string; + }; + res_id: { + type: string; + description: string; + }; + field: { + type: string; + description: string; + }; + destination_path: { + type: string; + description: string; + }; + justification: { + type: string; + description: string; + }; + instance_alias: { + type: string; + description: string; + }; + }; + required: string[]; +}; export declare const GET_INFO_SCHEMA: { type: string; properties: {}; diff --git a/dist/tools/schemas.js b/dist/tools/schemas.js index 201c71b..7d9b20d 100644 --- a/dist/tools/schemas.js +++ b/dist/tools/schemas.js @@ -228,6 +228,18 @@ export const DOWNLOAD_REPORT_SCHEMA = { }, required: ["model", "id", "report_name"], }; +export const DOWNLOAD_FILE_SCHEMA = { + type: "object", + properties: { + model: { type: "string", description: "Technical name of the Odoo model containing the binary field (defaults to 'ir.attachment')." }, + res_id: { type: "number", description: "Database ID of the record containing the file field." }, + field: { type: "string", description: "The technical name of the binary field (e.g., 'datas' or 'raw', defaults to 'datas')." }, + destination_path: { type: "string", description: "Absolute local file path where the file should be saved." }, + justification: { type: "string", description: "Business justification for downloading this file." }, + instance_alias: { type: "string", description: "Optional alias to use an instance other than the active one." }, + }, + required: ["res_id", "destination_path", "justification"], +}; export const GET_INFO_SCHEMA = { type: "object", properties: {}, diff --git a/dist/tools/schemas.js.map b/dist/tools/schemas.js.map index 5fc7dc0..500e0f7 100644 --- a/dist/tools/schemas.js.map +++ b/dist/tools/schemas.js.map @@ -1 +1 @@ -{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mHAAmH,EAAE;QAC3J,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2EAA2E,EAAE;QACjH,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+DAA+D,EAAE;QACpG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;QACjF,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qFAAqF,EAAE;KAChI;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sEAAsE,EAAE;KAC/G;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KACvG;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0HAA0H,EAAE;QACxK,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sDAAsD,EAAE;QAC9F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACpG,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mEAAmE,EAAE;QAC3G,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wGAAwG,EAAE;QACrJ,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wDAAwD,EAAE;QACzG,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iFAAiF,EAAE;QAClI,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,+CAA+C,EAAE;QAC/F,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,8EAA8E,EAAE;QAC5H,kBAAkB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gDAAgD,EAAE;QACtG,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sGAAsG,EAAE;QACpJ,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4FAA4F,EAAE;QAC3I,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4DAA4D,EAAE;QAC5G,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wFAAwF,EAAE;QACnI,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uEAAuE,EAAE;QACvH,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iHAAiH,EAAE;QACzJ,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uFAAuF,EAAE;QACnI,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE;QAC9F,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;QAC3F,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4HAA4H,EAAE;QAC1K,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,WAAW,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oDAAoD,EAAE;QAC5F,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;QACpG,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+FAA+F,EAAE;QACzI,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oEAAoE,EAAE;QAC5G,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,kJAAkJ,EAAE;QACrM,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,oGAAoG,EAAE;QACvK,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uDAAuD,EAAE;QAC/F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4DAA4D,EAAE;QACrG,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yDAAyD,EAAE;QACjG,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mFAAmF,EAAE;QACxI,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wFAAwF,EAAE;QAChI,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gEAAgE,EAAE;QACzG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oEAAoE,EAAE;QAC7G,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACxG,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uDAAuD,EAAE;QACxG,kBAAkB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uDAAuD,EAAE;QAC7G,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wCAAwC,EAAE;QACzF,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wCAAwC,EAAE;QACzF,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4CAA4C,EAAE;QAC5F,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACzG,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4CAA4C,EAAE;QAC5F,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4CAA4C,EAAE;QAC9F,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sDAAsD,EAAE;QACzG,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;QACjG,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACvG,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kEAAkE,EAAE;QACvH,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qDAAqD,EAAE;QAC7F,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,6CAA6C,EAAE;QACjH,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,uDAAuD,EAAE;QAC3H,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0BAA0B,EAAE;QACvE,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kCAAkC,EAAE;QACnF,kBAAkB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,mCAAmC,EAAE;QACzF,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wCAAwC,EAAE;QACzF,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wCAAwC,EAAE;QACzF,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4CAA4C,EAAE;QAC5F,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACzG,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4CAA4C,EAAE;QAC5F,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4CAA4C,EAAE;QAC9F,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sDAAsD,EAAE;QACzG,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;QACjG,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACvG,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kEAAkE,EAAE;QACvH,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0DAA0D,EAAE;QAClG,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,mEAAmE,EAAE;QACtH,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,oGAAoG,EAAE;QACxK,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,yGAAyG,EAAE;QAC5K,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;QAC7E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;QACrF,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+EAA+E,EAAE;QACvH,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oDAAoD,EAAE;QAC5F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+FAA+F,EAAE;QACxI,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2GAA2G,EAAE;QAC3J,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0FAA0F,EAAE;QAC/I,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC;IAC9C,WAAW,EAAE,0NAA0N;CACxO,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oDAAoD,EAAE;QAC5F,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAC/E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uGAAuG,EAAE;QAChJ,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+EAA+E,EAAE;QAC/H,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0FAA0F,EAAE;QAC/I,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,CAAC;IACpD,WAAW,EAAE,iNAAiN;CAC/N,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oDAAoD,EAAE;QAC5F,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAC/E,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qGAAqG,EAAE;QACrJ,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC;IAC1C,WAAW,EAAE,sKAAsK;CACpL,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+GAA+G,EAAE;QACvJ,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;QACtE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uDAAuD,EAAE;QAC5F,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8GAA8G,EAAE;QAC5J,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uFAAuF,EAAE;QACrI,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;IACD,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC;CACzC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0GAA0G,EAAE;QAC3J,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iGAAiG,EAAE;QAClJ,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;KAChH;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gEAAgE,EAAE;KAC9G;IACD,QAAQ,EAAE,CAAC,YAAY,CAAC;CACzB,CAAC"} \ No newline at end of file +{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/gemini-extension.json b/gemini-extension.json index e6e287c..e9d0877 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,6 +1,6 @@ { "name": "brass-monkey", - "version": "1.5.0", + "version": "1.5.1", "description": "A high-fidelity Gemini CLI extension and MCP bridge for Odoo ERP/CRM.", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/package.json b/package.json index 22d222a..5d3713e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "brass-monkey", - "version": "1.5.0", + "version": "1.5.1", "type": "module", "main": "dist/index.js", "scripts": { diff --git a/src/index.ts b/src/index.ts index 55ce625..9fbdd1b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,6 +26,7 @@ export * from './tools/write_record.js'; export * from './tools/unlink_record.js'; export * from './tools/list_reports.js'; export * from './tools/download_report.js'; +export * from './tools/download_file.js'; export * from './tools/get_info.js'; export * from './tools/get_environment.js'; export * from './tools/trace_ui_path.js'; diff --git a/src/mcp-server.ts b/src/mcp-server.ts index 400c7bd..180d7e5 100644 --- a/src/mcp-server.ts +++ b/src/mcp-server.ts @@ -20,7 +20,7 @@ import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Read package.json for metadata -let version = "1.5.0"; +let version = "1.5.1"; try { // Try both possible locations (source vs bundled) const pkgPaths = [ @@ -159,6 +159,12 @@ const toolRegistry: Record; + +/** + * Tool to download any file or attachment from an Odoo database to the local workspace. + * @param manager The InstanceManager instance. + * @param input The DownloadFileInput parameters. + * @returns The absolute path to the saved file. + */ +export async function downloadFile(manager: InstanceManager, input: DownloadFileInput) { + // Validate and parse the input using the schema to populate defaults + const parsedInput = DownloadFileSchema.parse(input); + const { model, res_id, field, destination_path, justification, instance_alias } = parsedInput; + + const client = await manager.getClient(instance_alias); + const audit = await manager.getAudit(instance_alias); + + if (!isAbsolute(destination_path)) { + throw new Error(`The destination_path must be an absolute path: ${destination_path}`); + } + + // Fetch only the requested binary field + const records = await client.executeKw(model, 'read', [[res_id], [field]]); + + if (!records || !records[0]) { + throw new Error(`Record with ID ${res_id} not found in model ${model}`); + } + + const record = records[0]; + const base64Data = record[field]; + + if (base64Data === undefined || base64Data === null || base64Data === false || base64Data === '') { + throw new Error(`Field '${field}' is empty or not present on record ${res_id} in model ${model}`); + } + + if (typeof base64Data !== 'string') { + throw new Error(`Field '${field}' on record ${res_id} in model ${model} did not return a valid base64-encoded string (got type ${typeof base64Data}).`); + } + + const buffer = Buffer.from(base64Data, 'base64'); + await writeFile(destination_path, buffer); + + // Log the action for traceability + await audit.logSystemEvent(`Downloaded file from model '${model}' ID ${res_id} field '${field}' to '${destination_path}': ${justification}`); + + return destination_path; +} diff --git a/src/tools/schemas.ts b/src/tools/schemas.ts index b749ddc..ae95fed 100644 --- a/src/tools/schemas.ts +++ b/src/tools/schemas.ts @@ -249,6 +249,19 @@ export const DOWNLOAD_REPORT_SCHEMA = { required: ["model", "id", "report_name"], }; +export const DOWNLOAD_FILE_SCHEMA = { + type: "object", + properties: { + model: { type: "string", description: "Technical name of the Odoo model containing the binary field (defaults to 'ir.attachment')." }, + res_id: { type: "number", description: "Database ID of the record containing the file field." }, + field: { type: "string", description: "The technical name of the binary field (e.g., 'datas' or 'raw', defaults to 'datas')." }, + destination_path: { type: "string", description: "Absolute local file path where the file should be saved." }, + justification: { type: "string", description: "Business justification for downloading this file." }, + instance_alias: { type: "string", description: "Optional alias to use an instance other than the active one." }, + }, + required: ["res_id", "destination_path", "justification"], +}; + export const GET_INFO_SCHEMA = { type: "object", properties: {}, diff --git a/tests/download-file.test.ts b/tests/download-file.test.ts new file mode 100644 index 0000000..1b762dc --- /dev/null +++ b/tests/download-file.test.ts @@ -0,0 +1,99 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { downloadFile } from '../src/tools/download_file.js'; +import * as fs from 'fs/promises'; +import path from 'path'; + +vi.mock('fs/promises', () => ({ + writeFile: vi.fn().mockResolvedValue(undefined), +})); + +describe('Download File Tool', () => { + let mockClient: any; + let mockAudit: any; + let mockManager: any; + + beforeEach(() => { + vi.clearAllMocks(); + mockClient = { + executeKw: vi.fn(), + }; + mockAudit = { + logSystemEvent: vi.fn().mockResolvedValue(true), + }; + mockManager = { + getClient: vi.fn().mockResolvedValue(mockClient), + getAudit: vi.fn().mockResolvedValue(mockAudit), + }; + }); + + it('should retrieve base64 content from Odoo and write it as a local file', async () => { + // Mock Odoo 'read' method returning base64 data for 'datas' + // "test content" base64 is dGVzdCBjb250ZW50 + mockClient.executeKw.mockResolvedValue([{ id: 42, datas: 'dGVzdCBjb250ZW50' }]); + + const destination = path.resolve('/tmp/test-attachment.txt'); + const result = await downloadFile(mockManager, { + model: 'ir.attachment', + res_id: 42, + field: 'datas', + destination_path: destination, + justification: 'Downloading invoice receipt for audit proof', + }); + + expect(mockClient.executeKw).toHaveBeenCalledWith('ir.attachment', 'read', [[42], ['datas']]); + expect(fs.writeFile).toHaveBeenCalledWith(destination, Buffer.from('test content')); + expect(mockAudit.logSystemEvent).toHaveBeenCalledWith( + expect.stringContaining("Downloaded file from model 'ir.attachment' ID 42 field 'datas'") + ); + expect(result).toBe(destination); + }); + + it('should use default values for model and field when omitted', async () => { + mockClient.executeKw.mockResolvedValue([{ id: 42, datas: 'dGVzdCBjb250ZW50' }]); + + const destination = path.resolve('/tmp/test-attachment-default.txt'); + await downloadFile(mockManager, { + res_id: 42, + destination_path: destination, + justification: 'Default check', + }); + + expect(mockClient.executeKw).toHaveBeenCalledWith('ir.attachment', 'read', [[42], ['datas']]); + }); + + it('should throw an error if the record does not exist', async () => { + mockClient.executeKw.mockResolvedValue([]); + + const destination = path.resolve('/tmp/non-existent.txt'); + await expect(downloadFile(mockManager, { + model: 'ir.attachment', + res_id: 999, + field: 'datas', + destination_path: destination, + justification: 'Failure test', + })).rejects.toThrow("Record with ID 999 not found in model ir.attachment"); + }); + + it('should throw an error if the binary field is empty or false', async () => { + mockClient.executeKw.mockResolvedValue([{ id: 42, datas: false }]); + + const destination = path.resolve('/tmp/empty-field.txt'); + await expect(downloadFile(mockManager, { + model: 'ir.attachment', + res_id: 42, + field: 'datas', + destination_path: destination, + justification: 'Failure test empty', + })).rejects.toThrow("Field 'datas' is empty or not present on record 42 in model ir.attachment"); + }); + + it('should throw an error for a relative path', async () => { + await expect(downloadFile(mockManager, { + model: 'ir.attachment', + res_id: 42, + field: 'datas', + destination_path: 'relative/path.txt', + justification: 'Failure test path', + })).rejects.toThrow("must be an absolute path"); + }); +});