@particle-academy/google-meet-ui 0.2.0 → 0.3.1

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
@@ -12,6 +12,47 @@ derived — somebody has to write what changed — but writing it in the
12
12
  provider repo would be a hand-edit that `.weaver.json` flags and the next
13
13
  sync destroys.
14
14
 
15
+ ## [0.3.1] — 2026-11-08
16
+
17
+ ### Fixed
18
+
19
+ - **The Laravel config's environment variable names now split camelCase**,
20
+ as documented. **Consumer action: none.** The old unsplit names are still
21
+ read as a fallback, so an app that set them keeps working; the new names
22
+ are preferred.
23
+
24
+ | Preferred | Still read |
25
+ |---|---|
26
+ | `GOOGLE_MEET_CLIENT_ID` | `GOOGLE_MEET_CLIENTID` |
27
+ | `GOOGLE_MEET_CLIENT_SECRET` | `GOOGLE_MEET_CLIENTSECRET` |
28
+ | `GOOGLE_MEET_ACCESS_TOKEN` | `GOOGLE_MEET_ACCESSTOKEN` |
29
+ | `GOOGLE_MEET_REFRESH_TOKEN` | `GOOGLE_MEET_REFRESHTOKEN` |
30
+
31
+ ## [0.3.0] — 2026-11-08
32
+
33
+ ### Added
34
+
35
+ - **One Google consent grant, shared by every Google connector** (`oauth.grant:
36
+ "google"`), for an org-level Google connection: one OAuth client, one consent
37
+ and one refresh token per person, with each feature's scopes asked for when it
38
+ is first used. Declared in the manifest, the `-ui` package's OAuth constant,
39
+ the README and the registry index:
40
+ - `authorizeParams`: `access_type=offline` and `include_granted_scopes=true`.
41
+ A refresh token comes back only on the FIRST code exchange, so keep the stored
42
+ one when an exchange returns none.
43
+ - `revoke`: POST `https://oauth2.googleapis.com/revoke` with `token`, and
44
+ `scope: "grant"`. **Revoking removes the person's WHOLE Google grant, every
45
+ Google connector**, so a per-feature disconnect stops using that feature's
46
+ scopes locally and only a full Google disconnect revokes.
47
+ - `identity`: identify the account by the id_token's `sub` (request `openid`;
48
+ issuer `https://accounts.google.com` or `accounts.google.com`; audience is
49
+ the `clientId`), never by email, which Google says is neither unique nor
50
+ permanent.
51
+ `restrictedScopes` is empty: none of this connector's scopes is restricted.
52
+
53
+ Nothing a request sends has changed; this is what a host needs to run the
54
+ connection.
55
+
15
56
  ## [0.2.0] — 2026-11-08
16
57
 
17
58
  ### Added
package/README.md CHANGED
@@ -55,6 +55,13 @@ Google Meet uses OAuth2 (authorization_code). The package DECLARES the exchange;
55
55
  - **Scopes** — `https://www.googleapis.com/auth/meetings.space.created`, `https://www.googleapis.com/auth/meetings.space.readonly`
56
56
  - **Access token lifetime** — 3600 seconds (1 hours). A host that never refreshes works all afternoon and is broken by morning.
57
57
 
58
+ **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.
59
+
60
+ - **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.
61
+ - **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.
62
+ - **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.
63
+ - **No restricted scopes** in this connector.
64
+
58
65
  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.
59
66
 
60
67
  ### The estate
package/dist/index.cjs CHANGED
@@ -52,7 +52,28 @@ var GOOGLE_MEET_OAUTH = {
52
52
  "accessTokenCredential": "accessToken",
53
53
  "refreshTokenCredential": "refreshToken",
54
54
  "refreshTokenRotates": false,
55
- "accessTokenTtlSeconds": 3600
55
+ "accessTokenTtlSeconds": 3600,
56
+ "grant": "google",
57
+ "authorizeParams": {
58
+ "access_type": "offline",
59
+ "include_granted_scopes": "true"
60
+ },
61
+ "revoke": {
62
+ "url": "https://oauth2.googleapis.com/revoke",
63
+ "param": "token",
64
+ "scope": "grant"
65
+ },
66
+ "identity": {
67
+ "scope": "openid",
68
+ "claim": "sub",
69
+ "issuers": [
70
+ "https://accounts.google.com",
71
+ "accounts.google.com"
72
+ ],
73
+ "jwksUrl": "https://www.googleapis.com/oauth2/v3/certs",
74
+ "audienceCredential": "clientId"
75
+ },
76
+ "restrictedScopes": []
56
77
  };
57
78
  function googleMeetMeta(role, operation, docs) {
58
79
  return { ...GOOGLE_MEET_SERVICE, role, operation, docs };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/service.ts","../src/kinds/conference-record-list.ts","../src/kinds/participant-list.ts","../src/kinds/space-create.ts","../src/kinds/space-get.ts","../src/kinds/transcript-entry-list.ts","../src/kinds/transcript-list.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_meet\n */\n\n/**\n * Google Meet's identity on the authoring surface, shared by every Google Meet\n * 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 Meet has no test estate distinct from a real account, as far as this\n * review found (2026-09-16) -- but it is UNVERIFIED, not confirmed.\n * space_create makes a real, joinable meeting space. Use fake mode while\n * building.\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_MEET_SERVICE = {\n service: \"google_meet\",\n serviceTitle: \"Google Meet\",\n domain: \"messaging\",\n sandbox: \"unverified\",\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 Meet connection holds. */\nexport const GOOGLE_MEET_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From the Google Cloud project you registered. One value for the whole installation -- the same app serves every connected Google account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"From the same Google Cloud project. Used to exchange the code and to refresh; never sent with an API request.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Obtained by the host's OAuth exchange, PER CONNECTED GOOGLE ACCOUNT. Expires after one hour -- a host that does not refresh will work for a while and then fail with no warning.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"optional\": true,\n \"help\": \"Also per account. Reusable -- Google does not rotate it on refresh.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Meet requires — DECLARED here, performed by the\n * 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_MEET_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/meetings.space.created\",\n \"https://www.googleapis.com/auth/meetings.space.readonly\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600\n} as const;\n\n/** Build a Google Meet node's connector metadata from the operation it performs. */\nexport function googleMeetMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_MEET_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/conference-record-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/conference-record-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List conference records — List past conferences, optionally filtered to one\n * space.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_KIND = \"@particle-academy/google_meet_conference_record_list\";\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_OPERATION = \"conference_record_list\";\n\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_META = googleMeetMeta(\"action\", \"conference records\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords/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_MEET_CONFERENCE_RECORD_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.conferenceRecords\",\n \"type\": \"array\",\n \"description\": \"This page's records, each with name (conferenceRecords/{id}), startTime, endTime, expireTime and space (the spaces/{id} it belongs to).\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetConferenceRecordListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_CONFERENCE_RECORD_LIST_META, {\n name: GOOGLE_MEET_CONFERENCE_RECORD_LIST_KIND,\n aliases: [\"google_meet_conference_record_list\"],\n label: \"List conference records\",\n description: \"List past conferences, optionally filtered to one space.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_CONFERENCE_RECORD_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"filter\",\n \"label\": \"Filter\",\n \"description\": \"Google's filter grammar, e.g. space.name = \\\"spaces/abc123\\\" to see one space's history, or space.meeting_code = \\\"abc-defg-hij\\\". Leave blank for every conference the account can see.\"\n },\n {\n \"type\": \"number\",\n \"key\": \"pageSize\",\n \"label\": \"Page size\",\n \"min\": 1,\n \"max\": 100,\n \"description\": \"Records per page. Leave blank for Google's default.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_CONFERENCE_RECORD_LIST_META, config as Record<string, unknown>, \"conference records\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/participant-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/participant-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List participants — List who attended a conference.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.participants/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_PARTICIPANT_LIST_KIND = \"@particle-academy/google_meet_participant_list\";\nexport const GOOGLE_MEET_PARTICIPANT_LIST_OPERATION = \"participant_list\";\n\nexport const GOOGLE_MEET_PARTICIPANT_LIST_META = googleMeetMeta(\"action\", \"a conference's participants\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.participants/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_MEET_PARTICIPANT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.participants\",\n \"type\": \"array\",\n \"description\": \"This page's participants. Each has name (participants/{id}), earliestStartTime, latestEndTime -- the SPAN across every time this person joined and left, not a single join/leave pair, since one person can rejoin -- and exactly one of signedinUser.displayName, anonymousUser.displayName, or phoneUser.displayName (a partially redacted phone number).\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetParticipantListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_PARTICIPANT_LIST_META, {\n name: GOOGLE_MEET_PARTICIPANT_LIST_KIND,\n aliases: [\"google_meet_participant_list\"],\n label: \"List participants\",\n description: \"List who attended a conference.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_PARTICIPANT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (conferenceRecords/{id} -- give the id after the slash) or from space_get's data.activeConference.conferenceRecord.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_PARTICIPANT_LIST_META, config as Record<string, unknown>, \"a conference's participants\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/space-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/space-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * Create meeting space — Create a new Google Meet space and get its join link.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/create\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 { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_SPACE_CREATE_KIND = \"@particle-academy/google_meet_space_create\";\nexport const GOOGLE_MEET_SPACE_CREATE_OPERATION = \"space_create\";\n\nexport const GOOGLE_MEET_SPACE_CREATE_META = googleMeetMeta(\"action\", \"a Meet space\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/create\");\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_MEET_SPACE_CREATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.name\",\n \"type\": \"string\",\n \"description\": \"The space's resource name, spaces/{id}.\"\n },\n {\n \"path\": \"data.meetingUri\",\n \"type\": \"string\",\n \"description\": \"The join link.\"\n },\n {\n \"path\": \"data.meetingCode\",\n \"type\": \"string\",\n \"description\": \"The short, human-typeable code shown in the Meet UI (part of meetingUri).\"\n },\n {\n \"path\": \"data.config.accessType\",\n \"type\": \"string\",\n \"description\": \"Echoes what was requested, or Google's default when omitted.\"\n },\n {\n \"path\": \"data.config.entryPointAccess\",\n \"type\": \"string\",\n \"description\": \"Echoes what was requested, or Google's default (ALL) when omitted.\"\n }\n];\n\nexport const googleMeetSpaceCreateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_SPACE_CREATE_META, {\n name: GOOGLE_MEET_SPACE_CREATE_KIND,\n aliases: [\"google_meet_space_create\"],\n label: \"Create meeting space\",\n description: \"Create a new Google Meet space and get its join link.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_MEET_SPACE_CREATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"select\",\n \"key\": \"accessType\",\n \"label\": \"Who can join\",\n \"description\": \"OPEN: anyone with the link, no knock. TRUSTED: anyone in your organization, no knock; others knock. RESTRICTED: only people and groups explicitly invited. Leave blank for Google's account default.\",\n \"options\": [\n {\n \"value\": \"OPEN\",\n \"label\": \"Open — anyone with the link\"\n },\n {\n \"value\": \"TRUSTED\",\n \"label\": \"Trusted — your organization joins directly\"\n },\n {\n \"value\": \"RESTRICTED\",\n \"label\": \"Restricted — invited people and groups only\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"entryPointAccess\",\n \"label\": \"Entry points\",\n \"description\": \"ALL: any Meet client (web, mobile, phone dial-in, the calling API). CREATOR_APP_ONLY: only the app that created the space, and only through the Meet REST API and SIP — no phone dial-in and no other Meet client. Leave blank for Google's default (ALL).\",\n \"options\": [\n {\n \"value\": \"ALL\",\n \"label\": \"All entry points\"\n },\n {\n \"value\": \"CREATOR_APP_ONLY\",\n \"label\": \"This app only\"\n }\n ]\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_SPACE_CREATE_META, config as Record<string, unknown>, \"a Meet space\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/space-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/space-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * Get meeting space — Read a Meet space's current state, including whether a\n * conference is active right now.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_SPACE_GET_KIND = \"@particle-academy/google_meet_space_get\";\nexport const GOOGLE_MEET_SPACE_GET_OPERATION = \"space_get\";\n\nexport const GOOGLE_MEET_SPACE_GET_META = googleMeetMeta(\"action\", \"a Meet space\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/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_MEET_SPACE_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.name\",\n \"type\": \"string\",\n \"description\": \"The space's resource name, spaces/{id}.\"\n },\n {\n \"path\": \"data.meetingUri\",\n \"type\": \"string\",\n \"description\": \"The join link.\"\n },\n {\n \"path\": \"data.meetingCode\",\n \"type\": \"string\",\n \"description\": \"The short, human-typeable code.\"\n },\n {\n \"path\": \"data.config.accessType\",\n \"type\": \"string\",\n \"description\": \"OPEN, TRUSTED or RESTRICTED.\"\n },\n {\n \"path\": \"data.config.entryPointAccess\",\n \"type\": \"string\",\n \"description\": \"ALL or CREATOR_APP_ONLY.\"\n },\n {\n \"path\": \"data.activeConference.conferenceRecord\",\n \"type\": \"string\",\n \"description\": \"Present only while a conference is LIVE right now — the conferenceRecords/{id} resource name to read once it ends. Absent between meetings.\"\n }\n];\n\nexport const googleMeetSpaceGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_SPACE_GET_META, {\n name: GOOGLE_MEET_SPACE_GET_KIND,\n aliases: [\"google_meet_space_get\"],\n label: \"Get meeting space\",\n description: \"Read a Meet space's current state, including whether a conference is active right now.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_SPACE_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"spaceId\",\n \"label\": \"Space ID\",\n \"required\": true,\n \"description\": \"The id from space_create's data.name (spaces/{id} -- give the id after the slash), or the meeting code shown in Meet's own UI. NOT independently spot-checked that the meeting-code form resolves through this exact endpoint; verify with a live call before relying on it.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_SPACE_GET_META, config as Record<string, unknown>, \"a Meet space\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/transcript-entry-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/transcript-entry-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List transcript entries — Read a finished conference's transcript, one\n * utterance per entry.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts.entries/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_KIND = \"@particle-academy/google_meet_transcript_entry_list\";\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_OPERATION = \"transcript_entry_list\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META = googleMeetMeta(\"action\", \"transcript entries\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts.entries/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_MEET_TRANSCRIPT_ENTRY_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.transcriptEntries\",\n \"type\": \"array\",\n \"description\": \"This page's entries, in order. Each has name, participant (participants/{id} -- join against participant_list to get a display name), text (the spoken words), languageCode, startTime and endTime.\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetTranscriptEntryListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META, {\n name: GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_KIND,\n aliases: [\"google_meet_transcript_entry_list\"],\n label: \"List transcript entries\",\n description: \"Read a finished conference's transcript, one utterance per entry.\",\n icon: \"📝\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (give the id after conferenceRecords/).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"transcriptId\",\n \"label\": \"Transcript ID\",\n \"required\": true,\n \"description\": \"The id from transcript_list's data.transcripts[].name (give the id after transcripts/).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META, config as Record<string, unknown>, \"transcript entries\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/transcript-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/transcript-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List transcripts — List a finished conference's transcripts, when\n * transcription was on.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_KIND = \"@particle-academy/google_meet_transcript_list\";\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_OPERATION = \"transcript_list\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_META = googleMeetMeta(\"action\", \"a conference's transcripts\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts/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_MEET_TRANSCRIPT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.transcripts\",\n \"type\": \"array\",\n \"description\": \"Usually one, unless the meeting was recorded in segments. Each has name (…/transcripts/{id} -- what transcript_entry_list needs), state, startTime, endTime, and docsDestination.exportUri (a Google Docs link, when export finished).\"\n }\n];\n\nexport const googleMeetTranscriptListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_TRANSCRIPT_LIST_META, {\n name: GOOGLE_MEET_TRANSCRIPT_LIST_KIND,\n aliases: [\"google_meet_transcript_list\"],\n label: \"List transcripts\",\n description: \"List a finished conference's transcripts, when transcription was on.\",\n icon: \"📝\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_TRANSCRIPT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (conferenceRecords/{id} -- give the id after the slash).\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_TRANSCRIPT_LIST_META, config as Record<string, unknown>, \"a conference's transcripts\"),\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_meet\n */\n\n/**\n * Google Meet'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/conference-record-list.js\";\nexport * from \"./kinds/participant-list.js\";\nexport * from \"./kinds/space-create.js\";\nexport * from \"./kinds/space-get.js\";\nexport * from \"./kinds/transcript-entry-list.js\";\nexport * from \"./kinds/transcript-list.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleMeetConferenceRecordListKind } from \"./kinds/conference-record-list.js\";\nimport { googleMeetParticipantListKind } from \"./kinds/participant-list.js\";\nimport { googleMeetSpaceCreateKind } from \"./kinds/space-create.js\";\nimport { googleMeetSpaceGetKind } from \"./kinds/space-get.js\";\nimport { googleMeetTranscriptEntryListKind } from \"./kinds/transcript-entry-list.js\";\nimport { googleMeetTranscriptListKind } from \"./kinds/transcript-list.js\";\n\n/** Every Google Meet kind, for a host that registers the lot. */\nexport const GOOGLE_MEET_KINDS: NodeKindDefinition[] = [\n googleMeetConferenceRecordListKind,\n googleMeetParticipantListKind,\n googleMeetSpaceCreateKind,\n googleMeetSpaceGetKind,\n googleMeetTranscriptEntryListKind,\n googleMeetTranscriptListKind,\n];\n"]}
1
+ {"version":3,"sources":["../src/service.ts","../src/kinds/conference-record-list.ts","../src/kinds/participant-list.ts","../src/kinds/space-create.ts","../src/kinds/space-get.ts","../src/kinds/transcript-entry-list.ts","../src/kinds/transcript-list.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_meet\n */\n\n/**\n * Google Meet's identity on the authoring surface, shared by every Google Meet\n * 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 Meet has no test estate distinct from a real account, as far as this\n * review found (2026-09-16) -- but it is UNVERIFIED, not confirmed.\n * space_create makes a real, joinable meeting space. Use fake mode while\n * building.\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_MEET_SERVICE = {\n service: \"google_meet\",\n serviceTitle: \"Google Meet\",\n domain: \"messaging\",\n sandbox: \"unverified\",\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 Meet connection holds. */\nexport const GOOGLE_MEET_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From the Google Cloud project you registered. One value for the whole installation -- the same app serves every connected Google account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"From the same Google Cloud project. Used to exchange the code and to refresh; never sent with an API request.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Obtained by the host's OAuth exchange, PER CONNECTED GOOGLE ACCOUNT. Expires after one hour -- a host that does not refresh will work for a while and then fail with no warning.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"optional\": true,\n \"help\": \"Also per account. Reusable -- Google does not rotate it on refresh.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Meet requires — DECLARED here, performed by the\n * 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_MEET_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/meetings.space.created\",\n \"https://www.googleapis.com/auth/meetings.space.readonly\"\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 Meet node's connector metadata from the operation it performs. */\nexport function googleMeetMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_MEET_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/conference-record-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/conference-record-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List conference records — List past conferences, optionally filtered to one\n * space.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_KIND = \"@particle-academy/google_meet_conference_record_list\";\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_OPERATION = \"conference_record_list\";\n\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_META = googleMeetMeta(\"action\", \"conference records\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords/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_MEET_CONFERENCE_RECORD_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.conferenceRecords\",\n \"type\": \"array\",\n \"description\": \"This page's records, each with name (conferenceRecords/{id}), startTime, endTime, expireTime and space (the spaces/{id} it belongs to).\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetConferenceRecordListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_CONFERENCE_RECORD_LIST_META, {\n name: GOOGLE_MEET_CONFERENCE_RECORD_LIST_KIND,\n aliases: [\"google_meet_conference_record_list\"],\n label: \"List conference records\",\n description: \"List past conferences, optionally filtered to one space.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_CONFERENCE_RECORD_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"filter\",\n \"label\": \"Filter\",\n \"description\": \"Google's filter grammar, e.g. space.name = \\\"spaces/abc123\\\" to see one space's history, or space.meeting_code = \\\"abc-defg-hij\\\". Leave blank for every conference the account can see.\"\n },\n {\n \"type\": \"number\",\n \"key\": \"pageSize\",\n \"label\": \"Page size\",\n \"min\": 1,\n \"max\": 100,\n \"description\": \"Records per page. Leave blank for Google's default.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_CONFERENCE_RECORD_LIST_META, config as Record<string, unknown>, \"conference records\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/participant-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/participant-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List participants — List who attended a conference.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.participants/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_PARTICIPANT_LIST_KIND = \"@particle-academy/google_meet_participant_list\";\nexport const GOOGLE_MEET_PARTICIPANT_LIST_OPERATION = \"participant_list\";\n\nexport const GOOGLE_MEET_PARTICIPANT_LIST_META = googleMeetMeta(\"action\", \"a conference's participants\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.participants/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_MEET_PARTICIPANT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.participants\",\n \"type\": \"array\",\n \"description\": \"This page's participants. Each has name (participants/{id}), earliestStartTime, latestEndTime -- the SPAN across every time this person joined and left, not a single join/leave pair, since one person can rejoin -- and exactly one of signedinUser.displayName, anonymousUser.displayName, or phoneUser.displayName (a partially redacted phone number).\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetParticipantListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_PARTICIPANT_LIST_META, {\n name: GOOGLE_MEET_PARTICIPANT_LIST_KIND,\n aliases: [\"google_meet_participant_list\"],\n label: \"List participants\",\n description: \"List who attended a conference.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_PARTICIPANT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (conferenceRecords/{id} -- give the id after the slash) or from space_get's data.activeConference.conferenceRecord.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_PARTICIPANT_LIST_META, config as Record<string, unknown>, \"a conference's participants\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/space-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/space-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * Create meeting space — Create a new Google Meet space and get its join link.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/create\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 { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_SPACE_CREATE_KIND = \"@particle-academy/google_meet_space_create\";\nexport const GOOGLE_MEET_SPACE_CREATE_OPERATION = \"space_create\";\n\nexport const GOOGLE_MEET_SPACE_CREATE_META = googleMeetMeta(\"action\", \"a Meet space\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/create\");\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_MEET_SPACE_CREATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.name\",\n \"type\": \"string\",\n \"description\": \"The space's resource name, spaces/{id}.\"\n },\n {\n \"path\": \"data.meetingUri\",\n \"type\": \"string\",\n \"description\": \"The join link.\"\n },\n {\n \"path\": \"data.meetingCode\",\n \"type\": \"string\",\n \"description\": \"The short, human-typeable code shown in the Meet UI (part of meetingUri).\"\n },\n {\n \"path\": \"data.config.accessType\",\n \"type\": \"string\",\n \"description\": \"Echoes what was requested, or Google's default when omitted.\"\n },\n {\n \"path\": \"data.config.entryPointAccess\",\n \"type\": \"string\",\n \"description\": \"Echoes what was requested, or Google's default (ALL) when omitted.\"\n }\n];\n\nexport const googleMeetSpaceCreateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_SPACE_CREATE_META, {\n name: GOOGLE_MEET_SPACE_CREATE_KIND,\n aliases: [\"google_meet_space_create\"],\n label: \"Create meeting space\",\n description: \"Create a new Google Meet space and get its join link.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_MEET_SPACE_CREATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"select\",\n \"key\": \"accessType\",\n \"label\": \"Who can join\",\n \"description\": \"OPEN: anyone with the link, no knock. TRUSTED: anyone in your organization, no knock; others knock. RESTRICTED: only people and groups explicitly invited. Leave blank for Google's account default.\",\n \"options\": [\n {\n \"value\": \"OPEN\",\n \"label\": \"Open — anyone with the link\"\n },\n {\n \"value\": \"TRUSTED\",\n \"label\": \"Trusted — your organization joins directly\"\n },\n {\n \"value\": \"RESTRICTED\",\n \"label\": \"Restricted — invited people and groups only\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"entryPointAccess\",\n \"label\": \"Entry points\",\n \"description\": \"ALL: any Meet client (web, mobile, phone dial-in, the calling API). CREATOR_APP_ONLY: only the app that created the space, and only through the Meet REST API and SIP — no phone dial-in and no other Meet client. Leave blank for Google's default (ALL).\",\n \"options\": [\n {\n \"value\": \"ALL\",\n \"label\": \"All entry points\"\n },\n {\n \"value\": \"CREATOR_APP_ONLY\",\n \"label\": \"This app only\"\n }\n ]\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_SPACE_CREATE_META, config as Record<string, unknown>, \"a Meet space\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/space-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/space-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * Get meeting space — Read a Meet space's current state, including whether a\n * conference is active right now.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_SPACE_GET_KIND = \"@particle-academy/google_meet_space_get\";\nexport const GOOGLE_MEET_SPACE_GET_OPERATION = \"space_get\";\n\nexport const GOOGLE_MEET_SPACE_GET_META = googleMeetMeta(\"action\", \"a Meet space\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/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_MEET_SPACE_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.name\",\n \"type\": \"string\",\n \"description\": \"The space's resource name, spaces/{id}.\"\n },\n {\n \"path\": \"data.meetingUri\",\n \"type\": \"string\",\n \"description\": \"The join link.\"\n },\n {\n \"path\": \"data.meetingCode\",\n \"type\": \"string\",\n \"description\": \"The short, human-typeable code.\"\n },\n {\n \"path\": \"data.config.accessType\",\n \"type\": \"string\",\n \"description\": \"OPEN, TRUSTED or RESTRICTED.\"\n },\n {\n \"path\": \"data.config.entryPointAccess\",\n \"type\": \"string\",\n \"description\": \"ALL or CREATOR_APP_ONLY.\"\n },\n {\n \"path\": \"data.activeConference.conferenceRecord\",\n \"type\": \"string\",\n \"description\": \"Present only while a conference is LIVE right now — the conferenceRecords/{id} resource name to read once it ends. Absent between meetings.\"\n }\n];\n\nexport const googleMeetSpaceGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_SPACE_GET_META, {\n name: GOOGLE_MEET_SPACE_GET_KIND,\n aliases: [\"google_meet_space_get\"],\n label: \"Get meeting space\",\n description: \"Read a Meet space's current state, including whether a conference is active right now.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_SPACE_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"spaceId\",\n \"label\": \"Space ID\",\n \"required\": true,\n \"description\": \"The id from space_create's data.name (spaces/{id} -- give the id after the slash), or the meeting code shown in Meet's own UI. NOT independently spot-checked that the meeting-code form resolves through this exact endpoint; verify with a live call before relying on it.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_SPACE_GET_META, config as Record<string, unknown>, \"a Meet space\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/transcript-entry-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/transcript-entry-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List transcript entries — Read a finished conference's transcript, one\n * utterance per entry.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts.entries/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_KIND = \"@particle-academy/google_meet_transcript_entry_list\";\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_OPERATION = \"transcript_entry_list\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META = googleMeetMeta(\"action\", \"transcript entries\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts.entries/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_MEET_TRANSCRIPT_ENTRY_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.transcriptEntries\",\n \"type\": \"array\",\n \"description\": \"This page's entries, in order. Each has name, participant (participants/{id} -- join against participant_list to get a display name), text (the spoken words), languageCode, startTime and endTime.\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetTranscriptEntryListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META, {\n name: GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_KIND,\n aliases: [\"google_meet_transcript_entry_list\"],\n label: \"List transcript entries\",\n description: \"Read a finished conference's transcript, one utterance per entry.\",\n icon: \"📝\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (give the id after conferenceRecords/).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"transcriptId\",\n \"label\": \"Transcript ID\",\n \"required\": true,\n \"description\": \"The id from transcript_list's data.transcripts[].name (give the id after transcripts/).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META, config as Record<string, unknown>, \"transcript entries\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/transcript-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/transcript-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List transcripts — List a finished conference's transcripts, when\n * transcription was on.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_KIND = \"@particle-academy/google_meet_transcript_list\";\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_OPERATION = \"transcript_list\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_META = googleMeetMeta(\"action\", \"a conference's transcripts\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts/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_MEET_TRANSCRIPT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.transcripts\",\n \"type\": \"array\",\n \"description\": \"Usually one, unless the meeting was recorded in segments. Each has name (…/transcripts/{id} -- what transcript_entry_list needs), state, startTime, endTime, and docsDestination.exportUri (a Google Docs link, when export finished).\"\n }\n];\n\nexport const googleMeetTranscriptListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_TRANSCRIPT_LIST_META, {\n name: GOOGLE_MEET_TRANSCRIPT_LIST_KIND,\n aliases: [\"google_meet_transcript_list\"],\n label: \"List transcripts\",\n description: \"List a finished conference's transcripts, when transcription was on.\",\n icon: \"📝\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_TRANSCRIPT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (conferenceRecords/{id} -- give the id after the slash).\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_TRANSCRIPT_LIST_META, config as Record<string, unknown>, \"a conference's transcripts\"),\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_meet\n */\n\n/**\n * Google Meet'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/conference-record-list.js\";\nexport * from \"./kinds/participant-list.js\";\nexport * from \"./kinds/space-create.js\";\nexport * from \"./kinds/space-get.js\";\nexport * from \"./kinds/transcript-entry-list.js\";\nexport * from \"./kinds/transcript-list.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleMeetConferenceRecordListKind } from \"./kinds/conference-record-list.js\";\nimport { googleMeetParticipantListKind } from \"./kinds/participant-list.js\";\nimport { googleMeetSpaceCreateKind } from \"./kinds/space-create.js\";\nimport { googleMeetSpaceGetKind } from \"./kinds/space-get.js\";\nimport { googleMeetTranscriptEntryListKind } from \"./kinds/transcript-entry-list.js\";\nimport { googleMeetTranscriptListKind } from \"./kinds/transcript-list.js\";\n\n/** Every Google Meet kind, for a host that registers the lot. */\nexport const GOOGLE_MEET_KINDS: NodeKindDefinition[] = [\n googleMeetConferenceRecordListKind,\n googleMeetParticipantListKind,\n googleMeetSpaceCreateKind,\n googleMeetSpaceGetKind,\n googleMeetTranscriptEntryListKind,\n googleMeetTranscriptListKind,\n];\n"]}
package/dist/index.d.cts CHANGED
@@ -86,6 +86,13 @@ declare const GOOGLE_MEET_CREDENTIALS: readonly [{
86
86
  * safely be retried and may run concurrently. That is stated rather than
87
87
  * assumed because the opposite — a provider that spends the token and revokes
88
88
  * the grant on a replay — looks identical until it happens.
89
+ *
90
+ * Its consent grant is SHARED with every connector declaring grant "google":
91
+ * one OAuth client, one consent and one refresh token per person, scopes added
92
+ * as features are first used (authorizeParams). Revoking removes the WHOLE
93
+ * grant, so only a full disconnect revokes; a per-feature disconnect stops
94
+ * using the scope locally. Identify the account by the id_token's sub, never
95
+ * by email.
89
96
  */
90
97
  declare const GOOGLE_MEET_OAUTH: {
91
98
  readonly flow: "authorization_code";
@@ -96,6 +103,24 @@ declare const GOOGLE_MEET_OAUTH: {
96
103
  readonly refreshTokenCredential: "refreshToken";
97
104
  readonly refreshTokenRotates: false;
98
105
  readonly accessTokenTtlSeconds: 3600;
106
+ readonly grant: "google";
107
+ readonly authorizeParams: {
108
+ readonly access_type: "offline";
109
+ readonly include_granted_scopes: "true";
110
+ };
111
+ readonly revoke: {
112
+ readonly url: "https://oauth2.googleapis.com/revoke";
113
+ readonly param: "token";
114
+ readonly scope: "grant";
115
+ };
116
+ readonly identity: {
117
+ readonly scope: "openid";
118
+ readonly claim: "sub";
119
+ readonly issuers: readonly ["https://accounts.google.com", "accounts.google.com"];
120
+ readonly jwksUrl: "https://www.googleapis.com/oauth2/v3/certs";
121
+ readonly audienceCredential: "clientId";
122
+ };
123
+ readonly restrictedScopes: readonly [];
99
124
  };
100
125
  /** Build a Google Meet node's connector metadata from the operation it performs. */
101
126
  declare function googleMeetMeta(role: ConnectorMeta["role"], operation: string, docs: string): ConnectorMeta;
package/dist/index.d.ts CHANGED
@@ -86,6 +86,13 @@ declare const GOOGLE_MEET_CREDENTIALS: readonly [{
86
86
  * safely be retried and may run concurrently. That is stated rather than
87
87
  * assumed because the opposite — a provider that spends the token and revokes
88
88
  * the grant on a replay — looks identical until it happens.
89
+ *
90
+ * Its consent grant is SHARED with every connector declaring grant "google":
91
+ * one OAuth client, one consent and one refresh token per person, scopes added
92
+ * as features are first used (authorizeParams). Revoking removes the WHOLE
93
+ * grant, so only a full disconnect revokes; a per-feature disconnect stops
94
+ * using the scope locally. Identify the account by the id_token's sub, never
95
+ * by email.
89
96
  */
90
97
  declare const GOOGLE_MEET_OAUTH: {
91
98
  readonly flow: "authorization_code";
@@ -96,6 +103,24 @@ declare const GOOGLE_MEET_OAUTH: {
96
103
  readonly refreshTokenCredential: "refreshToken";
97
104
  readonly refreshTokenRotates: false;
98
105
  readonly accessTokenTtlSeconds: 3600;
106
+ readonly grant: "google";
107
+ readonly authorizeParams: {
108
+ readonly access_type: "offline";
109
+ readonly include_granted_scopes: "true";
110
+ };
111
+ readonly revoke: {
112
+ readonly url: "https://oauth2.googleapis.com/revoke";
113
+ readonly param: "token";
114
+ readonly scope: "grant";
115
+ };
116
+ readonly identity: {
117
+ readonly scope: "openid";
118
+ readonly claim: "sub";
119
+ readonly issuers: readonly ["https://accounts.google.com", "accounts.google.com"];
120
+ readonly jwksUrl: "https://www.googleapis.com/oauth2/v3/certs";
121
+ readonly audienceCredential: "clientId";
122
+ };
123
+ readonly restrictedScopes: readonly [];
99
124
  };
100
125
  /** Build a Google Meet node's connector metadata from the operation it performs. */
101
126
  declare function googleMeetMeta(role: ConnectorMeta["role"], operation: string, docs: string): ConnectorMeta;
package/dist/index.js CHANGED
@@ -50,7 +50,28 @@ var GOOGLE_MEET_OAUTH = {
50
50
  "accessTokenCredential": "accessToken",
51
51
  "refreshTokenCredential": "refreshToken",
52
52
  "refreshTokenRotates": false,
53
- "accessTokenTtlSeconds": 3600
53
+ "accessTokenTtlSeconds": 3600,
54
+ "grant": "google",
55
+ "authorizeParams": {
56
+ "access_type": "offline",
57
+ "include_granted_scopes": "true"
58
+ },
59
+ "revoke": {
60
+ "url": "https://oauth2.googleapis.com/revoke",
61
+ "param": "token",
62
+ "scope": "grant"
63
+ },
64
+ "identity": {
65
+ "scope": "openid",
66
+ "claim": "sub",
67
+ "issuers": [
68
+ "https://accounts.google.com",
69
+ "accounts.google.com"
70
+ ],
71
+ "jwksUrl": "https://www.googleapis.com/oauth2/v3/certs",
72
+ "audienceCredential": "clientId"
73
+ },
74
+ "restrictedScopes": []
54
75
  };
55
76
  function googleMeetMeta(role, operation, docs) {
56
77
  return { ...GOOGLE_MEET_SERVICE, role, operation, docs };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/service.ts","../src/kinds/conference-record-list.ts","../src/kinds/participant-list.ts","../src/kinds/space-create.ts","../src/kinds/space-get.ts","../src/kinds/transcript-entry-list.ts","../src/kinds/transcript-list.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_meet\n */\n\n/**\n * Google Meet's identity on the authoring surface, shared by every Google Meet\n * 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 Meet has no test estate distinct from a real account, as far as this\n * review found (2026-09-16) -- but it is UNVERIFIED, not confirmed.\n * space_create makes a real, joinable meeting space. Use fake mode while\n * building.\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_MEET_SERVICE = {\n service: \"google_meet\",\n serviceTitle: \"Google Meet\",\n domain: \"messaging\",\n sandbox: \"unverified\",\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 Meet connection holds. */\nexport const GOOGLE_MEET_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From the Google Cloud project you registered. One value for the whole installation -- the same app serves every connected Google account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"From the same Google Cloud project. Used to exchange the code and to refresh; never sent with an API request.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Obtained by the host's OAuth exchange, PER CONNECTED GOOGLE ACCOUNT. Expires after one hour -- a host that does not refresh will work for a while and then fail with no warning.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"optional\": true,\n \"help\": \"Also per account. Reusable -- Google does not rotate it on refresh.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Meet requires — DECLARED here, performed by the\n * 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_MEET_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/meetings.space.created\",\n \"https://www.googleapis.com/auth/meetings.space.readonly\"\n ],\n \"accessTokenCredential\": \"accessToken\",\n \"refreshTokenCredential\": \"refreshToken\",\n \"refreshTokenRotates\": false,\n \"accessTokenTtlSeconds\": 3600\n} as const;\n\n/** Build a Google Meet node's connector metadata from the operation it performs. */\nexport function googleMeetMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_MEET_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/conference-record-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/conference-record-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List conference records — List past conferences, optionally filtered to one\n * space.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_KIND = \"@particle-academy/google_meet_conference_record_list\";\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_OPERATION = \"conference_record_list\";\n\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_META = googleMeetMeta(\"action\", \"conference records\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords/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_MEET_CONFERENCE_RECORD_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.conferenceRecords\",\n \"type\": \"array\",\n \"description\": \"This page's records, each with name (conferenceRecords/{id}), startTime, endTime, expireTime and space (the spaces/{id} it belongs to).\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetConferenceRecordListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_CONFERENCE_RECORD_LIST_META, {\n name: GOOGLE_MEET_CONFERENCE_RECORD_LIST_KIND,\n aliases: [\"google_meet_conference_record_list\"],\n label: \"List conference records\",\n description: \"List past conferences, optionally filtered to one space.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_CONFERENCE_RECORD_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"filter\",\n \"label\": \"Filter\",\n \"description\": \"Google's filter grammar, e.g. space.name = \\\"spaces/abc123\\\" to see one space's history, or space.meeting_code = \\\"abc-defg-hij\\\". Leave blank for every conference the account can see.\"\n },\n {\n \"type\": \"number\",\n \"key\": \"pageSize\",\n \"label\": \"Page size\",\n \"min\": 1,\n \"max\": 100,\n \"description\": \"Records per page. Leave blank for Google's default.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_CONFERENCE_RECORD_LIST_META, config as Record<string, unknown>, \"conference records\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/participant-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/participant-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List participants — List who attended a conference.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.participants/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_PARTICIPANT_LIST_KIND = \"@particle-academy/google_meet_participant_list\";\nexport const GOOGLE_MEET_PARTICIPANT_LIST_OPERATION = \"participant_list\";\n\nexport const GOOGLE_MEET_PARTICIPANT_LIST_META = googleMeetMeta(\"action\", \"a conference's participants\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.participants/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_MEET_PARTICIPANT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.participants\",\n \"type\": \"array\",\n \"description\": \"This page's participants. Each has name (participants/{id}), earliestStartTime, latestEndTime -- the SPAN across every time this person joined and left, not a single join/leave pair, since one person can rejoin -- and exactly one of signedinUser.displayName, anonymousUser.displayName, or phoneUser.displayName (a partially redacted phone number).\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetParticipantListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_PARTICIPANT_LIST_META, {\n name: GOOGLE_MEET_PARTICIPANT_LIST_KIND,\n aliases: [\"google_meet_participant_list\"],\n label: \"List participants\",\n description: \"List who attended a conference.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_PARTICIPANT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (conferenceRecords/{id} -- give the id after the slash) or from space_get's data.activeConference.conferenceRecord.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_PARTICIPANT_LIST_META, config as Record<string, unknown>, \"a conference's participants\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/space-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/space-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * Create meeting space — Create a new Google Meet space and get its join link.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/create\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 { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_SPACE_CREATE_KIND = \"@particle-academy/google_meet_space_create\";\nexport const GOOGLE_MEET_SPACE_CREATE_OPERATION = \"space_create\";\n\nexport const GOOGLE_MEET_SPACE_CREATE_META = googleMeetMeta(\"action\", \"a Meet space\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/create\");\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_MEET_SPACE_CREATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.name\",\n \"type\": \"string\",\n \"description\": \"The space's resource name, spaces/{id}.\"\n },\n {\n \"path\": \"data.meetingUri\",\n \"type\": \"string\",\n \"description\": \"The join link.\"\n },\n {\n \"path\": \"data.meetingCode\",\n \"type\": \"string\",\n \"description\": \"The short, human-typeable code shown in the Meet UI (part of meetingUri).\"\n },\n {\n \"path\": \"data.config.accessType\",\n \"type\": \"string\",\n \"description\": \"Echoes what was requested, or Google's default when omitted.\"\n },\n {\n \"path\": \"data.config.entryPointAccess\",\n \"type\": \"string\",\n \"description\": \"Echoes what was requested, or Google's default (ALL) when omitted.\"\n }\n];\n\nexport const googleMeetSpaceCreateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_SPACE_CREATE_META, {\n name: GOOGLE_MEET_SPACE_CREATE_KIND,\n aliases: [\"google_meet_space_create\"],\n label: \"Create meeting space\",\n description: \"Create a new Google Meet space and get its join link.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_MEET_SPACE_CREATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"select\",\n \"key\": \"accessType\",\n \"label\": \"Who can join\",\n \"description\": \"OPEN: anyone with the link, no knock. TRUSTED: anyone in your organization, no knock; others knock. RESTRICTED: only people and groups explicitly invited. Leave blank for Google's account default.\",\n \"options\": [\n {\n \"value\": \"OPEN\",\n \"label\": \"Open — anyone with the link\"\n },\n {\n \"value\": \"TRUSTED\",\n \"label\": \"Trusted — your organization joins directly\"\n },\n {\n \"value\": \"RESTRICTED\",\n \"label\": \"Restricted — invited people and groups only\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"entryPointAccess\",\n \"label\": \"Entry points\",\n \"description\": \"ALL: any Meet client (web, mobile, phone dial-in, the calling API). CREATOR_APP_ONLY: only the app that created the space, and only through the Meet REST API and SIP — no phone dial-in and no other Meet client. Leave blank for Google's default (ALL).\",\n \"options\": [\n {\n \"value\": \"ALL\",\n \"label\": \"All entry points\"\n },\n {\n \"value\": \"CREATOR_APP_ONLY\",\n \"label\": \"This app only\"\n }\n ]\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_SPACE_CREATE_META, config as Record<string, unknown>, \"a Meet space\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/space-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/space-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * Get meeting space — Read a Meet space's current state, including whether a\n * conference is active right now.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_SPACE_GET_KIND = \"@particle-academy/google_meet_space_get\";\nexport const GOOGLE_MEET_SPACE_GET_OPERATION = \"space_get\";\n\nexport const GOOGLE_MEET_SPACE_GET_META = googleMeetMeta(\"action\", \"a Meet space\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/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_MEET_SPACE_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.name\",\n \"type\": \"string\",\n \"description\": \"The space's resource name, spaces/{id}.\"\n },\n {\n \"path\": \"data.meetingUri\",\n \"type\": \"string\",\n \"description\": \"The join link.\"\n },\n {\n \"path\": \"data.meetingCode\",\n \"type\": \"string\",\n \"description\": \"The short, human-typeable code.\"\n },\n {\n \"path\": \"data.config.accessType\",\n \"type\": \"string\",\n \"description\": \"OPEN, TRUSTED or RESTRICTED.\"\n },\n {\n \"path\": \"data.config.entryPointAccess\",\n \"type\": \"string\",\n \"description\": \"ALL or CREATOR_APP_ONLY.\"\n },\n {\n \"path\": \"data.activeConference.conferenceRecord\",\n \"type\": \"string\",\n \"description\": \"Present only while a conference is LIVE right now — the conferenceRecords/{id} resource name to read once it ends. Absent between meetings.\"\n }\n];\n\nexport const googleMeetSpaceGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_SPACE_GET_META, {\n name: GOOGLE_MEET_SPACE_GET_KIND,\n aliases: [\"google_meet_space_get\"],\n label: \"Get meeting space\",\n description: \"Read a Meet space's current state, including whether a conference is active right now.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_SPACE_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"spaceId\",\n \"label\": \"Space ID\",\n \"required\": true,\n \"description\": \"The id from space_create's data.name (spaces/{id} -- give the id after the slash), or the meeting code shown in Meet's own UI. NOT independently spot-checked that the meeting-code form resolves through this exact endpoint; verify with a live call before relying on it.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_SPACE_GET_META, config as Record<string, unknown>, \"a Meet space\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/transcript-entry-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/transcript-entry-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List transcript entries — Read a finished conference's transcript, one\n * utterance per entry.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts.entries/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_KIND = \"@particle-academy/google_meet_transcript_entry_list\";\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_OPERATION = \"transcript_entry_list\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META = googleMeetMeta(\"action\", \"transcript entries\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts.entries/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_MEET_TRANSCRIPT_ENTRY_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.transcriptEntries\",\n \"type\": \"array\",\n \"description\": \"This page's entries, in order. Each has name, participant (participants/{id} -- join against participant_list to get a display name), text (the spoken words), languageCode, startTime and endTime.\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetTranscriptEntryListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META, {\n name: GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_KIND,\n aliases: [\"google_meet_transcript_entry_list\"],\n label: \"List transcript entries\",\n description: \"Read a finished conference's transcript, one utterance per entry.\",\n icon: \"📝\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (give the id after conferenceRecords/).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"transcriptId\",\n \"label\": \"Transcript ID\",\n \"required\": true,\n \"description\": \"The id from transcript_list's data.transcripts[].name (give the id after transcripts/).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META, config as Record<string, unknown>, \"transcript entries\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/transcript-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/transcript-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List transcripts — List a finished conference's transcripts, when\n * transcription was on.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_KIND = \"@particle-academy/google_meet_transcript_list\";\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_OPERATION = \"transcript_list\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_META = googleMeetMeta(\"action\", \"a conference's transcripts\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts/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_MEET_TRANSCRIPT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.transcripts\",\n \"type\": \"array\",\n \"description\": \"Usually one, unless the meeting was recorded in segments. Each has name (…/transcripts/{id} -- what transcript_entry_list needs), state, startTime, endTime, and docsDestination.exportUri (a Google Docs link, when export finished).\"\n }\n];\n\nexport const googleMeetTranscriptListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_TRANSCRIPT_LIST_META, {\n name: GOOGLE_MEET_TRANSCRIPT_LIST_KIND,\n aliases: [\"google_meet_transcript_list\"],\n label: \"List transcripts\",\n description: \"List a finished conference's transcripts, when transcription was on.\",\n icon: \"📝\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_TRANSCRIPT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (conferenceRecords/{id} -- give the id after the slash).\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_TRANSCRIPT_LIST_META, config as Record<string, unknown>, \"a conference's transcripts\"),\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_meet\n */\n\n/**\n * Google Meet'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/conference-record-list.js\";\nexport * from \"./kinds/participant-list.js\";\nexport * from \"./kinds/space-create.js\";\nexport * from \"./kinds/space-get.js\";\nexport * from \"./kinds/transcript-entry-list.js\";\nexport * from \"./kinds/transcript-list.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleMeetConferenceRecordListKind } from \"./kinds/conference-record-list.js\";\nimport { googleMeetParticipantListKind } from \"./kinds/participant-list.js\";\nimport { googleMeetSpaceCreateKind } from \"./kinds/space-create.js\";\nimport { googleMeetSpaceGetKind } from \"./kinds/space-get.js\";\nimport { googleMeetTranscriptEntryListKind } from \"./kinds/transcript-entry-list.js\";\nimport { googleMeetTranscriptListKind } from \"./kinds/transcript-list.js\";\n\n/** Every Google Meet kind, for a host that registers the lot. */\nexport const GOOGLE_MEET_KINDS: NodeKindDefinition[] = [\n googleMeetConferenceRecordListKind,\n googleMeetParticipantListKind,\n googleMeetSpaceCreateKind,\n googleMeetSpaceGetKind,\n googleMeetTranscriptEntryListKind,\n googleMeetTranscriptListKind,\n];\n"]}
1
+ {"version":3,"sources":["../src/service.ts","../src/kinds/conference-record-list.ts","../src/kinds/participant-list.ts","../src/kinds/space-create.ts","../src/kinds/space-get.ts","../src/kinds/transcript-entry-list.ts","../src/kinds/transcript-list.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_meet\n */\n\n/**\n * Google Meet's identity on the authoring surface, shared by every Google Meet\n * 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 Meet has no test estate distinct from a real account, as far as this\n * review found (2026-09-16) -- but it is UNVERIFIED, not confirmed.\n * space_create makes a real, joinable meeting space. Use fake mode while\n * building.\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_MEET_SERVICE = {\n service: \"google_meet\",\n serviceTitle: \"Google Meet\",\n domain: \"messaging\",\n sandbox: \"unverified\",\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 Meet connection holds. */\nexport const GOOGLE_MEET_CREDENTIALS = [\n {\n \"key\": \"clientId\",\n \"label\": \"OAuth client ID\",\n \"scope\": \"provider\",\n \"secret\": false,\n \"help\": \"From the Google Cloud project you registered. One value for the whole installation -- the same app serves every connected Google account.\"\n },\n {\n \"key\": \"clientSecret\",\n \"label\": \"OAuth client secret\",\n \"scope\": \"provider\",\n \"secret\": true,\n \"help\": \"From the same Google Cloud project. Used to exchange the code and to refresh; never sent with an API request.\"\n },\n {\n \"key\": \"accessToken\",\n \"label\": \"Access token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"help\": \"Obtained by the host's OAuth exchange, PER CONNECTED GOOGLE ACCOUNT. Expires after one hour -- a host that does not refresh will work for a while and then fail with no warning.\"\n },\n {\n \"key\": \"refreshToken\",\n \"label\": \"Refresh token\",\n \"scope\": \"account\",\n \"secret\": true,\n \"optional\": true,\n \"help\": \"Also per account. Reusable -- Google does not rotate it on refresh.\"\n }\n] as const;\n\n/**\n * The OAuth2 exchange Google Meet requires — DECLARED here, performed by the\n * 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_MEET_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/meetings.space.created\",\n \"https://www.googleapis.com/auth/meetings.space.readonly\"\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 Meet node's connector metadata from the operation it performs. */\nexport function googleMeetMeta(\n role: ConnectorMeta[\"role\"],\n operation: string,\n docs: string,\n): ConnectorMeta {\n return { ...GOOGLE_MEET_SERVICE, role, operation, docs };\n}\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/conference-record-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/conference-record-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List conference records — List past conferences, optionally filtered to one\n * space.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_KIND = \"@particle-academy/google_meet_conference_record_list\";\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_OPERATION = \"conference_record_list\";\n\nexport const GOOGLE_MEET_CONFERENCE_RECORD_LIST_META = googleMeetMeta(\"action\", \"conference records\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords/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_MEET_CONFERENCE_RECORD_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.conferenceRecords\",\n \"type\": \"array\",\n \"description\": \"This page's records, each with name (conferenceRecords/{id}), startTime, endTime, expireTime and space (the spaces/{id} it belongs to).\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetConferenceRecordListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_CONFERENCE_RECORD_LIST_META, {\n name: GOOGLE_MEET_CONFERENCE_RECORD_LIST_KIND,\n aliases: [\"google_meet_conference_record_list\"],\n label: \"List conference records\",\n description: \"List past conferences, optionally filtered to one space.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_CONFERENCE_RECORD_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"filter\",\n \"label\": \"Filter\",\n \"description\": \"Google's filter grammar, e.g. space.name = \\\"spaces/abc123\\\" to see one space's history, or space.meeting_code = \\\"abc-defg-hij\\\". Leave blank for every conference the account can see.\"\n },\n {\n \"type\": \"number\",\n \"key\": \"pageSize\",\n \"label\": \"Page size\",\n \"min\": 1,\n \"max\": 100,\n \"description\": \"Records per page. Leave blank for Google's default.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_CONFERENCE_RECORD_LIST_META, config as Record<string, unknown>, \"conference records\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/participant-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/participant-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List participants — List who attended a conference.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.participants/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_PARTICIPANT_LIST_KIND = \"@particle-academy/google_meet_participant_list\";\nexport const GOOGLE_MEET_PARTICIPANT_LIST_OPERATION = \"participant_list\";\n\nexport const GOOGLE_MEET_PARTICIPANT_LIST_META = googleMeetMeta(\"action\", \"a conference's participants\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.participants/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_MEET_PARTICIPANT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.participants\",\n \"type\": \"array\",\n \"description\": \"This page's participants. Each has name (participants/{id}), earliestStartTime, latestEndTime -- the SPAN across every time this person joined and left, not a single join/leave pair, since one person can rejoin -- and exactly one of signedinUser.displayName, anonymousUser.displayName, or phoneUser.displayName (a partially redacted phone number).\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetParticipantListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_PARTICIPANT_LIST_META, {\n name: GOOGLE_MEET_PARTICIPANT_LIST_KIND,\n aliases: [\"google_meet_participant_list\"],\n label: \"List participants\",\n description: \"List who attended a conference.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_PARTICIPANT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (conferenceRecords/{id} -- give the id after the slash) or from space_get's data.activeConference.conferenceRecord.\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_PARTICIPANT_LIST_META, config as Record<string, unknown>, \"a conference's participants\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/space-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/space-create.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * Create meeting space — Create a new Google Meet space and get its join link.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/create\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 { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_SPACE_CREATE_KIND = \"@particle-academy/google_meet_space_create\";\nexport const GOOGLE_MEET_SPACE_CREATE_OPERATION = \"space_create\";\n\nexport const GOOGLE_MEET_SPACE_CREATE_META = googleMeetMeta(\"action\", \"a Meet space\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/create\");\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_MEET_SPACE_CREATE_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.name\",\n \"type\": \"string\",\n \"description\": \"The space's resource name, spaces/{id}.\"\n },\n {\n \"path\": \"data.meetingUri\",\n \"type\": \"string\",\n \"description\": \"The join link.\"\n },\n {\n \"path\": \"data.meetingCode\",\n \"type\": \"string\",\n \"description\": \"The short, human-typeable code shown in the Meet UI (part of meetingUri).\"\n },\n {\n \"path\": \"data.config.accessType\",\n \"type\": \"string\",\n \"description\": \"Echoes what was requested, or Google's default when omitted.\"\n },\n {\n \"path\": \"data.config.entryPointAccess\",\n \"type\": \"string\",\n \"description\": \"Echoes what was requested, or Google's default (ALL) when omitted.\"\n }\n];\n\nexport const googleMeetSpaceCreateKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_SPACE_CREATE_META, {\n name: GOOGLE_MEET_SPACE_CREATE_KIND,\n aliases: [\"google_meet_space_create\"],\n label: \"Create meeting space\",\n description: \"Create a new Google Meet space and get its join link.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"unsafe-to-replay\",\n outputShape: GOOGLE_MEET_SPACE_CREATE_OUTPUT,\n configSchema: [\n {\n \"type\": \"select\",\n \"key\": \"accessType\",\n \"label\": \"Who can join\",\n \"description\": \"OPEN: anyone with the link, no knock. TRUSTED: anyone in your organization, no knock; others knock. RESTRICTED: only people and groups explicitly invited. Leave blank for Google's account default.\",\n \"options\": [\n {\n \"value\": \"OPEN\",\n \"label\": \"Open — anyone with the link\"\n },\n {\n \"value\": \"TRUSTED\",\n \"label\": \"Trusted — your organization joins directly\"\n },\n {\n \"value\": \"RESTRICTED\",\n \"label\": \"Restricted — invited people and groups only\"\n }\n ]\n },\n {\n \"type\": \"select\",\n \"key\": \"entryPointAccess\",\n \"label\": \"Entry points\",\n \"description\": \"ALL: any Meet client (web, mobile, phone dial-in, the calling API). CREATOR_APP_ONLY: only the app that created the space, and only through the Meet REST API and SIP — no phone dial-in and no other Meet client. Leave blank for Google's default (ALL).\",\n \"options\": [\n {\n \"value\": \"ALL\",\n \"label\": \"All entry points\"\n },\n {\n \"value\": \"CREATOR_APP_ONLY\",\n \"label\": \"This app only\"\n }\n ]\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_SPACE_CREATE_META, config as Record<string, unknown>, \"a Meet space\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/space-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/space-get.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * Get meeting space — Read a Meet space's current state, including whether a\n * conference is active right now.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/get\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_SPACE_GET_KIND = \"@particle-academy/google_meet_space_get\";\nexport const GOOGLE_MEET_SPACE_GET_OPERATION = \"space_get\";\n\nexport const GOOGLE_MEET_SPACE_GET_META = googleMeetMeta(\"action\", \"a Meet space\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/spaces/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_MEET_SPACE_GET_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.name\",\n \"type\": \"string\",\n \"description\": \"The space's resource name, spaces/{id}.\"\n },\n {\n \"path\": \"data.meetingUri\",\n \"type\": \"string\",\n \"description\": \"The join link.\"\n },\n {\n \"path\": \"data.meetingCode\",\n \"type\": \"string\",\n \"description\": \"The short, human-typeable code.\"\n },\n {\n \"path\": \"data.config.accessType\",\n \"type\": \"string\",\n \"description\": \"OPEN, TRUSTED or RESTRICTED.\"\n },\n {\n \"path\": \"data.config.entryPointAccess\",\n \"type\": \"string\",\n \"description\": \"ALL or CREATOR_APP_ONLY.\"\n },\n {\n \"path\": \"data.activeConference.conferenceRecord\",\n \"type\": \"string\",\n \"description\": \"Present only while a conference is LIVE right now — the conferenceRecords/{id} resource name to read once it ends. Absent between meetings.\"\n }\n];\n\nexport const googleMeetSpaceGetKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_SPACE_GET_META, {\n name: GOOGLE_MEET_SPACE_GET_KIND,\n aliases: [\"google_meet_space_get\"],\n label: \"Get meeting space\",\n description: \"Read a Meet space's current state, including whether a conference is active right now.\",\n icon: \"🎥\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_SPACE_GET_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"spaceId\",\n \"label\": \"Space ID\",\n \"required\": true,\n \"description\": \"The id from space_create's data.name (spaces/{id} -- give the id after the slash), or the meeting code shown in Meet's own UI. NOT independently spot-checked that the meeting-code form resolves through this exact endpoint; verify with a live call before relying on it.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_SPACE_GET_META, config as Record<string, unknown>, \"a Meet space\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/transcript-entry-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/transcript-entry-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List transcript entries — Read a finished conference's transcript, one\n * utterance per entry.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts.entries/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_KIND = \"@particle-academy/google_meet_transcript_entry_list\";\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_OPERATION = \"transcript_entry_list\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META = googleMeetMeta(\"action\", \"transcript entries\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts.entries/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_MEET_TRANSCRIPT_ENTRY_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.transcriptEntries\",\n \"type\": \"array\",\n \"description\": \"This page's entries, in order. Each has name, participant (participants/{id} -- join against participant_list to get a display name), text (the spoken words), languageCode, startTime and endTime.\"\n },\n {\n \"path\": \"data.nextPageToken\",\n \"type\": \"string\",\n \"description\": \"Present when there is another page.\"\n }\n];\n\nexport const googleMeetTranscriptEntryListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META, {\n name: GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_KIND,\n aliases: [\"google_meet_transcript_entry_list\"],\n label: \"List transcript entries\",\n description: \"Read a finished conference's transcript, one utterance per entry.\",\n icon: \"📝\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (give the id after conferenceRecords/).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"transcriptId\",\n \"label\": \"Transcript ID\",\n \"required\": true,\n \"description\": \"The id from transcript_list's data.transcripts[].name (give the id after transcripts/).\"\n },\n {\n \"type\": \"text\",\n \"key\": \"pageToken\",\n \"label\": \"Page token\",\n \"description\": \"From a previous call's data.nextPageToken.\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_TRANSCRIPT_ENTRY_LIST_META, config as Record<string, unknown>, \"transcript entries\"),\n});\n","/**\n * GENERATED FILE — do not edit.\n *\n * Emitted from provider/actions/transcript-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/transcript-list.json (or weaver's template/) and regenerate:\n *\n * npm run provider -- google_meet\n */\n\n/**\n * List transcripts — List a finished conference's transcripts, when\n * transcription was on.\n *\n * https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts/list\n */\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { defineConnectorKind, summarize, type OutputField } from \"@particle-academy/fancy-flow/connectors\";\nimport { googleMeetMeta } from \"../service.js\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_KIND = \"@particle-academy/google_meet_transcript_list\";\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_OPERATION = \"transcript_list\";\n\nexport const GOOGLE_MEET_TRANSCRIPT_LIST_META = googleMeetMeta(\"action\", \"a conference's transcripts\", \"https://developers.google.com/workspace/meet/api/reference/rest/v2/conferenceRecords.transcripts/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_MEET_TRANSCRIPT_LIST_OUTPUT: OutputField[] = [\n {\n \"path\": \"data.transcripts\",\n \"type\": \"array\",\n \"description\": \"Usually one, unless the meeting was recorded in segments. Each has name (…/transcripts/{id} -- what transcript_entry_list needs), state, startTime, endTime, and docsDestination.exportUri (a Google Docs link, when export finished).\"\n }\n];\n\nexport const googleMeetTranscriptListKind: NodeKindDefinition = defineConnectorKind(GOOGLE_MEET_TRANSCRIPT_LIST_META, {\n name: GOOGLE_MEET_TRANSCRIPT_LIST_KIND,\n aliases: [\"google_meet_transcript_list\"],\n label: \"List transcripts\",\n description: \"List a finished conference's transcripts, when transcription was on.\",\n icon: \"📝\",\n inputs: [{ id: \"in\" }],\n outputs: [{ id: \"out\" }],\n sideEffects: \"none\",\n outputShape: GOOGLE_MEET_TRANSCRIPT_LIST_OUTPUT,\n configSchema: [\n {\n \"type\": \"text\",\n \"key\": \"conferenceRecordId\",\n \"label\": \"Conference record ID\",\n \"required\": true,\n \"description\": \"The id from conference_record_list's data.conferenceRecords[].name (conferenceRecords/{id} -- give the id after the slash).\"\n }\n ],\n defaultConfig: {\n \"mode\": \"auto\"\n },\n renderBody: ({ config }) =>\n summarize(GOOGLE_MEET_TRANSCRIPT_LIST_META, config as Record<string, unknown>, \"a conference's transcripts\"),\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_meet\n */\n\n/**\n * Google Meet'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/conference-record-list.js\";\nexport * from \"./kinds/participant-list.js\";\nexport * from \"./kinds/space-create.js\";\nexport * from \"./kinds/space-get.js\";\nexport * from \"./kinds/transcript-entry-list.js\";\nexport * from \"./kinds/transcript-list.js\";\n\nimport type { NodeKindDefinition } from \"@particle-academy/fancy-flow/engine\";\nimport { googleMeetConferenceRecordListKind } from \"./kinds/conference-record-list.js\";\nimport { googleMeetParticipantListKind } from \"./kinds/participant-list.js\";\nimport { googleMeetSpaceCreateKind } from \"./kinds/space-create.js\";\nimport { googleMeetSpaceGetKind } from \"./kinds/space-get.js\";\nimport { googleMeetTranscriptEntryListKind } from \"./kinds/transcript-entry-list.js\";\nimport { googleMeetTranscriptListKind } from \"./kinds/transcript-list.js\";\n\n/** Every Google Meet kind, for a host that registers the lot. */\nexport const GOOGLE_MEET_KINDS: NodeKindDefinition[] = [\n googleMeetConferenceRecordListKind,\n googleMeetParticipantListKind,\n googleMeetSpaceCreateKind,\n googleMeetSpaceGetKind,\n googleMeetTranscriptEntryListKind,\n googleMeetTranscriptListKind,\n];\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@particle-academy/google-meet-ui",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Google Meet'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",