@tienne/gestalt 0.115.0 → 0.117.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/README.ko.md +1 -1
- package/README.md +1 -1
- package/dist/package.json +1 -1
- package/dist/plugin/role-agents/lens-reader/AGENT.md +22 -1
- package/dist/plugin/skills/_shared/proactive-routing.md +1 -1
- package/dist/plugin/skills/lens/SKILL.md +114 -8
- package/dist/plugin/skills/share/SKILL.md +39 -6
- package/dist/plugin/skills/share/agents/openai.yaml +1 -1
- package/dist/plugin/skills/video-digest/SKILL.md +4 -2
- package/dist/plugin/skills/video-digest/templates/comments.md +1 -0
- package/dist/src/cli/commands/digest.d.ts +1 -0
- package/dist/src/cli/commands/digest.d.ts.map +1 -1
- package/dist/src/cli/commands/digest.js +15 -4
- package/dist/src/cli/commands/digest.js.map +1 -1
- package/dist/src/cli/commands/peer.d.ts +11 -1
- package/dist/src/cli/commands/peer.d.ts.map +1 -1
- package/dist/src/cli/commands/peer.js +113 -5
- 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 +7 -3
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/digest/render-blocks.d.ts +5 -0
- package/dist/src/digest/render-blocks.d.ts.map +1 -1
- package/dist/src/digest/render-blocks.js +2 -2
- package/dist/src/digest/render-blocks.js.map +1 -1
- package/dist/src/digest/render-html.d.ts +2 -2
- package/dist/src/digest/render-html.d.ts.map +1 -1
- package/dist/src/digest/render-html.js +20 -3
- package/dist/src/digest/render-html.js.map +1 -1
- package/dist/src/digest/render-md.d.ts.map +1 -1
- package/dist/src/digest/render-md.js +9 -2
- package/dist/src/digest/render-md.js.map +1 -1
- package/dist/src/digest/server.d.ts +46 -1
- package/dist/src/digest/server.d.ts.map +1 -1
- package/dist/src/digest/server.js +213 -10
- package/dist/src/digest/server.js.map +1 -1
- package/dist/src/digest/session-request.d.ts +78 -0
- package/dist/src/digest/session-request.d.ts.map +1 -0
- package/dist/src/digest/session-request.js +105 -0
- package/dist/src/digest/session-request.js.map +1 -0
- package/dist/src/digest/svg.d.ts +5 -0
- package/dist/src/digest/svg.d.ts.map +1 -1
- package/dist/src/digest/svg.js +19 -9
- package/dist/src/digest/svg.js.map +1 -1
- package/dist/src/digest/templates.d.ts +9 -0
- package/dist/src/digest/templates.d.ts.map +1 -1
- package/dist/src/digest/templates.js +12 -0
- package/dist/src/digest/templates.js.map +1 -1
- package/dist/src/digest/viewer-js.d.ts.map +1 -1
- package/dist/src/digest/viewer-js.js +534 -46
- package/dist/src/digest/viewer-js.js.map +1 -1
- package/dist/src/digest/viewer-logic.d.ts +26 -5
- package/dist/src/digest/viewer-logic.d.ts.map +1 -1
- package/dist/src/digest/viewer-logic.js +44 -7
- package/dist/src/digest/viewer-logic.js.map +1 -1
- package/dist/src/mcp/tools/peer.d.ts.map +1 -1
- package/dist/src/mcp/tools/peer.js +18 -18
- package/dist/src/mcp/tools/peer.js.map +1 -1
- package/dist/src/peer/client.d.ts +5 -1
- package/dist/src/peer/client.d.ts.map +1 -1
- package/dist/src/peer/client.js +6 -2
- package/dist/src/peer/client.js.map +1 -1
- package/dist/src/peer/detach.d.ts +114 -0
- package/dist/src/peer/detach.d.ts.map +1 -0
- package/dist/src/peer/detach.js +339 -0
- package/dist/src/peer/detach.js.map +1 -0
- package/dist/src/peer/locate.d.ts +15 -0
- package/dist/src/peer/locate.d.ts.map +1 -1
- package/dist/src/peer/locate.js +43 -0
- package/dist/src/peer/locate.js.map +1 -1
- package/dist/src/peer/lock.d.ts +6 -0
- package/dist/src/peer/lock.d.ts.map +1 -1
- package/dist/src/peer/lock.js +17 -1
- package/dist/src/peer/lock.js.map +1 -1
- package/package.json +1 -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-reader/AGENT.md +22 -1
- package/plugin/skills/_shared/proactive-routing.md +1 -1
- package/plugin/skills/lens/SKILL.md +114 -8
- package/plugin/skills/share/SKILL.md +39 -6
- package/plugin/skills/share/agents/openai.yaml +1 -1
- package/plugin/skills/video-digest/SKILL.md +4 -2
- package/plugin/skills/video-digest/templates/comments.md +1 -0
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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":"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"}
|
|
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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"}
|
package/dist/src/digest/svg.d.ts
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../../src/digest/svg.ts"],"names":[],"mappings":"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"}
|
package/dist/src/digest/svg.js
CHANGED
|
@@ -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
|
|
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
|
|
112
|
-
const cls = ['dg-node', extra,
|
|
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
|
-
|
|
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)}"
|
|
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) => (
|
|
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;
|