Files
wehub-resource-sync d25d482dc2
Publish CLI Package / publish-npm (push) Waiting to run
Publish Python SDK / publish-pypi (push) Waiting to run
Publish TypeScript SDK / publish-npm (push) Waiting to run
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

138 lines
3.9 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { createLogger } from '@sim/logger'
import { authJsonHeaders, batchUpdateUrl, presentationUrl } from '@/tools/google_slides/utils'
import type { ToolConfig } from '@/tools/types'
const logger = createLogger('GoogleSlidesMergeTableCellsTool')
interface MergeTableCellsParams {
accessToken: string
presentationId: string
objectId: string
rowIndex: number
columnIndex: number
rowSpan: number
columnSpan: number
}
interface MergeTableCellsResponse {
success: boolean
output: {
merged: boolean
objectId: string
metadata: { presentationId: string; url: string }
}
}
export const mergeTableCellsTool: ToolConfig<MergeTableCellsParams, MergeTableCellsResponse> = {
id: 'google_slides_merge_table_cells',
name: 'Merge Table Cells in Google Slides',
description:
'Merge a rectangular range of table cells into a single cell. The range starts at (rowIndex, columnIndex) and covers rowSpan × columnSpan cells.',
version: '1.0.0',
oauth: { required: true, provider: 'google-drive' },
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'The access token for the Google Slides API',
},
presentationId: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Google Slides presentation ID',
},
objectId: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Object ID of the table',
},
rowIndex: {
type: 'number',
required: true,
visibility: 'user-or-llm',
description: 'Zero-based row index of the top-left cell',
},
columnIndex: {
type: 'number',
required: true,
visibility: 'user-or-llm',
description: 'Zero-based column index of the top-left cell',
},
rowSpan: {
type: 'number',
required: true,
visibility: 'user-or-llm',
description: 'Number of rows to merge (minimum 1)',
},
columnSpan: {
type: 'number',
required: true,
visibility: 'user-or-llm',
description: 'Number of columns to merge (minimum 1)',
},
},
request: {
url: (params) => batchUpdateUrl(params.presentationId),
method: 'POST',
headers: (params) => authJsonHeaders(params.accessToken),
body: (params) => {
const objectId = params.objectId?.trim()
if (!objectId) throw new Error('Table object ID is required')
if (!params.rowSpan || params.rowSpan < 1) throw new Error('rowSpan must be at least 1')
if (!params.columnSpan || params.columnSpan < 1)
throw new Error('columnSpan must be at least 1')
return {
requests: [
{
mergeTableCells: {
objectId,
tableRange: {
location: { rowIndex: params.rowIndex, columnIndex: params.columnIndex },
rowSpan: params.rowSpan,
columnSpan: params.columnSpan,
},
},
},
],
}
},
},
transformResponse: async (response: Response, params) => {
const data = await response.json()
if (!response.ok) {
logger.error('Google Slides API error:', { data })
throw new Error(data.error?.message || 'Failed to merge table cells')
}
const presentationId = params?.presentationId?.trim() || ''
return {
success: true,
output: {
merged: true,
objectId: params?.objectId?.trim() || '',
metadata: { presentationId, url: presentationUrl(presentationId) },
},
}
},
outputs: {
merged: { type: 'boolean', description: 'Whether the cells were merged' },
objectId: { type: 'string', description: 'The table updated' },
metadata: {
type: 'object',
description: 'Operation metadata',
properties: {
presentationId: { type: 'string', description: 'The presentation ID' },
url: { type: 'string', description: 'URL to the presentation' },
},
},
},
}