@vorionsys/atsf-core 0.2.2 → 0.2.3

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 (326) hide show
  1. package/CHANGELOG.md +3 -3
  2. package/README.md +77 -11
  3. package/dist/api/index.d.ts +1 -1
  4. package/dist/api/index.js +1 -1
  5. package/dist/api/server.d.ts +5 -2
  6. package/dist/api/server.d.ts.map +1 -1
  7. package/dist/api/server.js +186 -149
  8. package/dist/api/server.js.map +1 -1
  9. package/dist/arbitration/index.d.ts +4 -4
  10. package/dist/arbitration/index.d.ts.map +1 -1
  11. package/dist/arbitration/index.js +46 -41
  12. package/dist/arbitration/index.js.map +1 -1
  13. package/dist/arbitration/types.d.ts +10 -10
  14. package/dist/arbitration/types.d.ts.map +1 -1
  15. package/dist/basis/evaluator.d.ts +1 -1
  16. package/dist/basis/evaluator.d.ts.map +1 -1
  17. package/dist/basis/evaluator.js +56 -54
  18. package/dist/basis/evaluator.js.map +1 -1
  19. package/dist/basis/index.d.ts +3 -3
  20. package/dist/basis/index.js +3 -3
  21. package/dist/basis/parser.d.ts +16 -16
  22. package/dist/basis/parser.d.ts.map +1 -1
  23. package/dist/basis/parser.js +32 -25
  24. package/dist/basis/parser.js.map +1 -1
  25. package/dist/basis/types.d.ts +2 -2
  26. package/dist/chain/index.d.ts.map +1 -1
  27. package/dist/chain/index.js +16 -16
  28. package/dist/chain/index.js.map +1 -1
  29. package/dist/cognigate/index.d.ts +1 -1
  30. package/dist/cognigate/index.d.ts.map +1 -1
  31. package/dist/cognigate/index.js +44 -33
  32. package/dist/cognigate/index.js.map +1 -1
  33. package/dist/common/adapters.d.ts +18 -11
  34. package/dist/common/adapters.d.ts.map +1 -1
  35. package/dist/common/adapters.js +100 -79
  36. package/dist/common/adapters.js.map +1 -1
  37. package/dist/common/config.d.ts +67 -67
  38. package/dist/common/config.js +49 -49
  39. package/dist/common/config.js.map +1 -1
  40. package/dist/common/index.d.ts +4 -4
  41. package/dist/common/index.js +4 -4
  42. package/dist/common/logger.d.ts +1 -1
  43. package/dist/common/logger.js +8 -8
  44. package/dist/common/types.d.ts +8 -8
  45. package/dist/common/types.js +5 -5
  46. package/dist/containment/index.d.ts +3 -3
  47. package/dist/containment/index.d.ts.map +1 -1
  48. package/dist/containment/index.js +119 -105
  49. package/dist/containment/index.js.map +1 -1
  50. package/dist/containment/types.d.ts +11 -11
  51. package/dist/containment/types.d.ts.map +1 -1
  52. package/dist/contracts/index.d.ts +9 -9
  53. package/dist/contracts/index.d.ts.map +1 -1
  54. package/dist/contracts/index.js +59 -54
  55. package/dist/contracts/index.js.map +1 -1
  56. package/dist/contracts/types.d.ts +12 -12
  57. package/dist/contracts/types.d.ts.map +1 -1
  58. package/dist/crewai/callback.d.ts +91 -0
  59. package/dist/crewai/callback.d.ts.map +1 -0
  60. package/dist/crewai/callback.js +271 -0
  61. package/dist/crewai/callback.js.map +1 -0
  62. package/dist/crewai/executor.d.ts +135 -0
  63. package/dist/crewai/executor.d.ts.map +1 -0
  64. package/dist/crewai/executor.js +381 -0
  65. package/dist/crewai/executor.js.map +1 -0
  66. package/dist/crewai/index.d.ts +12 -0
  67. package/dist/crewai/index.d.ts.map +1 -0
  68. package/dist/crewai/index.js +12 -0
  69. package/dist/crewai/index.js.map +1 -0
  70. package/dist/crewai/tools.d.ts +21 -0
  71. package/dist/crewai/tools.d.ts.map +1 -0
  72. package/dist/crewai/tools.js +164 -0
  73. package/dist/crewai/tools.js.map +1 -0
  74. package/dist/crewai/types.d.ts +139 -0
  75. package/dist/crewai/types.d.ts.map +1 -0
  76. package/dist/crewai/types.js +9 -0
  77. package/dist/crewai/types.js.map +1 -0
  78. package/dist/enforce/index.d.ts +48 -222
  79. package/dist/enforce/index.d.ts.map +1 -1
  80. package/dist/enforce/index.js +144 -47
  81. package/dist/enforce/index.js.map +1 -1
  82. package/dist/enforce/trust-aware-enforcement-service.d.ts +121 -0
  83. package/dist/enforce/trust-aware-enforcement-service.d.ts.map +1 -0
  84. package/dist/enforce/trust-aware-enforcement-service.js +601 -0
  85. package/dist/enforce/trust-aware-enforcement-service.js.map +1 -0
  86. package/dist/enforce/types.d.ts +234 -0
  87. package/dist/enforce/types.d.ts.map +1 -0
  88. package/dist/enforce/types.js +10 -0
  89. package/dist/enforce/types.js.map +1 -0
  90. package/dist/governance/fluid-workflow.d.ts +8 -8
  91. package/dist/governance/fluid-workflow.d.ts.map +1 -1
  92. package/dist/governance/fluid-workflow.js +114 -86
  93. package/dist/governance/fluid-workflow.js.map +1 -1
  94. package/dist/governance/index.d.ts +7 -7
  95. package/dist/governance/index.d.ts.map +1 -1
  96. package/dist/governance/index.js +81 -74
  97. package/dist/governance/index.js.map +1 -1
  98. package/dist/governance/proof-bridge.d.ts +6 -6
  99. package/dist/governance/proof-bridge.d.ts.map +1 -1
  100. package/dist/governance/proof-bridge.js +5 -5
  101. package/dist/governance/proof-bridge.js.map +1 -1
  102. package/dist/governance/types.d.ts +16 -9
  103. package/dist/governance/types.d.ts.map +1 -1
  104. package/dist/governance/types.js.map +1 -1
  105. package/dist/index.d.ts +29 -25
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +33 -23
  108. package/dist/index.js.map +1 -1
  109. package/dist/intent/index.d.ts +21 -56
  110. package/dist/intent/index.d.ts.map +1 -1
  111. package/dist/intent/index.js +58 -24
  112. package/dist/intent/index.js.map +1 -1
  113. package/dist/intent/persistent-intent-service.d.ts +68 -0
  114. package/dist/intent/persistent-intent-service.d.ts.map +1 -0
  115. package/dist/intent/persistent-intent-service.js +277 -0
  116. package/dist/intent/persistent-intent-service.js.map +1 -0
  117. package/dist/intent/types.d.ts +69 -0
  118. package/dist/intent/types.d.ts.map +1 -0
  119. package/dist/intent/types.js +10 -0
  120. package/dist/intent/types.js.map +1 -0
  121. package/dist/intent-gateway/index.d.ts +522 -0
  122. package/dist/intent-gateway/index.d.ts.map +1 -0
  123. package/dist/intent-gateway/index.js +1499 -0
  124. package/dist/intent-gateway/index.js.map +1 -0
  125. package/dist/langchain/callback.d.ts +2 -2
  126. package/dist/langchain/callback.d.ts.map +1 -1
  127. package/dist/langchain/callback.js +30 -30
  128. package/dist/langchain/callback.js.map +1 -1
  129. package/dist/langchain/executor.d.ts +4 -4
  130. package/dist/langchain/executor.d.ts.map +1 -1
  131. package/dist/langchain/executor.js +82 -80
  132. package/dist/langchain/executor.js.map +1 -1
  133. package/dist/langchain/index.d.ts +5 -5
  134. package/dist/langchain/index.js +5 -5
  135. package/dist/langchain/tools.d.ts +1 -1
  136. package/dist/langchain/tools.d.ts.map +1 -1
  137. package/dist/langchain/tools.js +33 -33
  138. package/dist/langchain/tools.js.map +1 -1
  139. package/dist/langchain/types.d.ts +3 -3
  140. package/dist/langchain/types.d.ts.map +1 -1
  141. package/dist/layers/implementations/L0-request-format.d.ts +37 -0
  142. package/dist/layers/implementations/L0-request-format.d.ts.map +1 -0
  143. package/dist/layers/implementations/L0-request-format.js +218 -0
  144. package/dist/layers/implementations/L0-request-format.js.map +1 -0
  145. package/dist/layers/implementations/L1-input-size.d.ts +36 -0
  146. package/dist/layers/implementations/L1-input-size.d.ts.map +1 -0
  147. package/dist/layers/implementations/L1-input-size.js +160 -0
  148. package/dist/layers/implementations/L1-input-size.js.map +1 -0
  149. package/dist/layers/implementations/L2-charset-sanitizer.d.ts +28 -0
  150. package/dist/layers/implementations/L2-charset-sanitizer.d.ts.map +1 -0
  151. package/dist/layers/implementations/L2-charset-sanitizer.js +230 -0
  152. package/dist/layers/implementations/L2-charset-sanitizer.js.map +1 -0
  153. package/dist/layers/implementations/L3-schema-conformance.d.ts +47 -0
  154. package/dist/layers/implementations/L3-schema-conformance.d.ts.map +1 -0
  155. package/dist/layers/implementations/L3-schema-conformance.js +267 -0
  156. package/dist/layers/implementations/L3-schema-conformance.js.map +1 -0
  157. package/dist/layers/implementations/L4-injection-detector.d.ts +47 -0
  158. package/dist/layers/implementations/L4-injection-detector.d.ts.map +1 -0
  159. package/dist/layers/implementations/L4-injection-detector.js +260 -0
  160. package/dist/layers/implementations/L4-injection-detector.js.map +1 -0
  161. package/dist/layers/implementations/L5-rate-limiter.d.ts +51 -0
  162. package/dist/layers/implementations/L5-rate-limiter.d.ts.map +1 -0
  163. package/dist/layers/implementations/L5-rate-limiter.js +183 -0
  164. package/dist/layers/implementations/L5-rate-limiter.js.map +1 -0
  165. package/dist/layers/implementations/index.d.ts +16 -0
  166. package/dist/layers/implementations/index.d.ts.map +1 -0
  167. package/dist/layers/implementations/index.js +16 -0
  168. package/dist/layers/implementations/index.js.map +1 -0
  169. package/dist/layers/index.d.ts +3 -3
  170. package/dist/layers/index.d.ts.map +1 -1
  171. package/dist/layers/index.js +99 -71
  172. package/dist/layers/index.js.map +1 -1
  173. package/dist/layers/types.d.ts +16 -16
  174. package/dist/layers/types.d.ts.map +1 -1
  175. package/dist/persistence/file.d.ts +3 -3
  176. package/dist/persistence/file.d.ts.map +1 -1
  177. package/dist/persistence/file.js +32 -28
  178. package/dist/persistence/file.js.map +1 -1
  179. package/dist/persistence/index.d.ts +7 -7
  180. package/dist/persistence/index.d.ts.map +1 -1
  181. package/dist/persistence/index.js +18 -18
  182. package/dist/persistence/index.js.map +1 -1
  183. package/dist/persistence/memory.d.ts +3 -3
  184. package/dist/persistence/memory.d.ts.map +1 -1
  185. package/dist/persistence/memory.js +10 -8
  186. package/dist/persistence/memory.js.map +1 -1
  187. package/dist/persistence/sqlite.d.ts +3 -3
  188. package/dist/persistence/sqlite.d.ts.map +1 -1
  189. package/dist/persistence/sqlite.js +36 -36
  190. package/dist/persistence/sqlite.js.map +1 -1
  191. package/dist/persistence/supabase.d.ts +3 -3
  192. package/dist/persistence/supabase.d.ts.map +1 -1
  193. package/dist/persistence/supabase.js +41 -43
  194. package/dist/persistence/supabase.js.map +1 -1
  195. package/dist/persistence/types.d.ts +5 -5
  196. package/dist/phase6/ceiling.d.ts +5 -5
  197. package/dist/phase6/ceiling.d.ts.map +1 -1
  198. package/dist/phase6/ceiling.js +67 -34
  199. package/dist/phase6/ceiling.js.map +1 -1
  200. package/dist/phase6/context.d.ts +3 -3
  201. package/dist/phase6/context.d.ts.map +1 -1
  202. package/dist/phase6/context.js +91 -45
  203. package/dist/phase6/context.js.map +1 -1
  204. package/dist/phase6/index.d.ts +13 -13
  205. package/dist/phase6/index.d.ts.map +1 -1
  206. package/dist/phase6/index.js +16 -16
  207. package/dist/phase6/index.js.map +1 -1
  208. package/dist/phase6/presets.d.ts +2 -2
  209. package/dist/phase6/presets.d.ts.map +1 -1
  210. package/dist/phase6/presets.js +39 -33
  211. package/dist/phase6/presets.js.map +1 -1
  212. package/dist/phase6/provenance.d.ts +4 -4
  213. package/dist/phase6/provenance.d.ts.map +1 -1
  214. package/dist/phase6/provenance.js +42 -35
  215. package/dist/phase6/provenance.js.map +1 -1
  216. package/dist/phase6/role-gates/index.d.ts +2 -2
  217. package/dist/phase6/role-gates/index.js +2 -2
  218. package/dist/phase6/role-gates/kernel.d.ts.map +1 -1
  219. package/dist/phase6/role-gates/kernel.js +16 -16
  220. package/dist/phase6/role-gates/kernel.js.map +1 -1
  221. package/dist/phase6/role-gates/policy.d.ts +2 -2
  222. package/dist/phase6/role-gates/policy.js +6 -6
  223. package/dist/phase6/role-gates.d.ts +4 -4
  224. package/dist/phase6/role-gates.d.ts.map +1 -1
  225. package/dist/phase6/role-gates.js +80 -58
  226. package/dist/phase6/role-gates.js.map +1 -1
  227. package/dist/phase6/types.d.ts +35 -35
  228. package/dist/phase6/types.d.ts.map +1 -1
  229. package/dist/phase6/types.js +166 -66
  230. package/dist/phase6/types.js.map +1 -1
  231. package/dist/phase6/weight-presets/canonical.d.ts +2 -2
  232. package/dist/phase6/weight-presets/canonical.d.ts.map +1 -1
  233. package/dist/phase6/weight-presets/canonical.js +12 -12
  234. package/dist/phase6/weight-presets/canonical.js.map +1 -1
  235. package/dist/phase6/weight-presets/deltas.d.ts +2 -2
  236. package/dist/phase6/weight-presets/deltas.d.ts.map +1 -1
  237. package/dist/phase6/weight-presets/deltas.js +27 -27
  238. package/dist/phase6/weight-presets/deltas.js.map +1 -1
  239. package/dist/phase6/weight-presets/index.d.ts +4 -4
  240. package/dist/phase6/weight-presets/index.js +4 -4
  241. package/dist/phase6/weight-presets/merger.d.ts +3 -3
  242. package/dist/phase6/weight-presets/merger.d.ts.map +1 -1
  243. package/dist/phase6/weight-presets/merger.js +40 -44
  244. package/dist/phase6/weight-presets/merger.js.map +1 -1
  245. package/dist/proof/index.d.ts +3 -3
  246. package/dist/proof/index.d.ts.map +1 -1
  247. package/dist/proof/index.js +44 -38
  248. package/dist/proof/index.js.map +1 -1
  249. package/dist/proof/merkle.d.ts +3 -3
  250. package/dist/proof/merkle.d.ts.map +1 -1
  251. package/dist/proof/merkle.js +26 -25
  252. package/dist/proof/merkle.js.map +1 -1
  253. package/dist/proof/zk-proofs.d.ts +6 -6
  254. package/dist/proof/zk-proofs.d.ts.map +1 -1
  255. package/dist/proof/zk-proofs.js +42 -43
  256. package/dist/proof/zk-proofs.js.map +1 -1
  257. package/dist/provenance/index.d.ts +3 -3
  258. package/dist/provenance/index.d.ts.map +1 -1
  259. package/dist/provenance/index.js +19 -17
  260. package/dist/provenance/index.js.map +1 -1
  261. package/dist/provenance/types.d.ts +4 -4
  262. package/dist/provenance/types.d.ts.map +1 -1
  263. package/dist/sandbox-training/challenges.d.ts +1 -1
  264. package/dist/sandbox-training/challenges.d.ts.map +1 -1
  265. package/dist/sandbox-training/challenges.js +228 -228
  266. package/dist/sandbox-training/challenges.js.map +1 -1
  267. package/dist/sandbox-training/graduation.d.ts +1 -1
  268. package/dist/sandbox-training/graduation.d.ts.map +1 -1
  269. package/dist/sandbox-training/graduation.js +14 -15
  270. package/dist/sandbox-training/graduation.js.map +1 -1
  271. package/dist/sandbox-training/index.d.ts +9 -9
  272. package/dist/sandbox-training/index.d.ts.map +1 -1
  273. package/dist/sandbox-training/index.js +6 -6
  274. package/dist/sandbox-training/index.js.map +1 -1
  275. package/dist/sandbox-training/promotion-service.d.ts +4 -4
  276. package/dist/sandbox-training/promotion-service.d.ts.map +1 -1
  277. package/dist/sandbox-training/promotion-service.js +5 -5
  278. package/dist/sandbox-training/promotion-service.js.map +1 -1
  279. package/dist/sandbox-training/runner.d.ts +1 -1
  280. package/dist/sandbox-training/runner.d.ts.map +1 -1
  281. package/dist/sandbox-training/runner.js +74 -73
  282. package/dist/sandbox-training/runner.js.map +1 -1
  283. package/dist/sandbox-training/scorer.d.ts +4 -4
  284. package/dist/sandbox-training/scorer.js +5 -5
  285. package/dist/sandbox-training/types.d.ts +4 -4
  286. package/dist/sandbox-training/types.d.ts.map +1 -1
  287. package/dist/sandbox-training/types.js +11 -7
  288. package/dist/sandbox-training/types.js.map +1 -1
  289. package/dist/trust-engine/ceiling-enforcement/audit.d.ts +1 -1
  290. package/dist/trust-engine/ceiling-enforcement/audit.d.ts.map +1 -1
  291. package/dist/trust-engine/ceiling-enforcement/audit.js +3 -4
  292. package/dist/trust-engine/ceiling-enforcement/audit.js.map +1 -1
  293. package/dist/trust-engine/ceiling-enforcement/index.d.ts +2 -2
  294. package/dist/trust-engine/ceiling-enforcement/index.js +2 -2
  295. package/dist/trust-engine/ceiling-enforcement/kernel.d.ts +1 -1
  296. package/dist/trust-engine/ceiling-enforcement/kernel.d.ts.map +1 -1
  297. package/dist/trust-engine/ceiling-enforcement/kernel.js +1 -1
  298. package/dist/trust-engine/context-policy/enforcement.d.ts.map +1 -1
  299. package/dist/trust-engine/context-policy/factory.d.ts +1 -1
  300. package/dist/trust-engine/context-policy/factory.d.ts.map +1 -1
  301. package/dist/trust-engine/context-policy/factory.js +1 -1
  302. package/dist/trust-engine/context-policy/factory.js.map +1 -1
  303. package/dist/trust-engine/context-policy/index.d.ts +2 -2
  304. package/dist/trust-engine/context-policy/index.js +2 -2
  305. package/dist/trust-engine/creation-modifiers/index.d.ts +1 -1
  306. package/dist/trust-engine/creation-modifiers/index.js +1 -1
  307. package/dist/trust-engine/creation-modifiers/types.d.ts.map +1 -1
  308. package/dist/trust-engine/creation-modifiers/types.js +2 -3
  309. package/dist/trust-engine/creation-modifiers/types.js.map +1 -1
  310. package/dist/trust-engine/decay-profiles.d.ts +1 -1
  311. package/dist/trust-engine/decay-profiles.d.ts.map +1 -1
  312. package/dist/trust-engine/decay-profiles.js +4 -4
  313. package/dist/trust-engine/decay-profiles.js.map +1 -1
  314. package/dist/trust-engine/index.d.ts +111 -45
  315. package/dist/trust-engine/index.d.ts.map +1 -1
  316. package/dist/trust-engine/index.js +418 -61
  317. package/dist/trust-engine/index.js.map +1 -1
  318. package/dist/trust-engine/phase6-types.d.ts +10 -10
  319. package/dist/trust-engine/phase6-types.d.ts.map +1 -1
  320. package/dist/trust-engine/phase6-types.js +25 -23
  321. package/dist/trust-engine/phase6-types.js.map +1 -1
  322. package/dist/trust-engine/types.d.ts +77 -0
  323. package/dist/trust-engine/types.d.ts.map +1 -0
  324. package/dist/trust-engine/types.js +20 -0
  325. package/dist/trust-engine/types.js.map +1 -0
  326. package/package.json +5 -4
@@ -5,19 +5,19 @@
5
5
  *
6
6
  * @packageDocumentation
7
7
  */
8
- import Fastify from 'fastify';
9
- import cors from '@fastify/cors';
10
- import helmet from '@fastify/helmet';
11
- import rateLimit from '@fastify/rate-limit';
12
- import { createLogger } from '../common/logger.js';
13
- import { getConfig } from '../common/config.js';
14
- import { createIntentService } from '../intent/index.js';
15
- import { createProofService } from '../proof/index.js';
16
- import { createTrustEngine } from '../trust-engine/index.js';
17
- import { createEvaluator } from '../basis/evaluator.js';
18
- import { createGovernanceEngine } from '../governance/index.js';
19
- import { GovernanceProofBridge } from '../governance/proof-bridge.js';
20
- const apiLogger = createLogger({ component: 'api' });
8
+ import Fastify from "fastify";
9
+ import cors from "@fastify/cors";
10
+ import helmet from "@fastify/helmet";
11
+ import rateLimit from "@fastify/rate-limit";
12
+ import { createLogger } from "../common/logger.js";
13
+ import { getConfig } from "../common/config.js";
14
+ import { PersistentIntentService } from "../intent/persistent-intent-service.js";
15
+ import { createProofService } from "../proof/index.js";
16
+ import { createTrustEngine } from "../trust-engine/index.js";
17
+ import { createEvaluator } from "../basis/evaluator.js";
18
+ import { createGovernanceEngine } from "../governance/index.js";
19
+ import { GovernanceProofBridge } from "../governance/proof-bridge.js";
20
+ const apiLogger = createLogger({ component: "api" });
21
21
  // ============================================================
22
22
  // Health Check Implementation
23
23
  // ============================================================
@@ -43,15 +43,15 @@ function checkSystemHealth(startTime) {
43
43
  const metrics = getSystemMetrics(startTime);
44
44
  // Warning threshold: 80% memory usage
45
45
  // Error threshold: 95% memory usage
46
- let status = 'ok';
47
- let message = 'System healthy';
46
+ let status = "ok";
47
+ let message = "System healthy";
48
48
  if (metrics.memoryUsagePercent > 95) {
49
- status = 'error';
50
- message = 'Critical memory pressure';
49
+ status = "error";
50
+ message = "Critical memory pressure";
51
51
  }
52
52
  else if (metrics.memoryUsagePercent > 80) {
53
- status = 'degraded';
54
- message = 'High memory usage';
53
+ status = "degraded";
54
+ message = "High memory usage";
55
55
  }
56
56
  return {
57
57
  status,
@@ -71,27 +71,27 @@ async function checkService(name, checkFn) {
71
71
  try {
72
72
  await checkFn();
73
73
  return {
74
- status: 'ok',
74
+ status: "ok",
75
75
  latencyMs: Date.now() - start,
76
76
  message: `${name} operational`,
77
77
  };
78
78
  }
79
79
  catch (error) {
80
80
  return {
81
- status: 'error',
81
+ status: "error",
82
82
  latencyMs: Date.now() - start,
83
- message: `${name} error: ${error instanceof Error ? error.message : 'Unknown error'}`,
83
+ message: `${name} error: ${error instanceof Error ? error.message : "Unknown error"}`,
84
84
  };
85
85
  }
86
86
  }
87
87
  /**
88
88
  * Create and configure the API server
89
89
  */
90
- export async function createServer() {
90
+ export async function createServer(deps) {
91
91
  const config = getConfig();
92
92
  const startTime = new Date();
93
93
  // Initialize services
94
- const intentService = createIntentService();
94
+ const intentService = deps?.intentService ?? new PersistentIntentService();
95
95
  const proofService = createProofService();
96
96
  const trustEngine = createTrustEngine();
97
97
  const evaluator = createEvaluator();
@@ -101,41 +101,45 @@ export async function createServer() {
101
101
  const proof = await proofService.create(req);
102
102
  return { id: proof.id };
103
103
  },
104
- tenantId: '__system__',
104
+ tenantId: "__system__",
105
105
  });
106
106
  // Use pino logger config for Fastify 5
107
- const isTest = process.env['NODE_ENV'] === 'test' || process.env['VITEST'];
107
+ const isTest = process.env["NODE_ENV"] === "test" || process.env["VITEST"];
108
108
  const server = Fastify({
109
- logger: isTest ? false : {
110
- level: config.env === 'production' ? 'info' : 'debug',
111
- transport: config.env !== 'production' ? {
112
- target: 'pino-pretty',
113
- options: { colorize: true },
114
- } : undefined,
115
- },
116
- requestIdHeader: 'x-request-id',
117
- requestIdLogLabel: 'requestId',
109
+ logger: isTest
110
+ ? false
111
+ : {
112
+ level: config.env === "production" ? "info" : "debug",
113
+ transport: config.env !== "production"
114
+ ? {
115
+ target: "pino-pretty",
116
+ options: { colorize: true },
117
+ }
118
+ : undefined,
119
+ },
120
+ requestIdHeader: "x-request-id",
121
+ requestIdLogLabel: "requestId",
118
122
  });
119
123
  // Register plugins
120
124
  await server.register(cors, {
121
- origin: config.env === 'production' ? false : true,
125
+ origin: config.env === "production" ? false : true,
122
126
  credentials: true,
123
127
  });
124
128
  await server.register(helmet, {
125
- contentSecurityPolicy: config.env === 'production',
129
+ contentSecurityPolicy: config.env === "production",
126
130
  });
127
131
  await server.register(rateLimit, {
128
132
  max: config.api.rateLimit,
129
- timeWindow: '1 minute',
133
+ timeWindow: "1 minute",
130
134
  });
131
135
  // API Key authentication for protected routes
132
- const API_KEY = process.env['VORION_API_KEY'] || config.api.apiKey;
136
+ const API_KEY = process.env["VORION_API_KEY"] || config.api.apiKey;
133
137
  const requiresAuth = (url) => {
134
138
  // Public endpoints that don't require auth
135
- const publicPaths = ['/health', '/ready', '/live', '/api/v1/health'];
136
- return !publicPaths.some(path => url === path || url.startsWith(path + '?'));
139
+ const publicPaths = ["/health", "/ready", "/live", "/api/v1/health"];
140
+ return !publicPaths.some((path) => url === path || url.startsWith(path + "?"));
137
141
  };
138
- server.addHook('onRequest', async (request, reply) => {
142
+ server.addHook("onRequest", async (request, reply) => {
139
143
  // Skip auth in test mode or for public endpoints
140
144
  if (isTest || !requiresAuth(request.url)) {
141
145
  return;
@@ -144,107 +148,113 @@ export async function createServer() {
144
148
  if (!API_KEY) {
145
149
  return;
146
150
  }
147
- const authHeader = request.headers['authorization'];
151
+ const authHeader = request.headers["authorization"];
148
152
  if (!authHeader) {
149
153
  return reply.status(401).send({
150
- error: { code: 'UNAUTHORIZED', message: 'Missing Authorization header' },
154
+ error: {
155
+ code: "UNAUTHORIZED",
156
+ message: "Missing Authorization header",
157
+ },
151
158
  });
152
159
  }
153
- const [scheme, token] = authHeader.split(' ');
154
- if (scheme?.toLowerCase() !== 'bearer' || token !== API_KEY) {
160
+ const [scheme, token] = authHeader.split(" ");
161
+ if (scheme?.toLowerCase() !== "bearer" || token !== API_KEY) {
155
162
  return reply.status(401).send({
156
- error: { code: 'UNAUTHORIZED', message: 'Invalid API key' },
163
+ error: { code: "UNAUTHORIZED", message: "Invalid API key" },
157
164
  });
158
165
  }
159
166
  });
160
167
  // Health check endpoint - performs actual checks on all services
161
- server.get('/health', async () => {
168
+ server.get("/health", async () => {
162
169
  const checks = {};
163
170
  // Check trust engine
164
- checks.trustEngine = await checkService('Trust engine', async () => {
165
- await trustEngine.getScore('__health_check__');
171
+ checks.trustEngine = await checkService("Trust engine", async () => {
172
+ await trustEngine.getScore("__health_check__");
166
173
  });
167
174
  // Check proof service
168
- checks.proofService = await checkService('Proof service', async () => {
169
- await proofService.get('__health_check_proof__');
175
+ checks.proofService = await checkService("Proof service", async () => {
176
+ await proofService.get("__health_check_proof__");
170
177
  });
171
178
  // Check intent service
172
- checks.intentService = await checkService('Intent service', async () => {
173
- await intentService.get('__health_check_intent__', '__system__');
179
+ checks.intentService = await checkService("Intent service", async () => {
180
+ await intentService.get("__health_check_intent__", "__system__");
174
181
  });
175
182
  // Check system health
176
183
  checks.system = checkSystemHealth(startTime);
177
184
  // Determine overall status
178
185
  const statuses = Object.values(checks).map((c) => c.status);
179
186
  let status;
180
- if (statuses.every((s) => s === 'ok')) {
181
- status = 'healthy';
187
+ if (statuses.every((s) => s === "ok")) {
188
+ status = "healthy";
182
189
  }
183
- else if (statuses.some((s) => s === 'error')) {
184
- status = 'unhealthy';
190
+ else if (statuses.some((s) => s === "error")) {
191
+ status = "unhealthy";
185
192
  }
186
193
  else {
187
- status = 'degraded';
194
+ status = "degraded";
188
195
  }
189
196
  return {
190
197
  status,
191
198
  timestamp: new Date().toISOString(),
192
- version: process.env['npm_package_version'],
199
+ version: process.env["npm_package_version"],
193
200
  environment: config.env,
194
201
  checks,
195
202
  metrics: getSystemMetrics(startTime),
196
203
  };
197
204
  });
198
205
  // Ready check endpoint - verifies all critical services are ready
199
- server.get('/ready', async (_request, reply) => {
206
+ server.get("/ready", async (_request, reply) => {
200
207
  const checks = {};
201
208
  // Check trust engine (critical)
202
- checks.trustEngine = await checkService('Trust engine', async () => {
203
- await trustEngine.getScore('__health_check__');
209
+ checks.trustEngine = await checkService("Trust engine", async () => {
210
+ await trustEngine.getScore("__health_check__");
204
211
  });
205
212
  // Check proof service (critical)
206
- checks.proofService = await checkService('Proof service', async () => {
207
- await proofService.get('__health_check_proof__');
213
+ checks.proofService = await checkService("Proof service", async () => {
214
+ await proofService.get("__health_check_proof__");
208
215
  });
209
216
  // Check intent service (critical)
210
- checks.intentService = await checkService('Intent service', async () => {
211
- await intentService.get('__health_check_intent__', '__system__');
217
+ checks.intentService = await checkService("Intent service", async () => {
218
+ await intentService.get("__health_check_intent__", "__system__");
212
219
  });
213
- const allPassed = Object.values(checks).every((c) => c.status === 'ok' || c.status === 'degraded');
220
+ const allPassed = Object.values(checks).every((c) => c.status === "ok" || c.status === "degraded");
214
221
  // Return 503 if not ready (for Kubernetes probes)
215
222
  if (!allPassed) {
216
223
  reply.status(503);
217
224
  }
218
225
  return {
219
- status: allPassed ? 'ready' : 'not_ready',
226
+ status: allPassed ? "ready" : "not_ready",
220
227
  timestamp: new Date().toISOString(),
221
228
  checks,
222
229
  allPassed,
223
230
  };
224
231
  });
225
232
  // Liveness probe endpoint - simple alive check (no deep checks)
226
- server.get('/live', async () => ({
227
- status: 'alive',
233
+ server.get("/live", async () => ({
234
+ status: "alive",
228
235
  timestamp: new Date().toISOString(),
229
236
  }));
230
237
  // API routes
231
238
  server.register(async (api) => {
232
239
  // SDK: Health check endpoint
233
- api.get('/health', async () => ({
234
- status: 'healthy',
235
- version: process.env['npm_package_version'] ?? '0.1.0',
240
+ api.get("/health", async () => ({
241
+ status: "healthy",
242
+ version: process.env["npm_package_version"] ?? "0.1.0",
236
243
  }));
237
244
  // Intent routes - unified handler for both legacy and SDK formats
238
- api.post('/intents', async (request, reply) => {
245
+ api.post("/intents", async (request, reply) => {
239
246
  const body = request.body;
240
247
  // Detect format: SDK format has 'agentId' and 'action', legacy has 'entityId' and 'goal'
241
- if ('agentId' in body && 'action' in body) {
248
+ if ("agentId" in body && "action" in body) {
242
249
  // SDK format
243
250
  const startTime = Date.now();
244
- const { agentId, capabilities = [], action } = body;
251
+ const { agentId, capabilities = [], action, } = body;
245
252
  if (!agentId || !action?.type || !action?.resource) {
246
253
  return reply.status(400).send({
247
- error: { code: 'INVALID_REQUEST', message: 'Missing required fields: agentId, action.type, action.resource' },
254
+ error: {
255
+ code: "INVALID_REQUEST",
256
+ message: "Missing required fields: agentId, action.type, action.resource",
257
+ },
248
258
  });
249
259
  }
250
260
  // Get or create agent trust record
@@ -254,10 +264,10 @@ export async function createServer() {
254
264
  trustRecord = await trustEngine.getScore(agentId);
255
265
  }
256
266
  // Check capability
257
- const hasCapability = capabilities.some(cap => cap === '*' ||
267
+ const hasCapability = capabilities.some((cap) => cap === "*" ||
258
268
  cap === action.type ||
259
269
  cap === `${action.type}:*` ||
260
- cap === `${action.type}:${action.resource.split('/')[0]}`);
270
+ cap === `${action.type}:${action.resource.split("/")[0]}`);
261
271
  // Determine decision
262
272
  const trustLevel = trustRecord?.level ?? 3;
263
273
  const trustScore = trustRecord?.score ?? 500;
@@ -265,13 +275,13 @@ export async function createServer() {
265
275
  // Decision tier based on trust level
266
276
  let tier;
267
277
  if (!allowed) {
268
- tier = 'RED';
278
+ tier = "RED";
269
279
  }
270
280
  else if (trustLevel >= 5) {
271
- tier = 'GREEN';
281
+ tier = "GREEN";
272
282
  }
273
283
  else {
274
- tier = 'YELLOW';
284
+ tier = "YELLOW";
275
285
  }
276
286
  // Create proof record
277
287
  const proofId = `proof-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
@@ -279,20 +289,20 @@ export async function createServer() {
279
289
  // Determine constraints based on tier
280
290
  const constraints = [];
281
291
  if (trustLevel <= 1) {
282
- constraints.push('rate_limit:10/min', 'audit:full', 'sandbox:true');
292
+ constraints.push("rate_limit:10/min", "audit:full", "sandbox:true");
283
293
  }
284
294
  else if (trustLevel <= 3) {
285
- constraints.push('rate_limit:100/min', 'audit:standard');
295
+ constraints.push("rate_limit:100/min", "audit:standard");
286
296
  }
287
297
  else if (trustLevel <= 5) {
288
- constraints.push('rate_limit:1000/min', 'audit:light');
298
+ constraints.push("rate_limit:1000/min", "audit:light");
289
299
  }
290
300
  const reason = allowed
291
- ? 'Action permitted based on capabilities and trust level'
301
+ ? "Action permitted based on capabilities and trust level"
292
302
  : hasCapability
293
303
  ? `Trust score ${trustScore} below minimum threshold (200)`
294
- : `Missing capability for ${action.type}:${action.resource.split('/')[0]}`;
295
- apiLogger.info({ intentId, agentId, action: action.type, allowed, tier }, 'Intent processed');
304
+ : `Missing capability for ${action.type}:${action.resource.split("/")[0]}`;
305
+ apiLogger.info({ intentId, agentId, action: action.type, allowed, tier }, "Intent processed");
296
306
  return {
297
307
  intentId,
298
308
  allowed,
@@ -308,7 +318,10 @@ export async function createServer() {
308
318
  const { entityId, goal, context, metadata } = body;
309
319
  if (!entityId || !goal) {
310
320
  return reply.status(400).send({
311
- error: { code: 'INVALID_REQUEST', message: 'Missing required fields: entityId, goal' },
321
+ error: {
322
+ code: "INVALID_REQUEST",
323
+ message: "Missing required fields: entityId, goal",
324
+ },
312
325
  });
313
326
  }
314
327
  const intent = await intentService.submit({
@@ -316,26 +329,29 @@ export async function createServer() {
316
329
  goal,
317
330
  context: context ?? {},
318
331
  metadata,
319
- }, { tenantId: '__system__' });
320
- apiLogger.info({ intentId: intent.id, entityId }, 'Intent submitted');
332
+ }, { tenantId: "__system__" });
333
+ apiLogger.info({ intentId: intent.id, entityId }, "Intent submitted");
321
334
  return reply.status(201).send({ intent });
322
335
  }
323
336
  });
324
- api.get('/intents/:id', async (request, reply) => {
325
- const intent = await intentService.get(request.params.id, '__system__');
337
+ api.get("/intents/:id", async (request, reply) => {
338
+ const intent = await intentService.get(request.params.id, "__system__");
326
339
  if (!intent) {
327
340
  return reply.status(404).send({
328
- error: { code: 'NOT_FOUND', message: 'Intent not found' },
341
+ error: { code: "NOT_FOUND", message: "Intent not found" },
329
342
  });
330
343
  }
331
344
  return { intent };
332
345
  });
333
346
  // SDK: Check intent (pre-flight, no side effects)
334
- api.post('/intents/check', async (request, reply) => {
347
+ api.post("/intents/check", async (request, reply) => {
335
348
  const { agentId, capabilities = [], action } = request.body;
336
349
  if (!agentId || !action?.type || !action?.resource) {
337
350
  return reply.status(400).send({
338
- error: { code: 'INVALID_REQUEST', message: 'Missing required fields' },
351
+ error: {
352
+ code: "INVALID_REQUEST",
353
+ message: "Missing required fields",
354
+ },
339
355
  });
340
356
  }
341
357
  // Get agent trust record
@@ -343,49 +359,49 @@ export async function createServer() {
343
359
  const trustScore = trustRecord?.score ?? 0;
344
360
  const trustLevel = trustRecord?.level ?? 0;
345
361
  // Check capability
346
- const hasCapability = capabilities.some(cap => cap === '*' ||
362
+ const hasCapability = capabilities.some((cap) => cap === "*" ||
347
363
  cap === action.type ||
348
364
  cap === `${action.type}:*` ||
349
- cap === `${action.type}:${action.resource.split('/')[0]}`);
365
+ cap === `${action.type}:${action.resource.split("/")[0]}`);
350
366
  const wouldAllow = hasCapability && trustScore >= 200;
351
367
  let tier;
352
368
  if (!wouldAllow) {
353
- tier = 'RED';
369
+ tier = "RED";
354
370
  }
355
371
  else if (trustLevel >= 5) {
356
- tier = 'GREEN';
372
+ tier = "GREEN";
357
373
  }
358
374
  else {
359
- tier = 'YELLOW';
375
+ tier = "YELLOW";
360
376
  }
361
377
  const reason = wouldAllow
362
- ? 'Action would be permitted'
378
+ ? "Action would be permitted"
363
379
  : hasCapability
364
380
  ? `Trust score ${trustScore} below minimum threshold`
365
381
  : `Missing capability for ${action.type}`;
366
382
  return { wouldAllow, tier, reason };
367
383
  });
368
384
  // Proof routes
369
- api.get('/proofs/:id', async (request, reply) => {
385
+ api.get("/proofs/:id", async (request, reply) => {
370
386
  const proof = await proofService.get(request.params.id);
371
387
  if (!proof) {
372
388
  return reply.status(404).send({
373
- error: { code: 'NOT_FOUND', message: 'Proof not found' },
389
+ error: { code: "NOT_FOUND", message: "Proof not found" },
374
390
  });
375
391
  }
376
392
  return { proof };
377
393
  });
378
- api.post('/proofs/:id/verify', async (request, reply) => {
394
+ api.post("/proofs/:id/verify", async (request, reply) => {
379
395
  const result = await proofService.verify(request.params.id);
380
396
  if (result.chainPosition === -1) {
381
397
  return reply.status(404).send({
382
- error: { code: 'NOT_FOUND', message: 'Proof not found' },
398
+ error: { code: "NOT_FOUND", message: "Proof not found" },
383
399
  });
384
400
  }
385
401
  return { verification: result };
386
402
  });
387
403
  // Trust routes
388
- api.get('/trust/:entityId', async (request) => {
404
+ api.get("/trust/:entityId", async (request) => {
389
405
  const record = await trustEngine.getScore(request.params.entityId);
390
406
  if (!record) {
391
407
  // Return null values for non-existent agents (SDK compatible)
@@ -394,7 +410,7 @@ export async function createServer() {
394
410
  score: null,
395
411
  tier: null,
396
412
  tierName: null,
397
- message: 'Agent not found',
413
+ message: "Agent not found",
398
414
  };
399
415
  }
400
416
  return {
@@ -406,11 +422,14 @@ export async function createServer() {
406
422
  };
407
423
  });
408
424
  // SDK: Admit agent endpoint
409
- api.post('/trust/admit', async (request, reply) => {
425
+ api.post("/trust/admit", async (request, reply) => {
410
426
  const { agentId, name, capabilities, observationTier } = request.body;
411
427
  if (!agentId || !name) {
412
428
  return reply.status(400).send({
413
- error: { code: 'INVALID_REQUEST', message: 'Missing required fields: agentId, name' },
429
+ error: {
430
+ code: "INVALID_REQUEST",
431
+ message: "Missing required fields: agentId, name",
432
+ },
414
433
  });
415
434
  }
416
435
  // Initialize agent in trust engine at T3 (Monitored)
@@ -418,31 +437,35 @@ export async function createServer() {
418
437
  await trustEngine.initializeEntity(agentId, initialLevel);
419
438
  const record = await trustEngine.getScore(agentId);
420
439
  const expiresAt = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(); // 1 year
421
- apiLogger.info({ agentId, name, initialLevel }, 'Agent admitted');
440
+ apiLogger.info({ agentId, name, initialLevel }, "Agent admitted");
422
441
  return reply.status(201).send({
423
442
  admitted: true,
424
443
  initialTier: record?.level ?? initialLevel,
425
444
  initialScore: record?.score ?? 500,
426
- observationCeiling: observationTier === 'WHITE_BOX' ? 7 : observationTier === 'GRAY_BOX' ? 5 : 3,
445
+ observationCeiling: observationTier === "WHITE_BOX"
446
+ ? 7
447
+ : observationTier === "GRAY_BOX"
448
+ ? 5
449
+ : 3,
427
450
  capabilities: capabilities ?? [],
428
451
  expiresAt,
429
452
  });
430
453
  });
431
454
  // SDK: Record trust signal
432
- api.post('/trust/:agentId/signal', async (request, reply) => {
455
+ api.post("/trust/:agentId/signal", async (request, reply) => {
433
456
  const { agentId } = request.params;
434
457
  const { type, source, weight = 0.1, context } = request.body;
435
458
  const recordBefore = await trustEngine.getScore(agentId);
436
459
  if (!recordBefore) {
437
460
  return reply.status(404).send({
438
- error: { code: 'NOT_FOUND', message: 'Agent not found' },
461
+ error: { code: "NOT_FOUND", message: "Agent not found" },
439
462
  });
440
463
  }
441
464
  const scoreBefore = recordBefore.score;
442
465
  // Map signal type to trust value
443
466
  const valueMap = {
444
- success: 0.8 + (weight * 0.2),
445
- failure: 0.2 - (weight * 0.1),
467
+ success: 0.8 + weight * 0.2,
468
+ failure: 0.2 - weight * 0.1,
446
469
  violation: 0.0,
447
470
  neutral: 0.5,
448
471
  };
@@ -464,18 +487,23 @@ export async function createServer() {
464
487
  scoreAfter,
465
488
  change: scoreAfter - scoreBefore,
466
489
  newTier: recordAfter?.level ?? null,
467
- newTierName: recordAfter ? trustEngine.getLevelName(recordAfter.level) : null,
490
+ newTierName: recordAfter
491
+ ? trustEngine.getLevelName(recordAfter.level)
492
+ : null,
468
493
  };
469
494
  });
470
495
  // ================================================================
471
496
  // Governance routes
472
497
  // ================================================================
473
498
  // Evaluate governance request (with proof chain)
474
- api.post('/governance/evaluate', async (request, reply) => {
499
+ api.post("/governance/evaluate", async (request, reply) => {
475
500
  const body = request.body;
476
501
  if (!body.requestId || !body.entityId || !body.action) {
477
502
  return reply.status(400).send({
478
- error: { code: 'INVALID_REQUEST', message: 'Missing required fields: requestId, entityId, action' },
503
+ error: {
504
+ code: "INVALID_REQUEST",
505
+ message: "Missing required fields: requestId, entityId, action",
506
+ },
479
507
  });
480
508
  }
481
509
  const startTime = Date.now();
@@ -485,7 +513,7 @@ export async function createServer() {
485
513
  entityId: body.entityId,
486
514
  decision: result.decision,
487
515
  proofId,
488
- }, 'Governance evaluation completed');
516
+ }, "Governance evaluation completed");
489
517
  return {
490
518
  result,
491
519
  proofId,
@@ -493,85 +521,96 @@ export async function createServer() {
493
521
  };
494
522
  });
495
523
  // Query governance rules
496
- api.get('/governance/rules', async (request) => {
524
+ api.get("/governance/rules", async (request) => {
497
525
  const rules = await governanceEngine.queryRules(request.query);
498
526
  return { rules, count: rules.length };
499
527
  });
500
528
  // Register governance rule
501
- api.post('/governance/rules', async (request, reply) => {
529
+ api.post("/governance/rules", async (request, reply) => {
502
530
  const rule = request.body;
503
531
  if (!rule.ruleId || !rule.name || !rule.condition || !rule.effect) {
504
532
  return reply.status(400).send({
505
- error: { code: 'INVALID_REQUEST', message: 'Missing required rule fields' },
533
+ error: {
534
+ code: "INVALID_REQUEST",
535
+ message: "Missing required rule fields",
536
+ },
506
537
  });
507
538
  }
508
539
  governanceEngine.registerRule(rule);
509
- apiLogger.info({ ruleId: rule.ruleId, name: rule.name }, 'Governance rule registered');
510
- return reply.status(201).send({ registered: true, ruleId: rule.ruleId });
540
+ apiLogger.info({ ruleId: rule.ruleId, name: rule.name }, "Governance rule registered");
541
+ return reply
542
+ .status(201)
543
+ .send({ registered: true, ruleId: rule.ruleId });
511
544
  });
512
545
  // ================================================================
513
546
  // Boot Camp routes
514
547
  // ================================================================
515
548
  // Run boot camp for an agent
516
- api.post('/agents/:agentId/bootcamp', async (request, reply) => {
549
+ api.post("/agents/:agentId/bootcamp", async (request, reply) => {
517
550
  const { agentId } = request.params;
518
551
  const { tenantId } = request.body;
519
552
  if (!tenantId) {
520
553
  return reply.status(400).send({
521
- error: { code: 'INVALID_REQUEST', message: 'Missing required field: tenantId' },
554
+ error: {
555
+ code: "INVALID_REQUEST",
556
+ message: "Missing required field: tenantId",
557
+ },
522
558
  });
523
559
  }
524
560
  // The agent must implement handleChallenge — for API usage,
525
561
  // this is a placeholder that indicates the boot camp needs
526
562
  // to be driven by the calling service with a real agent adapter.
527
563
  // For now, return the service configuration info.
528
- apiLogger.info({ agentId, tenantId }, 'Boot camp requested');
564
+ apiLogger.info({ agentId, tenantId }, "Boot camp requested");
529
565
  return reply.status(501).send({
530
566
  error: {
531
- code: 'NOT_IMPLEMENTED',
532
- message: 'Boot camp must be run programmatically via PromotionService. ' +
533
- 'Use the @vorionsys/atsf-core SDK to run boot camp with a BootCampAgent implementation.',
567
+ code: "NOT_IMPLEMENTED",
568
+ message: "Boot camp must be run programmatically via PromotionService. " +
569
+ "Use the @vorionsys/atsf-core SDK to run boot camp with a BootCampAgent implementation.",
534
570
  },
535
571
  hint: {
536
- sdk: '@vorionsys/atsf-core',
537
- import: 'PromotionService',
538
- usage: 'new PromotionService(trustEngine).runAndEvaluate(agent)',
572
+ sdk: "@vorionsys/atsf-core",
573
+ import: "PromotionService",
574
+ usage: "new PromotionService(trustEngine).runAndEvaluate(agent)",
539
575
  },
540
576
  });
541
577
  });
542
578
  // Constraint routes
543
- api.post('/constraints/validate', async (request, reply) => {
579
+ api.post("/constraints/validate", async (request, reply) => {
544
580
  const { entityId, intentType, context } = request.body;
545
581
  if (!entityId || !intentType) {
546
582
  return reply.status(400).send({
547
- error: { code: 'INVALID_REQUEST', message: 'Missing required fields' },
583
+ error: {
584
+ code: "INVALID_REQUEST",
585
+ message: "Missing required fields",
586
+ },
548
587
  });
549
588
  }
550
589
  // Get entity trust record
551
590
  const trustRecord = await trustEngine.getScore(entityId);
552
591
  if (!trustRecord) {
553
592
  return reply.status(404).send({
554
- error: { code: 'NOT_FOUND', message: 'Entity not found' },
593
+ error: { code: "NOT_FOUND", message: "Entity not found" },
555
594
  });
556
595
  }
557
596
  // Create evaluation context
558
597
  const evalContext = {
559
598
  intent: {
560
- id: 'validation-check',
599
+ id: "validation-check",
561
600
  type: intentType,
562
- goal: 'constraint-validation',
601
+ goal: "constraint-validation",
563
602
  context: context ?? {},
564
603
  },
565
604
  entity: {
566
605
  id: entityId,
567
- type: 'agent',
606
+ type: "agent",
568
607
  trustScore: trustRecord.score,
569
608
  trustLevel: trustRecord.level,
570
609
  attributes: {},
571
610
  },
572
611
  environment: {
573
612
  timestamp: new Date().toISOString(),
574
- timezone: 'UTC',
613
+ timezone: "UTC",
575
614
  requestId: request.id,
576
615
  },
577
616
  custom: {},
@@ -597,13 +636,11 @@ export async function createServer() {
597
636
  error: error.message,
598
637
  stack: error.stack,
599
638
  requestId: request.id,
600
- }, 'Request error');
639
+ }, "Request error");
601
640
  reply.status(error.statusCode ?? 500).send({
602
641
  error: {
603
- code: error.code ?? 'INTERNAL_ERROR',
604
- message: config.env === 'production'
605
- ? 'An error occurred'
606
- : error.message,
642
+ code: error.code ?? "INTERNAL_ERROR",
643
+ message: config.env === "production" ? "An error occurred" : error.message,
607
644
  },
608
645
  });
609
646
  });
@@ -624,10 +661,10 @@ export async function startServer() {
624
661
  port: config.api.port,
625
662
  host: config.api.host,
626
663
  environment: config.env,
627
- }, 'Server started');
664
+ }, "Server started");
628
665
  }
629
666
  catch (error) {
630
- apiLogger.error({ error }, 'Failed to start server');
667
+ apiLogger.error({ error }, "Failed to start server");
631
668
  process.exit(1);
632
669
  }
633
670
  }