@tienne/gestalt 0.109.0 → 0.110.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 (82) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/cli/commands/peer.d.ts +30 -0
  3. package/dist/src/cli/commands/peer.d.ts.map +1 -1
  4. package/dist/src/cli/commands/peer.js +159 -4
  5. package/dist/src/cli/commands/peer.js.map +1 -1
  6. package/dist/src/cli/index.d.ts.map +1 -1
  7. package/dist/src/cli/index.js +48 -2
  8. package/dist/src/cli/index.js.map +1 -1
  9. package/dist/src/peer/daemon.d.ts +17 -5
  10. package/dist/src/peer/daemon.d.ts.map +1 -1
  11. package/dist/src/peer/daemon.js +124 -15
  12. package/dist/src/peer/daemon.js.map +1 -1
  13. package/dist/src/peer/feed.d.ts +103 -0
  14. package/dist/src/peer/feed.d.ts.map +1 -0
  15. package/dist/src/peer/feed.js +167 -0
  16. package/dist/src/peer/feed.js.map +1 -0
  17. package/dist/src/peer/index.d.ts +10 -0
  18. package/dist/src/peer/index.d.ts.map +1 -1
  19. package/dist/src/peer/index.js +5 -0
  20. package/dist/src/peer/index.js.map +1 -1
  21. package/dist/src/peer/keys.d.ts +26 -0
  22. package/dist/src/peer/keys.d.ts.map +1 -0
  23. package/dist/src/peer/keys.js +95 -0
  24. package/dist/src/peer/keys.js.map +1 -0
  25. package/dist/src/peer/lock.d.ts +32 -0
  26. package/dist/src/peer/lock.d.ts.map +1 -0
  27. package/dist/src/peer/lock.js +147 -0
  28. package/dist/src/peer/lock.js.map +1 -0
  29. package/dist/src/peer/mirror.d.ts +21 -0
  30. package/dist/src/peer/mirror.d.ts.map +1 -0
  31. package/dist/src/peer/mirror.js +68 -0
  32. package/dist/src/peer/mirror.js.map +1 -0
  33. package/dist/src/peer/network.d.ts +148 -0
  34. package/dist/src/peer/network.d.ts.map +1 -0
  35. package/dist/src/peer/network.js +809 -0
  36. package/dist/src/peer/network.js.map +1 -0
  37. package/dist/src/peer/protocol.d.ts +52 -1
  38. package/dist/src/peer/protocol.d.ts.map +1 -1
  39. package/dist/src/peer/protocol.js +1 -0
  40. package/dist/src/peer/protocol.js.map +1 -1
  41. package/dist/src/peer/relay.d.ts +70 -0
  42. package/dist/src/peer/relay.d.ts.map +1 -0
  43. package/dist/src/peer/relay.js +410 -0
  44. package/dist/src/peer/relay.js.map +1 -0
  45. package/dist/src/peer/roster.d.ts +89 -0
  46. package/dist/src/peer/roster.d.ts.map +1 -0
  47. package/dist/src/peer/roster.js +160 -0
  48. package/dist/src/peer/roster.js.map +1 -0
  49. package/dist/src/peer/seal.d.ts +37 -0
  50. package/dist/src/peer/seal.d.ts.map +1 -0
  51. package/dist/src/peer/seal.js +115 -0
  52. package/dist/src/peer/seal.js.map +1 -0
  53. package/dist/src/peer/share.d.ts +4 -86
  54. package/dist/src/peer/share.d.ts.map +1 -1
  55. package/dist/src/peer/share.js +6 -140
  56. package/dist/src/peer/share.js.map +1 -1
  57. package/dist/src/peer/state.d.ts +35 -4
  58. package/dist/src/peer/state.d.ts.map +1 -1
  59. package/dist/src/peer/state.js +65 -3
  60. package/dist/src/peer/state.js.map +1 -1
  61. package/dist/src/peer/transport.d.ts +89 -0
  62. package/dist/src/peer/transport.d.ts.map +1 -0
  63. package/dist/src/peer/transport.js +345 -0
  64. package/dist/src/peer/transport.js.map +1 -0
  65. package/dist/src/peer/viewer-html.d.ts.map +1 -1
  66. package/dist/src/peer/viewer-html.js +10 -2
  67. package/dist/src/peer/viewer-html.js.map +1 -1
  68. package/dist/src/peer/viewer.d.ts +2 -2
  69. package/dist/src/peer/viewer.d.ts.map +1 -1
  70. package/dist/src/peer/viewer.js.map +1 -1
  71. package/dist/src/peer/wire.d.ts +90 -0
  72. package/dist/src/peer/wire.d.ts.map +1 -0
  73. package/dist/src/peer/wire.js +10 -0
  74. package/dist/src/peer/wire.js.map +1 -0
  75. package/dist/src/peer/ws.d.ts +47 -0
  76. package/dist/src/peer/ws.d.ts.map +1 -0
  77. package/dist/src/peer/ws.js +308 -0
  78. package/dist/src/peer/ws.js.map +1 -0
  79. package/package.json +1 -1
  80. package/plugin/.codex-plugin/plugin.json +1 -1
  81. package/plugin/.mcp.json +1 -1
  82. package/plugin/mcp.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../../src/peer/relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import type { MachineKey } from './keys.js';
2
+ /**
3
+ * 팀 명단. 관리자 키로 서명한 문서 하나이고 판(epoch) 번호가 있다.
4
+ *
5
+ * 팀 id는 팀을 만든 관리자의 기기 id다. 릴레이와 처음 명단을 받는 쪽은 이 id를 믿을
6
+ * 출발점으로 삼는다. 판을 올린 명단은 지금 들고 있는 명단의 관리자가 서명해야 받는다.
7
+ */
8
+ export type Role = 'admin' | 'member';
9
+ export interface RosterMember {
10
+ person: string;
11
+ /** 기기 id(Ed25519 공개키) */
12
+ machineKey: string;
13
+ /** X25519 공개키 */
14
+ boxKey: string;
15
+ role: Role;
16
+ addedAt: number;
17
+ }
18
+ export interface Roster {
19
+ v: 1;
20
+ team: string;
21
+ epoch: number;
22
+ /** 팀 릴레이 주소. `ws://` 또는 `wss://` */
23
+ relay: string;
24
+ members: RosterMember[];
25
+ issuedAt: number;
26
+ /** 서명한 관리자 기기 id */
27
+ issuer: string;
28
+ }
29
+ export interface SignedRoster {
30
+ roster: Roster;
31
+ sig: string;
32
+ }
33
+ export declare function isPersonName(value: unknown): value is string;
34
+ export declare function isRelayUrl(value: unknown): value is string;
35
+ export declare function signRoster(roster: Roster, key: MachineKey): SignedRoster;
36
+ export declare function memberOf(roster: Roster, machineKey: string): RosterMember | undefined;
37
+ export declare function isAdmin(roster: Roster, machineKey: string): boolean;
38
+ export type RosterVerdict = {
39
+ ok: true;
40
+ } | {
41
+ ok: false;
42
+ reason: string;
43
+ };
44
+ /**
45
+ * 새 명단을 받을지 정한다.
46
+ *
47
+ * - 지금 명단이 없으면 `anchor`(팀 id나 초대한 관리자 id)가 서명하고 그 키가 새 명단의
48
+ * 관리자여야 한다.
49
+ * - 지금 명단이 있으면 판이 더 높고 지금 명단의 관리자가 서명해야 한다. 같은 판은 다시
50
+ * 받지 않는다 — 같은 판에 다른 내용을 서명해 돌리는 걸 막는다.
51
+ */
52
+ export declare function checkRosterUpdate(current: SignedRoster | null, incoming: unknown, expect: {
53
+ team: string;
54
+ anchor: string;
55
+ }): RosterVerdict;
56
+ /** 같은 내용을 다시 서명하지 않고 한 판 올린 새 명단을 만든다 */
57
+ export declare function nextRoster(current: Roster, members: RosterMember[], issuer: string, now?: number): Roster;
58
+ /**
59
+ * 초대 코드. 관리자가 만들어 사람에게 건넨다. 1회용이고 24시간 유효하다.
60
+ * `secret`은 관리자 데몬만 들고 있다가 join 요청의 증명을 맞춰 본다.
61
+ */
62
+ export interface Invite {
63
+ v: 1;
64
+ team: string;
65
+ relay: string;
66
+ /** 초대한 관리자 기기 id와 X25519 공개키. join 요청을 이 키에 봉인한다 */
67
+ admin: string;
68
+ adminBox: string;
69
+ id: string;
70
+ secret: string;
71
+ person: string;
72
+ expiresAt: number;
73
+ }
74
+ export declare function encodeInvite(invite: Invite): string;
75
+ export declare function decodeInvite(code: string): Invite;
76
+ /** join 요청에 싣는 증명. 초대 코드를 가진 사람만 만든다 */
77
+ export declare function joinProofText(inviteId: string, machineKey: string, boxKey: string): string;
78
+ /**
79
+ * 공유 링크. `gestalt://peer/<릴레이 호스트>/<공유 id>#<공유 키>`.
80
+ * 공유 키는 `#` 뒤라 릴레이로 안 간다.
81
+ */
82
+ export interface ShareLink {
83
+ relayHost: string;
84
+ shareId: string;
85
+ shareKey: string;
86
+ }
87
+ export declare function formatShareLink(relayUrl: string, shareId: string, shareKey: string): string;
88
+ export declare function parseShareLink(link: string): ShareLink;
89
+ //# sourceMappingURL=roster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../../../src/peer/roster.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import { isRawKey } from './keys.js';
2
+ import { canonical, signText, verifyText } from './seal.js';
3
+ const PERSON = /^[\p{L}\p{N}._-]{1,32}$/u;
4
+ export function isPersonName(value) {
5
+ return typeof value === 'string' && PERSON.test(value);
6
+ }
7
+ export function isRelayUrl(value) {
8
+ if (typeof value !== 'string' || value.length > 512)
9
+ return false;
10
+ try {
11
+ const u = new URL(value);
12
+ return (u.protocol === 'ws:' || u.protocol === 'wss:') && u.host !== '';
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ /** 서명할 바이트. 목적 문자열을 앞에 붙여 다른 서명과 섞이지 않게 한다 */
19
+ function rosterSigned(roster) {
20
+ return `gestalt-peer-roster-v1\n${canonical(roster)}`;
21
+ }
22
+ export function signRoster(roster, key) {
23
+ if (roster.issuer !== key.id)
24
+ throw new Error('명단의 issuer와 서명하는 키가 달라요');
25
+ return { roster, sig: signText(key, rosterSigned(roster)) };
26
+ }
27
+ export function memberOf(roster, machineKey) {
28
+ return roster.members.find((m) => m.machineKey === machineKey);
29
+ }
30
+ export function isAdmin(roster, machineKey) {
31
+ return memberOf(roster, machineKey)?.role === 'admin';
32
+ }
33
+ /**
34
+ * 새 명단을 받을지 정한다.
35
+ *
36
+ * - 지금 명단이 없으면 `anchor`(팀 id나 초대한 관리자 id)가 서명하고 그 키가 새 명단의
37
+ * 관리자여야 한다.
38
+ * - 지금 명단이 있으면 판이 더 높고 지금 명단의 관리자가 서명해야 한다. 같은 판은 다시
39
+ * 받지 않는다 — 같은 판에 다른 내용을 서명해 돌리는 걸 막는다.
40
+ */
41
+ export function checkRosterUpdate(current, incoming, expect) {
42
+ const shape = checkShape(incoming);
43
+ if (!shape.ok)
44
+ return shape;
45
+ const { roster, sig } = incoming;
46
+ if (roster.team !== expect.team)
47
+ return { ok: false, reason: '다른 팀의 명단이에요' };
48
+ if (!verifyText(roster.issuer, rosterSigned(roster), sig)) {
49
+ return { ok: false, reason: '명단 서명이 맞지 않아요' };
50
+ }
51
+ if (!isAdmin(roster, roster.issuer)) {
52
+ return { ok: false, reason: '서명한 키가 새 명단의 관리자가 아니에요' };
53
+ }
54
+ if (!current) {
55
+ if (roster.issuer !== expect.anchor) {
56
+ return { ok: false, reason: '믿을 수 있는 관리자가 서명한 명단이 아니에요' };
57
+ }
58
+ return { ok: true };
59
+ }
60
+ if (roster.epoch <= current.roster.epoch) {
61
+ return {
62
+ ok: false,
63
+ reason: `판이 낮거나 같아요 (지금 ${current.roster.epoch}, 받은 것 ${roster.epoch})`,
64
+ };
65
+ }
66
+ if (!isAdmin(current.roster, roster.issuer)) {
67
+ return { ok: false, reason: '지금 명단의 관리자가 서명하지 않았어요' };
68
+ }
69
+ return { ok: true };
70
+ }
71
+ function checkShape(value) {
72
+ const bad = (reason) => ({ ok: false, reason: `명단 형식: ${reason}` });
73
+ if (typeof value !== 'object' || value === null)
74
+ return bad('객체가 아니에요');
75
+ const { roster, sig } = value;
76
+ if (typeof sig !== 'string')
77
+ return bad('서명이 없어요');
78
+ if (typeof roster !== 'object' || roster === null)
79
+ return bad('명단이 없어요');
80
+ if (roster.v !== 1)
81
+ return bad('버전');
82
+ if (!isRawKey(roster.team) || !isRawKey(roster.issuer))
83
+ return bad('키');
84
+ if (!Number.isSafeInteger(roster.epoch) || roster.epoch < 1)
85
+ return bad('판');
86
+ if (!Number.isSafeInteger(roster.issuedAt))
87
+ return bad('시각');
88
+ if (!isRelayUrl(roster.relay))
89
+ return bad('릴레이 주소');
90
+ if (!Array.isArray(roster.members) || roster.members.length === 0)
91
+ return bad('멤버');
92
+ if (roster.members.length > 1000)
93
+ return bad('멤버가 너무 많아요');
94
+ const seen = new Set();
95
+ for (const m of roster.members) {
96
+ if (typeof m !== 'object' || m === null)
97
+ return bad('멤버');
98
+ if (!isPersonName(m.person))
99
+ return bad('이름');
100
+ if (!isRawKey(m.machineKey) || !isRawKey(m.boxKey))
101
+ return bad('멤버 키');
102
+ if (m.role !== 'admin' && m.role !== 'member')
103
+ return bad('역할');
104
+ if (!Number.isSafeInteger(m.addedAt))
105
+ return bad('추가 시각');
106
+ if (seen.has(m.machineKey))
107
+ return bad('같은 기기가 두 번 있어요');
108
+ seen.add(m.machineKey);
109
+ }
110
+ return { ok: true };
111
+ }
112
+ /** 같은 내용을 다시 서명하지 않고 한 판 올린 새 명단을 만든다 */
113
+ export function nextRoster(current, members, issuer, now = Date.now()) {
114
+ return { ...current, epoch: current.epoch + 1, members, issuedAt: now, issuer };
115
+ }
116
+ const INVITE_PREFIX = 'gpi1.';
117
+ export function encodeInvite(invite) {
118
+ return INVITE_PREFIX + Buffer.from(JSON.stringify(invite), 'utf8').toString('base64url');
119
+ }
120
+ export function decodeInvite(code) {
121
+ const trimmed = code.trim();
122
+ if (!trimmed.startsWith(INVITE_PREFIX))
123
+ throw new Error('초대 코드 꼴이 아니에요');
124
+ let v;
125
+ try {
126
+ v = JSON.parse(Buffer.from(trimmed.slice(INVITE_PREFIX.length), 'base64url').toString('utf8'));
127
+ }
128
+ catch {
129
+ throw new Error('초대 코드를 못 읽었어요');
130
+ }
131
+ if (v.v !== 1 ||
132
+ !isRawKey(v.team) ||
133
+ !isRawKey(v.admin) ||
134
+ !isRawKey(v.adminBox) ||
135
+ !isRelayUrl(v.relay) ||
136
+ typeof v.id !== 'string' ||
137
+ !/^[A-Za-z0-9_-]{8,64}$/.test(v.id) ||
138
+ typeof v.secret !== 'string' ||
139
+ !/^[A-Za-z0-9_-]{43}$/.test(v.secret) ||
140
+ !isPersonName(v.person) ||
141
+ !Number.isSafeInteger(v.expiresAt)) {
142
+ throw new Error('초대 코드 내용이 맞지 않아요');
143
+ }
144
+ return v;
145
+ }
146
+ /** join 요청에 싣는 증명. 초대 코드를 가진 사람만 만든다 */
147
+ export function joinProofText(inviteId, machineKey, boxKey) {
148
+ return canonical({ p: 'gestalt-peer-join-v1', invite: inviteId, key: machineKey, box: boxKey });
149
+ }
150
+ const LINK = /^gestalt:\/\/peer\/([^/#?\s]{1,255})\/([A-Za-z0-9_-]{1,64})#([A-Za-z0-9_-]{43})$/;
151
+ export function formatShareLink(relayUrl, shareId, shareKey) {
152
+ return `gestalt://peer/${new URL(relayUrl).host}/${shareId}#${shareKey}`;
153
+ }
154
+ export function parseShareLink(link) {
155
+ const m = LINK.exec(link.trim());
156
+ if (!m)
157
+ throw new Error('공유 링크 꼴이 아니에요 (gestalt://peer/<릴레이>/<공유 id>#<키>)');
158
+ return { relayHost: m[1], shareId: m[2], shareKey: m[3] };
159
+ }
160
+ //# sourceMappingURL=roster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roster.js","sourceRoot":"","sources":["../../../src/peer/roster.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { MachineKey } from './keys.js';
2
+ /**
3
+ * 봉인과 서명. 전부 `node:crypto`다.
4
+ *
5
+ * - box: 받는 기기의 X25519 공개키로 봉인하고 보낸 기기의 Ed25519 키로 서명한다.
6
+ * 보낼 때마다 임시 X25519 키를 만들어서 같은 두 기기 사이에도 키가 매번 다르다.
7
+ * - aead: 공유 세션 키 하나로 여는 AES-256-GCM. 공유 스트림 프레임에 쓴다.
8
+ */
9
+ /** 키를 정렬한 JSON. 서명할 바이트를 두 쪽이 똑같이 만들려고 쓴다 */
10
+ export declare function canonical(value: unknown): string;
11
+ export declare function signText(key: MachineKey, text: string): string;
12
+ /** 서명이 맞는지. 키나 서명 꼴이 틀려도 던지지 않고 false */
13
+ export declare function verifyText(signer: string, text: string, sig: unknown): boolean;
14
+ export declare function deriveKey(ikm: Buffer, salt: Buffer, info: string): Buffer;
15
+ export declare function hmac(key: Buffer, text: string): string;
16
+ export declare function safeEqual(a: unknown, b: string): boolean;
17
+ /** nonce 12바이트 + 암호문 + 태그 16바이트를 base64url 한 줄로 */
18
+ export declare function aeadSeal(key: Buffer, plaintext: Buffer, aad: string): string;
19
+ /** 열지 못하면 null. 키가 틀렸거나 누가 바꿨거나 aad가 다르다 */
20
+ export declare function aeadOpen(key: Buffer, sealed: unknown, aad: string): Buffer | null;
21
+ export interface Box {
22
+ k: 'box';
23
+ /** 임시 X25519 공개키 */
24
+ e: string;
25
+ /** aeadSeal 결과 */
26
+ c: string;
27
+ /** 보낸 기기의 서명 */
28
+ s: string;
29
+ }
30
+ /**
31
+ * `to`(받는 기기 id)와 `toBox`(그 기기의 X25519 공개키)에게 봉인한다. 서명에 받는 기기
32
+ * id를 넣어서 다른 기기에게 간 봉인을 그대로 옮겨 보내도 서명이 안 맞는다.
33
+ */
34
+ export declare function sealBox(from: MachineKey, to: string, toBox: string, plaintext: string): Box;
35
+ /** 보낸 기기 서명이 맞고 열리면 평문. 아니면 null */
36
+ export declare function openBox(me: MachineKey, from: string, box: unknown): string | null;
37
+ //# sourceMappingURL=seal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal.d.ts","sourceRoot":"","sources":["../../../src/peer/seal.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;;;;GAMG;AAEH,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQhD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAY9E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAKxD;AAED,mDAAmD;AACnD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYjF;AAED,MAAM,WAAW,GAAG;IAClB,CAAC,EAAE,KAAK,CAAC;IACT,oBAAoB;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,kBAAkB;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,gBAAgB;IAChB,CAAC,EAAE,MAAM,CAAC;CACX;AAID;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAM3F;AAED,oCAAoC;AACpC,wBAAgB,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWjF"}
@@ -0,0 +1,115 @@
1
+ import { createCipheriv, createDecipheriv, createHmac, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, sign, timingSafeEqual, verify, } from 'node:crypto';
2
+ import { boxPublicKey, isRawKey, signPublicKey } from './keys.js';
3
+ /**
4
+ * 봉인과 서명. 전부 `node:crypto`다.
5
+ *
6
+ * - box: 받는 기기의 X25519 공개키로 봉인하고 보낸 기기의 Ed25519 키로 서명한다.
7
+ * 보낼 때마다 임시 X25519 키를 만들어서 같은 두 기기 사이에도 키가 매번 다르다.
8
+ * - aead: 공유 세션 키 하나로 여는 AES-256-GCM. 공유 스트림 프레임에 쓴다.
9
+ */
10
+ /** 키를 정렬한 JSON. 서명할 바이트를 두 쪽이 똑같이 만들려고 쓴다 */
11
+ export function canonical(value) {
12
+ if (value === null || typeof value !== 'object')
13
+ return JSON.stringify(value);
14
+ if (Array.isArray(value))
15
+ return `[${value.map(canonical).join(',')}]`;
16
+ const obj = value;
17
+ const keys = Object.keys(obj)
18
+ .filter((k) => obj[k] !== undefined)
19
+ .sort();
20
+ return `{${keys.map((k) => `${JSON.stringify(k)}:${canonical(obj[k])}`).join(',')}}`;
21
+ }
22
+ export function signText(key, text) {
23
+ return sign(null, Buffer.from(text, 'utf8'), key.signPrivate).toString('base64url');
24
+ }
25
+ /** 서명이 맞는지. 키나 서명 꼴이 틀려도 던지지 않고 false */
26
+ export function verifyText(signer, text, sig) {
27
+ if (!isRawKey(signer) || typeof sig !== 'string')
28
+ return false;
29
+ try {
30
+ return verify(null, Buffer.from(text, 'utf8'), signPublicKey(signer), Buffer.from(sig, 'base64url'));
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ export function deriveKey(ikm, salt, info) {
37
+ return Buffer.from(hkdfSync('sha256', ikm, salt, Buffer.from(info, 'utf8'), 32));
38
+ }
39
+ export function hmac(key, text) {
40
+ return createHmac('sha256', key).update(text, 'utf8').digest('base64url');
41
+ }
42
+ export function safeEqual(a, b) {
43
+ if (typeof a !== 'string')
44
+ return false;
45
+ const x = Buffer.from(a);
46
+ const y = Buffer.from(b);
47
+ return x.length === y.length && timingSafeEqual(x, y);
48
+ }
49
+ /** nonce 12바이트 + 암호문 + 태그 16바이트를 base64url 한 줄로 */
50
+ export function aeadSeal(key, plaintext, aad) {
51
+ const nonce = randomBytes(12);
52
+ const cipher = createCipheriv('aes-256-gcm', key, nonce);
53
+ cipher.setAAD(Buffer.from(aad, 'utf8'));
54
+ const body = Buffer.concat([cipher.update(plaintext), cipher.final()]);
55
+ return Buffer.concat([nonce, body, cipher.getAuthTag()]).toString('base64url');
56
+ }
57
+ /** 열지 못하면 null. 키가 틀렸거나 누가 바꿨거나 aad가 다르다 */
58
+ export function aeadOpen(key, sealed, aad) {
59
+ if (typeof sealed !== 'string')
60
+ return null;
61
+ const raw = Buffer.from(sealed, 'base64url');
62
+ if (raw.length < 28)
63
+ return null;
64
+ try {
65
+ const decipher = createDecipheriv('aes-256-gcm', key, raw.subarray(0, 12));
66
+ decipher.setAAD(Buffer.from(aad, 'utf8'));
67
+ decipher.setAuthTag(raw.subarray(raw.length - 16));
68
+ return Buffer.concat([decipher.update(raw.subarray(12, raw.length - 16)), decipher.final()]);
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ const BOX_INFO = 'gestalt-peer-box-v1';
75
+ /**
76
+ * `to`(받는 기기 id)와 `toBox`(그 기기의 X25519 공개키)에게 봉인한다. 서명에 받는 기기
77
+ * id를 넣어서 다른 기기에게 간 봉인을 그대로 옮겨 보내도 서명이 안 맞는다.
78
+ */
79
+ export function sealBox(from, to, toBox, plaintext) {
80
+ const eph = generateKeyPairSync('x25519');
81
+ const e = eph.publicKey.export({ format: 'jwk' }).x;
82
+ const key = boxKey(eph.privateKey, boxPublicKey(toBox), e, toBox);
83
+ const c = aeadSeal(key, Buffer.from(plaintext, 'utf8'), `${BOX_INFO}|${from.id}|${to}`);
84
+ return { k: 'box', e, c, s: signText(from, boxSigned(from.id, to, e, c)) };
85
+ }
86
+ /** 보낸 기기 서명이 맞고 열리면 평문. 아니면 null */
87
+ export function openBox(me, from, box) {
88
+ if (!isBox(box))
89
+ return null;
90
+ if (!verifyText(from, boxSigned(from, me.id, box.e, box.c), box.s))
91
+ return null;
92
+ let key;
93
+ try {
94
+ key = boxKey(me.boxPrivate, boxPublicKey(box.e), box.e, me.boxKey);
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ const plain = aeadOpen(key, box.c, `${BOX_INFO}|${from}|${me.id}`);
100
+ return plain ? plain.toString('utf8') : null;
101
+ }
102
+ function boxSigned(from, to, e, c) {
103
+ return `${BOX_INFO}\n${from}\n${to}\n${e}\n${c}`;
104
+ }
105
+ function boxKey(priv, pub, ephRaw, recipientRaw) {
106
+ const shared = diffieHellman({ privateKey: priv, publicKey: pub });
107
+ return deriveKey(shared, Buffer.from(ephRaw + recipientRaw, 'utf8'), BOX_INFO);
108
+ }
109
+ function isBox(v) {
110
+ if (typeof v !== 'object' || v === null)
111
+ return false;
112
+ const b = v;
113
+ return b.k === 'box' && isRawKey(b.e) && typeof b.c === 'string' && typeof b.s === 'string';
114
+ }
115
+ //# sourceMappingURL=seal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal.js","sourceRoot":"","sources":["../../../src/peer/seal.ts"],"names":[],"mappings":"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"}
@@ -1,36 +1,8 @@
1
1
  import type { TailOptions } from './tail.js';
2
2
  import type { RedactOptions, ToolsLevel } from './redact.js';
3
- /**
4
- * 뷰어 하나가 받는 것. seq는 SSE id로 써서 다시 붙었을 때 이어 받게 한다. 이벤트는
5
- * 쌓을 때 한 번 직렬화한 글자를 그대로 넘긴다. 뷰어마다 다시 직렬화하지 않는다.
6
- */
7
- export type ShareFrame = {
8
- type: 'event';
9
- seq: number;
10
- json: string;
11
- }
12
- /** 붙은 뷰어가 받을 앞부분 중 메모리 상한에 밀려 버려진 이벤트 수 */
13
- | {
14
- type: 'trimmed';
15
- dropped: number;
16
- } | {
17
- type: 'stats';
18
- unknownLines: number;
19
- } | {
20
- type: 'state';
21
- status: ShareStatus;
22
- }
23
- /**
24
- * 공유 종료. 앞부분을 따라잡는 중에 종료되면 아직 못 보낸 이벤트는 사라지므로 그 개수를
25
- * missed에 싣는다. 붙어 있던 뷰어는 다 받은 뒤라 안 싣는다
26
- */
27
- | {
28
- type: 'closed';
29
- reason: string;
30
- missed?: number;
31
- };
32
- export type ShareStatus = 'live' | 'missing' | 'truncated';
33
- export type ShareListener = (frame: ShareFrame) => void;
3
+ import { ShareFeed } from './feed.js';
4
+ export { DEFAULT_MAX_BACKLOG_BYTES } from './feed.js';
5
+ export type { BacklogSlice, ShareFrame, ShareListener, ShareStatus } from './feed.js';
34
6
  export interface ShareStreamOptions extends RedactOptions {
35
7
  id: string;
36
8
  transcriptPath: string;
@@ -39,62 +11,25 @@ export interface ShareStreamOptions extends RedactOptions {
39
11
  maxBacklogBytes?: number;
40
12
  tail?: Omit<TailOptions, 'startOffset'>;
41
13
  }
42
- /**
43
- * 새 뷰어에게 다시 보낼 앞부분의 상한. 넘으면 오래된 것부터 버린다. 공유는 최대 7일
44
- * 열려 있고 도구 출력이 크면 events가 끝없이 는다.
45
- */
46
- export declare const DEFAULT_MAX_BACKLOG_BYTES: number;
47
- export interface BacklogSlice {
48
- /** `afterSeq` 뒤로 상한에 밀려 버려진 이벤트 수 */
49
- dropped: number;
50
- items: {
51
- seq: number;
52
- json: string;
53
- }[];
54
- }
55
14
  /**
56
15
  * 공유 하나. 대화 기록을 따라 읽어 바꾼 이벤트를 메모리에 쌓고 붙은 뷰어에 흘린다.
57
16
  *
58
17
  * 바꾼 결과만 메모리에 들고 원문 줄은 들지 않는다. 디스크에는 아무것도 안 쓴다.
59
18
  * 처음 붙는 뷰어가 앞부분을 받아야 해서 바꾼 이벤트를 직렬화한 글자로 상한까지 남긴다.
60
- *
61
- * seq는 공유가 연 뒤로 나온 이벤트의 번호다. 앞부분을 버려도 번호는 안 당긴다.
62
- * 배열 위치로 매기면 버린 만큼 번호가 밀려 Last-Event-ID로 이어 받을 때 겹치거나 빠진다.
63
19
  */
64
- export declare class ShareStream {
65
- readonly id: string;
20
+ export declare class ShareStream extends ShareFeed {
66
21
  readonly transcriptPath: string;
67
22
  readonly tools: ToolsLevel;
68
23
  private tail;
69
24
  private transformer;
70
- /**
71
- * `events[head]`부터가 살아 있다. 앞에서 하나씩 shift하면 큰 배열에서 매번 다 옮긴다.
72
- * head 앞 칸은 버릴 때 비워 둔다. 압축은 head가 1024를 넘어야 돌아서 칸에 참조를
73
- * 남기면 버린 이벤트를 GC가 못 가져간다.
74
- */
75
- private events;
76
- private head;
77
- /** `events[0]` 앞에서 잘라 낸 이벤트 수. `events[i]`의 seq는 `base + i + 1`이다 */
78
- private base;
79
- private backlogBytes;
80
- private readonly maxBacklogBytes;
81
- private listeners;
82
- private status;
83
25
  private title;
84
26
  private lastUnknown;
85
- private closedReason;
86
27
  constructor(options: ShareStreamOptions);
87
- get currentStatus(): ShareStatus;
88
28
  get unknownLines(): number;
89
29
  get failedLines(): number;
90
30
  get oversizedLines(): number;
91
31
  get claudeVersion(): string | undefined;
92
32
  get sessionTitle(): string | undefined;
93
- get eventCount(): number;
94
- /** 상한에 밀려 버린 이벤트 수 */
95
- get droppedEvents(): number;
96
- get viewerCount(): number;
97
- get isClosed(): boolean;
98
33
  /**
99
34
  * 새로 쓰인 줄을 읽어 흘린다. 데몬이 주기적으로 부른다.
100
35
  * 모르는 줄 수가 늘었으면 true — 데몬이 감사 로그에 버전을 남길 때 쓴다.
@@ -102,22 +37,5 @@ export declare class ShareStream {
102
37
  poll(): {
103
38
  unknownGrew: boolean;
104
39
  };
105
- /**
106
- * 쌓인 것 중 `afterSeq` 뒤를 `maxBytes`쯤까지 꺼낸다. 이벤트 하나가 상한보다 커도 하나는
107
- * 꺼낸다. 뷰어가 소켓이 비는 만큼씩 앞부분을 보내려고 쓴다. 한 번에 다 넘기면 안 읽는
108
- * 뷰어마다 앞부분 전체가 소켓 버퍼에 쌓인다.
109
- */
110
- backlogAfter(afterSeq: number, maxBytes: number): BacklogSlice;
111
- /**
112
- * 뷰어를 붙인다. 지금 상태와 `afterSeq` 뒤 앞부분을 한 번에 보내고 이후는 생기는 대로.
113
- * 떼어내는 함수를 돌려준다. 앞부분이 큰 뷰어는 backlogAfter로 먼저 따라잡은 뒤 이벤트
114
- * 루프로 돌아가기 전에 바로 붙어야 사이에 poll이 끼어 이벤트가 빠지지 않는다.
115
- */
116
- subscribe(listener: ShareListener, afterSeq?: number): () => void;
117
- close(reason: string): void;
118
- /** 가장 최근 이벤트 하나는 상한을 넘어도 남긴다. 다 버리면 새 뷰어가 지금 상태를 못 본다 */
119
- private trim;
120
- private setStatus;
121
- private emit;
122
40
  }
123
41
  //# sourceMappingURL=share.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../../src/peer/share.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../../src/peer/share.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,WAAW,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAEtF,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;CACzC;AAED;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAE3B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAK;gBAEZ,OAAO,EAAE,kBAAkB;IAQvC,IAAa,YAAY,IAAI,MAAM,CAElC;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,aAAa,IAAI,MAAM,GAAG,SAAS,CAEtC;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAED;;;OAGG;IACH,IAAI,IAAI;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE;CAwBjC"}