@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.
Files changed (56) hide show
  1. package/dist/main.js +0 -0
  2. package/node_modules/@commandgarden/app/dist/client/assets/Slides-0sL-MDMf.js +31 -0
  3. package/node_modules/@commandgarden/app/dist/client/assets/index-Bzw5cF_s.js +461 -0
  4. package/node_modules/@commandgarden/app/dist/client/assets/index-DrFywqdr.css +1 -0
  5. package/node_modules/@commandgarden/app/dist/client/index.html +19 -19
  6. package/node_modules/@commandgarden/app/dist/server/journal/sources/git.source.d.ts +1 -1
  7. package/node_modules/@commandgarden/app/dist/server/journal/sources/git.source.js +2 -2
  8. package/node_modules/@commandgarden/app/dist/server/journal/sources/meetings.source.d.ts +12 -13
  9. package/node_modules/@commandgarden/app/dist/server/journal/sources/meetings.source.js +70 -17
  10. package/node_modules/@commandgarden/app/dist/server/store.js +35 -35
  11. package/node_modules/@commandgarden/app/package.json +42 -42
  12. package/node_modules/@commandgarden/chrome/dist/content-script.js.map +1 -1
  13. package/node_modules/@commandgarden/chrome/dist/manifest.json +16 -16
  14. package/node_modules/@commandgarden/chrome/dist/popup.html +218 -218
  15. package/node_modules/@commandgarden/chrome/dist/popup.js.map +1 -1
  16. package/node_modules/@commandgarden/chrome/dist/service-worker.js +68 -13
  17. package/node_modules/@commandgarden/chrome/dist/service-worker.js.map +2 -2
  18. package/node_modules/@commandgarden/chrome/package.json +25 -25
  19. package/node_modules/@commandgarden/daemon/connectors/ado-git-commits.eval.js +100 -143
  20. package/node_modules/@commandgarden/daemon/connectors/ado-git-commits.yaml +70 -70
  21. package/node_modules/@commandgarden/daemon/connectors/gcs-kb-content.yaml +58 -58
  22. package/node_modules/@commandgarden/daemon/connectors/gcs-kb-pages.yaml +47 -47
  23. package/node_modules/@commandgarden/daemon/connectors/jira-my-tickets.eval.js +115 -115
  24. package/node_modules/@commandgarden/daemon/connectors/jira-my-tickets.yaml +54 -54
  25. package/node_modules/@commandgarden/daemon/connectors/lib/msal-token.js +20 -20
  26. package/node_modules/@commandgarden/daemon/connectors/outlook-my-meetings.eval.js +198 -186
  27. package/node_modules/@commandgarden/daemon/connectors/outlook-my-meetings.yaml +42 -41
  28. package/node_modules/@commandgarden/daemon/connectors/saba-pending-training.eval.js +94 -94
  29. package/node_modules/@commandgarden/daemon/connectors/saba-pending-training.yaml +34 -34
  30. package/node_modules/@commandgarden/daemon/connectors/socket-security-news.yaml +63 -63
  31. package/node_modules/@commandgarden/daemon/connectors/teams-room-availability.eval.js +437 -343
  32. package/node_modules/@commandgarden/daemon/connectors/teams-room-availability.yaml +53 -47
  33. package/node_modules/@commandgarden/daemon/connectors/teams-rooms-availability.eval.js +547 -547
  34. package/node_modules/@commandgarden/daemon/connectors/teams-rooms-availability.yaml +48 -48
  35. package/node_modules/@commandgarden/daemon/connectors/timetracking-projects.eval.js +52 -52
  36. package/node_modules/@commandgarden/daemon/connectors/timetracking-projects.yaml +42 -42
  37. package/node_modules/@commandgarden/daemon/connectors/timetracking-report.eval.js +81 -81
  38. package/node_modules/@commandgarden/daemon/connectors/timetracking-report.yaml +52 -52
  39. package/node_modules/@commandgarden/daemon/connectors/tldrsec-newsletter.eval.js +27 -27
  40. package/node_modules/@commandgarden/daemon/connectors/tldrsec-newsletter.yaml +38 -38
  41. package/node_modules/@commandgarden/daemon/connectors/tokenmaster-clients-list.yaml +55 -55
  42. package/node_modules/@commandgarden/daemon/dist/audit-store.js +8 -8
  43. package/node_modules/@commandgarden/daemon/dist/ws-relay.js +1 -1
  44. package/node_modules/@commandgarden/daemon/package.json +32 -32
  45. package/node_modules/@commandgarden/shared/package.json +32 -32
  46. package/package.json +58 -58
  47. package/node_modules/@commandgarden/app/dist/client/assets/index-DCptfmmK.js +0 -397
  48. package/node_modules/@commandgarden/app/dist/client/assets/index-qunCIeG9.css +0 -1
  49. package/node_modules/@commandgarden/app/dist/server/daemon-client.test.js +0 -47
  50. package/node_modules/@commandgarden/app/dist/server/routes/routes.test.js +0 -137
  51. package/node_modules/@commandgarden/app/dist/server/store.test.js +0 -59
  52. package/node_modules/@commandgarden/chrome/dist/fetch-interceptor.js +0 -44
  53. package/node_modules/@commandgarden/daemon/dist/cdp-client.d.ts +0 -24
  54. package/node_modules/@commandgarden/daemon/dist/cdp-client.d.ts.map +0 -1
  55. package/node_modules/@commandgarden/daemon/dist/cdp-client.js +0 -150
  56. 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: [{ urlPattern: "*graphql*", requestStage: "Response" }]
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: [{ urlPattern: "*graphql*", requestStage: "Response" }]
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
- const AsyncFunction = Object.getPrototypeOf(async function() {
7272
- }).constructor;
7273
- new AsyncFunction(codeStr)().then(
7274
- (r) => {
7275
- globalThis[key] = { ok: true, result: r };
7276
- },
7277
- (e) => {
7278
- globalThis[key] = { ok: false, error: e.message || String(e) };
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() + 9e4;
7338
+ const deadline = Date.now() + 28e4;
7284
7339
  while (Date.now() < deadline) {
7285
7340
  const [poll] = await chrome.scripting.executeScript({
7286
7341
  target: { tabId },