@runcofactor/cli 0.15.1 → 0.16.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 (123) hide show
  1. package/dist/{account-62I7FG5G.js → account-ZMV7NEFM.js} +4 -4
  2. package/dist/account-ZMV7NEFM.js.map +1 -0
  3. package/dist/{api-catalog-CAJUASVC.js → api-catalog-6HNOGVPA.js} +3 -3
  4. package/dist/{attachment-RL4AZUJE.js → attachment-QAHR54HQ.js} +3 -3
  5. package/dist/{augmentor-GAF3MFY6.js → augmentor-7T3L6ZR4.js} +3 -3
  6. package/dist/{chunk-26U3DGUM.js → chunk-7YJTQCPX.js} +3 -5
  7. package/dist/chunk-7YJTQCPX.js.map +1 -0
  8. package/dist/{chunk-PXFDH6YL.js → chunk-A4ISG3VX.js} +55 -15
  9. package/dist/{chunk-PXFDH6YL.js.map → chunk-A4ISG3VX.js.map} +1 -1
  10. package/dist/{chunk-5R4HMSNX.js → chunk-AI3Y3AZH.js} +24834 -24813
  11. package/dist/chunk-AI3Y3AZH.js.map +1 -0
  12. package/dist/{chunk-HKQ5XQAQ.js → chunk-CEXV3MOC.js} +3 -3
  13. package/dist/{chunk-VKBTI5EF.js → chunk-D6AVOPOS.js} +2 -2
  14. package/dist/{chunk-ZXRVFFCY.js → chunk-DT2CEH2V.js} +2 -2
  15. package/dist/{chunk-IWKJQZJQ.js → chunk-GZVCNYR4.js} +55 -55
  16. package/dist/chunk-GZVCNYR4.js.map +1 -0
  17. package/dist/{chunk-CJEKEW7R.js → chunk-LFFWD5JZ.js} +2 -2
  18. package/dist/{chunk-UZ2ZA5A6.js → chunk-RGDIVW3O.js} +2 -2
  19. package/dist/{chunk-CFJXYPTF.js → chunk-UAJUZLDE.js} +11 -3
  20. package/dist/chunk-UAJUZLDE.js.map +1 -0
  21. package/dist/{credential-JGVSEGVH.js → credential-X6QKX473.js} +3 -3
  22. package/dist/{credential-template-CWWMOKB2.js → credential-template-GD3D4MBI.js} +3 -3
  23. package/dist/{debug-workflow-BXRU72YZ.js → debug-workflow-AAEOAME2.js} +6 -6
  24. package/dist/{src-CV57ZD6I.js → dist-QLTVBUMD.js} +7 -9
  25. package/dist/{docs-PVBXPTGR.js → docs-BVUEXBY3.js} +3 -3
  26. package/dist/{environment-WZKIO3R3.js → environment-WE7VVE6I.js} +3 -3
  27. package/dist/{feature-flag-K5REGGDY.js → feature-flag-VJO2TJFT.js} +9 -8
  28. package/dist/feature-flag-VJO2TJFT.js.map +1 -0
  29. package/dist/index.js +129 -44
  30. package/dist/index.js.map +1 -1
  31. package/dist/{init-FFUZO5D7.js → init-RQHHKJJD.js} +8 -8
  32. package/dist/{install-XRKEQAFZ.js → install-CQLHNZ6U.js} +3 -3
  33. package/dist/{issues-I3V6GEXU.js → issues-HK2JA5JS.js} +3 -3
  34. package/dist/{knobs-6WLJMB44.js → knobs-ETJAV6YM.js} +3 -3
  35. package/dist/{list-PHC7VYNS.js → list-F6DGGW3Z.js} +3 -3
  36. package/dist/{local-VGYRSW22.js → local-CMAY54I5.js} +5 -5
  37. package/dist/{login-QPU2BKG2.js → login-6CKG664C.js} +8 -8
  38. package/dist/{mcp-LA452TOA.js → mcp-GC2WOOZO.js} +5 -6
  39. package/dist/{mcp-LA452TOA.js.map → mcp-GC2WOOZO.js.map} +1 -1
  40. package/dist/metrics-IXICURAA.js +367 -0
  41. package/dist/metrics-IXICURAA.js.map +1 -0
  42. package/dist/{product-RSZV5HMB.js → product-BUJWPYKB.js} +4 -3
  43. package/dist/product-BUJWPYKB.js.map +1 -0
  44. package/dist/{property-YP4GHQAR.js → property-4EXPWRNT.js} +3 -3
  45. package/dist/{record-KWKHP2ZY.js → record-HL4QA7OX.js} +4 -4
  46. package/dist/{record-KWKHP2ZY.js.map → record-HL4QA7OX.js.map} +1 -1
  47. package/dist/{release-NDRHPW6V.js → release-2SMK5Y3V.js} +3 -3
  48. package/dist/{sandbox-OOCANWOG.js → sandbox-ORAPKOH3.js} +3 -3
  49. package/dist/{scenarios-2HRLCGFY.js → scenarios-DM5FDCAF.js} +3 -3
  50. package/dist/{session-M4ULYDYP.js → session-X6IYGWYG.js} +14 -16
  51. package/dist/{session-M4ULYDYP.js.map → session-X6IYGWYG.js.map} +1 -1
  52. package/dist/{skill-4DGPRDUC.js → skill-ZU5V2EE5.js} +24 -14
  53. package/dist/skill-ZU5V2EE5.js.map +1 -0
  54. package/dist/skills/optimize-cache/SKILL.md +9 -3
  55. package/dist/{spec-XZ2TKUFZ.js → spec-KO5QD6AY.js} +3 -3
  56. package/dist/{src-HL7HEJIW.js → src-DSD34JIX.js} +2 -2
  57. package/dist/{src-2FK3JHGW.js → src-HTGNKBUF.js} +15 -7
  58. package/dist/{src-2FK3JHGW.js.map → src-HTGNKBUF.js.map} +1 -1
  59. package/dist/{src-OU7544PM.js → src-PDYXACRP.js} +2 -2
  60. package/dist/{start-IYKF3C3X.js → start-2ECN4LX5.js} +6 -6
  61. package/dist/{tag-T45MMSCH.js → tag-R5I72HJ6.js} +4 -4
  62. package/dist/{task-MCUHAVTD.js → task-V3JMSJIM.js} +3 -3
  63. package/dist/{test-suite-BICBRSBP.js → test-suite-NOYVK6YX.js} +5 -5
  64. package/dist/{trace-2BAPMYAS.js → trace-NOYEKNO4.js} +4 -5
  65. package/dist/{triage-M3RZ2ASB.js → triage-4RFATHBE.js} +4 -4
  66. package/dist/utilities-3WMXE743.js +441 -0
  67. package/dist/utilities-3WMXE743.js.map +1 -0
  68. package/dist/{workflow-4J23FV7K.js → workflow-DC7WOTTW.js} +13 -17
  69. package/dist/workflow-DC7WOTTW.js.map +1 -0
  70. package/dist/{workflow-cache-XPSK6KC7.js → workflow-cache-SDSI6SMF.js} +6 -6
  71. package/dist/{workflow-cache-XPSK6KC7.js.map → workflow-cache-SDSI6SMF.js.map} +1 -1
  72. package/dist/{workflow-debug-W4USZH35.js → workflow-debug-6UQYP67Q.js} +6 -7
  73. package/dist/{workflow-debug-W4USZH35.js.map → workflow-debug-6UQYP67Q.js.map} +1 -1
  74. package/dist/{workflow-proposals-5E3DTYZB.js → workflow-proposals-67AVGMHX.js} +6 -6
  75. package/package.json +1 -1
  76. package/dist/account-62I7FG5G.js.map +0 -1
  77. package/dist/chunk-26U3DGUM.js.map +0 -1
  78. package/dist/chunk-5R4HMSNX.js.map +0 -1
  79. package/dist/chunk-CFJXYPTF.js.map +0 -1
  80. package/dist/chunk-IWKJQZJQ.js.map +0 -1
  81. package/dist/chunk-KRWRUU6R.js +0 -114
  82. package/dist/chunk-KRWRUU6R.js.map +0 -1
  83. package/dist/feature-flag-K5REGGDY.js.map +0 -1
  84. package/dist/pdf-extract-YHE54XU4.js +0 -13
  85. package/dist/product-RSZV5HMB.js.map +0 -1
  86. package/dist/skill-4DGPRDUC.js.map +0 -1
  87. package/dist/triage-M3RZ2ASB.js.map +0 -1
  88. package/dist/workflow-4J23FV7K.js.map +0 -1
  89. /package/dist/{api-catalog-CAJUASVC.js.map → api-catalog-6HNOGVPA.js.map} +0 -0
  90. /package/dist/{attachment-RL4AZUJE.js.map → attachment-QAHR54HQ.js.map} +0 -0
  91. /package/dist/{augmentor-GAF3MFY6.js.map → augmentor-7T3L6ZR4.js.map} +0 -0
  92. /package/dist/{chunk-HKQ5XQAQ.js.map → chunk-CEXV3MOC.js.map} +0 -0
  93. /package/dist/{chunk-VKBTI5EF.js.map → chunk-D6AVOPOS.js.map} +0 -0
  94. /package/dist/{chunk-ZXRVFFCY.js.map → chunk-DT2CEH2V.js.map} +0 -0
  95. /package/dist/{chunk-CJEKEW7R.js.map → chunk-LFFWD5JZ.js.map} +0 -0
  96. /package/dist/{chunk-UZ2ZA5A6.js.map → chunk-RGDIVW3O.js.map} +0 -0
  97. /package/dist/{credential-JGVSEGVH.js.map → credential-X6QKX473.js.map} +0 -0
  98. /package/dist/{credential-template-CWWMOKB2.js.map → credential-template-GD3D4MBI.js.map} +0 -0
  99. /package/dist/{debug-workflow-BXRU72YZ.js.map → debug-workflow-AAEOAME2.js.map} +0 -0
  100. /package/dist/{pdf-extract-YHE54XU4.js.map → dist-QLTVBUMD.js.map} +0 -0
  101. /package/dist/{docs-PVBXPTGR.js.map → docs-BVUEXBY3.js.map} +0 -0
  102. /package/dist/{environment-WZKIO3R3.js.map → environment-WE7VVE6I.js.map} +0 -0
  103. /package/dist/{init-FFUZO5D7.js.map → init-RQHHKJJD.js.map} +0 -0
  104. /package/dist/{install-XRKEQAFZ.js.map → install-CQLHNZ6U.js.map} +0 -0
  105. /package/dist/{issues-I3V6GEXU.js.map → issues-HK2JA5JS.js.map} +0 -0
  106. /package/dist/{knobs-6WLJMB44.js.map → knobs-ETJAV6YM.js.map} +0 -0
  107. /package/dist/{list-PHC7VYNS.js.map → list-F6DGGW3Z.js.map} +0 -0
  108. /package/dist/{local-VGYRSW22.js.map → local-CMAY54I5.js.map} +0 -0
  109. /package/dist/{login-QPU2BKG2.js.map → login-6CKG664C.js.map} +0 -0
  110. /package/dist/{property-YP4GHQAR.js.map → property-4EXPWRNT.js.map} +0 -0
  111. /package/dist/{release-NDRHPW6V.js.map → release-2SMK5Y3V.js.map} +0 -0
  112. /package/dist/{sandbox-OOCANWOG.js.map → sandbox-ORAPKOH3.js.map} +0 -0
  113. /package/dist/{scenarios-2HRLCGFY.js.map → scenarios-DM5FDCAF.js.map} +0 -0
  114. /package/dist/{spec-XZ2TKUFZ.js.map → spec-KO5QD6AY.js.map} +0 -0
  115. /package/dist/{src-HL7HEJIW.js.map → src-DSD34JIX.js.map} +0 -0
  116. /package/dist/{src-CV57ZD6I.js.map → src-PDYXACRP.js.map} +0 -0
  117. /package/dist/{start-IYKF3C3X.js.map → start-2ECN4LX5.js.map} +0 -0
  118. /package/dist/{src-OU7544PM.js.map → tag-R5I72HJ6.js.map} +0 -0
  119. /package/dist/{task-MCUHAVTD.js.map → task-V3JMSJIM.js.map} +0 -0
  120. /package/dist/{test-suite-BICBRSBP.js.map → test-suite-NOYVK6YX.js.map} +0 -0
  121. /package/dist/{tag-T45MMSCH.js.map → trace-NOYEKNO4.js.map} +0 -0
  122. /package/dist/{trace-2BAPMYAS.js.map → triage-4RFATHBE.js.map} +0 -0
  123. /package/dist/{workflow-proposals-5E3DTYZB.js.map → workflow-proposals-67AVGMHX.js.map} +0 -0
@@ -7,7 +7,7 @@ import {
7
7
  parseTraceGroups,
8
8
  reconstructSnapshots,
9
9
  toMutationIndex
10
- } from "./chunk-PXFDH6YL.js";
10
+ } from "./chunk-A4ISG3VX.js";
11
11
  import "./chunk-VKVL7WBN.js";
12
12
  export {
13
13
  cleanupTrace,
@@ -18,4 +18,4 @@ export {
18
18
  reconstructSnapshots,
19
19
  toMutationIndex
20
20
  };
21
- //# sourceMappingURL=src-OU7544PM.js.map
21
+ //# sourceMappingURL=src-PDYXACRP.js.map
@@ -1,21 +1,21 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
- import {
3
- createSession
4
- } from "./chunk-J6SH7GQT.js";
5
2
  import {
6
3
  downloadStorageState,
7
4
  fetchList,
8
5
  promptChoice,
9
6
  selectProperty
10
- } from "./chunk-CFJXYPTF.js";
7
+ } from "./chunk-UAJUZLDE.js";
11
8
  import "./chunk-3CZU7XCS.js";
9
+ import {
10
+ createSession
11
+ } from "./chunk-J6SH7GQT.js";
12
12
  import {
13
13
  getArgValue,
14
14
  resolveConfig
15
15
  } from "./chunk-IGHDIWZU.js";
16
16
  import "./chunk-32P26BZT.js";
17
17
  import "./chunk-JWHYXEA2.js";
18
- import "./chunk-IWKJQZJQ.js";
18
+ import "./chunk-GZVCNYR4.js";
19
19
  import "./chunk-VKVL7WBN.js";
20
20
 
21
21
  // src/local/start.ts
@@ -149,4 +149,4 @@ Use \`canary session\` commands to interact with the browser.`);
149
149
  export {
150
150
  runLocalStart
151
151
  };
152
- //# sourceMappingURL=start-IYKF3C3X.js.map
152
+ //# sourceMappingURL=start-2ECN4LX5.js.map
@@ -5,13 +5,13 @@ import {
5
5
  formatUnknownTagsError,
6
6
  resolveTagNames,
7
7
  runTag
8
- } from "./chunk-VKBTI5EF.js";
9
- import "./chunk-CFJXYPTF.js";
8
+ } from "./chunk-D6AVOPOS.js";
9
+ import "./chunk-UAJUZLDE.js";
10
10
  import "./chunk-3CZU7XCS.js";
11
11
  import "./chunk-IGHDIWZU.js";
12
12
  import "./chunk-32P26BZT.js";
13
13
  import "./chunk-JWHYXEA2.js";
14
- import "./chunk-IWKJQZJQ.js";
14
+ import "./chunk-GZVCNYR4.js";
15
15
  import "./chunk-VKVL7WBN.js";
16
16
  export {
17
17
  applyWorkflowTagFlags,
@@ -20,4 +20,4 @@ export {
20
20
  resolveTagNames,
21
21
  runTag
22
22
  };
23
- //# sourceMappingURL=tag-T45MMSCH.js.map
23
+ //# sourceMappingURL=tag-R5I72HJ6.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
2
  import {
3
3
  apiRequest
4
- } from "./chunk-CFJXYPTF.js";
4
+ } from "./chunk-UAJUZLDE.js";
5
5
  import "./chunk-3CZU7XCS.js";
6
6
  import {
7
7
  getArgValue,
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-IGHDIWZU.js";
11
11
  import "./chunk-32P26BZT.js";
12
12
  import "./chunk-JWHYXEA2.js";
13
- import "./chunk-IWKJQZJQ.js";
13
+ import "./chunk-GZVCNYR4.js";
14
14
  import "./chunk-VKVL7WBN.js";
15
15
 
16
16
  // src/task.ts
@@ -920,4 +920,4 @@ async function runTask(argv) {
920
920
  export {
921
921
  runTask
922
922
  };
923
- //# sourceMappingURL=task-MCUHAVTD.js.map
923
+ //# sourceMappingURL=task-V3JMSJIM.js.map
@@ -1,13 +1,13 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
2
  import {
3
3
  runRemoteTest
4
- } from "./chunk-CJEKEW7R.js";
4
+ } from "./chunk-LFFWD5JZ.js";
5
5
  import {
6
6
  isTriageEnabledForExecution
7
- } from "./chunk-ZXRVFFCY.js";
7
+ } from "./chunk-DT2CEH2V.js";
8
8
  import {
9
9
  apiRequest
10
- } from "./chunk-CFJXYPTF.js";
10
+ } from "./chunk-UAJUZLDE.js";
11
11
  import "./chunk-3CZU7XCS.js";
12
12
  import {
13
13
  getArgValue,
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-IGHDIWZU.js";
17
17
  import "./chunk-32P26BZT.js";
18
18
  import "./chunk-JWHYXEA2.js";
19
- import "./chunk-IWKJQZJQ.js";
19
+ import "./chunk-GZVCNYR4.js";
20
20
  import "./chunk-VKVL7WBN.js";
21
21
 
22
22
  // src/test-suite.ts
@@ -396,4 +396,4 @@ async function runTestSuite(argv) {
396
396
  export {
397
397
  runTestSuite
398
398
  };
399
- //# sourceMappingURL=test-suite-BICBRSBP.js.map
399
+ //# sourceMappingURL=test-suite-NOYVK6YX.js.map
@@ -1,16 +1,15 @@
1
1
  import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
2
  import {
3
3
  runTrace
4
- } from "./chunk-HKQ5XQAQ.js";
4
+ } from "./chunk-CEXV3MOC.js";
5
5
  import "./chunk-IGHDIWZU.js";
6
6
  import "./chunk-32P26BZT.js";
7
- import "./chunk-5R4HMSNX.js";
7
+ import "./chunk-AI3Y3AZH.js";
8
8
  import "./chunk-JWHYXEA2.js";
9
- import "./chunk-IWKJQZJQ.js";
9
+ import "./chunk-GZVCNYR4.js";
10
10
  import "./chunk-6LEZCKKV.js";
11
- import "./chunk-KRWRUU6R.js";
12
11
  import "./chunk-VKVL7WBN.js";
13
12
  export {
14
13
  runTrace
15
14
  };
16
- //# sourceMappingURL=trace-2BAPMYAS.js.map
15
+ //# sourceMappingURL=trace-NOYEKNO4.js.map
@@ -2,16 +2,16 @@ import { createRequire as __cr } from "module"; const require = __cr(import.meta
2
2
  import {
3
3
  isTriageEnabledForExecution,
4
4
  runTriage
5
- } from "./chunk-ZXRVFFCY.js";
6
- import "./chunk-CFJXYPTF.js";
5
+ } from "./chunk-DT2CEH2V.js";
6
+ import "./chunk-UAJUZLDE.js";
7
7
  import "./chunk-3CZU7XCS.js";
8
8
  import "./chunk-IGHDIWZU.js";
9
9
  import "./chunk-32P26BZT.js";
10
10
  import "./chunk-JWHYXEA2.js";
11
- import "./chunk-IWKJQZJQ.js";
11
+ import "./chunk-GZVCNYR4.js";
12
12
  import "./chunk-VKVL7WBN.js";
13
13
  export {
14
14
  isTriageEnabledForExecution,
15
15
  runTriage
16
16
  };
17
- //# sourceMappingURL=triage-M3RZ2ASB.js.map
17
+ //# sourceMappingURL=triage-4RFATHBE.js.map
@@ -0,0 +1,441 @@
1
+ import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);
2
+ import {
3
+ apiRequest
4
+ } from "./chunk-UAJUZLDE.js";
5
+ import "./chunk-3CZU7XCS.js";
6
+ import {
7
+ getArgValue,
8
+ hasFlag,
9
+ resolveConfig
10
+ } from "./chunk-IGHDIWZU.js";
11
+ import "./chunk-32P26BZT.js";
12
+ import "./chunk-JWHYXEA2.js";
13
+ import "./chunk-GZVCNYR4.js";
14
+ import "./chunk-VKVL7WBN.js";
15
+
16
+ // src/utilities.ts
17
+ import fs from "fs/promises";
18
+ import path from "path";
19
+ import process from "process";
20
+ function getAllArgValues(argv, key) {
21
+ const out = [];
22
+ for (let i = 0; i < argv.length; i++) {
23
+ if (argv[i] === key && i + 1 < argv.length) out.push(argv[i + 1]);
24
+ }
25
+ return out;
26
+ }
27
+ function parseTtlSeconds(raw) {
28
+ if (!raw) return void 0;
29
+ const m = raw.trim().match(/^(\d+)\s*(s|m|h|d)?$/i);
30
+ if (!m) {
31
+ console.error(`Error: invalid --ttl '${raw}'. Use e.g. 30s, 15m, 24h, 7d, or seconds.`);
32
+ process.exit(1);
33
+ }
34
+ const n = Number(m[1]);
35
+ const unit = (m[2] ?? "s").toLowerCase();
36
+ const mult = unit === "d" ? 86400 : unit === "h" ? 3600 : unit === "m" ? 60 : 1;
37
+ return n * mult;
38
+ }
39
+ function formatSize(bytes) {
40
+ if (bytes < 1024) return `${bytes} B`;
41
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
42
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
43
+ }
44
+ async function readStdin() {
45
+ const chunks = [];
46
+ for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
47
+ return Buffer.concat(chunks).toString("utf-8");
48
+ }
49
+ async function resolveBody(argv) {
50
+ const inline = getArgValue(argv, "--body");
51
+ if (inline !== void 0) return inline;
52
+ const file = getArgValue(argv, "--body-file");
53
+ if (file) {
54
+ try {
55
+ return await fs.readFile(file, "utf-8");
56
+ } catch (err) {
57
+ console.error(`Error: failed to read ${file}: ${err instanceof Error ? err.message : err}`);
58
+ process.exit(1);
59
+ }
60
+ }
61
+ if (hasFlag(argv, "--stdin")) return readStdin();
62
+ console.error("Error: provide a body via --body <text>, --body-file <path>, or --stdin.");
63
+ process.exit(1);
64
+ }
65
+ function printHelp() {
66
+ console.log(
67
+ [
68
+ "Usage: cofactor utilities <group> <sub-command> [options]",
69
+ "",
70
+ "A freeform toolkit for building and sharing reports.",
71
+ "",
72
+ "Objects (images / videos / files):",
73
+ " object upload <file> [--public] [--ttl 7d] [--name <n>] [--json]",
74
+ " object list [--kind image|video|data|all] [--search <q>] [--json]",
75
+ " object url <id> [--download] Print a shareable/signed link",
76
+ " object delete <id>",
77
+ "",
78
+ "Gists (text / markdown, viewable in the web app):",
79
+ " gist create [<file> | --stdin] [--title <t>] [--format markdown|text]",
80
+ " [--public] [--ttl 7d] [--json]",
81
+ " gist list [--search <q>] [--json]",
82
+ " gist get <id> [--raw] --raw prints content; default shows metadata + link",
83
+ " gist delete <id>",
84
+ "",
85
+ "Messaging (org members only \u2014 see `cofactor org members`):",
86
+ " email --to <member> [--to ...] --subject <s> (--body <t> | --body-file <f> | --stdin)",
87
+ " slack --to <member> [--to ...] (--body <t> | --body-file <f> | --stdin)",
88
+ "",
89
+ "Common options:",
90
+ " --env <prod|dev|local> Target environment",
91
+ " --json Machine-readable output",
92
+ "",
93
+ "Recipe \u2014 build & share a report:",
94
+ " 1. Upload evidence: cofactor utilities object upload chart.png --public",
95
+ ' 2. Write a report: cofactor utilities gist create report.md --public --title "Run 42"',
96
+ " (embed the object URLs from step 1 as markdown images)",
97
+ ' 3. Share the link: cofactor utilities slack --to alex@acme.com --body "Report: <gist url>"'
98
+ ].join("\n")
99
+ );
100
+ }
101
+ async function objectUpload(argv, apiUrl, token) {
102
+ const filePath = argv.find((a) => !a.startsWith("-"));
103
+ if (!filePath) {
104
+ console.error("Error: missing file path. Usage: utilities object upload <file> [--public] [--ttl 7d]");
105
+ process.exit(1);
106
+ }
107
+ const isPublic = hasFlag(argv, "--public");
108
+ const ttlSeconds = parseTtlSeconds(getArgValue(argv, "--ttl"));
109
+ const overrideName = getArgValue(argv, "--name");
110
+ const jsonOutput = hasFlag(argv, "--json");
111
+ let buf;
112
+ try {
113
+ buf = await fs.readFile(filePath);
114
+ } catch (err) {
115
+ console.error(`Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`);
116
+ process.exit(1);
117
+ }
118
+ const filename = overrideName ?? path.basename(filePath);
119
+ const form = new FormData();
120
+ form.append("file", new Blob([new Uint8Array(buf)]), filename);
121
+ form.append("visibility", isPublic ? "public" : "private");
122
+ if (ttlSeconds) form.append("ttlSeconds", String(ttlSeconds));
123
+ if (overrideName) form.append("filename", overrideName);
124
+ const res = await fetch(`${apiUrl}/org/utilities/objects`, {
125
+ method: "POST",
126
+ headers: { Authorization: `Bearer ${token}` },
127
+ body: form
128
+ });
129
+ if (res.status === 401) {
130
+ console.error("Error: Unauthorized. Run: cofactor login");
131
+ process.exit(1);
132
+ }
133
+ let body;
134
+ try {
135
+ body = await res.json();
136
+ } catch {
137
+ console.error(`Error: invalid JSON response (${res.status})`);
138
+ process.exit(1);
139
+ }
140
+ if (!body.ok || !body.data) {
141
+ console.error(`Error: ${body.error ?? `upload failed (${res.status})`}`);
142
+ process.exit(1);
143
+ }
144
+ const created = body.data;
145
+ if (jsonOutput) {
146
+ console.log(JSON.stringify(created, null, 2));
147
+ return;
148
+ }
149
+ console.log(`\u2713 Uploaded ${created.filename} (${created.visibility})`);
150
+ console.log(` ID: ${created.id}`);
151
+ console.log(` Type: ${created.contentType} Size: ${formatSize(created.sizeBytes)}`);
152
+ if (created.expiresAt) console.log(` Expires: ${created.expiresAt}`);
153
+ console.log(` Link: ${created.url}`);
154
+ if (created.visibility === "private") {
155
+ console.log(" (private link is short-lived \u2014 re-mint with: utilities object url " + created.id + ")");
156
+ }
157
+ }
158
+ async function objectList(argv, apiUrl, token) {
159
+ const params = new URLSearchParams();
160
+ const kind = getArgValue(argv, "--kind");
161
+ const search = getArgValue(argv, "--search");
162
+ if (kind) params.set("kind", kind);
163
+ if (search) params.set("search", search);
164
+ const qs = params.toString();
165
+ const result = await apiRequest(
166
+ apiUrl,
167
+ token,
168
+ "GET",
169
+ `/org/utilities/objects${qs ? `?${qs}` : ""}`
170
+ );
171
+ if (!result.ok) {
172
+ console.error(`Error: ${result.error}`);
173
+ process.exit(1);
174
+ }
175
+ if (hasFlag(argv, "--json")) {
176
+ console.log(JSON.stringify(result.data, null, 2));
177
+ return;
178
+ }
179
+ if (result.data.length === 0) {
180
+ console.log("No objects.");
181
+ return;
182
+ }
183
+ for (const o of result.data) {
184
+ console.log(`${o.id} ${o.visibility.padEnd(7)} ${formatSize(o.sizeBytes).padStart(8)} ${o.filename}`);
185
+ }
186
+ }
187
+ async function objectUrl(argv, apiUrl, token) {
188
+ const id = argv.find((a) => !a.startsWith("-"));
189
+ if (!id) {
190
+ console.error("Error: missing object id. Usage: utilities object url <id> [--download]");
191
+ process.exit(1);
192
+ }
193
+ const dl = hasFlag(argv, "--download") ? "?dl=1" : "";
194
+ const result = await apiRequest(
195
+ apiUrl,
196
+ token,
197
+ "GET",
198
+ `/org/utilities/objects/${id}/url${dl}`
199
+ );
200
+ if (!result.ok || !result.url) {
201
+ console.error(`Error: ${result.error ?? "failed to get URL"}`);
202
+ process.exit(1);
203
+ }
204
+ console.log(result.url);
205
+ }
206
+ async function objectDelete(argv, apiUrl, token) {
207
+ const id = argv.find((a) => !a.startsWith("-"));
208
+ if (!id) {
209
+ console.error("Error: missing object id. Usage: utilities object delete <id>");
210
+ process.exit(1);
211
+ }
212
+ const result = await apiRequest(
213
+ apiUrl,
214
+ token,
215
+ "DELETE",
216
+ `/org/utilities/objects/${id}`
217
+ );
218
+ if (!result.ok) {
219
+ console.error(`Error: ${result.error}`);
220
+ process.exit(1);
221
+ }
222
+ console.log(`\u2713 Deleted ${id}`);
223
+ }
224
+ async function gistCreate(argv, apiUrl, token) {
225
+ const filePath = argv.find((a) => !a.startsWith("-"));
226
+ let content;
227
+ if (filePath) {
228
+ try {
229
+ content = await fs.readFile(filePath, "utf-8");
230
+ } catch (err) {
231
+ console.error(`Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`);
232
+ process.exit(1);
233
+ }
234
+ } else if (hasFlag(argv, "--stdin")) {
235
+ content = await readStdin();
236
+ } else {
237
+ const inline = getArgValue(argv, "--content");
238
+ if (inline === void 0) {
239
+ console.error("Error: provide content via a <file> arg, --stdin, or --content <text>.");
240
+ process.exit(1);
241
+ }
242
+ content = inline;
243
+ }
244
+ const title = getArgValue(argv, "--title") ?? (filePath ? path.basename(filePath) : "Untitled gist");
245
+ const format = getArgValue(argv, "--format") ?? "markdown";
246
+ const visibility = hasFlag(argv, "--public") ? "public" : "private";
247
+ const ttlSeconds = parseTtlSeconds(getArgValue(argv, "--ttl"));
248
+ const result = await apiRequest(
249
+ apiUrl,
250
+ token,
251
+ "POST",
252
+ "/org/utilities/gists",
253
+ { title, content, format, visibility, ...ttlSeconds ? { ttlSeconds } : {} }
254
+ );
255
+ if (!result.ok || !result.data) {
256
+ console.error(`Error: ${result.error ?? "failed to create gist"}`);
257
+ process.exit(1);
258
+ }
259
+ if (hasFlag(argv, "--json")) {
260
+ console.log(JSON.stringify(result.data, null, 2));
261
+ return;
262
+ }
263
+ console.log(`\u2713 Created gist "${result.data.title}" (${result.data.visibility})`);
264
+ console.log(` ID: ${result.data.id}`);
265
+ if (result.data.viewUrl) console.log(` Public link: ${result.data.viewUrl}`);
266
+ else console.log(" View in the web app under Utilities \u2192 Gists.");
267
+ }
268
+ async function gistList(argv, apiUrl, token) {
269
+ const search = getArgValue(argv, "--search");
270
+ const qs = search ? `?search=${encodeURIComponent(search)}` : "";
271
+ const result = await apiRequest(
272
+ apiUrl,
273
+ token,
274
+ "GET",
275
+ `/org/utilities/gists${qs}`
276
+ );
277
+ if (!result.ok) {
278
+ console.error(`Error: ${result.error}`);
279
+ process.exit(1);
280
+ }
281
+ if (hasFlag(argv, "--json")) {
282
+ console.log(JSON.stringify(result.data, null, 2));
283
+ return;
284
+ }
285
+ if (result.data.length === 0) {
286
+ console.log("No gists.");
287
+ return;
288
+ }
289
+ for (const g of result.data) {
290
+ console.log(`${g.id} ${g.visibility.padEnd(7)} ${g.format.padEnd(8)} ${g.title}`);
291
+ }
292
+ }
293
+ async function gistGet(argv, apiUrl, token) {
294
+ const id = argv.find((a) => !a.startsWith("-"));
295
+ if (!id) {
296
+ console.error("Error: missing gist id. Usage: utilities gist get <id> [--raw]");
297
+ process.exit(1);
298
+ }
299
+ const result = await apiRequest(
300
+ apiUrl,
301
+ token,
302
+ "GET",
303
+ `/org/utilities/gists/${id}`
304
+ );
305
+ if (!result.ok || !result.data) {
306
+ console.error(`Error: ${result.error ?? "gist not found"}`);
307
+ process.exit(1);
308
+ }
309
+ if (hasFlag(argv, "--raw")) {
310
+ process.stdout.write(result.data.content ?? "");
311
+ return;
312
+ }
313
+ if (hasFlag(argv, "--json")) {
314
+ console.log(JSON.stringify(result.data, null, 2));
315
+ return;
316
+ }
317
+ console.log(`${result.data.title} (${result.data.visibility}, ${result.data.format})`);
318
+ console.log(` ID: ${result.data.id}`);
319
+ if (result.data.viewUrl) console.log(` Public link: ${result.data.viewUrl}`);
320
+ console.log("");
321
+ console.log(result.data.content ?? "");
322
+ }
323
+ async function gistDelete(argv, apiUrl, token) {
324
+ const id = argv.find((a) => !a.startsWith("-"));
325
+ if (!id) {
326
+ console.error("Error: missing gist id. Usage: utilities gist delete <id>");
327
+ process.exit(1);
328
+ }
329
+ const result = await apiRequest(
330
+ apiUrl,
331
+ token,
332
+ "DELETE",
333
+ `/org/utilities/gists/${id}`
334
+ );
335
+ if (!result.ok) {
336
+ console.error(`Error: ${result.error}`);
337
+ process.exit(1);
338
+ }
339
+ console.log(`\u2713 Deleted ${id}`);
340
+ }
341
+ async function sendEmail(argv, apiUrl, token) {
342
+ const recipients = getAllArgValues(argv, "--to");
343
+ const subject = getArgValue(argv, "--subject");
344
+ if (recipients.length === 0 || !subject) {
345
+ console.error("Error: usage: utilities email --to <member> [--to ...] --subject <s> (--body <t> | --body-file <f> | --stdin)");
346
+ process.exit(1);
347
+ }
348
+ const body = await resolveBody(argv);
349
+ const result = await apiRequest(
350
+ apiUrl,
351
+ token,
352
+ "POST",
353
+ "/org/utilities/email",
354
+ { recipients, subject, body }
355
+ );
356
+ if (!result.ok) {
357
+ console.error(`Error: ${result.error}`);
358
+ process.exit(1);
359
+ }
360
+ console.log(`\u2713 Email sent to ${result.data?.sent ?? recipients.length} recipient(s).`);
361
+ }
362
+ async function sendSlack(argv, apiUrl, token) {
363
+ const recipients = getAllArgValues(argv, "--to");
364
+ if (recipients.length === 0) {
365
+ console.error("Error: usage: utilities slack --to <member> [--to ...] (--body <t> | --body-file <f> | --stdin)");
366
+ process.exit(1);
367
+ }
368
+ const body = await resolveBody(argv);
369
+ const result = await apiRequest(
370
+ apiUrl,
371
+ token,
372
+ "POST",
373
+ "/org/utilities/slack",
374
+ { recipients, body }
375
+ );
376
+ if (!result.ok) {
377
+ console.error(`Error: ${result.error}`);
378
+ process.exit(1);
379
+ }
380
+ console.log(`\u2713 Slack message sent to ${result.data?.sent ?? recipients.length} recipient(s).`);
381
+ }
382
+ async function runObject(argv, apiUrl, token) {
383
+ const [sub, ...rest] = argv;
384
+ switch (sub) {
385
+ case "upload":
386
+ return objectUpload(rest, apiUrl, token);
387
+ case "list":
388
+ return objectList(rest, apiUrl, token);
389
+ case "url":
390
+ return objectUrl(rest, apiUrl, token);
391
+ case "delete":
392
+ return objectDelete(rest, apiUrl, token);
393
+ default:
394
+ console.error(`Unknown object sub-command: ${sub ?? "(none)"}`);
395
+ printHelp();
396
+ process.exit(1);
397
+ }
398
+ }
399
+ async function runGist(argv, apiUrl, token) {
400
+ const [sub, ...rest] = argv;
401
+ switch (sub) {
402
+ case "create":
403
+ return gistCreate(rest, apiUrl, token);
404
+ case "list":
405
+ return gistList(rest, apiUrl, token);
406
+ case "get":
407
+ return gistGet(rest, apiUrl, token);
408
+ case "delete":
409
+ return gistDelete(rest, apiUrl, token);
410
+ default:
411
+ console.error(`Unknown gist sub-command: ${sub ?? "(none)"}`);
412
+ printHelp();
413
+ process.exit(1);
414
+ }
415
+ }
416
+ async function runUtilities(argv) {
417
+ const [group, ...rest] = argv;
418
+ if (!group || group === "help" || hasFlag(argv, "--help", "-h")) {
419
+ printHelp();
420
+ return;
421
+ }
422
+ const { apiUrl, token } = await resolveConfig(rest);
423
+ switch (group) {
424
+ case "object":
425
+ return runObject(rest, apiUrl, token);
426
+ case "gist":
427
+ return runGist(rest, apiUrl, token);
428
+ case "email":
429
+ return sendEmail(rest, apiUrl, token);
430
+ case "slack":
431
+ return sendSlack(rest, apiUrl, token);
432
+ default:
433
+ console.error(`Unknown utilities group: ${group}`);
434
+ printHelp();
435
+ process.exit(1);
436
+ }
437
+ }
438
+ export {
439
+ runUtilities
440
+ };
441
+ //# sourceMappingURL=utilities-3WMXE743.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utilities.ts"],"sourcesContent":["/**\n * CLI Utilities Commands — a freeform agent toolkit.\n *\n * Three primitives for building and sharing reports:\n * - object: upload images/videos/files to the CDN (public or private), with\n * optional TTL, and get shareable / signed links.\n * - gist: publish text/markdown viewable in the Cofactor web app.\n * - email / slack: send one-off messages to ORG MEMBERS (looked up by email\n * or name). Use `cofactor org members` to see who can receive them.\n *\n * @module utilities\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag } from './auth.js';\nimport { apiRequest } from './cli-helpers.js';\n\n// ── shared helpers ─────────────────────────────────────────────────────────\n\n/** Collect every value for a repeated flag, e.g. `--to a --to b`. */\nfunction getAllArgValues(argv: string[], key: string): string[] {\n const out: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === key && i + 1 < argv.length) out.push(argv[i + 1]!);\n }\n return out;\n}\n\n/** Parse a human duration (`30s`, `15m`, `24h`, `7d`, or bare seconds) → seconds. */\nfunction parseTtlSeconds(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const m = raw.trim().match(/^(\\d+)\\s*(s|m|h|d)?$/i);\n if (!m) {\n console.error(`Error: invalid --ttl '${raw}'. Use e.g. 30s, 15m, 24h, 7d, or seconds.`);\n process.exit(1);\n }\n const n = Number(m[1]);\n const unit = (m[2] ?? 's').toLowerCase();\n const mult = unit === 'd' ? 86400 : unit === 'h' ? 3600 : unit === 'm' ? 60 : 1;\n return n * mult;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf-8');\n}\n\n/** Resolve message/gist body from --body, --body-file, or --stdin. */\nasync function resolveBody(argv: string[]): Promise<string> {\n const inline = getArgValue(argv, '--body');\n if (inline !== undefined) return inline;\n const file = getArgValue(argv, '--body-file');\n if (file) {\n try {\n return await fs.readFile(file, 'utf-8');\n } catch (err) {\n console.error(`Error: failed to read ${file}: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n }\n if (hasFlag(argv, '--stdin')) return readStdin();\n console.error('Error: provide a body via --body <text>, --body-file <path>, or --stdin.');\n process.exit(1);\n}\n\n// ── help ───────────────────────────────────────────────────────────────────\n\nfunction printHelp(): void {\n console.log(\n [\n 'Usage: cofactor utilities <group> <sub-command> [options]',\n '',\n 'A freeform toolkit for building and sharing reports.',\n '',\n 'Objects (images / videos / files):',\n ' object upload <file> [--public] [--ttl 7d] [--name <n>] [--json]',\n ' object list [--kind image|video|data|all] [--search <q>] [--json]',\n ' object url <id> [--download] Print a shareable/signed link',\n ' object delete <id>',\n '',\n 'Gists (text / markdown, viewable in the web app):',\n ' gist create [<file> | --stdin] [--title <t>] [--format markdown|text]',\n ' [--public] [--ttl 7d] [--json]',\n ' gist list [--search <q>] [--json]',\n ' gist get <id> [--raw] --raw prints content; default shows metadata + link',\n ' gist delete <id>',\n '',\n 'Messaging (org members only — see `cofactor org members`):',\n ' email --to <member> [--to ...] --subject <s> (--body <t> | --body-file <f> | --stdin)',\n ' slack --to <member> [--to ...] (--body <t> | --body-file <f> | --stdin)',\n '',\n 'Common options:',\n ' --env <prod|dev|local> Target environment',\n ' --json Machine-readable output',\n '',\n 'Recipe — build & share a report:',\n ' 1. Upload evidence: cofactor utilities object upload chart.png --public',\n ' 2. Write a report: cofactor utilities gist create report.md --public --title \"Run 42\"',\n ' (embed the object URLs from step 1 as markdown images)',\n ' 3. Share the link: cofactor utilities slack --to alex@acme.com --body \"Report: <gist url>\"',\n ].join('\\n')\n );\n}\n\n// ── objects ──────────────────────────────────────────────────────────────\n\ntype ObjectItem = {\n id: string;\n visibility: 'public' | 'private';\n filename: string;\n contentType: string;\n sizeBytes: number;\n expiresAt: string | null;\n createdAt: string;\n publicUrl: string | null;\n};\n\nasync function objectUpload(argv: string[], apiUrl: string, token: string): Promise<void> {\n const filePath = argv.find((a) => !a.startsWith('-'));\n if (!filePath) {\n console.error('Error: missing file path. Usage: utilities object upload <file> [--public] [--ttl 7d]');\n process.exit(1);\n }\n const isPublic = hasFlag(argv, '--public');\n const ttlSeconds = parseTtlSeconds(getArgValue(argv, '--ttl'));\n const overrideName = getArgValue(argv, '--name');\n const jsonOutput = hasFlag(argv, '--json');\n\n let buf: Buffer;\n try {\n buf = await fs.readFile(filePath);\n } catch (err) {\n console.error(`Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n const filename = overrideName ?? path.basename(filePath);\n\n const form = new FormData();\n form.append('file', new Blob([new Uint8Array(buf)]), filename);\n form.append('visibility', isPublic ? 'public' : 'private');\n if (ttlSeconds) form.append('ttlSeconds', String(ttlSeconds));\n if (overrideName) form.append('filename', overrideName);\n\n const res = await fetch(`${apiUrl}/org/utilities/objects`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n body: form,\n });\n if (res.status === 401) {\n console.error('Error: Unauthorized. Run: cofactor login');\n process.exit(1);\n }\n let body: { ok: boolean; error?: string; data?: ObjectItem & { url: string } };\n try {\n body = (await res.json()) as typeof body;\n } catch {\n console.error(`Error: invalid JSON response (${res.status})`);\n process.exit(1);\n }\n if (!body.ok || !body.data) {\n console.error(`Error: ${body.error ?? `upload failed (${res.status})`}`);\n process.exit(1);\n }\n\n const created = body.data;\n if (jsonOutput) {\n console.log(JSON.stringify(created, null, 2));\n return;\n }\n console.log(`✓ Uploaded ${created.filename} (${created.visibility})`);\n console.log(` ID: ${created.id}`);\n console.log(` Type: ${created.contentType} Size: ${formatSize(created.sizeBytes)}`);\n if (created.expiresAt) console.log(` Expires: ${created.expiresAt}`);\n console.log(` Link: ${created.url}`);\n if (created.visibility === 'private') {\n console.log(' (private link is short-lived — re-mint with: utilities object url ' + created.id + ')');\n }\n}\n\nasync function objectList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const params = new URLSearchParams();\n const kind = getArgValue(argv, '--kind');\n const search = getArgValue(argv, '--search');\n if (kind) params.set('kind', kind);\n if (search) params.set('search', search);\n const qs = params.toString();\n\n const result = await apiRequest<{ ok: boolean; error?: string; data: ObjectItem[] }>(\n apiUrl,\n token,\n 'GET',\n `/org/utilities/objects${qs ? `?${qs}` : ''}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.data, null, 2));\n return;\n }\n if (result.data.length === 0) {\n console.log('No objects.');\n return;\n }\n for (const o of result.data) {\n console.log(`${o.id} ${o.visibility.padEnd(7)} ${formatSize(o.sizeBytes).padStart(8)} ${o.filename}`);\n }\n}\n\nasync function objectUrl(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing object id. Usage: utilities object url <id> [--download]');\n process.exit(1);\n }\n const dl = hasFlag(argv, '--download') ? '?dl=1' : '';\n const result = await apiRequest<{ ok: boolean; error?: string; url?: string }>(\n apiUrl,\n token,\n 'GET',\n `/org/utilities/objects/${id}/url${dl}`\n );\n if (!result.ok || !result.url) {\n console.error(`Error: ${result.error ?? 'failed to get URL'}`);\n process.exit(1);\n }\n console.log(result.url);\n}\n\nasync function objectDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing object id. Usage: utilities object delete <id>');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n `/org/utilities/objects/${id}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n console.log(`✓ Deleted ${id}`);\n}\n\n// ── gists ────────────────────────────────────────────────────────────────\n\ntype GistItem = {\n id: string;\n slug: string;\n title: string;\n content?: string;\n format: 'text' | 'markdown';\n visibility: 'public' | 'private';\n expiresAt: string | null;\n createdAt: string;\n viewUrl?: string | null;\n};\n\nasync function gistCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const filePath = argv.find((a) => !a.startsWith('-'));\n let content: string;\n if (filePath) {\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n console.error(`Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n } else if (hasFlag(argv, '--stdin')) {\n content = await readStdin();\n } else {\n const inline = getArgValue(argv, '--content');\n if (inline === undefined) {\n console.error('Error: provide content via a <file> arg, --stdin, or --content <text>.');\n process.exit(1);\n }\n content = inline;\n }\n\n const title =\n getArgValue(argv, '--title') ?? (filePath ? path.basename(filePath) : 'Untitled gist');\n const format = (getArgValue(argv, '--format') as 'text' | 'markdown') ?? 'markdown';\n const visibility = hasFlag(argv, '--public') ? 'public' : 'private';\n const ttlSeconds = parseTtlSeconds(getArgValue(argv, '--ttl'));\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: GistItem }>(\n apiUrl,\n token,\n 'POST',\n '/org/utilities/gists',\n { title, content, format, visibility, ...(ttlSeconds ? { ttlSeconds } : {}) }\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'failed to create gist'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.data, null, 2));\n return;\n }\n console.log(`✓ Created gist \"${result.data.title}\" (${result.data.visibility})`);\n console.log(` ID: ${result.data.id}`);\n if (result.data.viewUrl) console.log(` Public link: ${result.data.viewUrl}`);\n else console.log(' View in the web app under Utilities → Gists.');\n}\n\nasync function gistList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const search = getArgValue(argv, '--search');\n const qs = search ? `?search=${encodeURIComponent(search)}` : '';\n const result = await apiRequest<{ ok: boolean; error?: string; data: GistItem[] }>(\n apiUrl,\n token,\n 'GET',\n `/org/utilities/gists${qs}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.data, null, 2));\n return;\n }\n if (result.data.length === 0) {\n console.log('No gists.');\n return;\n }\n for (const g of result.data) {\n console.log(`${g.id} ${g.visibility.padEnd(7)} ${g.format.padEnd(8)} ${g.title}`);\n }\n}\n\nasync function gistGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing gist id. Usage: utilities gist get <id> [--raw]');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string; data?: GistItem }>(\n apiUrl,\n token,\n 'GET',\n `/org/utilities/gists/${id}`\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'gist not found'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--raw')) {\n process.stdout.write(result.data.content ?? '');\n return;\n }\n if (hasFlag(argv, '--json')) {\n console.log(JSON.stringify(result.data, null, 2));\n return;\n }\n console.log(`${result.data.title} (${result.data.visibility}, ${result.data.format})`);\n console.log(` ID: ${result.data.id}`);\n if (result.data.viewUrl) console.log(` Public link: ${result.data.viewUrl}`);\n console.log('');\n console.log(result.data.content ?? '');\n}\n\nasync function gistDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing gist id. Usage: utilities gist delete <id>');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n `/org/utilities/gists/${id}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n console.log(`✓ Deleted ${id}`);\n}\n\n// ── messaging ──────────────────────────────────────────────────────────────\n\nasync function sendEmail(argv: string[], apiUrl: string, token: string): Promise<void> {\n const recipients = getAllArgValues(argv, '--to');\n const subject = getArgValue(argv, '--subject');\n if (recipients.length === 0 || !subject) {\n console.error('Error: usage: utilities email --to <member> [--to ...] --subject <s> (--body <t> | --body-file <f> | --stdin)');\n process.exit(1);\n }\n const body = await resolveBody(argv);\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: { sent: number } }>(\n apiUrl,\n token,\n 'POST',\n '/org/utilities/email',\n { recipients, subject, body }\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n console.log(`✓ Email sent to ${result.data?.sent ?? recipients.length} recipient(s).`);\n}\n\nasync function sendSlack(argv: string[], apiUrl: string, token: string): Promise<void> {\n const recipients = getAllArgValues(argv, '--to');\n if (recipients.length === 0) {\n console.error('Error: usage: utilities slack --to <member> [--to ...] (--body <t> | --body-file <f> | --stdin)');\n process.exit(1);\n }\n const body = await resolveBody(argv);\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: { sent: number } }>(\n apiUrl,\n token,\n 'POST',\n '/org/utilities/slack',\n { recipients, body }\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n console.log(`✓ Slack message sent to ${result.data?.sent ?? recipients.length} recipient(s).`);\n}\n\n// ── dispatch ─────────────────────────────────────────────────────────────\n\nasync function runObject(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [sub, ...rest] = argv;\n switch (sub) {\n case 'upload':\n return objectUpload(rest, apiUrl, token);\n case 'list':\n return objectList(rest, apiUrl, token);\n case 'url':\n return objectUrl(rest, apiUrl, token);\n case 'delete':\n return objectDelete(rest, apiUrl, token);\n default:\n console.error(`Unknown object sub-command: ${sub ?? '(none)'}`);\n printHelp();\n process.exit(1);\n }\n}\n\nasync function runGist(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [sub, ...rest] = argv;\n switch (sub) {\n case 'create':\n return gistCreate(rest, apiUrl, token);\n case 'list':\n return gistList(rest, apiUrl, token);\n case 'get':\n return gistGet(rest, apiUrl, token);\n case 'delete':\n return gistDelete(rest, apiUrl, token);\n default:\n console.error(`Unknown gist sub-command: ${sub ?? '(none)'}`);\n printHelp();\n process.exit(1);\n }\n}\n\nexport async function runUtilities(argv: string[]): Promise<void> {\n const [group, ...rest] = argv;\n\n if (!group || group === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(rest);\n\n switch (group) {\n case 'object':\n return runObject(rest, apiUrl, token);\n case 'gist':\n return runGist(rest, apiUrl, token);\n case 'email':\n return sendEmail(rest, apiUrl, token);\n case 'slack':\n return sendSlack(rest, apiUrl, token);\n default:\n console.error(`Unknown utilities group: ${group}`);\n printHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}