botinabox 2.4.3 → 2.5.1

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 (276) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +190 -190
  3. package/bin/botinabox.mjs +1 -1
  4. package/dist/cli.js +0 -0
  5. package/dist/connectors/google/index.d.ts +67 -1
  6. package/dist/connectors/google/index.js +240 -0
  7. package/dist/index.js +19 -5
  8. package/package.json +100 -99
  9. package/dist/channels/discord/adapter.d.ts +0 -32
  10. package/dist/channels/discord/adapter.js +0 -70
  11. package/dist/channels/discord/inbound.d.ts +0 -25
  12. package/dist/channels/discord/inbound.js +0 -24
  13. package/dist/channels/discord/models.d.ts +0 -8
  14. package/dist/channels/discord/models.js +0 -5
  15. package/dist/channels/discord/outbound.d.ts +0 -14
  16. package/dist/channels/discord/outbound.js +0 -38
  17. package/dist/channels/slack/adapter.d.ts +0 -33
  18. package/dist/channels/slack/adapter.js +0 -74
  19. package/dist/channels/slack/inbound.d.ts +0 -59
  20. package/dist/channels/slack/inbound.js +0 -96
  21. package/dist/channels/slack/models.d.ts +0 -9
  22. package/dist/channels/slack/models.js +0 -5
  23. package/dist/channels/slack/outbound.d.ts +0 -12
  24. package/dist/channels/slack/outbound.js +0 -18
  25. package/dist/channels/slack/transcribe.d.ts +0 -41
  26. package/dist/channels/slack/transcribe.js +0 -106
  27. package/dist/channels/webhook/adapter.d.ts +0 -23
  28. package/dist/channels/webhook/adapter.js +0 -86
  29. package/dist/channels/webhook/hmac.d.ts +0 -13
  30. package/dist/channels/webhook/hmac.js +0 -26
  31. package/dist/channels/webhook/models.d.ts +0 -9
  32. package/dist/channels/webhook/models.js +0 -5
  33. package/dist/channels/webhook/server.d.ts +0 -20
  34. package/dist/channels/webhook/server.js +0 -91
  35. package/dist/chat-pipeline-C-XlLGNl.d.ts +0 -648
  36. package/dist/chat-pipeline-CR1KF6eX.d.ts +0 -652
  37. package/dist/chat-pipeline-DisuC8SB.d.ts +0 -643
  38. package/dist/chunk-2LGXQPEA.js +0 -41
  39. package/dist/chunk-3X3YKI4T.js +0 -357
  40. package/dist/chunk-D47AIFOD.js +0 -351
  41. package/dist/chunk-DSNJKNEW.js +0 -328
  42. package/dist/chunk-GS2JFL6I.js +0 -144
  43. package/dist/chunk-J6S6QMUY.js +0 -144
  44. package/dist/chunk-QLA6YOFN.js +0 -22
  45. package/dist/chunk-UACT2WXX.js +0 -381
  46. package/dist/cli/templates/config.yml.d.ts +0 -7
  47. package/dist/cli/templates/config.yml.js +0 -61
  48. package/dist/cli/templates/env.d.ts +0 -1
  49. package/dist/cli/templates/env.js +0 -30
  50. package/dist/cli/templates/index.ts.d.ts +0 -2
  51. package/dist/cli/templates/index.ts.js +0 -30
  52. package/dist/cli/templates/package.json.d.ts +0 -5
  53. package/dist/cli/templates/package.json.js +0 -28
  54. package/dist/connector-DDahQw-2.d.ts +0 -63
  55. package/dist/connectors/google/calendar-connector.d.ts +0 -40
  56. package/dist/connectors/google/calendar-connector.js +0 -243
  57. package/dist/connectors/google/gmail-connector.d.ts +0 -42
  58. package/dist/connectors/google/gmail-connector.js +0 -345
  59. package/dist/connectors/google/oauth.d.ts +0 -48
  60. package/dist/connectors/google/oauth.js +0 -112
  61. package/dist/connectors/google/types.d.ts +0 -78
  62. package/dist/connectors/google/types.js +0 -2
  63. package/dist/core/chat/auto-discovery.d.ts +0 -16
  64. package/dist/core/chat/auto-discovery.js +0 -54
  65. package/dist/core/chat/channel-registry.d.ts +0 -45
  66. package/dist/core/chat/channel-registry.js +0 -96
  67. package/dist/core/chat/chat-pipeline.d.ts +0 -113
  68. package/dist/core/chat/chat-pipeline.js +0 -395
  69. package/dist/core/chat/chat-responder.d.ts +0 -90
  70. package/dist/core/chat/chat-responder.js +0 -185
  71. package/dist/core/chat/formatter.d.ts +0 -11
  72. package/dist/core/chat/formatter.js +0 -60
  73. package/dist/core/chat/index.d.ts +0 -24
  74. package/dist/core/chat/index.js +0 -18
  75. package/dist/core/chat/message-interpreter.d.ts +0 -91
  76. package/dist/core/chat/message-interpreter.js +0 -166
  77. package/dist/core/chat/message-store.d.ts +0 -66
  78. package/dist/core/chat/message-store.js +0 -131
  79. package/dist/core/chat/notification-queue.d.ts +0 -34
  80. package/dist/core/chat/notification-queue.js +0 -111
  81. package/dist/core/chat/pipeline.d.ts +0 -38
  82. package/dist/core/chat/pipeline.js +0 -89
  83. package/dist/core/chat/policies.d.ts +0 -16
  84. package/dist/core/chat/policies.js +0 -25
  85. package/dist/core/chat/routing.d.ts +0 -17
  86. package/dist/core/chat/routing.js +0 -36
  87. package/dist/core/chat/session-key.d.ts +0 -30
  88. package/dist/core/chat/session-key.js +0 -65
  89. package/dist/core/chat/session-manager.d.ts +0 -17
  90. package/dist/core/chat/session-manager.js +0 -23
  91. package/dist/core/chat/text-chunker.d.ts +0 -9
  92. package/dist/core/chat/text-chunker.js +0 -48
  93. package/dist/core/chat/triage-router.d.ts +0 -75
  94. package/dist/core/chat/triage-router.js +0 -142
  95. package/dist/core/chat/types.d.ts +0 -5
  96. package/dist/core/chat/types.js +0 -5
  97. package/dist/core/config/defaults.d.ts +0 -2
  98. package/dist/core/config/defaults.js +0 -38
  99. package/dist/core/config/index.d.ts +0 -6
  100. package/dist/core/config/index.js +0 -4
  101. package/dist/core/config/interpolate.d.ts +0 -5
  102. package/dist/core/config/interpolate.js +0 -27
  103. package/dist/core/config/loader.d.ts +0 -24
  104. package/dist/core/config/loader.js +0 -59
  105. package/dist/core/config/schema.d.ts +0 -5
  106. package/dist/core/config/schema.js +0 -119
  107. package/dist/core/data/core-entity-contexts.d.ts +0 -14
  108. package/dist/core/data/core-entity-contexts.js +0 -197
  109. package/dist/core/data/core-migrations.d.ts +0 -5
  110. package/dist/core/data/core-migrations.js +0 -45
  111. package/dist/core/data/core-schema.d.ts +0 -6
  112. package/dist/core/data/core-schema.js +0 -454
  113. package/dist/core/data/data-store.d.ts +0 -67
  114. package/dist/core/data/data-store.js +0 -218
  115. package/dist/core/data/domain-entity-contexts.d.ts +0 -29
  116. package/dist/core/data/domain-entity-contexts.js +0 -321
  117. package/dist/core/data/domain-schema.d.ts +0 -36
  118. package/dist/core/data/domain-schema.js +0 -323
  119. package/dist/core/data/index.d.ts +0 -7
  120. package/dist/core/data/index.js +0 -7
  121. package/dist/core/data/types.d.ts +0 -111
  122. package/dist/core/data/types.js +0 -1
  123. package/dist/core/hooks/hook-bus.d.ts +0 -18
  124. package/dist/core/hooks/hook-bus.js +0 -120
  125. package/dist/core/hooks/index.d.ts +0 -2
  126. package/dist/core/hooks/index.js +0 -1
  127. package/dist/core/hooks/types.d.ts +0 -19
  128. package/dist/core/hooks/types.js +0 -1
  129. package/dist/core/index.d.ts +0 -4
  130. package/dist/core/index.js +0 -4
  131. package/dist/core/llm/auto-discovery.d.ts +0 -11
  132. package/dist/core/llm/auto-discovery.js +0 -49
  133. package/dist/core/llm/cost-tracker.d.ts +0 -6
  134. package/dist/core/llm/cost-tracker.js +0 -38
  135. package/dist/core/llm/index.d.ts +0 -4
  136. package/dist/core/llm/index.js +0 -3
  137. package/dist/core/llm/model-router.d.ts +0 -25
  138. package/dist/core/llm/model-router.js +0 -49
  139. package/dist/core/llm/provider-registry.d.ts +0 -9
  140. package/dist/core/llm/provider-registry.js +0 -25
  141. package/dist/core/llm/types.d.ts +0 -2
  142. package/dist/core/llm/types.js +0 -2
  143. package/dist/core/orchestrator/adapters/api-adapter.d.ts +0 -34
  144. package/dist/core/orchestrator/adapters/api-adapter.js +0 -88
  145. package/dist/core/orchestrator/adapters/cli-adapter.d.ts +0 -22
  146. package/dist/core/orchestrator/adapters/cli-adapter.js +0 -69
  147. package/dist/core/orchestrator/adapters/deterministic-adapter.d.ts +0 -35
  148. package/dist/core/orchestrator/adapters/deterministic-adapter.js +0 -75
  149. package/dist/core/orchestrator/adapters/env-whitelist.d.ts +0 -4
  150. package/dist/core/orchestrator/adapters/env-whitelist.js +0 -27
  151. package/dist/core/orchestrator/adapters/output-extractor.d.ts +0 -11
  152. package/dist/core/orchestrator/adapters/output-extractor.js +0 -59
  153. package/dist/core/orchestrator/adapters/process-manager.d.ts +0 -15
  154. package/dist/core/orchestrator/adapters/process-manager.js +0 -26
  155. package/dist/core/orchestrator/adapters/tool-loop.d.ts +0 -22
  156. package/dist/core/orchestrator/adapters/tool-loop.js +0 -66
  157. package/dist/core/orchestrator/agent-registry.d.ts +0 -31
  158. package/dist/core/orchestrator/agent-registry.js +0 -135
  159. package/dist/core/orchestrator/budget-controller.d.ts +0 -19
  160. package/dist/core/orchestrator/budget-controller.js +0 -73
  161. package/dist/core/orchestrator/chain-guard.d.ts +0 -14
  162. package/dist/core/orchestrator/chain-guard.js +0 -23
  163. package/dist/core/orchestrator/circuit-breaker.d.ts +0 -65
  164. package/dist/core/orchestrator/circuit-breaker.js +0 -159
  165. package/dist/core/orchestrator/claude-stream-parser.d.ts +0 -31
  166. package/dist/core/orchestrator/claude-stream-parser.js +0 -99
  167. package/dist/core/orchestrator/config-revisions.d.ts +0 -6
  168. package/dist/core/orchestrator/config-revisions.js +0 -17
  169. package/dist/core/orchestrator/dependency-resolver.d.ts +0 -20
  170. package/dist/core/orchestrator/dependency-resolver.js +0 -78
  171. package/dist/core/orchestrator/governance-gate.d.ts +0 -110
  172. package/dist/core/orchestrator/governance-gate.js +0 -170
  173. package/dist/core/orchestrator/learning-pipeline.d.ts +0 -109
  174. package/dist/core/orchestrator/learning-pipeline.js +0 -249
  175. package/dist/core/orchestrator/loop-detector.d.ts +0 -51
  176. package/dist/core/orchestrator/loop-detector.js +0 -133
  177. package/dist/core/orchestrator/ndjson-logger.d.ts +0 -6
  178. package/dist/core/orchestrator/ndjson-logger.js +0 -18
  179. package/dist/core/orchestrator/permission-relay.d.ts +0 -72
  180. package/dist/core/orchestrator/permission-relay.js +0 -164
  181. package/dist/core/orchestrator/run-manager.d.ts +0 -31
  182. package/dist/core/orchestrator/run-manager.js +0 -178
  183. package/dist/core/orchestrator/scheduler.d.ts +0 -70
  184. package/dist/core/orchestrator/scheduler.js +0 -198
  185. package/dist/core/orchestrator/secret-store.d.ts +0 -57
  186. package/dist/core/orchestrator/secret-store.js +0 -171
  187. package/dist/core/orchestrator/session-manager.d.ts +0 -13
  188. package/dist/core/orchestrator/session-manager.js +0 -66
  189. package/dist/core/orchestrator/task-queue.d.ts +0 -34
  190. package/dist/core/orchestrator/task-queue.js +0 -83
  191. package/dist/core/orchestrator/template-interpolate.d.ts +0 -5
  192. package/dist/core/orchestrator/template-interpolate.js +0 -18
  193. package/dist/core/orchestrator/user-registry.d.ts +0 -47
  194. package/dist/core/orchestrator/user-registry.js +0 -76
  195. package/dist/core/orchestrator/wakeup-queue.d.ts +0 -9
  196. package/dist/core/orchestrator/wakeup-queue.js +0 -45
  197. package/dist/core/orchestrator/workflow-engine.d.ts +0 -47
  198. package/dist/core/orchestrator/workflow-engine.js +0 -204
  199. package/dist/core/security/audit.d.ts +0 -20
  200. package/dist/core/security/audit.js +0 -33
  201. package/dist/core/security/column-validator.d.ts +0 -20
  202. package/dist/core/security/column-validator.js +0 -37
  203. package/dist/core/security/index.d.ts +0 -5
  204. package/dist/core/security/index.js +0 -5
  205. package/dist/core/security/process-env.d.ts +0 -13
  206. package/dist/core/security/process-env.js +0 -49
  207. package/dist/core/security/sanitizer.d.ts +0 -11
  208. package/dist/core/security/sanitizer.js +0 -39
  209. package/dist/core/security/types.d.ts +0 -11
  210. package/dist/core/security/types.js +0 -1
  211. package/dist/core/update/auto-update.d.ts +0 -21
  212. package/dist/core/update/auto-update.js +0 -102
  213. package/dist/core/update/backup-manager.d.ts +0 -7
  214. package/dist/core/update/backup-manager.js +0 -24
  215. package/dist/core/update/index.d.ts +0 -8
  216. package/dist/core/update/index.js +0 -6
  217. package/dist/core/update/migration-hooks.d.ts +0 -11
  218. package/dist/core/update/migration-hooks.js +0 -10
  219. package/dist/core/update/types.d.ts +0 -11
  220. package/dist/core/update/types.js +0 -1
  221. package/dist/core/update/update-checker.d.ts +0 -11
  222. package/dist/core/update/update-checker.js +0 -63
  223. package/dist/core/update/update-manager.d.ts +0 -25
  224. package/dist/core/update/update-manager.js +0 -101
  225. package/dist/core/update/version-utils.d.ts +0 -6
  226. package/dist/core/update/version-utils.js +0 -34
  227. package/dist/gmail-connector-2FVYTQJH.js +0 -6
  228. package/dist/gmail-connector-MNUBRNFM.js +0 -6
  229. package/dist/gmail-connector-PS2VLGNE.js +0 -6
  230. package/dist/gmail-connector-ULSMN6X2.js +0 -6
  231. package/dist/gmail-connector-URRFX6A3.js +0 -6
  232. package/dist/inbound-AFBUPSPG.js +0 -10
  233. package/dist/inbound-AFOHYNUY.js +0 -6
  234. package/dist/inbound-CGIXRXGC.js +0 -8
  235. package/dist/inbound-MCOLRH6U.js +0 -10
  236. package/dist/inbound-SNEMBLGA.js +0 -6
  237. package/dist/inbound-ZJHAYVMF.js +0 -10
  238. package/dist/provider-qqJYv9nv.d.ts +0 -75
  239. package/dist/providers/anthropic/models.d.ts +0 -2
  240. package/dist/providers/anthropic/models.js +0 -29
  241. package/dist/providers/anthropic/provider.d.ts +0 -13
  242. package/dist/providers/anthropic/provider.js +0 -119
  243. package/dist/providers/anthropic/tool-converter.d.ts +0 -10
  244. package/dist/providers/anthropic/tool-converter.js +0 -7
  245. package/dist/providers/ollama/provider.d.ts +0 -17
  246. package/dist/providers/ollama/provider.js +0 -185
  247. package/dist/providers/openai/models.d.ts +0 -2
  248. package/dist/providers/openai/models.js +0 -29
  249. package/dist/providers/openai/provider.d.ts +0 -13
  250. package/dist/providers/openai/provider.js +0 -163
  251. package/dist/providers/openai/tool-converter.d.ts +0 -10
  252. package/dist/providers/openai/tool-converter.js +0 -10
  253. package/dist/shared/constants.d.ts +0 -50
  254. package/dist/shared/constants.js +0 -64
  255. package/dist/shared/index.d.ts +0 -14
  256. package/dist/shared/index.js +0 -14
  257. package/dist/shared/types/agent.d.ts +0 -36
  258. package/dist/shared/types/agent.js +0 -2
  259. package/dist/shared/types/channel.d.ts +0 -70
  260. package/dist/shared/types/channel.js +0 -2
  261. package/dist/shared/types/config.d.ts +0 -111
  262. package/dist/shared/types/config.js +0 -2
  263. package/dist/shared/types/connector.d.ts +0 -77
  264. package/dist/shared/types/connector.js +0 -2
  265. package/dist/shared/types/execution.d.ts +0 -29
  266. package/dist/shared/types/execution.js +0 -2
  267. package/dist/shared/types/provider.d.ts +0 -73
  268. package/dist/shared/types/provider.js +0 -2
  269. package/dist/shared/types/task.d.ts +0 -47
  270. package/dist/shared/types/task.js +0 -2
  271. package/dist/shared/types/workflow.d.ts +0 -39
  272. package/dist/shared/types/workflow.js +0 -2
  273. package/dist/shared/utils.d.ts +0 -6
  274. package/dist/shared/utils.js +0 -13
  275. package/dist/update-check.d.ts +0 -5
  276. 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
- }