@telora/factory 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit.d.ts +69 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +376 -0
- package/dist/audit.js.map +1 -0
- package/dist/builder-completion.d.ts +35 -0
- package/dist/builder-completion.d.ts.map +1 -0
- package/dist/builder-completion.js +375 -0
- package/dist/builder-completion.js.map +1 -0
- package/dist/builder-spawner.d.ts +40 -0
- package/dist/builder-spawner.d.ts.map +1 -0
- package/dist/builder-spawner.js +493 -0
- package/dist/builder-spawner.js.map +1 -0
- package/dist/completion-gate.d.ts +52 -0
- package/dist/completion-gate.d.ts.map +1 -0
- package/dist/completion-gate.js +336 -0
- package/dist/completion-gate.js.map +1 -0
- package/dist/completion-report.d.ts +36 -0
- package/dist/completion-report.d.ts.map +1 -0
- package/dist/completion-report.js +348 -0
- package/dist/completion-report.js.map +1 -0
- package/dist/completion.d.ts +58 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +287 -0
- package/dist/completion.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/context-manager.d.ts +152 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +421 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/crash-detection.d.ts +70 -0
- package/dist/crash-detection.d.ts.map +1 -0
- package/dist/crash-detection.js +123 -0
- package/dist/crash-detection.js.map +1 -0
- package/dist/crash-recovery.d.ts +83 -0
- package/dist/crash-recovery.d.ts.map +1 -0
- package/dist/crash-recovery.js +522 -0
- package/dist/crash-recovery.js.map +1 -0
- package/dist/crash-resolution.d.ts +34 -0
- package/dist/crash-resolution.d.ts.map +1 -0
- package/dist/crash-resolution.js +382 -0
- package/dist/crash-resolution.js.map +1 -0
- package/dist/escalation.d.ts +150 -0
- package/dist/escalation.d.ts.map +1 -0
- package/dist/escalation.js +352 -0
- package/dist/escalation.js.map +1 -0
- package/dist/execution-target.d.ts +31 -0
- package/dist/execution-target.d.ts.map +1 -0
- package/dist/execution-target.js +71 -0
- package/dist/execution-target.js.map +1 -0
- package/dist/execution-unit-init.d.ts +28 -0
- package/dist/execution-unit-init.d.ts.map +1 -0
- package/dist/execution-unit-init.js +115 -0
- package/dist/execution-unit-init.js.map +1 -0
- package/dist/execution.d.ts +17 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +20 -0
- package/dist/execution.js.map +1 -0
- package/dist/factory-engine.d.ts +100 -0
- package/dist/factory-engine.d.ts.map +1 -0
- package/dist/factory-engine.js +243 -0
- package/dist/factory-engine.js.map +1 -0
- package/dist/gap-detection.d.ts +43 -0
- package/dist/gap-detection.d.ts.map +1 -0
- package/dist/gap-detection.js +149 -0
- package/dist/gap-detection.js.map +1 -0
- package/dist/gate-context.d.ts +23 -0
- package/dist/gate-context.d.ts.map +1 -0
- package/dist/gate-context.js +63 -0
- package/dist/gate-context.js.map +1 -0
- package/dist/gate-engine.d.ts +55 -0
- package/dist/gate-engine.d.ts.map +1 -0
- package/dist/gate-engine.js +191 -0
- package/dist/gate-engine.js.map +1 -0
- package/dist/gates/adversarial.d.ts +59 -0
- package/dist/gates/adversarial.d.ts.map +1 -0
- package/dist/gates/adversarial.js +426 -0
- package/dist/gates/adversarial.js.map +1 -0
- package/dist/gates/adversary-spawner.d.ts +35 -0
- package/dist/gates/adversary-spawner.d.ts.map +1 -0
- package/dist/gates/adversary-spawner.js +286 -0
- package/dist/gates/adversary-spawner.js.map +1 -0
- package/dist/gates/adversary-test-dir.d.ts +41 -0
- package/dist/gates/adversary-test-dir.d.ts.map +1 -0
- package/dist/gates/adversary-test-dir.js +150 -0
- package/dist/gates/adversary-test-dir.js.map +1 -0
- package/dist/gates/behavioral-parser.d.ts +32 -0
- package/dist/gates/behavioral-parser.d.ts.map +1 -0
- package/dist/gates/behavioral-parser.js +190 -0
- package/dist/gates/behavioral-parser.js.map +1 -0
- package/dist/gates/behavioral-runner.d.ts +36 -0
- package/dist/gates/behavioral-runner.d.ts.map +1 -0
- package/dist/gates/behavioral-runner.js +306 -0
- package/dist/gates/behavioral-runner.js.map +1 -0
- package/dist/gates/behavioral.d.ts +37 -0
- package/dist/gates/behavioral.d.ts.map +1 -0
- package/dist/gates/behavioral.js +485 -0
- package/dist/gates/behavioral.js.map +1 -0
- package/dist/gates/deterministic.d.ts +24 -0
- package/dist/gates/deterministic.d.ts.map +1 -0
- package/dist/gates/deterministic.js +186 -0
- package/dist/gates/deterministic.js.map +1 -0
- package/dist/git-factory.d.ts +59 -0
- package/dist/git-factory.d.ts.map +1 -0
- package/dist/git-factory.js +102 -0
- package/dist/git-factory.js.map +1 -0
- package/dist/guard-evaluation.d.ts +48 -0
- package/dist/guard-evaluation.d.ts.map +1 -0
- package/dist/guard-evaluation.js +416 -0
- package/dist/guard-evaluation.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/instance-completion.d.ts +34 -0
- package/dist/instance-completion.d.ts.map +1 -0
- package/dist/instance-completion.js +366 -0
- package/dist/instance-completion.js.map +1 -0
- package/dist/instance-lifecycle.d.ts +15 -0
- package/dist/instance-lifecycle.d.ts.map +1 -0
- package/dist/instance-lifecycle.js +18 -0
- package/dist/instance-lifecycle.js.map +1 -0
- package/dist/instance-phase-dispatch.d.ts +75 -0
- package/dist/instance-phase-dispatch.d.ts.map +1 -0
- package/dist/instance-phase-dispatch.js +674 -0
- package/dist/instance-phase-dispatch.js.map +1 -0
- package/dist/instance-poll-loop.d.ts +43 -0
- package/dist/instance-poll-loop.d.ts.map +1 -0
- package/dist/instance-poll-loop.js +360 -0
- package/dist/instance-poll-loop.js.map +1 -0
- package/dist/instance-state-machine.d.ts +52 -0
- package/dist/instance-state-machine.d.ts.map +1 -0
- package/dist/instance-state-machine.js +235 -0
- package/dist/instance-state-machine.js.map +1 -0
- package/dist/log-manager.d.ts +28 -0
- package/dist/log-manager.d.ts.map +1 -0
- package/dist/log-manager.js +71 -0
- package/dist/log-manager.js.map +1 -0
- package/dist/pipeline-evaluator.d.ts +61 -0
- package/dist/pipeline-evaluator.d.ts.map +1 -0
- package/dist/pipeline-evaluator.js +107 -0
- package/dist/pipeline-evaluator.js.map +1 -0
- package/dist/pipeline-metrics.d.ts +52 -0
- package/dist/pipeline-metrics.d.ts.map +1 -0
- package/dist/pipeline-metrics.js +40 -0
- package/dist/pipeline-metrics.js.map +1 -0
- package/dist/pipeline-traversal.d.ts +43 -0
- package/dist/pipeline-traversal.d.ts.map +1 -0
- package/dist/pipeline-traversal.js +68 -0
- package/dist/pipeline-traversal.js.map +1 -0
- package/dist/plan-parser.d.ts +76 -0
- package/dist/plan-parser.d.ts.map +1 -0
- package/dist/plan-parser.js +223 -0
- package/dist/plan-parser.js.map +1 -0
- package/dist/planning-phase.d.ts +52 -0
- package/dist/planning-phase.d.ts.map +1 -0
- package/dist/planning-phase.js +444 -0
- package/dist/planning-phase.js.map +1 -0
- package/dist/planning-prompt.d.ts +64 -0
- package/dist/planning-prompt.d.ts.map +1 -0
- package/dist/planning-prompt.js +251 -0
- package/dist/planning-prompt.js.map +1 -0
- package/dist/planning.d.ts +16 -0
- package/dist/planning.d.ts.map +1 -0
- package/dist/planning.js +17 -0
- package/dist/planning.js.map +1 -0
- package/dist/process-runner.d.ts +41 -0
- package/dist/process-runner.d.ts.map +1 -0
- package/dist/process-runner.js +81 -0
- package/dist/process-runner.js.map +1 -0
- package/dist/product-config.d.ts +34 -0
- package/dist/product-config.d.ts.map +1 -0
- package/dist/product-config.js +43 -0
- package/dist/product-config.js.map +1 -0
- package/dist/queries/cycle-evaluations.d.ts +23 -0
- package/dist/queries/cycle-evaluations.d.ts.map +1 -0
- package/dist/queries/cycle-evaluations.js +37 -0
- package/dist/queries/cycle-evaluations.js.map +1 -0
- package/dist/queries/escalations.d.ts +30 -0
- package/dist/queries/escalations.d.ts.map +1 -0
- package/dist/queries/escalations.js +42 -0
- package/dist/queries/escalations.js.map +1 -0
- package/dist/queries/execution-units.d.ts +76 -0
- package/dist/queries/execution-units.d.ts.map +1 -0
- package/dist/queries/execution-units.js +109 -0
- package/dist/queries/execution-units.js.map +1 -0
- package/dist/queries/gate-results.d.ts +32 -0
- package/dist/queries/gate-results.d.ts.map +1 -0
- package/dist/queries/gate-results.js +44 -0
- package/dist/queries/gate-results.js.map +1 -0
- package/dist/queries/instances.d.ts +51 -0
- package/dist/queries/instances.d.ts.map +1 -0
- package/dist/queries/instances.js +77 -0
- package/dist/queries/instances.js.map +1 -0
- package/dist/queries/sessions.d.ts +50 -0
- package/dist/queries/sessions.d.ts.map +1 -0
- package/dist/queries/sessions.js +81 -0
- package/dist/queries/sessions.js.map +1 -0
- package/dist/queries/shared.d.ts +38 -0
- package/dist/queries/shared.d.ts.map +1 -0
- package/dist/queries/shared.js +119 -0
- package/dist/queries/shared.js.map +1 -0
- package/dist/queries/specs.d.ts +12 -0
- package/dist/queries/specs.d.ts.map +1 -0
- package/dist/queries/specs.js +21 -0
- package/dist/queries/specs.js.map +1 -0
- package/dist/queries/strategies.d.ts +14 -0
- package/dist/queries/strategies.d.ts.map +1 -0
- package/dist/queries/strategies.js +18 -0
- package/dist/queries/strategies.js.map +1 -0
- package/dist/queries/work-units.d.ts +42 -0
- package/dist/queries/work-units.d.ts.map +1 -0
- package/dist/queries/work-units.js +57 -0
- package/dist/queries/work-units.js.map +1 -0
- package/dist/queries/workflows.d.ts +29 -0
- package/dist/queries/workflows.d.ts.map +1 -0
- package/dist/queries/workflows.js +103 -0
- package/dist/queries/workflows.js.map +1 -0
- package/dist/remediation-units.d.ts +40 -0
- package/dist/remediation-units.d.ts.map +1 -0
- package/dist/remediation-units.js +263 -0
- package/dist/remediation-units.js.map +1 -0
- package/dist/replanning.d.ts +72 -0
- package/dist/replanning.d.ts.map +1 -0
- package/dist/replanning.js +403 -0
- package/dist/replanning.js.map +1 -0
- package/dist/resource-limits.d.ts +62 -0
- package/dist/resource-limits.d.ts.map +1 -0
- package/dist/resource-limits.js +322 -0
- package/dist/resource-limits.js.map +1 -0
- package/dist/scheduler.d.ts +98 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +203 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/session-adapter.d.ts +89 -0
- package/dist/session-adapter.d.ts.map +1 -0
- package/dist/session-adapter.js +108 -0
- package/dist/session-adapter.js.map +1 -0
- package/dist/sop-generator.d.ts +29 -0
- package/dist/sop-generator.d.ts.map +1 -0
- package/dist/sop-generator.js +235 -0
- package/dist/sop-generator.js.map +1 -0
- package/dist/spec-profiles.d.ts +41 -0
- package/dist/spec-profiles.d.ts.map +1 -0
- package/dist/spec-profiles.js +131 -0
- package/dist/spec-profiles.js.map +1 -0
- package/dist/strategy-design-graph.d.ts +23 -0
- package/dist/strategy-design-graph.d.ts.map +1 -0
- package/dist/strategy-design-graph.js +205 -0
- package/dist/strategy-design-graph.js.map +1 -0
- package/dist/strategy-design-prompt.d.ts +28 -0
- package/dist/strategy-design-prompt.d.ts.map +1 -0
- package/dist/strategy-design-prompt.js +108 -0
- package/dist/strategy-design-prompt.js.map +1 -0
- package/dist/strategy-design-schema.d.ts +767 -0
- package/dist/strategy-design-schema.d.ts.map +1 -0
- package/dist/strategy-design-schema.js +126 -0
- package/dist/strategy-design-schema.js.map +1 -0
- package/dist/strategy-design.d.ts +69 -0
- package/dist/strategy-design.d.ts.map +1 -0
- package/dist/strategy-design.js +411 -0
- package/dist/strategy-design.js.map +1 -0
- package/dist/strategy-gating.d.ts +31 -0
- package/dist/strategy-gating.d.ts.map +1 -0
- package/dist/strategy-gating.js +276 -0
- package/dist/strategy-gating.js.map +1 -0
- package/dist/team-prompt-builder.d.ts +47 -0
- package/dist/team-prompt-builder.d.ts.map +1 -0
- package/dist/team-prompt-builder.js +362 -0
- package/dist/team-prompt-builder.js.map +1 -0
- package/dist/trace-engine.d.ts +40 -0
- package/dist/trace-engine.d.ts.map +1 -0
- package/dist/trace-engine.js +344 -0
- package/dist/trace-engine.js.map +1 -0
- package/dist/types.d.ts +612 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/unit-session-lifecycle.d.ts +78 -0
- package/dist/unit-session-lifecycle.d.ts.map +1 -0
- package/dist/unit-session-lifecycle.js +141 -0
- package/dist/unit-session-lifecycle.js.map +1 -0
- package/dist/unit-session.d.ts +30 -0
- package/dist/unit-session.d.ts.map +1 -0
- package/dist/unit-session.js +370 -0
- package/dist/unit-session.js.map +1 -0
- package/dist/watchdogs.d.ts +33 -0
- package/dist/watchdogs.d.ts.map +1 -0
- package/dist/watchdogs.js +170 -0
- package/dist/watchdogs.js.map +1 -0
- package/dist/work-unit-scheduler.d.ts +34 -0
- package/dist/work-unit-scheduler.d.ts.map +1 -0
- package/dist/work-unit-scheduler.js +91 -0
- package/dist/work-unit-scheduler.js.map +1 -0
- package/dist/workflow-transition.d.ts +90 -0
- package/dist/workflow-transition.d.ts.map +1 -0
- package/dist/workflow-transition.js +340 -0
- package/dist/workflow-transition.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow transition orchestrator for the factory engine.
|
|
3
|
+
*
|
|
4
|
+
* Provides a high-level API for transitioning factory entities through
|
|
5
|
+
* workflow-governed state changes. Each transition:
|
|
6
|
+
* 1. Resolves the entity's workflow (cached per instance)
|
|
7
|
+
* 2. Finds the transition from current stage to target stage
|
|
8
|
+
* 3. Fetches and evaluates guards
|
|
9
|
+
* 4. Executes triggers
|
|
10
|
+
* 5. Updates the entity's current_workflow_stage_id
|
|
11
|
+
* 6. Records audit trail
|
|
12
|
+
*
|
|
13
|
+
* Falls back gracefully when no workflow is assigned (direct status update).
|
|
14
|
+
*/
|
|
15
|
+
import { evaluateGuardConditionTree, interpolateTemplate } from './guard-evaluation.js';
|
|
16
|
+
import { resolveFactoryWorkflow, fetchTransitionGuards, createTransitionEvaluation, } from './queries/workflows.js';
|
|
17
|
+
/** Default cache TTL: 5 minutes. */
|
|
18
|
+
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
19
|
+
const workflowCache = new Map();
|
|
20
|
+
/**
|
|
21
|
+
* Resolve and cache a factory workflow by entity type.
|
|
22
|
+
* Returns null if no workflow exists for this entity type.
|
|
23
|
+
* Cached entries expire after CACHE_TTL_MS (5 minutes).
|
|
24
|
+
*/
|
|
25
|
+
export async function getOrResolveWorkflow(entityType) {
|
|
26
|
+
const cached = workflowCache.get(entityType);
|
|
27
|
+
if (cached && (Date.now() - cached.cachedAt) < CACHE_TTL_MS) {
|
|
28
|
+
return cached.workflow;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const workflow = await resolveFactoryWorkflow(entityType);
|
|
32
|
+
workflowCache.set(entityType, { workflow, cachedAt: Date.now() });
|
|
33
|
+
return workflow;
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.warn(`[workflow] Failed to resolve workflow for ${entityType}:`, err.message);
|
|
37
|
+
workflowCache.set(entityType, { workflow: null, cachedAt: Date.now() });
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Clear the workflow cache (for testing or hot-reload).
|
|
43
|
+
*/
|
|
44
|
+
export function clearWorkflowCache() {
|
|
45
|
+
workflowCache.clear();
|
|
46
|
+
}
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// Transition finder
|
|
49
|
+
// ============================================================================
|
|
50
|
+
/**
|
|
51
|
+
* Find the transition between two stages by name within a workflow.
|
|
52
|
+
* Returns null if no such transition exists.
|
|
53
|
+
*/
|
|
54
|
+
export function findTransition(workflow, fromStageName, toStageName) {
|
|
55
|
+
const fromStage = workflow.stageByName.get(fromStageName);
|
|
56
|
+
const toStage = workflow.stageByName.get(toStageName);
|
|
57
|
+
if (!fromStage || !toStage)
|
|
58
|
+
return null;
|
|
59
|
+
return workflow.transitions.find(t => t.from_stage_id === fromStage.id && t.to_stage_id === toStage.id) ?? null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the stage name for a given stage ID.
|
|
63
|
+
*/
|
|
64
|
+
export function getStageName(workflow, stageId) {
|
|
65
|
+
return workflow.stageById.get(stageId)?.name ?? null;
|
|
66
|
+
}
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// Guard evaluation at a transition
|
|
69
|
+
// ============================================================================
|
|
70
|
+
/**
|
|
71
|
+
* Evaluate all guards at a workflow transition.
|
|
72
|
+
* Fetches guards from the DB, evaluates conditions, collects triggers.
|
|
73
|
+
*/
|
|
74
|
+
export async function evaluateTransitionGuards(organizationId, entityType, entityId, transition, ctx) {
|
|
75
|
+
let guards;
|
|
76
|
+
let triggers;
|
|
77
|
+
try {
|
|
78
|
+
const resolved = await fetchTransitionGuards(transition.id);
|
|
79
|
+
guards = resolved.guards;
|
|
80
|
+
triggers = resolved.triggers;
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error(`[workflow] Failed to fetch guards for transition ${transition.id}:`, err.message);
|
|
84
|
+
// Fail-open: proceed without guards
|
|
85
|
+
return {
|
|
86
|
+
should_proceed: true,
|
|
87
|
+
evaluations: [],
|
|
88
|
+
triggers_to_execute: [],
|
|
89
|
+
warnings: [],
|
|
90
|
+
blocks: [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (guards.length === 0) {
|
|
94
|
+
const enterTriggers = triggers.filter(t => t.trigger_event === 'on_enter');
|
|
95
|
+
return {
|
|
96
|
+
should_proceed: true,
|
|
97
|
+
evaluations: [],
|
|
98
|
+
triggers_to_execute: enterTriggers.map(t => ({ trigger: t, guard: null, eval_result: null })),
|
|
99
|
+
warnings: [],
|
|
100
|
+
blocks: [],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const evaluations = [];
|
|
104
|
+
const triggersToExecute = [];
|
|
105
|
+
const warnings = [];
|
|
106
|
+
const blocks = [];
|
|
107
|
+
for (const guard of guards) {
|
|
108
|
+
const { passed, details } = evaluateGuardConditionTree(guard.conditions, ctx);
|
|
109
|
+
const evalResult = {
|
|
110
|
+
guard_id: guard.id,
|
|
111
|
+
guard_name: guard.name,
|
|
112
|
+
enforcement: guard.enforcement,
|
|
113
|
+
passed,
|
|
114
|
+
condition_details: details,
|
|
115
|
+
};
|
|
116
|
+
evaluations.push(evalResult);
|
|
117
|
+
if (!passed) {
|
|
118
|
+
const failTriggers = triggers.filter(t => t.trigger_event === 'on_guard_fail');
|
|
119
|
+
for (const trigger of failTriggers) {
|
|
120
|
+
triggersToExecute.push({ trigger, guard, eval_result: evalResult });
|
|
121
|
+
}
|
|
122
|
+
if (guard.enforcement === 'hard') {
|
|
123
|
+
blocks.push(evalResult);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
warnings.push(evalResult);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const passTriggers = triggers.filter(t => t.trigger_event === 'on_guard_pass');
|
|
131
|
+
for (const trigger of passTriggers) {
|
|
132
|
+
triggersToExecute.push({ trigger, guard, eval_result: evalResult });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Record audit trail (best-effort)
|
|
136
|
+
try {
|
|
137
|
+
await createTransitionEvaluation({
|
|
138
|
+
organization_id: organizationId,
|
|
139
|
+
entity_type: entityType,
|
|
140
|
+
entity_id: entityId,
|
|
141
|
+
transition_id: transition.id,
|
|
142
|
+
guard_id: guard.id,
|
|
143
|
+
result: passed ? 'passed' : 'failed',
|
|
144
|
+
blocked: !passed && guard.enforcement === 'hard',
|
|
145
|
+
enforcement_level: guard.enforcement,
|
|
146
|
+
evaluation_details: { conditions: details },
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.warn(`[workflow] Failed to record evaluation for guard "${guard.name}":`, err.message);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const shouldProceed = blocks.length === 0;
|
|
154
|
+
if (shouldProceed) {
|
|
155
|
+
const enterTriggers = triggers.filter(t => t.trigger_event === 'on_enter');
|
|
156
|
+
for (const trigger of enterTriggers) {
|
|
157
|
+
triggersToExecute.push({ trigger, guard: null, eval_result: null });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return { should_proceed: shouldProceed, evaluations, triggers_to_execute: triggersToExecute, warnings, blocks };
|
|
161
|
+
}
|
|
162
|
+
// ============================================================================
|
|
163
|
+
// Trigger executor
|
|
164
|
+
// ============================================================================
|
|
165
|
+
/**
|
|
166
|
+
* Execute triggers from a guard evaluation result.
|
|
167
|
+
* Factory-specific: handles inject_prompt, manage_context, set_field, notify.
|
|
168
|
+
* Skips spawn_agent, create_issue, block_transition (daemon-only).
|
|
169
|
+
*/
|
|
170
|
+
export async function executeFactoryTriggers(triggersToExecute, target, factoryCtx) {
|
|
171
|
+
for (const { trigger, eval_result } of triggersToExecute) {
|
|
172
|
+
try {
|
|
173
|
+
switch (trigger.action_type) {
|
|
174
|
+
case 'inject_prompt': {
|
|
175
|
+
if (!target) {
|
|
176
|
+
console.warn(`[workflow] inject_prompt trigger "${trigger.name}" skipped: no execution target`);
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
const prompt = interpolateTemplate(trigger.directive_template, eval_result, factoryCtx);
|
|
180
|
+
if (prompt)
|
|
181
|
+
await target.injectPrompt(prompt);
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
case 'manage_context': {
|
|
185
|
+
if (!target) {
|
|
186
|
+
console.warn(`[workflow] manage_context trigger "${trigger.name}" skipped: no execution target`);
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
const directiveType = trigger.action_config.directive;
|
|
190
|
+
if (!directiveType) {
|
|
191
|
+
console.warn(`[workflow] manage_context trigger "${trigger.name}" skipped: missing directive in action_config`);
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
const directive = {
|
|
195
|
+
type: directiveType,
|
|
196
|
+
files: trigger.action_config.files,
|
|
197
|
+
};
|
|
198
|
+
await target.manageContext(directive);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
case 'set_field': {
|
|
202
|
+
if (!target) {
|
|
203
|
+
console.warn(`[workflow] set_field trigger "${trigger.name}" skipped: no execution target`);
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
const fieldName = trigger.action_config.field_name;
|
|
207
|
+
if (!fieldName) {
|
|
208
|
+
console.warn(`[workflow] set_field trigger "${trigger.name}" skipped: missing field_name in action_config`);
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
let fieldValue = trigger.action_config.field_value;
|
|
212
|
+
if (typeof fieldValue === 'string') {
|
|
213
|
+
fieldValue = interpolateTemplate(fieldValue, eval_result, factoryCtx);
|
|
214
|
+
}
|
|
215
|
+
await target.setField(fieldName, fieldValue);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
case 'notify': {
|
|
219
|
+
const recipients = trigger.action_config.recipients ?? [];
|
|
220
|
+
const message = interpolateTemplate(trigger.action_config.message_template ?? null, eval_result, factoryCtx);
|
|
221
|
+
if (target) {
|
|
222
|
+
await target.notify(recipients, message || '');
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// Structured log fallback when no execution target is available
|
|
226
|
+
console.warn(`[workflow] notify trigger "${trigger.name}": recipients=${JSON.stringify(recipients)} message="${message || '(no message)'}"`);
|
|
227
|
+
}
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
case 'emit_warning': {
|
|
231
|
+
const details = eval_result?.condition_details ?? [];
|
|
232
|
+
const failedConditions = details
|
|
233
|
+
.filter(d => !d.passed).map(d => d.message).join('; ');
|
|
234
|
+
console.warn(`[workflow] Warning [${trigger.name}]: ${failedConditions || 'conditions not met'}`);
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
// block_transition, spawn_agent, create_issue are daemon-only
|
|
238
|
+
default:
|
|
239
|
+
console.debug(`[workflow] Trigger type "${trigger.action_type}" not handled in factory context`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
console.error(`[workflow] Failed to execute ${trigger.action_type} trigger "${trigger.name}":`, err.message);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Attempt a workflow-governed transition for a factory entity.
|
|
249
|
+
*
|
|
250
|
+
* This is the main entry point for the factory engine. It:
|
|
251
|
+
* 1. Optionally checks expectedStageId for optimistic locking (concurrent transition protection)
|
|
252
|
+
* 2. Finds the transition in the resolved workflow
|
|
253
|
+
* 3. Evaluates guards
|
|
254
|
+
* 4. Executes triggers (if guards pass)
|
|
255
|
+
* 5. Returns whether the transition is allowed and the new stage ID
|
|
256
|
+
*
|
|
257
|
+
* The caller is responsible for:
|
|
258
|
+
* - Updating the entity's status and current_workflow_stage_id in the DB
|
|
259
|
+
* using WHERE current_workflow_stage_id = expectedStageId for optimistic locking
|
|
260
|
+
* - Updating in-memory state
|
|
261
|
+
* - Retrying on stale result (re-read entity state and re-attempt)
|
|
262
|
+
*
|
|
263
|
+
* @param workflow Resolved workflow (from instance state cache)
|
|
264
|
+
* @param currentStageName Current stage name (e.g. 'pending', 'building')
|
|
265
|
+
* @param targetStageName Target stage name (e.g. 'planning', 'completed')
|
|
266
|
+
* @param organizationId Organization ID for audit trail
|
|
267
|
+
* @param entityType Entity type for audit trail (e.g. 'factory_instance')
|
|
268
|
+
* @param entityId Entity UUID for audit trail
|
|
269
|
+
* @param ctx Evaluation context with factory state data
|
|
270
|
+
* @param target Optional trigger execution target for active sessions
|
|
271
|
+
* @param factoryCtx Optional factory template context for prompt interpolation
|
|
272
|
+
* @param expectedStageId Optional expected current stage ID for optimistic locking.
|
|
273
|
+
* When provided, the transition is rejected with stale=true if the entity's
|
|
274
|
+
* current stage doesn't match, preventing race conditions from concurrent transitions.
|
|
275
|
+
*/
|
|
276
|
+
export async function attemptTransition(workflow, currentStageName, targetStageName, organizationId, entityType, entityId, ctx, target, factoryCtx, expectedStageId) {
|
|
277
|
+
if (!workflow) {
|
|
278
|
+
// No workflow -- allow all transitions (backward compatible)
|
|
279
|
+
return {
|
|
280
|
+
allowed: true,
|
|
281
|
+
newStageId: null,
|
|
282
|
+
newStageName: targetStageName,
|
|
283
|
+
guardResult: null,
|
|
284
|
+
hasWorkflow: false,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// Optimistic locking: verify current stage hasn't changed
|
|
288
|
+
if (expectedStageId != null) {
|
|
289
|
+
const currentStage = workflow.stageByName.get(currentStageName);
|
|
290
|
+
if (currentStage && currentStage.id !== expectedStageId) {
|
|
291
|
+
console.warn(`[workflow] Stale transition attempt for ${entityType} ${entityId}: ` +
|
|
292
|
+
`expected stage ${expectedStageId} but current is ${currentStage.id} ("${currentStageName}")`);
|
|
293
|
+
return {
|
|
294
|
+
allowed: false,
|
|
295
|
+
newStageId: null,
|
|
296
|
+
newStageName: null,
|
|
297
|
+
guardResult: null,
|
|
298
|
+
hasWorkflow: true,
|
|
299
|
+
stale: true,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const transition = findTransition(workflow, currentStageName, targetStageName);
|
|
304
|
+
if (!transition) {
|
|
305
|
+
console.warn(`[workflow] No transition found from "${currentStageName}" to "${targetStageName}" ` +
|
|
306
|
+
`in workflow ${workflow.id} -- allowing (graceful fallback)`);
|
|
307
|
+
return {
|
|
308
|
+
allowed: true,
|
|
309
|
+
newStageId: workflow.stageByName.get(targetStageName)?.id ?? null,
|
|
310
|
+
newStageName: targetStageName,
|
|
311
|
+
guardResult: null,
|
|
312
|
+
hasWorkflow: true,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
const guardResult = await evaluateTransitionGuards(organizationId, entityType, entityId, transition, ctx);
|
|
316
|
+
if (!guardResult.should_proceed) {
|
|
317
|
+
console.log(`[workflow] Transition "${currentStageName}" -> "${targetStageName}" blocked ` +
|
|
318
|
+
`by ${guardResult.blocks.length} hard guard(s) for ${entityType} ${entityId}`);
|
|
319
|
+
return {
|
|
320
|
+
allowed: false,
|
|
321
|
+
newStageId: null,
|
|
322
|
+
newStageName: null,
|
|
323
|
+
guardResult,
|
|
324
|
+
hasWorkflow: true,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// Execute triggers
|
|
328
|
+
if (guardResult.triggers_to_execute.length > 0) {
|
|
329
|
+
await executeFactoryTriggers(guardResult.triggers_to_execute, target ?? null, factoryCtx);
|
|
330
|
+
}
|
|
331
|
+
const targetStage = workflow.stageByName.get(targetStageName);
|
|
332
|
+
return {
|
|
333
|
+
allowed: true,
|
|
334
|
+
newStageId: targetStage?.id ?? null,
|
|
335
|
+
newStageName: targetStageName,
|
|
336
|
+
guardResult,
|
|
337
|
+
hasWorkflow: true,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=workflow-transition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-transition.js","sourceRoot":"","sources":["../src/workflow-transition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAYhC,oCAAoC;AACpC,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB;IAElB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,YAAY,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC1D,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,6CAA6C,UAAU,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACjG,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAiC,EACjC,aAAqB,EACrB,WAAmB;IAEnB,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAEtD,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAExC,OAAO,QAAQ,CAAC,WAAW,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,EAAE,CACtE,IAAI,IAAI,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAiC,EACjC,OAAe;IAEf,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;AACvD,CAAC;AAED,+EAA+E;AAC/E,mCAAmC;AACnC,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,cAAsB,EACtB,UAAkB,EAClB,QAAgB,EAChB,UAA8B,EAC9B,GAAsB;IAEtB,IAAI,MAAuB,CAAC;IAC5B,IAAI,QAA2B,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QACzB,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oDAAoD,UAAU,CAAC,EAAE,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC5G,oCAAoC;QACpC,OAAO;YACL,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,EAAE;YACvB,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC;QAC3E,OAAO;YACL,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,EAAE;YACf,mBAAmB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7F,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,MAAM,iBAAiB,GAAiD,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,0BAA0B,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAE9E,MAAM,UAAU,GAAoB;YAClC,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,UAAU,EAAE,KAAK,CAAC,IAAI;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM;YACN,iBAAiB,EAAE,OAAO;SAC3B,CAAC;QACF,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,eAAe,CAAC,CAAC;YAC/E,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACnC,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,eAAe,CAAC,CAAC;YAC/E,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACnC,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,CAAC;YACH,MAAM,0BAA0B,CAAC;gBAC/B,eAAe,EAAE,cAAc;gBAC/B,WAAW,EAAE,UAAU;gBACvB,SAAS,EAAE,QAAQ;gBACnB,aAAa,EAAE,UAAU,CAAC,EAAE;gBAC5B,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACpC,OAAO,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,MAAM;gBAChD,iBAAiB,EAAE,KAAK,CAAC,WAAW;gBACpC,kBAAkB,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE;aAC5C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,qDAAqD,KAAK,CAAC,IAAI,IAAI,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC1C,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC;QAC3E,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;YACpC,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAClH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,iBAA+D,EAC/D,MAAqC,EACrC,UAA0C;IAE1C,KAAK,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,iBAAiB,EAAE,CAAC;QACzD,IAAI,CAAC;YACH,QAAQ,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC5B,KAAK,eAAe,CAAC,CAAC,CAAC;oBACrB,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,OAAO,CAAC,IAAI,CAAC,qCAAqC,OAAO,CAAC,IAAI,gCAAgC,CAAC,CAAC;wBAChG,MAAM;oBACR,CAAC;oBACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,kBAAkB,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;oBACxF,IAAI,MAAM;wBAAE,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBAC9C,MAAM;gBACR,CAAC;gBACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;oBACtB,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,OAAO,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,IAAI,gCAAgC,CAAC,CAAC;wBACjG,MAAM;oBACR,CAAC;oBACD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,SAA+B,CAAC;oBAC5E,IAAI,CAAC,aAAa,EAAE,CAAC;wBACnB,OAAO,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,IAAI,+CAA+C,CAAC,CAAC;wBAChH,MAAM;oBACR,CAAC;oBACD,MAAM,SAAS,GAAqB;wBAClC,IAAI,EAAE,aAAyC;wBAC/C,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,KAA6B;qBAC3D,CAAC;oBACF,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;oBACtC,MAAM;gBACR,CAAC;gBACD,KAAK,WAAW,CAAC,CAAC,CAAC;oBACjB,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,IAAI,gCAAgC,CAAC,CAAC;wBAC5F,MAAM;oBACR,CAAC;oBACD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,UAAgC,CAAC;oBACzE,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,IAAI,gDAAgD,CAAC,CAAC;wBAC5G,MAAM;oBACR,CAAC;oBACD,IAAI,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC;oBACnD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;wBACnC,UAAU,GAAG,mBAAmB,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;oBACxE,CAAC;oBACD,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;oBAC7C,MAAM;gBACR,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,UAAU,GAAI,OAAO,CAAC,aAAa,CAAC,UAAmC,IAAI,EAAE,CAAC;oBACpF,MAAM,OAAO,GAAG,mBAAmB,CAChC,OAAO,CAAC,aAAa,CAAC,gBAAuC,IAAI,IAAI,EACtE,WAAW,EAAE,UAAU,CACxB,CAAC;oBACF,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;oBACjD,CAAC;yBAAM,CAAC;wBACN,gEAAgE;wBAChE,OAAO,CAAC,IAAI,CAAC,8BAA8B,OAAO,CAAC,IAAI,iBAAiB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,aAAa,OAAO,IAAI,cAAc,GAAG,CAAC,CAAC;oBAC/I,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,MAAM,OAAO,GAAG,WAAW,EAAE,iBAAiB,IAAI,EAAE,CAAC;oBACrD,MAAM,gBAAgB,GAAG,OAAO;yBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACzD,OAAO,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,IAAI,MAAM,gBAAgB,IAAI,oBAAoB,EAAE,CAAC,CAAC;oBAClG,MAAM;gBACR,CAAC;gBACD,8DAA8D;gBAC9D;oBACE,OAAO,CAAC,KAAK,CAAC,4BAA4B,OAAO,CAAC,WAAW,kCAAkC,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,OAAO,CAAC,WAAW,aAAa,OAAO,CAAC,IAAI,IAAI,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;AACH,CAAC;AAqBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAwC,EACxC,gBAAwB,EACxB,eAAuB,EACvB,cAAsB,EACtB,UAAkB,EAClB,QAAgB,EAChB,GAAsB,EACtB,MAAsC,EACtC,UAA0C,EAC1C,eAA+B;IAE/B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,6DAA6D;QAC7D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,eAAe;YAC7B,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAChE,IAAI,YAAY,IAAI,YAAY,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;YACxD,OAAO,CAAC,IAAI,CACV,2CAA2C,UAAU,IAAI,QAAQ,IAAI;gBACrE,kBAAkB,eAAe,mBAAmB,YAAY,CAAC,EAAE,MAAM,gBAAgB,IAAI,CAC9F,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAC/E,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CACV,wCAAwC,gBAAgB,SAAS,eAAe,IAAI;YACpF,eAAe,QAAQ,CAAC,EAAE,kCAAkC,CAC7D,CAAC;QACF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,IAAI;YACjE,YAAY,EAAE,eAAe;YAC7B,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAChD,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CACtD,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,0BAA0B,gBAAgB,SAAS,eAAe,YAAY;YAC9E,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,sBAAsB,UAAU,IAAI,QAAQ,EAAE,CAC9E,CAAC;QACF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;YAClB,WAAW;YACX,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,IAAI,WAAW,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,sBAAsB,CAC1B,WAAW,CAAC,mBAAmB,EAC/B,MAAM,IAAI,IAAI,EACd,UAAU,CACX,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC9D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,WAAW,EAAE,EAAE,IAAI,IAAI;QACnC,YAAY,EAAE,eAAe;QAC7B,WAAW;QACX,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@telora/factory",
|
|
3
|
+
"version": "0.4.5",
|
|
4
|
+
"description": "Factory orchestrator for Telora - manages build-gate cycles for AI-driven code generation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./factory-engine": {
|
|
14
|
+
"import": "./dist/factory-engine.js",
|
|
15
|
+
"types": "./dist/factory-engine.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"dev": "tsx watch src/index.ts",
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"clean": "rm -rf dist",
|
|
26
|
+
"start": "echo 'Library package -- use telora-daemon instead' && exit 1",
|
|
27
|
+
"lint": "eslint .",
|
|
28
|
+
"test": "npx tsx --experimental-test-module-mocks --test src/__tests__/*.test.ts",
|
|
29
|
+
"typecheck": "tsc --noEmit"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@telora/daemon-core": "^0.2.5",
|
|
33
|
+
"zod": "^4.3.6"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^22.12.0",
|
|
37
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
38
|
+
"eslint-plugin-import-x": "^4.16.1",
|
|
39
|
+
"tsx": "^4.19.2",
|
|
40
|
+
"typescript": "^5.7.3"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=20"
|
|
44
|
+
},
|
|
45
|
+
"keywords": [
|
|
46
|
+
"telora",
|
|
47
|
+
"factory",
|
|
48
|
+
"claude",
|
|
49
|
+
"claude-code",
|
|
50
|
+
"orchestration",
|
|
51
|
+
"ai-agent",
|
|
52
|
+
"build-gate"
|
|
53
|
+
],
|
|
54
|
+
"repository": {
|
|
55
|
+
"type": "git",
|
|
56
|
+
"url": "git+https://github.com/syntelyos/telora.git",
|
|
57
|
+
"directory": "packages/factory"
|
|
58
|
+
},
|
|
59
|
+
"license": "MIT",
|
|
60
|
+
"author": "Syntelyos",
|
|
61
|
+
"publishConfig": {
|
|
62
|
+
"access": "public",
|
|
63
|
+
"registry": "https://registry.npmjs.org/"
|
|
64
|
+
}
|
|
65
|
+
}
|