gws-axi 0.16.2 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/src/commands/calendar/conference.d.ts +61 -0
- package/dist/src/commands/calendar/conference.js +112 -0
- package/dist/src/commands/calendar/conference.js.map +1 -0
- package/dist/src/commands/calendar/conference.test.d.ts +1 -0
- package/dist/src/commands/calendar/conference.test.js +170 -0
- package/dist/src/commands/calendar/conference.test.js.map +1 -0
- package/dist/src/commands/calendar/events.d.ts +1 -1
- package/dist/src/commands/calendar/events.js +43 -2
- package/dist/src/commands/calendar/events.js.map +1 -1
- package/dist/src/commands/calendar/get.d.ts +1 -1
- package/dist/src/commands/calendar/get.js +35 -0
- package/dist/src/commands/calendar/get.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -120,7 +120,8 @@ gws-axi doctor # prerequisites + setup + live API prob
|
|
|
120
120
|
gws-axi calendar events # upcoming 7 days on primary
|
|
121
121
|
gws-axi calendar events --from 2026-04-20T00:00 --to 2026-04-27T00:00
|
|
122
122
|
gws-axi calendar events --fields attendees,location,status
|
|
123
|
-
gws-axi calendar
|
|
123
|
+
gws-axi calendar events --fields join_url,conference # provider-uniform join link (Meet/Zoom/Teams/Webex)
|
|
124
|
+
gws-axi calendar get <event-id> # full detail + attendees + conference block
|
|
124
125
|
gws-axi calendar get <event-id> --full # don't truncate description
|
|
125
126
|
gws-axi calendar calendars # list calendars accessible to this account
|
|
126
127
|
gws-axi calendar search --query "standup" # primary calendar by default
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { calendar_v3 } from "googleapis";
|
|
2
|
+
/**
|
|
3
|
+
* Conferencing / join-URL resolution for calendar events.
|
|
4
|
+
*
|
|
5
|
+
* Google populates the structured `conferenceData` object ONLY when the
|
|
6
|
+
* conference was created through a Google-Calendar-integrated path — native
|
|
7
|
+
* Google Meet, or a third-party add-on installed *in Google Calendar* (e.g.
|
|
8
|
+
* the Zoom-for-GSuite add-on). A Teams/Zoom/Webex meeting that is organized
|
|
9
|
+
* externally and merely *synced onto* the calendar via invite arrives as a
|
|
10
|
+
* plain event: `location` gets a human label ("Microsoft Teams Meeting"), the
|
|
11
|
+
* join URL lands in the `description` body, and `conferenceData` stays null.
|
|
12
|
+
*
|
|
13
|
+
* So a genuinely provider-uniform join URL needs a resolution chain, not a
|
|
14
|
+
* single field:
|
|
15
|
+
* 1. conferenceData video entryPoint uri (Meet + add-on Zoom/Teams/Webex)
|
|
16
|
+
* 2. hangoutLink (legacy Meet, pre-conferenceData)
|
|
17
|
+
* 3. provider-anchored URL scraped from description, then location
|
|
18
|
+
* (externally-organized meetings)
|
|
19
|
+
*
|
|
20
|
+
* The `source` field discloses which link won so a consumer can trust a
|
|
21
|
+
* structured hit and treat a scraped one as best-effort
|
|
22
|
+
* ([principles.md#surface-completeness-limits]).
|
|
23
|
+
*/
|
|
24
|
+
export type ConferenceSource = "conferenceData" | "hangoutLink" | "description" | "location";
|
|
25
|
+
export interface ConferenceEntryPoint {
|
|
26
|
+
type: string;
|
|
27
|
+
uri: string;
|
|
28
|
+
label: string;
|
|
29
|
+
}
|
|
30
|
+
export interface ConferenceInfo {
|
|
31
|
+
/** Provider label, e.g. "Google Meet" / "Zoom" / "Microsoft Teams" / "Webex". "" if unknown. */
|
|
32
|
+
provider: string;
|
|
33
|
+
/** Best single tappable join URL. "" when none could be resolved. */
|
|
34
|
+
joinUrl: string;
|
|
35
|
+
/** Which path in the resolution chain produced `joinUrl`. "" when joinUrl is "". */
|
|
36
|
+
source: ConferenceSource | "";
|
|
37
|
+
/** Structured entry points from conferenceData (video/phone/sip/more). Empty when absent. */
|
|
38
|
+
entryPoints: ConferenceEntryPoint[];
|
|
39
|
+
/** True when `joinUrl` came from a description/location text scrape (best-effort, unverified). */
|
|
40
|
+
fromScrape: boolean;
|
|
41
|
+
}
|
|
42
|
+
/** Identify the conferencing provider from a join URL's host. "" if unrecognized. */
|
|
43
|
+
export declare function detectProvider(url: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Find the first provider-anchored join URL in a block of free text.
|
|
46
|
+
* Returns the leftmost match across all provider patterns (so the "Join: <url>"
|
|
47
|
+
* line near the top of a Teams/Zoom boilerplate block wins over deeper links),
|
|
48
|
+
* or null when nothing matches.
|
|
49
|
+
*/
|
|
50
|
+
export declare function scrapeJoinUrl(text: string): {
|
|
51
|
+
provider: string;
|
|
52
|
+
url: string;
|
|
53
|
+
} | null;
|
|
54
|
+
/**
|
|
55
|
+
* Normalize an event's conferencing into a provider-uniform shape by walking
|
|
56
|
+
* the resolution chain (structured → hangoutLink → description/location scrape).
|
|
57
|
+
* Returns null when the event carries no conferencing signal at all.
|
|
58
|
+
*/
|
|
59
|
+
export declare function extractConference(event: calendar_v3.Schema$Event): ConferenceInfo | null;
|
|
60
|
+
/** Best single tappable join URL for an event, or "" when none resolves. */
|
|
61
|
+
export declare function resolveJoinUrl(event: calendar_v3.Schema$Event): string;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const PROVIDER_PATTERNS = [
|
|
2
|
+
{ provider: "Google Meet", re: /https:\/\/meet\.google\.com\/[a-z0-9-]+/i },
|
|
3
|
+
{ provider: "Zoom", re: /https:\/\/[\w.-]*zoom\.us\/(?:j|w|my)\/[^\s<>"]+/i },
|
|
4
|
+
{
|
|
5
|
+
provider: "Microsoft Teams",
|
|
6
|
+
re: /https:\/\/teams\.(?:microsoft|live)\.com\/(?:meet|l\/meetup-join)\/[^\s<>"]+/i,
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
provider: "Webex",
|
|
10
|
+
re: /https:\/\/[\w.-]*webex\.com\/(?:meet\/[^\s<>"]+|[^\s<>"/]+\/j\.php\?[^\s<>"]+)/i,
|
|
11
|
+
},
|
|
12
|
+
];
|
|
13
|
+
/** Identify the conferencing provider from a join URL's host. "" if unrecognized. */
|
|
14
|
+
export function detectProvider(url) {
|
|
15
|
+
if (/meet\.google\.com/i.test(url))
|
|
16
|
+
return "Google Meet";
|
|
17
|
+
if (/zoom\.us/i.test(url))
|
|
18
|
+
return "Zoom";
|
|
19
|
+
if (/teams\.(?:microsoft|live)\.com/i.test(url))
|
|
20
|
+
return "Microsoft Teams";
|
|
21
|
+
if (/webex\.com/i.test(url))
|
|
22
|
+
return "Webex";
|
|
23
|
+
return "";
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Find the first provider-anchored join URL in a block of free text.
|
|
27
|
+
* Returns the leftmost match across all provider patterns (so the "Join: <url>"
|
|
28
|
+
* line near the top of a Teams/Zoom boilerplate block wins over deeper links),
|
|
29
|
+
* or null when nothing matches.
|
|
30
|
+
*/
|
|
31
|
+
export function scrapeJoinUrl(text) {
|
|
32
|
+
if (!text)
|
|
33
|
+
return null;
|
|
34
|
+
let best = null;
|
|
35
|
+
for (const { provider, re } of PROVIDER_PATTERNS) {
|
|
36
|
+
const m = re.exec(text);
|
|
37
|
+
if (m && (best === null || m.index < best.index)) {
|
|
38
|
+
best = { provider, url: m[0], index: m.index };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return best ? { provider: best.provider, url: best.url } : null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Normalize an event's conferencing into a provider-uniform shape by walking
|
|
45
|
+
* the resolution chain (structured → hangoutLink → description/location scrape).
|
|
46
|
+
* Returns null when the event carries no conferencing signal at all.
|
|
47
|
+
*/
|
|
48
|
+
export function extractConference(event) {
|
|
49
|
+
const cd = event.conferenceData;
|
|
50
|
+
const entryPoints = (cd?.entryPoints ?? []).map((ep) => ({
|
|
51
|
+
type: ep.entryPointType ?? "",
|
|
52
|
+
uri: ep.uri ?? "",
|
|
53
|
+
label: ep.label ?? "",
|
|
54
|
+
}));
|
|
55
|
+
// 1. Structured conferenceData video entry point — the correct source when present.
|
|
56
|
+
const videoEp = entryPoints.find((ep) => ep.type === "video" && ep.uri);
|
|
57
|
+
if (videoEp) {
|
|
58
|
+
return {
|
|
59
|
+
provider: cd?.conferenceSolution?.name ?? detectProvider(videoEp.uri),
|
|
60
|
+
joinUrl: videoEp.uri,
|
|
61
|
+
source: "conferenceData",
|
|
62
|
+
entryPoints,
|
|
63
|
+
fromScrape: false,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// 2. Legacy Meet hangoutLink (predates conferenceData; Meet-only).
|
|
67
|
+
const hangoutLink = event.hangoutLink ?? "";
|
|
68
|
+
if (hangoutLink) {
|
|
69
|
+
return {
|
|
70
|
+
provider: cd?.conferenceSolution?.name ?? "Google Meet",
|
|
71
|
+
joinUrl: hangoutLink,
|
|
72
|
+
source: "hangoutLink",
|
|
73
|
+
entryPoints,
|
|
74
|
+
fromScrape: false,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// 3. Scrape the description, then the location — externally-organized
|
|
78
|
+
// Teams/Zoom/Webex meetings put the URL here with no conferenceData.
|
|
79
|
+
const scrapeTargets = [
|
|
80
|
+
["description", event.description],
|
|
81
|
+
["location", event.location],
|
|
82
|
+
];
|
|
83
|
+
for (const [src, text] of scrapeTargets) {
|
|
84
|
+
const hit = scrapeJoinUrl(text ?? "");
|
|
85
|
+
if (hit) {
|
|
86
|
+
return {
|
|
87
|
+
provider: hit.provider,
|
|
88
|
+
joinUrl: hit.url,
|
|
89
|
+
source: src,
|
|
90
|
+
entryPoints,
|
|
91
|
+
fromScrape: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// conferenceData present but no usable video link (e.g. phone-only) and no
|
|
96
|
+
// scrape hit — surface the provider, but there's no join URL to give.
|
|
97
|
+
if (cd || entryPoints.length) {
|
|
98
|
+
return {
|
|
99
|
+
provider: cd?.conferenceSolution?.name ?? "",
|
|
100
|
+
joinUrl: "",
|
|
101
|
+
source: "",
|
|
102
|
+
entryPoints,
|
|
103
|
+
fromScrape: false,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/** Best single tappable join URL for an event, or "" when none resolves. */
|
|
109
|
+
export function resolveJoinUrl(event) {
|
|
110
|
+
return extractConference(event)?.joinUrl ?? "";
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=conference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conference.js","sourceRoot":"","sources":["../../../../src/commands/calendar/conference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { detectProvider, extractConference, resolveJoinUrl, scrapeJoinUrl } from "./conference.js";
|
|
3
|
+
// Real-shape fixtures drawn from live Calendar API responses (Meet + a
|
|
4
|
+
// Teams meeting synced in from Outlook whose join URL is description-only).
|
|
5
|
+
const meetEvent = {
|
|
6
|
+
summary: "Delivery Team Meeting",
|
|
7
|
+
hangoutLink: "https://meet.google.com/nqb-ptqo-koj",
|
|
8
|
+
conferenceData: {
|
|
9
|
+
entryPoints: [
|
|
10
|
+
{
|
|
11
|
+
entryPointType: "video",
|
|
12
|
+
uri: "https://meet.google.com/nqb-ptqo-koj",
|
|
13
|
+
label: "meet.google.com/nqb-ptqo-koj",
|
|
14
|
+
},
|
|
15
|
+
{ entryPointType: "more", uri: "https://tel.meet/nqb-ptqo-koj?pin=9984343524328" },
|
|
16
|
+
{
|
|
17
|
+
entryPointType: "phone",
|
|
18
|
+
uri: "tel:+1-470-268-2857",
|
|
19
|
+
label: "+1 470-268-2857",
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
conferenceSolution: { key: { type: "hangoutsMeet" }, name: "Google Meet" },
|
|
23
|
+
conferenceId: "nqb-ptqo-koj",
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const teamsSyncedEvent = {
|
|
27
|
+
summary: "Transit Data - Weekly Sync",
|
|
28
|
+
location: "Microsoft Teams Meeting",
|
|
29
|
+
// No hangoutLink, no conferenceData — join URL lives only in the body.
|
|
30
|
+
description: [
|
|
31
|
+
"Team,",
|
|
32
|
+
"",
|
|
33
|
+
"________________________________________________________________________________",
|
|
34
|
+
"Microsoft Teams meeting",
|
|
35
|
+
"Join: https://teams.microsoft.com/meet/23594392319690?p=8e5nhXSwJy8vtRgHXo",
|
|
36
|
+
"Meeting ID: 235 943 923 196 90",
|
|
37
|
+
"________________________________",
|
|
38
|
+
"System reference<https://teams.microsoft.com/l/meetup-join/19%3ameeting_abc%40thread.v2/0?context=x>",
|
|
39
|
+
"Dial in by phone",
|
|
40
|
+
"+1 206-485-1387,,477344212# United States, Seattle",
|
|
41
|
+
].join("\n"),
|
|
42
|
+
};
|
|
43
|
+
describe("detectProvider", () => {
|
|
44
|
+
it("identifies each supported provider from a URL host", () => {
|
|
45
|
+
expect(detectProvider("https://meet.google.com/nqb-ptqo-koj")).toBe("Google Meet");
|
|
46
|
+
expect(detectProvider("https://us02web.zoom.us/j/123456789")).toBe("Zoom");
|
|
47
|
+
expect(detectProvider("https://teams.microsoft.com/meet/2359")).toBe("Microsoft Teams");
|
|
48
|
+
expect(detectProvider("https://teams.live.com/meet/9988")).toBe("Microsoft Teams");
|
|
49
|
+
expect(detectProvider("https://acme.webex.com/meet/room")).toBe("Webex");
|
|
50
|
+
});
|
|
51
|
+
it("returns empty string for an unrecognized host", () => {
|
|
52
|
+
expect(detectProvider("https://example.com/join/x")).toBe("");
|
|
53
|
+
expect(detectProvider("")).toBe("");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("scrapeJoinUrl", () => {
|
|
57
|
+
it("extracts a Teams join URL from boilerplate, preferring the /meet/ link over /l/meetup-join/", () => {
|
|
58
|
+
const hit = scrapeJoinUrl(teamsSyncedEvent.description ?? "");
|
|
59
|
+
expect(hit).toEqual({
|
|
60
|
+
provider: "Microsoft Teams",
|
|
61
|
+
url: "https://teams.microsoft.com/meet/23594392319690?p=8e5nhXSwJy8vtRgHXo",
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
it("stops the URL at whitespace and does not swallow a trailing angle bracket", () => {
|
|
65
|
+
const hit = scrapeJoinUrl("reference<https://teams.microsoft.com/l/meetup-join/19%3ameeting_abc%40thread.v2/0> more");
|
|
66
|
+
expect(hit?.url).toBe("https://teams.microsoft.com/l/meetup-join/19%3ameeting_abc%40thread.v2/0");
|
|
67
|
+
});
|
|
68
|
+
it("matches Zoom and Webex join URLs", () => {
|
|
69
|
+
expect(scrapeJoinUrl("please join https://us02web.zoom.us/j/8912345?pwd=abc now")).toEqual({
|
|
70
|
+
provider: "Zoom",
|
|
71
|
+
url: "https://us02web.zoom.us/j/8912345?pwd=abc",
|
|
72
|
+
});
|
|
73
|
+
expect(scrapeJoinUrl("link: https://acme.webex.com/meet/pr123 end")).toEqual({
|
|
74
|
+
provider: "Webex",
|
|
75
|
+
url: "https://acme.webex.com/meet/pr123",
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
it("returns null when no known provider URL is present", () => {
|
|
79
|
+
expect(scrapeJoinUrl("just some notes, no meeting link here")).toBeNull();
|
|
80
|
+
expect(scrapeJoinUrl("https://example.com/random")).toBeNull();
|
|
81
|
+
expect(scrapeJoinUrl("")).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe("extractConference — resolution chain", () => {
|
|
85
|
+
it("prefers the structured conferenceData video entry point (Meet)", () => {
|
|
86
|
+
const c = extractConference(meetEvent);
|
|
87
|
+
expect(c).not.toBeNull();
|
|
88
|
+
expect(c?.source).toBe("conferenceData");
|
|
89
|
+
expect(c?.provider).toBe("Google Meet");
|
|
90
|
+
expect(c?.joinUrl).toBe("https://meet.google.com/nqb-ptqo-koj");
|
|
91
|
+
expect(c?.fromScrape).toBe(false);
|
|
92
|
+
expect(c?.entryPoints).toHaveLength(3);
|
|
93
|
+
expect(c?.entryPoints[0]).toEqual({
|
|
94
|
+
type: "video",
|
|
95
|
+
uri: "https://meet.google.com/nqb-ptqo-koj",
|
|
96
|
+
label: "meet.google.com/nqb-ptqo-koj",
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
it("falls back to hangoutLink when conferenceData is absent (legacy Meet)", () => {
|
|
100
|
+
const c = extractConference({ hangoutLink: "https://meet.google.com/abc-defg-hij" });
|
|
101
|
+
expect(c?.source).toBe("hangoutLink");
|
|
102
|
+
expect(c?.provider).toBe("Google Meet");
|
|
103
|
+
expect(c?.joinUrl).toBe("https://meet.google.com/abc-defg-hij");
|
|
104
|
+
expect(c?.fromScrape).toBe(false);
|
|
105
|
+
expect(c?.entryPoints).toHaveLength(0);
|
|
106
|
+
});
|
|
107
|
+
it("scrapes the description for externally-organized Teams meetings (no conferenceData)", () => {
|
|
108
|
+
const c = extractConference(teamsSyncedEvent);
|
|
109
|
+
expect(c?.source).toBe("description");
|
|
110
|
+
expect(c?.provider).toBe("Microsoft Teams");
|
|
111
|
+
expect(c?.joinUrl).toBe("https://teams.microsoft.com/meet/23594392319690?p=8e5nhXSwJy8vtRgHXo");
|
|
112
|
+
expect(c?.fromScrape).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
it("scrapes the location when the description has no link", () => {
|
|
115
|
+
const c = extractConference({
|
|
116
|
+
location: "Join here https://us02web.zoom.us/j/555?pwd=z",
|
|
117
|
+
description: "no link in the body",
|
|
118
|
+
});
|
|
119
|
+
expect(c?.source).toBe("location");
|
|
120
|
+
expect(c?.provider).toBe("Zoom");
|
|
121
|
+
expect(c?.joinUrl).toBe("https://us02web.zoom.us/j/555?pwd=z");
|
|
122
|
+
expect(c?.fromScrape).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it("structured data wins even when the description also contains a link", () => {
|
|
125
|
+
const c = extractConference({
|
|
126
|
+
...meetEvent,
|
|
127
|
+
description: "backup https://us02web.zoom.us/j/999",
|
|
128
|
+
});
|
|
129
|
+
expect(c?.source).toBe("conferenceData");
|
|
130
|
+
expect(c?.joinUrl).toBe("https://meet.google.com/nqb-ptqo-koj");
|
|
131
|
+
});
|
|
132
|
+
it("scrapes when conferenceData has only phone entry points (no video)", () => {
|
|
133
|
+
const c = extractConference({
|
|
134
|
+
conferenceData: {
|
|
135
|
+
entryPoints: [{ entryPointType: "phone", uri: "tel:+1-206-555-0100" }],
|
|
136
|
+
conferenceSolution: { name: "Zoom" },
|
|
137
|
+
},
|
|
138
|
+
description: "video link: https://us02web.zoom.us/j/42",
|
|
139
|
+
});
|
|
140
|
+
expect(c?.source).toBe("description");
|
|
141
|
+
expect(c?.joinUrl).toBe("https://us02web.zoom.us/j/42");
|
|
142
|
+
// structured phone entry point still rides along
|
|
143
|
+
expect(c?.entryPoints).toHaveLength(1);
|
|
144
|
+
});
|
|
145
|
+
it("surfaces the provider with an empty joinUrl when conferenceData has no usable link and nothing scrapes", () => {
|
|
146
|
+
const c = extractConference({
|
|
147
|
+
conferenceData: {
|
|
148
|
+
entryPoints: [{ entryPointType: "phone", uri: "tel:+1-206-555-0100" }],
|
|
149
|
+
conferenceSolution: { name: "Webex" },
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
expect(c?.provider).toBe("Webex");
|
|
153
|
+
expect(c?.joinUrl).toBe("");
|
|
154
|
+
expect(c?.source).toBe("");
|
|
155
|
+
});
|
|
156
|
+
it("returns null for an event with no conferencing signal at all", () => {
|
|
157
|
+
expect(extractConference({ summary: "Office" })).toBeNull();
|
|
158
|
+
expect(extractConference({ summary: "x", description: "no meeting link" })).toBeNull();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe("resolveJoinUrl", () => {
|
|
162
|
+
it("returns the best join URL across the chain", () => {
|
|
163
|
+
expect(resolveJoinUrl(meetEvent)).toBe("https://meet.google.com/nqb-ptqo-koj");
|
|
164
|
+
expect(resolveJoinUrl(teamsSyncedEvent)).toBe("https://teams.microsoft.com/meet/23594392319690?p=8e5nhXSwJy8vtRgHXo");
|
|
165
|
+
});
|
|
166
|
+
it("returns empty string when nothing resolves", () => {
|
|
167
|
+
expect(resolveJoinUrl({ summary: "Office" })).toBe("");
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=conference.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conference.test.js","sourceRoot":"","sources":["../../../../src/commands/calendar/conference.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const EVENTS_HELP = "usage: gws-axi calendar events [flags]\nflags[8]:\n --calendar <id> Calendar to query (default: \"primary\")\n --from <iso> Earliest event start (default: now)\n --to <iso> Latest event start (default: 7 days from now)\n --limit <n> Max events to return (default: 100, max: 2500)\n --query <text> Full-text search across summary/description/location/attendees\n --single-events Expand recurring events into individual instances (default: true)\n --fields <list> Extra columns: status, organizer, location, attendees, description, htmlLink, hangoutLink\n --account <email> Account override when 2+ are configured\nexamples:\n gws-axi calendar events\n gws-axi calendar events --from 2026-04-20T00:00 --to 2026-04-21T00:00\n gws-axi calendar events --calendar team@jarv.us --limit 50\n gws-axi calendar events --query standup\n gws-axi calendar events --fields status,attendees,location\ntime formats:\n Timed events: ISO 8601 with offset \u2014 2026-04-20T14:00:00-04:00\n Local time: 2026-04-20T14:00 (interpreted as local tz)\n Date-only: 2026-04-20 (midnight local)\noutput note:\n The start/end columns use datetime (with offset) for timed events\n and date-only strings for all-day events. Agents parsing these\n columns must handle both formats.\ndefault columns:\n id, summary, start, end, my_response (your responseStatus if you're\n an attendee; blank for self-organized events with no attendee list),\n attachments (compact count; \"(N Docs)\" suffix when meeting notes /\n Gemini Notes Docs are attached \u2014 chase any with `calendar get <id>`\n to see file_ids and hand off to `docs read`).\n status column suppressed by default (most events are \"confirmed\" \u2014\n add --fields status to see cancelled/tentative).\n";
|
|
1
|
+
export declare const EVENTS_HELP = "usage: gws-axi calendar events [flags]\nflags[8]:\n --calendar <id> Calendar to query (default: \"primary\")\n --from <iso> Earliest event start (default: now)\n --to <iso> Latest event start (default: 7 days from now)\n --limit <n> Max events to return (default: 100, max: 2500)\n --query <text> Full-text search across summary/description/location/attendees\n --single-events Expand recurring events into individual instances (default: true)\n --fields <list> Extra columns: status, organizer, location, attendees, description, htmlLink, hangoutLink, join_url, conference, conference_source\n --account <email> Account override when 2+ are configured\nexamples:\n gws-axi calendar events\n gws-axi calendar events --from 2026-04-20T00:00 --to 2026-04-21T00:00\n gws-axi calendar events --calendar team@jarv.us --limit 50\n gws-axi calendar events --query standup\n gws-axi calendar events --fields status,attendees,location\n gws-axi calendar events --fields join_url,conference\ntime formats:\n Timed events: ISO 8601 with offset \u2014 2026-04-20T14:00:00-04:00\n Local time: 2026-04-20T14:00 (interpreted as local tz)\n Date-only: 2026-04-20 (midnight local)\noutput note:\n The start/end columns use datetime (with offset) for timed events\n and date-only strings for all-day events. Agents parsing these\n columns must handle both formats.\ndefault columns:\n id, summary, start, end, my_response (your responseStatus if you're\n an attendee; blank for self-organized events with no attendee list),\n attachments (compact count; \"(N Docs)\" suffix when meeting notes /\n Gemini Notes Docs are attached \u2014 chase any with `calendar get <id>`\n to see file_ids and hand off to `docs read`).\n status column suppressed by default (most events are \"confirmed\" \u2014\n add --fields status to see cancelled/tentative).\nconferencing:\n --fields join_url provider-uniform join link \u2014 resolves from\n structured conferenceData (Meet + Calendar add-on\n Zoom/Teams/Webex), then hangoutLink, then a\n provider-anchored URL scraped from the description\n or location (externally-organized Teams/Zoom/Webex\n meetings carry no conferenceData).\n --fields conference provider label (Google Meet / Zoom / Microsoft\n Teams / Webex).\n --fields conference_source where join_url came from: conferenceData |\n hangoutLink | description | location. A\n description/location value means a best-effort\n scrape \u2014 verify before use.\n";
|
|
2
2
|
export declare function calendarEventsCommand(account: string, args: string[]): Promise<string>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AxiError } from "axi-sdk-js";
|
|
2
2
|
import { calendarClient, translateGoogleError } from "../../google/client.js";
|
|
3
|
-
import { field, mapEnum, pluck, renderListResponse, truncated, } from "../../output/index.js";
|
|
3
|
+
import { computed, field, mapEnum, pluck, renderListResponse, truncated, } from "../../output/index.js";
|
|
4
|
+
import { extractConference, resolveJoinUrl } from "./conference.js";
|
|
4
5
|
import { parseDateishFlag } from "./dateish.js";
|
|
5
6
|
export const EVENTS_HELP = `usage: gws-axi calendar events [flags]
|
|
6
7
|
flags[8]:
|
|
@@ -10,7 +11,7 @@ flags[8]:
|
|
|
10
11
|
--limit <n> Max events to return (default: 100, max: 2500)
|
|
11
12
|
--query <text> Full-text search across summary/description/location/attendees
|
|
12
13
|
--single-events Expand recurring events into individual instances (default: true)
|
|
13
|
-
--fields <list> Extra columns: status, organizer, location, attendees, description, htmlLink, hangoutLink
|
|
14
|
+
--fields <list> Extra columns: status, organizer, location, attendees, description, htmlLink, hangoutLink, join_url, conference, conference_source
|
|
14
15
|
--account <email> Account override when 2+ are configured
|
|
15
16
|
examples:
|
|
16
17
|
gws-axi calendar events
|
|
@@ -18,6 +19,7 @@ examples:
|
|
|
18
19
|
gws-axi calendar events --calendar team@jarv.us --limit 50
|
|
19
20
|
gws-axi calendar events --query standup
|
|
20
21
|
gws-axi calendar events --fields status,attendees,location
|
|
22
|
+
gws-axi calendar events --fields join_url,conference
|
|
21
23
|
time formats:
|
|
22
24
|
Timed events: ISO 8601 with offset — 2026-04-20T14:00:00-04:00
|
|
23
25
|
Local time: 2026-04-20T14:00 (interpreted as local tz)
|
|
@@ -34,6 +36,19 @@ default columns:
|
|
|
34
36
|
to see file_ids and hand off to \`docs read\`).
|
|
35
37
|
status column suppressed by default (most events are "confirmed" —
|
|
36
38
|
add --fields status to see cancelled/tentative).
|
|
39
|
+
conferencing:
|
|
40
|
+
--fields join_url provider-uniform join link — resolves from
|
|
41
|
+
structured conferenceData (Meet + Calendar add-on
|
|
42
|
+
Zoom/Teams/Webex), then hangoutLink, then a
|
|
43
|
+
provider-anchored URL scraped from the description
|
|
44
|
+
or location (externally-organized Teams/Zoom/Webex
|
|
45
|
+
meetings carry no conferenceData).
|
|
46
|
+
--fields conference provider label (Google Meet / Zoom / Microsoft
|
|
47
|
+
Teams / Webex).
|
|
48
|
+
--fields conference_source where join_url came from: conferenceData |
|
|
49
|
+
hangoutLink | description | location. A
|
|
50
|
+
description/location value means a best-effort
|
|
51
|
+
scrape — verify before use.
|
|
37
52
|
`;
|
|
38
53
|
function parseEventsFlags(args) {
|
|
39
54
|
const flags = {
|
|
@@ -175,6 +190,22 @@ function schemaWithExtras(extras) {
|
|
|
175
190
|
case "hangoutLink":
|
|
176
191
|
base.push(field("hangoutLink"));
|
|
177
192
|
break;
|
|
193
|
+
case "join_url":
|
|
194
|
+
// Provider-uniform tappable join link. Resolution chain (structured →
|
|
195
|
+
// hangoutLink → description/location scrape) lives in conference.ts;
|
|
196
|
+
// resolves Teams/Zoom/Webex meetings that carry no conferenceData.
|
|
197
|
+
base.push(computed("join_url", (item) => resolveJoinUrl(item)));
|
|
198
|
+
break;
|
|
199
|
+
case "conference":
|
|
200
|
+
// Provider label (Google Meet / Zoom / Microsoft Teams / Webex).
|
|
201
|
+
base.push(computed("conference", (item) => extractConference(item)?.provider ?? ""));
|
|
202
|
+
break;
|
|
203
|
+
case "conference_source":
|
|
204
|
+
// Which path resolved join_url: conferenceData | hangoutLink |
|
|
205
|
+
// description | location. Lets a consumer trust a structured hit and
|
|
206
|
+
// treat a description/location scrape as best-effort.
|
|
207
|
+
base.push(computed("conference_source", (item) => extractConference(item)?.source ?? ""));
|
|
208
|
+
break;
|
|
178
209
|
default:
|
|
179
210
|
// Unknown field — skip silently rather than error. Keeps --fields
|
|
180
211
|
// lenient (user doesn't need to know exact field names).
|
|
@@ -243,6 +274,16 @@ export async function calendarEventsCommand(account, args) {
|
|
|
243
274
|
if (flags.calendar === "primary") {
|
|
244
275
|
suggestions.push(`Query a different calendar with \`--calendar <id>\` (list them with \`gws-axi calendar calendars\`)`);
|
|
245
276
|
}
|
|
277
|
+
// Disclose when any join_url was scraped from description/location text
|
|
278
|
+
// rather than read from structured conferenceData — the scrape is
|
|
279
|
+
// provider-anchored but best-effort, so a consumer should verify.
|
|
280
|
+
const conferenceRequested = flags.extraFields.some((f) => ["join_url", "conference", "conference_source"].includes(f));
|
|
281
|
+
if (conferenceRequested) {
|
|
282
|
+
const scraped = items.filter((it) => extractConference(it)?.fromScrape).length;
|
|
283
|
+
if (scraped > 0) {
|
|
284
|
+
suggestions.push(`${scraped} join_url${scraped === 1 ? "" : "s"} scraped from event description/location text (no structured conferenceData) — verify before use`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
246
287
|
}
|
|
247
288
|
else {
|
|
248
289
|
// Empty-result-specific hints — don't recycle the general ones above.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/commands/calendar/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EACL,KAAK,EACL,OAAO,EACP,KAAK,EACL,kBAAkB,EAClB,SAAS,GAEV,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/commands/calendar/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const GET_HELP = "usage: gws-axi calendar get <event-id> [flags]\nargs[1]:\n <event-id> Event ID (from `calendar events` output)\nflags[3]:\n --calendar <id> Calendar containing the event (default: \"primary\")\n --full Don't truncate description / attendee list\n --account <email> Account override when 2+ are configured\nexamples:\n gws-axi calendar get abc_123 --calendar primary\n gws-axi calendar get abc_123 --full\noutput:\n Event metadata (summary, start/end, status, creator, organizer,\n location, hangout link, htmlLink) plus the attendee list with each\n person's response status. Description is truncated to 500 chars by\n default \u2014 use --full to see the complete body.\n";
|
|
1
|
+
export declare const GET_HELP = "usage: gws-axi calendar get <event-id> [flags]\nargs[1]:\n <event-id> Event ID (from `calendar events` output)\nflags[3]:\n --calendar <id> Calendar containing the event (default: \"primary\")\n --full Don't truncate description / attendee list\n --account <email> Account override when 2+ are configured\nexamples:\n gws-axi calendar get abc_123 --calendar primary\n gws-axi calendar get abc_123 --full\noutput:\n Event metadata (summary, start/end, status, creator, organizer,\n location, hangout link, htmlLink) plus the attendee list with each\n person's response status. Description is truncated to 500 chars by\n default \u2014 use --full to see the complete body.\n\n A conference{} block surfaces the provider-uniform join link when the\n event has conferencing: provider, join_url, and source (conferenceData |\n hangoutLink | description | location). conference_entry_points[] lists\n the structured video/phone/sip entries when conferenceData is present.\n A source of description/location means the URL was scraped best-effort\n from free text (externally-organized Teams/Zoom/Webex meetings carry no\n conferenceData) \u2014 verify before use.\n";
|
|
2
2
|
export declare function calendarGetCommand(account: string, args: string[]): Promise<string>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AxiError } from "axi-sdk-js";
|
|
2
2
|
import { calendarClient, translateGoogleError } from "../../google/client.js";
|
|
3
3
|
import { field, joinBlocks, renderHelp, renderList, renderObject } from "../../output/index.js";
|
|
4
|
+
import { extractConference } from "./conference.js";
|
|
4
5
|
import { formatEventTime } from "./dateish.js";
|
|
5
6
|
export const GET_HELP = `usage: gws-axi calendar get <event-id> [flags]
|
|
6
7
|
args[1]:
|
|
@@ -17,6 +18,14 @@ output:
|
|
|
17
18
|
location, hangout link, htmlLink) plus the attendee list with each
|
|
18
19
|
person's response status. Description is truncated to 500 chars by
|
|
19
20
|
default — use --full to see the complete body.
|
|
21
|
+
|
|
22
|
+
A conference{} block surfaces the provider-uniform join link when the
|
|
23
|
+
event has conferencing: provider, join_url, and source (conferenceData |
|
|
24
|
+
hangoutLink | description | location). conference_entry_points[] lists
|
|
25
|
+
the structured video/phone/sip entries when conferenceData is present.
|
|
26
|
+
A source of description/location means the URL was scraped best-effort
|
|
27
|
+
from free text (externally-organized Teams/Zoom/Webex meetings carry no
|
|
28
|
+
conferenceData) — verify before use.
|
|
20
29
|
`;
|
|
21
30
|
function parseFlags(args) {
|
|
22
31
|
const flags = { calendar: "primary", full: false };
|
|
@@ -113,6 +122,26 @@ export async function calendarGetCommand(account, args) {
|
|
|
113
122
|
if (event.updated)
|
|
114
123
|
details.updated = event.updated;
|
|
115
124
|
blocks.push(renderObject({ event: details }));
|
|
125
|
+
// Conferencing block — the provider-uniform join surface. Resolves a join
|
|
126
|
+
// URL for Meet, Calendar-add-on Zoom/Teams/Webex, AND externally-organized
|
|
127
|
+
// meetings whose link lives only in the description (no conferenceData). The
|
|
128
|
+
// `source` field discloses structured-vs-scraped so the reader can judge
|
|
129
|
+
// trust. hangout_link stays in the details block above for back-compat.
|
|
130
|
+
const conference = extractConference(event);
|
|
131
|
+
if (conference && (conference.joinUrl || conference.provider || conference.entryPoints.length)) {
|
|
132
|
+
const confObj = {};
|
|
133
|
+
if (conference.provider)
|
|
134
|
+
confObj.provider = conference.provider;
|
|
135
|
+
if (conference.joinUrl)
|
|
136
|
+
confObj.join_url = conference.joinUrl;
|
|
137
|
+
if (conference.source)
|
|
138
|
+
confObj.source = conference.source;
|
|
139
|
+
blocks.push(renderObject({ conference: confObj }));
|
|
140
|
+
if (conference.entryPoints.length > 0) {
|
|
141
|
+
const epSchema = [field("type"), field("uri"), field("label")];
|
|
142
|
+
blocks.push(renderList("conference_entry_points", conference.entryPoints, epSchema));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
116
145
|
if (descResult.value) {
|
|
117
146
|
const descBlock = { description: descResult.value };
|
|
118
147
|
if (descResult.truncated) {
|
|
@@ -177,6 +206,12 @@ export async function calendarGetCommand(account, args) {
|
|
|
177
206
|
if (descResult.truncated || attendees.length > 20) {
|
|
178
207
|
suggestions.push(`Run with --full to see complete description and all attendees`);
|
|
179
208
|
}
|
|
209
|
+
if (conference?.joinUrl) {
|
|
210
|
+
const via = conference.source === "description" || conference.source === "location"
|
|
211
|
+
? ` (scraped from ${conference.source} — verify before use)`
|
|
212
|
+
: "";
|
|
213
|
+
suggestions.push(`Join ${conference.provider || "meeting"}: ${conference.joinUrl}${via}`);
|
|
214
|
+
}
|
|
180
215
|
if (event.htmlLink) {
|
|
181
216
|
suggestions.push(`Open in browser: ${event.htmlLink}`);
|
|
182
217
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/calendar/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/calendar/get.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gws-axi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "AXI-compliant Google Workspace CLI — token-efficient TOON output, agent-guided auth setup, unified interface for Gmail, Calendar, Docs, Drive, Slides",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|