@commandgarden/cli 2.5.1 → 2.7.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 +0 -0
- package/node_modules/@commandgarden/app/dist/client/assets/Slides-0sL-MDMf.js +31 -0
- package/node_modules/@commandgarden/app/dist/client/assets/index-Bzw5cF_s.js +461 -0
- package/node_modules/@commandgarden/app/dist/client/assets/index-DrFywqdr.css +1 -0
- package/node_modules/@commandgarden/app/dist/client/index.html +19 -19
- package/node_modules/@commandgarden/app/dist/server/journal/sources/git.source.d.ts +1 -1
- package/node_modules/@commandgarden/app/dist/server/journal/sources/git.source.js +2 -2
- package/node_modules/@commandgarden/app/dist/server/journal/sources/meetings.source.d.ts +12 -13
- package/node_modules/@commandgarden/app/dist/server/journal/sources/meetings.source.js +70 -17
- package/node_modules/@commandgarden/app/dist/server/store.js +35 -35
- 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/manifest.json +16 -16
- 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 +68 -13
- package/node_modules/@commandgarden/chrome/dist/service-worker.js.map +2 -2
- package/node_modules/@commandgarden/chrome/package.json +25 -25
- package/node_modules/@commandgarden/daemon/connectors/ado-git-commits.eval.js +100 -143
- package/node_modules/@commandgarden/daemon/connectors/ado-git-commits.yaml +70 -70
- package/node_modules/@commandgarden/daemon/connectors/gcs-kb-content.yaml +58 -58
- package/node_modules/@commandgarden/daemon/connectors/gcs-kb-pages.yaml +47 -47
- 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 +198 -186
- package/node_modules/@commandgarden/daemon/connectors/outlook-my-meetings.yaml +42 -41
- 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 -343
- package/node_modules/@commandgarden/daemon/connectors/teams-room-availability.yaml +53 -47
- 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/ws-relay.js +1 -1
- 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-DCptfmmK.js +0 -397
- package/node_modules/@commandgarden/app/dist/client/assets/index-qunCIeG9.css +0 -1
- package/node_modules/@commandgarden/app/dist/server/daemon-client.test.js +0 -47
- package/node_modules/@commandgarden/app/dist/server/routes/routes.test.js +0 -137
- package/node_modules/@commandgarden/app/dist/server/store.test.js +0 -59
- package/node_modules/@commandgarden/chrome/dist/fetch-interceptor.js +0 -44
- package/node_modules/@commandgarden/daemon/dist/cdp-client.d.ts +0 -24
- package/node_modules/@commandgarden/daemon/dist/cdp-client.d.ts.map +0 -1
- package/node_modules/@commandgarden/daemon/dist/cdp-client.js +0 -150
- package/node_modules/@commandgarden/daemon/dist/cdp-client.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/popup/time-ago.ts", "../src/popup/popup.ts"],
|
|
4
|
-
"sourcesContent": ["// src/popup/time-ago.ts\nexport function timeAgo(timestamp: number, now: number = Date.now()): string {\n const seconds = Math.floor((now - timestamp) / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n", "// src/popup/popup.ts\n/// <reference lib=\"dom\" />\nimport type { PopupStatusResponse, ApprovalInfo } from './popup-types.js';\nimport { timeAgo } from './time-ago.js';\n\nconst dot = document.getElementById('dot')!;\nconst statusText = document.getElementById('status-text')!;\nconst toggleInput = document.getElementById('toggle-input') as HTMLInputElement;\nconst activityEl = document.getElementById('activity')!;\nconst approvalsEl = document.getElementById('approvals')!;\n\nlet currentEnabled = true;\n\nfunction escapeHtml(text: string): string {\n const el = document.createElement('span');\n el.textContent = text;\n return el.innerHTML;\n}\n\nfunction renderApprovals(approvals: ApprovalInfo[]): void {\n if (approvals.length === 0) {\n approvalsEl.innerHTML = '';\n return;\n }\n\n const cards = approvals.map(a =>\n `<div class=\"approval-card\" data-id=\"${escapeHtml(a.approvalId)}\">\n <div class=\"approval-connector\">${escapeHtml(a.connectorKey)}</div>\n <div class=\"approval-detail\">Step ${a.stepIndex + 1} [${escapeHtml(a.stepType)}] <span class=\"approval-cap\">${escapeHtml(a.capability)}</span></div>\n <div class=\"approval-actions\">\n <button class=\"btn-approve\" data-approval-id=\"${escapeHtml(a.approvalId)}\" data-approved=\"true\">Approve</button>\n <button class=\"btn-reject\" data-approval-id=\"${escapeHtml(a.approvalId)}\" data-approved=\"false\">Reject</button>\n </div>\n </div>`\n ).join('');\n\n approvalsEl.innerHTML =\n `<div class=\"approval-section\">\n <div class=\"approval-header\">Pending approvals <span class=\"approval-count\">${approvals.length}</span></div>\n ${cards}\n </div>`;\n\n approvalsEl.querySelectorAll('[data-approval-id]').forEach(btn => {\n btn.addEventListener('click', () => {\n const approvalId = (btn as HTMLElement).dataset.approvalId!;\n const approved = (btn as HTMLElement).dataset.approved === 'true';\n (btn as HTMLButtonElement).disabled = true;\n chrome.runtime.sendMessage(\n { type: 'approvalDecision', approvalId, approved },\n () => { fetchStatus(); },\n );\n });\n });\n}\n\nfunction render(status: PopupStatusResponse): void {\n currentEnabled = status.enabled;\n toggleInput.checked = status.enabled;\n\n if (!status.enabled) {\n dot.className = 'dot disabled';\n statusText.textContent = 'Disabled';\n } else if (status.connected) {\n dot.className = 'dot connected';\n statusText.textContent = 'Connected';\n } else {\n dot.className = 'dot disconnected';\n statusText.textContent = 'Disconnected';\n }\n\n renderApprovals(status.pendingApprovals ?? []);\n\n if (status.recentActivity.length === 0) {\n activityEl.innerHTML = '<div class=\"empty\">No recent activity</div>';\n return;\n }\n\n const now = Date.now();\n activityEl.innerHTML = status.recentActivity\n .map(entry => {\n const icon = entry.ok\n ? '<span class=\"activity-icon ok\">\u2713</span>'\n : '<span class=\"activity-icon fail\">\u2717</span>';\n return `<div class=\"activity-item\">${icon}<span class=\"activity-name\">${escapeHtml(entry.connector)}</span><span class=\"activity-time\">${timeAgo(entry.timestamp, now)}</span></div>`;\n })\n .join('');\n}\n\nfunction fetchStatus(): void {\n chrome.runtime.sendMessage({ type: 'getStatus' }, (response: PopupStatusResponse) => {\n if (chrome.runtime.lastError) {\n statusText.textContent = 'Error';\n return;\n }\n render(response);\n });\n}\n\ntoggleInput.addEventListener('change', () => {\n const newEnabled = toggleInput.checked;\n toggleInput.disabled = true;\n chrome.runtime.sendMessage({ type: 'setEnabled', enabled: newEnabled }, (response: PopupStatusResponse) => {\n toggleInput.disabled = false;\n if (chrome.runtime.lastError) {\n toggleInput.checked = currentEnabled;\n return;\n }\n render(response);\n });\n});\n\n// Listen for push updates from the service worker (approval state changes)\nchrome.runtime.onMessage.addListener((msg) => {\n if (msg.type === 'approvalUpdate') {\n renderApprovals(msg.pendingApprovals ?? []);\n }\n});\n\nfetchStatus();\n"],
|
|
4
|
+
"sourcesContent": ["// src/popup/time-ago.ts\r\nexport function timeAgo(timestamp: number, now: number = Date.now()): string {\r\n const seconds = Math.floor((now - timestamp) / 1000);\r\n if (seconds < 60) return 'just now';\r\n const minutes = Math.floor(seconds / 60);\r\n if (minutes < 60) return `${minutes}m ago`;\r\n const hours = Math.floor(minutes / 60);\r\n if (hours < 24) return `${hours}h ago`;\r\n const days = Math.floor(hours / 24);\r\n return `${days}d ago`;\r\n}\r\n", "// src/popup/popup.ts\r\n/// <reference lib=\"dom\" />\r\nimport type { PopupStatusResponse, ApprovalInfo } from './popup-types.js';\r\nimport { timeAgo } from './time-ago.js';\r\n\r\nconst dot = document.getElementById('dot')!;\r\nconst statusText = document.getElementById('status-text')!;\r\nconst toggleInput = document.getElementById('toggle-input') as HTMLInputElement;\r\nconst activityEl = document.getElementById('activity')!;\r\nconst approvalsEl = document.getElementById('approvals')!;\r\n\r\nlet currentEnabled = true;\r\n\r\nfunction escapeHtml(text: string): string {\r\n const el = document.createElement('span');\r\n el.textContent = text;\r\n return el.innerHTML;\r\n}\r\n\r\nfunction renderApprovals(approvals: ApprovalInfo[]): void {\r\n if (approvals.length === 0) {\r\n approvalsEl.innerHTML = '';\r\n return;\r\n }\r\n\r\n const cards = approvals.map(a =>\r\n `<div class=\"approval-card\" data-id=\"${escapeHtml(a.approvalId)}\">\r\n <div class=\"approval-connector\">${escapeHtml(a.connectorKey)}</div>\r\n <div class=\"approval-detail\">Step ${a.stepIndex + 1} [${escapeHtml(a.stepType)}] <span class=\"approval-cap\">${escapeHtml(a.capability)}</span></div>\r\n <div class=\"approval-actions\">\r\n <button class=\"btn-approve\" data-approval-id=\"${escapeHtml(a.approvalId)}\" data-approved=\"true\">Approve</button>\r\n <button class=\"btn-reject\" data-approval-id=\"${escapeHtml(a.approvalId)}\" data-approved=\"false\">Reject</button>\r\n </div>\r\n </div>`\r\n ).join('');\r\n\r\n approvalsEl.innerHTML =\r\n `<div class=\"approval-section\">\r\n <div class=\"approval-header\">Pending approvals <span class=\"approval-count\">${approvals.length}</span></div>\r\n ${cards}\r\n </div>`;\r\n\r\n approvalsEl.querySelectorAll('[data-approval-id]').forEach(btn => {\r\n btn.addEventListener('click', () => {\r\n const approvalId = (btn as HTMLElement).dataset.approvalId!;\r\n const approved = (btn as HTMLElement).dataset.approved === 'true';\r\n (btn as HTMLButtonElement).disabled = true;\r\n chrome.runtime.sendMessage(\r\n { type: 'approvalDecision', approvalId, approved },\r\n () => { fetchStatus(); },\r\n );\r\n });\r\n });\r\n}\r\n\r\nfunction render(status: PopupStatusResponse): void {\r\n currentEnabled = status.enabled;\r\n toggleInput.checked = status.enabled;\r\n\r\n if (!status.enabled) {\r\n dot.className = 'dot disabled';\r\n statusText.textContent = 'Disabled';\r\n } else if (status.connected) {\r\n dot.className = 'dot connected';\r\n statusText.textContent = 'Connected';\r\n } else {\r\n dot.className = 'dot disconnected';\r\n statusText.textContent = 'Disconnected';\r\n }\r\n\r\n renderApprovals(status.pendingApprovals ?? []);\r\n\r\n if (status.recentActivity.length === 0) {\r\n activityEl.innerHTML = '<div class=\"empty\">No recent activity</div>';\r\n return;\r\n }\r\n\r\n const now = Date.now();\r\n activityEl.innerHTML = status.recentActivity\r\n .map(entry => {\r\n const icon = entry.ok\r\n ? '<span class=\"activity-icon ok\">\u2713</span>'\r\n : '<span class=\"activity-icon fail\">\u2717</span>';\r\n return `<div class=\"activity-item\">${icon}<span class=\"activity-name\">${escapeHtml(entry.connector)}</span><span class=\"activity-time\">${timeAgo(entry.timestamp, now)}</span></div>`;\r\n })\r\n .join('');\r\n}\r\n\r\nfunction fetchStatus(): void {\r\n chrome.runtime.sendMessage({ type: 'getStatus' }, (response: PopupStatusResponse) => {\r\n if (chrome.runtime.lastError) {\r\n statusText.textContent = 'Error';\r\n return;\r\n }\r\n render(response);\r\n });\r\n}\r\n\r\ntoggleInput.addEventListener('change', () => {\r\n const newEnabled = toggleInput.checked;\r\n toggleInput.disabled = true;\r\n chrome.runtime.sendMessage({ type: 'setEnabled', enabled: newEnabled }, (response: PopupStatusResponse) => {\r\n toggleInput.disabled = false;\r\n if (chrome.runtime.lastError) {\r\n toggleInput.checked = currentEnabled;\r\n return;\r\n }\r\n render(response);\r\n });\r\n});\r\n\r\n// Listen for push updates from the service worker (approval state changes)\r\nchrome.runtime.onMessage.addListener((msg) => {\r\n if (msg.type === 'approvalUpdate') {\r\n renderApprovals(msg.pendingApprovals ?? []);\r\n }\r\n});\r\n\r\nfetchStatus();\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -7140,7 +7140,10 @@ var RealChromeAdapter = class {
|
|
|
7140
7140
|
this.debuggerAttached = true;
|
|
7141
7141
|
await chrome.debugger.sendCommand({ tabId }, "Network.enable");
|
|
7142
7142
|
await chrome.debugger.sendCommand({ tabId }, "Fetch.enable", {
|
|
7143
|
-
patterns: [
|
|
7143
|
+
patterns: [
|
|
7144
|
+
{ urlPattern: "*graphql*", requestStage: "Response" },
|
|
7145
|
+
{ urlPattern: "*_apis/*", requestStage: "Response" }
|
|
7146
|
+
]
|
|
7144
7147
|
}).catch(() => {
|
|
7145
7148
|
});
|
|
7146
7149
|
this.startCapture(tabId);
|
|
@@ -7165,7 +7168,10 @@ var RealChromeAdapter = class {
|
|
|
7165
7168
|
await chrome.debugger.attach({ targetId: swTarget.id }, "1.3");
|
|
7166
7169
|
await chrome.debugger.sendCommand({ targetId: swTarget.id }, "Network.enable");
|
|
7167
7170
|
await chrome.debugger.sendCommand({ targetId: swTarget.id }, "Fetch.enable", {
|
|
7168
|
-
patterns: [
|
|
7171
|
+
patterns: [
|
|
7172
|
+
{ urlPattern: "*graphql*", requestStage: "Response" },
|
|
7173
|
+
{ urlPattern: "*_apis/*", requestStage: "Response" }
|
|
7174
|
+
]
|
|
7169
7175
|
}).catch(() => {
|
|
7170
7176
|
});
|
|
7171
7177
|
const captureTabId = this.tabId;
|
|
@@ -7197,6 +7203,19 @@ var RealChromeAdapter = class {
|
|
|
7197
7203
|
}
|
|
7198
7204
|
}
|
|
7199
7205
|
_swTargetId = null;
|
|
7206
|
+
/** Inject an ADO API response body into the page's globalThis.__cdpCapture array.
|
|
7207
|
+
* Used by ado/git-commits and similar connectors that need CDP-intercepted data. */
|
|
7208
|
+
injectCdpCapture(tabId, body) {
|
|
7209
|
+
chrome.scripting.executeScript({
|
|
7210
|
+
target: { tabId },
|
|
7211
|
+
world: "MAIN",
|
|
7212
|
+
args: [body],
|
|
7213
|
+
func: (data) => {
|
|
7214
|
+
if (!globalThis.__cdpCapture) globalThis.__cdpCapture = [];
|
|
7215
|
+
globalThis.__cdpCapture.push(data);
|
|
7216
|
+
}
|
|
7217
|
+
});
|
|
7218
|
+
}
|
|
7200
7219
|
/** Inject a getSchedule response body into the page's globalThis.__rfb array. */
|
|
7201
7220
|
injectRfb(tabId, body) {
|
|
7202
7221
|
chrome.scripting.executeScript({
|
|
@@ -7221,6 +7240,9 @@ var RealChromeAdapter = class {
|
|
|
7221
7240
|
if (body.includes("getSchedule") && body.includes("availabilityView")) {
|
|
7222
7241
|
this.injectRfb(tabId, body);
|
|
7223
7242
|
}
|
|
7243
|
+
if (body.includes("commitId") || body.includes("pushId") || body.includes("workItems")) {
|
|
7244
|
+
this.injectCdpCapture(tabId, body);
|
|
7245
|
+
}
|
|
7224
7246
|
}).catch(() => {
|
|
7225
7247
|
}).finally(() => {
|
|
7226
7248
|
if (isFetchDomain) {
|
|
@@ -7260,7 +7282,35 @@ var RealChromeAdapter = class {
|
|
|
7260
7282
|
if (!response.ok) throw new Error(response.error ?? "Content script error");
|
|
7261
7283
|
return response.data;
|
|
7262
7284
|
}
|
|
7285
|
+
/**
|
|
7286
|
+
* Run eval.js code via CDP Runtime.evaluate — bypasses CSP because it
|
|
7287
|
+
* executes at the debugger level (like typing in DevTools console).
|
|
7288
|
+
* Required for sites like ADO that use strict-dynamic CSP with nonces,
|
|
7289
|
+
* which blocks new AsyncFunction() / eval() from chrome.scripting.
|
|
7290
|
+
*/
|
|
7291
|
+
async evaluateViaCdp(tabId, code) {
|
|
7292
|
+
const expression = `
|
|
7293
|
+
Promise.race([
|
|
7294
|
+
(async () => { ${code} })(),
|
|
7295
|
+
new Promise((_, rej) => setTimeout(() => rej(new Error('js_evaluate timed out (90s)')), 90000))
|
|
7296
|
+
])
|
|
7297
|
+
`;
|
|
7298
|
+
const result = await chrome.debugger.sendCommand(
|
|
7299
|
+
{ tabId },
|
|
7300
|
+
"Runtime.evaluate",
|
|
7301
|
+
{ expression, awaitPromise: true, returnByValue: true }
|
|
7302
|
+
);
|
|
7303
|
+
const r = result;
|
|
7304
|
+
if (r.exceptionDetails) {
|
|
7305
|
+
const errMsg = r.exceptionDetails.exception?.description || r.exceptionDetails.text;
|
|
7306
|
+
throw new Error(errMsg);
|
|
7307
|
+
}
|
|
7308
|
+
return r.result?.value;
|
|
7309
|
+
}
|
|
7263
7310
|
async evaluateInPage(tabId, code) {
|
|
7311
|
+
if (this.debuggerAttached) {
|
|
7312
|
+
return this.evaluateViaCdp(tabId, code);
|
|
7313
|
+
}
|
|
7264
7314
|
const nonce = "__cg_" + Math.random().toString(36).slice(2);
|
|
7265
7315
|
await chrome.scripting.executeScript({
|
|
7266
7316
|
target: { tabId },
|
|
@@ -7268,19 +7318,24 @@ var RealChromeAdapter = class {
|
|
|
7268
7318
|
args: [code, nonce],
|
|
7269
7319
|
func: (codeStr, key) => {
|
|
7270
7320
|
globalThis[key] = { pending: true };
|
|
7271
|
-
|
|
7272
|
-
|
|
7273
|
-
|
|
7274
|
-
(
|
|
7275
|
-
|
|
7276
|
-
|
|
7277
|
-
|
|
7278
|
-
|
|
7279
|
-
|
|
7280
|
-
|
|
7321
|
+
try {
|
|
7322
|
+
const AsyncFunction = Object.getPrototypeOf(async function() {
|
|
7323
|
+
}).constructor;
|
|
7324
|
+
new AsyncFunction(codeStr)().then(
|
|
7325
|
+
(r) => {
|
|
7326
|
+
globalThis[key] = { ok: true, result: r };
|
|
7327
|
+
},
|
|
7328
|
+
(e) => {
|
|
7329
|
+
globalThis[key] = { ok: false, error: e.message || String(e) };
|
|
7330
|
+
}
|
|
7331
|
+
);
|
|
7332
|
+
} catch (syncErr) {
|
|
7333
|
+
const msg = syncErr instanceof Error ? syncErr.message : String(syncErr);
|
|
7334
|
+
globalThis[key] = { ok: false, error: "[sync] " + msg };
|
|
7335
|
+
}
|
|
7281
7336
|
}
|
|
7282
7337
|
});
|
|
7283
|
-
const deadline = Date.now() +
|
|
7338
|
+
const deadline = Date.now() + 28e4;
|
|
7284
7339
|
while (Date.now() < deadline) {
|
|
7285
7340
|
const [poll] = await chrome.scripting.executeScript({
|
|
7286
7341
|
target: { tabId },
|