-- v1.1.3: distinguish endpoint scripts (HTTP / trigger entry points) from -- module scripts (libraries `import`ed by other scripts). The Rhai module -- resolver added in v1.1.3 looks up `kind = 'module'` rows by -- `(app_id, name)`; route bind and trigger create reject `kind = 'module'` -- targets. -- -- Backfill: existing rows take the DEFAULT clause on column add. Every -- script that existed in v1.0 / v1.1.0 / v1.1.1 / v1.1.2 was an endpoint -- (the only kind those versions supported), which matches the default. ALTER TABLE scripts ADD COLUMN kind TEXT NOT NULL DEFAULT 'endpoint' CHECK (kind IN ('endpoint', 'module')); -- Composite index on (app_id, kind) so the resolver's per-app module -- lookup ("modules in app X named Y") is one index scan. The existing -- per-app UNIQUE on `name` already serves name-based lookups, but it -- doesn't help when filtering specifically for `kind = 'module'`. CREATE INDEX idx_scripts_app_kind ON scripts (app_id, kind); -- Modules are imported by exact string name; arbitrary spaces / control -- characters would make `import ""` fragile. We constrain module -- names to a conservative identifier shape (letters, digits, underscore; -- starts with a non-digit; up to 64 chars). Endpoint scripts keep the -- looser pre-v1.1.3 name rules — the dashboard generates endpoint names -- (and some users may already have spaces in them; we don't break those). ALTER TABLE scripts ADD CONSTRAINT scripts_module_name_shape CHECK ( kind <> 'module' OR name ~ '^[a-zA-Z_][a-zA-Z0-9_]{0,63}$' );