@rnsk/toolkits 0.0.8 → 0.0.10
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/README.md +15 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.js +29 -1
- package/dist/toolkits/bitbucket/icon.d.ts +5 -0
- package/dist/toolkits/bitbucket/icon.js +6 -0
- package/dist/toolkits/bitbucket/manifest.d.ts +3 -0
- package/dist/toolkits/bitbucket/manifest.js +56 -0
- package/dist/toolkits/bitbucket/tools/client.d.ts +38 -0
- package/dist/toolkits/bitbucket/tools/client.js +87 -0
- package/dist/toolkits/bitbucket/tools/commits.d.ts +149 -0
- package/dist/toolkits/bitbucket/tools/commits.js +444 -0
- package/dist/toolkits/bitbucket/tools/index.d.ts +1093 -0
- package/dist/toolkits/bitbucket/tools/index.js +770 -0
- package/dist/toolkits/bitbucket/tools/issues.d.ts +73 -0
- package/dist/toolkits/bitbucket/tools/issues.js +234 -0
- package/dist/toolkits/bitbucket/tools/pipelines.d.ts +124 -0
- package/dist/toolkits/bitbucket/tools/pipelines.js +446 -0
- package/dist/toolkits/bitbucket/tools/pull-requests.d.ts +174 -0
- package/dist/toolkits/bitbucket/tools/pull-requests.js +541 -0
- package/dist/toolkits/bitbucket/tools/reports.d.ts +84 -0
- package/dist/toolkits/bitbucket/tools/reports.js +213 -0
- package/dist/toolkits/bitbucket/tools/repositories.d.ts +156 -0
- package/dist/toolkits/bitbucket/tools/repositories.js +531 -0
- package/dist/toolkits/bitbucket/tools/search.d.ts +17 -0
- package/dist/toolkits/bitbucket/tools/search.js +67 -0
- package/dist/toolkits/bitbucket/tools/snippets.d.ts +34 -0
- package/dist/toolkits/bitbucket/tools/snippets.js +122 -0
- package/dist/toolkits/bitbucket/tools/users-workspaces.d.ts +65 -0
- package/dist/toolkits/bitbucket/tools/users-workspaces.js +294 -0
- package/dist/toolkits/discord/icon.d.ts +5 -0
- package/dist/toolkits/discord/icon.js +12 -0
- package/dist/toolkits/discord/manifest.d.ts +3 -0
- package/dist/toolkits/discord/manifest.js +52 -0
- package/dist/toolkits/discord/tools/applications.d.ts +79 -0
- package/dist/toolkits/discord/tools/applications.js +216 -0
- package/dist/toolkits/discord/tools/client.d.ts +22 -0
- package/dist/toolkits/discord/tools/client.js +69 -0
- package/dist/toolkits/discord/tools/guilds.d.ts +39 -0
- package/dist/toolkits/discord/tools/guilds.js +123 -0
- package/dist/toolkits/discord/tools/index.d.ts +222 -0
- package/dist/toolkits/discord/tools/index.js +170 -0
- package/dist/toolkits/discord/tools/misc.d.ts +7 -0
- package/dist/toolkits/discord/tools/misc.js +40 -0
- package/dist/toolkits/discord/tools/users.d.ts +28 -0
- package/dist/toolkits/discord/tools/users.js +128 -0
- package/dist/toolkits/figma/tools/index.d.ts +1 -1
- package/dist/toolkits/figma/tools/render-images-of-file-nodes.d.ts +1 -1
- package/dist/toolkits/gitlab/icon.d.ts +5 -0
- package/dist/toolkits/gitlab/icon.js +6 -0
- package/dist/toolkits/gitlab/manifest.d.ts +3 -0
- package/dist/toolkits/gitlab/manifest.js +36 -0
- package/dist/toolkits/gitlab/tools/client.d.ts +7 -0
- package/dist/toolkits/gitlab/tools/client.js +45 -0
- package/dist/toolkits/gitlab/tools/index.d.ts +306 -0
- package/dist/toolkits/gitlab/tools/index.js +36 -0
- package/dist/toolkits/gitlab/tools/issues.d.ts +45 -0
- package/dist/toolkits/gitlab/tools/issues.js +103 -0
- package/dist/toolkits/gitlab/tools/merge-requests.d.ts +35 -0
- package/dist/toolkits/gitlab/tools/merge-requests.js +91 -0
- package/dist/toolkits/gitlab/tools/pipelines.d.ts +30 -0
- package/dist/toolkits/gitlab/tools/pipelines.js +66 -0
- package/dist/toolkits/gitlab/tools/projects.d.ts +36 -0
- package/dist/toolkits/gitlab/tools/projects.js +94 -0
- package/dist/toolkits/gitlab/tools/repository.d.ts +21 -0
- package/dist/toolkits/gitlab/tools/repository.js +53 -0
- package/dist/toolkits/gitlab/tools/users-groups.d.ts +11 -0
- package/dist/toolkits/gitlab/tools/users-groups.js +30 -0
- package/dist/toolkits/google-ads/tools/get-rmf-report.d.ts +2 -2
- package/dist/toolkits/google-ads/tools/index.d.ts +2 -2
- package/dist/toolkits/google-analytics/icon.d.ts +5 -0
- package/dist/toolkits/google-analytics/icon.js +11 -0
- package/dist/toolkits/google-analytics/manifest.d.ts +3 -0
- package/dist/toolkits/google-analytics/manifest.js +48 -0
- package/dist/toolkits/google-analytics/tools/admin.d.ts +73 -0
- package/dist/toolkits/google-analytics/tools/admin.js +238 -0
- package/dist/toolkits/google-analytics/tools/audiences.d.ts +81 -0
- package/dist/toolkits/google-analytics/tools/audiences.js +190 -0
- package/dist/toolkits/google-analytics/tools/client.d.ts +47 -0
- package/dist/toolkits/google-analytics/tools/client.js +74 -0
- package/dist/toolkits/google-analytics/tools/custom-definitions.d.ts +62 -0
- package/dist/toolkits/google-analytics/tools/custom-definitions.js +106 -0
- package/dist/toolkits/google-analytics/tools/index.d.ts +16 -0
- package/dist/toolkits/google-analytics/tools/index.js +88 -0
- package/dist/toolkits/google-analytics/tools/links.d.ts +22 -0
- package/dist/toolkits/google-analytics/tools/links.js +56 -0
- package/dist/toolkits/google-analytics/tools/measurement.d.ts +3 -0
- package/dist/toolkits/google-analytics/tools/measurement.js +55 -0
- package/dist/toolkits/google-analytics/tools/reports.d.ts +136 -0
- package/dist/toolkits/google-analytics/tools/reports.js +200 -0
- package/dist/toolkits/google-contacts/icon.d.ts +5 -0
- package/dist/toolkits/google-contacts/icon.js +6 -0
- package/dist/toolkits/google-contacts/manifest.d.ts +3 -0
- package/dist/toolkits/google-contacts/manifest.js +48 -0
- package/dist/toolkits/google-contacts/tools/client.d.ts +19 -0
- package/dist/toolkits/google-contacts/tools/client.js +44 -0
- package/dist/toolkits/google-contacts/tools/contacts.d.ts +94 -0
- package/dist/toolkits/google-contacts/tools/contacts.js +273 -0
- package/dist/toolkits/google-contacts/tools/directory.d.ts +36 -0
- package/dist/toolkits/google-contacts/tools/directory.js +99 -0
- package/dist/toolkits/google-contacts/tools/groups.d.ts +68 -0
- package/dist/toolkits/google-contacts/tools/groups.js +169 -0
- package/dist/toolkits/google-contacts/tools/index.d.ts +347 -0
- package/dist/toolkits/google-contacts/tools/index.js +34 -0
- package/dist/toolkits/google-contacts/tools/photos.d.ts +26 -0
- package/dist/toolkits/google-contacts/tools/photos.js +52 -0
- package/dist/toolkits/google-maps/icon.d.ts +5 -0
- package/dist/toolkits/google-maps/icon.js +39 -0
- package/dist/toolkits/google-maps/manifest.d.ts +3 -0
- package/dist/toolkits/google-maps/manifest.js +55 -0
- package/dist/toolkits/google-maps/tools/client.d.ts +27 -0
- package/dist/toolkits/google-maps/tools/client.js +72 -0
- package/dist/toolkits/google-maps/tools/geocode.d.ts +49 -0
- package/dist/toolkits/google-maps/tools/geocode.js +168 -0
- package/dist/toolkits/google-maps/tools/index.d.ts +432 -0
- package/dist/toolkits/google-maps/tools/index.js +31 -0
- package/dist/toolkits/google-maps/tools/misc.d.ts +70 -0
- package/dist/toolkits/google-maps/tools/misc.js +158 -0
- package/dist/toolkits/google-maps/tools/places.d.ts +112 -0
- package/dist/toolkits/google-maps/tools/places.js +185 -0
- package/dist/toolkits/google-maps/tools/routes.d.ts +48 -0
- package/dist/toolkits/google-maps/tools/routes.js +97 -0
- package/dist/toolkits/google-maps/tools/tiles.d.ts +51 -0
- package/dist/toolkits/google-maps/tools/tiles.js +84 -0
- package/dist/toolkits/google-photos/icon.d.ts +5 -0
- package/dist/toolkits/google-photos/icon.js +6 -0
- package/dist/toolkits/google-photos/manifest.d.ts +3 -0
- package/dist/toolkits/google-photos/manifest.js +47 -0
- package/dist/toolkits/google-photos/tools/albums.d.ts +83 -0
- package/dist/toolkits/google-photos/tools/albums.js +180 -0
- package/dist/toolkits/google-photos/tools/client.d.ts +24 -0
- package/dist/toolkits/google-photos/tools/client.js +77 -0
- package/dist/toolkits/google-photos/tools/index.d.ts +261 -0
- package/dist/toolkits/google-photos/tools/index.js +22 -0
- package/dist/toolkits/google-photos/tools/media.d.ts +52 -0
- package/dist/toolkits/google-photos/tools/media.js +142 -0
- package/dist/toolkits/google-photos/tools/uploads.d.ts +58 -0
- package/dist/toolkits/google-photos/tools/uploads.js +107 -0
- package/dist/toolkits/google-tasks/tools/index.d.ts +1 -1
- package/dist/toolkits/google-tasks/tools/update-task-full.d.ts +1 -1
- package/dist/toolkits/groww/tools/index.d.ts +1 -1
- package/dist/toolkits/groww/tools/instruments.d.ts +1 -1
- package/dist/toolkits/hacker-news/icon.d.ts +5 -0
- package/dist/toolkits/hacker-news/icon.js +9 -0
- package/dist/toolkits/hacker-news/manifest.d.ts +3 -0
- package/dist/toolkits/hacker-news/manifest.js +25 -0
- package/dist/toolkits/hacker-news/tools/client.d.ts +8 -0
- package/dist/toolkits/hacker-news/tools/client.js +51 -0
- package/dist/toolkits/hacker-news/tools/index.d.ts +89 -0
- package/dist/toolkits/hacker-news/tools/index.js +22 -0
- package/dist/toolkits/hacker-news/tools/items.d.ts +42 -0
- package/dist/toolkits/hacker-news/tools/items.js +126 -0
- package/dist/toolkits/hacker-news/tools/search.d.ts +12 -0
- package/dist/toolkits/hacker-news/tools/search.js +40 -0
- package/dist/toolkits/hacker-news/tools/stories.d.ts +25 -0
- package/dist/toolkits/hacker-news/tools/stories.js +98 -0
- package/dist/toolkits/hostinger/icon.d.ts +5 -0
- package/dist/toolkits/hostinger/icon.js +6 -0
- package/dist/toolkits/hostinger/manifest.d.ts +3 -0
- package/dist/toolkits/hostinger/manifest.js +36 -0
- package/dist/toolkits/hostinger/tools/billing.d.ts +12 -0
- package/dist/toolkits/hostinger/tools/billing.js +35 -0
- package/dist/toolkits/hostinger/tools/client.d.ts +6 -0
- package/dist/toolkits/hostinger/tools/client.js +57 -0
- package/dist/toolkits/hostinger/tools/dns.d.ts +22 -0
- package/dist/toolkits/hostinger/tools/dns.js +47 -0
- package/dist/toolkits/hostinger/tools/domains.d.ts +21 -0
- package/dist/toolkits/hostinger/tools/domains.js +62 -0
- package/dist/toolkits/hostinger/tools/hosting.d.ts +17 -0
- package/dist/toolkits/hostinger/tools/hosting.js +38 -0
- package/dist/toolkits/hostinger/tools/index.d.ts +179 -0
- package/dist/toolkits/hostinger/tools/index.js +35 -0
- package/dist/toolkits/hostinger/tools/vps.d.ts +27 -0
- package/dist/toolkits/hostinger/tools/vps.js +77 -0
- package/dist/toolkits/hostinger/tools/whois.d.ts +33 -0
- package/dist/toolkits/hostinger/tools/whois.js +85 -0
- package/dist/toolkits/hugging-face/icon.d.ts +5 -0
- package/dist/toolkits/hugging-face/icon.js +6 -0
- package/dist/toolkits/hugging-face/manifest.d.ts +3 -0
- package/dist/toolkits/hugging-face/manifest.js +42 -0
- package/dist/toolkits/hugging-face/tools/client.d.ts +93 -0
- package/dist/toolkits/hugging-face/tools/client.js +192 -0
- package/dist/toolkits/hugging-face/tools/datasets-viewer.d.ts +65 -0
- package/dist/toolkits/hugging-face/tools/datasets-viewer.js +150 -0
- package/dist/toolkits/hugging-face/tools/datasets.d.ts +160 -0
- package/dist/toolkits/hugging-face/tools/datasets.js +383 -0
- package/dist/toolkits/hugging-face/tools/discussions.d.ts +68 -0
- package/dist/toolkits/hugging-face/tools/discussions.js +144 -0
- package/dist/toolkits/hugging-face/tools/index.d.ts +523 -0
- package/dist/toolkits/hugging-face/tools/index.js +163 -0
- package/dist/toolkits/hugging-face/tools/inference.d.ts +42 -0
- package/dist/toolkits/hugging-face/tools/inference.js +86 -0
- package/dist/toolkits/hugging-face/tools/models.d.ts +117 -0
- package/dist/toolkits/hugging-face/tools/models.js +273 -0
- package/dist/toolkits/hugging-face/tools/papers.d.ts +37 -0
- package/dist/toolkits/hugging-face/tools/papers.js +91 -0
- package/dist/toolkits/hugging-face/tools/repos.d.ts +96 -0
- package/dist/toolkits/hugging-face/tools/repos.js +201 -0
- package/dist/toolkits/hugging-face/tools/settings.d.ts +53 -0
- package/dist/toolkits/hugging-face/tools/settings.js +88 -0
- package/dist/toolkits/hugging-face/tools/spaces.d.ts +245 -0
- package/dist/toolkits/hugging-face/tools/spaces.js +468 -0
- package/dist/toolkits/hugging-face/tools/sql.d.ts +21 -0
- package/dist/toolkits/hugging-face/tools/sql.js +47 -0
- package/dist/toolkits/hugging-face/tools/users.d.ts +60 -0
- package/dist/toolkits/hugging-face/tools/users.js +132 -0
- package/dist/toolkits/hugging-face/tools/webhooks.d.ts +35 -0
- package/dist/toolkits/hugging-face/tools/webhooks.js +87 -0
- package/dist/toolkits/jira/icon.d.ts +5 -0
- package/dist/toolkits/jira/icon.js +6 -0
- package/dist/toolkits/jira/manifest.d.ts +3 -0
- package/dist/toolkits/jira/manifest.js +53 -0
- package/dist/toolkits/jira/tools/boards.d.ts +52 -0
- package/dist/toolkits/jira/tools/boards.js +104 -0
- package/dist/toolkits/jira/tools/client.d.ts +23 -0
- package/dist/toolkits/jira/tools/client.js +270 -0
- package/dist/toolkits/jira/tools/index.d.ts +1280 -0
- package/dist/toolkits/jira/tools/index.js +119 -0
- package/dist/toolkits/jira/tools/issue-fields.d.ts +10 -0
- package/dist/toolkits/jira/tools/issue-fields.js +111 -0
- package/dist/toolkits/jira/tools/issues.d.ts +304 -0
- package/dist/toolkits/jira/tools/issues.js +593 -0
- package/dist/toolkits/jira/tools/meta.d.ts +212 -0
- package/dist/toolkits/jira/tools/meta.js +369 -0
- package/dist/toolkits/jira/tools/projects.d.ts +130 -0
- package/dist/toolkits/jira/tools/projects.js +263 -0
- package/dist/toolkits/jira/tools/search.d.ts +90 -0
- package/dist/toolkits/jira/tools/search.js +181 -0
- package/dist/toolkits/jira/tools/users.d.ts +114 -0
- package/dist/toolkits/jira/tools/users.js +221 -0
- package/dist/toolkits/neo4j/icon.d.ts +5 -0
- package/dist/toolkits/neo4j/icon.js +6 -0
- package/dist/toolkits/neo4j/manifest.d.ts +3 -0
- package/dist/toolkits/neo4j/manifest.js +33 -0
- package/dist/toolkits/neo4j/tools/analytics.d.ts +21 -0
- package/dist/toolkits/neo4j/tools/analytics.js +91 -0
- package/dist/toolkits/neo4j/tools/client.d.ts +6 -0
- package/dist/toolkits/neo4j/tools/client.js +105 -0
- package/dist/toolkits/neo4j/tools/index.d.ts +198 -0
- package/dist/toolkits/neo4j/tools/index.js +30 -0
- package/dist/toolkits/neo4j/tools/instances.d.ts +47 -0
- package/dist/toolkits/neo4j/tools/instances.js +127 -0
- package/dist/toolkits/neo4j/tools/projects.d.ts +44 -0
- package/dist/toolkits/neo4j/tools/projects.js +110 -0
- package/dist/toolkits/neo4j/tools/snapshots.d.ts +20 -0
- package/dist/toolkits/neo4j/tools/snapshots.js +57 -0
- package/dist/toolkits/neon/icon.d.ts +5 -0
- package/dist/toolkits/neon/icon.js +8 -0
- package/dist/toolkits/neon/manifest.d.ts +3 -0
- package/dist/toolkits/neon/manifest.js +36 -0
- package/dist/toolkits/neon/tools/auth.d.ts +115 -0
- package/dist/toolkits/neon/tools/auth.js +286 -0
- package/dist/toolkits/neon/tools/branches.d.ts +189 -0
- package/dist/toolkits/neon/tools/branches.js +465 -0
- package/dist/toolkits/neon/tools/client.d.ts +10 -0
- package/dist/toolkits/neon/tools/client.js +69 -0
- package/dist/toolkits/neon/tools/dataapi.d.ts +42 -0
- package/dist/toolkits/neon/tools/dataapi.js +111 -0
- package/dist/toolkits/neon/tools/endpoints.d.ts +59 -0
- package/dist/toolkits/neon/tools/endpoints.js +163 -0
- package/dist/toolkits/neon/tools/index.d.ts +976 -0
- package/dist/toolkits/neon/tools/index.js +130 -0
- package/dist/toolkits/neon/tools/meta.d.ts +4 -0
- package/dist/toolkits/neon/tools/meta.js +16 -0
- package/dist/toolkits/neon/tools/orgs.d.ts +112 -0
- package/dist/toolkits/neon/tools/orgs.js +303 -0
- package/dist/toolkits/neon/tools/projects.d.ts +177 -0
- package/dist/toolkits/neon/tools/projects.js +468 -0
- package/dist/toolkits/neon/tools/snapshots.d.ts +24 -0
- package/dist/toolkits/neon/tools/snapshots.js +67 -0
- package/dist/toolkits/reddit/tools/index.d.ts +1 -1
- package/dist/toolkits/reddit/tools/search-across-subreddits.d.ts +1 -1
- package/dist/toolkits/slack/icon.d.ts +5 -0
- package/dist/toolkits/slack/icon.js +20 -0
- package/dist/toolkits/slack/manifest.d.ts +3 -0
- package/dist/toolkits/slack/manifest.js +93 -0
- package/dist/toolkits/slack/tools/admin-apps.d.ts +32 -0
- package/dist/toolkits/slack/tools/admin-apps.js +116 -0
- package/dist/toolkits/slack/tools/admin-conversations.d.ts +62 -0
- package/dist/toolkits/slack/tools/admin-conversations.js +246 -0
- package/dist/toolkits/slack/tools/admin-invites.d.ts +19 -0
- package/dist/toolkits/slack/tools/admin-invites.js +75 -0
- package/dist/toolkits/slack/tools/admin-users.d.ts +52 -0
- package/dist/toolkits/slack/tools/admin-users.js +182 -0
- package/dist/toolkits/slack/tools/audit.d.ts +20 -0
- package/dist/toolkits/slack/tools/audit.js +81 -0
- package/dist/toolkits/slack/tools/calls.d.ts +38 -0
- package/dist/toolkits/slack/tools/calls.js +141 -0
- package/dist/toolkits/slack/tools/canvas.d.ts +24 -0
- package/dist/toolkits/slack/tools/canvas.js +102 -0
- package/dist/toolkits/slack/tools/client.d.ts +22 -0
- package/dist/toolkits/slack/tools/client.js +73 -0
- package/dist/toolkits/slack/tools/conversations.d.ts +131 -0
- package/dist/toolkits/slack/tools/conversations.js +463 -0
- package/dist/toolkits/slack/tools/emoji.d.ts +29 -0
- package/dist/toolkits/slack/tools/emoji.js +118 -0
- package/dist/toolkits/slack/tools/files.d.ts +113 -0
- package/dist/toolkits/slack/tools/files.js +368 -0
- package/dist/toolkits/slack/tools/index.d.ts +28 -0
- package/dist/toolkits/slack/tools/index.js +187 -0
- package/dist/toolkits/slack/tools/messages.d.ts +106 -0
- package/dist/toolkits/slack/tools/messages.js +340 -0
- package/dist/toolkits/slack/tools/misc.d.ts +42 -0
- package/dist/toolkits/slack/tools/misc.js +127 -0
- package/dist/toolkits/slack/tools/reactions-stars-pins.d.ts +69 -0
- package/dist/toolkits/slack/tools/reactions-stars-pins.js +236 -0
- package/dist/toolkits/slack/tools/reminders.d.ts +22 -0
- package/dist/toolkits/slack/tools/reminders.js +83 -0
- package/dist/toolkits/slack/tools/search.d.ts +49 -0
- package/dist/toolkits/slack/tools/search.js +155 -0
- package/dist/toolkits/slack/tools/slack-lists.d.ts +65 -0
- package/dist/toolkits/slack/tools/slack-lists.js +282 -0
- package/dist/toolkits/slack/tools/teams.d.ts +75 -0
- package/dist/toolkits/slack/tools/teams.js +285 -0
- package/dist/toolkits/slack/tools/usergroups.d.ts +56 -0
- package/dist/toolkits/slack/tools/usergroups.js +194 -0
- package/dist/toolkits/slack/tools/users.d.ts +87 -0
- package/dist/toolkits/slack/tools/users.js +396 -0
- package/dist/toolkits/youtube/tools/add-video-to-playlist.d.ts +1 -1
- package/dist/toolkits/youtube/tools/delete-video.d.ts +1 -1
- package/dist/toolkits/youtube/tools/index.d.ts +10 -10
- package/dist/toolkits/youtube/tools/list-caption-track.d.ts +1 -1
- package/dist/toolkits/youtube/tools/list-playlist-items.d.ts +1 -1
- package/dist/toolkits/youtube/tools/list-video-categories.d.ts +1 -1
- package/dist/toolkits/youtube/tools/post-comment.d.ts +1 -1
- package/dist/toolkits/youtube/tools/report-video-abuse.d.ts +1 -1
- package/dist/toolkits/youtube/tools/search-youtube.d.ts +1 -1
- package/dist/toolkits/youtube/tools/update-thumbnail.d.ts +1 -1
- package/dist/toolkits/youtube/tools/update-video.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { tool } from 'ai';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { TILE_API_BASE, googleMapsTokenField, mapsRequest } from './client.js';
|
|
5
|
+
export const createTilesSession = tool({
|
|
6
|
+
description: 'Creates a ~2-week session token for 2D tiles and Street View. Each call costs quota — cache and reuse the token.',
|
|
7
|
+
inputSchema: z.object({
|
|
8
|
+
googleMapsToken: googleMapsTokenField,
|
|
9
|
+
mapType: z.enum(['roadmap', 'satellite', 'terrain', 'streetview']).describe('Base map type'),
|
|
10
|
+
language: z.string().describe("IETF language, e.g. 'en-US'"),
|
|
11
|
+
region: z.string().describe("CLDR region, e.g. 'US'"),
|
|
12
|
+
scale: z.enum(['scaleFactor1x', 'scaleFactor2x', 'scaleFactor4x']).optional(),
|
|
13
|
+
highDpi: z.boolean().optional().describe('High-res tiles (needs 2x/4x scale)'),
|
|
14
|
+
overlay: z.boolean().optional().describe('Separate layers vs combined image'),
|
|
15
|
+
layerTypes: z.array(z.enum(['layerRoadmap', 'layerStreetview', 'layerTraffic'])).optional(),
|
|
16
|
+
styles: z.array(z.record(z.any())).optional().describe('Roadmap JSON styles'),
|
|
17
|
+
imageFormat: z.enum(['jpeg', 'png']).optional(),
|
|
18
|
+
}),
|
|
19
|
+
execute: async ({ googleMapsToken, ...body }) => {
|
|
20
|
+
try {
|
|
21
|
+
const result = await mapsRequest(googleMapsToken, TILE_API_BASE, '/createSession', {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
body,
|
|
24
|
+
});
|
|
25
|
+
if (!result.ok)
|
|
26
|
+
return { error: 'Failed to create tiles session', details: result.error };
|
|
27
|
+
return result.data;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return { error: 'Error creating tiles session', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
export const get2dTile = tool({
|
|
35
|
+
description: 'Downloads one 2D tile image (PNG/JPEG, ~256px) as base64. Needs a session from createTilesSession; x/y ranges depend on zoom.',
|
|
36
|
+
inputSchema: z.object({
|
|
37
|
+
googleMapsToken: googleMapsTokenField,
|
|
38
|
+
z: z.number().min(0).max(22).describe('Zoom 0 (world) to 22 (detailed)'),
|
|
39
|
+
x: z.number().min(0).describe('Column in [0, 2^zoom - 1]'),
|
|
40
|
+
y: z.number().min(0).describe('Row in [0, 2^zoom - 1]'),
|
|
41
|
+
session: z.string().describe('Session token from createTilesSession'),
|
|
42
|
+
key: z.string().optional().describe('API key alternative to Bearer auth'),
|
|
43
|
+
orientation: z.number().optional().describe('Counter-clockwise rotation: 0, 90, 180, or 270'),
|
|
44
|
+
}),
|
|
45
|
+
execute: async ({ googleMapsToken, z, x, y, session, key, orientation }) => {
|
|
46
|
+
try {
|
|
47
|
+
const max = 2 ** z - 1;
|
|
48
|
+
if (x > max || y > max)
|
|
49
|
+
return { error: `x and y must be within [0, ${max}] for zoom ${z}` };
|
|
50
|
+
const result = await mapsRequest(googleMapsToken, TILE_API_BASE, `/2dtiles/${z}/${x}/${y}`, {
|
|
51
|
+
query: { session, key, orientation },
|
|
52
|
+
responseType: 'bytes',
|
|
53
|
+
});
|
|
54
|
+
if (!result.ok)
|
|
55
|
+
return { error: 'Failed to get 2D tile', details: result.error };
|
|
56
|
+
const data = result.data;
|
|
57
|
+
return { tile: { name: `tile-${z}-${x}-${y}`, mimetype: data.mimetype ?? 'image/png', contentBase64: data.contentBase64, byteSize: data.byteSize } };
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return { error: 'Error getting 2D tile', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
export const get3dTilesRoot = tool({
|
|
65
|
+
description: 'Gets the photorealistic 3D tileset root (OGC 3D Tiles) to bootstrap a renderer. Billable per call — cache the response.',
|
|
66
|
+
inputSchema: z.object({
|
|
67
|
+
googleMapsToken: googleMapsTokenField,
|
|
68
|
+
key: z.string().optional().describe('API key alternative to Bearer auth'),
|
|
69
|
+
}),
|
|
70
|
+
execute: async ({ googleMapsToken, key }) => {
|
|
71
|
+
try {
|
|
72
|
+
const result = await mapsRequest(googleMapsToken, TILE_API_BASE, '/3dtiles/root.json', {
|
|
73
|
+
query: { key },
|
|
74
|
+
});
|
|
75
|
+
if (!result.ok)
|
|
76
|
+
return { error: 'Failed to get 3D tiles root', details: result.error };
|
|
77
|
+
return result.data;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return { error: 'Error getting 3D tiles root', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=tiles.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const SVG = `<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 350 350"><defs><radialGradient id="prefix__a" cx="173.161" cy="178.716" fx="239.836" fy="36.176" r="170.886" gradientTransform="matrix(1 0 0 1.041 0 -7.272)" gradientUnits="userSpaceOnUse"><stop offset=".469" stop-color="#7acaff"/><stop offset=".828" stop-color="#00b054"/></radialGradient><radialGradient id="prefix__b" cx="173.161" cy="178.716" fx="239.836" fy="36.176" r="170.886" gradientTransform="matrix(0 1 -1.041 0 357.272 0)" gradientUnits="userSpaceOnUse"><stop offset=".545" stop-color="#fded1c"/><stop offset=".828" stop-color="#feca01"/></radialGradient><radialGradient id="prefix__c" cx="173.161" cy="178.716" fx="239.836" fy="36.176" r="170.886" gradientTransform="matrix(-1 0 0 -1.041 350 357.272)" gradientUnits="userSpaceOnUse"><stop offset=".469" stop-color="#ff81d0"/><stop offset=".828" stop-color="#ff4041"/></radialGradient><radialGradient id="prefix__d" cx="173.161" cy="178.716" fx="239.836" fy="36.176" r="170.886" gradientTransform="matrix(0 -1 1.041 0 -7.272 350)" gradientUnits="userSpaceOnUse"><stop offset=".469" stop-color="#aaa7ff"/><stop offset=".828" stop-color="#2f89ff"/></radialGradient></defs><path d="M79.6 262.5c0-48.3 39.2-87.5 87.5-87.5h7.9v167.1c0 4.4-3.6 7.9-7.9 7.9-48.3 0-87.5-39.2-87.5-87.5z" fill="url(#prefix__a)"/><path d="M87.5 79.6c48.3 0 87.5 39.2 87.5 87.5v7.9H7.9c-4.4 0-7.9-3.6-7.9-7.9 0-48.3 39.2-87.5 87.5-87.5z" fill="url(#prefix__b)"/><path d="M270.4 87.5c0 48.3-39.2 87.5-87.5 87.5H175V7.9c0-4.4 3.6-7.9 7.9-7.9 48.3 0 87.5 39.2 87.5 87.5z" fill="url(#prefix__c)"/><path d="M262.5 270.4c-48.3 0-87.5-39.2-87.5-87.5V175h167.1c4.4 0 7.9 3.6 7.9 7.9 0 48.3-39.2 87.5-87.5 87.5z" fill="url(#prefix__d)"/></svg>`;
|
|
2
|
+
export const GPHOTOS_ICON = {
|
|
3
|
+
kind: 'svg',
|
|
4
|
+
dataUri: `data:image/svg+xml;base64,${Buffer.from(SVG).toString('base64')}`,
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=icon.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { defineToolkit, defineTool } from '../../core/define.js';
|
|
2
|
+
import { inferToolScope } from '../../core/scope.js';
|
|
3
|
+
import { GPHOTOS_ICON } from './icon.js';
|
|
4
|
+
import { googlePhotosTools } from './tools/index.js';
|
|
5
|
+
export default defineToolkit({
|
|
6
|
+
id: 'google-photos',
|
|
7
|
+
displayName: 'Google Photos',
|
|
8
|
+
shortDescription: 'Manage Google Photos albums, media items, uploads, and enrichment.',
|
|
9
|
+
category: 'Entertainment & Media',
|
|
10
|
+
icon: GPHOTOS_ICON,
|
|
11
|
+
auth: {
|
|
12
|
+
type: 'oauth2',
|
|
13
|
+
tokenField: 'googlePhotosToken',
|
|
14
|
+
provider: {
|
|
15
|
+
slug: 'google-photos',
|
|
16
|
+
env: { clientId: 'GOOGLE_PHOTOS_CLIENT_ID', clientSecret: 'GOOGLE_PHOTOS_CLIENT_SECRET' },
|
|
17
|
+
authorizeUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
18
|
+
tokenUrl: 'https://oauth2.googleapis.com/token',
|
|
19
|
+
scopes: [
|
|
20
|
+
'https://www.googleapis.com/auth/photoslibrary',
|
|
21
|
+
'https://www.googleapis.com/auth/photoslibrary.readonly',
|
|
22
|
+
'https://www.googleapis.com/auth/photoslibrary.appendonly',
|
|
23
|
+
'https://www.googleapis.com/auth/photoslibrary.edit.appcreateddata',
|
|
24
|
+
'https://www.googleapis.com/auth/photoslibrary.readonly.appcreateddata',
|
|
25
|
+
],
|
|
26
|
+
exchangeStyle: 'form',
|
|
27
|
+
extraAuthParams: { access_type: 'offline', prompt: 'consent' },
|
|
28
|
+
connectDescription: 'Connect Google Photos to manage albums, uploads, and app-created media.',
|
|
29
|
+
callbackPath: '/api/auth/google-photos/callback',
|
|
30
|
+
stateCookie: 'google_photos_oauth_state',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
allowedHosts: ['photoslibrary.googleapis.com'],
|
|
34
|
+
tools: googlePhotosTools.map((entry) => defineTool({
|
|
35
|
+
name: entry.name,
|
|
36
|
+
description: entry.description,
|
|
37
|
+
tool: entry.tool,
|
|
38
|
+
requiredAuth: entry.requiredAuth,
|
|
39
|
+
scope: entry.scope ?? inferToolScope(entry.name),
|
|
40
|
+
})),
|
|
41
|
+
meta: {
|
|
42
|
+
since: '0.0.8',
|
|
43
|
+
homepage: 'https://photos.google.com',
|
|
44
|
+
docsUrl: 'https://developers.google.com/photos',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export declare const createAlbum: import("ai").Tool<{
|
|
2
|
+
title: string;
|
|
3
|
+
googlePhotosToken: string;
|
|
4
|
+
}, any>;
|
|
5
|
+
export declare const getAlbum: import("ai").Tool<{
|
|
6
|
+
googlePhotosToken: string;
|
|
7
|
+
albumId: string;
|
|
8
|
+
}, any>;
|
|
9
|
+
export declare const listAlbums: import("ai").Tool<{
|
|
10
|
+
googlePhotosToken: string;
|
|
11
|
+
pageToken?: string | undefined;
|
|
12
|
+
pageSize?: number | undefined;
|
|
13
|
+
excludeNonAppCreatedData?: boolean | undefined;
|
|
14
|
+
}, any>;
|
|
15
|
+
export declare const updateAlbum: import("ai").Tool<{
|
|
16
|
+
googlePhotosToken: string;
|
|
17
|
+
albumId: string;
|
|
18
|
+
title?: string | undefined;
|
|
19
|
+
coverPhotoMediaItemId?: string | undefined;
|
|
20
|
+
}, any>;
|
|
21
|
+
export declare const addEnrichment: import("ai").Tool<{
|
|
22
|
+
googlePhotosToken: string;
|
|
23
|
+
albumId: string;
|
|
24
|
+
newEnrichmentItem: {
|
|
25
|
+
textEnrichment?: {
|
|
26
|
+
text: string;
|
|
27
|
+
} | undefined;
|
|
28
|
+
locationEnrichment?: {
|
|
29
|
+
location: {
|
|
30
|
+
latlng: {
|
|
31
|
+
latitude: number;
|
|
32
|
+
longitude: number;
|
|
33
|
+
};
|
|
34
|
+
locationName: string;
|
|
35
|
+
};
|
|
36
|
+
} | undefined;
|
|
37
|
+
mapEnrichment?: {
|
|
38
|
+
origin: {
|
|
39
|
+
latlng: {
|
|
40
|
+
latitude: number;
|
|
41
|
+
longitude: number;
|
|
42
|
+
};
|
|
43
|
+
locationName: string;
|
|
44
|
+
};
|
|
45
|
+
destination: {
|
|
46
|
+
latlng: {
|
|
47
|
+
latitude: number;
|
|
48
|
+
longitude: number;
|
|
49
|
+
};
|
|
50
|
+
locationName: string;
|
|
51
|
+
};
|
|
52
|
+
} | undefined;
|
|
53
|
+
};
|
|
54
|
+
albumPosition: {
|
|
55
|
+
position: "POSITION_TYPE_UNSPECIFIED" | "FIRST_IN_ALBUM" | "LAST_IN_ALBUM" | "AFTER_MEDIA_ITEM" | "AFTER_ENRICHMENT_ITEM";
|
|
56
|
+
relativeMediaItemId?: string | undefined;
|
|
57
|
+
relativeEnrichmentItemId?: string | undefined;
|
|
58
|
+
};
|
|
59
|
+
}, any>;
|
|
60
|
+
export declare const batchAddMediaItems: import("ai").Tool<{
|
|
61
|
+
googlePhotosToken: string;
|
|
62
|
+
albumId: string;
|
|
63
|
+
mediaItemIds: string[];
|
|
64
|
+
}, {
|
|
65
|
+
error: string;
|
|
66
|
+
details: any;
|
|
67
|
+
albumId?: undefined;
|
|
68
|
+
mediaItemsAdded?: undefined;
|
|
69
|
+
message?: undefined;
|
|
70
|
+
} | {
|
|
71
|
+
albumId: string;
|
|
72
|
+
mediaItemsAdded: number;
|
|
73
|
+
message: string;
|
|
74
|
+
error?: undefined;
|
|
75
|
+
details?: undefined;
|
|
76
|
+
} | {
|
|
77
|
+
error: string;
|
|
78
|
+
message: string;
|
|
79
|
+
details?: undefined;
|
|
80
|
+
albumId?: undefined;
|
|
81
|
+
mediaItemsAdded?: undefined;
|
|
82
|
+
}>;
|
|
83
|
+
//# sourceMappingURL=albums.d.ts.map
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { tool } from 'ai';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { googlePhotosTokenField, photosRequest } from './client.js';
|
|
5
|
+
const albumPosition = z.object({
|
|
6
|
+
position: z.enum(['POSITION_TYPE_UNSPECIFIED', 'FIRST_IN_ALBUM', 'LAST_IN_ALBUM', 'AFTER_MEDIA_ITEM', 'AFTER_ENRICHMENT_ITEM']),
|
|
7
|
+
relativeMediaItemId: z.string().optional().describe('Required for AFTER_MEDIA_ITEM'),
|
|
8
|
+
relativeEnrichmentItemId: z.string().optional().describe('Required for AFTER_ENRICHMENT_ITEM'),
|
|
9
|
+
});
|
|
10
|
+
export const createAlbum = tool({
|
|
11
|
+
description: 'Creates an album with a title (max 500 chars). Add items afterwards with batchAddMediaItems.',
|
|
12
|
+
inputSchema: z.object({
|
|
13
|
+
googlePhotosToken: googlePhotosTokenField,
|
|
14
|
+
title: z.string().min(1).max(500).describe('Album title'),
|
|
15
|
+
}),
|
|
16
|
+
execute: async ({ googlePhotosToken, title }) => {
|
|
17
|
+
try {
|
|
18
|
+
const result = await photosRequest(googlePhotosToken, '/albums', {
|
|
19
|
+
method: 'POST',
|
|
20
|
+
body: { album: { title } },
|
|
21
|
+
});
|
|
22
|
+
if (!result.ok)
|
|
23
|
+
return { error: 'Failed to create album', details: result.error };
|
|
24
|
+
return result.data;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return { error: 'Error creating album', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
export const getAlbum = tool({
|
|
32
|
+
description: 'Gets an album by ID.',
|
|
33
|
+
inputSchema: z.object({
|
|
34
|
+
googlePhotosToken: googlePhotosTokenField,
|
|
35
|
+
albumId: z.string().describe('Album ID'),
|
|
36
|
+
}),
|
|
37
|
+
execute: async ({ googlePhotosToken, albumId }) => {
|
|
38
|
+
try {
|
|
39
|
+
const result = await photosRequest(googlePhotosToken, `/albums/${albumId}`);
|
|
40
|
+
if (!result.ok)
|
|
41
|
+
return { error: 'Failed to get album', details: result.error };
|
|
42
|
+
return result.data;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
return { error: 'Error getting album', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
export const listAlbums = tool({
|
|
50
|
+
description: 'Lists albums in the Albums tab with pagination.',
|
|
51
|
+
inputSchema: z.object({
|
|
52
|
+
googlePhotosToken: googlePhotosTokenField,
|
|
53
|
+
pageSize: z.number().min(1).max(50).optional().describe('Albums per page (default 20, max 50)'),
|
|
54
|
+
pageToken: z.string().optional(),
|
|
55
|
+
excludeNonAppCreatedData: z.boolean().optional().describe('Only app-created media counts'),
|
|
56
|
+
}),
|
|
57
|
+
execute: async ({ googlePhotosToken, pageSize, pageToken, excludeNonAppCreatedData }) => {
|
|
58
|
+
try {
|
|
59
|
+
const result = await photosRequest(googlePhotosToken, '/albums', {
|
|
60
|
+
query: { pageSize, pageToken, excludeNonAppCreatedData },
|
|
61
|
+
});
|
|
62
|
+
if (!result.ok)
|
|
63
|
+
return { error: 'Failed to list albums', details: result.error };
|
|
64
|
+
return result.data;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return { error: 'Error listing albums', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
export const updateAlbum = tool({
|
|
72
|
+
description: 'Updates an app-created album title and/or cover photo. Provide at least one of title or coverPhotoMediaItemId.',
|
|
73
|
+
inputSchema: z.object({
|
|
74
|
+
googlePhotosToken: googlePhotosTokenField,
|
|
75
|
+
albumId: z.string().describe('Album ID to update'),
|
|
76
|
+
title: z.string().max(500).optional().describe('New title'),
|
|
77
|
+
coverPhotoMediaItemId: z.string().optional().describe('Media item ID for the cover'),
|
|
78
|
+
}),
|
|
79
|
+
execute: async ({ googlePhotosToken, albumId, title, coverPhotoMediaItemId }) => {
|
|
80
|
+
try {
|
|
81
|
+
if (title === undefined && coverPhotoMediaItemId === undefined) {
|
|
82
|
+
return { error: 'Provide title and/or coverPhotoMediaItemId' };
|
|
83
|
+
}
|
|
84
|
+
const mask = [];
|
|
85
|
+
const body = {};
|
|
86
|
+
if (title !== undefined) {
|
|
87
|
+
mask.push('title');
|
|
88
|
+
body.title = title;
|
|
89
|
+
}
|
|
90
|
+
if (coverPhotoMediaItemId !== undefined) {
|
|
91
|
+
mask.push('coverPhotoMediaItemId');
|
|
92
|
+
body.coverPhotoMediaItemId = coverPhotoMediaItemId;
|
|
93
|
+
}
|
|
94
|
+
const result = await photosRequest(googlePhotosToken, `/albums/${albumId}`, {
|
|
95
|
+
method: 'PATCH',
|
|
96
|
+
query: { updateMask: mask.join(',') },
|
|
97
|
+
body,
|
|
98
|
+
});
|
|
99
|
+
if (!result.ok)
|
|
100
|
+
return { error: 'Failed to update album', details: result.error };
|
|
101
|
+
return result.data;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return { error: 'Error updating album', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
export const addEnrichment = tool({
|
|
109
|
+
description: 'Adds a text, location, or map enrichment at a position in an album. AFTER_* positions need the relative item ID.',
|
|
110
|
+
inputSchema: z.object({
|
|
111
|
+
googlePhotosToken: googlePhotosTokenField,
|
|
112
|
+
albumId: z.string().describe('Album ID'),
|
|
113
|
+
newEnrichmentItem: z.object({
|
|
114
|
+
textEnrichment: z.object({ text: z.string() }).optional(),
|
|
115
|
+
locationEnrichment: z.object({
|
|
116
|
+
location: z.object({
|
|
117
|
+
locationName: z.string(),
|
|
118
|
+
latlng: z.object({ latitude: z.number().min(-90).max(90), longitude: z.number().min(-180).max(180) }),
|
|
119
|
+
}),
|
|
120
|
+
}).optional(),
|
|
121
|
+
mapEnrichment: z.object({
|
|
122
|
+
origin: z.object({
|
|
123
|
+
locationName: z.string(),
|
|
124
|
+
latlng: z.object({ latitude: z.number().min(-90).max(90), longitude: z.number().min(-180).max(180) }),
|
|
125
|
+
}),
|
|
126
|
+
destination: z.object({
|
|
127
|
+
locationName: z.string(),
|
|
128
|
+
latlng: z.object({ latitude: z.number().min(-90).max(90), longitude: z.number().min(-180).max(180) }),
|
|
129
|
+
}),
|
|
130
|
+
}).optional(),
|
|
131
|
+
}).describe('Exactly one of text/location/map enrichment'),
|
|
132
|
+
albumPosition: albumPosition.describe('Insert position'),
|
|
133
|
+
}),
|
|
134
|
+
execute: async ({ googlePhotosToken, albumId, newEnrichmentItem, albumPosition }) => {
|
|
135
|
+
try {
|
|
136
|
+
const kinds = ['textEnrichment', 'locationEnrichment', 'mapEnrichment'].filter((k) => newEnrichmentItem[k] !== undefined);
|
|
137
|
+
if (kinds.length !== 1)
|
|
138
|
+
return { error: 'newEnrichmentItem must contain exactly one of textEnrichment, locationEnrichment, mapEnrichment' };
|
|
139
|
+
if (albumPosition.position === 'AFTER_MEDIA_ITEM' && !albumPosition.relativeMediaItemId) {
|
|
140
|
+
return { error: 'AFTER_MEDIA_ITEM requires relativeMediaItemId' };
|
|
141
|
+
}
|
|
142
|
+
if (albumPosition.position === 'AFTER_ENRICHMENT_ITEM' && !albumPosition.relativeEnrichmentItemId) {
|
|
143
|
+
return { error: 'AFTER_ENRICHMENT_ITEM requires relativeEnrichmentItemId' };
|
|
144
|
+
}
|
|
145
|
+
const result = await photosRequest(googlePhotosToken, `/albums/${albumId}:addEnrichment`, {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
body: { newEnrichmentItem, albumPosition },
|
|
148
|
+
});
|
|
149
|
+
if (!result.ok)
|
|
150
|
+
return { error: 'Failed to add enrichment', details: result.error };
|
|
151
|
+
return result.data;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
return { error: 'Error adding enrichment', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
export const batchAddMediaItems = tool({
|
|
159
|
+
description: 'Adds up to 50 app-created media items to an app-created album.',
|
|
160
|
+
inputSchema: z.object({
|
|
161
|
+
googlePhotosToken: googlePhotosTokenField,
|
|
162
|
+
albumId: z.string().min(1).describe('App-created album ID'),
|
|
163
|
+
mediaItemIds: z.array(z.string()).min(1).max(50).describe('App-created media item IDs'),
|
|
164
|
+
}),
|
|
165
|
+
execute: async ({ googlePhotosToken, albumId, mediaItemIds }) => {
|
|
166
|
+
try {
|
|
167
|
+
const result = await photosRequest(googlePhotosToken, `/albums/${albumId}:batchAddMediaItems`, {
|
|
168
|
+
method: 'POST',
|
|
169
|
+
body: { mediaItemIds },
|
|
170
|
+
});
|
|
171
|
+
if (!result.ok)
|
|
172
|
+
return { error: 'Failed to add media items to album', details: result.error };
|
|
173
|
+
return { albumId, mediaItemsAdded: mediaItemIds.length, message: 'Successfully added media items to album' };
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
return { error: 'Error adding media items to album', message: error instanceof Error ? error.message : 'Unknown error' };
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=albums.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const PHOTOS_API_BASE = "https://photoslibrary.googleapis.com/v1";
|
|
3
|
+
export declare const googlePhotosTokenField: z.ZodString;
|
|
4
|
+
export declare function buildQuery(params: Record<string, string | number | boolean | string[] | undefined>): string;
|
|
5
|
+
export declare function photosRequest(googlePhotosToken: string, path: string, options?: {
|
|
6
|
+
method?: string;
|
|
7
|
+
query?: Record<string, string | number | boolean | string[] | undefined>;
|
|
8
|
+
body?: unknown;
|
|
9
|
+
}): Promise<{
|
|
10
|
+
ok: false;
|
|
11
|
+
error: any;
|
|
12
|
+
data?: undefined;
|
|
13
|
+
} | {
|
|
14
|
+
ok: true;
|
|
15
|
+
data: any;
|
|
16
|
+
error?: undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function uploadBytes(googlePhotosToken: string, fileName: string, bytes: Buffer, contentType: string): Promise<string>;
|
|
19
|
+
export declare function fetchUrlBytes(url: string): Promise<{
|
|
20
|
+
bytes: Buffer;
|
|
21
|
+
contentType: string;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function fileNameFromUrl(url: string, fallback: string): string;
|
|
24
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export const PHOTOS_API_BASE = 'https://photoslibrary.googleapis.com/v1';
|
|
4
|
+
export const googlePhotosTokenField = z.string().describe('Google Photos OAuth access token (Bearer)');
|
|
5
|
+
export function buildQuery(params) {
|
|
6
|
+
const search = new URLSearchParams();
|
|
7
|
+
for (const [key, value] of Object.entries(params)) {
|
|
8
|
+
if (value === undefined)
|
|
9
|
+
continue;
|
|
10
|
+
if (Array.isArray(value)) {
|
|
11
|
+
for (const v of value)
|
|
12
|
+
search.append(key, String(v));
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
search.set(key, String(value));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const qs = search.toString();
|
|
19
|
+
return qs ? `?${qs}` : '';
|
|
20
|
+
}
|
|
21
|
+
export async function photosRequest(googlePhotosToken, path, options) {
|
|
22
|
+
const url = `${PHOTOS_API_BASE}${path}${buildQuery(options?.query ?? {})}`;
|
|
23
|
+
const response = await fetch(url, {
|
|
24
|
+
method: options?.method ?? 'GET',
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: `Bearer ${googlePhotosToken}`,
|
|
27
|
+
...(options?.body !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
28
|
+
},
|
|
29
|
+
body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const details = await response.json().catch(() => ({}));
|
|
33
|
+
return { ok: false, error: details };
|
|
34
|
+
}
|
|
35
|
+
if (response.status === 204) {
|
|
36
|
+
return { ok: true, data: { success: true } };
|
|
37
|
+
}
|
|
38
|
+
const data = await response.json().catch(() => ({}));
|
|
39
|
+
return { ok: true, data };
|
|
40
|
+
}
|
|
41
|
+
export async function uploadBytes(googlePhotosToken, fileName, bytes, contentType) {
|
|
42
|
+
const response = await fetch(`${PHOTOS_API_BASE}/uploads`, {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: {
|
|
45
|
+
Authorization: `Bearer ${googlePhotosToken}`,
|
|
46
|
+
'Content-Type': 'application/octet-stream',
|
|
47
|
+
'X-Goog-Upload-Content-Type': contentType,
|
|
48
|
+
'X-Goog-Upload-Protocol': 'raw',
|
|
49
|
+
'X-Goog-Upload-File-Name': fileName,
|
|
50
|
+
},
|
|
51
|
+
body: bytes,
|
|
52
|
+
});
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
const details = await response.json().catch(() => ({}));
|
|
55
|
+
throw new Error(`Upload failed: ${JSON.stringify(details)}`);
|
|
56
|
+
}
|
|
57
|
+
return response.text();
|
|
58
|
+
}
|
|
59
|
+
export async function fetchUrlBytes(url) {
|
|
60
|
+
const response = await fetch(url);
|
|
61
|
+
if (!response.ok)
|
|
62
|
+
throw new Error(`Failed to fetch file (HTTP ${response.status})`);
|
|
63
|
+
return {
|
|
64
|
+
bytes: Buffer.from(await response.arrayBuffer()),
|
|
65
|
+
contentType: response.headers.get('content-type') ?? 'application/octet-stream',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function fileNameFromUrl(url, fallback) {
|
|
69
|
+
try {
|
|
70
|
+
const name = new URL(url).pathname.split('/').filter(Boolean).pop();
|
|
71
|
+
return name && name.includes('.') ? decodeURIComponent(name) : fallback;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return fallback;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=client.js.map
|