@xom11/whiteboard 0.25.0 → 0.27.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 (93) hide show
  1. package/dist/{ExcalidrawWithMenus-WENZRYYE.mjs → ExcalidrawWithMenus-2QPPTXJM.mjs} +3 -2
  2. package/dist/ExcalidrawWithMenus-2QPPTXJM.mjs.map +1 -0
  3. package/dist/ai.d.mts +3035 -108
  4. package/dist/ai.d.ts +3035 -108
  5. package/dist/ai.js +6736 -775
  6. package/dist/ai.js.map +1 -1
  7. package/dist/ai.mjs +5110 -578
  8. package/dist/ai.mjs.map +1 -1
  9. package/dist/catalog.json +5 -5
  10. package/dist/{chunk-ESVPQWHX.mjs → chunk-4ETJ4CDY.mjs} +5 -5
  11. package/dist/{chunk-ESVPQWHX.mjs.map → chunk-4ETJ4CDY.mjs.map} +1 -1
  12. package/dist/{chunk-VNCCIV6O.mjs → chunk-AJAHD35N.mjs} +779 -9
  13. package/dist/chunk-AJAHD35N.mjs.map +1 -0
  14. package/dist/chunk-AYJPOHCI.mjs +265 -0
  15. package/dist/chunk-AYJPOHCI.mjs.map +1 -0
  16. package/dist/{chunk-M42TGYT6.mjs → chunk-BNBOIDO5.mjs} +3 -3
  17. package/dist/{chunk-M42TGYT6.mjs.map → chunk-BNBOIDO5.mjs.map} +1 -1
  18. package/dist/{chunk-CJBLJUWG.mjs → chunk-CXHNVYMD.mjs} +4 -4
  19. package/dist/{chunk-CJBLJUWG.mjs.map → chunk-CXHNVYMD.mjs.map} +1 -1
  20. package/dist/{chunk-NDEZJKNY.mjs → chunk-D5JLJ3PT.mjs} +4 -4
  21. package/dist/{chunk-NDEZJKNY.mjs.map → chunk-D5JLJ3PT.mjs.map} +1 -1
  22. package/dist/{chunk-REIJZDVZ.mjs → chunk-D5LWSN2Y.mjs} +942 -195
  23. package/dist/chunk-D5LWSN2Y.mjs.map +1 -0
  24. package/dist/{chunk-I24QOHPU.mjs → chunk-HLAOGXEK.mjs} +3 -3
  25. package/dist/{chunk-I24QOHPU.mjs.map → chunk-HLAOGXEK.mjs.map} +1 -1
  26. package/dist/{chunk-TB4CL25L.mjs → chunk-I3L56GVH.mjs} +206 -66
  27. package/dist/chunk-I3L56GVH.mjs.map +1 -0
  28. package/dist/chunk-J5LGTIGS.mjs +10 -0
  29. package/dist/chunk-J5LGTIGS.mjs.map +1 -0
  30. package/dist/{chunk-ONBCUWVI.mjs → chunk-KYMBUTPO.mjs} +3 -3
  31. package/dist/{chunk-ONBCUWVI.mjs.map → chunk-KYMBUTPO.mjs.map} +1 -1
  32. package/dist/{chunk-YSJOVBCD.mjs → chunk-KZGPSTZI.mjs} +4 -4
  33. package/dist/{chunk-YSJOVBCD.mjs.map → chunk-KZGPSTZI.mjs.map} +1 -1
  34. package/dist/{chunk-SGFJLHHG.mjs → chunk-PPKHCRRE.mjs} +3 -3
  35. package/dist/{chunk-SGFJLHHG.mjs.map → chunk-PPKHCRRE.mjs.map} +1 -1
  36. package/dist/{chunk-AYSFWUPK.mjs → chunk-SZDAS7LK.mjs} +79 -2
  37. package/dist/chunk-SZDAS7LK.mjs.map +1 -0
  38. package/dist/chunk-T3SOHYB2.mjs +851 -0
  39. package/dist/chunk-T3SOHYB2.mjs.map +1 -0
  40. package/dist/geometry-2d.d.mts +1 -1
  41. package/dist/geometry-2d.d.ts +1 -1
  42. package/dist/geometry-2d.js +5389 -1362
  43. package/dist/geometry-2d.js.map +1 -1
  44. package/dist/geometry-2d.mjs +5 -4
  45. package/dist/geometry-3d.d.mts +1 -1
  46. package/dist/geometry-3d.d.ts +1 -1
  47. package/dist/geometry-3d.js +1333 -251
  48. package/dist/geometry-3d.js.map +1 -1
  49. package/dist/geometry-3d.mjs +4 -3
  50. package/dist/graph-2d.d.mts +1 -1
  51. package/dist/graph-2d.d.ts +1 -1
  52. package/dist/graph-2d.js +1499 -340
  53. package/dist/graph-2d.js.map +1 -1
  54. package/dist/graph-2d.mjs +7 -6
  55. package/dist/handleExtractProblem-C-U5KluK.d.mts +158 -0
  56. package/dist/handleExtractProblem-C-U5KluK.d.ts +158 -0
  57. package/dist/{host-L7FMFZUW.mjs → host-HAYCJJ2T.mjs} +1258 -441
  58. package/dist/host-HAYCJJ2T.mjs.map +1 -0
  59. package/dist/{host-QK53UYMD.mjs → host-LTJHAY5A.mjs} +10 -9
  60. package/dist/host-LTJHAY5A.mjs.map +1 -0
  61. package/dist/{host-A64ITWVX.mjs → host-M26FS244.mjs} +6 -5
  62. package/dist/host-M26FS244.mjs.map +1 -0
  63. package/dist/{host-QS2EOTRJ.mjs → host-ZQCDAT6O.mjs} +3 -2
  64. package/dist/host-ZQCDAT6O.mjs.map +1 -0
  65. package/dist/index.d.mts +3 -2
  66. package/dist/index.d.ts +3 -2
  67. package/dist/index.js +5621 -1590
  68. package/dist/index.js.map +1 -1
  69. package/dist/index.mjs +22 -20
  70. package/dist/index.mjs.map +1 -1
  71. package/dist/latex.d.mts +1 -1
  72. package/dist/latex.d.ts +1 -1
  73. package/dist/latex.mjs +2 -1
  74. package/dist/render-ZX2O2IK7.mjs +10 -0
  75. package/dist/{render-3WTY7NZB.mjs.map → render-ZX2O2IK7.mjs.map} +1 -1
  76. package/dist/serialize-C3LSUMSA.mjs +9 -0
  77. package/dist/{serialize-SRJVKYUG.mjs.map → serialize-C3LSUMSA.mjs.map} +1 -1
  78. package/dist/{types-DWRyCa2m.d.ts → types-zc_Pa0mp.d.mts} +105 -0
  79. package/dist/{types-DWRyCa2m.d.mts → types-zc_Pa0mp.d.ts} +105 -0
  80. package/package.json +10 -1
  81. package/dist/ExcalidrawWithMenus-WENZRYYE.mjs.map +0 -1
  82. package/dist/chunk-AYSFWUPK.mjs.map +0 -1
  83. package/dist/chunk-REIJZDVZ.mjs.map +0 -1
  84. package/dist/chunk-TB4CL25L.mjs.map +0 -1
  85. package/dist/chunk-VNCCIV6O.mjs.map +0 -1
  86. package/dist/chunk-VRHWDZ66.mjs +0 -96
  87. package/dist/chunk-VRHWDZ66.mjs.map +0 -1
  88. package/dist/host-A64ITWVX.mjs.map +0 -1
  89. package/dist/host-L7FMFZUW.mjs.map +0 -1
  90. package/dist/host-QK53UYMD.mjs.map +0 -1
  91. package/dist/host-QS2EOTRJ.mjs.map +0 -1
  92. package/dist/render-3WTY7NZB.mjs +0 -9
  93. package/dist/serialize-SRJVKYUG.mjs +0 -8
package/dist/graph-2d.mjs CHANGED
@@ -1,15 +1,16 @@
1
1
  "use client";
2
- export { graph2dStamp } from './chunk-ESVPQWHX.mjs';
3
- import './chunk-CJBLJUWG.mjs';
2
+ export { graph2dStamp } from './chunk-4ETJ4CDY.mjs';
3
+ import './chunk-CXHNVYMD.mjs';
4
4
  import './chunk-O4WIZFRQ.mjs';
5
- import './chunk-M42TGYT6.mjs';
6
- import './chunk-I24QOHPU.mjs';
7
- import './chunk-AYSFWUPK.mjs';
5
+ import './chunk-BNBOIDO5.mjs';
6
+ import './chunk-HLAOGXEK.mjs';
7
+ import './chunk-SZDAS7LK.mjs';
8
8
  import './chunk-ICR4CVOE.mjs';
9
- import './chunk-REIJZDVZ.mjs';
9
+ import './chunk-D5LWSN2Y.mjs';
10
10
  import './chunk-IHUFOV7L.mjs';
11
11
  import './chunk-73Q7ADVL.mjs';
12
12
  import './chunk-B4NJJZFR.mjs';
13
13
  import './chunk-5UTGXHLJ.mjs';
14
+ import './chunk-J5LGTIGS.mjs';
14
15
  //# sourceMappingURL=graph-2d.mjs.map
15
16
  //# sourceMappingURL=graph-2d.mjs.map
@@ -0,0 +1,158 @@
1
+ interface ProviderTokenUsage {
2
+ inputTokens: number;
3
+ outputTokens: number;
4
+ /** Anthropic prompt caching — local provider để 0. */
5
+ cacheReadTokens?: number;
6
+ /** Anthropic prompt caching — local provider để 0. */
7
+ cacheCreationTokens?: number;
8
+ }
9
+ interface ProviderRequest {
10
+ systemPrompt: string;
11
+ userPrompt: string;
12
+ /**
13
+ * JSON Schema mà provider phải honor để constrain output. Anthropic → wrap
14
+ * thành tool input_schema. Ollama → pass thẳng vào `format` (v0.5+).
15
+ */
16
+ schema: Record<string, unknown>;
17
+ /** Provider-specific model id (vd "gemma3:4b", "claude-opus-4-7"). */
18
+ model: string;
19
+ /** Token cap cho response. */
20
+ maxTokens: number;
21
+ signal?: AbortSignal;
22
+ /**
23
+ * Optional callback nhận text chunk khi provider stream incremental output.
24
+ * Provider không stream được (Anthropic tool_use, Claude CLI) → không gọi.
25
+ * Caller dùng để cập nhật UI progress (token count).
26
+ */
27
+ onToken?: (chunk: string) => void;
28
+ }
29
+ type ProviderOutput = {
30
+ kind: 'json';
31
+ data: unknown;
32
+ usage?: ProviderTokenUsage;
33
+ } | {
34
+ kind: 'error';
35
+ message: string;
36
+ status?: number;
37
+ };
38
+ interface AIProvider {
39
+ /** Tên định danh ("anthropic", "ollama", ...). */
40
+ readonly name: string;
41
+ /** Default model id khi caller không truyền. */
42
+ readonly defaultModel: string;
43
+ call(req: ProviderRequest): Promise<ProviderOutput>;
44
+ /**
45
+ * Optional vision capability. Provider không impl → caller check undefined
46
+ * trước khi gọi (façade trả error code='unsupported').
47
+ */
48
+ extractText?(req: VisionRequest): Promise<ProviderOutput>;
49
+ }
50
+ interface ImagePart {
51
+ /** Whitelist 3 format browser decode native được. */
52
+ mediaType: 'image/png' | 'image/jpeg' | 'image/webp';
53
+ /** Base64 không bao gồm "data:image/...;base64," prefix. */
54
+ base64: string;
55
+ }
56
+ interface VisionRequest {
57
+ systemPrompt: string;
58
+ userPrompt: string;
59
+ /** JSON Schema constraint output. */
60
+ schema: Record<string, unknown>;
61
+ /** v1 luôn length 1; array để forward-compat multi-image. */
62
+ images: ImagePart[];
63
+ /** Optional override; nếu omit, provider tự chọn vision-capable default. */
64
+ model?: string;
65
+ maxTokens: number;
66
+ signal?: AbortSignal;
67
+ }
68
+
69
+ interface SelectProviderOptions {
70
+ /** Provider instance dùng trực tiếp (override mọi env). */
71
+ provider?: AIProvider;
72
+ /** Anthropic API key. Khi truyền → auto chọn AnthropicProvider. */
73
+ apiKey?: string;
74
+ /** Anthropic prompt-caching, default true (chỉ áp dụng provider Anthropic). */
75
+ enableCaching?: boolean;
76
+ /** Ollama endpoint override. */
77
+ ollamaBaseUrl?: string;
78
+ /** Ollama model override (vd "gemma3:1b"). */
79
+ ollamaDefaultModel?: string;
80
+ /** Claude CLI binary path override (default 'claude'). */
81
+ claudeCliBin?: string;
82
+ /** Claude CLI default model override. */
83
+ claudeCliDefaultModel?: string;
84
+ /** Claude CLI max budget USD per call override. */
85
+ claudeCliMaxBudgetUsd?: number;
86
+ /** Claude Agent SDK OAuth token (subscription path). Fallback env CLAUDE_CODE_OAUTH_TOKEN. */
87
+ claudeAgentSdkOauthToken?: string;
88
+ /** Claude Agent SDK default model. */
89
+ claudeAgentSdkDefaultModel?: string;
90
+ /** Test env: env vars getter (default process.env). */
91
+ env?: Record<string, string | undefined>;
92
+ }
93
+ declare function selectProvider(opts?: SelectProviderOptions): AIProvider;
94
+
95
+ type VisionEngine = 'tesseract' | 'llm';
96
+ interface ExtractProblemOptions extends SelectProviderOptions {
97
+ /** OCR engine. Default 'tesseract' (client-side, không cần network). */
98
+ engine?: VisionEngine;
99
+ /** Tesseract language (chỉ áp dụng khi engine='tesseract'). Default 'vie+eng'. */
100
+ tesseractLang?: string;
101
+ /** Override model OCR cho LLM path. Priority cao hơn env. */
102
+ visionModel?: string;
103
+ /** Max tokens cho LLM response. Default 1024. */
104
+ maxTokens?: number;
105
+ /** Env getter override (cho test). */
106
+ env?: Record<string, string | undefined>;
107
+ signal?: AbortSignal;
108
+ }
109
+ interface ExtractProblemSuccess {
110
+ ok: true;
111
+ text: string;
112
+ confidence: 'high' | 'low';
113
+ usage: {
114
+ inputTokens: number;
115
+ outputTokens: number;
116
+ };
117
+ }
118
+ interface ExtractProblemFailure {
119
+ ok: false;
120
+ reason: 'not-math' | 'unreadable' | 'empty' | 'unsupported';
121
+ message: string;
122
+ }
123
+ type ExtractProblemOutcome = ExtractProblemSuccess | ExtractProblemFailure;
124
+ /** Pick vision model theo priority: opts → env → provider.defaultModel. */
125
+ declare function pickVisionModel(providerDefault: string, opts: {
126
+ visionModel?: string;
127
+ }, env: Record<string, string | undefined>): string;
128
+ declare function extractProblemFromImage(image: ImagePart, opts?: ExtractProblemOptions): Promise<ExtractProblemOutcome>;
129
+
130
+ interface HandleExtractProblemOptions extends ExtractProblemOptions {
131
+ }
132
+ type ExtractUiResult = {
133
+ kind: 'success';
134
+ text: string;
135
+ usage: {
136
+ inputTokens: number;
137
+ outputTokens: number;
138
+ };
139
+ } | {
140
+ kind: 'low-confidence';
141
+ text: string;
142
+ warning: string;
143
+ usage: {
144
+ inputTokens: number;
145
+ outputTokens: number;
146
+ };
147
+ } | {
148
+ kind: 'refused';
149
+ reason: 'not-math';
150
+ message: string;
151
+ } | {
152
+ kind: 'error';
153
+ code: 'network' | 'unsupported' | 'unexpected' | 'empty';
154
+ message: string;
155
+ };
156
+ declare function handleExtractProblem(image: ImagePart, opts?: HandleExtractProblemOptions): Promise<ExtractUiResult>;
157
+
158
+ export { type AIProvider as A, type ExtractUiResult as E, type HandleExtractProblemOptions as H, type ImagePart as I, type ProviderRequest as P, type SelectProviderOptions as S, type VisionRequest as V, type ProviderOutput as a, type ExtractProblemFailure as b, type ExtractProblemOptions as c, type ExtractProblemOutcome as d, type ExtractProblemSuccess as e, type ProviderTokenUsage as f, extractProblemFromImage as g, handleExtractProblem as h, pickVisionModel as p, selectProvider as s };
@@ -0,0 +1,158 @@
1
+ interface ProviderTokenUsage {
2
+ inputTokens: number;
3
+ outputTokens: number;
4
+ /** Anthropic prompt caching — local provider để 0. */
5
+ cacheReadTokens?: number;
6
+ /** Anthropic prompt caching — local provider để 0. */
7
+ cacheCreationTokens?: number;
8
+ }
9
+ interface ProviderRequest {
10
+ systemPrompt: string;
11
+ userPrompt: string;
12
+ /**
13
+ * JSON Schema mà provider phải honor để constrain output. Anthropic → wrap
14
+ * thành tool input_schema. Ollama → pass thẳng vào `format` (v0.5+).
15
+ */
16
+ schema: Record<string, unknown>;
17
+ /** Provider-specific model id (vd "gemma3:4b", "claude-opus-4-7"). */
18
+ model: string;
19
+ /** Token cap cho response. */
20
+ maxTokens: number;
21
+ signal?: AbortSignal;
22
+ /**
23
+ * Optional callback nhận text chunk khi provider stream incremental output.
24
+ * Provider không stream được (Anthropic tool_use, Claude CLI) → không gọi.
25
+ * Caller dùng để cập nhật UI progress (token count).
26
+ */
27
+ onToken?: (chunk: string) => void;
28
+ }
29
+ type ProviderOutput = {
30
+ kind: 'json';
31
+ data: unknown;
32
+ usage?: ProviderTokenUsage;
33
+ } | {
34
+ kind: 'error';
35
+ message: string;
36
+ status?: number;
37
+ };
38
+ interface AIProvider {
39
+ /** Tên định danh ("anthropic", "ollama", ...). */
40
+ readonly name: string;
41
+ /** Default model id khi caller không truyền. */
42
+ readonly defaultModel: string;
43
+ call(req: ProviderRequest): Promise<ProviderOutput>;
44
+ /**
45
+ * Optional vision capability. Provider không impl → caller check undefined
46
+ * trước khi gọi (façade trả error code='unsupported').
47
+ */
48
+ extractText?(req: VisionRequest): Promise<ProviderOutput>;
49
+ }
50
+ interface ImagePart {
51
+ /** Whitelist 3 format browser decode native được. */
52
+ mediaType: 'image/png' | 'image/jpeg' | 'image/webp';
53
+ /** Base64 không bao gồm "data:image/...;base64," prefix. */
54
+ base64: string;
55
+ }
56
+ interface VisionRequest {
57
+ systemPrompt: string;
58
+ userPrompt: string;
59
+ /** JSON Schema constraint output. */
60
+ schema: Record<string, unknown>;
61
+ /** v1 luôn length 1; array để forward-compat multi-image. */
62
+ images: ImagePart[];
63
+ /** Optional override; nếu omit, provider tự chọn vision-capable default. */
64
+ model?: string;
65
+ maxTokens: number;
66
+ signal?: AbortSignal;
67
+ }
68
+
69
+ interface SelectProviderOptions {
70
+ /** Provider instance dùng trực tiếp (override mọi env). */
71
+ provider?: AIProvider;
72
+ /** Anthropic API key. Khi truyền → auto chọn AnthropicProvider. */
73
+ apiKey?: string;
74
+ /** Anthropic prompt-caching, default true (chỉ áp dụng provider Anthropic). */
75
+ enableCaching?: boolean;
76
+ /** Ollama endpoint override. */
77
+ ollamaBaseUrl?: string;
78
+ /** Ollama model override (vd "gemma3:1b"). */
79
+ ollamaDefaultModel?: string;
80
+ /** Claude CLI binary path override (default 'claude'). */
81
+ claudeCliBin?: string;
82
+ /** Claude CLI default model override. */
83
+ claudeCliDefaultModel?: string;
84
+ /** Claude CLI max budget USD per call override. */
85
+ claudeCliMaxBudgetUsd?: number;
86
+ /** Claude Agent SDK OAuth token (subscription path). Fallback env CLAUDE_CODE_OAUTH_TOKEN. */
87
+ claudeAgentSdkOauthToken?: string;
88
+ /** Claude Agent SDK default model. */
89
+ claudeAgentSdkDefaultModel?: string;
90
+ /** Test env: env vars getter (default process.env). */
91
+ env?: Record<string, string | undefined>;
92
+ }
93
+ declare function selectProvider(opts?: SelectProviderOptions): AIProvider;
94
+
95
+ type VisionEngine = 'tesseract' | 'llm';
96
+ interface ExtractProblemOptions extends SelectProviderOptions {
97
+ /** OCR engine. Default 'tesseract' (client-side, không cần network). */
98
+ engine?: VisionEngine;
99
+ /** Tesseract language (chỉ áp dụng khi engine='tesseract'). Default 'vie+eng'. */
100
+ tesseractLang?: string;
101
+ /** Override model OCR cho LLM path. Priority cao hơn env. */
102
+ visionModel?: string;
103
+ /** Max tokens cho LLM response. Default 1024. */
104
+ maxTokens?: number;
105
+ /** Env getter override (cho test). */
106
+ env?: Record<string, string | undefined>;
107
+ signal?: AbortSignal;
108
+ }
109
+ interface ExtractProblemSuccess {
110
+ ok: true;
111
+ text: string;
112
+ confidence: 'high' | 'low';
113
+ usage: {
114
+ inputTokens: number;
115
+ outputTokens: number;
116
+ };
117
+ }
118
+ interface ExtractProblemFailure {
119
+ ok: false;
120
+ reason: 'not-math' | 'unreadable' | 'empty' | 'unsupported';
121
+ message: string;
122
+ }
123
+ type ExtractProblemOutcome = ExtractProblemSuccess | ExtractProblemFailure;
124
+ /** Pick vision model theo priority: opts → env → provider.defaultModel. */
125
+ declare function pickVisionModel(providerDefault: string, opts: {
126
+ visionModel?: string;
127
+ }, env: Record<string, string | undefined>): string;
128
+ declare function extractProblemFromImage(image: ImagePart, opts?: ExtractProblemOptions): Promise<ExtractProblemOutcome>;
129
+
130
+ interface HandleExtractProblemOptions extends ExtractProblemOptions {
131
+ }
132
+ type ExtractUiResult = {
133
+ kind: 'success';
134
+ text: string;
135
+ usage: {
136
+ inputTokens: number;
137
+ outputTokens: number;
138
+ };
139
+ } | {
140
+ kind: 'low-confidence';
141
+ text: string;
142
+ warning: string;
143
+ usage: {
144
+ inputTokens: number;
145
+ outputTokens: number;
146
+ };
147
+ } | {
148
+ kind: 'refused';
149
+ reason: 'not-math';
150
+ message: string;
151
+ } | {
152
+ kind: 'error';
153
+ code: 'network' | 'unsupported' | 'unexpected' | 'empty';
154
+ message: string;
155
+ };
156
+ declare function handleExtractProblem(image: ImagePart, opts?: HandleExtractProblemOptions): Promise<ExtractUiResult>;
157
+
158
+ export { type AIProvider as A, type ExtractUiResult as E, type HandleExtractProblemOptions as H, type ImagePart as I, type ProviderRequest as P, type SelectProviderOptions as S, type VisionRequest as V, type ProviderOutput as a, type ExtractProblemFailure as b, type ExtractProblemOptions as c, type ExtractProblemOutcome as d, type ExtractProblemSuccess as e, type ProviderTokenUsage as f, extractProblemFromImage as g, handleExtractProblem as h, pickVisionModel as p, selectProvider as s };