Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
f2d4e1d
docs(conductor): add Spec 005 — deterministic workflow engine, design…
cwendler Jun 16, 2026
4518e8d
docs(conductor): add Spec 005 integration & implementation plan
Weegy Jun 17, 2026
8a866cd
feat(conductor): implement @omadia/conductor-core pure engine (US1)
Weegy Jun 17, 2026
e0a81ba
feat(conductor): wire conductor-core into the kernel (Phase 2 vertica…
Weegy Jun 17, 2026
89571dc
build(conductor): add @omadia/conductor-core to package-lock (fixes n…
Weegy Jun 17, 2026
c6702db
fix(conductor): typecheck under express 5 + JsonValue (container build)
Weegy Jun 17, 2026
7868a5b
build(conductor): copy conductor migrations into the runtime image
Weegy Jun 17, 2026
a4055e6
feat(conductor): real Agent-turn execution + operator UI (no stubs)
Weegy Jun 17, 2026
dd00e12
fix(conductor): async run execution + UI polling (real turns are slow)
Weegy Jun 17, 2026
e041018
fix(conductor): race-safe workflow publish (idempotent upsert)
Weegy Jun 17, 2026
8e995ff
feat(conductor): visual React-Flow designer (Phase 6 / US7)
Weegy Jun 17, 2026
f283b73
fix(conductor): collision-proof ids + double-fire guard in the designer
Weegy Jun 17, 2026
6b6c1e7
feat(conductor): durable human awaits + resume + deadline worker (US5)
Weegy Jun 17, 2026
4264de0
fix(conductor): debounce run/respond/canvas-run against double-fire
Weegy Jun 17, 2026
1637451
feat(conductor): event triggers — workflows start on emitted events (…
Weegy Jun 17, 2026
948ff13
feat(conductor): dry-run / preview (US8)
Weegy Jun 17, 2026
3219b34
feat(conductor): role resolver + baton (US6)
Weegy Jun 17, 2026
62edeaf
feat(conductor): edit existing workflows from the list (US7)
Weegy Jun 17, 2026
420694c
docs(conductor): roles project from external SoT (#333); local table …
cwendler Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ COPY middleware/src/auth/migrations ./dist/auth/migrations
COPY middleware/src/profileStorage/migrations ./dist/profileStorage/migrations
# Profile-snapshots migrations — same pattern (palaia-phase profile snapshots).
COPY middleware/src/profileSnapshots/migrations ./dist/profileSnapshots/migrations
# Conductor migrations (Spec 005) — tsc skips .sql, so copy them next to the
# compiled migrator (runConductorMigrations scans dist/conductor/migrations).
COPY middleware/src/conductor/migrations ./dist/conductor/migrations
# Multi-orchestrator runtime migrations — runMultiOrchestratorMigrations
# (in @omadia/orchestrator) scans this dir. Top-level location matches the
# spec convention (specs/001-multi-orchestrator-runtime/data-model.md); the
Expand Down
52 changes: 52 additions & 0 deletions middleware/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions middleware/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
],
"scripts": {
"preinstall": "node scripts/check-node-version.mjs",
"build": "npm run build -w @omadia/plugin-api && npm run build -w @omadia/llm-provider && npm run build -w @omadia/canvas-core && npm run build -w @omadia/plugin-ui-helpers && npm run build -w @omadia/channel-sdk && npm run build -w @omadia/diagrams && npm run build -w @omadia/memory && npm run build -w @omadia/memory-postgres && npm run build -w @omadia/embeddings && npm run build -w @omadia/knowledge-graph-inmemory && npm run build -w @omadia/knowledge-graph-neon && npm run build -w @omadia/usage-telemetry && npm run build -w @omadia/orchestrator-extras && npm run build -w @omadia/verifier && npm run build -w @omadia/orchestrator && npm run build -w @omadia/ui-orchestrator && npm run build -w @omadia/ui-channel && npm run build -w @omadia/plugin-office && npm run build -w @omadia/plugin-web-search && npm run build -w @omadia/plugin-quality-guard && npm run build -w @omadia/plugin-privacy-guard && npm run build -w @omadia/agent-seo-analyst && npm run build -w @omadia/agent-reference-maximum && npm run build -w @omadia/plugin-plan-runner && tsc && node scripts/copy-build-assets.mjs",
"build": "npm run build -w @omadia/plugin-api && npm run build -w @omadia/llm-provider && npm run build -w @omadia/canvas-core && npm run build -w @omadia/conductor-core && npm run build -w @omadia/plugin-ui-helpers && npm run build -w @omadia/channel-sdk && npm run build -w @omadia/diagrams && npm run build -w @omadia/memory && npm run build -w @omadia/memory-postgres && npm run build -w @omadia/embeddings && npm run build -w @omadia/knowledge-graph-inmemory && npm run build -w @omadia/knowledge-graph-neon && npm run build -w @omadia/usage-telemetry && npm run build -w @omadia/orchestrator-extras && npm run build -w @omadia/verifier && npm run build -w @omadia/orchestrator && npm run build -w @omadia/ui-orchestrator && npm run build -w @omadia/ui-channel && npm run build -w @omadia/plugin-office && npm run build -w @omadia/plugin-web-search && npm run build -w @omadia/plugin-quality-guard && npm run build -w @omadia/plugin-privacy-guard && npm run build -w @omadia/agent-seo-analyst && npm run build -w @omadia/agent-reference-maximum && npm run build -w @omadia/plugin-plan-runner && tsc && node scripts/copy-build-assets.mjs",
"start": "node dist/index.js",
"dev": "node scripts/ensure-native-abi.mjs && npm run build -w @omadia/plugin-api && npm run build -w @omadia/llm-provider && npm run build -w @omadia/canvas-core && npm run build -w @omadia/plugin-ui-helpers && npm run build -w @omadia/channel-sdk && npm run build -w @omadia/diagrams && npm run build -w @omadia/memory && npm run build -w @omadia/memory-postgres && npm run build -w @omadia/embeddings && npm run build -w @omadia/knowledge-graph-inmemory && npm run build -w @omadia/knowledge-graph-neon && npm run build -w @omadia/usage-telemetry && npm run build -w @omadia/orchestrator-extras && npm run build -w @omadia/verifier && npm run build -w @omadia/orchestrator && npm run build -w @omadia/ui-orchestrator && npm run build -w @omadia/ui-channel && npm run build -w @omadia/plugin-office && npm run build -w @omadia/plugin-web-search && npm run build -w @omadia/plugin-quality-guard && npm run build -w @omadia/plugin-privacy-guard && npm run build -w @omadia/agent-seo-analyst && npm run build -w @omadia/agent-reference-maximum && npm run build -w @omadia/plugin-plan-runner && tsx watch --ignore './.memory/**' --ignore './.uploaded-packages/**' --ignore './data/**' --ignore './dist/**' --ignore './packages/*/dist/**' --ignore './seed/**' src/index.ts",
"dev": "node scripts/ensure-native-abi.mjs && npm run build -w @omadia/plugin-api && npm run build -w @omadia/llm-provider && npm run build -w @omadia/canvas-core && npm run build -w @omadia/conductor-core && npm run build -w @omadia/plugin-ui-helpers && npm run build -w @omadia/channel-sdk && npm run build -w @omadia/diagrams && npm run build -w @omadia/memory && npm run build -w @omadia/memory-postgres && npm run build -w @omadia/embeddings && npm run build -w @omadia/knowledge-graph-inmemory && npm run build -w @omadia/knowledge-graph-neon && npm run build -w @omadia/usage-telemetry && npm run build -w @omadia/orchestrator-extras && npm run build -w @omadia/verifier && npm run build -w @omadia/orchestrator && npm run build -w @omadia/ui-orchestrator && npm run build -w @omadia/ui-channel && npm run build -w @omadia/plugin-office && npm run build -w @omadia/plugin-web-search && npm run build -w @omadia/plugin-quality-guard && npm run build -w @omadia/plugin-privacy-guard && npm run build -w @omadia/agent-seo-analyst && npm run build -w @omadia/agent-reference-maximum && npm run build -w @omadia/plugin-plan-runner && tsx watch --ignore './.memory/**' --ignore './.uploaded-packages/**' --ignore './data/**' --ignore './dist/**' --ignore './packages/*/dist/**' --ignore './seed/**' src/index.ts",
"dev:clean": "node scripts/dev-clean.mjs && npm run dev",
"ensure-native-abi": "node scripts/ensure-native-abi.mjs",
"lint": "eslint src/ packages/plugin-api/src/ packages/llm-provider/src/ packages/harness-ui-helpers/src/ packages/harness-channel-sdk/src/ packages/harness-diagrams/src/ packages/harness-memory/src/ packages/harness-memory-postgres/src/ packages/harness-embeddings/src/ packages/harness-knowledge-graph-inmemory/src/ packages/harness-knowledge-graph-neon/src/ packages/harness-usage-telemetry/src/ packages/harness-orchestrator-extras/src/ packages/harness-verifier/src/ packages/harness-orchestrator/src/ packages/harness-plugin-web-search/src/ packages/harness-plugin-quality-guard/src/ packages/harness-plugin-privacy-guard/src/ packages/harness-plugin-office/src/ packages/omadia-ui-orchestrator/src/ packages/omadia-ui-channel/src/ packages/harness-plugin-plan-runner/src/",
"lint:fix": "eslint src/ packages/plugin-api/src/ packages/llm-provider/src/ packages/harness-ui-helpers/src/ packages/harness-channel-sdk/src/ packages/harness-diagrams/src/ packages/harness-memory/src/ packages/harness-memory-postgres/src/ packages/harness-embeddings/src/ packages/harness-knowledge-graph-inmemory/src/ packages/harness-knowledge-graph-neon/src/ packages/harness-usage-telemetry/src/ packages/harness-orchestrator-extras/src/ packages/harness-verifier/src/ packages/harness-orchestrator/src/ packages/harness-plugin-web-search/src/ packages/harness-plugin-quality-guard/src/ packages/harness-plugin-privacy-guard/src/ packages/harness-plugin-office/src/ packages/omadia-ui-orchestrator/src/ packages/omadia-ui-channel/src/ packages/harness-plugin-plan-runner/src/ --fix",
"typecheck": "npm run typecheck -w @omadia/plugin-api && npm run typecheck -w @omadia/llm-provider && npm run typecheck -w @omadia/canvas-core && npm run typecheck -w @omadia/plugin-ui-helpers && npm run typecheck -w @omadia/channel-sdk && npm run typecheck -w @omadia/diagrams && npm run typecheck -w @omadia/memory && npm run typecheck -w @omadia/memory-postgres && npm run typecheck -w @omadia/embeddings && npm run typecheck -w @omadia/knowledge-graph-inmemory && npm run typecheck -w @omadia/knowledge-graph-neon && npm run typecheck -w @omadia/orchestrator-extras && npm run typecheck -w @omadia/verifier && npm run typecheck -w @omadia/orchestrator && npm run typecheck -w @omadia/ui-orchestrator && npm run typecheck -w @omadia/ui-channel && npm run typecheck -w @omadia/plugin-office && npm run typecheck -w @omadia/plugin-web-search && npm run typecheck -w @omadia/plugin-quality-guard && npm run typecheck -w @omadia/plugin-privacy-guard && npm run typecheck -w @omadia/agent-seo-analyst && npm run typecheck -w @omadia/agent-reference-maximum && npm run typecheck -w @omadia/plugin-plan-runner && tsc --noEmit",
"typecheck": "npm run typecheck -w @omadia/plugin-api && npm run typecheck -w @omadia/llm-provider && npm run typecheck -w @omadia/canvas-core && npm run typecheck -w @omadia/conductor-core && npm run typecheck -w @omadia/plugin-ui-helpers && npm run typecheck -w @omadia/channel-sdk && npm run typecheck -w @omadia/diagrams && npm run typecheck -w @omadia/memory && npm run typecheck -w @omadia/memory-postgres && npm run typecheck -w @omadia/embeddings && npm run typecheck -w @omadia/knowledge-graph-inmemory && npm run typecheck -w @omadia/knowledge-graph-neon && npm run typecheck -w @omadia/orchestrator-extras && npm run typecheck -w @omadia/verifier && npm run typecheck -w @omadia/orchestrator && npm run typecheck -w @omadia/ui-orchestrator && npm run typecheck -w @omadia/ui-channel && npm run typecheck -w @omadia/plugin-office && npm run typecheck -w @omadia/plugin-web-search && npm run typecheck -w @omadia/plugin-quality-guard && npm run typecheck -w @omadia/plugin-privacy-guard && npm run typecheck -w @omadia/agent-seo-analyst && npm run typecheck -w @omadia/agent-reference-maximum && npm run typecheck -w @omadia/plugin-plan-runner && tsc --noEmit",
"format": "prettier --write \"src/**/*.ts\"",
"format:check": "prettier --check \"src/**/*.ts\"",
"smoke:entity-refs": "tsx scripts/smoke-entity-refs.ts",
Expand Down
2 changes: 2 additions & 0 deletions middleware/packages/conductor-core/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
package-lock.json
node_modules/
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"entryStepId": "s1",
"steps": [
{
"id": "s1",
"kind": "human",
"human": {
"principal": { "kind": "user", "ref": "11111111-1111-1111-1111-111111111111" },
"channel": "teams",
"message": "Approve?",
"deadline": "PT24H"
}
},
{ "id": "s2", "kind": "action", "actionId": "act.done" }
],
"transitions": [
{ "id": "t1", "source": "s1", "target": "s2", "guard": { "op": "eq", "path": "stepResult.approved", "value": true } }
],
"triggers": [{ "id": "tr1", "kind": "manual" }]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"entryStepId": "s1",
"steps": [
{ "id": "s1", "kind": "agent", "agentId": "a1" },
{ "id": "s2", "kind": "agent", "agentId": "a2" }
],
"transitions": [
{ "id": "tA", "source": "s1", "target": "s2" },
{ "id": "tB", "source": "s2", "target": "s1" }
],
"triggers": [{ "id": "tr1", "kind": "manual" }]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"entryStepId": "s1",
"steps": [
{ "id": "s1", "kind": "agent", "agentId": "a1" },
{ "id": "s2", "kind": "action", "actionId": "act.done" },
{ "id": "s_orphan", "kind": "action", "actionId": "act.orphan" }
],
"transitions": [
{ "id": "t1", "source": "s1", "target": "s2" }
],
"triggers": [{ "id": "tr1", "kind": "manual" }]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"entryStepId": "s1",
"steps": [
{
"id": "s1",
"kind": "agent",
"agentId": "release-notes",
"postcondition": { "op": "exists", "path": "stepResult.notes" },
"fallbackTransitionId": "t_fail",
"position": { "x": 40, "y": 40 }
},
{
"id": "s2",
"kind": "human",
"human": {
"principal": { "kind": "role", "ref": "approver.release" },
"channel": "teams",
"message": "Release {{ctx.tag}} ready — approve?",
"reminderInterval": "PT6H",
"deadline": "PT24H",
"quorum": "any"
},
"fallbackTransitionId": "t_deadline",
"position": { "x": 240, "y": 40 }
},
{ "id": "s3", "kind": "action", "actionId": "github.create_release", "position": { "x": 440, "y": 40 } },
{ "id": "s_end_fail", "kind": "action", "actionId": "notify.failure", "position": { "x": 240, "y": 200 } },
{ "id": "s_autoreject", "kind": "action", "actionId": "release.cancel", "position": { "x": 440, "y": 200 } }
],
"transitions": [
{ "id": "t1", "source": "s1", "target": "s2", "guard": { "op": "exists", "path": "stepResult.notes" } },
{ "id": "t_fail", "source": "s1", "target": "s_end_fail" },
{ "id": "t_approve", "source": "s2", "target": "s3", "guard": { "op": "eq", "path": "stepResult.approved", "value": true } },
{ "id": "t_deadline", "source": "s2", "target": "s_autoreject" }
],
"triggers": [
{ "id": "tr1", "kind": "event", "eventId": "github.pull_request.merged", "filter": { "op": "eq", "path": "ctx.base", "value": "main" } },
{ "id": "tr2", "kind": "manual" }
]
}
35 changes: 35 additions & 0 deletions middleware/packages/conductor-core/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"name": "@omadia/conductor-core",
"version": "0.1.0",
"private": false,
"description": "Pure, I/O-free Omadia Conductor engine: workflow graph validation and deterministic step advancement (predicate-AST guards + exit postconditions). Sibling of @omadia/canvas-core.",
"type": "module",
"main": "dist/src/index.js",
"types": "dist/src/index.d.ts",
"exports": {
".": {
"types": "./dist/src/index.d.ts",
"import": "./dist/src/index.js"
},
"./schema/*": "./schema/*",
"./fixtures/*": "./fixtures/*"
},
"files": [
"dist",
"schema",
"fixtures"
],
"scripts": {
"test": "vitest run",
"typecheck": "tsc --noEmit",
"build": "tsc -p tsconfig.build.json"
},
"dependencies": {
"ajv": "^8.20.0"
},
"devDependencies": {
"@types/node": "^25.9.3",
"typescript": "^5.9.0",
"vitest": "^4.1.8"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://omadia.ai/schema/conductor-graph.schema.json",
"title": "Conductor Workflow Graph",
"type": "object",
"required": ["entryStepId", "steps", "transitions"],
"additionalProperties": false,
"properties": {
"entryStepId": { "type": "string", "minLength": 1 },
"steps": { "type": "array", "items": { "$ref": "#/$defs/step" } },
"transitions": { "type": "array", "items": { "$ref": "#/$defs/transition" } },
"triggers": { "type": "array", "items": { "$ref": "#/$defs/trigger" } }
},
"$defs": {
"step": {
"type": "object",
"required": ["id", "kind"],
"additionalProperties": false,
"properties": {
"id": { "type": "string", "minLength": 1 },
"kind": { "enum": ["agent", "action", "human"] },
"agentId": { "type": "string" },
"actionId": { "type": "string" },
"prompt": { "type": "string" },
"input": { "type": "object" },
"human": { "$ref": "#/$defs/human" },
"postcondition": { "$ref": "#/$defs/predicate" },
"fallbackTransitionId": { "type": "string" },
"position": {
"type": "object",
"properties": { "x": { "type": "number" }, "y": { "type": "number" } }
}
}
},
"human": {
"type": "object",
"required": ["principal", "channel", "message"],
"additionalProperties": false,
"properties": {
"principal": {
"type": "object",
"required": ["kind", "ref"],
"additionalProperties": false,
"properties": {
"kind": { "enum": ["user", "role"] },
"ref": { "type": "string", "minLength": 1 }
}
},
"channel": { "type": "string", "minLength": 1 },
"message": { "type": "string" },
"reminderInterval": { "type": ["string", "null"] },
"deadline": { "type": ["string", "null"] },
"quorum": { "enum": ["any", "all"] },
"responseSchema": { "type": "object" }
}
},
"transition": {
"type": "object",
"required": ["id", "source", "target"],
"additionalProperties": false,
"properties": {
"id": { "type": "string", "minLength": 1 },
"source": { "type": "string", "minLength": 1 },
"target": { "type": "string", "minLength": 1 },
"guard": { "$ref": "#/$defs/predicate" }
}
},
"trigger": {
"type": "object",
"required": ["id", "kind"],
"additionalProperties": false,
"properties": {
"id": { "type": "string", "minLength": 1 },
"kind": { "enum": ["manual", "cron", "channel", "agent", "webhook", "workflow", "event"] },
"eventId": { "type": "string" },
"filter": { "$ref": "#/$defs/predicate" },
"cron": { "type": "string" }
}
},
"predicate": {
"type": "object",
"required": ["op"],
"additionalProperties": false,
"properties": {
"op": {
"enum": ["eq", "ne", "gt", "lt", "gte", "lte", "exists", "in", "matches", "and", "or", "not", "always", "never"]
},
"path": { "type": "string" },
"value": true,
"args": { "type": "array", "items": { "$ref": "#/$defs/predicate" } },
"arg": { "$ref": "#/$defs/predicate" }
}
}
}
}
Loading