@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,222 @@
1
+ import type { StandardSchemaV1 } from '@standard-schema/spec';
2
+ /** Who is driving the turn. Roles + tenant come from the host app (nestjs-context/authz). */
3
+ export interface Actor {
4
+ id: string;
5
+ /** The caller's roles. Tool authorization is a set intersection against a tool's `roles`. */
6
+ roles?: string[];
7
+ tenantRef?: string;
8
+ }
9
+ export type ToolKind = 'read' | 'action' | 'agent';
10
+ /**
11
+ * Declared shape of a tool.
12
+ * - `read` auto-executes.
13
+ * - `action` never auto-executes — requires HITL approval.
14
+ * - `agent` delegates to another named agent (durable: a child workflow; inline: a nested loop),
15
+ * handled at the loop level — NOT via a handler. Carries `targetAgent`.
16
+ */
17
+ export interface ToolSpec {
18
+ name: string;
19
+ kind: ToolKind;
20
+ description: string;
21
+ /**
22
+ * Input schema as a [Standard Schema](https://standardschema.dev) — validation-agnostic, so
23
+ * Zod, Valibot, or ArkType all work. The loop validates input via `~standard.validate` before
24
+ * running the handler, and providers convert it to the model's tool-parameter JSON schema.
25
+ */
26
+ inputSchema: StandardSchemaV1;
27
+ /** For `kind: 'agent'` — the name of the agent to delegate to. */
28
+ targetAgent?: string;
29
+ /** Roles allowed to invoke. Undefined → defaults applied by RolesPolicy (e.g. ADMIN-only). */
30
+ roles?: string[];
31
+ /**
32
+ * An authorization ability name (e.g. 'cache.purge'). Consumed by an ability-aware RolesPolicy
33
+ * such as the `@dudousxd/nestjs-agent-authz` Gate adapter. Apps that don't use authz ignore it
34
+ * and rely on `roles` instead — both live on the same SPI, so neither is required.
35
+ */
36
+ ability?: string;
37
+ }
38
+ /** What the model is told a tool looks like (no handler, no host types). */
39
+ export interface ToolDefinition {
40
+ name: string;
41
+ kind: ToolKind;
42
+ description: string;
43
+ inputSchema: StandardSchemaV1;
44
+ }
45
+ /** A tool call the model asked for during a turn. */
46
+ export interface ToolCallRequest {
47
+ id: string;
48
+ name: string;
49
+ input: unknown;
50
+ }
51
+ /** Result of running a tool. */
52
+ export interface ToolResult {
53
+ id: string;
54
+ name: string;
55
+ output: unknown;
56
+ error?: string;
57
+ }
58
+ export interface MessageUsage {
59
+ /**
60
+ * Total input (prompt) tokens for the turn — the whole input side, cached and uncached alike.
61
+ * `cacheWriteTokens` + `cacheReadTokens` are subsets of this count, not additions to it, so
62
+ * token totals and quota never change when a breakdown is present.
63
+ */
64
+ inputTokens: number;
65
+ /** Total output (completion) tokens for the turn; `reasoningTokens` is a subset of this. */
66
+ outputTokens: number;
67
+ /**
68
+ * How many of `inputTokens` were written to the prompt cache this turn (billed at a premium,
69
+ * ~1.25× base input). Undefined when the provider doesn't report caching. Refines the cost
70
+ * estimate only — priced by the pricing row's cache-write rate (falling back to the input rate).
71
+ */
72
+ cacheWriteTokens?: number;
73
+ /**
74
+ * How many of `inputTokens` were served from the prompt cache this turn (billed at a discount,
75
+ * ~0.1× base input). Undefined when the provider doesn't report caching.
76
+ */
77
+ cacheReadTokens?: number;
78
+ /**
79
+ * How many of `outputTokens` the model spent on reasoning/thinking. Observability only — reasoning
80
+ * tokens are billed at the output rate, so they don't change the cost estimate. Undefined for
81
+ * non-reasoning models or providers that don't report it.
82
+ */
83
+ reasoningTokens?: number;
84
+ /**
85
+ * This turn's USD cost: the provider's own reported figure when it has one (a gateway), else an
86
+ * estimate from the bound `AgentPricingStore` (cached once per run — see `AgentLoopDeps.pricingStore`),
87
+ * else `null` when no pricing store is bound or the model has no price row. Never `0` for an unpriced
88
+ * model — a real $0 turn and "we don't know" must stay distinguishable. Undefined before the loop
89
+ * folds cost (e.g. a plain usage struct that predates pricing).
90
+ */
91
+ costUsd?: number | null;
92
+ }
93
+ export type UsagePurpose = 'chat' | 'title' | 'follow_ups' | 'summary';
94
+ export interface QuotaState {
95
+ usedTokens: number;
96
+ limitTokens: number;
97
+ withinLimit: boolean;
98
+ }
99
+ /** A human decision on a pending action tool call. */
100
+ export interface Decision {
101
+ approved: boolean;
102
+ reason?: string;
103
+ }
104
+ export type MessageRole = 'user' | 'assistant' | 'system';
105
+ /**
106
+ * A file a user attached to a message so a vision-capable model sees it natively (an image, a PDF).
107
+ * The lib stays provider-agnostic: it passes {@link MessageAttachment.url} straight through as the
108
+ * model's image/file part data — making that URL reachable by the provider (a presigned URL, a proxy,
109
+ * or a `data:` URI) is the consumer's job. The lib never fetches bytes or talks to a store; that
110
+ * upload-time work is the {@link import('./spi/attachment-staging.js').AttachmentStagingStore} seam.
111
+ */
112
+ export interface MessageAttachment {
113
+ /** Stable id of the stored media object in the consumer's media store. Provenance + replay key. */
114
+ mediaId: string;
115
+ /** A URL the model provider can fetch the bytes from at turn time. */
116
+ url: string;
117
+ /** MIME type — routes the part: `image/*` → image part, otherwise → file part. */
118
+ contentType: string;
119
+ /** Original filename, for display and the file part's filename. */
120
+ name: string;
121
+ }
122
+ /** A neutral chat message exchanged with the model. */
123
+ export interface ModelMessage {
124
+ role: MessageRole;
125
+ content: string;
126
+ toolCalls?: ToolCallRequest[];
127
+ toolResults?: ToolResult[];
128
+ /** User-message attachments (image/PDF), rendered as native model content parts by the adapter. */
129
+ attachments?: MessageAttachment[];
130
+ }
131
+ export interface PageContext {
132
+ kind?: string;
133
+ [key: string]: unknown;
134
+ }
135
+ /**
136
+ * Inputs a {@link PromptBuilder} may use to compose the effective system prompt for a turn.
137
+ * `basePrompt` is the agent's own (already-resolved) base prompt, so a persona builder can wrap
138
+ * or extend it rather than replace it.
139
+ */
140
+ export interface PromptContext {
141
+ actor: Actor;
142
+ persona?: Persona;
143
+ pageContext?: PageContext;
144
+ basePrompt: string;
145
+ }
146
+ /**
147
+ * A dynamic system prompt. Return a string (optionally async) built from the turn's context —
148
+ * e.g. injecting the actor, the current page, or a data-shape description. The loop resolves it
149
+ * once per turn from stable inputs (actor/persona/pageContext), so it stays replay-safe.
150
+ */
151
+ export type PromptBuilder = (ctx: PromptContext) => string | Promise<string>;
152
+ export interface Persona {
153
+ id: string;
154
+ label: string;
155
+ /** A flat prompt, or a {@link PromptBuilder} composed per request from {@link PromptContext}. */
156
+ systemPrompt: string | PromptBuilder;
157
+ /** If set, only these tool names are offered (after role filtering). */
158
+ allowedTools?: string[];
159
+ }
160
+ /** Everything needed to run one agent turn. */
161
+ export interface AgentRunInput {
162
+ threadId: string;
163
+ actor: Actor;
164
+ /** The latest user message text. */
165
+ userText: string;
166
+ /** Files attached to the latest user message (image/PDF). Persisted with it and sent to the model. */
167
+ attachments?: MessageAttachment[];
168
+ persona?: Persona;
169
+ pageContext?: PageContext;
170
+ isRegenerate?: boolean;
171
+ /** YYYY-MM-DD stamped by the runner so quota/day stays deterministic under durable replay. */
172
+ day?: string;
173
+ /** Which named agent runs this turn. Omitted → the default/single agent. */
174
+ agentName?: string;
175
+ }
176
+ /**
177
+ * A named agent: its prompt, the tools it may use, and its personas. Multiple definitions are
178
+ * registered via `AgentModule.forFeature([...])`; an orchestrator delegates to others through
179
+ * `ctx.runAgent(name, task)`. Model/store/sink/governance are shared from the module unless
180
+ * overridden here.
181
+ */
182
+ export interface AgentDefinition {
183
+ name: string;
184
+ /** Base prompt for this agent. A flat string, or a {@link PromptBuilder} resolved per turn. */
185
+ systemPrompt?: string | PromptBuilder;
186
+ /** Allow-list of tool names this agent may use (subset of all registered tools). */
187
+ tools?: string[];
188
+ /** Names of other agents this agent may delegate to (auto-registered as `agent`-kind tools). */
189
+ delegatesTo?: string[];
190
+ personas?: Persona[];
191
+ defaultPersona?: string;
192
+ modelId?: string;
193
+ maxSteps?: number;
194
+ }
195
+ export interface ThreadSummary {
196
+ id: string;
197
+ title: string;
198
+ persona: string;
199
+ pinnedAt?: string;
200
+ transient: boolean;
201
+ createdAt: string;
202
+ updatedAt: string;
203
+ lastMessagePreview?: string;
204
+ }
205
+ export interface StoredMessage {
206
+ id: string;
207
+ role: MessageRole;
208
+ content: string;
209
+ toolCalls?: ToolCallRequest[];
210
+ toolResults?: ToolResult[];
211
+ /** Files the user attached to this message (image/PDF). Persisted with the message, replayed as-is. */
212
+ attachments?: MessageAttachment[];
213
+ followUps?: string[];
214
+ usage?: MessageUsage;
215
+ createdAt: string;
216
+ }
217
+ export interface ThreadDetail extends ThreadSummary {
218
+ messages: StoredMessage[];
219
+ activeStreamId?: string;
220
+ }
221
+ export type ToolCallStatus = 'auto_executed' | 'pending_approval' | 'executed' | 'rejected' | 'failed';
222
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,6FAA6F;AAC7F,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,EAAE,gBAAgB,CAAC;IAC9B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,gCAAgC;AAChC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,mGAAmG;IACnG,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,YAAY,EAAE,MAAM,GAAG,aAAa,CAAC;IACrC,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,sGAAsG;IACtG,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8FAA8F;IAC9F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACtC,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,gGAAgG;IAChG,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,uGAAuG;IACvG,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,kBAAkB,GAClB,UAAU,GACV,UAAU,GACV,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ {{{
2
+ exports({ to: app.configPath('agent.ts') })
3
+ }}}
4
+ import { defineConfig, stores, AuthActorResolver } from '@adonis-agora/agent'
5
+ // import { attachmentStores } from '@adonis-agora/agent'
6
+ // import { aiSdkModel } from '@adonis-agora/agent/ai-sdk'
7
+ // import { openai } from '@ai-sdk/openai'
8
+
9
+ /**
10
+ * Configuration for @adonis-agora/agent. Only `model` is required. Pick a `store` by name from the
11
+ * `stores` map (each driver's peer is imported lazily, only when selected); omit `store` for the
12
+ * in-memory store. The runner is in-process by default (`durable` is deferred). The actor resolver
13
+ * defaults to one that THROWS — the agent never fabricates a caller — so wire a real one.
14
+ *
15
+ * Publish the tables with `node ace migration:run` after configuring.
16
+ */
17
+ export default defineConfig({
18
+ /**
19
+ * The LLM provider. Wrap the Vercel AI SDK via `aiSdkModel(...)` (from `@adonis-agora/agent/ai-sdk`)
20
+ * or supply any `ModelProvider`. A lazy thunk keeps the provider SDK peer imported only at boot:
21
+ *
22
+ * model: () => aiSdkModel({ model: openai('gpt-4o-mini') }),
23
+ */
24
+ model: () => {
25
+ throw new Error('Configure a model in config/agent.ts (e.g. aiSdkModel({ model: ... }))')
26
+ },
27
+
28
+ store: 'lucid',
29
+ stores: {
30
+ memory: stores.memory(),
31
+ lucid: stores.lucid(),
32
+ },
33
+
34
+ // Identity seam — reads ctx.auth.user (fail-closed: throws when unauthenticated). Swap for your own
35
+ // resolver, or HeaderActorResolver behind a trusted gateway.
36
+ actorResolver: new AuthActorResolver(),
37
+
38
+ // path: 'agent', // → /agent/chat, /agent/threads, ...
39
+ // defaultRoles: ['ADMIN'], // roles a tool requires when it declares none (fail-closed)
40
+ // maxSteps: 8, // cap on model↔tool iterations per turn
41
+
42
+ // Multimodal uploads — mounts POST /agent/attachments, which stages a file into a model-fetchable
43
+ // MessageAttachment the client sends back with its next chat message. Bind your own store (presign
44
+ // S3/GCS or wrap your media pipeline); `attachmentStores.memory()` inlines bytes as a data: URL.
45
+ // attachmentStaging: attachmentStores.memory(),
46
+ // attachmentMaxBytes: 20 * 1024 * 1024,
47
+ // attachmentAllowedContentTypes: ['image/png', 'image/jpeg', 'application/pdf'],
48
+
49
+ // The implicit default agent (base prompt, personas, tool allow-list). Omit for a bare assistant.
50
+ // defaultAgent: {
51
+ // systemPrompt: 'You are a helpful assistant.',
52
+ // personas: [{ id: 'default', label: 'Default', systemPrompt: 'You are a helpful assistant.' }],
53
+ // defaultPersona: 'default',
54
+ // },
55
+ })
@@ -0,0 +1,41 @@
1
+ {{{
2
+ exports({ to: app.migrationsPath(`${new Date().getTime()}_create_agent_rag_chunks.ts`) })
3
+ }}}
4
+ import { BaseSchema } from '@adonisjs/lucid/schema'
5
+
6
+ /**
7
+ * The pgvector chunk table for the @adonis-agora/agent `retrievers.pgvector({...})` store: one row per
8
+ * embedded chunk (id `${documentId}#<n>`), the chunk text, an optional citation source, a `jsonb`
9
+ * metadata column filtered with `@>`, and the `vector(N)` embedding ranked with the `<=>`/`<->`/`<#>`
10
+ * operators. Requires the pgvector extension (`CREATE EXTENSION vector`) — Postgres only.
11
+ *
12
+ * Set `DIMENSION` to your embedding model's width (e.g. 1536 for text-embedding-3-small) and `OPCLASS`
13
+ * to the index operator class matching the store's metric: `vector_cosine_ops` (default),
14
+ * `vector_l2_ops`, or `vector_ip_ops`.
15
+ */
16
+ const TABLE = 'agent_rag_chunks'
17
+ const DIMENSION = 1536
18
+ const OPCLASS = 'vector_cosine_ops'
19
+
20
+ export default class extends BaseSchema {
21
+ async up() {
22
+ this.schema.raw('CREATE EXTENSION IF NOT EXISTS vector')
23
+
24
+ this.schema.createTable(TABLE, (table) => {
25
+ table.text('id').primary()
26
+ table.text('text').notNullable()
27
+ table.text('source')
28
+ table.jsonb('metadata')
29
+ table.specificType('embedding', `vector(${DIMENSION})`).notNullable()
30
+ })
31
+
32
+ // Approximate-nearest-neighbour index for the configured metric. Drop it to fall back to an exact scan.
33
+ this.schema.raw(
34
+ `CREATE INDEX IF NOT EXISTS ${TABLE}_embedding_idx ON ${TABLE} USING hnsw (embedding ${OPCLASS})`
35
+ )
36
+ }
37
+
38
+ async down() {
39
+ this.schema.dropTableIfExists(TABLE)
40
+ }
41
+ }
@@ -0,0 +1,80 @@
1
+ {{{
2
+ exports({ to: app.migrationsPath(`${new Date().getTime()}_create_agent_run_tracking.ts`) })
3
+ }}}
4
+ import { BaseSchema } from '@adonisjs/lucid/schema'
5
+
6
+ /**
7
+ * Additive migration for @adonis-agora/agent RUN tracking. Adds the `agent_run` table (one row per
8
+ * run/turn lifecycle) plus a nullable `run_id` correlation column on `agent_message`,
9
+ * `agent_tool_call` and `agent_token_usage`. `run_id` is deliberately NOT a DB foreign key (like the
10
+ * reference): it can be `ALTER TABLE ADD COLUMN`-ed portably (SQLite can't add a column WITH a FK
11
+ * constraint) and a row written before this shipped keeps a `null` run_id.
12
+ *
13
+ * Timestamps are epoch-ms integers, booleans INTEGER (0/1) and cost a DOUBLE, matching
14
+ * `create_agent_tables` so the schema stays portable across SQLite / Postgres / MySQL. Safe to run on
15
+ * an existing deployment: it only creates a new table and adds nullable columns.
16
+ */
17
+ export default class extends BaseSchema {
18
+ async up() {
19
+ this.schema.createTable('agent_run', (table) => {
20
+ table.string('id').primary()
21
+ table
22
+ .string('thread_id')
23
+ .notNullable()
24
+ .references('id')
25
+ .inTable('agent_thread')
26
+ .onDelete('CASCADE')
27
+ table.string('agent_name')
28
+ table.string('actor_ref').notNullable()
29
+ table.string('tenant_ref')
30
+ table.string('status').notNullable()
31
+ table.bigInteger('started_at').notNullable()
32
+ table.bigInteger('finished_at')
33
+ table.integer('step_count').notNullable().defaultTo(0)
34
+ table.integer('input_tokens').notNullable().defaultTo(0)
35
+ table.integer('output_tokens').notNullable().defaultTo(0)
36
+ table.double('cost_usd')
37
+ table.text('error')
38
+ table.integer('durable').notNullable().defaultTo(0)
39
+ table.index(['started_at'], 'agent_run_started_idx')
40
+ table.index(['actor_ref', 'started_at'], 'agent_run_actor_started_idx')
41
+ table.index(['status', 'started_at'], 'agent_run_status_started_idx')
42
+ })
43
+
44
+ this.schema.alterTable('agent_message', (table) => {
45
+ table.string('run_id')
46
+ table.index(['run_id'], 'agent_message_run_idx')
47
+ })
48
+
49
+ this.schema.alterTable('agent_tool_call', (table) => {
50
+ table.string('run_id')
51
+ table.index(['run_id'], 'agent_tool_call_run_idx')
52
+ table.index(['status', 'created_at'], 'agent_tool_call_status_created_idx')
53
+ })
54
+
55
+ this.schema.alterTable('agent_token_usage', (table) => {
56
+ table.string('run_id')
57
+ table.index(['run_id'], 'agent_token_usage_run_idx')
58
+ })
59
+ }
60
+
61
+ async down() {
62
+ this.schema.alterTable('agent_token_usage', (table) => {
63
+ table.dropIndex(['run_id'], 'agent_token_usage_run_idx')
64
+ table.dropColumn('run_id')
65
+ })
66
+
67
+ this.schema.alterTable('agent_tool_call', (table) => {
68
+ table.dropIndex(['status', 'created_at'], 'agent_tool_call_status_created_idx')
69
+ table.dropIndex(['run_id'], 'agent_tool_call_run_idx')
70
+ table.dropColumn('run_id')
71
+ })
72
+
73
+ this.schema.alterTable('agent_message', (table) => {
74
+ table.dropIndex(['run_id'], 'agent_message_run_idx')
75
+ table.dropColumn('run_id')
76
+ })
77
+
78
+ this.schema.dropTableIfExists('agent_run')
79
+ }
80
+ }
@@ -0,0 +1,113 @@
1
+ {{{
2
+ exports({ to: app.migrationsPath(`${new Date().getTime()}_create_agent_tables.ts`) })
3
+ }}}
4
+ import { BaseSchema } from '@adonisjs/lucid/schema'
5
+
6
+ /**
7
+ * The five tables for the @adonis-agora/agent `lucid` store: threads, messages, tool calls, token
8
+ * usage and model pricing. JSON payloads (tool calls/results, follow-ups, usage, tool input/output)
9
+ * are stored as TEXT — the store (de)serializes them — booleans as INTEGER (0/1), and timestamps as
10
+ * epoch-ms integers, so the schema is portable across SQLite / Postgres / MySQL. The `agent_tool_call`
11
+ * primary key is the model-supplied `toolCallId`, not a generated id.
12
+ */
13
+ export default class extends BaseSchema {
14
+ async up() {
15
+ this.schema.createTable('agent_thread', (table) => {
16
+ table.string('id').primary()
17
+ table.string('actor_ref').notNullable()
18
+ table.string('tenant_ref')
19
+ table.text('title').notNullable()
20
+ table.string('persona').notNullable().defaultTo('default')
21
+ table.integer('transient').notNullable().defaultTo(0)
22
+ table.bigInteger('pinned_at')
23
+ table.text('summary')
24
+ table.integer('summary_message_count').notNullable().defaultTo(0)
25
+ table.string('active_stream_id')
26
+ table.bigInteger('created_at').notNullable()
27
+ table.bigInteger('updated_at').notNullable()
28
+ table.bigInteger('deleted_at')
29
+ table.index(['actor_ref', 'updated_at'], 'agent_thread_actor_updated_idx')
30
+ })
31
+
32
+ this.schema.createTable('agent_message', (table) => {
33
+ table.string('id').primary()
34
+ table
35
+ .string('thread_id')
36
+ .notNullable()
37
+ .references('id')
38
+ .inTable('agent_thread')
39
+ .onDelete('CASCADE')
40
+ table.string('role').notNullable()
41
+ table.text('content').notNullable()
42
+ table.text('tool_calls')
43
+ table.text('tool_results')
44
+ table.text('attachments')
45
+ table.text('follow_ups')
46
+ table.text('usage')
47
+ table.string('persona')
48
+ table.bigInteger('created_at').notNullable()
49
+ table.index(['thread_id', 'created_at'], 'agent_message_thread_created_idx')
50
+ })
51
+
52
+ this.schema.createTable('agent_tool_call', (table) => {
53
+ // PK = the model-supplied toolCallId, not a generated id.
54
+ table.string('id').primary()
55
+ table
56
+ .string('message_id')
57
+ .notNullable()
58
+ .references('id')
59
+ .inTable('agent_message')
60
+ .onDelete('CASCADE')
61
+ table.string('tool_name').notNullable()
62
+ table.string('tool_type').notNullable()
63
+ table.text('input')
64
+ table.text('output')
65
+ table.string('status').notNullable()
66
+ table.string('executed_by_ref')
67
+ table.integer('execution_ms')
68
+ table.text('error')
69
+ table.bigInteger('created_at').notNullable()
70
+ table.bigInteger('executed_at')
71
+ })
72
+
73
+ this.schema.createTable('agent_token_usage', (table) => {
74
+ table.string('id').primary()
75
+ table
76
+ .string('thread_id')
77
+ .notNullable()
78
+ .references('id')
79
+ .inTable('agent_thread')
80
+ .onDelete('CASCADE')
81
+ table.string('actor_ref').notNullable()
82
+ table.string('message_id')
83
+ table.string('model_id').notNullable()
84
+ table.string('purpose').notNullable()
85
+ table.integer('input_tokens').notNullable()
86
+ table.integer('output_tokens').notNullable()
87
+ table.integer('cache_write_tokens')
88
+ table.integer('cache_read_tokens')
89
+ table.double('cost_usd')
90
+ table.bigInteger('created_at').notNullable()
91
+ table.index(['actor_ref', 'created_at'], 'agent_token_usage_actor_created_idx')
92
+ })
93
+
94
+ this.schema.createTable('agent_model_pricing', (table) => {
95
+ table.string('id').primary()
96
+ table.string('model_id').notNullable()
97
+ table.double('input_price_per_1m').notNullable()
98
+ table.double('output_price_per_1m').notNullable()
99
+ table.double('cache_write_price_per_1m')
100
+ table.double('cache_read_price_per_1m')
101
+ table.bigInteger('effective_from').notNullable()
102
+ table.integer('is_current').notNullable()
103
+ })
104
+ }
105
+
106
+ async down() {
107
+ this.schema.dropTableIfExists('agent_model_pricing')
108
+ this.schema.dropTableIfExists('agent_token_usage')
109
+ this.schema.dropTableIfExists('agent_tool_call')
110
+ this.schema.dropTableIfExists('agent_message')
111
+ this.schema.dropTableIfExists('agent_thread')
112
+ }
113
+ }