@sansynx/erroratlas 0.1.2 → 0.1.4

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.
@@ -1,5 +1,14 @@
1
1
  import { buildPlaybookMarkdown, errorSignature, redactText, titleFromError } from "../shared/redaction";
2
- import { faviconSvg } from "./assets";
2
+ import { faviconSvg, sequencePngBase64 } from "./assets";
3
+ function base64ToArrayBuffer(value) {
4
+ const binary = atob(value);
5
+ const buffer = new ArrayBuffer(binary.length);
6
+ const bytes = new Uint8Array(buffer);
7
+ for (let index = 0; index < binary.length; index += 1) {
8
+ bytes[index] = binary.charCodeAt(index);
9
+ }
10
+ return buffer;
11
+ }
3
12
  import { encryptSensitivePayload } from "./crypto";
4
13
  import { clampLimit, handleError, html, json, options, randomToken, readJson, sha256Hex, text } from "./http";
5
14
  import { configured, requireScope, resolveActor, supabaseRest } from "./supabase";
@@ -28,6 +37,14 @@ export default {
28
37
  if (request.method === "GET" && (url.pathname === "/favicon.svg" || url.pathname === "/public/favicon.svg")) {
29
38
  return text(faviconSvg, 200, "image/svg+xml; charset=utf-8");
30
39
  }
40
+ if (request.method === "GET" && (url.pathname === "/sequence.png" || url.pathname === "/public/sequence.png")) {
41
+ return new Response(base64ToArrayBuffer(sequencePngBase64), {
42
+ headers: {
43
+ "cache-control": "public, max-age=86400",
44
+ "content-type": "image/png",
45
+ },
46
+ });
47
+ }
31
48
  if (request.method === "GET" && url.pathname === "/setup") {
32
49
  return html(renderSetupGuideUi(env, url.origin));
33
50
  }
package/dist/worker/ui.js CHANGED
@@ -369,6 +369,9 @@ button { cursor: pointer; }
369
369
  .nav-links { display: flex; align-items: center; gap: 10px; color: var(--body); }
370
370
  .nav-links a,
371
371
  .nav-links button { display: inline-flex; align-items: center; justify-content: center; }
372
+ .nav-actions {
373
+ display: contents;
374
+ }
372
375
  .nav-menu {
373
376
  display: none;
374
377
  min-height: 38px;
@@ -674,7 +677,6 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
674
677
  }
675
678
  .nav-menu {
676
679
  display: inline-flex;
677
- justify-self: end;
678
680
  width: 40px;
679
681
  height: 40px;
680
682
  padding: 0;
@@ -712,6 +714,21 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
712
714
  transform: translateY(-4px);
713
715
  transition: max-height 240ms ease, opacity 180ms ease, transform 220ms ease, margin 220ms ease, padding 220ms ease, border-color 180ms ease;
714
716
  }
717
+ .nav-actions {
718
+ display: flex;
719
+ justify-self: end;
720
+ align-items: center;
721
+ gap: 4px;
722
+ }
723
+ .nav-actions .theme-toggle {
724
+ display: inline-flex;
725
+ width: 38px;
726
+ min-width: 38px;
727
+ height: 38px;
728
+ min-height: 38px;
729
+ border: 0;
730
+ background: transparent;
731
+ }
715
732
  .nav.open .nav-links {
716
733
  max-height: 260px;
717
734
  margin: 6px 0 0;
@@ -722,7 +739,6 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
722
739
  transform: translateY(0);
723
740
  }
724
741
  .nav-links .button,
725
- .nav-links .theme-toggle,
726
742
  .nav-links > a:not(.button) {
727
743
  width: 100%;
728
744
  min-height: 40px;
@@ -812,31 +828,6 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
812
828
  padding-left: 12px;
813
829
  transform: none;
814
830
  }
815
- .nav.open .theme-toggle {
816
- width: 100%;
817
- height: 46px;
818
- min-height: 46px;
819
- min-width: 0;
820
- justify-content: flex-start;
821
- gap: 10px;
822
- padding: 0 4px;
823
- border: 0;
824
- border-bottom: 1px solid var(--line);
825
- border-radius: 0;
826
- background: transparent;
827
- color: var(--fg);
828
- box-shadow: none;
829
- }
830
- .nav.open .theme-toggle:hover {
831
- background: var(--surface-2);
832
- padding-left: 12px;
833
- transform: none;
834
- }
835
- .nav.open .theme-toggle::after {
836
- content: "Theme";
837
- font-size: 13px;
838
- font-weight: 500;
839
- }
840
831
  .nav.open .nav-links > *:last-child {
841
832
  border-bottom: 0;
842
833
  }
@@ -857,19 +848,16 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
857
848
  padding-left: 4px;
858
849
  }
859
850
  .brand::before {
860
- content: "";
861
- width: 9px;
862
- height: 9px;
863
- border-radius: 999px;
864
- background: var(--fg);
865
- box-shadow: 0 0 0 4px var(--surface-2);
851
+ display: none;
852
+ content: none;
866
853
  }
867
854
  .nav-links {
868
855
  gap: 6px;
869
856
  }
870
857
  .nav-links > a:not(.button),
871
858
  .nav-links .button,
872
- .nav-links .theme-toggle {
859
+ .nav-links .theme-toggle,
860
+ .nav-actions .theme-toggle {
873
861
  height: 38px;
874
862
  min-height: 38px;
875
863
  border-radius: 12px;
@@ -935,20 +923,27 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
935
923
  @media (max-width: 760px) {
936
924
  .nav {
937
925
  margin-top: 12px;
938
- border-radius: 18px;
939
- background: var(--surface);
940
- box-shadow: 0 16px 52px rgba(0, 0, 0, 0.12);
926
+ padding: 10px 0;
927
+ border-color: transparent;
928
+ border-radius: 0;
929
+ background: transparent;
930
+ box-shadow: none;
941
931
  }
942
932
  .nav.open {
943
- border-radius: 20px;
944
- padding: 10px;
933
+ padding: 10px 0 0;
934
+ border-radius: 0;
935
+ background: transparent;
936
+ border-color: transparent;
937
+ box-shadow: none;
945
938
  }
946
939
  .nav.open .nav-links {
947
- padding-top: 10px;
940
+ margin-top: 14px;
941
+ padding: 12px 0 0;
942
+ border-top: 1px solid var(--line);
943
+ background: transparent;
948
944
  }
949
945
  .nav.open .nav-links .button,
950
- .nav.open .nav-links > a:not(.button),
951
- .nav.open .theme-toggle {
946
+ .nav.open .nav-links > a:not(.button) {
952
947
  justify-content: flex-start;
953
948
  height: 44px;
954
949
  min-height: 44px;
@@ -956,6 +951,7 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
956
951
  border-radius: 12px;
957
952
  border: 0;
958
953
  border-bottom: 0;
954
+ background: transparent;
959
955
  }
960
956
  .secret-copy-row {
961
957
  grid-template-columns: 1fr;
@@ -964,6 +960,48 @@ ul, ol { margin: 0; padding-left: 20px; color: var(--body); }
964
960
  width: 100%;
965
961
  }
966
962
  }
963
+ .nav-menu {
964
+ background: transparent;
965
+ }
966
+ @media (max-width: 760px) {
967
+ .brand {
968
+ padding-left: 0;
969
+ font-size: 14px;
970
+ height: 40px;
971
+ align-items: center;
972
+ }
973
+ .nav-menu {
974
+ justify-self: end;
975
+ width: 38px;
976
+ min-width: 38px;
977
+ height: 38px;
978
+ background: transparent;
979
+ }
980
+ .nav.open .nav-links {
981
+ gap: 8px;
982
+ }
983
+ .nav.open .nav-menu {
984
+ background: transparent;
985
+ }
986
+ .nav.open .nav-links .button,
987
+ .nav.open .nav-links > a:not(.button) {
988
+ align-items: center;
989
+ justify-content: center;
990
+ padding-left: 0;
991
+ padding-right: 0;
992
+ font-size: 14px;
993
+ line-height: 1;
994
+ text-align: center;
995
+ }
996
+ .landing-page .hero,
997
+ .setup-page .hero {
998
+ justify-items: center;
999
+ text-align: center;
1000
+ }
1001
+ .landing-page .hero {
1002
+ padding-top: 64px;
1003
+ }
1004
+ }
967
1005
  </style>`;
968
1006
  }
969
1007
  export function renderLandingUi(env) {
@@ -974,6 +1012,7 @@ export function renderLandingUi(env) {
974
1012
  <meta charset="utf-8">
975
1013
  <meta name="viewport" content="width=device-width, initial-scale=1">
976
1014
  <title>${appName}</title>
1015
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
977
1016
  ${themeBootScript()}
978
1017
  ${sharedCss()}
979
1018
  <style>
@@ -1140,6 +1179,10 @@ ${sharedCss()}
1140
1179
  }
1141
1180
  .footer {
1142
1181
  flex-direction: column;
1182
+ align-items: center;
1183
+ justify-content: center;
1184
+ text-align: center;
1185
+ width: 100%;
1143
1186
  }
1144
1187
  }
1145
1188
  </style>
@@ -1148,10 +1191,12 @@ ${sharedCss()}
1148
1191
  <div class="shell narrow">
1149
1192
  <nav class="nav">
1150
1193
  <a href="/" class="brand">ErrorAtlas</a>
1151
- <button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
1194
+ <div class="nav-actions">
1195
+ <button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
1196
+ <button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
1197
+ </div>
1152
1198
  <div class="nav-links" id="navLinks">
1153
1199
  <a href="/setup">Setup</a>
1154
- <button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
1155
1200
  <a class="button primary" href="/dashboard">Dashboard</a>
1156
1201
  </div>
1157
1202
  </nav>
@@ -1210,6 +1255,7 @@ export function renderSetupGuideUi(env, requestOrigin) {
1210
1255
  <meta charset="utf-8">
1211
1256
  <meta name="viewport" content="width=device-width, initial-scale=1">
1212
1257
  <title>${appName} Setup</title>
1258
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
1213
1259
  ${themeBootScript()}
1214
1260
  ${sharedCss()}
1215
1261
  <style>
@@ -1318,9 +1364,6 @@ ${sharedCss()}
1318
1364
  font-weight: 600;
1319
1365
  }
1320
1366
  @media (max-width: 760px) {
1321
- .setup-page .nav {
1322
- border-radius: 999px;
1323
- }
1324
1367
  .setup-page .nav-links {
1325
1368
  border-top: 1px solid var(--line);
1326
1369
  }
@@ -1350,10 +1393,12 @@ ${sharedCss()}
1350
1393
  <div class="shell narrow">
1351
1394
  <nav class="nav">
1352
1395
  <a href="/" class="brand">ErrorAtlas</a>
1353
- <button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
1396
+ <div class="nav-actions">
1397
+ <button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
1398
+ <button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
1399
+ </div>
1354
1400
  <div class="nav-links" id="navLinks">
1355
1401
  <a href="/dashboard">Dashboard</a>
1356
- <button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
1357
1402
  <a class="button primary" href="/">Home</a>
1358
1403
  </div>
1359
1404
  </nav>
@@ -1495,6 +1540,7 @@ export function renderDashboardUi(env) {
1495
1540
  <meta charset="utf-8">
1496
1541
  <meta name="viewport" content="width=device-width, initial-scale=1">
1497
1542
  <title>${appName} Dashboard</title>
1543
+ <link rel="icon" href="/favicon.svg" type="image/svg+xml">
1498
1544
  ${themeBootScript()}
1499
1545
  ${sharedCss()}
1500
1546
  <style>
@@ -1843,10 +1889,12 @@ ${sharedCss()}
1843
1889
  <div class="shell">
1844
1890
  <nav class="nav">
1845
1891
  <a href="/" class="brand">ErrorAtlas</a>
1846
- <button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
1892
+ <div class="nav-actions">
1893
+ <button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
1894
+ <button class="nav-menu" id="navMenu" type="button" aria-expanded="false" aria-controls="navLinks" aria-label="Open navigation"><span class="nav-menu-lines" aria-hidden="true"><span class="nav-menu-line"></span><span class="nav-menu-line"></span><span class="nav-menu-line"></span></span></button>
1895
+ </div>
1847
1896
  <div class="nav-links" id="navLinks">
1848
1897
  <a href="/setup">Setup</a>
1849
- <button class="theme-toggle" id="themeToggle" type="button" aria-label="Switch theme" title="Switch theme"><span class="theme-toggle-icon" aria-hidden="true"></span></button>
1850
1898
  <a class="button primary" href="/">Home</a>
1851
1899
  </div>
1852
1900
  </nav>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sansynx/erroratlas",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Hosted ErrorAtlas MCP client and local debugging memory tools for coding agents.",
@@ -27,7 +27,6 @@
27
27
  "deploy": "wrangler deploy",
28
28
  "build": "npm run sync:assets && tsc -p tsconfig.json",
29
29
  "typecheck": "tsc --noEmit",
30
- "test:e2e": "npm run build && node scripts/e2e-smoke.mjs",
31
30
  "prepack": "npm run build",
32
31
  "mcp": "tsx src/mcp/server.ts",
33
32
  "cli": "tsx src/cli/index.ts"
Binary file