Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

7.9 KiB

Scratchpad — Workflow Import/Export (2026-01-25)

Context

  • Workflow Runtime V2 stores:
    • workflow_definitions (draft + metadata)
    • workflow_definition_versions (published immutable versions)
  • Existing test helpers exist under server/src/test/helpers/workflowRuntimeV2TestHelpers.ts.

Decisions (draft)

  • Use a JSON bundle format with explicit format + formatVersion.
  • V1 accepts exactly one version and rejects others (no migration/back-compat).
  • “Full fidelity” targets workflow behavior + operational settings, not audit timestamps.
  • Bundle requires a stable portable key per workflow (distinct from DB ids).
  • Import always regenerates workflow_id.
  • Import is create-only by default; --force / force=true overwrites by deleting the existing workflow (matched by key) and recreating it from the bundle.
  • V1 is API-only plus a CLI wrapper in tools/ (no UI).

Proposed docs locations

  • ee/docs/schemas/workflow-bundle.v1.schema.json
  • ee/docs/guides/workflows/workflow-import-export.md

Open Questions to resolve

  1. Do we need additional explicit validation beyond DB constraints for specific reference types (if constraints are insufficient)?

Notes / references

  • Workflow Runtime V2 PRD: ee/docs/plans/2025-12-21-workflow-overhaul.md
  • Persistence models:
    • shared/workflow/persistence/workflowDefinitionModelV2.ts
    • shared/workflow/persistence/workflowDefinitionVersionModelV2.ts

Work log

  • 2026-01-25: Added v1 bundle header constants/types in shared/workflow/bundle/workflowBundleV1.ts (format, formatVersion, exportedAt) to centralize the accepted format/version.
  • 2026-01-25: Defined v1 bundle TypeScript shape (workflow metadata + draft + published versions) in shared/workflow/bundle/workflowBundleV1.ts as the shared contract for exporter/importer/tests.
  • 2026-01-25: Standardized portable workflow identifier as workflows[].key with a basic validation pattern in shared/workflow/bundle/workflowBundleV1.ts.
  • 2026-01-25: Added canonical JSON rules implementation in shared/workflow/bundle/canonicalJson.ts (recursive key sort, 2-space indent, trailing newline) for stable bundle bytes.
  • 2026-01-25: Added JSON Schema ee/docs/schemas/workflow-bundle.v1.schema.json (draft-07) as the machine-checkable contract for v1 bundles.
  • 2026-01-25: Added human-readable format spec at ee/docs/guides/workflows/workflow-import-export.md (header, key semantics, canonical JSON, import policies).
  • 2026-01-25: Added workflow_definitions.key (nullable, unique) via server/migrations/20260125120000_add_workflow_definition_key.cjs to support portable bundle identity and create/overwrite semantics. Backfills the seeded email workflow to system.email-processing.
  • 2026-01-25: Implemented single-workflow exporter server/src/lib/workflow/bundle/exportWorkflowBundleV1.ts (loads workflow_definitions + workflow_definition_versions into the v1 bundle shape).
  • 2026-01-25: Extended exporter to support multi-workflow bundles via exportWorkflowBundleV1ForWorkflowIds (bulk-load definitions + versions; workflows sorted by key).
  • 2026-01-25: Exporter intentionally omits instance-specific audit/actor fields (timestamps, *_by, version_id) by projecting only the portable subset into the bundle.
  • 2026-01-25: Exporter includes operational settings in metadata (isPaused/isVisible/concurrency/retention/auto-pause thresholds) for behavioral fidelity.
  • 2026-01-25: Added dependency summary collection (shared/workflow/bundle/dependencySummaryV1.ts) and included dependencies in bundle exports (actions/node types/schema refs) to support structured missing-dependency errors on import.
  • 2026-01-25: Added import-time header validation for v1 bundles in server/src/lib/workflow/bundle/validateWorkflowBundleHeaderV1.ts (rejects unsupported formatVersion with a structured error).
  • 2026-01-25: Added Ajv-based bundle schema validation using ee/docs/schemas/workflow-bundle.v1.schema.json via server/src/lib/workflow/bundle/validateWorkflowBundleSchemaV1.ts.
  • 2026-01-25: Added dependency validation helper server/src/lib/workflow/bundle/validateWorkflowBundleDependenciesV1.ts that checks bundle-declared actions/nodeTypes/schemaRefs against runtime registries and throws structured missing-dependency errors.
  • 2026-01-25: Implemented bundle importer core in server/src/lib/workflow/bundle/importWorkflowBundleV1.ts using a single knex.transaction(...) for all writes (rolls back on any error).
  • 2026-01-25: Importer creates workflow_definitions from bundle workflows (metadata + draft), regenerating workflow_id and rewriting workflow definition JSON id fields to match.
  • 2026-01-25: Importer creates workflow_definition_versions for each publishedVersions[] entry, inserting immutable definition_json + payload schema snapshots.
  • 2026-01-25: Importer default policy is create-only: conflicts on existing workflow_definitions.key throw WORKFLOW_KEY_CONFLICT unless force is enabled.
  • 2026-01-25: Importer supports force overwrite: delete existing workflow by key (cascades versions/runs) and recreate from bundle with a regenerated workflow_id.
  • 2026-01-25: Importer returns a summary object (created workflows, deleted workflows, created published versions) from importWorkflowBundleV1.
  • 2026-01-25: Added HTTP export endpoint server/src/app/api/workflow-definitions/[workflowId]/export/route.ts returning canonical bundle JSON for a single workflow.
  • 2026-01-25: Added HTTP import endpoint server/src/app/api/workflow-definitions/import/route.ts (POST bundle JSON; supports ?force=true; returns import summary). Updated API error handling to include structured details when present.
  • 2026-01-25: Import/export endpoints are admin-gated via requireWorkflowPermission(user, 'admin', knex) in the underlying server actions.
  • 2026-01-25: Added a minimal API-wrapping CLI at tools/workflow-bundle-cli/workflow-bundle.js (ESM; supports export and import with optional --cookie + --tenant headers).
  • 2026-01-25: Added a representative fixture bundle server/src/test/fixtures/workflow-bundles/email-processing.v1.json (control flow + action.call usage) for import/export tests.
  • 2026-01-25: Canonicalization utility shared/workflow/bundle/canonicalJson.ts is used by the export endpoint to emit stable bundle bytes and will be used in round-trip tests.
  • 2026-01-25: Added integration test server/src/test/integration/workflowBundleV1.importExport.integration.test.ts covering unsupported formatVersion rejection (T001).
  • 2026-01-25: Extended bundle integration tests for schema validation failures (T002).
  • 2026-01-25: Added missing dependency validation coverage for actions/node types/schema refs (T003).
  • 2026-01-25: Added canonical export formatting test via HTTP export route (T010).
  • 2026-01-25: Added audit-field exclusion assertion for exported bundles (T011).
  • 2026-01-25: Added import-to-empty-DB integration coverage (creates definitions + versions; rewrites workflow ids) (T020).
  • 2026-01-25: Added create-only conflict test (duplicate key without force) (T021).
  • 2026-01-25: Added force overwrite import test (delete+recreate with regenerated workflow_id) (T022).
  • 2026-01-25: Added transactional rollback coverage (unique constraint failure does not persist partial workflow rows) (T023).
  • 2026-01-25: Added export→import→export round-trip test with canonical normalization (exportedAt + workflowId placeholder) (T030).
  • 2026-01-25: Added end-to-end execution test for imported workflows (imports bundle then runs the published version to SUCCEEDED) (T031).
  • 2026-01-25: Added explicit HTTP export endpoint smoke test asserting bundle header + workflow key (T040).
  • 2026-01-25: Added HTTP import endpoint test (POST bundle JSON returns summary and persists workflow row) (T041).
  • 2026-01-25: Refactored tools/workflow-bundle-cli/workflow-bundle.js to expose runWorkflowBundleCli for unit testing; added CLI export test (T050).
  • 2026-01-25: Added CLI import test covering --force query parameter wiring (T051).