@adonis-agora/agent 0.1.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 (314) hide show
  1. package/LICENSE +21 -0
  2. package/dist/configure.d.ts +18 -0
  3. package/dist/configure.d.ts.map +1 -0
  4. package/dist/configure.js +29 -0
  5. package/dist/configure.js.map +1 -0
  6. package/dist/providers/agent_provider.d.ts +25 -0
  7. package/dist/providers/agent_provider.d.ts.map +1 -0
  8. package/dist/providers/agent_provider.js +511 -0
  9. package/dist/providers/agent_provider.js.map +1 -0
  10. package/dist/src/actor-resolver.d.ts +41 -0
  11. package/dist/src/actor-resolver.d.ts.map +1 -0
  12. package/dist/src/agent-deps-factory.d.ts +59 -0
  13. package/dist/src/agent-deps-factory.d.ts.map +1 -0
  14. package/dist/src/agent-deps-factory.js +111 -0
  15. package/dist/src/agent-deps-factory.js.map +1 -0
  16. package/dist/src/agent-deps.d.ts +42 -0
  17. package/dist/src/agent-deps.d.ts.map +1 -0
  18. package/dist/src/agent-deps.js +5 -0
  19. package/dist/src/agent-deps.js.map +1 -0
  20. package/dist/src/agent-loop.d.ts +101 -0
  21. package/dist/src/agent-loop.d.ts.map +1 -0
  22. package/dist/src/agent-loop.js +396 -0
  23. package/dist/src/agent-loop.js.map +1 -0
  24. package/dist/src/agent-registry.d.ts +10 -0
  25. package/dist/src/agent-registry.d.ts.map +1 -0
  26. package/dist/src/agent-service.d.ts +50 -0
  27. package/dist/src/agent-service.d.ts.map +1 -0
  28. package/dist/src/agent-service.js +82 -0
  29. package/dist/src/agent-service.js.map +1 -0
  30. package/dist/src/ai-sdk/ai-sdk-model.d.ts +17 -0
  31. package/dist/src/ai-sdk/ai-sdk-model.d.ts.map +1 -0
  32. package/dist/src/ai-sdk/ai-sdk-model.js +263 -0
  33. package/dist/src/ai-sdk/ai-sdk-model.js.map +1 -0
  34. package/dist/src/ai-sdk/index.d.ts +2 -0
  35. package/dist/src/ai-sdk/index.d.ts.map +1 -0
  36. package/dist/src/ai-tool-ref.d.ts +79 -0
  37. package/dist/src/ai-tool-ref.d.ts.map +1 -0
  38. package/dist/src/ai-tool-ref.js +81 -0
  39. package/dist/src/ai-tool-ref.js.map +1 -0
  40. package/dist/src/authorizer.d.ts +18 -0
  41. package/dist/src/authorizer.d.ts.map +1 -0
  42. package/dist/src/authz/authz-tool-authorizer.d.ts +85 -0
  43. package/dist/src/authz/authz-tool-authorizer.d.ts.map +1 -0
  44. package/dist/src/authz/authz-tool-authorizer.js +63 -0
  45. package/dist/src/authz/authz-tool-authorizer.js.map +1 -0
  46. package/dist/src/authz/index.d.ts +3 -0
  47. package/dist/src/authz/index.d.ts.map +1 -0
  48. package/dist/src/authz/index.js +2 -0
  49. package/dist/src/authz/index.js.map +1 -0
  50. package/dist/src/data/data-tool.d.ts +64 -0
  51. package/dist/src/data/data-tool.d.ts.map +1 -0
  52. package/dist/src/data/data-tool.js +146 -0
  53. package/dist/src/data/data-tool.js.map +1 -0
  54. package/dist/src/data/index.d.ts +7 -0
  55. package/dist/src/data/index.d.ts.map +1 -0
  56. package/dist/src/data/index.js +7 -0
  57. package/dist/src/data/index.js.map +1 -0
  58. package/dist/src/data/limit.d.ts +12 -0
  59. package/dist/src/data/limit.d.ts.map +1 -0
  60. package/dist/src/data/limit.js +29 -0
  61. package/dist/src/data/limit.js.map +1 -0
  62. package/dist/src/data/parser.d.ts +27 -0
  63. package/dist/src/data/parser.d.ts.map +1 -0
  64. package/dist/src/data/parser.js +18 -0
  65. package/dist/src/data/parser.js.map +1 -0
  66. package/dist/src/data/sql-validator.d.ts +37 -0
  67. package/dist/src/data/sql-validator.d.ts.map +1 -0
  68. package/dist/src/data/sql-validator.js +92 -0
  69. package/dist/src/data/sql-validator.js.map +1 -0
  70. package/dist/src/data/table-access.d.ts +40 -0
  71. package/dist/src/data/table-access.d.ts.map +1 -0
  72. package/dist/src/data/table-access.js +41 -0
  73. package/dist/src/data/table-access.js.map +1 -0
  74. package/dist/src/data/tenant-scope.d.ts +39 -0
  75. package/dist/src/data/tenant-scope.d.ts.map +1 -0
  76. package/dist/src/data/tenant-scope.js +126 -0
  77. package/dist/src/data/tenant-scope.js.map +1 -0
  78. package/dist/src/define_config.d.ts +153 -0
  79. package/dist/src/define_config.d.ts.map +1 -0
  80. package/dist/src/define_config.js +7 -0
  81. package/dist/src/define_config.js.map +1 -0
  82. package/dist/src/diagnostics.d.ts +82 -0
  83. package/dist/src/diagnostics.d.ts.map +1 -0
  84. package/dist/src/diagnostics.js +50 -0
  85. package/dist/src/diagnostics.js.map +1 -0
  86. package/dist/src/durable/agent-run-context.d.ts +24 -0
  87. package/dist/src/durable/agent-run-context.d.ts.map +1 -0
  88. package/dist/src/durable/agent-run-context.js +17 -0
  89. package/dist/src/durable/agent-run-context.js.map +1 -0
  90. package/dist/src/durable/agent-run-workflow.d.ts +37 -0
  91. package/dist/src/durable/agent-run-workflow.d.ts.map +1 -0
  92. package/dist/src/durable/agent-run-workflow.js +128 -0
  93. package/dist/src/durable/agent-run-workflow.js.map +1 -0
  94. package/dist/src/durable/durable-agent-runner.d.ts +25 -0
  95. package/dist/src/durable/durable-agent-runner.d.ts.map +1 -0
  96. package/dist/src/durable/durable-agent-runner.js +59 -0
  97. package/dist/src/durable/durable-agent-runner.js.map +1 -0
  98. package/dist/src/durable/index.d.ts +17 -0
  99. package/dist/src/durable/index.d.ts.map +1 -0
  100. package/dist/src/durable/index.js +20 -0
  101. package/dist/src/durable/index.js.map +1 -0
  102. package/dist/src/index.d.ts +55 -0
  103. package/dist/src/index.d.ts.map +1 -0
  104. package/dist/src/index.js +45 -0
  105. package/dist/src/index.js.map +1 -0
  106. package/dist/src/personas.d.ts +7 -0
  107. package/dist/src/personas.d.ts.map +1 -0
  108. package/dist/src/rag/chunk.d.ts +14 -0
  109. package/dist/src/rag/chunk.d.ts.map +1 -0
  110. package/dist/src/rag/chunk.js +42 -0
  111. package/dist/src/rag/chunk.js.map +1 -0
  112. package/dist/src/rag/embedding-retriever.d.ts +15 -0
  113. package/dist/src/rag/embedding-retriever.d.ts.map +1 -0
  114. package/dist/src/rag/embedding-retriever.js +24 -0
  115. package/dist/src/rag/embedding-retriever.js.map +1 -0
  116. package/dist/src/rag/filter.d.ts +6 -0
  117. package/dist/src/rag/filter.d.ts.map +1 -0
  118. package/dist/src/rag/filter.js +11 -0
  119. package/dist/src/rag/filter.js.map +1 -0
  120. package/dist/src/rag/index.d.ts +8 -0
  121. package/dist/src/rag/index.d.ts.map +1 -0
  122. package/dist/src/rag/index.js +8 -0
  123. package/dist/src/rag/index.js.map +1 -0
  124. package/dist/src/rag/ingest.d.ts +33 -0
  125. package/dist/src/rag/ingest.d.ts.map +1 -0
  126. package/dist/src/rag/ingest.js +37 -0
  127. package/dist/src/rag/ingest.js.map +1 -0
  128. package/dist/src/rag/memory-vector-store.d.ts +16 -0
  129. package/dist/src/rag/memory-vector-store.d.ts.map +1 -0
  130. package/dist/src/rag/memory-vector-store.js +70 -0
  131. package/dist/src/rag/memory-vector-store.js.map +1 -0
  132. package/dist/src/rag/pg-vector-store.d.ts +84 -0
  133. package/dist/src/rag/pg-vector-store.d.ts.map +1 -0
  134. package/dist/src/rag/pg-vector-store.js +220 -0
  135. package/dist/src/rag/pg-vector-store.js.map +1 -0
  136. package/dist/src/rag/vector-store.d.ts +47 -0
  137. package/dist/src/rag/vector-store.d.ts.map +1 -0
  138. package/dist/src/rag/vector-store.js +5 -0
  139. package/dist/src/rag/vector-store.js.map +1 -0
  140. package/dist/src/rag-media/diagnostics.d.ts +43 -0
  141. package/dist/src/rag-media/diagnostics.d.ts.map +1 -0
  142. package/dist/src/rag-media/diagnostics.js +36 -0
  143. package/dist/src/rag-media/diagnostics.js.map +1 -0
  144. package/dist/src/rag-media/index.d.ts +5 -0
  145. package/dist/src/rag-media/index.d.ts.map +1 -0
  146. package/dist/src/rag-media/index.js +5 -0
  147. package/dist/src/rag-media/index.js.map +1 -0
  148. package/dist/src/rag-media/media-events.d.ts +23 -0
  149. package/dist/src/rag-media/media-events.d.ts.map +1 -0
  150. package/dist/src/rag-media/media-events.js +28 -0
  151. package/dist/src/rag-media/media-events.js.map +1 -0
  152. package/dist/src/rag-media/media-rag-ingestion.d.ts +155 -0
  153. package/dist/src/rag-media/media-rag-ingestion.d.ts.map +1 -0
  154. package/dist/src/rag-media/media-rag-ingestion.js +204 -0
  155. package/dist/src/rag-media/media-rag-ingestion.js.map +1 -0
  156. package/dist/src/rag-media/text-extractor.d.ts +46 -0
  157. package/dist/src/rag-media/text-extractor.d.ts.map +1 -0
  158. package/dist/src/rag-media/text-extractor.js +92 -0
  159. package/dist/src/rag-media/text-extractor.js.map +1 -0
  160. package/dist/src/redis-stream-client.d.ts +29 -0
  161. package/dist/src/redis-stream-client.d.ts.map +1 -0
  162. package/dist/src/redis-stream-client.js +2 -0
  163. package/dist/src/redis-stream-client.js.map +1 -0
  164. package/dist/src/redis-token-stream-sink.d.ts +36 -0
  165. package/dist/src/redis-token-stream-sink.d.ts.map +1 -0
  166. package/dist/src/redis-token-stream-sink.js +94 -0
  167. package/dist/src/redis-token-stream-sink.js.map +1 -0
  168. package/dist/src/runners/inline-agent-runner.d.ts +26 -0
  169. package/dist/src/runners/inline-agent-runner.d.ts.map +1 -0
  170. package/dist/src/runners/inline-agent-runner.js +85 -0
  171. package/dist/src/runners/inline-agent-runner.js.map +1 -0
  172. package/dist/src/spi/actor-directory.d.ts +23 -0
  173. package/dist/src/spi/actor-directory.d.ts.map +1 -0
  174. package/dist/src/spi/actor-directory.js +2 -0
  175. package/dist/src/spi/actor-directory.js.map +1 -0
  176. package/dist/src/spi/actor-resolver.d.ts +18 -0
  177. package/dist/src/spi/actor-resolver.d.ts.map +1 -0
  178. package/dist/src/spi/agent-runner.d.ts +20 -0
  179. package/dist/src/spi/agent-runner.d.ts.map +1 -0
  180. package/dist/src/spi/agent-store.d.ts +104 -0
  181. package/dist/src/spi/agent-store.d.ts.map +1 -0
  182. package/dist/src/spi/agent-store.js +2 -0
  183. package/dist/src/spi/agent-store.js.map +1 -0
  184. package/dist/src/spi/attachment-staging.d.ts +27 -0
  185. package/dist/src/spi/attachment-staging.d.ts.map +1 -0
  186. package/dist/src/spi/attachment-staging.js +2 -0
  187. package/dist/src/spi/attachment-staging.js.map +1 -0
  188. package/dist/src/spi/embedding-provider.d.ts +12 -0
  189. package/dist/src/spi/embedding-provider.d.ts.map +1 -0
  190. package/dist/src/spi/embedding-provider.js +2 -0
  191. package/dist/src/spi/embedding-provider.js.map +1 -0
  192. package/dist/src/spi/governance-queries.d.ts +215 -0
  193. package/dist/src/spi/governance-queries.d.ts.map +1 -0
  194. package/dist/src/spi/governance-queries.js +15 -0
  195. package/dist/src/spi/governance-queries.js.map +1 -0
  196. package/dist/src/spi/model-provider.d.ts +41 -0
  197. package/dist/src/spi/model-provider.d.ts.map +1 -0
  198. package/dist/src/spi/pricing-store.d.ts +45 -0
  199. package/dist/src/spi/pricing-store.d.ts.map +1 -0
  200. package/dist/src/spi/pricing-store.js +24 -0
  201. package/dist/src/spi/pricing-store.js.map +1 -0
  202. package/dist/src/spi/quota-store.d.ts +7 -0
  203. package/dist/src/spi/quota-store.d.ts.map +1 -0
  204. package/dist/src/spi/reranker.d.ts +17 -0
  205. package/dist/src/spi/reranker.d.ts.map +1 -0
  206. package/dist/src/spi/reranker.js +2 -0
  207. package/dist/src/spi/reranker.js.map +1 -0
  208. package/dist/src/spi/retriever.d.ts +28 -0
  209. package/dist/src/spi/retriever.d.ts.map +1 -0
  210. package/dist/src/spi/retriever.js +11 -0
  211. package/dist/src/spi/retriever.js.map +1 -0
  212. package/dist/src/spi/roles-policy.d.ts +11 -0
  213. package/dist/src/spi/roles-policy.d.ts.map +1 -0
  214. package/dist/src/spi/tool.d.ts +21 -0
  215. package/dist/src/spi/tool.d.ts.map +1 -0
  216. package/dist/src/stores/factory.d.ts +363 -0
  217. package/dist/src/stores/factory.d.ts.map +1 -0
  218. package/dist/src/stores/factory.js +341 -0
  219. package/dist/src/stores/factory.js.map +1 -0
  220. package/dist/src/stores/ledger-quota.d.ts +23 -0
  221. package/dist/src/stores/ledger-quota.d.ts.map +1 -0
  222. package/dist/src/stores/ledger-quota.js +32 -0
  223. package/dist/src/stores/ledger-quota.js.map +1 -0
  224. package/dist/src/stores/lucid-governance-queries.d.ts +73 -0
  225. package/dist/src/stores/lucid-governance-queries.d.ts.map +1 -0
  226. package/dist/src/stores/lucid-governance-queries.js +510 -0
  227. package/dist/src/stores/lucid-governance-queries.js.map +1 -0
  228. package/dist/src/stores/lucid-pricing.d.ts +20 -0
  229. package/dist/src/stores/lucid-pricing.d.ts.map +1 -0
  230. package/dist/src/stores/lucid-pricing.js +67 -0
  231. package/dist/src/stores/lucid-pricing.js.map +1 -0
  232. package/dist/src/stores/lucid-schema.d.ts +37 -0
  233. package/dist/src/stores/lucid-schema.d.ts.map +1 -0
  234. package/dist/src/stores/lucid-schema.js +139 -0
  235. package/dist/src/stores/lucid-schema.js.map +1 -0
  236. package/dist/src/stores/lucid.d.ts +73 -0
  237. package/dist/src/stores/lucid.d.ts.map +1 -0
  238. package/dist/src/stores/lucid.js +400 -0
  239. package/dist/src/stores/lucid.js.map +1 -0
  240. package/dist/src/telescope/dashboard.d.ts +21 -0
  241. package/dist/src/telescope/dashboard.d.ts.map +1 -0
  242. package/dist/src/telescope/dashboard.js +140 -0
  243. package/dist/src/telescope/dashboard.js.map +1 -0
  244. package/dist/src/telescope/data-providers.d.ts +39 -0
  245. package/dist/src/telescope/data-providers.d.ts.map +1 -0
  246. package/dist/src/telescope/data-providers.js +345 -0
  247. package/dist/src/telescope/data-providers.js.map +1 -0
  248. package/dist/src/telescope/extension.d.ts +27 -0
  249. package/dist/src/telescope/extension.d.ts.map +1 -0
  250. package/dist/src/telescope/extension.js +45 -0
  251. package/dist/src/telescope/extension.js.map +1 -0
  252. package/dist/src/telescope/index.d.ts +5 -0
  253. package/dist/src/telescope/index.d.ts.map +1 -0
  254. package/dist/src/telescope/index.js +4 -0
  255. package/dist/src/telescope/index.js.map +1 -0
  256. package/dist/src/telescope/telescope-sdk.d.ts +126 -0
  257. package/dist/src/telescope/telescope-sdk.d.ts.map +1 -0
  258. package/dist/src/telescope/telescope-sdk.js +15 -0
  259. package/dist/src/telescope/telescope-sdk.js.map +1 -0
  260. package/dist/src/testing/fake-embedding-provider.d.ts +37 -0
  261. package/dist/src/testing/fake-embedding-provider.d.ts.map +1 -0
  262. package/dist/src/testing/fake-embedding-provider.js +67 -0
  263. package/dist/src/testing/fake-embedding-provider.js.map +1 -0
  264. package/dist/src/testing/fake-media.d.ts +44 -0
  265. package/dist/src/testing/fake-media.d.ts.map +1 -0
  266. package/dist/src/testing/fake-media.js +69 -0
  267. package/dist/src/testing/fake-media.js.map +1 -0
  268. package/dist/src/testing/fake-model-provider.d.ts +29 -0
  269. package/dist/src/testing/fake-model-provider.d.ts.map +1 -0
  270. package/dist/src/testing/in-memory-actor-directory.d.ts +14 -0
  271. package/dist/src/testing/in-memory-actor-directory.d.ts.map +1 -0
  272. package/dist/src/testing/in-memory-actor-directory.js +27 -0
  273. package/dist/src/testing/in-memory-actor-directory.js.map +1 -0
  274. package/dist/src/testing/in-memory-attachment-staging.d.ts +22 -0
  275. package/dist/src/testing/in-memory-attachment-staging.d.ts.map +1 -0
  276. package/dist/src/testing/in-memory-attachment-staging.js +28 -0
  277. package/dist/src/testing/in-memory-attachment-staging.js.map +1 -0
  278. package/dist/src/testing/in-memory-governance-queries.d.ts +34 -0
  279. package/dist/src/testing/in-memory-governance-queries.d.ts.map +1 -0
  280. package/dist/src/testing/in-memory-governance-queries.js +373 -0
  281. package/dist/src/testing/in-memory-governance-queries.js.map +1 -0
  282. package/dist/src/testing/in-memory-pricing.d.ts +13 -0
  283. package/dist/src/testing/in-memory-pricing.d.ts.map +1 -0
  284. package/dist/src/testing/in-memory-pricing.js +27 -0
  285. package/dist/src/testing/in-memory-pricing.js.map +1 -0
  286. package/dist/src/testing/in-memory-quota.d.ts +11 -0
  287. package/dist/src/testing/in-memory-quota.d.ts.map +1 -0
  288. package/dist/src/testing/in-memory-sink.d.ts +14 -0
  289. package/dist/src/testing/in-memory-sink.d.ts.map +1 -0
  290. package/dist/src/testing/in-memory-store.d.ts +119 -0
  291. package/dist/src/testing/in-memory-store.d.ts.map +1 -0
  292. package/dist/src/testing/in-memory-store.js +317 -0
  293. package/dist/src/testing/in-memory-store.js.map +1 -0
  294. package/dist/src/testing/index.d.ts +11 -0
  295. package/dist/src/testing/index.d.ts.map +1 -0
  296. package/dist/src/testing/index.js +11 -0
  297. package/dist/src/testing/index.js.map +1 -0
  298. package/dist/src/tool-discovery.d.ts +35 -0
  299. package/dist/src/tool-discovery.d.ts.map +1 -0
  300. package/dist/src/tool-registry.d.ts +45 -0
  301. package/dist/src/tool-registry.d.ts.map +1 -0
  302. package/dist/src/tool-retry.d.ts +56 -0
  303. package/dist/src/tool-retry.d.ts.map +1 -0
  304. package/dist/src/tool-retry.js +95 -0
  305. package/dist/src/tool-retry.js.map +1 -0
  306. package/dist/src/types.d.ts +222 -0
  307. package/dist/src/types.d.ts.map +1 -0
  308. package/dist/src/types.js +2 -0
  309. package/dist/src/types.js.map +1 -0
  310. package/dist/stubs/config/agent.stub +55 -0
  311. package/dist/stubs/database/migrations/create_agent_rag_chunks.stub +41 -0
  312. package/dist/stubs/database/migrations/create_agent_run_tracking.stub +80 -0
  313. package/dist/stubs/database/migrations/create_agent_tables.stub +113 -0
  314. package/package.json +174 -0
@@ -0,0 +1,510 @@
1
+ import { estimateCost } from '../spi/pricing-store.js';
2
+ import { AGENT_TABLES } from './lucid-schema.js';
3
+ function toInt(value) {
4
+ if (typeof value === 'number')
5
+ return value;
6
+ if (typeof value === 'bigint')
7
+ return Number(value);
8
+ if (typeof value === 'string')
9
+ return Number.parseInt(value, 10) || 0;
10
+ return 0;
11
+ }
12
+ function toNumOrNull(value) {
13
+ if (value === null || value === undefined)
14
+ return null;
15
+ if (typeof value === 'number')
16
+ return value;
17
+ if (typeof value === 'bigint')
18
+ return Number(value);
19
+ if (typeof value === 'string') {
20
+ const parsed = Number.parseFloat(value);
21
+ return Number.isNaN(parsed) ? null : parsed;
22
+ }
23
+ return null;
24
+ }
25
+ /** Parse a TEXT JSON column back to a value; `undefined` for null/empty/malformed. */
26
+ function parseJsonCol(text) {
27
+ if (typeof text !== 'string' || text.length === 0)
28
+ return undefined;
29
+ try {
30
+ return JSON.parse(text);
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ /** Default page size + hard cap, mirroring the governance routes' clamp. */
37
+ function clampLimit(limit, fallback = 50) {
38
+ const value = limit !== undefined && Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : fallback;
39
+ return Math.min(value, 200);
40
+ }
41
+ /** Optional inclusive UTC-day bounds → epoch-ms; each side `undefined` when unbounded. */
42
+ function optionalDayBounds(range) {
43
+ return {
44
+ start: range?.from !== undefined ? Date.parse(`${range.from}T00:00:00.000Z`) : undefined,
45
+ end: range?.to !== undefined ? Date.parse(`${range.to}T23:59:59.999Z`) : undefined,
46
+ };
47
+ }
48
+ /** Map a raw `agent_run` Lucid row to the read-model {@link RunSummaryRow}. */
49
+ function runRowToSummary(row) {
50
+ const startedAt = toInt(row.started_at);
51
+ const finishedAtRaw = row.finished_at;
52
+ const finishedAt = finishedAtRaw === null || finishedAtRaw === undefined ? null : toInt(finishedAtRaw);
53
+ return {
54
+ runId: String(row.id),
55
+ threadId: String(row.thread_id),
56
+ actorRef: String(row.actor_ref),
57
+ tenantRef: row.tenant_ref === null || row.tenant_ref === undefined ? null : String(row.tenant_ref),
58
+ agentName: row.agent_name === null || row.agent_name === undefined ? null : String(row.agent_name),
59
+ status: String(row.status),
60
+ startedAt: new Date(startedAt).toISOString(),
61
+ finishedAt: finishedAt === null ? null : new Date(finishedAt).toISOString(),
62
+ durationMs: finishedAt === null ? null : finishedAt - startedAt,
63
+ stepCount: toInt(row.step_count),
64
+ inputTokens: toInt(row.input_tokens),
65
+ outputTokens: toInt(row.output_tokens),
66
+ costUsd: toNumOrNull(row.cost_usd),
67
+ error: row.error === null || row.error === undefined ? null : String(row.error),
68
+ durable: toInt(row.durable) !== 0,
69
+ };
70
+ }
71
+ /** Map a raw `agent_tool_call` Lucid row to the read-model {@link RunToolCallRow}. */
72
+ function toolCallRowToDetail(row) {
73
+ return {
74
+ toolCallId: String(row.id),
75
+ toolName: String(row.tool_name),
76
+ toolType: String(row.tool_type),
77
+ status: String(row.status),
78
+ input: parseJsonCol(row.input),
79
+ output: parseJsonCol(row.output),
80
+ error: row.error === null || row.error === undefined ? null : String(row.error),
81
+ executionMs: toNumOrNull(row.execution_ms),
82
+ createdAt: new Date(toInt(row.created_at)).toISOString(),
83
+ };
84
+ }
85
+ function rowToUsage(row) {
86
+ return {
87
+ modelId: String(row.model_id),
88
+ actorRef: String(row.actor_ref),
89
+ threadId: String(row.thread_id),
90
+ day: new Date(toInt(row.created_at)).toISOString().slice(0, 10),
91
+ inputTokens: toInt(row.input_tokens),
92
+ outputTokens: toInt(row.output_tokens),
93
+ cacheWriteTokens: toNumOrNull(row.cache_write_tokens),
94
+ cacheReadTokens: toNumOrNull(row.cache_read_tokens),
95
+ costUsd: toNumOrNull(row.cost_usd),
96
+ };
97
+ }
98
+ /**
99
+ * A production {@link AgentGovernanceQueries} — the read/analytics half of the store SPI — backed by
100
+ * AdonisJS **Lucid** (Knex) over the same five agent tables {@link import('./lucid.js').LucidAgentStore}
101
+ * writes. Like the store it touches only the structural {@link LucidDatabaseLike} slice, so
102
+ * `@adonisjs/lucid` stays an *optional peer* (the factory casts the real `db` in).
103
+ *
104
+ * Cost is the token ledger priced against the current prices from the injected {@link AgentPricingStore}
105
+ * (fetched once per query, exactly like the Drizzle/MikroORM references and the loop's cost fold), so a
106
+ * host that binds its own pricing store controls the cost every governance surface reports. A
107
+ * provider-reported `cost_usd` on a usage row always wins; an unpriced model contributes 0 cost (its
108
+ * tokens still count). Omit the pricing store entirely for a zero-cost read-model. Aggregation is
109
+ * in-process (like `quotaToday`) so UTC-day bucketing stays dialect-portable across SQLite/Postgres/MySQL
110
+ * — the behavioral twin of {@link import('../testing/in-memory-governance-queries.js').InMemoryGovernanceQueries}.
111
+ */
112
+ export class LucidGovernanceQueries {
113
+ db;
114
+ pricingStore;
115
+ constructor(db, pricingStore) {
116
+ this.db = db;
117
+ this.pricingStore = pricingStore;
118
+ }
119
+ async loadPricing() {
120
+ const pricing = new Map();
121
+ if (this.pricingStore === undefined)
122
+ return pricing;
123
+ for (const price of await this.pricingStore.listCurrentPrices()) {
124
+ pricing.set(price.modelId, price);
125
+ }
126
+ return pricing;
127
+ }
128
+ /** Provider-reported cost wins per row; otherwise the cache-aware token estimate (0 when unpriced). */
129
+ rowCost(row, pricing) {
130
+ if (row.costUsd !== null)
131
+ return row.costUsd;
132
+ const price = pricing.get(row.modelId);
133
+ if (price === undefined)
134
+ return 0;
135
+ return estimateCost({
136
+ inputTokens: row.inputTokens,
137
+ outputTokens: row.outputTokens,
138
+ ...(row.cacheWriteTokens !== null ? { cacheWriteTokens: row.cacheWriteTokens } : {}),
139
+ ...(row.cacheReadTokens !== null ? { cacheReadTokens: row.cacheReadTokens } : {}),
140
+ }, price);
141
+ }
142
+ /** The usage ledger rows whose `created_at` falls inside the inclusive UTC-day range. */
143
+ async usageInRange(range) {
144
+ const start = Date.parse(`${range.fromDay}T00:00:00.000Z`);
145
+ const end = Date.parse(`${range.toDay}T23:59:59.999Z`);
146
+ const rows = await this.db
147
+ .from(AGENT_TABLES.tokenUsage)
148
+ .where('created_at', '>=', start)
149
+ .where('created_at', '<=', end)
150
+ .select('*');
151
+ return rows.map(rowToUsage);
152
+ }
153
+ async spendByModel(range) {
154
+ const pricing = await this.loadPricing();
155
+ const byModel = new Map();
156
+ for (const row of await this.usageInRange(range)) {
157
+ const bucket = byModel.get(row.modelId) ?? {
158
+ requests: 0,
159
+ inputTokens: 0,
160
+ outputTokens: 0,
161
+ costUsd: 0,
162
+ };
163
+ bucket.requests += 1;
164
+ bucket.inputTokens += row.inputTokens;
165
+ bucket.outputTokens += row.outputTokens;
166
+ bucket.costUsd += this.rowCost(row, pricing);
167
+ byModel.set(row.modelId, bucket);
168
+ }
169
+ const result = [];
170
+ for (const [modelId, bucket] of byModel) {
171
+ result.push({ modelId, ...bucket });
172
+ }
173
+ result.sort((left, right) => right.costUsd - left.costUsd || left.modelId.localeCompare(right.modelId));
174
+ return result;
175
+ }
176
+ async spendByActor(range) {
177
+ const pricing = await this.loadPricing();
178
+ const byActor = new Map();
179
+ for (const row of await this.usageInRange(range)) {
180
+ const bucket = byActor.get(row.actorRef) ?? { requests: 0, totalTokens: 0, costUsd: 0 };
181
+ bucket.requests += 1;
182
+ bucket.totalTokens += row.inputTokens + row.outputTokens;
183
+ bucket.costUsd += this.rowCost(row, pricing);
184
+ byActor.set(row.actorRef, bucket);
185
+ }
186
+ const result = [];
187
+ for (const [actorRef, bucket] of byActor) {
188
+ result.push({ actorRef, ...bucket });
189
+ }
190
+ result.sort((left, right) => right.costUsd - left.costUsd || left.actorRef.localeCompare(right.actorRef));
191
+ return result;
192
+ }
193
+ async usageTrend(range) {
194
+ const pricing = await this.loadPricing();
195
+ const byDay = new Map();
196
+ for (const row of await this.usageInRange(range)) {
197
+ const bucket = byDay.get(row.day) ?? { totalTokens: 0, costUsd: 0 };
198
+ bucket.totalTokens += row.inputTokens + row.outputTokens;
199
+ bucket.costUsd += this.rowCost(row, pricing);
200
+ byDay.set(row.day, bucket);
201
+ }
202
+ const result = [];
203
+ for (const [day, bucket] of byDay) {
204
+ result.push({ day, totalTokens: bucket.totalTokens, costUsd: bucket.costUsd });
205
+ }
206
+ result.sort((left, right) => left.day.localeCompare(right.day));
207
+ return result;
208
+ }
209
+ /**
210
+ * Newest-first recent tool calls, capped at `limit`. Resolves each call's `threadId` through its
211
+ * owning message (the structural query slice has no `join`, so it's one lookup per call — bounded by
212
+ * `limit`, mirroring the reference adapters' N+1 for the recent feeds).
213
+ */
214
+ async recentToolCalls(limit) {
215
+ const calls = await this.db
216
+ .from(AGENT_TABLES.toolCalls)
217
+ .orderBy('created_at', 'desc')
218
+ .limit(limit)
219
+ .select('*');
220
+ const result = [];
221
+ for (const call of calls) {
222
+ const message = await this.db
223
+ .from(AGENT_TABLES.messages)
224
+ .where('id', String(call.message_id))
225
+ .first();
226
+ result.push({
227
+ toolCallId: String(call.id),
228
+ toolName: String(call.tool_name),
229
+ toolType: String(call.tool_type),
230
+ status: String(call.status),
231
+ threadId: message === null || message === undefined ? '' : String(message.thread_id),
232
+ createdAt: new Date(toInt(call.created_at)).toISOString(),
233
+ });
234
+ }
235
+ return result;
236
+ }
237
+ /**
238
+ * Newest-first recent threads (soft-deleted excluded, mirroring `listThreads`/the reference), each
239
+ * with its message count and rolled-up token total, capped at `limit`.
240
+ */
241
+ async recentThreads(limit) {
242
+ const threads = await this.db
243
+ .from(AGENT_TABLES.threads)
244
+ .whereNull('deleted_at')
245
+ .orderBy('updated_at', 'desc')
246
+ .limit(limit)
247
+ .select('*');
248
+ const result = [];
249
+ for (const thread of threads) {
250
+ const threadId = String(thread.id);
251
+ const messages = await this.db
252
+ .from(AGENT_TABLES.messages)
253
+ .where('thread_id', threadId)
254
+ .select('id');
255
+ const usageRows = await this.db
256
+ .from(AGENT_TABLES.tokenUsage)
257
+ .where('thread_id', threadId)
258
+ .select('input_tokens', 'output_tokens');
259
+ const totalTokens = usageRows.reduce((sum, row) => sum + toInt(row.input_tokens) + toInt(row.output_tokens), 0);
260
+ result.push({
261
+ threadId,
262
+ title: String(thread.title),
263
+ actorRef: String(thread.actor_ref),
264
+ messageCount: messages.length,
265
+ totalTokens,
266
+ lastActivityAt: new Date(toInt(thread.updated_at)).toISOString(),
267
+ });
268
+ }
269
+ return result;
270
+ }
271
+ // ── Run lifecycle read-model ───────────────────────────────────────────────
272
+ /**
273
+ * Filterable, cursor-paginated run list, newest-first (`started_at` desc, then `id` desc for a
274
+ * stable tiebreak). The cursor is an opaque offset (over the SAME filter set); a page fetches
275
+ * `limit + 1` rows to learn whether a next page exists. A store without recorded runs yields an
276
+ * empty page.
277
+ */
278
+ async listRuns(filter = {}) {
279
+ const limit = clampLimit(filter.limit);
280
+ const offset = (() => {
281
+ const parsed = filter.cursor !== undefined ? Number.parseInt(filter.cursor, 10) : 0;
282
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
283
+ })();
284
+ let query = this.db.from(AGENT_TABLES.runs);
285
+ if (filter.actor !== undefined)
286
+ query = query.where('actor_ref', filter.actor);
287
+ if (filter.agent !== undefined)
288
+ query = query.where('agent_name', filter.agent);
289
+ if (filter.status !== undefined)
290
+ query = query.where('status', filter.status);
291
+ if (filter.from !== undefined) {
292
+ query = query.where('started_at', '>=', Date.parse(`${filter.from}T00:00:00.000Z`));
293
+ }
294
+ if (filter.to !== undefined) {
295
+ query = query.where('started_at', '<=', Date.parse(`${filter.to}T23:59:59.999Z`));
296
+ }
297
+ const rows = await query
298
+ .orderBy('started_at', 'desc')
299
+ .orderBy('id', 'desc')
300
+ .limit(limit + 1)
301
+ .offset(offset)
302
+ .select('*');
303
+ const hasMore = rows.length > limit;
304
+ const page = hasMore ? rows.slice(0, limit) : rows;
305
+ return {
306
+ runs: page.map(runRowToSummary),
307
+ nextCursor: hasMore ? String(offset + limit) : null,
308
+ };
309
+ }
310
+ /**
311
+ * The full trace of one run: the run row plus every message / tool call / usage row stamped with
312
+ * its `run_id` (oldest first), and the subset of tool calls still `pending_approval`. `null` when
313
+ * the run is unknown.
314
+ */
315
+ async runDetail(runId) {
316
+ const runRow = await this.db.from(AGENT_TABLES.runs).where('id', runId).first();
317
+ if (runRow === null || runRow === undefined)
318
+ return null;
319
+ const messageRows = await this.db
320
+ .from(AGENT_TABLES.messages)
321
+ .where('run_id', runId)
322
+ .orderBy('created_at', 'asc')
323
+ .select('*');
324
+ const toolCallRows = await this.db
325
+ .from(AGENT_TABLES.toolCalls)
326
+ .where('run_id', runId)
327
+ .orderBy('created_at', 'asc')
328
+ .select('*');
329
+ const usageRows = await this.db
330
+ .from(AGENT_TABLES.tokenUsage)
331
+ .where('run_id', runId)
332
+ .orderBy('created_at', 'asc')
333
+ .select('*');
334
+ const messages = messageRows.map((row) => ({
335
+ id: String(row.id),
336
+ role: String(row.role),
337
+ content: String(row.content),
338
+ createdAt: new Date(toInt(row.created_at)).toISOString(),
339
+ }));
340
+ const toolCalls = toolCallRows.map(toolCallRowToDetail);
341
+ const usage = usageRows.map((row) => ({
342
+ modelId: String(row.model_id),
343
+ purpose: String(row.purpose),
344
+ inputTokens: toInt(row.input_tokens),
345
+ outputTokens: toInt(row.output_tokens),
346
+ costUsd: toNumOrNull(row.cost_usd),
347
+ createdAt: new Date(toInt(row.created_at)).toISOString(),
348
+ }));
349
+ return {
350
+ run: runRowToSummary(runRow),
351
+ messages,
352
+ toolCalls,
353
+ approvals: toolCalls.filter((call) => call.status === 'pending_approval'),
354
+ usage,
355
+ };
356
+ }
357
+ /**
358
+ * Tool calls sitting `pending_approval`, oldest first (an inbox drains from the back). Each call's
359
+ * owning actor is resolved through its run (`run_id → agent_run.actor_ref`), falling back to its
360
+ * thread (`message → agent_thread.actor_ref`) for a call recorded before run tracking. The `actor`
361
+ * filter is applied after resolution; `limit` caps the returned inbox.
362
+ */
363
+ async pendingApprovals(filter = {}) {
364
+ const limit = clampLimit(filter.limit);
365
+ const calls = await this.db
366
+ .from(AGENT_TABLES.toolCalls)
367
+ .where('status', 'pending_approval')
368
+ .orderBy('created_at', 'asc')
369
+ .select('*');
370
+ const result = [];
371
+ for (const call of calls) {
372
+ const message = await this.db
373
+ .from(AGENT_TABLES.messages)
374
+ .where('id', String(call.message_id))
375
+ .first();
376
+ const threadId = message === null || message === undefined ? '' : String(message.thread_id);
377
+ const runId = call.run_id !== null && call.run_id !== undefined
378
+ ? String(call.run_id)
379
+ : message?.run_id !== null && message?.run_id !== undefined
380
+ ? String(message.run_id)
381
+ : null;
382
+ let actorRef = '';
383
+ if (runId !== null) {
384
+ const run = await this.db.from(AGENT_TABLES.runs).where('id', runId).first();
385
+ if (run !== null && run !== undefined)
386
+ actorRef = String(run.actor_ref);
387
+ }
388
+ if (actorRef === '' && threadId !== '') {
389
+ const thread = await this.db.from(AGENT_TABLES.threads).where('id', threadId).first();
390
+ if (thread !== null && thread !== undefined)
391
+ actorRef = String(thread.actor_ref);
392
+ }
393
+ if (filter.actor !== undefined && actorRef !== filter.actor)
394
+ continue;
395
+ result.push({
396
+ toolCallId: String(call.id),
397
+ toolName: String(call.tool_name),
398
+ input: parseJsonCol(call.input),
399
+ threadId,
400
+ runId,
401
+ actorRef,
402
+ requestedAt: new Date(toInt(call.created_at)).toISOString(),
403
+ });
404
+ if (result.length >= limit)
405
+ break;
406
+ }
407
+ return result;
408
+ }
409
+ /**
410
+ * Per-tool call/failure/rejection/latency rollup over the (optional) range, highest call count
411
+ * first. `avgDurationMs` is the mean `execution_ms` across calls that recorded one; `null` when
412
+ * none did.
413
+ */
414
+ async perToolStats(range = {}) {
415
+ const { start, end } = optionalDayBounds(range);
416
+ let query = this.db.from(AGENT_TABLES.toolCalls);
417
+ if (start !== undefined)
418
+ query = query.where('created_at', '>=', start);
419
+ if (end !== undefined)
420
+ query = query.where('created_at', '<=', end);
421
+ const calls = await query.select('*');
422
+ const byTool = new Map();
423
+ for (const call of calls) {
424
+ const toolName = String(call.tool_name);
425
+ const toolType = String(call.tool_type);
426
+ const key = `${toolName}${toolType}`;
427
+ const bucket = byTool.get(key) ?? {
428
+ toolName,
429
+ toolType,
430
+ calls: 0,
431
+ failed: 0,
432
+ rejected: 0,
433
+ durationSum: 0,
434
+ durationCount: 0,
435
+ };
436
+ bucket.calls += 1;
437
+ if (String(call.status) === 'failed')
438
+ bucket.failed += 1;
439
+ if (String(call.status) === 'rejected')
440
+ bucket.rejected += 1;
441
+ const execMs = toNumOrNull(call.execution_ms);
442
+ if (execMs !== null) {
443
+ bucket.durationSum += execMs;
444
+ bucket.durationCount += 1;
445
+ }
446
+ byTool.set(key, bucket);
447
+ }
448
+ const result = [];
449
+ for (const bucket of byTool.values()) {
450
+ result.push({
451
+ toolName: bucket.toolName,
452
+ toolType: bucket.toolType,
453
+ calls: bucket.calls,
454
+ failed: bucket.failed,
455
+ rejected: bucket.rejected,
456
+ avgDurationMs: bucket.durationCount === 0 ? null : bucket.durationSum / bucket.durationCount,
457
+ });
458
+ }
459
+ result.sort((left, right) => right.calls - left.calls || left.toolName.localeCompare(right.toolName));
460
+ return result;
461
+ }
462
+ /**
463
+ * Success / failure / cancel rates + mean settled-run duration over the (optional) range, bucketed
464
+ * on `started_at`. A store without recorded runs yields all zeros / `null` duration.
465
+ */
466
+ async runReliability(range = {}) {
467
+ const { start, end } = optionalDayBounds(range);
468
+ let query = this.db.from(AGENT_TABLES.runs);
469
+ if (start !== undefined)
470
+ query = query.where('started_at', '>=', start);
471
+ if (end !== undefined)
472
+ query = query.where('started_at', '<=', end);
473
+ const runs = await query.select('*');
474
+ let completed = 0;
475
+ let failed = 0;
476
+ let cancelled = 0;
477
+ let running = 0;
478
+ let durationSum = 0;
479
+ let durationCount = 0;
480
+ for (const run of runs) {
481
+ const status = String(run.status);
482
+ if (status === 'completed')
483
+ completed += 1;
484
+ else if (status === 'failed')
485
+ failed += 1;
486
+ else if (status === 'cancelled')
487
+ cancelled += 1;
488
+ else
489
+ running += 1;
490
+ const finishedAt = run.finished_at;
491
+ if (status !== 'running' && finishedAt !== null && finishedAt !== undefined) {
492
+ durationSum += toInt(finishedAt) - toInt(run.started_at);
493
+ durationCount += 1;
494
+ }
495
+ }
496
+ const total = runs.length;
497
+ return {
498
+ runs: total,
499
+ completed,
500
+ failed,
501
+ cancelled,
502
+ running,
503
+ successRate: total === 0 ? 0 : completed / total,
504
+ failureRate: total === 0 ? 0 : failed / total,
505
+ cancelRate: total === 0 ? 0 : cancelled / total,
506
+ avgDurationMs: durationCount === 0 ? null : durationSum / durationCount,
507
+ };
508
+ }
509
+ }
510
+ //# sourceMappingURL=lucid-governance-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucid-governance-queries.js","sourceRoot":"","sources":["../../../src/stores/lucid-governance-queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { AgentPricingStore, CurrentModelPrice, ModelPriceInput } from '../spi/pricing-store.js';
2
+ import type { LucidDatabaseLike } from './lucid.js';
3
+ /**
4
+ * A production {@link AgentPricingStore} backed by AdonisJS **Lucid** (Knex) over the
5
+ * `agent_model_pricing` table — the write side the loop's cost fold prices token usage against. Like
6
+ * {@link import('./lucid.js').LucidAgentStore} it touches only the structural {@link LucidDatabaseLike}
7
+ * slice, so `@adonisjs/lucid` stays an optional peer (the factory casts the real `db` in).
8
+ *
9
+ * Atomic supersede (mirrors the reference Drizzle/MikroORM stores): `upsertModelPrice` retires the
10
+ * model's prior `is_current` row and inserts a fresh current one, so exactly one live price exists
11
+ * per model. `effective_from` is stored as epoch-ms (matching the rest of the schema) and read back
12
+ * as an ISO string. Booleans are `INTEGER` 0/1 for cross-dialect portability.
13
+ */
14
+ export declare class LucidPricingStore implements AgentPricingStore {
15
+ private readonly db;
16
+ constructor(db: LucidDatabaseLike);
17
+ upsertModelPrice(input: ModelPriceInput): Promise<void>;
18
+ listCurrentPrices(): Promise<CurrentModelPrice[]>;
19
+ }
20
+ //# sourceMappingURL=lucid-pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucid-pricing.d.ts","sourceRoot":"","sources":["../../../src/stores/lucid-pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpD;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,iBAAiB;IAE5C,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBvD,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAmBxD"}
@@ -0,0 +1,67 @@
1
+ import { AGENT_TABLES } from './lucid-schema.js';
2
+ function toNum(value) {
3
+ if (typeof value === 'number')
4
+ return value;
5
+ if (typeof value === 'bigint')
6
+ return Number(value);
7
+ if (typeof value === 'string')
8
+ return Number.parseFloat(value) || 0;
9
+ return 0;
10
+ }
11
+ /**
12
+ * A production {@link AgentPricingStore} backed by AdonisJS **Lucid** (Knex) over the
13
+ * `agent_model_pricing` table — the write side the loop's cost fold prices token usage against. Like
14
+ * {@link import('./lucid.js').LucidAgentStore} it touches only the structural {@link LucidDatabaseLike}
15
+ * slice, so `@adonisjs/lucid` stays an optional peer (the factory casts the real `db` in).
16
+ *
17
+ * Atomic supersede (mirrors the reference Drizzle/MikroORM stores): `upsertModelPrice` retires the
18
+ * model's prior `is_current` row and inserts a fresh current one, so exactly one live price exists
19
+ * per model. `effective_from` is stored as epoch-ms (matching the rest of the schema) and read back
20
+ * as an ISO string. Booleans are `INTEGER` 0/1 for cross-dialect portability.
21
+ */
22
+ export class LucidPricingStore {
23
+ db;
24
+ constructor(db) {
25
+ this.db = db;
26
+ }
27
+ async upsertModelPrice(input) {
28
+ // Atomic supersede in a transaction: retire the model's current row, then insert the new one.
29
+ await this.db.transaction(async (trx) => {
30
+ await trx
31
+ .from(AGENT_TABLES.modelPricing)
32
+ .where('model_id', input.modelId)
33
+ .where('is_current', 1)
34
+ .update({ is_current: 0 });
35
+ await trx.table(AGENT_TABLES.modelPricing).insert({
36
+ id: crypto.randomUUID(),
37
+ model_id: input.modelId,
38
+ input_price_per_1m: input.inputPricePer1m,
39
+ output_price_per_1m: input.outputPricePer1m,
40
+ cache_write_price_per_1m: input.cacheWritePricePer1m ?? null,
41
+ cache_read_price_per_1m: input.cacheReadPricePer1m ?? null,
42
+ effective_from: Date.now(),
43
+ is_current: 1,
44
+ });
45
+ });
46
+ }
47
+ async listCurrentPrices() {
48
+ const rows = await this.db.from(AGENT_TABLES.modelPricing).where('is_current', 1).select('*');
49
+ return rows.map((row) => {
50
+ const cacheWrite = row.cache_write_price_per_1m;
51
+ const cacheRead = row.cache_read_price_per_1m;
52
+ return {
53
+ modelId: String(row.model_id),
54
+ inputPricePer1m: toNum(row.input_price_per_1m),
55
+ outputPricePer1m: toNum(row.output_price_per_1m),
56
+ effectiveFrom: new Date(toNum(row.effective_from)).toISOString(),
57
+ ...(cacheWrite !== null && cacheWrite !== undefined
58
+ ? { cacheWritePricePer1m: toNum(cacheWrite) }
59
+ : {}),
60
+ ...(cacheRead !== null && cacheRead !== undefined
61
+ ? { cacheReadPricePer1m: toNum(cacheRead) }
62
+ : {}),
63
+ };
64
+ });
65
+ }
66
+ }
67
+ //# sourceMappingURL=lucid-pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucid-pricing.js","sourceRoot":"","sources":["../../../src/stores/lucid-pricing.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;IAAG,CAAC;IAEtD,KAAK,CAAC,gBAAgB,CAAC,KAAsB;QAC3C,8FAA8F;QAC9F,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,GAAG;iBACN,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;iBAC/B,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC;iBAChC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;iBACtB,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;gBAChD,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,QAAQ,EAAE,KAAK,CAAC,OAAO;gBACvB,kBAAkB,EAAE,KAAK,CAAC,eAAe;gBACzC,mBAAmB,EAAE,KAAK,CAAC,gBAAgB;gBAC3C,wBAAwB,EAAE,KAAK,CAAC,oBAAoB,IAAI,IAAI;gBAC5D,uBAAuB,EAAE,KAAK,CAAC,mBAAmB,IAAI,IAAI;gBAC1D,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;gBAC1B,UAAU,EAAE,CAAC;aACd,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACtB,MAAM,UAAU,GAAG,GAAG,CAAC,wBAAwB,CAAC;YAChD,MAAM,SAAS,GAAG,GAAG,CAAC,uBAAuB,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC7B,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC;gBAC9C,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBAChD,aAAa,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE;gBAChE,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS;oBACjD,CAAC,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE;oBAC7C,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,SAAS;oBAC/C,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;oBAC3C,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}