@mcp-z/mcp-sheets 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +181 -0
- package/bin/server.js +5 -0
- package/dist/cjs/constants.d.cts +7 -0
- package/dist/cjs/constants.d.ts +7 -0
- package/dist/cjs/constants.js +18 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/index.d.cts +8 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +314 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/create-store.d.cts +2 -0
- package/dist/cjs/lib/create-store.d.ts +2 -0
- package/dist/cjs/lib/create-store.js +166 -0
- package/dist/cjs/lib/create-store.js.map +1 -0
- package/dist/cjs/mcp/index.d.cts +3 -0
- package/dist/cjs/mcp/index.d.ts +3 -0
- package/dist/cjs/mcp/index.js +66 -0
- package/dist/cjs/mcp/index.js.map +1 -0
- package/dist/cjs/mcp/prompts/a1-notation.d.cts +19 -0
- package/dist/cjs/mcp/prompts/a1-notation.d.ts +19 -0
- package/dist/cjs/mcp/prompts/a1-notation.js +169 -0
- package/dist/cjs/mcp/prompts/a1-notation.js.map +1 -0
- package/dist/cjs/mcp/prompts/index.d.cts +1 -0
- package/dist/cjs/mcp/prompts/index.d.ts +1 -0
- package/dist/cjs/mcp/prompts/index.js +17 -0
- package/dist/cjs/mcp/prompts/index.js.map +1 -0
- package/dist/cjs/mcp/resources/index.d.cts +1 -0
- package/dist/cjs/mcp/resources/index.d.ts +1 -0
- package/dist/cjs/mcp/resources/index.js +17 -0
- package/dist/cjs/mcp/resources/index.js.map +1 -0
- package/dist/cjs/mcp/resources/spreadsheet.d.cts +2 -0
- package/dist/cjs/mcp/resources/spreadsheet.d.ts +2 -0
- package/dist/cjs/mcp/resources/spreadsheet.js +258 -0
- package/dist/cjs/mcp/resources/spreadsheet.js.map +1 -0
- package/dist/cjs/mcp/tools/cells-format.d.cts +144 -0
- package/dist/cjs/mcp/tools/cells-format.d.ts +144 -0
- package/dist/cjs/mcp/tools/cells-format.js +484 -0
- package/dist/cjs/mcp/tools/cells-format.js.map +1 -0
- package/dist/cjs/mcp/tools/chart-create.d.cts +94 -0
- package/dist/cjs/mcp/tools/chart-create.d.ts +94 -0
- package/dist/cjs/mcp/tools/chart-create.js +575 -0
- package/dist/cjs/mcp/tools/chart-create.js.map +1 -0
- package/dist/cjs/mcp/tools/columns-get.d.cts +55 -0
- package/dist/cjs/mcp/tools/columns-get.d.ts +55 -0
- package/dist/cjs/mcp/tools/columns-get.js +289 -0
- package/dist/cjs/mcp/tools/columns-get.js.map +1 -0
- package/dist/cjs/mcp/tools/columns-update.d.cts +86 -0
- package/dist/cjs/mcp/tools/columns-update.d.ts +86 -0
- package/dist/cjs/mcp/tools/columns-update.js +482 -0
- package/dist/cjs/mcp/tools/columns-update.js.map +1 -0
- package/dist/cjs/mcp/tools/csv-get-columns.d.cts +43 -0
- package/dist/cjs/mcp/tools/csv-get-columns.d.ts +43 -0
- package/dist/cjs/mcp/tools/csv-get-columns.js +386 -0
- package/dist/cjs/mcp/tools/csv-get-columns.js.map +1 -0
- package/dist/cjs/mcp/tools/dimensions-batch-update.d.cts +118 -0
- package/dist/cjs/mcp/tools/dimensions-batch-update.d.ts +118 -0
- package/dist/cjs/mcp/tools/dimensions-batch-update.js +504 -0
- package/dist/cjs/mcp/tools/dimensions-batch-update.js.map +1 -0
- package/dist/cjs/mcp/tools/dimensions-move.d.cts +86 -0
- package/dist/cjs/mcp/tools/dimensions-move.d.ts +86 -0
- package/dist/cjs/mcp/tools/dimensions-move.js +359 -0
- package/dist/cjs/mcp/tools/dimensions-move.js.map +1 -0
- package/dist/cjs/mcp/tools/index.d.cts +26 -0
- package/dist/cjs/mcp/tools/index.d.ts +26 -0
- package/dist/cjs/mcp/tools/index.js +122 -0
- package/dist/cjs/mcp/tools/index.js.map +1 -0
- package/dist/cjs/mcp/tools/lib/dimension-operations.d.cts +48 -0
- package/dist/cjs/mcp/tools/lib/dimension-operations.d.ts +48 -0
- package/dist/cjs/mcp/tools/lib/dimension-operations.js +177 -0
- package/dist/cjs/mcp/tools/lib/dimension-operations.js.map +1 -0
- package/dist/cjs/mcp/tools/rows-append.d.cts +58 -0
- package/dist/cjs/mcp/tools/rows-append.d.ts +58 -0
- package/dist/cjs/mcp/tools/rows-append.js +335 -0
- package/dist/cjs/mcp/tools/rows-append.js.map +1 -0
- package/dist/cjs/mcp/tools/rows-csv-append.d.cts +67 -0
- package/dist/cjs/mcp/tools/rows-csv-append.d.ts +67 -0
- package/dist/cjs/mcp/tools/rows-csv-append.js +859 -0
- package/dist/cjs/mcp/tools/rows-csv-append.js.map +1 -0
- package/dist/cjs/mcp/tools/rows-get.d.cts +56 -0
- package/dist/cjs/mcp/tools/rows-get.d.ts +56 -0
- package/dist/cjs/mcp/tools/rows-get.js +292 -0
- package/dist/cjs/mcp/tools/rows-get.js.map +1 -0
- package/dist/cjs/mcp/tools/sheet-copy-to.d.cts +68 -0
- package/dist/cjs/mcp/tools/sheet-copy-to.d.ts +68 -0
- package/dist/cjs/mcp/tools/sheet-copy-to.js +341 -0
- package/dist/cjs/mcp/tools/sheet-copy-to.js.map +1 -0
- package/dist/cjs/mcp/tools/sheet-copy.d.cts +80 -0
- package/dist/cjs/mcp/tools/sheet-copy.d.ts +80 -0
- package/dist/cjs/mcp/tools/sheet-copy.js +394 -0
- package/dist/cjs/mcp/tools/sheet-copy.js.map +1 -0
- package/dist/cjs/mcp/tools/sheet-create.d.cts +56 -0
- package/dist/cjs/mcp/tools/sheet-create.d.ts +56 -0
- package/dist/cjs/mcp/tools/sheet-create.js +283 -0
- package/dist/cjs/mcp/tools/sheet-create.js.map +1 -0
- package/dist/cjs/mcp/tools/sheet-delete.d.cts +62 -0
- package/dist/cjs/mcp/tools/sheet-delete.d.ts +62 -0
- package/dist/cjs/mcp/tools/sheet-delete.js +341 -0
- package/dist/cjs/mcp/tools/sheet-delete.js.map +1 -0
- package/dist/cjs/mcp/tools/sheet-find.d.cts +48 -0
- package/dist/cjs/mcp/tools/sheet-find.d.ts +48 -0
- package/dist/cjs/mcp/tools/sheet-find.js +261 -0
- package/dist/cjs/mcp/tools/sheet-find.js.map +1 -0
- package/dist/cjs/mcp/tools/sheet-rename.d.cts +60 -0
- package/dist/cjs/mcp/tools/sheet-rename.d.ts +60 -0
- package/dist/cjs/mcp/tools/sheet-rename.js +305 -0
- package/dist/cjs/mcp/tools/sheet-rename.js.map +1 -0
- package/dist/cjs/mcp/tools/spreadsheet-copy.d.cts +58 -0
- package/dist/cjs/mcp/tools/spreadsheet-copy.d.ts +58 -0
- package/dist/cjs/mcp/tools/spreadsheet-copy.js +319 -0
- package/dist/cjs/mcp/tools/spreadsheet-copy.js.map +1 -0
- package/dist/cjs/mcp/tools/spreadsheet-create.d.cts +52 -0
- package/dist/cjs/mcp/tools/spreadsheet-create.d.ts +52 -0
- package/dist/cjs/mcp/tools/spreadsheet-create.js +270 -0
- package/dist/cjs/mcp/tools/spreadsheet-create.js.map +1 -0
- package/dist/cjs/mcp/tools/spreadsheet-find.d.cts +58 -0
- package/dist/cjs/mcp/tools/spreadsheet-find.d.ts +58 -0
- package/dist/cjs/mcp/tools/spreadsheet-find.js +334 -0
- package/dist/cjs/mcp/tools/spreadsheet-find.js.map +1 -0
- package/dist/cjs/mcp/tools/spreadsheet-rename.d.cts +56 -0
- package/dist/cjs/mcp/tools/spreadsheet-rename.d.ts +56 -0
- package/dist/cjs/mcp/tools/spreadsheet-rename.js +289 -0
- package/dist/cjs/mcp/tools/spreadsheet-rename.js.map +1 -0
- package/dist/cjs/mcp/tools/validation-set.d.cts +144 -0
- package/dist/cjs/mcp/tools/validation-set.d.ts +144 -0
- package/dist/cjs/mcp/tools/validation-set.js +564 -0
- package/dist/cjs/mcp/tools/validation-set.js.map +1 -0
- package/dist/cjs/mcp/tools/values-batch-update.d.cts +102 -0
- package/dist/cjs/mcp/tools/values-batch-update.d.ts +102 -0
- package/dist/cjs/mcp/tools/values-batch-update.js +409 -0
- package/dist/cjs/mcp/tools/values-batch-update.js.map +1 -0
- package/dist/cjs/mcp/tools/values-clear.d.cts +56 -0
- package/dist/cjs/mcp/tools/values-clear.d.ts +56 -0
- package/dist/cjs/mcp/tools/values-clear.js +308 -0
- package/dist/cjs/mcp/tools/values-clear.js.map +1 -0
- package/dist/cjs/mcp/tools/values-csv-update.d.cts +75 -0
- package/dist/cjs/mcp/tools/values-csv-update.d.ts +75 -0
- package/dist/cjs/mcp/tools/values-csv-update.js +500 -0
- package/dist/cjs/mcp/tools/values-csv-update.js.map +1 -0
- package/dist/cjs/mcp/tools/values-replace.d.cts +68 -0
- package/dist/cjs/mcp/tools/values-replace.d.ts +68 -0
- package/dist/cjs/mcp/tools/values-replace.js +378 -0
- package/dist/cjs/mcp/tools/values-replace.js.map +1 -0
- package/dist/cjs/mcp/tools/values-search.d.cts +74 -0
- package/dist/cjs/mcp/tools/values-search.d.ts +74 -0
- package/dist/cjs/mcp/tools/values-search.js +470 -0
- package/dist/cjs/mcp/tools/values-search.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schemas/index.d.cts +14 -0
- package/dist/cjs/schemas/index.d.ts +14 -0
- package/dist/cjs/schemas/index.js +64 -0
- package/dist/cjs/schemas/index.js.map +1 -0
- package/dist/cjs/setup/config.d.cts +44 -0
- package/dist/cjs/setup/config.d.ts +44 -0
- package/dist/cjs/setup/config.js +201 -0
- package/dist/cjs/setup/config.js.map +1 -0
- package/dist/cjs/setup/http.d.cts +8 -0
- package/dist/cjs/setup/http.d.ts +8 -0
- package/dist/cjs/setup/http.js +260 -0
- package/dist/cjs/setup/http.js.map +1 -0
- package/dist/cjs/setup/index.d.cts +5 -0
- package/dist/cjs/setup/index.d.ts +5 -0
- package/dist/cjs/setup/index.js +46 -0
- package/dist/cjs/setup/index.js.map +1 -0
- package/dist/cjs/setup/oauth-google.d.cts +54 -0
- package/dist/cjs/setup/oauth-google.d.ts +54 -0
- package/dist/cjs/setup/oauth-google.js +332 -0
- package/dist/cjs/setup/oauth-google.js.map +1 -0
- package/dist/cjs/setup/runtime.d.cts +10 -0
- package/dist/cjs/setup/runtime.d.ts +10 -0
- package/dist/cjs/setup/runtime.js +353 -0
- package/dist/cjs/setup/runtime.js.map +1 -0
- package/dist/cjs/setup/stdio.d.cts +7 -0
- package/dist/cjs/setup/stdio.d.ts +7 -0
- package/dist/cjs/setup/stdio.js +239 -0
- package/dist/cjs/setup/stdio.js.map +1 -0
- package/dist/cjs/spreadsheet/column-utilities.d.cts +1 -0
- package/dist/cjs/spreadsheet/column-utilities.d.ts +1 -0
- package/dist/cjs/spreadsheet/column-utilities.js +21 -0
- package/dist/cjs/spreadsheet/column-utilities.js.map +1 -0
- package/dist/cjs/spreadsheet/csv-streaming.d.cts +19 -0
- package/dist/cjs/spreadsheet/csv-streaming.d.ts +19 -0
- package/dist/cjs/spreadsheet/csv-streaming.js +188 -0
- package/dist/cjs/spreadsheet/csv-streaming.js.map +1 -0
- package/dist/cjs/spreadsheet/data-operations.d.cts +115 -0
- package/dist/cjs/spreadsheet/data-operations.d.ts +115 -0
- package/dist/cjs/spreadsheet/data-operations.js +1515 -0
- package/dist/cjs/spreadsheet/data-operations.js.map +1 -0
- package/dist/cjs/spreadsheet/deduplication-utils.d.cts +31 -0
- package/dist/cjs/spreadsheet/deduplication-utils.d.ts +31 -0
- package/dist/cjs/spreadsheet/deduplication-utils.js +65 -0
- package/dist/cjs/spreadsheet/deduplication-utils.js.map +1 -0
- package/dist/cjs/spreadsheet/range-operations.d.cts +184 -0
- package/dist/cjs/spreadsheet/range-operations.d.ts +184 -0
- package/dist/cjs/spreadsheet/range-operations.js +672 -0
- package/dist/cjs/spreadsheet/range-operations.js.map +1 -0
- package/dist/cjs/spreadsheet/sheet-operations.d.cts +30 -0
- package/dist/cjs/spreadsheet/sheet-operations.d.ts +30 -0
- package/dist/cjs/spreadsheet/sheet-operations.js +811 -0
- package/dist/cjs/spreadsheet/sheet-operations.js.map +1 -0
- package/dist/cjs/spreadsheet/spreadsheet-management.d.cts +21 -0
- package/dist/cjs/spreadsheet/spreadsheet-management.d.ts +21 -0
- package/dist/cjs/spreadsheet/spreadsheet-management.js +310 -0
- package/dist/cjs/spreadsheet/spreadsheet-management.js.map +1 -0
- package/dist/cjs/types.d.cts +53 -0
- package/dist/cjs/types.d.ts +53 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/constants.d.ts +7 -0
- package/dist/esm/constants.js +7 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/create-store.d.ts +2 -0
- package/dist/esm/lib/create-store.js +6 -0
- package/dist/esm/lib/create-store.js.map +1 -0
- package/dist/esm/mcp/index.d.ts +3 -0
- package/dist/esm/mcp/index.js +6 -0
- package/dist/esm/mcp/index.js.map +1 -0
- package/dist/esm/mcp/prompts/a1-notation.d.ts +19 -0
- package/dist/esm/mcp/prompts/a1-notation.js +49 -0
- package/dist/esm/mcp/prompts/a1-notation.js.map +1 -0
- package/dist/esm/mcp/prompts/index.d.ts +1 -0
- package/dist/esm/mcp/prompts/index.js +1 -0
- package/dist/esm/mcp/prompts/index.js.map +1 -0
- package/dist/esm/mcp/resources/index.d.ts +1 -0
- package/dist/esm/mcp/resources/index.js +1 -0
- package/dist/esm/mcp/resources/index.js.map +1 -0
- package/dist/esm/mcp/resources/spreadsheet.d.ts +2 -0
- package/dist/esm/mcp/resources/spreadsheet.js +88 -0
- package/dist/esm/mcp/resources/spreadsheet.js.map +1 -0
- package/dist/esm/mcp/tools/cells-format.d.ts +144 -0
- package/dist/esm/mcp/tools/cells-format.js +288 -0
- package/dist/esm/mcp/tools/cells-format.js.map +1 -0
- package/dist/esm/mcp/tools/chart-create.d.ts +94 -0
- package/dist/esm/mcp/tools/chart-create.js +408 -0
- package/dist/esm/mcp/tools/chart-create.js.map +1 -0
- package/dist/esm/mcp/tools/columns-get.d.ts +55 -0
- package/dist/esm/mcp/tools/columns-get.js +113 -0
- package/dist/esm/mcp/tools/columns-get.js.map +1 -0
- package/dist/esm/mcp/tools/columns-update.d.ts +86 -0
- package/dist/esm/mcp/tools/columns-update.js +296 -0
- package/dist/esm/mcp/tools/columns-update.js.map +1 -0
- package/dist/esm/mcp/tools/csv-get-columns.d.ts +43 -0
- package/dist/esm/mcp/tools/csv-get-columns.js +95 -0
- package/dist/esm/mcp/tools/csv-get-columns.js.map +1 -0
- package/dist/esm/mcp/tools/dimensions-batch-update.d.ts +118 -0
- package/dist/esm/mcp/tools/dimensions-batch-update.js +321 -0
- package/dist/esm/mcp/tools/dimensions-batch-update.js.map +1 -0
- package/dist/esm/mcp/tools/dimensions-move.d.ts +86 -0
- package/dist/esm/mcp/tools/dimensions-move.js +183 -0
- package/dist/esm/mcp/tools/dimensions-move.js.map +1 -0
- package/dist/esm/mcp/tools/index.d.ts +26 -0
- package/dist/esm/mcp/tools/index.js +26 -0
- package/dist/esm/mcp/tools/index.js.map +1 -0
- package/dist/esm/mcp/tools/lib/dimension-operations.d.ts +48 -0
- package/dist/esm/mcp/tools/lib/dimension-operations.js +93 -0
- package/dist/esm/mcp/tools/lib/dimension-operations.js.map +1 -0
- package/dist/esm/mcp/tools/rows-append.d.ts +58 -0
- package/dist/esm/mcp/tools/rows-append.js +151 -0
- package/dist/esm/mcp/tools/rows-append.js.map +1 -0
- package/dist/esm/mcp/tools/rows-csv-append.d.ts +67 -0
- package/dist/esm/mcp/tools/rows-csv-append.js +342 -0
- package/dist/esm/mcp/tools/rows-csv-append.js.map +1 -0
- package/dist/esm/mcp/tools/rows-get.d.ts +56 -0
- package/dist/esm/mcp/tools/rows-get.js +116 -0
- package/dist/esm/mcp/tools/rows-get.js.map +1 -0
- package/dist/esm/mcp/tools/sheet-copy-to.d.ts +68 -0
- package/dist/esm/mcp/tools/sheet-copy-to.js +156 -0
- package/dist/esm/mcp/tools/sheet-copy-to.js.map +1 -0
- package/dist/esm/mcp/tools/sheet-copy.d.ts +80 -0
- package/dist/esm/mcp/tools/sheet-copy.js +177 -0
- package/dist/esm/mcp/tools/sheet-copy.js.map +1 -0
- package/dist/esm/mcp/tools/sheet-create.d.ts +56 -0
- package/dist/esm/mcp/tools/sheet-create.js +110 -0
- package/dist/esm/mcp/tools/sheet-create.js.map +1 -0
- package/dist/esm/mcp/tools/sheet-delete.d.ts +62 -0
- package/dist/esm/mcp/tools/sheet-delete.js +125 -0
- package/dist/esm/mcp/tools/sheet-delete.js.map +1 -0
- package/dist/esm/mcp/tools/sheet-find.d.ts +48 -0
- package/dist/esm/mcp/tools/sheet-find.js +90 -0
- package/dist/esm/mcp/tools/sheet-find.js.map +1 -0
- package/dist/esm/mcp/tools/sheet-rename.d.ts +60 -0
- package/dist/esm/mcp/tools/sheet-rename.js +128 -0
- package/dist/esm/mcp/tools/sheet-rename.js.map +1 -0
- package/dist/esm/mcp/tools/spreadsheet-copy.d.ts +58 -0
- package/dist/esm/mcp/tools/spreadsheet-copy.js +117 -0
- package/dist/esm/mcp/tools/spreadsheet-copy.js.map +1 -0
- package/dist/esm/mcp/tools/spreadsheet-create.d.ts +52 -0
- package/dist/esm/mcp/tools/spreadsheet-create.js +97 -0
- package/dist/esm/mcp/tools/spreadsheet-create.js.map +1 -0
- package/dist/esm/mcp/tools/spreadsheet-find.d.ts +58 -0
- package/dist/esm/mcp/tools/spreadsheet-find.js +113 -0
- package/dist/esm/mcp/tools/spreadsheet-find.js.map +1 -0
- package/dist/esm/mcp/tools/spreadsheet-rename.d.ts +56 -0
- package/dist/esm/mcp/tools/spreadsheet-rename.js +112 -0
- package/dist/esm/mcp/tools/spreadsheet-rename.js.map +1 -0
- package/dist/esm/mcp/tools/validation-set.d.ts +144 -0
- package/dist/esm/mcp/tools/validation-set.js +366 -0
- package/dist/esm/mcp/tools/validation-set.js.map +1 -0
- package/dist/esm/mcp/tools/values-batch-update.d.ts +102 -0
- package/dist/esm/mcp/tools/values-batch-update.js +224 -0
- package/dist/esm/mcp/tools/values-batch-update.js.map +1 -0
- package/dist/esm/mcp/tools/values-clear.d.ts +56 -0
- package/dist/esm/mcp/tools/values-clear.js +131 -0
- package/dist/esm/mcp/tools/values-clear.js.map +1 -0
- package/dist/esm/mcp/tools/values-csv-update.d.ts +75 -0
- package/dist/esm/mcp/tools/values-csv-update.js +202 -0
- package/dist/esm/mcp/tools/values-csv-update.js.map +1 -0
- package/dist/esm/mcp/tools/values-replace.d.ts +68 -0
- package/dist/esm/mcp/tools/values-replace.js +171 -0
- package/dist/esm/mcp/tools/values-replace.js.map +1 -0
- package/dist/esm/mcp/tools/values-search.d.ts +74 -0
- package/dist/esm/mcp/tools/values-search.js +229 -0
- package/dist/esm/mcp/tools/values-search.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/schemas/index.d.ts +14 -0
- package/dist/esm/schemas/index.js +35 -0
- package/dist/esm/schemas/index.js.map +1 -0
- package/dist/esm/setup/config.d.ts +44 -0
- package/dist/esm/setup/config.js +151 -0
- package/dist/esm/setup/config.js.map +1 -0
- package/dist/esm/setup/http.d.ts +8 -0
- package/dist/esm/setup/http.js +54 -0
- package/dist/esm/setup/http.js.map +1 -0
- package/dist/esm/setup/index.d.ts +5 -0
- package/dist/esm/setup/index.js +5 -0
- package/dist/esm/setup/index.js.map +1 -0
- package/dist/esm/setup/oauth-google.d.ts +54 -0
- package/dist/esm/setup/oauth-google.js +142 -0
- package/dist/esm/setup/oauth-google.js.map +1 -0
- package/dist/esm/setup/runtime.d.ts +10 -0
- package/dist/esm/setup/runtime.js +84 -0
- package/dist/esm/setup/runtime.js.map +1 -0
- package/dist/esm/setup/stdio.d.ts +7 -0
- package/dist/esm/setup/stdio.js +38 -0
- package/dist/esm/setup/stdio.js.map +1 -0
- package/dist/esm/spreadsheet/column-utilities.d.ts +1 -0
- package/dist/esm/spreadsheet/column-utilities.js +10 -0
- package/dist/esm/spreadsheet/column-utilities.js.map +1 -0
- package/dist/esm/spreadsheet/csv-streaming.d.ts +19 -0
- package/dist/esm/spreadsheet/csv-streaming.js +43 -0
- package/dist/esm/spreadsheet/csv-streaming.js.map +1 -0
- package/dist/esm/spreadsheet/data-operations.d.ts +115 -0
- package/dist/esm/spreadsheet/data-operations.js +712 -0
- package/dist/esm/spreadsheet/data-operations.js.map +1 -0
- package/dist/esm/spreadsheet/deduplication-utils.d.ts +31 -0
- package/dist/esm/spreadsheet/deduplication-utils.js +54 -0
- package/dist/esm/spreadsheet/deduplication-utils.js.map +1 -0
- package/dist/esm/spreadsheet/range-operations.d.ts +184 -0
- package/dist/esm/spreadsheet/range-operations.js +591 -0
- package/dist/esm/spreadsheet/range-operations.js.map +1 -0
- package/dist/esm/spreadsheet/sheet-operations.d.ts +30 -0
- package/dist/esm/spreadsheet/sheet-operations.js +359 -0
- package/dist/esm/spreadsheet/sheet-operations.js.map +1 -0
- package/dist/esm/spreadsheet/spreadsheet-management.d.ts +21 -0
- package/dist/esm/spreadsheet/spreadsheet-management.js +73 -0
- package/dist/esm/spreadsheet/spreadsheet-management.js.map +1 -0
- package/dist/esm/types.d.ts +53 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/** Get column names from CSV file (peek at first row only) */ import { schemas } from '@mcp-z/oauth-google';
|
|
2
|
+
const { AuthRequiredBranchSchema } = schemas;
|
|
3
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { parse } from 'csv-parse';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { getCsvReadStream } from '../../spreadsheet/csv-streaming.js';
|
|
7
|
+
const inputSchema = z.object({
|
|
8
|
+
sourceUri: z.string().trim().min(1).describe('CSV file URI (file://, http://, https://)')
|
|
9
|
+
});
|
|
10
|
+
// Success branch schema - uses columns: for consistency with standard vocabulary
|
|
11
|
+
const successBranchSchema = z.object({
|
|
12
|
+
type: z.literal('success'),
|
|
13
|
+
columns: z.array(z.string()).describe('First row values (column names) or empty if no rows'),
|
|
14
|
+
isEmpty: z.boolean().describe('True if CSV has zero rows')
|
|
15
|
+
});
|
|
16
|
+
const outputSchema = z.discriminatedUnion('type', [
|
|
17
|
+
successBranchSchema,
|
|
18
|
+
AuthRequiredBranchSchema
|
|
19
|
+
]);
|
|
20
|
+
const config = {
|
|
21
|
+
description: 'Get first row from CSV file (streaming, no memory overhead). Returns columns array and isEmpty flag.',
|
|
22
|
+
inputSchema,
|
|
23
|
+
outputSchema: z.object({
|
|
24
|
+
result: outputSchema
|
|
25
|
+
})
|
|
26
|
+
};
|
|
27
|
+
async function handler({ sourceUri }, extra) {
|
|
28
|
+
var _logger_debug;
|
|
29
|
+
const logger = extra.logger;
|
|
30
|
+
(_logger_debug = logger.debug) === null || _logger_debug === void 0 ? void 0 : _logger_debug.call(logger, 'sheets.csv.get-columns called', {
|
|
31
|
+
sourceUri
|
|
32
|
+
});
|
|
33
|
+
try {
|
|
34
|
+
var _logger_info;
|
|
35
|
+
// Get readable stream from CSV URI (no temp files!)
|
|
36
|
+
const readStream = await getCsvReadStream(sourceUri);
|
|
37
|
+
// Create CSV parser without treating first row as column names
|
|
38
|
+
// We just want to read the raw first row
|
|
39
|
+
const parser = readStream.pipe(parse({
|
|
40
|
+
columns: false,
|
|
41
|
+
skip_empty_lines: true,
|
|
42
|
+
trim: true,
|
|
43
|
+
cast: true,
|
|
44
|
+
relax_column_count: true
|
|
45
|
+
}));
|
|
46
|
+
// Read only the first row
|
|
47
|
+
let firstRow = [];
|
|
48
|
+
let rowCount = 0;
|
|
49
|
+
for await (const row of parser){
|
|
50
|
+
firstRow = row;
|
|
51
|
+
rowCount++;
|
|
52
|
+
break; // Only read first row
|
|
53
|
+
}
|
|
54
|
+
// Convert first row to strings (column names)
|
|
55
|
+
const columns = firstRow.map((value)=>String(value !== null && value !== void 0 ? value : ''));
|
|
56
|
+
const isEmpty = rowCount === 0;
|
|
57
|
+
const result = {
|
|
58
|
+
type: 'success',
|
|
59
|
+
columns,
|
|
60
|
+
isEmpty
|
|
61
|
+
};
|
|
62
|
+
(_logger_info = logger.info) === null || _logger_info === void 0 ? void 0 : _logger_info.call(logger, 'sheets.csv.get-columns completed', {
|
|
63
|
+
sourceUri,
|
|
64
|
+
columnCount: columns.length,
|
|
65
|
+
isEmpty
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: 'text',
|
|
71
|
+
text: JSON.stringify(result)
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
structuredContent: {
|
|
75
|
+
result
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
} catch (error) {
|
|
79
|
+
var _logger_error;
|
|
80
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
81
|
+
(_logger_error = logger.error) === null || _logger_error === void 0 ? void 0 : _logger_error.call(logger, 'sheets.csv.get-columns error', {
|
|
82
|
+
error: message
|
|
83
|
+
});
|
|
84
|
+
throw new McpError(ErrorCode.InternalError, `Error getting CSV columns: ${message}`, {
|
|
85
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export default function createTool() {
|
|
90
|
+
return {
|
|
91
|
+
name: 'csv-get-columns',
|
|
92
|
+
config,
|
|
93
|
+
handler
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/tools/csv-get-columns.ts"],"sourcesContent":["/** Get column names from CSV file (peek at first row only) */\n\nimport type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { parse } from 'csv-parse';\nimport { z } from 'zod';\nimport { getCsvReadStream } from '../../spreadsheet/csv-streaming.js';\n\nconst inputSchema = z.object({\n sourceUri: z.string().trim().min(1).describe('CSV file URI (file://, http://, https://)'),\n});\n\n// Success branch schema - uses columns: for consistency with standard vocabulary\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n columns: z.array(z.string()).describe('First row values (column names) or empty if no rows'),\n isEmpty: z.boolean().describe('True if CSV has zero rows'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Get first row from CSV file (streaming, no memory overhead). Returns columns array and isEmpty flag.',\n inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ sourceUri }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.debug?.('sheets.csv.get-columns called', { sourceUri });\n\n try {\n // Get readable stream from CSV URI (no temp files!)\n const readStream = await getCsvReadStream(sourceUri);\n\n // Create CSV parser without treating first row as column names\n // We just want to read the raw first row\n const parser = readStream.pipe(\n parse({\n columns: false, // Don't treat first row as headers\n skip_empty_lines: true,\n trim: true,\n cast: true, // Auto-convert numbers/booleans\n relax_column_count: true,\n })\n );\n\n // Read only the first row\n let firstRow: unknown[] = [];\n let rowCount = 0;\n\n for await (const row of parser) {\n firstRow = row;\n rowCount++;\n break; // Only read first row\n }\n\n // Convert first row to strings (column names)\n const columns = firstRow.map((value) => String(value ?? ''));\n const isEmpty = rowCount === 0;\n\n const result: Output = {\n type: 'success' as const,\n columns,\n isEmpty,\n };\n\n logger.info?.('sheets.csv.get-columns completed', { sourceUri, columnCount: columns.length, isEmpty });\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error?.('sheets.csv.get-columns error', { error: message });\n throw new McpError(ErrorCode.InternalError, `Error getting CSV columns: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'csv-get-columns',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ErrorCode","McpError","parse","z","getCsvReadStream","inputSchema","object","sourceUri","string","trim","min","describe","successBranchSchema","type","literal","columns","array","isEmpty","boolean","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","debug","readStream","parser","pipe","skip_empty_lines","cast","relax_column_count","firstRow","rowCount","row","map","value","String","info","columnCount","length","content","text","JSON","stringify","structuredContent","error","message","Error","InternalError","stack","undefined","createTool","name"],"mappings":"AAAA,4DAA4D,GAG5D,SAASA,OAAO,QAAQ,sBAAsB;AAE9C,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAIrC,SAASE,SAAS,EAAEC,QAAQ,QAAQ,qCAAqC;AACzE,SAASC,KAAK,QAAQ,YAAY;AAClC,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,gBAAgB,QAAQ,qCAAqC;AAEtE,MAAMC,cAAcF,EAAEG,MAAM,CAAC;IAC3BC,WAAWJ,EAAEK,MAAM,GAAGC,IAAI,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;AAC/C;AAEA,iFAAiF;AACjF,MAAMC,sBAAsBT,EAAEG,MAAM,CAAC;IACnCO,MAAMV,EAAEW,OAAO,CAAC;IAChBC,SAASZ,EAAEa,KAAK,CAACb,EAAEK,MAAM,IAAIG,QAAQ,CAAC;IACtCM,SAASd,EAAEe,OAAO,GAAGP,QAAQ,CAAC;AAChC;AAEA,MAAMQ,eAAehB,EAAEiB,kBAAkB,CAAC,QAAQ;IAACR;IAAqBb;CAAyB;AAEjG,MAAMsB,SAAS;IACbC,aAAa;IACbjB;IACAc,cAAchB,EAAEG,MAAM,CAAC;QACrBiB,QAAQJ;IACV;AACF;AAKA,eAAeK,QAAQ,EAAEjB,SAAS,EAAS,EAAEkB,KAAoB;QAE/DC;IADA,MAAMA,SAASD,MAAMC,MAAM;KAC3BA,gBAAAA,OAAOC,KAAK,cAAZD,oCAAAA,mBAAAA,QAAe,iCAAiC;QAAEnB;IAAU;IAE5D,IAAI;YAoCFmB;QAnCA,oDAAoD;QACpD,MAAME,aAAa,MAAMxB,iBAAiBG;QAE1C,+DAA+D;QAC/D,yCAAyC;QACzC,MAAMsB,SAASD,WAAWE,IAAI,CAC5B5B,MAAM;YACJa,SAAS;YACTgB,kBAAkB;YAClBtB,MAAM;YACNuB,MAAM;YACNC,oBAAoB;QACtB;QAGF,0BAA0B;QAC1B,IAAIC,WAAsB,EAAE;QAC5B,IAAIC,WAAW;QAEf,WAAW,MAAMC,OAAOP,OAAQ;YAC9BK,WAAWE;YACXD;YACA,OAAO,sBAAsB;QAC/B;QAEA,8CAA8C;QAC9C,MAAMpB,UAAUmB,SAASG,GAAG,CAAC,CAACC,QAAUC,OAAOD,kBAAAA,mBAAAA,QAAS;QACxD,MAAMrB,UAAUkB,aAAa;QAE7B,MAAMZ,SAAiB;YACrBV,MAAM;YACNE;YACAE;QACF;SAEAS,eAAAA,OAAOc,IAAI,cAAXd,mCAAAA,kBAAAA,QAAc,oCAAoC;YAAEnB;YAAWkC,aAAa1B,QAAQ2B,MAAM;YAAEzB;QAAQ;QACpG,OAAO;YACL0B,SAAS;gBAAC;oBAAE9B,MAAM;oBAAiB+B,MAAMC,KAAKC,SAAS,CAACvB;gBAAQ;aAAE;YAClEwB,mBAAmB;gBAAExB;YAAO;QAC9B;IACF,EAAE,OAAOyB,OAAO;YAEdtB;QADA,MAAMuB,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGV,OAAOS;SAChEtB,gBAAAA,OAAOsB,KAAK,cAAZtB,oCAAAA,mBAAAA,QAAe,gCAAgC;YAAEsB,OAAOC;QAAQ;QAChE,MAAM,IAAIhD,SAASD,UAAUmD,aAAa,EAAE,CAAC,2BAA2B,EAAEF,SAAS,EAAE;YACnFG,OAAOJ,iBAAiBE,QAAQF,MAAMI,KAAK,GAAGC;QAChD;IACF;AACF;AAEA,eAAe,SAASC;IACtB,OAAO;QACLC,MAAM;QACNlC;QACAG;IACF;AACF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { EnrichedExtra } from '@mcp-z/oauth-google';
|
|
2
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
declare const inputSchema: z.ZodObject<{
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
gid: z.ZodCoercedString<unknown>;
|
|
7
|
+
requests: z.ZodArray<z.ZodObject<{
|
|
8
|
+
operation: z.ZodEnum<{
|
|
9
|
+
insertDimension: "insertDimension";
|
|
10
|
+
deleteDimension: "deleteDimension";
|
|
11
|
+
appendDimension: "appendDimension";
|
|
12
|
+
}>;
|
|
13
|
+
dimension: z.ZodEnum<{
|
|
14
|
+
ROWS: "ROWS";
|
|
15
|
+
COLUMNS: "COLUMNS";
|
|
16
|
+
}>;
|
|
17
|
+
startIndex: z.ZodNumber;
|
|
18
|
+
endIndex: z.ZodOptional<z.ZodNumber>;
|
|
19
|
+
inheritFromBefore: z.ZodOptional<z.ZodBoolean>;
|
|
20
|
+
}, z.core.$strip>>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
23
|
+
type: z.ZodLiteral<"success">;
|
|
24
|
+
id: z.ZodString;
|
|
25
|
+
gid: z.ZodString;
|
|
26
|
+
spreadsheetTitle: z.ZodString;
|
|
27
|
+
spreadsheetUrl: z.ZodString;
|
|
28
|
+
sheetTitle: z.ZodString;
|
|
29
|
+
sheetUrl: z.ZodString;
|
|
30
|
+
totalOperations: z.ZodNumber;
|
|
31
|
+
operationResults: z.ZodArray<z.ZodObject<{
|
|
32
|
+
operation: z.ZodEnum<{
|
|
33
|
+
insertDimension: "insertDimension";
|
|
34
|
+
deleteDimension: "deleteDimension";
|
|
35
|
+
appendDimension: "appendDimension";
|
|
36
|
+
}>;
|
|
37
|
+
dimension: z.ZodEnum<{
|
|
38
|
+
ROWS: "ROWS";
|
|
39
|
+
COLUMNS: "COLUMNS";
|
|
40
|
+
}>;
|
|
41
|
+
startIndex: z.ZodNumber;
|
|
42
|
+
endIndex: z.ZodOptional<z.ZodNumber>;
|
|
43
|
+
affectedCount: z.ZodNumber;
|
|
44
|
+
}, z.core.$strip>>;
|
|
45
|
+
updatedDimensions: z.ZodObject<{
|
|
46
|
+
rows: z.ZodNumber;
|
|
47
|
+
columns: z.ZodNumber;
|
|
48
|
+
}, z.core.$strip>;
|
|
49
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
50
|
+
type: z.ZodLiteral<"auth_required">;
|
|
51
|
+
provider: z.ZodString;
|
|
52
|
+
message: z.ZodString;
|
|
53
|
+
url: z.ZodOptional<z.ZodString>;
|
|
54
|
+
}, z.core.$strip>], "type">;
|
|
55
|
+
export type Input = z.infer<typeof inputSchema>;
|
|
56
|
+
export type Output = z.infer<typeof outputSchema>;
|
|
57
|
+
declare function handler({ id, gid, requests }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
58
|
+
export default function createTool(): {
|
|
59
|
+
name: string;
|
|
60
|
+
config: {
|
|
61
|
+
readonly description: "Batch update sheet dimensions by inserting, deleting, or appending rows/columns. Operations are atomic (all succeed or all fail) and execute in optimal order automatically.";
|
|
62
|
+
readonly inputSchema: z.ZodObject<{
|
|
63
|
+
id: z.ZodString;
|
|
64
|
+
gid: z.ZodCoercedString<unknown>;
|
|
65
|
+
requests: z.ZodArray<z.ZodObject<{
|
|
66
|
+
operation: z.ZodEnum<{
|
|
67
|
+
insertDimension: "insertDimension";
|
|
68
|
+
deleteDimension: "deleteDimension";
|
|
69
|
+
appendDimension: "appendDimension";
|
|
70
|
+
}>;
|
|
71
|
+
dimension: z.ZodEnum<{
|
|
72
|
+
ROWS: "ROWS";
|
|
73
|
+
COLUMNS: "COLUMNS";
|
|
74
|
+
}>;
|
|
75
|
+
startIndex: z.ZodNumber;
|
|
76
|
+
endIndex: z.ZodOptional<z.ZodNumber>;
|
|
77
|
+
inheritFromBefore: z.ZodOptional<z.ZodBoolean>;
|
|
78
|
+
}, z.core.$strip>>;
|
|
79
|
+
}, z.core.$strip>;
|
|
80
|
+
readonly outputSchema: z.ZodObject<{
|
|
81
|
+
result: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
82
|
+
type: z.ZodLiteral<"success">;
|
|
83
|
+
id: z.ZodString;
|
|
84
|
+
gid: z.ZodString;
|
|
85
|
+
spreadsheetTitle: z.ZodString;
|
|
86
|
+
spreadsheetUrl: z.ZodString;
|
|
87
|
+
sheetTitle: z.ZodString;
|
|
88
|
+
sheetUrl: z.ZodString;
|
|
89
|
+
totalOperations: z.ZodNumber;
|
|
90
|
+
operationResults: z.ZodArray<z.ZodObject<{
|
|
91
|
+
operation: z.ZodEnum<{
|
|
92
|
+
insertDimension: "insertDimension";
|
|
93
|
+
deleteDimension: "deleteDimension";
|
|
94
|
+
appendDimension: "appendDimension";
|
|
95
|
+
}>;
|
|
96
|
+
dimension: z.ZodEnum<{
|
|
97
|
+
ROWS: "ROWS";
|
|
98
|
+
COLUMNS: "COLUMNS";
|
|
99
|
+
}>;
|
|
100
|
+
startIndex: z.ZodNumber;
|
|
101
|
+
endIndex: z.ZodOptional<z.ZodNumber>;
|
|
102
|
+
affectedCount: z.ZodNumber;
|
|
103
|
+
}, z.core.$strip>>;
|
|
104
|
+
updatedDimensions: z.ZodObject<{
|
|
105
|
+
rows: z.ZodNumber;
|
|
106
|
+
columns: z.ZodNumber;
|
|
107
|
+
}, z.core.$strip>;
|
|
108
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
109
|
+
type: z.ZodLiteral<"auth_required">;
|
|
110
|
+
provider: z.ZodString;
|
|
111
|
+
message: z.ZodString;
|
|
112
|
+
url: z.ZodOptional<z.ZodString>;
|
|
113
|
+
}, z.core.$strip>], "type">;
|
|
114
|
+
}, z.core.$strip>;
|
|
115
|
+
};
|
|
116
|
+
handler: typeof handler;
|
|
117
|
+
};
|
|
118
|
+
export {};
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { schemas } from '@mcp-z/oauth-google';
|
|
2
|
+
const { AuthRequiredBranchSchema } = schemas;
|
|
3
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { google } from 'googleapis';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.js';
|
|
7
|
+
import { buildDimensionRequest, calculateAffectedCount, DEFAULT_COLUMN_COUNT, DEFAULT_ROW_COUNT, MAX_COLUMN_COUNT, MAX_ROW_COUNT, sortOperations } from './lib/dimension-operations.js';
|
|
8
|
+
// Input schema for dimension batch update requests
|
|
9
|
+
const DimensionRequestSchema = z.object({
|
|
10
|
+
operation: z.enum([
|
|
11
|
+
'insertDimension',
|
|
12
|
+
'deleteDimension',
|
|
13
|
+
'appendDimension'
|
|
14
|
+
]).describe('Type of dimension operation to perform'),
|
|
15
|
+
dimension: z.enum([
|
|
16
|
+
'ROWS',
|
|
17
|
+
'COLUMNS'
|
|
18
|
+
]).describe('Whether to operate on rows or columns'),
|
|
19
|
+
startIndex: z.number().int().nonnegative().describe('Starting index for the operation (0-based)'),
|
|
20
|
+
endIndex: z.number().int().nonnegative().optional().describe('Ending index for the operation (0-based, exclusive). Optional - if omitted, the range is unbounded (extends to the end of the sheet)'),
|
|
21
|
+
inheritFromBefore: z.boolean().optional().describe('For insertDimension: whether new rows/columns inherit properties from the row/column before the insertion point')
|
|
22
|
+
});
|
|
23
|
+
const inputSchema = z.object({
|
|
24
|
+
id: SpreadsheetIdSchema,
|
|
25
|
+
gid: SheetGidSchema,
|
|
26
|
+
requests: z.array(DimensionRequestSchema).min(1).describe('Array of dimension update requests')
|
|
27
|
+
});
|
|
28
|
+
// Success branch schema
|
|
29
|
+
const successBranchSchema = z.object({
|
|
30
|
+
type: z.literal('success'),
|
|
31
|
+
id: SpreadsheetIdOutput,
|
|
32
|
+
gid: SheetGidOutput,
|
|
33
|
+
spreadsheetTitle: z.string().describe('Title of the updated spreadsheet'),
|
|
34
|
+
spreadsheetUrl: z.string().describe('URL of the updated spreadsheet'),
|
|
35
|
+
sheetTitle: z.string().describe('Title of the updated sheet'),
|
|
36
|
+
sheetUrl: z.string().describe('URL of the updated sheet'),
|
|
37
|
+
totalOperations: z.number().int().nonnegative().describe('Total number of dimension operations performed'),
|
|
38
|
+
operationResults: z.array(z.object({
|
|
39
|
+
operation: z.enum([
|
|
40
|
+
'insertDimension',
|
|
41
|
+
'deleteDimension',
|
|
42
|
+
'appendDimension'
|
|
43
|
+
]).describe('Type of operation that was performed'),
|
|
44
|
+
dimension: z.enum([
|
|
45
|
+
'ROWS',
|
|
46
|
+
'COLUMNS'
|
|
47
|
+
]).describe('Dimension that was operated on'),
|
|
48
|
+
startIndex: z.number().int().nonnegative().describe('Starting index of the operation'),
|
|
49
|
+
endIndex: z.number().int().nonnegative().optional().describe('Ending index of the operation (for insert/delete)'),
|
|
50
|
+
affectedCount: z.number().int().nonnegative().describe('Number of rows/columns affected by this operation')
|
|
51
|
+
})).describe('Detailed results for each dimension operation'),
|
|
52
|
+
updatedDimensions: z.object({
|
|
53
|
+
rows: z.number().int().nonnegative().describe('Total number of rows in the sheet after all operations'),
|
|
54
|
+
columns: z.number().int().nonnegative().describe('Total number of columns in the sheet after all operations')
|
|
55
|
+
}).describe('Final dimensions of the sheet after all operations')
|
|
56
|
+
});
|
|
57
|
+
const outputSchema = z.discriminatedUnion('type', [
|
|
58
|
+
successBranchSchema,
|
|
59
|
+
AuthRequiredBranchSchema
|
|
60
|
+
]);
|
|
61
|
+
const config = {
|
|
62
|
+
description: 'Batch update sheet dimensions by inserting, deleting, or appending rows/columns. Operations are atomic (all succeed or all fail) and execute in optimal order automatically.',
|
|
63
|
+
inputSchema,
|
|
64
|
+
outputSchema: z.object({
|
|
65
|
+
result: outputSchema
|
|
66
|
+
})
|
|
67
|
+
};
|
|
68
|
+
async function handler({ id, gid, requests }, extra) {
|
|
69
|
+
var _logger_debug;
|
|
70
|
+
const logger = extra.logger;
|
|
71
|
+
(_logger_debug = logger.debug) === null || _logger_debug === void 0 ? void 0 : _logger_debug.call(logger, 'sheets.dimensions.batchUpdate called', {
|
|
72
|
+
id,
|
|
73
|
+
gid,
|
|
74
|
+
requestCount: requests.length,
|
|
75
|
+
operations: requests.map((r)=>({
|
|
76
|
+
operation: r.operation,
|
|
77
|
+
dimension: r.dimension,
|
|
78
|
+
startIndex: r.startIndex,
|
|
79
|
+
endIndex: r.endIndex
|
|
80
|
+
}))
|
|
81
|
+
});
|
|
82
|
+
try {
|
|
83
|
+
var _ref, _spreadsheetData_spreadsheetUrl, _sheet_properties_title, _ref1, _ref2;
|
|
84
|
+
var _spreadsheetData_properties, _spreadsheetData_sheets, _sheet_properties_gridProperties, _sheet_properties_gridProperties1, _logger_debug1, _logger_debug2;
|
|
85
|
+
const sheets = google.sheets({
|
|
86
|
+
version: 'v4',
|
|
87
|
+
auth: extra.authContext.auth
|
|
88
|
+
});
|
|
89
|
+
// Get spreadsheet and sheet info in single API call
|
|
90
|
+
const spreadsheetResponse = await sheets.spreadsheets.get({
|
|
91
|
+
spreadsheetId: id,
|
|
92
|
+
fields: 'properties.title,spreadsheetUrl,sheets.properties.sheetId,sheets.properties.title,sheets.properties.gridProperties'
|
|
93
|
+
});
|
|
94
|
+
const spreadsheetData = spreadsheetResponse.data;
|
|
95
|
+
const spreadsheetTitle = (_ref = (_spreadsheetData_properties = spreadsheetData.properties) === null || _spreadsheetData_properties === void 0 ? void 0 : _spreadsheetData_properties.title) !== null && _ref !== void 0 ? _ref : '';
|
|
96
|
+
const spreadsheetUrl = (_spreadsheetData_spreadsheetUrl = spreadsheetData.spreadsheetUrl) !== null && _spreadsheetData_spreadsheetUrl !== void 0 ? _spreadsheetData_spreadsheetUrl : '';
|
|
97
|
+
// Find sheet by gid
|
|
98
|
+
const sheet = (_spreadsheetData_sheets = spreadsheetData.sheets) === null || _spreadsheetData_sheets === void 0 ? void 0 : _spreadsheetData_sheets.find((s)=>{
|
|
99
|
+
var _s_properties;
|
|
100
|
+
return String((_s_properties = s.properties) === null || _s_properties === void 0 ? void 0 : _s_properties.sheetId) === gid;
|
|
101
|
+
});
|
|
102
|
+
if (!(sheet === null || sheet === void 0 ? void 0 : sheet.properties)) {
|
|
103
|
+
var _logger_warn;
|
|
104
|
+
(_logger_warn = logger.warn) === null || _logger_warn === void 0 ? void 0 : _logger_warn.call(logger, 'Sheet not found for dimensions batch update', {
|
|
105
|
+
id,
|
|
106
|
+
gid,
|
|
107
|
+
requestCount: requests.length
|
|
108
|
+
});
|
|
109
|
+
throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);
|
|
110
|
+
}
|
|
111
|
+
const sheetTitle = (_sheet_properties_title = sheet.properties.title) !== null && _sheet_properties_title !== void 0 ? _sheet_properties_title : gid;
|
|
112
|
+
const sheetId = sheet.properties.sheetId;
|
|
113
|
+
if (sheetId === undefined || sheetId === null) {
|
|
114
|
+
var _logger_error;
|
|
115
|
+
(_logger_error = logger.error) === null || _logger_error === void 0 ? void 0 : _logger_error.call(logger, 'Sheet ID not available for dimensions batch update', {
|
|
116
|
+
id,
|
|
117
|
+
gid,
|
|
118
|
+
sheetTitle
|
|
119
|
+
});
|
|
120
|
+
throw new McpError(ErrorCode.InternalError, `Sheet ID not available for ${gid}. Cannot perform dimension operations without valid sheet ID.`);
|
|
121
|
+
}
|
|
122
|
+
const sheetUrl = `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheetId}`;
|
|
123
|
+
// Get current sheet dimensions for response calculation
|
|
124
|
+
// Note: Google Sheets API may not always provide gridProperties for older sheets
|
|
125
|
+
// Fall back to Google's documented defaults for new sheets
|
|
126
|
+
const currentRowCount = (_ref1 = (_sheet_properties_gridProperties = sheet.properties.gridProperties) === null || _sheet_properties_gridProperties === void 0 ? void 0 : _sheet_properties_gridProperties.rowCount) !== null && _ref1 !== void 0 ? _ref1 : DEFAULT_ROW_COUNT;
|
|
127
|
+
const currentColumnCount = (_ref2 = (_sheet_properties_gridProperties1 = sheet.properties.gridProperties) === null || _sheet_properties_gridProperties1 === void 0 ? void 0 : _sheet_properties_gridProperties1.columnCount) !== null && _ref2 !== void 0 ? _ref2 : DEFAULT_COLUMN_COUNT;
|
|
128
|
+
// Sort operations for optimal execution order to prevent index conflicts
|
|
129
|
+
// Delete operations are processed first (high to low index) to avoid shifting issues
|
|
130
|
+
// Insert/append operations are processed after (low to high index)
|
|
131
|
+
const sortedRequests = sortOperations(requests);
|
|
132
|
+
// Build Google Sheets API batch update requests
|
|
133
|
+
const batchRequests = sortedRequests.map((operation)=>buildDimensionRequest(operation, sheetId));
|
|
134
|
+
(_logger_debug1 = logger.debug) === null || _logger_debug1 === void 0 ? void 0 : _logger_debug1.call(logger, 'sheets.dimensions.batchUpdate executing batch request', {
|
|
135
|
+
spreadsheetId: id,
|
|
136
|
+
sheetTitle,
|
|
137
|
+
sheetId,
|
|
138
|
+
totalOperations: batchRequests.length,
|
|
139
|
+
operationTypes: sortedRequests.map((r)=>r.operation),
|
|
140
|
+
operationDetails: sortedRequests.map((r, i)=>({
|
|
141
|
+
index: i,
|
|
142
|
+
operation: r.operation,
|
|
143
|
+
dimension: r.dimension,
|
|
144
|
+
startIndex: r.startIndex,
|
|
145
|
+
endIndex: r.endIndex,
|
|
146
|
+
affectedCount: calculateAffectedCount(r)
|
|
147
|
+
})),
|
|
148
|
+
currentDimensions: {
|
|
149
|
+
rows: currentRowCount,
|
|
150
|
+
columns: currentColumnCount
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
// Execute the atomic batch update
|
|
154
|
+
const batchUpdateResponse = await sheets.spreadsheets.batchUpdate({
|
|
155
|
+
spreadsheetId: id,
|
|
156
|
+
requestBody: {
|
|
157
|
+
requests: batchRequests,
|
|
158
|
+
includeSpreadsheetInResponse: false
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
const updateResult = batchUpdateResponse.data;
|
|
162
|
+
// Comprehensive validation of batch update results
|
|
163
|
+
if (!updateResult) {
|
|
164
|
+
var _logger_error1;
|
|
165
|
+
(_logger_error1 = logger.error) === null || _logger_error1 === void 0 ? void 0 : _logger_error1.call(logger, 'Dimensions batch update failed - no response data', {
|
|
166
|
+
spreadsheetId: id,
|
|
167
|
+
sheetTitle,
|
|
168
|
+
requestCount: requests.length
|
|
169
|
+
});
|
|
170
|
+
throw new McpError(ErrorCode.InternalError, 'Batch update failed: no response data received from Google Sheets API');
|
|
171
|
+
}
|
|
172
|
+
const replies = updateResult.replies || [];
|
|
173
|
+
const expectedCount = requests.length;
|
|
174
|
+
const actualCount = replies.length;
|
|
175
|
+
// Validate operation count matches expectations
|
|
176
|
+
if (actualCount !== expectedCount) {
|
|
177
|
+
var _logger_error2;
|
|
178
|
+
(_logger_error2 = logger.error) === null || _logger_error2 === void 0 ? void 0 : _logger_error2.call(logger, 'Dimensions batch update failed - operation count mismatch', {
|
|
179
|
+
expectedOperations: expectedCount,
|
|
180
|
+
actualReplies: actualCount,
|
|
181
|
+
spreadsheetId: id,
|
|
182
|
+
sheetTitle,
|
|
183
|
+
receivedReplies: replies.map((reply, index)=>({
|
|
184
|
+
index,
|
|
185
|
+
replyType: Object.keys(reply || {})[0] || 'empty'
|
|
186
|
+
}))
|
|
187
|
+
});
|
|
188
|
+
throw new McpError(ErrorCode.InternalError, `Batch operation failed: expected ${expectedCount} operations, received ${actualCount} replies. This may indicate a partial failure or Google API issue.`);
|
|
189
|
+
}
|
|
190
|
+
// Validate each reply exists - Google Sheets API may return empty objects for successful operations
|
|
191
|
+
for(let i = 0; i < replies.length; i++){
|
|
192
|
+
const reply = replies[i];
|
|
193
|
+
const request = sortedRequests[i];
|
|
194
|
+
if (!request) {
|
|
195
|
+
var _logger_error3;
|
|
196
|
+
(_logger_error3 = logger.error) === null || _logger_error3 === void 0 ? void 0 : _logger_error3.call(logger, 'Dimensions batch update failed - missing request', {
|
|
197
|
+
replyIndex: i,
|
|
198
|
+
hasReply: !!reply,
|
|
199
|
+
hasRequest: !!request,
|
|
200
|
+
spreadsheetId: id,
|
|
201
|
+
sheetTitle
|
|
202
|
+
});
|
|
203
|
+
throw new McpError(ErrorCode.InternalError, `Operation ${i} failed: missing request data`);
|
|
204
|
+
}
|
|
205
|
+
// Note: Google Sheets API often returns empty objects {} for successful dimension operations
|
|
206
|
+
// This is normal behavior and indicates success, not failure
|
|
207
|
+
// We validate that the reply exists (even if empty) rather than checking specific keys
|
|
208
|
+
if (reply === null || reply === undefined) {
|
|
209
|
+
var _logger_error4;
|
|
210
|
+
(_logger_error4 = logger.error) === null || _logger_error4 === void 0 ? void 0 : _logger_error4.call(logger, 'Dimensions batch update failed - null reply', {
|
|
211
|
+
operationIndex: i,
|
|
212
|
+
expectedOperation: request.operation,
|
|
213
|
+
spreadsheetId: id,
|
|
214
|
+
sheetTitle
|
|
215
|
+
});
|
|
216
|
+
throw new McpError(ErrorCode.InternalError, `Operation ${i} (${request.operation}) failed: null reply from Google Sheets API`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Calculate final dimensions and operation results
|
|
220
|
+
// Note: We calculate based on the operations we performed, but actual dimensions
|
|
221
|
+
// may vary slightly due to Google Sheets internal behavior (e.g., minimum dimensions)
|
|
222
|
+
let finalRowCount = currentRowCount;
|
|
223
|
+
let finalColumnCount = currentColumnCount;
|
|
224
|
+
const operationResults = sortedRequests.map((operation, _index)=>{
|
|
225
|
+
const affectedCount = calculateAffectedCount(operation);
|
|
226
|
+
// Update dimension counts based on operation
|
|
227
|
+
// Operations are applied in sorted order, so this should match actual result
|
|
228
|
+
if (operation.dimension === 'ROWS') {
|
|
229
|
+
if (operation.operation === 'insertDimension') {
|
|
230
|
+
finalRowCount += affectedCount;
|
|
231
|
+
} else if (operation.operation === 'appendDimension') {
|
|
232
|
+
finalRowCount += affectedCount;
|
|
233
|
+
} else if (operation.operation === 'deleteDimension') {
|
|
234
|
+
finalRowCount = Math.max(1, finalRowCount - affectedCount); // Google Sheets minimum 1 row
|
|
235
|
+
}
|
|
236
|
+
} else if (operation.dimension === 'COLUMNS') {
|
|
237
|
+
if (operation.operation === 'insertDimension') {
|
|
238
|
+
finalColumnCount += affectedCount;
|
|
239
|
+
} else if (operation.operation === 'appendDimension') {
|
|
240
|
+
finalColumnCount += affectedCount;
|
|
241
|
+
} else if (operation.operation === 'deleteDimension') {
|
|
242
|
+
finalColumnCount = Math.max(1, finalColumnCount - affectedCount); // Google Sheets minimum 1 column
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
operation: operation.operation,
|
|
247
|
+
dimension: operation.dimension,
|
|
248
|
+
startIndex: operation.startIndex,
|
|
249
|
+
endIndex: operation.endIndex,
|
|
250
|
+
affectedCount
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
// Validate final dimensions are within Google Sheets limits
|
|
254
|
+
if (finalRowCount > MAX_ROW_COUNT) {
|
|
255
|
+
var _logger_warn1;
|
|
256
|
+
(_logger_warn1 = logger.warn) === null || _logger_warn1 === void 0 ? void 0 : _logger_warn1.call(logger, 'Final row count exceeds Google Sheets maximum', {
|
|
257
|
+
finalRowCount,
|
|
258
|
+
maxRowCount: MAX_ROW_COUNT,
|
|
259
|
+
spreadsheetId: id,
|
|
260
|
+
sheetTitle
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
if (finalColumnCount > MAX_COLUMN_COUNT) {
|
|
264
|
+
var _logger_warn2;
|
|
265
|
+
(_logger_warn2 = logger.warn) === null || _logger_warn2 === void 0 ? void 0 : _logger_warn2.call(logger, 'Final column count exceeds Google Sheets maximum', {
|
|
266
|
+
finalColumnCount,
|
|
267
|
+
maxColumnCount: MAX_COLUMN_COUNT,
|
|
268
|
+
spreadsheetId: id,
|
|
269
|
+
sheetTitle
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
(_logger_debug2 = logger.debug) === null || _logger_debug2 === void 0 ? void 0 : _logger_debug2.call(logger, 'sheets.dimensions.batchUpdate completed successfully', {
|
|
273
|
+
totalOperations: requests.length,
|
|
274
|
+
finalRowCount,
|
|
275
|
+
finalColumnCount,
|
|
276
|
+
operationResults: operationResults.length
|
|
277
|
+
});
|
|
278
|
+
const result = {
|
|
279
|
+
type: 'success',
|
|
280
|
+
id,
|
|
281
|
+
gid: String(sheetId),
|
|
282
|
+
spreadsheetTitle: spreadsheetTitle || '',
|
|
283
|
+
spreadsheetUrl: spreadsheetUrl || '',
|
|
284
|
+
sheetTitle,
|
|
285
|
+
sheetUrl,
|
|
286
|
+
totalOperations: requests.length,
|
|
287
|
+
operationResults,
|
|
288
|
+
updatedDimensions: {
|
|
289
|
+
rows: finalRowCount,
|
|
290
|
+
columns: finalColumnCount
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
return {
|
|
294
|
+
content: [
|
|
295
|
+
{
|
|
296
|
+
type: 'text',
|
|
297
|
+
text: JSON.stringify(result)
|
|
298
|
+
}
|
|
299
|
+
],
|
|
300
|
+
structuredContent: {
|
|
301
|
+
result
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
} catch (error) {
|
|
305
|
+
var _logger_error5;
|
|
306
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
307
|
+
(_logger_error5 = logger.error) === null || _logger_error5 === void 0 ? void 0 : _logger_error5.call(logger, 'sheets.dimensions.batchUpdate error', {
|
|
308
|
+
error: message
|
|
309
|
+
});
|
|
310
|
+
throw new McpError(ErrorCode.InternalError, `Error batch updating dimensions: ${message}`, {
|
|
311
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
export default function createTool() {
|
|
316
|
+
return {
|
|
317
|
+
name: 'dimensions-batch-update',
|
|
318
|
+
config,
|
|
319
|
+
handler
|
|
320
|
+
};
|
|
321
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-sheets/src/mcp/tools/dimensions-batch-update.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { SheetGidOutput, SheetGidSchema, SpreadsheetIdOutput, SpreadsheetIdSchema } from '../../schemas/index.js';\nimport { buildDimensionRequest, calculateAffectedCount, DEFAULT_COLUMN_COUNT, DEFAULT_ROW_COUNT, type DimensionRequest, MAX_COLUMN_COUNT, MAX_ROW_COUNT, sortOperations } from './lib/dimension-operations.js';\n\n// Input schema for dimension batch update requests\nconst DimensionRequestSchema = z.object({\n operation: z.enum(['insertDimension', 'deleteDimension', 'appendDimension']).describe('Type of dimension operation to perform'),\n dimension: z.enum(['ROWS', 'COLUMNS']).describe('Whether to operate on rows or columns'),\n startIndex: z.number().int().nonnegative().describe('Starting index for the operation (0-based)'),\n endIndex: z.number().int().nonnegative().optional().describe('Ending index for the operation (0-based, exclusive). Optional - if omitted, the range is unbounded (extends to the end of the sheet)'),\n inheritFromBefore: z.boolean().optional().describe('For insertDimension: whether new rows/columns inherit properties from the row/column before the insertion point'),\n});\n\nconst inputSchema = z.object({\n id: SpreadsheetIdSchema,\n gid: SheetGidSchema,\n requests: z.array(DimensionRequestSchema).min(1).describe('Array of dimension update requests'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: SpreadsheetIdOutput,\n gid: SheetGidOutput,\n spreadsheetTitle: z.string().describe('Title of the updated spreadsheet'),\n spreadsheetUrl: z.string().describe('URL of the updated spreadsheet'),\n sheetTitle: z.string().describe('Title of the updated sheet'),\n sheetUrl: z.string().describe('URL of the updated sheet'),\n totalOperations: z.number().int().nonnegative().describe('Total number of dimension operations performed'),\n operationResults: z\n .array(\n z.object({\n operation: z.enum(['insertDimension', 'deleteDimension', 'appendDimension']).describe('Type of operation that was performed'),\n dimension: z.enum(['ROWS', 'COLUMNS']).describe('Dimension that was operated on'),\n startIndex: z.number().int().nonnegative().describe('Starting index of the operation'),\n endIndex: z.number().int().nonnegative().optional().describe('Ending index of the operation (for insert/delete)'),\n affectedCount: z.number().int().nonnegative().describe('Number of rows/columns affected by this operation'),\n })\n )\n .describe('Detailed results for each dimension operation'),\n updatedDimensions: z\n .object({\n rows: z.number().int().nonnegative().describe('Total number of rows in the sheet after all operations'),\n columns: z.number().int().nonnegative().describe('Total number of columns in the sheet after all operations'),\n })\n .describe('Final dimensions of the sheet after all operations'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Batch update sheet dimensions by inserting, deleting, or appending rows/columns. Operations are atomic (all succeed or all fail) and execute in optimal order automatically.',\n inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, gid, requests }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.debug?.('sheets.dimensions.batchUpdate called', {\n id,\n gid,\n requestCount: requests.length,\n operations: requests.map((r) => ({ operation: r.operation, dimension: r.dimension, startIndex: r.startIndex, endIndex: r.endIndex })),\n });\n\n try {\n const sheets = google.sheets({ version: 'v4', auth: extra.authContext.auth });\n\n // Get spreadsheet and sheet info in single API call\n const spreadsheetResponse = await sheets.spreadsheets.get({\n spreadsheetId: id,\n fields: 'properties.title,spreadsheetUrl,sheets.properties.sheetId,sheets.properties.title,sheets.properties.gridProperties',\n });\n\n const spreadsheetData = spreadsheetResponse.data;\n const spreadsheetTitle = spreadsheetData.properties?.title ?? '';\n const spreadsheetUrl = spreadsheetData.spreadsheetUrl ?? '';\n\n // Find sheet by gid\n const sheet = spreadsheetData.sheets?.find((s) => String(s.properties?.sheetId) === gid);\n if (!sheet?.properties) {\n logger.warn?.('Sheet not found for dimensions batch update', { id, gid, requestCount: requests.length });\n throw new McpError(ErrorCode.InvalidParams, `Sheet not found: ${gid}`);\n }\n\n const sheetTitle = sheet.properties.title ?? gid;\n const sheetId = sheet.properties.sheetId;\n\n if (sheetId === undefined || sheetId === null) {\n logger.error?.('Sheet ID not available for dimensions batch update', { id, gid, sheetTitle });\n throw new McpError(ErrorCode.InternalError, `Sheet ID not available for ${gid}. Cannot perform dimension operations without valid sheet ID.`);\n }\n\n const sheetUrl = `https://docs.google.com/spreadsheets/d/${id}/edit#gid=${sheetId}`;\n\n // Get current sheet dimensions for response calculation\n // Note: Google Sheets API may not always provide gridProperties for older sheets\n // Fall back to Google's documented defaults for new sheets\n const currentRowCount = sheet.properties.gridProperties?.rowCount ?? DEFAULT_ROW_COUNT;\n const currentColumnCount = sheet.properties.gridProperties?.columnCount ?? DEFAULT_COLUMN_COUNT;\n\n // Sort operations for optimal execution order to prevent index conflicts\n // Delete operations are processed first (high to low index) to avoid shifting issues\n // Insert/append operations are processed after (low to high index)\n const sortedRequests = sortOperations(requests as DimensionRequest[]);\n\n // Build Google Sheets API batch update requests\n const batchRequests = sortedRequests.map((operation) => buildDimensionRequest(operation, sheetId));\n\n logger.debug?.('sheets.dimensions.batchUpdate executing batch request', {\n spreadsheetId: id,\n sheetTitle,\n sheetId,\n totalOperations: batchRequests.length,\n operationTypes: sortedRequests.map((r) => r.operation),\n operationDetails: sortedRequests.map((r, i) => ({\n index: i,\n operation: r.operation,\n dimension: r.dimension,\n startIndex: r.startIndex,\n endIndex: r.endIndex,\n affectedCount: calculateAffectedCount(r),\n })),\n currentDimensions: { rows: currentRowCount, columns: currentColumnCount },\n });\n\n // Execute the atomic batch update\n const batchUpdateResponse = await sheets.spreadsheets.batchUpdate({\n spreadsheetId: id,\n requestBody: {\n requests: batchRequests,\n includeSpreadsheetInResponse: false, // We don't need the full spreadsheet data back\n },\n });\n\n const updateResult = batchUpdateResponse.data;\n\n // Comprehensive validation of batch update results\n if (!updateResult) {\n logger.error?.('Dimensions batch update failed - no response data', {\n spreadsheetId: id,\n sheetTitle,\n requestCount: requests.length,\n });\n throw new McpError(ErrorCode.InternalError, 'Batch update failed: no response data received from Google Sheets API');\n }\n\n const replies = updateResult.replies || [];\n const expectedCount = requests.length;\n const actualCount = replies.length;\n\n // Validate operation count matches expectations\n if (actualCount !== expectedCount) {\n logger.error?.('Dimensions batch update failed - operation count mismatch', {\n expectedOperations: expectedCount,\n actualReplies: actualCount,\n spreadsheetId: id,\n sheetTitle,\n receivedReplies: replies.map((reply, index) => ({\n index,\n replyType: Object.keys(reply || {})[0] || 'empty',\n })),\n });\n\n throw new McpError(ErrorCode.InternalError, `Batch operation failed: expected ${expectedCount} operations, received ${actualCount} replies. This may indicate a partial failure or Google API issue.`);\n }\n\n // Validate each reply exists - Google Sheets API may return empty objects for successful operations\n for (let i = 0; i < replies.length; i++) {\n const reply = replies[i];\n const request = sortedRequests[i];\n\n if (!request) {\n logger.error?.('Dimensions batch update failed - missing request', {\n replyIndex: i,\n hasReply: !!reply,\n hasRequest: !!request,\n spreadsheetId: id,\n sheetTitle,\n });\n throw new McpError(ErrorCode.InternalError, `Operation ${i} failed: missing request data`);\n }\n\n // Note: Google Sheets API often returns empty objects {} for successful dimension operations\n // This is normal behavior and indicates success, not failure\n // We validate that the reply exists (even if empty) rather than checking specific keys\n if (reply === null || reply === undefined) {\n logger.error?.('Dimensions batch update failed - null reply', {\n operationIndex: i,\n expectedOperation: request.operation,\n spreadsheetId: id,\n sheetTitle,\n });\n throw new McpError(ErrorCode.InternalError, `Operation ${i} (${request.operation}) failed: null reply from Google Sheets API`);\n }\n }\n\n // Calculate final dimensions and operation results\n // Note: We calculate based on the operations we performed, but actual dimensions\n // may vary slightly due to Google Sheets internal behavior (e.g., minimum dimensions)\n let finalRowCount = currentRowCount;\n let finalColumnCount = currentColumnCount;\n\n const operationResults = sortedRequests.map((operation, _index) => {\n const affectedCount = calculateAffectedCount(operation);\n\n // Update dimension counts based on operation\n // Operations are applied in sorted order, so this should match actual result\n if (operation.dimension === 'ROWS') {\n if (operation.operation === 'insertDimension') {\n finalRowCount += affectedCount;\n } else if (operation.operation === 'appendDimension') {\n finalRowCount += affectedCount;\n } else if (operation.operation === 'deleteDimension') {\n finalRowCount = Math.max(1, finalRowCount - affectedCount); // Google Sheets minimum 1 row\n }\n } else if (operation.dimension === 'COLUMNS') {\n if (operation.operation === 'insertDimension') {\n finalColumnCount += affectedCount;\n } else if (operation.operation === 'appendDimension') {\n finalColumnCount += affectedCount;\n } else if (operation.operation === 'deleteDimension') {\n finalColumnCount = Math.max(1, finalColumnCount - affectedCount); // Google Sheets minimum 1 column\n }\n }\n\n return {\n operation: operation.operation,\n dimension: operation.dimension,\n startIndex: operation.startIndex,\n endIndex: operation.endIndex,\n affectedCount,\n };\n });\n\n // Validate final dimensions are within Google Sheets limits\n if (finalRowCount > MAX_ROW_COUNT) {\n logger.warn?.('Final row count exceeds Google Sheets maximum', {\n finalRowCount,\n maxRowCount: MAX_ROW_COUNT,\n spreadsheetId: id,\n sheetTitle,\n });\n }\n if (finalColumnCount > MAX_COLUMN_COUNT) {\n logger.warn?.('Final column count exceeds Google Sheets maximum', {\n finalColumnCount,\n maxColumnCount: MAX_COLUMN_COUNT,\n spreadsheetId: id,\n sheetTitle,\n });\n }\n\n logger.debug?.('sheets.dimensions.batchUpdate completed successfully', {\n totalOperations: requests.length,\n finalRowCount,\n finalColumnCount,\n operationResults: operationResults.length,\n });\n\n const result: Output = {\n type: 'success' as const,\n id,\n gid: String(sheetId),\n spreadsheetTitle: spreadsheetTitle || '',\n spreadsheetUrl: spreadsheetUrl || '',\n sheetTitle,\n sheetUrl,\n totalOperations: requests.length,\n operationResults,\n updatedDimensions: {\n rows: finalRowCount,\n columns: finalColumnCount,\n },\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error?.('sheets.dimensions.batchUpdate error', { error: message });\n throw new McpError(ErrorCode.InternalError, `Error batch updating dimensions: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'dimensions-batch-update',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ErrorCode","McpError","google","z","SheetGidOutput","SheetGidSchema","SpreadsheetIdOutput","SpreadsheetIdSchema","buildDimensionRequest","calculateAffectedCount","DEFAULT_COLUMN_COUNT","DEFAULT_ROW_COUNT","MAX_COLUMN_COUNT","MAX_ROW_COUNT","sortOperations","DimensionRequestSchema","object","operation","enum","describe","dimension","startIndex","number","int","nonnegative","endIndex","optional","inheritFromBefore","boolean","inputSchema","id","gid","requests","array","min","successBranchSchema","type","literal","spreadsheetTitle","string","spreadsheetUrl","sheetTitle","sheetUrl","totalOperations","operationResults","affectedCount","updatedDimensions","rows","columns","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","debug","requestCount","length","operations","map","r","spreadsheetData","sheet","sheets","version","auth","authContext","spreadsheetResponse","spreadsheets","get","spreadsheetId","fields","data","properties","title","find","s","String","sheetId","warn","InvalidParams","undefined","error","InternalError","currentRowCount","gridProperties","rowCount","currentColumnCount","columnCount","sortedRequests","batchRequests","operationTypes","operationDetails","i","index","currentDimensions","batchUpdateResponse","batchUpdate","requestBody","includeSpreadsheetInResponse","updateResult","replies","expectedCount","actualCount","expectedOperations","actualReplies","receivedReplies","reply","replyType","Object","keys","request","replyIndex","hasReply","hasRequest","operationIndex","expectedOperation","finalRowCount","finalColumnCount","_index","Math","max","maxRowCount","maxColumnCount","content","text","JSON","stringify","structuredContent","message","Error","stack","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,sBAAsB;AAE9C,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAIrC,SAASE,SAAS,EAAEC,QAAQ,QAAQ,qCAAqC;AACzE,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,cAAc,EAAEC,cAAc,EAAEC,mBAAmB,EAAEC,mBAAmB,QAAQ,yBAAyB;AAClH,SAASC,qBAAqB,EAAEC,sBAAsB,EAAEC,oBAAoB,EAAEC,iBAAiB,EAAyBC,gBAAgB,EAAEC,aAAa,EAAEC,cAAc,QAAQ,gCAAgC;AAE/M,mDAAmD;AACnD,MAAMC,yBAAyBZ,EAAEa,MAAM,CAAC;IACtCC,WAAWd,EAAEe,IAAI,CAAC;QAAC;QAAmB;QAAmB;KAAkB,EAAEC,QAAQ,CAAC;IACtFC,WAAWjB,EAAEe,IAAI,CAAC;QAAC;QAAQ;KAAU,EAAEC,QAAQ,CAAC;IAChDE,YAAYlB,EAAEmB,MAAM,GAAGC,GAAG,GAAGC,WAAW,GAAGL,QAAQ,CAAC;IACpDM,UAAUtB,EAAEmB,MAAM,GAAGC,GAAG,GAAGC,WAAW,GAAGE,QAAQ,GAAGP,QAAQ,CAAC;IAC7DQ,mBAAmBxB,EAAEyB,OAAO,GAAGF,QAAQ,GAAGP,QAAQ,CAAC;AACrD;AAEA,MAAMU,cAAc1B,EAAEa,MAAM,CAAC;IAC3Bc,IAAIvB;IACJwB,KAAK1B;IACL2B,UAAU7B,EAAE8B,KAAK,CAAClB,wBAAwBmB,GAAG,CAAC,GAAGf,QAAQ,CAAC;AAC5D;AAEA,wBAAwB;AACxB,MAAMgB,sBAAsBhC,EAAEa,MAAM,CAAC;IACnCoB,MAAMjC,EAAEkC,OAAO,CAAC;IAChBP,IAAIxB;IACJyB,KAAK3B;IACLkC,kBAAkBnC,EAAEoC,MAAM,GAAGpB,QAAQ,CAAC;IACtCqB,gBAAgBrC,EAAEoC,MAAM,GAAGpB,QAAQ,CAAC;IACpCsB,YAAYtC,EAAEoC,MAAM,GAAGpB,QAAQ,CAAC;IAChCuB,UAAUvC,EAAEoC,MAAM,GAAGpB,QAAQ,CAAC;IAC9BwB,iBAAiBxC,EAAEmB,MAAM,GAAGC,GAAG,GAAGC,WAAW,GAAGL,QAAQ,CAAC;IACzDyB,kBAAkBzC,EACf8B,KAAK,CACJ9B,EAAEa,MAAM,CAAC;QACPC,WAAWd,EAAEe,IAAI,CAAC;YAAC;YAAmB;YAAmB;SAAkB,EAAEC,QAAQ,CAAC;QACtFC,WAAWjB,EAAEe,IAAI,CAAC;YAAC;YAAQ;SAAU,EAAEC,QAAQ,CAAC;QAChDE,YAAYlB,EAAEmB,MAAM,GAAGC,GAAG,GAAGC,WAAW,GAAGL,QAAQ,CAAC;QACpDM,UAAUtB,EAAEmB,MAAM,GAAGC,GAAG,GAAGC,WAAW,GAAGE,QAAQ,GAAGP,QAAQ,CAAC;QAC7D0B,eAAe1C,EAAEmB,MAAM,GAAGC,GAAG,GAAGC,WAAW,GAAGL,QAAQ,CAAC;IACzD,IAEDA,QAAQ,CAAC;IACZ2B,mBAAmB3C,EAChBa,MAAM,CAAC;QACN+B,MAAM5C,EAAEmB,MAAM,GAAGC,GAAG,GAAGC,WAAW,GAAGL,QAAQ,CAAC;QAC9C6B,SAAS7C,EAAEmB,MAAM,GAAGC,GAAG,GAAGC,WAAW,GAAGL,QAAQ,CAAC;IACnD,GACCA,QAAQ,CAAC;AACd;AAEA,MAAM8B,eAAe9C,EAAE+C,kBAAkB,CAAC,QAAQ;IAACf;IAAqBpC;CAAyB;AAEjG,MAAMoD,SAAS;IACbC,aAAa;IACbvB;IACAoB,cAAc9C,EAAEa,MAAM,CAAC;QACrBqC,QAAQJ;IACV;AACF;AAKA,eAAeK,QAAQ,EAAExB,EAAE,EAAEC,GAAG,EAAEC,QAAQ,EAAS,EAAEuB,KAAoB;QAEvEC;IADA,MAAMA,SAASD,MAAMC,MAAM;KAC3BA,gBAAAA,OAAOC,KAAK,cAAZD,oCAAAA,mBAAAA,QAAe,wCAAwC;QACrD1B;QACAC;QACA2B,cAAc1B,SAAS2B,MAAM;QAC7BC,YAAY5B,SAAS6B,GAAG,CAAC,CAACC,IAAO,CAAA;gBAAE7C,WAAW6C,EAAE7C,SAAS;gBAAEG,WAAW0C,EAAE1C,SAAS;gBAAEC,YAAYyC,EAAEzC,UAAU;gBAAEI,UAAUqC,EAAErC,QAAQ;YAAC,CAAA;IACpI;IAEA,IAAI;kBAWqBsC,iCASJC;YAVMD,6BAIXA,yBAmBUC,kCACGA,mCAU3BR,gBAgJAA;QA3LA,MAAMS,SAAS/D,OAAO+D,MAAM,CAAC;YAAEC,SAAS;YAAMC,MAAMZ,MAAMa,WAAW,CAACD,IAAI;QAAC;QAE3E,oDAAoD;QACpD,MAAME,sBAAsB,MAAMJ,OAAOK,YAAY,CAACC,GAAG,CAAC;YACxDC,eAAe1C;YACf2C,QAAQ;QACV;QAEA,MAAMV,kBAAkBM,oBAAoBK,IAAI;QAChD,MAAMpC,4BAAmByB,8BAAAA,gBAAgBY,UAAU,cAA1BZ,kDAAAA,4BAA4Ba,KAAK,uCAAI;QAC9D,MAAMpC,kBAAiBuB,kCAAAA,gBAAgBvB,cAAc,cAA9BuB,6CAAAA,kCAAkC;QAEzD,oBAAoB;QACpB,MAAMC,SAAQD,0BAAAA,gBAAgBE,MAAM,cAAtBF,8CAAAA,wBAAwBc,IAAI,CAAC,CAACC;gBAAaA;mBAAPC,QAAOD,gBAAAA,EAAEH,UAAU,cAAZG,oCAAAA,cAAcE,OAAO,MAAMjD;;QACpF,IAAI,EAACiC,kBAAAA,4BAAAA,MAAOW,UAAU,GAAE;gBACtBnB;aAAAA,eAAAA,OAAOyB,IAAI,cAAXzB,mCAAAA,kBAAAA,QAAc,+CAA+C;gBAAE1B;gBAAIC;gBAAK2B,cAAc1B,SAAS2B,MAAM;YAAC;YACtG,MAAM,IAAI1D,SAASD,UAAUkF,aAAa,EAAE,CAAC,iBAAiB,EAAEnD,KAAK;QACvE;QAEA,MAAMU,cAAauB,0BAAAA,MAAMW,UAAU,CAACC,KAAK,cAAtBZ,qCAAAA,0BAA0BjC;QAC7C,MAAMiD,UAAUhB,MAAMW,UAAU,CAACK,OAAO;QAExC,IAAIA,YAAYG,aAAaH,YAAY,MAAM;gBAC7CxB;aAAAA,gBAAAA,OAAO4B,KAAK,cAAZ5B,oCAAAA,mBAAAA,QAAe,sDAAsD;gBAAE1B;gBAAIC;gBAAKU;YAAW;YAC3F,MAAM,IAAIxC,SAASD,UAAUqF,aAAa,EAAE,CAAC,2BAA2B,EAAEtD,IAAI,6DAA6D,CAAC;QAC9I;QAEA,MAAMW,WAAW,CAAC,uCAAuC,EAAEZ,GAAG,UAAU,EAAEkD,SAAS;QAEnF,wDAAwD;QACxD,iFAAiF;QACjF,2DAA2D;QAC3D,MAAMM,4BAAkBtB,mCAAAA,MAAMW,UAAU,CAACY,cAAc,cAA/BvB,uDAAAA,iCAAiCwB,QAAQ,yCAAI7E;QACrE,MAAM8E,+BAAqBzB,oCAAAA,MAAMW,UAAU,CAACY,cAAc,cAA/BvB,wDAAAA,kCAAiC0B,WAAW,yCAAIhF;QAE3E,yEAAyE;QACzE,qFAAqF;QACrF,mEAAmE;QACnE,MAAMiF,iBAAiB7E,eAAekB;QAEtC,gDAAgD;QAChD,MAAM4D,gBAAgBD,eAAe9B,GAAG,CAAC,CAAC5C,YAAcT,sBAAsBS,WAAW+D;SAEzFxB,iBAAAA,OAAOC,KAAK,cAAZD,qCAAAA,oBAAAA,QAAe,yDAAyD;YACtEgB,eAAe1C;YACfW;YACAuC;YACArC,iBAAiBiD,cAAcjC,MAAM;YACrCkC,gBAAgBF,eAAe9B,GAAG,CAAC,CAACC,IAAMA,EAAE7C,SAAS;YACrD6E,kBAAkBH,eAAe9B,GAAG,CAAC,CAACC,GAAGiC,IAAO,CAAA;oBAC9CC,OAAOD;oBACP9E,WAAW6C,EAAE7C,SAAS;oBACtBG,WAAW0C,EAAE1C,SAAS;oBACtBC,YAAYyC,EAAEzC,UAAU;oBACxBI,UAAUqC,EAAErC,QAAQ;oBACpBoB,eAAepC,uBAAuBqD;gBACxC,CAAA;YACAmC,mBAAmB;gBAAElD,MAAMuC;gBAAiBtC,SAASyC;YAAmB;QAC1E;QAEA,kCAAkC;QAClC,MAAMS,sBAAsB,MAAMjC,OAAOK,YAAY,CAAC6B,WAAW,CAAC;YAChE3B,eAAe1C;YACfsE,aAAa;gBACXpE,UAAU4D;gBACVS,8BAA8B;YAChC;QACF;QAEA,MAAMC,eAAeJ,oBAAoBxB,IAAI;QAE7C,mDAAmD;QACnD,IAAI,CAAC4B,cAAc;gBACjB9C;aAAAA,iBAAAA,OAAO4B,KAAK,cAAZ5B,qCAAAA,oBAAAA,QAAe,qDAAqD;gBAClEgB,eAAe1C;gBACfW;gBACAiB,cAAc1B,SAAS2B,MAAM;YAC/B;YACA,MAAM,IAAI1D,SAASD,UAAUqF,aAAa,EAAE;QAC9C;QAEA,MAAMkB,UAAUD,aAAaC,OAAO,IAAI,EAAE;QAC1C,MAAMC,gBAAgBxE,SAAS2B,MAAM;QACrC,MAAM8C,cAAcF,QAAQ5C,MAAM;QAElC,gDAAgD;QAChD,IAAI8C,gBAAgBD,eAAe;gBACjChD;aAAAA,iBAAAA,OAAO4B,KAAK,cAAZ5B,qCAAAA,oBAAAA,QAAe,6DAA6D;gBAC1EkD,oBAAoBF;gBACpBG,eAAeF;gBACfjC,eAAe1C;gBACfW;gBACAmE,iBAAiBL,QAAQ1C,GAAG,CAAC,CAACgD,OAAOb,QAAW,CAAA;wBAC9CA;wBACAc,WAAWC,OAAOC,IAAI,CAACH,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI;oBAC5C,CAAA;YACF;YAEA,MAAM,IAAI5G,SAASD,UAAUqF,aAAa,EAAE,CAAC,iCAAiC,EAAEmB,cAAc,sBAAsB,EAAEC,YAAY,kEAAkE,CAAC;QACvM;QAEA,oGAAoG;QACpG,IAAK,IAAIV,IAAI,GAAGA,IAAIQ,QAAQ5C,MAAM,EAAEoC,IAAK;YACvC,MAAMc,QAAQN,OAAO,CAACR,EAAE;YACxB,MAAMkB,UAAUtB,cAAc,CAACI,EAAE;YAEjC,IAAI,CAACkB,SAAS;oBACZzD;iBAAAA,iBAAAA,OAAO4B,KAAK,cAAZ5B,qCAAAA,oBAAAA,QAAe,oDAAoD;oBACjE0D,YAAYnB;oBACZoB,UAAU,CAAC,CAACN;oBACZO,YAAY,CAAC,CAACH;oBACdzC,eAAe1C;oBACfW;gBACF;gBACA,MAAM,IAAIxC,SAASD,UAAUqF,aAAa,EAAE,CAAC,UAAU,EAAEU,EAAE,6BAA6B,CAAC;YAC3F;YAEA,6FAA6F;YAC7F,6DAA6D;YAC7D,uFAAuF;YACvF,IAAIc,UAAU,QAAQA,UAAU1B,WAAW;oBACzC3B;iBAAAA,iBAAAA,OAAO4B,KAAK,cAAZ5B,qCAAAA,oBAAAA,QAAe,+CAA+C;oBAC5D6D,gBAAgBtB;oBAChBuB,mBAAmBL,QAAQhG,SAAS;oBACpCuD,eAAe1C;oBACfW;gBACF;gBACA,MAAM,IAAIxC,SAASD,UAAUqF,aAAa,EAAE,CAAC,UAAU,EAAEU,EAAE,EAAE,EAAEkB,QAAQhG,SAAS,CAAC,2CAA2C,CAAC;YAC/H;QACF;QAEA,mDAAmD;QACnD,iFAAiF;QACjF,sFAAsF;QACtF,IAAIsG,gBAAgBjC;QACpB,IAAIkC,mBAAmB/B;QAEvB,MAAM7C,mBAAmB+C,eAAe9B,GAAG,CAAC,CAAC5C,WAAWwG;YACtD,MAAM5E,gBAAgBpC,uBAAuBQ;YAE7C,6CAA6C;YAC7C,6EAA6E;YAC7E,IAAIA,UAAUG,SAAS,KAAK,QAAQ;gBAClC,IAAIH,UAAUA,SAAS,KAAK,mBAAmB;oBAC7CsG,iBAAiB1E;gBACnB,OAAO,IAAI5B,UAAUA,SAAS,KAAK,mBAAmB;oBACpDsG,iBAAiB1E;gBACnB,OAAO,IAAI5B,UAAUA,SAAS,KAAK,mBAAmB;oBACpDsG,gBAAgBG,KAAKC,GAAG,CAAC,GAAGJ,gBAAgB1E,gBAAgB,8BAA8B;gBAC5F;YACF,OAAO,IAAI5B,UAAUG,SAAS,KAAK,WAAW;gBAC5C,IAAIH,UAAUA,SAAS,KAAK,mBAAmB;oBAC7CuG,oBAAoB3E;gBACtB,OAAO,IAAI5B,UAAUA,SAAS,KAAK,mBAAmB;oBACpDuG,oBAAoB3E;gBACtB,OAAO,IAAI5B,UAAUA,SAAS,KAAK,mBAAmB;oBACpDuG,mBAAmBE,KAAKC,GAAG,CAAC,GAAGH,mBAAmB3E,gBAAgB,iCAAiC;gBACrG;YACF;YAEA,OAAO;gBACL5B,WAAWA,UAAUA,SAAS;gBAC9BG,WAAWH,UAAUG,SAAS;gBAC9BC,YAAYJ,UAAUI,UAAU;gBAChCI,UAAUR,UAAUQ,QAAQ;gBAC5BoB;YACF;QACF;QAEA,4DAA4D;QAC5D,IAAI0E,gBAAgB1G,eAAe;gBACjC2C;aAAAA,gBAAAA,OAAOyB,IAAI,cAAXzB,oCAAAA,mBAAAA,QAAc,iDAAiD;gBAC7D+D;gBACAK,aAAa/G;gBACb2D,eAAe1C;gBACfW;YACF;QACF;QACA,IAAI+E,mBAAmB5G,kBAAkB;gBACvC4C;aAAAA,gBAAAA,OAAOyB,IAAI,cAAXzB,oCAAAA,mBAAAA,QAAc,oDAAoD;gBAChEgE;gBACAK,gBAAgBjH;gBAChB4D,eAAe1C;gBACfW;YACF;QACF;SAEAe,iBAAAA,OAAOC,KAAK,cAAZD,qCAAAA,oBAAAA,QAAe,wDAAwD;YACrEb,iBAAiBX,SAAS2B,MAAM;YAChC4D;YACAC;YACA5E,kBAAkBA,iBAAiBe,MAAM;QAC3C;QAEA,MAAMN,SAAiB;YACrBjB,MAAM;YACNN;YACAC,KAAKgD,OAAOC;YACZ1C,kBAAkBA,oBAAoB;YACtCE,gBAAgBA,kBAAkB;YAClCC;YACAC;YACAC,iBAAiBX,SAAS2B,MAAM;YAChCf;YACAE,mBAAmB;gBACjBC,MAAMwE;gBACNvE,SAASwE;YACX;QACF;QAEA,OAAO;YACLM,SAAS;gBAAC;oBAAE1F,MAAM;oBAAiB2F,MAAMC,KAAKC,SAAS,CAAC5E;gBAAQ;aAAE;YAClE6E,mBAAmB;gBAAE7E;YAAO;QAC9B;IACF,EAAE,OAAO+B,OAAO;YAEd5B;QADA,MAAM2E,UAAU/C,iBAAiBgD,QAAQhD,MAAM+C,OAAO,GAAGpD,OAAOK;SAChE5B,iBAAAA,OAAO4B,KAAK,cAAZ5B,qCAAAA,oBAAAA,QAAe,uCAAuC;YAAE4B,OAAO+C;QAAQ;QACvE,MAAM,IAAIlI,SAASD,UAAUqF,aAAa,EAAE,CAAC,iCAAiC,EAAE8C,SAAS,EAAE;YACzFE,OAAOjD,iBAAiBgD,QAAQhD,MAAMiD,KAAK,GAAGlD;QAChD;IACF;AACF;AAEA,eAAe,SAASmD;IACtB,OAAO;QACLC,MAAM;QACNpF;QACAG;IACF;AACF"}
|