Skip to content
Open

Main #754

Show file tree
Hide file tree
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 Jul 31, 2026
69292ca
feat(admin): admin panel for users and scene ownership
claude Jul 31, 2026
01d5667
config: name the deployment variables DIGITALTWIN_*
claude Jul 31, 2026
20761bd
ci: fetch the ssh-pinned plugins over https
claude Jul 31, 2026
aa7a1f4
Revert "ci: fetch the ssh-pinned plugins over https"
claude Jul 31, 2026
7799aef
Merge remote-tracking branch 'origin/main' into claude/incele-nq4heb
claude Jul 31, 2026
7753b87
deps: pin plugin-warehouse the same way plugin-trees is pinned
claude Jul 31, 2026
f53550a
fix: say why the database is unreachable at startup
claude Jul 31, 2026
e6daedc
feat: read configuration from a file when the panel loses it
claude Jul 31, 2026
db00848
feat: import IFC building models as scenes
claude Jul 31, 2026
02da3fb
feat(mcp): serve MCP per user, granted from the admin panel
claude Jul 31, 2026
46cc03e
Revert "feat(mcp): serve MCP per user, granted from the admin panel"
claude Jul 31, 2026
d4147f9
ci: authorize the now-private plugin repository with an ssh key
claude Jul 31, 2026
2f18cf6
fix: accept plugin nodes at the scene API boundary
claude Jul 31, 2026
f8d77a5
panel: vendor ovurrsl/panel sources (not yet wired)
claude Jul 31, 2026
04f57f9
feat: the console becomes the front door and owns identity
claude Jul 31, 2026
57168c9
ci: retrigger after the plugin deploy key
claude Jul 31, 2026
b10061e
chore: pin plugin-warehouse at the merged rack level table
ovurrsl Jul 31, 2026
7a15d52
ci: the plugin repo is public again — drop the key, relock on a runner
claude Jul 31, 2026
9a50c9d
ci: fire relock from a push to this branch
claude Jul 31, 2026
70f6ff4
chore: regenerate bun.lock on a real runner
github-actions[bot] Jul 31, 2026
678d0a1
ci: run checks against the regenerated lockfile
claude Jul 31, 2026
704b2cb
feat: self-migrating boot for the console takeover
claude Jul 31, 2026
7edec2e
Merge remote-tracking branch 'origin/main' into claude/incele-nq4heb
claude Jul 31, 2026
16ff497
ci: relock for the new plugin pin (9e1b525b)
claude Jul 31, 2026
60be574
chore: regenerate bun.lock on a real runner
github-actions[bot] Jul 31, 2026
aaef7c9
ci: run checks against the relocked pin
claude Jul 31, 2026
365cf8f
fix: satisfy the editor's stricter lint and type gates for the vendor…
claude Jul 31, 2026
22e2339
ci: relock for the new @types devDependencies
claude Jul 31, 2026
8334842
chore: regenerate bun.lock on a real runner
github-actions[bot] Jul 31, 2026
7db9c80
ci: run checks against the relocked dependencies
claude Jul 31, 2026
90d7164
fix: declare mysql2 in the editor app, which imports it directly
claude Jul 31, 2026
8ac837b
chore: regenerate bun.lock on a real runner
github-actions[bot] Jul 31, 2026
59b0509
ci: run checks against the relocked dependencies
claude Jul 31, 2026
7413fea
feat: give the console's transactional mail a designed HTML part
claude Jul 31, 2026
a5baa0b
fix: ship the console's migrations and native-alias step with the bundle
claude Jul 31, 2026
7096d12
feat: push console changes back to its own repository
claude Aug 1, 2026
bc85e93
fix: remove the account menu overlaid on the editor toolbar
claude Aug 1, 2026
3f73158
fix: Home links point at the editor, not the console
claude Aug 1, 2026
78130a6
feat: the editor lives at the root URL, and access follows the consol…
claude Aug 1, 2026
e184c09
feat: scene administration moves into the console
claude Aug 1, 2026
cca8b0c
feat: console sites become real 3D scenes
claude Aug 1, 2026
4f1d1d5
feat: scenes created in the editor appear on Sites & Projects
claude Aug 1, 2026
4af6eee
feat: publishing is an admin decision, and the guide is public
claude Aug 1, 2026
1544a92
feat: a documentation site, a public changelog, and project management
claude Aug 1, 2026
5b62591
feat: the real brand mark, a documentation shell, and a theme that fo…
claude Aug 1, 2026
a43b223
feat: system theme by default, a call to action that knows who is rea…
claude Aug 1, 2026
aae442f
fix: the sign-in notice reports real activity, not a fabricated line
claude Aug 1, 2026
d417a8f
fix: the browser tab shows the brand mark
claude Aug 1, 2026
d73bf6a
One theme button that starts on the system, and a language switch on …
claude Aug 1, 2026
5c87db5
The scenes library moves into the editor, and every message the syste…
claude Aug 1, 2026
fb20d27
The console stops answering to accounts that may only look
claude Aug 1, 2026
8e7cb2a
Mail stops being a card that resembles the console and becomes the co…
claude Aug 1, 2026
8fd5c67
Scenes stops wearing the zone tool's icon, and Settings learns who is…
claude Aug 1, 2026
f7d406b
Expert floor-plan mode gains the way back out
claude Aug 1, 2026
79e12ab
Every changelog entry says which component it belongs to, and carries…
claude Aug 1, 2026
eb5cb7b
Say why an account cannot be deleted instead of reporting a server error
claude Aug 1, 2026
4a9895f
The test message reports whether it was actually delivered
claude Aug 1, 2026
a01ab0b
deploy: the bundle stops calling itself Pascal
claude Aug 1, 2026
fac88a2
Deleting a user stops being blocked by what they once did
claude Aug 1, 2026
392b3f4
An invitation that is not delivered stops reporting success
claude Aug 1, 2026
3726b24
Close an unauthenticated read of every scene, and five findings from …
claude Aug 1, 2026
6c482d1
A converter carries scenes out of the legacy desktop build
claude Aug 3, 2026
91e9cb0
Migrated nodes are parsed to their schema's shape before they are saved
claude Aug 3, 2026
9aeb9d2
The warehouse plugin follows its own main again
claude Aug 3, 2026
056db12
The published bundle says 2.13.0
claude Aug 3, 2026
f3a1077
Write down how a plugin release reaches the site
claude Aug 3, 2026
4353d2c
Pin the plugin's v0.1.1 release
claude Aug 4, 2026
74acee6
chore: regenerate bun.lock on a real runner
github-actions[bot] Aug 4, 2026
49e2781
Pin the plugin's v0.1.2 release
claude Aug 4, 2026
eb4485d
ci: relock for the new plugin pin (49b2f16)
claude Aug 4, 2026
14c6183
chore: regenerate bun.lock on a real runner
github-actions[bot] Aug 4, 2026
3840a0c
The published bundle says 2.15.0
claude Aug 4, 2026
261afe6
chore: pin plugin-warehouse v0.1.4
claude Aug 5, 2026
6e84ee4
chore: pin plugin-warehouse v0.1.4 — canlıya çıkabilen dala (#3)
ovurrsl Aug 5, 2026
ee5bf46
fix(auth): enforce the lockout on the second factor, not just report it
claude Aug 5, 2026
4f0589e
fix(sync-panel): stop pushing the two tabs the console cannot serve
claude Aug 5, 2026
3b5f52a
fix(sync-panel): hold back three more files the console cannot compile
claude Aug 5, 2026
bad4115
feat(sync-panel): pull the console back, from the same tables
claude Aug 5, 2026
e44fd3b
feat(ci): pull the console automatically, and stop pushing it back
claude Aug 5, 2026
23d72ad
feat(ci): move the plugin pin automatically, and hand off to the deploy
claude Aug 5, 2026
871d012
feat(ci): make `integration` the branch every workflow agrees on, and…
claude Aug 5, 2026
6232999
Merge pull request #4 from ovurrsl/claude/mfa-lockout-and-panel-sync
ovurrsl Aug 5, 2026
257bb93
chore: pin plugin-warehouse b53d9de
github-actions[bot] Aug 5, 2026
bc621b6
fix(ci): stop the hourly console pull failing on every quiet run
claude Aug 5, 2026
75c5a89
fix(ci): open the upstream pull request whenever integration is behind
claude Aug 5, 2026
f82ce6f
docs: describe the automation as it now works
claude Aug 5, 2026
ec6f460
docs: tell an agent it is in the fork before it reads upstream's rules
claude Aug 5, 2026
ba7b6e7
Merge pull request #6 from ovurrsl/claude/x86-graphics-performance-is…
ovurrsl Aug 5, 2026
5941644
chore: pin plugin-warehouse 73c26b7
github-actions[bot] Aug 5, 2026
51dd60e
chore: pin plugin-warehouse 034a30f
github-actions[bot] Aug 6, 2026
45f32bc
chore: pin plugin-warehouse 71aa813
github-actions[bot] Aug 6, 2026
568b97f
chore: pin plugin-warehouse f7f8579
github-actions[bot] Aug 7, 2026
76fd1ff
chore: pin plugin-warehouse c419782
github-actions[bot] Aug 7, 2026
22b9609
chore: pin plugin-warehouse 67064b8
github-actions[bot] Aug 7, 2026
2f7f2e3
perf+fix: storey memoizasyonu, marquee eklenti seçimi, Furnish'te reg…
claude Aug 7, 2026
4821183
style: biome biçimi — computeLevelElevations imzası tek satır
claude Aug 7, 2026
6e1cd99
Merge pull request #7 from ovurrsl/claude/camera-stutter-measurements…
ovurrsl Aug 7, 2026
6b87e59
chore: pin plugin-warehouse 60b02f7
github-actions[bot] Aug 7, 2026
c86e6dc
Revert "chore: pin plugin-warehouse 60b02f7"
claude Aug 7, 2026
4bbd451
Revert "Merge pull request #7 from ovurrsl/claude/camera-stutter-meas…
claude Aug 7, 2026
8edbe81
chore: pin plugin-warehouse 7297951
github-actions[bot] Aug 7, 2026
0fac366
chore: pin plugin-warehouse 01a0b87
github-actions[bot] Aug 7, 2026
1461f9f
chore: pin plugin-warehouse 349e388
github-actions[bot] Aug 7, 2026
45c7cfe
perf: duvar kesiti tazelemesi ölü işi seçili olmayan duvarlar için ya…
claude Aug 7, 2026
cc13a6c
Merge pull request #8 from ovurrsl/claude/camera-stutter-measurements…
ovurrsl Aug 7, 2026
0337dbe
perf: seçim ana hattının iç render geçitleri sahne grafiğini yeniden …
claude Aug 7, 2026
b454e86
chore: pin plugin-warehouse 14053d7
github-actions[bot] Aug 10, 2026
2204d8f
chore: pin plugin-warehouse 14053d7
github-actions[bot] Aug 10, 2026
76e4550
fix: eklenti nesneleri ağaçta hiç çizilmiyor, panel başlığı da kindʼi…
claude Aug 10, 2026
01d15ad
Merge pull request #9 from ovurrsl/claude/camera-stutter-measurements…
ovurrsl Aug 10, 2026
84d693f
chore: pin plugin-warehouse c21a058
github-actions[bot] Aug 10, 2026
a9ddf7a
chore: pin plugin-warehouse 1209ae0
github-actions[bot] Aug 10, 2026
7b3f3fb
chore: pin plugin-warehouse 0afebaa
github-actions[bot] Aug 10, 2026
6e4c169
fix(ci): ayna upstream'in ci.yml değişikliğinde takılıyordu — MIRROR_…
claude Aug 10, 2026
9a34f89
Merge pull request #10 from ovurrsl/claude/camera-stutter-measurement…
ovurrsl Aug 10, 2026
d018b44
Pascal güncellemesini al (beta.2 → beta.5, 56 commit)
claude Aug 10, 2026
c67248a
fix: birleştirme sonrası ölü import'lar ve biçim
claude Aug 10, 2026
0cfba5b
ci(relock): bun sürümünü packageManager ile hizala (1.3.0 → 1.3.14)
claude Aug 10, 2026
7752cda
chore: regenerate bun.lock on a real runner
github-actions[bot] Aug 10, 2026
3569b3a
chore: regenerate bun.lock on a real runner
github-actions[bot] Aug 10, 2026
ffaee5c
fix(deps): postcss'i sabitle — kilit her relock'ta salınıyordu
claude Aug 10, 2026
0d1b559
chore: regenerate bun.lock on a real runner
github-actions[bot] Aug 10, 2026
f418448
docs(upstream): geri dönüş yordamı + upstream alım günlüğü
claude Aug 10, 2026
c4f7653
ci: uygulaması olmayan dört testi ve CLI duman testini ayır
claude Aug 10, 2026
8a7c963
test(graph-schema): şemadan üretilen fikstürler — süit ilk kez koştu
claude Aug 10, 2026
e70c745
chore: pin plugin-warehouse f61f677
github-actions[bot] Aug 10, 2026
4b133f9
chore: pin plugin-warehouse ed35f53
github-actions[bot] Aug 10, 2026
ba8dcc5
chore(storage): Docker dosyalarını sil, üretimdeki SQLite kaçış kapıs…
claude Aug 11, 2026
0ade6e1
chore: pin plugin-warehouse 2aa497a
github-actions[bot] Aug 11, 2026
d93b520
Merge integration — eklenti pini 2aa497a (ızgara düzeltmesi)
claude Aug 11, 2026
8e24f0d
chore: regenerate bun.lock on a real runner
github-actions[bot] Aug 11, 2026
e42a7ce
ci: kilit tazelendikten sonra kontrolleri tetikle
claude Aug 11, 2026
680b0c3
Pascal güncellemesini al (beta.2 → beta.5, 56 commit) (#11)
ovurrsl Aug 11, 2026
c325f5f
fix(deploy): outputFileTracingRoot bundle'ı sakat bırakıyordu (#12)
ovurrsl Aug 11, 2026
9a785f9
fix(deploy): paket 16.2.9 ile çalıştırıyordu, uygulama 16.3.0 ile der…
ovurrsl Aug 11, 2026
93c32bc
fix(root): ana adres MySQL'e kaydediyor + tuvalin üstündeki iki gezin…
ovurrsl Aug 11, 2026
520105b
Plandan kalanlar: büyük depoda oda/slab, walkthrough hızı, dört ölü d…
ovurrsl Aug 11, 2026
db22f7b
Kılavuz ölçek alanı kalibrasyonu sessizce yok ediyordu + eklenen düğm…
ovurrsl Aug 12, 2026
292463b
Ev ölçeğindeki tavanlar depo çizimini engelliyordu (#17)
ovurrsl Aug 12, 2026
6fd505b
Kesinti paketi: yedekler 5, olaylar 10, DDL reddi siteyi öldürmüyor (…
ovurrsl Aug 12, 2026
8d4cdee
chore: pin plugin-warehouse 606da00
github-actions[bot] Aug 13, 2026
ec6fa66
perf(core): merdiven senkronu sahneyi yuzey basina yeniden taramasin …
ovurrsl Aug 13, 2026
18c0303
perf(viewer): BVH bakimi surekli olsun (#20)
ovurrsl Aug 13, 2026
4fc1431
perf(viewer): statik nesnelerin matris compose'unu dondur (#21)
ovurrsl Aug 13, 2026
c0c8168
chore: pin plugin-warehouse c55d384
github-actions[bot] Aug 17, 2026
51bdb00
chore: pin plugin-warehouse 58fd80e
github-actions[bot] Aug 17, 2026
72d09cc
feat(editor): undo/redo + sahne kilidi + kategori gorunurluk/kilit (#22)
ovurrsl Aug 17, 2026
033a891
feat(editor): host mobilya katalogunu kaldir — depo ekipmani furnish …
ovurrsl Aug 17, 2026
deb88ea
chore: pin plugin-warehouse 0e09cca
github-actions[bot] Aug 17, 2026
dbc081c
feat(editor): proje paylaşımı + ortak çalışma + sahne kartı (yedek/ön…
ovurrsl Aug 17, 2026
ebc667a
fix(editor): kilitli nesne seçilememeli (tüm-sahne + kategori kilidi)…
ovurrsl Aug 17, 2026
18b6c24
feat(editor): scenes rayı sade + /scenes zengin yönetim + tek-aktif-e…
ovurrsl Aug 18, 2026
0551e33
fix(editor): silme modu (X) takılı kalmasın — toggle olsun (#27)
ovurrsl Aug 18, 2026
557c385
chore: pin plugin-warehouse 609cf12
github-actions[bot] Aug 19, 2026
70d1e68
fix(editor): kilit kapılarında atlanan iki yer + devir dokümanı (#28)
ovurrsl Aug 19, 2026
4dfe43d
docs: define plugin viewer appearance contract (#625)
Aymericr Aug 10, 2026
8a0a652
fix(core): share vertical scene canonicalization (#626)
Aymericr Aug 10, 2026
79ff10d
fix(editor): harden history command ownership (#627)
Aymericr Aug 10, 2026
b9035e2
fix(core): keep placement drafts out of undo history (#637)
Aymericr Aug 11, 2026
96a85da
feat(editor): support noPanel sidebar tabs for stage-driving rail ent…
wass08 Aug 12, 2026
8fa5275
fix(editor): retry bun install on transient GitHub 429 (#674)
Aymericr Aug 17, 2026
a82ee4d
nodes: stop tracking elevator dirty state (#599)
JimmyZheng-ZJU Aug 17, 2026
3b98e9d
fix(viewer): stop isolation and solo from overwriting each other's la…
toycenterboss-bot Aug 17, 2026
df3d70f
feat(viewer): make the frame cap configurable (#671)
ztffn Aug 18, 2026
2fc9c08
fix(core): import WallNode in use-scene-commits.test.ts
Aug 19, 2026
ad08fa7
core: reconcile room surfaces after wall topology edits (#624)
sudhir9297 Aug 11, 2026
544efe9
fix: restore wall plane-bound defaults (draft, panel, self-heal) (#630)
wass08 Aug 11, 2026
f2f8bd5
fix(editor): clamp viewport/area snapshot captures to 2048px long edg…
wass08 Aug 12, 2026
cc04464
feat(editor): raise room-envelope height caps from 6m to 20m (#642)
wass08 Aug 12, 2026
7434e66
editor: drop the stale 6 m caps and surface the ceiling's level bound…
wass08 Aug 14, 2026
8caa29e
editor: fix wall item placement preview drifting off the item (#643)
wass08 Aug 13, 2026
6e8b451
fix(viewer): stable level elevation smoothing + bones 4cd28a0 (view-m…
Snoopy147 Aug 16, 2026
eee43e6
fix: plugin node kinds miss hover/click subscriptions when they regis…
Snoopy147 Aug 16, 2026
2f4ef8c
Plugin inspector-card extensions (per-kind sections on the floating i…
Snoopy147 Aug 16, 2026
46baead
fix(editor): inspector extension mode is either/or with the regular c…
Snoopy147 Aug 16, 2026
653b4cd
feat(editor): add synchronized 2D viewer modes (#672)
Aymericr Aug 17, 2026
aa752cd
perf(editor): stabilize viewer stage mode sets (#673)
Aymericr Aug 17, 2026
695a8ce
perf(viewer): sew a level wall set into one mesh (#608)
toycenterboss-bot Aug 18, 2026
f863396
perf: tighten viewer runtime ownership (#675)
Aymericr Aug 18, 2026
d99c9b5
chore: bump plugin-bones to 39f1916 (camera-proof X-ray + round-10/11…
Snoopy147 Aug 14, 2026
a22dad3
chore: bump plugin-bones to a4baf65 (triple-loop night: dollhouse X-r…
Snoopy147 Aug 15, 2026
877917f
chore: bump plugin-bones to 92e1f12 — electrical avoids window/door r…
Snoopy147 Aug 15, 2026
80041c4
feat(editor/nodes): enforce warehouse-scale limits, motion JSX typing…
Aug 19, 2026
44eafa5
Add Streetscape plugin to Pascal (#628)
wass08 Aug 11, 2026
e7c96de
feat(editor): wire the Bones structural X-ray plugin into the standal…
wass08 Aug 14, 2026
7722bec
chore: bump plugin-bones to 041041da — dawn batch: AC power circuits,…
Snoopy147 Aug 18, 2026
68757bb
editor: add Blender-style custom mesh editing (#638)
sudhir9297 Aug 18, 2026
6987e26
feat(editor): edit shared parameters across a homogeneous multi-selec…
wass08 Aug 18, 2026
c48881d
release: @pascal-app/core@1.0.0-beta.5 @pascal-app/viewer@1.0.0-beta.…
github-actions[bot] Aug 18, 2026
d49a38e
chore: cleanly regenerate bun.lock after Phase 3 sync
Aug 19, 2026
e882787
fix(editor): optional-chain capabilities in pointer-support-cap and c…
Aug 19, 2026
b5d161f
chore: pin plugin-warehouse d188ad4
github-actions[bot] Aug 20, 2026
f174868
feat: On-demand plugin ecosystem integration
Aug 20, 2026
7f629b8
Merge pull request #31 from pascalorg/main
ovurrsl Aug 21, 2026
dd1d8b3
fix: use workspace refs for local plugins to fix CI
Aug 21, 2026
1279a46
feat: Add warehouse summary panel and draggable action menu
Aug 24, 2026
4a47d3e
fix(ci): migrate biome configuration in lingo to fix nested root errors
Aug 24, 2026
9877cd2
feat: add screenshot button to action menu
Aug 24, 2026
e538d48
chore: remove the agent scratch files from the repo root
claude Aug 24, 2026
5d4aeac
fix(editor): re-encode the action menu as UTF-8
claude Aug 24, 2026
fcaddf3
fix(editor): accept the compact prop the action menu passes
claude Aug 24, 2026
7499ba7
fix(build): take the vendored lingo monorepo out of the workspace
claude Aug 24, 2026
eace1dd
fix(ci): scope Biome to code we author, and clear what that surfaced
claude Aug 24, 2026
4747d7a
Merge remote-tracking branch 'origin/integration' into claude/github-…
claude Aug 24, 2026
57ab902
chore: pin plugin-warehouse 4f056e7
claude Aug 24, 2026
a9f8f26
chore: regenerate bun.lock on a real runner
github-actions[bot] Aug 24, 2026
0613fe0
feat(catalog): upgrade ItemCatalog for vector icons and styling parity
Aug 24, 2026
b7eb0c5
docs: correct the Turbopack rule — 'use server' is not the fix
claude Aug 24, 2026
d47162a
Merge remote-tracking branch 'origin/integration' into claude/github-…
claude Aug 24, 2026
92f06c3
style: sort the item-catalog exports Biome flagged
claude Aug 24, 2026
1122c86
CI ve deploy'u yeşile döndür: compact prop, lingo workspace'i, Biome …
ovurrsl Aug 24, 2026
ac6e835
fix(editor): type the ItemCatalog interaction test against the real s…
claude Aug 24, 2026
da128a5
CI'ın son kırmızısı: ItemCatalog etkileşim testini gerçek store tiple…
ovurrsl Aug 24, 2026
9f8d95a
chore: pin plugin-warehouse dadaeb6
github-actions[bot] Aug 24, 2026
b3df22f
Antigravity denetimi: Site panelindeki çökmeyi düzelt, istenmeyen ekl…
ovurrsl Aug 24, 2026
8649726
Viewer toolbar'daki ekran görüntüsü düğmesini geri getir (#35)
ovurrsl Aug 24, 2026
790da2a
Snapshot: takılmayı düzelt, diske kaydet, boyut ve formatı kullanıcıy…
ovurrsl Aug 24, 2026
c96887e
chore: pin plugin-warehouse 021b9ec
github-actions[bot] Aug 24, 2026
e2aa9cd
Panel scrollbar'ı sistemin kendisi olsun ve tutulabilsin (#37)
ovurrsl Aug 24, 2026
8702876
Zone içeriğini göster + kenar çubuğu sürüklemesinin takılı kalmasını …
ovurrsl Aug 24, 2026
36a66aa
Eklenti nesnelerine kendi Assets sekmesi (#39)
ovurrsl Aug 24, 2026
f261795
Dikey açıklık mekanizmasını eklentilere aç (#40)
ovurrsl Aug 24, 2026
b909aa0
chore: pin plugin-warehouse f93b4f8
github-actions[bot] Aug 24, 2026
bccf86b
Merge upstream 7f629b8c into integration — beta.5 → 55 commits
claude Aug 24, 2026
8194034
feat(core): let a vertical opening answer per surface, not per level
claude Aug 24, 2026
f3ab6a3
chore: regenerate bun.lock on a real runner
github-actions[bot] Aug 24, 2026
55035ff
feat(editor): let a kind validate its own move, not only its footprint
claude Aug 24, 2026
c546cd7
Merge remote-tracking branch 'origin/integration' into claude/github-…
claude Aug 24, 2026
2b68811
fix(nodes/zone): stop the contents panel looping the editor to a halt
claude Aug 25, 2026
e6756f6
Upstream 7f629b8c'yi al (55 commit) + dikey açıklık, sürükleme kapısı…
ovurrsl Aug 25, 2026
f1745ec
chore: pin plugin-warehouse 119716b
github-actions[bot] Aug 25, 2026
efe7c94
feat(zone): implement extensible zone takeoff engine and quantities UI
Aug 26, 2026
e8ed695
chore: pin plugin-warehouse fe2798e
github-actions[bot] Aug 26, 2026
a65b979
fix(catalog): render webp/png raster icons correctly in ItemCatalog i…
Aug 26, 2026
466a43b
feat(zone): implement 2D rack footprint visualization in ZoneQuantiti…
Aug 26, 2026
ed81384
fix(deps): update plugin-warehouse to latest commit to fix CI build
Aug 26, 2026
7da72d1
feat(catalog): use png icons for warehouse items
Aug 26, 2026
079e708
feat(local): preserve dynamic plugin manager, presence, mcp and zone …
Aug 27, 2026
43f6a01
chore(sync): merge upstream/main into integration with custom feature…
Aug 27, 2026
8909ea6
fix(deps): ensure zustand dependency in apps/editor and clean test im…
Aug 27, 2026
852e91e
fix(types): resolve type assertions in tests and optional dynamic plu…
Aug 27, 2026
add8c82
fix(nodes): preserve uncapped warehouse dimension limits and complete…
Aug 27, 2026
f965b3e
Merge upstream/main: resolve conflicts, upgrade Zod, align ToolMode F…
Sep 2, 2026
bfaa0a8
fix(editor): align delete mode toggle with single-writer ToolMode FSM…
Sep 2, 2026
3c1443f
test(editor): expand timeouts for async dynamic plugin loading in tes…
Sep 2, 2026
4e8ecbd
test(editor): add timeout flag to bun test script in package.json
Sep 2, 2026
b2eb893
fix(editor): attach thumbnail listener unconditionally and enforce ed…
Sep 2, 2026
6f06c7e
feat(ui): activate FloatingLevelSelector and prevent overlaps
Sep 3, 2026
f1e43e7
Merge upstream/main and resolve conflicts
Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
68 changes: 68 additions & 0 deletions .agents/rules/nextjs_turbopack.md
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.
10 changes: 0 additions & 10 deletions .dockerignore

This file was deleted.

120 changes: 120 additions & 0 deletions .github/deploy/README.md
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.
27 changes: 27 additions & 0 deletions .github/deploy/package.json
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"
}
}
22 changes: 22 additions & 0 deletions .github/deploy/setup-native.mjs
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')
Comment thread
cursor[bot] marked this conversation as resolved.
104 changes: 104 additions & 0 deletions .github/workflows/bump-plugin.yml
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
Comment thread
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' }}"
Loading