@tienne/gestalt 0.107.0 → 0.108.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 (159) hide show
  1. package/CLAUDE.md +1 -0
  2. package/README.ko.md +1 -0
  3. package/README.md +1 -0
  4. package/dist/package.json +1 -1
  5. package/dist/plugin/role-agents/lens-context/AGENT.md +94 -0
  6. package/dist/plugin/role-agents/lens-link/AGENT.md +83 -0
  7. package/dist/plugin/role-agents/lens-reader/AGENT.md +230 -0
  8. package/dist/plugin/skills/_shared/proactive-routing.md +1 -0
  9. package/dist/plugin/skills/lens/SKILL.md +375 -0
  10. package/dist/schemas/gestalt.schema.json +13 -0
  11. package/dist/src/cli/commands/digest.d.ts +2 -0
  12. package/dist/src/cli/commands/digest.d.ts.map +1 -1
  13. package/dist/src/cli/commands/digest.js +6 -0
  14. package/dist/src/cli/commands/digest.js.map +1 -1
  15. package/dist/src/cli/commands/lens.d.ts +27 -0
  16. package/dist/src/cli/commands/lens.d.ts.map +1 -0
  17. package/dist/src/cli/commands/lens.js +200 -0
  18. package/dist/src/cli/commands/lens.js.map +1 -0
  19. package/dist/src/cli/index.d.ts.map +1 -1
  20. package/dist/src/cli/index.js +37 -0
  21. package/dist/src/cli/index.js.map +1 -1
  22. package/dist/src/digest/format.d.ts.map +1 -1
  23. package/dist/src/digest/format.js +1 -0
  24. package/dist/src/digest/format.js.map +1 -1
  25. package/dist/src/digest/frames.d.ts.map +1 -1
  26. package/dist/src/digest/frames.js +1 -1
  27. package/dist/src/digest/frames.js.map +1 -1
  28. package/dist/src/digest/ingest.d.ts +8 -1
  29. package/dist/src/digest/ingest.d.ts.map +1 -1
  30. package/dist/src/digest/ingest.js +2 -1
  31. package/dist/src/digest/ingest.js.map +1 -1
  32. package/dist/src/digest/lens-schema.d.ts +542 -0
  33. package/dist/src/digest/lens-schema.d.ts.map +1 -0
  34. package/dist/src/digest/lens-schema.js +108 -0
  35. package/dist/src/digest/lens-schema.js.map +1 -0
  36. package/dist/src/digest/lens-source.d.ts +260 -0
  37. package/dist/src/digest/lens-source.d.ts.map +1 -0
  38. package/dist/src/digest/lens-source.js +92 -0
  39. package/dist/src/digest/lens-source.js.map +1 -0
  40. package/dist/src/digest/lens-widget-schema.d.ts +1225 -0
  41. package/dist/src/digest/lens-widget-schema.d.ts.map +1 -0
  42. package/dist/src/digest/lens-widget-schema.js +80 -0
  43. package/dist/src/digest/lens-widget-schema.js.map +1 -0
  44. package/dist/src/digest/lens-widgets.d.ts +25 -0
  45. package/dist/src/digest/lens-widgets.d.ts.map +1 -0
  46. package/dist/src/digest/lens-widgets.js +225 -0
  47. package/dist/src/digest/lens-widgets.js.map +1 -0
  48. package/dist/src/digest/lint-lens-context.d.ts +102 -0
  49. package/dist/src/digest/lint-lens-context.d.ts.map +1 -0
  50. package/dist/src/digest/lint-lens-context.js +192 -0
  51. package/dist/src/digest/lint-lens-context.js.map +1 -0
  52. package/dist/src/digest/lint-lens.d.ts +17 -0
  53. package/dist/src/digest/lint-lens.d.ts.map +1 -0
  54. package/dist/src/digest/lint-lens.js +237 -0
  55. package/dist/src/digest/lint-lens.js.map +1 -0
  56. package/dist/src/digest/lint.d.ts +14 -0
  57. package/dist/src/digest/lint.d.ts.map +1 -1
  58. package/dist/src/digest/lint.js +156 -2
  59. package/dist/src/digest/lint.js.map +1 -1
  60. package/dist/src/digest/merge.d.ts.map +1 -1
  61. package/dist/src/digest/merge.js +11 -2
  62. package/dist/src/digest/merge.js.map +1 -1
  63. package/dist/src/digest/prose.d.ts.map +1 -1
  64. package/dist/src/digest/prose.js +8 -0
  65. package/dist/src/digest/prose.js.map +1 -1
  66. package/dist/src/digest/render-html.d.ts +5 -0
  67. package/dist/src/digest/render-html.d.ts.map +1 -1
  68. package/dist/src/digest/render-html.js +93 -18
  69. package/dist/src/digest/render-html.js.map +1 -1
  70. package/dist/src/digest/render-lens.d.ts +61 -0
  71. package/dist/src/digest/render-lens.d.ts.map +1 -0
  72. package/dist/src/digest/render-lens.js +273 -0
  73. package/dist/src/digest/render-lens.js.map +1 -0
  74. package/dist/src/digest/render-md.d.ts +5 -0
  75. package/dist/src/digest/render-md.d.ts.map +1 -1
  76. package/dist/src/digest/render-md.js +116 -7
  77. package/dist/src/digest/render-md.js.map +1 -1
  78. package/dist/src/digest/render-widgets.d.ts +13 -0
  79. package/dist/src/digest/render-widgets.d.ts.map +1 -0
  80. package/dist/src/digest/render-widgets.js +197 -0
  81. package/dist/src/digest/render-widgets.js.map +1 -0
  82. package/dist/src/digest/render.d.ts +2 -0
  83. package/dist/src/digest/render.d.ts.map +1 -1
  84. package/dist/src/digest/render.js +17 -3
  85. package/dist/src/digest/render.js.map +1 -1
  86. package/dist/src/digest/schema.d.ts +14683 -2022
  87. package/dist/src/digest/schema.d.ts.map +1 -1
  88. package/dist/src/digest/schema.js +67 -6
  89. package/dist/src/digest/schema.js.map +1 -1
  90. package/dist/src/digest/server.d.ts +2 -1
  91. package/dist/src/digest/server.d.ts.map +1 -1
  92. package/dist/src/digest/server.js +26 -11
  93. package/dist/src/digest/server.js.map +1 -1
  94. package/dist/src/digest/viewer-js.d.ts.map +1 -1
  95. package/dist/src/digest/viewer-js.js +120 -4
  96. package/dist/src/digest/viewer-js.js.map +1 -1
  97. package/dist/src/lens/attach.d.ts +436 -0
  98. package/dist/src/lens/attach.d.ts.map +1 -0
  99. package/dist/src/lens/attach.js +46 -0
  100. package/dist/src/lens/attach.js.map +1 -0
  101. package/dist/src/lens/ingest.d.ts +75 -0
  102. package/dist/src/lens/ingest.d.ts.map +1 -0
  103. package/dist/src/lens/ingest.js +558 -0
  104. package/dist/src/lens/ingest.js.map +1 -0
  105. package/dist/src/lens/kind.d.ts +11 -0
  106. package/dist/src/lens/kind.d.ts.map +1 -0
  107. package/dist/src/lens/kind.js +59 -0
  108. package/dist/src/lens/kind.js.map +1 -0
  109. package/dist/src/lens/knowledge.d.ts +53 -0
  110. package/dist/src/lens/knowledge.d.ts.map +1 -0
  111. package/dist/src/lens/knowledge.js +202 -0
  112. package/dist/src/lens/knowledge.js.map +1 -0
  113. package/dist/src/lens/notes.d.ts +73 -0
  114. package/dist/src/lens/notes.d.ts.map +1 -0
  115. package/dist/src/lens/notes.js +276 -0
  116. package/dist/src/lens/notes.js.map +1 -0
  117. package/dist/src/lens/panels.d.ts +10 -0
  118. package/dist/src/lens/panels.d.ts.map +1 -0
  119. package/dist/src/lens/panels.js +25 -0
  120. package/dist/src/lens/panels.js.map +1 -0
  121. package/dist/src/lens/pdf-extract-py.d.ts +15 -0
  122. package/dist/src/lens/pdf-extract-py.d.ts.map +1 -0
  123. package/dist/src/lens/pdf-extract-py.js +414 -0
  124. package/dist/src/lens/pdf-extract-py.js.map +1 -0
  125. package/dist/src/lens/podcast.d.ts +36 -0
  126. package/dist/src/lens/podcast.d.ts.map +1 -0
  127. package/dist/src/lens/podcast.js +104 -0
  128. package/dist/src/lens/podcast.js.map +1 -0
  129. package/dist/src/lens/python.d.ts +33 -0
  130. package/dist/src/lens/python.d.ts.map +1 -0
  131. package/dist/src/lens/python.js +61 -0
  132. package/dist/src/lens/python.js.map +1 -0
  133. package/dist/src/lens/web-extract-py.d.ts +9 -0
  134. package/dist/src/lens/web-extract-py.d.ts.map +1 -0
  135. package/dist/src/lens/web-extract-py.js +114 -0
  136. package/dist/src/lens/web-extract-py.js.map +1 -0
  137. package/dist/src/mcp/schemas.d.ts +3 -0
  138. package/dist/src/mcp/schemas.d.ts.map +1 -1
  139. package/dist/src/mcp/schemas.js +4 -0
  140. package/dist/src/mcp/schemas.js.map +1 -1
  141. package/dist/src/mcp/server.js +1 -1
  142. package/dist/src/mcp/server.js.map +1 -1
  143. package/dist/src/mcp/tools/digest-passthrough.d.ts.map +1 -1
  144. package/dist/src/mcp/tools/digest-passthrough.js +5 -0
  145. package/dist/src/mcp/tools/digest-passthrough.js.map +1 -1
  146. package/dist/src/research/source-create.d.ts +6 -1
  147. package/dist/src/research/source-create.d.ts.map +1 -1
  148. package/dist/src/research/source-create.js +41 -10
  149. package/dist/src/research/source-create.js.map +1 -1
  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/lens-context/AGENT.md +94 -0
  155. package/plugin/role-agents/lens-link/AGENT.md +83 -0
  156. package/plugin/role-agents/lens-reader/AGENT.md +230 -0
  157. package/plugin/skills/_shared/proactive-routing.md +1 -0
  158. package/plugin/skills/lens/SKILL.md +375 -0
  159. package/schemas/gestalt.schema.json +13 -0
@@ -0,0 +1,260 @@
1
+ import { z } from 'zod';
2
+ import { type DigestStore } from './store.js';
3
+ export declare const LENS_SOURCE_FILE = "source.json";
4
+ export declare const LENS_SOURCE_SCHEMA_VERSION = "1.0.0";
5
+ export declare const sourcePageSchema: z.ZodObject<{
6
+ n: z.ZodNumber;
7
+ width: z.ZodNumber;
8
+ height: z.ZodNumber;
9
+ image: z.ZodString;
10
+ }, "strip", z.ZodTypeAny, {
11
+ width: number;
12
+ height: number;
13
+ n: number;
14
+ image: string;
15
+ }, {
16
+ width: number;
17
+ height: number;
18
+ n: number;
19
+ image: string;
20
+ }>;
21
+ /**
22
+ * 원문 표. rows는 머리줄을 포함한 칸 글자 그대로다.
23
+ * grid가 loose면 칸 경계를 잘못 읽었을 수 있어서 뷰어가 원문 크롭을 앞에 둔다
24
+ */
25
+ export declare const sourceTableSchema: z.ZodObject<{
26
+ id: z.ZodString;
27
+ number: z.ZodString;
28
+ caption: z.ZodString;
29
+ page: z.ZodOptional<z.ZodNumber>;
30
+ bbox: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
31
+ rows: z.ZodArray<z.ZodArray<z.ZodString, "many">, "many">;
32
+ grid: z.ZodDefault<z.ZodEnum<["ok", "loose"]>>;
33
+ image: z.ZodOptional<z.ZodString>;
34
+ /** 캡션 문단 번호. 표를 출처로 걸 때 이 문단을 가리킨다 */
35
+ unit: z.ZodNumber;
36
+ }, "strip", z.ZodTypeAny, {
37
+ number: string;
38
+ id: string;
39
+ unit: number;
40
+ rows: string[][];
41
+ caption: string;
42
+ grid: "ok" | "loose";
43
+ page?: number | undefined;
44
+ image?: string | undefined;
45
+ bbox?: [number, number, number, number] | undefined;
46
+ }, {
47
+ number: string;
48
+ id: string;
49
+ unit: number;
50
+ rows: string[][];
51
+ caption: string;
52
+ page?: number | undefined;
53
+ image?: string | undefined;
54
+ bbox?: [number, number, number, number] | undefined;
55
+ grid?: "ok" | "loose" | undefined;
56
+ }>;
57
+ export declare const sourceFigureSchema: z.ZodObject<{
58
+ id: z.ZodString;
59
+ number: z.ZodString;
60
+ caption: z.ZodString;
61
+ page: z.ZodOptional<z.ZodNumber>;
62
+ bbox: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
63
+ image: z.ZodOptional<z.ZodString>;
64
+ unit: z.ZodNumber;
65
+ /** 원문 그림 안의 장면 수. 세션이 크롭을 보고 `gestalt lens panels`로 적는다. C 재구성의 칸 수 상한이다 */
66
+ panels: z.ZodOptional<z.ZodNumber>;
67
+ }, "strip", z.ZodTypeAny, {
68
+ number: string;
69
+ id: string;
70
+ unit: number;
71
+ caption: string;
72
+ page?: number | undefined;
73
+ image?: string | undefined;
74
+ bbox?: [number, number, number, number] | undefined;
75
+ panels?: number | undefined;
76
+ }, {
77
+ number: string;
78
+ id: string;
79
+ unit: number;
80
+ caption: string;
81
+ page?: number | undefined;
82
+ image?: string | undefined;
83
+ bbox?: [number, number, number, number] | undefined;
84
+ panels?: number | undefined;
85
+ }>;
86
+ export declare const lensSourceSchema: z.ZodObject<{
87
+ schemaVersion: z.ZodDefault<z.ZodString>;
88
+ slug: z.ZodString;
89
+ kind: z.ZodEnum<["pdf", "web", "podcast"]>;
90
+ pages: z.ZodDefault<z.ZodArray<z.ZodObject<{
91
+ n: z.ZodNumber;
92
+ width: z.ZodNumber;
93
+ height: z.ZodNumber;
94
+ image: z.ZodString;
95
+ }, "strip", z.ZodTypeAny, {
96
+ width: number;
97
+ height: number;
98
+ n: number;
99
+ image: string;
100
+ }, {
101
+ width: number;
102
+ height: number;
103
+ n: number;
104
+ image: string;
105
+ }>, "many">>;
106
+ tables: z.ZodDefault<z.ZodArray<z.ZodObject<{
107
+ id: z.ZodString;
108
+ number: z.ZodString;
109
+ caption: z.ZodString;
110
+ page: z.ZodOptional<z.ZodNumber>;
111
+ bbox: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
112
+ rows: z.ZodArray<z.ZodArray<z.ZodString, "many">, "many">;
113
+ grid: z.ZodDefault<z.ZodEnum<["ok", "loose"]>>;
114
+ image: z.ZodOptional<z.ZodString>;
115
+ /** 캡션 문단 번호. 표를 출처로 걸 때 이 문단을 가리킨다 */
116
+ unit: z.ZodNumber;
117
+ }, "strip", z.ZodTypeAny, {
118
+ number: string;
119
+ id: string;
120
+ unit: number;
121
+ rows: string[][];
122
+ caption: string;
123
+ grid: "ok" | "loose";
124
+ page?: number | undefined;
125
+ image?: string | undefined;
126
+ bbox?: [number, number, number, number] | undefined;
127
+ }, {
128
+ number: string;
129
+ id: string;
130
+ unit: number;
131
+ rows: string[][];
132
+ caption: string;
133
+ page?: number | undefined;
134
+ image?: string | undefined;
135
+ bbox?: [number, number, number, number] | undefined;
136
+ grid?: "ok" | "loose" | undefined;
137
+ }>, "many">>;
138
+ figures: z.ZodDefault<z.ZodArray<z.ZodObject<{
139
+ id: z.ZodString;
140
+ number: z.ZodString;
141
+ caption: z.ZodString;
142
+ page: z.ZodOptional<z.ZodNumber>;
143
+ bbox: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
144
+ image: z.ZodOptional<z.ZodString>;
145
+ unit: z.ZodNumber;
146
+ /** 원문 그림 안의 장면 수. 세션이 크롭을 보고 `gestalt lens panels`로 적는다. C 재구성의 칸 수 상한이다 */
147
+ panels: z.ZodOptional<z.ZodNumber>;
148
+ }, "strip", z.ZodTypeAny, {
149
+ number: string;
150
+ id: string;
151
+ unit: number;
152
+ caption: string;
153
+ page?: number | undefined;
154
+ image?: string | undefined;
155
+ bbox?: [number, number, number, number] | undefined;
156
+ panels?: number | undefined;
157
+ }, {
158
+ number: string;
159
+ id: string;
160
+ unit: number;
161
+ caption: string;
162
+ page?: number | undefined;
163
+ image?: string | undefined;
164
+ bbox?: [number, number, number, number] | undefined;
165
+ panels?: number | undefined;
166
+ }>, "many">>;
167
+ }, "strip", z.ZodTypeAny, {
168
+ kind: "web" | "pdf" | "podcast";
169
+ slug: string;
170
+ tables: {
171
+ number: string;
172
+ id: string;
173
+ unit: number;
174
+ rows: string[][];
175
+ caption: string;
176
+ grid: "ok" | "loose";
177
+ page?: number | undefined;
178
+ image?: string | undefined;
179
+ bbox?: [number, number, number, number] | undefined;
180
+ }[];
181
+ schemaVersion: string;
182
+ figures: {
183
+ number: string;
184
+ id: string;
185
+ unit: number;
186
+ caption: string;
187
+ page?: number | undefined;
188
+ image?: string | undefined;
189
+ bbox?: [number, number, number, number] | undefined;
190
+ panels?: number | undefined;
191
+ }[];
192
+ pages: {
193
+ width: number;
194
+ height: number;
195
+ n: number;
196
+ image: string;
197
+ }[];
198
+ }, {
199
+ kind: "web" | "pdf" | "podcast";
200
+ slug: string;
201
+ tables?: {
202
+ number: string;
203
+ id: string;
204
+ unit: number;
205
+ rows: string[][];
206
+ caption: string;
207
+ page?: number | undefined;
208
+ image?: string | undefined;
209
+ bbox?: [number, number, number, number] | undefined;
210
+ grid?: "ok" | "loose" | undefined;
211
+ }[] | undefined;
212
+ schemaVersion?: string | undefined;
213
+ figures?: {
214
+ number: string;
215
+ id: string;
216
+ unit: number;
217
+ caption: string;
218
+ page?: number | undefined;
219
+ image?: string | undefined;
220
+ bbox?: [number, number, number, number] | undefined;
221
+ panels?: number | undefined;
222
+ }[] | undefined;
223
+ pages?: {
224
+ width: number;
225
+ height: number;
226
+ n: number;
227
+ image: string;
228
+ }[] | undefined;
229
+ }>;
230
+ export type SourcePage = z.infer<typeof sourcePageSchema>;
231
+ export type SourceTable = z.infer<typeof sourceTableSchema>;
232
+ export type SourceFigure = z.infer<typeof sourceFigureSchema>;
233
+ export type LensSource = z.infer<typeof lensSourceSchema>;
234
+ export declare function lensSourcePath(store: DigestStore, slug: string): string;
235
+ export type LensSourceRead = {
236
+ kind: 'missing';
237
+ } | {
238
+ kind: 'invalid';
239
+ message: string;
240
+ } | {
241
+ kind: 'ok';
242
+ source: LensSource;
243
+ };
244
+ /** 없음과 형식 오류를 가른다. 손상된 파일에 ingest를 다시 돌리라고 안내하면 원인을 잘못 가리킨다 */
245
+ export declare function readLensSourceResult(store: DigestStore, slug: string): LensSourceRead;
246
+ /** lint 옵션에 그대로 펼쳐 넣는 꼴. source가 null일 때 lint가 없음과 형식 오류를 갈라 안내한다 */
247
+ export declare function lensSourceForLint(store: DigestStore, slug: string): {
248
+ source: LensSource | null;
249
+ sourceProblem?: 'missing' | 'invalid';
250
+ };
251
+ /** 없거나 형식이 틀리면 null. lint는 null이면 표와 그림 출처를 하나도 받지 않는다 */
252
+ export declare function readLensSource(store: DigestStore, slug: string): LensSource | null;
253
+ /** 칸 글자에서 숫자 하나를 읽는다. 천 단위 쉼표는 지운다. 숫자가 아니거나 둘 이상이면 null */
254
+ export declare function cellNumber(text: string): number | null;
255
+ export declare function tableCell(source: LensSource, ref: {
256
+ table: string;
257
+ row: number;
258
+ col: number;
259
+ }): string | undefined;
260
+ //# sourceMappingURL=lens-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lens-source.d.ts","sourceRoot":"","sources":["../../../src/digest/lens-source.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEvD,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,0BAA0B,UAAU,CAAC;AAMlD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;EAK3B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;IAS5B,sCAAsC;;;;;;;;;;;;;;;;;;;;;;EAEtC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;IAQ7B,4EAA4E;;;;;;;;;;;;;;;;;;;;EAE5E,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAhB3B,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAYtC,4EAA4E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW5E,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAEvC,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc,CAarF;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,GACX;IAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAGtE;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAGlF;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC/C,MAAM,GAAG,SAAS,CAEpB"}
@@ -0,0 +1,92 @@
1
+ import { join } from 'node:path';
2
+ import { z } from 'zod';
3
+ import { idSchema, SLUG_PATTERN, textSchema } from './schema-base.js';
4
+ import { LENS_SOURCES } from './schema.js';
5
+ import { readRaw } from './store.js';
6
+ export const LENS_SOURCE_FILE = 'source.json';
7
+ export const LENS_SOURCE_SCHEMA_VERSION = '1.0.0';
8
+ /** 뷰어가 상대 경로로 싣는다. 추출기가 쓰는 꼴만 받아서 폴더 밖이나 다른 확장자를 가리키지 못하게 한다 */
9
+ const assetPath = z.string().regex(/^(pages|figures|tables)\/[a-z0-9-]+\.(png|jpg)$/);
10
+ const bboxSchema = z.tuple([z.number(), z.number(), z.number(), z.number()]);
11
+ export const sourcePageSchema = z.object({
12
+ n: z.number().int().positive(),
13
+ width: z.number().positive(),
14
+ height: z.number().positive(),
15
+ image: assetPath,
16
+ });
17
+ /**
18
+ * 원문 표. rows는 머리줄을 포함한 칸 글자 그대로다.
19
+ * grid가 loose면 칸 경계를 잘못 읽었을 수 있어서 뷰어가 원문 크롭을 앞에 둔다
20
+ */
21
+ export const sourceTableSchema = z.object({
22
+ id: idSchema,
23
+ number: z.string().min(1),
24
+ caption: textSchema,
25
+ page: z.number().int().positive().optional(),
26
+ bbox: bboxSchema.optional(),
27
+ rows: z.array(z.array(z.string())).min(1),
28
+ grid: z.enum(['ok', 'loose']).default('ok'),
29
+ image: assetPath.optional(),
30
+ /** 캡션 문단 번호. 표를 출처로 걸 때 이 문단을 가리킨다 */
31
+ unit: z.number().int().nonnegative(),
32
+ });
33
+ export const sourceFigureSchema = z.object({
34
+ id: idSchema,
35
+ number: z.string().min(1),
36
+ caption: textSchema,
37
+ page: z.number().int().positive().optional(),
38
+ bbox: bboxSchema.optional(),
39
+ image: assetPath.optional(),
40
+ unit: z.number().int().nonnegative(),
41
+ /** 원문 그림 안의 장면 수. 세션이 크롭을 보고 `gestalt lens panels`로 적는다. C 재구성의 칸 수 상한이다 */
42
+ panels: z.number().int().min(1).max(12).optional(),
43
+ });
44
+ export const lensSourceSchema = z.object({
45
+ schemaVersion: z.string().default(LENS_SOURCE_SCHEMA_VERSION),
46
+ slug: z.string().regex(SLUG_PATTERN),
47
+ kind: z.enum(LENS_SOURCES),
48
+ pages: z.array(sourcePageSchema).default([]),
49
+ tables: z.array(sourceTableSchema).default([]),
50
+ figures: z.array(sourceFigureSchema).default([]),
51
+ });
52
+ export function lensSourcePath(store, slug) {
53
+ return join(store.dir(slug), LENS_SOURCE_FILE);
54
+ }
55
+ /** 없음과 형식 오류를 가른다. 손상된 파일에 ingest를 다시 돌리라고 안내하면 원인을 잘못 가리킨다 */
56
+ export function readLensSourceResult(store, slug) {
57
+ const raw = readRaw(lensSourcePath(store, slug));
58
+ if (raw.kind === 'missing')
59
+ return { kind: 'missing' };
60
+ if (raw.kind === 'invalid-json')
61
+ return { kind: 'invalid', message: raw.message };
62
+ const parsed = lensSourceSchema.safeParse(raw.value);
63
+ if (!parsed.success) {
64
+ const first = parsed.error.issues[0];
65
+ return {
66
+ kind: 'invalid',
67
+ message: first ? `${first.path.join('.') || '(root)'}: ${first.message}` : 'schema',
68
+ };
69
+ }
70
+ return { kind: 'ok', source: parsed.data };
71
+ }
72
+ /** lint 옵션에 그대로 펼쳐 넣는 꼴. source가 null일 때 lint가 없음과 형식 오류를 갈라 안내한다 */
73
+ export function lensSourceForLint(store, slug) {
74
+ const read = readLensSourceResult(store, slug);
75
+ return read.kind === 'ok' ? { source: read.source } : { source: null, sourceProblem: read.kind };
76
+ }
77
+ /** 없거나 형식이 틀리면 null. lint는 null이면 표와 그림 출처를 하나도 받지 않는다 */
78
+ export function readLensSource(store, slug) {
79
+ const read = readLensSourceResult(store, slug);
80
+ return read.kind === 'ok' ? read.source : null;
81
+ }
82
+ /** 칸 글자에서 숫자 하나를 읽는다. 천 단위 쉼표는 지운다. 숫자가 아니거나 둘 이상이면 null */
83
+ export function cellNumber(text) {
84
+ const t = text.trim().replace(/(?<=\d),(?=\d{3}\b)/g, '');
85
+ if (!/^[-+−]?\d+(?:\.\d+)?%?$/.test(t))
86
+ return null;
87
+ return Number(t.replace('−', '-').replace('%', ''));
88
+ }
89
+ export function tableCell(source, ref) {
90
+ return source.tables.find((t) => t.id === ref.table)?.rows[ref.row]?.[ref.col];
91
+ }
92
+ //# sourceMappingURL=lens-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lens-source.js","sourceRoot":"","sources":["../../../src/digest/lens-source.ts"],"names":[],"mappings":"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"}