botinabox 2.4.2 → 2.5.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 (277) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +190 -190
  3. package/bin/botinabox.mjs +2 -2
  4. package/dist/channels/slack/index.d.ts +1 -1
  5. package/dist/{chat-pipeline-BWrtVqEP.d.ts → chat-pipeline-DuNX5WoL.d.ts} +3 -0
  6. package/dist/cli.js +0 -0
  7. package/dist/index.d.ts +11 -2
  8. package/dist/index.js +64 -27
  9. package/package.json +100 -99
  10. package/dist/channels/discord/adapter.d.ts +0 -32
  11. package/dist/channels/discord/adapter.js +0 -70
  12. package/dist/channels/discord/inbound.d.ts +0 -25
  13. package/dist/channels/discord/inbound.js +0 -24
  14. package/dist/channels/discord/models.d.ts +0 -8
  15. package/dist/channels/discord/models.js +0 -5
  16. package/dist/channels/discord/outbound.d.ts +0 -14
  17. package/dist/channels/discord/outbound.js +0 -38
  18. package/dist/channels/slack/adapter.d.ts +0 -33
  19. package/dist/channels/slack/adapter.js +0 -74
  20. package/dist/channels/slack/inbound.d.ts +0 -59
  21. package/dist/channels/slack/inbound.js +0 -96
  22. package/dist/channels/slack/models.d.ts +0 -9
  23. package/dist/channels/slack/models.js +0 -5
  24. package/dist/channels/slack/outbound.d.ts +0 -12
  25. package/dist/channels/slack/outbound.js +0 -18
  26. package/dist/channels/slack/transcribe.d.ts +0 -41
  27. package/dist/channels/slack/transcribe.js +0 -106
  28. package/dist/channels/webhook/adapter.d.ts +0 -23
  29. package/dist/channels/webhook/adapter.js +0 -86
  30. package/dist/channels/webhook/hmac.d.ts +0 -13
  31. package/dist/channels/webhook/hmac.js +0 -26
  32. package/dist/channels/webhook/models.d.ts +0 -9
  33. package/dist/channels/webhook/models.js +0 -5
  34. package/dist/channels/webhook/server.d.ts +0 -20
  35. package/dist/channels/webhook/server.js +0 -91
  36. package/dist/chat-pipeline-C-XlLGNl.d.ts +0 -648
  37. package/dist/chat-pipeline-CR1KF6eX.d.ts +0 -652
  38. package/dist/chat-pipeline-DisuC8SB.d.ts +0 -643
  39. package/dist/chunk-2LGXQPEA.js +0 -41
  40. package/dist/chunk-3X3YKI4T.js +0 -357
  41. package/dist/chunk-D47AIFOD.js +0 -351
  42. package/dist/chunk-DSNJKNEW.js +0 -328
  43. package/dist/chunk-GS2JFL6I.js +0 -144
  44. package/dist/chunk-J6S6QMUY.js +0 -144
  45. package/dist/chunk-QLA6YOFN.js +0 -22
  46. package/dist/chunk-UACT2WXX.js +0 -381
  47. package/dist/cli/templates/config.yml.d.ts +0 -7
  48. package/dist/cli/templates/config.yml.js +0 -61
  49. package/dist/cli/templates/env.d.ts +0 -1
  50. package/dist/cli/templates/env.js +0 -30
  51. package/dist/cli/templates/index.ts.d.ts +0 -2
  52. package/dist/cli/templates/index.ts.js +0 -30
  53. package/dist/cli/templates/package.json.d.ts +0 -5
  54. package/dist/cli/templates/package.json.js +0 -28
  55. package/dist/connector-DDahQw-2.d.ts +0 -63
  56. package/dist/connectors/google/calendar-connector.d.ts +0 -40
  57. package/dist/connectors/google/calendar-connector.js +0 -243
  58. package/dist/connectors/google/gmail-connector.d.ts +0 -42
  59. package/dist/connectors/google/gmail-connector.js +0 -345
  60. package/dist/connectors/google/oauth.d.ts +0 -48
  61. package/dist/connectors/google/oauth.js +0 -112
  62. package/dist/connectors/google/types.d.ts +0 -78
  63. package/dist/connectors/google/types.js +0 -2
  64. package/dist/core/chat/auto-discovery.d.ts +0 -16
  65. package/dist/core/chat/auto-discovery.js +0 -54
  66. package/dist/core/chat/channel-registry.d.ts +0 -45
  67. package/dist/core/chat/channel-registry.js +0 -96
  68. package/dist/core/chat/chat-pipeline.d.ts +0 -113
  69. package/dist/core/chat/chat-pipeline.js +0 -395
  70. package/dist/core/chat/chat-responder.d.ts +0 -90
  71. package/dist/core/chat/chat-responder.js +0 -185
  72. package/dist/core/chat/formatter.d.ts +0 -11
  73. package/dist/core/chat/formatter.js +0 -60
  74. package/dist/core/chat/index.d.ts +0 -24
  75. package/dist/core/chat/index.js +0 -18
  76. package/dist/core/chat/message-interpreter.d.ts +0 -91
  77. package/dist/core/chat/message-interpreter.js +0 -166
  78. package/dist/core/chat/message-store.d.ts +0 -66
  79. package/dist/core/chat/message-store.js +0 -131
  80. package/dist/core/chat/notification-queue.d.ts +0 -34
  81. package/dist/core/chat/notification-queue.js +0 -111
  82. package/dist/core/chat/pipeline.d.ts +0 -38
  83. package/dist/core/chat/pipeline.js +0 -89
  84. package/dist/core/chat/policies.d.ts +0 -16
  85. package/dist/core/chat/policies.js +0 -25
  86. package/dist/core/chat/routing.d.ts +0 -17
  87. package/dist/core/chat/routing.js +0 -36
  88. package/dist/core/chat/session-key.d.ts +0 -30
  89. package/dist/core/chat/session-key.js +0 -65
  90. package/dist/core/chat/session-manager.d.ts +0 -17
  91. package/dist/core/chat/session-manager.js +0 -23
  92. package/dist/core/chat/text-chunker.d.ts +0 -9
  93. package/dist/core/chat/text-chunker.js +0 -48
  94. package/dist/core/chat/triage-router.d.ts +0 -75
  95. package/dist/core/chat/triage-router.js +0 -142
  96. package/dist/core/chat/types.d.ts +0 -5
  97. package/dist/core/chat/types.js +0 -5
  98. package/dist/core/config/defaults.d.ts +0 -2
  99. package/dist/core/config/defaults.js +0 -38
  100. package/dist/core/config/index.d.ts +0 -6
  101. package/dist/core/config/index.js +0 -4
  102. package/dist/core/config/interpolate.d.ts +0 -5
  103. package/dist/core/config/interpolate.js +0 -27
  104. package/dist/core/config/loader.d.ts +0 -24
  105. package/dist/core/config/loader.js +0 -59
  106. package/dist/core/config/schema.d.ts +0 -5
  107. package/dist/core/config/schema.js +0 -119
  108. package/dist/core/data/core-entity-contexts.d.ts +0 -14
  109. package/dist/core/data/core-entity-contexts.js +0 -197
  110. package/dist/core/data/core-migrations.d.ts +0 -5
  111. package/dist/core/data/core-migrations.js +0 -45
  112. package/dist/core/data/core-schema.d.ts +0 -6
  113. package/dist/core/data/core-schema.js +0 -454
  114. package/dist/core/data/data-store.d.ts +0 -67
  115. package/dist/core/data/data-store.js +0 -218
  116. package/dist/core/data/domain-entity-contexts.d.ts +0 -29
  117. package/dist/core/data/domain-entity-contexts.js +0 -321
  118. package/dist/core/data/domain-schema.d.ts +0 -36
  119. package/dist/core/data/domain-schema.js +0 -323
  120. package/dist/core/data/index.d.ts +0 -7
  121. package/dist/core/data/index.js +0 -7
  122. package/dist/core/data/types.d.ts +0 -111
  123. package/dist/core/data/types.js +0 -1
  124. package/dist/core/hooks/hook-bus.d.ts +0 -18
  125. package/dist/core/hooks/hook-bus.js +0 -120
  126. package/dist/core/hooks/index.d.ts +0 -2
  127. package/dist/core/hooks/index.js +0 -1
  128. package/dist/core/hooks/types.d.ts +0 -19
  129. package/dist/core/hooks/types.js +0 -1
  130. package/dist/core/index.d.ts +0 -4
  131. package/dist/core/index.js +0 -4
  132. package/dist/core/llm/auto-discovery.d.ts +0 -11
  133. package/dist/core/llm/auto-discovery.js +0 -49
  134. package/dist/core/llm/cost-tracker.d.ts +0 -6
  135. package/dist/core/llm/cost-tracker.js +0 -38
  136. package/dist/core/llm/index.d.ts +0 -4
  137. package/dist/core/llm/index.js +0 -3
  138. package/dist/core/llm/model-router.d.ts +0 -25
  139. package/dist/core/llm/model-router.js +0 -49
  140. package/dist/core/llm/provider-registry.d.ts +0 -9
  141. package/dist/core/llm/provider-registry.js +0 -25
  142. package/dist/core/llm/types.d.ts +0 -2
  143. package/dist/core/llm/types.js +0 -2
  144. package/dist/core/orchestrator/adapters/api-adapter.d.ts +0 -34
  145. package/dist/core/orchestrator/adapters/api-adapter.js +0 -88
  146. package/dist/core/orchestrator/adapters/cli-adapter.d.ts +0 -22
  147. package/dist/core/orchestrator/adapters/cli-adapter.js +0 -69
  148. package/dist/core/orchestrator/adapters/deterministic-adapter.d.ts +0 -35
  149. package/dist/core/orchestrator/adapters/deterministic-adapter.js +0 -75
  150. package/dist/core/orchestrator/adapters/env-whitelist.d.ts +0 -4
  151. package/dist/core/orchestrator/adapters/env-whitelist.js +0 -27
  152. package/dist/core/orchestrator/adapters/output-extractor.d.ts +0 -11
  153. package/dist/core/orchestrator/adapters/output-extractor.js +0 -59
  154. package/dist/core/orchestrator/adapters/process-manager.d.ts +0 -15
  155. package/dist/core/orchestrator/adapters/process-manager.js +0 -26
  156. package/dist/core/orchestrator/adapters/tool-loop.d.ts +0 -22
  157. package/dist/core/orchestrator/adapters/tool-loop.js +0 -66
  158. package/dist/core/orchestrator/agent-registry.d.ts +0 -31
  159. package/dist/core/orchestrator/agent-registry.js +0 -135
  160. package/dist/core/orchestrator/budget-controller.d.ts +0 -19
  161. package/dist/core/orchestrator/budget-controller.js +0 -73
  162. package/dist/core/orchestrator/chain-guard.d.ts +0 -14
  163. package/dist/core/orchestrator/chain-guard.js +0 -23
  164. package/dist/core/orchestrator/circuit-breaker.d.ts +0 -65
  165. package/dist/core/orchestrator/circuit-breaker.js +0 -159
  166. package/dist/core/orchestrator/claude-stream-parser.d.ts +0 -31
  167. package/dist/core/orchestrator/claude-stream-parser.js +0 -99
  168. package/dist/core/orchestrator/config-revisions.d.ts +0 -6
  169. package/dist/core/orchestrator/config-revisions.js +0 -17
  170. package/dist/core/orchestrator/dependency-resolver.d.ts +0 -20
  171. package/dist/core/orchestrator/dependency-resolver.js +0 -78
  172. package/dist/core/orchestrator/governance-gate.d.ts +0 -110
  173. package/dist/core/orchestrator/governance-gate.js +0 -170
  174. package/dist/core/orchestrator/learning-pipeline.d.ts +0 -109
  175. package/dist/core/orchestrator/learning-pipeline.js +0 -249
  176. package/dist/core/orchestrator/loop-detector.d.ts +0 -51
  177. package/dist/core/orchestrator/loop-detector.js +0 -133
  178. package/dist/core/orchestrator/ndjson-logger.d.ts +0 -6
  179. package/dist/core/orchestrator/ndjson-logger.js +0 -18
  180. package/dist/core/orchestrator/permission-relay.d.ts +0 -72
  181. package/dist/core/orchestrator/permission-relay.js +0 -164
  182. package/dist/core/orchestrator/run-manager.d.ts +0 -31
  183. package/dist/core/orchestrator/run-manager.js +0 -178
  184. package/dist/core/orchestrator/scheduler.d.ts +0 -70
  185. package/dist/core/orchestrator/scheduler.js +0 -198
  186. package/dist/core/orchestrator/secret-store.d.ts +0 -57
  187. package/dist/core/orchestrator/secret-store.js +0 -171
  188. package/dist/core/orchestrator/session-manager.d.ts +0 -13
  189. package/dist/core/orchestrator/session-manager.js +0 -66
  190. package/dist/core/orchestrator/task-queue.d.ts +0 -34
  191. package/dist/core/orchestrator/task-queue.js +0 -83
  192. package/dist/core/orchestrator/template-interpolate.d.ts +0 -5
  193. package/dist/core/orchestrator/template-interpolate.js +0 -18
  194. package/dist/core/orchestrator/user-registry.d.ts +0 -47
  195. package/dist/core/orchestrator/user-registry.js +0 -76
  196. package/dist/core/orchestrator/wakeup-queue.d.ts +0 -9
  197. package/dist/core/orchestrator/wakeup-queue.js +0 -45
  198. package/dist/core/orchestrator/workflow-engine.d.ts +0 -47
  199. package/dist/core/orchestrator/workflow-engine.js +0 -204
  200. package/dist/core/security/audit.d.ts +0 -20
  201. package/dist/core/security/audit.js +0 -33
  202. package/dist/core/security/column-validator.d.ts +0 -20
  203. package/dist/core/security/column-validator.js +0 -37
  204. package/dist/core/security/index.d.ts +0 -5
  205. package/dist/core/security/index.js +0 -5
  206. package/dist/core/security/process-env.d.ts +0 -13
  207. package/dist/core/security/process-env.js +0 -49
  208. package/dist/core/security/sanitizer.d.ts +0 -11
  209. package/dist/core/security/sanitizer.js +0 -39
  210. package/dist/core/security/types.d.ts +0 -11
  211. package/dist/core/security/types.js +0 -1
  212. package/dist/core/update/auto-update.d.ts +0 -21
  213. package/dist/core/update/auto-update.js +0 -102
  214. package/dist/core/update/backup-manager.d.ts +0 -7
  215. package/dist/core/update/backup-manager.js +0 -24
  216. package/dist/core/update/index.d.ts +0 -8
  217. package/dist/core/update/index.js +0 -6
  218. package/dist/core/update/migration-hooks.d.ts +0 -11
  219. package/dist/core/update/migration-hooks.js +0 -10
  220. package/dist/core/update/types.d.ts +0 -11
  221. package/dist/core/update/types.js +0 -1
  222. package/dist/core/update/update-checker.d.ts +0 -11
  223. package/dist/core/update/update-checker.js +0 -63
  224. package/dist/core/update/update-manager.d.ts +0 -25
  225. package/dist/core/update/update-manager.js +0 -101
  226. package/dist/core/update/version-utils.d.ts +0 -6
  227. package/dist/core/update/version-utils.js +0 -34
  228. package/dist/gmail-connector-2FVYTQJH.js +0 -6
  229. package/dist/gmail-connector-MNUBRNFM.js +0 -6
  230. package/dist/gmail-connector-PS2VLGNE.js +0 -6
  231. package/dist/gmail-connector-ULSMN6X2.js +0 -6
  232. package/dist/gmail-connector-URRFX6A3.js +0 -6
  233. package/dist/inbound-AFBUPSPG.js +0 -10
  234. package/dist/inbound-AFOHYNUY.js +0 -6
  235. package/dist/inbound-CGIXRXGC.js +0 -8
  236. package/dist/inbound-MCOLRH6U.js +0 -10
  237. package/dist/inbound-SNEMBLGA.js +0 -6
  238. package/dist/inbound-ZJHAYVMF.js +0 -10
  239. package/dist/provider-qqJYv9nv.d.ts +0 -75
  240. package/dist/providers/anthropic/models.d.ts +0 -2
  241. package/dist/providers/anthropic/models.js +0 -29
  242. package/dist/providers/anthropic/provider.d.ts +0 -13
  243. package/dist/providers/anthropic/provider.js +0 -119
  244. package/dist/providers/anthropic/tool-converter.d.ts +0 -10
  245. package/dist/providers/anthropic/tool-converter.js +0 -7
  246. package/dist/providers/ollama/provider.d.ts +0 -17
  247. package/dist/providers/ollama/provider.js +0 -185
  248. package/dist/providers/openai/models.d.ts +0 -2
  249. package/dist/providers/openai/models.js +0 -29
  250. package/dist/providers/openai/provider.d.ts +0 -13
  251. package/dist/providers/openai/provider.js +0 -163
  252. package/dist/providers/openai/tool-converter.d.ts +0 -10
  253. package/dist/providers/openai/tool-converter.js +0 -10
  254. package/dist/shared/constants.d.ts +0 -50
  255. package/dist/shared/constants.js +0 -64
  256. package/dist/shared/index.d.ts +0 -14
  257. package/dist/shared/index.js +0 -14
  258. package/dist/shared/types/agent.d.ts +0 -36
  259. package/dist/shared/types/agent.js +0 -2
  260. package/dist/shared/types/channel.d.ts +0 -70
  261. package/dist/shared/types/channel.js +0 -2
  262. package/dist/shared/types/config.d.ts +0 -111
  263. package/dist/shared/types/config.js +0 -2
  264. package/dist/shared/types/connector.d.ts +0 -77
  265. package/dist/shared/types/connector.js +0 -2
  266. package/dist/shared/types/execution.d.ts +0 -29
  267. package/dist/shared/types/execution.js +0 -2
  268. package/dist/shared/types/provider.d.ts +0 -73
  269. package/dist/shared/types/provider.js +0 -2
  270. package/dist/shared/types/task.d.ts +0 -47
  271. package/dist/shared/types/task.js +0 -2
  272. package/dist/shared/types/workflow.d.ts +0 -39
  273. package/dist/shared/types/workflow.js +0 -2
  274. package/dist/shared/utils.d.ts +0 -6
  275. package/dist/shared/utils.js +0 -13
  276. package/dist/update-check.d.ts +0 -5
  277. package/dist/update-check.js +0 -56
@@ -1,45 +0,0 @@
1
- /** Initial migration set for core tables */
2
- export const CORE_MIGRATIONS = [
3
- {
4
- version: "001_initial_schema",
5
- sql: `-- Initial schema is applied via DataStore.define() + init().
6
- -- This migration is a no-op placeholder for version tracking.
7
- SELECT 1;`,
8
- },
9
- {
10
- version: "002_activity_log_indexes",
11
- sql: `CREATE INDEX IF NOT EXISTS idx_activity_log_type ON activity_log(event_type, recorded_at);`,
12
- },
13
- {
14
- version: "003_runs_cost_index",
15
- sql: `CREATE INDEX IF NOT EXISTS idx_runs_cost ON runs(agent_id, completed_at) WHERE cost_cents > 0;`,
16
- },
17
- {
18
- version: "004_schedules_table",
19
- sql: `CREATE TABLE IF NOT EXISTS schedules (
20
- id TEXT PRIMARY KEY,
21
- name TEXT NOT NULL,
22
- description TEXT,
23
- type TEXT NOT NULL DEFAULT 'recurring',
24
- cron TEXT,
25
- run_at TEXT,
26
- timezone TEXT DEFAULT 'UTC',
27
- enabled INTEGER NOT NULL DEFAULT 1,
28
- action TEXT NOT NULL,
29
- action_config TEXT DEFAULT '{}',
30
- last_fired_at TEXT,
31
- next_fire_at TEXT,
32
- created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
33
- updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
34
- deleted_at TEXT
35
- )`,
36
- },
37
- {
38
- version: "005_schedules_name_index",
39
- sql: `CREATE UNIQUE INDEX IF NOT EXISTS idx_schedules_name ON schedules(name) WHERE deleted_at IS NULL`,
40
- },
41
- {
42
- version: "006_schedules_next_index",
43
- sql: `CREATE INDEX IF NOT EXISTS idx_schedules_next ON schedules(enabled, next_fire_at) WHERE deleted_at IS NULL`,
44
- },
45
- ];
@@ -1,6 +0,0 @@
1
- import type { DataStore } from "./data-store.js";
2
- /**
3
- * Define all 18 core tables on a DataStore instance.
4
- * Call before db.init().
5
- */
6
- export declare function defineCoreTables(db: DataStore): void;
@@ -1,454 +0,0 @@
1
- /**
2
- * Define all 18 core tables on a DataStore instance.
3
- * Call before db.init().
4
- */
5
- export function defineCoreTables(db) {
6
- db.define("agents", {
7
- columns: {
8
- id: "TEXT PRIMARY KEY",
9
- slug: "TEXT UNIQUE NOT NULL",
10
- name: "TEXT NOT NULL",
11
- role: "TEXT NOT NULL DEFAULT 'general'",
12
- status: "TEXT NOT NULL DEFAULT 'idle'",
13
- adapter: "TEXT NOT NULL",
14
- adapter_config: "TEXT NOT NULL DEFAULT '{}'",
15
- heartbeat_config: "TEXT NOT NULL DEFAULT '{}'",
16
- budget_monthly_cents: "INTEGER NOT NULL DEFAULT 0",
17
- spent_monthly_cents: "INTEGER NOT NULL DEFAULT 0",
18
- reports_to: "TEXT",
19
- cwd: "TEXT",
20
- instructions_file: "TEXT",
21
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
22
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
23
- deleted_at: "TEXT",
24
- },
25
- });
26
- db.define("tasks", {
27
- columns: {
28
- id: "TEXT PRIMARY KEY",
29
- title: "TEXT NOT NULL",
30
- description: "TEXT",
31
- status: "TEXT NOT NULL DEFAULT 'backlog'",
32
- priority: "INTEGER NOT NULL DEFAULT 5",
33
- assignee_id: "TEXT",
34
- created_by: "TEXT",
35
- parent_id: "TEXT",
36
- chain_origin_id: "TEXT",
37
- chain_depth: "INTEGER NOT NULL DEFAULT 0",
38
- workflow_run_id: "TEXT",
39
- workflow_step_id: "TEXT",
40
- tags: "TEXT NOT NULL DEFAULT '[]'",
41
- context: "TEXT",
42
- result: "TEXT",
43
- retry_count: "INTEGER NOT NULL DEFAULT 0",
44
- max_retries: "INTEGER NOT NULL DEFAULT 0",
45
- next_retry_at: "TEXT",
46
- followup_agent_id: "TEXT",
47
- followup_template: "TEXT",
48
- execution_run_id: "TEXT",
49
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
50
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
51
- deleted_at: "TEXT",
52
- },
53
- tableConstraints: [
54
- "CREATE INDEX IF NOT EXISTS idx_tasks_status_assignee ON tasks(status, assignee_id)",
55
- "CREATE INDEX IF NOT EXISTS idx_tasks_chain_origin ON tasks(chain_origin_id)",
56
- ],
57
- });
58
- db.define("runs", {
59
- columns: {
60
- id: "TEXT PRIMARY KEY",
61
- task_id: "TEXT NOT NULL",
62
- agent_id: "TEXT NOT NULL",
63
- status: "TEXT NOT NULL DEFAULT 'queued'",
64
- model: "TEXT",
65
- adapter: "TEXT",
66
- log_path: "TEXT",
67
- exit_code: "INTEGER",
68
- error_message: "TEXT",
69
- cost_cents: "INTEGER NOT NULL DEFAULT 0",
70
- input_tokens: "INTEGER NOT NULL DEFAULT 0",
71
- output_tokens: "INTEGER NOT NULL DEFAULT 0",
72
- started_at: "TEXT",
73
- completed_at: "TEXT",
74
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
75
- },
76
- tableConstraints: [
77
- "CREATE INDEX IF NOT EXISTS idx_runs_task_id ON runs(task_id)",
78
- "CREATE INDEX IF NOT EXISTS idx_runs_agent_id ON runs(agent_id)",
79
- "CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)",
80
- ],
81
- });
82
- db.define("wakeups", {
83
- columns: {
84
- id: "TEXT PRIMARY KEY",
85
- agent_id: "TEXT NOT NULL",
86
- scheduled_at: "TEXT NOT NULL",
87
- fired_at: "TEXT",
88
- run_id: "TEXT",
89
- context: "TEXT",
90
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
91
- },
92
- tableConstraints: [
93
- "CREATE INDEX IF NOT EXISTS idx_wakeups_agent_scheduled ON wakeups(agent_id, scheduled_at)",
94
- ],
95
- });
96
- db.define("messages", {
97
- columns: {
98
- id: "TEXT PRIMARY KEY",
99
- channel: "TEXT NOT NULL DEFAULT 'slack'",
100
- direction: "TEXT NOT NULL DEFAULT 'inbound'",
101
- from_user: "TEXT",
102
- from_agent: "TEXT",
103
- agent_id: "TEXT",
104
- user_id: "TEXT",
105
- body: "TEXT NOT NULL",
106
- thread_id: "TEXT",
107
- task_id: "TEXT",
108
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
109
- deleted_at: "TEXT",
110
- },
111
- tableConstraints: [
112
- "CREATE INDEX IF NOT EXISTS idx_messages_created ON messages(created_at)",
113
- "CREATE INDEX IF NOT EXISTS idx_messages_thread ON messages(thread_id)",
114
- "CREATE INDEX IF NOT EXISTS idx_messages_agent ON messages(agent_id)",
115
- ],
116
- });
117
- db.define("sessions", {
118
- columns: {
119
- id: "TEXT PRIMARY KEY",
120
- agent_id: "TEXT NOT NULL",
121
- channel: "TEXT NOT NULL",
122
- peer_id: "TEXT NOT NULL",
123
- user_id: "TEXT",
124
- context: "TEXT NOT NULL DEFAULT '{}'",
125
- message_count: "INTEGER NOT NULL DEFAULT 0",
126
- last_message_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
127
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
128
- expires_at: "TEXT",
129
- },
130
- tableConstraints: [
131
- "CREATE UNIQUE INDEX IF NOT EXISTS idx_sessions_agent_channel_peer ON sessions(agent_id, channel, peer_id)",
132
- ],
133
- });
134
- db.define("skills", {
135
- columns: {
136
- id: "TEXT PRIMARY KEY",
137
- slug: "TEXT UNIQUE NOT NULL",
138
- name: "TEXT NOT NULL",
139
- description: "TEXT",
140
- category: "TEXT",
141
- definition: "TEXT",
142
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
143
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
144
- deleted_at: "TEXT",
145
- },
146
- });
147
- db.define("agent_skills", {
148
- columns: {
149
- agent_id: "TEXT NOT NULL",
150
- skill_id: "TEXT NOT NULL",
151
- granted_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
152
- },
153
- primaryKey: ["agent_id", "skill_id"],
154
- tableConstraints: [
155
- "FOREIGN KEY (agent_id) REFERENCES agents(id)",
156
- "FOREIGN KEY (skill_id) REFERENCES skills(id)",
157
- ],
158
- });
159
- db.define("cost_events", {
160
- columns: {
161
- id: "TEXT PRIMARY KEY",
162
- agent_id: "TEXT",
163
- run_id: "TEXT",
164
- model: "TEXT NOT NULL",
165
- provider: "TEXT NOT NULL",
166
- input_tokens: "INTEGER NOT NULL DEFAULT 0",
167
- output_tokens: "INTEGER NOT NULL DEFAULT 0",
168
- cost_cents: "INTEGER NOT NULL DEFAULT 0",
169
- recorded_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
170
- },
171
- tableConstraints: [
172
- "CREATE INDEX IF NOT EXISTS idx_cost_events_agent ON cost_events(agent_id, recorded_at)",
173
- ],
174
- });
175
- db.define("budget_policies", {
176
- columns: {
177
- id: "TEXT PRIMARY KEY",
178
- agent_id: "TEXT",
179
- scope: "TEXT NOT NULL DEFAULT 'global'",
180
- monthly_limit_cents: "INTEGER NOT NULL",
181
- warn_percent: "INTEGER NOT NULL DEFAULT 80",
182
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
183
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
184
- },
185
- });
186
- db.define("activity_log", {
187
- columns: {
188
- id: "TEXT PRIMARY KEY",
189
- agent_id: "TEXT",
190
- event_type: "TEXT NOT NULL",
191
- payload: "TEXT NOT NULL DEFAULT '{}'",
192
- recorded_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
193
- },
194
- tableConstraints: [
195
- "CREATE INDEX IF NOT EXISTS idx_activity_log_recorded ON activity_log(recorded_at)",
196
- "CREATE INDEX IF NOT EXISTS idx_activity_log_agent ON activity_log(agent_id, recorded_at)",
197
- ],
198
- });
199
- db.define("notifications", {
200
- columns: {
201
- id: "TEXT PRIMARY KEY",
202
- channel: "TEXT NOT NULL",
203
- recipient_id: "TEXT NOT NULL",
204
- message: "TEXT NOT NULL",
205
- status: "TEXT NOT NULL DEFAULT 'pending'",
206
- retries: "INTEGER NOT NULL DEFAULT 0",
207
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
208
- sent_at: "TEXT",
209
- error: "TEXT",
210
- },
211
- tableConstraints: [
212
- "CREATE INDEX IF NOT EXISTS idx_notifications_pending ON notifications(status, created_at)",
213
- ],
214
- });
215
- db.define("config_revisions", {
216
- columns: {
217
- id: "TEXT PRIMARY KEY",
218
- version: "INTEGER NOT NULL",
219
- config_yaml: "TEXT NOT NULL",
220
- applied_by: "TEXT",
221
- applied_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
222
- notes: "TEXT",
223
- },
224
- });
225
- db.define("workflows", {
226
- columns: {
227
- id: "TEXT PRIMARY KEY",
228
- slug: "TEXT UNIQUE NOT NULL",
229
- name: "TEXT NOT NULL",
230
- description: "TEXT",
231
- definition: "TEXT NOT NULL DEFAULT '{}'",
232
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
233
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
234
- deleted_at: "TEXT",
235
- },
236
- });
237
- db.define("workflow_runs", {
238
- columns: {
239
- id: "TEXT PRIMARY KEY",
240
- workflow_id: "TEXT NOT NULL",
241
- trigger_task_id: "TEXT",
242
- status: "TEXT NOT NULL DEFAULT 'running'",
243
- current_step: "TEXT",
244
- step_results: "TEXT NOT NULL DEFAULT '{}'",
245
- error: "TEXT",
246
- started_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
247
- completed_at: "TEXT",
248
- },
249
- tableConstraints: [
250
- "CREATE INDEX IF NOT EXISTS idx_workflow_runs_workflow ON workflow_runs(workflow_id, status)",
251
- ],
252
- });
253
- db.define("update_history", {
254
- columns: {
255
- id: "TEXT PRIMARY KEY",
256
- from_version: "TEXT NOT NULL",
257
- to_version: "TEXT NOT NULL",
258
- status: "TEXT NOT NULL DEFAULT 'pending'",
259
- migration_log: "TEXT",
260
- applied_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
261
- rolled_back_at: "TEXT",
262
- },
263
- });
264
- // --- Protected primitives (v0.2.0) ---
265
- db.define("users", {
266
- columns: {
267
- id: "TEXT PRIMARY KEY",
268
- org_id: "TEXT",
269
- name: "TEXT NOT NULL",
270
- email: "TEXT",
271
- role: "TEXT",
272
- title: "TEXT",
273
- external_id: "TEXT",
274
- channel: "TEXT",
275
- timezone: "TEXT",
276
- preferences: "TEXT NOT NULL DEFAULT '{}'",
277
- notes: "TEXT",
278
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
279
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
280
- deleted_at: "TEXT",
281
- },
282
- tableConstraints: [
283
- "CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email) WHERE email IS NOT NULL AND deleted_at IS NULL",
284
- "CREATE INDEX IF NOT EXISTS idx_users_external_id ON users(external_id) WHERE deleted_at IS NULL",
285
- ],
286
- });
287
- db.define("user_identities", {
288
- columns: {
289
- id: "TEXT PRIMARY KEY",
290
- user_id: "TEXT NOT NULL",
291
- channel: "TEXT NOT NULL",
292
- external_id: "TEXT NOT NULL",
293
- display_name: "TEXT",
294
- verified: "INTEGER NOT NULL DEFAULT 0",
295
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
296
- },
297
- tableConstraints: [
298
- "CREATE UNIQUE INDEX IF NOT EXISTS idx_user_identities_channel_ext ON user_identities(channel, external_id)",
299
- "FOREIGN KEY (user_id) REFERENCES users(id)",
300
- ],
301
- });
302
- db.define("schedules", {
303
- columns: {
304
- id: "TEXT PRIMARY KEY",
305
- name: "TEXT NOT NULL",
306
- description: "TEXT",
307
- type: "TEXT NOT NULL DEFAULT 'recurring'",
308
- cron: "TEXT",
309
- run_at: "TEXT",
310
- timezone: "TEXT DEFAULT 'UTC'",
311
- enabled: "INTEGER NOT NULL DEFAULT 1",
312
- action: "TEXT NOT NULL",
313
- action_config: "TEXT DEFAULT '{}'",
314
- last_fired_at: "TEXT",
315
- next_fire_at: "TEXT",
316
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
317
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
318
- deleted_at: "TEXT",
319
- },
320
- tableConstraints: [
321
- "CREATE UNIQUE INDEX IF NOT EXISTS idx_schedules_name ON schedules(name) WHERE deleted_at IS NULL",
322
- "CREATE INDEX IF NOT EXISTS idx_schedules_next ON schedules(enabled, next_fire_at) WHERE deleted_at IS NULL",
323
- ],
324
- });
325
- db.define("secrets", {
326
- columns: {
327
- id: "TEXT PRIMARY KEY",
328
- org_id: "TEXT",
329
- name: "TEXT NOT NULL",
330
- type: "TEXT NOT NULL DEFAULT 'api_key'",
331
- environment: "TEXT NOT NULL DEFAULT 'production'",
332
- value: "TEXT",
333
- location: "TEXT",
334
- description: "TEXT",
335
- rotation_schedule: "TEXT",
336
- expires_at: "TEXT",
337
- notes: "TEXT",
338
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
339
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
340
- deleted_at: "TEXT",
341
- },
342
- tableConstraints: [
343
- "CREATE UNIQUE INDEX IF NOT EXISTS idx_secrets_name_env ON secrets(name, environment, org_id) WHERE deleted_at IS NULL",
344
- ],
345
- });
346
- // --- Learning pipeline (v1.6.0) ---
347
- db.define("feedback", {
348
- columns: {
349
- id: "TEXT PRIMARY KEY",
350
- agent_id: "TEXT NOT NULL",
351
- task_id: "TEXT",
352
- issue: "TEXT NOT NULL",
353
- root_cause: "TEXT",
354
- severity: "TEXT NOT NULL DEFAULT 'medium'",
355
- repeatable: "INTEGER NOT NULL DEFAULT 0",
356
- accuracy_score: "REAL",
357
- efficiency_score: "REAL",
358
- tags: "TEXT NOT NULL DEFAULT '[]'",
359
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
360
- },
361
- tableConstraints: [
362
- "CREATE INDEX IF NOT EXISTS idx_feedback_agent ON feedback(agent_id, created_at)",
363
- "CREATE INDEX IF NOT EXISTS idx_feedback_issue ON feedback(issue)",
364
- ],
365
- });
366
- db.define("playbooks", {
367
- columns: {
368
- id: "TEXT PRIMARY KEY",
369
- pattern: "TEXT NOT NULL",
370
- rule: "TEXT NOT NULL",
371
- feedback_ids: "TEXT NOT NULL DEFAULT '[]'",
372
- project_scoped: "INTEGER NOT NULL DEFAULT 1",
373
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
374
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
375
- deleted_at: "TEXT",
376
- },
377
- tableConstraints: [
378
- "CREATE INDEX IF NOT EXISTS idx_playbooks_pattern ON playbooks(pattern)",
379
- ],
380
- });
381
- db.define("agent_playbooks", {
382
- columns: {
383
- agent_id: "TEXT NOT NULL",
384
- playbook_id: "TEXT NOT NULL",
385
- assigned_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
386
- },
387
- primaryKey: ["agent_id", "playbook_id"],
388
- tableConstraints: [
389
- "FOREIGN KEY (agent_id) REFERENCES agents(id)",
390
- "FOREIGN KEY (playbook_id) REFERENCES playbooks(id)",
391
- ],
392
- });
393
- // --- Chat layer (v1.7.0) ---
394
- db.define("message_attachments", {
395
- columns: {
396
- id: "TEXT PRIMARY KEY",
397
- message_id: "TEXT NOT NULL",
398
- file_type: "TEXT NOT NULL DEFAULT 'file'",
399
- filename: "TEXT",
400
- mime_type: "TEXT",
401
- size_bytes: "INTEGER",
402
- contents: "TEXT",
403
- summary: "TEXT",
404
- url: "TEXT",
405
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
406
- },
407
- tableConstraints: [
408
- "CREATE INDEX IF NOT EXISTS idx_message_attachments_message ON message_attachments(message_id)",
409
- "FOREIGN KEY (message_id) REFERENCES messages(id)",
410
- ],
411
- });
412
- db.define("thread_task_map", {
413
- columns: {
414
- id: "TEXT PRIMARY KEY",
415
- thread_ts: "TEXT NOT NULL",
416
- channel_id: "TEXT NOT NULL",
417
- task_id: "TEXT NOT NULL",
418
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
419
- },
420
- tableConstraints: [
421
- "CREATE UNIQUE INDEX IF NOT EXISTS idx_thread_task_map_thread ON thread_task_map(thread_ts, channel_id)",
422
- "CREATE INDEX IF NOT EXISTS idx_thread_task_map_task ON thread_task_map(task_id)",
423
- ],
424
- });
425
- db.define("message_dedup", {
426
- columns: {
427
- id: "TEXT PRIMARY KEY",
428
- content_hash: "TEXT NOT NULL",
429
- channel_id: "TEXT NOT NULL",
430
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
431
- },
432
- tableConstraints: [
433
- "CREATE INDEX IF NOT EXISTS idx_message_dedup_hash ON message_dedup(content_hash, created_at)",
434
- ],
435
- });
436
- db.define("memories", {
437
- columns: {
438
- id: "TEXT PRIMARY KEY",
439
- message_id: "TEXT",
440
- user_id: "TEXT",
441
- summary: "TEXT NOT NULL",
442
- contents: "TEXT NOT NULL",
443
- tags: "TEXT NOT NULL DEFAULT '[]'",
444
- category: "TEXT",
445
- created_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
446
- updated_at: "TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP",
447
- deleted_at: "TEXT",
448
- },
449
- tableConstraints: [
450
- "CREATE INDEX IF NOT EXISTS idx_memories_user ON memories(user_id, created_at)",
451
- "CREATE INDEX IF NOT EXISTS idx_memories_message ON memories(message_id)",
452
- ],
453
- });
454
- }
@@ -1,67 +0,0 @@
1
- import type { HookBus } from '../hooks/hook-bus.js';
2
- import type { EntityContextDef, PkLookup, QueryOptions, Row, SeedItem, TableDefinition, TableInfoRow } from './types.js';
3
- export declare class DataStoreError extends Error {
4
- constructor(message: string);
5
- }
6
- /**
7
- * Thin wrapper around Lattice that provides the botinabox DataStore API.
8
- *
9
- * Delegates all data operations to the latticesql package. Application-level
10
- * events (task.created, run.completed, etc.) remain on the HookBus — they are
11
- * emitted by orchestrator modules, not the data layer.
12
- */
13
- export declare class DataStore {
14
- private lattice;
15
- private readonly hooks;
16
- private readonly outputDir;
17
- private _initialized;
18
- private readonly deferredStatements;
19
- constructor(opts: {
20
- dbPath: string;
21
- outputDir?: string;
22
- wal?: boolean;
23
- hooks?: HookBus;
24
- });
25
- /**
26
- * Register a table definition. Must be called before init().
27
- *
28
- * tableConstraints may contain both inline constraints (FOREIGN KEY, UNIQUE)
29
- * and standalone SQL statements (CREATE INDEX). Standalone statements are
30
- * deferred and executed after init() creates the tables.
31
- */
32
- define(name: string, def: TableDefinition): void;
33
- /**
34
- * Register an entity context definition for per-entity file rendering.
35
- */
36
- defineEntityContext(name: string, def: EntityContextDef): void;
37
- init(opts?: {
38
- migrations?: Array<{
39
- version: string;
40
- sql: string;
41
- }>;
42
- }): Promise<void>;
43
- private assertInitialized;
44
- insert(table: string, row: Row): Promise<Row>;
45
- upsert(table: string, row: Row): Promise<Row>;
46
- update(table: string, pk: PkLookup, changes: Row): Promise<Row>;
47
- delete(table: string, pk: PkLookup): Promise<void>;
48
- /**
49
- * Get a single row by primary key.
50
- * Returns undefined if not found (Lattice returns null).
51
- */
52
- get(table: string, pk: PkLookup): Promise<Row | undefined>;
53
- query(table: string, opts?: QueryOptions): Promise<Row[]>;
54
- count(table: string, opts?: QueryOptions): Promise<number>;
55
- link(junctionTable: string, row: Row): Promise<void>;
56
- unlink(junctionTable: string, row: Row): Promise<void>;
57
- migrate(migrations: Array<{
58
- version: string;
59
- sql: string;
60
- }>): Promise<void>;
61
- seed(items: SeedItem[]): Promise<void>;
62
- render(): Promise<void>;
63
- reconcile(): Promise<void>;
64
- tableInfo(table: string): TableInfoRow[];
65
- close(): void;
66
- on(event: string, handler: (context: Record<string, unknown>) => void): void;
67
- }