@3sln/trove 0.0.2

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 (162) hide show
  1. package/README.md +1227 -0
  2. package/package.json +75 -0
  3. package/packages/core/src/collections/index.js +249 -0
  4. package/packages/core/src/errors.js +186 -0
  5. package/packages/core/src/identity/discovery.js +210 -0
  6. package/packages/core/src/identity/index.js +188 -0
  7. package/packages/core/src/identity/jwt.js +199 -0
  8. package/packages/core/src/index.js +104 -0
  9. package/packages/core/src/indexers/contribution.js +115 -0
  10. package/packages/core/src/indexers/registry.js +162 -0
  11. package/packages/core/src/indexing.js +340 -0
  12. package/packages/core/src/issues.js +150 -0
  13. package/packages/core/src/kv.js +0 -0
  14. package/packages/core/src/links.js +141 -0
  15. package/packages/core/src/metadata/cursor.js +73 -0
  16. package/packages/core/src/metadata/interface.js +244 -0
  17. package/packages/core/src/metadata/memory.js +270 -0
  18. package/packages/core/src/metadata/sqlite.js +412 -0
  19. package/packages/core/src/notifications/index.js +139 -0
  20. package/packages/core/src/notifications/webpush.js +217 -0
  21. package/packages/core/src/plugins/contributions.js +177 -0
  22. package/packages/core/src/plugins/identity.js +98 -0
  23. package/packages/core/src/plugins/index.js +225 -0
  24. package/packages/core/src/plugins/indexers.js +142 -0
  25. package/packages/core/src/plugins/installStore.js +134 -0
  26. package/packages/core/src/plugins/package.js +102 -0
  27. package/packages/core/src/plugins/packageStore.js +61 -0
  28. package/packages/core/src/plugins/runtime.js +101 -0
  29. package/packages/core/src/plugins/sql.js +52 -0
  30. package/packages/core/src/retry.js +74 -0
  31. package/packages/core/src/scan.js +302 -0
  32. package/packages/core/src/search/embeddings.js +128 -0
  33. package/packages/core/src/search/index.js +200 -0
  34. package/packages/core/src/search/keywordStore.js +107 -0
  35. package/packages/core/src/search/sqliteStores.js +455 -0
  36. package/packages/core/src/search/tagMatch.js +59 -0
  37. package/packages/core/src/search/transformer.js +195 -0
  38. package/packages/core/src/search/vectorStore.js +274 -0
  39. package/packages/core/src/search/vectorize.js +249 -0
  40. package/packages/core/src/sidecar/document.js +213 -0
  41. package/packages/core/src/sidecar/index.js +174 -0
  42. package/packages/core/src/sidecar/manager.js +239 -0
  43. package/packages/core/src/sidecar/store.js +46 -0
  44. package/packages/core/src/signedUrls.js +170 -0
  45. package/packages/core/src/sqlite-d1.js +162 -0
  46. package/packages/core/src/sqlite-driver.js +42 -0
  47. package/packages/core/src/sqlite.js +162 -0
  48. package/packages/core/src/storage/filesystem.js +283 -0
  49. package/packages/core/src/storage/interface.js +222 -0
  50. package/packages/core/src/storage/memory.js +113 -0
  51. package/packages/core/src/storage/prefixed.js +75 -0
  52. package/packages/core/src/storage/s3.js +316 -0
  53. package/packages/core/src/storage/s3sigv4.js +185 -0
  54. package/packages/core/src/tasks.js +228 -0
  55. package/packages/core/src/uploads.js +386 -0
  56. package/packages/core/src/util.js +125 -0
  57. package/packages/core/src/vfs.js +666 -0
  58. package/packages/plugin-sdk/src/browser.js +316 -0
  59. package/packages/plugin-sdk/src/index.js +32 -0
  60. package/packages/plugin-sdk/src/protocol.js +59 -0
  61. package/packages/plugin-sdk/src/rpc.js +95 -0
  62. package/packages/server/src/adapters/bun.js +78 -0
  63. package/packages/server/src/adapters/node.js +115 -0
  64. package/packages/server/src/adapters/staticAssets.js +123 -0
  65. package/packages/server/src/adapters/webDist.js +70 -0
  66. package/packages/server/src/adapters/worker-tasks.js +206 -0
  67. package/packages/server/src/adapters/worker.js +159 -0
  68. package/packages/server/src/cachePolicy.js +34 -0
  69. package/packages/server/src/engine/README.md +88 -0
  70. package/packages/server/src/engine/actions/scanCollection.js +114 -0
  71. package/packages/server/src/engine/index.js +95 -0
  72. package/packages/server/src/engine/lazy.js +25 -0
  73. package/packages/server/src/engine/providers/access.js +363 -0
  74. package/packages/server/src/engine/providers/core.js +405 -0
  75. package/packages/server/src/engine/providers/scan.js +67 -0
  76. package/packages/server/src/index.js +698 -0
  77. package/packages/server/src/manifest.js +98 -0
  78. package/packages/server/src/mcp/auth.js +40 -0
  79. package/packages/server/src/mcp/index.js +213 -0
  80. package/packages/server/src/mcp/protocol.js +181 -0
  81. package/packages/server/src/mcp/tools.js +351 -0
  82. package/packages/server/src/router.js +229 -0
  83. package/packages/server/src/routes.js +1066 -0
  84. package/packages/server/src/scope.js +43 -0
  85. package/packages/web/dist/assets/chunk-4xqbzebh.js +5 -0
  86. package/packages/web/dist/assets/chunk-4xqbzebh.js.map +9 -0
  87. package/packages/web/dist/assets/chunk-h05bxfbs.js +5 -0
  88. package/packages/web/dist/assets/chunk-h05bxfbs.js.map +10 -0
  89. package/packages/web/dist/assets/main-4cxs7prw.js +356 -0
  90. package/packages/web/dist/assets/main-4cxs7prw.js.map +103 -0
  91. package/packages/web/dist/assets/styles-kcx1x337.css +1 -0
  92. package/packages/web/dist/icon.svg +11 -0
  93. package/packages/web/dist/index.html +16 -0
  94. package/packages/web/dist/sql-wasm.wasm +0 -0
  95. package/packages/web/dist/sw.js +186 -0
  96. package/packages/web/src/bl/actions.js +410 -0
  97. package/packages/web/src/bl/activity.js +306 -0
  98. package/packages/web/src/bl/commands.js +274 -0
  99. package/packages/web/src/bl/fileType.js +49 -0
  100. package/packages/web/src/bl/index.js +70 -0
  101. package/packages/web/src/bl/links.js +54 -0
  102. package/packages/web/src/bl/offline.js +268 -0
  103. package/packages/web/src/bl/openers.js +71 -0
  104. package/packages/web/src/bl/pluginInstall.js +59 -0
  105. package/packages/web/src/bl/services.js +143 -0
  106. package/packages/web/src/bl/social.js +234 -0
  107. package/packages/web/src/bl/tagQuery.js +44 -0
  108. package/packages/web/src/main.js +10 -0
  109. package/packages/web/src/platform/api.js +529 -0
  110. package/packages/web/src/platform/commands.js +89 -0
  111. package/packages/web/src/platform/context.js +77 -0
  112. package/packages/web/src/platform/contributions.js +156 -0
  113. package/packages/web/src/platform/index.js +150 -0
  114. package/packages/web/src/platform/keybindings.js +199 -0
  115. package/packages/web/src/platform/mediaUrls.js +137 -0
  116. package/packages/web/src/platform/navigation.js +131 -0
  117. package/packages/web/src/platform/notifications.js +50 -0
  118. package/packages/web/src/platform/overlay.js +81 -0
  119. package/packages/web/src/platform/pluginClientDb.js +132 -0
  120. package/packages/web/src/platform/pluginDock.js +141 -0
  121. package/packages/web/src/platform/pluginFrames.js +194 -0
  122. package/packages/web/src/platform/pluginHost.js +648 -0
  123. package/packages/web/src/platform/pluginMedia.js +62 -0
  124. package/packages/web/src/platform/pluginModules.js +90 -0
  125. package/packages/web/src/platform/pluginNet.js +71 -0
  126. package/packages/web/src/platform/pluginPackage.js +247 -0
  127. package/packages/web/src/platform/pluginRpc.js +377 -0
  128. package/packages/web/src/platform/pluginSigning.js +168 -0
  129. package/packages/web/src/platform/pluginStore.js +67 -0
  130. package/packages/web/src/platform/settings.js +101 -0
  131. package/packages/web/src/platform/spatialNav.js +286 -0
  132. package/packages/web/src/platform/viewport.js +123 -0
  133. package/packages/web/src/platform/voice.js +133 -0
  134. package/packages/web/src/platform/voiceSearch.js +155 -0
  135. package/packages/web/src/platform/whenclause.js +162 -0
  136. package/packages/web/src/platform/workbench.js +156 -0
  137. package/packages/web/src/runtime.js +73 -0
  138. package/packages/web/src/styles.css +1382 -0
  139. package/packages/web/src/ui/components/activityBar.js +35 -0
  140. package/packages/web/src/ui/components/activityPanel.js +132 -0
  141. package/packages/web/src/ui/components/commandPalette.js +154 -0
  142. package/packages/web/src/ui/components/editorArea.js +75 -0
  143. package/packages/web/src/ui/components/launcher.js +392 -0
  144. package/packages/web/src/ui/components/openers/index.js +212 -0
  145. package/packages/web/src/ui/components/openers/markdown.js +222 -0
  146. package/packages/web/src/ui/components/overlays.js +255 -0
  147. package/packages/web/src/ui/components/phoneChrome.js +188 -0
  148. package/packages/web/src/ui/components/pluginReview.js +151 -0
  149. package/packages/web/src/ui/components/pluginsView.js +120 -0
  150. package/packages/web/src/ui/components/settingsView.js +258 -0
  151. package/packages/web/src/ui/components/social.js +290 -0
  152. package/packages/web/src/ui/components/statusBar.js +198 -0
  153. package/packages/web/src/ui/components/views/grid.js +115 -0
  154. package/packages/web/src/ui/components/views/index.js +155 -0
  155. package/packages/web/src/ui/components/views/list.js +50 -0
  156. package/packages/web/src/ui/components/views/parts.js +58 -0
  157. package/packages/web/src/ui/compositions/workbench.js +125 -0
  158. package/packages/web/src/ui/format.js +33 -0
  159. package/packages/web/src/ui/icon.js +81 -0
  160. package/packages/web/src/ui/media.js +114 -0
  161. package/packages/web/src/ui/sanitize.js +86 -0
  162. package/packages/web/src/workbench.js +205 -0
@@ -0,0 +1,125 @@
1
+ // Small runtime-agnostic helpers. No Node or browser globals beyond what's
2
+ // standard in both (crypto.randomUUID, TextEncoder, Web Streams).
3
+
4
+ import { TroveError } from './errors.js';
5
+
6
+ /** URL-safe unique id. */
7
+ export function newId(prefix = '') {
8
+ const uuid = (globalThis.crypto?.randomUUID?.() ?? fallbackUuid()).replace(/-/g, '');
9
+ return prefix ? `${prefix}_${uuid}` : uuid;
10
+ }
11
+
12
+ function fallbackUuid() {
13
+ // Only used where crypto.randomUUID is unavailable; good enough for ids.
14
+ let s = '';
15
+ for (let i = 0; i < 32; i++) s += Math.floor(Math.random() * 16).toString(16);
16
+ return s;
17
+ }
18
+
19
+ // ---- item names -------------------------------------------------------------
20
+ // There are no paths: a collection is a flat namespace, and a name is the whole
21
+ // address within it. Slashes are rejected because a name has to survive the `/name`
22
+ // shorthand of a trove: link without splitting.
23
+
24
+ /**
25
+ * A user-visible ITEM name. Distinct from the `isValidName` in plugins/identity.js,
26
+ * which validates a *name segment in the contribution address space* — same word, very
27
+ * different rule, so they get different names rather than colliding across the two
28
+ * public entry points that export them.
29
+ */
30
+ export function isValidItemName(name) {
31
+ return (
32
+ typeof name === 'string' &&
33
+ name.length > 0 &&
34
+ name.length <= 255 &&
35
+ !name.includes('/') &&
36
+ name !== '.' &&
37
+ name !== '..' &&
38
+ // eslint-disable-next-line no-control-regex
39
+ !/[\x00-\x1f]/.test(name)
40
+ );
41
+ }
42
+
43
+ /** The lowercased extension of an item name, including the dot ('' if none). */
44
+ export function extname(name) {
45
+ const i = String(name || '').lastIndexOf('.');
46
+ return i > 0 ? String(name).slice(i).toLowerCase() : '';
47
+ }
48
+
49
+ /**
50
+ * Does a contribution/opener/indexer `selector` match a file node? One matcher shared
51
+ * by the client contribution registry and the server indexers so they can't drift.
52
+ * A selector has any of: `match(node)` (a predicate, built-ins only), `ext` (with or
53
+ * without leading dot), `mime`/`contentType` (exact or a `type/*` prefix).
54
+ */
55
+ export function selectorMatches(selector, node) {
56
+ if (!selector || !node) return false;
57
+ if (typeof selector.match === 'function') {
58
+ try { if (selector.match(node)) return true; } catch { /* ignore a bad matcher */ }
59
+ }
60
+ const ext = extname(node.name || '');
61
+ if (ext && (selector.ext || []).some((e) => (e.startsWith('.') ? e : '.' + e).toLowerCase() === ext)) return true;
62
+ const ct = node.contentType || '';
63
+ const mimes = selector.mime || selector.contentType || [];
64
+ return mimes.some((m) => (m.endsWith('/*') ? ct.startsWith(m.slice(0, -1)) : ct === m));
65
+ }
66
+
67
+ // ---- byte helpers -----------------------------------------------------------
68
+
69
+ /** Concatenate Uint8Array chunks into one. */
70
+ export function concatBytes(chunks) {
71
+ let total = 0;
72
+ for (const c of chunks) total += c.length;
73
+ const out = new Uint8Array(total);
74
+ let off = 0;
75
+ for (const c of chunks) { out.set(c, off); off += c.length; }
76
+ return out;
77
+ }
78
+
79
+ /** Drain a web ReadableStream into a single Uint8Array. */
80
+ export async function readAll(stream) {
81
+ const reader = stream.getReader();
82
+ const chunks = [];
83
+ for (;;) {
84
+ const { done, value } = await reader.read();
85
+ if (done) break;
86
+ chunks.push(value instanceof Uint8Array ? value : new Uint8Array(value));
87
+ }
88
+ return concatBytes(chunks);
89
+ }
90
+
91
+
92
+ /**
93
+ * Refuse a URL that would make the server fetch something on its own network.
94
+ *
95
+ * Anywhere a caller supplies a URL the SERVER will later request, this is the gate. The
96
+ * dangerous targets are not exotic: `169.254.169.254` is cloud instance metadata (and
97
+ * with it, credentials), `127.0.0.1` and private ranges are whatever else the box is
98
+ * running, and `.internal`/`.local` are the names those things usually have.
99
+ *
100
+ * DNS names that resolve to private addresses are a residual risk — rebinding cannot be
101
+ * settled at this layer — so a deployment that cares should egress-filter too.
102
+ *
103
+ * @param {string} url
104
+ * @param {string} what named in the error, so the message says which field was wrong
105
+ */
106
+ export function assertPublicUrl(url, what = 'URL') {
107
+ let u;
108
+ try { u = new URL(String(url)); } catch { throw TroveError.invalid(`${what} is not a valid URL`); }
109
+ if (u.protocol !== 'https:' && u.protocol !== 'http:') {
110
+ throw TroveError.invalid(`${what} must be http(s)`);
111
+ }
112
+ const h = u.hostname.toLowerCase();
113
+ if (h === 'localhost' || h.endsWith('.localhost') || h.endsWith('.local') || h.endsWith('.internal')) {
114
+ throw TroveError.invalid(`${what} points at an internal host`);
115
+ }
116
+ if (/^\d{1,3}(\.\d{1,3}){3}$/.test(h)) {
117
+ const [a, b] = h.split('.').map(Number);
118
+ if (a === 10 || a === 127 || a === 0 || (a === 192 && b === 168)
119
+ || (a === 172 && b >= 16 && b <= 31) || (a === 169 && b === 254) || a >= 224) {
120
+ throw TroveError.invalid(`${what} points at a private address`);
121
+ }
122
+ }
123
+ if (h.includes(':') || h.startsWith('[')) throw TroveError.invalid(`${what} may not be an IP literal`);
124
+ return u;
125
+ }