@commandable/mcp 0.10.0 → 0.11.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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "date": "2026-04-05T18:36:03.921Z",
2
+ "date": "2026-04-07T07:13:44.082Z",
3
3
  "preset": "node-server",
4
4
  "framework": {
5
5
  "name": "nuxt",
@@ -1 +1 @@
1
- {"id":"0857a55b-f766-4fe6-86be-9bd9d857861a","timestamp":1775414150491}
1
+ {"id":"9441a86b-16e9-4000-bffc-3b2e78e57710","timestamp":1775546010813}
@@ -0,0 +1 @@
1
+ {"id":"9441a86b-16e9-4000-bffc-3b2e78e57710","timestamp":1775546010813,"prerendered":[]}
@@ -1,9 +1,9 @@
1
1
  const interopDefault = r => r.default || r || [];
2
2
  const styles = {
3
- "../../node_modules/nuxt/dist/app/components/error-404.vue": () => import('./error-404-styles.Bvxdxqjk.mjs').then(interopDefault),
4
3
  "../../node_modules/nuxt/dist/app/components/error-500.vue": () => import('./error-500-styles.BnYAAXSg.mjs').then(interopDefault),
5
- "../../node_modules/nuxt/dist/app/components/error-404.vue?vue&type=style&index=0&scoped=eed6b592&lang.css": () => import('./error-404-styles.Bvxdxqjk.mjs').then(interopDefault),
4
+ "../../node_modules/nuxt/dist/app/components/error-404.vue": () => import('./error-404-styles.Bvxdxqjk.mjs').then(interopDefault),
6
5
  "../../node_modules/nuxt/dist/app/components/error-500.vue?vue&type=style&index=0&scoped=4b5190e7&lang.css": () => import('./error-500-styles.BnYAAXSg.mjs').then(interopDefault),
6
+ "../../node_modules/nuxt/dist/app/components/error-404.vue?vue&type=style&index=0&scoped=eed6b592&lang.css": () => import('./error-404-styles.Bvxdxqjk.mjs').then(interopDefault),
7
7
  "components/IntegrationCredentials.vue": () => import('./IntegrationCredentials-styles.COcCfJmp.mjs').then(interopDefault),
8
8
  "components/IntegrationCredentials.vue?vue&type=style&index=0&scoped=7de84f63&lang.css": () => import('./IntegrationCredentials-styles.COcCfJmp.mjs').then(interopDefault)
9
9
  };
@@ -4431,7 +4431,7 @@ function _expandFromEnv(value) {
4431
4431
  const _inlineRuntimeConfig = {
4432
4432
  "app": {
4433
4433
  "baseURL": "/",
4434
- "buildId": "0857a55b-f766-4fe6-86be-9bd9d857861a",
4434
+ "buildId": "9441a86b-16e9-4000-bffc-3b2e78e57710",
4435
4435
  "buildAssetsDir": "/_nuxt/",
4436
4436
  "cdnURL": ""
4437
4437
  },
@@ -15844,6 +15844,467 @@ const GENERATED_INTEGRATIONS = {
15844
15844
  ],
15845
15845
  "variantOwnerType": null
15846
15846
  },
15847
+ "sharepoint": {
15848
+ "manifest": {
15849
+ "name": "sharepoint",
15850
+ "version": "0.1.0",
15851
+ "baseUrl": "https://graph.microsoft.com/v1.0",
15852
+ "tools": [
15853
+ {
15854
+ "name": "search_sites",
15855
+ "description": "Search SharePoint sites by keyword across the tenant. Returns compact site summaries with IDs and web URLs. Use this when you know the site name or topic but not the site ID. If you already know the hostname and path, use get_site_by_path instead.",
15856
+ "inputSchema": "schemas/search_sites.json",
15857
+ "handler": "handlers/search_sites.js",
15858
+ "scope": "read"
15859
+ },
15860
+ {
15861
+ "name": "get_site_by_path",
15862
+ "description": "Resolve a SharePoint site from its hostname and server-relative path, such as hostname='contoso.sharepoint.com' and relativePath='//Marketing'. Use this when you know the SharePoint URL structure and need the stable site ID for later calls.",
15863
+ "inputSchema": "schemas/get_site_by_path.json",
15864
+ "handler": "handlers/get_site_by_path.js",
15865
+ "scope": "read"
15866
+ },
15867
+ {
15868
+ "name": "get_site",
15869
+ "description": "Get metadata for a SharePoint site by site ID. Returns the site name, description, web URL, and timestamps. Use search_sites or get_site_by_path first if you do not already know the site ID.",
15870
+ "inputSchema": "schemas/get_site.json",
15871
+ "handler": "handlers/get_site.js",
15872
+ "scope": "read"
15873
+ },
15874
+ {
15875
+ "name": "list_site_drives",
15876
+ "description": "List document libraries (drives) for a SharePoint site. Returns compact drive summaries including IDs, names, web URLs, and drive type. Use this after resolving a site to discover the right document library before browsing folders or reading files.",
15877
+ "inputSchema": "schemas/list_site_drives.json",
15878
+ "handler": "handlers/list_site_drives.js",
15879
+ "scope": "read"
15880
+ },
15881
+ {
15882
+ "name": "list_drive_children",
15883
+ "description": "List the files and folders inside a SharePoint document library folder. By default this lists the root of the drive. Provide itemId to browse a specific folder. Returns compact entries with file-or-folder flags, MIME type when available, and parent references. Use get_drive_item_meta when you need one specific item.",
15884
+ "inputSchema": "schemas/list_drive_children.json",
15885
+ "handler": "handlers/list_drive_children.js",
15886
+ "scope": "read"
15887
+ },
15888
+ {
15889
+ "name": "get_drive_item_meta",
15890
+ "description": "Get metadata for a single SharePoint file or folder by drive ID and item ID. Returns a compact item summary including IDs, name, type flags, web URL, size, timestamps, and parent reference. Use read_file_content to read the actual file contents.",
15891
+ "inputSchema": "schemas/get_drive_item.json",
15892
+ "handler": "handlers/get_drive_item.js",
15893
+ "scope": "read"
15894
+ },
15895
+ {
15896
+ "name": "search_files",
15897
+ "description": "Search SharePoint and OneDrive content through Microsoft Graph search and return flattened file hits. Provide a query string; Graph KQL syntax is supported. Optional siteId and driveId filters narrow the flattened results after search. Use this for broad file discovery when folder-by-folder browsing is too narrow.",
15898
+ "inputSchema": "schemas/search_files.json",
15899
+ "handler": "handlers/search_files.js",
15900
+ "scope": "read"
15901
+ },
15902
+ {
15903
+ "name": "read_file_content",
15904
+ "description": "Read a SharePoint file into agent-friendly text using the shared file extraction pipeline. This is the standard way to consume document contents such as PDF, DOCX, XLSX, PPTX, and text-like files stored in SharePoint document libraries. Provide driveId and itemId. Folders are rejected; use list_drive_children to browse them.",
15905
+ "inputSchema": "schemas/read_file_content.json",
15906
+ "handler": "handlers/read_file_content.js",
15907
+ "scope": "read"
15908
+ },
15909
+ {
15910
+ "name": "create_folder",
15911
+ "description": "Create a new folder in a SharePoint document library. By default the folder is created in the drive root. Provide parentItemId to create it inside an existing folder. Returns the created folder metadata including its item ID for later browsing or moves.",
15912
+ "inputSchema": "schemas/create_folder.json",
15913
+ "handler": "handlers/create_folder.js",
15914
+ "scope": "write"
15915
+ },
15916
+ {
15917
+ "name": "move_drive_item",
15918
+ "description": "Move a SharePoint file or folder to a different parent folder in the same drive. Provide destinationParentId and optionally a newName to rename during the move. Use get_drive_item_meta or list_drive_children first to discover the current item and destination IDs.",
15919
+ "inputSchema": "schemas/move_drive_item.json",
15920
+ "handler": "handlers/move_drive_item.js",
15921
+ "scope": "write"
15922
+ },
15923
+ {
15924
+ "name": "delete_drive_item",
15925
+ "description": "Delete a SharePoint file or folder by drive ID and item ID. This is a destructive operation. Use get_drive_item_meta or list_drive_children first to confirm you have the correct item before deleting it.",
15926
+ "inputSchema": "schemas/delete_drive_item.json",
15927
+ "handler": "handlers/delete_drive_item.js",
15928
+ "scope": "write"
15929
+ }
15930
+ ]
15931
+ },
15932
+ "prompt": "Use this integration for SharePoint document libraries and files.\n\nRecommended workflow:\n\n1. If you know the SharePoint hostname and path, start with `get_site_by_path`.\n2. Otherwise use `search_sites` to discover the correct site.\n3. Use `list_site_drives` to find the relevant document library for that site.\n4. Use `list_drive_children` for deterministic folder browsing or `search_files` for broader file discovery.\n5. Use `get_drive_item_meta` when you need compact metadata for a specific file or folder.\n6. Use `read_file_content` to consume the actual contents of a file in agent-friendly text.\n\nNotes:\n\n- `search_files` uses Microsoft Graph search. The `query` field accepts normal keywords and Graph KQL syntax.\n- `siteId` and `driveId` filters on `search_files` are applied to the flattened search results after Graph returns them.\n- `read_file_content` is for files only. Folders do not have readable file content.\n- This v1 integration is intentionally focused on SharePoint sites, document libraries, folders, and files. It does not include classic SharePoint list/list-item tools or file upload.\n",
15933
+ "variants": {
15934
+ "variants": {
15935
+ "app_credentials": {
15936
+ "label": "Microsoft Graph App Credentials",
15937
+ "schema": {
15938
+ "type": "object",
15939
+ "properties": {
15940
+ "tenantId": {
15941
+ "type": "string",
15942
+ "title": "Tenant ID",
15943
+ "description": "Microsoft Entra tenant ID (GUID) that owns the SharePoint tenant."
15944
+ },
15945
+ "clientId": {
15946
+ "type": "string",
15947
+ "title": "Client ID",
15948
+ "description": "Application (client) ID of the Microsoft Entra app registration."
15949
+ },
15950
+ "clientSecret": {
15951
+ "type": "string",
15952
+ "title": "Client Secret",
15953
+ "description": "Client secret value for the Microsoft Entra app registration.",
15954
+ "format": "password"
15955
+ }
15956
+ },
15957
+ "required": [
15958
+ "tenantId",
15959
+ "clientId",
15960
+ "clientSecret"
15961
+ ],
15962
+ "additionalProperties": false
15963
+ },
15964
+ "preprocess": {
15965
+ "type": "handler",
15966
+ "handlerCode": "async (creds, utils) => {\n const tenantId = String(creds?.tenantId || '').trim()\n const clientId = String(creds?.clientId || '').trim()\n const clientSecret = String(creds?.clientSecret || '').trim()\n\n if (!tenantId)\n throw new Error('Missing tenantId')\n if (!clientId)\n throw new Error('Missing clientId')\n if (!clientSecret)\n throw new Error('Missing clientSecret')\n\n const response = await utils.tokenFetch(\n `https://login.microsoftonline.com/${encodeURIComponent(tenantId)}/oauth2/v2.0/token`,\n {\n method: 'POST',\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n scope: 'https://graph.microsoft.com/.default',\n }),\n },\n )\n\n const data = await response.json()\n if (!response.ok) {\n const message = typeof data?.error_description === 'string'\n ? data.error_description\n : (typeof data?.error === 'string' ? data.error : `Token request failed with status ${response.status}`)\n throw new Error(message)\n }\n\n const token = typeof data?.access_token === 'string' ? data.access_token : ''\n if (!token)\n throw new Error('Microsoft token response did not include access_token')\n\n return {\n token,\n expiresIn: data?.expires_in,\n }\n}",
15967
+ "allowedOrigins": [
15968
+ "https://login.microsoftonline.com"
15969
+ ]
15970
+ },
15971
+ "injection": {
15972
+ "headers": {
15973
+ "Authorization": "Bearer {{token}}"
15974
+ }
15975
+ },
15976
+ "healthCheck": {
15977
+ "notViable": true
15978
+ }
15979
+ }
15980
+ },
15981
+ "default": "app_credentials"
15982
+ },
15983
+ "hint": "1. Create or use a Microsoft Entra app registration for Microsoft Graph at https://entra.microsoft.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade\n2. Create a client secret for that app and copy the **tenant ID**, **client ID**, and **client secret value**.\n3. In Microsoft Graph **Application permissions**, grant at least `Sites.Read.All` and `Files.Read.All`.\n4. If you intend to use write actions such as folder creation, moves, and deletes, also grant `Sites.ReadWrite.All` and `Files.ReadWrite.All`.\n5. Grant admin consent for those application permissions in the tenant.\n6. Paste the tenant ID, client ID, and client secret into this integration. The integration exchanges them for short-lived Microsoft Graph access tokens automatically.",
15984
+ "hintsByVariant": {},
15985
+ "tools": [
15986
+ {
15987
+ "name": "search_sites",
15988
+ "description": "Search SharePoint sites by keyword across the tenant. Returns compact site summaries with IDs and web URLs. Use this when you know the site name or topic but not the site ID. If you already know the hostname and path, use get_site_by_path instead.",
15989
+ "inputSchema": {
15990
+ "$schema": "http://json-schema.org/draft-07/schema#",
15991
+ "type": "object",
15992
+ "required": [
15993
+ "query"
15994
+ ],
15995
+ "properties": {
15996
+ "query": {
15997
+ "type": "string",
15998
+ "description": "Keyword search for SharePoint sites, such as a team name or department."
15999
+ }
16000
+ },
16001
+ "additionalProperties": false
16002
+ },
16003
+ "handlerCode": "async (input) => {\n const params = new URLSearchParams()\n params.set('search', input.query)\n const res = await integration.fetch(`/sites?${params.toString()}`)\n const data = await res.json()\n const sites = Array.isArray(data?.value)\n ? data.value.map(site => ({\n id: site.id,\n name: site.displayName || site.name || null,\n displayName: site.displayName || site.name || null,\n description: site.description || '',\n webUrl: site.webUrl || null,\n createdDateTime: site.createdDateTime || null,\n lastModifiedDateTime: site.lastModifiedDateTime || null,\n }))\n : []\n return { query: input.query, sites }\n}",
16004
+ "scope": "read"
16005
+ },
16006
+ {
16007
+ "name": "get_site_by_path",
16008
+ "description": "Resolve a SharePoint site from its hostname and server-relative path, such as hostname='contoso.sharepoint.com' and relativePath='//Marketing'. Use this when you know the SharePoint URL structure and need the stable site ID for later calls.",
16009
+ "inputSchema": {
16010
+ "$schema": "http://json-schema.org/draft-07/schema#",
16011
+ "type": "object",
16012
+ "required": [
16013
+ "hostname",
16014
+ "relativePath"
16015
+ ],
16016
+ "properties": {
16017
+ "hostname": {
16018
+ "type": "string",
16019
+ "description": "SharePoint hostname, such as contoso.sharepoint.com."
16020
+ },
16021
+ "relativePath": {
16022
+ "type": "string",
16023
+ "description": "Server-relative site path, such as /sites/Marketing."
16024
+ }
16025
+ },
16026
+ "additionalProperties": false
16027
+ },
16028
+ "handlerCode": "async (input) => {\n const hostname = String(input.hostname || '').trim()\n const rawPath = String(input.relativePath || '').trim()\n const normalizedPath = `/${rawPath.replace(/^\\/+/, '')}`\n const encodedPath = normalizedPath\n .split('/')\n .map((segment, index) => index === 0 ? '' : encodeURIComponent(segment))\n .join('/')\n const res = await integration.fetch(`/sites/${hostname}:${encodedPath}`)\n const site = await res.json()\n return {\n id: site.id,\n name: site.displayName || site.name || null,\n displayName: site.displayName || site.name || null,\n description: site.description || '',\n webUrl: site.webUrl || null,\n createdDateTime: site.createdDateTime || null,\n lastModifiedDateTime: site.lastModifiedDateTime || null,\n }\n}",
16029
+ "scope": "read"
16030
+ },
16031
+ {
16032
+ "name": "get_site",
16033
+ "description": "Get metadata for a SharePoint site by site ID. Returns the site name, description, web URL, and timestamps. Use search_sites or get_site_by_path first if you do not already know the site ID.",
16034
+ "inputSchema": {
16035
+ "$schema": "http://json-schema.org/draft-07/schema#",
16036
+ "type": "object",
16037
+ "required": [
16038
+ "siteId"
16039
+ ],
16040
+ "properties": {
16041
+ "siteId": {
16042
+ "type": "string",
16043
+ "description": "Microsoft Graph SharePoint site ID."
16044
+ }
16045
+ },
16046
+ "additionalProperties": false
16047
+ },
16048
+ "handlerCode": "async (input) => {\n const res = await integration.fetch(`/sites/${encodeURIComponent(input.siteId)}`)\n const site = await res.json()\n return {\n id: site.id,\n name: site.displayName || site.name || null,\n displayName: site.displayName || site.name || null,\n description: site.description || '',\n webUrl: site.webUrl || null,\n createdDateTime: site.createdDateTime || null,\n lastModifiedDateTime: site.lastModifiedDateTime || null,\n }\n}",
16049
+ "scope": "read"
16050
+ },
16051
+ {
16052
+ "name": "list_site_drives",
16053
+ "description": "List document libraries (drives) for a SharePoint site. Returns compact drive summaries including IDs, names, web URLs, and drive type. Use this after resolving a site to discover the right document library before browsing folders or reading files.",
16054
+ "inputSchema": {
16055
+ "$schema": "http://json-schema.org/draft-07/schema#",
16056
+ "type": "object",
16057
+ "required": [
16058
+ "siteId"
16059
+ ],
16060
+ "properties": {
16061
+ "siteId": {
16062
+ "type": "string",
16063
+ "description": "Microsoft Graph SharePoint site ID."
16064
+ },
16065
+ "top": {
16066
+ "type": "integer",
16067
+ "minimum": 1,
16068
+ "maximum": 200,
16069
+ "description": "Maximum number of drives to return."
16070
+ },
16071
+ "includeSystem": {
16072
+ "type": "boolean",
16073
+ "description": "Set true to include hidden/system drives."
16074
+ }
16075
+ },
16076
+ "additionalProperties": false
16077
+ },
16078
+ "handlerCode": "async (input) => {\n const params = new URLSearchParams()\n params.set('$select', input.includeSystem\n ? 'id,name,webUrl,driveType,createdDateTime,lastModifiedDateTime,system'\n : 'id,name,webUrl,driveType,createdDateTime,lastModifiedDateTime')\n if (input.top)\n params.set('$top', String(input.top))\n\n const res = await integration.fetch(`/sites/${encodeURIComponent(input.siteId)}/drives?${params.toString()}`)\n const data = await res.json()\n const drives = Array.isArray(data?.value)\n ? data.value.map(drive => ({\n id: drive.id,\n name: drive.name || null,\n webUrl: drive.webUrl || null,\n driveType: drive.driveType || null,\n createdDateTime: drive.createdDateTime || null,\n lastModifiedDateTime: drive.lastModifiedDateTime || null,\n isSystem: Boolean(drive.system),\n }))\n : []\n\n return {\n siteId: input.siteId,\n drives,\n nextLink: data?.['@odata.nextLink'] || null,\n }\n}",
16079
+ "scope": "read"
16080
+ },
16081
+ {
16082
+ "name": "list_drive_children",
16083
+ "description": "List the files and folders inside a SharePoint document library folder. By default this lists the root of the drive. Provide itemId to browse a specific folder. Returns compact entries with file-or-folder flags, MIME type when available, and parent references. Use get_drive_item_meta when you need one specific item.",
16084
+ "inputSchema": {
16085
+ "$schema": "http://json-schema.org/draft-07/schema#",
16086
+ "type": "object",
16087
+ "required": [
16088
+ "driveId"
16089
+ ],
16090
+ "properties": {
16091
+ "driveId": {
16092
+ "type": "string",
16093
+ "description": "Document library drive ID."
16094
+ },
16095
+ "itemId": {
16096
+ "type": "string",
16097
+ "description": "Optional folder item ID. Omit to list the drive root."
16098
+ },
16099
+ "top": {
16100
+ "type": "integer",
16101
+ "minimum": 1,
16102
+ "maximum": 200,
16103
+ "description": "Maximum number of children to return."
16104
+ },
16105
+ "orderBy": {
16106
+ "type": "string",
16107
+ "description": "Optional Microsoft Graph orderBy expression, such as name or lastModifiedDateTime desc."
16108
+ }
16109
+ },
16110
+ "additionalProperties": false
16111
+ },
16112
+ "handlerCode": "async (input) => {\n const flattenItem = item => ({\n id: item.id,\n name: item.name || null,\n webUrl: item.webUrl || null,\n size: item.size ?? null,\n createdDateTime: item.createdDateTime || null,\n lastModifiedDateTime: item.lastModifiedDateTime || null,\n eTag: item.eTag || null,\n cTag: item.cTag || null,\n mimeType: item.file?.mimeType || null,\n isFolder: Boolean(item.folder || item.package),\n isFile: Boolean(item.file),\n childCount: item.folder?.childCount ?? null,\n parentReference: item.parentReference || null,\n })\n\n const params = new URLSearchParams()\n params.set(\n '$select',\n 'id,name,webUrl,size,createdDateTime,lastModifiedDateTime,eTag,cTag,parentReference,file,folder,package',\n )\n if (input.top)\n params.set('$top', String(input.top))\n if (input.orderBy)\n params.set('$orderby', input.orderBy)\n\n const basePath = input.itemId\n ? `/drives/${encodeURIComponent(input.driveId)}/items/${encodeURIComponent(input.itemId)}/children`\n : `/drives/${encodeURIComponent(input.driveId)}/root/children`\n\n const res = await integration.fetch(`${basePath}?${params.toString()}`)\n const data = await res.json()\n\n return {\n driveId: input.driveId,\n itemId: input.itemId || null,\n children: Array.isArray(data?.value) ? data.value.map(flattenItem) : [],\n nextLink: data?.['@odata.nextLink'] || null,\n }\n}",
16113
+ "scope": "read"
16114
+ },
16115
+ {
16116
+ "name": "get_drive_item_meta",
16117
+ "description": "Get metadata for a single SharePoint file or folder by drive ID and item ID. Returns a compact item summary including IDs, name, type flags, web URL, size, timestamps, and parent reference. Use read_file_content to read the actual file contents.",
16118
+ "inputSchema": {
16119
+ "$schema": "http://json-schema.org/draft-07/schema#",
16120
+ "type": "object",
16121
+ "required": [
16122
+ "driveId",
16123
+ "itemId"
16124
+ ],
16125
+ "properties": {
16126
+ "driveId": {
16127
+ "type": "string",
16128
+ "description": "Document library drive ID."
16129
+ },
16130
+ "itemId": {
16131
+ "type": "string",
16132
+ "description": "Drive item ID for the file or folder."
16133
+ }
16134
+ },
16135
+ "additionalProperties": false
16136
+ },
16137
+ "handlerCode": "async (input) => {\n const flattenItem = item => ({\n id: item.id,\n name: item.name || null,\n webUrl: item.webUrl || null,\n size: item.size ?? null,\n createdDateTime: item.createdDateTime || null,\n lastModifiedDateTime: item.lastModifiedDateTime || null,\n eTag: item.eTag || null,\n cTag: item.cTag || null,\n mimeType: item.file?.mimeType || null,\n isFolder: Boolean(item.folder || item.package),\n isFile: Boolean(item.file),\n childCount: item.folder?.childCount ?? null,\n parentReference: item.parentReference || null,\n })\n\n const params = new URLSearchParams()\n params.set(\n '$select',\n 'id,name,webUrl,size,createdDateTime,lastModifiedDateTime,eTag,cTag,parentReference,file,folder,package',\n )\n const res = await integration.fetch(`/drives/${encodeURIComponent(input.driveId)}/items/${encodeURIComponent(input.itemId)}?${params.toString()}`)\n return flattenItem(await res.json())\n}",
16138
+ "scope": "read"
16139
+ },
16140
+ {
16141
+ "name": "search_files",
16142
+ "description": "Search SharePoint and OneDrive content through Microsoft Graph search and return flattened file hits. Provide a query string; Graph KQL syntax is supported. Optional siteId and driveId filters narrow the flattened results after search. Use this for broad file discovery when folder-by-folder browsing is too narrow.",
16143
+ "inputSchema": {
16144
+ "$schema": "http://json-schema.org/draft-07/schema#",
16145
+ "type": "object",
16146
+ "required": [
16147
+ "query"
16148
+ ],
16149
+ "properties": {
16150
+ "query": {
16151
+ "type": "string",
16152
+ "description": "Search query string. Microsoft Graph KQL syntax is supported."
16153
+ },
16154
+ "siteId": {
16155
+ "type": "string",
16156
+ "description": "Optional site ID to keep only hits from a specific SharePoint site."
16157
+ },
16158
+ "driveId": {
16159
+ "type": "string",
16160
+ "description": "Optional drive ID to keep only hits from a specific document library."
16161
+ },
16162
+ "from": {
16163
+ "type": "integer",
16164
+ "minimum": 0,
16165
+ "description": "Offset into the Graph search results."
16166
+ },
16167
+ "size": {
16168
+ "type": "integer",
16169
+ "minimum": 1,
16170
+ "maximum": 50,
16171
+ "description": "Maximum number of hits to request from Graph."
16172
+ }
16173
+ },
16174
+ "additionalProperties": false
16175
+ },
16176
+ "handlerCode": "async (input) => {\n const extractFallbackRegion = (error) => {\n const texts = [error?.data?.body, error?.message].filter(s => typeof s === 'string')\n for (const text of texts) {\n const match = text.match(/Only valid regions are ([A-Z,\\s]+)/i)\n const region = match?.[1]?.split(',').map(r => r.trim().toUpperCase()).filter(Boolean)[0]\n if (region)\n return region\n }\n return null\n }\n\n const runSearch = async (region) => {\n const res = await integration.fetch('/search/query', {\n method: 'POST',\n body: {\n requests: [{\n entityTypes: ['driveItem'],\n query: { queryString: input.query },\n from: typeof input.from === 'number' ? input.from : 0,\n size: typeof input.size === 'number' ? input.size : 25,\n region,\n }],\n },\n })\n return res.json()\n }\n\n const flattenHit = (hit) => {\n const resource = hit?.resource || {}\n const parentReference = resource.parentReference || {}\n return {\n id: resource.id || hit?.hitId || null,\n name: resource.name || null,\n webUrl: resource.webUrl || null,\n summary: hit?.summary || '',\n rank: hit?.rank ?? null,\n createdDateTime: resource.createdDateTime || null,\n lastModifiedDateTime: resource.lastModifiedDateTime || null,\n mimeType: resource.file?.mimeType || null,\n size: resource.size ?? null,\n isFolder: Boolean(resource.folder || resource.package),\n isFile: Boolean(resource.file),\n driveId: parentReference.driveId || null,\n siteId: parentReference.siteId || null,\n parentReference,\n }\n }\n\n let data\n try {\n data = await runSearch('NAM')\n }\n catch (error) {\n const fallback = extractFallbackRegion(error)\n if (!fallback)\n throw error\n data = await runSearch(fallback)\n }\n\n const container = data?.value?.[0]?.hitsContainers?.[0]\n const allHits = Array.isArray(container?.hits) ? container.hits.map(flattenHit) : []\n const hits = allHits.filter((hit) => {\n if (input.siteId && hit.siteId !== input.siteId)\n return false\n if (input.driveId && hit.driveId !== input.driveId)\n return false\n return true\n })\n\n return {\n query: input.query,\n hits,\n total: container?.total ?? hits.length,\n moreResultsAvailable: Boolean(container?.moreResultsAvailable),\n }\n}",
16177
+ "scope": "read"
16178
+ },
16179
+ {
16180
+ "name": "read_file_content",
16181
+ "description": "Read a SharePoint file into agent-friendly text using the shared file extraction pipeline. This is the standard way to consume document contents such as PDF, DOCX, XLSX, PPTX, and text-like files stored in SharePoint document libraries. Provide driveId and itemId. Folders are rejected; use list_drive_children to browse them.",
16182
+ "inputSchema": {
16183
+ "$schema": "http://json-schema.org/draft-07/schema#",
16184
+ "type": "object",
16185
+ "required": [
16186
+ "driveId",
16187
+ "itemId"
16188
+ ],
16189
+ "properties": {
16190
+ "driveId": {
16191
+ "type": "string",
16192
+ "description": "Document library drive ID."
16193
+ },
16194
+ "itemId": {
16195
+ "type": "string",
16196
+ "description": "Drive item ID for the file."
16197
+ },
16198
+ "mimeType": {
16199
+ "type": "string",
16200
+ "description": "Optional MIME type from get_drive_item_meta or search_files."
16201
+ }
16202
+ },
16203
+ "additionalProperties": false
16204
+ },
16205
+ "handlerCode": "async (input) => {\n const params = new URLSearchParams()\n params.set(\n '$select',\n 'id,name,webUrl,size,createdDateTime,lastModifiedDateTime,parentReference,file,folder,package',\n )\n const res = await integration.fetch(`/drives/${encodeURIComponent(input.driveId)}/items/${encodeURIComponent(input.itemId)}?${params.toString()}`)\n const item = await res.json()\n const mimeType = input.mimeType || item?.file?.mimeType || null\n\n if (item?.folder || item?.package) {\n return {\n driveId: input.driveId,\n itemId: input.itemId,\n name: item?.name || null,\n mimeType,\n content: null,\n message: 'Folders do not have readable file content.',\n }\n }\n\n const extracted = await utils.extractFileContent({\n auth: true,\n source: `/drives/${encodeURIComponent(input.driveId)}/items/${encodeURIComponent(input.itemId)}/content`,\n })\n\n return {\n driveId: input.driveId,\n itemId: input.itemId,\n name: item?.name || null,\n webUrl: item?.webUrl || null,\n mimeType,\n ...extracted,\n }\n}",
16206
+ "scope": "read"
16207
+ },
16208
+ {
16209
+ "name": "create_folder",
16210
+ "description": "Create a new folder in a SharePoint document library. By default the folder is created in the drive root. Provide parentItemId to create it inside an existing folder. Returns the created folder metadata including its item ID for later browsing or moves.",
16211
+ "inputSchema": {
16212
+ "$schema": "http://json-schema.org/draft-07/schema#",
16213
+ "type": "object",
16214
+ "required": [
16215
+ "driveId",
16216
+ "name"
16217
+ ],
16218
+ "properties": {
16219
+ "driveId": {
16220
+ "type": "string",
16221
+ "description": "Document library drive ID."
16222
+ },
16223
+ "name": {
16224
+ "type": "string",
16225
+ "description": "Folder name to create."
16226
+ },
16227
+ "parentItemId": {
16228
+ "type": "string",
16229
+ "description": "Optional parent folder item ID. Omit to create in the drive root."
16230
+ },
16231
+ "conflictBehavior": {
16232
+ "type": "string",
16233
+ "enum": [
16234
+ "rename",
16235
+ "replace",
16236
+ "fail"
16237
+ ],
16238
+ "description": "How Graph should handle name conflicts. Defaults to rename."
16239
+ }
16240
+ },
16241
+ "additionalProperties": false
16242
+ },
16243
+ "handlerCode": "async (input) => {\n const path = input.parentItemId\n ? `/drives/${encodeURIComponent(input.driveId)}/items/${encodeURIComponent(input.parentItemId)}/children`\n : `/drives/${encodeURIComponent(input.driveId)}/root/children`\n\n const res = await integration.fetch(path, {\n method: 'POST',\n body: {\n name: input.name,\n folder: {},\n '@microsoft.graph.conflictBehavior': input.conflictBehavior || 'rename',\n },\n })\n const item = await res.json()\n return {\n id: item.id,\n name: item.name || null,\n webUrl: item.webUrl || null,\n size: item.size ?? null,\n createdDateTime: item.createdDateTime || null,\n lastModifiedDateTime: item.lastModifiedDateTime || null,\n mimeType: item.file?.mimeType || null,\n isFolder: Boolean(item.folder || item.package),\n isFile: Boolean(item.file),\n childCount: item.folder?.childCount ?? null,\n parentReference: item.parentReference || null,\n }\n}",
16244
+ "scope": "write"
16245
+ },
16246
+ {
16247
+ "name": "move_drive_item",
16248
+ "description": "Move a SharePoint file or folder to a different parent folder in the same drive. Provide destinationParentId and optionally a newName to rename during the move. Use get_drive_item_meta or list_drive_children first to discover the current item and destination IDs.",
16249
+ "inputSchema": {
16250
+ "$schema": "http://json-schema.org/draft-07/schema#",
16251
+ "type": "object",
16252
+ "required": [
16253
+ "driveId",
16254
+ "itemId",
16255
+ "destinationParentId"
16256
+ ],
16257
+ "properties": {
16258
+ "driveId": {
16259
+ "type": "string",
16260
+ "description": "Document library drive ID."
16261
+ },
16262
+ "itemId": {
16263
+ "type": "string",
16264
+ "description": "Drive item ID for the file or folder to move."
16265
+ },
16266
+ "destinationParentId": {
16267
+ "type": "string",
16268
+ "description": "Destination folder item ID."
16269
+ },
16270
+ "newName": {
16271
+ "type": "string",
16272
+ "description": "Optional new item name to apply during the move."
16273
+ }
16274
+ },
16275
+ "additionalProperties": false
16276
+ },
16277
+ "handlerCode": "async (input) => {\n const body = {\n parentReference: {\n id: input.destinationParentId,\n },\n }\n if (input.newName)\n body.name = input.newName\n\n const res = await integration.fetch(`/drives/${encodeURIComponent(input.driveId)}/items/${encodeURIComponent(input.itemId)}`, {\n method: 'PATCH',\n body,\n })\n const item = await res.json()\n return {\n id: item.id,\n name: item.name || null,\n webUrl: item.webUrl || null,\n size: item.size ?? null,\n createdDateTime: item.createdDateTime || null,\n lastModifiedDateTime: item.lastModifiedDateTime || null,\n mimeType: item.file?.mimeType || null,\n isFolder: Boolean(item.folder || item.package),\n isFile: Boolean(item.file),\n childCount: item.folder?.childCount ?? null,\n parentReference: item.parentReference || null,\n }\n}",
16278
+ "scope": "write"
16279
+ },
16280
+ {
16281
+ "name": "delete_drive_item",
16282
+ "description": "Delete a SharePoint file or folder by drive ID and item ID. This is a destructive operation. Use get_drive_item_meta or list_drive_children first to confirm you have the correct item before deleting it.",
16283
+ "inputSchema": {
16284
+ "$schema": "http://json-schema.org/draft-07/schema#",
16285
+ "type": "object",
16286
+ "required": [
16287
+ "driveId",
16288
+ "itemId"
16289
+ ],
16290
+ "properties": {
16291
+ "driveId": {
16292
+ "type": "string",
16293
+ "description": "Document library drive ID."
16294
+ },
16295
+ "itemId": {
16296
+ "type": "string",
16297
+ "description": "Drive item ID for the file or folder to delete."
16298
+ }
16299
+ },
16300
+ "additionalProperties": false
16301
+ },
16302
+ "handlerCode": "async (input) => {\n const res = await integration.fetch(`/drives/${encodeURIComponent(input.driveId)}/items/${encodeURIComponent(input.itemId)}`, {\n method: 'DELETE',\n })\n if (res.status === 204)\n return { success: true, status: 204 }\n try {\n return await res.json()\n }\n catch {\n return { success: res.ok, status: res.status }\n }\n}",
16303
+ "scope": "write"
16304
+ }
16305
+ ],
16306
+ "variantOwnerType": null
16307
+ },
15847
16308
  "trello": {
15848
16309
  "manifest": {
15849
16310
  "name": "Trello",
@@ -17737,6 +18198,10 @@ function cloneCredentialVariant(variant) {
17737
18198
  headers: ((_a = variant.injection) == null ? void 0 : _a.headers) ? { ...variant.injection.headers } : void 0,
17738
18199
  query: ((_b = variant.injection) == null ? void 0 : _b.query) ? { ...variant.injection.query } : void 0
17739
18200
  },
18201
+ preprocess: typeof variant.preprocess === "object" && variant.preprocess !== null ? {
18202
+ ...variant.preprocess,
18203
+ allowedOrigins: Array.isArray(variant.preprocess.allowedOrigins) ? [...variant.preprocess.allowedOrigins] : void 0
18204
+ } : variant.preprocess,
17740
18205
  healthCheck: "path" in variant.healthCheck ? { ...variant.healthCheck } : { notViable: true }
17741
18206
  };
17742
18207
  }
@@ -18820,7 +19285,8 @@ function ensureExtractorScript() {
18820
19285
  return path;
18821
19286
  }
18822
19287
  const FILE_PROCESSING_DISABLED_TOOLS = {
18823
- "google-workspace": ["read_file_content"]
19288
+ "google-workspace": ["read_file_content"],
19289
+ sharepoint: ["read_file_content"]
18824
19290
  };
18825
19291
  let capabilityPromise = null;
18826
19292
  function pythonExecutable() {
@@ -19157,6 +19623,9 @@ function buildToolsByIntegration(spaceId, integrations, proxy, opts = {}) {
19157
19623
  return toolsByIntegration;
19158
19624
  }
19159
19625
 
19626
+ function isHandlerPreprocess(preprocess) {
19627
+ return typeof preprocess === "object" && preprocess !== null && preprocess.type === "handler" && typeof preprocess.handlerCode === "string";
19628
+ }
19160
19629
  function getBuiltInIntegrationTypeConfig(typeSlug) {
19161
19630
  var _a, _b, _c, _d;
19162
19631
  const variantsFile = loadIntegrationVariants(typeSlug);
@@ -19168,8 +19637,9 @@ function getBuiltInIntegrationTypeConfig(typeSlug) {
19168
19637
  const variants = {};
19169
19638
  for (const [key, variant] of Object.entries(variantsFile.variants)) {
19170
19639
  const preprocess = (_c = variant.preprocess) != null ? _c : null;
19171
- if (preprocess !== null && preprocess !== "google_service_account") {
19172
- throw new Error(`Unsupported preprocess '${preprocess}' for built-in integration '${typeSlug}/${key}'. Only 'google_service_account' is allowed.`);
19640
+ const isSupportedHandler = isHandlerPreprocess(preprocess);
19641
+ if (preprocess !== null && preprocess !== "google_service_account" && !isSupportedHandler) {
19642
+ throw new Error(`Unsupported preprocess for built-in integration '${typeSlug}/${key}'.`);
19173
19643
  }
19174
19644
  variants[key] = {
19175
19645
  label: variant.label,
@@ -19180,7 +19650,11 @@ function getBuiltInIntegrationTypeConfig(typeSlug) {
19180
19650
  allowedOrigins: manifestAllowedOrigins,
19181
19651
  healthCheck: (_d = variant.healthCheck) != null ? _d : null,
19182
19652
  hintMarkdown: loadIntegrationHint(typeSlug, key),
19183
- preprocess
19653
+ preprocess: isSupportedHandler ? {
19654
+ type: "handler",
19655
+ handlerCode: preprocess.handlerCode,
19656
+ allowedOrigins: Array.isArray(preprocess.allowedOrigins) ? [...preprocess.allowedOrigins] : null
19657
+ } : preprocess
19184
19658
  };
19185
19659
  }
19186
19660
  return {
@@ -19283,6 +19757,28 @@ function buildCredentialUrl(integrationId) {
19283
19757
  const port = portRaw && /^\d+$/.test(portRaw) ? Number(portRaw) : 23432;
19284
19758
  return `http://127.0.0.1:${port}/integrations/${encodeURIComponent(integrationId)}`;
19285
19759
  }
19760
+ function decodeJwtPayloadForDebug(token) {
19761
+ try {
19762
+ const parts = token.split(".");
19763
+ if (parts.length < 2 || !parts[1])
19764
+ return null;
19765
+ let b64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
19766
+ const pad = b64.length % 4 === 0 ? "" : "=".repeat(4 - b64.length % 4);
19767
+ b64 = b64 + pad;
19768
+ const json = Buffer$1.from(b64, "base64").toString("utf8");
19769
+ const payload = JSON.parse(json);
19770
+ return {
19771
+ aud: payload.aud,
19772
+ tid: payload.tid,
19773
+ appid: payload.appid,
19774
+ roles: payload.roles,
19775
+ scp: payload.scp,
19776
+ idtyp: payload.idtyp
19777
+ };
19778
+ } catch {
19779
+ return null;
19780
+ }
19781
+ }
19286
19782
  function isAbsoluteHttpUrl(value) {
19287
19783
  try {
19288
19784
  const url = new URL(value);
@@ -19343,71 +19839,163 @@ function resolveRelativeBaseUrl(provider, baseUrl, rawPath) {
19343
19839
  return "https://slides.googleapis.com/v1";
19344
19840
  return baseUrl;
19345
19841
  }
19842
+ function joinWithoutDuplicateSegments(baseUrl, rawPath) {
19843
+ let pathOnly = rawPath || "";
19844
+ let queryPart = "";
19845
+ const qIndex = pathOnly.indexOf("?");
19846
+ if (qIndex >= 0) {
19847
+ queryPart = pathOnly.slice(qIndex + 1);
19848
+ pathOnly = pathOnly.slice(0, qIndex);
19849
+ }
19850
+ try {
19851
+ const base = new URL(baseUrl);
19852
+ const baseSegs = base.pathname.split("/").filter(Boolean);
19853
+ const pathSegs = (pathOnly || "/").split("/").filter(Boolean);
19854
+ let overlap = 0;
19855
+ const maxK = Math.min(baseSegs.length, pathSegs.length);
19856
+ for (let k = maxK; k >= 1; k--) {
19857
+ let ok = true;
19858
+ for (let i = 0; i < k; i++) {
19859
+ if (baseSegs[baseSegs.length - k + i] !== pathSegs[i]) {
19860
+ ok = false;
19861
+ break;
19862
+ }
19863
+ }
19864
+ if (ok) {
19865
+ overlap = k;
19866
+ break;
19867
+ }
19868
+ }
19869
+ const normalizedPath = `/${[...baseSegs, ...pathSegs.slice(overlap)].join("/")}`;
19870
+ const baseOrigin = base.origin;
19871
+ const urlNoQuery = `${baseOrigin}${normalizedPath}`;
19872
+ return queryPart ? `${urlNoQuery}?${queryPart}` : urlNoQuery;
19873
+ } catch {
19874
+ const cleanedBase = baseUrl.replace(/\/+$/, "");
19875
+ const cleanedPath = `/${(pathOnly || "").replace(/^\/+/, "")}`;
19876
+ const baseParts = cleanedBase.split("/").filter(Boolean);
19877
+ const pathParts = cleanedPath.split("/").filter(Boolean);
19878
+ let overlap = 0;
19879
+ const maxK = Math.min(baseParts.length, pathParts.length);
19880
+ for (let k = maxK; k >= 1; k--) {
19881
+ let ok = true;
19882
+ for (let i = 0; i < k; i++) {
19883
+ if (baseParts[baseParts.length - k + i] !== pathParts[i]) {
19884
+ ok = false;
19885
+ break;
19886
+ }
19887
+ }
19888
+ if (ok) {
19889
+ overlap = k;
19890
+ break;
19891
+ }
19892
+ }
19893
+ const joined = `/${[...baseParts, ...pathParts.slice(overlap)].join("/")}`;
19894
+ return queryPart ? `${joined}?${queryPart}` : joined;
19895
+ }
19896
+ }
19897
+ function stableStringify(value) {
19898
+ if (value === null || typeof value !== "object")
19899
+ return JSON.stringify(value);
19900
+ if (Array.isArray(value))
19901
+ return `[${value.map(stableStringify).join(",")}]`;
19902
+ const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b)).map(([key, innerValue]) => `${JSON.stringify(key)}:${stableStringify(innerValue)}`);
19903
+ return `{${entries.join(",")}}`;
19904
+ }
19905
+ const preprocessResultCache = /* @__PURE__ */ new Map();
19906
+ function isHandlerCredentialPreprocess(preprocess) {
19907
+ return typeof preprocess === "object" && preprocess !== null && preprocess.type === "handler" && typeof preprocess.handlerCode === "string";
19908
+ }
19909
+ function getPreprocessCacheKey(provider, variantKey, creds) {
19910
+ return createHash("sha256").update(`${provider}:${variantKey}:${stableStringify(creds)}`).digest("hex");
19911
+ }
19912
+ function getExpiresAtMs(result, now) {
19913
+ var _a;
19914
+ const rawExpiresIn = (_a = result.expiresIn) != null ? _a : result.expires_in;
19915
+ const expiresIn = typeof rawExpiresIn === "number" ? rawExpiresIn : typeof rawExpiresIn === "string" && rawExpiresIn.trim() ? Number(rawExpiresIn) : NaN;
19916
+ if (Number.isFinite(expiresIn) && expiresIn > 0)
19917
+ return now + expiresIn * 1e3;
19918
+ return now + 55 * 6e4;
19919
+ }
19920
+ function normalizeRequestInit(init = {}) {
19921
+ const preparedInit = { ...init };
19922
+ if (preparedInit.body !== void 0 && typeof preparedInit.body !== "string" && !(preparedInit.body instanceof URLSearchParams) && !(preparedInit.body instanceof FormData) && !(preparedInit.body instanceof Blob) && !(preparedInit.body instanceof ArrayBuffer)) {
19923
+ preparedInit.body = JSON.stringify(preparedInit.body);
19924
+ preparedInit.headers = {
19925
+ "Content-Type": "application/json",
19926
+ ...preparedInit.headers
19927
+ };
19928
+ } else if (preparedInit.body instanceof URLSearchParams) {
19929
+ preparedInit.body = preparedInit.body.toString();
19930
+ preparedInit.headers = {
19931
+ "Content-Type": "application/x-www-form-urlencoded",
19932
+ ...preparedInit.headers
19933
+ };
19934
+ }
19935
+ return preparedInit;
19936
+ }
19937
+ async function runSandboxCredentialPreprocess(params) {
19938
+ var _a, _b;
19939
+ const { provider, variantKey, preprocess, creds, baseUrl, allowedOrigins } = params;
19940
+ const cacheKey = getPreprocessCacheKey(provider, variantKey, creds);
19941
+ const existing = preprocessResultCache.get(cacheKey);
19942
+ const now = Date.now();
19943
+ if (existing && existing.expiresAtMs - now > 6e4) {
19944
+ Object.assign(creds, existing.data);
19945
+ return;
19946
+ }
19947
+ const tokenFetch = async (path, init = {}) => {
19948
+ let finalUrl;
19949
+ if (isAbsoluteHttpUrl(path)) {
19950
+ assertAbsoluteUrlIsAllowed(path, baseUrl, allowedOrigins);
19951
+ finalUrl = path;
19952
+ } else {
19953
+ finalUrl = joinWithoutDuplicateSegments(baseUrl, path);
19954
+ }
19955
+ const preparedInit = normalizeRequestInit(init);
19956
+ return await fetch(finalUrl, {
19957
+ ...preparedInit,
19958
+ method: preparedInit.method || "GET"
19959
+ });
19960
+ };
19961
+ const wrapper = `async (input) => {
19962
+ const __inner = ${preprocess.handlerCode};
19963
+ return await __inner(input, utils)
19964
+ }`;
19965
+ const safeHandler = createSafeHandlerFromString(wrapper, () => ({}), { tokenFetch });
19966
+ const res = await safeHandler(creds);
19967
+ if (!res.success)
19968
+ throw new HttpError(400, `Credential preprocess failed for '${provider}': ${String(((_a = res.result) == null ? void 0 : _a.message) || res.result || "Unknown error")}`);
19969
+ const result = res.result;
19970
+ if (!result || typeof result !== "object" || Array.isArray(result))
19971
+ throw new HttpError(400, `Credential preprocess for '${provider}' must return an object.`);
19972
+ if (typeof result.token !== "string" || !result.token.trim())
19973
+ throw new HttpError(400, `Credential preprocess for '${provider}' must return a non-empty 'token' string.`);
19974
+ Object.assign(creds, result);
19975
+ preprocessResultCache.set(cacheKey, {
19976
+ data: { ...result },
19977
+ expiresAtMs: getExpiresAtMs(result, now)
19978
+ });
19979
+ if (provider === "sharepoint") {
19980
+ const t = result == null ? void 0 : result.token;
19981
+ const tokenStr = typeof t === "string" ? t : "";
19982
+ const claims = tokenStr ? decodeJwtPayloadForDebug(tokenStr) : null;
19983
+ const roles = claims == null ? void 0 : claims.roles;
19984
+ const rolesList = Array.isArray(roles) ? roles.map((r) => String(r).slice(0, 80)) : [];
19985
+ fetch("http://127.0.0.1:7886/ingest/d4127044-8bb5-4b15-95f1-be96d51d67ea", { method: "POST", headers: { "Content-Type": "application/json", "X-Debug-Session-Id": "797117" }, body: JSON.stringify({ sessionId: "797117", location: "proxy.ts:runSandboxCredentialPreprocess", message: "sharepoint preprocess ok", data: { variantKey, tokenLen: typeof t === "string" ? t.length : 0, expiresIn: (_b = result == null ? void 0 : result.expiresIn) != null ? _b : result == null ? void 0 : result.expires_in, tokenAud: claims == null ? void 0 : claims.aud, tokenTid: claims == null ? void 0 : claims.tid, tokenAppId: claims == null ? void 0 : claims.appid, tokenIdtyp: claims == null ? void 0 : claims.idtyp, rolesCount: rolesList.length, rolesSample: rolesList.slice(0, 12), hasScp: typeof (claims == null ? void 0 : claims.scp) === "string" && String(claims.scp).length > 0, jwtDecodeOk: !!claims }, timestamp: Date.now(), hypothesisId: "H6" }) }).catch(() => {
19986
+ });
19987
+ }
19988
+ }
19346
19989
  class IntegrationProxy {
19347
19990
  constructor(opts = {}) {
19348
19991
  __publicField$4(this, "opts");
19349
19992
  this.opts = opts;
19350
19993
  }
19351
19994
  async call(integration, path, init = {}) {
19352
- var _a, _b, _c, _d, _e, _f, _g;
19995
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
19353
19996
  const { type: provider } = integration;
19354
19997
  if (!provider || !path)
19355
19998
  throw new HttpError(400, "provider and path are required.");
19356
- const joinWithoutDuplicateSegments = (baseUrl, rawPath) => {
19357
- let pathOnly = rawPath || "";
19358
- let queryPart = "";
19359
- const qIndex = pathOnly.indexOf("?");
19360
- if (qIndex >= 0) {
19361
- queryPart = pathOnly.slice(qIndex + 1);
19362
- pathOnly = pathOnly.slice(0, qIndex);
19363
- }
19364
- try {
19365
- const base = new URL(baseUrl);
19366
- const baseSegs = base.pathname.split("/").filter(Boolean);
19367
- const pathSegs = (pathOnly || "/").split("/").filter(Boolean);
19368
- let overlap = 0;
19369
- const maxK = Math.min(baseSegs.length, pathSegs.length);
19370
- for (let k = maxK; k >= 1; k--) {
19371
- let ok = true;
19372
- for (let i = 0; i < k; i++) {
19373
- if (baseSegs[baseSegs.length - k + i] !== pathSegs[i]) {
19374
- ok = false;
19375
- break;
19376
- }
19377
- }
19378
- if (ok) {
19379
- overlap = k;
19380
- break;
19381
- }
19382
- }
19383
- const normalizedPath = `/${[...baseSegs, ...pathSegs.slice(overlap)].join("/")}`;
19384
- const baseOrigin = base.origin;
19385
- const urlNoQuery = `${baseOrigin}${normalizedPath}`;
19386
- return queryPart ? `${urlNoQuery}?${queryPart}` : urlNoQuery;
19387
- } catch {
19388
- const cleanedBase = baseUrl.replace(/\/+$/, "");
19389
- const cleanedPath = `/${(pathOnly || "").replace(/^\/+/, "")}`;
19390
- const baseParts = cleanedBase.split("/").filter(Boolean);
19391
- const pathParts = cleanedPath.split("/").filter(Boolean);
19392
- let overlap = 0;
19393
- const maxK = Math.min(baseParts.length, pathParts.length);
19394
- for (let k = maxK; k >= 1; k--) {
19395
- let ok = true;
19396
- for (let i = 0; i < k; i++) {
19397
- if (baseParts[baseParts.length - k + i] !== pathParts[i]) {
19398
- ok = false;
19399
- break;
19400
- }
19401
- }
19402
- if (ok) {
19403
- overlap = k;
19404
- break;
19405
- }
19406
- }
19407
- const joined = `/${[...baseParts, ...pathParts.slice(overlap)].join("/")}`;
19408
- return queryPart ? `${joined}?${queryPart}` : joined;
19409
- }
19410
- };
19411
19999
  const usesCredentials = integration.connectionMethod === "credentials";
19412
20000
  if (usesCredentials) {
19413
20001
  if (!this.opts.credentialStore)
@@ -19498,6 +20086,18 @@ class IntegrationProxy {
19498
20086
  throw new HttpError(400, `Missing OAuth scopes for Google integration '${provider}'.`);
19499
20087
  const token = await getGoogleAccessToken({ serviceAccountJson, scopes, subject });
19500
20088
  creds.token = token;
20089
+ } else if (isHandlerCredentialPreprocess(typeConfig.preprocess)) {
20090
+ await runSandboxCredentialPreprocess({
20091
+ provider,
20092
+ variantKey,
20093
+ preprocess: typeConfig.preprocess,
20094
+ creds,
20095
+ baseUrl,
20096
+ allowedOrigins: [
20097
+ ...typeConfig.allowedOrigins,
20098
+ ...(_f = typeConfig.preprocess.allowedOrigins) != null ? _f : []
20099
+ ]
20100
+ });
19501
20101
  }
19502
20102
  const resolvedHeaders = {};
19503
20103
  const resolvedQuery = new URLSearchParams();
@@ -19510,9 +20110,9 @@ class IntegrationProxy {
19510
20110
  const token = Buffer$1.from(`${username}:${password}`).toString("base64");
19511
20111
  resolvedHeaders.Authorization = `Basic ${token}`;
19512
20112
  } else {
19513
- for (const [k, v] of Object.entries(((_f = typeConfig.auth.injection) == null ? void 0 : _f.headers) || {}))
20113
+ for (const [k, v] of Object.entries(((_g = typeConfig.auth.injection) == null ? void 0 : _g.headers) || {}))
19514
20114
  resolvedHeaders[k] = resolveTemplate(v);
19515
- for (const [k, v] of Object.entries(((_g = typeConfig.auth.injection) == null ? void 0 : _g.query) || {}))
20115
+ for (const [k, v] of Object.entries(((_h = typeConfig.auth.injection) == null ? void 0 : _h.query) || {}))
19516
20116
  resolvedQuery.set(k, resolveTemplate(v));
19517
20117
  }
19518
20118
  let finalUrl;
@@ -19525,14 +20125,7 @@ class IntegrationProxy {
19525
20125
  const queryString = resolvedQuery.toString();
19526
20126
  if (queryString)
19527
20127
  finalUrl = finalUrl + (finalUrl.includes("?") ? "&" : "?") + queryString;
19528
- const preparedInit = { ...init };
19529
- if (preparedInit.body !== void 0 && typeof preparedInit.body !== "string") {
19530
- preparedInit.body = JSON.stringify(preparedInit.body);
19531
- preparedInit.headers = {
19532
- "Content-Type": "application/json",
19533
- ...preparedInit.headers
19534
- };
19535
- }
20128
+ const preparedInit = normalizeRequestInit(init);
19536
20129
  const redact = (s) => {
19537
20130
  let out = s;
19538
20131
  for (const val of Object.values(creds)) {
@@ -19541,6 +20134,18 @@ class IntegrationProxy {
19541
20134
  }
19542
20135
  return out;
19543
20136
  };
20137
+ if (provider === "sharepoint") {
20138
+ const auth = resolvedHeaders.Authorization;
20139
+ const bodyString = typeof preparedInit.body === "string" ? preparedInit.body : "";
20140
+ fetch("http://127.0.0.1:7886/ingest/d4127044-8bb5-4b15-95f1-be96d51d67ea", { method: "POST", headers: { "Content-Type": "application/json", "X-Debug-Session-Id": "797117" }, body: JSON.stringify({ sessionId: "797117", location: "proxy.ts:before-fetch", message: "sharepoint outgoing", data: { method: preparedInit.method || "GET", pathPreview: String(path).slice(0, 200), finalUrlHost: (() => {
20141
+ try {
20142
+ return new URL(finalUrl).host;
20143
+ } catch {
20144
+ return "invalid-url";
20145
+ }
20146
+ })(), hasAuthHeader: !!auth, authPrefix: auth ? String(auth).slice(0, 8) : "", tokenFieldLen: typeof creds.token === "string" ? creds.token.length : 0, bodyPreview: bodyString.slice(0, 300), bodyHasRegion: bodyString.includes('"region"'), isSearchQuery: String(path).includes("/search/query"), isRegionLookup: String(path).includes("siteCollection/root ne null") }, timestamp: Date.now(), hypothesisId: String(path).includes("/search/query") || String(path).includes("siteCollection/root ne null") ? "H9" : "H1" }) }).catch(() => {
20147
+ });
20148
+ }
19544
20149
  const response = await fetch(finalUrl, {
19545
20150
  ...preparedInit,
19546
20151
  method: preparedInit.method || "GET",
@@ -19556,6 +20161,23 @@ class IntegrationProxy {
19556
20161
  bodyText = contentType.includes("json") ? JSON.stringify(await response.json()) : await response.text();
19557
20162
  } catch {
19558
20163
  }
20164
+ if (provider === "sharepoint") {
20165
+ const auth = resolvedHeaders.Authorization;
20166
+ let graphErrorCode = "";
20167
+ try {
20168
+ const parsed = JSON.parse(bodyText);
20169
+ graphErrorCode = String(((_i = parsed == null ? void 0 : parsed.error) == null ? void 0 : _i.code) || (parsed == null ? void 0 : parsed.error) || "");
20170
+ } catch {
20171
+ }
20172
+ fetch("http://127.0.0.1:7886/ingest/d4127044-8bb5-4b15-95f1-be96d51d67ea", { method: "POST", headers: { "Content-Type": "application/json", "X-Debug-Session-Id": "797117" }, body: JSON.stringify({ sessionId: "797117", location: "proxy.ts:graph-error", message: "sharepoint graph non-ok", data: { status: response.status, pathPreview: String(path).slice(0, 160), finalUrlHost: (() => {
20173
+ try {
20174
+ return new URL(finalUrl).host;
20175
+ } catch {
20176
+ return "invalid-url";
20177
+ }
20178
+ })(), hasAuthHeader: !!auth, authPrefix: auth ? String(auth).slice(0, 8) : "", graphErrorCode: graphErrorCode.slice(0, 80), bodyPreview: bodyText.slice(0, 220) }, timestamp: Date.now(), hypothesisId: "H2" }) }).catch(() => {
20179
+ });
20180
+ }
19559
20181
  const hint = getErrorHint(response.status, provider, bodyText);
19560
20182
  const hintSuffix = hint ? ` ${hint}` : "";
19561
20183
  const credentialUrl = buildCredentialUrl(integration.id);
@@ -21941,140 +22563,140 @@ const assets = {
21941
22563
  "/favicon.ico": {
21942
22564
  "type": "image/vnd.microsoft.icon",
21943
22565
  "etag": "\"10be-n8egyE9tcb7sKGr/pYCaQ4uWqxI\"",
21944
- "mtime": "2026-04-05T18:35:56.190Z",
22566
+ "mtime": "2026-04-07T07:13:36.310Z",
21945
22567
  "size": 4286,
21946
22568
  "path": "../public/favicon.ico"
21947
22569
  },
21948
22570
  "/_fonts/57NSSoFy1VLVs2gqly8Ls9awBnZMFyXGrefpmqvdqmc-zJfbBtpgM4cDmcXBsqZNW79_kFnlpPd62b48glgdydA.woff2": {
21949
22571
  "type": "font/woff2",
21950
22572
  "etag": "\"4b5c-TAo9mx7r3xQs52+HbHcHJ52z8Qo\"",
21951
- "mtime": "2026-04-05T18:35:56.183Z",
22573
+ "mtime": "2026-04-07T07:13:36.305Z",
21952
22574
  "size": 19292,
21953
22575
  "path": "../public/_fonts/57NSSoFy1VLVs2gqly8Ls9awBnZMFyXGrefpmqvdqmc-zJfbBtpgM4cDmcXBsqZNW79_kFnlpPd62b48glgdydA.woff2"
21954
22576
  },
21955
22577
  "/_fonts/8VR2wSMN-3U4NbWAVYXlkRV6hA0jFBXP-0RtL3X7fko-x2gYI4qfmkRdxyQQUPaBZdZdgl1TeVrquF_TxHeM4lM.woff2": {
21956
22578
  "type": "font/woff2",
21957
22579
  "etag": "\"212c-FshXJibFzNhd2HEIMP8C3JR5PYg\"",
21958
- "mtime": "2026-04-05T18:35:56.183Z",
22580
+ "mtime": "2026-04-07T07:13:36.305Z",
21959
22581
  "size": 8492,
21960
22582
  "path": "../public/_fonts/8VR2wSMN-3U4NbWAVYXlkRV6hA0jFBXP-0RtL3X7fko-x2gYI4qfmkRdxyQQUPaBZdZdgl1TeVrquF_TxHeM4lM.woff2"
21961
22583
  },
21962
22584
  "/_fonts/GsKUclqeNLJ96g5AU593ug6yanivOiwjW_7zESNPChw-jHA4tBeM1bjF7LATGUpfBuSTyomIFrWBTzjF7txVYfg.woff2": {
21963
22585
  "type": "font/woff2",
21964
22586
  "etag": "\"680c-mJtsV33lkTAKSmfq5k3lKHSllcU\"",
21965
- "mtime": "2026-04-05T18:35:56.183Z",
22587
+ "mtime": "2026-04-07T07:13:36.305Z",
21966
22588
  "size": 26636,
21967
22589
  "path": "../public/_fonts/GsKUclqeNLJ96g5AU593ug6yanivOiwjW_7zESNPChw-jHA4tBeM1bjF7LATGUpfBuSTyomIFrWBTzjF7txVYfg.woff2"
21968
22590
  },
21969
22591
  "/_fonts/Ld1FnTo3yTIwDyGfTQ5-Fws9AWsCbKfMvgxduXr7JcY-W25bL8NF1fjpLRSOgJb7RoZPHqGQNwMTM7S9tHVoxx8.woff2": {
21970
22592
  "type": "font/woff2",
21971
22593
  "etag": "\"6ec4-8OoFFPZKF1grqmfGVjh5JDE6DOU\"",
21972
- "mtime": "2026-04-05T18:35:56.184Z",
22594
+ "mtime": "2026-04-07T07:13:36.305Z",
21973
22595
  "size": 28356,
21974
22596
  "path": "../public/_fonts/Ld1FnTo3yTIwDyGfTQ5-Fws9AWsCbKfMvgxduXr7JcY-W25bL8NF1fjpLRSOgJb7RoZPHqGQNwMTM7S9tHVoxx8.woff2"
21975
22597
  },
21976
22598
  "/_fonts/NdzqRASp2bovDUhQT1IRE_EMqKJ2KYQdTCfFcBvL8yw-KhwZiS86o3fErOe5GGMExHUemmI_dBfaEFxjISZrBd0.woff2": {
21977
22599
  "type": "font/woff2",
21978
22600
  "etag": "\"1d98-cDZfMibtk4T04FTTAmlfhWDpkN0\"",
21979
- "mtime": "2026-04-05T18:35:56.183Z",
22601
+ "mtime": "2026-04-07T07:13:36.305Z",
21980
22602
  "size": 7576,
21981
22603
  "path": "../public/_fonts/NdzqRASp2bovDUhQT1IRE_EMqKJ2KYQdTCfFcBvL8yw-KhwZiS86o3fErOe5GGMExHUemmI_dBfaEFxjISZrBd0.woff2"
21982
22604
  },
21983
22605
  "/_fonts/iTkrULNFJJkTvihIg1Vqi5IODRH_9btXCioVF5l98I8-AndUyau2HR2felA_ra8V2mutQgschhasE5FD1dXGJX8.woff2": {
21984
22606
  "type": "font/woff2",
21985
22607
  "etag": "\"47c4-5xyngHnzzhetUee74tMx9OTgqNQ\"",
21986
- "mtime": "2026-04-05T18:35:56.184Z",
22608
+ "mtime": "2026-04-07T07:13:36.305Z",
21987
22609
  "size": 18372,
21988
22610
  "path": "../public/_fonts/iTkrULNFJJkTvihIg1Vqi5IODRH_9btXCioVF5l98I8-AndUyau2HR2felA_ra8V2mutQgschhasE5FD1dXGJX8.woff2"
21989
22611
  },
21990
22612
  "/_nuxt/BD6mASiY.js": {
21991
22613
  "type": "text/javascript; charset=utf-8",
21992
22614
  "etag": "\"ab-ScyLcA/4r5aOxEv1YY+kqXazCHI\"",
21993
- "mtime": "2026-04-05T18:35:56.186Z",
22615
+ "mtime": "2026-04-07T07:13:36.308Z",
21994
22616
  "size": 171,
21995
22617
  "path": "../public/_nuxt/BD6mASiY.js"
21996
22618
  },
21997
22619
  "/_nuxt/CjAs3eBq.js": {
21998
22620
  "type": "text/javascript; charset=utf-8",
21999
22621
  "etag": "\"1df7-cTFKdH9K34T9NixeUm/CLQ8lWUc\"",
22000
- "mtime": "2026-04-05T18:35:56.186Z",
22622
+ "mtime": "2026-04-07T07:13:36.308Z",
22001
22623
  "size": 7671,
22002
22624
  "path": "../public/_nuxt/CjAs3eBq.js"
22003
22625
  },
22004
22626
  "/_nuxt/D9wFDhac.js": {
22005
22627
  "type": "text/javascript; charset=utf-8",
22006
22628
  "etag": "\"e99-sUFV1wmMOK2XGfzDXJyP2NA8TG4\"",
22007
- "mtime": "2026-04-05T18:35:56.186Z",
22629
+ "mtime": "2026-04-07T07:13:36.308Z",
22008
22630
  "size": 3737,
22009
22631
  "path": "../public/_nuxt/D9wFDhac.js"
22010
22632
  },
22011
- "/_nuxt/DSWYWRXT.js": {
22012
- "type": "text/javascript; charset=utf-8",
22013
- "etag": "\"10875-8b+YwIvP6QkcBFnHXqxd+WeZ05o\"",
22014
- "mtime": "2026-04-05T18:35:56.186Z",
22015
- "size": 67701,
22016
- "path": "../public/_nuxt/DSWYWRXT.js"
22017
- },
22018
22633
  "/_nuxt/DRfk9W3W.js": {
22019
22634
  "type": "text/javascript; charset=utf-8",
22020
22635
  "etag": "\"194dc-Oj5Ixz12+pq4yqDtF/N+YAPzoWw\"",
22021
- "mtime": "2026-04-05T18:35:56.186Z",
22636
+ "mtime": "2026-04-07T07:13:36.308Z",
22022
22637
  "size": 103644,
22023
22638
  "path": "../public/_nuxt/DRfk9W3W.js"
22024
22639
  },
22640
+ "/_nuxt/DSWYWRXT.js": {
22641
+ "type": "text/javascript; charset=utf-8",
22642
+ "etag": "\"10875-8b+YwIvP6QkcBFnHXqxd+WeZ05o\"",
22643
+ "mtime": "2026-04-07T07:13:36.308Z",
22644
+ "size": 67701,
22645
+ "path": "../public/_nuxt/DSWYWRXT.js"
22646
+ },
22025
22647
  "/_nuxt/VvnbcAzZ.js": {
22026
22648
  "type": "text/javascript; charset=utf-8",
22027
22649
  "etag": "\"d7b-hU4O5jppM7Ou3kZAYy3iYXlgoa8\"",
22028
- "mtime": "2026-04-05T18:35:56.186Z",
22650
+ "mtime": "2026-04-07T07:13:36.308Z",
22029
22651
  "size": 3451,
22030
22652
  "path": "../public/_nuxt/VvnbcAzZ.js"
22031
22653
  },
22032
22654
  "/_nuxt/_id_.DhlLK-mY.css": {
22033
22655
  "type": "text/css; charset=utf-8",
22034
22656
  "etag": "\"2f4-xtV37kE566jU74wpZnFHA29RoAY\"",
22035
- "mtime": "2026-04-05T18:35:56.186Z",
22657
+ "mtime": "2026-04-07T07:13:36.308Z",
22036
22658
  "size": 756,
22037
22659
  "path": "../public/_nuxt/_id_.DhlLK-mY.css"
22038
22660
  },
22661
+ "/_nuxt/BUmYUDQu.js": {
22662
+ "type": "text/javascript; charset=utf-8",
22663
+ "etag": "\"66cba-d/pdEXVc78H3VlgFN3kVzKpvD1Q\"",
22664
+ "mtime": "2026-04-07T07:13:36.308Z",
22665
+ "size": 421050,
22666
+ "path": "../public/_nuxt/BUmYUDQu.js"
22667
+ },
22039
22668
  "/_nuxt/error-404.C7fg894-.css": {
22040
22669
  "type": "text/css; charset=utf-8",
22041
22670
  "etag": "\"97e-fiQ3o7A11L9BuXRBr0GJldkx0AU\"",
22042
- "mtime": "2026-04-05T18:35:56.187Z",
22671
+ "mtime": "2026-04-07T07:13:36.308Z",
22043
22672
  "size": 2430,
22044
22673
  "path": "../public/_nuxt/error-404.C7fg894-.css"
22045
22674
  },
22046
22675
  "/_nuxt/error-500.DjUK_N2Y.css": {
22047
22676
  "type": "text/css; charset=utf-8",
22048
22677
  "etag": "\"773-Qf61bSDos4KtmZDaA06FmZyUYNo\"",
22049
- "mtime": "2026-04-05T18:35:56.187Z",
22678
+ "mtime": "2026-04-07T07:13:36.308Z",
22050
22679
  "size": 1907,
22051
22680
  "path": "../public/_nuxt/error-500.DjUK_N2Y.css"
22052
22681
  },
22053
22682
  "/_nuxt/builds/latest.json": {
22054
22683
  "type": "application/json",
22055
- "etag": "\"47-GZLcjWZaQqnb3MWtaAhgJPSJq0w\"",
22056
- "mtime": "2026-04-05T18:35:56.182Z",
22684
+ "etag": "\"47-hl0sv2tAIq0lIkhLc1Sve7W2pxs\"",
22685
+ "mtime": "2026-04-07T07:13:36.304Z",
22057
22686
  "size": 71,
22058
22687
  "path": "../public/_nuxt/builds/latest.json"
22059
22688
  },
22060
- "/_nuxt/builds/meta/0857a55b-f766-4fe6-86be-9bd9d857861a.json": {
22689
+ "/_nuxt/builds/meta/9441a86b-16e9-4000-bffc-3b2e78e57710.json": {
22061
22690
  "type": "application/json",
22062
- "etag": "\"58-/dM+mpaUFnmvLLmrgwHgZBuTtQg\"",
22063
- "mtime": "2026-04-05T18:35:56.180Z",
22691
+ "etag": "\"58-cDzg8zvmZMF8VeAEeeEcF3Ng22E\"",
22692
+ "mtime": "2026-04-07T07:13:36.301Z",
22064
22693
  "size": 88,
22065
- "path": "../public/_nuxt/builds/meta/0857a55b-f766-4fe6-86be-9bd9d857861a.json"
22066
- },
22067
- "/_nuxt/BUmYUDQu.js": {
22068
- "type": "text/javascript; charset=utf-8",
22069
- "etag": "\"66cba-d/pdEXVc78H3VlgFN3kVzKpvD1Q\"",
22070
- "mtime": "2026-04-05T18:35:56.186Z",
22071
- "size": 421050,
22072
- "path": "../public/_nuxt/BUmYUDQu.js"
22694
+ "path": "../public/_nuxt/builds/meta/9441a86b-16e9-4000-bffc-3b2e78e57710.json"
22073
22695
  },
22074
22696
  "/_nuxt/entry.Y3mA4bzA.css": {
22075
22697
  "type": "text/css; charset=utf-8",
22076
22698
  "etag": "\"2d46b-zfrD3Ny9WW6qm4fCXAfX5eIAxPA\"",
22077
- "mtime": "2026-04-05T18:35:56.187Z",
22699
+ "mtime": "2026-04-07T07:13:36.308Z",
22078
22700
  "size": 185451,
22079
22701
  "path": "../public/_nuxt/entry.Y3mA4bzA.css"
22080
22702
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nitro.mjs","sources":["../../../../../node_modules/destr/dist/index.mjs","../../../../../node_modules/ufo/dist/index.mjs","../../../../../node_modules/radix3/dist/index.mjs","../../../../../node_modules/defu/dist/defu.mjs","../../../../../node_modules/node-mock-http/dist/index.mjs","../../../../../node_modules/h3/dist/index.mjs","../../../../../node_modules/hookable/dist/index.mjs","../../../../../node_modules/node-fetch-native/dist/native.mjs","../../../../../node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs","../../../../../node_modules/ofetch/dist/node.mjs","../../../../../node_modules/unstorage/dist/shared/unstorage.zVDD2mZo.mjs","../../../../../node_modules/unstorage/dist/index.mjs","../../../../../node_modules/unstorage/drivers/utils/index.mjs","../../../../../node_modules/unstorage/drivers/utils/node-fs.mjs","../../../../../node_modules/unstorage/drivers/fs-lite.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../../../node_modules/ohash/dist/shared/ohash.D__AXeF1.mjs","../../../../../node_modules/ohash/dist/crypto/node/index.mjs","../../../../../node_modules/ohash/dist/index.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../../../node_modules/klona/dist/index.mjs","../../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/config.mjs","../../../../app/app.config.ts","../../../../../node_modules/scule/dist/index.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../../node_modules/unctx/dist/index.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/context.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/error.mjs","../../../../../node_modules/@nuxt/nitro-server/dist/runtime/handlers/error.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../../../node_modules/@nuxtjs/color-mode/dist/runtime/nitro-plugin.js","../../../../../packages/core/dist/errors/httpError.js","../../../../../packages/core/dist/crypto/encryption.js","../../../../../packages/integration-data/dist/generated/registry.js","../../../../../packages/integration-data/dist/loader.js","../../../../../packages/core/dist/integrations/tools.js","../../../../../packages/core/dist/integrations/sandbox.js","../../../../../packages/core/dist/integrations/sandboxUtils.js","../../../../../packages/core/dist/integrations/getIntegration.js","../../../../../packages/core/dist/integrations/generated-extractor.js","../../../../../packages/core/dist/integrations/fileProcessing.js","../../../../../packages/core/dist/integrations/fileExtractor.js","../../../../../packages/core/dist/integrations/executableToolFactory.js","../../../../../packages/core/dist/integrations/fileIntegrationTypeConfigStore.js","../../../../../packages/core/dist/integrations/googleServiceAccount.js","../../../../../packages/core/dist/integrations/proxy.js","../../../../../packages/core/dist/db/schema.js","../../../../../packages/core/dist/db/integrationTypeConfigStore.js","../../../../../packages/core/dist/integrations/health.js","../../../../../packages/core/dist/integrations/integrationTypeConfigLookup.js","../../../../../packages/core/dist/db/client.js","../../../../../packages/core/dist/db/generated-migrations.js","../../../../../packages/core/dist/db/migrate.js","../../../../../packages/core/dist/db/credentialStore.js","../../../../../packages/core/dist/db/integrationStore.js","../../../../../packages/core/dist/db/toolDefinitionStore.js","../../../../../packages/core/dist/mcp/toolAdapter.js","../../../../../packages/core/dist/mcp/abilityCatalog.js","../../../../../packages/core/dist/mcp/generated-assets.js","../../../../../packages/core/dist/integrations/customToolFactory.js","../../../../../packages/core/dist/mcp/metaTools.js","../../../../../packages/core/dist/mcp/handlers.js","../../../../../packages/core/dist/mcp/sessionState.js","../../../../../packages/core/dist/mcp/auth.js","../../../../../packages/core/dist/config/configSchema.js","../../../../../packages/core/dist/config/configLoader.js","../../../../../packages/core/dist/config/configApply.js","../../../../../packages/core/dist/runtime/credentialManager.js","../../../../server/utils/db.ts","../../../../server/plugins/configApply.ts","../../../../server/plugins/fileProcessingCapability.ts","../../../../server/plugins/requireEncryptionSecret.ts","../../../../../node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/static.mjs","../../../../server/middleware/mcpAuth.ts","../../../../../node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/paths.mjs","../../../../server/utils/mcp.ts","../../../../server/utils/runVariantConfigListHandler.ts","../../../../node_modules/.cache/nuxt/.nuxt/nuxt-icon-server-bundle.mjs","../../../../../node_modules/@nuxt/icon/dist/runtime/server/api.js","../../../../../node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/shutdown.mjs","../../../../../node_modules/nitropack/dist/presets/node/runtime/node-server.mjs"],"names":["getQuery","createRouter","f","h","c","i","l","createError","getHeader","mergeHeaders","s","nodeFetch","fetch","Headers","Headers$1","AbortController$1","$fetch","normalizeKey","defineDriver","DRIVER_NAME","dirname","fsPromises","resolve","fsp","serialize","hash","getKey","_inlineAppConfig","createRadixRouter","__publicField","SCOPE_RANK","_a","URL","URLSearchParams","execFile","execFileCb","isAbsoluteHttpUrl","basename","writeFile","readFile","capability","v","Buffer","sqlitePrimaryKey","pgText","pgInteger","pgPrimaryKey","t","db","parseJson","normalizeHintMarkdown","drizzlePg","drizzleSqlite","humanize","levenshtein","_b","_c","name","tool","res","cwd","sid","nitroApp","callNodeRequestHandler","fetchNodeRequestHandler","gracefulShutdown","HttpsServer","HttpServer"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,77,78,80,81,82,85,86,87,88,89,90]}
1
+ {"version":3,"file":"nitro.mjs","sources":["../../../../../node_modules/destr/dist/index.mjs","../../../../../node_modules/ufo/dist/index.mjs","../../../../../node_modules/radix3/dist/index.mjs","../../../../../node_modules/defu/dist/defu.mjs","../../../../../node_modules/node-mock-http/dist/index.mjs","../../../../../node_modules/h3/dist/index.mjs","../../../../../node_modules/hookable/dist/index.mjs","../../../../../node_modules/node-fetch-native/dist/native.mjs","../../../../../node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs","../../../../../node_modules/ofetch/dist/node.mjs","../../../../../node_modules/unstorage/dist/shared/unstorage.zVDD2mZo.mjs","../../../../../node_modules/unstorage/dist/index.mjs","../../../../../node_modules/unstorage/drivers/utils/index.mjs","../../../../../node_modules/unstorage/drivers/utils/node-fs.mjs","../../../../../node_modules/unstorage/drivers/fs-lite.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../../../node_modules/ohash/dist/shared/ohash.D__AXeF1.mjs","../../../../../node_modules/ohash/dist/crypto/node/index.mjs","../../../../../node_modules/ohash/dist/index.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../../../node_modules/klona/dist/index.mjs","../../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/config.mjs","../../../../app/app.config.ts","../../../../../node_modules/scule/dist/index.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../../node_modules/unctx/dist/index.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/context.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/error.mjs","../../../../../node_modules/@nuxt/nitro-server/dist/runtime/handlers/error.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../../../node_modules/@nuxtjs/color-mode/dist/runtime/nitro-plugin.js","../../../../../packages/core/dist/errors/httpError.js","../../../../../packages/core/dist/crypto/encryption.js","../../../../../packages/integration-data/dist/generated/registry.js","../../../../../packages/integration-data/dist/loader.js","../../../../../packages/core/dist/integrations/tools.js","../../../../../packages/core/dist/integrations/sandbox.js","../../../../../packages/core/dist/integrations/sandboxUtils.js","../../../../../packages/core/dist/integrations/getIntegration.js","../../../../../packages/core/dist/integrations/generated-extractor.js","../../../../../packages/core/dist/integrations/fileProcessing.js","../../../../../packages/core/dist/integrations/fileExtractor.js","../../../../../packages/core/dist/integrations/executableToolFactory.js","../../../../../packages/core/dist/integrations/fileIntegrationTypeConfigStore.js","../../../../../packages/core/dist/integrations/googleServiceAccount.js","../../../../../packages/core/dist/integrations/proxy.js","../../../../../packages/core/dist/db/schema.js","../../../../../packages/core/dist/db/integrationTypeConfigStore.js","../../../../../packages/core/dist/integrations/health.js","../../../../../packages/core/dist/integrations/integrationTypeConfigLookup.js","../../../../../packages/core/dist/db/client.js","../../../../../packages/core/dist/db/generated-migrations.js","../../../../../packages/core/dist/db/migrate.js","../../../../../packages/core/dist/db/credentialStore.js","../../../../../packages/core/dist/db/integrationStore.js","../../../../../packages/core/dist/db/toolDefinitionStore.js","../../../../../packages/core/dist/mcp/toolAdapter.js","../../../../../packages/core/dist/mcp/abilityCatalog.js","../../../../../packages/core/dist/mcp/generated-assets.js","../../../../../packages/core/dist/integrations/customToolFactory.js","../../../../../packages/core/dist/mcp/metaTools.js","../../../../../packages/core/dist/mcp/handlers.js","../../../../../packages/core/dist/mcp/sessionState.js","../../../../../packages/core/dist/mcp/auth.js","../../../../../packages/core/dist/config/configSchema.js","../../../../../packages/core/dist/config/configLoader.js","../../../../../packages/core/dist/config/configApply.js","../../../../../packages/core/dist/runtime/credentialManager.js","../../../../server/utils/db.ts","../../../../server/plugins/configApply.ts","../../../../server/plugins/fileProcessingCapability.ts","../../../../server/plugins/requireEncryptionSecret.ts","../../../../../node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/static.mjs","../../../../server/middleware/mcpAuth.ts","../../../../../node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/paths.mjs","../../../../server/utils/mcp.ts","../../../../server/utils/runVariantConfigListHandler.ts","../../../../node_modules/.cache/nuxt/.nuxt/nuxt-icon-server-bundle.mjs","../../../../../node_modules/@nuxt/icon/dist/runtime/server/api.js","../../../../../node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../../node_modules/nitropack/dist/runtime/internal/shutdown.mjs","../../../../../node_modules/nitropack/dist/presets/node/runtime/node-server.mjs"],"names":["getQuery","createRouter","f","h","c","i","l","createError","getHeader","mergeHeaders","s","nodeFetch","fetch","Headers","Headers$1","AbortController$1","$fetch","normalizeKey","defineDriver","DRIVER_NAME","dirname","fsPromises","resolve","fsp","serialize","hash","getKey","_inlineAppConfig","createRadixRouter","__publicField","SCOPE_RANK","_a","URL","URLSearchParams","execFile","execFileCb","isAbsoluteHttpUrl","basename","writeFile","readFile","capability","Buffer","v","sqlitePrimaryKey","pgText","pgInteger","pgPrimaryKey","t","db","parseJson","normalizeHintMarkdown","drizzlePg","drizzleSqlite","humanize","levenshtein","_b","_c","name","tool","res","cwd","sid","nitroApp","callNodeRequestHandler","fetchNodeRequestHandler","gracefulShutdown","HttpsServer","HttpServer"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,77,78,80,81,82,85,86,87,88,89,90]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commandable/mcp-prod",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@commandable/mcp",
3
3
  "type": "module",
4
- "version": "0.10.0",
4
+ "version": "0.11.0",
5
5
  "packageManager": "yarn@4.12.0",
6
6
  "description": "Commandable app/server package for local management UI, HTTP endpoints, and human-facing CLI flows.",
7
7
  "license": "AGPL-3.0-only",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@clack/prompts": "^1.0.1",
43
- "@commandable/mcp-core": "0.10.0",
43
+ "@commandable/mcp-core": "0.11.0",
44
44
  "@iconify-json/lucide": "^1.2.90",
45
45
  "@iconify-json/simple-icons": "^1.2.70",
46
46
  "@nuxt/ui": "^4.4.0",
@@ -1 +0,0 @@
1
- {"id":"0857a55b-f766-4fe6-86be-9bd9d857861a","timestamp":1775414150491,"prerendered":[]}