@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.
Files changed (85) hide show
  1. package/README.ko.md +1 -1
  2. package/README.md +1 -1
  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 +39 -6
  8. package/dist/plugin/skills/share/agents/openai.yaml +1 -1
  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 +11 -1
  16. package/dist/src/cli/commands/peer.d.ts.map +1 -1
  17. package/dist/src/cli/commands/peer.js +113 -5
  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 -3
  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/tools/peer.d.ts.map +1 -1
  57. package/dist/src/mcp/tools/peer.js +18 -18
  58. package/dist/src/mcp/tools/peer.js.map +1 -1
  59. package/dist/src/peer/client.d.ts +5 -1
  60. package/dist/src/peer/client.d.ts.map +1 -1
  61. package/dist/src/peer/client.js +6 -2
  62. package/dist/src/peer/client.js.map +1 -1
  63. package/dist/src/peer/detach.d.ts +114 -0
  64. package/dist/src/peer/detach.d.ts.map +1 -0
  65. package/dist/src/peer/detach.js +339 -0
  66. package/dist/src/peer/detach.js.map +1 -0
  67. package/dist/src/peer/locate.d.ts +15 -0
  68. package/dist/src/peer/locate.d.ts.map +1 -1
  69. package/dist/src/peer/locate.js +43 -0
  70. package/dist/src/peer/locate.js.map +1 -1
  71. package/dist/src/peer/lock.d.ts +6 -0
  72. package/dist/src/peer/lock.d.ts.map +1 -1
  73. package/dist/src/peer/lock.js +17 -1
  74. package/dist/src/peer/lock.js.map +1 -1
  75. package/package.json +1 -1
  76. package/plugin/.codex-plugin/plugin.json +1 -1
  77. package/plugin/.mcp.json +1 -1
  78. package/plugin/mcp.json +1 -1
  79. package/plugin/role-agents/lens-reader/AGENT.md +22 -1
  80. package/plugin/skills/_shared/proactive-routing.md +1 -1
  81. package/plugin/skills/lens/SKILL.md +114 -8
  82. package/plugin/skills/share/SKILL.md +39 -6
  83. package/plugin/skills/share/agents/openai.yaml +1 -1
  84. package/plugin/skills/video-digest/SKILL.md +4 -2
  85. 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAi5BD,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"}
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 = '/gestalt:video-digest 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) {\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) };\n}\nfunction templateCommand(slug, id, lang) {\n var cmd = '/gestalt:video-digest slug=' + slug + ' templates=' + id;\n return lang ? cmd + ' reportLang=' + lang : cmd;\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";
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":"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"}
1
+ {"version":3,"file":"viewer-logic.d.ts","sourceRoot":"","sources":["../../../src/digest/viewer-logic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,eAAe,6nMAwI3B,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1D,oCAAoC;IACpC,YAAY,EAAE,CACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC;IACb,6BAA6B;IAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,mFAAmF;IACnF,gBAAgB,EAAE,CAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC;IACb,gFAAgF;IAChF,kBAAkB,EAAE,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,KACb,OAAO,CAAC;IACb,sEAAsE;IACtE,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7D,uFAAuF;IACvF,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IACjG,8CAA8C;IAC9C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,KAAK,CAAC;IAC7C,oCAAoC;IACpC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrF,qCAAqC;IACrC,UAAU,EAAE,CACV,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,EAClE,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,KACf,MAAM,CAAC;IACZ,qCAAqC;IACrC,YAAY,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACzC,gGAAgG;IAChG,aAAa,EAAE,CACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,EAC/B,IAAI,CAAC,EAAE,OAAO,KACX,MAAM,CAAC;IACZ,kGAAkG;IAClG,aAAa,EAAE,CACb,CAAC,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;KAAE,EACxE,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,OAAO,KACX;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzC,yDAAyD;IACzD,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IACrF,0DAA0D;IAC1D,aAAa,EAAE,CACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,KAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,2BAA2B;IAC3B,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtF,sDAAsD;IACtD,WAAW,EAAE,CACX,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1B,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,EAC/C,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,SAAS,KACtC,OAAO,CAAC;IACb,kEAAkE;IAClE,eAAe,EAAE,CACf,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,GAAG,EAAE,MAAM,KACR;QAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7D,yBAAyB;IACzB,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,+CAA+C;IAC/C,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,6CAA6C;IAC7C,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,2DAA2D;IAC3D,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1F,gFAAgF;IAChF,SAAS,EAAE,CACT,SAAS,EAAE,MAAM;QAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,KACnD,CAAC,GAAG,EAAE;QAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACpF;AAED,eAAO,MAAM,WAAW,EAEjB,WAAW,CAAC;AAEnB,eAAO,MAAM,gBAAgB,WAnGA,MAAM,EAAE,KAAK,MAAM,KAAK,MAmGO,CAAC"}
@@ -49,19 +49,56 @@ function pickReport(reports, length, difficulty) {
49
49
  }
50
50
  return -1;
51
51
  }
52
- function reportCommand(slug, difficulty, lang, range) {
53
- var cmd = '/gestalt:video-digest slug=' + slug + ' difficulty=' + difficulty;
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 = '/gestalt:video-digest slug=' + slug + ' templates=' + id;
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmG9B,CAAC;AAyEF,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,QAAQ,CACrC,GAAG,eAAe,gfAAgf,CACngB,EAAiB,CAAC;AAEnB,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC,gBAAgB,CAAC"}
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":"AAgBA,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;AAgBD,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCvF"}
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 { execFileSync } from 'node:child_process';
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 = parentOf(process.ppid);
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":"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"}
1
+ {"version":3,"file":"peer.js","sourceRoot":"","sources":["../../../../src/mcp/tools/peer.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  import type { PeerRequest, PeerResponse } from './protocol.js';
2
- export declare const DAEMON_NOT_RUNNING = "`gestalt peer daemon`\uC744 \uBA3C\uC800 \uC2E4\uD589\uD574 \uC8FC\uC138\uC694";
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,mFAAsC,CAAC;AAEtE,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"}
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"}
@@ -1,9 +1,13 @@
1
1
  import { createConnection } from 'node:net';
2
- export const DAEMON_NOT_RUNNING = '`gestalt peer daemon`을 먼저 실행해 주세요';
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}). ${DAEMON_NOT_RUNNING}`);
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,mCAAmC,CAAC;AAEtE,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC1B;IAArB,YAAqB,UAAkB;QACrC,KAAK,CAAC,uBAAuB,UAAU,MAAM,kBAAkB,EAAE,CAAC,CAAC;QADhD,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"}
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"}