-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Main #754
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
ovurrsl
wants to merge
297
commits into
pascalorg:main
Choose a base branch
from
ovurrsl:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Main #754
Changes from all commits
Commits
Show all changes
297 commits
Select commit
Hold shift + click to select a range
d2d7d24
feat(auth): email+password sign-in on MySQL, scenes owned by users
claude 69292ca
feat(admin): admin panel for users and scene ownership
claude 01d5667
config: name the deployment variables DIGITALTWIN_*
claude 20761bd
ci: fetch the ssh-pinned plugins over https
claude aa7a1f4
Revert "ci: fetch the ssh-pinned plugins over https"
claude 7799aef
Merge remote-tracking branch 'origin/main' into claude/incele-nq4heb
claude 7753b87
deps: pin plugin-warehouse the same way plugin-trees is pinned
claude f53550a
fix: say why the database is unreachable at startup
claude e6daedc
feat: read configuration from a file when the panel loses it
claude db00848
feat: import IFC building models as scenes
claude 02da3fb
feat(mcp): serve MCP per user, granted from the admin panel
claude 46cc03e
Revert "feat(mcp): serve MCP per user, granted from the admin panel"
claude d4147f9
ci: authorize the now-private plugin repository with an ssh key
claude 2f18cf6
fix: accept plugin nodes at the scene API boundary
claude f8d77a5
panel: vendor ovurrsl/panel sources (not yet wired)
claude 04f57f9
feat: the console becomes the front door and owns identity
claude 57168c9
ci: retrigger after the plugin deploy key
claude b10061e
chore: pin plugin-warehouse at the merged rack level table
ovurrsl 7a15d52
ci: the plugin repo is public again — drop the key, relock on a runner
claude 9a50c9d
ci: fire relock from a push to this branch
claude 70f6ff4
chore: regenerate bun.lock on a real runner
github-actions[bot] 678d0a1
ci: run checks against the regenerated lockfile
claude 704b2cb
feat: self-migrating boot for the console takeover
claude 7edec2e
Merge remote-tracking branch 'origin/main' into claude/incele-nq4heb
claude 16ff497
ci: relock for the new plugin pin (9e1b525b)
claude 60be574
chore: regenerate bun.lock on a real runner
github-actions[bot] aaef7c9
ci: run checks against the relocked pin
claude 365cf8f
fix: satisfy the editor's stricter lint and type gates for the vendor…
claude 22e2339
ci: relock for the new @types devDependencies
claude 8334842
chore: regenerate bun.lock on a real runner
github-actions[bot] 7db9c80
ci: run checks against the relocked dependencies
claude 90d7164
fix: declare mysql2 in the editor app, which imports it directly
claude 8ac837b
chore: regenerate bun.lock on a real runner
github-actions[bot] 59b0509
ci: run checks against the relocked dependencies
claude 7413fea
feat: give the console's transactional mail a designed HTML part
claude a5baa0b
fix: ship the console's migrations and native-alias step with the bundle
claude 7096d12
feat: push console changes back to its own repository
claude bc85e93
fix: remove the account menu overlaid on the editor toolbar
claude 3f73158
fix: Home links point at the editor, not the console
claude 78130a6
feat: the editor lives at the root URL, and access follows the consol…
claude e184c09
feat: scene administration moves into the console
claude cca8b0c
feat: console sites become real 3D scenes
claude 4f1d1d5
feat: scenes created in the editor appear on Sites & Projects
claude 4af6eee
feat: publishing is an admin decision, and the guide is public
claude 1544a92
feat: a documentation site, a public changelog, and project management
claude 5b62591
feat: the real brand mark, a documentation shell, and a theme that fo…
claude a43b223
feat: system theme by default, a call to action that knows who is rea…
claude aae442f
fix: the sign-in notice reports real activity, not a fabricated line
claude d417a8f
fix: the browser tab shows the brand mark
claude d73bf6a
One theme button that starts on the system, and a language switch on …
claude 5c87db5
The scenes library moves into the editor, and every message the syste…
claude fb20d27
The console stops answering to accounts that may only look
claude 8e7cb2a
Mail stops being a card that resembles the console and becomes the co…
claude 8fd5c67
Scenes stops wearing the zone tool's icon, and Settings learns who is…
claude f7d406b
Expert floor-plan mode gains the way back out
claude 79e12ab
Every changelog entry says which component it belongs to, and carries…
claude eb5cb7b
Say why an account cannot be deleted instead of reporting a server error
claude 4a9895f
The test message reports whether it was actually delivered
claude a01ab0b
deploy: the bundle stops calling itself Pascal
claude fac88a2
Deleting a user stops being blocked by what they once did
claude 392b3f4
An invitation that is not delivered stops reporting success
claude 3726b24
Close an unauthenticated read of every scene, and five findings from …
claude 6c482d1
A converter carries scenes out of the legacy desktop build
claude 91e9cb0
Migrated nodes are parsed to their schema's shape before they are saved
claude 9aeb9d2
The warehouse plugin follows its own main again
claude 056db12
The published bundle says 2.13.0
claude f3a1077
Write down how a plugin release reaches the site
claude 4353d2c
Pin the plugin's v0.1.1 release
claude 74acee6
chore: regenerate bun.lock on a real runner
github-actions[bot] 49e2781
Pin the plugin's v0.1.2 release
claude eb4485d
ci: relock for the new plugin pin (49b2f16)
claude 14c6183
chore: regenerate bun.lock on a real runner
github-actions[bot] 3840a0c
The published bundle says 2.15.0
claude 261afe6
chore: pin plugin-warehouse v0.1.4
claude 6e84ee4
chore: pin plugin-warehouse v0.1.4 — canlıya çıkabilen dala (#3)
ovurrsl ee5bf46
fix(auth): enforce the lockout on the second factor, not just report it
claude 4f0589e
fix(sync-panel): stop pushing the two tabs the console cannot serve
claude 3b5f52a
fix(sync-panel): hold back three more files the console cannot compile
claude bad4115
feat(sync-panel): pull the console back, from the same tables
claude e44fd3b
feat(ci): pull the console automatically, and stop pushing it back
claude 23d72ad
feat(ci): move the plugin pin automatically, and hand off to the deploy
claude 871d012
feat(ci): make `integration` the branch every workflow agrees on, and…
claude 6232999
Merge pull request #4 from ovurrsl/claude/mfa-lockout-and-panel-sync
ovurrsl 257bb93
chore: pin plugin-warehouse b53d9de
github-actions[bot] bc621b6
fix(ci): stop the hourly console pull failing on every quiet run
claude 75c5a89
fix(ci): open the upstream pull request whenever integration is behind
claude f82ce6f
docs: describe the automation as it now works
claude ec6f460
docs: tell an agent it is in the fork before it reads upstream's rules
claude ba7b6e7
Merge pull request #6 from ovurrsl/claude/x86-graphics-performance-is…
ovurrsl 5941644
chore: pin plugin-warehouse 73c26b7
github-actions[bot] 51dd60e
chore: pin plugin-warehouse 034a30f
github-actions[bot] 45f32bc
chore: pin plugin-warehouse 71aa813
github-actions[bot] 568b97f
chore: pin plugin-warehouse f7f8579
github-actions[bot] 76fd1ff
chore: pin plugin-warehouse c419782
github-actions[bot] 22b9609
chore: pin plugin-warehouse 67064b8
github-actions[bot] 2f7f2e3
perf+fix: storey memoizasyonu, marquee eklenti seçimi, Furnish'te reg…
claude 4821183
style: biome biçimi — computeLevelElevations imzası tek satır
claude 6e1cd99
Merge pull request #7 from ovurrsl/claude/camera-stutter-measurements…
ovurrsl 6b87e59
chore: pin plugin-warehouse 60b02f7
github-actions[bot] c86e6dc
Revert "chore: pin plugin-warehouse 60b02f7"
claude 4bbd451
Revert "Merge pull request #7 from ovurrsl/claude/camera-stutter-meas…
claude 8edbe81
chore: pin plugin-warehouse 7297951
github-actions[bot] 0fac366
chore: pin plugin-warehouse 01a0b87
github-actions[bot] 1461f9f
chore: pin plugin-warehouse 349e388
github-actions[bot] 45c7cfe
perf: duvar kesiti tazelemesi ölü işi seçili olmayan duvarlar için ya…
claude cc13a6c
Merge pull request #8 from ovurrsl/claude/camera-stutter-measurements…
ovurrsl 0337dbe
perf: seçim ana hattının iç render geçitleri sahne grafiğini yeniden …
claude b454e86
chore: pin plugin-warehouse 14053d7
github-actions[bot] 2204d8f
chore: pin plugin-warehouse 14053d7
github-actions[bot] 76e4550
fix: eklenti nesneleri ağaçta hiç çizilmiyor, panel başlığı da kindʼi…
claude 01d15ad
Merge pull request #9 from ovurrsl/claude/camera-stutter-measurements…
ovurrsl 84d693f
chore: pin plugin-warehouse c21a058
github-actions[bot] a9ddf7a
chore: pin plugin-warehouse 1209ae0
github-actions[bot] 7b3f3fb
chore: pin plugin-warehouse 0afebaa
github-actions[bot] 6e4c169
fix(ci): ayna upstream'in ci.yml değişikliğinde takılıyordu — MIRROR_…
claude 9a34f89
Merge pull request #10 from ovurrsl/claude/camera-stutter-measurement…
ovurrsl d018b44
Pascal güncellemesini al (beta.2 → beta.5, 56 commit)
claude c67248a
fix: birleştirme sonrası ölü import'lar ve biçim
claude 0cfba5b
ci(relock): bun sürümünü packageManager ile hizala (1.3.0 → 1.3.14)
claude 7752cda
chore: regenerate bun.lock on a real runner
github-actions[bot] 3569b3a
chore: regenerate bun.lock on a real runner
github-actions[bot] ffaee5c
fix(deps): postcss'i sabitle — kilit her relock'ta salınıyordu
claude 0d1b559
chore: regenerate bun.lock on a real runner
github-actions[bot] f418448
docs(upstream): geri dönüş yordamı + upstream alım günlüğü
claude c4f7653
ci: uygulaması olmayan dört testi ve CLI duman testini ayır
claude 8a7c963
test(graph-schema): şemadan üretilen fikstürler — süit ilk kez koştu
claude e70c745
chore: pin plugin-warehouse f61f677
github-actions[bot] 4b133f9
chore: pin plugin-warehouse ed35f53
github-actions[bot] ba8dcc5
chore(storage): Docker dosyalarını sil, üretimdeki SQLite kaçış kapıs…
claude 0ade6e1
chore: pin plugin-warehouse 2aa497a
github-actions[bot] d93b520
Merge integration — eklenti pini 2aa497a (ızgara düzeltmesi)
claude 8e24f0d
chore: regenerate bun.lock on a real runner
github-actions[bot] e42a7ce
ci: kilit tazelendikten sonra kontrolleri tetikle
claude 680b0c3
Pascal güncellemesini al (beta.2 → beta.5, 56 commit) (#11)
ovurrsl c325f5f
fix(deploy): outputFileTracingRoot bundle'ı sakat bırakıyordu (#12)
ovurrsl 9a785f9
fix(deploy): paket 16.2.9 ile çalıştırıyordu, uygulama 16.3.0 ile der…
ovurrsl 93c32bc
fix(root): ana adres MySQL'e kaydediyor + tuvalin üstündeki iki gezin…
ovurrsl 520105b
Plandan kalanlar: büyük depoda oda/slab, walkthrough hızı, dört ölü d…
ovurrsl db22f7b
Kılavuz ölçek alanı kalibrasyonu sessizce yok ediyordu + eklenen düğm…
ovurrsl 292463b
Ev ölçeğindeki tavanlar depo çizimini engelliyordu (#17)
ovurrsl 6fd505b
Kesinti paketi: yedekler 5, olaylar 10, DDL reddi siteyi öldürmüyor (…
ovurrsl 8d4cdee
chore: pin plugin-warehouse 606da00
github-actions[bot] ec6fa66
perf(core): merdiven senkronu sahneyi yuzey basina yeniden taramasin …
ovurrsl 18c0303
perf(viewer): BVH bakimi surekli olsun (#20)
ovurrsl 4fc1431
perf(viewer): statik nesnelerin matris compose'unu dondur (#21)
ovurrsl c0c8168
chore: pin plugin-warehouse c55d384
github-actions[bot] 51bdb00
chore: pin plugin-warehouse 58fd80e
github-actions[bot] 72d09cc
feat(editor): undo/redo + sahne kilidi + kategori gorunurluk/kilit (#22)
ovurrsl 033a891
feat(editor): host mobilya katalogunu kaldir — depo ekipmani furnish …
ovurrsl deb88ea
chore: pin plugin-warehouse 0e09cca
github-actions[bot] dbc081c
feat(editor): proje paylaşımı + ortak çalışma + sahne kartı (yedek/ön…
ovurrsl ebc667a
fix(editor): kilitli nesne seçilememeli (tüm-sahne + kategori kilidi)…
ovurrsl 18b6c24
feat(editor): scenes rayı sade + /scenes zengin yönetim + tek-aktif-e…
ovurrsl 0551e33
fix(editor): silme modu (X) takılı kalmasın — toggle olsun (#27)
ovurrsl 557c385
chore: pin plugin-warehouse 609cf12
github-actions[bot] 70d1e68
fix(editor): kilit kapılarında atlanan iki yer + devir dokümanı (#28)
ovurrsl 4dfe43d
docs: define plugin viewer appearance contract (#625)
Aymericr 8a0a652
fix(core): share vertical scene canonicalization (#626)
Aymericr 79ff10d
fix(editor): harden history command ownership (#627)
Aymericr b9035e2
fix(core): keep placement drafts out of undo history (#637)
Aymericr 96a85da
feat(editor): support noPanel sidebar tabs for stage-driving rail ent…
wass08 8fa5275
fix(editor): retry bun install on transient GitHub 429 (#674)
Aymericr a82ee4d
nodes: stop tracking elevator dirty state (#599)
JimmyZheng-ZJU 3b98e9d
fix(viewer): stop isolation and solo from overwriting each other's la…
toycenterboss-bot df3d70f
feat(viewer): make the frame cap configurable (#671)
ztffn 2fc9c08
fix(core): import WallNode in use-scene-commits.test.ts
ad08fa7
core: reconcile room surfaces after wall topology edits (#624)
sudhir9297 544efe9
fix: restore wall plane-bound defaults (draft, panel, self-heal) (#630)
wass08 f2f8bd5
fix(editor): clamp viewport/area snapshot captures to 2048px long edg…
wass08 cc04464
feat(editor): raise room-envelope height caps from 6m to 20m (#642)
wass08 7434e66
editor: drop the stale 6 m caps and surface the ceiling's level bound…
wass08 8caa29e
editor: fix wall item placement preview drifting off the item (#643)
wass08 6e8b451
fix(viewer): stable level elevation smoothing + bones 4cd28a0 (view-m…
Snoopy147 eee43e6
fix: plugin node kinds miss hover/click subscriptions when they regis…
Snoopy147 2f4ef8c
Plugin inspector-card extensions (per-kind sections on the floating i…
Snoopy147 46baead
fix(editor): inspector extension mode is either/or with the regular c…
Snoopy147 653b4cd
feat(editor): add synchronized 2D viewer modes (#672)
Aymericr aa752cd
perf(editor): stabilize viewer stage mode sets (#673)
Aymericr 695a8ce
perf(viewer): sew a level wall set into one mesh (#608)
toycenterboss-bot f863396
perf: tighten viewer runtime ownership (#675)
Aymericr d99c9b5
chore: bump plugin-bones to 39f1916 (camera-proof X-ray + round-10/11…
Snoopy147 a22dad3
chore: bump plugin-bones to a4baf65 (triple-loop night: dollhouse X-r…
Snoopy147 877917f
chore: bump plugin-bones to 92e1f12 — electrical avoids window/door r…
Snoopy147 80041c4
feat(editor/nodes): enforce warehouse-scale limits, motion JSX typing…
44eafa5
Add Streetscape plugin to Pascal (#628)
wass08 e7c96de
feat(editor): wire the Bones structural X-ray plugin into the standal…
wass08 7722bec
chore: bump plugin-bones to 041041da — dawn batch: AC power circuits,…
Snoopy147 68757bb
editor: add Blender-style custom mesh editing (#638)
sudhir9297 6987e26
feat(editor): edit shared parameters across a homogeneous multi-selec…
wass08 c48881d
release: @pascal-app/core@1.0.0-beta.5 @pascal-app/viewer@1.0.0-beta.…
github-actions[bot] d49a38e
chore: cleanly regenerate bun.lock after Phase 3 sync
e882787
fix(editor): optional-chain capabilities in pointer-support-cap and c…
b5d161f
chore: pin plugin-warehouse d188ad4
github-actions[bot] f174868
feat: On-demand plugin ecosystem integration
7f629b8
Merge pull request #31 from pascalorg/main
ovurrsl dd1d8b3
fix: use workspace refs for local plugins to fix CI
1279a46
feat: Add warehouse summary panel and draggable action menu
4a47d3e
fix(ci): migrate biome configuration in lingo to fix nested root errors
9877cd2
feat: add screenshot button to action menu
e538d48
chore: remove the agent scratch files from the repo root
claude 5d4aeac
fix(editor): re-encode the action menu as UTF-8
claude fcaddf3
fix(editor): accept the compact prop the action menu passes
claude 7499ba7
fix(build): take the vendored lingo monorepo out of the workspace
claude eace1dd
fix(ci): scope Biome to code we author, and clear what that surfaced
claude 4747d7a
Merge remote-tracking branch 'origin/integration' into claude/github-…
claude 57ab902
chore: pin plugin-warehouse 4f056e7
claude a9f8f26
chore: regenerate bun.lock on a real runner
github-actions[bot] 0613fe0
feat(catalog): upgrade ItemCatalog for vector icons and styling parity
b7eb0c5
docs: correct the Turbopack rule — 'use server' is not the fix
claude d47162a
Merge remote-tracking branch 'origin/integration' into claude/github-…
claude 92f06c3
style: sort the item-catalog exports Biome flagged
claude 1122c86
CI ve deploy'u yeşile döndür: compact prop, lingo workspace'i, Biome …
ovurrsl ac6e835
fix(editor): type the ItemCatalog interaction test against the real s…
claude da128a5
CI'ın son kırmızısı: ItemCatalog etkileşim testini gerçek store tiple…
ovurrsl 9f8d95a
chore: pin plugin-warehouse dadaeb6
github-actions[bot] b3df22f
Antigravity denetimi: Site panelindeki çökmeyi düzelt, istenmeyen ekl…
ovurrsl 8649726
Viewer toolbar'daki ekran görüntüsü düğmesini geri getir (#35)
ovurrsl 790da2a
Snapshot: takılmayı düzelt, diske kaydet, boyut ve formatı kullanıcıy…
ovurrsl c96887e
chore: pin plugin-warehouse 021b9ec
github-actions[bot] e2aa9cd
Panel scrollbar'ı sistemin kendisi olsun ve tutulabilsin (#37)
ovurrsl 8702876
Zone içeriğini göster + kenar çubuğu sürüklemesinin takılı kalmasını …
ovurrsl 36a66aa
Eklenti nesnelerine kendi Assets sekmesi (#39)
ovurrsl f261795
Dikey açıklık mekanizmasını eklentilere aç (#40)
ovurrsl b909aa0
chore: pin plugin-warehouse f93b4f8
github-actions[bot] bccf86b
Merge upstream 7f629b8c into integration — beta.5 → 55 commits
claude 8194034
feat(core): let a vertical opening answer per surface, not per level
claude f3ab6a3
chore: regenerate bun.lock on a real runner
github-actions[bot] 55035ff
feat(editor): let a kind validate its own move, not only its footprint
claude c546cd7
Merge remote-tracking branch 'origin/integration' into claude/github-…
claude 2b68811
fix(nodes/zone): stop the contents panel looping the editor to a halt
claude e6756f6
Upstream 7f629b8c'yi al (55 commit) + dikey açıklık, sürükleme kapısı…
ovurrsl f1745ec
chore: pin plugin-warehouse 119716b
github-actions[bot] efe7c94
feat(zone): implement extensible zone takeoff engine and quantities UI
e8ed695
chore: pin plugin-warehouse fe2798e
github-actions[bot] a65b979
fix(catalog): render webp/png raster icons correctly in ItemCatalog i…
466a43b
feat(zone): implement 2D rack footprint visualization in ZoneQuantiti…
ed81384
fix(deps): update plugin-warehouse to latest commit to fix CI build
7da72d1
feat(catalog): use png icons for warehouse items
079e708
feat(local): preserve dynamic plugin manager, presence, mcp and zone …
43f6a01
chore(sync): merge upstream/main into integration with custom feature…
8909ea6
fix(deps): ensure zustand dependency in apps/editor and clean test im…
852e91e
fix(types): resolve type assertions in tests and optional dynamic plu…
add8c82
fix(nodes): preserve uncapped warehouse dimension limits and complete…
f965b3e
Merge upstream/main: resolve conflicts, upgrade Zod, align ToolMode F…
bfaa0a8
fix(editor): align delete mode toggle with single-writer ToolMode FSM…
3c1443f
test(editor): expand timeouts for async dynamic plugin loading in tes…
4e8ecbd
test(editor): add timeout flag to bun test script in package.json
b2eb893
fix(editor): attach thumbnail listener unconditionally and enforce ed…
6f06c7e
feat(ui): activate FloatingLevelSelector and prevent overlaps
f1e43e7
Merge upstream/main and resolve conflicts
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| # Node builtins and the browser bundle | ||
|
|
||
| **Classification:** Rule | ||
|
|
||
| ## Rationale | ||
|
|
||
| A build that fails with | ||
|
|
||
| ``` | ||
| the chunking context (unknown) does not support external modules (request: node:fs) | ||
| ``` | ||
|
|
||
| is telling you that something reachable from a **client** module imports a Node | ||
| builtin. The bundler is not misconfigured; the import graph is wrong. | ||
|
|
||
| ## What actually happened here | ||
|
|
||
| `e2bd6351` added `apps/editor/components/mcp-relay-client.tsx`: | ||
|
|
||
| ```tsx | ||
| 'use client' | ||
| import { createPascalMcpServer } from '@pascal-app/mcp/server' | ||
| ``` | ||
|
|
||
| `'use client'` sends a module to the browser, and with it **every module it | ||
| imports, at any depth**. The chain ran: | ||
|
|
||
| ``` | ||
| mcp-relay-client.tsx ('use client') | ||
| └─ @pascal-app/mcp/server | ||
| └─ registerTools() | ||
| └─ tools/scene-lifecycle/metadata.ts | ||
| └─ import { createHash } from 'node:crypto' | ||
| ``` | ||
|
|
||
| Four commits then tried to fix it through configuration — | ||
| `transpilePackages`, removing plugins from the bundle, bumping Next — and all | ||
| four failed, because none of them touched the chain. | ||
|
|
||
| ## Directives | ||
|
|
||
| 1. **No module reachable from a `'use client'` file may import `node:*`,** at | ||
| any import depth. Trace the chain from the client file to the builtin before | ||
| changing any config; that is where the fix belongs. | ||
|
|
||
| 2. **Do not use `'use server'` for this.** It does not mean "keep this on the | ||
| server". It marks a file as a *Server Actions* module and requires every | ||
| export in it to be an async function — adding it to a `page.tsx`, which | ||
| default-exports a component, is a hard build error. `9720d493` tried exactly | ||
| this and its deploy failed. | ||
|
|
||
| 3. **The mechanisms that do work:** `import 'server-only'` (fails at build time | ||
| if the module reaches the client), simply not writing `'use client'` (App | ||
| Router modules are server modules by default), or `serverExternalPackages` in | ||
| `next.config.ts` for a package that must stay on Node. | ||
|
|
||
| 4. **A package needed on both sides needs a browser-safe entry point.** If the | ||
| browser genuinely has to run something the server package provides, the | ||
| package exports a second entry built without Node builtins — Web Crypto in | ||
| place of `node:crypto`, and so on. There is no config that makes a Node | ||
| builtin resolve in a browser bundle. | ||
|
|
||
| ## Note on placement | ||
|
|
||
| Agent tooling in this repo reads `.agents/skills/`, not `.agents/rules/` — | ||
| `.claude/`, `.cursor/` and `.codex/` symlink only `skills`. Nothing loads this | ||
| file automatically today; it is kept as the written record of a four-day | ||
| outage, and it is correct if someone does read it. |
This file was deleted.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,120 @@ | ||
| # digitaltwin | ||
|
|
||
| Pascal Editor, compiled and ready to run on Hostinger's Node.js hosting. Built | ||
| from [pascalorg/editor](https://github.com/pascalorg/editor) at commit | ||
| `08e2279`, plus the MySQL scene store from | ||
| [ovurrsl/editor](https://github.com/ovurrsl/editor). | ||
|
|
||
| The application sits at the root of this repository — there is one | ||
| `package.json` and one entry point, so the host cannot pick the wrong | ||
| directory. It follows the stock sequence: `npm install` fetches the runtime | ||
| packages, `npm run build` has nothing to compile and exits cleanly, and | ||
| `server.js` starts the app. `PORT` and `HOSTNAME` are read from the | ||
| environment. | ||
|
|
||
| ## hPanel settings | ||
|
|
||
| Everything is the default except the output directory. | ||
|
|
||
| | Field | Value | | ||
| |---|---| | ||
| | Repository | `ovurrsl/digitaltwin` | | ||
| | Branch | `main` | | ||
| | Framework preset | Other | | ||
| | Root directory | `./` | | ||
| | Node.js version | 22.x | | ||
| | Package manager | npm | | ||
| | Build command | `npm run build` | | ||
| | Output directory | `./` | | ||
| | Entry file | `server.js` | | ||
|
|
||
| ## Environment variables | ||
|
|
||
| | Name | Value | | ||
| |---|---| | ||
| | `DIGITALTWIN_MYSQL_HOST` | `localhost` | | ||
| | `DIGITALTWIN_MYSQL_USER` | database user | | ||
| | `DIGITALTWIN_MYSQL_PASSWORD` | database password | | ||
| | `DIGITALTWIN_MYSQL_DATABASE` | database name | | ||
| | `DIGITALTWIN_MYSQL_PORT` | `3306` (optional) | | ||
|
|
||
| or, as a single value: | ||
|
|
||
| | Name | Value | | ||
| |---|---| | ||
| | `DIGITALTWIN_MYSQL_URL` | `mysql://user:password@localhost:3306/database` | | ||
|
|
||
| In `DIGITALTWIN_MYSQL_URL`, percent-encode any of `@ : / ? # [ ] %` that appear | ||
| in the password — `@` becomes `%40`, `#` becomes `%23`. The separate fields | ||
| need no encoding, which is why they are listed first. | ||
|
|
||
| Optional: | ||
|
|
||
| | Name | Value | | ||
| |---|---| | ||
| | `DIGITALTWIN_ADMIN_EMAIL` | the address that gets the admin role on sign-up | | ||
|
|
||
| **MySQL is required.** Without a database configured the server refuses to | ||
| start — check the runtime log for the reason. Tables are created on first | ||
| connection. `/api/health` reports the selected backend | ||
| (`"backend":"mysql"`) and whether the database answers (`"db":"ok"`), so one | ||
| curl verifies a deploy. There is **no override**: `DIGITALTWIN_ALLOW_SQLITE` | ||
| used to grant one and was removed, because a variable that quietly moves a | ||
| customer's scenes onto a filesystem the host wipes every release is not worth | ||
| the convenience it bought. | ||
|
|
||
| Every variable is also read under its older `PASCAL_` name, so an existing | ||
| deployment keeps working until it is renamed. | ||
|
|
||
| ## When the panel forgets its variables | ||
|
|
||
| Some panels drop their environment variables on redeploy, which takes the | ||
| database down with them. The same settings can come from a file instead. A real | ||
| environment variable always wins, so the panel stays in charge wherever it is | ||
| configured. | ||
|
|
||
| Two locations are read, in this order: | ||
|
|
||
| | Path | Survives a redeploy? | | ||
| |---|---| | ||
| | `.env` next to `server.js` | only until the next release replaces this tree | | ||
| | `~/.digitaltwin.env` | yes — it sits outside the deployed directory | | ||
|
|
||
| Prefer the second. Create it once with the host's file manager: | ||
|
|
||
| DIGITALTWIN_MYSQL_HOST=127.0.0.1 | ||
| DIGITALTWIN_MYSQL_PORT=3306 | ||
| DIGITALTWIN_MYSQL_USER=your_user | ||
| DIGITALTWIN_MYSQL_PASSWORD=your_password | ||
| DIGITALTWIN_MYSQL_DATABASE=your_database | ||
|
|
||
| `KEY=value` per line; `#` starts a comment; surrounding quotes are stripped. | ||
| Values are never expanded, so a `$` in a password is a literal `$`. | ||
|
|
||
| The boot log names the files it read and how many settings each supplied — the | ||
| values are credentials and are never logged. `DIGITALTWIN_ENV_FILE` points at a | ||
| different path when neither default suits. | ||
|
|
||
| A `.env` committed here is carried across by the publish workflow, which | ||
| otherwise replaces this tree wholesale. It is still a credential in git | ||
| history — the home-directory file avoids that. | ||
|
|
||
| ## Layout | ||
|
|
||
| server.js entry point, generated by the standalone build | ||
| package.json runtime dependencies and the build/start scripts | ||
| .next/ the compiled application | ||
| public/ static assets: models, textures, icons, sounds | ||
|
|
||
| ## Regenerating | ||
|
|
||
| Build the source with `output: 'standalone'` in `apps/editor/next.config.ts`. | ||
| From the resulting `apps/editor/.next/standalone` tree, lift `apps/editor/.next`, | ||
| `apps/editor/public` and `apps/editor/server.js` to the top level and drop the | ||
| rest — the vendored `node_modules` is replaced by the dependency list in | ||
| `package.json`, and the app's original manifest cannot be reused because it | ||
| names workspace packages that are not published to npm. Two things the | ||
| standalone build leaves out: copy `apps/editor/public` and | ||
| `apps/editor/.next/static` into the tree before lifting, and add `mysql2` to | ||
| the dependency list by hand — the store imports it dynamically, so file | ||
| tracing does not see it. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| { | ||
| "name": "digitaltwin", | ||
| "version": "2.15.0", | ||
| "private": true, | ||
| "type": "module", | ||
| "description": "DigitalTwin, compiled and ready to run. Nothing is built at deploy time.", | ||
| "engines": { | ||
| "node": ">=20.9" | ||
| }, | ||
| "scripts": { | ||
| "build": "node setup-native.mjs", | ||
| "start": "node server.js" | ||
| }, | ||
| "dependencies": { | ||
| "@node-rs/argon2": "2.0.2", | ||
| "@opentelemetry/api": "1.9.1", | ||
| "mysql2": "3.23.2", | ||
| "next": "16.3.0", | ||
| "nodemailer": "9.0.3", | ||
| "otpauth": "9.5.1", | ||
| "qrcode": "1.5.4", | ||
| "react": "19.2.7", | ||
| "react-dom": "19.2.7", | ||
| "sharp": "0.34.5", | ||
| "ulid": "3.0.2" | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| // Turbopack requires an externalized native package under a build-specific | ||
| // hashed alias (e.g. "@node-rs/argon2-4d195bca84303183") but emits no package | ||
| // by that name. Recreate the alias as a symlink to the real install. Runs as | ||
| // the bundle's "build" step, i.e. right after npm install on the host. | ||
| import { readdirSync, readFileSync, mkdirSync, symlinkSync, existsSync, rmSync } from 'node:fs' | ||
| import { join } from 'node:path' | ||
|
|
||
| const chunks = join('.next', 'server', 'chunks') | ||
| const found = new Set() | ||
| for (const f of readdirSync(chunks)) { | ||
| if (!f.endsWith('.js')) continue | ||
| const m = readFileSync(join(chunks, f), 'utf8').matchAll(/@node-rs\/argon2-[a-f0-9]{16}/g) | ||
| for (const hit of m) found.add(hit[0]) | ||
| } | ||
| for (const alias of found) { | ||
| const target = join('node_modules', alias) | ||
| if (existsSync(target)) rmSync(target, { recursive: true }) | ||
| mkdirSync(join('node_modules', '@node-rs'), { recursive: true }) | ||
| symlinkSync('argon2', target) | ||
| console.log(`[setup-native] ${alias} -> @node-rs/argon2`) | ||
| } | ||
| if (found.size === 0) console.log('[setup-native] no hashed native aliases found') | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| name: Bump warehouse plugin | ||
|
|
||
| # The warehouse plugin is a git dependency pinned to an exact sha, and it | ||
| # compiles into the app — so a plugin release reaches the site only when this | ||
| # repository moves the pin AND the bundle is rebuilt. Doing that by hand is | ||
| # what left a set of freeze fixes sitting unreleased: the plugin's main had | ||
| # moved on for weeks while the pin, and therefore production, had not. | ||
| # | ||
| # Needs no secret. The plugin repository is public, so reading its head and | ||
| # resolving the dependency both work with nothing configured. | ||
| on: | ||
| workflow_dispatch: | ||
| # ovurrsl/plugin-warehouse can fire this on a push to main; the schedule is | ||
| # what keeps the pin current until it does. | ||
| repository_dispatch: | ||
| types: [plugin-updated] | ||
| schedule: | ||
| - cron: '42 * * * *' | ||
|
|
||
| concurrency: | ||
| group: bump-plugin | ||
| cancel-in-progress: true | ||
|
|
||
| permissions: | ||
| contents: write | ||
| # To hand off to the deploy — see the last step. | ||
| actions: write | ||
|
|
||
| env: | ||
| PLUGIN_REPO: https://github.com/ovurrsl/plugin-warehouse.git | ||
|
|
||
| jobs: | ||
| bump: | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| # A scheduled run starts on the default branch, so the branch to update | ||
| # is named rather than inherited. Set the INTEGRATION_BRANCH repository | ||
| # variable to move it; the fallback is the branch it is today. | ||
| - uses: actions/checkout@v4 | ||
| with: | ||
| ref: ${{ vars.INTEGRATION_BRANCH || 'integration' }} | ||
|
|
||
| - name: Compare the pin with the plugin's head | ||
| id: compare | ||
| run: | | ||
| head=$(git ls-remote "$PLUGIN_REPO" refs/heads/main | cut -f1) | ||
| pinned=$(grep -o 'plugin-warehouse\.git#[0-9a-f]\{40\}' apps/editor/package.json | cut -d'#' -f2) | ||
| echo "head=$head" >> "$GITHUB_OUTPUT" | ||
| echo "pinned=$pinned" >> "$GITHUB_OUTPUT" | ||
| if [ -z "$head" ] || [ -z "$pinned" ]; then | ||
| echo "could not read one of them (head='$head' pinned='$pinned')" >&2 | ||
| exit 1 | ||
| fi | ||
| if [ "$head" = "$pinned" ]; then | ||
| echo 'the pin is current' | ||
| echo 'changed=false' >> "$GITHUB_OUTPUT" | ||
| else | ||
| echo "pin $pinned -> $head" | ||
| echo 'changed=true' >> "$GITHUB_OUTPUT" | ||
| fi | ||
|
|
||
| - uses: oven-sh/setup-bun@v2 | ||
| if: steps.compare.outputs.changed == 'true' | ||
| with: | ||
| bun-version: 1.3.0 | ||
|
cursor[bot] marked this conversation as resolved.
|
||
|
|
||
| # The lockfile records the sha512 of the resolved tarball, so it is | ||
| # regenerated by a real install rather than edited — the same reason | ||
| # `relock.yml` exists. | ||
| - name: Move the pin and relock | ||
| if: steps.compare.outputs.changed == 'true' | ||
| run: | | ||
| sed -i "s|plugin-warehouse\.git#${{ steps.compare.outputs.pinned }}|plugin-warehouse.git#${{ steps.compare.outputs.head }}|" \ | ||
| apps/editor/package.json | ||
| bun install | ||
|
|
||
| # The gate. A plugin release that does not compile against this editor | ||
| # must not reach the branch the bundle is built from — which is exactly | ||
| # the failure a version range would hide and an exact pin makes visible. | ||
| - name: Type check | ||
| if: steps.compare.outputs.changed == 'true' | ||
| run: bun run check-types | ||
|
|
||
| - name: Commit to the integration branch | ||
| if: steps.compare.outputs.changed == 'true' | ||
| run: | | ||
| git config user.name 'github-actions[bot]' | ||
| git config user.email 'github-actions[bot]@users.noreply.github.com' | ||
| git add apps/editor/package.json bun.lock | ||
| git commit -m "$(printf 'chore: pin plugin-warehouse %s\n\nWas %s.' \ | ||
| "$(echo '${{ steps.compare.outputs.head }}' | cut -c1-7)" \ | ||
| "$(echo '${{ steps.compare.outputs.pinned }}' | cut -c1-7)")" | ||
| git push | ||
|
|
||
| # Handed off explicitly: a push made with GITHUB_TOKEN starts no workflow | ||
| # runs, so without this the pin moves and the site never rebuilds. | ||
| - name: Build and publish | ||
| if: steps.compare.outputs.changed == 'true' | ||
| env: | ||
| GH_TOKEN: ${{ github.token }} | ||
| run: | | ||
| gh workflow run deploy-bundle.yml \ | ||
| --repo "$GITHUB_REPOSITORY" \ | ||
| --ref "${{ vars.INTEGRATION_BRANCH || 'integration' }}" | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.