Files
PiCloud/crates/shared/src/version.rs
MechaCat02 84833d3e4e feat(v1.1.3-modules): shared types, migrations, engine + resolver scaffold
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>
2026-06-02 22:04:21 +02:00

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;