@semiont/browser 0.5.28

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 (204) hide show
  1. package/README.md +42 -0
  2. package/dist/apple-touch-icon.png +0 -0
  3. package/dist/assets/ChevronLeftIcon-BcDi-sgg.js +2 -0
  4. package/dist/assets/ChevronLeftIcon-BcDi-sgg.js.map +1 -0
  5. package/dist/assets/CommandLineIcon-O8NfVSEq.js +2 -0
  6. package/dist/assets/CommandLineIcon-O8NfVSEq.js.map +1 -0
  7. package/dist/assets/CookiePreferences-UVUl27XP.js +2 -0
  8. package/dist/assets/CookiePreferences-UVUl27XP.js.map +1 -0
  9. package/dist/assets/KeyboardShortcutsContext-D8VjaYfK.js +2 -0
  10. package/dist/assets/KeyboardShortcutsContext-D8VjaYfK.js.map +1 -0
  11. package/dist/assets/PdfAnnotationCanvas.client-LSH3PZPY-B8dnEIps.js +2 -0
  12. package/dist/assets/PdfAnnotationCanvas.client-LSH3PZPY-B8dnEIps.js.map +1 -0
  13. package/dist/assets/ToolbarPanels-Bf3f6THq.js +2 -0
  14. package/dist/assets/ToolbarPanels-Bf3f6THq.js.map +1 -0
  15. package/dist/assets/XMarkIcon-CVrfCz2h.js +2 -0
  16. package/dist/assets/XMarkIcon-CVrfCz2h.js.map +1 -0
  17. package/dist/assets/ar-AZBRADEB-CvnkaLQS.js +2 -0
  18. package/dist/assets/ar-AZBRADEB-CvnkaLQS.js.map +1 -0
  19. package/dist/assets/bn-CCEW6AOS-BCI1FG86.js +2 -0
  20. package/dist/assets/bn-CCEW6AOS-BCI1FG86.js.map +1 -0
  21. package/dist/assets/client-B2rbsRTh.js +2 -0
  22. package/dist/assets/client-B2rbsRTh.js.map +1 -0
  23. package/dist/assets/client-kvvQzQsd.js +2 -0
  24. package/dist/assets/client-kvvQzQsd.js.map +1 -0
  25. package/dist/assets/cs-HXPF2CTE-CbMUDpDp.js +2 -0
  26. package/dist/assets/cs-HXPF2CTE-CbMUDpDp.js.map +1 -0
  27. package/dist/assets/da-K5NTK7LH-D2rWDXq3.js +2 -0
  28. package/dist/assets/da-K5NTK7LH-D2rWDXq3.js.map +1 -0
  29. package/dist/assets/de-GMRQEDZI-CVlSEip_.js +2 -0
  30. package/dist/assets/de-GMRQEDZI-CVlSEip_.js.map +1 -0
  31. package/dist/assets/el-EUB4CI4G-C80i0753.js +2 -0
  32. package/dist/assets/el-EUB4CI4G-C80i0753.js.map +1 -0
  33. package/dist/assets/en-R5XA26NF-Cuox0uQn.js +1 -0
  34. package/dist/assets/es-Z32DAZ6W-D7UTS3Fx.js +2 -0
  35. package/dist/assets/es-Z32DAZ6W-D7UTS3Fx.js.map +1 -0
  36. package/dist/assets/fa-G7HN6B32-DdDi1TG_.js +2 -0
  37. package/dist/assets/fa-G7HN6B32-DdDi1TG_.js.map +1 -0
  38. package/dist/assets/fi-3YBLZO7I-B3OjL1PQ.js +2 -0
  39. package/dist/assets/fi-3YBLZO7I-B3OjL1PQ.js.map +1 -0
  40. package/dist/assets/fr-VUBH7BBS-CjoeoL9n.js +2 -0
  41. package/dist/assets/fr-VUBH7BBS-CjoeoL9n.js.map +1 -0
  42. package/dist/assets/he-WQQEY26B-2RRJq7To.js +2 -0
  43. package/dist/assets/he-WQQEY26B-2RRJq7To.js.map +1 -0
  44. package/dist/assets/hi-HJZ6W4JB-DPflxelg.js +2 -0
  45. package/dist/assets/hi-HJZ6W4JB-DPflxelg.js.map +1 -0
  46. package/dist/assets/i18n-zIDJOEfo.js +2 -0
  47. package/dist/assets/i18n-zIDJOEfo.js.map +1 -0
  48. package/dist/assets/id-ZOGZ37MI-Dd4wSvWi.js +2 -0
  49. package/dist/assets/id-ZOGZ37MI-Dd4wSvWi.js.map +1 -0
  50. package/dist/assets/index-BkTRe71w.js +142 -0
  51. package/dist/assets/index-BkTRe71w.js.map +1 -0
  52. package/dist/assets/index-C6tZC9XN.css +1 -0
  53. package/dist/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  54. package/dist/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  55. package/dist/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  56. package/dist/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  57. package/dist/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  58. package/dist/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  59. package/dist/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  60. package/dist/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  61. package/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  62. package/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  63. package/dist/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  64. package/dist/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  65. package/dist/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  66. package/dist/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  67. package/dist/assets/it-DT6UW66F-B7ZzCBm1.js +2 -0
  68. package/dist/assets/it-DT6UW66F-B7ZzCBm1.js.map +1 -0
  69. package/dist/assets/ja-RUKQCOLO-Br1kLTUs.js +2 -0
  70. package/dist/assets/ja-RUKQCOLO-Br1kLTUs.js.map +1 -0
  71. package/dist/assets/ko-ZH5ADKZM-8IO4IU-2.js +2 -0
  72. package/dist/assets/ko-ZH5ADKZM-8IO4IU-2.js.map +1 -0
  73. package/dist/assets/layout-5m7ZN_sv.js +2 -0
  74. package/dist/assets/layout-5m7ZN_sv.js.map +1 -0
  75. package/dist/assets/layout-ChREg3PD.js +2 -0
  76. package/dist/assets/layout-ChREg3PD.js.map +1 -0
  77. package/dist/assets/layout-DmBlX8Wv.js +2 -0
  78. package/dist/assets/layout-DmBlX8Wv.js.map +1 -0
  79. package/dist/assets/layout-xM3HYPpK.js +2 -0
  80. package/dist/assets/layout-xM3HYPpK.js.map +1 -0
  81. package/dist/assets/ms-Y2AFPZTU-q4v04hSa.js +2 -0
  82. package/dist/assets/ms-Y2AFPZTU-q4v04hSa.js.map +1 -0
  83. package/dist/assets/nl-OQEWIXNA-DiHanxnO.js +2 -0
  84. package/dist/assets/nl-OQEWIXNA-DiHanxnO.js.map +1 -0
  85. package/dist/assets/no-KPAYJZWY-DdGouMG_.js +2 -0
  86. package/dist/assets/no-KPAYJZWY-DdGouMG_.js.map +1 -0
  87. package/dist/assets/not-found-BOkh1PJR.js +2 -0
  88. package/dist/assets/not-found-BOkh1PJR.js.map +1 -0
  89. package/dist/assets/orbitron-latin-400-normal-DBk4Dmer.woff +0 -0
  90. package/dist/assets/orbitron-latin-400-normal-U6xZUhur.woff2 +0 -0
  91. package/dist/assets/page-B2tTEfKp.js +2 -0
  92. package/dist/assets/page-B2tTEfKp.js.map +1 -0
  93. package/dist/assets/page-BOgSgEl-.js +2 -0
  94. package/dist/assets/page-BOgSgEl-.js.map +1 -0
  95. package/dist/assets/page-Bfk44QuW.js +2 -0
  96. package/dist/assets/page-Bfk44QuW.js.map +1 -0
  97. package/dist/assets/page-BiEYKai0.js +8 -0
  98. package/dist/assets/page-BiEYKai0.js.map +1 -0
  99. package/dist/assets/page-C45jnN3u.js +2 -0
  100. package/dist/assets/page-C45jnN3u.js.map +1 -0
  101. package/dist/assets/page-C76A3Tvm.js +2 -0
  102. package/dist/assets/page-C76A3Tvm.js.map +1 -0
  103. package/dist/assets/page-C7fj48Yd.js +2 -0
  104. package/dist/assets/page-C7fj48Yd.js.map +1 -0
  105. package/dist/assets/page-CQJx-JXR.js +2 -0
  106. package/dist/assets/page-CQJx-JXR.js.map +1 -0
  107. package/dist/assets/page-CgiAumZ6.js +2 -0
  108. package/dist/assets/page-CgiAumZ6.js.map +1 -0
  109. package/dist/assets/page-CrXiz4-J.js +2 -0
  110. package/dist/assets/page-CrXiz4-J.js.map +1 -0
  111. package/dist/assets/page-DGXyF1RD.js +2 -0
  112. package/dist/assets/page-DGXyF1RD.js.map +1 -0
  113. package/dist/assets/page-DL5wQ3pG.js +20 -0
  114. package/dist/assets/page-DL5wQ3pG.js.map +1 -0
  115. package/dist/assets/page-DXZrFCmr.js +2 -0
  116. package/dist/assets/page-DXZrFCmr.js.map +1 -0
  117. package/dist/assets/page-De2leEHb.js +2 -0
  118. package/dist/assets/page-De2leEHb.js.map +1 -0
  119. package/dist/assets/page-KrH4sIjg.js +2 -0
  120. package/dist/assets/page-KrH4sIjg.js.map +1 -0
  121. package/dist/assets/page-ZPLCKgGQ.js +5 -0
  122. package/dist/assets/page-ZPLCKgGQ.js.map +1 -0
  123. package/dist/assets/page-_daGpD2K.js +2 -0
  124. package/dist/assets/page-_daGpD2K.js.map +1 -0
  125. package/dist/assets/page-zpMXForS.js +2 -0
  126. package/dist/assets/page-zpMXForS.js.map +1 -0
  127. package/dist/assets/pdf-Dicw8YoH.js +55 -0
  128. package/dist/assets/pdf-Dicw8YoH.js.map +1 -0
  129. package/dist/assets/pdf.worker.min-CHFwMXne.mjs +29 -0
  130. package/dist/assets/pl-WSXK2UUD-DK_ieA8X.js +2 -0
  131. package/dist/assets/pl-WSXK2UUD-DK_ieA8X.js.map +1 -0
  132. package/dist/assets/pt-NWRJRUCK-I6-gHOkB.js +2 -0
  133. package/dist/assets/pt-NWRJRUCK-I6-gHOkB.js.map +1 -0
  134. package/dist/assets/ro-3CGVMOC6-wdwqXMaO.js +2 -0
  135. package/dist/assets/ro-3CGVMOC6-wdwqXMaO.js.map +1 -0
  136. package/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  137. package/dist/assets/routing-BJiyORAR.js +2 -0
  138. package/dist/assets/routing-BJiyORAR.js.map +1 -0
  139. package/dist/assets/routing-CygMogfF.js +2 -0
  140. package/dist/assets/routing-CygMogfF.js.map +1 -0
  141. package/dist/assets/sv-HGSEBA7S-2KvJx_dY.js +2 -0
  142. package/dist/assets/sv-HGSEBA7S-2KvJx_dY.js.map +1 -0
  143. package/dist/assets/th-NZ4G352Z-ZMBwAbgb.js +2 -0
  144. package/dist/assets/th-NZ4G352Z-ZMBwAbgb.js.map +1 -0
  145. package/dist/assets/tr-LGGS4DLW-BwMx3CfM.js +2 -0
  146. package/dist/assets/tr-LGGS4DLW-BwMx3CfM.js.map +1 -0
  147. package/dist/assets/uk-AIX536L4-cREJjolM.js +2 -0
  148. package/dist/assets/uk-AIX536L4-cREJjolM.js.map +1 -0
  149. package/dist/assets/vendor-BVP6ONpk.js +10 -0
  150. package/dist/assets/vendor-BVP6ONpk.js.map +1 -0
  151. package/dist/assets/vi-V6CVQZLQ-CXAniXLX.js +2 -0
  152. package/dist/assets/vi-V6CVQZLQ-CXAniXLX.js.map +1 -0
  153. package/dist/assets/web-D6kqUluK.js +2 -0
  154. package/dist/assets/web-D6kqUluK.js.map +1 -0
  155. package/dist/assets/zh-AGKPGI3L-MsKTx_dK.js +2 -0
  156. package/dist/assets/zh-AGKPGI3L-MsKTx_dK.js.map +1 -0
  157. package/dist/favicon-16x16.png +0 -0
  158. package/dist/favicon-32x32.png +0 -0
  159. package/dist/favicon.ico +0 -0
  160. package/dist/favicon.svg +47 -0
  161. package/dist/favicons/android-chrome-192x192.png +0 -0
  162. package/dist/favicons/android-chrome-512x512.png +0 -0
  163. package/dist/favicons/apple-touch-icon.png +0 -0
  164. package/dist/favicons/favicon-128x128.png +0 -0
  165. package/dist/favicons/favicon-16x16.png +0 -0
  166. package/dist/favicons/favicon-32x32.png +0 -0
  167. package/dist/favicons/favicon-48x48.png +0 -0
  168. package/dist/favicons/favicon-64x64.png +0 -0
  169. package/dist/favicons/favicon-96x96.png +0 -0
  170. package/dist/favicons/favicon.ico +0 -0
  171. package/dist/favicons/favicon.svg +47 -0
  172. package/dist/favicons/site.webmanifest +19 -0
  173. package/dist/index.html +23 -0
  174. package/dist/messages/ar.json +1034 -0
  175. package/dist/messages/bn.json +1034 -0
  176. package/dist/messages/cs.json +1034 -0
  177. package/dist/messages/da.json +1034 -0
  178. package/dist/messages/de.json +1034 -0
  179. package/dist/messages/el.json +1034 -0
  180. package/dist/messages/en.json +1034 -0
  181. package/dist/messages/es.json +1034 -0
  182. package/dist/messages/fa.json +1034 -0
  183. package/dist/messages/fi.json +1034 -0
  184. package/dist/messages/fr.json +1034 -0
  185. package/dist/messages/he.json +1034 -0
  186. package/dist/messages/hi.json +1034 -0
  187. package/dist/messages/id.json +1034 -0
  188. package/dist/messages/it.json +1034 -0
  189. package/dist/messages/ja.json +1034 -0
  190. package/dist/messages/ko.json +1034 -0
  191. package/dist/messages/ms.json +1034 -0
  192. package/dist/messages/nl.json +1034 -0
  193. package/dist/messages/no.json +1034 -0
  194. package/dist/messages/pl.json +1034 -0
  195. package/dist/messages/pt.json +1034 -0
  196. package/dist/messages/ro.json +1034 -0
  197. package/dist/messages/sv.json +1034 -0
  198. package/dist/messages/th.json +1034 -0
  199. package/dist/messages/tr.json +1034 -0
  200. package/dist/messages/uk.json +1034 -0
  201. package/dist/messages/vi.json +1034 -0
  202. package/dist/messages/zh.json +1034 -0
  203. package/package.json +26 -0
  204. package/server.js +149 -0
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@semiont/browser",
3
+ "version": "0.5.28",
4
+ "description": "Semiont Browser - pre-built Vite SPA with static file server",
5
+ "main": "server.js",
6
+ "bin": {
7
+ "semiont-browser": "server.js"
8
+ },
9
+ "files": [
10
+ "server.js",
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "start": "node server.js"
15
+ },
16
+ "dependencies": {},
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/The-AI-Alliance/semiont.git",
23
+ "directory": "apps/browser"
24
+ },
25
+ "license": "Apache-2.0"
26
+ }
package/server.js ADDED
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Minimal static file server for the Semiont frontend SPA.
4
+ * Serves the Vite-built dist/ directory with SPA fallback (all routes → index.html),
5
+ * plus the launcher's KB discovery document under /discovery/* — served or 404,
6
+ * NEVER the SPA fallback (a 200 index.html would be indistinguishable from data;
7
+ * see .plans/BROWSER-KB-DISCOVERY.md L2a).
8
+ *
9
+ * Environment variables:
10
+ * PORT - port to listen on (default: 3000)
11
+ */
12
+ 'use strict';
13
+
14
+ const http = require('http');
15
+ const fs = require('fs');
16
+ const path = require('path');
17
+ const crypto = require('crypto');
18
+
19
+ const MIME_TYPES = {
20
+ '.html': 'text/html; charset=utf-8',
21
+ '.js': 'application/javascript; charset=utf-8',
22
+ '.mjs': 'application/javascript; charset=utf-8',
23
+ '.css': 'text/css; charset=utf-8',
24
+ '.json': 'application/json; charset=utf-8',
25
+ '.png': 'image/png',
26
+ '.jpg': 'image/jpeg',
27
+ '.jpeg': 'image/jpeg',
28
+ '.gif': 'image/gif',
29
+ '.svg': 'image/svg+xml',
30
+ '.ico': 'image/x-icon',
31
+ '.woff': 'font/woff',
32
+ '.woff2':'font/woff2',
33
+ '.ttf': 'font/ttf',
34
+ '.otf': 'font/otf',
35
+ '.webmanifest': 'application/manifest+json',
36
+ '.pdf': 'application/pdf',
37
+ '.txt': 'text/plain; charset=utf-8',
38
+ '.xml': 'application/xml',
39
+ };
40
+
41
+ function serveFile(res, filePath, ext) {
42
+ const contentType = MIME_TYPES[ext] || 'application/octet-stream';
43
+ res.writeHead(200, { 'Content-Type': contentType });
44
+ fs.createReadStream(filePath).pipe(res);
45
+ }
46
+
47
+ function notFound(res) {
48
+ res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
49
+ res.end('Not found');
50
+ }
51
+
52
+ /**
53
+ * The /discovery/* prefix: files from the launcher's read-only mount, served
54
+ * or 404 — no SPA fallback. Content-hash ETag + no-cache makes consumer
55
+ * polling a revalidation round-trip (304 when unchanged).
56
+ */
57
+ function serveDiscovery(req, res, urlPath, discoveryDir) {
58
+ const rel = urlPath.slice('/discovery'.length).replace(/^\/+/, '');
59
+ if (!rel) {
60
+ notFound(res);
61
+ return;
62
+ }
63
+
64
+ // Containment guard: the resolved path must stay inside the mount.
65
+ const resolved = path.resolve(discoveryDir, rel);
66
+ if (!resolved.startsWith(path.resolve(discoveryDir) + path.sep)) {
67
+ notFound(res);
68
+ return;
69
+ }
70
+
71
+ let content;
72
+ try {
73
+ content = fs.readFileSync(resolved); // EISDIR / ENOENT → 404
74
+ } catch {
75
+ notFound(res);
76
+ return;
77
+ }
78
+
79
+ const etag = '"' + crypto.createHash('sha1').update(content).digest('hex') + '"';
80
+ if (req.headers['if-none-match'] === etag) {
81
+ res.writeHead(304, { 'ETag': etag, 'Cache-Control': 'no-cache' });
82
+ res.end();
83
+ return;
84
+ }
85
+
86
+ const ext = path.extname(resolved).toLowerCase();
87
+ res.writeHead(200, {
88
+ 'Content-Type': MIME_TYPES[ext] || 'application/octet-stream',
89
+ 'ETag': etag,
90
+ 'Cache-Control': 'no-cache',
91
+ });
92
+ res.end(content);
93
+ }
94
+
95
+ function createHandler({ distDir, discoveryDir }) {
96
+ return (req, res) => {
97
+ // Strip query string
98
+ const urlPath = req.url.split('?')[0];
99
+
100
+ if (urlPath === '/discovery' || urlPath === '/discovery/' || urlPath.startsWith('/discovery/')) {
101
+ serveDiscovery(req, res, urlPath, discoveryDir);
102
+ return;
103
+ }
104
+
105
+ // Security: prevent directory traversal
106
+ const safePath = path.normalize(urlPath).replace(/^(\.\.[/\\])+/, '');
107
+ const filePath = path.join(distDir, safePath);
108
+
109
+ const ext = path.extname(filePath).toLowerCase();
110
+
111
+ // Try to serve the exact file
112
+ if (ext && fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {
113
+ serveFile(res, filePath, ext);
114
+ return;
115
+ }
116
+
117
+ // SPA fallback: all non-file routes serve index.html
118
+ const indexPath = path.join(distDir, 'index.html');
119
+ if (!fs.existsSync(indexPath)) {
120
+ res.writeHead(500, { 'Content-Type': 'text/plain' });
121
+ res.end('Frontend not built: index.html not found');
122
+ return;
123
+ }
124
+ serveFile(res, indexPath, '.html');
125
+ };
126
+ }
127
+
128
+ module.exports = { createHandler };
129
+
130
+ if (require.main === module) {
131
+ const PORT = parseInt(process.env.PORT || '3000', 10);
132
+
133
+ const server = http.createServer(createHandler({
134
+ // dist/ is a sibling of this file in the published package
135
+ distDir: path.join(__dirname, 'dist'),
136
+ // The launcher's read-only mount (see BROWSER-KB-DISCOVERY L1); absent
137
+ // outside the container, so the prefix just 404s ("absent").
138
+ discoveryDir: '/discovery',
139
+ }));
140
+
141
+ server.listen(PORT, '0.0.0.0', () => {
142
+ console.log(`Semiont frontend listening on port ${PORT}`);
143
+ });
144
+
145
+ server.on('error', (err) => {
146
+ console.error('Frontend server error:', err);
147
+ process.exit(1);
148
+ });
149
+ }