@soleri/core 2.12.0 → 7.0.0

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.
Files changed (251) hide show
  1. package/data/flows/build.flow.yaml +128 -0
  2. package/data/flows/deliver.flow.yaml +110 -0
  3. package/data/flows/design.flow.yaml +108 -0
  4. package/data/flows/enhance.flow.yaml +90 -0
  5. package/data/flows/explore.flow.yaml +84 -0
  6. package/data/flows/fix.flow.yaml +90 -0
  7. package/data/flows/plan.flow.yaml +87 -0
  8. package/data/flows/review.flow.yaml +90 -0
  9. package/dist/brain/intelligence.d.ts.map +1 -1
  10. package/dist/brain/intelligence.js +16 -2
  11. package/dist/brain/intelligence.js.map +1 -1
  12. package/dist/capabilities/chain-mapping.d.ts +21 -0
  13. package/dist/capabilities/chain-mapping.d.ts.map +1 -0
  14. package/dist/capabilities/chain-mapping.js +86 -0
  15. package/dist/capabilities/chain-mapping.js.map +1 -0
  16. package/dist/capabilities/index.d.ts +10 -0
  17. package/dist/capabilities/index.d.ts.map +1 -0
  18. package/dist/capabilities/index.js +8 -0
  19. package/dist/capabilities/index.js.map +1 -0
  20. package/dist/capabilities/registry.d.ts +95 -0
  21. package/dist/capabilities/registry.d.ts.map +1 -0
  22. package/dist/capabilities/registry.js +227 -0
  23. package/dist/capabilities/registry.js.map +1 -0
  24. package/dist/capabilities/types.d.ts +106 -0
  25. package/dist/capabilities/types.d.ts.map +1 -0
  26. package/dist/capabilities/types.js +12 -0
  27. package/dist/capabilities/types.js.map +1 -0
  28. package/dist/control/intent-router.d.ts.map +1 -1
  29. package/dist/control/intent-router.js +58 -2
  30. package/dist/control/intent-router.js.map +1 -1
  31. package/dist/domain-packs/index.d.ts +8 -0
  32. package/dist/domain-packs/index.d.ts.map +1 -0
  33. package/dist/domain-packs/index.js +8 -0
  34. package/dist/domain-packs/index.js.map +1 -0
  35. package/dist/domain-packs/inject-rules.d.ts +24 -0
  36. package/dist/domain-packs/inject-rules.d.ts.map +1 -0
  37. package/dist/domain-packs/inject-rules.js +65 -0
  38. package/dist/domain-packs/inject-rules.js.map +1 -0
  39. package/dist/domain-packs/knowledge-installer.d.ts +27 -0
  40. package/dist/domain-packs/knowledge-installer.d.ts.map +1 -0
  41. package/dist/domain-packs/knowledge-installer.js +89 -0
  42. package/dist/domain-packs/knowledge-installer.js.map +1 -0
  43. package/dist/domain-packs/loader.d.ts +28 -0
  44. package/dist/domain-packs/loader.d.ts.map +1 -0
  45. package/dist/domain-packs/loader.js +105 -0
  46. package/dist/domain-packs/loader.js.map +1 -0
  47. package/dist/domain-packs/pack-runtime.d.ts +80 -0
  48. package/dist/domain-packs/pack-runtime.d.ts.map +1 -0
  49. package/dist/domain-packs/pack-runtime.js +36 -0
  50. package/dist/domain-packs/pack-runtime.js.map +1 -0
  51. package/dist/domain-packs/skills-installer.d.ts +21 -0
  52. package/dist/domain-packs/skills-installer.d.ts.map +1 -0
  53. package/dist/domain-packs/skills-installer.js +38 -0
  54. package/dist/domain-packs/skills-installer.js.map +1 -0
  55. package/dist/domain-packs/token-resolver.d.ts +37 -0
  56. package/dist/domain-packs/token-resolver.d.ts.map +1 -0
  57. package/dist/domain-packs/token-resolver.js +109 -0
  58. package/dist/domain-packs/token-resolver.js.map +1 -0
  59. package/dist/domain-packs/types.d.ts +91 -0
  60. package/dist/domain-packs/types.d.ts.map +1 -0
  61. package/dist/domain-packs/types.js +122 -0
  62. package/dist/domain-packs/types.js.map +1 -0
  63. package/dist/engine/bin/soleri-engine.d.ts +12 -0
  64. package/dist/engine/bin/soleri-engine.d.ts.map +1 -0
  65. package/dist/engine/bin/soleri-engine.js +183 -0
  66. package/dist/engine/bin/soleri-engine.js.map +1 -0
  67. package/dist/engine/core-ops.d.ts +27 -0
  68. package/dist/engine/core-ops.d.ts.map +1 -0
  69. package/dist/engine/core-ops.js +159 -0
  70. package/dist/engine/core-ops.js.map +1 -0
  71. package/dist/engine/index.d.ts +19 -0
  72. package/dist/engine/index.d.ts.map +1 -0
  73. package/dist/engine/index.js +17 -0
  74. package/dist/engine/index.js.map +1 -0
  75. package/dist/engine/register-engine.d.ts +54 -0
  76. package/dist/engine/register-engine.d.ts.map +1 -0
  77. package/dist/engine/register-engine.js +270 -0
  78. package/dist/engine/register-engine.js.map +1 -0
  79. package/dist/engine/test-helpers.d.ts +30 -0
  80. package/dist/engine/test-helpers.d.ts.map +1 -0
  81. package/dist/engine/test-helpers.js +59 -0
  82. package/dist/engine/test-helpers.js.map +1 -0
  83. package/dist/flows/context-router.d.ts +39 -0
  84. package/dist/flows/context-router.d.ts.map +1 -0
  85. package/dist/flows/context-router.js +206 -0
  86. package/dist/flows/context-router.js.map +1 -0
  87. package/dist/flows/dispatch-registry.d.ts +24 -0
  88. package/dist/flows/dispatch-registry.d.ts.map +1 -0
  89. package/dist/flows/dispatch-registry.js +70 -0
  90. package/dist/flows/dispatch-registry.js.map +1 -0
  91. package/dist/flows/epilogue.d.ts +24 -0
  92. package/dist/flows/epilogue.d.ts.map +1 -0
  93. package/dist/flows/epilogue.js +52 -0
  94. package/dist/flows/epilogue.js.map +1 -0
  95. package/dist/flows/executor.d.ts +25 -0
  96. package/dist/flows/executor.d.ts.map +1 -0
  97. package/dist/flows/executor.js +153 -0
  98. package/dist/flows/executor.js.map +1 -0
  99. package/dist/flows/gate-evaluator.d.ts +26 -0
  100. package/dist/flows/gate-evaluator.d.ts.map +1 -0
  101. package/dist/flows/gate-evaluator.js +162 -0
  102. package/dist/flows/gate-evaluator.js.map +1 -0
  103. package/dist/flows/index.d.ts +14 -0
  104. package/dist/flows/index.d.ts.map +1 -0
  105. package/dist/flows/index.js +20 -0
  106. package/dist/flows/index.js.map +1 -0
  107. package/dist/flows/loader.d.ts +17 -0
  108. package/dist/flows/loader.d.ts.map +1 -0
  109. package/dist/flows/loader.js +61 -0
  110. package/dist/flows/loader.js.map +1 -0
  111. package/dist/flows/plan-builder.d.ts +40 -0
  112. package/dist/flows/plan-builder.d.ts.map +1 -0
  113. package/dist/flows/plan-builder.js +213 -0
  114. package/dist/flows/plan-builder.js.map +1 -0
  115. package/dist/flows/probes.d.ts +11 -0
  116. package/dist/flows/probes.d.ts.map +1 -0
  117. package/dist/flows/probes.js +62 -0
  118. package/dist/flows/probes.js.map +1 -0
  119. package/dist/flows/types.d.ts +950 -0
  120. package/dist/flows/types.d.ts.map +1 -0
  121. package/dist/flows/types.js +105 -0
  122. package/dist/flows/types.js.map +1 -0
  123. package/dist/index.d.ts +11 -1
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +10 -1
  126. package/dist/index.js.map +1 -1
  127. package/dist/intelligence/loader.d.ts +19 -0
  128. package/dist/intelligence/loader.d.ts.map +1 -1
  129. package/dist/intelligence/loader.js +35 -0
  130. package/dist/intelligence/loader.js.map +1 -1
  131. package/dist/intelligence/types.d.ts +1 -0
  132. package/dist/intelligence/types.d.ts.map +1 -1
  133. package/dist/packs/types.d.ts +58 -19
  134. package/dist/packs/types.d.ts.map +1 -1
  135. package/dist/packs/types.js +14 -0
  136. package/dist/packs/types.js.map +1 -1
  137. package/dist/playbooks/generic/onboarding.d.ts +9 -0
  138. package/dist/playbooks/generic/onboarding.d.ts.map +1 -0
  139. package/dist/playbooks/generic/onboarding.js +74 -0
  140. package/dist/playbooks/generic/onboarding.js.map +1 -0
  141. package/dist/playbooks/playbook-registry.d.ts.map +1 -1
  142. package/dist/playbooks/playbook-registry.js +2 -0
  143. package/dist/playbooks/playbook-registry.js.map +1 -1
  144. package/dist/runtime/admin-extra-ops.d.ts.map +1 -1
  145. package/dist/runtime/admin-extra-ops.js +15 -9
  146. package/dist/runtime/admin-extra-ops.js.map +1 -1
  147. package/dist/runtime/admin-ops.js +4 -4
  148. package/dist/runtime/admin-ops.js.map +1 -1
  149. package/dist/runtime/capture-ops.d.ts.map +1 -1
  150. package/dist/runtime/capture-ops.js +33 -1
  151. package/dist/runtime/capture-ops.js.map +1 -1
  152. package/dist/runtime/domain-ops.d.ts +21 -5
  153. package/dist/runtime/domain-ops.d.ts.map +1 -1
  154. package/dist/runtime/domain-ops.js +64 -6
  155. package/dist/runtime/domain-ops.js.map +1 -1
  156. package/dist/runtime/facades/cognee-facade.d.ts.map +1 -1
  157. package/dist/runtime/facades/cognee-facade.js +3 -1
  158. package/dist/runtime/facades/cognee-facade.js.map +1 -1
  159. package/dist/runtime/facades/index.d.ts.map +1 -1
  160. package/dist/runtime/facades/index.js +10 -6
  161. package/dist/runtime/facades/index.js.map +1 -1
  162. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  163. package/dist/runtime/facades/vault-facade.js +2 -0
  164. package/dist/runtime/facades/vault-facade.js.map +1 -1
  165. package/dist/runtime/orchestrate-ops.d.ts +8 -7
  166. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  167. package/dist/runtime/orchestrate-ops.js +217 -61
  168. package/dist/runtime/orchestrate-ops.js.map +1 -1
  169. package/dist/runtime/runtime.d.ts.map +1 -1
  170. package/dist/runtime/runtime.js +23 -17
  171. package/dist/runtime/runtime.js.map +1 -1
  172. package/dist/runtime/types.d.ts +6 -2
  173. package/dist/runtime/types.d.ts.map +1 -1
  174. package/dist/runtime/vault-linking-ops.d.ts +13 -0
  175. package/dist/runtime/vault-linking-ops.d.ts.map +1 -0
  176. package/dist/runtime/vault-linking-ops.js +367 -0
  177. package/dist/runtime/vault-linking-ops.js.map +1 -0
  178. package/dist/vault/linking.d.ts +46 -0
  179. package/dist/vault/linking.d.ts.map +1 -0
  180. package/dist/vault/linking.js +275 -0
  181. package/dist/vault/linking.js.map +1 -0
  182. package/dist/vault/vault-types.d.ts +37 -0
  183. package/dist/vault/vault-types.d.ts.map +1 -1
  184. package/dist/vault/vault.d.ts +12 -0
  185. package/dist/vault/vault.d.ts.map +1 -1
  186. package/dist/vault/vault.js +85 -6
  187. package/dist/vault/vault.js.map +1 -1
  188. package/package.json +4 -1
  189. package/src/__tests__/admin-extra-ops.test.ts +1 -1
  190. package/src/__tests__/admin-ops.test.ts +2 -1
  191. package/src/__tests__/cognee-client-gaps.test.ts +470 -0
  192. package/src/__tests__/cognee-hybrid-search.test.ts +478 -0
  193. package/src/__tests__/cognee-sync-manager-deep.test.ts +630 -0
  194. package/src/__tests__/cognee-sync-manager.test.ts +1 -0
  195. package/src/__tests__/core-ops.test.ts +9 -61
  196. package/src/__tests__/domain-packs.test.ts +421 -0
  197. package/src/__tests__/flows.test.ts +604 -0
  198. package/src/__tests__/playbook-registry.test.ts +2 -2
  199. package/src/__tests__/playbook-seeder.test.ts +8 -8
  200. package/src/__tests__/playbook.test.ts +5 -5
  201. package/src/__tests__/token-resolver.test.ts +79 -0
  202. package/src/brain/intelligence.ts +21 -2
  203. package/src/capabilities/chain-mapping.ts +93 -0
  204. package/src/capabilities/index.ts +21 -0
  205. package/src/capabilities/registry.ts +290 -0
  206. package/src/capabilities/types.ts +143 -0
  207. package/src/control/intent-router.ts +46 -2
  208. package/src/domain-packs/index.ts +27 -0
  209. package/src/domain-packs/inject-rules.ts +74 -0
  210. package/src/domain-packs/knowledge-installer.ts +116 -0
  211. package/src/domain-packs/loader.ts +124 -0
  212. package/src/domain-packs/pack-runtime.ts +99 -0
  213. package/src/domain-packs/skills-installer.ts +56 -0
  214. package/src/domain-packs/token-resolver.ts +126 -0
  215. package/src/domain-packs/types.ts +229 -0
  216. package/src/engine/__tests__/register-engine.test.ts +104 -0
  217. package/src/engine/bin/soleri-engine.ts +217 -0
  218. package/src/engine/core-ops.ts +178 -0
  219. package/src/engine/index.ts +19 -0
  220. package/src/engine/register-engine.ts +385 -0
  221. package/src/engine/test-helpers.ts +83 -0
  222. package/src/flows/context-router.ts +257 -0
  223. package/src/flows/dispatch-registry.ts +80 -0
  224. package/src/flows/epilogue.ts +65 -0
  225. package/src/flows/executor.ts +182 -0
  226. package/src/flows/gate-evaluator.ts +171 -0
  227. package/src/flows/index.ts +52 -0
  228. package/src/flows/loader.ts +63 -0
  229. package/src/flows/plan-builder.ts +250 -0
  230. package/src/flows/probes.ts +70 -0
  231. package/src/flows/types.ts +217 -0
  232. package/src/index.ts +68 -1
  233. package/src/intelligence/loader.ts +38 -0
  234. package/src/intelligence/types.ts +1 -0
  235. package/src/packs/types.ts +19 -0
  236. package/src/playbooks/generic/onboarding.ts +79 -0
  237. package/src/playbooks/playbook-registry.ts +2 -0
  238. package/src/runtime/admin-extra-ops.ts +14 -8
  239. package/src/runtime/admin-ops.ts +4 -4
  240. package/src/runtime/capture-ops.ts +40 -1
  241. package/src/runtime/domain-ops.ts +71 -5
  242. package/src/runtime/facades/cognee-facade.ts +3 -1
  243. package/src/runtime/facades/index.ts +12 -6
  244. package/src/runtime/facades/vault-facade.ts +2 -0
  245. package/src/runtime/orchestrate-ops.ts +261 -65
  246. package/src/runtime/runtime.ts +27 -18
  247. package/src/runtime/types.ts +6 -2
  248. package/src/runtime/vault-linking-ops.ts +454 -0
  249. package/src/vault/linking.ts +333 -0
  250. package/src/vault/vault-types.ts +46 -0
  251. package/src/vault/vault.ts +94 -7
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Gate evaluator — checks step gates against tool results to decide
3
+ * whether execution should CONTINUE, STOP, or BRANCH.
4
+ */
5
+ /**
6
+ * Evaluate a plan step's gate against collected tool results.
7
+ * If no gate is defined, returns CONTINUE (passed).
8
+ */
9
+ export function evaluateGate(gate, toolResults) {
10
+ if (!gate) {
11
+ return { passed: true, action: 'CONTINUE' };
12
+ }
13
+ switch (gate.type) {
14
+ case 'GATE': {
15
+ const passed = gate.condition ? evaluateCondition(gate.condition, toolResults) : true;
16
+ if (passed)
17
+ return { passed: true, action: 'CONTINUE' };
18
+ return {
19
+ passed: false,
20
+ action: gate.onFail?.action ?? 'STOP',
21
+ goto: gate.onFail?.goto,
22
+ message: gate.onFail?.message,
23
+ };
24
+ }
25
+ case 'SCORE': {
26
+ const score = extractScore(toolResults);
27
+ const minScore = gate.min ?? 0;
28
+ const passed = score >= minScore;
29
+ if (passed)
30
+ return { passed: true, action: 'CONTINUE', score };
31
+ return {
32
+ passed: false,
33
+ action: gate.onFail?.action ?? 'STOP',
34
+ goto: gate.onFail?.goto,
35
+ message: gate.onFail?.message ?? `Score ${score} below minimum ${minScore}`,
36
+ score,
37
+ };
38
+ }
39
+ case 'CHECKPOINT': {
40
+ const passed = gate.condition ? evaluateCondition(gate.condition, toolResults) : true;
41
+ if (passed)
42
+ return { passed: true, action: 'CONTINUE' };
43
+ return {
44
+ passed: false,
45
+ action: gate.onFail?.action ?? 'CONTINUE',
46
+ goto: gate.onFail?.goto,
47
+ message: gate.onFail?.message,
48
+ };
49
+ }
50
+ case 'BRANCH': {
51
+ // BRANCH gates always trigger branching
52
+ return {
53
+ passed: true,
54
+ action: 'BRANCH',
55
+ goto: gate.onFail?.goto,
56
+ message: gate.onFail?.message,
57
+ };
58
+ }
59
+ default:
60
+ return { passed: true, action: 'CONTINUE' };
61
+ }
62
+ }
63
+ /**
64
+ * Evaluate a simple condition string: "lhs op rhs".
65
+ * Supported operators: ==, !=, >=, <=, >, <
66
+ * lhs is resolved as a dotted path from data, rhs is a literal.
67
+ */
68
+ export function evaluateCondition(condition, data) {
69
+ const operators = ['>=', '<=', '!=', '==', '>', '<'];
70
+ for (const op of operators) {
71
+ const idx = condition.indexOf(op);
72
+ if (idx === -1)
73
+ continue;
74
+ const lhsPath = condition.slice(0, idx).trim();
75
+ const rhsRaw = condition.slice(idx + op.length).trim();
76
+ const lhsValue = resolvePath(data, lhsPath);
77
+ const rhsValue = parseConditionValue(rhsRaw);
78
+ const lNum = typeof lhsValue === 'number' ? lhsValue : Number(lhsValue);
79
+ const rNum = typeof rhsValue === 'number' ? rhsValue : Number(rhsValue);
80
+ const useNumeric = !Number.isNaN(lNum) && !Number.isNaN(rNum);
81
+ switch (op) {
82
+ case '==':
83
+ return useNumeric ? lNum === rNum : String(lhsValue) === String(rhsValue);
84
+ case '!=':
85
+ return useNumeric ? lNum !== rNum : String(lhsValue) !== String(rhsValue);
86
+ case '>=':
87
+ return useNumeric ? lNum >= rNum : false;
88
+ case '<=':
89
+ return useNumeric ? lNum <= rNum : false;
90
+ case '>':
91
+ return useNumeric ? lNum > rNum : false;
92
+ case '<':
93
+ return useNumeric ? lNum < rNum : false;
94
+ }
95
+ }
96
+ // No operator found — check if value is truthy
97
+ const val = resolvePath(data, condition.trim());
98
+ return !!val;
99
+ }
100
+ /**
101
+ * Extract a numeric score from tool results.
102
+ * Looks for common score field names.
103
+ */
104
+ export function extractScore(data) {
105
+ // Direct score fields
106
+ for (const key of ['score', 'validationScore', 'total']) {
107
+ if (typeof data[key] === 'number')
108
+ return data[key];
109
+ }
110
+ // Search within nested result objects
111
+ for (const val of Object.values(data)) {
112
+ if (val && typeof val === 'object' && !Array.isArray(val)) {
113
+ const nested = val;
114
+ for (const key of ['score', 'validationScore', 'total']) {
115
+ if (typeof nested[key] === 'number')
116
+ return nested[key];
117
+ }
118
+ // One more level: data property
119
+ if (nested.data && typeof nested.data === 'object') {
120
+ const deep = nested.data;
121
+ for (const key of ['score', 'validationScore', 'total']) {
122
+ if (typeof deep[key] === 'number')
123
+ return deep[key];
124
+ }
125
+ }
126
+ }
127
+ }
128
+ return 0;
129
+ }
130
+ /**
131
+ * Resolve a dotted path like "result.data.score" against an object.
132
+ */
133
+ export function resolvePath(obj, path) {
134
+ const parts = path.split('.');
135
+ let current = obj;
136
+ for (const part of parts) {
137
+ if (current === null || current === undefined || typeof current !== 'object')
138
+ return undefined;
139
+ current = current[part];
140
+ }
141
+ return current;
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // Internal
145
+ // ---------------------------------------------------------------------------
146
+ function parseConditionValue(raw) {
147
+ if (raw === 'true')
148
+ return true;
149
+ if (raw === 'false')
150
+ return false;
151
+ if (raw === 'null')
152
+ return 0;
153
+ // Strip quotes
154
+ if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
155
+ return raw.slice(1, -1);
156
+ }
157
+ const num = Number(raw);
158
+ if (!Number.isNaN(num))
159
+ return num;
160
+ return raw;
161
+ }
162
+ //# sourceMappingURL=gate-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-evaluator.js","sourceRoot":"","sources":["../../src/flows/gate-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Flow engine — YAML-driven workflow orchestration.
3
+ */
4
+ export type { Flow, FlowStep, Gate, GateAction, ProbeName, ProbeResults, PlanStep, SkippedStep, OrchestrationPlan, OrchestrationContext, StepResult, ExecutionResult, GateVerdict, } from './types.js';
5
+ export { loadFlowById, loadAllFlows, parseSimpleYaml } from './loader.js';
6
+ export { runProbes } from './probes.js';
7
+ export { INTENT_TO_FLOW, chainToToolName, chainToRequires, flowStepsToPlanSteps, pruneSteps, buildPlan, } from './plan-builder.js';
8
+ export { detectContext, applyContextOverrides, getFlowOverrides } from './context-router.js';
9
+ export type { ContextOverride } from './context-router.js';
10
+ export { evaluateGate, evaluateCondition, extractScore, resolvePath } from './gate-evaluator.js';
11
+ export { FlowExecutor } from './executor.js';
12
+ export { createDispatcher } from './dispatch-registry.js';
13
+ export { runEpilogue } from './epilogue.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/flows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG1E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,SAAS,GACV,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGjG,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Flow engine — YAML-driven workflow orchestration.
3
+ */
4
+ // Loader
5
+ export { loadFlowById, loadAllFlows, parseSimpleYaml } from './loader.js';
6
+ // Probes
7
+ export { runProbes } from './probes.js';
8
+ // Plan builder
9
+ export { INTENT_TO_FLOW, chainToToolName, chainToRequires, flowStepsToPlanSteps, pruneSteps, buildPlan, } from './plan-builder.js';
10
+ // Context router
11
+ export { detectContext, applyContextOverrides, getFlowOverrides } from './context-router.js';
12
+ // Gate evaluator
13
+ export { evaluateGate, evaluateCondition, extractScore, resolvePath } from './gate-evaluator.js';
14
+ // Executor
15
+ export { FlowExecutor } from './executor.js';
16
+ // Dispatch registry
17
+ export { createDispatcher } from './dispatch-registry.js';
18
+ // Epilogue
19
+ export { runEpilogue } from './epilogue.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/flows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1E,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,eAAe;AACf,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,SAAS,GACV,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG7F,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEjG,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Flow loader — reads and validates YAML flow files from a directory.
3
+ */
4
+ import { parse as parseYaml } from 'yaml';
5
+ import { type Flow } from './types.js';
6
+ /** Re-export for backward compat (tests import this). */
7
+ export declare const parseSimpleYaml: typeof parseYaml;
8
+ /**
9
+ * Load a single flow by its `id` field from *.flow.yaml files in a directory.
10
+ * Returns `null` if not found or validation fails.
11
+ */
12
+ export declare function loadFlowById(flowId: string, flowsDir?: string): Flow | null;
13
+ /**
14
+ * Load all valid flows from *.flow.yaml files in a directory.
15
+ */
16
+ export declare function loadAllFlows(flowsDir?: string): Flow[];
17
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/flows/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAKnD,yDAAyD;AACzD,eAAO,MAAM,eAAe,kBAAY,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAkB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAmBtD"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Flow loader — reads and validates YAML flow files from a directory.
3
+ */
4
+ import { readdirSync, readFileSync, existsSync } from 'node:fs';
5
+ import { join, dirname } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { parse as parseYaml } from 'yaml';
8
+ import { flowSchema } from './types.js';
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ const DEFAULT_FLOWS_DIR = join(__dirname, '..', '..', 'data', 'flows');
11
+ /** Re-export for backward compat (tests import this). */
12
+ export const parseSimpleYaml = parseYaml;
13
+ /**
14
+ * Load a single flow by its `id` field from *.flow.yaml files in a directory.
15
+ * Returns `null` if not found or validation fails.
16
+ */
17
+ export function loadFlowById(flowId, flowsDir) {
18
+ const dir = flowsDir ?? DEFAULT_FLOWS_DIR;
19
+ if (!existsSync(dir))
20
+ return null;
21
+ const files = readdirSync(dir).filter((f) => f.endsWith('.flow.yaml'));
22
+ for (const file of files) {
23
+ try {
24
+ const content = readFileSync(join(dir, file), 'utf-8');
25
+ const raw = parseYaml(content);
26
+ const parsed = flowSchema.safeParse(raw);
27
+ if (parsed.success && parsed.data.id === flowId) {
28
+ return parsed.data;
29
+ }
30
+ }
31
+ catch {
32
+ // skip invalid files
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+ /**
38
+ * Load all valid flows from *.flow.yaml files in a directory.
39
+ */
40
+ export function loadAllFlows(flowsDir) {
41
+ const dir = flowsDir ?? DEFAULT_FLOWS_DIR;
42
+ if (!existsSync(dir))
43
+ return [];
44
+ const files = readdirSync(dir).filter((f) => f.endsWith('.flow.yaml'));
45
+ const flows = [];
46
+ for (const file of files) {
47
+ try {
48
+ const content = readFileSync(join(dir, file), 'utf-8');
49
+ const raw = parseYaml(content);
50
+ const parsed = flowSchema.safeParse(raw);
51
+ if (parsed.success) {
52
+ flows.push(parsed.data);
53
+ }
54
+ }
55
+ catch {
56
+ // skip invalid files
57
+ }
58
+ }
59
+ return flows;
60
+ }
61
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/flows/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAEnD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvE,yDAAyD;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,QAAiB;IAC5D,MAAM,GAAG,GAAG,QAAQ,IAAI,iBAAiB,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;gBAChD,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAiB;IAC5C,MAAM,GAAG,GAAG,QAAQ,IAAI,iBAAiB,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IACvE,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Plan builder — converts intent + flow + probes into an OrchestrationPlan.
3
+ */
4
+ import type { AgentRuntime } from '../runtime/types.js';
5
+ import type { Flow, PlanStep, SkippedStep, OrchestrationPlan, ProbeResults, ProbeName } from './types.js';
6
+ import type { CapabilityRegistry } from '../capabilities/index.js';
7
+ export declare const INTENT_TO_FLOW: Record<string, string>;
8
+ /**
9
+ * Convert a chain name (e.g. "vault-search") to a tool name (e.g. "myagent_vault_search").
10
+ */
11
+ export declare function chainToToolName(chain: string, agentId: string): string;
12
+ /**
13
+ * Infer which probe capability a chain requires, or undefined if none.
14
+ */
15
+ export declare function chainToRequires(chain: string): ProbeName | undefined;
16
+ /**
17
+ * Convert flow steps into plan steps.
18
+ *
19
+ * Resolution order for capability IDs:
20
+ * 1. If the step has `needs:` (v2), use those capability IDs directly
21
+ * 2. If the step only has `chains:` (v1), map via chainToCapability()
22
+ * 3. chainToToolName() is still used for tool dispatch (fallback path)
23
+ *
24
+ * When an optional `registry` is provided, each resolved capability is
25
+ * validated. Unavailable capabilities are recorded in the step's
26
+ * `unavailableCapabilities` list (informational — pruning is separate).
27
+ */
28
+ export declare function flowStepsToPlanSteps(flow: Flow, agentId: string, registry?: CapabilityRegistry): PlanStep[];
29
+ /**
30
+ * Remove steps whose required capabilities are not available.
31
+ */
32
+ export declare function pruneSteps(steps: PlanStep[], probes: ProbeResults): {
33
+ kept: PlanStep[];
34
+ skipped: SkippedStep[];
35
+ };
36
+ /**
37
+ * Build a full orchestration plan from intent, agent config, and runtime.
38
+ */
39
+ export declare function buildPlan(intent: string, agentId: string, projectPath: string, runtime: AgentRuntime, prompt?: string): Promise<OrchestrationPlan>;
40
+ //# sourceMappingURL=plan-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-builder.d.ts","sourceRoot":"","sources":["../../src/flows/plan-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAKpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAMnE,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWjD,CAAC;AAMF;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAUpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,QAAQ,EAAE,CA4EZ;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,YAAY,GACnB;IAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,CAkB9C;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,YAAY,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAyD5B"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Plan builder — converts intent + flow + probes into an OrchestrationPlan.
3
+ */
4
+ import { randomUUID } from 'node:crypto';
5
+ import { loadFlowById } from './loader.js';
6
+ import { runProbes } from './probes.js';
7
+ import { detectContext, applyContextOverrides } from './context-router.js';
8
+ import { chainToCapability } from '../capabilities/index.js';
9
+ // ---------------------------------------------------------------------------
10
+ // Intent → Flow mapping
11
+ // ---------------------------------------------------------------------------
12
+ export const INTENT_TO_FLOW = {
13
+ BUILD: 'BUILD-flow',
14
+ CREATE: 'BUILD-flow',
15
+ FIX: 'FIX-flow',
16
+ REVIEW: 'REVIEW-flow',
17
+ PLAN: 'PLAN-flow',
18
+ DESIGN: 'DESIGN-flow',
19
+ ENHANCE: 'ENHANCE-flow',
20
+ IMPROVE: 'ENHANCE-flow',
21
+ EXPLORE: 'EXPLORE-flow',
22
+ DELIVER: 'DELIVER-flow',
23
+ };
24
+ // ---------------------------------------------------------------------------
25
+ // Helpers
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Convert a chain name (e.g. "vault-search") to a tool name (e.g. "myagent_vault_search").
29
+ */
30
+ export function chainToToolName(chain, agentId) {
31
+ return `${agentId}_${chain.replace(/-/g, '_')}`;
32
+ }
33
+ /**
34
+ * Infer which probe capability a chain requires, or undefined if none.
35
+ */
36
+ export function chainToRequires(chain) {
37
+ const lower = chain.toLowerCase();
38
+ if (lower.startsWith('vault') || lower.startsWith('memory'))
39
+ return 'vault';
40
+ if (lower.startsWith('brain'))
41
+ return 'brain';
42
+ if (lower.startsWith('component') || lower.startsWith('token') || lower.startsWith('design'))
43
+ return 'designSystem';
44
+ if (lower.startsWith('session'))
45
+ return 'sessionStore';
46
+ // recommend-* and get-stack-* have no hard requirements
47
+ if (lower.startsWith('recommend') || lower.startsWith('get-stack'))
48
+ return undefined;
49
+ return undefined;
50
+ }
51
+ /**
52
+ * Convert flow steps into plan steps.
53
+ *
54
+ * Resolution order for capability IDs:
55
+ * 1. If the step has `needs:` (v2), use those capability IDs directly
56
+ * 2. If the step only has `chains:` (v1), map via chainToCapability()
57
+ * 3. chainToToolName() is still used for tool dispatch (fallback path)
58
+ *
59
+ * When an optional `registry` is provided, each resolved capability is
60
+ * validated. Unavailable capabilities are recorded in the step's
61
+ * `unavailableCapabilities` list (informational — pruning is separate).
62
+ */
63
+ export function flowStepsToPlanSteps(flow, agentId, registry) {
64
+ return flow.steps.map((step) => {
65
+ // Tool names for dispatch fallback (always computed from chains)
66
+ const tools = (step.chains ?? []).map((c) => chainToToolName(c, agentId));
67
+ // Resolve capability IDs: prefer needs (v2), fall back to chains (v1)
68
+ const capabilityIds = [];
69
+ if (step.needs && step.needs.length > 0) {
70
+ capabilityIds.push(...step.needs);
71
+ }
72
+ else if (step.chains) {
73
+ for (const chain of step.chains) {
74
+ const capId = chainToCapability(chain);
75
+ if (capId && !capabilityIds.includes(capId)) {
76
+ capabilityIds.push(capId);
77
+ }
78
+ }
79
+ }
80
+ // Probe-level requires (existing behavior, derived from chains)
81
+ const requires = [];
82
+ for (const chain of step.chains ?? []) {
83
+ const req = chainToRequires(chain);
84
+ if (req && !requires.includes(req))
85
+ requires.push(req);
86
+ }
87
+ // Validate capabilities against registry if provided
88
+ const unavailableCapabilities = [];
89
+ if (registry) {
90
+ for (const capId of capabilityIds) {
91
+ const resolved = registry.resolve(capId);
92
+ if (!resolved.available) {
93
+ unavailableCapabilities.push(capId);
94
+ }
95
+ }
96
+ }
97
+ const planStep = {
98
+ id: step.id,
99
+ name: step.name ?? step.id,
100
+ tools,
101
+ parallel: step.parallel ?? false,
102
+ requires,
103
+ status: 'pending',
104
+ };
105
+ // Attach capability metadata (non-breaking additions)
106
+ if (capabilityIds.length > 0) {
107
+ planStep.capabilities = capabilityIds;
108
+ }
109
+ if (unavailableCapabilities.length > 0) {
110
+ planStep.unavailableCapabilities =
111
+ unavailableCapabilities;
112
+ }
113
+ if (step.gate) {
114
+ const gate = step.gate;
115
+ planStep.gate = {
116
+ type: gate.type,
117
+ };
118
+ if ('condition' in gate && gate.condition) {
119
+ planStep.gate.condition = gate.condition;
120
+ }
121
+ if ('min' in gate && gate.min !== undefined) {
122
+ planStep.gate.min = gate.min;
123
+ }
124
+ if (gate['on-false']) {
125
+ planStep.gate.onFail = {
126
+ action: gate['on-false'].action,
127
+ goto: gate['on-false'].goto,
128
+ message: gate['on-false'].message,
129
+ };
130
+ }
131
+ }
132
+ return planStep;
133
+ });
134
+ }
135
+ /**
136
+ * Remove steps whose required capabilities are not available.
137
+ */
138
+ export function pruneSteps(steps, probes) {
139
+ const kept = [];
140
+ const skipped = [];
141
+ for (const step of steps) {
142
+ const missingProbes = step.requires.filter((r) => !probes[r]);
143
+ if (missingProbes.length > 0) {
144
+ skipped.push({
145
+ id: step.id,
146
+ name: step.name,
147
+ reason: `Missing capabilities: ${missingProbes.join(', ')}`,
148
+ });
149
+ }
150
+ else {
151
+ kept.push(step);
152
+ }
153
+ }
154
+ return { kept, skipped };
155
+ }
156
+ /**
157
+ * Build a full orchestration plan from intent, agent config, and runtime.
158
+ */
159
+ export async function buildPlan(intent, agentId, projectPath, runtime, prompt) {
160
+ const normalizedIntent = intent.toUpperCase();
161
+ const flowId = INTENT_TO_FLOW[normalizedIntent] ?? 'BUILD-flow';
162
+ const flow = loadFlowById(flowId);
163
+ const probes = await runProbes(runtime, projectPath);
164
+ let steps = [];
165
+ let skipped = [];
166
+ const warnings = [];
167
+ if (flow) {
168
+ let allSteps = flowStepsToPlanSteps(flow, agentId);
169
+ // Context-sensitive chain routing: detect what's being built/fixed/reviewed
170
+ // and apply chain overrides (inject, skip, substitute) before pruning.
171
+ const entities = { components: [], actions: [] };
172
+ const contexts = prompt ? detectContext(prompt, entities) : [];
173
+ if (contexts.length > 0) {
174
+ allSteps = applyContextOverrides(allSteps, contexts, flowId, agentId);
175
+ }
176
+ const pruneResult = pruneSteps(allSteps, probes);
177
+ steps = pruneResult.kept;
178
+ skipped = pruneResult.skipped;
179
+ if (pruneResult.skipped.length > 0) {
180
+ warnings.push(`${pruneResult.skipped.length} step(s) skipped due to missing capabilities.`);
181
+ }
182
+ }
183
+ else {
184
+ warnings.push(`Flow "${flowId}" not found — plan will have no steps.`);
185
+ }
186
+ if (!probes.vault)
187
+ warnings.push('Vault unavailable — knowledge capture will be skipped.');
188
+ if (!probes.brain)
189
+ warnings.push('Brain has no vocabulary — recommendations may be limited.');
190
+ const epilogue = [];
191
+ if (probes.vault)
192
+ epilogue.push('capture_knowledge');
193
+ if (probes.sessionStore)
194
+ epilogue.push('session_capture');
195
+ return {
196
+ planId: randomUUID(),
197
+ intent: normalizedIntent,
198
+ flowId,
199
+ steps,
200
+ skipped,
201
+ epilogue,
202
+ warnings,
203
+ summary: prompt ?? `${normalizedIntent} plan with ${steps.length} step(s)`,
204
+ estimatedTools: steps.reduce((acc, s) => acc + s.tools.length, 0),
205
+ context: {
206
+ intent: normalizedIntent,
207
+ probes,
208
+ entities: { components: [], actions: [] },
209
+ projectPath,
210
+ },
211
+ };
212
+ }
213
+ //# sourceMappingURL=plan-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-builder.js","sourceRoot":"","sources":["../../src/flows/plan-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Capability probes — detect what subsystems are available at runtime.
3
+ * All probes are resilient: they catch errors and return false on failure.
4
+ */
5
+ import type { AgentRuntime } from '../runtime/types.js';
6
+ import type { ProbeResults } from './types.js';
7
+ /**
8
+ * Run all 6 capability probes in parallel and return results.
9
+ */
10
+ export declare function runProbes(runtime: AgentRuntime, projectPath: string): Promise<ProbeResults>;
11
+ //# sourceMappingURL=probes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/flows/probes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAWjG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Capability probes — detect what subsystems are available at runtime.
3
+ * All probes are resilient: they catch errors and return false on failure.
4
+ */
5
+ import { existsSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ /**
8
+ * Run all 6 capability probes in parallel and return results.
9
+ */
10
+ export async function runProbes(runtime, projectPath) {
11
+ const [vault, brain, designSystem, sessionStore, projectRules, active] = await Promise.all([
12
+ probeVault(runtime),
13
+ probeBrain(runtime),
14
+ probeDesignSystem(runtime),
15
+ probeSessionStore(),
16
+ probeProjectRules(projectPath),
17
+ probeActive(),
18
+ ]);
19
+ return { vault, brain, designSystem, sessionStore, projectRules, active };
20
+ }
21
+ async function probeVault(runtime) {
22
+ try {
23
+ const stats = runtime.vault.stats();
24
+ return stats.totalEntries >= 0;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ async function probeBrain(runtime) {
31
+ try {
32
+ return runtime.brain.getVocabularySize() > 0;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ async function probeDesignSystem(runtime) {
39
+ try {
40
+ return runtime.projectRegistry.list().length > 0;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ async function probeSessionStore() {
47
+ // Session store is always available in Soleri runtime
48
+ return true;
49
+ }
50
+ async function probeProjectRules(projectPath) {
51
+ try {
52
+ return (existsSync(join(projectPath, 'docs', 'vault')) || existsSync(join(projectPath, '.soleri')));
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ async function probeActive() {
59
+ // Always true when the engine is running
60
+ return true;
61
+ }
62
+ //# sourceMappingURL=probes.js.map