pi-webapp 0.1.9 → 0.1.11

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 (68) hide show
  1. package/dist/extension.js +21 -16
  2. package/docs/sentry.md +62 -1
  3. package/package.json +4 -2
  4. package/web/dist/.vite/manifest.json +17 -17
  5. package/web/dist/assets/{app-B2Ac56ic.js → app-Bt_cH1DY.js} +74 -76
  6. package/web/dist/assets/app.js +6 -8
  7. package/web/dist/assets/asciidoc-fDuF7HNn.js +0 -2
  8. package/web/dist/assets/bat-CIKKTCO7.js +0 -2
  9. package/web/dist/assets/bibtex-D13O2Wvh.js +0 -2
  10. package/web/dist/assets/c-BxgHfdNM.js +0 -2
  11. package/web/dist/assets/clojure-CiHGeAtp.js +0 -2
  12. package/web/dist/assets/cmake-DmzJtVCe.js +0 -2
  13. package/web/dist/assets/cpp-WTsyTmWk.js +0 -2
  14. package/web/dist/assets/csharp-BusYHIEz.js +0 -2
  15. package/web/dist/assets/css-D-q0lhfR.js +0 -2
  16. package/web/dist/assets/csv-DFLln536.js +0 -2
  17. package/web/dist/assets/dart-CafiI-9_.js +0 -2
  18. package/web/dist/assets/diff-Br1ISN9_.js +0 -2
  19. package/web/dist/assets/dotenv-CIz2XDph.js +0 -2
  20. package/web/dist/assets/elixir-DRaGIFOe.js +0 -2
  21. package/web/dist/assets/erlang-NGps-vi9.js +0 -2
  22. package/web/dist/assets/fish-ByHW6pZw.js +0 -2
  23. package/web/dist/assets/fsharp-BOBx9XdV.js +0 -2
  24. package/web/dist/assets/go-BeHf35-M.js +0 -2
  25. package/web/dist/assets/{graphql-DvPK7yuL.js → graphql-DE5WRYe4.js} +1 -3
  26. package/web/dist/assets/groovy-zjY2ZfG0.js +0 -2
  27. package/web/dist/assets/haskell-CMvfT32Y.js +0 -2
  28. package/web/dist/assets/hcl-RKiXyu-a.js +0 -2
  29. package/web/dist/assets/html-DsaiN7Ee.js +0 -2
  30. package/web/dist/assets/html-derivative-CADUTaWI.js +0 -2
  31. package/web/dist/assets/{http-B5WHvjtS.js → http-d6mcwHrJ.js} +1 -3
  32. package/web/dist/assets/ini-DuzuNcum.js +0 -2
  33. package/web/dist/assets/java-K8yEFi64.js +0 -2
  34. package/web/dist/assets/javascript-D_ijBMSX.js +0 -2
  35. package/web/dist/assets/julia-BCSipsbD.js +0 -2
  36. package/web/dist/assets/kotlin-BSbocnsc.js +0 -2
  37. package/web/dist/assets/latex-B2rh6wcV.js +0 -2
  38. package/web/dist/assets/less-DrDudO82.js +0 -2
  39. package/web/dist/assets/log-ljR8DmTe.js +0 -2
  40. package/web/dist/assets/lua-DyIUvKwX.js +0 -2
  41. package/web/dist/assets/make-D75dUjYA.js +0 -2
  42. package/web/dist/assets/markdown-CW047eNb.js +0 -2
  43. package/web/dist/assets/mdx-XsqTTZB4.js +0 -2
  44. package/web/dist/assets/nix-CipIrdNI.js +0 -2
  45. package/web/dist/assets/perl-D7RI67n_.js +0 -2
  46. package/web/dist/assets/{php-s52DiJil.js → php-RwSFu5XI.js} +1 -3
  47. package/web/dist/assets/powershell-jgDnaG9I.js +0 -2
  48. package/web/dist/assets/proto-BIjSd36w.js +0 -2
  49. package/web/dist/assets/python-D7_Ztkaq.js +0 -2
  50. package/web/dist/assets/r-CJzV5ecV.js +0 -2
  51. package/web/dist/assets/{rst-CN3AX0Wt.js → rst-Bcl8mngr.js} +1 -3
  52. package/web/dist/assets/{ruby-TeaxAh4o.js → ruby-DiBb-yPX.js} +1 -3
  53. package/web/dist/assets/rust-DSBpfBj6.js +0 -2
  54. package/web/dist/assets/scala-C5J7wQ_u.js +0 -2
  55. package/web/dist/assets/scss-Ce0Xtdy1.js +0 -2
  56. package/web/dist/assets/sql-B8q9hRYB.js +0 -2
  57. package/web/dist/assets/style.css +1 -1
  58. package/web/dist/assets/{svelte-D-qO2kbs.js → svelte-CNtCH4kD.js} +1 -3
  59. package/web/dist/assets/swift-BYyWkiAC.js +0 -2
  60. package/web/dist/assets/system-verilog-DeQRavVp.js +0 -2
  61. package/web/dist/assets/telemetry-client-BUyFe34_.js +0 -2
  62. package/web/dist/assets/toml-D4Tpftfr.js +0 -2
  63. package/web/dist/assets/vb-CT8kYl35.js +0 -2
  64. package/web/dist/assets/verilog-CRrcH6Pt.js +0 -2
  65. package/web/dist/assets/{vue-xQhdtb6A.js → vue-CRYi94cV.js} +1 -3
  66. package/web/dist/assets/xml-DCBoxqhY.js +0 -2
  67. package/web/dist/assets/yaml-jmrW97Mk.js +0 -2
  68. package/web/src/ui/shared/LICENSE.txt +0 -21
package/docs/sentry.md CHANGED
@@ -20,12 +20,41 @@ Replace the example with your project's public DSN. `PI_WEB_SENTRY_BROWSER_DSN`
20
20
  - Extension request/workspace/configuration failures, asynchronous Agent and tool failures, and provider-login failures. Fatal exceptions attributable to this extension are best effort; process exit can prevent delivery.
21
21
  - Sanitized stack locations and causes, build/release versions, runtime/platform, model and session-state summaries, anonymous session identifiers, request/operation IDs and up to 100 semantic breadcrumbs (64 KiB total).
22
22
 
23
- User cancellation, stopping an Agent, normal shutdown, known validation failures and stale-session conflicts are excluded. No conversation, source contents, attachments, login values, request/response bodies, console output or DOM recordings are deliberately collected. Agent/provider error messages are replaced with generic diagnostic labels. Other exception text is scrubbed for credentials, URLs, quoted values, email addresses and absolute paths. Arbitrary free-form exception messages cannot be classified perfectly; do not put private data in exceptions.
23
+ User cancellation, stopping an Agent, normal shutdown, known request validation failures and stale-session conflicts are excluded. Recognized tool validation failures remain as warning events. No conversation, source contents, attachments, login values, request/response bodies, console output or DOM recordings are deliberately collected. Agent/provider error messages are replaced with generic diagnostic labels. Other exception text is scrubbed for credentials, URLs, quoted values (including multiple lines), email addresses and paths. Arbitrary free-form exception messages cannot be classified perfectly; do not put private data in exceptions.
24
24
 
25
25
  Browser events go directly to the configured Sentry host with no Pi authorization header, cookies or referrer. The authenticated configuration endpoint returns only the public DSN and build metadata. Node reporting uses a private client and explicit scopes without initializing a global SDK or changing Pi's uncaught-error/async-context handling; inherited SDK attachments are discarded before sending.
26
26
 
27
+ ## Diagnosing a tool failure
28
+
29
+ Both TUI and SDK workspace sessions observe `tool_execution_start/end`. A failed `message_end` is a fallback only: the same tool call is not reported twice. Tool execution behavior and visible results are unchanged.
30
+
31
+ | Diagnostic field | Meaning |
32
+ | --- | --- |
33
+ | `toolName`, `toolId` | Standard built-in name, or `custom` with a stable 16-character SHA-256 identifier; private custom tool names are not uploaded. |
34
+ | `toolCallId`, `session` | Salted anonymous identities for correlation within the running process. |
35
+ | `requestId`, `operationId` | Correlation copied at tool start; `/api/resume` receives a new operation ID. |
36
+ | `failureKind`, `errorCode` | Classified reason and recognized code, including `ENOENT`, `EACCES`, or `nonzero_exit`. |
37
+ | `exitCode`, `durationMs`, `timeoutMs` | Known process status, monotonic elapsed time, and timeout. Missing evidence stays absent. |
38
+ | `diagnosticSource` | `tool_execution_end` or `message_end`. |
39
+ | `originalStackAvailable` | Whether the captured failure includes an original exception stack. |
40
+ | `errorSummary`, `summaryOmitted`, `summaryOmittedReason` | At most two diagnostic lines / 512 characters, or an explicit explanation of unavailable text. |
41
+
42
+ `cancelled` and explicit `blocked` results produce breadcrumbs without error events. Recognized `validation`, `not_found`, `permission`, `timeout`, and `process_exit` tool results are warnings. `unknown` failures and actual program exceptions remain errors. Cancellation requires a marked in-progress call or an exact SDK cancellation format; merely clearing a session does not classify its failures as cancelled. A cancellation request does not suppress an independent program exception.
43
+
44
+ Summaries are reconstructed from recognized diagnostic formats rather than uploading redacted stdout/stderr. For example, `bash: process_exit (nonzero_exit)` carries `Command exited with code 127`; a file failure carries `ENOENT: no such file or directory` and a recognized filesystem operation when available. Paths, arbitrary output, arguments, and error details objects are not uploaded. Unrecognized free text is omitted. Actual tool exception types, stack frames and Error cause chains are retained, but arbitrary exception messages are replaced with a safe diagnostic label.
45
+
46
+ Pi can convert an exception to a tool-result string before pi-webapp sees it. These events have `originalStackAvailable=false` and **no synthetic observer stack**. Source maps cannot recover a stack that the SDK discarded. The local tool card remains the source of full output; this release adds no diagnostic export or SDK changes.
47
+
48
+ Result-only errors group by tool identity, failure kind and stable error code; request IDs, release versions, summaries and timestamps do not fragment the issue. Actual exceptions use Sentry's stack-based grouping. The same key controls local rate limiting, so `repeats` counts suppressed events of the same diagnostic class, not necessarily retries of the same call. Unknown causes within the same tool remain grouped because their missing text cannot safely distinguish them.
49
+
50
+ Breadcrumbs include `agent_start`, `agent_end`, `tool_start`, `tool_end`, `tool_failed`, `tool_cancelled`, `tool_blocked`, `cancel` and `resume`. Do not infer a retry relationship from separate calls. Each runtime retains at most 256 pending snapshots and 256 completion markers, with oldest-first eviction and cleanup at settle, switch, shutdown and reload. Evicted calls can still report failures, but may lack timing or deduplication evidence. Disabled reporting does not retain diagnostic snapshots or inspect results.
51
+
52
+ Filter Sentry by `side:node`, `toolName`, `failureKind` and `errorCode`, then inspect the diagnostic context and the correlated breadcrumbs. Reproduce the recognized condition with a regression test; after publishing, compare events across releases and check whether the same condition still occurs. Configure urgent error alerts for `level:error`, excluding `environment:sentry-verification`. Retain warning issues for diagnosis and trends rather than urgent paging. Updating the alert rules is a Sentry administration step, independent of the code changes.
53
+
27
54
  ## Performance and reliability
28
55
 
56
+ After an accepted update, browser version polling retains temporary network failures as `request_failed` breadcrumbs while waiting for the restarted service. If the target version is still unavailable after 60 seconds, it stops polling and reports one `stage=update_restart`, `code=update_restart_timeout` error, even if a request is still pending. Closing settings cancels the pending request and deadline. HTTP and response parsing failures, and network failures from other requests, retain normal reporting.
57
+
29
58
  Each side sends at most 20 events/minute and one event per fingerprint/minute. Repetition counts appear on the next retained event. Startup and transport queues are bounded to 20 events. Transport requests time out after 3 seconds, do not persist offline, and do not retry indefinitely. Rate-limited/dropped events are intentionally lossy. Browser configuration has a 1-second timeout and never gates rendering; SDKs load only when reporting is enabled. No tracing, profiling, automatic console/DOM instrumentation or token-by-token logging is enabled.
30
59
 
31
60
  Request failures and asynchronous error events include additive `errorId`, `requestId`, `operationId`, `errorCode` and `errorReported` metadata. `errorReported` prevents the browser from bypassing server-side deduplication/rate limits. Protocol version 7 is retained. A `shutdown` event stops reconnection on normal exit; controlled launcher upgrades mark it with `reconnect: true` so the browser reconnects without reporting the expected interruption. A changed build ID replaces a retained bridge on `/web` after `/reload` so its static manifest matches the new assets.
@@ -45,6 +74,38 @@ npm run build:sentry
45
74
 
46
75
  Use `SENTRY_BROWSER_PROJECT` / `SENTRY_NODE_PROJECT` for separate projects. The upload-required command fails on missing credentials or upload failure, and still removes maps from public output. Do not publish after a failed command. Auth tokens are never part of runtime configuration. The ordinary npm `prepack` rebuilds locally without uploading; use `npm pack --ignore-scripts` or `npm publish --ignore-scripts` only after checks and a successful `build:sentry` to package the exact uploaded artifacts.
47
76
 
77
+ ### Required Actions configuration
78
+
79
+ The publishing workflow now fails closed until both credentials exist:
80
+
81
+ - Repository secret `SENTRY_AUTH_TOKEN`: source-map upload and release permissions.
82
+ - Repository secret `SENTRY_VERIFY_AUTH_TOKEN`: event/project read permission (`project:read` or equivalent).
83
+ - Optional repository variables `SENTRY_ORG` (default `soft`), `SENTRY_PROJECT` (default `pi-webapp`), `SENTRY_NODE_PROJECT`, `SENTRY_BROWSER_PROJECT`, and `SENTRY_URL` (default `https://us.sentry.io/`).
84
+ - Optional public DSN variables `PI_WEB_SENTRY_NODE_DSN` and `PI_WEB_SENTRY_BROWSER_DSN`. Both default to the built-in project; when using separate projects, configure each matching DSN as well.
85
+
86
+ Setting repository secrets requires an existing credential from the Sentry administrator. The code does not generate credentials or grant Sentry access. Do not put tokens in Actions variables or runtime configuration.
87
+
88
+ ### Verify and publish the exact package
89
+
90
+ After the uploaded build, run:
91
+
92
+ ```sh
93
+ mkdir -p .ci/release
94
+ npm pack --ignore-scripts --json --pack-destination .ci/release > .ci/release/pack.json
95
+ npm run verify:package -- --pack-manifest .ci/release/pack.json
96
+ # Requires SENTRY_VERIFY_AUTH_TOKEN, SENTRY_ORG and the destination project(s).
97
+ npm run verify:sentry -- --pack-manifest .ci/release/pack.json
98
+ node scripts/publish-verified-release.mjs
99
+ ```
100
+
101
+ `verify:package` checks every packaged Node/browser asset against `.sentry-artifacts/<buildId>/`, confirms matching release literals and JS/map Debug IDs, rejects extra or missing assets, and checks that private maps are excluded. To inspect an older archive explicitly, pass `--archive PATH`. Both verification commands also accept `--tarball FILE`.
102
+
103
+ `verify:sentry` first checks credentials and the package, then invokes the packaged Node verification entry and serves the packaged browser assets on loopback with synthetic configuration. It sends only synthetic events to the configured Sentry DSNs with `environment=sentry-verification`; normal imports and normal browser environments do not run these probes. The Node entry requires `PI_WEB_SENTRY_VERIFY_RELEASE=true` and the verification environment; the browser requires a verification-configured server and the explicit `sentry_release_probe=1` URL flag. The CLI sets up these guards itself.
104
+
105
+ The verifier waits at most 120 seconds for the real events, checks release/build/side/Debug IDs, and requires original application frames to resolve to TypeScript. The synthetic exception must resolve to the exact source file and line recorded in the archived map. Browser maps give application sources stable `app:///web/src/` and `app:///shared/` paths before upload. Unmapped external SDK dependencies do not invalidate resolved application frames. A successful run writes `.ci/release/verified.json` with event IDs and the tarball SHA-256. The publisher verifies that receipt and hash before publishing that tarball with lifecycle scripts disabled. Missing credentials, failed uploads, mismatched package assets, unmapped application frames, missing receipts, or changed tarballs block publication. Version synchronization to main occurs only after these checks succeed.
106
+
107
+ For mapping failures, use Sentry's event source-map debugger or its `source-map-debug` API, and inspect matching Debug IDs for application bundles. Old tool-result events without original stacks remain limited even after source maps are uploaded.
108
+
48
109
  ## Verification and finding an error
49
110
 
50
111
  Run `npm run check`, `npm run test`, `npm run build`, then `npm run test:browser`. Install test Chromium with `npx playwright install chromium`; on a machine with Chrome use `PI_WEB_TEST_CHROME=true npm run test:browser`. Browser tests intercept a synthetic Sentry destination and do not send to a real project. Optional performance comparison: `PI_WEB_TEST_CHROME=true PI_WEB_BENCHMARK=true npm run test:browser -- --grep 'streaming frame budget'`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-webapp",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "type": "module",
5
5
  "description": "A browser interface for Pi with live chat, workspaces, models, and attachments",
6
6
  "repository": {
@@ -15,7 +15,7 @@
15
15
  "pi-webapp": "./bin/pi-webapp.mjs"
16
16
  },
17
17
  "pi": {
18
- "image": "https://cdn.jsdelivr.net/npm/pi-webapp@0.1.9/assets/cover-webapp.png",
18
+ "image": "https://cdn.jsdelivr.net/npm/pi-webapp@0.1.11/assets/cover-webapp.png",
19
19
  "extensions": [
20
20
  "./dist/extension.js"
21
21
  ]
@@ -43,6 +43,8 @@
43
43
  "prepack": "npm run build",
44
44
  "prepublishOnly": "npm run check && npm run build && npm run test",
45
45
  "build:sentry": "node scripts/build.mjs all --sentry",
46
+ "verify:package": "node scripts/verify-sentry-release.mjs --package-only",
47
+ "verify:sentry": "node scripts/verify-sentry-release.mjs --live",
46
48
  "test:browser": "playwright test"
47
49
  },
48
50
  "publishConfig": {
@@ -122,13 +122,13 @@
122
122
  "isDynamicEntry": true
123
123
  },
124
124
  "../../node_modules/@shikijs/langs/dist/graphql.mjs": {
125
- "file": "assets/graphql-DvPK7yuL.js",
125
+ "file": "assets/graphql-DE5WRYe4.js",
126
126
  "name": "graphql",
127
127
  "src": "../../node_modules/@shikijs/langs/dist/graphql.mjs",
128
128
  "isDynamicEntry": true,
129
129
  "imports": [
130
130
  "_javascript-D_ijBMSX.js",
131
- "_app-B2Ac56ic.js",
131
+ "_app-Bt_cH1DY.js",
132
132
  "index.html"
133
133
  ]
134
134
  },
@@ -161,12 +161,12 @@
161
161
  ]
162
162
  },
163
163
  "../../node_modules/@shikijs/langs/dist/http.mjs": {
164
- "file": "assets/http-B5WHvjtS.js",
164
+ "file": "assets/http-d6mcwHrJ.js",
165
165
  "name": "http",
166
166
  "src": "../../node_modules/@shikijs/langs/dist/http.mjs",
167
167
  "isDynamicEntry": true,
168
168
  "imports": [
169
- "_app-B2Ac56ic.js",
169
+ "_app-Bt_cH1DY.js",
170
170
  "../../node_modules/@shikijs/langs/dist/xml.mjs",
171
171
  "../../node_modules/@shikijs/langs/dist/graphql.mjs",
172
172
  "index.html",
@@ -275,7 +275,7 @@
275
275
  ]
276
276
  },
277
277
  "../../node_modules/@shikijs/langs/dist/php.mjs": {
278
- "file": "assets/php-s52DiJil.js",
278
+ "file": "assets/php-RwSFu5XI.js",
279
279
  "name": "php",
280
280
  "src": "../../node_modules/@shikijs/langs/dist/php.mjs",
281
281
  "isDynamicEntry": true,
@@ -284,7 +284,7 @@
284
284
  "../../node_modules/@shikijs/langs/dist/xml.mjs",
285
285
  "../../node_modules/@shikijs/langs/dist/sql.mjs",
286
286
  "_javascript-D_ijBMSX.js",
287
- "_app-B2Ac56ic.js",
287
+ "_app-Bt_cH1DY.js",
288
288
  "../../node_modules/@shikijs/langs/dist/css.mjs",
289
289
  "../../node_modules/@shikijs/langs/dist/java.mjs",
290
290
  "index.html"
@@ -315,7 +315,7 @@
315
315
  "isDynamicEntry": true
316
316
  },
317
317
  "../../node_modules/@shikijs/langs/dist/rst.mjs": {
318
- "file": "assets/rst-CN3AX0Wt.js",
318
+ "file": "assets/rst-Bcl8mngr.js",
319
319
  "name": "rst",
320
320
  "src": "../../node_modules/@shikijs/langs/dist/rst.mjs",
321
321
  "isDynamicEntry": true,
@@ -324,7 +324,7 @@
324
324
  "../../node_modules/@shikijs/langs/dist/cpp.mjs",
325
325
  "../../node_modules/@shikijs/langs/dist/python.mjs",
326
326
  "_javascript-D_ijBMSX.js",
327
- "_app-B2Ac56ic.js",
327
+ "_app-Bt_cH1DY.js",
328
328
  "../../node_modules/@shikijs/langs/dist/yaml.mjs",
329
329
  "../../node_modules/@shikijs/langs/dist/cmake.mjs",
330
330
  "../../node_modules/@shikijs/langs/dist/ruby.mjs",
@@ -340,7 +340,7 @@
340
340
  ]
341
341
  },
342
342
  "../../node_modules/@shikijs/langs/dist/ruby.mjs": {
343
- "file": "assets/ruby-TeaxAh4o.js",
343
+ "file": "assets/ruby-DiBb-yPX.js",
344
344
  "name": "ruby",
345
345
  "src": "../../node_modules/@shikijs/langs/dist/ruby.mjs",
346
346
  "isDynamicEntry": true,
@@ -353,7 +353,7 @@
353
353
  "../../node_modules/@shikijs/langs/dist/graphql.mjs",
354
354
  "../../node_modules/@shikijs/langs/dist/cpp.mjs",
355
355
  "../../node_modules/@shikijs/langs/dist/c.mjs",
356
- "_app-B2Ac56ic.js",
356
+ "_app-Bt_cH1DY.js",
357
357
  "../../node_modules/@shikijs/langs/dist/lua.mjs",
358
358
  "../../node_modules/@shikijs/langs/dist/yaml.mjs",
359
359
  "../../node_modules/@shikijs/langs/dist/java.mjs",
@@ -388,13 +388,13 @@
388
388
  "isDynamicEntry": true
389
389
  },
390
390
  "../../node_modules/@shikijs/langs/dist/svelte.mjs": {
391
- "file": "assets/svelte-D-qO2kbs.js",
391
+ "file": "assets/svelte-CNtCH4kD.js",
392
392
  "name": "svelte",
393
393
  "src": "../../node_modules/@shikijs/langs/dist/svelte.mjs",
394
394
  "isDynamicEntry": true,
395
395
  "imports": [
396
396
  "_javascript-D_ijBMSX.js",
397
- "_app-B2Ac56ic.js",
397
+ "_app-Bt_cH1DY.js",
398
398
  "../../node_modules/@shikijs/langs/dist/css.mjs",
399
399
  "index.html"
400
400
  ]
@@ -430,14 +430,14 @@
430
430
  "isDynamicEntry": true
431
431
  },
432
432
  "../../node_modules/@shikijs/langs/dist/vue.mjs": {
433
- "file": "assets/vue-xQhdtb6A.js",
433
+ "file": "assets/vue-CRYi94cV.js",
434
434
  "name": "vue",
435
435
  "src": "../../node_modules/@shikijs/langs/dist/vue.mjs",
436
436
  "isDynamicEntry": true,
437
437
  "imports": [
438
438
  "../../node_modules/@shikijs/langs/dist/css.mjs",
439
439
  "_javascript-D_ijBMSX.js",
440
- "_app-B2Ac56ic.js",
440
+ "_app-Bt_cH1DY.js",
441
441
  "../../node_modules/@shikijs/langs/dist/html.mjs",
442
442
  "_html-derivative-CADUTaWI.js",
443
443
  "index.html"
@@ -694,8 +694,8 @@
694
694
  "file": "assets/KaTeX_Typewriter-Regular.woff2",
695
695
  "src": "../../node_modules/katex/dist/fonts/KaTeX_Typewriter-Regular.woff2"
696
696
  },
697
- "_app-B2Ac56ic.js": {
698
- "file": "assets/app-B2Ac56ic.js",
697
+ "_app-Bt_cH1DY.js": {
698
+ "file": "assets/app-Bt_cH1DY.js",
699
699
  "name": "app",
700
700
  "isDynamicEntry": true,
701
701
  "imports": [
@@ -840,7 +840,7 @@
840
840
  "isEntry": true,
841
841
  "dynamicImports": [
842
842
  "telemetry-client.ts",
843
- "_app-B2Ac56ic.js"
843
+ "_app-Bt_cH1DY.js"
844
844
  ]
845
845
  },
846
846
  "style.css": {