@tienne/gestalt 0.114.0 → 0.116.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 (99) hide show
  1. package/README.ko.md +1 -0
  2. package/README.md +1 -0
  3. package/dist/package.json +1 -1
  4. package/dist/plugin/role-agents/lens-reader/AGENT.md +22 -1
  5. package/dist/plugin/skills/_shared/proactive-routing.md +1 -1
  6. package/dist/plugin/skills/lens/SKILL.md +114 -8
  7. package/dist/plugin/skills/share/SKILL.md +141 -0
  8. package/dist/plugin/skills/share/agents/openai.yaml +5 -0
  9. package/dist/plugin/skills/video-digest/SKILL.md +4 -2
  10. package/dist/plugin/skills/video-digest/templates/comments.md +1 -0
  11. package/dist/src/cli/commands/digest.d.ts +1 -0
  12. package/dist/src/cli/commands/digest.d.ts.map +1 -1
  13. package/dist/src/cli/commands/digest.js +15 -4
  14. package/dist/src/cli/commands/digest.js.map +1 -1
  15. package/dist/src/cli/commands/peer.d.ts +5 -1
  16. package/dist/src/cli/commands/peer.d.ts.map +1 -1
  17. package/dist/src/cli/commands/peer.js +74 -13
  18. package/dist/src/cli/commands/peer.js.map +1 -1
  19. package/dist/src/cli/index.d.ts.map +1 -1
  20. package/dist/src/cli/index.js +7 -1
  21. package/dist/src/cli/index.js.map +1 -1
  22. package/dist/src/digest/render-blocks.d.ts +5 -0
  23. package/dist/src/digest/render-blocks.d.ts.map +1 -1
  24. package/dist/src/digest/render-blocks.js +2 -2
  25. package/dist/src/digest/render-blocks.js.map +1 -1
  26. package/dist/src/digest/render-html.d.ts +2 -2
  27. package/dist/src/digest/render-html.d.ts.map +1 -1
  28. package/dist/src/digest/render-html.js +20 -3
  29. package/dist/src/digest/render-html.js.map +1 -1
  30. package/dist/src/digest/render-md.d.ts.map +1 -1
  31. package/dist/src/digest/render-md.js +9 -2
  32. package/dist/src/digest/render-md.js.map +1 -1
  33. package/dist/src/digest/server.d.ts +46 -1
  34. package/dist/src/digest/server.d.ts.map +1 -1
  35. package/dist/src/digest/server.js +213 -10
  36. package/dist/src/digest/server.js.map +1 -1
  37. package/dist/src/digest/session-request.d.ts +78 -0
  38. package/dist/src/digest/session-request.d.ts.map +1 -0
  39. package/dist/src/digest/session-request.js +105 -0
  40. package/dist/src/digest/session-request.js.map +1 -0
  41. package/dist/src/digest/svg.d.ts +5 -0
  42. package/dist/src/digest/svg.d.ts.map +1 -1
  43. package/dist/src/digest/svg.js +19 -9
  44. package/dist/src/digest/svg.js.map +1 -1
  45. package/dist/src/digest/templates.d.ts +9 -0
  46. package/dist/src/digest/templates.d.ts.map +1 -1
  47. package/dist/src/digest/templates.js +12 -0
  48. package/dist/src/digest/templates.js.map +1 -1
  49. package/dist/src/digest/viewer-js.d.ts.map +1 -1
  50. package/dist/src/digest/viewer-js.js +534 -46
  51. package/dist/src/digest/viewer-js.js.map +1 -1
  52. package/dist/src/digest/viewer-logic.d.ts +26 -5
  53. package/dist/src/digest/viewer-logic.d.ts.map +1 -1
  54. package/dist/src/digest/viewer-logic.js +44 -7
  55. package/dist/src/digest/viewer-logic.js.map +1 -1
  56. package/dist/src/mcp/schemas.d.ts +13 -7
  57. package/dist/src/mcp/schemas.d.ts.map +1 -1
  58. package/dist/src/mcp/schemas.js +11 -6
  59. package/dist/src/mcp/schemas.js.map +1 -1
  60. package/dist/src/mcp/server.js +1 -1
  61. package/dist/src/mcp/server.js.map +1 -1
  62. package/dist/src/mcp/tools/peer.d.ts +9 -1
  63. package/dist/src/mcp/tools/peer.d.ts.map +1 -1
  64. package/dist/src/mcp/tools/peer.js +133 -17
  65. package/dist/src/mcp/tools/peer.js.map +1 -1
  66. package/dist/src/peer/daemon.d.ts +1 -1
  67. package/dist/src/peer/daemon.d.ts.map +1 -1
  68. package/dist/src/peer/daemon.js +30 -6
  69. package/dist/src/peer/daemon.js.map +1 -1
  70. package/dist/src/peer/locate.d.ts +30 -0
  71. package/dist/src/peer/locate.d.ts.map +1 -1
  72. package/dist/src/peer/locate.js +75 -0
  73. package/dist/src/peer/locate.js.map +1 -1
  74. package/dist/src/peer/message.d.ts +7 -0
  75. package/dist/src/peer/message.d.ts.map +1 -1
  76. package/dist/src/peer/message.js +10 -0
  77. package/dist/src/peer/message.js.map +1 -1
  78. package/dist/src/peer/network.d.ts +19 -0
  79. package/dist/src/peer/network.d.ts.map +1 -1
  80. package/dist/src/peer/network.js +34 -3
  81. package/dist/src/peer/network.js.map +1 -1
  82. package/dist/src/peer/peeks.d.ts +6 -0
  83. package/dist/src/peer/peeks.d.ts.map +1 -1
  84. package/dist/src/peer/peeks.js +17 -10
  85. package/dist/src/peer/peeks.js.map +1 -1
  86. package/dist/src/peer/protocol.d.ts +38 -2
  87. package/dist/src/peer/protocol.d.ts.map +1 -1
  88. package/dist/src/peer/protocol.js.map +1 -1
  89. package/package.json +1 -1
  90. package/plugin/.codex-plugin/plugin.json +1 -1
  91. package/plugin/.mcp.json +1 -1
  92. package/plugin/mcp.json +1 -1
  93. package/plugin/role-agents/lens-reader/AGENT.md +22 -1
  94. package/plugin/skills/_shared/proactive-routing.md +1 -1
  95. package/plugin/skills/lens/SKILL.md +114 -8
  96. package/plugin/skills/share/SKILL.md +141 -0
  97. package/plugin/skills/share/agents/openai.yaml +5 -0
  98. package/plugin/skills/video-digest/SKILL.md +4 -2
  99. package/plugin/skills/video-digest/templates/comments.md +1 -0
@@ -1,11 +1,14 @@
1
- import { createReadStream, existsSync, realpathSync, statSync } from 'node:fs';
1
+ import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { createReadStream, existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
2
3
  import { createServer as createNetServer } from 'node:net';
3
4
  import { createServer } from 'node:http';
4
5
  import { extname, join, sep } from 'node:path';
5
6
  import { pipeline } from 'node:stream';
6
7
  import { fileURLToPath } from 'node:url';
7
8
  import { parseTranscript } from './schema.js';
9
+ import { frameSessionRequest, sendToSession, sessionRequestSchema, } from './session-request.js';
8
10
  import { isValidSlug, readRaw } from './store.js';
11
+ import { templateFitsKind, templateKindOf } from './templates.js';
9
12
  import { THEME_BOOT_JS_SHA256, VIEWER_JS_SHA256 } from './viewer-js.js';
10
13
  export const DEFAULT_DIGEST_PORT = 7893;
11
14
  const MIME = {
@@ -77,6 +80,21 @@ const BASE_HEADERS = {
77
80
  'Referrer-Policy': 'strict-origin-when-cross-origin',
78
81
  'Cache-Control': 'no-store',
79
82
  };
83
+ /** 뷰어가 세션에 리포트를 만들어 달라고 넣는 자리. 정적 파일 경로와 겹치지 않게 확장자 없는 이름을 쓴다 */
84
+ export const REQUEST_PATH = '/__request';
85
+ /** 서버가 페이지에 끼워 넣는 토큰 meta 이름. 뷰어가 이걸 읽어 요청 헤더에 싣는다 */
86
+ export const TOKEN_META_NAME = 'gestalt-serve-token';
87
+ const TOKEN_HEADER = 'x-gestalt-token';
88
+ /** 요청 본문 상한. 정해 둔 필드 몇 개라 이보다 크면 잘못 온 요청이다 */
89
+ const REQUEST_MAX_BYTES = 2 * 1024;
90
+ /** 1분 동안 세션에 넣는 요청 수 상한. 버튼을 연달아 눌러도 세션이 요청으로 덮이지 않게 둔다 */
91
+ const REQUEST_RATE_LIMIT = 6;
92
+ const REQUEST_RATE_WINDOW_MS = 60_000;
93
+ /** 같은 요청을 다시 넣지 않는 시간. 탭을 여럿 열어 같은 버튼을 누른 경우를 합친다. 세션이 놓쳤으면 이 시간이 지나 다시 누르면 들어간다 */
94
+ const REQUEST_DEDUP_MS = 2 * 60_000;
95
+ /** --allow-host로 받는 이름 꼴. 포트와 경로, 와일드카드 없이 호스트 이름만 받는다 */
96
+ export const isAllowableHost = (name) => /^(?=.{1,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/.test(name);
97
+ const sha256 = (s) => createHash('sha256').update(s, 'utf8').digest();
80
98
  function isPortAvailable(port) {
81
99
  return new Promise((done) => {
82
100
  const probe = createNetServer();
@@ -110,8 +128,29 @@ export class DigestServer {
110
128
  root;
111
129
  // 영상은 Range 요청이 연달아 와서 transcript.json을 매번 파싱하지 않는다. 파일이 바뀌면 mtime으로 다시 읽는다
112
130
  videoPaths = new Map();
113
- constructor(root) {
131
+ // 페이지에만 싣는 토큰. 디스크에 쓰지 않아서 serve를 다시 띄우면 바뀐다
132
+ token = randomBytes(32).toString('base64url');
133
+ tokenDigest = sha256(this.token);
134
+ templates;
135
+ send;
136
+ now;
137
+ hosts;
138
+ requestTimes = [];
139
+ sessionCache = {};
140
+ // 세션에 넣은 요청과 그때의 digest.html 수정 시각. 같은 요청이 다시 와도 페이지가 그대로면 넣지 않는다
141
+ recentRequests = new Map();
142
+ // 뷰어가 기다리는 동안 HEAD를 계속 보낸다. 파일이 그대로면 다시 읽지 않고 토큰을 끼운 길이를 쓴다
143
+ htmlLengths = new Map();
144
+ constructor(root, opts = {}) {
114
145
  this.root = realpathSync(root);
146
+ this.templates = opts.templates ?? [];
147
+ this.send = opts.sendToSession ?? ((text) => sendToSession(text, { cache: this.sessionCache }));
148
+ this.now = opts.now ?? Date.now;
149
+ for (const h of opts.allowHosts ?? []) {
150
+ if (!isAllowableHost(h))
151
+ throw new Error(`호스트 이름 꼴이 아니에요: ${h}`);
152
+ }
153
+ this.hosts = new Set(['127.0.0.1', 'localhost', ...(opts.allowHosts ?? [])]);
115
154
  }
116
155
  start(port) {
117
156
  return new Promise((resolveStart, reject) => {
@@ -159,13 +198,16 @@ export class DigestServer {
159
198
  res.end(text);
160
199
  }
161
200
  handle(req, res) {
162
- if (req.method !== 'GET' && req.method !== 'HEAD') {
201
+ const isRequest = req.method === 'POST' && (req.url ?? '') === REQUEST_PATH;
202
+ if (!isRequest && req.method !== 'GET' && req.method !== 'HEAD') {
163
203
  return this.deny(res, 405, 'Method Not Allowed', { Allow: 'GET, HEAD' });
164
204
  }
165
205
  // 127.0.0.1에만 바인딩해도 DNS 리바인딩이면 남의 이름으로 여기 닿는다
166
- const host = (req.headers.host ?? '').split(':')[0];
167
- if (host !== '127.0.0.1' && host !== 'localhost')
206
+ const host = (req.headers.host ?? '').split(':')[0].toLowerCase();
207
+ if (!this.hosts.has(host))
168
208
  return this.deny(res, 403, 'Forbidden');
209
+ if (isRequest)
210
+ return this.handleRequest(req, res);
169
211
  const decoded = safeDecode((req.url ?? '/').split('?')[0]);
170
212
  if (decoded === null || decoded.includes('\0'))
171
213
  return this.deny(res, 400, 'Bad Request');
@@ -186,15 +228,176 @@ export class DigestServer {
186
228
  if (!real.startsWith(this.root + sep) || !statSync(real).isFile()) {
187
229
  return this.deny(res, 404, 'Not Found');
188
230
  }
189
- res.writeHead(200, {
190
- ...BASE_HEADERS,
191
- 'Content-Type': MIME[ext],
192
- ...(ext === '.html' ? { 'Content-Security-Policy': DIGEST_CSP } : {}),
193
- });
231
+ if (ext === '.html') {
232
+ // 토큰은 디스크의 HTML에 쓰지 않고 내줄 때만 끼운다. HEAD도 같은 길이를 알린다.
233
+ // ETag는 디스크 파일의 수정 시각과 크기로 만든다. 요청을 넣은 뷰어가 HEAD로 이 값이 바뀌는지 보고 다시 그려진 페이지를 연다
234
+ const { mtimeMs, size } = statSync(real);
235
+ const known = this.htmlLengths.get(real);
236
+ const fresh = known && known.mtimeMs === mtimeMs && known.size === size;
237
+ const body = req.method === 'HEAD' && fresh
238
+ ? null
239
+ : Buffer.from(this.withToken(readFileSync(real, 'utf8')), 'utf8');
240
+ if (body)
241
+ this.htmlLengths.set(real, { mtimeMs, size, length: body.length });
242
+ res.writeHead(200, {
243
+ ...BASE_HEADERS,
244
+ 'Content-Type': MIME[ext],
245
+ 'Content-Security-Policy': DIGEST_CSP,
246
+ 'Content-Length': String(body ? body.length : known.length),
247
+ ETag: `"${Math.floor(mtimeMs)}-${size}"`,
248
+ });
249
+ return void res.end(req.method === 'HEAD' || !body ? undefined : body);
250
+ }
251
+ res.writeHead(200, { ...BASE_HEADERS, 'Content-Type': MIME[ext] });
194
252
  if (req.method === 'HEAD')
195
253
  return void res.end();
196
254
  this.stream(res, real);
197
255
  }
256
+ /** 첫 </head> 앞에 토큰 meta를 끼운다. head가 없는 HTML이면 그대로 둔다. 그 페이지는 복사 모드로 돈다 */
257
+ withToken(html) {
258
+ const at = html.indexOf('</head>');
259
+ if (at < 0)
260
+ return html;
261
+ return `${html.slice(0, at)}<meta name="${TOKEN_META_NAME}" content="${this.token}">\n${html.slice(at)}`;
262
+ }
263
+ reply(res, status, code) {
264
+ res.writeHead(status, { ...BASE_HEADERS, 'Content-Type': 'application/json; charset=utf-8' });
265
+ res.end(JSON.stringify({ ok: code === 'sent', code }));
266
+ }
267
+ // 루프백은 포트까지 같은 http 출처만 받는다. 넘겨받은 이름은 앞단 프록시가 https로 받아 넘기는 경우가 있어 https 출처도 받는다
268
+ allowedOrigin(origin, port) {
269
+ if (port === undefined)
270
+ return false;
271
+ if (origin === `http://127.0.0.1:${port}` || origin === `http://localhost:${port}`)
272
+ return true;
273
+ for (const h of this.hosts) {
274
+ if (h === '127.0.0.1' || h === 'localhost')
275
+ continue;
276
+ if (origin === `https://${h}` || origin === `http://${h}:${port}`)
277
+ return true;
278
+ }
279
+ return false;
280
+ }
281
+ /**
282
+ * 뷰어 버튼 요청을 받아 세션에 넣는다. 127.0.0.1 서버라도 브라우저에 열린 아무 사이트가 여기로
283
+ * POST할 수 있어서 Origin과 페이지에만 실은 토큰을 둘 다 본다. JSON 본문이라 다른 출처에서 보내면
284
+ * 사전 요청(OPTIONS)부터 405로 막힌다. 세션에 들어가는 글은 검사를 통과한 값으로 서버가 다시 조립한다
285
+ */
286
+ handleRequest(req, res) {
287
+ const port = this.port;
288
+ const origin = req.headers.origin;
289
+ if (!origin || !this.allowedOrigin(origin, port)) {
290
+ req.resume();
291
+ return this.reply(res, 403, 'forbidden');
292
+ }
293
+ const given = req.headers[TOKEN_HEADER];
294
+ if (typeof given !== 'string' || !timingSafeEqual(sha256(given), this.tokenDigest)) {
295
+ req.resume();
296
+ return this.reply(res, 403, 'forbidden');
297
+ }
298
+ const type = (req.headers['content-type'] ?? '').split(';')[0].trim().toLowerCase();
299
+ if (type !== 'application/json') {
300
+ req.resume();
301
+ return this.reply(res, 415, 'unsupported_media_type');
302
+ }
303
+ if (Number(req.headers['content-length'] ?? 0) > REQUEST_MAX_BYTES) {
304
+ req.resume();
305
+ return this.reply(res, 413, 'too_large');
306
+ }
307
+ const chunks = [];
308
+ let size = 0;
309
+ let over = false;
310
+ req.on('data', (c) => {
311
+ if (over)
312
+ return;
313
+ size += c.length;
314
+ if (size > REQUEST_MAX_BYTES) {
315
+ over = true;
316
+ // 남은 본문을 받지 않고 끊는다. 응답을 다 보낸 뒤에 끊어야 뷰어가 413을 받는다
317
+ res.setHeader('Connection', 'close');
318
+ res.once('finish', () => req.destroy());
319
+ this.reply(res, 413, 'too_large');
320
+ return;
321
+ }
322
+ chunks.push(c);
323
+ });
324
+ req.on('error', () => res.destroy());
325
+ req.on('end', () => {
326
+ if (over)
327
+ return;
328
+ void this.dispatchRequest(Buffer.concat(chunks).toString('utf8'), res).catch((err) => {
329
+ process.stderr.write(`[digest] request failed: ${err.message}\n`);
330
+ if (!res.headersSent)
331
+ this.reply(res, 500, 'send_failed');
332
+ });
333
+ });
334
+ }
335
+ async dispatchRequest(raw, res) {
336
+ let body;
337
+ try {
338
+ body = JSON.parse(raw);
339
+ }
340
+ catch {
341
+ return this.reply(res, 400, 'bad_request');
342
+ }
343
+ const parsed = sessionRequestSchema.safeParse(body);
344
+ if (!parsed.success)
345
+ return this.reply(res, 400, 'bad_request');
346
+ const request = parsed.data;
347
+ // 자료 종류는 뷰어가 보낸 값을 믿지 않고 transcript.json에서 읽는다
348
+ const kind = this.sourceKind(request.slug);
349
+ if (!kind)
350
+ return this.reply(res, 404, 'unknown_slug');
351
+ if (request.action === 'template') {
352
+ const t = this.templates.find((x) => x.id === request.template);
353
+ if (!t || !templateFitsKind(t, templateKindOf(kind))) {
354
+ return this.reply(res, 404, 'unknown_template');
355
+ }
356
+ }
357
+ const lens = templateKindOf(kind) === 'lens';
358
+ // 구간은 영상 리포트에만 있다. 렌즈 스킬은 range를 받지 않는다
359
+ if (lens && request.action === 'report' && request.range) {
360
+ return this.reply(res, 400, 'bad_request');
361
+ }
362
+ const now = this.now();
363
+ const key = JSON.stringify(request);
364
+ const pageMtime = this.pageMtime(request.slug);
365
+ for (const [k, v] of this.recentRequests) {
366
+ if (now - v.at >= REQUEST_DEDUP_MS)
367
+ this.recentRequests.delete(k);
368
+ }
369
+ if (this.recentRequests.get(key)?.pageMtime === pageMtime)
370
+ return this.reply(res, 200, 'sent');
371
+ // 속도 제한은 세션에 넣을 요청만 센다. 잘못 온 요청이나 합친 요청이 버튼 몫을 깎지 않는다
372
+ this.requestTimes = this.requestTimes.filter((t) => now - t < REQUEST_RATE_WINDOW_MS);
373
+ if (this.requestTimes.length >= REQUEST_RATE_LIMIT)
374
+ return this.reply(res, 429, 'rate_limited');
375
+ this.requestTimes.push(now);
376
+ const sent = await this.send(frameSessionRequest(request, lens));
377
+ if (sent.ok) {
378
+ this.recentRequests.set(key, { at: now, pageMtime });
379
+ return this.reply(res, 200, 'sent');
380
+ }
381
+ process.stderr.write(`[digest] 세션에 요청을 넣지 못했어요: ${sent.reason}\n`);
382
+ return this.reply(res, 503, sent.code);
383
+ }
384
+ pageMtime(slug) {
385
+ try {
386
+ return statSync(join(this.root, slug, 'digest.html')).mtimeMs;
387
+ }
388
+ catch {
389
+ return 0;
390
+ }
391
+ }
392
+ sourceKind(slug) {
393
+ if (!isValidSlug(slug))
394
+ return null;
395
+ const raw = readRaw(join(this.root, slug, 'transcript.json'));
396
+ if (raw.kind !== 'ok')
397
+ return null;
398
+ const parsed = parseTranscript(raw.value);
399
+ return parsed.ok && parsed.value.slug === slug ? parsed.value.meta.source : null;
400
+ }
198
401
  /**
199
402
  * 루트 밖에서 내주는 파일은 이것 하나다. transcript.json에 ingest가 적은 로컬 영상 경로만 따르고
200
403
  * 요청 URL에서 경로를 받지 않는다. 영상 확장자가 아니면 그 경로도 내주지 않는다.
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/digest/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAExE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAExC,MAAM,IAAI,GAA2B;IACnC,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,8BAA8B;IACrC,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,iBAAiB;IACzB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,kBAAkB;IAC1B,kCAAkC;IAClC,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,YAAY;CACtB,CAAC;AAUF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAA0B,EAAE,IAAY;IACrE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC;IACtD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QAC7B,IAAI,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,eAAe,CAAC;QACvD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAC5B,6EAA6E;IAC7E,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK;QAAE,OAAO,MAAM,CAAC;IACxD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,eAAe,CAAC;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IACvE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,qDAAqD;AACrD,mGAAmG;AACnG,mFAAmF;AACnF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,oBAAoB;IACpB,6BAA6B,oBAAoB,aAAa,gBAAgB,+CAA+C;IAC7H,oEAAoE;IACpE,0CAA0C;IAC1C,kBAAkB;IAClB,+DAA+D;IAC/D,2CAA2C;IAC3C,oBAAoB;IACpB,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;IACnB,wBAAwB;CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,YAAY,GAAG;IACnB,wBAAwB,EAAE,SAAS;IACnC,0CAA0C;IAC1C,iBAAiB,EAAE,iCAAiC;IACpD,eAAe,EAAE,UAAU;CAC5B,CAAC;AAEF,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAK,GAAG,mBAAmB,EAAE,QAAQ,GAAG,EAAE;IAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,MAAM,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;YAAE,OAAO,KAAK,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,eAAe,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,GAAkB,IAAI,CAAC;IACpB,IAAI,CAAS;IAC9B,4EAA4E;IAC3D,UAAU,GAAG,IAAI,GAAG,EAAyD,CAAC;IAE/F,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAY;QAChB,OAAO,IAAI,OAAO,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACtC,IAAI,CAAC;oBACH,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA6B,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;oBAC7E,IAAI,CAAC,GAAG,CAAC,WAAW;wBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;oBAC1F,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;gBACzC,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAClC,YAAY,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,OAAO,IAAI,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAClC,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,IAAI,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACpC,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,CAAC;IAEO,IAAI,CACV,GAAmB,EACnB,MAAc,EACd,IAAY,EACZ,QAAgC,EAAE;QAElC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;YACpB,GAAG,YAAY;YACf,cAAc,EAAE,2BAA2B;YAC3C,GAAG,KAAK;SACT,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,GAAoB,EAAE,GAAmB;QACtD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,8CAA8C;QAC9C,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAE1F,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QAC5D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QAC1F,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC5F,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAE5F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACjE,wCAAwC;QACxC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAClE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,GAAG,YAAY;YACf,cAAc,EAAE,IAAI,CAAC,GAAG,CAAE;YAC1B,GAAG,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACK,UAAU,CAAC,GAAoB,EAAE,GAAmB,EAAE,IAAY;QACxE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QACpD,yDAAyD;QACzD,IAAI,IAAY,CAAC;QACjB,IAAI,IAAiC,CAAC;QACtC,IAAI,CAAC;YACH,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtB,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC1F,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAErE,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE;gBAClD,eAAe,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE;aACxC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,GAAG,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;QACpF,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,GAAG,OAAO;gBACV,eAAe,EAAE,SAAS,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;gBACjE,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;aACtD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAChE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC;QAErD,MAAM,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,IAAI,KAAK,GAAsB,IAAI,CAAC;QACpC,wCAAwC;QACxC,MAAM,KAAK,GACT,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9E,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,GAAmB,EAAE,IAAY,EAAE,KAAsC;QACtF,0EAA0E;QAC1E,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YACnD,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,qCAAqC;YACrC,IAAK,GAA6B,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;gBACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YACnE,CAAC;YACD,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA4B,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/digest/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { z } from 'zod';
2
+ import { type InboxResult } from '../peer/inbox.js';
3
+ import { type AncestorLookup } from '../peer/locate.js';
4
+ /** 본문에 정해 둔 필드 말고는 받지 않는다(strict). 자유 입력 칸은 없다 */
5
+ export declare const sessionRequestSchema: z.ZodDiscriminatedUnion<"action", [z.ZodObject<{
6
+ action: z.ZodLiteral<"report">;
7
+ slug: z.ZodEffects<z.ZodString, string, string>;
8
+ difficulty: z.ZodEnum<["easy", "normal"]>;
9
+ lang: z.ZodOptional<z.ZodString>;
10
+ range: z.ZodOptional<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, [number, number], [number, number]>>;
11
+ }, "strict", z.ZodTypeAny, {
12
+ action: "report";
13
+ slug: string;
14
+ difficulty: "normal" | "easy";
15
+ range?: [number, number] | undefined;
16
+ lang?: string | undefined;
17
+ }, {
18
+ action: "report";
19
+ slug: string;
20
+ difficulty: "normal" | "easy";
21
+ range?: [number, number] | undefined;
22
+ lang?: string | undefined;
23
+ }>, z.ZodObject<{
24
+ action: z.ZodLiteral<"template">;
25
+ slug: z.ZodEffects<z.ZodString, string, string>;
26
+ template: z.ZodString;
27
+ lang: z.ZodOptional<z.ZodString>;
28
+ }, "strict", z.ZodTypeAny, {
29
+ action: "template";
30
+ template: string;
31
+ slug: string;
32
+ lang?: string | undefined;
33
+ }, {
34
+ action: "template";
35
+ template: string;
36
+ slug: string;
37
+ lang?: string | undefined;
38
+ }>]>;
39
+ export type SessionRequest = z.infer<typeof sessionRequestSchema>;
40
+ /**
41
+ * 세션에서 돌릴 명령. viewer-logic.ts의 reportCommand, templateCommand와 같은 글자를 내야 한다.
42
+ * 복사 모드로 떨어졌을 때 뷰어가 보여 주는 명령과 세션에 넣은 명령이 달라지면 안 되어서 테스트가 둘을 맞춰 본다
43
+ */
44
+ export declare function requestCommand(req: SessionRequest, lens: boolean): string;
45
+ /** 세션에 넣는 글. 인박스 글이 슬래시 명령으로 바로 도는지는 확인하지 못해서 모델이 스킬을 부르도록 틀 문장을 붙인다 */
46
+ export declare function frameSessionRequest(req: SessionRequest, lens: boolean): string;
47
+ /**
48
+ * maybeWritten은 소켓에 붙은 뒤 실패해 실제로 들어갔을 수 있다는 뜻이다. 다시 보내면 겹쳐서 넣음으로 친다.
49
+ * no_session은 넣을 세션이나 소켓을 못 찾은 것이고 send_failed는 소켓에 쓰다 실패한 것이다
50
+ */
51
+ export type SendResult = {
52
+ ok: true;
53
+ maybeWritten?: true;
54
+ } | {
55
+ ok: false;
56
+ code: 'no_session' | 'send_failed';
57
+ reason: string;
58
+ };
59
+ /** serve가 들고 있는 세션 찾기 기억. 세션 파일은 늘 다시 읽고 어느 pid의 파일인지만 기억한다 */
60
+ export interface SessionPidCache {
61
+ pid?: number;
62
+ missUntil?: number;
63
+ }
64
+ export interface SendDeps extends AncestorLookup {
65
+ /** 부모를 따라 올라가기 시작할 pid. 기본은 serve 자신이다 */
66
+ startPid?: number;
67
+ configDir?: string;
68
+ write?: (socketPath: string, text: string) => Promise<InboxResult>;
69
+ cache?: SessionPidCache;
70
+ now?: () => number;
71
+ }
72
+ /**
73
+ * serve를 띄운 Claude Code 세션을 부모 pid 체인에서 찾아 인박스 소켓에 글을 넣는다. 부모를 훑는 건
74
+ * ps를 여러 번 띄워서 찾은 pid만 기억한다. 세션 id는 `/clear`나 재시작으로 바뀌어서
75
+ * `sessions/<pid>.json`은 요청마다 다시 읽는다. 쓰는 길은 peer 데몬의 발췌 넣기와 같다
76
+ */
77
+ export declare function sendToSession(text: string, deps?: SendDeps): Promise<SendResult>;
78
+ //# sourceMappingURL=session-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-request.d.ts","sourceRoot":"","sources":["../../../src/digest/session-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAIL,KAAK,cAAc,EAEpB,MAAM,mBAAmB,CAAC;AAmB3B,kDAAkD;AAClD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkB/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CASzE;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAO9E;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,IAAI,CAAA;CAAE,GACjC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAKtE,+DAA+D;AAC/D,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAS,SAAQ,cAAc;IAC9C,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACnE,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAY1F"}
@@ -0,0 +1,105 @@
1
+ import { z } from 'zod';
2
+ import { findSessionSocket, writeInbox } from '../peer/inbox.js';
3
+ import { claudeConfigDir, findSessionByPid, findSessionInAncestors, } from '../peer/locate.js';
4
+ import { templateIdSchema } from './blocks.js';
5
+ import { LANG_TAG_PATTERN } from './schema-base.js';
6
+ import { isValidSlug } from './store.js';
7
+ /**
8
+ * 뷰어 버튼이 serve에 보내는 요청과 그 요청을 serve를 띄운 Claude Code 세션의 인박스에 넣는 길.
9
+ *
10
+ * 뷰어는 LLM을 부르지 않는다. 세션에 "이 명령을 실행하라"는 글을 넣을 뿐이다. 그 글은 서버가 정해 둔
11
+ * 틀과 검사를 통과한 값으로만 조립한다. 브라우저가 보낸 글자를 그대로 세션에 옮기지 않는다.
12
+ */
13
+ const slugSchema = z.string().max(64).refine(isValidSlug, 'slug 꼴이 아니다');
14
+ const langSchema = z.string().max(35).regex(LANG_TAG_PATTERN);
15
+ // 구간은 초 단위 두 수다. 명령에는 Math.floor, Math.ceil을 거친 정수만 들어간다
16
+ const rangeSchema = z
17
+ .tuple([z.number().finite().min(0).max(1e7), z.number().finite().min(0).max(1e7)])
18
+ .refine(([from, to]) => from < to, '구간 끝이 시작보다 뒤여야 한다');
19
+ /** 본문에 정해 둔 필드 말고는 받지 않는다(strict). 자유 입력 칸은 없다 */
20
+ export const sessionRequestSchema = z.discriminatedUnion('action', [
21
+ z
22
+ .object({
23
+ action: z.literal('report'),
24
+ slug: slugSchema,
25
+ difficulty: z.enum(['easy', 'normal']),
26
+ lang: langSchema.optional(),
27
+ range: rangeSchema.optional(),
28
+ })
29
+ .strict(),
30
+ z
31
+ .object({
32
+ action: z.literal('template'),
33
+ slug: slugSchema,
34
+ template: templateIdSchema,
35
+ lang: langSchema.optional(),
36
+ })
37
+ .strict(),
38
+ ]);
39
+ /**
40
+ * 세션에서 돌릴 명령. viewer-logic.ts의 reportCommand, templateCommand와 같은 글자를 내야 한다.
41
+ * 복사 모드로 떨어졌을 때 뷰어가 보여 주는 명령과 세션에 넣은 명령이 달라지면 안 되어서 테스트가 둘을 맞춰 본다
42
+ */
43
+ export function requestCommand(req, lens) {
44
+ let cmd = `${lens ? '/gestalt:lens' : '/gestalt:video-digest'} slug=${req.slug}`;
45
+ if (req.action === 'report') {
46
+ cmd += ` difficulty=${req.difficulty}`;
47
+ if (req.range)
48
+ cmd += ` range=${Math.floor(req.range[0])}-${Math.ceil(req.range[1])}`;
49
+ }
50
+ else {
51
+ cmd += ` templates=${req.template}`;
52
+ }
53
+ return req.lang ? `${cmd} reportLang=${req.lang}` : cmd;
54
+ }
55
+ /** 세션에 넣는 글. 인박스 글이 슬래시 명령으로 바로 도는지는 확인하지 못해서 모델이 스킬을 부르도록 틀 문장을 붙인다 */
56
+ export function frameSessionRequest(req, lens) {
57
+ return [
58
+ '<digest-request from="viewer">',
59
+ requestCommand(req, lens),
60
+ '</digest-request>',
61
+ 'gestalt digest serve 뷰어에서 사용자가 버튼을 눌러 보낸 요청이다. 위 명령 한 줄을 그대로 실행해 리포트를 만든다. 뷰어 serve가 이미 떠 있으니 렌더까지만 하고 serve를 새로 띄우지 않는다. 다 만들면 뷰어에 바로 들어간다고 알린다.',
62
+ ].join('\n');
63
+ }
64
+ /** 못 찾은 결과를 기억하는 시간. 따로 연 터미널에서 띄운 serve가 요청마다 부모를 다 훑지 않게 한다 */
65
+ const SESSION_MISS_MS = 30_000;
66
+ /**
67
+ * serve를 띄운 Claude Code 세션을 부모 pid 체인에서 찾아 인박스 소켓에 글을 넣는다. 부모를 훑는 건
68
+ * ps를 여러 번 띄워서 찾은 pid만 기억한다. 세션 id는 `/clear`나 재시작으로 바뀌어서
69
+ * `sessions/<pid>.json`은 요청마다 다시 읽는다. 쓰는 길은 peer 데몬의 발췌 넣기와 같다
70
+ */
71
+ export async function sendToSession(text, deps = {}) {
72
+ const configDir = deps.configDir ?? claudeConfigDir(deps.env);
73
+ const session = locateSession(configDir, deps);
74
+ if (!session) {
75
+ return { ok: false, code: 'no_session', reason: 'serve를 띄운 Claude Code 세션을 못 찾았어요' };
76
+ }
77
+ const found = findSessionSocket(session.sessionId, [configDir]);
78
+ if (!found.ok)
79
+ return { ok: false, code: 'no_session', reason: found.reason };
80
+ const result = await (deps.write ?? writeInbox)(found.path, text);
81
+ if (result.ok)
82
+ return { ok: true };
83
+ if (result.maybeWritten)
84
+ return { ok: true, maybeWritten: true };
85
+ return { ok: false, code: 'send_failed', reason: result.reason };
86
+ }
87
+ function locateSession(configDir, deps) {
88
+ const cache = deps.cache;
89
+ if (cache?.pid !== undefined) {
90
+ const hit = findSessionByPid(cache.pid, configDir);
91
+ if (hit)
92
+ return hit;
93
+ cache.pid = undefined;
94
+ }
95
+ const now = (deps.now ?? Date.now)();
96
+ if (cache?.missUntil !== undefined && now < cache.missUntil)
97
+ return null;
98
+ const found = findSessionInAncestors(deps.startPid ?? process.pid, configDir, deps);
99
+ if (cache) {
100
+ cache.pid = found?.pid;
101
+ cache.missUntil = found ? undefined : now + SESSION_MISS_MS;
102
+ }
103
+ return found;
104
+ }
105
+ //# sourceMappingURL=session-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-request.js","sourceRoot":"","sources":["../../../src/digest/session-request.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,11 @@ export interface TreeNode {
12
12
  export interface SvgOptions {
13
13
  /** cite.key 문장의 시작 시각. 있으면 노드에 data-sec을 달아 누르면 영상이 그 자리로 간다 */
14
14
  sec?: (c: Cite) => number;
15
+ /** 글 자료의 문단 자리. 있으면 sec 대신 data-unit을 달아 누르면 원문 창이 그 문단을 연다 */
16
+ unit?: (c: Cite) => {
17
+ index: number;
18
+ label: string;
19
+ };
15
20
  }
16
21
  export declare const escapeXml: (s: string) => string;
17
22
  export declare function textWidth(text: string, fontSize?: number): number;
@@ -1 +1 @@
1
- {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../../src/digest/svg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC;CAC3B;AAYD,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,MAMX,CAAC;AAW5B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,MAAM,CAI/D;AAED,2CAA2C;AAC3C,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAY,EACjB,QAAQ,SAAO,GACd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAYhC;AAYD;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,UAAe,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAkDzF;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AA2DD,uCAAuC;AACvC,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,UAAe,EAAE,SAAS,SAAQ,GAAG,MAAM,CA8B9F;AAeD;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,WAAW,EAAE,EACpB,IAAI,GAAE,UAAe,EACrB,SAAS,SAAQ,GAChB,MAAM,CAuER;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,gCAAgC;AAChC,wBAAgB,UAAU,CACxB,OAAO,EAAE,aAAa,EAAE,EACxB,IAAI,GAAE,UAAe,EACrB,SAAS,SAAQ,GAChB,MAAM,CAiBR;AA0BD,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sFAAsF;AACtF,eAAO,MAAM,QAAQ,MAAM,CAAC;AAE5B;;;GAGG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EAAE,EACvB,IAAI,GAAE,UAAe,EACrB,SAAS,SAAS,GACjB,MAAM,CA6CR;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,EACb,KAAK,EAAE,WAAW,EAAE,EAAE,EACtB,IAAI,GAAE,UAAe,EACrB,SAAS,SAAS,GACjB,MAAM,CAiCR;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,WAAW,EAAE,EACrB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,IAAI,GAAE,UAAe,EACrB,SAAS,SAAQ,GAChB,MAAM,CA2BR;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,wDAAwD;AACxD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE,UAAe,EACrB,SAAS,SAAU,GAClB,MAAM,CAwBR"}
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../../src/digest/svg.ts"],"names":[],"mappings":"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"}
@@ -87,10 +87,10 @@ export function treeSvg(root, opts = {}, ariaLabel) {
87
87
  edges.push(`<path d="M${x1} ${p.y}C${mid} ${p.y} ${mid} ${c.y} ${x2} ${c.y}"/>`);
88
88
  draw(c);
89
89
  }
90
- const cls = [`mm-node`, `mm-d${Math.min(p.depth, 3)}`, p.node.cite && opts.sec ? 'mm-cite' : '']
90
+ const sec = linkAttrs(p.node, opts);
91
+ const cls = [`mm-node`, `mm-d${Math.min(p.depth, 3)}`, sec ? 'mm-cite' : '']
91
92
  .filter(Boolean)
92
93
  .join(' ');
93
- const sec = p.node.cite && opts.sec ? citeAttrs(p.node.label, opts.sec(p.node.cite)) : '';
94
94
  nodes.push(`<g class="${cls}"${sec}><title>${escapeXml(p.node.label)}</title><rect x="${x}" y="${p.y - BOX_H / 2}" width="${p.w}" height="${BOX_H}" rx="6"/><text x="${x + PAD_X}" y="${p.y}" dominant-baseline="central">${escapeXml(p.label)}</text></g>`);
95
95
  };
96
96
  draw(tree);
@@ -108,20 +108,30 @@ const ARROW_V = 22;
108
108
  /** 단계가 이보다 많으면 세로로 쌓는다. 가로로 늘어놓으면 좁은 화면에서 옆으로 한참 밀어야 해서다 */
109
109
  const FLOW_ROW_MAX = 4;
110
110
  function nodeSvg(m, x, cy, w, opts, extra = '') {
111
- const cite = m.node.cite && opts.sec;
112
- const cls = ['dg-node', extra, cite ? 'dg-cite' : ''].filter(Boolean).join(' ');
113
- const sec = cite ? citeAttrs(m.node.label, opts.sec(m.node.cite)) : '';
111
+ const sec = linkAttrs(m.node, opts);
112
+ const cls = ['dg-node', extra, sec ? 'dg-cite' : ''].filter(Boolean).join(' ');
114
113
  const r = (n) => Math.round(n * 10) / 10;
115
114
  return `<g class="${cls}"${sec}><title>${escapeXml(m.node.label)}</title><rect x="${r(x)}" y="${r(cy - BOX_H / 2)}" width="${w}" height="${BOX_H}" rx="6"/><text x="${r(x + PAD_X)}" y="${r(cy)}" dominant-baseline="central">${escapeXml(m.text)}</text></g>`;
116
115
  }
117
- // 노드는 a가 아니라서 키보드와 스크린리더가 링크로 읽게 역할과 탭 순서를 직접 단다
118
- function citeAttrs(label, sec) {
116
+ // 노드는 a가 아니라서 키보드와 스크린리더가 링크로 읽게 역할과 탭 순서를 직접 단다.
117
+ // 글 자료는 시각이 다 0이라 시각 대신 문단 자리를 달아야 눌렀을 때 갈 곳이 있다
118
+ function linkAttrs(node, opts) {
119
+ if (!node.cite)
120
+ return '';
121
+ const link = ' role="link" tabindex="0"';
122
+ if (opts.unit) {
123
+ const u = opts.unit(node.cite);
124
+ return ` data-unit="${u.index}"${link} aria-label="${escapeXml(`${node.label}, 원문 ${u.label} 열기`)}"`;
125
+ }
126
+ if (!opts.sec)
127
+ return '';
128
+ const sec = opts.sec(node.cite);
119
129
  const s = Math.max(0, Math.floor(sec));
120
130
  const at = `${Math.floor(s / 60)}분 ${s % 60}초`;
121
- return ` data-sec="${Math.max(0, sec)}" role="link" tabindex="0" aria-label="${escapeXml(`${label}, ${at}로 이동`)}"`;
131
+ return ` data-sec="${Math.max(0, sec)}"${link} aria-label="${escapeXml(`${node.label}, ${at}로 이동`)}"`;
122
132
  }
123
133
  // role="img"면 안쪽 노드가 보조기기에 안 보인다. 누를 노드가 있을 때만 group으로 연다
124
- const svgRole = (body) => (body.includes(' data-sec="') ? 'group' : 'img');
134
+ const svgRole = (body) => (/ data-(sec|unit)="/.test(body) ? 'group' : 'img');
125
135
  /** 끝점 (x, y)에서 angle 방향을 향하는 화살촉 */
126
136
  function arrowHead(x, y, angle) {
127
137
  const len = 7;