@tienne/gestalt 0.111.0 → 0.113.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/CLAUDE.md +3 -3
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/dist/package.json +3 -1
- package/dist/plugin/role-agents/lens-context/AGENT.md +8 -7
- package/dist/plugin/role-agents/lens-reader/AGENT.md +48 -2
- package/dist/plugin/skills/lens/SKILL.md +22 -15
- package/dist/src/architecture/doc-fresh.d.ts.map +1 -1
- package/dist/src/architecture/doc-fresh.js +3 -1
- package/dist/src/architecture/doc-fresh.js.map +1 -1
- package/dist/src/cli/commands/lens.d.ts +8 -1
- package/dist/src/cli/commands/lens.d.ts.map +1 -1
- package/dist/src/cli/commands/lens.js +29 -2
- package/dist/src/cli/commands/lens.js.map +1 -1
- package/dist/src/cli/commands/peer.d.ts +20 -0
- package/dist/src/cli/commands/peer.d.ts.map +1 -1
- package/dist/src/cli/commands/peer.js +198 -12
- package/dist/src/cli/commands/peer.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +44 -4
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/digest/lens-schema.d.ts +150 -3
- package/dist/src/digest/lens-schema.d.ts.map +1 -1
- package/dist/src/digest/lens-schema.js +14 -1
- package/dist/src/digest/lens-schema.js.map +1 -1
- package/dist/src/digest/lens-widget-schema.d.ts +2 -2
- package/dist/src/digest/lint-lens.d.ts +2 -1
- package/dist/src/digest/lint-lens.d.ts.map +1 -1
- package/dist/src/digest/lint-lens.js +68 -7
- package/dist/src/digest/lint-lens.js.map +1 -1
- package/dist/src/digest/ocr.d.ts +1 -1
- package/dist/src/digest/ocr.d.ts.map +1 -1
- package/dist/src/digest/ocr.js +10 -4
- package/dist/src/digest/ocr.js.map +1 -1
- package/dist/src/digest/schema.d.ts +62 -62
- package/dist/src/lens/attach.d.ts +741 -0
- package/dist/src/lens/attach.d.ts.map +1 -1
- package/dist/src/lens/attach.js +41 -11
- package/dist/src/lens/attach.js.map +1 -1
- package/dist/src/lens/context-input.d.ts +17 -0
- package/dist/src/lens/context-input.d.ts.map +1 -0
- package/dist/src/lens/context-input.js +31 -0
- package/dist/src/lens/context-input.js.map +1 -0
- package/dist/src/lens/ingest.d.ts +19 -1
- package/dist/src/lens/ingest.d.ts.map +1 -1
- package/dist/src/lens/ingest.js +92 -14
- package/dist/src/lens/ingest.js.map +1 -1
- package/dist/src/lens/pdf-extract-py.d.ts +2 -0
- package/dist/src/lens/pdf-extract-py.d.ts.map +1 -1
- package/dist/src/lens/pdf-extract-py.js +37 -2
- package/dist/src/lens/pdf-extract-py.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +29 -0
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +29 -0
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +6 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/architecture-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/architecture-passthrough.js +1 -1
- package/dist/src/mcp/tools/architecture-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/peer.d.ts +24 -0
- package/dist/src/mcp/tools/peer.d.ts.map +1 -0
- package/dist/src/mcp/tools/peer.js +103 -0
- package/dist/src/mcp/tools/peer.js.map +1 -0
- package/dist/src/peer/codex.d.ts +57 -0
- package/dist/src/peer/codex.d.ts.map +1 -0
- package/dist/src/peer/codex.js +303 -0
- package/dist/src/peer/codex.js.map +1 -0
- package/dist/src/peer/daemon.d.ts +76 -1
- package/dist/src/peer/daemon.d.ts.map +1 -1
- package/dist/src/peer/daemon.js +511 -19
- package/dist/src/peer/daemon.js.map +1 -1
- package/dist/src/peer/errors.d.ts +3 -0
- package/dist/src/peer/errors.d.ts.map +1 -1
- package/dist/src/peer/errors.js +3 -0
- package/dist/src/peer/errors.js.map +1 -1
- package/dist/src/peer/excerpt.d.ts +47 -0
- package/dist/src/peer/excerpt.d.ts.map +1 -0
- package/dist/src/peer/excerpt.js +160 -0
- package/dist/src/peer/excerpt.js.map +1 -0
- package/dist/src/peer/feed.d.ts +35 -2
- package/dist/src/peer/feed.d.ts.map +1 -1
- package/dist/src/peer/feed.js +22 -0
- package/dist/src/peer/feed.js.map +1 -1
- package/dist/src/peer/inbox.d.ts +42 -0
- package/dist/src/peer/inbox.d.ts.map +1 -0
- package/dist/src/peer/inbox.js +96 -0
- package/dist/src/peer/inbox.js.map +1 -0
- package/dist/src/peer/locate.d.ts +5 -0
- package/dist/src/peer/locate.d.ts.map +1 -1
- package/dist/src/peer/locate.js +19 -2
- package/dist/src/peer/locate.js.map +1 -1
- package/dist/src/peer/message.d.ts +113 -0
- package/dist/src/peer/message.d.ts.map +1 -0
- package/dist/src/peer/message.js +183 -0
- package/dist/src/peer/message.js.map +1 -0
- package/dist/src/peer/mirror.d.ts +50 -1
- package/dist/src/peer/mirror.d.ts.map +1 -1
- package/dist/src/peer/mirror.js +138 -0
- package/dist/src/peer/mirror.js.map +1 -1
- package/dist/src/peer/network.d.ts +229 -1
- package/dist/src/peer/network.d.ts.map +1 -1
- package/dist/src/peer/network.js +867 -44
- package/dist/src/peer/network.js.map +1 -1
- package/dist/src/peer/paths.d.ts +6 -0
- package/dist/src/peer/paths.d.ts.map +1 -1
- package/dist/src/peer/paths.js +8 -0
- package/dist/src/peer/paths.js.map +1 -1
- package/dist/src/peer/peek.d.ts +79 -0
- package/dist/src/peer/peek.d.ts.map +1 -0
- package/dist/src/peer/peek.js +465 -0
- package/dist/src/peer/peek.js.map +1 -0
- package/dist/src/peer/peeks.d.ts +115 -0
- package/dist/src/peer/peeks.d.ts.map +1 -0
- package/dist/src/peer/peeks.js +262 -0
- package/dist/src/peer/peeks.js.map +1 -0
- package/dist/src/peer/protocol.d.ts +128 -4
- package/dist/src/peer/protocol.d.ts.map +1 -1
- package/dist/src/peer/protocol.js.map +1 -1
- package/dist/src/peer/questions.d.ts +168 -0
- package/dist/src/peer/questions.d.ts.map +1 -0
- package/dist/src/peer/questions.js +389 -0
- package/dist/src/peer/questions.js.map +1 -0
- package/dist/src/peer/relay.d.ts +14 -0
- package/dist/src/peer/relay.d.ts.map +1 -1
- package/dist/src/peer/relay.js +102 -7
- package/dist/src/peer/relay.js.map +1 -1
- package/dist/src/peer/roster.d.ts +2 -0
- package/dist/src/peer/roster.d.ts.map +1 -1
- package/dist/src/peer/roster.js +5 -0
- package/dist/src/peer/roster.js.map +1 -1
- package/dist/src/peer/share.d.ts +48 -1
- package/dist/src/peer/share.d.ts.map +1 -1
- package/dist/src/peer/share.js +167 -2
- package/dist/src/peer/share.js.map +1 -1
- package/dist/src/peer/state.d.ts +12 -1
- package/dist/src/peer/state.d.ts.map +1 -1
- package/dist/src/peer/state.js +15 -0
- package/dist/src/peer/state.js.map +1 -1
- package/dist/src/peer/transform.d.ts +32 -0
- package/dist/src/peer/transform.d.ts.map +1 -1
- package/dist/src/peer/transform.js +52 -33
- package/dist/src/peer/transform.js.map +1 -1
- package/dist/src/peer/transport.d.ts +7 -3
- package/dist/src/peer/transport.d.ts.map +1 -1
- package/dist/src/peer/transport.js +12 -4
- package/dist/src/peer/transport.js.map +1 -1
- package/dist/src/peer/viewer-html.d.ts +13 -1
- package/dist/src/peer/viewer-html.d.ts.map +1 -1
- package/dist/src/peer/viewer-html.js +328 -4
- package/dist/src/peer/viewer-html.js.map +1 -1
- package/dist/src/peer/viewer.d.ts +49 -1
- package/dist/src/peer/viewer.d.ts.map +1 -1
- package/dist/src/peer/viewer.js +133 -7
- package/dist/src/peer/viewer.js.map +1 -1
- package/dist/src/peer/wire.d.ts +9 -2
- package/dist/src/peer/wire.d.ts.map +1 -1
- package/dist/src/peer/wire.js.map +1 -1
- package/package.json +3 -1
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/.mcp.json +1 -1
- package/plugin/mcp.json +1 -1
- package/plugin/role-agents/lens-context/AGENT.md +8 -7
- package/plugin/role-agents/lens-reader/AGENT.md +48 -2
- package/plugin/skills/lens/SKILL.md +22 -15
package/dist/src/peer/mirror.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { ShareFeed } from './feed.js';
|
|
2
|
+
/** 내가 보낸 메시지 기록 상한. 넘으면 오래된 것부터 잊는다 */
|
|
3
|
+
const MAX_MY_MESSAGES = 100;
|
|
4
|
+
/** 받아 둔 질문 상한. 넘으면 오래된 것부터 잊는다 */
|
|
5
|
+
export const MAX_QUESTIONS_PER_WATCH = 16;
|
|
2
6
|
/**
|
|
3
7
|
* 보는 사람 데몬이 원격 공유를 받아 로컬 뷰어로 옮기는 자리. 뷰어 서버는 내 공유와
|
|
4
8
|
* 똑같이 다룬다.
|
|
@@ -11,6 +15,10 @@ export class MirrorFeed extends ShareFeed {
|
|
|
11
15
|
ownerPerson;
|
|
12
16
|
shareId;
|
|
13
17
|
unknown = 0;
|
|
18
|
+
mine = new Map();
|
|
19
|
+
/** 미리 두기만 하고 아직 안 알린 메시지. 새로 붙은 뷰어에도 안 보낸다 */
|
|
20
|
+
reserved = new Set();
|
|
21
|
+
questions = new Map();
|
|
14
22
|
constructor(id, ownerKey, ownerPerson, shareId, maxBacklogBytes) {
|
|
15
23
|
super(id, maxBacklogBytes);
|
|
16
24
|
this.ownerKey = ownerKey;
|
|
@@ -61,7 +69,137 @@ export class MirrorFeed extends ShareFeed {
|
|
|
61
69
|
markOffline() {
|
|
62
70
|
this.setStatus('offline');
|
|
63
71
|
}
|
|
72
|
+
/** 주인 승인을 기다린다. 받아 주면 주인 쪽 state 프레임이 live로 바꾼다 */
|
|
73
|
+
markWaiting() {
|
|
74
|
+
this.setStatus('waiting');
|
|
75
|
+
}
|
|
76
|
+
get messages() {
|
|
77
|
+
return [...this.mine.values()];
|
|
78
|
+
}
|
|
79
|
+
/** 내가 보낸 메시지 상태를 바꾸고 붙은 뷰어에 알린다. 뒤 단계에서 앞 단계로는 안 돌아간다 */
|
|
80
|
+
setMessage(id, patch) {
|
|
81
|
+
const prev = this.mine.get(id);
|
|
82
|
+
if (prev && STATUS_ORDER[patch.status] < STATUS_ORDER[prev.status])
|
|
83
|
+
return;
|
|
84
|
+
const next = {
|
|
85
|
+
id,
|
|
86
|
+
text: patch.text ?? prev?.text ?? '',
|
|
87
|
+
status: patch.status,
|
|
88
|
+
at: patch.at ?? prev?.at ?? Date.now(),
|
|
89
|
+
...(patch.reason ? { reason: patch.reason } : {}),
|
|
90
|
+
};
|
|
91
|
+
this.mine.delete(id);
|
|
92
|
+
this.mine.set(id, next);
|
|
93
|
+
this.reserved.delete(id);
|
|
94
|
+
this.dropOldest();
|
|
95
|
+
this.emit({ type: 'msg', ...next });
|
|
96
|
+
}
|
|
97
|
+
dropOldest() {
|
|
98
|
+
while (this.mine.size > MAX_MY_MESSAGES) {
|
|
99
|
+
const oldest = this.mine.keys().next().value;
|
|
100
|
+
if (oldest === undefined)
|
|
101
|
+
break;
|
|
102
|
+
this.mine.delete(oldest);
|
|
103
|
+
this.reserved.delete(oldest);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 보내기 전에 레코드만 둔다. 뷰어에는 안 알린다. 릴레이 답보다 주인 데몬의 상태가 먼저 와도
|
|
108
|
+
* 그 상태를 버리지 않으려고 쓴다. 가장 앞 단계인 queued로 두므로 뒤에 오는 어떤 상태든 덮는다.
|
|
109
|
+
*/
|
|
110
|
+
reserveMessage(id, text, at) {
|
|
111
|
+
this.mine.set(id, { id, text, status: 'queued', at });
|
|
112
|
+
this.reserved.add(id);
|
|
113
|
+
this.dropOldest();
|
|
114
|
+
}
|
|
115
|
+
getMessage(id) {
|
|
116
|
+
return this.mine.get(id);
|
|
117
|
+
}
|
|
118
|
+
/** 주인 세션 모델이 나에게 물은 질문을 둔다. 이미 받은 id면 false */
|
|
119
|
+
addQuestion(id, text, expiresAt) {
|
|
120
|
+
if (this.isClosed || this.questions.has(id))
|
|
121
|
+
return false;
|
|
122
|
+
const q = { id, text, expiresAt, state: 'open' };
|
|
123
|
+
this.questions.set(id, q);
|
|
124
|
+
while (this.questions.size > MAX_QUESTIONS_PER_WATCH) {
|
|
125
|
+
const oldest = this.questions.keys().next().value;
|
|
126
|
+
if (oldest === undefined)
|
|
127
|
+
break;
|
|
128
|
+
this.questions.delete(oldest);
|
|
129
|
+
}
|
|
130
|
+
this.emit({ type: 'ask', ...q });
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
getQuestion(id) {
|
|
134
|
+
return this.questions.get(id);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 질문 상태를 바꾸고 붙은 뷰어에 알린다. 끝난 상태(delivered, rejected, closed)에서는 안 바뀌고
|
|
138
|
+
* 답 상태는 메시지처럼 뒤 단계에서 앞 단계로 안 돌아간다. closed는 아직 답하지 않았을 때만 된다.
|
|
139
|
+
*/
|
|
140
|
+
setQuestion(id, state, reason) {
|
|
141
|
+
const q = this.questions.get(id);
|
|
142
|
+
if (!q || QUESTION_DONE.has(q.state))
|
|
143
|
+
return;
|
|
144
|
+
if (state === 'closed' && q.state !== 'open')
|
|
145
|
+
return;
|
|
146
|
+
if (QUESTION_ORDER[state] < QUESTION_ORDER[q.state])
|
|
147
|
+
return;
|
|
148
|
+
q.state = state;
|
|
149
|
+
if (reason)
|
|
150
|
+
q.reason = reason;
|
|
151
|
+
else
|
|
152
|
+
delete q.reason;
|
|
153
|
+
this.emit({ type: 'ask', ...q });
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 주인 데몬이 내 답을 주인 세션에 못 넣어 질문을 다시 열었다. 내 답이 아직 끝나지 않았거나 거절된
|
|
157
|
+
* 상태이고 시한 전일 때만 open으로 되돌려 다시 답하게 한다. 이유는 남겨 뷰어에 보인다.
|
|
158
|
+
*/
|
|
159
|
+
reopenQuestion(id, reason, now = Date.now()) {
|
|
160
|
+
const q = this.questions.get(id);
|
|
161
|
+
if (!q || now >= q.expiresAt)
|
|
162
|
+
return;
|
|
163
|
+
if (q.state !== 'queued' && q.state !== 'sent' && q.state !== 'rejected')
|
|
164
|
+
return;
|
|
165
|
+
q.state = 'open';
|
|
166
|
+
if (reason)
|
|
167
|
+
q.reason = reason;
|
|
168
|
+
else
|
|
169
|
+
delete q.reason;
|
|
170
|
+
this.emit({ type: 'ask', ...q });
|
|
171
|
+
}
|
|
172
|
+
subscribe(listener, afterSeq = 0) {
|
|
173
|
+
const off = super.subscribe(listener, afterSeq);
|
|
174
|
+
for (const m of this.mine.values()) {
|
|
175
|
+
if (!this.reserved.has(m.id))
|
|
176
|
+
listener({ type: 'msg', ...m });
|
|
177
|
+
}
|
|
178
|
+
for (const q of this.questions.values())
|
|
179
|
+
listener({ type: 'ask', ...q });
|
|
180
|
+
return off;
|
|
181
|
+
}
|
|
64
182
|
}
|
|
183
|
+
const QUESTION_DONE = new Set(['delivered', 'rejected', 'closed']);
|
|
184
|
+
const QUESTION_ORDER = {
|
|
185
|
+
open: 0,
|
|
186
|
+
queued: 1,
|
|
187
|
+
sent: 2,
|
|
188
|
+
inserted: 3,
|
|
189
|
+
delivered: 4,
|
|
190
|
+
rejected: 5,
|
|
191
|
+
closed: 5,
|
|
192
|
+
};
|
|
193
|
+
/** 거절은 어느 단계에서든 올 수 있어서 끝에 둔다 */
|
|
194
|
+
const STATUS_ORDER = {
|
|
195
|
+
queued: 0,
|
|
196
|
+
sent: 1,
|
|
197
|
+
arrived: 2,
|
|
198
|
+
inserted: 3,
|
|
199
|
+
delivered: 4,
|
|
200
|
+
rejected: 5,
|
|
201
|
+
};
|
|
202
|
+
/** 주인 쪽이 보내는 상태만 받는다. waiting은 보는 쪽 데몬이 정한다 */
|
|
65
203
|
function isShareStatus(v) {
|
|
66
204
|
return v === 'live' || v === 'missing' || v === 'truncated' || v === 'offline';
|
|
67
205
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../../src/peer/mirror.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../../src/peer/mirror.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,47 @@ import type { MachineKey } from './keys.js';
|
|
|
3
3
|
import { MirrorFeed } from './mirror.js';
|
|
4
4
|
import type { PeerState } from './state.js';
|
|
5
5
|
import type { RelayTransportOptions, TransportState } from './transport.js';
|
|
6
|
+
import { PeerNetworkError } from './errors.js';
|
|
7
|
+
import type { InboxResult } from './inbox.js';
|
|
8
|
+
import type { MessageOrigin, MessageStatus } from './message.js';
|
|
9
|
+
import type { BlockReason, ControlResult, FirstWatchApproval, PeekNotice, PendingWatcher } from './protocol.js';
|
|
10
|
+
import type { PeerPeek } from './peek.js';
|
|
11
|
+
import type { AskResult } from './questions.js';
|
|
6
12
|
/** 주인 데몬이 내 공유를 넘겨줄 때 쓰는 것 */
|
|
7
13
|
export interface OwnedShare {
|
|
8
14
|
stream: ShareFeed;
|
|
9
15
|
shareKey: string;
|
|
16
|
+
/**
|
|
17
|
+
* 메시지나 서명을 확인한 답을 주인 세션 인박스에 쓴다. 쓴 뒤 대화 기록에 보이면 onSeen을 부른다.
|
|
18
|
+
* 없으면 이 공유는 메시지도 답도 못 받는다.
|
|
19
|
+
*/
|
|
20
|
+
deliver?(m: InboundMessage | InboundAnswer, onSeen: () => void): Promise<InboxResult>;
|
|
21
|
+
/**
|
|
22
|
+
* 보는 쪽 에이전트에 줄 요약을 만든다. since 뒤에 생긴 것만 추린다. 주인이 `--agent-peek`으로 연
|
|
23
|
+
* 공유만 있다. 없으면 peek 요청을 peek_off로 거절한다.
|
|
24
|
+
*/
|
|
25
|
+
peek?(since?: string): PeerPeek;
|
|
26
|
+
}
|
|
27
|
+
/** 주인 데몬이 받아 검사를 마친 메시지 */
|
|
28
|
+
export interface InboundMessage {
|
|
29
|
+
kind: 'message';
|
|
30
|
+
id: string;
|
|
31
|
+
share: string;
|
|
32
|
+
from: string;
|
|
33
|
+
person: string;
|
|
34
|
+
origin: MessageOrigin;
|
|
35
|
+
/** sanitizeMessageBody를 거친 본문 */
|
|
36
|
+
body: string;
|
|
37
|
+
}
|
|
38
|
+
/** 주인 데몬이 서명까지 확인한 답 */
|
|
39
|
+
export interface InboundAnswer {
|
|
40
|
+
kind: 'answer';
|
|
41
|
+
question: string;
|
|
42
|
+
share: string;
|
|
43
|
+
from: string;
|
|
44
|
+
person: string;
|
|
45
|
+
/** sanitizeMessageBody를 거친 본문 */
|
|
46
|
+
body: string;
|
|
10
47
|
}
|
|
11
48
|
export interface PeerNetworkOptions {
|
|
12
49
|
state: PeerState;
|
|
@@ -16,6 +53,16 @@ export interface PeerNetworkOptions {
|
|
|
16
53
|
transport?: Partial<Pick<RelayTransportOptions, 'minBackoffMs' | 'maxBackoffMs' | 'ackTimeoutMs'>>;
|
|
17
54
|
/** 원격 구독 하나의 릴레이 소켓에 밀린 양이 이걸 넘으면 그 구독을 끊는다 */
|
|
18
55
|
maxBufferedBytes?: number;
|
|
56
|
+
/** 첫 접속 승인을 기다리는 시한. 테스트가 줄인다 */
|
|
57
|
+
approvalTtlMs?: number;
|
|
58
|
+
/** 승인 대기를 알리는 시간. 이 동안은 긴 안내 문구를 붙이고 지나면 짧은 한 줄로 바꾼다. 테스트가 줄인다 */
|
|
59
|
+
approvalNoticeMs?: number;
|
|
60
|
+
/** 요약을 가져갔다고 주인 세션에 알리는 시간. 테스트가 줄인다 */
|
|
61
|
+
peekNoticeMs?: number;
|
|
62
|
+
/** 보는 쪽이 요약 답을 기다리는 시한. 테스트가 줄인다 */
|
|
63
|
+
peekTimeoutMs?: number;
|
|
64
|
+
/** 보는 사람, 승인 대기, 끊은 사람, 요약 가져간 사람 목록이 바뀌면 부른다. 데몬이 훅 상태 파일을 다시 쓴다 */
|
|
65
|
+
onControlChange?(): void;
|
|
19
66
|
}
|
|
20
67
|
export interface TeamStatus {
|
|
21
68
|
team: string;
|
|
@@ -41,13 +88,39 @@ export interface WatchInfo {
|
|
|
41
88
|
owner: string;
|
|
42
89
|
feed: MirrorFeed;
|
|
43
90
|
token: string;
|
|
91
|
+
/** 주인 승인을 기다리는 중 */
|
|
92
|
+
waiting: boolean;
|
|
93
|
+
}
|
|
94
|
+
/** 주인 쪽에서 본 공유 하나의 통제 상태 */
|
|
95
|
+
export interface ShareControl {
|
|
96
|
+
watchers: string[];
|
|
97
|
+
pending: PendingWatcher[];
|
|
98
|
+
blocked: {
|
|
99
|
+
person: string;
|
|
100
|
+
reason: BlockReason;
|
|
101
|
+
}[];
|
|
102
|
+
/** 최근 요약을 가져간 사람. 알리는 시간이 지나면 빠진다 */
|
|
103
|
+
peeks: PeekNotice[];
|
|
44
104
|
}
|
|
45
105
|
/** 초대 유효 시간. 설계 원문의 24시간 */
|
|
46
106
|
export declare const INVITE_TTL_MS: number;
|
|
47
107
|
/** 원격 구독 하나가 릴레이 소켓에 밀어 둘 수 있는 양 */
|
|
48
108
|
export declare const MAX_REMOTE_BUFFERED_BYTES: number;
|
|
49
|
-
|
|
109
|
+
/** 첫 접속 승인을 기다리는 시한. 넘으면 보는 쪽에 approval_timeout으로 알린다 */
|
|
110
|
+
export declare const APPROVAL_TTL_MS: number;
|
|
111
|
+
/** 승인 대기를 알리는 시간. 이 동안은 긴 안내 문구를 붙이고 지나면 훅이 짧은 한 줄만 붙인다 */
|
|
112
|
+
export declare const APPROVAL_NOTICE_MS: number;
|
|
113
|
+
export { PeerNetworkError };
|
|
114
|
+
/** 주인 데몬이 시한 안에 watch에 답하지 않았다 */
|
|
115
|
+
export declare class WatchTimeout extends PeerNetworkError {
|
|
116
|
+
}
|
|
117
|
+
/** 주인 데몬이 watch를 거절했다. reason은 주인 데몬이 보낸 글자를 정리한 것이다 */
|
|
118
|
+
export declare class WatchRefused extends PeerNetworkError {
|
|
119
|
+
readonly reason: string;
|
|
120
|
+
constructor(reason: string);
|
|
50
121
|
}
|
|
122
|
+
/** 거절 이유를 사람이 읽는 문장으로. 이유 글자는 끝에 괄호로 남겨 스크립트가 찾게 한다 */
|
|
123
|
+
export declare function refusalText(reason: string): string;
|
|
51
124
|
/**
|
|
52
125
|
* 팀, 명단, 릴레이 통로, 원격 공유를 묶는다. 데몬이 하나 들고 있다.
|
|
53
126
|
*
|
|
@@ -69,7 +142,39 @@ export declare class PeerNetwork {
|
|
|
69
142
|
private announced;
|
|
70
143
|
/** 최근 받은 watch 요청의 `기기|nonce`와 받은 시각. 릴레이가 옛 요청을 다시 보내면 거절한다 */
|
|
71
144
|
private seenWatch;
|
|
145
|
+
/** 받은 메시지의 `기기|id`. 릴레이가 같은 봉인을 다시 보내면 버린다 */
|
|
146
|
+
private seenMessages;
|
|
147
|
+
/**
|
|
148
|
+
* 수신 한도로 거절한 메시지 id를 `공유|기기`마다 따로 기억한다. 창이 지난 뒤 릴레이가 같은
|
|
149
|
+
* 봉인을 다시 보내도 넣지 않는다. 공용 seenMessages에 넣으면 한 사람이 맞는 증명으로
|
|
150
|
+
* 쏟아부어 다른 팀원의 기억을 밀어낼 수 있어서 나눈다
|
|
151
|
+
*/
|
|
152
|
+
private refusedMessages;
|
|
153
|
+
private sendLimiter;
|
|
154
|
+
/** 보는 쪽이 12건으로 먼저 막는다. 주인 쪽은 릴레이에 쌓였다 한꺼번에 온 것도 받게 넉넉하다 */
|
|
155
|
+
private receiveLimiter;
|
|
72
156
|
private readonly maxBuffered;
|
|
157
|
+
private readonly approvalTtl;
|
|
158
|
+
private readonly approvalNotice;
|
|
159
|
+
/**
|
|
160
|
+
* 주인 쪽 통제 상태. 전부 공유가 열려 있는 동안만 메모리에 둔다. 공유는 데몬이 다시 뜨면
|
|
161
|
+
* 닫히므로 DB에 남길 필요가 없고 forgetShare가 공유를 닫을 때 같이 버린다.
|
|
162
|
+
* - pending: 첫 접속 승인을 기다리는 요청. 키는 `공유|기기`
|
|
163
|
+
* - approved: 공유마다 받아 준 기기
|
|
164
|
+
* - blocked: 공유마다 끊거나 거절한 기기. 공유가 열려 있는 동안 다시 못 붙고 메시지도 못 넣는다
|
|
165
|
+
*/
|
|
166
|
+
private pending;
|
|
167
|
+
private approved;
|
|
168
|
+
/** 첫 접속 설정. 메시지마다 읽으므로 DB가 아니라 메모리에 두고 setFirstWatch로만 바꾼다 */
|
|
169
|
+
private firstWatchMode;
|
|
170
|
+
/** 거절 답과 감사 행을 쓰는 양의 상한. 끊긴 사람이 새 id로 계속 보내도 디스크와 릴레이를 못 채운다 */
|
|
171
|
+
private rejectLimiter;
|
|
172
|
+
private blocked;
|
|
173
|
+
private closedWatches;
|
|
174
|
+
/** 질문과 답. 주인 쪽 열린 질문도 여기 있다 */
|
|
175
|
+
private questions;
|
|
176
|
+
/** 요약 요청과 답. 주인 쪽 알림과 보는 쪽 대기 요청도 여기 있다 */
|
|
177
|
+
private peeks;
|
|
73
178
|
constructor(options: PeerNetworkOptions);
|
|
74
179
|
get key(): MachineKey;
|
|
75
180
|
/** 팀이 있으면 릴레이에 붙기 시작한다. 첫 접속을 기다리지 않는다 */
|
|
@@ -94,6 +199,8 @@ export declare class PeerNetwork {
|
|
|
94
199
|
removed: number;
|
|
95
200
|
epoch: number;
|
|
96
201
|
};
|
|
202
|
+
/** 팀에서 쓰는 내 이름. 팀이 없으면 undefined */
|
|
203
|
+
get person(): string | undefined;
|
|
97
204
|
/** 내 공유의 링크. 팀이 없으면 undefined */
|
|
98
205
|
linkFor(shareId: string, shareKey: string): string | undefined;
|
|
99
206
|
/** 지금 연 공유 id 전부를 릴레이에 알린다 */
|
|
@@ -101,13 +208,34 @@ export declare class PeerNetwork {
|
|
|
101
208
|
lookupWatch(id: string): {
|
|
102
209
|
stream: ShareFeed;
|
|
103
210
|
token: string;
|
|
211
|
+
/** 공유 주인 이름(명단 값)과 주인 쪽 공유 id. 발췌 틀에 쓴다 */
|
|
212
|
+
owner: string;
|
|
213
|
+
share: string;
|
|
214
|
+
/** 주인이 메시지를 안 받는 공유면 없다 */
|
|
215
|
+
send?(text: string): Promise<{
|
|
216
|
+
ok: true;
|
|
217
|
+
id: string;
|
|
218
|
+
} | {
|
|
219
|
+
ok: false;
|
|
220
|
+
error: string;
|
|
221
|
+
}>;
|
|
222
|
+
/** 주인 세션 모델의 질문에 답한다. 답할 수 있는지는 answer가 본다 */
|
|
223
|
+
answer(question: string, text: string): Promise<{
|
|
224
|
+
ok: true;
|
|
225
|
+
question: string;
|
|
226
|
+
} | {
|
|
227
|
+
ok: false;
|
|
228
|
+
error: string;
|
|
229
|
+
}>;
|
|
104
230
|
} | undefined;
|
|
231
|
+
/** 보고 있는 공유와 최근에 끝난 보기. 끝난 것은 closed에 이유가 있다 */
|
|
105
232
|
listWatches(): {
|
|
106
233
|
id: string;
|
|
107
234
|
share: string;
|
|
108
235
|
owner: string;
|
|
109
236
|
status: string;
|
|
110
237
|
events: number;
|
|
238
|
+
closed?: string;
|
|
111
239
|
}[];
|
|
112
240
|
/** 링크로 원격 공유를 보기 시작한다. 주인 데몬이 받아 줄 때까지 기다린다 */
|
|
113
241
|
watch(link: string): Promise<WatchInfo>;
|
|
@@ -124,9 +252,96 @@ export declare class PeerNetwork {
|
|
|
124
252
|
private applyRoster;
|
|
125
253
|
private requireAdmin;
|
|
126
254
|
private onReceive;
|
|
255
|
+
/**
|
|
256
|
+
* 보는 쪽: 원격 공유 주인 세션에 메시지를 보낸다. 주인 데몬이 오프라인이면 릴레이가 7일까지
|
|
257
|
+
* 들고 있는다. 상태는 보기의 MirrorFeed에 쌓여 뷰어로 간다.
|
|
258
|
+
*/
|
|
259
|
+
sendMessage(watchId: string, raw: string, origin?: MessageOrigin): Promise<{
|
|
260
|
+
id: string;
|
|
261
|
+
status: MessageStatus;
|
|
262
|
+
}>;
|
|
263
|
+
listMessages(watchId: string): {
|
|
264
|
+
id: string;
|
|
265
|
+
status: MessageStatus;
|
|
266
|
+
text: string;
|
|
267
|
+
at: number;
|
|
268
|
+
reason?: string;
|
|
269
|
+
}[];
|
|
270
|
+
/** 주인 쪽: 받은 메시지를 검사하고 주인 세션 인박스에 쓴다 */
|
|
271
|
+
private onMessageRequest;
|
|
272
|
+
/**
|
|
273
|
+
* 검사를 마친 메시지나 답을 주인 세션 인박스에 넣는다. 메시지와 답이 같이 쓴다. 들어갔는지 지켜보는
|
|
274
|
+
* 일은 deliver가 쓰기 전에 걸어 둔다. 그래서 쓰기가 끝나기 전에 보일 수 있고 그때는 inserted를 먼저
|
|
275
|
+
* 부른 뒤 delivered를 부른다. 소켓에 붙은 뒤 실패했으면 줄이 들어갔을 수 있다. 거절로 알리면 보낸
|
|
276
|
+
* 사람이 다시 보내 겹칠 수 있어서 inserted로 보고 대화 기록에 보이면 delivered로 올린다. deliver가
|
|
277
|
+
* 던지면 deliver_failed로 돌려준다. 넣지 못했을 때 무엇을 할지는 부르는 쪽이 정한다.
|
|
278
|
+
*/
|
|
279
|
+
private insertInbound;
|
|
280
|
+
private rememberRefused;
|
|
281
|
+
/** 보는 쪽: 주인 데몬이 알려 온 상태를 반영한다 */
|
|
282
|
+
private onMessageStatus;
|
|
283
|
+
/** 주인 쪽: 주인 세션 모델의 질문을 보낸다. 자세한 건 QuestionDesk.ask */
|
|
284
|
+
ask(shares: string[], raw: string, to: string | undefined, ttlMs: number): AskResult;
|
|
285
|
+
private questionHost;
|
|
286
|
+
/** 보는 쪽: 보고 있는 공유의 요약을 주인 데몬에 청한다. 자세한 건 PeekDesk.peek */
|
|
287
|
+
peek(target: string, since?: string): Promise<{
|
|
288
|
+
peek: PeerPeek;
|
|
289
|
+
owner: string;
|
|
290
|
+
}>;
|
|
291
|
+
private peekHost;
|
|
292
|
+
/**
|
|
293
|
+
* 그 기기에 보낼 봉인을 지금 만든다. 명단에 없거나 릴레이에 안 붙어 있으면 바로 던진다. 돌려준 함수가
|
|
294
|
+
* 보낸다. queue면 받는 기기가 오프라인일 때 릴레이가 들고 있는다
|
|
295
|
+
*/
|
|
296
|
+
private prepareSealed;
|
|
127
297
|
private onJoinRequest;
|
|
128
298
|
private handleJoin;
|
|
129
299
|
private onWatchRequest;
|
|
300
|
+
/** 받아 준 사람의 구독을 연다. 공유 세션 키는 여기서 처음 정한다 */
|
|
301
|
+
private startSub;
|
|
302
|
+
/**
|
|
303
|
+
* 첫 접속을 주인이 받아 줄 때까지 붙잡아 둔다. 보는 쪽에는 watch_wait로 알린다. 같은 사람이
|
|
304
|
+
* 다시 청하면(주인이나 보는 쪽이 릴레이에 다시 붙은 경우) 시한은 그대로 두고 nonce만 바꾼다.
|
|
305
|
+
*/
|
|
306
|
+
private holdForApproval;
|
|
307
|
+
/**
|
|
308
|
+
* 승인 대기 하나를 치운다. 타이머 둘을 풀고 훅 파일을 다시 쓰게 한다. reason을 주면 보는 쪽에
|
|
309
|
+
* 그 이유로 거절을 알린다. 치운 대기를 돌려준다.
|
|
310
|
+
*/
|
|
311
|
+
private dropApproval;
|
|
312
|
+
private expireApproval;
|
|
313
|
+
/** 보는 쪽이 승인을 기다리다 그만뒀다. 그 요청의 nonce가 맞을 때만 치운다 */
|
|
314
|
+
private onWatchCancel;
|
|
315
|
+
private grant;
|
|
316
|
+
private block;
|
|
317
|
+
/** 이 공유로 이 기기가 보낸 메시지를 막을 이유. 받을 수 있으면 undefined */
|
|
318
|
+
private messageRefusal;
|
|
319
|
+
/**
|
|
320
|
+
* 첫 접속 설정을 바꾼다. ask로 조이면 팀 설정으로 들어온 사람의 승인을 거두고 구독을 끝낸다.
|
|
321
|
+
* 보는 쪽은 approval_revoked를 받고 다시 청해 승인 대기에 오른다. 거둔 구독 수를 돌려준다.
|
|
322
|
+
*/
|
|
323
|
+
setFirstWatch(mode: FirstWatchApproval): number;
|
|
324
|
+
/** 명단의 이름을 한 줄 라벨로. 감사 로그와 CLI, 훅 출력으로 나간다 */
|
|
325
|
+
private personOf;
|
|
326
|
+
private machinesOf;
|
|
327
|
+
private changed;
|
|
328
|
+
/** 주인 쪽: 공유 하나를 누가 보고 누가 기다리고 누가 막혔는지 */
|
|
329
|
+
shareControl(share: string): ShareControl;
|
|
330
|
+
/** 주인 쪽: 승인을 기다리는 그 사람의 요청을 받아 준다. 받아 준 기기는 공유가 열린 동안 기억한다 */
|
|
331
|
+
approve(person: string, shares: string[]): ControlResult;
|
|
332
|
+
/** 주인 쪽: 승인을 기다리는 그 사람의 요청을 거절한다. 그 공유가 열린 동안 다시 못 붙는다 */
|
|
333
|
+
deny(person: string, shares: string[]): ControlResult;
|
|
334
|
+
private pendingOf;
|
|
335
|
+
/**
|
|
336
|
+
* 주인 쪽: 그 사람의 기기 전부를 공유에서 끊는다. 구독을 끝내고 그 구독 몫의 세션 키를 메모리에서
|
|
337
|
+
* 지운다. 지금 안 보고 있어도 막아 둔다. 공유가 열린 동안 다시 붙지 못하고 메시지도 못 넣는다.
|
|
338
|
+
*/
|
|
339
|
+
kick(person: string, shares: string[]): ControlResult;
|
|
340
|
+
/**
|
|
341
|
+
* 주인 쪽: 공유가 닫혔다. 승인을 기다리던 사람에게 알리고 그 공유의 승인과 막은 목록을 버린다.
|
|
342
|
+
* 붙어 있던 구독은 공유 스트림의 closed 프레임으로 끝난다.
|
|
343
|
+
*/
|
|
344
|
+
forgetShare(share: string): void;
|
|
130
345
|
/**
|
|
131
346
|
* 처음 보는 nonce면 기억하고 true. 공유는 데몬이 다시 뜨면 닫히므로 메모리에만 둔다.
|
|
132
347
|
* 10분 지난 것과 상한을 넘는 오래된 것부터 잊는다.
|
|
@@ -137,8 +352,21 @@ export declare class PeerNetwork {
|
|
|
137
352
|
private onLocalFrame;
|
|
138
353
|
private post;
|
|
139
354
|
private endSub;
|
|
355
|
+
/**
|
|
356
|
+
* 주인 데몬에 보기를 청한다. watch_ok면 'ok', 주인 승인을 기다리면 'waiting'으로 끝난다.
|
|
357
|
+
* 기다리는 동안 pending.nonce는 남겨 두고 나중에 오는 watch_ok나 watch_err를 그 nonce로 맞춘다.
|
|
358
|
+
*/
|
|
140
359
|
private requestWatch;
|
|
360
|
+
private dropPending;
|
|
141
361
|
private rewatch;
|
|
362
|
+
/**
|
|
363
|
+
* 조금 뒤에 다시 청한다. 주인 데몬이 답하지 않았거나 too_many처럼 다시 청하면 되는 거절일 때다.
|
|
364
|
+
* 이게 없으면 다음 presence가 올 때까지 보기가 offline에 멈춘다. 간격은 두 배씩 늘리고 횟수는
|
|
365
|
+
* 구독이 열릴 때만 0으로 돌아간다. 상한에 닿으면 멈추고 주인이 릴레이에 다시 붙을 때 다시 청한다.
|
|
366
|
+
*/
|
|
367
|
+
private scheduleRewatch;
|
|
368
|
+
/** 주인 데몬이 보기를 거절했다. 다시 청해도 안 되는 이유면 보기를 끝낸다 */
|
|
369
|
+
private onRefused;
|
|
142
370
|
private onWatchReply;
|
|
143
371
|
private onWatchEnd;
|
|
144
372
|
private onStream;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../src/peer/network.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../src/peer/network.ts"],"names":[],"mappings":"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"}
|