@commandgarden/cli 2.10.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +6 -6
- package/node_modules/@commandgarden/app/dist/client/assets/{Slides-D3xcxd9t.js → Slides-BvMlkL-3.js} +5 -15
- package/node_modules/@commandgarden/app/dist/client/assets/index-BD8reQ8T.js +496 -0
- package/node_modules/@commandgarden/app/dist/client/assets/{index-DbqYLIqy.css → index-wgb9-PIF.css} +1 -1
- package/node_modules/@commandgarden/app/dist/client/index.html +19 -19
- package/node_modules/@commandgarden/app/dist/server/daemon-client.test.js +47 -0
- package/node_modules/@commandgarden/app/dist/server/journal/journal.service.d.ts +1 -0
- package/node_modules/@commandgarden/app/dist/server/journal/journal.service.js +25 -6
- package/node_modules/@commandgarden/app/dist/server/journal/journal.types.d.ts +26 -0
- package/node_modules/@commandgarden/app/dist/server/journal/sources/meetings.source.d.ts +10 -4
- package/node_modules/@commandgarden/app/dist/server/journal/sources/meetings.source.js +36 -29
- package/node_modules/@commandgarden/app/dist/server/journal/sources/timetracking.source.d.ts +10 -1
- package/node_modules/@commandgarden/app/dist/server/journal/sources/timetracking.source.js +62 -8
- package/node_modules/@commandgarden/app/dist/server/routes/journal.d.ts +12 -0
- package/node_modules/@commandgarden/app/dist/server/routes/journal.js +87 -5
- package/node_modules/@commandgarden/app/dist/server/routes/routes.test.js +137 -0
- package/node_modules/@commandgarden/app/dist/server/store.d.ts +27 -0
- package/node_modules/@commandgarden/app/dist/server/store.js +130 -39
- package/node_modules/@commandgarden/app/dist/server/store.test.js +59 -0
- package/node_modules/@commandgarden/app/package.json +42 -42
- package/node_modules/@commandgarden/chrome/dist/content-script.js.map +1 -1
- package/node_modules/@commandgarden/chrome/dist/fetch-interceptor.js +44 -0
- package/node_modules/@commandgarden/chrome/dist/manifest.json +26 -26
- package/node_modules/@commandgarden/chrome/dist/popup.html +218 -218
- package/node_modules/@commandgarden/chrome/dist/popup.js.map +1 -1
- package/node_modules/@commandgarden/chrome/dist/service-worker.js +11 -3
- package/node_modules/@commandgarden/chrome/dist/service-worker.js.map +2 -2
- package/node_modules/@commandgarden/chrome/package.json +26 -26
- package/node_modules/@commandgarden/daemon/connectors/ado-git-commits.eval.js +100 -100
- package/node_modules/@commandgarden/daemon/connectors/ado-git-commits.yaml +70 -70
- package/node_modules/@commandgarden/daemon/connectors/gcs-kb-content.yaml +61 -61
- package/node_modules/@commandgarden/daemon/connectors/gcs-kb-pages.yaml +54 -54
- package/node_modules/@commandgarden/daemon/connectors/jira-my-tickets.eval.js +115 -115
- package/node_modules/@commandgarden/daemon/connectors/jira-my-tickets.yaml +54 -54
- package/node_modules/@commandgarden/daemon/connectors/lib/msal-token.js +20 -20
- package/node_modules/@commandgarden/daemon/connectors/outlook-my-meetings.eval.js +204 -198
- package/node_modules/@commandgarden/daemon/connectors/outlook-my-meetings.yaml +42 -42
- package/node_modules/@commandgarden/daemon/connectors/saba-pending-training.eval.js +94 -94
- package/node_modules/@commandgarden/daemon/connectors/saba-pending-training.yaml +34 -34
- package/node_modules/@commandgarden/daemon/connectors/socket-security-news.yaml +63 -63
- package/node_modules/@commandgarden/daemon/connectors/teams-room-availability.eval.js +437 -437
- package/node_modules/@commandgarden/daemon/connectors/teams-room-availability.yaml +53 -53
- package/node_modules/@commandgarden/daemon/connectors/teams-rooms-availability.eval.js +547 -547
- package/node_modules/@commandgarden/daemon/connectors/teams-rooms-availability.yaml +48 -48
- package/node_modules/@commandgarden/daemon/connectors/timetracking-projects.eval.js +52 -52
- package/node_modules/@commandgarden/daemon/connectors/timetracking-projects.yaml +42 -42
- package/node_modules/@commandgarden/daemon/connectors/timetracking-report.eval.js +81 -81
- package/node_modules/@commandgarden/daemon/connectors/timetracking-report.yaml +52 -52
- package/node_modules/@commandgarden/daemon/connectors/tldrsec-newsletter.eval.js +27 -27
- package/node_modules/@commandgarden/daemon/connectors/tldrsec-newsletter.yaml +38 -38
- package/node_modules/@commandgarden/daemon/connectors/tokenmaster-clients-list.yaml +55 -55
- package/node_modules/@commandgarden/daemon/dist/audit-store.js +8 -8
- package/node_modules/@commandgarden/daemon/dist/cdp-client.d.ts +24 -0
- package/node_modules/@commandgarden/daemon/dist/cdp-client.d.ts.map +1 -0
- package/node_modules/@commandgarden/daemon/dist/cdp-client.js +150 -0
- package/node_modules/@commandgarden/daemon/dist/cdp-client.js.map +1 -0
- package/node_modules/@commandgarden/daemon/package.json +32 -32
- package/node_modules/@commandgarden/shared/package.json +32 -32
- package/package.json +58 -58
- package/node_modules/@commandgarden/app/dist/client/assets/index-_jNYPoLF.js +0 -461
|
@@ -1,198 +1,204 @@
|
|
|
1
|
-
// Runs in page context via js_evaluate step (executed by CDP Runtime.evaluate
|
|
2
|
-
// to bypass Outlook's CSP — see chrome-adapter.ts evaluateViaCdp).
|
|
3
|
-
//
|
|
4
|
-
// Strategy: drives the OWA Scheduling Assistant (same as room-availability)
|
|
5
|
-
// to trigger a getSchedule GraphQL call. The organizer's own schedule is
|
|
6
|
-
// always the first entry — no room/attendee needs to be added.
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// (
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
el.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
1
|
+
// Runs in page context via js_evaluate step (executed by CDP Runtime.evaluate
|
|
2
|
+
// to bypass Outlook's CSP — see chrome-adapter.ts evaluateViaCdp).
|
|
3
|
+
//
|
|
4
|
+
// Strategy: drives the OWA Scheduling Assistant (same as room-availability)
|
|
5
|
+
// to trigger a getSchedule GraphQL call. The organizer's own schedule is
|
|
6
|
+
// always the first entry — no room/attendee needs to be added.
|
|
7
|
+
//
|
|
8
|
+
// The Scheduling Assistant grid always renders the *whole work week* around
|
|
9
|
+
// whichever date is selected (it's designed for finding a free slot across
|
|
10
|
+
// the week), so a single call returns every day's events for that week —
|
|
11
|
+
// `args.date` is just an anchor date used to navigate to the right week; the
|
|
12
|
+
// output includes ALL days present in the captured schedule, not just the
|
|
13
|
+
// anchor day. Callers should call this once per week (not once per weekday)
|
|
14
|
+
// and filter/group the returned rows by date as needed.
|
|
15
|
+
//
|
|
16
|
+
// CDP Fetch.enable intercepts getSchedule at the network stack level
|
|
17
|
+
// (below MCAS proxy), and chrome-adapter.ts injects matching responses
|
|
18
|
+
// into window.__rfb. This eval.js reads from __rfb.
|
|
19
|
+
//
|
|
20
|
+
// Requires cdp: true in the connector YAML.
|
|
21
|
+
//
|
|
22
|
+
// Template variables interpolated before execution:
|
|
23
|
+
// ${{ args.date }}
|
|
24
|
+
|
|
25
|
+
const MONTHS = ['January', 'February', 'March', 'April', 'May', 'June',
|
|
26
|
+
'July', 'August', 'September', 'October', 'November', 'December'];
|
|
27
|
+
const DATE_RE = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/;
|
|
28
|
+
|
|
29
|
+
function pad2(n) { return String(n).padStart(2, '0'); }
|
|
30
|
+
function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }
|
|
31
|
+
|
|
32
|
+
function todayLocalISO() {
|
|
33
|
+
const d = new Date();
|
|
34
|
+
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** "2026-07-10" -> "10, July, 2026" (matches the OWA date-cell aria-label). */
|
|
38
|
+
function dateCellLabel(iso) {
|
|
39
|
+
const [y, m, d] = iso.split('-').map(Number);
|
|
40
|
+
return `${d}, ${MONTHS[m - 1]}, ${y}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function $(sel) { return document.querySelector(sel); }
|
|
44
|
+
function exists(sel) { return !!$(sel); }
|
|
45
|
+
|
|
46
|
+
/** Click a button/link by accessible name. Returns true if found. */
|
|
47
|
+
function clickByName(name) {
|
|
48
|
+
const els = Array.from(document.querySelectorAll('button,a,[role=button]'));
|
|
49
|
+
const el = els.find(e => {
|
|
50
|
+
if (!e.offsetParent) return false;
|
|
51
|
+
const al = (e.getAttribute('aria-label') || '').trim();
|
|
52
|
+
const tx = (e.textContent || '').replace(/\s+/g, ' ').trim();
|
|
53
|
+
return al === name || al.includes(name) || tx.includes(name);
|
|
54
|
+
});
|
|
55
|
+
if (!el) return false;
|
|
56
|
+
el.scrollIntoView({ block: 'center' });
|
|
57
|
+
el.click();
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** True when the Scheduling Assistant view is rendered. */
|
|
62
|
+
function schedulingAssistantOpen() {
|
|
63
|
+
return Array.from(document.querySelectorAll('input')).some(
|
|
64
|
+
e => (e.getAttribute('aria-label') || '') === 'Start date'
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Read and clear captured {req, body} pairs from CDP layer. */
|
|
69
|
+
function readCapture() {
|
|
70
|
+
const d = window.__rfb || [];
|
|
71
|
+
window.__rfb = [];
|
|
72
|
+
return d;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Parse getSchedule response → Map<scheduleId, schedule>. */
|
|
76
|
+
function schedulesFromPair(pair) {
|
|
77
|
+
let body;
|
|
78
|
+
try { body = JSON.parse(pair.body); } catch (_e) { return new Map(); }
|
|
79
|
+
const byId = new Map();
|
|
80
|
+
const nodes = Array.isArray(body) ? body : [body];
|
|
81
|
+
for (const node of nodes) {
|
|
82
|
+
const schedules = node?.data?.getSchedule?.schedules;
|
|
83
|
+
if (Array.isArray(schedules)) {
|
|
84
|
+
for (const s of schedules) {
|
|
85
|
+
if (s?.scheduleId) byId.set(String(s.scheduleId).toLowerCase(), s);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return byId;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ── Parse args ────────────────────────────────────────────────────────
|
|
93
|
+
const date = '${{ args.date }}'.trim();
|
|
94
|
+
if (!DATE_RE.test(date)) throw new Error(`Invalid date "${date}" — use YYYY-MM-DD`);
|
|
95
|
+
|
|
96
|
+
// ── Wait for compose form (handles SSO redirect delays) ──────────────
|
|
97
|
+
const __deadline = Date.now() + 30000;
|
|
98
|
+
while (Date.now() < __deadline) {
|
|
99
|
+
if (exists("button[aria-label='Open Scheduling Assistant']") ||
|
|
100
|
+
exists("input[aria-label='Start date']")) break;
|
|
101
|
+
await sleep(400);
|
|
102
|
+
}
|
|
103
|
+
if (!exists("button[aria-label='Open Scheduling Assistant']") &&
|
|
104
|
+
!exists("input[aria-label='Start date']")) {
|
|
105
|
+
if (/login\.|\/oauth2\/|signin|sso/i.test(location.href)) {
|
|
106
|
+
throw new Error('Not signed in to Outlook — log in and retry');
|
|
107
|
+
}
|
|
108
|
+
throw new Error('Calendar compose form did not load');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ── Open the Scheduling Assistant ────────────────────────────────────
|
|
112
|
+
for (let i = 0; i < 20 && !schedulingAssistantOpen(); i++) {
|
|
113
|
+
clickByName('Open Scheduling Assistant');
|
|
114
|
+
await sleep(400);
|
|
115
|
+
}
|
|
116
|
+
if (!schedulingAssistantOpen()) {
|
|
117
|
+
throw new Error('Could not open the Scheduling Assistant');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ── Set the date ─────────────────────────────────────────────────────
|
|
121
|
+
// Clear any initial __rfb data from the default date (usually today),
|
|
122
|
+
// then set the target date so getSchedule fires fresh.
|
|
123
|
+
readCapture();
|
|
124
|
+
|
|
125
|
+
const cellSel = `button[aria-label='${dateCellLabel(date)}']`;
|
|
126
|
+
const target = new Date(`${date}T00:00:00`);
|
|
127
|
+
const now = new Date();
|
|
128
|
+
const navSel = target >= new Date(now.getFullYear(), now.getMonth(), now.getDate())
|
|
129
|
+
? "button[aria-label^='Go to next month']"
|
|
130
|
+
: "button[aria-label^='Go to previous month']";
|
|
131
|
+
|
|
132
|
+
const dateInput = $("input[aria-label='Start date']");
|
|
133
|
+
if (dateInput) dateInput.click();
|
|
134
|
+
|
|
135
|
+
for (let i = 0; i < 30; i++) {
|
|
136
|
+
if (exists(cellSel)) {
|
|
137
|
+
$(cellSel).click();
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
if (exists(navSel)) {
|
|
141
|
+
try { $(navSel).click(); } catch (_e) { /* retry */ }
|
|
142
|
+
} else {
|
|
143
|
+
const di = $("input[aria-label='Start date']");
|
|
144
|
+
if (di) di.click();
|
|
145
|
+
}
|
|
146
|
+
await sleep(500);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ── Read the organizer's schedule from CDP-captured getSchedule ──────
|
|
150
|
+
// The Scheduling Assistant always includes the organizer's own schedule
|
|
151
|
+
// as the first entry in getSchedule. No room/attendee needed.
|
|
152
|
+
const allItems = new Map();
|
|
153
|
+
let gotData = false;
|
|
154
|
+
|
|
155
|
+
for (let i = 0; i < 50; i++) {
|
|
156
|
+
await sleep(500);
|
|
157
|
+
for (const pair of readCapture()) {
|
|
158
|
+
for (const [id, s] of schedulesFromPair(pair)) {
|
|
159
|
+
// Collect all scheduleItems from all schedules (organizer is first)
|
|
160
|
+
for (const it of (s.scheduleItems || [])) {
|
|
161
|
+
if (it && it.startTime && it.endTime) {
|
|
162
|
+
const key = JSON.stringify([it.startTime, it.endTime, it.subject]);
|
|
163
|
+
allItems.set(key, it);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (s.availabilityView && s.availabilityView.length) gotData = true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (gotData) break;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (!gotData) {
|
|
173
|
+
throw new Error('No schedule data returned — check Outlook login');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// ── Build output rows for every day captured (whole visible week) ───
|
|
177
|
+
const STATUS_MAP = { Busy: 'busy', Tentative: 'tentative', Oof: 'oof',
|
|
178
|
+
WorkingElsewhere: 'elsewhere', Free: 'free' };
|
|
179
|
+
const rows = [];
|
|
180
|
+
|
|
181
|
+
for (const it of allItems.values()) {
|
|
182
|
+
const startDt = new Date(it.startTime.dateTime);
|
|
183
|
+
const endDt = new Date(it.endTime.dateTime);
|
|
184
|
+
const evDate = `${startDt.getFullYear()}-${pad2(startDt.getMonth() + 1)}-${pad2(startDt.getDate())}`;
|
|
185
|
+
|
|
186
|
+
const state = STATUS_MAP[it.status] || 'busy';
|
|
187
|
+
if (state === 'free') continue;
|
|
188
|
+
|
|
189
|
+
const durationMin = Math.round((endDt.getTime() - startDt.getTime()) / 60000);
|
|
190
|
+
if (durationMin < 5 || durationMin > 480) continue;
|
|
191
|
+
|
|
192
|
+
rows.push({
|
|
193
|
+
date: evDate,
|
|
194
|
+
subject: it.subject || '(meeting)',
|
|
195
|
+
start: `${pad2(startDt.getHours())}:${pad2(startDt.getMinutes())}`,
|
|
196
|
+
end: `${pad2(endDt.getHours())}:${pad2(endDt.getMinutes())}`,
|
|
197
|
+
durationMin,
|
|
198
|
+
state,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Sort by date first, then start time (rows now span multiple days)
|
|
203
|
+
rows.sort((a, b) => a.date.localeCompare(b.date) || a.start.localeCompare(b.start));
|
|
204
|
+
return rows;
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
site: outlook
|
|
2
|
-
name: my-meetings
|
|
3
|
-
version: "1.0"
|
|
4
|
-
description: "User's own meeting schedule from Outlook Calendar for
|
|
5
|
-
access: read
|
|
6
|
-
cdp: true
|
|
7
|
-
|
|
8
|
-
domains:
|
|
9
|
-
- "outlook.cloud.microsoft.mcas.ms"
|
|
10
|
-
capabilities:
|
|
11
|
-
- navigate
|
|
12
|
-
- js_evaluate
|
|
13
|
-
|
|
14
|
-
args:
|
|
15
|
-
- name: date
|
|
16
|
-
type: string
|
|
17
|
-
required: true
|
|
18
|
-
help: "
|
|
19
|
-
pattern: "^\\d{4}-\\d{2}-\\d{2}$"
|
|
20
|
-
|
|
21
|
-
columns:
|
|
22
|
-
- name: date
|
|
23
|
-
type: string
|
|
24
|
-
- name: subject
|
|
25
|
-
type: string
|
|
26
|
-
- name: start
|
|
27
|
-
type: string
|
|
28
|
-
- name: end
|
|
29
|
-
type: string
|
|
30
|
-
- name: durationMin
|
|
31
|
-
type: number
|
|
32
|
-
- name: state
|
|
33
|
-
type: string
|
|
34
|
-
|
|
35
|
-
pipeline:
|
|
36
|
-
- step: navigate
|
|
37
|
-
url: "https://outlook.cloud.microsoft.mcas.ms/calendar/deeplink/compose"
|
|
38
|
-
- step: wait
|
|
39
|
-
selector: "body"
|
|
40
|
-
timeout: 30000
|
|
41
|
-
- step: js_evaluate
|
|
42
|
-
file: outlook-my-meetings.eval.js
|
|
1
|
+
site: outlook
|
|
2
|
+
name: my-meetings
|
|
3
|
+
version: "1.0"
|
|
4
|
+
description: "User's own meeting schedule from Outlook Calendar for the work week containing the given date"
|
|
5
|
+
access: read
|
|
6
|
+
cdp: true
|
|
7
|
+
|
|
8
|
+
domains:
|
|
9
|
+
- "outlook.cloud.microsoft.mcas.ms"
|
|
10
|
+
capabilities:
|
|
11
|
+
- navigate
|
|
12
|
+
- js_evaluate
|
|
13
|
+
|
|
14
|
+
args:
|
|
15
|
+
- name: date
|
|
16
|
+
type: string
|
|
17
|
+
required: true
|
|
18
|
+
help: "Anchor date (YYYY-MM-DD) within the target week — the Scheduling Assistant renders the whole work week around it, so the response includes every day in that week, not just this date"
|
|
19
|
+
pattern: "^\\d{4}-\\d{2}-\\d{2}$"
|
|
20
|
+
|
|
21
|
+
columns:
|
|
22
|
+
- name: date
|
|
23
|
+
type: string
|
|
24
|
+
- name: subject
|
|
25
|
+
type: string
|
|
26
|
+
- name: start
|
|
27
|
+
type: string
|
|
28
|
+
- name: end
|
|
29
|
+
type: string
|
|
30
|
+
- name: durationMin
|
|
31
|
+
type: number
|
|
32
|
+
- name: state
|
|
33
|
+
type: string
|
|
34
|
+
|
|
35
|
+
pipeline:
|
|
36
|
+
- step: navigate
|
|
37
|
+
url: "https://outlook.cloud.microsoft.mcas.ms/calendar/deeplink/compose"
|
|
38
|
+
- step: wait
|
|
39
|
+
selector: "body"
|
|
40
|
+
timeout: 30000
|
|
41
|
+
- step: js_evaluate
|
|
42
|
+
file: outlook-my-meetings.eval.js
|