anniedrawing 0.3.1

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 (97) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE +292 -0
  4. package/README.md +162 -0
  5. package/dist/agent/describe.d.ts +12 -0
  6. package/dist/agent/index.d.ts +10 -0
  7. package/dist/agent/index.js +2 -0
  8. package/dist/agent/index.js.map +1 -0
  9. package/dist/agent/place.d.ts +4 -0
  10. package/dist/agent/query.d.ts +3 -0
  11. package/dist/agent/toolDefs.d.ts +343 -0
  12. package/dist/board.d.ts +193 -0
  13. package/dist/core/catalog.d.ts +22 -0
  14. package/dist/core/clipboard.d.ts +2 -0
  15. package/dist/core/defaults.d.ts +19 -0
  16. package/dist/core/doc.d.ts +2 -0
  17. package/dist/core/ids.d.ts +5 -0
  18. package/dist/core/index.d.ts +16 -0
  19. package/dist/core/index.js +1 -0
  20. package/dist/core/item.d.ts +25 -0
  21. package/dist/core/links.d.ts +21 -0
  22. package/dist/core/locks.d.ts +3 -0
  23. package/dist/core/migrate.d.ts +5 -0
  24. package/dist/core/paste.d.ts +27 -0
  25. package/dist/core/schema.d.ts +644 -0
  26. package/dist/core/types.d.ts +313 -0
  27. package/dist/docs/agents-repository.md +56 -0
  28. package/dist/docs/agents.md +157 -0
  29. package/dist/docs/api.md +258 -0
  30. package/dist/docs/board-js.md +345 -0
  31. package/dist/docs/code-of-conduct.md +11 -0
  32. package/dist/docs/contributing.md +35 -0
  33. package/dist/docs/decisions.md +107 -0
  34. package/dist/docs/extensions.md +122 -0
  35. package/dist/docs/format.md +79 -0
  36. package/dist/docs/index.html +993 -0
  37. package/dist/docs/license.txt +21 -0
  38. package/dist/docs/llms-full.txt +345 -0
  39. package/dist/docs/llms.txt +90 -0
  40. package/dist/docs/mcp.md +97 -0
  41. package/dist/docs/notice.txt +292 -0
  42. package/dist/docs/nunito-OFL.txt +93 -0
  43. package/dist/docs/releasing.md +38 -0
  44. package/dist/docs/security.md +33 -0
  45. package/dist/favicon.svg +1 -0
  46. package/dist/fellow.d.ts +7 -0
  47. package/dist/fellow.js +2 -0
  48. package/dist/fellow.js.map +1 -0
  49. package/dist/geo/box.d.ts +13 -0
  50. package/dist/geo/index.d.ts +5 -0
  51. package/dist/geo/picker.d.ts +25 -0
  52. package/dist/geo/router.d.ts +11 -0
  53. package/dist/geo/vec.d.ts +8 -0
  54. package/dist/index.d.ts +7 -0
  55. package/dist/index.js +1 -0
  56. package/dist/input/autosave.d.ts +2 -0
  57. package/dist/input/cursors.d.ts +8 -0
  58. package/dist/input/measure.d.ts +6 -0
  59. package/dist/input/urlPaste.d.ts +18 -0
  60. package/dist/kinds/index.d.ts +2 -0
  61. package/dist/kinds/registry.d.ts +45 -0
  62. package/dist/porter/index.d.ts +5 -0
  63. package/dist/porter/indexedPng.d.ts +13 -0
  64. package/dist/porter/json.d.ts +3 -0
  65. package/dist/porter/png.d.ts +10 -0
  66. package/dist/porter/svg.d.ts +9 -0
  67. package/dist/shared/board-Bya0O1I7.js +2 -0
  68. package/dist/shared/board-Bya0O1I7.js.map +1 -0
  69. package/dist/shared/cards-DWgSVE54.js +2 -0
  70. package/dist/shared/cards-DWgSVE54.js.map +1 -0
  71. package/dist/shared/defaults-C-aC_B4z.js +2 -0
  72. package/dist/shared/defaults-C-aC_B4z.js.map +1 -0
  73. package/dist/shared/describe-DaWyf3qV.js +3 -0
  74. package/dist/shared/describe-DaWyf3qV.js.map +1 -0
  75. package/dist/shared/paste-C22i8o-g.js +2 -0
  76. package/dist/shared/paste-C22i8o-g.js.map +1 -0
  77. package/dist/shared/picker-Dv_i4iNP.js +2 -0
  78. package/dist/shared/picker-Dv_i4iNP.js.map +1 -0
  79. package/dist/shared/ui-Cay6AVqT.js +2 -0
  80. package/dist/shared/ui-Cay6AVqT.js.map +1 -0
  81. package/dist/shared/urlPaste-DN4JtgeB.js +2 -0
  82. package/dist/shared/urlPaste-DN4JtgeB.js.map +1 -0
  83. package/dist/stage/cards.d.ts +2 -0
  84. package/dist/stage/index.d.ts +3 -0
  85. package/dist/stage/itemView.d.ts +22 -0
  86. package/dist/stage/lens.d.ts +26 -0
  87. package/dist/stage/paint.d.ts +23 -0
  88. package/dist/stage/presence.d.ts +50 -0
  89. package/dist/stage/stage.d.ts +60 -0
  90. package/dist/style.css +2 -0
  91. package/dist/ui/icons.d.ts +2 -0
  92. package/dist/ui/index.d.ts +16 -0
  93. package/dist/ui/index.js +1 -0
  94. package/dist/ui/version.d.ts +3 -0
  95. package/llms-full.txt +345 -0
  96. package/llms.txt +90 -0
  97. package/package.json +120 -0
@@ -0,0 +1,292 @@
1
+ AnnieDrawing
2
+ Copyright 2026 Frontierz and AnnieDrawing contributors. MIT licensed.
3
+ Frontierz. Originally developed by Pau Garcia-Mila.
4
+
5
+ Independent implementation
6
+ The application code, documentation, inline icons and sample diagrams were
7
+ created for AnnieDrawing from its own product requirements. No implementation
8
+ from another drawing editor is incorporated. The GitHub mark in the board menu
9
+ is a trademark of GitHub, Inc., used only as a link to this project's
10
+ repository. Dependency use is listed below; this statement does not claim
11
+ ownership of third-party code or common ideas.
12
+
13
+ Direct runtime dependencies (MIT)
14
+ - @preact/signals-core — Preact contributors
15
+ - perfect-freehand — Steve Ruiz and contributors
16
+ - rbush — Vladimir Agafonkin
17
+ - valibot — Fabian Hiller and contributors
18
+ - nanoid — Andrey Sitnik
19
+
20
+ Optional integrations
21
+ - DOMPurify — dual licensed MPL-2.0 OR Apache-2.0; Cure53 and contributors.
22
+ AnnieDrawing consumers may use the Apache-2.0 option.
23
+ - ws in the separate MCP example — MIT; Einar Otto Stangvik and contributors
24
+
25
+ Demo typography
26
+ - Nunito variable font, distributed by @fontsource-variable/nunito,
27
+ uses SIL Open Font License 1.1. The demo self-hosts the installed font.
28
+ Original font copyright and the complete OFL text are in
29
+ node_modules/@fontsource-variable/nunito/LICENSE.
30
+ The library uses a system fallback when consumers do not supply the font.
31
+
32
+ The agent entry point also bundles @valibot/to-json-schema under MIT.
33
+ Build and test tooling includes TypeScript, Vite, Vitest, Playwright, Terser
34
+ and their transitive dependencies under the licenses in package-lock.json.
35
+ Vite 8 uses Lightning CSS (MPL-2.0) to minify CSS; it is not shipped as a
36
+ runtime dependency. Tooling is not a direct runtime dependency.
37
+
38
+ The release build preserves third-party license comments. Distributors must
39
+ retain applicable upstream notices for dependencies or font files they ship.
40
+ The lockfiles pin the exact dependency versions used for this checkout;
41
+ npm run check:licenses validates every locked package against a reviewed list.
42
+ Frontierz names and marks are not granted as trademarks by the MIT license.
43
+ GitHub and the GitHub logo are trademarks of GitHub, Inc.
44
+
45
+
46
+ --- @preact/signals-core ---
47
+
48
+ The MIT License (MIT)
49
+
50
+ Copyright (c) 2022-present Preact Team
51
+
52
+ Permission is hereby granted, free of charge, to any person obtaining a copy
53
+ of this software and associated documentation files (the "Software"), to deal
54
+ in the Software without restriction, including without limitation the rights
55
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
56
+ copies of the Software, and to permit persons to whom the Software is
57
+ furnished to do so, subject to the following conditions:
58
+
59
+ The above copyright notice and this permission notice shall be included in all
60
+ copies or substantial portions of the Software.
61
+
62
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
63
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
65
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
66
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
67
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
68
+ SOFTWARE.
69
+
70
+
71
+
72
+ --- perfect-freehand ---
73
+
74
+ MIT License
75
+
76
+ Copyright (c) 2021 Stephen Ruiz Ltd
77
+
78
+ Permission is hereby granted, free of charge, to any person obtaining a copy
79
+ of this software and associated documentation files (the "Software"), to deal
80
+ in the Software without restriction, including without limitation the rights
81
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
82
+ copies of the Software, and to permit persons to whom the Software is
83
+ furnished to do so, subject to the following conditions:
84
+
85
+ The above copyright notice and this permission notice shall be included in all
86
+ copies or substantial portions of the Software.
87
+
88
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
89
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
90
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
91
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
92
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
93
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
94
+ SOFTWARE.
95
+
96
+
97
+
98
+ --- rbush ---
99
+
100
+ MIT License
101
+
102
+ Copyright (c) 2024 Volodymyr Agafonkin
103
+
104
+ Permission is hereby granted, free of charge, to any person obtaining a copy
105
+ of this software and associated documentation files (the "Software"), to deal
106
+ in the Software without restriction, including without limitation the rights
107
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
108
+ copies of the Software, and to permit persons to whom the Software is
109
+ furnished to do so, subject to the following conditions:
110
+
111
+ The above copyright notice and this permission notice shall be included in
112
+ all copies or substantial portions of the Software.
113
+
114
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
115
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
116
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
117
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
118
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
119
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
120
+ THE SOFTWARE.
121
+
122
+
123
+
124
+ --- quickselect ---
125
+
126
+ ISC License
127
+
128
+ Copyright (c) 2024, Vladimir Agafonkin
129
+
130
+ Permission to use, copy, modify, and/or distribute this software for any purpose
131
+ with or without fee is hereby granted, provided that the above copyright notice
132
+ and this permission notice appear in all copies.
133
+
134
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
135
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
136
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
137
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
138
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
139
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
140
+ THIS SOFTWARE.
141
+
142
+
143
+
144
+ --- valibot ---
145
+
146
+ MIT License
147
+
148
+ Copyright (c) Fabian Hiller
149
+
150
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
151
+
152
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
153
+
154
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
155
+
156
+
157
+
158
+ --- nanoid ---
159
+
160
+ The MIT License (MIT)
161
+
162
+ Copyright 2017 Andrey Sitnik <andrey@sitnik.es>
163
+
164
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
165
+ this software and associated documentation files (the "Software"), to deal in
166
+ the Software without restriction, including without limitation the rights to
167
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
168
+ the Software, and to permit persons to whom the Software is furnished to do so,
169
+ subject to the following conditions:
170
+
171
+ The above copyright notice and this permission notice shall be included in all
172
+ copies or substantial portions of the Software.
173
+
174
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
175
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
176
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
177
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
178
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
179
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
180
+
181
+
182
+
183
+ --- Nunito ---
184
+
185
+ Copyright 2014 The Nunito Project Authors (https://github.com/googlefonts/nunito) Nunito-Italic[wght].ttf: Copyright 2014 The Nunito Project Authors (https://github.com/googlefonts/nunito)
186
+
187
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
188
+ This license is copied below, and is also available with a FAQ at:
189
+ http://scripts.sil.org/OFL
190
+
191
+
192
+ -----------------------------------------------------------
193
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
194
+ -----------------------------------------------------------
195
+
196
+ PREAMBLE
197
+ The goals of the Open Font License (OFL) are to stimulate worldwide
198
+ development of collaborative font projects, to support the font creation
199
+ efforts of academic and linguistic communities, and to provide a free and
200
+ open framework in which fonts may be shared and improved in partnership
201
+ with others.
202
+
203
+ The OFL allows the licensed fonts to be used, studied, modified and
204
+ redistributed freely as long as they are not sold by themselves. The
205
+ fonts, including any derivative works, can be bundled, embedded,
206
+ redistributed and/or sold with any software provided that any reserved
207
+ names are not used by derivative works. The fonts and derivatives,
208
+ however, cannot be released under any other type of license. The
209
+ requirement for fonts to remain under this license does not apply
210
+ to any document created using the fonts or their derivatives.
211
+
212
+ DEFINITIONS
213
+ "Font Software" refers to the set of files released by the Copyright
214
+ Holder(s) under this license and clearly marked as such. This may
215
+ include source files, build scripts and documentation.
216
+
217
+ "Reserved Font Name" refers to any names specified as such after the
218
+ copyright statement(s).
219
+
220
+ "Original Version" refers to the collection of Font Software components as
221
+ distributed by the Copyright Holder(s).
222
+
223
+ "Modified Version" refers to any derivative made by adding to, deleting,
224
+ or substituting -- in part or in whole -- any of the components of the
225
+ Original Version, by changing formats or by porting the Font Software to a
226
+ new environment.
227
+
228
+ "Author" refers to any designer, engineer, programmer, technical
229
+ writer or other person who contributed to the Font Software.
230
+
231
+ PERMISSION & CONDITIONS
232
+ Permission is hereby granted, free of charge, to any person obtaining
233
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
234
+ redistribute, and sell modified and unmodified copies of the Font
235
+ Software, subject to the following conditions:
236
+
237
+ 1) Neither the Font Software nor any of its individual components,
238
+ in Original or Modified Versions, may be sold by itself.
239
+
240
+ 2) Original or Modified Versions of the Font Software may be bundled,
241
+ redistributed and/or sold with any software, provided that each copy
242
+ contains the above copyright notice and this license. These can be
243
+ included either as stand-alone text files, human-readable headers or
244
+ in the appropriate machine-readable metadata fields within text or
245
+ binary files as long as those fields can be easily viewed by the user.
246
+
247
+ 3) No Modified Version of the Font Software may use the Reserved Font
248
+ Name(s) unless explicit written permission is granted by the corresponding
249
+ Copyright Holder. This restriction only applies to the primary font name as
250
+ presented to the users.
251
+
252
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
253
+ Software shall not be used to promote, endorse or advertise any
254
+ Modified Version, except to acknowledge the contribution(s) of the
255
+ Copyright Holder(s) and the Author(s) or with their explicit written
256
+ permission.
257
+
258
+ 5) The Font Software, modified or unmodified, in part or in whole,
259
+ must be distributed entirely under this license, and must not be
260
+ distributed under any other license. The requirement for fonts to
261
+ remain under this license does not apply to any document created
262
+ using the Font Software.
263
+
264
+ TERMINATION
265
+ This license becomes null and void if any of the above conditions are
266
+ not met.
267
+
268
+ DISCLAIMER
269
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
270
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
271
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
272
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
273
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
274
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
275
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
276
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
277
+ OTHER DEALINGS IN THE FONT SOFTWARE.
278
+
279
+
280
+
281
+ --- @valibot/to-json-schema (bundled in the agent entry point) ---
282
+
283
+ MIT License
284
+
285
+ Copyright (c) Fabian Hiller
286
+
287
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
288
+
289
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
290
+
291
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
292
+
@@ -0,0 +1,93 @@
1
+ Copyright 2014 The Nunito Project Authors (https://github.com/googlefonts/nunito) Nunito-Italic[wght].ttf: Copyright 2014 The Nunito Project Authors (https://github.com/googlefonts/nunito)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,38 @@
1
+ # Release checklist
2
+
3
+ Publication is a maintainer action. The repository URL, issue tracker, and private contacts are pau@frontierz.com plus this GitHub project. The npm package is `anniedrawing`.
4
+
5
+ ## Before publishing a version
6
+
7
+ - Confirm access to the `anniedrawing` npm package. Check the intended release version and update the changelog.
8
+ - Keep SECURITY.md and CODE_OF_CONDUCT.md pointed at pau@frontierz.com, and keep GitHub private vulnerability reporting enabled.
9
+ - Review the license, third-party notices, DCO requirements, and provenance. Keep full dependency and font notices in distributed bundles where required.
10
+ - Keep branch protection, required CI, Dependabot, and secret scanning enabled on the public repository.
11
+
12
+ ## Verify the release tree
13
+
14
+ ```sh
15
+ npm ci
16
+ npm ci --prefix examples/mcp
17
+ npm run check
18
+ npm run build:demo
19
+ npx playwright install --with-deps chromium firefox webkit
20
+ npm run test:e2e
21
+ npm run test:perf
22
+ npm test --prefix examples/mcp
23
+ node examples/mcp/live-smoke.mjs
24
+ npm run test:consumer
25
+ npm pack --dry-run
26
+ ```
27
+
28
+ Inspect the tarball: compiled JavaScript, declarations, CSS, README, license, notices, changelog, and AI documentation. The package must not contain private source documents, local drawings, tokens, browser artifacts, or `node_modules`. Install the tarball into a clean consumer and exercise `anniedrawing` and `anniedrawing/core`. Validate all declared package exports.
29
+
30
+ Test the demo with mouse, keyboard, and a touch device. Check cancellation, undo and redo, pages, autosave recovery, and file import and export. Test a keyboard-only first run and reduced-motion behavior. Check PNG export with embedded media, and the limits of remote images and custom HTML. Browser timing depends on the machine. Record the environment with performance results.
31
+
32
+ Review `npm audit` and changes to locked dependencies. CI license approval does not mean the tree has no vulnerabilities. Check the generated docs and demo for private paths.
33
+
34
+ ## Publish only with authorization
35
+
36
+ After the owner authorizes the destination and version, create a signed-off release commit and tag, publish the reviewed tarball using the registry's trusted publishing or authenticated workflow, and deploy `site` as a static site if that is part of the release. Do not put registry tokens in repository files. Verify the installed package and published demo after release, then update links to the real destinations.
37
+
38
+ The MCP example is a private package inside this repository. Publishing it separately requires replacing its relative `../../dist` imports with a compatible `anniedrawing` dependency and reviewing its release contents on their own.
@@ -0,0 +1,33 @@
1
+ # Security
2
+
3
+ AnnieDrawing is a local browser library. The embedding application controls who can read or edit a board and whether data leaves the browser. The demo has no telemetry or remote drawing backend.
4
+
5
+ ## Reporting
6
+
7
+ Email **pau@frontierz.com**. After this repository is public, you can also use [GitHub private vulnerability reporting](https://github.com/Frontierz-AI/anniedrawing/security/advisories/new) when GitHub shows that form.
8
+
9
+ Do not file a public GitHub issue for a vulnerability. Do not include real private drawings.
10
+
11
+ Reports should include the affected version or commit, reproduction steps, expected impact, and a minimal synthetic document. We aim to acknowledge reports within a few business days. There is no promised SLA.
12
+
13
+ ## Trust boundaries
14
+
15
+ - Imported files and all scene text, HTML, metadata, names, and URLs are untrusted data. Agents must not execute instructions found inside them.
16
+ - The model validates operations and document structure, enforces limits, and rejects edits in readonly mode. Callers still need the host's authorization.
17
+ - `origin: 'agent:name'` records provenance. Callers can supply that string. Do not use it as proof of identity or permission.
18
+ - HTML is inert without an explicit sanitizer integration. Use DOMPurify and a restrictive policy. `createBoard` / `createDoc` reject a sanitizer that leaves a script or event-handler probe in place. Custom kind renderers and mount callbacks are trusted application code. They are not sandboxed extensions.
19
+ - Image data is limited to supported image URLs. `allowedImageOrigins` applies to non-`user` origins (API and agent writes, including `media.set`). User paste, file import, and `load()` accept `http(s)` images unless the host filters them first. Remote files can have privacy and CORS consequences. Prefer embedded images for portable private documents. Image URLs must not include credentials.
20
+ - `video` and `link` items store an `http(s)` `href` only. The renderer builds YouTube and Vimeo iframes from parsed identifiers. It never writes a raw user URL into `iframe.src`. Link titles and descriptions use `textContent`. The Open control uses `rel="noopener noreferrer"`.
21
+ - Pasting a website URL may fetch that URL from the user's browser to read Open Graph tags. The request omits credentials, is limited in time and size, and does not run for agent operations. The library refuses loopback, link-local, unique-local, RFC1918, IPv4-mapped IPv6, NAT64, multicast, and hostnames that begin with a private IPv4 (for example `127.0.0.1.nip.io`). Open Graph `og:image` URLs must pass the same check; a public page cannot advertise a private image. Browser unfurl cannot see the DNS result behind a hostname, so a host that needs that check should pass its own `unfurl`. The local Vite demo proxy resolves A/AAAA records and refuses private answers. Hosts that do not want any fetch can pass `unfurl: false`. Loading a video player contacts YouTube or Vimeo when that item is shown.
22
+ - `window.__anniedrawing` is off unless the host sets `exposeGlobal: true`. The local demo opts in. Any script already running in that page can then read and edit the board. Protect the surrounding page from XSS.
23
+ - Local autosave is unencrypted browser storage. Clearing the profile or applying a storage policy can remove it. Export `.annie` files for portable copies.
24
+
25
+ ## MCP example
26
+
27
+ The MCP connection to an agent is stdio. Its optional browser bridge binds only to `127.0.0.1`, checks an exact browser `Origin`, requires a token of at least 32 characters, permits one authenticated board, and applies request limits and timeouts. The token travels in an authentication frame, never a URL. Generate a fresh random token per session. Connecting a board grants the local client the ability to read and edit it through the published tools.
28
+
29
+ Do not expose the bridge port on a public interface, place the token in source control, or attach a board automatically. Disconnect it when finished. A timeout is ambiguous for a mutation: re-read state before retrying. The bridge is a development integration for one local board.
30
+
31
+ ## Maintenance
32
+
33
+ Run `npm run check:licenses`, review `npm audit` and dependency changes, and preserve lockfiles. The license checker is an allowlist. It does not replace legal review or a vulnerability scanner. Releases require a fresh review of dependency updates, sanitizer behavior, and export behavior. See [the release checklist](releasing.md).
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><rect width="48" height="48" rx="15" fill="#05D9AB"/><path d="M14 32 24 12l10 20M18 25h12" fill="none" stroke="#103639" stroke-linecap="round" stroke-linejoin="round" stroke-width="4"/><circle cx="35" cy="13" r="3" fill="#103639"/></svg>
@@ -0,0 +1,7 @@
1
+ import { type BoardOptions } from './board.js';
2
+ import type { AgentPresenceOptions, ApplyOptions, ApplyResult, ChangeLog } from './core/types.js';
3
+ export type { AgentPresenceOptions, ApplyOptions, ApplyResult, BoardOptions, ChangeLog };
4
+ export interface FellowBoardOptions extends BoardOptions {
5
+ fellowName?: string;
6
+ }
7
+ export declare function createFellowBoard(host: HTMLElement, options?: FellowBoardOptions): import("./board.js").Board;
package/dist/fellow.js ADDED
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./shared/board-Bya0O1I7.js";function a(a,n={}){const{fellowName:t,...o}=n;return e(a,{agentHistory:"hidden",agentReveal:"fit",agentPlaceGap:120,agentPresence:{maxStops:3,durationScale:.55},exposeGlobal:!1,unfurl:!1,ui:{menu:!1,export:!1,pages:!1},...o,agentName:o.agentName??t})}export{a as createFellowBoard};
2
+ //# sourceMappingURL=fellow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fellow.js","names":[],"sources":["../src/fellow.ts"],"sourcesContent":["import { createBoard, type BoardOptions } from './board';\nimport type { AgentPresenceOptions, ApplyOptions, ApplyResult, ChangeLog } from './core/types';\n\nexport type { AgentPresenceOptions, ApplyOptions, ApplyResult, BoardOptions, ChangeLog };\n\nexport interface FellowBoardOptions extends BoardOptions {\n fellowName?: string;\n}\n\nexport function createFellowBoard(host: HTMLElement, options: FellowBoardOptions = {}) {\n const { fellowName, ...rest } = options;\n return createBoard(host, {\n agentHistory: 'hidden',\n agentReveal: 'fit',\n agentPlaceGap: 120,\n agentPresence: { maxStops: 3, durationScale: 0.55 },\n exposeGlobal: false,\n unfurl: false,\n ui: { menu: false, export: false, pages: false },\n ...rest,\n agentName: rest.agentName ?? fellowName,\n });\n}\n"],"mappings":"+CASA,SAAgB,EAAkB,EAAmB,EAA8B,CAAC,GAClF,MAAM,WAAE,KAAe,GAAS,EAChC,OAAO,EAAY,EAAM,CACvB,aAAc,SACd,YAAa,MACb,cAAe,IACf,cAAe,CAAE,SAAU,EAAG,cAAe,KAC7C,cAAc,EACd,QAAQ,EACR,GAAI,CAAE,MAAM,EAAO,QAAQ,EAAO,OAAO,MACtC,EACH,UAAW,EAAK,WAAa,GAEjC"}
@@ -0,0 +1,13 @@
1
+ import type { Box, Item, Point } from '../core/types.js';
2
+ import { type OutlineResolver } from './router.js';
3
+ export type ItemLookup = ((id: string) => Item | undefined) | Map<string, Item> | Record<string, Item> | Item[];
4
+ export declare function lookupItem(lookup: ItemLookup | undefined, id: string): Item | undefined;
5
+ export declare function flattenItems(items: Item[]): Item[];
6
+ export declare const centerOf: (b: Box) => Point;
7
+ export declare function boxCorners(box: Box, rotation?: number, origin?: Point): Point[];
8
+ export declare function boxFromPoints(points: Point[]): Box;
9
+ export declare function itemBounds(item: Item, lookup?: ItemLookup, outline?: OutlineResolver): Box;
10
+ export declare function boundsOf(items: Item[], lookup?: ItemLookup, outline?: OutlineResolver): Box;
11
+ export declare const intersects: (a: Box, b: Box) => boolean;
12
+ export declare const contains: (a: Box, b: Box) => boolean;
13
+ export declare const containsPoint: (b: Box, p: Point) => boolean;
@@ -0,0 +1,5 @@
1
+ /** Page-space geometry used by the document model and the renderer. */
2
+ export * from './vec.js';
3
+ export * from './box.js';
4
+ export * from './router.js';
5
+ export * from './picker.js';
@@ -0,0 +1,25 @@
1
+ import type { Box, Item, Outline, Point } from '../core/types.js';
2
+ import { type ItemLookup } from './box.js';
3
+ import { type OutlineResolver } from './router.js';
4
+ export interface PickOptions {
5
+ tolerance?: number;
6
+ enteredGroup?: string;
7
+ includeLocked?: boolean;
8
+ outline?: OutlineResolver;
9
+ ignore?: (item: Item) => boolean;
10
+ }
11
+ export declare function hitTest(item: Item, point: Point, tolerance?: number, lookup?: ItemLookup, outline?: Outline | Outline[] | OutlineResolver): boolean;
12
+ export declare class SpatialIndex {
13
+ private outline?;
14
+ private tree;
15
+ private lookup;
16
+ private entries;
17
+ constructor(items?: Item[], outline?: OutlineResolver | undefined);
18
+ set(items: Item[], outline?: OutlineResolver | undefined): void;
19
+ search(box: Box): Item[];
20
+ enclosed(box: Box, options?: {
21
+ enteredGroup?: string;
22
+ ignore?: (item: Item) => boolean;
23
+ }): Item[];
24
+ pick(point: Point, options?: PickOptions): Item | undefined;
25
+ }
@@ -0,0 +1,11 @@
1
+ import type { Box, Endpoint, Item, Outline, Point } from '../core/types.js';
2
+ import { type ItemLookup } from './box.js';
3
+ export type OutlineResolver = (item: Item) => Outline | Outline[] | undefined;
4
+ export declare function resolveEndpoint(endpoint: Endpoint | undefined, other: Endpoint | Point | undefined, lookup?: ItemLookup, outline?: OutlineResolver): Point;
5
+ export interface ConnectorGeometry {
6
+ points: Point[];
7
+ d: string;
8
+ midpoint: Point;
9
+ bounds: Box;
10
+ }
11
+ export declare function routeConnector(item: Item, lookup?: ItemLookup, outline?: OutlineResolver): ConnectorGeometry;
@@ -0,0 +1,8 @@
1
+ import type { Point } from '../core/types.js';
2
+ export declare const distance: (a: Point, b: Point) => number;
3
+ export declare function rotatePoint(p: Point, center: Point, degrees: number): Point;
4
+ export declare function segmentDistance(p: Point, a: Point, b: Point): number;
5
+ export declare function pointInPolygon(p: Point, polygon: Point[]): boolean;
6
+ export declare function simplifyPoints<T extends [number, number, number?]>(points: T[], epsilon?: number): T[];
7
+ /** Recursive simplification that also keeps pressure inflections. Used for freehand strokes. */
8
+ export declare function simplifyStroke<T extends [number, number, number?]>(points: T[], epsilon: number): T[];
@@ -0,0 +1,7 @@
1
+ export { Board, createBoard } from './board.js';
2
+ export type { BoardOptions, UiOptions, UiExportFormat } from './board.js';
3
+ export type * from './core/types.js';
4
+ export { CATALOG_VERSION, KIND_CATALOG, kindsSince } from './core/catalog.js';
5
+ export type { KindCatalogEntry, KindCatalogSnapshot } from './core/catalog.js';
6
+ export { defineKind, registerKind } from './kinds/index.js';
7
+ export type { KindDef, KindView, Outline, SVGContext } from './kinds/index.js';
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import{b as s,v as a,y as r}from"./shared/defaults-C-aC_B4z.js";import{i as o,n as t,r as d,t as e}from"./shared/board-Bya0O1I7.js";export{e as Board,a as CATALOG_VERSION,r as KIND_CATALOG,t as createBoard,d as defineKind,s as kindsSince,o as registerKind};
@@ -0,0 +1,2 @@
1
+ import type { Board } from '../board.js';
2
+ export declare function openAutosave(board: Board, key: string): Promise<void>;
@@ -0,0 +1,8 @@
1
+ export declare const cursorArrow = "M8.5 6.5c-1.3-.5-2.5.7-2 2l6.1 19.4c.5 1.6 2.7 1.7 3.3.1l3.1-8a1.5 1.5 0 0 1 .9-.9l8-3.1c1.6-.6 1.5-2.8-.1-3.3Z";
2
+ export declare const selectionCursor: string;
3
+ export declare const drawingCursor: string;
4
+ export declare function cursorForTool(tool: string, state?: {
5
+ space?: boolean;
6
+ readonly?: boolean;
7
+ panning?: boolean;
8
+ }): string;
@@ -0,0 +1,6 @@
1
+ import type { ItemText } from '../core/types.js';
2
+ /** Measure only when text is committed; pointer movement never reads layout. */
3
+ export declare function measureText(owner: Document, text: ItemText): {
4
+ w: number;
5
+ h: number;
6
+ };
@@ -0,0 +1,18 @@
1
+ import { type LinkPreview } from '../core/links.js';
2
+ import type { ApplyOptions, ApplyResult, Item, Op, Point } from '../core/types.js';
3
+ export interface PasteHost {
4
+ pageId: string;
5
+ items: Item[];
6
+ destroyed: boolean;
7
+ unfurl?: false | ((url: string) => Promise<LinkPreview | undefined>);
8
+ view: {
9
+ center: Point;
10
+ };
11
+ host: HTMLElement;
12
+ apply(ops: Op[], options?: ApplyOptions): ApplyResult;
13
+ select(ids: string[]): void;
14
+ get(id: string): Item | undefined;
15
+ }
16
+ /** Replace the href on an existing video or link item. */
17
+ export declare function updateHref(host: PasteHost, id: string, value: string): ApplyResult;
18
+ export declare function pastePlain(host: PasteHost, value: string, point?: Point): void;
@@ -0,0 +1,2 @@
1
+ export { defineKind, registerKind, getKind, getKinds, createKindRegistry } from './registry.js';
2
+ export type { KindDef, KindView, Outline, SVGContext } from './registry.js';