@tienne/gestalt 0.102.0 → 0.103.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 (169) hide show
  1. package/README.ko.md +2 -1
  2. package/README.md +2 -1
  3. package/dist/package.json +1 -1
  4. package/dist/plugin/role-agents/video-summarizer/AGENT.md +177 -113
  5. package/dist/plugin/skills/_shared/proactive-routing.md +2 -1
  6. package/dist/plugin/skills/research/references/design.md +1 -1
  7. package/dist/plugin/skills/video-digest/SKILL.md +408 -0
  8. package/dist/plugin/skills/video-digest/templates/background.md +15 -0
  9. package/dist/plugin/skills/video-digest/templates/blog.md +16 -0
  10. package/dist/plugin/skills/video-digest/templates/comments.md +19 -0
  11. package/dist/plugin/skills/video-digest/templates/counterpoints.md +15 -0
  12. package/dist/plugin/skills/video-digest/templates/flashcards.md +15 -0
  13. package/dist/plugin/skills/video-digest/templates/interview.md +15 -0
  14. package/dist/plugin/skills/video-digest/templates/meeting.md +15 -0
  15. package/dist/plugin/skills/video-digest/templates/mindmap.md +16 -0
  16. package/dist/plugin/skills/video-digest/templates/quiz.md +16 -0
  17. package/dist/plugin/skills/video-digest/templates/quotes.md +16 -0
  18. package/dist/plugin/skills/video-digest/templates/resources.md +14 -0
  19. package/dist/plugin/skills/video-digest/templates/timestamps.md +14 -0
  20. package/dist/src/cli/commands/digest.d.ts +57 -0
  21. package/dist/src/cli/commands/digest.d.ts.map +1 -0
  22. package/dist/src/cli/commands/digest.js +368 -0
  23. package/dist/src/cli/commands/digest.js.map +1 -0
  24. package/dist/src/cli/index.d.ts.map +1 -1
  25. package/dist/src/cli/index.js +77 -0
  26. package/dist/src/cli/index.js.map +1 -1
  27. package/dist/src/digest/blocks.d.ts +1853 -0
  28. package/dist/src/digest/blocks.d.ts.map +1 -0
  29. package/dist/src/digest/blocks.js +148 -0
  30. package/dist/src/digest/blocks.js.map +1 -0
  31. package/dist/src/digest/captions.d.ts +37 -0
  32. package/dist/src/digest/captions.d.ts.map +1 -0
  33. package/dist/src/digest/captions.js +138 -0
  34. package/dist/src/digest/captions.js.map +1 -0
  35. package/dist/src/digest/comments.d.ts +113 -0
  36. package/dist/src/digest/comments.d.ts.map +1 -0
  37. package/dist/src/digest/comments.js +153 -0
  38. package/dist/src/digest/comments.js.map +1 -0
  39. package/dist/src/digest/format.d.ts +9 -0
  40. package/dist/src/digest/format.d.ts.map +1 -0
  41. package/dist/src/digest/format.js +26 -0
  42. package/dist/src/digest/format.js.map +1 -0
  43. package/dist/src/digest/frames.d.ts +26 -0
  44. package/dist/src/digest/frames.d.ts.map +1 -0
  45. package/dist/src/digest/frames.js +109 -0
  46. package/dist/src/digest/frames.js.map +1 -0
  47. package/dist/src/digest/index.d.ts +25 -0
  48. package/dist/src/digest/index.d.ts.map +1 -0
  49. package/dist/src/digest/index.js +25 -0
  50. package/dist/src/digest/index.js.map +1 -0
  51. package/dist/src/digest/ingest.d.ts +65 -0
  52. package/dist/src/digest/ingest.d.ts.map +1 -0
  53. package/dist/src/digest/ingest.js +303 -0
  54. package/dist/src/digest/ingest.js.map +1 -0
  55. package/dist/src/digest/lint-extension.d.ts +57 -0
  56. package/dist/src/digest/lint-extension.d.ts.map +1 -0
  57. package/dist/src/digest/lint-extension.js +395 -0
  58. package/dist/src/digest/lint-extension.js.map +1 -0
  59. package/dist/src/digest/lint.d.ts +40 -0
  60. package/dist/src/digest/lint.d.ts.map +1 -0
  61. package/dist/src/digest/lint.js +517 -0
  62. package/dist/src/digest/lint.js.map +1 -0
  63. package/dist/src/digest/merge.d.ts +40 -0
  64. package/dist/src/digest/merge.d.ts.map +1 -0
  65. package/dist/src/digest/merge.js +104 -0
  66. package/dist/src/digest/merge.js.map +1 -0
  67. package/dist/src/digest/ocr.d.ts +96 -0
  68. package/dist/src/digest/ocr.d.ts.map +1 -0
  69. package/dist/src/digest/ocr.js +168 -0
  70. package/dist/src/digest/ocr.js.map +1 -0
  71. package/dist/src/digest/prose.d.ts +43 -0
  72. package/dist/src/digest/prose.d.ts.map +1 -0
  73. package/dist/src/digest/prose.js +112 -0
  74. package/dist/src/digest/prose.js.map +1 -0
  75. package/dist/src/digest/render-blocks.d.ts +32 -0
  76. package/dist/src/digest/render-blocks.d.ts.map +1 -0
  77. package/dist/src/digest/render-blocks.js +292 -0
  78. package/dist/src/digest/render-blocks.js.map +1 -0
  79. package/dist/src/digest/render-html.d.ts +22 -0
  80. package/dist/src/digest/render-html.d.ts.map +1 -0
  81. package/dist/src/digest/render-html.js +466 -0
  82. package/dist/src/digest/render-html.js.map +1 -0
  83. package/dist/src/digest/render-md.d.ts +18 -0
  84. package/dist/src/digest/render-md.d.ts.map +1 -0
  85. package/dist/src/digest/render-md.js +113 -0
  86. package/dist/src/digest/render-md.js.map +1 -0
  87. package/dist/src/digest/render.d.ts +47 -0
  88. package/dist/src/digest/render.d.ts.map +1 -0
  89. package/dist/src/digest/render.js +123 -0
  90. package/dist/src/digest/render.js.map +1 -0
  91. package/dist/src/digest/reports.d.ts +26 -0
  92. package/dist/src/digest/reports.d.ts.map +1 -0
  93. package/dist/src/digest/reports.js +70 -0
  94. package/dist/src/digest/reports.js.map +1 -0
  95. package/dist/src/digest/schema-base.d.ts +31 -0
  96. package/dist/src/digest/schema-base.d.ts.map +1 -0
  97. package/dist/src/digest/schema-base.js +19 -0
  98. package/dist/src/digest/schema-base.js.map +1 -0
  99. package/dist/src/digest/schema.d.ts +5713 -0
  100. package/dist/src/digest/schema.d.ts.map +1 -0
  101. package/dist/src/digest/schema.js +229 -0
  102. package/dist/src/digest/schema.js.map +1 -0
  103. package/dist/src/digest/server.d.ts +36 -0
  104. package/dist/src/digest/server.d.ts.map +1 -0
  105. package/dist/src/digest/server.js +278 -0
  106. package/dist/src/digest/server.js.map +1 -0
  107. package/dist/src/digest/slice.d.ts +20 -0
  108. package/dist/src/digest/slice.d.ts.map +1 -0
  109. package/dist/src/digest/slice.js +48 -0
  110. package/dist/src/digest/slice.js.map +1 -0
  111. package/dist/src/digest/store.d.ts +67 -0
  112. package/dist/src/digest/store.d.ts.map +1 -0
  113. package/dist/src/digest/store.js +152 -0
  114. package/dist/src/digest/store.js.map +1 -0
  115. package/dist/src/digest/svg.d.ts +44 -0
  116. package/dist/src/digest/svg.d.ts.map +1 -0
  117. package/dist/src/digest/svg.js +264 -0
  118. package/dist/src/digest/svg.js.map +1 -0
  119. package/dist/src/digest/templates.d.ts +38 -0
  120. package/dist/src/digest/templates.d.ts.map +1 -0
  121. package/dist/src/digest/templates.js +125 -0
  122. package/dist/src/digest/templates.js.map +1 -0
  123. package/dist/src/digest/translate.d.ts +46 -0
  124. package/dist/src/digest/translate.d.ts.map +1 -0
  125. package/dist/src/digest/translate.js +50 -0
  126. package/dist/src/digest/translate.js.map +1 -0
  127. package/dist/src/digest/viewer-js.d.ts +4 -0
  128. package/dist/src/digest/viewer-js.d.ts.map +1 -0
  129. package/dist/src/digest/viewer-js.js +710 -0
  130. package/dist/src/digest/viewer-js.js.map +1 -0
  131. package/dist/src/digest/viewer-logic.d.ts +46 -0
  132. package/dist/src/digest/viewer-logic.d.ts.map +1 -0
  133. package/dist/src/digest/viewer-logic.js +89 -0
  134. package/dist/src/digest/viewer-logic.js.map +1 -0
  135. package/dist/src/digest/ytdlp.d.ts +34 -0
  136. package/dist/src/digest/ytdlp.d.ts.map +1 -0
  137. package/dist/src/digest/ytdlp.js +64 -0
  138. package/dist/src/digest/ytdlp.js.map +1 -0
  139. package/dist/src/mcp/schemas.d.ts +48 -0
  140. package/dist/src/mcp/schemas.d.ts.map +1 -1
  141. package/dist/src/mcp/schemas.js +25 -0
  142. package/dist/src/mcp/schemas.js.map +1 -1
  143. package/dist/src/mcp/server.d.ts.map +1 -1
  144. package/dist/src/mcp/server.js +7 -1
  145. package/dist/src/mcp/server.js.map +1 -1
  146. package/dist/src/mcp/tools/digest-passthrough.d.ts +3 -0
  147. package/dist/src/mcp/tools/digest-passthrough.d.ts.map +1 -0
  148. package/dist/src/mcp/tools/digest-passthrough.js +148 -0
  149. package/dist/src/mcp/tools/digest-passthrough.js.map +1 -0
  150. package/package.json +1 -1
  151. package/plugin/.codex-plugin/plugin.json +1 -1
  152. package/plugin/.mcp.json +1 -1
  153. package/plugin/mcp.json +1 -1
  154. package/plugin/role-agents/video-summarizer/AGENT.md +177 -113
  155. package/plugin/skills/_shared/proactive-routing.md +2 -1
  156. package/plugin/skills/research/references/design.md +1 -1
  157. package/plugin/skills/video-digest/SKILL.md +408 -0
  158. package/plugin/skills/video-digest/templates/background.md +15 -0
  159. package/plugin/skills/video-digest/templates/blog.md +16 -0
  160. package/plugin/skills/video-digest/templates/comments.md +19 -0
  161. package/plugin/skills/video-digest/templates/counterpoints.md +15 -0
  162. package/plugin/skills/video-digest/templates/flashcards.md +15 -0
  163. package/plugin/skills/video-digest/templates/interview.md +15 -0
  164. package/plugin/skills/video-digest/templates/meeting.md +15 -0
  165. package/plugin/skills/video-digest/templates/mindmap.md +16 -0
  166. package/plugin/skills/video-digest/templates/quiz.md +16 -0
  167. package/plugin/skills/video-digest/templates/quotes.md +16 -0
  168. package/plugin/skills/video-digest/templates/resources.md +14 -0
  169. package/plugin/skills/video-digest/templates/timestamps.md +14 -0
@@ -0,0 +1,292 @@
1
+ import { extensionKey, } from './blocks.js';
2
+ import { boldPattern, keywordPattern } from './schema.js';
3
+ import { compareSvg, cycleSvg, flowSvg, treeSvg } from './svg.js';
4
+ // 확장 리포트는 키워드 목록이 없어 lint가 마커를 막는다. 그래도 들어오면 표시 글자만 남긴다
5
+ const stripKeywords = (text) => text.replace(keywordPattern(), (_m, _id, label) => label);
6
+ const htmlInline = (text, ctx) => ctx
7
+ .escape(stripKeywords(text))
8
+ .replace(boldPattern(), (_m, inner) => `<strong>${inner}</strong>`);
9
+ const htmlCite = (c, ctx) => (c ? ctx.cite(c) : '');
10
+ const mdCite = (c, ctx) => (c ? ctx.cite(c) : '');
11
+ function listHtml(items, ctx) {
12
+ return `<ul>${items
13
+ .map((it) => `<li>${htmlInline(it.text, ctx)}${htmlCite(it.cite, ctx)}${it.children?.length ? listHtml(it.children, ctx) : ''}</li>`)
14
+ .join('')}</ul>`;
15
+ }
16
+ const TONE_LABEL = {
17
+ positive: '긍정',
18
+ negative: '부정',
19
+ neutral: '중립',
20
+ question: '질문',
21
+ };
22
+ function outlineHtml(node, ctx) {
23
+ const kids = node.children?.length
24
+ ? `<ul>${node.children.map((c) => outlineHtml(c, ctx)).join('')}</ul>`
25
+ : '';
26
+ return `<li>${ctx.escape(node.label)}${node.cite ? ` ${ctx.time(node.cite)}` : ''}${kids}</li>`;
27
+ }
28
+ function outlineMd(node, ctx, depth = 0) {
29
+ return [
30
+ `${' '.repeat(depth)}- ${mdInline(node.label)}${node.cite ? ` ${ctx.time(node.cite)}` : ''}`,
31
+ ...(node.children ?? []).flatMap((c) => outlineMd(c, ctx, depth + 1)),
32
+ ];
33
+ }
34
+ /** 그림 하나와 확대 버튼, 스크립트 없이도 읽히는 목록. 대섹션 도식도 이 틀을 쓴다 */
35
+ export function diagramFigure(svg, outline, caption) {
36
+ return `<figure class="diagram"><div class="dg-scroll">${svg}</div><div class="dg-bar">${caption ? `<span>${caption}</span>` : ''}<button type="button" class="zoom-btn" data-zoom>크게 보기</button></div><details class="dg-outline"><summary>목록으로 보기</summary>${outline}</details></figure>`;
37
+ }
38
+ const DIAGRAM_LABEL = {
39
+ flow: '흐름도',
40
+ cycle: '순환도',
41
+ compare: '비교표',
42
+ tree: '구조도',
43
+ };
44
+ /** 대섹션 도식. title은 그림의 aria-label에 붙는 대섹션 제목이다 */
45
+ export function sectionDiagramHtml(d, title, ctx) {
46
+ const opts = { sec: ctx.sec };
47
+ const aria = `${title} ${DIAGRAM_LABEL[d.kind]}`;
48
+ const li = (n) => outlineHtml(n, ctx);
49
+ let svg;
50
+ let outline;
51
+ switch (d.kind) {
52
+ case 'flow':
53
+ svg = flowSvg(d.steps, opts, aria);
54
+ outline = `<ol>${d.steps.map(li).join('')}</ol>`;
55
+ break;
56
+ case 'cycle':
57
+ svg = cycleSvg(d.steps, opts, aria);
58
+ outline = `<ol>${d.steps.map(li).join('')}</ol>`;
59
+ break;
60
+ case 'compare':
61
+ svg = compareSvg(d.columns, opts, aria);
62
+ outline = `<ul>${d.columns.map((c) => li({ label: c.title, children: c.items })).join('')}</ul>`;
63
+ break;
64
+ case 'tree':
65
+ svg = treeSvg(d.root, opts, aria);
66
+ outline = `<ul>${li(d.root)}</ul>`;
67
+ break;
68
+ default: {
69
+ const never = d;
70
+ throw new Error(`알 수 없는 도식: ${String(never)}`);
71
+ }
72
+ }
73
+ return diagramFigure(svg, outline, d.caption ? ctx.escape(d.caption) : undefined);
74
+ }
75
+ /** 마크다운에는 그림 대신 목록으로 옮긴다. 순서가 있는 흐름과 순환은 번호를 단다 */
76
+ export function sectionDiagramMd(d, ctx) {
77
+ const head = d.caption ? [`*${DIAGRAM_LABEL[d.kind]}: ${mdInline(d.caption)}*`, ''] : [];
78
+ const step = (n, k) => `${k + 1}. ${mdInline(n.label)}${n.cite ? ` ${ctx.time(n.cite)}` : ''}`;
79
+ switch (d.kind) {
80
+ case 'flow':
81
+ case 'cycle':
82
+ return [...head, ...d.steps.map(step), ''];
83
+ case 'compare':
84
+ return [
85
+ ...head,
86
+ ...d.columns.flatMap((c) => outlineMd({ label: c.title, children: c.items }, ctx)),
87
+ '',
88
+ ];
89
+ case 'tree':
90
+ return [...head, ...outlineMd(d.root, ctx), ''];
91
+ default: {
92
+ const never = d;
93
+ throw new Error(`알 수 없는 도식: ${String(never)}`);
94
+ }
95
+ }
96
+ }
97
+ // 댓글과 자막 인용은 남이 쓴 글이라 마크다운 문법으로 읽히면 링크나 HTML이 끼어든다. 문법 글자를 무력화한다
98
+ // `~`는 '1~2개와 3~4개'가 취소선으로 바뀌어서 함께 막는다
99
+ // 맨 URL은 보이는 글자가 곧 목적지라 숨은 링크가 아니므로 두고 링크 문법과 HTML만 막는다
100
+ const mdVerbatim = (text) => text.replace(/[\\`*_[\]<>#|&~]/g, (ch) => `\\${ch}`);
101
+ // 한 줄로 쓰는 칸에 개행이 섞이면 목록이나 인용 밖으로 빠져나간다. HTML도 이 칸들의 개행을 공백으로 접어 보여준다
102
+ const oneLine = (text) => text.replace(/\s+/g, ' ').trim();
103
+ // 줄 첫머리의 `-`, `+`, `1.`, `1)`은 뒤에 공백이 오거나 줄이 끝나면 목록으로, `---`와 `===`는 구분선이나 제목 밑줄로 읽힌다
104
+ // HTML은 평문으로 보여줘서 맞춘다. `-5도`나 `3.5배`는 문법이 아니라서 그대로 둔다
105
+ const lineHead = (text) => text
106
+ .replace(/^([-+])(?=\s|$|-)/, '\\$1')
107
+ .replace(/^(=+)(?=[ \t]*$)/, '\\$1')
108
+ .replace(/^(\d{1,9})([.)])(?=\s|$)/, '$1\\$2');
109
+ // 제목, 라벨, 이름 칸도 자막과 댓글에서 나온 값이다. lint가 `**`를 막는 칸이라 문법 글자를 전부 이스케이프해도 잃는 서식이 없다
110
+ export const mdInline = (text) => lineHead(mdVerbatim(oneLine(text)));
111
+ // 본문 칸도 자막에서 나온 글이라 링크나 HTML, 줄 머리 문법이 끼어들 수 있다. HTML 쪽처럼 굵게만 살린다
112
+ // 개행은 굵게를 가른 뒤에 접는다. 먼저 접으면 줄을 넘는 `**`가 마크다운에서만 굵게가 된다
113
+ const mdBody = (text) => lineHead(oneLine(stripKeywords(text)
114
+ .split(boldPattern())
115
+ .map((part, k) => (k % 2 ? `**${mdVerbatim(part)}**` : mdVerbatim(part)))
116
+ .join('')));
117
+ // 인용 원문은 줄을 살리므로 줄마다 첫머리를 막는다. 마크다운은 홑 `\r`도 줄 끝으로 읽어서 같이 가른다
118
+ // 앞 공백이 4칸이면 코드 블록이 되고 뒤 공백은 `===` 밑줄 판정을 가려서 양끝을 걷는다
119
+ const quoteLines = (text) => text.split(/\r\n|\r|\n/).map((l) => `> ${lineHead(l.trim())}`.trimEnd());
120
+ function listMd(items, ctx, depth = 0) {
121
+ return items.flatMap((it) => [
122
+ `${' '.repeat(depth)}- ${mdBody(it.text)}${mdCite(it.cite, ctx)}`,
123
+ ...(it.children ? listMd(it.children, ctx, depth + 1) : []),
124
+ ]);
125
+ }
126
+ /** id는 블록마다 겹치지 않는 접두어다. 퀴즈 라디오 그룹 이름에 쓴다 */
127
+ export function blockHtml(block, ctx, id = 'b') {
128
+ switch (block.type) {
129
+ case 'heading':
130
+ return `<h3>${ctx.escape(block.text)}</h3>`;
131
+ case 'text':
132
+ return `<p>${htmlInline(block.text, ctx)}${htmlCite(block.cite, ctx)}</p>`;
133
+ case 'list':
134
+ return `${block.title ? `<h4>${ctx.escape(block.title)}</h4>` : ''}${listHtml(block.items, ctx)}`;
135
+ case 'quote':
136
+ return `<figure class="quote"><blockquote>${ctx.escape(block.text)}${ctx.cite(block.cite)}</blockquote>${block.translation ? `<p class="quote-tr">${htmlInline(block.translation, ctx)}</p>` : ''}${block.speaker || block.note
137
+ ? `<figcaption>${block.speaker ? `<b>${ctx.escape(block.speaker)}</b>` : ''}${block.note ? `<span>${htmlInline(block.note, ctx)}</span>` : ''}</figcaption>`
138
+ : ''}</figure>`;
139
+ case 'timestamps':
140
+ return `<ol class="ext-toc">${block.items
141
+ .map((it) => `<li>${ctx.time(it.cite)}<div><b>${ctx.escape(it.title)}</b>${it.summary ? `<p>${htmlInline(it.summary, ctx)}</p>` : ''}</div></li>`)
142
+ .join('')}</ol>`;
143
+ case 'actions':
144
+ return `<ul class="actions">${block.items
145
+ .map((it) => {
146
+ const meta = [
147
+ it.owner ? `<span>담당 ${ctx.escape(it.owner)}</span>` : '',
148
+ it.due ? `<span>기한 ${ctx.escape(it.due)}</span>` : '',
149
+ ].join('');
150
+ return `<li><span class="box" aria-hidden="true"></span><div>${htmlInline(it.task, ctx)}${htmlCite(it.cite, ctx)}${meta ? `<small>${meta}</small>` : ''}</div></li>`;
151
+ })
152
+ .join('')}</ul>`;
153
+ case 'qa':
154
+ return `<dl class="qa">${block.items
155
+ .map((it) => `<dt>${htmlInline(it.question, ctx)}</dt><dd>${htmlInline(it.answer, ctx)}${htmlCite(it.cite, ctx)}</dd>`)
156
+ .join('')}</dl>`;
157
+ case 'flashcards':
158
+ return `<div class="cards">${block.cards
159
+ .map((c) => `<details class="card"><summary>${htmlInline(c.front, ctx)}</summary><div class="card-back">${htmlInline(c.back, ctx)}${htmlCite(c.cite, ctx)}</div></details>`)
160
+ .join('')}</div>`;
161
+ case 'quiz':
162
+ return `<ol class="quiz">${block.questions
163
+ .map((q, k) => {
164
+ const name = ctx.escape(`${id}-q${k}`);
165
+ const choices = q.choices
166
+ .map((c, ci) => `<label class="quiz-choice"><input type="radio" name="${name}" value="${ci}"> <span>${htmlInline(c, ctx)}</span></label>`)
167
+ .join('');
168
+ const right = q.choices[q.answer] ?? '';
169
+ return `<li><fieldset class="quiz-q" data-answer="${q.answer}"><legend>${htmlInline(q.question, ctx)}</legend>${choices}<button type="button" class="quiz-check">정답 확인</button><p class="quiz-result" role="status" aria-live="polite"></p><div class="quiz-exp" hidden><p><b>정답 ${q.answer + 1}번</b> ${htmlInline(right, ctx)}</p><p>${htmlInline(q.explanation, ctx)}${htmlCite(q.cite, ctx)}</p></div></fieldset></li>`;
170
+ })
171
+ .join('')}</ol>`;
172
+ case 'mindmap':
173
+ return diagramFigure(treeSvg(block.root, { sec: ctx.sec }, `${block.root.label} 마인드맵`), `<ul>${outlineHtml(block.root, ctx)}</ul>`);
174
+ case 'comments': {
175
+ const groups = block.groups
176
+ .map((g) => {
177
+ const pct = block.total > 0 ? Math.min(100, Math.round((g.count / block.total) * 100)) : 0;
178
+ const examples = g.examples.length
179
+ ? `<ul class="cm-ex">${g.examples.map((x) => `<li><q>${ctx.escape(x.text)}</q></li>`).join('')}</ul>`
180
+ : '';
181
+ return `<li class="cm-group cm-${g.tone}"><div class="cm-head"><b>${ctx.escape(g.title)}</b><span class="cm-tone">${TONE_LABEL[g.tone]}</span><span class="cm-count">${g.count}개</span></div><div class="cm-bar" aria-hidden="true"><i style="width:${pct}%"></i></div><p>${htmlInline(g.summary, ctx)}</p>${examples}</li>`;
182
+ })
183
+ .join('');
184
+ return `<div class="comments"><p class="cm-overview">${htmlInline(block.overview, ctx)}</p><p class="cm-meta">분석한 댓글 ${block.total}개</p><ul class="cm-groups">${groups}</ul></div>`;
185
+ }
186
+ default: {
187
+ const never = block;
188
+ throw new Error(`모르는 블록: ${JSON.stringify(never)}`);
189
+ }
190
+ }
191
+ }
192
+ export function blockMarkdown(block, ctx) {
193
+ switch (block.type) {
194
+ case 'heading':
195
+ return [`## ${mdInline(block.text)}`, ''];
196
+ case 'text':
197
+ return [`${mdBody(block.text)}${mdCite(block.cite, ctx)}`, ''];
198
+ case 'list':
199
+ return [
200
+ ...(block.title ? [`**${mdInline(block.title)}**`, ''] : []),
201
+ ...listMd(block.items, ctx),
202
+ '',
203
+ ];
204
+ case 'quote': {
205
+ const by = [
206
+ block.speaker ? `— ${mdInline(block.speaker)}` : '',
207
+ block.note ? mdBody(block.note) : '',
208
+ ]
209
+ .filter(Boolean)
210
+ .join(', ');
211
+ const text = quoteLines(mdVerbatim(block.text));
212
+ text[text.length - 1] += ctx.cite(block.cite);
213
+ return [
214
+ ...text,
215
+ ...(block.translation ? ['>', ...quoteLines(mdBody(block.translation))] : []),
216
+ ...(by ? ['>', ...quoteLines(by)] : []),
217
+ '',
218
+ ];
219
+ }
220
+ case 'timestamps':
221
+ return [
222
+ ...block.items.map((it) => `- ${ctx.time(it.cite)} **${mdInline(it.title)}**${it.summary ? ` ${mdBody(it.summary)}` : ''}`),
223
+ '',
224
+ ];
225
+ case 'actions':
226
+ return [
227
+ ...block.items.map((it) => {
228
+ const meta = [
229
+ it.owner ? `담당 ${mdInline(it.owner)}` : '',
230
+ it.due ? `기한 ${mdInline(it.due)}` : '',
231
+ ]
232
+ .filter(Boolean)
233
+ .join(', ');
234
+ return `- [ ] ${mdBody(it.task)}${meta ? ` (${meta})` : ''}${mdCite(it.cite, ctx)}`;
235
+ }),
236
+ '',
237
+ ];
238
+ case 'qa':
239
+ return block.items.flatMap((it) => [
240
+ `**Q. ${mdBody(it.question)}**`,
241
+ '',
242
+ `${mdBody(it.answer)}${mdCite(it.cite, ctx)}`,
243
+ '',
244
+ ]);
245
+ case 'flashcards':
246
+ return [
247
+ ...block.cards.flatMap((c) => [
248
+ `- Q. ${mdBody(c.front)}`,
249
+ ` - A. ${mdBody(c.back)}${mdCite(c.cite, ctx)}`,
250
+ ]),
251
+ '',
252
+ ];
253
+ case 'quiz':
254
+ return block.questions.flatMap((q, k) => [
255
+ `**${k + 1}. ${mdBody(q.question)}**`,
256
+ '',
257
+ ...q.choices.map((c, ci) => `- (${ci + 1}) ${mdBody(c)}`),
258
+ '',
259
+ `> 정답 (${q.answer + 1}) ${mdBody(q.choices[q.answer] ?? '')}. ${mdBody(q.explanation)}${mdCite(q.cite, ctx)}`,
260
+ '',
261
+ ]);
262
+ case 'mindmap':
263
+ return [...outlineMd(block.root, ctx), ''];
264
+ case 'comments':
265
+ return [
266
+ mdBody(block.overview),
267
+ '',
268
+ `분석한 댓글 ${block.total}개`,
269
+ '',
270
+ ...block.groups.flatMap((g) => [
271
+ `**${mdInline(g.title)}** (${TONE_LABEL[g.tone]}, ${g.count}개)`,
272
+ '',
273
+ mdBody(g.summary),
274
+ '',
275
+ ...g.examples.flatMap((x) => [...quoteLines(mdVerbatim(x.text)), '']),
276
+ ]),
277
+ ];
278
+ default: {
279
+ const never = block;
280
+ throw new Error(`모르는 블록: ${JSON.stringify(never)}`);
281
+ }
282
+ }
283
+ }
284
+ /** 탭 id와 패널 id. 키에 들어가는 글자(영숫자, -, .)는 id에 그대로 써도 된다 */
285
+ export const extensionPanelId = (ext) => `ext-${extensionKey(ext)}`;
286
+ export function extensionHtml(ext, ctx) {
287
+ const id = extensionPanelId(ext);
288
+ return `<section class="ext" id="${ctx.escape(id)}" role="tabpanel" aria-labelledby="tab-${ctx.escape(id)}" lang="${ctx.escape(ext.lang)}" tabindex="0" hidden><h2>${ctx.escape(ext.title)}</h2>${ext.blocks
289
+ .map((b, bi) => blockHtml(b, ctx, `${id}-b${bi}`))
290
+ .join('')}</section>`;
291
+ }
292
+ //# sourceMappingURL=render-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-blocks.js","sourceRoot":"","sources":["../../../src/digest/render-blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type Digest, type Transcript } from './schema.js';
2
+ import type { DigestTemplate } from './templates.js';
3
+ export interface RenderHtmlOptions {
4
+ /** 프레임 파일이 있는지. 상대 경로 모드에서 없는 프레임은 자리를 만들지 않는다 */
5
+ frameExists?: (fileName: string) => boolean;
6
+ /** 켜면 프레임을 data URI로 싣는다. 파일 하나만 들고 다닐 때 쓴다 */
7
+ inlineFrames?: boolean;
8
+ loadFrame?: (fileName: string) => Buffer | null;
9
+ /** "+ 더 만들기" 메뉴에 띄울 템플릿. 이미 만든 확장의 템플릿은 메뉴에서 뺀다 */
10
+ templates?: Pick<DigestTemplate, 'id' | 'title' | 'description'>[];
11
+ }
12
+ export interface RenderHtmlResult {
13
+ html: string;
14
+ warnings: string[];
15
+ }
16
+ export declare function embedJson(value: unknown): string;
17
+ /**
18
+ * digest.json을 뷰어 HTML 한 장으로 바꾼다. LLM을 부르지 않는다.
19
+ * 본문 글자는 escape한 뒤 굵게와 키워드 마커 두 가지만 태그로 바꾼다.
20
+ */
21
+ export declare function renderDigestHtml(digest: Digest, transcript: Transcript, opts?: RenderHtmlOptions): RenderHtmlResult;
22
+ //# sourceMappingURL=render-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-html.d.ts","sourceRoot":"","sources":["../../../src/digest/render-html.ts"],"names":[],"mappings":"AAYA,OAAO,EAOL,KAAK,MAAM,EAGX,KAAK,UAAU,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAChD,mDAAmD;IACnD,SAAS,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC;CACpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAwCD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKhD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,IAAI,GAAE,iBAAsB,GAC3B,gBAAgB,CAyRlB"}