@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.
- package/dist/{account-62I7FG5G.js → account-ZMV7NEFM.js} +4 -4
- package/dist/account-ZMV7NEFM.js.map +1 -0
- package/dist/{api-catalog-CAJUASVC.js → api-catalog-6HNOGVPA.js} +3 -3
- package/dist/{attachment-RL4AZUJE.js → attachment-QAHR54HQ.js} +3 -3
- package/dist/{augmentor-GAF3MFY6.js → augmentor-7T3L6ZR4.js} +3 -3
- package/dist/{chunk-26U3DGUM.js → chunk-7YJTQCPX.js} +3 -5
- package/dist/chunk-7YJTQCPX.js.map +1 -0
- package/dist/{chunk-PXFDH6YL.js → chunk-A4ISG3VX.js} +55 -15
- package/dist/{chunk-PXFDH6YL.js.map → chunk-A4ISG3VX.js.map} +1 -1
- package/dist/{chunk-5R4HMSNX.js → chunk-AI3Y3AZH.js} +24834 -24813
- package/dist/chunk-AI3Y3AZH.js.map +1 -0
- package/dist/{chunk-HKQ5XQAQ.js → chunk-CEXV3MOC.js} +3 -3
- package/dist/{chunk-VKBTI5EF.js → chunk-D6AVOPOS.js} +2 -2
- package/dist/{chunk-ZXRVFFCY.js → chunk-DT2CEH2V.js} +2 -2
- package/dist/{chunk-IWKJQZJQ.js → chunk-GZVCNYR4.js} +55 -55
- package/dist/chunk-GZVCNYR4.js.map +1 -0
- package/dist/{chunk-CJEKEW7R.js → chunk-LFFWD5JZ.js} +2 -2
- package/dist/{chunk-UZ2ZA5A6.js → chunk-RGDIVW3O.js} +2 -2
- package/dist/{chunk-CFJXYPTF.js → chunk-UAJUZLDE.js} +11 -3
- package/dist/chunk-UAJUZLDE.js.map +1 -0
- package/dist/{credential-JGVSEGVH.js → credential-X6QKX473.js} +3 -3
- package/dist/{credential-template-CWWMOKB2.js → credential-template-GD3D4MBI.js} +3 -3
- package/dist/{debug-workflow-BXRU72YZ.js → debug-workflow-AAEOAME2.js} +6 -6
- package/dist/{src-CV57ZD6I.js → dist-QLTVBUMD.js} +7 -9
- package/dist/{docs-PVBXPTGR.js → docs-BVUEXBY3.js} +3 -3
- package/dist/{environment-WZKIO3R3.js → environment-WE7VVE6I.js} +3 -3
- package/dist/{feature-flag-K5REGGDY.js → feature-flag-VJO2TJFT.js} +9 -8
- package/dist/feature-flag-VJO2TJFT.js.map +1 -0
- package/dist/index.js +129 -44
- package/dist/index.js.map +1 -1
- package/dist/{init-FFUZO5D7.js → init-RQHHKJJD.js} +8 -8
- package/dist/{install-XRKEQAFZ.js → install-CQLHNZ6U.js} +3 -3
- package/dist/{issues-I3V6GEXU.js → issues-HK2JA5JS.js} +3 -3
- package/dist/{knobs-6WLJMB44.js → knobs-ETJAV6YM.js} +3 -3
- package/dist/{list-PHC7VYNS.js → list-F6DGGW3Z.js} +3 -3
- package/dist/{local-VGYRSW22.js → local-CMAY54I5.js} +5 -5
- package/dist/{login-QPU2BKG2.js → login-6CKG664C.js} +8 -8
- package/dist/{mcp-LA452TOA.js → mcp-GC2WOOZO.js} +5 -6
- package/dist/{mcp-LA452TOA.js.map → mcp-GC2WOOZO.js.map} +1 -1
- package/dist/metrics-IXICURAA.js +367 -0
- package/dist/metrics-IXICURAA.js.map +1 -0
- package/dist/{product-RSZV5HMB.js → product-BUJWPYKB.js} +4 -3
- package/dist/product-BUJWPYKB.js.map +1 -0
- package/dist/{property-YP4GHQAR.js → property-4EXPWRNT.js} +3 -3
- package/dist/{record-KWKHP2ZY.js → record-HL4QA7OX.js} +4 -4
- package/dist/{record-KWKHP2ZY.js.map → record-HL4QA7OX.js.map} +1 -1
- package/dist/{release-NDRHPW6V.js → release-2SMK5Y3V.js} +3 -3
- package/dist/{sandbox-OOCANWOG.js → sandbox-ORAPKOH3.js} +3 -3
- package/dist/{scenarios-2HRLCGFY.js → scenarios-DM5FDCAF.js} +3 -3
- package/dist/{session-M4ULYDYP.js → session-X6IYGWYG.js} +14 -16
- package/dist/{session-M4ULYDYP.js.map → session-X6IYGWYG.js.map} +1 -1
- package/dist/{skill-4DGPRDUC.js → skill-ZU5V2EE5.js} +24 -14
- package/dist/skill-ZU5V2EE5.js.map +1 -0
- package/dist/skills/optimize-cache/SKILL.md +9 -3
- package/dist/{spec-XZ2TKUFZ.js → spec-KO5QD6AY.js} +3 -3
- package/dist/{src-HL7HEJIW.js → src-DSD34JIX.js} +2 -2
- package/dist/{src-2FK3JHGW.js → src-HTGNKBUF.js} +15 -7
- package/dist/{src-2FK3JHGW.js.map → src-HTGNKBUF.js.map} +1 -1
- package/dist/{src-OU7544PM.js → src-PDYXACRP.js} +2 -2
- package/dist/{start-IYKF3C3X.js → start-2ECN4LX5.js} +6 -6
- package/dist/{tag-T45MMSCH.js → tag-R5I72HJ6.js} +4 -4
- package/dist/{task-MCUHAVTD.js → task-V3JMSJIM.js} +3 -3
- package/dist/{test-suite-BICBRSBP.js → test-suite-NOYVK6YX.js} +5 -5
- package/dist/{trace-2BAPMYAS.js → trace-NOYEKNO4.js} +4 -5
- package/dist/{triage-M3RZ2ASB.js → triage-4RFATHBE.js} +4 -4
- package/dist/utilities-3WMXE743.js +441 -0
- package/dist/utilities-3WMXE743.js.map +1 -0
- package/dist/{workflow-4J23FV7K.js → workflow-DC7WOTTW.js} +13 -17
- package/dist/workflow-DC7WOTTW.js.map +1 -0
- package/dist/{workflow-cache-XPSK6KC7.js → workflow-cache-SDSI6SMF.js} +6 -6
- package/dist/{workflow-cache-XPSK6KC7.js.map → workflow-cache-SDSI6SMF.js.map} +1 -1
- package/dist/{workflow-debug-W4USZH35.js → workflow-debug-6UQYP67Q.js} +6 -7
- package/dist/{workflow-debug-W4USZH35.js.map → workflow-debug-6UQYP67Q.js.map} +1 -1
- package/dist/{workflow-proposals-5E3DTYZB.js → workflow-proposals-67AVGMHX.js} +6 -6
- package/package.json +1 -1
- package/dist/account-62I7FG5G.js.map +0 -1
- package/dist/chunk-26U3DGUM.js.map +0 -1
- package/dist/chunk-5R4HMSNX.js.map +0 -1
- package/dist/chunk-CFJXYPTF.js.map +0 -1
- package/dist/chunk-IWKJQZJQ.js.map +0 -1
- package/dist/chunk-KRWRUU6R.js +0 -114
- package/dist/chunk-KRWRUU6R.js.map +0 -1
- package/dist/feature-flag-K5REGGDY.js.map +0 -1
- package/dist/pdf-extract-YHE54XU4.js +0 -13
- package/dist/product-RSZV5HMB.js.map +0 -1
- package/dist/skill-4DGPRDUC.js.map +0 -1
- package/dist/triage-M3RZ2ASB.js.map +0 -1
- package/dist/workflow-4J23FV7K.js.map +0 -1
- /package/dist/{api-catalog-CAJUASVC.js.map → api-catalog-6HNOGVPA.js.map} +0 -0
- /package/dist/{attachment-RL4AZUJE.js.map → attachment-QAHR54HQ.js.map} +0 -0
- /package/dist/{augmentor-GAF3MFY6.js.map → augmentor-7T3L6ZR4.js.map} +0 -0
- /package/dist/{chunk-HKQ5XQAQ.js.map → chunk-CEXV3MOC.js.map} +0 -0
- /package/dist/{chunk-VKBTI5EF.js.map → chunk-D6AVOPOS.js.map} +0 -0
- /package/dist/{chunk-ZXRVFFCY.js.map → chunk-DT2CEH2V.js.map} +0 -0
- /package/dist/{chunk-CJEKEW7R.js.map → chunk-LFFWD5JZ.js.map} +0 -0
- /package/dist/{chunk-UZ2ZA5A6.js.map → chunk-RGDIVW3O.js.map} +0 -0
- /package/dist/{credential-JGVSEGVH.js.map → credential-X6QKX473.js.map} +0 -0
- /package/dist/{credential-template-CWWMOKB2.js.map → credential-template-GD3D4MBI.js.map} +0 -0
- /package/dist/{debug-workflow-BXRU72YZ.js.map → debug-workflow-AAEOAME2.js.map} +0 -0
- /package/dist/{pdf-extract-YHE54XU4.js.map → dist-QLTVBUMD.js.map} +0 -0
- /package/dist/{docs-PVBXPTGR.js.map → docs-BVUEXBY3.js.map} +0 -0
- /package/dist/{environment-WZKIO3R3.js.map → environment-WE7VVE6I.js.map} +0 -0
- /package/dist/{init-FFUZO5D7.js.map → init-RQHHKJJD.js.map} +0 -0
- /package/dist/{install-XRKEQAFZ.js.map → install-CQLHNZ6U.js.map} +0 -0
- /package/dist/{issues-I3V6GEXU.js.map → issues-HK2JA5JS.js.map} +0 -0
- /package/dist/{knobs-6WLJMB44.js.map → knobs-ETJAV6YM.js.map} +0 -0
- /package/dist/{list-PHC7VYNS.js.map → list-F6DGGW3Z.js.map} +0 -0
- /package/dist/{local-VGYRSW22.js.map → local-CMAY54I5.js.map} +0 -0
- /package/dist/{login-QPU2BKG2.js.map → login-6CKG664C.js.map} +0 -0
- /package/dist/{property-YP4GHQAR.js.map → property-4EXPWRNT.js.map} +0 -0
- /package/dist/{release-NDRHPW6V.js.map → release-2SMK5Y3V.js.map} +0 -0
- /package/dist/{sandbox-OOCANWOG.js.map → sandbox-ORAPKOH3.js.map} +0 -0
- /package/dist/{scenarios-2HRLCGFY.js.map → scenarios-DM5FDCAF.js.map} +0 -0
- /package/dist/{spec-XZ2TKUFZ.js.map → spec-KO5QD6AY.js.map} +0 -0
- /package/dist/{src-HL7HEJIW.js.map → src-DSD34JIX.js.map} +0 -0
- /package/dist/{src-CV57ZD6I.js.map → src-PDYXACRP.js.map} +0 -0
- /package/dist/{start-IYKF3C3X.js.map → start-2ECN4LX5.js.map} +0 -0
- /package/dist/{src-OU7544PM.js.map → tag-R5I72HJ6.js.map} +0 -0
- /package/dist/{task-MCUHAVTD.js.map → task-V3JMSJIM.js.map} +0 -0
- /package/dist/{test-suite-BICBRSBP.js.map → test-suite-NOYVK6YX.js.map} +0 -0
- /package/dist/{tag-T45MMSCH.js.map → trace-NOYEKNO4.js.map} +0 -0
- /package/dist/{trace-2BAPMYAS.js.map → triage-4RFATHBE.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
152
|
+
//# sourceMappingURL=start-2ECN4LX5.js.map
|
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
formatUnknownTagsError,
|
|
6
6
|
resolveTagNames,
|
|
7
7
|
runTag
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-LFFWD5JZ.js";
|
|
5
5
|
import {
|
|
6
6
|
isTriageEnabledForExecution
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-DT2CEH2V.js";
|
|
8
8
|
import {
|
|
9
9
|
apiRequest
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-CEXV3MOC.js";
|
|
5
5
|
import "./chunk-IGHDIWZU.js";
|
|
6
6
|
import "./chunk-32P26BZT.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-AI3Y3AZH.js";
|
|
8
8
|
import "./chunk-JWHYXEA2.js";
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
6
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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":[]}
|