@veilio-inc/cli 0.9.2 → 0.11.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 (71) hide show
  1. package/README.md +98 -20
  2. package/dist/args.d.ts +8 -0
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +14 -0
  5. package/dist/args.js.map +1 -1
  6. package/dist/client/blocks.d.ts.map +1 -1
  7. package/dist/client/blocks.js +2 -1
  8. package/dist/client/blocks.js.map +1 -1
  9. package/dist/client/fingerprint.d.ts +4 -0
  10. package/dist/client/fingerprint.d.ts.map +1 -0
  11. package/dist/client/fingerprint.js +20 -0
  12. package/dist/client/fingerprint.js.map +1 -0
  13. package/dist/client/maps.d.ts.map +1 -1
  14. package/dist/client/maps.js +29 -8
  15. package/dist/client/maps.js.map +1 -1
  16. package/dist/client/wording.d.ts +3 -1
  17. package/dist/client/wording.d.ts.map +1 -1
  18. package/dist/client/wording.js +10 -2
  19. package/dist/client/wording.js.map +1 -1
  20. package/dist/client/wrap-judge.d.ts +30 -0
  21. package/dist/client/wrap-judge.d.ts.map +1 -0
  22. package/dist/client/wrap-judge.js +59 -0
  23. package/dist/client/wrap-judge.js.map +1 -0
  24. package/dist/cloud-commands.d.ts +21 -1
  25. package/dist/cloud-commands.d.ts.map +1 -1
  26. package/dist/cloud-commands.js +342 -5
  27. package/dist/cloud-commands.js.map +1 -1
  28. package/dist/cloud.d.ts +5 -1
  29. package/dist/cloud.d.ts.map +1 -1
  30. package/dist/cloud.js +7 -1
  31. package/dist/cloud.js.map +1 -1
  32. package/dist/commands.d.ts +3 -0
  33. package/dist/commands.d.ts.map +1 -1
  34. package/dist/commands.js +35 -10
  35. package/dist/commands.js.map +1 -1
  36. package/dist/flags.d.ts +14 -0
  37. package/dist/flags.d.ts.map +1 -1
  38. package/dist/flags.js +40 -0
  39. package/dist/flags.js.map +1 -1
  40. package/dist/git-index.d.ts +8 -0
  41. package/dist/git-index.d.ts.map +1 -0
  42. package/dist/git-index.js +161 -0
  43. package/dist/git-index.js.map +1 -0
  44. package/dist/hashed-bases.d.ts +6 -1
  45. package/dist/hashed-bases.d.ts.map +1 -1
  46. package/dist/hashed-bases.js +16 -3
  47. package/dist/hashed-bases.js.map +1 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +29 -19
  50. package/dist/index.js.map +1 -1
  51. package/dist/key-pins.d.ts +46 -0
  52. package/dist/key-pins.d.ts.map +1 -0
  53. package/dist/key-pins.js +165 -0
  54. package/dist/key-pins.js.map +1 -0
  55. package/dist/reservations.d.ts +6 -4
  56. package/dist/reservations.d.ts.map +1 -1
  57. package/dist/reservations.js +19 -21
  58. package/dist/reservations.js.map +1 -1
  59. package/dist/staged-blobs.d.ts +21 -0
  60. package/dist/staged-blobs.d.ts.map +1 -0
  61. package/dist/staged-blobs.js +150 -0
  62. package/dist/staged-blobs.js.map +1 -0
  63. package/dist/store.d.ts +39 -0
  64. package/dist/store.d.ts.map +1 -1
  65. package/dist/store.js +243 -24
  66. package/dist/store.js.map +1 -1
  67. package/dist/team-unlock.d.ts +36 -0
  68. package/dist/team-unlock.d.ts.map +1 -1
  69. package/dist/team-unlock.js +25 -1
  70. package/dist/team-unlock.js.map +1 -1
  71. package/package.json +2 -2
@@ -0,0 +1,161 @@
1
+ // What git tracks, read from the index file itself (spec 085 R1).
2
+ //
3
+ // The CLI and the MCP server spawn no process (offline.test.ts, MCP
4
+ // purity.test.ts), and running git in a cloned repository would run that
5
+ // repository's own config (core.fsmonitor and the like). So the store asks
6
+ // the index directly. Anything this reader does not fully understand - no
7
+ // .git, no index, an unknown version, a split index, a short or odd file - is
8
+ // `null`: unknown, which the store treats as "not tracked", as it did before.
9
+ import { closeSync, openSync, readFileSync, readSync, statSync } from 'node:fs';
10
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
11
+ /** Each index file as last parsed, while its inode, mtime, ctime, size and
12
+ * trailing checksum are unchanged: one parse per process, not per read. */
13
+ const parsed = new Map();
14
+ /** The git checkout holding `from`, and what its index lists; null when unknown. */
15
+ export function trackedPaths(from) {
16
+ try {
17
+ const found = findGitDir(resolve(from));
18
+ if (!found)
19
+ return null;
20
+ const index = join(found.gitDir, 'index');
21
+ const st = statSync(index);
22
+ const stamp = `${st.ino}:${st.mtimeMs}:${st.ctimeMs}:${st.size}:${trailer(index, st.size)}`;
23
+ let hit = parsed.get(index);
24
+ if (hit?.stamp !== stamp) {
25
+ hit = { stamp, paths: readIndex(readFileSync(index), hashSize(found)) };
26
+ parsed.set(index, hit);
27
+ }
28
+ return hit.paths && { root: found.root, paths: hit.paths };
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ /** The index's last 32 bytes: its checksum (20 bytes for SHA-1, 32 for
35
+ * SHA-256), which changes with any change to the content. */
36
+ function trailer(path, size) {
37
+ const fd = openSync(path, 'r');
38
+ try {
39
+ const buf = Buffer.alloc(Math.min(32, size));
40
+ readSync(fd, buf, 0, buf.length, size - buf.length);
41
+ return buf.toString('hex');
42
+ }
43
+ finally {
44
+ closeSync(fd);
45
+ }
46
+ }
47
+ function findGitDir(start) {
48
+ for (let dir = start;; dir = dirname(dir)) {
49
+ const dotGit = join(dir, '.git');
50
+ const st = statOrNull(dotGit);
51
+ if (st?.isDirectory())
52
+ return { root: dir, gitDir: dotGit, commonDir: dotGit };
53
+ if (st?.isFile()) {
54
+ // A worktree or submodule: `gitdir: <path>`, and the shared config in its commondir.
55
+ const m = /^gitdir: *(.+?)\s*$/m.exec(readFileSync(dotGit, 'utf8'));
56
+ if (!m)
57
+ return null;
58
+ const gitDir = isAbsolute(m[1]) ? m[1] : resolve(dir, m[1]);
59
+ let commonDir = gitDir;
60
+ try {
61
+ const c = readFileSync(join(gitDir, 'commondir'), 'utf8').trim();
62
+ commonDir = isAbsolute(c) ? c : resolve(gitDir, c);
63
+ }
64
+ catch {
65
+ // no commondir: a submodule, whose config is its own
66
+ }
67
+ return { root: dir, gitDir, commonDir };
68
+ }
69
+ if (dirname(dir) === dir)
70
+ return null;
71
+ }
72
+ }
73
+ function statOrNull(path) {
74
+ try {
75
+ return statSync(path);
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ /** 20 for SHA-1, 32 for a repository made with `--object-format=sha256`. */
82
+ function hashSize(found) {
83
+ try {
84
+ const config = readFileSync(join(found.commonDir, 'config'), 'utf8');
85
+ return /^\s*objectformat\s*=\s*sha256\s*$/im.test(config) ? 32 : 20;
86
+ }
87
+ catch {
88
+ return 20;
89
+ }
90
+ }
91
+ /** Index versions 2, 3 and 4 (git's index-format.txt). Null on anything else. */
92
+ function readIndex(buf, hash) {
93
+ if (buf.length < 12 + hash || buf.toString('latin1', 0, 4) !== 'DIRC')
94
+ return null;
95
+ const version = buf.readUInt32BE(4);
96
+ if (version < 2 || version > 4)
97
+ return null;
98
+ const count = buf.readUInt32BE(8);
99
+ const end = buf.length - hash;
100
+ const paths = new Set();
101
+ let at = 12;
102
+ let previous = Buffer.alloc(0);
103
+ for (let i = 0; i < count; i++) {
104
+ // ctime, mtime, dev, ino, mode, uid, gid, size (40 bytes), the object id, flags.
105
+ const flagsAt = at + 40 + hash;
106
+ if (flagsAt + 2 > end)
107
+ return null;
108
+ const flags = buf.readUInt16BE(flagsAt);
109
+ let nameAt = flagsAt + 2;
110
+ if (flags & 0x4000) {
111
+ if (version < 3)
112
+ return null;
113
+ nameAt += 2;
114
+ }
115
+ let name;
116
+ if (version === 4) {
117
+ // A varint of bytes to drop from the previous path, then the rest, NUL-ended.
118
+ let drop = 0;
119
+ let byte;
120
+ let k = nameAt;
121
+ do {
122
+ if (k >= end)
123
+ return null;
124
+ byte = buf[k++];
125
+ drop = (drop << 7) | (byte & 0x7f);
126
+ if (byte & 0x80)
127
+ drop++;
128
+ } while (byte & 0x80);
129
+ if (drop > previous.length)
130
+ return null;
131
+ const nul = buf.indexOf(0, k);
132
+ if (nul === -1 || nul >= end)
133
+ return null;
134
+ name = Buffer.concat([previous.subarray(0, previous.length - drop), buf.subarray(k, nul)]);
135
+ at = nul + 1;
136
+ }
137
+ else {
138
+ const nul = buf.indexOf(0, nameAt);
139
+ if (nul === -1 || nul >= end)
140
+ return null;
141
+ name = buf.subarray(nameAt, nul);
142
+ // Each entry is padded with 1-8 NULs to a multiple of 8 bytes.
143
+ at = at + ((nameAt - at + name.length + 8) & ~7);
144
+ }
145
+ previous = name;
146
+ paths.add(name.toString('utf8').toLowerCase());
147
+ }
148
+ // Extensions: a split index ("link") keeps entries in another file, so this
149
+ // list would be partial. Anything malformed here is unknown too.
150
+ while (at < end) {
151
+ if (at + 8 > end)
152
+ return null;
153
+ const sig = buf.toString('latin1', at, at + 4);
154
+ const size = buf.readUInt32BE(at + 4);
155
+ if (sig === 'link' || sig === 'sdir')
156
+ return null;
157
+ at += 8 + size;
158
+ }
159
+ return at === end ? paths : null;
160
+ }
161
+ //# sourceMappingURL=git-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-index.js","sourceRoot":"","sources":["../src/git-index.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
1
  import type { Credential } from './credential.js';
2
2
  /** The base as the server sees it: `__H_<16 hex>__` for a rule's base. */
3
3
  export declare function wireBase(base: string, teamKey: Uint8Array): string;
4
- /** The raw team keys this machine holds for `teamId`, newest version first. */
4
+ /** The raw team keys a rule's name may be hashed under, newest first: none
5
+ * unless the newest is confirmed (`writeKeyOf`), and never one that is not
6
+ * (spec 080 item 7a) - a hash under a key the server made tells it the name. */
5
7
  export declare function teamKeyBytes(credential: Pick<Credential, 'instance' | 'account'>, home: string | undefined, teamId: string): Uint8Array[];
6
8
  /** The newest team key version this machine holds for `teamId`. */
7
9
  export declare function teamKeyVersion(credential: Pick<Credential, 'instance' | 'account'>, home: string | undefined, teamId: string): number | undefined;
10
+ /** The team to name when a rule's name may not be hashed because the newest
11
+ * key is not confirmed; null when it may, or when nothing is unlocked. */
12
+ export declare function teamKeyUnconfirmed(credential: Pick<Credential, 'instance' | 'account'>, home: string | undefined, teamId: string): string | null;
8
13
  /** Whether a base the server served (a reservation's) is `base`: as written,
9
14
  * or its hash under any held key version - one reserved before a rotation
10
15
  * carries the old key's hash. */
@@ -1 +1 @@
1
- {"version":3,"file":"hashed-bases.d.ts","sourceRoot":"","sources":["../src/hashed-bases.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAIlE;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,EACpD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GACb,UAAU,EAAE,CAEd;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAC5B,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,EACpD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAEpB;AAuBD;;kCAEkC;AAClC,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAE3F"}
1
+ {"version":3,"file":"hashed-bases.d.ts","sourceRoot":"","sources":["../src/hashed-bases.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAIjD,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAIlE;AAED;;iFAEiF;AACjF,wBAAgB,YAAY,CAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,EACpD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GACb,UAAU,EAAE,CAEd;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAC5B,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,EACpD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAEpB;AAwBD;2EAC2E;AAC3E,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,EACpD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,IAAI,CAOf;AAED;;kCAEkC;AAClC,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAE3F"}
@@ -5,7 +5,8 @@
5
5
  // Everything on this machine - the map, reserved.json - keeps the real base.
6
6
  import { createHmac } from 'node:crypto';
7
7
  import { fromBase64, isEngineBase } from '@veilio-inc/engine';
8
- import { readTeamUnlock } from './team-unlock.js';
8
+ import { readTeamUnlock, writeKeyOf } from './team-unlock.js';
9
+ import { printable } from './reservations.js';
9
10
  /** The base as the server sees it: `__H_<16 hex>__` for a rule's base. */
10
11
  export function wireBase(base, teamKey) {
11
12
  if (isEngineBase(base))
@@ -13,7 +14,9 @@ export function wireBase(base, teamKey) {
13
14
  const mac = createHmac('sha256', teamKey).update(base, 'utf8').digest('hex');
14
15
  return `__H_${mac.slice(0, 16).toUpperCase()}__`;
15
16
  }
16
- /** The raw team keys this machine holds for `teamId`, newest version first. */
17
+ /** The raw team keys a rule's name may be hashed under, newest first: none
18
+ * unless the newest is confirmed (`writeKeyOf`), and never one that is not
19
+ * (spec 080 item 7a) - a hash under a key the server made tells it the name. */
17
20
  export function teamKeyBytes(credential, home, teamId) {
18
21
  return heldKeys(credential, home, teamId).map((k) => k.raw);
19
22
  }
@@ -23,10 +26,12 @@ export function teamKeyVersion(credential, home, teamId) {
23
26
  }
24
27
  function heldKeys(credential, home, teamId) {
25
28
  const unlock = readTeamUnlock({ instance: credential.instance, account: credential.account }, home);
26
- if (!unlock || unlock.teamId !== teamId)
29
+ if (!unlock || unlock.teamId !== teamId || !writeKeyOf(unlock))
27
30
  return [];
28
31
  const out = [];
29
32
  for (const k of unlock.keys) {
33
+ if (!k.writable)
34
+ continue;
30
35
  try {
31
36
  out.push({ version: k.version, raw: fromBase64(k.key) });
32
37
  }
@@ -36,6 +41,14 @@ function heldKeys(credential, home, teamId) {
36
41
  }
37
42
  return out.sort((a, b) => b.version - a.version);
38
43
  }
44
+ /** The team to name when a rule's name may not be hashed because the newest
45
+ * key is not confirmed; null when it may, or when nothing is unlocked. */
46
+ export function teamKeyUnconfirmed(credential, home, teamId) {
47
+ const unlock = readTeamUnlock({ instance: credential.instance, account: credential.account }, home);
48
+ if (!unlock || unlock.teamId !== teamId || writeKeyOf(unlock))
49
+ return null;
50
+ return printable(unlock.teamName ?? unlock.teamId);
51
+ }
39
52
  /** Whether a base the server served (a reservation's) is `base`: as written,
40
53
  * or its hash under any held key version - one reserved before a rotation
41
54
  * carries the old key's hash. */
@@ -1 +1 @@
1
- {"version":3,"file":"hashed-bases.js","sourceRoot":"","sources":["../src/hashed-bases.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,wEAAwE;AACxE,6EAA6E;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,0EAA0E;AAC1E,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAmB;IACxD,IAAI,YAAY,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACnC,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5E,OAAO,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,CAAA;AAClD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAC1B,UAAoD,EACpD,IAAwB,EACxB,MAAc;IAEd,OAAO,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAC7D,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,cAAc,CAC5B,UAAoD,EACpD,IAAwB,EACxB,MAAc;IAEd,OAAO,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAA;AACvD,CAAC;AAED,SAAS,QAAQ,CACf,UAAoD,EACpD,IAAwB,EACxB,MAAc;IAEd,MAAM,MAAM,GAAG,cAAc,CAC3B,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,EAC9D,IAAI,CACL,CAAA;IACD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,CAAA;IAClD,MAAM,GAAG,GAA2C,EAAE,CAAA;IACtD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ,CAAC,8CAA8C;QACzD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;AAClD,CAAC;AAED;;kCAEkC;AAClC,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,IAA2B;IAChF,OAAO,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAA;AAC1E,CAAC"}
1
+ {"version":3,"file":"hashed-bases.js","sourceRoot":"","sources":["../src/hashed-bases.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAE/E,OAAO,EAA2D,KAAK,EAAE,EAAE,MAAM,eAAe,CAAA;AA2BhG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,OAAO,EAAE,CAAA;AAElB,6EAA6E;AAC7E,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB3E;AAED;;;GAGG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmFnE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAE/E,OAAO,EAQL,KAAK,EAAE,EACR,MAAM,eAAe,CAAA;AA6BtB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,OAAO,EAAE,CAAA;AAElB,6EAA6E;AAC7E,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB3E;AAED;;;GAGG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2FnE"}
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { needsAction, parseArgs, UsageError } from './args.js';
3
3
  import { feedSecret } from './secret-input.js';
4
- import { EXIT_ERROR, HELP, runMap, runRestore, runScan, runScrub } from './commands.js';
4
+ import { EXIT_ERROR, EXIT_FINDINGS, HELP, runMap, runRestore, runScan, runScrub, } from './commands.js';
5
5
  import { commandHelp } from './flags.js';
6
- import { runLogin, runLogout, runWhoami, runMapsList, runMapsPull, runMapsPush, runMapsRm, runMapsUpdate, runTeamUnlock, runTeamLock, runVaultUnlock, runVaultLock, runProjectsList, runProjectsUse, runRulesPull, teamLayerFor, teamNamespaceForScrub, } from './cloud-commands.js';
7
- import { resolveMapPath } from './store.js';
6
+ import { runLogin, runLogout, runWhoami, runMapsList, runMapsPull, runMapsPush, runMapsRm, runMapsUpdate, runTeamUnlock, runTeamLock, runTeamTrust, runKeysFingerprint, runVaultUnlock, runVaultLock, runProjectsList, runProjectsUse, runRulesPull, teamLayerFor, teamNamespaceForScrub, } from './cloud-commands.js';
7
+ import { resolveMapPath, StoreRefusal } from './store.js';
8
8
  import { guardHint } from './guard-hint.js';
9
9
  import { createInterface } from 'node:readline';
10
10
  import { realpathSync } from 'node:fs';
@@ -88,9 +88,11 @@ export async function run(args, io) {
88
88
  case 'team': {
89
89
  switch (args.teamAction) {
90
90
  case 'unlock':
91
- return await runTeamUnlock(io, args.days ?? undefined, resolveMapPath(args.mapPath, io.cwd));
91
+ return await runTeamUnlock(io, args.days ?? undefined, resolveMapPath(args.mapPath, io.cwd), args.forgetRefused);
92
92
  case 'lock':
93
93
  return runTeamLock(io);
94
+ case 'trust':
95
+ return await runTeamTrust(args.files[0] ?? null, args.files[1] ?? null, io);
94
96
  default:
95
97
  io.stderr(`veilio: ${needsAction('team')}\n`);
96
98
  return EXIT_ERROR;
@@ -107,6 +109,11 @@ export async function run(args, io) {
107
109
  return EXIT_ERROR;
108
110
  }
109
111
  }
112
+ case 'keys':
113
+ if (args.keysAction === 'fingerprint')
114
+ return await runKeysFingerprint(io);
115
+ io.stderr(`veilio: ${needsAction('keys')}\n`);
116
+ return EXIT_ERROR;
110
117
  case 'projects':
111
118
  if (args.projectsAction === 'use')
112
119
  return await runProjectsUse(args.files[0] ?? null, io);
@@ -120,7 +127,8 @@ export async function run(args, io) {
120
127
  }
121
128
  catch (err) {
122
129
  io.stderr(`veilio: ${err instanceof Error ? err.message : String(err)}\n`);
123
- return EXIT_ERROR;
130
+ // A store refused for what it is (tracked, a link) stops the pipeline like a finding.
131
+ return err instanceof StoreRefusal ? EXIT_FINDINGS : EXIT_ERROR;
124
132
  }
125
133
  }
126
134
  // A piped/scripted session (no TTY) commonly delivers every line in ONE data
@@ -231,20 +239,21 @@ function readSecret(label) {
231
239
  stdin.on('data', onData);
232
240
  });
233
241
  }
234
- function readStdin() {
235
- return new Promise((resolvePromise, rejectPromise) => {
236
- // A TTY with no piped input would hang forever waiting for EOF. Fail with
237
- // usage guidance instead of appearing to freeze.
238
- if (process.stdin.isTTY) {
239
- rejectPromise(new Error('no input — pass a file or pipe to stdin'));
240
- return;
241
- }
242
- let data = '';
243
- process.stdin.setEncoding('utf8');
244
- process.stdin.on('data', (chunk) => (data += chunk));
245
- process.stdin.on('end', () => resolvePromise(data));
246
- process.stdin.on('error', rejectPromise);
247
- });
242
+ /** Stdin as it arrives (`scan --blobs`: git's blob stream holds any byte). */
243
+ async function* readStdinBytes() {
244
+ // A TTY with no piped input would hang forever waiting for EOF. Fail with
245
+ // usage guidance instead of appearing to freeze.
246
+ if (process.stdin.isTTY)
247
+ throw new Error('no input — pass a file or pipe to stdin');
248
+ for await (const chunk of process.stdin)
249
+ yield chunk;
250
+ }
251
+ /** Stdin as text: its bytes, decoded as UTF-8. */
252
+ async function readStdin() {
253
+ const chunks = [];
254
+ for await (const chunk of readStdinBytes())
255
+ chunks.push(chunk);
256
+ return Buffer.concat(chunks).toString('utf8');
248
257
  }
249
258
  /**
250
259
  * Was this file run as a program, or imported?
@@ -279,6 +288,7 @@ if (invokedAsProgram()) {
279
288
  const io = {
280
289
  cwd: process.cwd(),
281
290
  stdin: readStdin,
291
+ stdinBytes: readStdinBytes,
282
292
  stdout: (text) => process.stdout.write(text),
283
293
  stderr: (text) => process.stderr.write(text),
284
294
  prompt: readLine,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export declare const KEY_PINS_FILE = "key-pins.json";
2
+ export interface KeyPin {
3
+ /** The confirmed public key, base64. */
4
+ current: string;
5
+ /** Earlier confirmed keys of the same person, so what they granted with
6
+ * those stays trusted after an honest key reset. */
7
+ history: string[];
8
+ /** ISO-8601. */
9
+ confirmedAt: string;
10
+ }
11
+ /** By granter user id, or `key:<publicKey>` for a granter with no account. */
12
+ export type KeyPins = Record<string, KeyPin>;
13
+ interface Binding {
14
+ instance: string;
15
+ account: string;
16
+ }
17
+ /** key-pins.json exists and is not one this CLI can read: never overwritten,
18
+ * since confirmations a person made are in there. */
19
+ export declare class KeyPinsDamaged extends Error {
20
+ readonly path: string;
21
+ constructor(path: string);
22
+ }
23
+ export declare function keyPinsPath(home?: string): string;
24
+ /** This instance and account's pins. A damaged entry is left out. */
25
+ export declare function readPins(binding: Binding, home?: string): KeyPins;
26
+ /** The pin for `identity`, only if one was recorded under exactly that. */
27
+ export declare function pinOf(pins: KeyPins, identity: string): KeyPin | undefined;
28
+ /** The keys a pin accepts: the current one, then the earlier ones. */
29
+ export declare function confirmedKeys(pin: KeyPin | undefined): string[];
30
+ /** Record `publicKey` as confirmed for `identity`, keeping any earlier one. */
31
+ export declare function confirmPin(binding: Binding, identity: string, publicKey: string, home?: string, now?: Date): void;
32
+ /** This account's blocked version for `teamId`, or undefined. Throws
33
+ * `KeyPinsDamaged` when it cannot be known: the caller then writes nothing. */
34
+ export declare function blockedMark(binding: Binding, teamId: string, home?: string): number | undefined;
35
+ /**
36
+ * Settle the blocked version for `teamId` against what is stored NOW, in one
37
+ * read-change-write: first `clearUpTo` drops the mark only if it is still at
38
+ * most that (the value this run read - a raise another unlock made since is
39
+ * kept), then `raise` keeps the higher of the two. The mark it leaves.
40
+ */
41
+ export declare function settleBlockedMark(binding: Binding, teamId: string, change: {
42
+ clearUpTo?: number;
43
+ raise?: number;
44
+ }, home?: string): number | undefined;
45
+ export {};
46
+ //# sourceMappingURL=key-pins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-pins.d.ts","sourceRoot":"","sources":["../src/key-pins.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,aAAa,kBAAkB,CAAA;AAE5C,MAAM,WAAW,MAAM;IACrB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf;yDACqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,8EAA8E;AAC9E,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE5C,UAAU,OAAO;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAkBD;sDACsD;AACtD,qBAAa,cAAe,SAAQ,KAAK;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAGlC;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAE5D;AAsCD,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CAQ5E;AAED,2EAA2E;AAC3E,wBAAgB,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzE;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAE/D;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAkB,EACxB,GAAG,GAAE,IAAiB,GACrB,IAAI,CAON;AAED;gFACgF;AAChF,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAAkB,GACvB,MAAM,GAAG,SAAS,CAUpB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,IAAI,GAAE,MAAkB,GACvB,MAAM,GAAG,SAAS,CAapB"}
@@ -0,0 +1,165 @@
1
+ // The teammate keys this member confirmed by fingerprint, on this device
2
+ // (spec 080 item 7a; the web app's keyPinning.ts and its research R-011).
3
+ //
4
+ // A team key's wrap names the key it was made with, and decrypting it proves
5
+ // only that whoever holds that key made it - so a server could make one with
6
+ // its own key and label it as a teammate's. A pin is what a person checked
7
+ // outside Veilio: `veilio team trust` writes one after the fingerprints were
8
+ // compared. Nothing here is ever sent to the server, encrypted or not: a pin
9
+ // the server could read or replace would protect against nothing.
10
+ //
11
+ // Unlike the web app's, every pin here is confirmed: the CLI never records a
12
+ // first sighting, so there is no `auto` kind to tell apart.
13
+ import { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
14
+ import { dirname, join } from 'node:path';
15
+ import { homedir } from 'node:os';
16
+ import { STORE_DIR } from '@veilio-inc/engine';
17
+ export const KEY_PINS_FILE = 'key-pins.json';
18
+ /** key-pins.json exists and is not one this CLI can read: never overwritten,
19
+ * since confirmations a person made are in there. */
20
+ export class KeyPinsDamaged extends Error {
21
+ path;
22
+ constructor(path) {
23
+ super(`${path} is damaged`);
24
+ this.path = path;
25
+ }
26
+ }
27
+ export function keyPinsPath(home = homedir()) {
28
+ return join(home, STORE_DIR, KEY_PINS_FILE);
29
+ }
30
+ function isPin(p) {
31
+ if (typeof p !== 'object' || p === null)
32
+ return false;
33
+ const pin = p;
34
+ return (typeof pin.current === 'string' &&
35
+ pin.current !== '' &&
36
+ Array.isArray(pin.history) &&
37
+ pin.history.every((k) => typeof k === 'string') &&
38
+ typeof pin.confirmedAt === 'string');
39
+ }
40
+ /** The file, or null when it exists and is not one this CLI wrote. */
41
+ function readFile(home) {
42
+ let text;
43
+ try {
44
+ text = readFileSync(keyPinsPath(home), 'utf8');
45
+ }
46
+ catch (err) {
47
+ // Only a file that is not there is "none yet". One that cannot be read
48
+ // (a directory, another owner, an I/O error) still holds what a person
49
+ // confirmed: damaged, so nothing replaces it.
50
+ if (err.code === 'ENOENT')
51
+ return { v: 1, scopes: [] };
52
+ return null;
53
+ }
54
+ try {
55
+ const parsed = JSON.parse(text);
56
+ if (parsed?.v === 1 && Array.isArray(parsed.scopes))
57
+ return parsed;
58
+ }
59
+ catch {
60
+ // not JSON
61
+ }
62
+ return null;
63
+ }
64
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
65
+ /** This instance and account's pins. A damaged entry is left out. */
66
+ export function readPins(binding, home = homedir()) {
67
+ const file = readFile(home);
68
+ const scope = file ? findScope(file, binding) : undefined;
69
+ // No prototype: a granter id is the server's word, and `__proto__` or
70
+ // `constructor` must be a key like any other, never Object's own.
71
+ const pins = Object.create(null);
72
+ for (const [id, pin] of Object.entries(scope?.pins ?? {}))
73
+ if (isPin(pin))
74
+ pins[id] = pin;
75
+ return pins;
76
+ }
77
+ /** The pin for `identity`, only if one was recorded under exactly that. */
78
+ export function pinOf(pins, identity) {
79
+ return Object.hasOwn(pins, identity) ? pins[identity] : undefined;
80
+ }
81
+ /** The keys a pin accepts: the current one, then the earlier ones. */
82
+ export function confirmedKeys(pin) {
83
+ return pin ? [pin.current, ...pin.history] : [];
84
+ }
85
+ /** Record `publicKey` as confirmed for `identity`, keeping any earlier one. */
86
+ export function confirmPin(binding, identity, publicKey, home = homedir(), now = new Date()) {
87
+ update(binding, home, (scope) => {
88
+ const held = pinOf(scope.pins, identity);
89
+ const before = isPin(held) ? held : undefined;
90
+ const history = confirmedKeys(before).filter((k) => k !== publicKey);
91
+ scope.pins[identity] = { current: publicKey, history, confirmedAt: now.toISOString() };
92
+ });
93
+ }
94
+ /** This account's blocked version for `teamId`, or undefined. Throws
95
+ * `KeyPinsDamaged` when it cannot be known: the caller then writes nothing. */
96
+ export function blockedMark(binding, teamId, home = homedir()) {
97
+ const file = readFile(home);
98
+ if (!file)
99
+ throw new KeyPinsDamaged(keyPinsPath(home));
100
+ const scope = findScope(file, binding);
101
+ if (!scope || scope.blocked === undefined)
102
+ return undefined;
103
+ if (!isRecord(scope.blocked))
104
+ throw new KeyPinsDamaged(keyPinsPath(home));
105
+ if (!Object.hasOwn(scope.blocked, teamId))
106
+ return undefined;
107
+ const mark = scope.blocked[teamId];
108
+ if (typeof mark !== 'number')
109
+ throw new KeyPinsDamaged(keyPinsPath(home));
110
+ return mark;
111
+ }
112
+ /**
113
+ * Settle the blocked version for `teamId` against what is stored NOW, in one
114
+ * read-change-write: first `clearUpTo` drops the mark only if it is still at
115
+ * most that (the value this run read - a raise another unlock made since is
116
+ * kept), then `raise` keeps the higher of the two. The mark it leaves.
117
+ */
118
+ export function settleBlockedMark(binding, teamId, change, home = homedir()) {
119
+ let left;
120
+ update(binding, home, (scope) => {
121
+ const blocked = scope.blocked;
122
+ let mark = Object.hasOwn(blocked, teamId) ? blocked[teamId] : undefined;
123
+ if (change.clearUpTo !== undefined && mark !== undefined && mark <= change.clearUpTo)
124
+ mark = undefined;
125
+ if (change.raise !== undefined)
126
+ mark = Math.max(mark ?? change.raise, change.raise);
127
+ if (mark === undefined)
128
+ delete blocked[teamId];
129
+ else
130
+ blocked[teamId] = mark;
131
+ left = mark;
132
+ });
133
+ return left;
134
+ }
135
+ function findScope(file, binding) {
136
+ return file.scopes.find((s) => s?.instance === binding.instance && s?.account === binding.account);
137
+ }
138
+ /** Read, change this account's scope, write back atomically at 0600. A damaged
139
+ * file, or a damaged scope of this account, is refused and left as it is. */
140
+ function update(binding, home, change) {
141
+ const file = readFile(home);
142
+ let scope = file ? findScope(file, binding) : undefined;
143
+ if (!file ||
144
+ (scope && !isRecord(scope.pins)) ||
145
+ (scope?.blocked !== undefined &&
146
+ !(isRecord(scope.blocked) && Object.values(scope.blocked).every((m) => typeof m === 'number'))))
147
+ throw new KeyPinsDamaged(keyPinsPath(home));
148
+ if (!scope) {
149
+ scope = { instance: binding.instance, account: binding.account, pins: {} };
150
+ file.scopes.push(scope);
151
+ }
152
+ // No prototype: ids are the server's words (`__proto__` is a key here).
153
+ scope.pins = Object.assign(Object.create(null), scope.pins);
154
+ scope.blocked = Object.assign(Object.create(null), scope.blocked);
155
+ change(scope);
156
+ const path = keyPinsPath(home);
157
+ mkdirSync(dirname(path), { recursive: true });
158
+ // Written beside, then renamed over: a crash mid-write must not leave a
159
+ // half file that reads as "no pins" and silently drops every confirmation.
160
+ const tmp = `${path}.${process.pid}.tmp`;
161
+ writeFileSync(tmp, `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
162
+ chmodSync(tmp, 0o600);
163
+ renameSync(tmp, path);
164
+ }
165
+ //# sourceMappingURL=key-pins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-pins.js","sourceRoot":"","sources":["../src/key-pins.ts"],"names":[],"mappings":"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"}