stagent 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 (333) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +399 -0
  3. package/components.json +21 -0
  4. package/dist/cli.js +171 -0
  5. package/drizzle.config.ts +12 -0
  6. package/next.config.mjs +15 -0
  7. package/package.json +114 -0
  8. package/postcss.config.mjs +8 -0
  9. package/public/icon-512.png +0 -0
  10. package/public/icon.svg +13 -0
  11. package/public/readme/home-workspace.png +0 -0
  12. package/public/readme/inbox-approvals.png +0 -0
  13. package/public/readme/workflow-blueprints.png +0 -0
  14. package/public/stagent-s-128.png +0 -0
  15. package/public/stagent-s-64.png +0 -0
  16. package/src/app/api/blueprints/[id]/instantiate/route.ts +27 -0
  17. package/src/app/api/blueprints/[id]/route.ts +39 -0
  18. package/src/app/api/blueprints/import/route.ts +68 -0
  19. package/src/app/api/blueprints/route.ts +29 -0
  20. package/src/app/api/command-palette/recent/route.ts +31 -0
  21. package/src/app/api/data/clear/route.ts +22 -0
  22. package/src/app/api/data/seed/route.ts +22 -0
  23. package/src/app/api/documents/[id]/file/route.ts +44 -0
  24. package/src/app/api/documents/[id]/route.ts +123 -0
  25. package/src/app/api/documents/route.ts +59 -0
  26. package/src/app/api/logs/stream/route.ts +101 -0
  27. package/src/app/api/notifications/[id]/route.ts +36 -0
  28. package/src/app/api/notifications/mark-all-read/route.ts +13 -0
  29. package/src/app/api/notifications/pending-approvals/route.ts +10 -0
  30. package/src/app/api/notifications/pending-approvals/stream/route.ts +101 -0
  31. package/src/app/api/notifications/route.ts +34 -0
  32. package/src/app/api/permissions/route.ts +46 -0
  33. package/src/app/api/profiles/[id]/route.ts +79 -0
  34. package/src/app/api/profiles/[id]/test/route.ts +42 -0
  35. package/src/app/api/profiles/import/route.ts +108 -0
  36. package/src/app/api/profiles/route.ts +50 -0
  37. package/src/app/api/projects/[id]/route.ts +72 -0
  38. package/src/app/api/projects/route.ts +53 -0
  39. package/src/app/api/schedules/[id]/route.ts +185 -0
  40. package/src/app/api/schedules/route.ts +117 -0
  41. package/src/app/api/settings/budgets/route.ts +24 -0
  42. package/src/app/api/settings/openai/route.ts +24 -0
  43. package/src/app/api/settings/route.ts +21 -0
  44. package/src/app/api/settings/test/route.ts +26 -0
  45. package/src/app/api/tasks/[id]/cancel/route.ts +21 -0
  46. package/src/app/api/tasks/[id]/execute/route.ts +90 -0
  47. package/src/app/api/tasks/[id]/logs/route.ts +95 -0
  48. package/src/app/api/tasks/[id]/output/route.ts +47 -0
  49. package/src/app/api/tasks/[id]/respond/route.ts +64 -0
  50. package/src/app/api/tasks/[id]/resume/route.ts +76 -0
  51. package/src/app/api/tasks/[id]/route.ts +77 -0
  52. package/src/app/api/tasks/assist/route.ts +35 -0
  53. package/src/app/api/tasks/route.ts +82 -0
  54. package/src/app/api/uploads/[id]/route.ts +81 -0
  55. package/src/app/api/uploads/cleanup/route.ts +7 -0
  56. package/src/app/api/uploads/route.ts +66 -0
  57. package/src/app/api/workflows/[id]/execute/route.ts +82 -0
  58. package/src/app/api/workflows/[id]/route.ts +133 -0
  59. package/src/app/api/workflows/[id]/status/route.ts +54 -0
  60. package/src/app/api/workflows/[id]/steps/[stepId]/retry/route.ts +22 -0
  61. package/src/app/api/workflows/route.ts +61 -0
  62. package/src/app/apple-icon.tsx +31 -0
  63. package/src/app/costs/page.tsx +256 -0
  64. package/src/app/dashboard/page.tsx +44 -0
  65. package/src/app/documents/[id]/page.tsx +46 -0
  66. package/src/app/documents/page.tsx +45 -0
  67. package/src/app/error.tsx +26 -0
  68. package/src/app/global-error.tsx +23 -0
  69. package/src/app/globals.css +733 -0
  70. package/src/app/icon.tsx +30 -0
  71. package/src/app/inbox/loading.tsx +15 -0
  72. package/src/app/inbox/page.tsx +35 -0
  73. package/src/app/layout.tsx +78 -0
  74. package/src/app/manifest.ts +32 -0
  75. package/src/app/monitor/page.tsx +37 -0
  76. package/src/app/page.tsx +162 -0
  77. package/src/app/profiles/[id]/edit/page.tsx +39 -0
  78. package/src/app/profiles/[id]/page.tsx +33 -0
  79. package/src/app/profiles/new/page.tsx +22 -0
  80. package/src/app/profiles/page.tsx +19 -0
  81. package/src/app/projects/[id]/page.tsx +134 -0
  82. package/src/app/projects/loading.tsx +17 -0
  83. package/src/app/projects/page.tsx +32 -0
  84. package/src/app/schedules/[id]/page.tsx +47 -0
  85. package/src/app/schedules/page.tsx +18 -0
  86. package/src/app/settings/loading.tsx +24 -0
  87. package/src/app/settings/page.tsx +27 -0
  88. package/src/app/tasks/[id]/page.tsx +45 -0
  89. package/src/app/tasks/new/page.tsx +27 -0
  90. package/src/app/workflows/[id]/edit/page.tsx +66 -0
  91. package/src/app/workflows/[id]/page.tsx +37 -0
  92. package/src/app/workflows/blueprints/[id]/page.tsx +40 -0
  93. package/src/app/workflows/blueprints/new/page.tsx +20 -0
  94. package/src/app/workflows/blueprints/page.tsx +11 -0
  95. package/src/app/workflows/new/page.tsx +36 -0
  96. package/src/app/workflows/page.tsx +18 -0
  97. package/src/components/charts/donut-ring.tsx +64 -0
  98. package/src/components/charts/mini-bar.tsx +75 -0
  99. package/src/components/charts/sparkline.tsx +107 -0
  100. package/src/components/costs/cost-dashboard.tsx +877 -0
  101. package/src/components/costs/cost-filters.tsx +179 -0
  102. package/src/components/dashboard/activity-feed.tsx +95 -0
  103. package/src/components/dashboard/greeting.tsx +30 -0
  104. package/src/components/dashboard/priority-queue.tsx +79 -0
  105. package/src/components/dashboard/quick-actions.tsx +62 -0
  106. package/src/components/dashboard/recent-projects.tsx +79 -0
  107. package/src/components/dashboard/stats-cards.tsx +114 -0
  108. package/src/components/documents/document-browser.tsx +235 -0
  109. package/src/components/documents/document-detail-view.tsx +367 -0
  110. package/src/components/documents/document-grid.tsx +78 -0
  111. package/src/components/documents/document-preview.tsx +68 -0
  112. package/src/components/documents/document-table.tsx +119 -0
  113. package/src/components/documents/document-upload-dialog.tsx +153 -0
  114. package/src/components/documents/types.ts +6 -0
  115. package/src/components/documents/utils.ts +57 -0
  116. package/src/components/monitoring/connection-indicator.tsx +14 -0
  117. package/src/components/monitoring/log-entry.tsx +79 -0
  118. package/src/components/monitoring/log-filters.tsx +57 -0
  119. package/src/components/monitoring/log-stream.tsx +144 -0
  120. package/src/components/monitoring/monitor-overview-wrapper.tsx +64 -0
  121. package/src/components/monitoring/monitor-overview.tsx +119 -0
  122. package/src/components/notifications/failure-action.tsx +38 -0
  123. package/src/components/notifications/inbox-list.tsx +165 -0
  124. package/src/components/notifications/message-response.tsx +196 -0
  125. package/src/components/notifications/notification-item.tsx +250 -0
  126. package/src/components/notifications/pending-approval-host.tsx +478 -0
  127. package/src/components/notifications/permission-action.tsx +37 -0
  128. package/src/components/notifications/permission-response-actions.tsx +126 -0
  129. package/src/components/notifications/unread-badge.tsx +35 -0
  130. package/src/components/profiles/profile-browser.tsx +117 -0
  131. package/src/components/profiles/profile-card.tsx +78 -0
  132. package/src/components/profiles/profile-detail-view.tsx +564 -0
  133. package/src/components/profiles/profile-form-view.tsx +480 -0
  134. package/src/components/profiles/profile-import-dialog.tsx +113 -0
  135. package/src/components/projects/project-card.tsx +58 -0
  136. package/src/components/projects/project-create-dialog.tsx +140 -0
  137. package/src/components/projects/project-detail.tsx +68 -0
  138. package/src/components/projects/project-edit-dialog.tsx +219 -0
  139. package/src/components/projects/project-list.tsx +108 -0
  140. package/src/components/schedules/schedule-create-dialog.tsx +403 -0
  141. package/src/components/schedules/schedule-detail-view.tsx +274 -0
  142. package/src/components/schedules/schedule-list.tsx +242 -0
  143. package/src/components/schedules/schedule-status-badge.tsx +16 -0
  144. package/src/components/settings/api-key-form.tsx +141 -0
  145. package/src/components/settings/auth-config-section.tsx +141 -0
  146. package/src/components/settings/auth-method-selector.tsx +67 -0
  147. package/src/components/settings/auth-status-badge.tsx +40 -0
  148. package/src/components/settings/auth-status-dot.tsx +59 -0
  149. package/src/components/settings/budget-guardrails-section.tsx +842 -0
  150. package/src/components/settings/data-management-section.tsx +141 -0
  151. package/src/components/settings/openai-runtime-section.tsx +104 -0
  152. package/src/components/settings/permissions-section.tsx +91 -0
  153. package/src/components/shared/app-sidebar.tsx +123 -0
  154. package/src/components/shared/card-skeleton.tsx +42 -0
  155. package/src/components/shared/command-palette.tsx +250 -0
  156. package/src/components/shared/confirm-dialog.tsx +52 -0
  157. package/src/components/shared/empty-state.tsx +24 -0
  158. package/src/components/shared/error-state.tsx +32 -0
  159. package/src/components/shared/form-section-card.tsx +33 -0
  160. package/src/components/shared/section-heading.tsx +14 -0
  161. package/src/components/shared/stagent-logo.tsx +21 -0
  162. package/src/components/shared/theme-toggle.tsx +46 -0
  163. package/src/components/tasks/ai-assist-panel.tsx +210 -0
  164. package/src/components/tasks/content-preview.tsx +89 -0
  165. package/src/components/tasks/empty-board.tsx +12 -0
  166. package/src/components/tasks/file-upload.tsx +120 -0
  167. package/src/components/tasks/kanban-board.tsx +275 -0
  168. package/src/components/tasks/kanban-column.tsx +75 -0
  169. package/src/components/tasks/skeleton-board.tsx +21 -0
  170. package/src/components/tasks/task-attachments.tsx +114 -0
  171. package/src/components/tasks/task-card.tsx +101 -0
  172. package/src/components/tasks/task-create-panel.tsx +360 -0
  173. package/src/components/tasks/task-detail-view.tsx +356 -0
  174. package/src/components/ui/alert-dialog.tsx +196 -0
  175. package/src/components/ui/badge.tsx +50 -0
  176. package/src/components/ui/button.tsx +71 -0
  177. package/src/components/ui/card.tsx +92 -0
  178. package/src/components/ui/checkbox.tsx +32 -0
  179. package/src/components/ui/command.tsx +184 -0
  180. package/src/components/ui/dialog.tsx +158 -0
  181. package/src/components/ui/dropdown-menu.tsx +257 -0
  182. package/src/components/ui/form.tsx +167 -0
  183. package/src/components/ui/input.tsx +21 -0
  184. package/src/components/ui/label.tsx +24 -0
  185. package/src/components/ui/popover.tsx +89 -0
  186. package/src/components/ui/progress.tsx +31 -0
  187. package/src/components/ui/radio-group.tsx +45 -0
  188. package/src/components/ui/scroll-area.tsx +58 -0
  189. package/src/components/ui/select.tsx +190 -0
  190. package/src/components/ui/separator.tsx +28 -0
  191. package/src/components/ui/sheet.tsx +143 -0
  192. package/src/components/ui/sidebar.tsx +726 -0
  193. package/src/components/ui/skeleton.tsx +13 -0
  194. package/src/components/ui/slider.tsx +63 -0
  195. package/src/components/ui/sonner.tsx +36 -0
  196. package/src/components/ui/switch.tsx +35 -0
  197. package/src/components/ui/table.tsx +116 -0
  198. package/src/components/ui/tabs.tsx +91 -0
  199. package/src/components/ui/textarea.tsx +18 -0
  200. package/src/components/ui/tooltip.tsx +57 -0
  201. package/src/components/workflows/blueprint-editor.tsx +109 -0
  202. package/src/components/workflows/blueprint-gallery.tsx +155 -0
  203. package/src/components/workflows/blueprint-preview.tsx +240 -0
  204. package/src/components/workflows/loop-status-view.tsx +272 -0
  205. package/src/components/workflows/swarm-dashboard.tsx +185 -0
  206. package/src/components/workflows/workflow-form-view.tsx +1376 -0
  207. package/src/components/workflows/workflow-list.tsx +230 -0
  208. package/src/components/workflows/workflow-status-view.tsx +477 -0
  209. package/src/hooks/use-mobile.ts +19 -0
  210. package/src/instrumentation.ts +7 -0
  211. package/src/lib/agents/claude-agent.ts +737 -0
  212. package/src/lib/agents/execution-manager.ts +27 -0
  213. package/src/lib/agents/profiles/assignment-validation.ts +75 -0
  214. package/src/lib/agents/profiles/builtins/code-reviewer/SKILL.md +21 -0
  215. package/src/lib/agents/profiles/builtins/code-reviewer/profile.yaml +28 -0
  216. package/src/lib/agents/profiles/builtins/data-analyst/SKILL.md +25 -0
  217. package/src/lib/agents/profiles/builtins/data-analyst/profile.yaml +27 -0
  218. package/src/lib/agents/profiles/builtins/devops-engineer/SKILL.md +34 -0
  219. package/src/lib/agents/profiles/builtins/devops-engineer/profile.yaml +27 -0
  220. package/src/lib/agents/profiles/builtins/document-writer/SKILL.md +16 -0
  221. package/src/lib/agents/profiles/builtins/document-writer/profile.yaml +27 -0
  222. package/src/lib/agents/profiles/builtins/general/SKILL.md +13 -0
  223. package/src/lib/agents/profiles/builtins/general/profile.yaml +18 -0
  224. package/src/lib/agents/profiles/builtins/health-fitness-coach/SKILL.md +34 -0
  225. package/src/lib/agents/profiles/builtins/health-fitness-coach/profile.yaml +26 -0
  226. package/src/lib/agents/profiles/builtins/learning-coach/SKILL.md +35 -0
  227. package/src/lib/agents/profiles/builtins/learning-coach/profile.yaml +26 -0
  228. package/src/lib/agents/profiles/builtins/project-manager/SKILL.md +26 -0
  229. package/src/lib/agents/profiles/builtins/project-manager/profile.yaml +26 -0
  230. package/src/lib/agents/profiles/builtins/researcher/SKILL.md +15 -0
  231. package/src/lib/agents/profiles/builtins/researcher/profile.yaml +27 -0
  232. package/src/lib/agents/profiles/builtins/shopping-assistant/SKILL.md +34 -0
  233. package/src/lib/agents/profiles/builtins/shopping-assistant/profile.yaml +26 -0
  234. package/src/lib/agents/profiles/builtins/technical-writer/SKILL.md +31 -0
  235. package/src/lib/agents/profiles/builtins/technical-writer/profile.yaml +29 -0
  236. package/src/lib/agents/profiles/builtins/travel-planner/SKILL.md +23 -0
  237. package/src/lib/agents/profiles/builtins/travel-planner/profile.yaml +26 -0
  238. package/src/lib/agents/profiles/builtins/wealth-manager/SKILL.md +24 -0
  239. package/src/lib/agents/profiles/builtins/wealth-manager/profile.yaml +26 -0
  240. package/src/lib/agents/profiles/compatibility.ts +109 -0
  241. package/src/lib/agents/profiles/registry.ts +293 -0
  242. package/src/lib/agents/profiles/test-runner.ts +18 -0
  243. package/src/lib/agents/profiles/test-types.ts +20 -0
  244. package/src/lib/agents/profiles/types.ts +43 -0
  245. package/src/lib/agents/router.ts +56 -0
  246. package/src/lib/agents/runtime/catalog.ts +85 -0
  247. package/src/lib/agents/runtime/claude-sdk.ts +12 -0
  248. package/src/lib/agents/runtime/claude.ts +370 -0
  249. package/src/lib/agents/runtime/codex-app-server-client.ts +289 -0
  250. package/src/lib/agents/runtime/index.ts +167 -0
  251. package/src/lib/agents/runtime/openai-codex.ts +1089 -0
  252. package/src/lib/agents/runtime/task-assist-types.ts +8 -0
  253. package/src/lib/agents/runtime/types.ts +30 -0
  254. package/src/lib/constants/settings.ts +13 -0
  255. package/src/lib/constants/status-colors.ts +44 -0
  256. package/src/lib/constants/task-status.ts +49 -0
  257. package/src/lib/data/clear.ts +63 -0
  258. package/src/lib/data/seed-data/documents.ts +715 -0
  259. package/src/lib/data/seed-data/logs.ts +195 -0
  260. package/src/lib/data/seed-data/notifications.ts +141 -0
  261. package/src/lib/data/seed-data/profiles.ts +175 -0
  262. package/src/lib/data/seed-data/projects.ts +61 -0
  263. package/src/lib/data/seed-data/schedules.ts +108 -0
  264. package/src/lib/data/seed-data/tasks.ts +341 -0
  265. package/src/lib/data/seed-data/usage-ledger.ts +130 -0
  266. package/src/lib/data/seed-data/workflows.ts +213 -0
  267. package/src/lib/data/seed.ts +129 -0
  268. package/src/lib/db/index.ts +221 -0
  269. package/src/lib/db/migrations/0000_aromatic_gargoyle.sql +59 -0
  270. package/src/lib/db/migrations/0001_first_iron_patriot.sql +6 -0
  271. package/src/lib/db/migrations/0002_add_resume_count.sql +1 -0
  272. package/src/lib/db/migrations/0003_add_settings.sql +5 -0
  273. package/src/lib/db/migrations/0004_add_documents.sql +20 -0
  274. package/src/lib/db/migrations/0005_add_document_preprocessing.sql +4 -0
  275. package/src/lib/db/migrations/0006_add_agent_profile.sql +2 -0
  276. package/src/lib/db/migrations/0007_add_usage_metering_ledger.sql +30 -0
  277. package/src/lib/db/migrations/0008_add_document_version.sql +1 -0
  278. package/src/lib/db/migrations/meta/0000_snapshot.json +416 -0
  279. package/src/lib/db/migrations/meta/0001_snapshot.json +461 -0
  280. package/src/lib/db/migrations/meta/0002_snapshot.json +469 -0
  281. package/src/lib/db/migrations/meta/_journal.json +27 -0
  282. package/src/lib/db/schema.ts +227 -0
  283. package/src/lib/documents/cleanup.ts +50 -0
  284. package/src/lib/documents/context-builder.ts +75 -0
  285. package/src/lib/documents/output-scanner.ts +166 -0
  286. package/src/lib/documents/processor.ts +120 -0
  287. package/src/lib/documents/processors/image.ts +21 -0
  288. package/src/lib/documents/processors/office.ts +36 -0
  289. package/src/lib/documents/processors/pdf.ts +12 -0
  290. package/src/lib/documents/processors/spreadsheet.ts +18 -0
  291. package/src/lib/documents/processors/text.ts +8 -0
  292. package/src/lib/documents/registry.ts +25 -0
  293. package/src/lib/notifications/actionable.ts +108 -0
  294. package/src/lib/notifications/permissions.ts +169 -0
  295. package/src/lib/queries/chart-data.ts +184 -0
  296. package/src/lib/schedules/interval-parser.ts +110 -0
  297. package/src/lib/schedules/scheduler.ts +220 -0
  298. package/src/lib/settings/auth.ts +98 -0
  299. package/src/lib/settings/budget-guardrails.ts +590 -0
  300. package/src/lib/settings/helpers.ts +23 -0
  301. package/src/lib/settings/openai-auth.ts +80 -0
  302. package/src/lib/settings/permissions.ts +102 -0
  303. package/src/lib/usage/ledger.ts +489 -0
  304. package/src/lib/usage/pricing.ts +68 -0
  305. package/src/lib/utils/crypto.ts +90 -0
  306. package/src/lib/utils/format-timestamp.ts +46 -0
  307. package/src/lib/utils/session-cleanup.ts +26 -0
  308. package/src/lib/utils/stagent-paths.ts +18 -0
  309. package/src/lib/utils.ts +6 -0
  310. package/src/lib/validators/blueprint.ts +43 -0
  311. package/src/lib/validators/profile.ts +64 -0
  312. package/src/lib/validators/project.ts +17 -0
  313. package/src/lib/validators/settings.ts +57 -0
  314. package/src/lib/validators/task.ts +30 -0
  315. package/src/lib/workflows/blueprints/builtins/code-review-pipeline.yaml +72 -0
  316. package/src/lib/workflows/blueprints/builtins/documentation-generation.yaml +62 -0
  317. package/src/lib/workflows/blueprints/builtins/investment-research.yaml +81 -0
  318. package/src/lib/workflows/blueprints/builtins/meal-planning.yaml +73 -0
  319. package/src/lib/workflows/blueprints/builtins/product-research.yaml +72 -0
  320. package/src/lib/workflows/blueprints/builtins/research-report.yaml +77 -0
  321. package/src/lib/workflows/blueprints/builtins/sprint-planning.yaml +77 -0
  322. package/src/lib/workflows/blueprints/builtins/travel-planning.yaml +80 -0
  323. package/src/lib/workflows/blueprints/instantiator.ts +131 -0
  324. package/src/lib/workflows/blueprints/registry.ts +128 -0
  325. package/src/lib/workflows/blueprints/template.ts +58 -0
  326. package/src/lib/workflows/blueprints/types.ts +38 -0
  327. package/src/lib/workflows/definition-validation.ts +121 -0
  328. package/src/lib/workflows/engine.ts +1113 -0
  329. package/src/lib/workflows/loop-executor.ts +270 -0
  330. package/src/lib/workflows/parallel.ts +55 -0
  331. package/src/lib/workflows/swarm.ts +97 -0
  332. package/src/lib/workflows/types.ts +112 -0
  333. package/tsconfig.json +41 -0
@@ -0,0 +1,129 @@
1
+ import { db } from "@/lib/db";
2
+ import {
3
+ projects,
4
+ tasks,
5
+ workflows,
6
+ documents,
7
+ agentLogs,
8
+ notifications,
9
+ schedules,
10
+ } from "@/lib/db/schema";
11
+ import { clearAllData } from "./clear";
12
+ import { createProjects } from "./seed-data/projects";
13
+ import { createTasks } from "./seed-data/tasks";
14
+ import { createWorkflows } from "./seed-data/workflows";
15
+ import { createDocuments } from "./seed-data/documents";
16
+ import { createLogs } from "./seed-data/logs";
17
+ import { createNotifications } from "./seed-data/notifications";
18
+ import { createSchedules } from "./seed-data/schedules";
19
+ import { upsertSampleProfiles } from "./seed-data/profiles";
20
+ import { processDocument } from "@/lib/documents/processor";
21
+ import { createUsageLedgerSeeds } from "./seed-data/usage-ledger";
22
+ import { recordUsageLedgerEntry } from "@/lib/usage/ledger";
23
+
24
+ /**
25
+ * Clear all data, then seed with realistic sample data.
26
+ * Returns counts of seeded entities.
27
+ */
28
+ export async function seedSampleData() {
29
+ // 1. Clear everything first
30
+ clearAllData();
31
+
32
+ // 2. Seed sample custom profiles used by the newer profiles/schedules flows
33
+ const profileCount = upsertSampleProfiles();
34
+
35
+ // 3. Insert projects
36
+ const projectSeeds = createProjects();
37
+ for (const p of projectSeeds) {
38
+ db.insert(projects).values(p).run();
39
+ }
40
+ const projectIds = projectSeeds.map((p) => p.id);
41
+
42
+ // 4. Insert tasks
43
+ const taskSeeds = createTasks(projectIds);
44
+ for (const t of taskSeeds) {
45
+ db.insert(tasks)
46
+ .values({
47
+ id: t.id,
48
+ projectId: t.projectId,
49
+ title: t.title,
50
+ description: t.description,
51
+ status: t.status,
52
+ priority: t.priority,
53
+ result: t.result,
54
+ createdAt: t.createdAt,
55
+ updatedAt: t.updatedAt,
56
+ })
57
+ .run();
58
+ }
59
+ const taskIds = taskSeeds.map((t) => t.id);
60
+
61
+ // 5. Insert workflows (one per project)
62
+ const workflowSeeds = createWorkflows(projectIds);
63
+ for (const w of workflowSeeds) {
64
+ db.insert(workflows).values(w).run();
65
+ }
66
+
67
+ // 6. Insert schedules for recently added automation surfaces
68
+ const scheduleSeeds = createSchedules(projectIds);
69
+ for (const schedule of scheduleSeeds) {
70
+ db.insert(schedules).values(schedule).run();
71
+ }
72
+
73
+ // 7. Write document files + insert records
74
+ const docSeeds = await createDocuments(projectIds, taskIds);
75
+ for (const d of docSeeds) {
76
+ db.insert(documents).values(d).run();
77
+ }
78
+
79
+ // 8. Process all documents (text extraction)
80
+ await Promise.all(docSeeds.map((d) => processDocument(d.id)));
81
+
82
+ // 9. Insert agent logs
83
+ const completedTaskIds = taskSeeds
84
+ .filter((t) => t.status === "completed")
85
+ .map((t) => t.id);
86
+ const failedTaskIds = taskSeeds
87
+ .filter((t) => t.status === "failed")
88
+ .map((t) => t.id);
89
+ const runningTaskIds = taskSeeds
90
+ .filter((t) => t.status === "running")
91
+ .map((t) => t.id);
92
+
93
+ const logSeeds = createLogs({
94
+ completed: completedTaskIds,
95
+ failed: failedTaskIds,
96
+ running: runningTaskIds,
97
+ });
98
+ for (const l of logSeeds) {
99
+ db.insert(agentLogs).values(l).run();
100
+ }
101
+
102
+ // 10. Insert notifications
103
+ const notifSeeds = createNotifications(taskIds);
104
+ for (const n of notifSeeds) {
105
+ db.insert(notifications).values(n).run();
106
+ }
107
+
108
+ // 11. Insert normalized usage ledger rows for governance and analytics surfaces
109
+ const usageSeeds = createUsageLedgerSeeds({
110
+ tasks: taskSeeds,
111
+ workflows: workflowSeeds,
112
+ schedules: scheduleSeeds,
113
+ });
114
+ for (const seed of usageSeeds) {
115
+ await recordUsageLedgerEntry(seed);
116
+ }
117
+
118
+ return {
119
+ profiles: profileCount,
120
+ projects: projectSeeds.length,
121
+ tasks: taskSeeds.length,
122
+ workflows: workflowSeeds.length,
123
+ schedules: scheduleSeeds.length,
124
+ documents: docSeeds.length,
125
+ agentLogs: logSeeds.length,
126
+ notifications: notifSeeds.length,
127
+ usageLedger: usageSeeds.length,
128
+ };
129
+ }
@@ -0,0 +1,221 @@
1
+ import Database from "better-sqlite3";
2
+ import { drizzle } from "drizzle-orm/better-sqlite3";
3
+ import * as schema from "./schema";
4
+ import { join } from "path";
5
+ import { mkdirSync } from "fs";
6
+ import { getStagentDataDir } from "@/lib/utils/stagent-paths";
7
+
8
+ const dataDir = getStagentDataDir();
9
+ mkdirSync(dataDir, { recursive: true });
10
+ const dbPath = join(dataDir, "stagent.db");
11
+
12
+ const sqlite = new Database(dbPath);
13
+ sqlite.pragma("journal_mode = WAL");
14
+ sqlite.pragma("foreign_keys = ON");
15
+
16
+ // Bootstrap all tables (migrations may not have been applied on fresh install)
17
+ // Note: sqlite.exec() here is better-sqlite3's synchronous DDL method, not child_process
18
+ sqlite.exec(`
19
+ CREATE TABLE IF NOT EXISTS projects (
20
+ id TEXT PRIMARY KEY NOT NULL,
21
+ name TEXT NOT NULL,
22
+ description TEXT,
23
+ status TEXT DEFAULT 'active' NOT NULL,
24
+ created_at INTEGER NOT NULL,
25
+ updated_at INTEGER NOT NULL
26
+ );
27
+
28
+ CREATE TABLE IF NOT EXISTS tasks (
29
+ id TEXT PRIMARY KEY NOT NULL,
30
+ project_id TEXT,
31
+ workflow_id TEXT,
32
+ schedule_id TEXT,
33
+ title TEXT NOT NULL,
34
+ description TEXT,
35
+ status TEXT DEFAULT 'planned' NOT NULL,
36
+ assigned_agent TEXT,
37
+ agent_profile TEXT,
38
+ priority INTEGER DEFAULT 2 NOT NULL,
39
+ result TEXT,
40
+ session_id TEXT,
41
+ resume_count INTEGER DEFAULT 0 NOT NULL,
42
+ created_at INTEGER NOT NULL,
43
+ updated_at INTEGER NOT NULL,
44
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON UPDATE NO ACTION ON DELETE NO ACTION,
45
+ FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON UPDATE NO ACTION ON DELETE NO ACTION,
46
+ FOREIGN KEY (schedule_id) REFERENCES schedules(id) ON UPDATE NO ACTION ON DELETE NO ACTION
47
+ );
48
+
49
+ CREATE TABLE IF NOT EXISTS workflows (
50
+ id TEXT PRIMARY KEY NOT NULL,
51
+ project_id TEXT,
52
+ name TEXT NOT NULL,
53
+ definition TEXT NOT NULL,
54
+ status TEXT DEFAULT 'draft' NOT NULL,
55
+ created_at INTEGER NOT NULL,
56
+ updated_at INTEGER NOT NULL,
57
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON UPDATE NO ACTION ON DELETE NO ACTION
58
+ );
59
+
60
+ CREATE TABLE IF NOT EXISTS agent_logs (
61
+ id TEXT PRIMARY KEY NOT NULL,
62
+ task_id TEXT,
63
+ agent_type TEXT NOT NULL,
64
+ event TEXT NOT NULL,
65
+ payload TEXT,
66
+ timestamp INTEGER NOT NULL,
67
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON UPDATE NO ACTION ON DELETE NO ACTION
68
+ );
69
+
70
+ CREATE TABLE IF NOT EXISTS notifications (
71
+ id TEXT PRIMARY KEY NOT NULL,
72
+ task_id TEXT,
73
+ type TEXT NOT NULL,
74
+ title TEXT NOT NULL,
75
+ body TEXT,
76
+ read INTEGER DEFAULT 0 NOT NULL,
77
+ tool_name TEXT,
78
+ tool_input TEXT,
79
+ response TEXT,
80
+ responded_at INTEGER,
81
+ created_at INTEGER NOT NULL,
82
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON UPDATE NO ACTION ON DELETE NO ACTION
83
+ );
84
+
85
+ CREATE TABLE IF NOT EXISTS settings (
86
+ key TEXT PRIMARY KEY,
87
+ value TEXT NOT NULL,
88
+ updated_at INTEGER NOT NULL
89
+ );
90
+
91
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
92
+ CREATE INDEX IF NOT EXISTS idx_tasks_project_id ON tasks(project_id);
93
+ CREATE INDEX IF NOT EXISTS idx_agent_logs_task_id ON agent_logs(task_id);
94
+ CREATE INDEX IF NOT EXISTS idx_agent_logs_timestamp ON agent_logs(timestamp);
95
+ CREATE TABLE IF NOT EXISTS documents (
96
+ id TEXT PRIMARY KEY NOT NULL,
97
+ task_id TEXT,
98
+ project_id TEXT,
99
+ filename TEXT NOT NULL,
100
+ original_name TEXT NOT NULL,
101
+ mime_type TEXT NOT NULL,
102
+ size INTEGER NOT NULL,
103
+ storage_path TEXT NOT NULL,
104
+ version INTEGER DEFAULT 1 NOT NULL,
105
+ direction TEXT DEFAULT 'input' NOT NULL,
106
+ category TEXT,
107
+ status TEXT DEFAULT 'uploaded' NOT NULL,
108
+ extracted_text TEXT,
109
+ processed_path TEXT,
110
+ processing_error TEXT,
111
+ created_at INTEGER NOT NULL,
112
+ updated_at INTEGER NOT NULL,
113
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON UPDATE NO ACTION ON DELETE NO ACTION,
114
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON UPDATE NO ACTION ON DELETE NO ACTION
115
+ );
116
+
117
+ CREATE TABLE IF NOT EXISTS schedules (
118
+ id TEXT PRIMARY KEY NOT NULL,
119
+ project_id TEXT,
120
+ name TEXT NOT NULL,
121
+ prompt TEXT NOT NULL,
122
+ cron_expression TEXT NOT NULL,
123
+ assigned_agent TEXT,
124
+ agent_profile TEXT,
125
+ recurs INTEGER DEFAULT 1 NOT NULL,
126
+ status TEXT DEFAULT 'active' NOT NULL,
127
+ max_firings INTEGER,
128
+ firing_count INTEGER DEFAULT 0 NOT NULL,
129
+ expires_at INTEGER,
130
+ last_fired_at INTEGER,
131
+ next_fire_at INTEGER,
132
+ created_at INTEGER NOT NULL,
133
+ updated_at INTEGER NOT NULL,
134
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON UPDATE NO ACTION ON DELETE NO ACTION
135
+ );
136
+
137
+ CREATE INDEX IF NOT EXISTS idx_schedules_status ON schedules(status);
138
+ CREATE INDEX IF NOT EXISTS idx_schedules_next_fire_at ON schedules(next_fire_at);
139
+ CREATE INDEX IF NOT EXISTS idx_schedules_project_id ON schedules(project_id);
140
+
141
+ CREATE INDEX IF NOT EXISTS idx_notifications_task_id ON notifications(task_id);
142
+ CREATE INDEX IF NOT EXISTS idx_notifications_read ON notifications(read);
143
+ CREATE INDEX IF NOT EXISTS idx_documents_task_id ON documents(task_id);
144
+ CREATE INDEX IF NOT EXISTS idx_documents_project_id ON documents(project_id);
145
+
146
+ CREATE TABLE IF NOT EXISTS usage_ledger (
147
+ id TEXT PRIMARY KEY NOT NULL,
148
+ task_id TEXT,
149
+ workflow_id TEXT,
150
+ schedule_id TEXT,
151
+ project_id TEXT,
152
+ activity_type TEXT NOT NULL,
153
+ runtime_id TEXT NOT NULL,
154
+ provider_id TEXT NOT NULL,
155
+ model_id TEXT,
156
+ status TEXT NOT NULL,
157
+ input_tokens INTEGER,
158
+ output_tokens INTEGER,
159
+ total_tokens INTEGER,
160
+ cost_micros INTEGER,
161
+ pricing_version TEXT,
162
+ started_at INTEGER NOT NULL,
163
+ finished_at INTEGER NOT NULL,
164
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON UPDATE NO ACTION ON DELETE NO ACTION,
165
+ FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON UPDATE NO ACTION ON DELETE NO ACTION,
166
+ FOREIGN KEY (schedule_id) REFERENCES schedules(id) ON UPDATE NO ACTION ON DELETE NO ACTION,
167
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON UPDATE NO ACTION ON DELETE NO ACTION
168
+ );
169
+
170
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_task_id ON usage_ledger(task_id);
171
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_activity_type ON usage_ledger(activity_type);
172
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_runtime_id ON usage_ledger(runtime_id);
173
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_provider_model ON usage_ledger(provider_id, model_id);
174
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_finished_at ON usage_ledger(finished_at);
175
+ `);
176
+
177
+ // Migration: add agent_profile column to existing tasks table (safe to re-run)
178
+ // Note: sqlite.exec() here is better-sqlite3's synchronous DDL method, not child_process
179
+ try {
180
+ sqlite.exec(`ALTER TABLE tasks ADD COLUMN agent_profile TEXT;`);
181
+ } catch {
182
+ // Column already exists — ignore
183
+ }
184
+ sqlite.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_agent_profile ON tasks(agent_profile);`);
185
+
186
+ try {
187
+ sqlite.exec(`ALTER TABLE tasks ADD COLUMN workflow_id TEXT REFERENCES workflows(id);`);
188
+ } catch {
189
+ // Column already exists — ignore
190
+ }
191
+ sqlite.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_workflow_id ON tasks(workflow_id);`);
192
+
193
+ try {
194
+ sqlite.exec(`ALTER TABLE tasks ADD COLUMN schedule_id TEXT REFERENCES schedules(id);`);
195
+ } catch {
196
+ // Column already exists — ignore
197
+ }
198
+ sqlite.exec(`CREATE INDEX IF NOT EXISTS idx_tasks_schedule_id ON tasks(schedule_id);`);
199
+
200
+ // Migration: add working_directory column to existing projects table (safe to re-run)
201
+ // Note: sqlite.exec() here is better-sqlite3's synchronous DDL method, not child_process
202
+ try {
203
+ sqlite.exec(`ALTER TABLE projects ADD COLUMN working_directory TEXT;`);
204
+ } catch {
205
+ // Column already exists — ignore
206
+ }
207
+
208
+ // Migration: add assigned_agent column to existing schedules table (safe to re-run)
209
+ try {
210
+ sqlite.exec(`ALTER TABLE schedules ADD COLUMN assigned_agent TEXT;`);
211
+ } catch {
212
+ // Column already exists — ignore
213
+ }
214
+
215
+ try {
216
+ sqlite.exec(`ALTER TABLE documents ADD COLUMN version INTEGER NOT NULL DEFAULT 1;`);
217
+ } catch {
218
+ // Column already exists — ignore
219
+ }
220
+
221
+ export const db = drizzle(sqlite, { schema });
@@ -0,0 +1,59 @@
1
+ CREATE TABLE `agent_logs` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `task_id` text,
4
+ `agent_type` text NOT NULL,
5
+ `event` text NOT NULL,
6
+ `payload` text,
7
+ `timestamp` integer NOT NULL,
8
+ FOREIGN KEY (`task_id`) REFERENCES `tasks`(`id`) ON UPDATE no action ON DELETE no action
9
+ );
10
+ --> statement-breakpoint
11
+ CREATE TABLE `notifications` (
12
+ `id` text PRIMARY KEY NOT NULL,
13
+ `task_id` text,
14
+ `type` text NOT NULL,
15
+ `title` text NOT NULL,
16
+ `body` text,
17
+ `read` integer DEFAULT false NOT NULL,
18
+ `tool_name` text,
19
+ `tool_input` text,
20
+ `response` text,
21
+ `responded_at` integer,
22
+ `created_at` integer NOT NULL,
23
+ FOREIGN KEY (`task_id`) REFERENCES `tasks`(`id`) ON UPDATE no action ON DELETE no action
24
+ );
25
+ --> statement-breakpoint
26
+ CREATE TABLE `projects` (
27
+ `id` text PRIMARY KEY NOT NULL,
28
+ `name` text NOT NULL,
29
+ `description` text,
30
+ `status` text DEFAULT 'active' NOT NULL,
31
+ `created_at` integer NOT NULL,
32
+ `updated_at` integer NOT NULL
33
+ );
34
+ --> statement-breakpoint
35
+ CREATE TABLE `tasks` (
36
+ `id` text PRIMARY KEY NOT NULL,
37
+ `project_id` text,
38
+ `title` text NOT NULL,
39
+ `description` text,
40
+ `status` text DEFAULT 'planned' NOT NULL,
41
+ `assigned_agent` text,
42
+ `priority` integer DEFAULT 2 NOT NULL,
43
+ `result` text,
44
+ `session_id` text,
45
+ `created_at` integer NOT NULL,
46
+ `updated_at` integer NOT NULL,
47
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE no action
48
+ );
49
+ --> statement-breakpoint
50
+ CREATE TABLE `workflows` (
51
+ `id` text PRIMARY KEY NOT NULL,
52
+ `project_id` text,
53
+ `name` text NOT NULL,
54
+ `definition` text NOT NULL,
55
+ `status` text DEFAULT 'draft' NOT NULL,
56
+ `created_at` integer NOT NULL,
57
+ `updated_at` integer NOT NULL,
58
+ FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE no action
59
+ );
@@ -0,0 +1,6 @@
1
+ CREATE INDEX `idx_agent_logs_task_id` ON `agent_logs` (`task_id`);--> statement-breakpoint
2
+ CREATE INDEX `idx_agent_logs_timestamp` ON `agent_logs` (`timestamp`);--> statement-breakpoint
3
+ CREATE INDEX `idx_notifications_task_id` ON `notifications` (`task_id`);--> statement-breakpoint
4
+ CREATE INDEX `idx_notifications_read` ON `notifications` (`read`);--> statement-breakpoint
5
+ CREATE INDEX `idx_tasks_status` ON `tasks` (`status`);--> statement-breakpoint
6
+ CREATE INDEX `idx_tasks_project_id` ON `tasks` (`project_id`);
@@ -0,0 +1 @@
1
+ ALTER TABLE tasks ADD COLUMN resume_count INTEGER NOT NULL DEFAULT 0;
@@ -0,0 +1,5 @@
1
+ CREATE TABLE IF NOT EXISTS settings (
2
+ key TEXT PRIMARY KEY,
3
+ value TEXT NOT NULL,
4
+ updated_at INTEGER NOT NULL
5
+ );
@@ -0,0 +1,20 @@
1
+ CREATE TABLE IF NOT EXISTS documents (
2
+ id TEXT PRIMARY KEY NOT NULL,
3
+ task_id TEXT,
4
+ project_id TEXT,
5
+ filename TEXT NOT NULL,
6
+ original_name TEXT NOT NULL,
7
+ mime_type TEXT NOT NULL,
8
+ size INTEGER NOT NULL,
9
+ storage_path TEXT NOT NULL,
10
+ direction TEXT DEFAULT 'input' NOT NULL,
11
+ category TEXT,
12
+ status TEXT DEFAULT 'uploaded' NOT NULL,
13
+ created_at INTEGER NOT NULL,
14
+ updated_at INTEGER NOT NULL,
15
+ FOREIGN KEY (task_id) REFERENCES tasks(id) ON UPDATE NO ACTION ON DELETE NO ACTION,
16
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON UPDATE NO ACTION ON DELETE NO ACTION
17
+ );
18
+
19
+ CREATE INDEX IF NOT EXISTS idx_documents_task_id ON documents(task_id);
20
+ CREATE INDEX IF NOT EXISTS idx_documents_project_id ON documents(project_id);
@@ -0,0 +1,4 @@
1
+ -- Add preprocessing columns to documents table
2
+ ALTER TABLE documents ADD COLUMN extracted_text TEXT;
3
+ ALTER TABLE documents ADD COLUMN processed_path TEXT;
4
+ ALTER TABLE documents ADD COLUMN processing_error TEXT;
@@ -0,0 +1,2 @@
1
+ ALTER TABLE tasks ADD COLUMN agent_profile TEXT;
2
+ CREATE INDEX IF NOT EXISTS idx_tasks_agent_profile ON tasks(agent_profile);
@@ -0,0 +1,30 @@
1
+ ALTER TABLE tasks ADD COLUMN workflow_id TEXT REFERENCES workflows(id);
2
+ ALTER TABLE tasks ADD COLUMN schedule_id TEXT REFERENCES schedules(id);
3
+ CREATE INDEX IF NOT EXISTS idx_tasks_workflow_id ON tasks(workflow_id);
4
+ CREATE INDEX IF NOT EXISTS idx_tasks_schedule_id ON tasks(schedule_id);
5
+
6
+ CREATE TABLE IF NOT EXISTS usage_ledger (
7
+ id TEXT PRIMARY KEY NOT NULL,
8
+ task_id TEXT REFERENCES tasks(id),
9
+ workflow_id TEXT REFERENCES workflows(id),
10
+ schedule_id TEXT REFERENCES schedules(id),
11
+ project_id TEXT REFERENCES projects(id),
12
+ activity_type TEXT NOT NULL,
13
+ runtime_id TEXT NOT NULL,
14
+ provider_id TEXT NOT NULL,
15
+ model_id TEXT,
16
+ status TEXT NOT NULL,
17
+ input_tokens INTEGER,
18
+ output_tokens INTEGER,
19
+ total_tokens INTEGER,
20
+ cost_micros INTEGER,
21
+ pricing_version TEXT,
22
+ started_at INTEGER NOT NULL,
23
+ finished_at INTEGER NOT NULL
24
+ );
25
+
26
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_task_id ON usage_ledger(task_id);
27
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_activity_type ON usage_ledger(activity_type);
28
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_runtime_id ON usage_ledger(runtime_id);
29
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_provider_model ON usage_ledger(provider_id, model_id);
30
+ CREATE INDEX IF NOT EXISTS idx_usage_ledger_finished_at ON usage_ledger(finished_at);
@@ -0,0 +1 @@
1
+ ALTER TABLE documents ADD COLUMN version INTEGER NOT NULL DEFAULT 1;