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.
- package/LICENSE +191 -0
- package/README.md +399 -0
- package/components.json +21 -0
- package/dist/cli.js +171 -0
- package/drizzle.config.ts +12 -0
- package/next.config.mjs +15 -0
- package/package.json +114 -0
- package/postcss.config.mjs +8 -0
- package/public/icon-512.png +0 -0
- package/public/icon.svg +13 -0
- package/public/readme/home-workspace.png +0 -0
- package/public/readme/inbox-approvals.png +0 -0
- package/public/readme/workflow-blueprints.png +0 -0
- package/public/stagent-s-128.png +0 -0
- package/public/stagent-s-64.png +0 -0
- package/src/app/api/blueprints/[id]/instantiate/route.ts +27 -0
- package/src/app/api/blueprints/[id]/route.ts +39 -0
- package/src/app/api/blueprints/import/route.ts +68 -0
- package/src/app/api/blueprints/route.ts +29 -0
- package/src/app/api/command-palette/recent/route.ts +31 -0
- package/src/app/api/data/clear/route.ts +22 -0
- package/src/app/api/data/seed/route.ts +22 -0
- package/src/app/api/documents/[id]/file/route.ts +44 -0
- package/src/app/api/documents/[id]/route.ts +123 -0
- package/src/app/api/documents/route.ts +59 -0
- package/src/app/api/logs/stream/route.ts +101 -0
- package/src/app/api/notifications/[id]/route.ts +36 -0
- package/src/app/api/notifications/mark-all-read/route.ts +13 -0
- package/src/app/api/notifications/pending-approvals/route.ts +10 -0
- package/src/app/api/notifications/pending-approvals/stream/route.ts +101 -0
- package/src/app/api/notifications/route.ts +34 -0
- package/src/app/api/permissions/route.ts +46 -0
- package/src/app/api/profiles/[id]/route.ts +79 -0
- package/src/app/api/profiles/[id]/test/route.ts +42 -0
- package/src/app/api/profiles/import/route.ts +108 -0
- package/src/app/api/profiles/route.ts +50 -0
- package/src/app/api/projects/[id]/route.ts +72 -0
- package/src/app/api/projects/route.ts +53 -0
- package/src/app/api/schedules/[id]/route.ts +185 -0
- package/src/app/api/schedules/route.ts +117 -0
- package/src/app/api/settings/budgets/route.ts +24 -0
- package/src/app/api/settings/openai/route.ts +24 -0
- package/src/app/api/settings/route.ts +21 -0
- package/src/app/api/settings/test/route.ts +26 -0
- package/src/app/api/tasks/[id]/cancel/route.ts +21 -0
- package/src/app/api/tasks/[id]/execute/route.ts +90 -0
- package/src/app/api/tasks/[id]/logs/route.ts +95 -0
- package/src/app/api/tasks/[id]/output/route.ts +47 -0
- package/src/app/api/tasks/[id]/respond/route.ts +64 -0
- package/src/app/api/tasks/[id]/resume/route.ts +76 -0
- package/src/app/api/tasks/[id]/route.ts +77 -0
- package/src/app/api/tasks/assist/route.ts +35 -0
- package/src/app/api/tasks/route.ts +82 -0
- package/src/app/api/uploads/[id]/route.ts +81 -0
- package/src/app/api/uploads/cleanup/route.ts +7 -0
- package/src/app/api/uploads/route.ts +66 -0
- package/src/app/api/workflows/[id]/execute/route.ts +82 -0
- package/src/app/api/workflows/[id]/route.ts +133 -0
- package/src/app/api/workflows/[id]/status/route.ts +54 -0
- package/src/app/api/workflows/[id]/steps/[stepId]/retry/route.ts +22 -0
- package/src/app/api/workflows/route.ts +61 -0
- package/src/app/apple-icon.tsx +31 -0
- package/src/app/costs/page.tsx +256 -0
- package/src/app/dashboard/page.tsx +44 -0
- package/src/app/documents/[id]/page.tsx +46 -0
- package/src/app/documents/page.tsx +45 -0
- package/src/app/error.tsx +26 -0
- package/src/app/global-error.tsx +23 -0
- package/src/app/globals.css +733 -0
- package/src/app/icon.tsx +30 -0
- package/src/app/inbox/loading.tsx +15 -0
- package/src/app/inbox/page.tsx +35 -0
- package/src/app/layout.tsx +78 -0
- package/src/app/manifest.ts +32 -0
- package/src/app/monitor/page.tsx +37 -0
- package/src/app/page.tsx +162 -0
- package/src/app/profiles/[id]/edit/page.tsx +39 -0
- package/src/app/profiles/[id]/page.tsx +33 -0
- package/src/app/profiles/new/page.tsx +22 -0
- package/src/app/profiles/page.tsx +19 -0
- package/src/app/projects/[id]/page.tsx +134 -0
- package/src/app/projects/loading.tsx +17 -0
- package/src/app/projects/page.tsx +32 -0
- package/src/app/schedules/[id]/page.tsx +47 -0
- package/src/app/schedules/page.tsx +18 -0
- package/src/app/settings/loading.tsx +24 -0
- package/src/app/settings/page.tsx +27 -0
- package/src/app/tasks/[id]/page.tsx +45 -0
- package/src/app/tasks/new/page.tsx +27 -0
- package/src/app/workflows/[id]/edit/page.tsx +66 -0
- package/src/app/workflows/[id]/page.tsx +37 -0
- package/src/app/workflows/blueprints/[id]/page.tsx +40 -0
- package/src/app/workflows/blueprints/new/page.tsx +20 -0
- package/src/app/workflows/blueprints/page.tsx +11 -0
- package/src/app/workflows/new/page.tsx +36 -0
- package/src/app/workflows/page.tsx +18 -0
- package/src/components/charts/donut-ring.tsx +64 -0
- package/src/components/charts/mini-bar.tsx +75 -0
- package/src/components/charts/sparkline.tsx +107 -0
- package/src/components/costs/cost-dashboard.tsx +877 -0
- package/src/components/costs/cost-filters.tsx +179 -0
- package/src/components/dashboard/activity-feed.tsx +95 -0
- package/src/components/dashboard/greeting.tsx +30 -0
- package/src/components/dashboard/priority-queue.tsx +79 -0
- package/src/components/dashboard/quick-actions.tsx +62 -0
- package/src/components/dashboard/recent-projects.tsx +79 -0
- package/src/components/dashboard/stats-cards.tsx +114 -0
- package/src/components/documents/document-browser.tsx +235 -0
- package/src/components/documents/document-detail-view.tsx +367 -0
- package/src/components/documents/document-grid.tsx +78 -0
- package/src/components/documents/document-preview.tsx +68 -0
- package/src/components/documents/document-table.tsx +119 -0
- package/src/components/documents/document-upload-dialog.tsx +153 -0
- package/src/components/documents/types.ts +6 -0
- package/src/components/documents/utils.ts +57 -0
- package/src/components/monitoring/connection-indicator.tsx +14 -0
- package/src/components/monitoring/log-entry.tsx +79 -0
- package/src/components/monitoring/log-filters.tsx +57 -0
- package/src/components/monitoring/log-stream.tsx +144 -0
- package/src/components/monitoring/monitor-overview-wrapper.tsx +64 -0
- package/src/components/monitoring/monitor-overview.tsx +119 -0
- package/src/components/notifications/failure-action.tsx +38 -0
- package/src/components/notifications/inbox-list.tsx +165 -0
- package/src/components/notifications/message-response.tsx +196 -0
- package/src/components/notifications/notification-item.tsx +250 -0
- package/src/components/notifications/pending-approval-host.tsx +478 -0
- package/src/components/notifications/permission-action.tsx +37 -0
- package/src/components/notifications/permission-response-actions.tsx +126 -0
- package/src/components/notifications/unread-badge.tsx +35 -0
- package/src/components/profiles/profile-browser.tsx +117 -0
- package/src/components/profiles/profile-card.tsx +78 -0
- package/src/components/profiles/profile-detail-view.tsx +564 -0
- package/src/components/profiles/profile-form-view.tsx +480 -0
- package/src/components/profiles/profile-import-dialog.tsx +113 -0
- package/src/components/projects/project-card.tsx +58 -0
- package/src/components/projects/project-create-dialog.tsx +140 -0
- package/src/components/projects/project-detail.tsx +68 -0
- package/src/components/projects/project-edit-dialog.tsx +219 -0
- package/src/components/projects/project-list.tsx +108 -0
- package/src/components/schedules/schedule-create-dialog.tsx +403 -0
- package/src/components/schedules/schedule-detail-view.tsx +274 -0
- package/src/components/schedules/schedule-list.tsx +242 -0
- package/src/components/schedules/schedule-status-badge.tsx +16 -0
- package/src/components/settings/api-key-form.tsx +141 -0
- package/src/components/settings/auth-config-section.tsx +141 -0
- package/src/components/settings/auth-method-selector.tsx +67 -0
- package/src/components/settings/auth-status-badge.tsx +40 -0
- package/src/components/settings/auth-status-dot.tsx +59 -0
- package/src/components/settings/budget-guardrails-section.tsx +842 -0
- package/src/components/settings/data-management-section.tsx +141 -0
- package/src/components/settings/openai-runtime-section.tsx +104 -0
- package/src/components/settings/permissions-section.tsx +91 -0
- package/src/components/shared/app-sidebar.tsx +123 -0
- package/src/components/shared/card-skeleton.tsx +42 -0
- package/src/components/shared/command-palette.tsx +250 -0
- package/src/components/shared/confirm-dialog.tsx +52 -0
- package/src/components/shared/empty-state.tsx +24 -0
- package/src/components/shared/error-state.tsx +32 -0
- package/src/components/shared/form-section-card.tsx +33 -0
- package/src/components/shared/section-heading.tsx +14 -0
- package/src/components/shared/stagent-logo.tsx +21 -0
- package/src/components/shared/theme-toggle.tsx +46 -0
- package/src/components/tasks/ai-assist-panel.tsx +210 -0
- package/src/components/tasks/content-preview.tsx +89 -0
- package/src/components/tasks/empty-board.tsx +12 -0
- package/src/components/tasks/file-upload.tsx +120 -0
- package/src/components/tasks/kanban-board.tsx +275 -0
- package/src/components/tasks/kanban-column.tsx +75 -0
- package/src/components/tasks/skeleton-board.tsx +21 -0
- package/src/components/tasks/task-attachments.tsx +114 -0
- package/src/components/tasks/task-card.tsx +101 -0
- package/src/components/tasks/task-create-panel.tsx +360 -0
- package/src/components/tasks/task-detail-view.tsx +356 -0
- package/src/components/ui/alert-dialog.tsx +196 -0
- package/src/components/ui/badge.tsx +50 -0
- package/src/components/ui/button.tsx +71 -0
- package/src/components/ui/card.tsx +92 -0
- package/src/components/ui/checkbox.tsx +32 -0
- package/src/components/ui/command.tsx +184 -0
- package/src/components/ui/dialog.tsx +158 -0
- package/src/components/ui/dropdown-menu.tsx +257 -0
- package/src/components/ui/form.tsx +167 -0
- package/src/components/ui/input.tsx +21 -0
- package/src/components/ui/label.tsx +24 -0
- package/src/components/ui/popover.tsx +89 -0
- package/src/components/ui/progress.tsx +31 -0
- package/src/components/ui/radio-group.tsx +45 -0
- package/src/components/ui/scroll-area.tsx +58 -0
- package/src/components/ui/select.tsx +190 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +143 -0
- package/src/components/ui/sidebar.tsx +726 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/slider.tsx +63 -0
- package/src/components/ui/sonner.tsx +36 -0
- package/src/components/ui/switch.tsx +35 -0
- package/src/components/ui/table.tsx +116 -0
- package/src/components/ui/tabs.tsx +91 -0
- package/src/components/ui/textarea.tsx +18 -0
- package/src/components/ui/tooltip.tsx +57 -0
- package/src/components/workflows/blueprint-editor.tsx +109 -0
- package/src/components/workflows/blueprint-gallery.tsx +155 -0
- package/src/components/workflows/blueprint-preview.tsx +240 -0
- package/src/components/workflows/loop-status-view.tsx +272 -0
- package/src/components/workflows/swarm-dashboard.tsx +185 -0
- package/src/components/workflows/workflow-form-view.tsx +1376 -0
- package/src/components/workflows/workflow-list.tsx +230 -0
- package/src/components/workflows/workflow-status-view.tsx +477 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/instrumentation.ts +7 -0
- package/src/lib/agents/claude-agent.ts +737 -0
- package/src/lib/agents/execution-manager.ts +27 -0
- package/src/lib/agents/profiles/assignment-validation.ts +75 -0
- package/src/lib/agents/profiles/builtins/code-reviewer/SKILL.md +21 -0
- package/src/lib/agents/profiles/builtins/code-reviewer/profile.yaml +28 -0
- package/src/lib/agents/profiles/builtins/data-analyst/SKILL.md +25 -0
- package/src/lib/agents/profiles/builtins/data-analyst/profile.yaml +27 -0
- package/src/lib/agents/profiles/builtins/devops-engineer/SKILL.md +34 -0
- package/src/lib/agents/profiles/builtins/devops-engineer/profile.yaml +27 -0
- package/src/lib/agents/profiles/builtins/document-writer/SKILL.md +16 -0
- package/src/lib/agents/profiles/builtins/document-writer/profile.yaml +27 -0
- package/src/lib/agents/profiles/builtins/general/SKILL.md +13 -0
- package/src/lib/agents/profiles/builtins/general/profile.yaml +18 -0
- package/src/lib/agents/profiles/builtins/health-fitness-coach/SKILL.md +34 -0
- package/src/lib/agents/profiles/builtins/health-fitness-coach/profile.yaml +26 -0
- package/src/lib/agents/profiles/builtins/learning-coach/SKILL.md +35 -0
- package/src/lib/agents/profiles/builtins/learning-coach/profile.yaml +26 -0
- package/src/lib/agents/profiles/builtins/project-manager/SKILL.md +26 -0
- package/src/lib/agents/profiles/builtins/project-manager/profile.yaml +26 -0
- package/src/lib/agents/profiles/builtins/researcher/SKILL.md +15 -0
- package/src/lib/agents/profiles/builtins/researcher/profile.yaml +27 -0
- package/src/lib/agents/profiles/builtins/shopping-assistant/SKILL.md +34 -0
- package/src/lib/agents/profiles/builtins/shopping-assistant/profile.yaml +26 -0
- package/src/lib/agents/profiles/builtins/technical-writer/SKILL.md +31 -0
- package/src/lib/agents/profiles/builtins/technical-writer/profile.yaml +29 -0
- package/src/lib/agents/profiles/builtins/travel-planner/SKILL.md +23 -0
- package/src/lib/agents/profiles/builtins/travel-planner/profile.yaml +26 -0
- package/src/lib/agents/profiles/builtins/wealth-manager/SKILL.md +24 -0
- package/src/lib/agents/profiles/builtins/wealth-manager/profile.yaml +26 -0
- package/src/lib/agents/profiles/compatibility.ts +109 -0
- package/src/lib/agents/profiles/registry.ts +293 -0
- package/src/lib/agents/profiles/test-runner.ts +18 -0
- package/src/lib/agents/profiles/test-types.ts +20 -0
- package/src/lib/agents/profiles/types.ts +43 -0
- package/src/lib/agents/router.ts +56 -0
- package/src/lib/agents/runtime/catalog.ts +85 -0
- package/src/lib/agents/runtime/claude-sdk.ts +12 -0
- package/src/lib/agents/runtime/claude.ts +370 -0
- package/src/lib/agents/runtime/codex-app-server-client.ts +289 -0
- package/src/lib/agents/runtime/index.ts +167 -0
- package/src/lib/agents/runtime/openai-codex.ts +1089 -0
- package/src/lib/agents/runtime/task-assist-types.ts +8 -0
- package/src/lib/agents/runtime/types.ts +30 -0
- package/src/lib/constants/settings.ts +13 -0
- package/src/lib/constants/status-colors.ts +44 -0
- package/src/lib/constants/task-status.ts +49 -0
- package/src/lib/data/clear.ts +63 -0
- package/src/lib/data/seed-data/documents.ts +715 -0
- package/src/lib/data/seed-data/logs.ts +195 -0
- package/src/lib/data/seed-data/notifications.ts +141 -0
- package/src/lib/data/seed-data/profiles.ts +175 -0
- package/src/lib/data/seed-data/projects.ts +61 -0
- package/src/lib/data/seed-data/schedules.ts +108 -0
- package/src/lib/data/seed-data/tasks.ts +341 -0
- package/src/lib/data/seed-data/usage-ledger.ts +130 -0
- package/src/lib/data/seed-data/workflows.ts +213 -0
- package/src/lib/data/seed.ts +129 -0
- package/src/lib/db/index.ts +221 -0
- package/src/lib/db/migrations/0000_aromatic_gargoyle.sql +59 -0
- package/src/lib/db/migrations/0001_first_iron_patriot.sql +6 -0
- package/src/lib/db/migrations/0002_add_resume_count.sql +1 -0
- package/src/lib/db/migrations/0003_add_settings.sql +5 -0
- package/src/lib/db/migrations/0004_add_documents.sql +20 -0
- package/src/lib/db/migrations/0005_add_document_preprocessing.sql +4 -0
- package/src/lib/db/migrations/0006_add_agent_profile.sql +2 -0
- package/src/lib/db/migrations/0007_add_usage_metering_ledger.sql +30 -0
- package/src/lib/db/migrations/0008_add_document_version.sql +1 -0
- package/src/lib/db/migrations/meta/0000_snapshot.json +416 -0
- package/src/lib/db/migrations/meta/0001_snapshot.json +461 -0
- package/src/lib/db/migrations/meta/0002_snapshot.json +469 -0
- package/src/lib/db/migrations/meta/_journal.json +27 -0
- package/src/lib/db/schema.ts +227 -0
- package/src/lib/documents/cleanup.ts +50 -0
- package/src/lib/documents/context-builder.ts +75 -0
- package/src/lib/documents/output-scanner.ts +166 -0
- package/src/lib/documents/processor.ts +120 -0
- package/src/lib/documents/processors/image.ts +21 -0
- package/src/lib/documents/processors/office.ts +36 -0
- package/src/lib/documents/processors/pdf.ts +12 -0
- package/src/lib/documents/processors/spreadsheet.ts +18 -0
- package/src/lib/documents/processors/text.ts +8 -0
- package/src/lib/documents/registry.ts +25 -0
- package/src/lib/notifications/actionable.ts +108 -0
- package/src/lib/notifications/permissions.ts +169 -0
- package/src/lib/queries/chart-data.ts +184 -0
- package/src/lib/schedules/interval-parser.ts +110 -0
- package/src/lib/schedules/scheduler.ts +220 -0
- package/src/lib/settings/auth.ts +98 -0
- package/src/lib/settings/budget-guardrails.ts +590 -0
- package/src/lib/settings/helpers.ts +23 -0
- package/src/lib/settings/openai-auth.ts +80 -0
- package/src/lib/settings/permissions.ts +102 -0
- package/src/lib/usage/ledger.ts +489 -0
- package/src/lib/usage/pricing.ts +68 -0
- package/src/lib/utils/crypto.ts +90 -0
- package/src/lib/utils/format-timestamp.ts +46 -0
- package/src/lib/utils/session-cleanup.ts +26 -0
- package/src/lib/utils/stagent-paths.ts +18 -0
- package/src/lib/utils.ts +6 -0
- package/src/lib/validators/blueprint.ts +43 -0
- package/src/lib/validators/profile.ts +64 -0
- package/src/lib/validators/project.ts +17 -0
- package/src/lib/validators/settings.ts +57 -0
- package/src/lib/validators/task.ts +30 -0
- package/src/lib/workflows/blueprints/builtins/code-review-pipeline.yaml +72 -0
- package/src/lib/workflows/blueprints/builtins/documentation-generation.yaml +62 -0
- package/src/lib/workflows/blueprints/builtins/investment-research.yaml +81 -0
- package/src/lib/workflows/blueprints/builtins/meal-planning.yaml +73 -0
- package/src/lib/workflows/blueprints/builtins/product-research.yaml +72 -0
- package/src/lib/workflows/blueprints/builtins/research-report.yaml +77 -0
- package/src/lib/workflows/blueprints/builtins/sprint-planning.yaml +77 -0
- package/src/lib/workflows/blueprints/builtins/travel-planning.yaml +80 -0
- package/src/lib/workflows/blueprints/instantiator.ts +131 -0
- package/src/lib/workflows/blueprints/registry.ts +128 -0
- package/src/lib/workflows/blueprints/template.ts +58 -0
- package/src/lib/workflows/blueprints/types.ts +38 -0
- package/src/lib/workflows/definition-validation.ts +121 -0
- package/src/lib/workflows/engine.ts +1113 -0
- package/src/lib/workflows/loop-executor.ts +270 -0
- package/src/lib/workflows/parallel.ts +55 -0
- package/src/lib/workflows/swarm.ts +97 -0
- package/src/lib/workflows/types.ts +112 -0
- 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,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,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;
|