codequill 0.8.1-beta.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/LICENSE +21 -0
- package/README.md +121 -0
- package/dist/commands/attest.js +442 -0
- package/dist/commands/attest.js.map +1 -0
- package/dist/commands/backup.js +370 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/claim.js +104 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/log.js +188 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/login.js +147 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/prove.js +244 -0
- package/dist/commands/prove.js.map +1 -0
- package/dist/commands/publish.js +243 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/pull.js +174 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/quota.js +94 -0
- package/dist/commands/quota.js.map +1 -0
- package/dist/commands/revoke.js +97 -0
- package/dist/commands/revoke.js.map +1 -0
- package/dist/commands/snapshot.js +128 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/status.js +234 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/verifyAttestation.js +212 -0
- package/dist/commands/verifyAttestation.js.map +1 -0
- package/dist/commands/verifyProof.js +145 -0
- package/dist/commands/verifyProof.js.map +1 -0
- package/dist/commands/wait.js +36 -0
- package/dist/commands/wait.js.map +1 -0
- package/dist/commands/who.js +55 -0
- package/dist/commands/who.js.map +1 -0
- package/dist/commands/why.js +412 -0
- package/dist/commands/why.js.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher.js +69 -0
- package/dist/launcher.js.map +1 -0
- package/dist/services/api.js +51 -0
- package/dist/services/api.js.map +1 -0
- package/dist/services/apiClient.js +166 -0
- package/dist/services/apiClient.js.map +1 -0
- package/dist/services/authStore.js +84 -0
- package/dist/services/authStore.js.map +1 -0
- package/dist/services/config.js +19 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/confirm.js +58 -0
- package/dist/services/confirm.js.map +1 -0
- package/dist/services/crypto.js +38 -0
- package/dist/services/crypto.js.map +1 -0
- package/dist/services/errors.js +17 -0
- package/dist/services/errors.js.map +1 -0
- package/dist/services/fs.js +25 -0
- package/dist/services/fs.js.map +1 -0
- package/dist/services/git.js +121 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/manifests/attestationManifest.js +35 -0
- package/dist/services/manifests/attestationManifest.js.map +1 -0
- package/dist/services/manifests/proofManifest.js +151 -0
- package/dist/services/manifests/proofManifest.js.map +1 -0
- package/dist/services/manifests/snapshotManifest.js +214 -0
- package/dist/services/manifests/snapshotManifest.js.map +1 -0
- package/dist/services/merkle.js +92 -0
- package/dist/services/merkle.js.map +1 -0
- package/dist/services/paths.js +16 -0
- package/dist/services/paths.js.map +1 -0
- package/dist/services/snapshotIndex.js +401 -0
- package/dist/services/snapshotIndex.js.map +1 -0
- package/dist/services/txWaiter.js +84 -0
- package/dist/services/txWaiter.js.map +1 -0
- package/dist/services/ui.js +98 -0
- package/dist/services/ui.js.map +1 -0
- package/dist/services/utilities.js +45 -0
- package/dist/services/utilities.js.map +1 -0
- package/dist/services/zip.js +24 -0
- package/dist/services/zip.js.map +1 -0
- package/dist/types/api.js +2 -0
- package/dist/types/api.js.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { resolvePath } from "../services/paths.js";
|
|
3
|
+
import { colors, spinner } from "../services/ui.js";
|
|
4
|
+
import { parentHash } from "../services/merkle.js";
|
|
5
|
+
import { hexToBytes, concatBytes, keccakHex } from "../services/crypto.js";
|
|
6
|
+
function isHex64(x) {
|
|
7
|
+
return typeof x === "string" && /^[0-9a-f]{64}$/i.test(x);
|
|
8
|
+
}
|
|
9
|
+
function leafHashFromInputs(pathHash, fileHash) {
|
|
10
|
+
// leaf = keccak(0x00 || pathHash || fileHash)
|
|
11
|
+
const leafBytes = concatBytes(concatBytes(new Uint8Array([0x00]), hexToBytes(pathHash)), hexToBytes(fileHash));
|
|
12
|
+
return keccakHex(leafBytes).toLowerCase();
|
|
13
|
+
}
|
|
14
|
+
function fmtChainId(chainId) {
|
|
15
|
+
if (!chainId)
|
|
16
|
+
return "unknown chain";
|
|
17
|
+
if (chainId === 1)
|
|
18
|
+
return "Ethereum Mainnet";
|
|
19
|
+
if (chainId === 11155111)
|
|
20
|
+
return "Sepolia Testnet";
|
|
21
|
+
return `chain ${chainId}`;
|
|
22
|
+
}
|
|
23
|
+
export async function handleVerifyProof(opts) {
|
|
24
|
+
const p = resolvePath(opts.proofFile);
|
|
25
|
+
const s = spinner("Verifying proof…");
|
|
26
|
+
try {
|
|
27
|
+
const raw = await fs.readFile(p, "utf8");
|
|
28
|
+
const proof = JSON.parse(raw);
|
|
29
|
+
// ---- basic structure checks ----
|
|
30
|
+
if (!proof || proof.version !== "codequill-proof:v1") {
|
|
31
|
+
throw new Error("Invalid proof: version mismatch (expected codequill-proof:v1)");
|
|
32
|
+
}
|
|
33
|
+
const root = String(proof.merkle_root ?? "").toLowerCase();
|
|
34
|
+
const fileHash = String(proof.file?.hash ?? "").toLowerCase();
|
|
35
|
+
const pathHash = String(proof.file?.path_hash ?? "").toLowerCase();
|
|
36
|
+
const leafIn = String(proof.leaf ?? "").toLowerCase();
|
|
37
|
+
if (!isHex64(root))
|
|
38
|
+
throw new Error("Invalid proof: merkle_root must be 64 hex (no 0x)");
|
|
39
|
+
if (!isHex64(fileHash))
|
|
40
|
+
throw new Error("Invalid proof: file.hash must be 64 hex (no 0x)");
|
|
41
|
+
if (!isHex64(pathHash))
|
|
42
|
+
throw new Error("Invalid proof: file.path_hash must be 64 hex (no 0x)");
|
|
43
|
+
if (!isHex64(leafIn))
|
|
44
|
+
throw new Error("Invalid proof: leaf must be 64 hex (no 0x)");
|
|
45
|
+
if (!Array.isArray(proof.proof) || proof.proof.length === 0) {
|
|
46
|
+
throw new Error("Invalid proof: proof[] must be non-empty");
|
|
47
|
+
}
|
|
48
|
+
// ---- recompute leaf ----
|
|
49
|
+
const expectedLeaf = leafHashFromInputs(pathHash, fileHash);
|
|
50
|
+
if (expectedLeaf !== leafIn) {
|
|
51
|
+
throw new Error(`Leaf mismatch: computed ${expectedLeaf} != proof ${leafIn}`);
|
|
52
|
+
}
|
|
53
|
+
// ---- fold proof steps ----
|
|
54
|
+
let acc = expectedLeaf;
|
|
55
|
+
for (let i = 0; i < proof.proof.length; i++) {
|
|
56
|
+
const step = proof.proof[i];
|
|
57
|
+
const h = String(step?.hash ?? "").toLowerCase();
|
|
58
|
+
const side = step?.side;
|
|
59
|
+
if (!/^[0-9a-f]{64}$/.test(h)) {
|
|
60
|
+
throw new Error(`Invalid proof step hash at index ${i} (must be 64 hex)`);
|
|
61
|
+
}
|
|
62
|
+
if (side !== "left" && side !== "right") {
|
|
63
|
+
throw new Error(`Invalid proof step side at index ${i} (left|right)`);
|
|
64
|
+
}
|
|
65
|
+
acc = side === "left" ? parentHash(h, acc) : parentHash(acc, h);
|
|
66
|
+
}
|
|
67
|
+
if (acc !== root) {
|
|
68
|
+
throw new Error(`Root mismatch: computed ${acc} != expected ${root}`);
|
|
69
|
+
}
|
|
70
|
+
// ---- success UX ----
|
|
71
|
+
s.succeed(colors.success("Proof is valid."));
|
|
72
|
+
// Print the manifest's statement if present
|
|
73
|
+
const stmt = typeof proof.statement === "string" ? proof.statement.trim() : "";
|
|
74
|
+
if (stmt) {
|
|
75
|
+
console.log("");
|
|
76
|
+
console.log(colors.bold("Statement"));
|
|
77
|
+
console.log(colors.dim("────────────────────────────────────────"));
|
|
78
|
+
console.log(stmt);
|
|
79
|
+
console.log(colors.dim("────────────────────────────────────────"));
|
|
80
|
+
}
|
|
81
|
+
console.log("");
|
|
82
|
+
console.log(colors.dim("Proof details"));
|
|
83
|
+
if (proof.repo)
|
|
84
|
+
console.log(` Repo ${proof.repo}`);
|
|
85
|
+
if (proof.commit)
|
|
86
|
+
console.log(` Commit ${proof.commit}`);
|
|
87
|
+
console.log(` Root ${root}`);
|
|
88
|
+
console.log(` Leaf ${expectedLeaf}`);
|
|
89
|
+
console.log(` Steps ${proof.proof.length}`);
|
|
90
|
+
// privacy summary
|
|
91
|
+
const priv = proof.privacy;
|
|
92
|
+
if (priv) {
|
|
93
|
+
const disclosed = !!priv.disclosed_path;
|
|
94
|
+
const binding = priv.path_binding ?? "not_provided";
|
|
95
|
+
console.log("");
|
|
96
|
+
console.log(colors.dim("Privacy"));
|
|
97
|
+
console.log(` Disclosed path ${disclosed ? "yes" : "no"}`);
|
|
98
|
+
console.log(` Path binding ${binding}`);
|
|
99
|
+
if (disclosed) {
|
|
100
|
+
// Make the tradeoff explicit (since users will paste/share proofs)
|
|
101
|
+
console.log(colors.warn(" Warning plaintext path is included; share carefully"));
|
|
102
|
+
}
|
|
103
|
+
if (disclosed && typeof priv.path_plaintext === "string" && priv.path_plaintext.length) {
|
|
104
|
+
console.log(` Path (plaintext) ${priv.path_plaintext}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// On-chain block (if present)
|
|
108
|
+
if (proof.snapshot && (proof.snapshot.snapshot_id || proof.snapshot.tx_hash || proof.snapshot.explorer_url)) {
|
|
109
|
+
console.log("");
|
|
110
|
+
console.log(colors.dim("Snapshot"));
|
|
111
|
+
if (proof.snapshot.snapshot_id)
|
|
112
|
+
console.log(` Snapshot ID ${proof.snapshot.snapshot_id}`);
|
|
113
|
+
if (proof.snapshot.chain_id)
|
|
114
|
+
console.log(` Chain ${fmtChainId(proof.snapshot.chain_id)}`);
|
|
115
|
+
if (proof.snapshot.published_at)
|
|
116
|
+
console.log(` Published ${new Date(proof.snapshot.published_at * 1000).toUTCString()}`);
|
|
117
|
+
if (proof.snapshot.publisher_wallet)
|
|
118
|
+
console.log(` Authority ${proof.snapshot.publisher_wallet}`);
|
|
119
|
+
if (proof.snapshot.explorer_url)
|
|
120
|
+
console.log(` Tx ${proof.snapshot.explorer_url}`);
|
|
121
|
+
else if (proof.snapshot.tx_hash)
|
|
122
|
+
console.log(` Tx ${proof.snapshot.tx_hash}`);
|
|
123
|
+
if (proof.snapshot.manifest_cid)
|
|
124
|
+
console.log(` Manifest ${proof.snapshot.manifest_cid}`);
|
|
125
|
+
}
|
|
126
|
+
console.log("");
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
try {
|
|
130
|
+
s.fail(colors.error("Proof invalid."));
|
|
131
|
+
}
|
|
132
|
+
catch { }
|
|
133
|
+
console.error(colors.error(String(e?.message || e)));
|
|
134
|
+
process.exitCode = 1;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export function registerVerifyProofCommand(program) {
|
|
138
|
+
program
|
|
139
|
+
.command("verify-proof <proofFile>")
|
|
140
|
+
.description("Verify a CodeQuill proof manifest (public verification, no auth required).")
|
|
141
|
+
.action(async (proofFile) => {
|
|
142
|
+
await handleVerifyProof({ proofFile });
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=verifyProof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyProof.js","sourceRoot":"","sources":["../../src/commands/verifyProof.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAqC3E,SAAS,OAAO,CAAC,CAAM;IACnB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,QAAgB;IAC1D,8CAA8C;IAC9C,MAAM,SAAS,GAAG,WAAW,CACzB,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,EACzD,UAAU,CAAC,QAAQ,CAAC,CACvB,CAAC;IACF,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,OAAgB;IAChC,IAAI,CAAC,OAAO;QAAE,OAAO,eAAe,CAAC;IACrC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAC;IAC7C,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,iBAAiB,CAAC;IACnD,OAAO,SAAS,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAmB;IACvD,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEtC,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;QAE/C,mCAAmC;QACnC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAEtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAC3F,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAChG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,CAAC;QAED,2BAA2B;QAC3B,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,aAAa,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,6BAA6B;QAC7B,IAAI,GAAG,GAAG,YAAY,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC;YAExB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,mBAAmB,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,eAAe,CAAC,CAAC;YAC1E,CAAC;YAED,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,uBAAuB;QACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAE7C,4CAA4C;QAC5C,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,IAAI,IAAI,EAAE,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAEnD,kBAAkB;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;QAC3B,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,IAAI,cAAc,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;YAE/C,IAAI,SAAS,EAAE,CAAC;gBACZ,mEAAmE;gBACnE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;YACjG,CAAC;YAED,IAAI,SAAS,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1G,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW;gBAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAC5F,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACjG,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC5H,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACrG,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;iBACxF,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YACxF,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QACjG,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,IAAI,CAAC;YACD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACvD,OAAO;SACF,OAAO,CAAC,0BAA0B,CAAC;SACnC,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;QAChC,MAAM,iBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { colors } from '../services/ui.js';
|
|
2
|
+
import { waitForTxConfirmation } from '../services/txWaiter.js';
|
|
3
|
+
/**
|
|
4
|
+
* Handle the "wait" command
|
|
5
|
+
*/
|
|
6
|
+
async function handleWait(txHash, opts) {
|
|
7
|
+
const confTarget = Math.max(1, Number(opts.confirmations ?? 1));
|
|
8
|
+
try {
|
|
9
|
+
await waitForTxConfirmation({
|
|
10
|
+
txHash: txHash,
|
|
11
|
+
confirmations: confTarget,
|
|
12
|
+
timeoutMs: opts.timeout,
|
|
13
|
+
});
|
|
14
|
+
console.log(colors.success(`✓ Confirmed on-chain (${confTarget} confirmation${confTarget > 1 ? 's' : ''}).`));
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
// waitForTxConfirmation already handles some spinner error output,
|
|
18
|
+
// but we catch to ensure we report the error and set exit code.
|
|
19
|
+
console.error(colors.error(String(e?.message || e)));
|
|
20
|
+
process.exitCode = 1;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Register the "wait" command
|
|
25
|
+
*/
|
|
26
|
+
export function registerWaitCommand(program) {
|
|
27
|
+
program
|
|
28
|
+
.command('wait <tx_hash>')
|
|
29
|
+
.description('Wait for a transaction to be confirmed on-chain')
|
|
30
|
+
.option('--confirmations <n>', 'Wait for N confirmations (default: 1)', (v) => parseInt(v, 10))
|
|
31
|
+
.option('--timeout <ms>', 'Timeout waiting for confirmation (ms)', (v) => parseInt(v, 10))
|
|
32
|
+
.action(async (txHash, options) => {
|
|
33
|
+
await handleWait(txHash, options);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/commands/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,IAAkD;IACxF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhE,IAAI,CAAC;QACD,MAAM,qBAAqB,CAAC;YACxB,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,UAAU;YACzB,SAAS,EAAE,IAAI,CAAC,OAAO;SAC1B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,UAAU,gBAAgB,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAClH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,oEAAoE;QACpE,gEAAgE;QAChE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAChD,OAAO;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC9F,MAAM,CAAC,gBAAgB,EAAE,uCAAuC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACzF,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAAY,EAAE,EAAE;QAC3C,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { apiClient } from '../services/apiClient.js';
|
|
2
|
+
import { colors } from '../services/ui.js';
|
|
3
|
+
import { ApiError } from '../services/errors.js';
|
|
4
|
+
import { assertAuthenticated } from "../services/utilities.js";
|
|
5
|
+
export async function handleWho() {
|
|
6
|
+
if (!assertAuthenticated())
|
|
7
|
+
return;
|
|
8
|
+
try {
|
|
9
|
+
const me = await apiClient.get('/v1/cli/who');
|
|
10
|
+
const username = me.username ?? '(unknown)';
|
|
11
|
+
console.log(colors.bold('You are logged in as'), colors.info(username));
|
|
12
|
+
if (me.fullname)
|
|
13
|
+
console.log('Name:', me.fullname);
|
|
14
|
+
if (me.email)
|
|
15
|
+
console.log('Email:', me.email);
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
if (e instanceof ApiError && e.status === 401) {
|
|
19
|
+
console.error(colors.error('Unauthorized. Run `codequill login` again.'));
|
|
20
|
+
}
|
|
21
|
+
else if (e instanceof ApiError) {
|
|
22
|
+
console.error(colors.error(`Failed to load profile: ${e.message} (${e.status})`));
|
|
23
|
+
if (e.requestId) {
|
|
24
|
+
console.error(colors.dim(`Request ID: ${e.requestId}`));
|
|
25
|
+
}
|
|
26
|
+
if (e.method && e.url) {
|
|
27
|
+
console.error(colors.dim(`Endpoint: ${e.method} ${e.url}`));
|
|
28
|
+
}
|
|
29
|
+
if (typeof e.body !== 'undefined') {
|
|
30
|
+
try {
|
|
31
|
+
const bodyStr = typeof e.body === 'string' ? e.body : JSON.stringify(e.body, null, 2);
|
|
32
|
+
const preview = bodyStr.length > 2000 ? bodyStr.slice(0, 2000) + '…' : bodyStr;
|
|
33
|
+
console.error(colors.dim('Response body:'));
|
|
34
|
+
console.error(colors.dim(preview));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// ignore formatting issues
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.error(colors.error(`Failed to load profile: ${String(e?.message || e)}`));
|
|
43
|
+
}
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function registerWhoCommand(program) {
|
|
48
|
+
program
|
|
49
|
+
.command('who')
|
|
50
|
+
.description('Show the current authenticated user')
|
|
51
|
+
.action(async () => {
|
|
52
|
+
await handleWho();
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=who.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"who.js","sourceRoot":"","sources":["../../src/commands/who.ts"],"names":[],"mappings":"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"}
|