@particle-academy/google-calendar-ui 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,31 @@ The four packages share one version, because they are generated from one
8
8
  `provider/` definition and a version that meant something different in each
9
9
  would be a version nobody could reason about.
10
10
 
11
+ ## [0.4.0] — 2026-11-08
12
+
13
+ ### Added
14
+
15
+ - **One Google consent grant, shared by every Google connector** (`oauth.grant:
16
+ "google"`), for an org-level Google connection: one OAuth client, one consent
17
+ and one refresh token per person, with each feature's scopes asked for when it
18
+ is first used. Declared in the manifest, the `-ui` package's OAuth constant,
19
+ the README and the registry index:
20
+ - `authorizeParams`: `access_type=offline` and `include_granted_scopes=true`.
21
+ A refresh token comes back only on the FIRST code exchange, so keep the stored
22
+ one when an exchange returns none.
23
+ - `revoke`: POST `https://oauth2.googleapis.com/revoke` with `token`, and
24
+ `scope: "grant"`. **Revoking removes the person's WHOLE Google grant, every
25
+ Google connector**, so a per-feature disconnect stops using that feature's
26
+ scopes locally and only a full Google disconnect revokes.
27
+ - `identity`: identify the account by the id_token's `sub` (request `openid`;
28
+ issuer `https://accounts.google.com` or `accounts.google.com`; audience is
29
+ the `clientId`), never by email, which Google says is neither unique nor
30
+ permanent.
31
+ `restrictedScopes` is empty: none of this connector's scopes is restricted.
32
+
33
+ Nothing a request sends has changed; this is what a host needs to run the
34
+ connection.
35
+
11
36
  ## [0.3.0] — 2026-11-08
12
37
 
13
38
  ### Added
package/README.md CHANGED
@@ -56,6 +56,13 @@ Google Calendar uses OAuth2 (authorization_code). The package DECLARES the excha
56
56
  - **Scopes** — `https://www.googleapis.com/auth/calendar.events`
57
57
  - **Access token lifetime** — 3600 seconds (1 hours). A host that never refreshes works all afternoon and is broken by morning.
58
58
 
59
+ **One consent grant, shared** (`grant: "google"`). Every connector declaring the same grant can run on ONE OAuth client, with one consent and one refresh token per person.
60
+
61
+ - **Authorize with** `access_type=offline`, `include_granted_scopes=true`. Ask for a feature's scopes when it is first used; the new token covers every scope granted before. A refresh token comes back only on the FIRST exchange, so keep the stored one when an exchange returns none.
62
+ - **Revoke** — POST https://oauth2.googleapis.com/revoke with `token`. **It removes the WHOLE grant**: every connector sharing it, not only this one. A per-feature disconnect stops using that feature's scopes locally; only a full disconnect revokes.
63
+ - **Identify the account by `sub`**: request `openid`, then verify the token response's id_token (issuer `https://accounts.google.com` or `accounts.google.com`, keys at https://www.googleapis.com/oauth2/v3/certs, audience = `clientId`). Never key a connection by email.
64
+ - **No restricted scopes** in this connector.
65
+
59
66
  The refresh tokens do **not** rotate: the same one is reusable, so a refresh may safely be retried and may run concurrently. Stated rather than assumed, because the opposite — a provider that spends the token and revokes the grant on a replay — looks identical until it happens.
60
67
 
61
68
  ### The estate
package/dist/index.cjs CHANGED
@@ -57,7 +57,28 @@ var GOOGLE_CALENDAR_OAUTH = {
57
57
  "accessTokenCredential": "accessToken",
58
58
  "refreshTokenCredential": "refreshToken",
59
59
  "refreshTokenRotates": false,
60
- "accessTokenTtlSeconds": 3600
60
+ "accessTokenTtlSeconds": 3600,
61
+ "grant": "google",
62
+ "authorizeParams": {
63
+ "access_type": "offline",
64
+ "include_granted_scopes": "true"
65
+ },
66
+ "revoke": {
67
+ "url": "https://oauth2.googleapis.com/revoke",
68
+ "param": "token",
69
+ "scope": "grant"
70
+ },
71
+ "identity": {
72
+ "scope": "openid",
73
+ "claim": "sub",
74
+ "issuers": [
75
+ "https://accounts.google.com",
76
+ "accounts.google.com"
77
+ ],
78
+ "jwksUrl": "https://www.googleapis.com/oauth2/v3/certs",
79
+ "audienceCredential": "clientId"
80
+ },
81
+ "restrictedScopes": []
61
82
  };
62
83
  function googleCalendarMeta(role, operation, docs) {
63
84
  return { ...GOOGLE_CALENDAR_SERVICE, role, operation, docs };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/service.ts","../src/kinds/channel-stop.ts","../src/kinds/channel-watch.ts","../src/kinds/event-create.ts","../src/kinds/event-delete.ts","../src/kinds/event-get.ts","../src/kinds/event-list.ts","../src/kinds/event-update.ts","../src/kinds/events-changed.ts","../src/index.ts"],"names":["defineConnectorKind","summarize"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar's identity on the authoring surface, shared by every Google\n * Calendar node.\n *\n * This file must import nothing from the js package: a PHP or Python project\n * installs the ui package and never that one, and the import would be a\n * dangling module the moment it did.\n *\n * ## The sandbox trap\n *\n * Google has no sandbox for Calendar. A test calendar is a real one in a real\n * account, so every watch and every read is real -- point this at a scratch\n * calendar, not a production one. The faker is the only way to develop against\n * it without touching an account.\n */\n\nimport type { ConnectorDomain, ConnectorMeta } from \"@particle-academy/fancy-flow/connectors\";\n\n/**\n * The connector API version this package was GENERATED against.\n *\n * A literal, never imported — an imported constant lets an upgrade rewrite the\n * very claim it exists to detect.\n */\nexport const CONNECTOR_API_VERSION = 1;\n\n/** The parts of a connector's identity that belong to the SERVICE, not the node. */\nexport const GOOGLE_CALENDAR_SERVICE = {\n service: \"google_calendar\",\n serviceTitle: \"Google Calendar\",\n domain: \"calendar\",\n sandbox: \"none\",\n} as const satisfies Pick<ConnectorMeta, \"service\" | \"serviceTitle\" | \"domain\" | \"sandbox\">;\n\n/**\n * Every connector domain weaver knows, pinned against fancy-flow's union.\n *\n * A closed set copied into three codebases stays correct only while something\n * MAKES it: this line fails to compile the moment weaver carries a value\n * fancy-flow does not, including the values no provider uses yet.\n */\nconst WEAVER_DOMAINS: readonly ConnectorDomain[] = [\n \"payments\",\n \"commerce\",\n \"messaging\",\n \"email\",\n \"crm\",\n \"support\",\n \"storage\",\n \"calendar\",\n \"productivity\",\n \"database\",\n \"devtools\",\n \"analytics\",\n \"marketing\",\n \"ai\",\n \"forms\",\n \"hr\",\n \"geo\"\n];\nvoid WEAVER_DOMAINS;\n\n/** The credentials a Google Calendar connection holds. */\nexport const GOOGLE_CALENDAR_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From Google Cloud Console -> APIs & Services -> Credentials. ONE value for the whole installation, not per connected account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"The client secret for the same OAuth app. One value for the whole installation.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account, and it expires after ONE HOUR. The host refreshes it with the refresh token.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account. Google issues one only when the consent request asks for offline access; without it the connection dies within the hour.\"\n },\n {\n \"key\": \"channelToken\",\n \"label\": \"Channel token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"A secret the host chooses per connected account and sends as `token` on every events.watch. Google echoes it back in the X-Goog-Channel-Token header of every notification, and that echo is the ONLY thing that authenticates a delivery -- Google does not sign them. Up to 256 characters.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Calendar requires — DECLARED here, performed by\n * the host.\n *\n * A consent screen needs a browser, a redirect URI and somewhere to persist\n * the result, and all three belong to the host; a package that ran the dance\n * itself would have to own a web server. So this says precisely enough for a\n * host to do it.\n *\n * The access token lasts 3600 seconds. A host that never refreshes will work\n * all afternoon and be broken by morning, which is why the lifetime is stated\n * rather than left to be discovered.\n *\n * Its refresh tokens do NOT rotate: the same one is reusable, so a refresh may\n * safely be retried and may run concurrently. That is stated rather than\n * assumed because the opposite — a provider that spends the token and revokes\n * the grant on a replay — looks identical until it happens.\n */\nexport const GOOGLE_CALENDAR_OAUTH = {\n \"flow\": \"authorization_code\",\n \"authorizeUrl\": \"https://accounts.google.com/o/oauth2/v2/auth\",\n \"tokenUrl\": \"https://oauth2.googleapis.com/token\",\n \"scopes\": [\n \"https://www.googleapis.com/auth/calendar.events\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600\n} as const;\n\n/** Build a Google Calendar node's connector metadata from the operation it performs. */\nexport function googleCalendarMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_CALENDAR_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/channel-stop.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/channel-stop.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar stop watching — Close a push-notification channel. The\n * host's subscription machinery calls this before re-creating a channel and\n * when a trigger is removed.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/channels/stop\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_KIND = \"@particle-academy/google_calendar_channel_stop\";\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_OPERATION = \"channel_stop\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_META = googleCalendarMeta(\"action\", \"stop a channel\", \"https://developers.google.com/workspace/calendar/api/v3/reference/channels/stop\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_OUTPUT: OutputField[] = [\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google answers with an empty body, so this is the only thing published.\"\n }\n];\n\nexport const googleCalendarChannelStopKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_CHANNEL_STOP_META, {\n name: GOOGLE_CALENDAR_CHANNEL_STOP_KIND,\n aliases: [\"google_calendar_channel_stop\"],\n label: \"Google Calendar stop watching\",\n description: \"Close a push-notification channel. The host's subscription machinery calls this before re-creating a channel and when a trigger is removed.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_CHANNEL_STOP_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"channelId\",\n \"label\": \"Channel ID\",\n \"required\": true,\n \"description\": \"The channel's id, as sent to channel_watch.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"resourceId\",\n \"label\": \"Resource ID\",\n \"required\": true,\n \"description\": \"The resourceId channel_watch answered with. Both are needed; Google refuses a stop with only one.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_CHANNEL_STOP_META, config as Record<string, unknown>, \"stop a channel\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/channel-watch.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/channel-watch.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar watch — Open a push-notification channel on a calendar's\n * events. The host's subscription machinery calls this; it is not a node most\n * workflows need.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/watch\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_KIND = \"@particle-academy/google_calendar_channel_watch\";\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_OPERATION = \"channel_watch\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_META = googleCalendarMeta(\"action\", \"watch a calendar\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/watch\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The channel id -- what was sent.\"\n },\n {\n \"path\": \"data.resourceId\",\n \"type\": \"string\",\n \"description\": \"Google's opaque id for the watched resource. channel_stop needs it together with the channel id.\"\n },\n {\n \"path\": \"data.resourceUri\",\n \"type\": \"string\",\n \"description\": \"The watched resource's URI.\"\n },\n {\n \"path\": \"data.token\",\n \"type\": \"string\",\n \"description\": \"The token that will be echoed on every notification.\"\n },\n {\n \"path\": \"data.expiration\",\n \"type\": \"string\",\n \"description\": \"When the channel expires, as epoch MILLISECONDS in a string. The subscription trigger's lease is built from this.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarChannelWatchKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_CHANNEL_WATCH_META, {\n name: GOOGLE_CALENDAR_CHANNEL_WATCH_KIND,\n aliases: [\"google_calendar_channel_watch\"],\n label: \"Google Calendar watch\",\n description: \"Open a push-notification channel on a calendar's events. The host's subscription machinery calls this; it is not a node most workflows need.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_CALENDAR_CHANNEL_WATCH_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"channelId\",\n \"label\": \"Channel ID\",\n \"required\": true,\n \"description\": \"A UUID the host mints for THIS channel. Google requires it to be unique; it comes back in every notification as X-Goog-Channel-ID and is what channel_stop needs.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"address\",\n \"label\": \"Notification URL\",\n \"required\": true,\n \"description\": \"The HTTPS URL the host mounts for this trigger. Google POSTs notifications here with an EMPTY body and the facts in X-Goog-* headers.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"token\",\n \"label\": \"Channel token\",\n \"required\": true,\n \"description\": \"The connection's channelToken. The host fills this from the connection -- never type a value here. Google echoes it in X-Goog-Channel-Token, and that echo is how a delivery is verified.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"ttlSeconds\",\n \"label\": \"Lifetime (seconds)\",\n \"required\": true,\n \"default\": \"604800\",\n \"description\": \"How long Google keeps the channel alive. Google's default is 604800 (one week), and the discovery document types it as a STRING inside `params`.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_CHANNEL_WATCH_META, config as Record<string, unknown>, \"watch a calendar\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-create.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Create Google Calendar event — Create a timed event on a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/insert\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_CREATE_KIND = \"@particle-academy/google_calendar_event_create\";\nexport const GOOGLE_CALENDAR_EVENT_CREATE_OPERATION = \"event_create\";\n\nexport const GOOGLE_CALENDAR_EVENT_CREATE_META = googleCalendarMeta(\"action\", \"create an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/insert\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_CREATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The new event's id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"confirmed or tentative, echoing what was sent (or Google's default).\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.created\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 creation time.\"\n },\n {\n \"path\": \"data.organizer.email\",\n \"type\": \"string\",\n \"description\": \"The connected account, almost always.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventCreateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_CREATE_META, {\n name: GOOGLE_CALENDAR_EVENT_CREATE_KIND,\n aliases: [\"google_calendar_event_create\"],\n label: \"Create Google Calendar event\",\n description: \"Create a timed event on a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_CALENDAR_EVENT_CREATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"summary\",\n \"label\": \"Title\",\n \"required\": true\n },\n {\n \"type\": \"textarea\",\n \"key\": \"description\",\n \"label\": \"Description\",\n \"description\": \"Can contain HTML.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"location\",\n \"label\": \"Location\",\n \"description\": \"Free-form text.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startDateTime\",\n \"label\": \"Start\",\n \"required\": true,\n \"description\": \"RFC 3339, e.g. 2026-10-01T14:00:00Z. Include an offset, or pair with a time zone below.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startTimeZone\",\n \"label\": \"Start time zone\",\n \"description\": \"IANA name, e.g. America/New_York. Optional when the start time already carries an offset.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endDateTime\",\n \"label\": \"End\",\n \"required\": true,\n \"description\": \"RFC 3339. Exclusive -- the event ends at, not through, this instant.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endTimeZone\",\n \"label\": \"End time zone\"\n },\n {\n \"type\": \"select\",\n \"key\": \"status\",\n \"label\": \"Status\",\n \"options\": [\n {\n \"value\": \"confirmed\",\n \"label\": \"Confirmed\"\n },\n {\n \"value\": \"tentative\",\n \"label\": \"Tentative\"\n }\n ],\n \"description\": \"\\\"cancelled\\\" is not offered here -- that is event_delete's job, not a status this action should be able to set on create.\"\n },\n {\n \"type\": \"select\",\n \"key\": \"visibility\",\n \"label\": \"Visibility\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"public\",\n \"label\": \"Public\"\n },\n {\n \"value\": \"private\",\n \"label\": \"Private\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"transparency\",\n \"label\": \"Show me as\",\n \"options\": [\n {\n \"value\": \"opaque\",\n \"label\": \"Busy\"\n },\n {\n \"value\": \"transparent\",\n \"label\": \"Available\"\n }\n ],\n \"description\": \"opaque blocks time on the calendar (Busy); transparent does not (Available).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"colorId\",\n \"label\": \"Color ID\",\n \"description\": \"An id from the colors endpoint's event section. Leave blank for the calendar's default.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_CREATE_META, config as Record<string, unknown>, \"create an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-delete.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-delete.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Delete Google Calendar event — Remove an event from a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/delete\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_DELETE_KIND = \"@particle-academy/google_calendar_event_delete\";\nexport const GOOGLE_CALENDAR_EVENT_DELETE_OPERATION = \"event_delete\";\n\nexport const GOOGLE_CALENDAR_EVENT_DELETE_META = googleCalendarMeta(\"action\", \"delete an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/delete\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_DELETE_OUTPUT: OutputField[] = [\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google answers 204 with no body, so this is the only thing published.\"\n }\n];\n\nexport const googleCalendarEventDeleteKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_DELETE_META, {\n name: GOOGLE_CALENDAR_EVENT_DELETE_KIND,\n aliases: [\"google_calendar_event_delete\"],\n label: \"Delete Google Calendar event\",\n description: \"Remove an event from a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_EVENT_DELETE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"From event_create's data.id, or event_list/event_get.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_DELETE_META, config as Record<string, unknown>, \"delete an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-get.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar event — Read one event from a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_GET_KIND = \"@particle-academy/google_calendar_event_get\";\nexport const GOOGLE_CALENDAR_EVENT_GET_OPERATION = \"event_get\";\n\nexport const GOOGLE_CALENDAR_EVENT_GET_META = googleCalendarMeta(\"action\", \"read an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/get\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The event id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"confirmed, tentative or cancelled.\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"The title.\"\n },\n {\n \"path\": \"data.description\",\n \"type\": \"string\",\n \"description\": \"The description, when there is one.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 start. All-day events carry start.date instead.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 end. All-day events carry end.date instead.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification.\"\n },\n {\n \"path\": \"data.organizer.email\",\n \"type\": \"string\",\n \"description\": \"Who organises it.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_GET_META, {\n name: GOOGLE_CALENDAR_EVENT_GET_KIND,\n aliases: [\"google_calendar_event_get\"],\n label: \"Google Calendar event\",\n description: \"Read one event from a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENT_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id (usually an email address).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"The event's id, as published by another node or by a notification's follow-up list.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_GET_META, config as Record<string, unknown>, \"read an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-list.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar events — List events from a Google Calendar, in full or\n * incrementally with a sync token.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_LIST_KIND = \"@particle-academy/google_calendar_event_list\";\nexport const GOOGLE_CALENDAR_EVENT_LIST_OPERATION = \"event_list\";\n\nexport const GOOGLE_CALENDAR_EVENT_LIST_META = googleCalendarMeta(\"action\", \"list events\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/list\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.items\",\n \"type\": \"array\",\n \"description\": \"The events on this page, each shaped like event_get's output.\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n },\n {\n \"path\": \"data.nextSyncToken\",\n \"type\": \"string\",\n \"description\": \"Present on the LAST page only. Store it and pass it as syncToken next time to get only what changed.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification of the calendar.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_LIST_META, {\n name: GOOGLE_CALENDAR_EVENT_LIST_KIND,\n aliases: [\"google_calendar_event_list\"],\n label: \"Google Calendar events\",\n description: \"List events from a Google Calendar, in full or incrementally with a sync token.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"syncToken\",\n \"label\": \"Sync token\",\n \"description\": \"From a previous list's nextSyncToken. With one set, Google returns ONLY what changed since -- including deletions, as cancelled events. Leave blank for a full list.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"timeMin\",\n \"label\": \"From\",\n \"description\": \"RFC 3339 lower bound on an event's END time, e.g. 2026-09-15T00:00:00Z. Not allowed together with a sync token.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"timeMax\",\n \"label\": \"To\",\n \"description\": \"RFC 3339 upper bound on an event's START time. Not allowed together with a sync token.\"\n },\n {\n \"type\": \"number\",\n \"key\": \"maxResults\",\n \"label\": \"Page size\",\n \"min\": 1,\n \"max\": 2500,\n \"default\": 250,\n \"description\": \"Events per page. Google's default is 250 and its maximum 2500; a nextPageToken means there are more.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous page's nextPageToken.\"\n },\n {\n \"type\": \"switch\",\n \"key\": \"singleEvents\",\n \"label\": \"Expand recurring events\",\n \"default\": true,\n \"description\": \"Return each occurrence of a recurring event as its own item, rather than the series once.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_LIST_META, config as Record<string, unknown>, \"list events\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-update.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-update.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Update Google Calendar event — Change one or more fields of an existing\n * event. Only the fields provided are touched.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/patch\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_KIND = \"@particle-academy/google_calendar_event_update\";\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_OPERATION = \"event_update\";\n\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_META = googleCalendarMeta(\"action\", \"update an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/patch\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The event's id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"The event's status after this update.\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"The event's title after this update.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"The event's start after this update.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"The event's end after this update.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification -- now.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventUpdateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_UPDATE_META, {\n name: GOOGLE_CALENDAR_EVENT_UPDATE_KIND,\n aliases: [\"google_calendar_event_update\"],\n label: \"Update Google Calendar event\",\n description: \"Change one or more fields of an existing event. Only the fields provided are touched.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_EVENT_UPDATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"From event_create's data.id, or event_list/event_get.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"summary\",\n \"label\": \"Title\"\n },\n {\n \"type\": \"textarea\",\n \"key\": \"description\",\n \"label\": \"Description\"\n },\n {\n \"type\": \"text\",\n \"key\": \"location\",\n \"label\": \"Location\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startDateTime\",\n \"label\": \"Start\",\n \"description\": \"RFC 3339. Leave blank to leave the start time unchanged.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startTimeZone\",\n \"label\": \"Start time zone\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endDateTime\",\n \"label\": \"End\",\n \"description\": \"RFC 3339. Leave blank to leave the end time unchanged.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endTimeZone\",\n \"label\": \"End time zone\"\n },\n {\n \"type\": \"select\",\n \"key\": \"status\",\n \"label\": \"Status\",\n \"options\": [\n {\n \"value\": \"confirmed\",\n \"label\": \"Confirmed\"\n },\n {\n \"value\": \"tentative\",\n \"label\": \"Tentative\"\n },\n {\n \"value\": \"cancelled\",\n \"label\": \"Cancelled\"\n }\n ],\n \"description\": \"Setting cancelled here has the same effect as event_delete -- offered because PATCH is also Google's documented way to cancel one instance of a recurring event, which event_delete (which removes the whole resource) cannot target.\"\n },\n {\n \"type\": \"select\",\n \"key\": \"visibility\",\n \"label\": \"Visibility\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"public\",\n \"label\": \"Public\"\n },\n {\n \"value\": \"private\",\n \"label\": \"Private\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"transparency\",\n \"label\": \"Show me as\",\n \"options\": [\n {\n \"value\": \"opaque\",\n \"label\": \"Busy\"\n },\n {\n \"value\": \"transparent\",\n \"label\": \"Available\"\n }\n ]\n },\n {\n \"type\": \"text\",\n \"key\": \"colorId\",\n \"label\": \"Color ID\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_UPDATE_META, config as Record<string, unknown>, \"update an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/triggers/events-changed.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/triggers/events-changed.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar change — Start a run when something changes on a watched\n * Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/guides/push\n *\n * Delivery: subscription. The host mints a UUID, calls channel_watch with it,\n * its own URL for this trigger and the connection's channelToken, and stores\n * the returned id, resourceId and expiration. Google cannot renew a channel:\n * 86400 seconds before it expires the host calls channel_stop and then\n * channel_watch again. A channel that lapsed is re-listed FIRST (event_list\n * with the stored syncToken; a 410 means list in full) and then re-created,\n * because notifications during the gap are gone. Google delivers with an EMPTY\n * body: the host verifies X-Goog-Channel-Token against the connection's\n * channelToken and injects the X-Goog-* headers as the event, camel-cased as\n * below. The first message on a new channel is `sync` and carries no change.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_KIND = \"@particle-academy/google_calendar_events_changed_trigger\";\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OPERATION = \"events_changed\";\n\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META = googleCalendarMeta(\"trigger\", \"a calendar change\", \"https://developers.google.com/workspace/calendar/api/guides/push\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OUTPUT: OutputField[] = [\n {\n \"path\": \"channelId\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Channel-ID: which channel this came from.\"\n },\n {\n \"path\": \"messageNumber\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Message-Number: increases per channel; 1 is the sync message.\"\n },\n {\n \"path\": \"resourceId\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-ID: the watched resource.\"\n },\n {\n \"path\": \"resourceState\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-State: sync, exists or not_exists. `sync` carries no change.\"\n },\n {\n \"path\": \"resourceUri\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-URI: the watched resource's URI.\"\n },\n {\n \"path\": \"channelExpiration\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Channel-Expiration, when Google sends it: the channel's expiry in a human-readable format, not an instant to compute with.\"\n }\n];\n\nexport const googleCalendarEventsChangedTriggerKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META, {\n name: GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_KIND,\n aliases: [\"google_calendar_events_changed_trigger\"],\n label: \"Google Calendar change\",\n description: \"Start a run when something changes on a watched Google Calendar.\",\n icon: \"📅\",\n inputs: [],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OUTPUT,\n configSchema: [\n {\n \"type\": \"select\",\n \"key\": \"sample\",\n \"label\": \"Sample state (fake mode)\",\n \"default\": \"exists\",\n \"description\": \"Which resource state the faked notification carries: `exists` is a change, `sync` is the first message on a new channel, `not_exists` is the resource going away.\",\n \"options\": [\n {\n \"value\": \"exists\",\n \"label\": \"exists — something changed\"\n },\n {\n \"value\": \"sync\",\n \"label\": \"sync — the channel just opened\"\n },\n {\n \"value\": \"not_exists\",\n \"label\": \"not_exists — the resource is gone\"\n }\n ]\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\",\n \"sample\": \"exists\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META, config as Record<string, unknown>, \"a calendar change\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar's node kinds for fancy-flow.\n *\n * Install this on every host. The TypeScript executors live in the js\n * package's `./flow` subpath; PHP and Python hosts run their own and need only\n * this.\n */\n\nexport * from \"./service.js\";\nexport * from \"./kinds/channel-stop.js\";\nexport * from \"./kinds/channel-watch.js\";\nexport * from \"./kinds/event-create.js\";\nexport * from \"./kinds/event-delete.js\";\nexport * from \"./kinds/event-get.js\";\nexport * from \"./kinds/event-list.js\";\nexport * from \"./kinds/event-update.js\";\nexport * from \"./kinds/events-changed.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleCalendarChannelStopKind } from \"./kinds/channel-stop.js\";\nimport { googleCalendarChannelWatchKind } from \"./kinds/channel-watch.js\";\nimport { googleCalendarEventCreateKind } from \"./kinds/event-create.js\";\nimport { googleCalendarEventDeleteKind } from \"./kinds/event-delete.js\";\nimport { googleCalendarEventGetKind } from \"./kinds/event-get.js\";\nimport { googleCalendarEventListKind } from \"./kinds/event-list.js\";\nimport { googleCalendarEventUpdateKind } from \"./kinds/event-update.js\";\nimport { googleCalendarEventsChangedTriggerKind } from \"./kinds/events-changed.js\";\n\n/** Every Google Calendar kind, for a host that registers the lot. */\nexport const GOOGLE_CALENDAR_KINDS: NodeKindDefinition[] = [\n googleCalendarChannelStopKind,\n googleCalendarChannelWatchKind,\n googleCalendarEventCreateKind,\n googleCalendarEventDeleteKind,\n googleCalendarEventGetKind,\n googleCalendarEventListKind,\n googleCalendarEventUpdateKind,\n googleCalendarEventsChangedTriggerKind,\n];\n"]}
1
+ {"version":3,"sources":["../src/service.ts","../src/kinds/channel-stop.ts","../src/kinds/channel-watch.ts","../src/kinds/event-create.ts","../src/kinds/event-delete.ts","../src/kinds/event-get.ts","../src/kinds/event-list.ts","../src/kinds/event-update.ts","../src/kinds/events-changed.ts","../src/index.ts"],"names":["defineConnectorKind","summarize"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar's identity on the authoring surface, shared by every Google\n * Calendar node.\n *\n * This file must import nothing from the js package: a PHP or Python project\n * installs the ui package and never that one, and the import would be a\n * dangling module the moment it did.\n *\n * ## The sandbox trap\n *\n * Google has no sandbox for Calendar. A test calendar is a real one in a real\n * account, so every watch and every read is real -- point this at a scratch\n * calendar, not a production one. The faker is the only way to develop against\n * it without touching an account.\n */\n\nimport type { ConnectorDomain, ConnectorMeta } from \"@particle-academy/fancy-flow/connectors\";\n\n/**\n * The connector API version this package was GENERATED against.\n *\n * A literal, never imported — an imported constant lets an upgrade rewrite the\n * very claim it exists to detect.\n */\nexport const CONNECTOR_API_VERSION = 1;\n\n/** The parts of a connector's identity that belong to the SERVICE, not the node. */\nexport const GOOGLE_CALENDAR_SERVICE = {\n service: \"google_calendar\",\n serviceTitle: \"Google Calendar\",\n domain: \"calendar\",\n sandbox: \"none\",\n} as const satisfies Pick<ConnectorMeta, \"service\" | \"serviceTitle\" | \"domain\" | \"sandbox\">;\n\n/**\n * Every connector domain weaver knows, pinned against fancy-flow's union.\n *\n * A closed set copied into three codebases stays correct only while something\n * MAKES it: this line fails to compile the moment weaver carries a value\n * fancy-flow does not, including the values no provider uses yet.\n */\nconst WEAVER_DOMAINS: readonly ConnectorDomain[] = [\n \"payments\",\n \"commerce\",\n \"messaging\",\n \"email\",\n \"crm\",\n \"support\",\n \"storage\",\n \"calendar\",\n \"productivity\",\n \"database\",\n \"devtools\",\n \"analytics\",\n \"marketing\",\n \"ai\",\n \"forms\",\n \"hr\",\n \"geo\"\n];\nvoid WEAVER_DOMAINS;\n\n/** The credentials a Google Calendar connection holds. */\nexport const GOOGLE_CALENDAR_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From Google Cloud Console -> APIs & Services -> Credentials. ONE value for the whole installation, not per connected account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"The client secret for the same OAuth app. One value for the whole installation.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account, and it expires after ONE HOUR. The host refreshes it with the refresh token.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account. Google issues one only when the consent request asks for offline access; without it the connection dies within the hour.\"\n },\n {\n \"key\": \"channelToken\",\n \"label\": \"Channel token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"A secret the host chooses per connected account and sends as `token` on every events.watch. Google echoes it back in the X-Goog-Channel-Token header of every notification, and that echo is the ONLY thing that authenticates a delivery -- Google does not sign them. Up to 256 characters.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Calendar requires — DECLARED here, performed by\n * the host.\n *\n * A consent screen needs a browser, a redirect URI and somewhere to persist\n * the result, and all three belong to the host; a package that ran the dance\n * itself would have to own a web server. So this says precisely enough for a\n * host to do it.\n *\n * The access token lasts 3600 seconds. A host that never refreshes will work\n * all afternoon and be broken by morning, which is why the lifetime is stated\n * rather than left to be discovered.\n *\n * Its refresh tokens do NOT rotate: the same one is reusable, so a refresh may\n * safely be retried and may run concurrently. That is stated rather than\n * assumed because the opposite — a provider that spends the token and revokes\n * the grant on a replay — looks identical until it happens.\n *\n * Its consent grant is SHARED with every connector declaring grant \"google\":\n * one OAuth client, one consent and one refresh token per person, scopes added\n * as features are first used (authorizeParams). Revoking removes the WHOLE\n * grant, so only a full disconnect revokes; a per-feature disconnect stops\n * using the scope locally. Identify the account by the id_token's sub, never\n * by email.\n */\nexport const GOOGLE_CALENDAR_OAUTH = {\n \"flow\": \"authorization_code\",\n \"authorizeUrl\": \"https://accounts.google.com/o/oauth2/v2/auth\",\n \"tokenUrl\": \"https://oauth2.googleapis.com/token\",\n \"scopes\": [\n \"https://www.googleapis.com/auth/calendar.events\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600,\n \"grant\": \"google\",\n \"authorizeParams\": {\n \"access_type\": \"offline\",\n \"include_granted_scopes\": \"true\"\n },\n \"revoke\": {\n \"url\": \"https://oauth2.googleapis.com/revoke\",\n \"param\": \"token\",\n \"scope\": \"grant\"\n },\n \"identity\": {\n \"scope\": \"openid\",\n \"claim\": \"sub\",\n \"issuers\": [\n \"https://accounts.google.com\",\n \"accounts.google.com\"\n ],\n \"jwksUrl\": \"https://www.googleapis.com/oauth2/v3/certs\",\n \"audienceCredential\": \"clientId\"\n },\n \"restrictedScopes\": []\n} as const;\n\n/** Build a Google Calendar node's connector metadata from the operation it performs. */\nexport function googleCalendarMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_CALENDAR_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/channel-stop.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/channel-stop.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar stop watching — Close a push-notification channel. The\n * host's subscription machinery calls this before re-creating a channel and\n * when a trigger is removed.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/channels/stop\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_KIND = \"@particle-academy/google_calendar_channel_stop\";\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_OPERATION = \"channel_stop\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_META = googleCalendarMeta(\"action\", \"stop a channel\", \"https://developers.google.com/workspace/calendar/api/v3/reference/channels/stop\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_OUTPUT: OutputField[] = [\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google answers with an empty body, so this is the only thing published.\"\n }\n];\n\nexport const googleCalendarChannelStopKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_CHANNEL_STOP_META, {\n name: GOOGLE_CALENDAR_CHANNEL_STOP_KIND,\n aliases: [\"google_calendar_channel_stop\"],\n label: \"Google Calendar stop watching\",\n description: \"Close a push-notification channel. The host's subscription machinery calls this before re-creating a channel and when a trigger is removed.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_CHANNEL_STOP_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"channelId\",\n \"label\": \"Channel ID\",\n \"required\": true,\n \"description\": \"The channel's id, as sent to channel_watch.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"resourceId\",\n \"label\": \"Resource ID\",\n \"required\": true,\n \"description\": \"The resourceId channel_watch answered with. Both are needed; Google refuses a stop with only one.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_CHANNEL_STOP_META, config as Record<string, unknown>, \"stop a channel\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/channel-watch.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/channel-watch.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar watch — Open a push-notification channel on a calendar's\n * events. The host's subscription machinery calls this; it is not a node most\n * workflows need.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/watch\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_KIND = \"@particle-academy/google_calendar_channel_watch\";\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_OPERATION = \"channel_watch\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_META = googleCalendarMeta(\"action\", \"watch a calendar\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/watch\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The channel id -- what was sent.\"\n },\n {\n \"path\": \"data.resourceId\",\n \"type\": \"string\",\n \"description\": \"Google's opaque id for the watched resource. channel_stop needs it together with the channel id.\"\n },\n {\n \"path\": \"data.resourceUri\",\n \"type\": \"string\",\n \"description\": \"The watched resource's URI.\"\n },\n {\n \"path\": \"data.token\",\n \"type\": \"string\",\n \"description\": \"The token that will be echoed on every notification.\"\n },\n {\n \"path\": \"data.expiration\",\n \"type\": \"string\",\n \"description\": \"When the channel expires, as epoch MILLISECONDS in a string. The subscription trigger's lease is built from this.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarChannelWatchKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_CHANNEL_WATCH_META, {\n name: GOOGLE_CALENDAR_CHANNEL_WATCH_KIND,\n aliases: [\"google_calendar_channel_watch\"],\n label: \"Google Calendar watch\",\n description: \"Open a push-notification channel on a calendar's events. The host's subscription machinery calls this; it is not a node most workflows need.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_CALENDAR_CHANNEL_WATCH_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"channelId\",\n \"label\": \"Channel ID\",\n \"required\": true,\n \"description\": \"A UUID the host mints for THIS channel. Google requires it to be unique; it comes back in every notification as X-Goog-Channel-ID and is what channel_stop needs.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"address\",\n \"label\": \"Notification URL\",\n \"required\": true,\n \"description\": \"The HTTPS URL the host mounts for this trigger. Google POSTs notifications here with an EMPTY body and the facts in X-Goog-* headers.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"token\",\n \"label\": \"Channel token\",\n \"required\": true,\n \"description\": \"The connection's channelToken. The host fills this from the connection -- never type a value here. Google echoes it in X-Goog-Channel-Token, and that echo is how a delivery is verified.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"ttlSeconds\",\n \"label\": \"Lifetime (seconds)\",\n \"required\": true,\n \"default\": \"604800\",\n \"description\": \"How long Google keeps the channel alive. Google's default is 604800 (one week), and the discovery document types it as a STRING inside `params`.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_CHANNEL_WATCH_META, config as Record<string, unknown>, \"watch a calendar\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-create.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Create Google Calendar event — Create a timed event on a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/insert\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_CREATE_KIND = \"@particle-academy/google_calendar_event_create\";\nexport const GOOGLE_CALENDAR_EVENT_CREATE_OPERATION = \"event_create\";\n\nexport const GOOGLE_CALENDAR_EVENT_CREATE_META = googleCalendarMeta(\"action\", \"create an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/insert\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_CREATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The new event's id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"confirmed or tentative, echoing what was sent (or Google's default).\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.created\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 creation time.\"\n },\n {\n \"path\": \"data.organizer.email\",\n \"type\": \"string\",\n \"description\": \"The connected account, almost always.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventCreateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_CREATE_META, {\n name: GOOGLE_CALENDAR_EVENT_CREATE_KIND,\n aliases: [\"google_calendar_event_create\"],\n label: \"Create Google Calendar event\",\n description: \"Create a timed event on a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_CALENDAR_EVENT_CREATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"summary\",\n \"label\": \"Title\",\n \"required\": true\n },\n {\n \"type\": \"textarea\",\n \"key\": \"description\",\n \"label\": \"Description\",\n \"description\": \"Can contain HTML.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"location\",\n \"label\": \"Location\",\n \"description\": \"Free-form text.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startDateTime\",\n \"label\": \"Start\",\n \"required\": true,\n \"description\": \"RFC 3339, e.g. 2026-10-01T14:00:00Z. Include an offset, or pair with a time zone below.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startTimeZone\",\n \"label\": \"Start time zone\",\n \"description\": \"IANA name, e.g. America/New_York. Optional when the start time already carries an offset.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endDateTime\",\n \"label\": \"End\",\n \"required\": true,\n \"description\": \"RFC 3339. Exclusive -- the event ends at, not through, this instant.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endTimeZone\",\n \"label\": \"End time zone\"\n },\n {\n \"type\": \"select\",\n \"key\": \"status\",\n \"label\": \"Status\",\n \"options\": [\n {\n \"value\": \"confirmed\",\n \"label\": \"Confirmed\"\n },\n {\n \"value\": \"tentative\",\n \"label\": \"Tentative\"\n }\n ],\n \"description\": \"\\\"cancelled\\\" is not offered here -- that is event_delete's job, not a status this action should be able to set on create.\"\n },\n {\n \"type\": \"select\",\n \"key\": \"visibility\",\n \"label\": \"Visibility\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"public\",\n \"label\": \"Public\"\n },\n {\n \"value\": \"private\",\n \"label\": \"Private\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"transparency\",\n \"label\": \"Show me as\",\n \"options\": [\n {\n \"value\": \"opaque\",\n \"label\": \"Busy\"\n },\n {\n \"value\": \"transparent\",\n \"label\": \"Available\"\n }\n ],\n \"description\": \"opaque blocks time on the calendar (Busy); transparent does not (Available).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"colorId\",\n \"label\": \"Color ID\",\n \"description\": \"An id from the colors endpoint's event section. Leave blank for the calendar's default.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_CREATE_META, config as Record<string, unknown>, \"create an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-delete.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-delete.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Delete Google Calendar event — Remove an event from a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/delete\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_DELETE_KIND = \"@particle-academy/google_calendar_event_delete\";\nexport const GOOGLE_CALENDAR_EVENT_DELETE_OPERATION = \"event_delete\";\n\nexport const GOOGLE_CALENDAR_EVENT_DELETE_META = googleCalendarMeta(\"action\", \"delete an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/delete\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_DELETE_OUTPUT: OutputField[] = [\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google answers 204 with no body, so this is the only thing published.\"\n }\n];\n\nexport const googleCalendarEventDeleteKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_DELETE_META, {\n name: GOOGLE_CALENDAR_EVENT_DELETE_KIND,\n aliases: [\"google_calendar_event_delete\"],\n label: \"Delete Google Calendar event\",\n description: \"Remove an event from a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_EVENT_DELETE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"From event_create's data.id, or event_list/event_get.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_DELETE_META, config as Record<string, unknown>, \"delete an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-get.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar event — Read one event from a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_GET_KIND = \"@particle-academy/google_calendar_event_get\";\nexport const GOOGLE_CALENDAR_EVENT_GET_OPERATION = \"event_get\";\n\nexport const GOOGLE_CALENDAR_EVENT_GET_META = googleCalendarMeta(\"action\", \"read an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/get\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The event id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"confirmed, tentative or cancelled.\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"The title.\"\n },\n {\n \"path\": \"data.description\",\n \"type\": \"string\",\n \"description\": \"The description, when there is one.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 start. All-day events carry start.date instead.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 end. All-day events carry end.date instead.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification.\"\n },\n {\n \"path\": \"data.organizer.email\",\n \"type\": \"string\",\n \"description\": \"Who organises it.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_GET_META, {\n name: GOOGLE_CALENDAR_EVENT_GET_KIND,\n aliases: [\"google_calendar_event_get\"],\n label: \"Google Calendar event\",\n description: \"Read one event from a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENT_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id (usually an email address).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"The event's id, as published by another node or by a notification's follow-up list.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_GET_META, config as Record<string, unknown>, \"read an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-list.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar events — List events from a Google Calendar, in full or\n * incrementally with a sync token.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_LIST_KIND = \"@particle-academy/google_calendar_event_list\";\nexport const GOOGLE_CALENDAR_EVENT_LIST_OPERATION = \"event_list\";\n\nexport const GOOGLE_CALENDAR_EVENT_LIST_META = googleCalendarMeta(\"action\", \"list events\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/list\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.items\",\n \"type\": \"array\",\n \"description\": \"The events on this page, each shaped like event_get's output.\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n },\n {\n \"path\": \"data.nextSyncToken\",\n \"type\": \"string\",\n \"description\": \"Present on the LAST page only. Store it and pass it as syncToken next time to get only what changed.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification of the calendar.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_LIST_META, {\n name: GOOGLE_CALENDAR_EVENT_LIST_KIND,\n aliases: [\"google_calendar_event_list\"],\n label: \"Google Calendar events\",\n description: \"List events from a Google Calendar, in full or incrementally with a sync token.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"syncToken\",\n \"label\": \"Sync token\",\n \"description\": \"From a previous list's nextSyncToken. With one set, Google returns ONLY what changed since -- including deletions, as cancelled events. Leave blank for a full list.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"timeMin\",\n \"label\": \"From\",\n \"description\": \"RFC 3339 lower bound on an event's END time, e.g. 2026-09-15T00:00:00Z. Not allowed together with a sync token.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"timeMax\",\n \"label\": \"To\",\n \"description\": \"RFC 3339 upper bound on an event's START time. Not allowed together with a sync token.\"\n },\n {\n \"type\": \"number\",\n \"key\": \"maxResults\",\n \"label\": \"Page size\",\n \"min\": 1,\n \"max\": 2500,\n \"default\": 250,\n \"description\": \"Events per page. Google's default is 250 and its maximum 2500; a nextPageToken means there are more.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous page's nextPageToken.\"\n },\n {\n \"type\": \"switch\",\n \"key\": \"singleEvents\",\n \"label\": \"Expand recurring events\",\n \"default\": true,\n \"description\": \"Return each occurrence of a recurring event as its own item, rather than the series once.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_LIST_META, config as Record<string, unknown>, \"list events\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-update.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-update.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Update Google Calendar event — Change one or more fields of an existing\n * event. Only the fields provided are touched.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/patch\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_KIND = \"@particle-academy/google_calendar_event_update\";\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_OPERATION = \"event_update\";\n\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_META = googleCalendarMeta(\"action\", \"update an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/patch\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The event's id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"The event's status after this update.\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"The event's title after this update.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"The event's start after this update.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"The event's end after this update.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification -- now.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventUpdateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_UPDATE_META, {\n name: GOOGLE_CALENDAR_EVENT_UPDATE_KIND,\n aliases: [\"google_calendar_event_update\"],\n label: \"Update Google Calendar event\",\n description: \"Change one or more fields of an existing event. Only the fields provided are touched.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_EVENT_UPDATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"From event_create's data.id, or event_list/event_get.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"summary\",\n \"label\": \"Title\"\n },\n {\n \"type\": \"textarea\",\n \"key\": \"description\",\n \"label\": \"Description\"\n },\n {\n \"type\": \"text\",\n \"key\": \"location\",\n \"label\": \"Location\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startDateTime\",\n \"label\": \"Start\",\n \"description\": \"RFC 3339. Leave blank to leave the start time unchanged.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startTimeZone\",\n \"label\": \"Start time zone\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endDateTime\",\n \"label\": \"End\",\n \"description\": \"RFC 3339. Leave blank to leave the end time unchanged.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endTimeZone\",\n \"label\": \"End time zone\"\n },\n {\n \"type\": \"select\",\n \"key\": \"status\",\n \"label\": \"Status\",\n \"options\": [\n {\n \"value\": \"confirmed\",\n \"label\": \"Confirmed\"\n },\n {\n \"value\": \"tentative\",\n \"label\": \"Tentative\"\n },\n {\n \"value\": \"cancelled\",\n \"label\": \"Cancelled\"\n }\n ],\n \"description\": \"Setting cancelled here has the same effect as event_delete -- offered because PATCH is also Google's documented way to cancel one instance of a recurring event, which event_delete (which removes the whole resource) cannot target.\"\n },\n {\n \"type\": \"select\",\n \"key\": \"visibility\",\n \"label\": \"Visibility\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"public\",\n \"label\": \"Public\"\n },\n {\n \"value\": \"private\",\n \"label\": \"Private\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"transparency\",\n \"label\": \"Show me as\",\n \"options\": [\n {\n \"value\": \"opaque\",\n \"label\": \"Busy\"\n },\n {\n \"value\": \"transparent\",\n \"label\": \"Available\"\n }\n ]\n },\n {\n \"type\": \"text\",\n \"key\": \"colorId\",\n \"label\": \"Color ID\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_UPDATE_META, config as Record<string, unknown>, \"update an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/triggers/events-changed.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/triggers/events-changed.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar change — Start a run when something changes on a watched\n * Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/guides/push\n *\n * Delivery: subscription. The host mints a UUID, calls channel_watch with it,\n * its own URL for this trigger and the connection's channelToken, and stores\n * the returned id, resourceId and expiration. Google cannot renew a channel:\n * 86400 seconds before it expires the host calls channel_stop and then\n * channel_watch again. A channel that lapsed is re-listed FIRST (event_list\n * with the stored syncToken; a 410 means list in full) and then re-created,\n * because notifications during the gap are gone. Google delivers with an EMPTY\n * body: the host verifies X-Goog-Channel-Token against the connection's\n * channelToken and injects the X-Goog-* headers as the event, camel-cased as\n * below. The first message on a new channel is `sync` and carries no change.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_KIND = \"@particle-academy/google_calendar_events_changed_trigger\";\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OPERATION = \"events_changed\";\n\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META = googleCalendarMeta(\"trigger\", \"a calendar change\", \"https://developers.google.com/workspace/calendar/api/guides/push\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OUTPUT: OutputField[] = [\n {\n \"path\": \"channelId\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Channel-ID: which channel this came from.\"\n },\n {\n \"path\": \"messageNumber\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Message-Number: increases per channel; 1 is the sync message.\"\n },\n {\n \"path\": \"resourceId\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-ID: the watched resource.\"\n },\n {\n \"path\": \"resourceState\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-State: sync, exists or not_exists. `sync` carries no change.\"\n },\n {\n \"path\": \"resourceUri\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-URI: the watched resource's URI.\"\n },\n {\n \"path\": \"channelExpiration\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Channel-Expiration, when Google sends it: the channel's expiry in a human-readable format, not an instant to compute with.\"\n }\n];\n\nexport const googleCalendarEventsChangedTriggerKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META, {\n name: GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_KIND,\n aliases: [\"google_calendar_events_changed_trigger\"],\n label: \"Google Calendar change\",\n description: \"Start a run when something changes on a watched Google Calendar.\",\n icon: \"📅\",\n inputs: [],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OUTPUT,\n configSchema: [\n {\n \"type\": \"select\",\n \"key\": \"sample\",\n \"label\": \"Sample state (fake mode)\",\n \"default\": \"exists\",\n \"description\": \"Which resource state the faked notification carries: `exists` is a change, `sync` is the first message on a new channel, `not_exists` is the resource going away.\",\n \"options\": [\n {\n \"value\": \"exists\",\n \"label\": \"exists — something changed\"\n },\n {\n \"value\": \"sync\",\n \"label\": \"sync — the channel just opened\"\n },\n {\n \"value\": \"not_exists\",\n \"label\": \"not_exists — the resource is gone\"\n }\n ]\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\",\n \"sample\": \"exists\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META, config as Record<string, unknown>, \"a calendar change\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar's node kinds for fancy-flow.\n *\n * Install this on every host. The TypeScript executors live in the js\n * package's `./flow` subpath; PHP and Python hosts run their own and need only\n * this.\n */\n\nexport * from \"./service.js\";\nexport * from \"./kinds/channel-stop.js\";\nexport * from \"./kinds/channel-watch.js\";\nexport * from \"./kinds/event-create.js\";\nexport * from \"./kinds/event-delete.js\";\nexport * from \"./kinds/event-get.js\";\nexport * from \"./kinds/event-list.js\";\nexport * from \"./kinds/event-update.js\";\nexport * from \"./kinds/events-changed.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleCalendarChannelStopKind } from \"./kinds/channel-stop.js\";\nimport { googleCalendarChannelWatchKind } from \"./kinds/channel-watch.js\";\nimport { googleCalendarEventCreateKind } from \"./kinds/event-create.js\";\nimport { googleCalendarEventDeleteKind } from \"./kinds/event-delete.js\";\nimport { googleCalendarEventGetKind } from \"./kinds/event-get.js\";\nimport { googleCalendarEventListKind } from \"./kinds/event-list.js\";\nimport { googleCalendarEventUpdateKind } from \"./kinds/event-update.js\";\nimport { googleCalendarEventsChangedTriggerKind } from \"./kinds/events-changed.js\";\n\n/** Every Google Calendar kind, for a host that registers the lot. */\nexport const GOOGLE_CALENDAR_KINDS: NodeKindDefinition[] = [\n googleCalendarChannelStopKind,\n googleCalendarChannelWatchKind,\n googleCalendarEventCreateKind,\n googleCalendarEventDeleteKind,\n googleCalendarEventGetKind,\n googleCalendarEventListKind,\n googleCalendarEventUpdateKind,\n googleCalendarEventsChangedTriggerKind,\n];\n"]}
package/dist/index.d.cts CHANGED
@@ -91,6 +91,13 @@ declare const GOOGLE_CALENDAR_CREDENTIALS: readonly [{
91
91
  * safely be retried and may run concurrently. That is stated rather than
92
92
  * assumed because the opposite — a provider that spends the token and revokes
93
93
  * the grant on a replay — looks identical until it happens.
94
+ *
95
+ * Its consent grant is SHARED with every connector declaring grant "google":
96
+ * one OAuth client, one consent and one refresh token per person, scopes added
97
+ * as features are first used (authorizeParams). Revoking removes the WHOLE
98
+ * grant, so only a full disconnect revokes; a per-feature disconnect stops
99
+ * using the scope locally. Identify the account by the id_token's sub, never
100
+ * by email.
94
101
  */
95
102
  declare const GOOGLE_CALENDAR_OAUTH: {
96
103
  readonly flow: "authorization_code";
@@ -101,6 +108,24 @@ declare const GOOGLE_CALENDAR_OAUTH: {
101
108
  readonly refreshTokenCredential: "refreshToken";
102
109
  readonly refreshTokenRotates: false;
103
110
  readonly accessTokenTtlSeconds: 3600;
111
+ readonly grant: "google";
112
+ readonly authorizeParams: {
113
+ readonly access_type: "offline";
114
+ readonly include_granted_scopes: "true";
115
+ };
116
+ readonly revoke: {
117
+ readonly url: "https://oauth2.googleapis.com/revoke";
118
+ readonly param: "token";
119
+ readonly scope: "grant";
120
+ };
121
+ readonly identity: {
122
+ readonly scope: "openid";
123
+ readonly claim: "sub";
124
+ readonly issuers: readonly ["https://accounts.google.com", "accounts.google.com"];
125
+ readonly jwksUrl: "https://www.googleapis.com/oauth2/v3/certs";
126
+ readonly audienceCredential: "clientId";
127
+ };
128
+ readonly restrictedScopes: readonly [];
104
129
  };
105
130
  /** Build a Google Calendar node's connector metadata from the operation it performs. */
106
131
  declare function googleCalendarMeta(role: ConnectorMeta["role"], operation: string, docs: string): ConnectorMeta;
package/dist/index.d.ts CHANGED
@@ -91,6 +91,13 @@ declare const GOOGLE_CALENDAR_CREDENTIALS: readonly [{
91
91
  * safely be retried and may run concurrently. That is stated rather than
92
92
  * assumed because the opposite — a provider that spends the token and revokes
93
93
  * the grant on a replay — looks identical until it happens.
94
+ *
95
+ * Its consent grant is SHARED with every connector declaring grant "google":
96
+ * one OAuth client, one consent and one refresh token per person, scopes added
97
+ * as features are first used (authorizeParams). Revoking removes the WHOLE
98
+ * grant, so only a full disconnect revokes; a per-feature disconnect stops
99
+ * using the scope locally. Identify the account by the id_token's sub, never
100
+ * by email.
94
101
  */
95
102
  declare const GOOGLE_CALENDAR_OAUTH: {
96
103
  readonly flow: "authorization_code";
@@ -101,6 +108,24 @@ declare const GOOGLE_CALENDAR_OAUTH: {
101
108
  readonly refreshTokenCredential: "refreshToken";
102
109
  readonly refreshTokenRotates: false;
103
110
  readonly accessTokenTtlSeconds: 3600;
111
+ readonly grant: "google";
112
+ readonly authorizeParams: {
113
+ readonly access_type: "offline";
114
+ readonly include_granted_scopes: "true";
115
+ };
116
+ readonly revoke: {
117
+ readonly url: "https://oauth2.googleapis.com/revoke";
118
+ readonly param: "token";
119
+ readonly scope: "grant";
120
+ };
121
+ readonly identity: {
122
+ readonly scope: "openid";
123
+ readonly claim: "sub";
124
+ readonly issuers: readonly ["https://accounts.google.com", "accounts.google.com"];
125
+ readonly jwksUrl: "https://www.googleapis.com/oauth2/v3/certs";
126
+ readonly audienceCredential: "clientId";
127
+ };
128
+ readonly restrictedScopes: readonly [];
104
129
  };
105
130
  /** Build a Google Calendar node's connector metadata from the operation it performs. */
106
131
  declare function googleCalendarMeta(role: ConnectorMeta["role"], operation: string, docs: string): ConnectorMeta;
package/dist/index.js CHANGED
@@ -55,7 +55,28 @@ var GOOGLE_CALENDAR_OAUTH = {
55
55
  "accessTokenCredential": "accessToken",
56
56
  "refreshTokenCredential": "refreshToken",
57
57
  "refreshTokenRotates": false,
58
- "accessTokenTtlSeconds": 3600
58
+ "accessTokenTtlSeconds": 3600,
59
+ "grant": "google",
60
+ "authorizeParams": {
61
+ "access_type": "offline",
62
+ "include_granted_scopes": "true"
63
+ },
64
+ "revoke": {
65
+ "url": "https://oauth2.googleapis.com/revoke",
66
+ "param": "token",
67
+ "scope": "grant"
68
+ },
69
+ "identity": {
70
+ "scope": "openid",
71
+ "claim": "sub",
72
+ "issuers": [
73
+ "https://accounts.google.com",
74
+ "accounts.google.com"
75
+ ],
76
+ "jwksUrl": "https://www.googleapis.com/oauth2/v3/certs",
77
+ "audienceCredential": "clientId"
78
+ },
79
+ "restrictedScopes": []
59
80
  };
60
81
  function googleCalendarMeta(role, operation, docs) {
61
82
  return { ...GOOGLE_CALENDAR_SERVICE, role, operation, docs };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/service.ts","../src/kinds/channel-stop.ts","../src/kinds/channel-watch.ts","../src/kinds/event-create.ts","../src/kinds/event-delete.ts","../src/kinds/event-get.ts","../src/kinds/event-list.ts","../src/kinds/event-update.ts","../src/kinds/events-changed.ts","../src/index.ts"],"names":["defineConnectorKind","summarize"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar's identity on the authoring surface, shared by every Google\n * Calendar node.\n *\n * This file must import nothing from the js package: a PHP or Python project\n * installs the ui package and never that one, and the import would be a\n * dangling module the moment it did.\n *\n * ## The sandbox trap\n *\n * Google has no sandbox for Calendar. A test calendar is a real one in a real\n * account, so every watch and every read is real -- point this at a scratch\n * calendar, not a production one. The faker is the only way to develop against\n * it without touching an account.\n */\n\nimport type { ConnectorDomain, ConnectorMeta } from \"@particle-academy/fancy-flow/connectors\";\n\n/**\n * The connector API version this package was GENERATED against.\n *\n * A literal, never imported — an imported constant lets an upgrade rewrite the\n * very claim it exists to detect.\n */\nexport const CONNECTOR_API_VERSION = 1;\n\n/** The parts of a connector's identity that belong to the SERVICE, not the node. */\nexport const GOOGLE_CALENDAR_SERVICE = {\n service: \"google_calendar\",\n serviceTitle: \"Google Calendar\",\n domain: \"calendar\",\n sandbox: \"none\",\n} as const satisfies Pick<ConnectorMeta, \"service\" | \"serviceTitle\" | \"domain\" | \"sandbox\">;\n\n/**\n * Every connector domain weaver knows, pinned against fancy-flow's union.\n *\n * A closed set copied into three codebases stays correct only while something\n * MAKES it: this line fails to compile the moment weaver carries a value\n * fancy-flow does not, including the values no provider uses yet.\n */\nconst WEAVER_DOMAINS: readonly ConnectorDomain[] = [\n \"payments\",\n \"commerce\",\n \"messaging\",\n \"email\",\n \"crm\",\n \"support\",\n \"storage\",\n \"calendar\",\n \"productivity\",\n \"database\",\n \"devtools\",\n \"analytics\",\n \"marketing\",\n \"ai\",\n \"forms\",\n \"hr\",\n \"geo\"\n];\nvoid WEAVER_DOMAINS;\n\n/** The credentials a Google Calendar connection holds. */\nexport const GOOGLE_CALENDAR_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From Google Cloud Console -> APIs & Services -> Credentials. ONE value for the whole installation, not per connected account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"The client secret for the same OAuth app. One value for the whole installation.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account, and it expires after ONE HOUR. The host refreshes it with the refresh token.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account. Google issues one only when the consent request asks for offline access; without it the connection dies within the hour.\"\n },\n {\n \"key\": \"channelToken\",\n \"label\": \"Channel token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"A secret the host chooses per connected account and sends as `token` on every events.watch. Google echoes it back in the X-Goog-Channel-Token header of every notification, and that echo is the ONLY thing that authenticates a delivery -- Google does not sign them. Up to 256 characters.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Calendar requires — DECLARED here, performed by\n * the host.\n *\n * A consent screen needs a browser, a redirect URI and somewhere to persist\n * the result, and all three belong to the host; a package that ran the dance\n * itself would have to own a web server. So this says precisely enough for a\n * host to do it.\n *\n * The access token lasts 3600 seconds. A host that never refreshes will work\n * all afternoon and be broken by morning, which is why the lifetime is stated\n * rather than left to be discovered.\n *\n * Its refresh tokens do NOT rotate: the same one is reusable, so a refresh may\n * safely be retried and may run concurrently. That is stated rather than\n * assumed because the opposite — a provider that spends the token and revokes\n * the grant on a replay — looks identical until it happens.\n */\nexport const GOOGLE_CALENDAR_OAUTH = {\n \"flow\": \"authorization_code\",\n \"authorizeUrl\": \"https://accounts.google.com/o/oauth2/v2/auth\",\n \"tokenUrl\": \"https://oauth2.googleapis.com/token\",\n \"scopes\": [\n \"https://www.googleapis.com/auth/calendar.events\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600\n} as const;\n\n/** Build a Google Calendar node's connector metadata from the operation it performs. */\nexport function googleCalendarMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_CALENDAR_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/channel-stop.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/channel-stop.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar stop watching — Close a push-notification channel. The\n * host's subscription machinery calls this before re-creating a channel and\n * when a trigger is removed.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/channels/stop\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_KIND = \"@particle-academy/google_calendar_channel_stop\";\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_OPERATION = \"channel_stop\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_META = googleCalendarMeta(\"action\", \"stop a channel\", \"https://developers.google.com/workspace/calendar/api/v3/reference/channels/stop\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_OUTPUT: OutputField[] = [\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google answers with an empty body, so this is the only thing published.\"\n }\n];\n\nexport const googleCalendarChannelStopKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_CHANNEL_STOP_META, {\n name: GOOGLE_CALENDAR_CHANNEL_STOP_KIND,\n aliases: [\"google_calendar_channel_stop\"],\n label: \"Google Calendar stop watching\",\n description: \"Close a push-notification channel. The host's subscription machinery calls this before re-creating a channel and when a trigger is removed.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_CHANNEL_STOP_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"channelId\",\n \"label\": \"Channel ID\",\n \"required\": true,\n \"description\": \"The channel's id, as sent to channel_watch.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"resourceId\",\n \"label\": \"Resource ID\",\n \"required\": true,\n \"description\": \"The resourceId channel_watch answered with. Both are needed; Google refuses a stop with only one.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_CHANNEL_STOP_META, config as Record<string, unknown>, \"stop a channel\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/channel-watch.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/channel-watch.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar watch — Open a push-notification channel on a calendar's\n * events. The host's subscription machinery calls this; it is not a node most\n * workflows need.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/watch\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_KIND = \"@particle-academy/google_calendar_channel_watch\";\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_OPERATION = \"channel_watch\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_META = googleCalendarMeta(\"action\", \"watch a calendar\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/watch\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The channel id -- what was sent.\"\n },\n {\n \"path\": \"data.resourceId\",\n \"type\": \"string\",\n \"description\": \"Google's opaque id for the watched resource. channel_stop needs it together with the channel id.\"\n },\n {\n \"path\": \"data.resourceUri\",\n \"type\": \"string\",\n \"description\": \"The watched resource's URI.\"\n },\n {\n \"path\": \"data.token\",\n \"type\": \"string\",\n \"description\": \"The token that will be echoed on every notification.\"\n },\n {\n \"path\": \"data.expiration\",\n \"type\": \"string\",\n \"description\": \"When the channel expires, as epoch MILLISECONDS in a string. The subscription trigger's lease is built from this.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarChannelWatchKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_CHANNEL_WATCH_META, {\n name: GOOGLE_CALENDAR_CHANNEL_WATCH_KIND,\n aliases: [\"google_calendar_channel_watch\"],\n label: \"Google Calendar watch\",\n description: \"Open a push-notification channel on a calendar's events. The host's subscription machinery calls this; it is not a node most workflows need.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_CALENDAR_CHANNEL_WATCH_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"channelId\",\n \"label\": \"Channel ID\",\n \"required\": true,\n \"description\": \"A UUID the host mints for THIS channel. Google requires it to be unique; it comes back in every notification as X-Goog-Channel-ID and is what channel_stop needs.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"address\",\n \"label\": \"Notification URL\",\n \"required\": true,\n \"description\": \"The HTTPS URL the host mounts for this trigger. Google POSTs notifications here with an EMPTY body and the facts in X-Goog-* headers.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"token\",\n \"label\": \"Channel token\",\n \"required\": true,\n \"description\": \"The connection's channelToken. The host fills this from the connection -- never type a value here. Google echoes it in X-Goog-Channel-Token, and that echo is how a delivery is verified.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"ttlSeconds\",\n \"label\": \"Lifetime (seconds)\",\n \"required\": true,\n \"default\": \"604800\",\n \"description\": \"How long Google keeps the channel alive. Google's default is 604800 (one week), and the discovery document types it as a STRING inside `params`.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_CHANNEL_WATCH_META, config as Record<string, unknown>, \"watch a calendar\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-create.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Create Google Calendar event — Create a timed event on a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/insert\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_CREATE_KIND = \"@particle-academy/google_calendar_event_create\";\nexport const GOOGLE_CALENDAR_EVENT_CREATE_OPERATION = \"event_create\";\n\nexport const GOOGLE_CALENDAR_EVENT_CREATE_META = googleCalendarMeta(\"action\", \"create an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/insert\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_CREATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The new event's id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"confirmed or tentative, echoing what was sent (or Google's default).\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.created\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 creation time.\"\n },\n {\n \"path\": \"data.organizer.email\",\n \"type\": \"string\",\n \"description\": \"The connected account, almost always.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventCreateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_CREATE_META, {\n name: GOOGLE_CALENDAR_EVENT_CREATE_KIND,\n aliases: [\"google_calendar_event_create\"],\n label: \"Create Google Calendar event\",\n description: \"Create a timed event on a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_CALENDAR_EVENT_CREATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"summary\",\n \"label\": \"Title\",\n \"required\": true\n },\n {\n \"type\": \"textarea\",\n \"key\": \"description\",\n \"label\": \"Description\",\n \"description\": \"Can contain HTML.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"location\",\n \"label\": \"Location\",\n \"description\": \"Free-form text.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startDateTime\",\n \"label\": \"Start\",\n \"required\": true,\n \"description\": \"RFC 3339, e.g. 2026-10-01T14:00:00Z. Include an offset, or pair with a time zone below.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startTimeZone\",\n \"label\": \"Start time zone\",\n \"description\": \"IANA name, e.g. America/New_York. Optional when the start time already carries an offset.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endDateTime\",\n \"label\": \"End\",\n \"required\": true,\n \"description\": \"RFC 3339. Exclusive -- the event ends at, not through, this instant.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endTimeZone\",\n \"label\": \"End time zone\"\n },\n {\n \"type\": \"select\",\n \"key\": \"status\",\n \"label\": \"Status\",\n \"options\": [\n {\n \"value\": \"confirmed\",\n \"label\": \"Confirmed\"\n },\n {\n \"value\": \"tentative\",\n \"label\": \"Tentative\"\n }\n ],\n \"description\": \"\\\"cancelled\\\" is not offered here -- that is event_delete's job, not a status this action should be able to set on create.\"\n },\n {\n \"type\": \"select\",\n \"key\": \"visibility\",\n \"label\": \"Visibility\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"public\",\n \"label\": \"Public\"\n },\n {\n \"value\": \"private\",\n \"label\": \"Private\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"transparency\",\n \"label\": \"Show me as\",\n \"options\": [\n {\n \"value\": \"opaque\",\n \"label\": \"Busy\"\n },\n {\n \"value\": \"transparent\",\n \"label\": \"Available\"\n }\n ],\n \"description\": \"opaque blocks time on the calendar (Busy); transparent does not (Available).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"colorId\",\n \"label\": \"Color ID\",\n \"description\": \"An id from the colors endpoint's event section. Leave blank for the calendar's default.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_CREATE_META, config as Record<string, unknown>, \"create an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-delete.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-delete.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Delete Google Calendar event — Remove an event from a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/delete\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_DELETE_KIND = \"@particle-academy/google_calendar_event_delete\";\nexport const GOOGLE_CALENDAR_EVENT_DELETE_OPERATION = \"event_delete\";\n\nexport const GOOGLE_CALENDAR_EVENT_DELETE_META = googleCalendarMeta(\"action\", \"delete an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/delete\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_DELETE_OUTPUT: OutputField[] = [\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google answers 204 with no body, so this is the only thing published.\"\n }\n];\n\nexport const googleCalendarEventDeleteKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_DELETE_META, {\n name: GOOGLE_CALENDAR_EVENT_DELETE_KIND,\n aliases: [\"google_calendar_event_delete\"],\n label: \"Delete Google Calendar event\",\n description: \"Remove an event from a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_EVENT_DELETE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"From event_create's data.id, or event_list/event_get.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_DELETE_META, config as Record<string, unknown>, \"delete an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-get.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar event — Read one event from a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_GET_KIND = \"@particle-academy/google_calendar_event_get\";\nexport const GOOGLE_CALENDAR_EVENT_GET_OPERATION = \"event_get\";\n\nexport const GOOGLE_CALENDAR_EVENT_GET_META = googleCalendarMeta(\"action\", \"read an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/get\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The event id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"confirmed, tentative or cancelled.\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"The title.\"\n },\n {\n \"path\": \"data.description\",\n \"type\": \"string\",\n \"description\": \"The description, when there is one.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 start. All-day events carry start.date instead.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 end. All-day events carry end.date instead.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification.\"\n },\n {\n \"path\": \"data.organizer.email\",\n \"type\": \"string\",\n \"description\": \"Who organises it.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_GET_META, {\n name: GOOGLE_CALENDAR_EVENT_GET_KIND,\n aliases: [\"google_calendar_event_get\"],\n label: \"Google Calendar event\",\n description: \"Read one event from a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENT_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id (usually an email address).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"The event's id, as published by another node or by a notification's follow-up list.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_GET_META, config as Record<string, unknown>, \"read an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-list.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar events — List events from a Google Calendar, in full or\n * incrementally with a sync token.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_LIST_KIND = \"@particle-academy/google_calendar_event_list\";\nexport const GOOGLE_CALENDAR_EVENT_LIST_OPERATION = \"event_list\";\n\nexport const GOOGLE_CALENDAR_EVENT_LIST_META = googleCalendarMeta(\"action\", \"list events\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/list\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.items\",\n \"type\": \"array\",\n \"description\": \"The events on this page, each shaped like event_get's output.\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n },\n {\n \"path\": \"data.nextSyncToken\",\n \"type\": \"string\",\n \"description\": \"Present on the LAST page only. Store it and pass it as syncToken next time to get only what changed.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification of the calendar.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_LIST_META, {\n name: GOOGLE_CALENDAR_EVENT_LIST_KIND,\n aliases: [\"google_calendar_event_list\"],\n label: \"Google Calendar events\",\n description: \"List events from a Google Calendar, in full or incrementally with a sync token.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"syncToken\",\n \"label\": \"Sync token\",\n \"description\": \"From a previous list's nextSyncToken. With one set, Google returns ONLY what changed since -- including deletions, as cancelled events. Leave blank for a full list.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"timeMin\",\n \"label\": \"From\",\n \"description\": \"RFC 3339 lower bound on an event's END time, e.g. 2026-09-15T00:00:00Z. Not allowed together with a sync token.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"timeMax\",\n \"label\": \"To\",\n \"description\": \"RFC 3339 upper bound on an event's START time. Not allowed together with a sync token.\"\n },\n {\n \"type\": \"number\",\n \"key\": \"maxResults\",\n \"label\": \"Page size\",\n \"min\": 1,\n \"max\": 2500,\n \"default\": 250,\n \"description\": \"Events per page. Google's default is 250 and its maximum 2500; a nextPageToken means there are more.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous page's nextPageToken.\"\n },\n {\n \"type\": \"switch\",\n \"key\": \"singleEvents\",\n \"label\": \"Expand recurring events\",\n \"default\": true,\n \"description\": \"Return each occurrence of a recurring event as its own item, rather than the series once.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_LIST_META, config as Record<string, unknown>, \"list events\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-update.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-update.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Update Google Calendar event — Change one or more fields of an existing\n * event. Only the fields provided are touched.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/patch\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_KIND = \"@particle-academy/google_calendar_event_update\";\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_OPERATION = \"event_update\";\n\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_META = googleCalendarMeta(\"action\", \"update an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/patch\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The event's id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"The event's status after this update.\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"The event's title after this update.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"The event's start after this update.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"The event's end after this update.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification -- now.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventUpdateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_UPDATE_META, {\n name: GOOGLE_CALENDAR_EVENT_UPDATE_KIND,\n aliases: [\"google_calendar_event_update\"],\n label: \"Update Google Calendar event\",\n description: \"Change one or more fields of an existing event. Only the fields provided are touched.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_EVENT_UPDATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"From event_create's data.id, or event_list/event_get.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"summary\",\n \"label\": \"Title\"\n },\n {\n \"type\": \"textarea\",\n \"key\": \"description\",\n \"label\": \"Description\"\n },\n {\n \"type\": \"text\",\n \"key\": \"location\",\n \"label\": \"Location\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startDateTime\",\n \"label\": \"Start\",\n \"description\": \"RFC 3339. Leave blank to leave the start time unchanged.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startTimeZone\",\n \"label\": \"Start time zone\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endDateTime\",\n \"label\": \"End\",\n \"description\": \"RFC 3339. Leave blank to leave the end time unchanged.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endTimeZone\",\n \"label\": \"End time zone\"\n },\n {\n \"type\": \"select\",\n \"key\": \"status\",\n \"label\": \"Status\",\n \"options\": [\n {\n \"value\": \"confirmed\",\n \"label\": \"Confirmed\"\n },\n {\n \"value\": \"tentative\",\n \"label\": \"Tentative\"\n },\n {\n \"value\": \"cancelled\",\n \"label\": \"Cancelled\"\n }\n ],\n \"description\": \"Setting cancelled here has the same effect as event_delete -- offered because PATCH is also Google's documented way to cancel one instance of a recurring event, which event_delete (which removes the whole resource) cannot target.\"\n },\n {\n \"type\": \"select\",\n \"key\": \"visibility\",\n \"label\": \"Visibility\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"public\",\n \"label\": \"Public\"\n },\n {\n \"value\": \"private\",\n \"label\": \"Private\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"transparency\",\n \"label\": \"Show me as\",\n \"options\": [\n {\n \"value\": \"opaque\",\n \"label\": \"Busy\"\n },\n {\n \"value\": \"transparent\",\n \"label\": \"Available\"\n }\n ]\n },\n {\n \"type\": \"text\",\n \"key\": \"colorId\",\n \"label\": \"Color ID\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_UPDATE_META, config as Record<string, unknown>, \"update an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/triggers/events-changed.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/triggers/events-changed.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar change — Start a run when something changes on a watched\n * Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/guides/push\n *\n * Delivery: subscription. The host mints a UUID, calls channel_watch with it,\n * its own URL for this trigger and the connection's channelToken, and stores\n * the returned id, resourceId and expiration. Google cannot renew a channel:\n * 86400 seconds before it expires the host calls channel_stop and then\n * channel_watch again. A channel that lapsed is re-listed FIRST (event_list\n * with the stored syncToken; a 410 means list in full) and then re-created,\n * because notifications during the gap are gone. Google delivers with an EMPTY\n * body: the host verifies X-Goog-Channel-Token against the connection's\n * channelToken and injects the X-Goog-* headers as the event, camel-cased as\n * below. The first message on a new channel is `sync` and carries no change.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_KIND = \"@particle-academy/google_calendar_events_changed_trigger\";\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OPERATION = \"events_changed\";\n\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META = googleCalendarMeta(\"trigger\", \"a calendar change\", \"https://developers.google.com/workspace/calendar/api/guides/push\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OUTPUT: OutputField[] = [\n {\n \"path\": \"channelId\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Channel-ID: which channel this came from.\"\n },\n {\n \"path\": \"messageNumber\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Message-Number: increases per channel; 1 is the sync message.\"\n },\n {\n \"path\": \"resourceId\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-ID: the watched resource.\"\n },\n {\n \"path\": \"resourceState\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-State: sync, exists or not_exists. `sync` carries no change.\"\n },\n {\n \"path\": \"resourceUri\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-URI: the watched resource's URI.\"\n },\n {\n \"path\": \"channelExpiration\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Channel-Expiration, when Google sends it: the channel's expiry in a human-readable format, not an instant to compute with.\"\n }\n];\n\nexport const googleCalendarEventsChangedTriggerKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META, {\n name: GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_KIND,\n aliases: [\"google_calendar_events_changed_trigger\"],\n label: \"Google Calendar change\",\n description: \"Start a run when something changes on a watched Google Calendar.\",\n icon: \"📅\",\n inputs: [],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OUTPUT,\n configSchema: [\n {\n \"type\": \"select\",\n \"key\": \"sample\",\n \"label\": \"Sample state (fake mode)\",\n \"default\": \"exists\",\n \"description\": \"Which resource state the faked notification carries: `exists` is a change, `sync` is the first message on a new channel, `not_exists` is the resource going away.\",\n \"options\": [\n {\n \"value\": \"exists\",\n \"label\": \"exists — something changed\"\n },\n {\n \"value\": \"sync\",\n \"label\": \"sync — the channel just opened\"\n },\n {\n \"value\": \"not_exists\",\n \"label\": \"not_exists — the resource is gone\"\n }\n ]\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\",\n \"sample\": \"exists\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META, config as Record<string, unknown>, \"a calendar change\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar's node kinds for fancy-flow.\n *\n * Install this on every host. The TypeScript executors live in the js\n * package's `./flow` subpath; PHP and Python hosts run their own and need only\n * this.\n */\n\nexport * from \"./service.js\";\nexport * from \"./kinds/channel-stop.js\";\nexport * from \"./kinds/channel-watch.js\";\nexport * from \"./kinds/event-create.js\";\nexport * from \"./kinds/event-delete.js\";\nexport * from \"./kinds/event-get.js\";\nexport * from \"./kinds/event-list.js\";\nexport * from \"./kinds/event-update.js\";\nexport * from \"./kinds/events-changed.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleCalendarChannelStopKind } from \"./kinds/channel-stop.js\";\nimport { googleCalendarChannelWatchKind } from \"./kinds/channel-watch.js\";\nimport { googleCalendarEventCreateKind } from \"./kinds/event-create.js\";\nimport { googleCalendarEventDeleteKind } from \"./kinds/event-delete.js\";\nimport { googleCalendarEventGetKind } from \"./kinds/event-get.js\";\nimport { googleCalendarEventListKind } from \"./kinds/event-list.js\";\nimport { googleCalendarEventUpdateKind } from \"./kinds/event-update.js\";\nimport { googleCalendarEventsChangedTriggerKind } from \"./kinds/events-changed.js\";\n\n/** Every Google Calendar kind, for a host that registers the lot. */\nexport const GOOGLE_CALENDAR_KINDS: NodeKindDefinition[] = [\n googleCalendarChannelStopKind,\n googleCalendarChannelWatchKind,\n googleCalendarEventCreateKind,\n googleCalendarEventDeleteKind,\n googleCalendarEventGetKind,\n googleCalendarEventListKind,\n googleCalendarEventUpdateKind,\n googleCalendarEventsChangedTriggerKind,\n];\n"]}
1
+ {"version":3,"sources":["../src/service.ts","../src/kinds/channel-stop.ts","../src/kinds/channel-watch.ts","../src/kinds/event-create.ts","../src/kinds/event-delete.ts","../src/kinds/event-get.ts","../src/kinds/event-list.ts","../src/kinds/event-update.ts","../src/kinds/events-changed.ts","../src/index.ts"],"names":["defineConnectorKind","summarize"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar's identity on the authoring surface, shared by every Google\n * Calendar node.\n *\n * This file must import nothing from the js package: a PHP or Python project\n * installs the ui package and never that one, and the import would be a\n * dangling module the moment it did.\n *\n * ## The sandbox trap\n *\n * Google has no sandbox for Calendar. A test calendar is a real one in a real\n * account, so every watch and every read is real -- point this at a scratch\n * calendar, not a production one. The faker is the only way to develop against\n * it without touching an account.\n */\n\nimport type { ConnectorDomain, ConnectorMeta } from \"@particle-academy/fancy-flow/connectors\";\n\n/**\n * The connector API version this package was GENERATED against.\n *\n * A literal, never imported — an imported constant lets an upgrade rewrite the\n * very claim it exists to detect.\n */\nexport const CONNECTOR_API_VERSION = 1;\n\n/** The parts of a connector's identity that belong to the SERVICE, not the node. */\nexport const GOOGLE_CALENDAR_SERVICE = {\n service: \"google_calendar\",\n serviceTitle: \"Google Calendar\",\n domain: \"calendar\",\n sandbox: \"none\",\n} as const satisfies Pick<ConnectorMeta, \"service\" | \"serviceTitle\" | \"domain\" | \"sandbox\">;\n\n/**\n * Every connector domain weaver knows, pinned against fancy-flow's union.\n *\n * A closed set copied into three codebases stays correct only while something\n * MAKES it: this line fails to compile the moment weaver carries a value\n * fancy-flow does not, including the values no provider uses yet.\n */\nconst WEAVER_DOMAINS: readonly ConnectorDomain[] = [\n \"payments\",\n \"commerce\",\n \"messaging\",\n \"email\",\n \"crm\",\n \"support\",\n \"storage\",\n \"calendar\",\n \"productivity\",\n \"database\",\n \"devtools\",\n \"analytics\",\n \"marketing\",\n \"ai\",\n \"forms\",\n \"hr\",\n \"geo\"\n];\nvoid WEAVER_DOMAINS;\n\n/** The credentials a Google Calendar connection holds. */\nexport const GOOGLE_CALENDAR_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From Google Cloud Console -> APIs & Services -> Credentials. ONE value for the whole installation, not per connected account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"The client secret for the same OAuth app. One value for the whole installation.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account, and it expires after ONE HOUR. The host refreshes it with the refresh token.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Per connected Google account. Google issues one only when the consent request asks for offline access; without it the connection dies within the hour.\"\n },\n {\n \"key\": \"channelToken\",\n \"label\": \"Channel token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"A secret the host chooses per connected account and sends as `token` on every events.watch. Google echoes it back in the X-Goog-Channel-Token header of every notification, and that echo is the ONLY thing that authenticates a delivery -- Google does not sign them. Up to 256 characters.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Calendar requires — DECLARED here, performed by\n * the host.\n *\n * A consent screen needs a browser, a redirect URI and somewhere to persist\n * the result, and all three belong to the host; a package that ran the dance\n * itself would have to own a web server. So this says precisely enough for a\n * host to do it.\n *\n * The access token lasts 3600 seconds. A host that never refreshes will work\n * all afternoon and be broken by morning, which is why the lifetime is stated\n * rather than left to be discovered.\n *\n * Its refresh tokens do NOT rotate: the same one is reusable, so a refresh may\n * safely be retried and may run concurrently. That is stated rather than\n * assumed because the opposite — a provider that spends the token and revokes\n * the grant on a replay — looks identical until it happens.\n *\n * Its consent grant is SHARED with every connector declaring grant \"google\":\n * one OAuth client, one consent and one refresh token per person, scopes added\n * as features are first used (authorizeParams). Revoking removes the WHOLE\n * grant, so only a full disconnect revokes; a per-feature disconnect stops\n * using the scope locally. Identify the account by the id_token's sub, never\n * by email.\n */\nexport const GOOGLE_CALENDAR_OAUTH = {\n \"flow\": \"authorization_code\",\n \"authorizeUrl\": \"https://accounts.google.com/o/oauth2/v2/auth\",\n \"tokenUrl\": \"https://oauth2.googleapis.com/token\",\n \"scopes\": [\n \"https://www.googleapis.com/auth/calendar.events\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600,\n \"grant\": \"google\",\n \"authorizeParams\": {\n \"access_type\": \"offline\",\n \"include_granted_scopes\": \"true\"\n },\n \"revoke\": {\n \"url\": \"https://oauth2.googleapis.com/revoke\",\n \"param\": \"token\",\n \"scope\": \"grant\"\n },\n \"identity\": {\n \"scope\": \"openid\",\n \"claim\": \"sub\",\n \"issuers\": [\n \"https://accounts.google.com\",\n \"accounts.google.com\"\n ],\n \"jwksUrl\": \"https://www.googleapis.com/oauth2/v3/certs\",\n \"audienceCredential\": \"clientId\"\n },\n \"restrictedScopes\": []\n} as const;\n\n/** Build a Google Calendar node's connector metadata from the operation it performs. */\nexport function googleCalendarMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_CALENDAR_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/channel-stop.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/channel-stop.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar stop watching — Close a push-notification channel. The\n * host's subscription machinery calls this before re-creating a channel and\n * when a trigger is removed.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/channels/stop\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_KIND = \"@particle-academy/google_calendar_channel_stop\";\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_OPERATION = \"channel_stop\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_META = googleCalendarMeta(\"action\", \"stop a channel\", \"https://developers.google.com/workspace/calendar/api/v3/reference/channels/stop\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_CHANNEL_STOP_OUTPUT: OutputField[] = [\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google answers with an empty body, so this is the only thing published.\"\n }\n];\n\nexport const googleCalendarChannelStopKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_CHANNEL_STOP_META, {\n name: GOOGLE_CALENDAR_CHANNEL_STOP_KIND,\n aliases: [\"google_calendar_channel_stop\"],\n label: \"Google Calendar stop watching\",\n description: \"Close a push-notification channel. The host's subscription machinery calls this before re-creating a channel and when a trigger is removed.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_CHANNEL_STOP_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"channelId\",\n \"label\": \"Channel ID\",\n \"required\": true,\n \"description\": \"The channel's id, as sent to channel_watch.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"resourceId\",\n \"label\": \"Resource ID\",\n \"required\": true,\n \"description\": \"The resourceId channel_watch answered with. Both are needed; Google refuses a stop with only one.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_CHANNEL_STOP_META, config as Record<string, unknown>, \"stop a channel\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/channel-watch.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/channel-watch.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar watch — Open a push-notification channel on a calendar's\n * events. The host's subscription machinery calls this; it is not a node most\n * workflows need.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/watch\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_KIND = \"@particle-academy/google_calendar_channel_watch\";\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_OPERATION = \"channel_watch\";\n\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_META = googleCalendarMeta(\"action\", \"watch a calendar\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/watch\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_CHANNEL_WATCH_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The channel id -- what was sent.\"\n },\n {\n \"path\": \"data.resourceId\",\n \"type\": \"string\",\n \"description\": \"Google's opaque id for the watched resource. channel_stop needs it together with the channel id.\"\n },\n {\n \"path\": \"data.resourceUri\",\n \"type\": \"string\",\n \"description\": \"The watched resource's URI.\"\n },\n {\n \"path\": \"data.token\",\n \"type\": \"string\",\n \"description\": \"The token that will be echoed on every notification.\"\n },\n {\n \"path\": \"data.expiration\",\n \"type\": \"string\",\n \"description\": \"When the channel expires, as epoch MILLISECONDS in a string. The subscription trigger's lease is built from this.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarChannelWatchKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_CHANNEL_WATCH_META, {\n name: GOOGLE_CALENDAR_CHANNEL_WATCH_KIND,\n aliases: [\"google_calendar_channel_watch\"],\n label: \"Google Calendar watch\",\n description: \"Open a push-notification channel on a calendar's events. The host's subscription machinery calls this; it is not a node most workflows need.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_CALENDAR_CHANNEL_WATCH_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"channelId\",\n \"label\": \"Channel ID\",\n \"required\": true,\n \"description\": \"A UUID the host mints for THIS channel. Google requires it to be unique; it comes back in every notification as X-Goog-Channel-ID and is what channel_stop needs.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"address\",\n \"label\": \"Notification URL\",\n \"required\": true,\n \"description\": \"The HTTPS URL the host mounts for this trigger. Google POSTs notifications here with an EMPTY body and the facts in X-Goog-* headers.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"token\",\n \"label\": \"Channel token\",\n \"required\": true,\n \"description\": \"The connection's channelToken. The host fills this from the connection -- never type a value here. Google echoes it in X-Goog-Channel-Token, and that echo is how a delivery is verified.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"ttlSeconds\",\n \"label\": \"Lifetime (seconds)\",\n \"required\": true,\n \"default\": \"604800\",\n \"description\": \"How long Google keeps the channel alive. Google's default is 604800 (one week), and the discovery document types it as a STRING inside `params`.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_CHANNEL_WATCH_META, config as Record<string, unknown>, \"watch a calendar\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-create.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Create Google Calendar event — Create a timed event on a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/insert\n *\n * `unsafe-to-replay`.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_CREATE_KIND = \"@particle-academy/google_calendar_event_create\";\nexport const GOOGLE_CALENDAR_EVENT_CREATE_OPERATION = \"event_create\";\n\nexport const GOOGLE_CALENDAR_EVENT_CREATE_META = googleCalendarMeta(\"action\", \"create an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/insert\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_CREATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The new event's id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"confirmed or tentative, echoing what was sent (or Google's default).\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"Echoes what was sent.\"\n },\n {\n \"path\": \"data.created\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 creation time.\"\n },\n {\n \"path\": \"data.organizer.email\",\n \"type\": \"string\",\n \"description\": \"The connected account, almost always.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventCreateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_CREATE_META, {\n name: GOOGLE_CALENDAR_EVENT_CREATE_KIND,\n aliases: [\"google_calendar_event_create\"],\n label: \"Create Google Calendar event\",\n description: \"Create a timed event on a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_CALENDAR_EVENT_CREATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"summary\",\n \"label\": \"Title\",\n \"required\": true\n },\n {\n \"type\": \"textarea\",\n \"key\": \"description\",\n \"label\": \"Description\",\n \"description\": \"Can contain HTML.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"location\",\n \"label\": \"Location\",\n \"description\": \"Free-form text.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startDateTime\",\n \"label\": \"Start\",\n \"required\": true,\n \"description\": \"RFC 3339, e.g. 2026-10-01T14:00:00Z. Include an offset, or pair with a time zone below.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startTimeZone\",\n \"label\": \"Start time zone\",\n \"description\": \"IANA name, e.g. America/New_York. Optional when the start time already carries an offset.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endDateTime\",\n \"label\": \"End\",\n \"required\": true,\n \"description\": \"RFC 3339. Exclusive -- the event ends at, not through, this instant.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endTimeZone\",\n \"label\": \"End time zone\"\n },\n {\n \"type\": \"select\",\n \"key\": \"status\",\n \"label\": \"Status\",\n \"options\": [\n {\n \"value\": \"confirmed\",\n \"label\": \"Confirmed\"\n },\n {\n \"value\": \"tentative\",\n \"label\": \"Tentative\"\n }\n ],\n \"description\": \"\\\"cancelled\\\" is not offered here -- that is event_delete's job, not a status this action should be able to set on create.\"\n },\n {\n \"type\": \"select\",\n \"key\": \"visibility\",\n \"label\": \"Visibility\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"public\",\n \"label\": \"Public\"\n },\n {\n \"value\": \"private\",\n \"label\": \"Private\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"transparency\",\n \"label\": \"Show me as\",\n \"options\": [\n {\n \"value\": \"opaque\",\n \"label\": \"Busy\"\n },\n {\n \"value\": \"transparent\",\n \"label\": \"Available\"\n }\n ],\n \"description\": \"opaque blocks time on the calendar (Busy); transparent does not (Available).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"colorId\",\n \"label\": \"Color ID\",\n \"description\": \"An id from the colors endpoint's event section. Leave blank for the calendar's default.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_CREATE_META, config as Record<string, unknown>, \"create an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-delete.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-delete.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Delete Google Calendar event — Remove an event from a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/delete\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_DELETE_KIND = \"@particle-academy/google_calendar_event_delete\";\nexport const GOOGLE_CALENDAR_EVENT_DELETE_OPERATION = \"event_delete\";\n\nexport const GOOGLE_CALENDAR_EVENT_DELETE_META = googleCalendarMeta(\"action\", \"delete an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/delete\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_DELETE_OUTPUT: OutputField[] = [\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google answers 204 with no body, so this is the only thing published.\"\n }\n];\n\nexport const googleCalendarEventDeleteKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_DELETE_META, {\n name: GOOGLE_CALENDAR_EVENT_DELETE_KIND,\n aliases: [\"google_calendar_event_delete\"],\n label: \"Delete Google Calendar event\",\n description: \"Remove an event from a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_EVENT_DELETE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"From event_create's data.id, or event_list/event_get.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_DELETE_META, config as Record<string, unknown>, \"delete an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-get.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar event — Read one event from a Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_GET_KIND = \"@particle-academy/google_calendar_event_get\";\nexport const GOOGLE_CALENDAR_EVENT_GET_OPERATION = \"event_get\";\n\nexport const GOOGLE_CALENDAR_EVENT_GET_META = googleCalendarMeta(\"action\", \"read an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/get\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The event id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"confirmed, tentative or cancelled.\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"The title.\"\n },\n {\n \"path\": \"data.description\",\n \"type\": \"string\",\n \"description\": \"The description, when there is one.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 start. All-day events carry start.date instead.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 end. All-day events carry end.date instead.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification.\"\n },\n {\n \"path\": \"data.organizer.email\",\n \"type\": \"string\",\n \"description\": \"Who organises it.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_GET_META, {\n name: GOOGLE_CALENDAR_EVENT_GET_KIND,\n aliases: [\"google_calendar_event_get\"],\n label: \"Google Calendar event\",\n description: \"Read one event from a Google Calendar.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENT_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id (usually an email address).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"The event's id, as published by another node or by a notification's follow-up list.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_GET_META, config as Record<string, unknown>, \"read an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-list.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar events — List events from a Google Calendar, in full or\n * incrementally with a sync token.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_LIST_KIND = \"@particle-academy/google_calendar_event_list\";\nexport const GOOGLE_CALENDAR_EVENT_LIST_OPERATION = \"event_list\";\n\nexport const GOOGLE_CALENDAR_EVENT_LIST_META = googleCalendarMeta(\"action\", \"list events\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/list\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.items\",\n \"type\": \"array\",\n \"description\": \"The events on this page, each shaped like event_get's output.\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n },\n {\n \"path\": \"data.nextSyncToken\",\n \"type\": \"string\",\n \"description\": \"Present on the LAST page only. Store it and pass it as syncToken next time to get only what changed.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification of the calendar.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_LIST_META, {\n name: GOOGLE_CALENDAR_EVENT_LIST_KIND,\n aliases: [\"google_calendar_event_list\"],\n label: \"Google Calendar events\",\n description: \"List events from a Google Calendar, in full or incrementally with a sync token.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\",\n \"description\": \"`primary` for the connected account's own calendar, or a calendar's id.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"syncToken\",\n \"label\": \"Sync token\",\n \"description\": \"From a previous list's nextSyncToken. With one set, Google returns ONLY what changed since -- including deletions, as cancelled events. Leave blank for a full list.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"timeMin\",\n \"label\": \"From\",\n \"description\": \"RFC 3339 lower bound on an event's END time, e.g. 2026-09-15T00:00:00Z. Not allowed together with a sync token.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"timeMax\",\n \"label\": \"To\",\n \"description\": \"RFC 3339 upper bound on an event's START time. Not allowed together with a sync token.\"\n },\n {\n \"type\": \"number\",\n \"key\": \"maxResults\",\n \"label\": \"Page size\",\n \"min\": 1,\n \"max\": 2500,\n \"default\": 250,\n \"description\": \"Events per page. Google's default is 250 and its maximum 2500; a nextPageToken means there are more.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous page's nextPageToken.\"\n },\n {\n \"type\": \"switch\",\n \"key\": \"singleEvents\",\n \"label\": \"Expand recurring events\",\n \"default\": true,\n \"description\": \"Return each occurrence of a recurring event as its own item, rather than the series once.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_LIST_META, config as Record<string, unknown>, \"list events\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/event-update.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/actions/event-update.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Update Google Calendar event — Change one or more fields of an existing\n * event. Only the fields provided are touched.\n *\n * https://developers.google.com/workspace/calendar/api/v3/reference/events/patch\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_KIND = \"@particle-academy/google_calendar_event_update\";\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_OPERATION = \"event_update\";\n\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_META = googleCalendarMeta(\"action\", \"update an event\", \"https://developers.google.com/workspace/calendar/api/v3/reference/events/patch\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENT_UPDATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.id\",\n \"type\": \"string\",\n \"description\": \"The event's id.\"\n },\n {\n \"path\": \"data.status\",\n \"type\": \"string\",\n \"description\": \"The event's status after this update.\"\n },\n {\n \"path\": \"data.summary\",\n \"type\": \"string\",\n \"description\": \"The event's title after this update.\"\n },\n {\n \"path\": \"data.htmlLink\",\n \"type\": \"string\",\n \"description\": \"The event in the Google Calendar UI.\"\n },\n {\n \"path\": \"data.start.dateTime\",\n \"type\": \"string\",\n \"description\": \"The event's start after this update.\"\n },\n {\n \"path\": \"data.end.dateTime\",\n \"type\": \"string\",\n \"description\": \"The event's end after this update.\"\n },\n {\n \"path\": \"data.updated\",\n \"type\": \"string\",\n \"description\": \"RFC 3339 last modification -- now.\"\n },\n {\n \"path\": \"mode\",\n \"type\": \"string\",\n \"description\": \"Which estate this ran against. Google has no sandbox, so: fake or live.\"\n }\n];\n\nexport const googleCalendarEventUpdateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENT_UPDATE_META, {\n name: GOOGLE_CALENDAR_EVENT_UPDATE_KIND,\n aliases: [\"google_calendar_event_update\"],\n label: \"Update Google Calendar event\",\n description: \"Change one or more fields of an existing event. Only the fields provided are touched.\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"idempotent\",\n outputShape: GOOGLE_CALENDAR_EVENT_UPDATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"calendarId\",\n \"label\": \"Calendar ID\",\n \"required\": true,\n \"default\": \"primary\"\n },\n {\n \"type\": \"text\",\n \"key\": \"eventId\",\n \"label\": \"Event ID\",\n \"required\": true,\n \"description\": \"From event_create's data.id, or event_list/event_get.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"summary\",\n \"label\": \"Title\"\n },\n {\n \"type\": \"textarea\",\n \"key\": \"description\",\n \"label\": \"Description\"\n },\n {\n \"type\": \"text\",\n \"key\": \"location\",\n \"label\": \"Location\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startDateTime\",\n \"label\": \"Start\",\n \"description\": \"RFC 3339. Leave blank to leave the start time unchanged.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"startTimeZone\",\n \"label\": \"Start time zone\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endDateTime\",\n \"label\": \"End\",\n \"description\": \"RFC 3339. Leave blank to leave the end time unchanged.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"endTimeZone\",\n \"label\": \"End time zone\"\n },\n {\n \"type\": \"select\",\n \"key\": \"status\",\n \"label\": \"Status\",\n \"options\": [\n {\n \"value\": \"confirmed\",\n \"label\": \"Confirmed\"\n },\n {\n \"value\": \"tentative\",\n \"label\": \"Tentative\"\n },\n {\n \"value\": \"cancelled\",\n \"label\": \"Cancelled\"\n }\n ],\n \"description\": \"Setting cancelled here has the same effect as event_delete -- offered because PATCH is also Google's documented way to cancel one instance of a recurring event, which event_delete (which removes the whole resource) cannot target.\"\n },\n {\n \"type\": \"select\",\n \"key\": \"visibility\",\n \"label\": \"Visibility\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"public\",\n \"label\": \"Public\"\n },\n {\n \"value\": \"private\",\n \"label\": \"Private\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"transparency\",\n \"label\": \"Show me as\",\n \"options\": [\n {\n \"value\": \"opaque\",\n \"label\": \"Busy\"\n },\n {\n \"value\": \"transparent\",\n \"label\": \"Available\"\n }\n ]\n },\n {\n \"type\": \"text\",\n \"key\": \"colorId\",\n \"label\": \"Color ID\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENT_UPDATE_META, config as Record<string, unknown>, \"update an event\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/triggers/events-changed.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/triggers/events-changed.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar change — Start a run when something changes on a watched\n * Google Calendar.\n *\n * https://developers.google.com/workspace/calendar/api/guides/push\n *\n * Delivery: subscription. The host mints a UUID, calls channel_watch with it,\n * its own URL for this trigger and the connection's channelToken, and stores\n * the returned id, resourceId and expiration. Google cannot renew a channel:\n * 86400 seconds before it expires the host calls channel_stop and then\n * channel_watch again. A channel that lapsed is re-listed FIRST (event_list\n * with the stored syncToken; a 410 means list in full) and then re-created,\n * because notifications during the gap are gone. Google delivers with an EMPTY\n * body: the host verifies X-Goog-Channel-Token against the connection's\n * channelToken and injects the X-Goog-* headers as the event, camel-cased as\n * below. The first message on a new channel is `sync` and carries no change.\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleCalendarMeta } from \"../service.js\";\n\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_KIND = \"@particle-academy/google_calendar_events_changed_trigger\";\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OPERATION = \"events_changed\";\n\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META = googleCalendarMeta(\"trigger\", \"a calendar change\", \"https://developers.google.com/workspace/calendar/api/guides/push\");\n\n/**\n * What this node emits — the \"ingredients\" a downstream node can reference.\n *\n * fancy-flow reads `outputShape` off the kind and offers it in the variable\n * picker, so declaring it is the whole of the work: an author configuring the\n * next node picks `{{ $json.data.id }}` off a list instead of typing a path\n * and hoping.\n */\nexport const GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OUTPUT: OutputField[] = [\n {\n \"path\": \"channelId\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Channel-ID: which channel this came from.\"\n },\n {\n \"path\": \"messageNumber\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Message-Number: increases per channel; 1 is the sync message.\"\n },\n {\n \"path\": \"resourceId\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-ID: the watched resource.\"\n },\n {\n \"path\": \"resourceState\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-State: sync, exists or not_exists. `sync` carries no change.\"\n },\n {\n \"path\": \"resourceUri\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Resource-URI: the watched resource's URI.\"\n },\n {\n \"path\": \"channelExpiration\",\n \"type\": \"string\",\n \"description\": \"X-Goog-Channel-Expiration, when Google sends it: the channel's expiry in a human-readable format, not an instant to compute with.\"\n }\n];\n\nexport const googleCalendarEventsChangedTriggerKind: NodeKindDefinition = defineConnectorKind(GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META, {\n name: GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_KIND,\n aliases: [\"google_calendar_events_changed_trigger\"],\n label: \"Google Calendar change\",\n description: \"Start a run when something changes on a watched Google Calendar.\",\n icon: \"📅\",\n inputs: [],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_OUTPUT,\n configSchema: [\n {\n \"type\": \"select\",\n \"key\": \"sample\",\n \"label\": \"Sample state (fake mode)\",\n \"default\": \"exists\",\n \"description\": \"Which resource state the faked notification carries: `exists` is a change, `sync` is the first message on a new channel, `not_exists` is the resource going away.\",\n \"options\": [\n {\n \"value\": \"exists\",\n \"label\": \"exists — something changed\"\n },\n {\n \"value\": \"sync\",\n \"label\": \"sync — the channel just opened\"\n },\n {\n \"value\": \"not_exists\",\n \"label\": \"not_exists — the resource is gone\"\n }\n ]\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\",\n \"sample\": \"exists\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_CALENDAR_EVENTS_CHANGED_TRIGGER_META, config as Record<string, unknown>, \"a calendar change\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/manifest.json by weaver's generator.\n * A hand-edit here is destroyed by the next protocol sync, which is worse than\n * being rejected, because it works until it silently does not. Fix\n * provider/manifest.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_calendar\n */\n\n/**\n * Google Calendar's node kinds for fancy-flow.\n *\n * Install this on every host. The TypeScript executors live in the js\n * package's `./flow` subpath; PHP and Python hosts run their own and need only\n * this.\n */\n\nexport * from \"./service.js\";\nexport * from \"./kinds/channel-stop.js\";\nexport * from \"./kinds/channel-watch.js\";\nexport * from \"./kinds/event-create.js\";\nexport * from \"./kinds/event-delete.js\";\nexport * from \"./kinds/event-get.js\";\nexport * from \"./kinds/event-list.js\";\nexport * from \"./kinds/event-update.js\";\nexport * from \"./kinds/events-changed.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleCalendarChannelStopKind } from \"./kinds/channel-stop.js\";\nimport { googleCalendarChannelWatchKind } from \"./kinds/channel-watch.js\";\nimport { googleCalendarEventCreateKind } from \"./kinds/event-create.js\";\nimport { googleCalendarEventDeleteKind } from \"./kinds/event-delete.js\";\nimport { googleCalendarEventGetKind } from \"./kinds/event-get.js\";\nimport { googleCalendarEventListKind } from \"./kinds/event-list.js\";\nimport { googleCalendarEventUpdateKind } from \"./kinds/event-update.js\";\nimport { googleCalendarEventsChangedTriggerKind } from \"./kinds/events-changed.js\";\n\n/** Every Google Calendar kind, for a host that registers the lot. */\nexport const GOOGLE_CALENDAR_KINDS: NodeKindDefinition[] = [\n googleCalendarChannelStopKind,\n googleCalendarChannelWatchKind,\n googleCalendarEventCreateKind,\n googleCalendarEventDeleteKind,\n googleCalendarEventGetKind,\n googleCalendarEventListKind,\n googleCalendarEventUpdateKind,\n googleCalendarEventsChangedTriggerKind,\n];\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@particle-academy/google-calendar-ui",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Google Calendar's authoring surface for fancy-flow — the node kinds, their config schemas and their declared output shapes. React on every host; carries no executor.",
5
5
  "repository": {
6
6
  "type": "git",