Lays down the v1.1.3 plumbing:
- `ScriptKind` enum in `picloud-shared` ('endpoint' | 'module').
- `ModuleSource` trait + `ModuleScript` DTO + `NoopModuleSource` in
`picloud-shared`. Resolver lives in `executor-core`; Postgres impl
in `manager-core` (`PostgresModuleSource`).
- `Services::new` grows a fifth `modules: Arc<dyn ModuleSource>` arg.
- `ScriptValidator` returns `ValidatedScript { imports }` so the
manager can populate the dep-graph table on save. New
`validate_module` method on the trait gates module-shape rules.
- `Engine::execute_ast(&Arc<rhai::AST>, req)` lets the orchestrator's
script cache reuse compiled ASTs. `Engine::execute(&str, req)` is
preserved as a convenience that compiles inline. `Engine::compile`
exposes the AST for callers that want to cache.
- `PicloudModuleResolver` replaces `DummyModuleResolver` per-call.
Bridges Rhai's sync `ModuleResolver::resolve` to async
`ModuleSource::lookup` via `Handle::block_on`. Enforces:
- cross-app isolation (resolver captures `Arc<SdkCallCx>`),
- circular import detection (in-progress stack on the resolver),
- import depth limit (default 8 via
`Limits::module_import_depth_max`).
- Module-shape validation walks `ast.statements()` via `rhai/internals`
and accepts only `Var { CONSTANT }`, `Import`, and `Noop`. The
manager admin endpoint runs `validate_module` at save (primary
gate); resolver re-runs it at load (defense in depth).
- LRU cache `(AppId, name) -> (updated_at, Arc<Module>)` owned by
`Engine`. Size from `PICLOUD_MODULE_CACHE_SIZE` (default 512).
- Migration `0015_scripts_kind.sql` adds `scripts.kind` + composite
index + module-name shape CHECK.
- Migration `0016_script_imports.sql` adds the dep-graph table with
FK CASCADE on both columns.
- Repo: `kind` threaded through SELECT/INSERT/UPDATE. New
`count_routes_for_script` / `count_triggers_for_script` /
`list_imports` methods. `create`/`update` open a transaction and
call `replace_imports_tx` to populate the dep-graph.
- Admin endpoint: accepts `kind`; rejects reserved module names;
rejects `endpoint → module` transitions when routes / triggers
exist.
- SDK_VERSION 1.3 → 1.4.
Workspace builds; full test suite (~440 tests) green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
49 lines
2.3 KiB
Rust
49 lines
2.3 KiB
Rust
//! Version constants for PiCloud's compatibility surfaces.
|
|
//!
|
|
//! See [`docs/versioning.md`](../../../../docs/versioning.md) for the
|
|
//! full scheme. The product version is sourced from the workspace
|
|
//! package version; the four surface versions live in this module
|
|
//! and are bumped under the rules in that doc.
|
|
|
|
/// Product version (e.g. `"0.2.0"`). Sourced from this crate's
|
|
/// `Cargo.toml` so the workspace-inherited package version is the
|
|
/// single point of update.
|
|
pub const PRODUCT_VERSION: &str = env!("CARGO_PKG_VERSION");
|
|
|
|
/// Rhai SDK version, in `"major.minor"` form. Scripts read this from
|
|
/// `ctx.sdk_version` for feature detection. Bump rules:
|
|
/// * patch (`1.x.0`): doc-only, no script-observable change
|
|
/// * minor (`1.0 → 1.1`): added functions / fields; existing
|
|
/// scripts must still run unchanged
|
|
/// * major (`1 → 2`): removed, renamed, retyped, restricted
|
|
///
|
|
/// 1.1 additions: `ctx.request.params`, `ctx.request.query`,
|
|
/// `ctx.request.rest`.
|
|
///
|
|
/// 1.2 additions (v1.1.1): `kv::collection(name).{get,set,has,delete,list}`,
|
|
/// `dead_letters::{replay,resolve}`, `ctx.event` for triggered handlers.
|
|
///
|
|
/// 1.3 additions (v1.1.2):
|
|
/// `docs::collection(name).{create,get,find,find_one,update,delete,list}`
|
|
/// with the v1.1.2 query DSL subset; `ctx.event.docs` for docs-trigger
|
|
/// handlers (carries `prev_data` change-data-capture for update/delete).
|
|
///
|
|
/// 1.4 additions (v1.1.3): `import "<name>" as <alias>;` for scripts
|
|
/// whose corresponding module (`kind = 'module'`) lives in the same
|
|
/// app. Cross-app imports are unreachable (the `name` argument carries
|
|
/// no `app_id`). Modules expose `fn`/`const` declarations only;
|
|
/// top-level statements are rejected at create-time.
|
|
pub const SDK_VERSION: &str = "1.4";
|
|
|
|
/// HTTP API major version. Appears in URL paths as `/api/v{N}/...`.
|
|
/// Bump (new integer + new URL prefix) when the request/response
|
|
/// shape, status-code semantics, or auth model changes. The previous
|
|
/// major is kept live for at least one product-minor deprecation
|
|
/// window.
|
|
pub const API_VERSION: u32 = 1;
|
|
|
|
/// Wire-protocol version between manager / orchestrator / executor
|
|
/// nodes in cluster mode. Negotiated via the `X-PiCloud-Wire` header
|
|
/// on inter-service requests. Reserved at `1`; cluster mode is v1.3+.
|
|
pub const WIRE_VERSION: u32 = 1;
|