@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer-js.js","sourceRoot":"","sources":["../../../src/digest/viewer-js.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAExD,oDAAoD;AACpD,MAAM,CAAC,MAAM,SAAS,GACpB,eAAe;IACf,2BAA2B;IAC3B,iBAAiB;IACjB,IAAI;IACJ
|
|
1
|
+
{"version":3,"file":"viewer-js.js","sourceRoot":"","sources":["../../../src/digest/viewer-js.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAExD,oDAAoD;AACpD,MAAM,CAAC,MAAM,SAAS,GACpB,eAAe;IACf,2BAA2B;IAC3B,iBAAiB;IACjB,IAAI;IACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAy3CD,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEhG,8EAA8E;AAC9E,MAAM,CAAC,MAAM,aAAa,GACxB,kCAAkC;IAClC,iBAAiB;IACjB,gGAAgG,CAAC;AAEnG,0CAA0C;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC,QAAQ,CAAC;KACrD,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC;KAC7B,MAAM,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 테스트가 이 문자열을 그대로 실행해 본다. DOM과 유튜브 플레이어를 다루는 IIFE는 viewer-js.ts에 있고
|
|
4
4
|
* 테스트에서 문법만 확인한다. OCR처럼 Node 쪽에서 같은 판단이 필요한 코드는 뷰어 스크립트 대신 이 모듈을 가져온다.
|
|
5
5
|
*/
|
|
6
|
-
export declare const VIEWER_LOGIC_JS = "\nfunction findSegmentIndex(starts, t) {\n if (!starts.length || !(t >= starts[0])) return -1;\n var lo = 0, hi = starts.length - 1;\n while (lo < hi) {\n var mid = (lo + hi + 1) >> 1;\n if (starts[mid] <= t) lo = mid; else hi = mid - 1;\n }\n return lo;\n}\nfunction shouldFollow(idx, from, to, now, manualUntil) {\n if (now < manualUntil) return false;\n return !(idx >= from && idx <= to);\n}\nfunction isPlaying(state) {\n return state === 1 || state === 3;\n}\nfunction shouldFollowHeld(state, idx, from, to, now, manualUntil) {\n if (isPlaying(state)) return false;\n return shouldFollow(idx, from, to, now, manualUntil);\n}\nfunction shouldScrollScript(state, changed, now, holdUntil, visible) {\n if (!isPlaying(state) || now < holdUntil) return false;\n return changed || !visible;\n}\nfunction shouldRetryFollow(state, tries) {\n return state === 3 && tries > 0;\n}\nfunction isLineVisible(top, height, scrollTop, clientHeight) {\n if (height > clientHeight) return top >= scrollTop && top < scrollTop + clientHeight;\n return top >= scrollTop && top + height <= scrollTop + clientHeight;\n}\nfunction cueAction(state) {\n return state === 1 || state === 2 || state === 3 ? 'seek' : 'cue';\n}\nfunction citeWindow(from, to, max) {\n var end = Math.min(to, from + max - 1);\n return { end: end, more: Math.max(0, to - end) };\n}\nfunction pickReport(reports, length, difficulty) {\n for (var i = 0; i < reports.length; i++) {\n var r = reports[i];\n if (r.preset && r.length === length && r.difficulty === difficulty) return i;\n }\n return -1;\n}\nfunction reportCommand(slug, difficulty, lang, range) {\n var cmd = '
|
|
6
|
+
export declare const VIEWER_LOGIC_JS = "\nfunction findSegmentIndex(starts, t) {\n if (!starts.length || !(t >= starts[0])) return -1;\n var lo = 0, hi = starts.length - 1;\n while (lo < hi) {\n var mid = (lo + hi + 1) >> 1;\n if (starts[mid] <= t) lo = mid; else hi = mid - 1;\n }\n return lo;\n}\nfunction shouldFollow(idx, from, to, now, manualUntil) {\n if (now < manualUntil) return false;\n return !(idx >= from && idx <= to);\n}\nfunction isPlaying(state) {\n return state === 1 || state === 3;\n}\nfunction shouldFollowHeld(state, idx, from, to, now, manualUntil) {\n if (isPlaying(state)) return false;\n return shouldFollow(idx, from, to, now, manualUntil);\n}\nfunction shouldScrollScript(state, changed, now, holdUntil, visible) {\n if (!isPlaying(state) || now < holdUntil) return false;\n return changed || !visible;\n}\nfunction shouldRetryFollow(state, tries) {\n return state === 3 && tries > 0;\n}\nfunction isLineVisible(top, height, scrollTop, clientHeight) {\n if (height > clientHeight) return top >= scrollTop && top < scrollTop + clientHeight;\n return top >= scrollTop && top + height <= scrollTop + clientHeight;\n}\nfunction cueAction(state) {\n return state === 1 || state === 2 || state === 3 ? 'seek' : 'cue';\n}\nfunction citeWindow(from, to, max) {\n var end = Math.min(to, from + max - 1);\n return { end: end, more: Math.max(0, to - end) };\n}\nfunction pickReport(reports, length, difficulty) {\n for (var i = 0; i < reports.length; i++) {\n var r = reports[i];\n if (r.preset && r.length === length && r.difficulty === difficulty) return i;\n }\n return -1;\n}\nfunction skillCommand(lens) {\n return lens ? '/gestalt:lens' : '/gestalt:video-digest';\n}\nfunction reportCommand(slug, difficulty, lang, range, lens) {\n var cmd = skillCommand(lens) + ' slug=' + slug + ' difficulty=' + difficulty;\n if (range) cmd += ' range=' + Math.floor(range[0]) + '-' + Math.ceil(range[1]);\n return lang ? cmd + ' reportLang=' + lang : cmd;\n}\nfunction missingNotice(r, slug, difficulty, lens) {\n if (r.prompted) return { msg: '\uC694\uCCAD\uC744 \uBD99\uC5EC \uB9CC\uB4E0 \uB9AC\uD3EC\uD2B8\uB77C \uC9DD\uC774 \uC5C6\uC5B4\uC694. \uAC19\uC740 \uC694\uCCAD\uC73C\uB85C \uB2E4\uC2DC \uB9CC\uB4E4\uC5B4 \uC8FC\uC138\uC694.', cmd: null };\n return { msg: '\uC774 \uB9AC\uD3EC\uD2B8\uB294 \uC544\uC9C1 \uC5C6\uC5B4\uC694. \uC544\uB798 \uBA85\uB839\uC744 \uC138\uC158\uC5D0 \uBD99\uC5EC \uB123\uC73C\uBA74 \uB9CC\uB4E4\uC5B4\uC694.', cmd: reportCommand(slug, difficulty, r.lang, r.range, lens) };\n}\nfunction templateCommand(slug, id, lang, lens) {\n var cmd = skillCommand(lens) + ' slug=' + slug + ' templates=' + id;\n return lang ? cmd + ' reportLang=' + lang : cmd;\n}\nfunction reportRequest(slug, difficulty, lang, range) {\n var body = { action: 'report', slug: slug, difficulty: difficulty };\n if (lang) body.lang = lang;\n if (range) body.range = [range[0], range[1]];\n return body;\n}\nfunction templateRequest(slug, id, lang) {\n var body = { action: 'template', slug: slug, template: id };\n if (lang) body.lang = lang;\n return body;\n}\nfunction requestMade(b, reports, extensions) {\n if (b.action === 'template') {\n return (extensions || []).some(function(x){\n return b.lang ? x.key === b.template + '.' + b.lang : x.key.indexOf(b.template + '.') === 0;\n });\n }\n return (reports || []).some(function(r){ return r.difficulty === b.difficulty && (!b.lang || r.lang === b.lang); });\n}\nfunction readPendingList(raw, now) {\n var v;\n try { v = JSON.parse(raw || '[]'); } catch (e) { return []; }\n if (!Array.isArray(v)) return [];\n return v.filter(function(x){ return x && typeof x === 'object'; }).map(function(x){\n if (x.b && typeof x.b === 'object') return { b: x.b, t: typeof x.t === 'string' ? x.t : '', at: typeof x.at === 'number' ? x.at : now };\n return { b: x, t: '', at: now };\n });\n}\nfunction elapsedLabel(ms) {\n var s = Math.max(0, Math.floor(ms / 1000));\n if (s < 10) return '\uBC29\uAE08 \uB123\uC5C8\uC5B4\uC694';\n if (s < 60) return s + '\uCD08\uC9F8';\n return Math.floor(s / 60) + '\uBD84\uC9F8';\n}\nfunction tabStep(i, n, key) {\n if (key === 'ArrowRight') return (i + 1) % n;\n if (key === 'ArrowLeft') return (i - 1 + n) % n;\n if (key === 'Home') return 0;\n if (key === 'End') return n - 1;\n return -1;\n}\nfunction safeDecode(s) {\n try { return decodeURIComponent(s); } catch (e) { return ''; }\n}\nfunction videoState(ended, paused, time, readyState) {\n if (ended) return 0;\n if (paused) return time > 0 ? 2 : -1;\n return readyState < 3 ? 3 : 1;\n}\n// \uB450 \uBCF5\uC0AC \uBC84\uD2BC\uC774 \uB77C\uC774\uBE0C \uC601\uC5ED \uD558\uB098\uB97C \uAC19\uC774 \uC368\uC11C \uD0C0\uC774\uBA38\uB3C4 \uD558\uB098\uB85C \uBB36\uB294\uB2E4. \uC55E \uD0C0\uC774\uBA38\uAC00 \uB0A8\uC73C\uBA74 \uB4A4 \uBB38\uAD6C\uB97C \uC77C\uCC0D \uC9C0\uC6B4\uB2E4\n// \uBC84\uD2BC \uAE00\uC790\uB9CC \uBC14\uAFB8\uBA74 \uC2A4\uD06C\uB9B0\uB9AC\uB354\uAC00 \uACB0\uACFC\uB97C \uC548 \uC77D\uC5B4\uC11C \uACB0\uACFC \uBB38\uAD6C\uB294 \uB77C\uC774\uBE0C \uC601\uC5ED\uC5D0 \uB530\uB85C \uC4F4\uB2E4.\n// \uAC19\uC740 \uBB38\uAD6C\uB97C \uADF8\uB300\uB85C \uB2E4\uC2DC \uB123\uC73C\uBA74 \uC548 \uC77D\uB294 \uB9AC\uB354\uAC00 \uC788\uC5B4\uC11C \uD55C \uBC88 \uBE44\uC6B0\uACE0 setTimeout 0\uC73C\uB85C \uBBF8\uB904 \uC4F4\uB2E4\nfunction makeFlash(getStatus) {\n var flashTimer = null;\n var flashBtn = null;\n var flashLabel = '';\n return function flash(btn, label, failed) {\n var status = getStatus();\n clearTimeout(flashTimer);\n if (flashBtn && flashBtn !== btn) flashBtn.textContent = flashLabel;\n flashBtn = btn;\n flashLabel = label;\n btn.textContent = failed ? '\uBCF5\uC0AC \uC2E4\uD328' : '\uBCF5\uC0AC\uD588\uC5B4\uC694';\n if (status) status.textContent = '';\n flashTimer = setTimeout(function(){\n if (status) status.textContent = failed ? '\uBCF5\uC0AC\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694. \uC9C1\uC811 \uC120\uD0DD\uD574 \uBCF5\uC0AC\uD574 \uC8FC\uC138\uC694' : '\uBCF5\uC0AC\uD588\uC5B4\uC694';\n flashTimer = setTimeout(function(){\n btn.textContent = label;\n flashBtn = null;\n if (status) status.textContent = '';\n }, failed ? 3000 : 1500);\n }, 0);\n };\n}\n";
|
|
7
7
|
export interface ViewerLogic {
|
|
8
8
|
/** 재생 시각 t에 해당하는 문장 번호. 첫 문장보다 이르면 -1 */
|
|
9
9
|
findSegmentIndex: (starts: number[], t: number) => number;
|
|
@@ -32,19 +32,40 @@ export interface ViewerLogic {
|
|
|
32
32
|
length: string;
|
|
33
33
|
difficulty: string;
|
|
34
34
|
}[], length: string, difficulty: string) => number;
|
|
35
|
+
/** 생성 명령의 스킬 자리. 읽기 렌즈면 lens 스킬이다 */
|
|
36
|
+
skillCommand: (lens?: boolean) => string;
|
|
35
37
|
/** 없는 리포트를 고르면 복사해 주는 생성 명령. 스킬이 길게만 만들어서 분량은 싣지 않는다. 지금 보는 리포트의 언어와 구간을 따라가야 엉뚱한 리포트가 안 생긴다 */
|
|
36
|
-
reportCommand: (slug: string, difficulty: string, lang?: string, range?: [number, number]) => string;
|
|
38
|
+
reportCommand: (slug: string, difficulty: string, lang?: string, range?: [number, number] | null, lens?: boolean) => string;
|
|
37
39
|
/** 짝이 없는 리포트에서 토글을 누르면 띄울 안내와 복사할 명령. 요청문은 따옴표가 섞일 수 있어 명령 인자로 안전하게 못 넘기니 요청 리포트는 명령 없이 안내만 한다 */
|
|
38
40
|
missingNotice: (r: {
|
|
39
41
|
prompted: boolean;
|
|
40
42
|
lang?: string;
|
|
41
|
-
range?: [number, number];
|
|
42
|
-
}, slug: string, difficulty: string) => {
|
|
43
|
+
range?: [number, number] | null;
|
|
44
|
+
}, slug: string, difficulty: string, lens?: boolean) => {
|
|
43
45
|
msg: string;
|
|
44
46
|
cmd: string | null;
|
|
45
47
|
};
|
|
46
48
|
/** "+ 더 만들기"에서 템플릿을 고르면 복사해 주는 명령. 언어는 지금 보는 리포트를 따른다 */
|
|
47
|
-
templateCommand: (slug: string, id: string, lang?: string) => string;
|
|
49
|
+
templateCommand: (slug: string, id: string, lang?: string, lens?: boolean) => string;
|
|
50
|
+
/** serve에 보내는 리포트 요청 본문. 명령 글자는 서버가 이 값을 검사한 뒤 다시 조립한다 */
|
|
51
|
+
reportRequest: (slug: string, difficulty: string, lang?: string, range?: [number, number] | null) => Record<string, unknown>;
|
|
52
|
+
/** serve에 보내는 템플릿 요청 본문 */
|
|
53
|
+
templateRequest: (slug: string, id: string, lang?: string) => Record<string, unknown>;
|
|
54
|
+
/** 넣은 요청이 새 렌더에 들어왔는지. 템플릿은 확장 키, 리포트는 난이도와 언어로 본다 */
|
|
55
|
+
requestMade: (b: Record<string, unknown>, reports: {
|
|
56
|
+
difficulty: string;
|
|
57
|
+
lang: string;
|
|
58
|
+
}[], extensions: {
|
|
59
|
+
key: string;
|
|
60
|
+
}[] | undefined) => boolean;
|
|
61
|
+
/** sessionStorage에 둔 요청 목록을 읽는다. 요청 본문만 넣던 옛 꼴은 넣은 시각을 지금으로 친다 */
|
|
62
|
+
readPendingList: (raw: string | null, now: number) => {
|
|
63
|
+
b: Record<string, unknown>;
|
|
64
|
+
t: string;
|
|
65
|
+
at: number;
|
|
66
|
+
}[];
|
|
67
|
+
/** 만드는 중 표시에 붙는 흐른 시간 */
|
|
68
|
+
elapsedLabel: (ms: number) => string;
|
|
48
69
|
/** 탭 목록에서 방향키, Home, End로 옮겨 갈 자리. 다른 키면 -1 */
|
|
49
70
|
tabStep: (i: number, n: number, key: string) => number;
|
|
50
71
|
/** 공유 링크의 앵커는 외부 입력이라 깨진 인코딩이면 빈 문자열로 받는다 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer-logic.d.ts","sourceRoot":"","sources":["../../../src/digest/viewer-logic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"viewer-logic.d.ts","sourceRoot":"","sources":["../../../src/digest/viewer-logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,19 +49,56 @@ function pickReport(reports, length, difficulty) {
|
|
|
49
49
|
}
|
|
50
50
|
return -1;
|
|
51
51
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
52
|
+
function skillCommand(lens) {
|
|
53
|
+
return lens ? '/gestalt:lens' : '/gestalt:video-digest';
|
|
54
|
+
}
|
|
55
|
+
function reportCommand(slug, difficulty, lang, range, lens) {
|
|
56
|
+
var cmd = skillCommand(lens) + ' slug=' + slug + ' difficulty=' + difficulty;
|
|
54
57
|
if (range) cmd += ' range=' + Math.floor(range[0]) + '-' + Math.ceil(range[1]);
|
|
55
58
|
return lang ? cmd + ' reportLang=' + lang : cmd;
|
|
56
59
|
}
|
|
57
|
-
function missingNotice(r, slug, difficulty) {
|
|
60
|
+
function missingNotice(r, slug, difficulty, lens) {
|
|
58
61
|
if (r.prompted) return { msg: '요청을 붙여 만든 리포트라 짝이 없어요. 같은 요청으로 다시 만들어 주세요.', cmd: null };
|
|
59
|
-
return { msg: '이 리포트는 아직 없어요. 아래 명령을 세션에 붙여 넣으면 만들어요.', cmd: reportCommand(slug, difficulty, r.lang, r.range) };
|
|
62
|
+
return { msg: '이 리포트는 아직 없어요. 아래 명령을 세션에 붙여 넣으면 만들어요.', cmd: reportCommand(slug, difficulty, r.lang, r.range, lens) };
|
|
60
63
|
}
|
|
61
|
-
function templateCommand(slug, id, lang) {
|
|
62
|
-
var cmd = '
|
|
64
|
+
function templateCommand(slug, id, lang, lens) {
|
|
65
|
+
var cmd = skillCommand(lens) + ' slug=' + slug + ' templates=' + id;
|
|
63
66
|
return lang ? cmd + ' reportLang=' + lang : cmd;
|
|
64
67
|
}
|
|
68
|
+
function reportRequest(slug, difficulty, lang, range) {
|
|
69
|
+
var body = { action: 'report', slug: slug, difficulty: difficulty };
|
|
70
|
+
if (lang) body.lang = lang;
|
|
71
|
+
if (range) body.range = [range[0], range[1]];
|
|
72
|
+
return body;
|
|
73
|
+
}
|
|
74
|
+
function templateRequest(slug, id, lang) {
|
|
75
|
+
var body = { action: 'template', slug: slug, template: id };
|
|
76
|
+
if (lang) body.lang = lang;
|
|
77
|
+
return body;
|
|
78
|
+
}
|
|
79
|
+
function requestMade(b, reports, extensions) {
|
|
80
|
+
if (b.action === 'template') {
|
|
81
|
+
return (extensions || []).some(function(x){
|
|
82
|
+
return b.lang ? x.key === b.template + '.' + b.lang : x.key.indexOf(b.template + '.') === 0;
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return (reports || []).some(function(r){ return r.difficulty === b.difficulty && (!b.lang || r.lang === b.lang); });
|
|
86
|
+
}
|
|
87
|
+
function readPendingList(raw, now) {
|
|
88
|
+
var v;
|
|
89
|
+
try { v = JSON.parse(raw || '[]'); } catch (e) { return []; }
|
|
90
|
+
if (!Array.isArray(v)) return [];
|
|
91
|
+
return v.filter(function(x){ return x && typeof x === 'object'; }).map(function(x){
|
|
92
|
+
if (x.b && typeof x.b === 'object') return { b: x.b, t: typeof x.t === 'string' ? x.t : '', at: typeof x.at === 'number' ? x.at : now };
|
|
93
|
+
return { b: x, t: '', at: now };
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function elapsedLabel(ms) {
|
|
97
|
+
var s = Math.max(0, Math.floor(ms / 1000));
|
|
98
|
+
if (s < 10) return '방금 넣었어요';
|
|
99
|
+
if (s < 60) return s + '초째';
|
|
100
|
+
return Math.floor(s / 60) + '분째';
|
|
101
|
+
}
|
|
65
102
|
function tabStep(i, n, key) {
|
|
66
103
|
if (key === 'ArrowRight') return (i + 1) % n;
|
|
67
104
|
if (key === 'ArrowLeft') return (i - 1 + n) % n;
|
|
@@ -103,6 +140,6 @@ function makeFlash(getStatus) {
|
|
|
103
140
|
};
|
|
104
141
|
}
|
|
105
142
|
`;
|
|
106
|
-
export const viewerLogic = new Function(`${VIEWER_LOGIC_JS}; return { findSegmentIndex: findSegmentIndex, shouldFollow: shouldFollow, isPlaying: isPlaying, shouldFollowHeld: shouldFollowHeld, shouldScrollScript: shouldScrollScript, shouldRetryFollow: shouldRetryFollow, isLineVisible: isLineVisible, cueAction: cueAction, citeWindow: citeWindow, pickReport: pickReport, reportCommand: reportCommand, missingNotice: missingNotice, templateCommand: templateCommand, tabStep: tabStep, safeDecode: safeDecode, videoState: videoState, makeFlash: makeFlash };`)();
|
|
143
|
+
export const viewerLogic = new Function(`${VIEWER_LOGIC_JS}; return { findSegmentIndex: findSegmentIndex, shouldFollow: shouldFollow, isPlaying: isPlaying, shouldFollowHeld: shouldFollowHeld, shouldScrollScript: shouldScrollScript, shouldRetryFollow: shouldRetryFollow, isLineVisible: isLineVisible, cueAction: cueAction, citeWindow: citeWindow, pickReport: pickReport, skillCommand: skillCommand, reportCommand: reportCommand, missingNotice: missingNotice, templateCommand: templateCommand, reportRequest: reportRequest, templateRequest: templateRequest, requestMade: requestMade, readPendingList: readPendingList, elapsedLabel: elapsedLabel, tabStep: tabStep, safeDecode: safeDecode, videoState: videoState, makeFlash: makeFlash };`)();
|
|
107
144
|
export const findSegmentIndex = viewerLogic.findSegmentIndex;
|
|
108
145
|
//# sourceMappingURL=viewer-logic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer-logic.js","sourceRoot":"","sources":["../../../src/digest/viewer-logic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG
|
|
1
|
+
{"version":3,"file":"viewer-logic.js","sourceRoot":"","sources":["../../../src/digest/viewer-logic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwI9B,CAAC;AAmGF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,QAAQ,CACrC,GAAG,eAAe,oqBAAoqB,CACvrB,EAAiB,CAAC;AAEnB,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/peer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/peer.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,QAAQ;IACvB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAQ1E;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCvF"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { request } from '../../peer/client.js';
|
|
1
|
+
import { DaemonUnavailableError, request } from '../../peer/client.js';
|
|
3
2
|
import { errMessage } from '../../peer/errors.js';
|
|
4
|
-
import { claudeConfigDir, findSessionByPid } from '../../peer/locate.js';
|
|
3
|
+
import { claudeConfigDir, findSessionByPid, parentPid } from '../../peer/locate.js';
|
|
5
4
|
import { plainLabel } from '../../peer/message.js';
|
|
6
5
|
import { peerRoot, socketPath } from '../../peer/paths.js';
|
|
7
6
|
import { isPersonName, isShareId } from '../../peer/roster.js';
|
|
@@ -15,25 +14,11 @@ export function sessionPids(env = process.env) {
|
|
|
15
14
|
if (Number.isInteger(fromEnv) && fromEnv > 0)
|
|
16
15
|
pids.push(fromEnv);
|
|
17
16
|
pids.push(process.ppid);
|
|
18
|
-
const grand =
|
|
17
|
+
const grand = parentPid(process.ppid);
|
|
19
18
|
if (grand !== undefined)
|
|
20
19
|
pids.push(grand);
|
|
21
20
|
return [...new Set(pids)];
|
|
22
21
|
}
|
|
23
|
-
function parentOf(pid) {
|
|
24
|
-
try {
|
|
25
|
-
const out = execFileSync('ps', ['-o', 'ppid=', '-p', String(pid)], {
|
|
26
|
-
encoding: 'utf8',
|
|
27
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
28
|
-
timeout: 2_000,
|
|
29
|
-
});
|
|
30
|
-
const n = Number(out.trim());
|
|
31
|
-
return Number.isInteger(n) && n > 1 ? n : undefined;
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
22
|
export async function handlePeer(input, deps = {}) {
|
|
38
23
|
if (input.action === 'peek')
|
|
39
24
|
return handlePeek(input, deps);
|
|
@@ -77,6 +62,8 @@ export async function handlePeer(input, deps = {}) {
|
|
|
77
62
|
});
|
|
78
63
|
}
|
|
79
64
|
catch (err) {
|
|
65
|
+
if (err instanceof DaemonUnavailableError)
|
|
66
|
+
return JSON.stringify({ error: noDaemonError(err) });
|
|
80
67
|
return JSON.stringify({ error: errMessage(err) });
|
|
81
68
|
}
|
|
82
69
|
}
|
|
@@ -105,9 +92,19 @@ async function handlePeek(input, deps) {
|
|
|
105
92
|
return res.result.text;
|
|
106
93
|
}
|
|
107
94
|
catch (err) {
|
|
95
|
+
if (err instanceof DaemonUnavailableError)
|
|
96
|
+
return JSON.stringify({ error: noDaemonError(err) });
|
|
108
97
|
return JSON.stringify({ error: errMessage(err) });
|
|
109
98
|
}
|
|
110
99
|
}
|
|
100
|
+
const NO_DAEMON_NOTE = '이 도구는 데몬을 띄우지 않는다. 사용자에게 /gestalt:share daemon start로 띄울 수 있다고 알린다. 사용자가 시키지 않았으면 Bash로 띄우지 않는다.';
|
|
101
|
+
/**
|
|
102
|
+
* 데몬이 없을 때 모델에게 돌려줄 실패 문구. 사람에게 띄우는 명령을 알려 주는 `DAEMON_NOT_RUNNING`은
|
|
103
|
+
* 싣지 않는다. 같은 응답 안에서 띄우라는 문장과 띄우지 말라는 문장이 부딪힌다
|
|
104
|
+
*/
|
|
105
|
+
function noDaemonError(err) {
|
|
106
|
+
return `peer 데몬이 안 떠 있다 (${err.socketPath}). ${NO_DAEMON_NOTE}`;
|
|
107
|
+
}
|
|
111
108
|
/**
|
|
112
109
|
* 데몬에 한 번 묻는다. 실패는 던지지 않고 오류 글자로 돌려준다. 오류에는 릴레이나 주인 데몬이 보낸
|
|
113
110
|
* 글자가 섞일 수 있어서(릴레이가 전달 실패에 실은 이유 같은) 한 줄 라벨로 정리한다
|
|
@@ -119,6 +116,9 @@ async function ask(deps, req, timeoutMs) {
|
|
|
119
116
|
return res.ok ? res : { ok: false, error: plainLabel(res.error, 300) ?? '데몬이 실패했어요' };
|
|
120
117
|
}
|
|
121
118
|
catch (err) {
|
|
119
|
+
// 이 도구는 데몬을 띄우지 않는다. 띄우면 팀원 명단에 온라인으로 보여서 사용자가 정할 일이다
|
|
120
|
+
if (err instanceof DaemonUnavailableError)
|
|
121
|
+
return { ok: false, error: noDaemonError(err) };
|
|
122
122
|
return { ok: false, error: plainLabel(errMessage(err), 300) ?? '데몬에 묻지 못했어요' };
|
|
123
123
|
}
|
|
124
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer.js","sourceRoot":"","sources":["../../../../src/mcp/tools/peer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"peer.js","sourceRoot":"","sources":["../../../../src/mcp/tools/peer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAU3D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AA6B/D;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC9D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAgB,EAAE,OAAiB,EAAE;IACpE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,eAAe,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC5F,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,sDAAsD;YAC7D,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAY,IAAI,EAAE;YACzC,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/E,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,GAAG,GAAG,CAAC,MAAM;YACb,IAAI,EAAE,sHAAsH;SAC7H,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,sBAAsB;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAgB,EAAE,IAAc;IACxD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,uDAAuD;SAC/D,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,IAAI,EACJ;YACE,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7D,EACD,MAAM,CACP,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,sBAAsB;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,cAAc,GAClB,kGAAkG,CAAC;AAErG;;;GAGG;AACH,SAAS,aAAa,CAAC,GAA2B;IAChD,OAAO,oBAAoB,GAAG,CAAC,UAAU,MAAM,cAAc,EAAE,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,GAAG,CAChB,IAAc,EACd,GAAgB,EAChB,SAAkB;IAElB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAI,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACnD,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sDAAsD;QACtD,IAAI,GAAG,YAAY,sBAAsB;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC;IACjF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAgB,EAAE,IAAc;IACxD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,mEAAmE;SAC3E,CAAC,CAAC;IACL,CAAC;IACD,kDAAkD;IAClD,MAAM,GAAG,GAAG,MAAM,GAAG,CACnB,IAAI,EACJ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAC1D,MAAM,CACP,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IACrB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IAC7C,MAAM,KAAK,GACT,CAAC,CAAC,SAAS,KAAK,IAAI;QAClB,CAAC,CAAC,sCAAsC,CAAC,CAAC,KAAK,yDAAyD;QACxG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK;YACrB,CAAC,CAAC,oEAAoE;YACtE,CAAC,CAAC,gEAAgE,CAAC;IACzE,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK;QACL,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,EAAE,GAAG,KAAK,qGAAqG,KAAK,EAAE;KAC3H,CAAC,CAAC;AACL,CAAC;AAED,iCAAiC;AACjC,SAAS,MAAM,CAAC,IAAc;IAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,2CAA2C;AAC3C,SAAS,SAAS,CAAC,CAAgB;IACjC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG;QACrC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG;QACvC,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/E,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAqB;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACrF,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAc;IACxC,6DAA6D;IAC7D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,GAAG,CAAe,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;QACzC,GAAG,CAAc,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;QACxC,GAAG,CAAkB,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;KAC9C,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAC7B,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;QACtE,IAAI,EAAE,CAAC;YACL,CAAC,CAAC;gBACE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG;gBACvC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG;gBACtC,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,UAAU,EAAE,CAAC,CAAC,UAAU;aACzB;YACH,CAAC,CAAC,IAAI;QACR,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG;gBACvC,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC;YACH,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG;gBACvC,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;YACH,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACnF,CAAC,CAAC;QACH,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;QACnC,IAAI,EAAE,yHAAyH;KAChI,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAgB,EAAE,IAAc;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAkB,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,yDAAyD;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,IAAI,GAAG,UAAU,CACrB,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CACzF,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,0HAA0H;KACjI,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { PeerRequest, PeerResponse } from './protocol.js';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* 데몬이 없을 때 사람에게 띄우는 법을 알려 주는 말. 오류 메시지에는 넣지 않고 부르는 쪽이 고른다.
|
|
4
|
+
* 띄워도 소용없는 명령(공유 닫기, 받아 주기 같은)이나 모델에게 가는 응답에는 붙이지 않는다
|
|
5
|
+
*/
|
|
6
|
+
export declare const DAEMON_NOT_RUNNING = "`gestalt peer daemon --detach`\uB85C \uBA3C\uC800 \uB744\uC6CC \uC8FC\uC138\uC694";
|
|
3
7
|
export declare class DaemonUnavailableError extends Error {
|
|
4
8
|
readonly socketPath: string;
|
|
5
9
|
constructor(socketPath: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/peer/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/peer/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,sFAA8C,CAAC;AAE9E,qBAAa,sBAAuB,SAAQ,KAAK;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAIxC;AAED,iCAAiC;AACjC,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EACjC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,WAAW,EAChB,SAAS,SAAQ,GAChB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA6C1B"}
|
package/dist/src/peer/client.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { createConnection } from 'node:net';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* 데몬이 없을 때 사람에게 띄우는 법을 알려 주는 말. 오류 메시지에는 넣지 않고 부르는 쪽이 고른다.
|
|
4
|
+
* 띄워도 소용없는 명령(공유 닫기, 받아 주기 같은)이나 모델에게 가는 응답에는 붙이지 않는다
|
|
5
|
+
*/
|
|
6
|
+
export const DAEMON_NOT_RUNNING = '`gestalt peer daemon --detach`로 먼저 띄워 주세요';
|
|
3
7
|
export class DaemonUnavailableError extends Error {
|
|
4
8
|
socketPath;
|
|
5
9
|
constructor(socketPath) {
|
|
6
|
-
super(`peer 데몬에 연결하지 못했어요 (${socketPath})
|
|
10
|
+
super(`peer 데몬에 연결하지 못했어요 (${socketPath}).`);
|
|
7
11
|
this.socketPath = socketPath;
|
|
8
12
|
this.name = 'DaemonUnavailableError';
|
|
9
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/peer/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/peer/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,2CAA2C,CAAC;AAE9E,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC1B;IAArB,YAAqB,UAAkB;QACrC,KAAK,CAAC,uBAAuB,UAAU,IAAI,CAAC,CAAC;QAD1B,eAAU,GAAV,UAAU,CAAQ;QAErC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,iCAAiC;AACjC,MAAM,UAAU,OAAO,CACrB,IAAY,EACZ,GAAgB,EAChB,SAAS,GAAG,KAAK;IAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,EAAc,EAAQ,EAAE;YACtC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,EAAE,EAAE,CAAC;QACP,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,SAAS,gBAAgB,CAAC,CAAC,CAAC,EAC5E,SAAS,CACV,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAClC,GAAG,IAAI,KAAK,CAAC;YACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAE,OAAO;YACtB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,MAAM,CAAC,GAAG,EAAE;gBACV,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC,CAAC;gBAC/C,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAClD,MAAM,CAAC,GAAG,EAAE,CACV,MAAM,CACJ,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;gBAClD,CAAC,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC;gBAClC,CAAC,CAAC,GAAG,CACR,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CACxB,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAC1D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 떨어져 뜬 데몬의 로그 상한. 데몬은 뜰 때 안내 몇 줄과 실패만 적어서 평소에는 거의 안 는다. 넘으면 지금 로그를
|
|
3
|
+
* `daemon.log.1`로 복사하고 비운다. 그래서 디스크에 남는 건 상한의 두 배 남짓이다
|
|
4
|
+
*/
|
|
5
|
+
export declare const DAEMON_LOG_MAX_BYTES: number;
|
|
6
|
+
/** 떨어져 뜬 데몬이 로그 크기를 보는 간격 */
|
|
7
|
+
export declare const DAEMON_LOG_CHECK_MS = 60000;
|
|
8
|
+
/** `--detach`가 소켓 답을 기다리는 시간과 `--stop`이 프로세스가 끝나길 기다리는 시간의 기본값 */
|
|
9
|
+
export declare const DEFAULT_DAEMON_WAIT_MS = 10000;
|
|
10
|
+
/**
|
|
11
|
+
* `--detach`가 자식에 거는 환경 변수. 자식은 이걸 보고 로그 크기를 챙기고 안내 문구를 바꾼 뒤 지운다.
|
|
12
|
+
* 멈추는 길이나 잠금 규칙은 이 값과 상관없이 같다
|
|
13
|
+
*/
|
|
14
|
+
export declare const DETACHED_ENV = "GESTALT_PEER_DETACHED";
|
|
15
|
+
export declare function daemonLogPath(root: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* 로그가 상한을 넘었으면 `.1`로 복사하고 비운다. 이름을 옮기지 않는 건 떠 있는 데몬이 열어 둔 파일을
|
|
18
|
+
* 계속 쓰기 때문이다. 옮기면 데몬은 `.1`에 쓰고 원래 이름의 파일은 다시 안 큰다. 열 때 `O_APPEND`라서
|
|
19
|
+
* 비운 뒤에 쓰는 줄은 파일 앞에서부터 다시 쌓인다. 복사와 비우기 사이에 쓰인 줄은 잃을 수 있다.
|
|
20
|
+
*
|
|
21
|
+
* 두 파일 다 `O_NOFOLLOW`로 열어 연 fd로만 읽고 쓰고 비운다. 경로로 다시 열면 확인한 파일과 쓰는 파일이
|
|
22
|
+
* 다를 수 있다. 원본이 없거나 심링크면 아무것도 안 하고 false다. `.1`이 심링크면 던진다.
|
|
23
|
+
*/
|
|
24
|
+
export declare function rotateDaemonLog(path: string, max?: number): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 로그를 덧붙이기로 연다. 없으면 0600으로 만들고 있으면 권한을 다시 0600으로 좁힌다. 심링크면 따라가지
|
|
27
|
+
* 않고 실패한다. 디렉토리가 0700이라 남이 링크를 걸 수는 없지만 내가 실수로 둔 링크로 남의 파일을 쓰지
|
|
28
|
+
* 않게 한다
|
|
29
|
+
*/
|
|
30
|
+
export declare function openDaemonLog(path: string): number;
|
|
31
|
+
/**
|
|
32
|
+
* 이번 기동의 표시 줄 뒤에서 마지막 몇 줄. 표시 줄이 없으면 끝에서 센다. 데몬 오류에는 릴레이나 팀원이
|
|
33
|
+
* 보낸 글자가 섞일 수 있어서 터미널과 모델에 그대로 내지 않고 줄마다 한 줄 라벨로 정리한다
|
|
34
|
+
*/
|
|
35
|
+
export declare function logTail(path: string, lines?: number): string[];
|
|
36
|
+
/**
|
|
37
|
+
* 자식으로 띄울 명령. 지금 프로세스와 같은 Node와 실행 인자에 같은 스크립트를 주고 `peer daemon`만
|
|
38
|
+
* 붙인다. `pnpm tsx bin/gestalt.ts`로 불렀으면 tsx가 건 `--require`, `--import`가 실행 인자에 들어 있어서
|
|
39
|
+
* 그대로 따라간다. 설치본이면 실행 인자는 비고 스크립트가 `dist/bin/gestalt.js`다. 디버거와 감시 옵션
|
|
40
|
+
* (`DEV_FLAG`)은 데몬에 넘기지 않는다
|
|
41
|
+
*/
|
|
42
|
+
export declare function daemonCommand(argv?: readonly string[], execArgv?: readonly string[], execPath?: string): string[];
|
|
43
|
+
/** 소켓에 답한 데몬 pid. 안 떠 있거나 시한(기본 1초) 안에 안 답하면 undefined다 */
|
|
44
|
+
export declare function answeringDaemonPid(sock: string, timeoutMs?: number): Promise<number | undefined>;
|
|
45
|
+
/** 떨어진 데몬이 시한 안에 안 떴을 때. 로그 꼬리를 같이 들고 간다 */
|
|
46
|
+
export declare class DaemonDetachError extends Error {
|
|
47
|
+
readonly log: string;
|
|
48
|
+
readonly tail: string[];
|
|
49
|
+
/** 띄운 자식 pid. 시한이 지났으면 SIGTERM을 보냈다 */
|
|
50
|
+
readonly child?: number | undefined;
|
|
51
|
+
constructor(message: string, log: string, tail: string[],
|
|
52
|
+
/** 띄운 자식 pid. 시한이 지났으면 SIGTERM을 보냈다 */
|
|
53
|
+
child?: number | undefined);
|
|
54
|
+
}
|
|
55
|
+
export interface DetachResult {
|
|
56
|
+
pid: number;
|
|
57
|
+
log: string;
|
|
58
|
+
/** 이미 떠 있던 데몬이면 true. 동시에 띄운 다른 데몬이 잠금을 먼저 잡은 경우도 true다 */
|
|
59
|
+
already: boolean;
|
|
60
|
+
/** 이번에 띄운 자식 pid. 이미 떠 있어서 안 띄웠으면 없다. 다른 데몬이 먼저 떴으면 `pid`와 다르다 */
|
|
61
|
+
spawned?: number;
|
|
62
|
+
/** 띄우기 전 로그를 복사하고 비우다 실패했으면 그 이유. 기동은 계속했다 */
|
|
63
|
+
rotateError?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface DetachOptions {
|
|
66
|
+
root: string;
|
|
67
|
+
waitMs?: number;
|
|
68
|
+
/**
|
|
69
|
+
* 테스트가 바꾼다. 기본은 `daemonCommand()`. 첫 칸은 데몬 자신이 되는 실행 파일이어야 한다. 셸이나 다른
|
|
70
|
+
* 런처로 감싸면 데몬 pid가 자식 pid와 달라서 새로 띄워도 `already: true`가 된다
|
|
71
|
+
*/
|
|
72
|
+
command?: string[];
|
|
73
|
+
env?: NodeJS.ProcessEnv;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 자식에 넘길 환경. 부른 셸의 환경을 그대로 물려주되 세 가지만 바꾼다. 루트는 부모가 쓴 값으로 고정한다.
|
|
77
|
+
* 부른 Claude Code 세션 표시(`CLAUDE_PID`, `CLAUDE_CODE_SESSION_ID`)는 뺀다. 데몬은 그 세션보다 오래 살아서
|
|
78
|
+
* 그 값이 곧 틀린 값이 된다. `NODE_OPTIONS`에서는 실행 인자처럼 `DEV_FLAG`에 걸리는 옵션을 뺀다.
|
|
79
|
+
*
|
|
80
|
+
* 허용 목록으로 좁히지 않는 건 데몬이 `CLAUDE_CONFIG_DIR`, `CODEX_HOME`, `HOME`, CA 설정 같은 값으로 세션과
|
|
81
|
+
* 릴레이를 찾기 때문이다. 빠뜨리면 다른 설정 디렉토리를 보고 조용히 엉뚱하게 돈다
|
|
82
|
+
*/
|
|
83
|
+
export declare function detachedEnv(env: NodeJS.ProcessEnv, root: string): NodeJS.ProcessEnv;
|
|
84
|
+
export declare function assertDetachSupported(platform?: NodeJS.Platform): void;
|
|
85
|
+
/**
|
|
86
|
+
* 데몬을 이 프로세스와 떨어진 새 프로세스 세션으로 띄우고 소켓이 답할 때까지 기다린다.
|
|
87
|
+
*
|
|
88
|
+
* 이미 떠 있는지는 소켓 답으로 본다. 둘이 동시에 불러 둘 다 자식을 띄워도 잠금(`peer.lock`)을 하나만
|
|
89
|
+
* 잡으므로 데몬은 하나다. 진 자식은 "이미 떠 있어요"로 끝나고 그 부모는 이긴 데몬의 pid를 `already`로
|
|
90
|
+
* 받는다. 시한이 지나면 아직 살아 있는 내 자식에 SIGTERM을 보내고 로그 꼬리와 함께 던진다. 늦게라도
|
|
91
|
+
* 뜬 데몬이 실패 보고 뒤에 남지 않게 하려는 것이다.
|
|
92
|
+
*/
|
|
93
|
+
export declare function detachDaemon(options: DetachOptions): Promise<DetachResult>;
|
|
94
|
+
export interface StopResult {
|
|
95
|
+
/** 멈춘 데몬 pid. 안 떠 있었으면 null */
|
|
96
|
+
pid: number | null;
|
|
97
|
+
stopped: boolean;
|
|
98
|
+
/** 안 떠 있었는데 잠금 파일에 산 프로세스 pid가 적혀 있으면 그 값. 신호는 안 보냈다 */
|
|
99
|
+
lockPid?: number;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 데몬에 SIGTERM을 보내고 끝나길 기다린다. 신호를 보내기 전에 소켓에 답한 데몬 pid와 잠금 파일의 pid가
|
|
103
|
+
* 같은지 본다. 잠금 pid만 믿으면 데몬이 죽고 그 pid를 받은 다른 프로세스를 끌 수 있다. 소켓 답만 믿지
|
|
104
|
+
* 않는 건 잠금을 안 쥔 프로세스가 소켓 자리에 답하는 경우를 막으려는 것이다.
|
|
105
|
+
*
|
|
106
|
+
* 데몬의 SIGTERM 처리는 옵션 없이 띄운 `peer daemon`의 Ctrl+C와 같다. 정리 중에 신호를 한 번 더 받으면 기다리지 않고
|
|
107
|
+
* 끝난다. 시한 안에 안 끝나면 그 pid를 알려 주고 실패한다. `--stop`을 다시 불러도 소켓은 이미 닫혀 있어서
|
|
108
|
+
* 신호를 안 보낸다.
|
|
109
|
+
*/
|
|
110
|
+
export declare function stopDaemon(options: {
|
|
111
|
+
root: string;
|
|
112
|
+
waitMs?: number;
|
|
113
|
+
}): Promise<StopResult>;
|
|
114
|
+
//# sourceMappingURL=detach.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detach.d.ts","sourceRoot":"","sources":["../../../src/peer/detach.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAEhD,6BAA6B;AAC7B,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAUpD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAuB,GAAG,OAAO,CAsCjF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAclD;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,EAAE,CAuB1D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,GAAE,SAAS,MAAM,EAAiB,EACtC,QAAQ,GAAE,SAAS,MAAM,EAAqB,EAC9C,QAAQ,GAAE,MAAyB,GAClC,MAAM,EAAE,CAKV;AAED,2DAA2D;AAC3D,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,SAAS,SAAQ,GAChB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO7B;AAED,4CAA4C;AAC5C,qBAAa,iBAAkB,SAAQ,KAAK;IAGxC,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE;IACvB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM;gBAJvB,OAAO,EAAE,MAAM,EACN,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE;IACvB,uCAAuC;IAC9B,KAAK,CAAC,EAAE,MAAM,YAAA;CAK1B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAMD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAcnF;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,IAAI,CAKxF;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAwFhF;AAED,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAgChG"}
|