356 Commits
Author SHA1 Message Date
zeekay 8901f7c858 chore: scrub PocketBase references, rebrand as Hanzo Base
Missed 2 PocketBase references in generated types.d.ts JSDoc comments.
2026-03-02 15:30:28 -07:00
zeekay dee0d76af8 fix: superuser token fallback in external-only auth mode + scrub PB references
- loadAuthToken now falls back to local validation for _superusers tokens
  when JWKS validation fails in external-only mode. Non-superuser local
  tokens are still rejected. Fixes seeding with IAM enabled.
- Scrub PocketBase references from docs, SDK, and UI config
2026-03-02 15:28:53 -07:00
zeekay e575b49392 fix(platform): skip external auth when IAM_ENDPOINT is empty
When IAM_ENDPOINT is empty or set to 'disabled'/'none', skip JWKS
registration and ExternalAuthOnly enforcement. This allows PB superuser
tokens to work for all collections, enabling data seeding and migration
without requiring a running IAM instance.
2026-03-02 13:59:36 -07:00
zeekay 278b0c8481 doc: vault security guide — MPC/KMS/Base production settings, key hierarchy, threat model 2026-03-02 13:27:04 -07:00
zeekay 270c3ffdac refactor: unify vault SDK — remove version markers, one coherent API
Remove all v2/v3/v4 section headers. The vault SDK is one product:
- Encrypted SQLite shards + CRDT sync + chain anchoring (core)
- Shared vaults + multi-device + collection sharing + recovery (sharing)
- Provider interfaces + export/import + metering (providers)
- Confidential compute + policy engine + audit log (confidential)

Rename test files: v2_test → sharing_test, v3_test → providers_test,
v4_test → confidential_test. 50 tests, all pass.

Product name: Base Vault SDK (not "plugin").
2026-03-02 13:19:30 -07:00
zeekay f11070fcf8 feat: vault v2+v3+v4 — complete Web5 data SDK, 50 tests
v2 — Sharing & Recovery:
- Shared vaults (org/team) with member access control
- Multi-device enrollment with per-device wrapping keys
- Per-collection sharing (recipient decrypts only shared collection)
- Threshold recovery (XOR split, Shamir in v3)

v3 — Provider Marketplace:
- SyncProvider, StorageProvider, RecoveryProvider interfaces
- Local providers (filesystem, content-addressed, share storage)
- Export/Import portable vault bundles (encrypted snapshot + oplog)
- Usage metering (puts, gets, syncs, anchors per vault)

v4 — Confidential Compute:
- ConfidentialEngine interface (opt-in FHE/ZK, NOT default)
- Local engine (decrypt-compute-prove baseline)
- PolicyEngine with capability-based access control (grant/check/revoke/expiry)
- Append-only audit log with hash-chained entries + merkle root

50 tests total. Zero failures. Zero external dependencies.
Multi-instance HA: each instance runs its own SQLite shard, CRDT
sync handles consistency. Encryption at rest via DEK/KEK hierarchy.
2026-03-02 13:14:19 -07:00
zeekay e6da9b68f6 test: 6 E2E tests — full user lifecycle, multi-device, org isolation
- FullUserLifecycle: register → store → read → anchor
- MultiDeviceSync: laptop writes → phone syncs → phone edits → laptop merges
- OrgMultiTenant: same user in different orgs gets different DEKs
- ConcurrentAccess: 50 parallel writers, all readable, correct oplog
- AnchorDeterministic: same state → same root, new write → new root
- DeviceRevocation: close session zeroes DEK, reads fail after revoke

18 total tests. All pass. Zero external deps.
2026-03-02 12:44:11 -07:00
zeekay e635cbe277 feat: vault SDK — 5 primitives, 12 tests, zero dependencies
Standalone SDK (no Base app required):
  v, _ := vault.Open(cfg)
  s, _ := v.OpenUser("alice")
  s.Put("key", value)        // encrypted, logged
  s.Get("key")               // decrypted
  s.Sync()                   // CRDT merge with peers
  s.Anchor()                 // merkle root for chain

5 primitives:
  1. Identity  — OpenUser, per-user DEK derivation
  2. KeyAccess — DEK/KEK hierarchy, HSM or K-Chain unwrap
  3. LocalDB   — encrypted put/get/delete with oplog
  4. Sync      — CRDT merge of encrypted ops (peers see ciphertext only)
  5. Anchor    — merkle root receipt for chain commitment

12 tests: round-trip encryption, cross-user isolation, cross-user
cannot decrypt, org isolation, CRDT merge, duplicate op skip,
anchor receipt, missing key, invalid master key.

Encrypted CRDT ops sync across authorized replicas;
chain only sees anchors/metadata.
2026-03-02 12:40:52 -07:00
zeekay 6fc10be26d feat: vault plugin — per-user encrypted SQLite shards with CRDT sync
Local-first data SDK for Hanzo Base apps:
- Per-user SQLite shard (encrypted, isolated)
- DEK/KEK hierarchy: Master KEK → Org KEK → User DEK → AES-256-GCM
- Master KEK from HSM (AWS/GCP/Azure) or K-Chain ML-KEM threshold
- CRDT sync via ZAP for conflict-free multi-device merge
- Merkle root anchoring to chain (identity, not row data)
- API: /vault/put, /vault/get, /vault/anchor, /vault/sync, /vault/export
- All routes require auth — user ID from Base auth context

Zero integration: import plugin, register, done. Each user gets
their own encrypted database file. Reads/writes instant. Sync background.
Chain stores roots, never data.
2026-03-02 12:39:19 -07:00
zeekay a28b3db6cc fix: vendor-neutral branding — remove all hardcoded "Hanzo Base"
Replace "Hanzo Base" fallbacks with generic "Base" in all Svelte UI
components. When $appName is set (e.g. "<tenant>"), it displays
that instead. Help text uses "the application" rather than a brand.

Files: App.svelte, FullPage.svelte, PageWrapper.svelte, index.html,
PageBackups, PageStorage, PageMail, TrustedProxyAccordion,
CollectionRulesTab, LarkOptions, PageExportCollections
2026-03-01 17:20:08 -07:00
zeekay 7fe0beaa96 test: 16 OrgDB tests — provisioning, DEK derivation, isolation
- ProvisionOrg/User creates directories and paths correctly
- Invalid slugs rejected (path traversal, uppercase, specials)
- HKDF DEK is deterministic, unique per org, unique per user,
  org≠user even with same input (different HKDF info param)
- Empty master key returns empty DEK (dev mode, no encryption)
- Lookup works after provision, returns false before
- DeleteUser removes directory and lookup entry
- Integration: OrgDB + PoolManager read/write through dual pools
- Multi-org isolation: same table name, different data per org
2026-03-02 14:39:34 -07:00
zeekay cc5f20c11a feat: Go 1.26 stdlib crypto — hkdf, sha3
- OrgDB DEK derivation: raw HMAC → crypto/hkdf.Key (RFC 5869, stdlib)
- security.SHA3_256, SHA3_512 using crypto/sha3 (FIPS 202, stdlib)
- No more x/crypto for key derivation or SHA3

Go 1.26 moved these from x/crypto to stdlib:
  crypto/hkdf, crypto/pbkdf2, crypto/sha3, crypto/mlkem
2026-03-02 14:31:16 -07:00
zeekay 22c14df4fa refactor: pool manager → dbx, base re-exports
PoolManager now lives in hanzoai/dbx v1.13.0 (canonical home).
base/plugins/platform/db_pool.go is a thin re-export wrapper.

Stack: dbx (pool) → orm (models) → base (platform)
One and only one way: dbx.NewPoolManager()
2026-03-02 14:14:26 -07:00
zeekay 634eecbe21 migrate: pocketbase/tygoja → hanzoai/tygoja v0.0.2
Zero pocketbase references remaining in go.mod or Go source.
All deps now under hanzoai org: hanzoai/dbx, hanzoai/tygoja.
2026-03-02 13:57:26 -07:00
zeekay d02a70442d migrate: pocketbase/dbx → hanzoai/dbx v1.12.0
Drop-in replacement — same API, same package name (dbx).
75 Go files updated. Zero pocketbase references in imports.
2026-03-02 13:54:55 -07:00
zeekay 10bae7d7c7 fix: update test expectations for UUID-compatible ID field
ID field changed to max=36, pattern=^[a-z0-9\-]+$ to support UUIDs.
Tests in apis/collection_test.go and plugins/migratecmd expected
the old max=15, pattern=^[a-z0-9]+$.
2026-03-02 13:45:36 -07:00
zeekay 44a531c54a perf: sharded RWMutex pool manager, 10K+ org scale
Optimizations from lux/metrics patterns:
- 16 shards with RWMutex (RLock for cache hits, Lock for misses)
- Cache-line padded PoolStats (no false sharing across cores)
- Two-phase eviction (find under lock, close without lock)
- FNV hash for shard selection

Benchmarks (M1 Max, -cpu=1,4,10):
  CacheHit:      118 ns (0 alloc) — scales flat across CPUs
  CacheMiss:     78 µs — dominated by SQLite open, no lock contention
  ConcurrentHit: 1.8 µs at 4 CPUs (1.3x faster than single)
  ReadWrite:     12 µs — stable across CPU counts (WAL is the bottleneck)
  ManyOrgs:      1.1 µs at 10 CPUs (6.4x faster than single) ← sharding pays off

At 10,000 org scale with eviction pressure, 10-CPU throughput
is 3.1M ops/sec with only 465 B/op.

6 tests pass: get/release, LRU eviction, no-evict-in-use,
100-goroutine concurrent access, close, data persistence.
2026-03-02 13:37:40 -07:00
zeekay 917cc4a634 fix: db pool config struct, tests + benchmarks
- DBPoolConfig with tunable ReadConns, ReadIdleConns, MaxPools
- Fixed openPool to use filepath.Dir (was buggy string slicing)
- 6 tests: get/release, LRU eviction, no-evict-in-use, concurrent
  access (100 goroutines), close, data persistence across reopen
- 5 benchmarks: cache hit (22ns), miss (79us), concurrent read
  (6.4us), read/write mix (17us), 500-org eviction pressure (5.9us)
- PoolStats for monitoring (hits, misses, evictions, opens, errors)
2026-03-02 12:42:15 -07:00
zeekay 425d008f4b feat: per-org/per-user SQLite pool manager + request middleware
DBPoolManager: LRU cache of dual-pool SQLite connections (read pool
with 20 conns + write pool with 1 conn per database file). Evicts
least-recently-used pools when capacity is reached.

platformOrgDBResolver middleware (priority loadAuthToken+4):
- Reads X-Org-Id and X-User-Id headers (set by upstream middleware)
- Resolves or auto-provisions the org/user SQLite file
- Stores DBPool in request context via re.Set("orgDB"/"userDB")
- Services are fully stateless — any instance serves any org/user

File layout:
  {DataDir}/orgs/{orgId}/org.db
  {DataDir}/orgs/{orgId}/users/{userId}/data.db

Activated when OrgIsolation="sqlite" in PlatformConfig.
2026-03-02 11:38:31 -07:00
zeekay 09480638b7 fix: types.d.ts pb_data → data (matches Go default) 2026-03-02 11:33:18 -07:00
zeekay 478588036d fix: standardize key prefixes — always hyphen, never underscore
Canonical prefixes:
  pk-  publishable key (frontend, read-only)
  sk-  secret key (backend, full access)
  hk-  hanzo key (IAM user key, legacy)
  hi-  hanzo insights (analytics events)
  ha-  hanzo analytics (lightweight web analytics)
  hz-  hanzo widget (restricted chat/embed)

Added IsAnalyticsKey() and IsWidgetKey() helpers.
Removed pk_/sk_ underscore variants — one way only.
2026-03-01 23:43:25 -07:00
zeekay c1794c3140 feat: enforce pk- read-only, sk- full access at middleware level
Publishable keys (pk-) are restricted to GET/HEAD/OPTIONS.
Any write method (POST/PUT/DELETE) returns 403 with clear error.

Secret keys (sk-), IAM keys (hk-), and JWTs have no method restriction.

Enforcement runs at priority +3 (after identity resolution, before handlers).
Every Base app gets this for free — zero per-route code needed.
2026-03-01 23:23:23 -07:00
zeekay 6a53ac0c9f feat: native IAM API key auth in platform plugin
Every Base app now supports IAM-managed API keys (hk-/pk-/sk-) natively.
Keys are created and managed in IAM — Base resolves them via IAM's
GET /api/get-user?accessKey= endpoint (cached 5min).

Auth chain: JWKS JWT → IAM API key → unauthenticated
Key types:
  pk-/pk_ = publishable (frontend-safe, read-only)
  sk-/sk_ = secret (backend-only, full access)
  hk-    = IAM key (legacy, full access)

Gateway validates JWTs statelessly via JWKS.
Base validates API keys via IAM (one canonical key store).
One way to do auth. IAM is the source of truth.
2026-03-01 23:18:56 -07:00
zeekay 9cb370fe1e refactor(auth): standardize OIDC/JWKS abstraction, remove IAM branding from core
Rename all IAM-specific identifiers to generic OIDC terminology:
- StoreKeyIAMJWKSURL → StoreKeyJWKSURL
- StoreKeyIAMOnly → StoreKeyExternalAuthOnly
- resolveIAMToken → resolveJWKSToken
- iamSub/iamOwner/iamEmail → authSub/authOwner/authEmail
- iamSubToRecordID → subToRecordID

Add externalAuthGuard() middleware to block built-in auth endpoints
(password, OTP, OAuth2, email-change, etc.) when external-only mode
is active. _superusers collection exempt for admin panel login.

Backward compat aliases preserved for StoreKeyIAM* constants.
2026-03-02 15:39:13 -07:00
zeekay 4e37e1e8cc auth: unify identity headers, add preferred_username JWT fallback
- resolveIAMToken: fallback sub → preferred_username → name (Casdoor compat)
- extractOrgID: X-Org-Id (was X-IAM-Org-Id)
- platformIdentityHeaders: remove X-Hanzo-* legacy headers
- Only X-User-Id, X-Org-Id, X-User-Email — no vendor prefix
2026-03-02 16:45:30 -07:00
zeekay fb0dce8533 fix: truncate IAM sub to 15 chars for Base record ID limit 2026-03-02 16:27:13 -07:00
zeekay 724c31293d feat: IAM JWKS fallback in loadAuthToken — Base accepts IAM JWTs natively 2026-03-02 14:40:08 -07:00
zeekay b4a26d51a8 fix: use published kms SDK module path, remove local replace
Replace the local filesystem replace directive with the properly
published module at github.com/hanzoai/kms/sdk/go v1.0.0. The
local path /Users/z/work/hanzo/kms/sdk/go doesn't exist in CI.
2026-03-02 03:16:33 -07:00
zeekay 9f4ad05550 rename: ZK-KMS → TFHE-KMS 2026-03-01 21:56:45 -07:00
zeekay fb3e1e7048 docs: add KMS plugin README — ZK encryption, FHE search, compliance modes 2026-03-01 21:44:07 -07:00
zeekay 60c7751bff feat: add kms plugin for zero-knowledge encrypted secrets with FHE queries 2026-03-01 21:18:54 -07:00
zeekay f3fa94ffaa refactor(platform): rename tenant files to org
tenant.go → org_isolation.go
tenant_db.go → org_db.go
tenant_storage.go → org_storage.go

Content was already renamed in previous commit. This adds the
new filenames after the old ones were removed.
2026-03-02 01:01:17 -07:00
zeekay 00609ecedb feat(platform): multi-org service with KMS creds, customer identity, and API routes
- OrgService: per-org config cache, KMS credential resolution with env fallback,
  customer identity provisioning with sequential IDs
- org_configs + org_customers system collections auto-created on boot
- REST routes under /api/platform/org with IAM-based access control
- Remove tenant-authorization header forwarding (unused)
- Simplify auth proxy to forward only Authorization header
2026-03-02 00:37:26 -07:00
zeekay 509f033dfd security: fix path traversal + JSON injection (red team findings)
- tenant_db.go: validateSlug() rejects ../path traversal in orgSlug/userId
  Only allows [a-z0-9_-], rejects empty/dot slugs
- tenant_storage.go: BucketPolicy uses encoding/json marshal instead of
  fmt.Sprintf — prevents JSON injection via orgSlug/userId/iamUser
2026-03-01 17:55:50 -07:00
zeekay c32ffbab9d feat: per-org + per-user S3 storage isolation with SSE-C encryption
TenantStorage manages isolated S3 prefixes on Hanzo S3 (s3.hanzo.space):

  tenants/{orgSlug}/org/                   ← org-level shared storage
  tenants/{orgSlug}/users/{userId}/        ← per-user isolated storage

Each level gets a unique SSE-C encryption key:
  org key  = HMAC-SHA256(master, "s3:org:" + orgSlug)
  user key = HMAC-SHA256(master, "s3:user:" + orgSlug + ":" + userId)

IAM bucket policies enforce path isolation:
  - Org admins: access tenants/{orgSlug}/*
  - Users: access only tenants/{orgSlug}/users/{userId}/*
  - Zero cross-org or cross-user access

PlatformConfig additions:
  TenantStorageEndpoint — S3 endpoint (s3.hanzo.space)
  TenantStorageBucket — root bucket name
2026-03-02 13:03:58 -07:00
zeekay f495312178 feat: per-org + per-user SQLite isolation with unique DEKs 2026-03-02 12:58:40 -07:00
zeekay c3b2d85a07 feat: per-tenant SQLite isolation mode for platform plugin
TenantIsolation config option:
  "prefix"   — (default) shared DB with t_{slug}_ collection prefixes
  "sqlite"   — separate encrypted SQLite per tenant in DataDir/tenants/
  "cloudsql" — separate PostgreSQL per tenant (existing cloudsql plugin)

TenantDB manager:
  - Provision(slug) → creates {DataDir}/tenants/{slug}/data.db
  - DEK(slug) → HMAC-SHA256(masterKey, slug) per-tenant encryption key
  - GetDBPath/Delete/List for lifecycle management
  - Each tenant's SQLite file is independently encryptable, backupable
  - Zero data commingling — physical file isolation

For <tenant>: TenantIsolation="sqlite" gives each customer their own
encrypted database. PII physically separated. FINRA-compliant isolation.
2026-03-02 12:19:30 -07:00
zeekay 157b7127ab security: fix critical and high findings from red team review
- C1: add orgId field to _tasks/_workflows, filter all queries by org
- C2: validate spaceID/orgID with regex before Temporal visibility queries
- H1: add sync.RWMutex to orgClients map (prevent concurrent map panic)
- H2: atomic FailTask with CASE expression (eliminate TOCTOU race)
- H4: extractCreator uses authenticated user ID, not raw headers
- Add orgId to collection schemas, store methods, and API filters
2026-03-02 01:02:45 -07:00
zeekay 05bfa4c91c fix(tasks): critical race condition + signal-driven workflows
- durable.go: add sync.RWMutex to orgClients map — concurrent writes
  to unprotected map caused panics under load. Double-checked locking
  pattern for connection caching.
- workflows.go: AgentTaskWorkflow now listens for claim/complete/fail/
  progress/cancel signals. Previously signals were accepted by Temporal
  but silently dropped (workflow had no signal channels). Now supports
  both auto-execute (activity) and signal-driven (human/agent-in-loop)
  patterns simultaneously via selector.
2026-03-02 00:44:03 -07:00
zeekay 512ffccfd9 feat(tasks): multi-tenant org isolation — IAM org ID maps to Temporal namespace 2026-03-02 12:42:49 -07:00
zeekay 8fa947426f feat(tasks): add ListTasks, GetNextTask, ListWorkflows to DurableStore via visibility API 2026-03-02 11:04:47 -07:00
zeekay fcfaa37ce2 chore: strip all PocketBase cruft from codebase
- Delete 7 one-off migration utilities (cmd/fix*, cmd/token*)
- Rename env vars: PB_ID_TOKEN_LEEWAY → HZ_ID_TOKEN_LEEWAY,
  PB_FILES_DELETE_MAX_WORKERS → HZ_FILES_DELETE_MAX_WORKERS
- Rename temp file prefix: pb_buffer_file_ → hz_buffer_
- Rename test data dir: pb_base_app_test_data_dir → test_data_dir
- Strip all "PocketBase" from comments (→ "Base" or removed)
- Strip pb_data references in backup error messages
- Update @group PocketBase → @group Base in JSVM type docs
- Update filesystem blob/s3 package doc comments
- _hzf_ field IDs in test DB (already done prior commit)

Zero remaining PocketBase/pb_ references in production Go code.
Only legitimate deps remain: pocketbase/dbx (query builder),
pocketbase/tygoja (JS VM bindings).
2026-03-01 20:44:11 -07:00
zeekay bb905e0226 feat(tasks): embed Temporal durable execution into base plugin
Adds native Temporal SDK integration to the tasks plugin:

- durable.go: DurableStore client (submit/cancel/signal/status workflows)
- workflows.go: AgentTaskWorkflow, PipelineWorkflow, FanOutWorkflow
- activities.go: ExecuteTaskActivity with heartbeat + pluggable executor
- worker.go: Embedded Temporal worker (polls task queue in-process)

SQLite remains authoritative state. Temporal provides crash-safe execution
that survives restarts. When durable is enabled:
- Task create → SQLite + Temporal workflow submission
- Task cancel → SQLite + Temporal workflow cancellation
- Task signal → forwarded to Temporal workflow

Multi-tenant via namespace-per-org (TASKS_NAMESPACE=org-acme).
Env config: TASKS_ENABLED, TASKS_ADDRESS, TASKS_NAMESPACE, TASKS_QUEUE.
Default cloud: tasks.hanzo.ai:7233. Falls back to SQLite-only if unreachable.
2026-03-01 17:12:06 -07:00
zeekay 3d88b99f8d feat(tasks): native SQLite-backed task execution plugin
Embeds a complete task queue and workflow scheduler into base using
the collection/record system backed by embedded SQLite.

Plugin creates _tasks and _workflows system collections on bootstrap
and runs a background scheduler that checks timeouts, advances
workflow state, and optionally auto-executes tasks via OnExecute callback.

API endpoints: create/get/list/update/claim/start/complete/fail/cancel/
progress/next (work-stealing) for tasks, plus create/get/list for
workflows with auto-chained pipeline and parallel (fan-out) support.

10 tests covering full lifecycle: CRUD, atomic claims, retry with
re-queue, dependency blocking, priority ordering, workflow advancement.
2026-03-02 16:58:15 -07:00
zeekay c909b81fde feat: IAM auth proxy + compliance config in platform plugin
Add generic IAM auth proxy routes (/api/platform/auth/*) for phone
verification, OTP login, signup. Add IAMOrg/IAMApp config fields.
2026-03-02 09:56:27 -07:00
zeekay 5817640d71 feat: add compliance extension to platform plugin
Optional luxfi/compliance integration for KYC/AML, sanctions screening,
and payment validation. Enabled by setting ComplianceEndpoint in
PlatformConfig. Adds 5 API routes under /api/platform/compliance/*.
No new Go dependencies — uses HTTP client to call compliance service.
2026-03-02 02:28:28 -07:00
zeekay 3fe483ac1b refactor: remove _hz_ prefix from collection IDs, add brand-neutral logo config
Remove all _hz_ prefixes from collection IDs, internal markers, and test
fixtures. The default users collection is now _users_auth_ instead of
_hz_users_auth_. Internal SQL parser tokens renamed from __hz_join__/__hz_discard__
to __join__/__discard__. Backup prefix changed from @auto_hz_backup_ to
@auto_backup_. Test database updated with correct collection IDs and indexes.
JWT tokens in test files regenerated with new collection IDs.

Add LogoURL field to MetaConfig so the admin UI logo is configurable via
app settings instead of hardcoded. FullPage.svelte and App.svelte sidebar
now read logo and app name from the settings store, falling back to
defaults when not configured.
2026-03-01 23:48:36 -07:00
zeekay ee7255323b fix: replace remaining pb references with base in ApiClient.js 2026-03-01 21:59:17 -07:00
zeekay cf0252a28e Merge remote-tracking branch 'upstream/master'
# Conflicts:
#	apis/record_auth_with_otp.go
#	core/base_backup.go
#	go.mod
#	go.sum
#	plugins/jsvm/internal/types/generated/types.d.ts
#	tools/router/rereadable_read_closer_test.go
#	ui/dist/assets/AuthMethodsDocs-C2aSYmNv.js
#	ui/dist/assets/AuthRefreshDocs-BapWJLRK.js
#	ui/dist/assets/AuthWithOAuth2Docs-Ck_pnbL8.js
#	ui/dist/assets/AuthWithOtpDocs-D8uWq_C5.js
#	ui/dist/assets/AuthWithPasswordDocs-BQyMhAeO.js
#	ui/dist/assets/BatchApiDocs-rvUuWLZE.js
#	ui/dist/assets/CodeEditor-DrMyw8z_.js
#	ui/dist/assets/CreateApiDocs-XWzcGuMB.js
#	ui/dist/assets/DeleteApiDocs-CScE0aw3.js
#	ui/dist/assets/EmailChangeDocs-CxOtrB4s.js
#	ui/dist/assets/FieldsQueryParam-BzNUQIb5.js
#	ui/dist/assets/FilterAutocompleteInput-Dm2G2coC.js
#	ui/dist/assets/Leaflet-DyumpnOc.js
#	ui/dist/assets/ListApiDocs-CdOzMZnr.js
#	ui/dist/assets/PageInstaller-vIXdffAJ.js
#	ui/dist/assets/PageOAuth2RedirectFailure-ClpyaW_B.js
#	ui/dist/assets/PageOAuth2RedirectSuccess-BLZml1eK.js
#	ui/dist/assets/PageRecordConfirmEmailChange-Cm3O2YD1.js
#	ui/dist/assets/PageRecordConfirmPasswordReset-D0XfuL45.js
#	ui/dist/assets/PageRecordConfirmVerification-CYyNYH_v.js
#	ui/dist/assets/PageSuperuserConfirmPasswordReset-BvlQ0_9t.js
#	ui/dist/assets/PageSuperuserRequestPasswordReset-gUPMclJZ.js
#	ui/dist/assets/PasswordResetDocs-DMF1vqE0.js
#	ui/dist/assets/RealtimeApiDocs-CNVij_C2.js
#	ui/dist/assets/UpdateApiDocs-CwQ3ZhFQ.js
#	ui/dist/assets/VerificationDocs-DUeWWjrS.js
#	ui/dist/assets/ViewApiDocs-gocWxbTE.js
#	ui/dist/assets/index-CWGqJiyp.js
#	ui/dist/index.html
2026-03-01 19:27:21 -07:00
Gani Georgiev f2f0435736 updated jsvm types 2026-03-02 15:02:59 +02:00