stagent 0.6.3 → 0.7.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 (123) hide show
  1. package/README.md +21 -2
  2. package/dist/cli.js +226 -1
  3. package/docs/.coverage-gaps.json +66 -16
  4. package/docs/.last-generated +1 -1
  5. package/docs/features/dashboard-kanban.md +13 -7
  6. package/docs/features/settings.md +15 -3
  7. package/docs/features/tables.md +122 -0
  8. package/docs/index.md +3 -2
  9. package/docs/journeys/developer.md +26 -16
  10. package/docs/journeys/personal-use.md +23 -9
  11. package/docs/journeys/power-user.md +40 -14
  12. package/docs/journeys/work-use.md +43 -15
  13. package/docs/manifest.json +27 -17
  14. package/package.json +3 -1
  15. package/src/app/api/chat/entities/search/route.ts +12 -3
  16. package/src/app/api/projects/[id]/route.ts +37 -0
  17. package/src/app/api/projects/__tests__/delete-project.test.ts +12 -0
  18. package/src/app/api/snapshots/[id]/restore/route.ts +62 -0
  19. package/src/app/api/snapshots/[id]/route.ts +44 -0
  20. package/src/app/api/snapshots/route.ts +54 -0
  21. package/src/app/api/snapshots/settings/route.ts +67 -0
  22. package/src/app/api/tables/[id]/charts/[chartId]/route.ts +89 -0
  23. package/src/app/api/tables/[id]/charts/route.ts +72 -0
  24. package/src/app/api/tables/[id]/columns/route.ts +70 -0
  25. package/src/app/api/tables/[id]/export/route.ts +94 -0
  26. package/src/app/api/tables/[id]/history/route.ts +15 -0
  27. package/src/app/api/tables/[id]/import/route.ts +111 -0
  28. package/src/app/api/tables/[id]/route.ts +86 -0
  29. package/src/app/api/tables/[id]/rows/[rowId]/history/route.ts +32 -0
  30. package/src/app/api/tables/[id]/rows/[rowId]/route.ts +51 -0
  31. package/src/app/api/tables/[id]/rows/route.ts +101 -0
  32. package/src/app/api/tables/[id]/triggers/[triggerId]/route.ts +65 -0
  33. package/src/app/api/tables/[id]/triggers/route.ts +122 -0
  34. package/src/app/api/tables/route.ts +65 -0
  35. package/src/app/api/tables/templates/route.ts +92 -0
  36. package/src/app/settings/page.tsx +2 -0
  37. package/src/app/tables/[id]/page.tsx +67 -0
  38. package/src/app/tables/page.tsx +21 -0
  39. package/src/app/tables/templates/page.tsx +19 -0
  40. package/src/components/chat/chat-table-result.tsx +139 -0
  41. package/src/components/documents/document-browser.tsx +1 -1
  42. package/src/components/projects/project-form-sheet.tsx +3 -27
  43. package/src/components/schedules/schedule-form.tsx +5 -27
  44. package/src/components/settings/data-management-section.tsx +17 -12
  45. package/src/components/settings/database-snapshots-section.tsx +469 -0
  46. package/src/components/shared/app-sidebar.tsx +2 -0
  47. package/src/components/shared/document-picker-sheet.tsx +214 -11
  48. package/src/components/tables/table-browser.tsx +234 -0
  49. package/src/components/tables/table-cell-editor.tsx +226 -0
  50. package/src/components/tables/table-chart-builder.tsx +288 -0
  51. package/src/components/tables/table-chart-view.tsx +146 -0
  52. package/src/components/tables/table-column-header.tsx +103 -0
  53. package/src/components/tables/table-column-sheet.tsx +331 -0
  54. package/src/components/tables/table-create-sheet.tsx +240 -0
  55. package/src/components/tables/table-detail-sheet.tsx +144 -0
  56. package/src/components/tables/table-detail-tabs.tsx +278 -0
  57. package/src/components/tables/table-grid.tsx +61 -0
  58. package/src/components/tables/table-history-tab.tsx +148 -0
  59. package/src/components/tables/table-import-wizard.tsx +542 -0
  60. package/src/components/tables/table-list-table.tsx +95 -0
  61. package/src/components/tables/table-relation-combobox.tsx +217 -0
  62. package/src/components/tables/table-spreadsheet.tsx +499 -0
  63. package/src/components/tables/table-template-gallery.tsx +162 -0
  64. package/src/components/tables/table-template-preview.tsx +219 -0
  65. package/src/components/tables/table-toolbar.tsx +79 -0
  66. package/src/components/tables/table-triggers-tab.tsx +446 -0
  67. package/src/components/tables/types.ts +6 -0
  68. package/src/components/tables/use-spreadsheet-keys.ts +171 -0
  69. package/src/components/tables/utils.ts +29 -0
  70. package/src/components/tasks/task-create-panel.tsx +5 -31
  71. package/src/components/tasks/task-edit-dialog.tsx +5 -27
  72. package/src/components/workflows/workflow-form-view.tsx +5 -29
  73. package/src/components/workflows/workflow-status-view.tsx +1 -1
  74. package/src/instrumentation.ts +3 -0
  75. package/src/lib/agents/__tests__/claude-agent.test.ts +5 -1
  76. package/src/lib/agents/claude-agent.ts +3 -1
  77. package/src/lib/agents/runtime/anthropic-direct.ts +29 -0
  78. package/src/lib/agents/runtime/openai-direct.ts +29 -0
  79. package/src/lib/chat/stagent-tools.ts +2 -0
  80. package/src/lib/chat/tool-catalog.ts +34 -0
  81. package/src/lib/chat/tools/table-tools.ts +955 -0
  82. package/src/lib/constants/table-status.ts +68 -0
  83. package/src/lib/data/__tests__/clear.test.ts +1 -1
  84. package/src/lib/data/clear.ts +45 -0
  85. package/src/lib/data/seed-data/__tests__/profiles.test.ts +28 -23
  86. package/src/lib/data/seed-data/conversations.ts +350 -42
  87. package/src/lib/data/seed-data/documents.ts +564 -591
  88. package/src/lib/data/seed-data/learned-context.ts +101 -22
  89. package/src/lib/data/seed-data/notifications.ts +344 -70
  90. package/src/lib/data/seed-data/profile-test-results.ts +92 -11
  91. package/src/lib/data/seed-data/profiles.ts +144 -46
  92. package/src/lib/data/seed-data/projects.ts +50 -18
  93. package/src/lib/data/seed-data/repo-imports.ts +28 -13
  94. package/src/lib/data/seed-data/schedules.ts +208 -41
  95. package/src/lib/data/seed-data/table-templates.ts +234 -0
  96. package/src/lib/data/seed-data/tasks.ts +614 -116
  97. package/src/lib/data/seed-data/usage-ledger.ts +182 -103
  98. package/src/lib/data/seed-data/user-tables.ts +203 -0
  99. package/src/lib/data/seed-data/views.ts +52 -7
  100. package/src/lib/data/seed-data/workflows.ts +231 -84
  101. package/src/lib/data/seed.ts +55 -14
  102. package/src/lib/data/tables.ts +417 -0
  103. package/src/lib/db/bootstrap.ts +227 -0
  104. package/src/lib/db/index.ts +9 -0
  105. package/src/lib/db/migrations/0019_add_tables_feature.sql +160 -0
  106. package/src/lib/db/migrations/0020_add_table_triggers.sql +19 -0
  107. package/src/lib/db/migrations/0021_add_row_history.sql +15 -0
  108. package/src/lib/db/schema.ts +368 -0
  109. package/src/lib/snapshots/auto-backup.ts +132 -0
  110. package/src/lib/snapshots/retention.ts +64 -0
  111. package/src/lib/snapshots/snapshot-manager.ts +429 -0
  112. package/src/lib/tables/computed.ts +61 -0
  113. package/src/lib/tables/context-builder.ts +139 -0
  114. package/src/lib/tables/formula-engine.ts +415 -0
  115. package/src/lib/tables/history.ts +115 -0
  116. package/src/lib/tables/import.ts +343 -0
  117. package/src/lib/tables/query-builder.ts +152 -0
  118. package/src/lib/tables/trigger-evaluator.ts +146 -0
  119. package/src/lib/tables/types.ts +141 -0
  120. package/src/lib/tables/validation.ts +119 -0
  121. package/src/lib/utils/stagent-paths.ts +20 -0
  122. package/tsconfig.json +3 -1
  123. /package/docs/features/{playbook.md → user-guide.md} +0 -0
@@ -0,0 +1,141 @@
1
+ import type {
2
+ UserTableRow,
3
+ UserTableColumnRow,
4
+ UserTableRowRow,
5
+ UserTableTemplateRow,
6
+ } from "@/lib/db/schema";
7
+ import type { ColumnDataType } from "@/lib/constants/table-status";
8
+
9
+ // ── Column Definition (stored in column_schema JSON) ─────────────────
10
+
11
+ export interface ColumnDef {
12
+ name: string;
13
+ displayName: string;
14
+ dataType: ColumnDataType;
15
+ position: number;
16
+ required?: boolean;
17
+ defaultValue?: string | null;
18
+ config?: ColumnConfig | null;
19
+ }
20
+
21
+ /** Type-specific column configuration */
22
+ export interface ColumnConfig {
23
+ /** Select column: available options */
24
+ options?: string[];
25
+ /** Computed column: formula expression */
26
+ formula?: string;
27
+ /** Computed column: formula type */
28
+ formulaType?: "arithmetic" | "text_concat" | "date_diff" | "conditional" | "aggregate";
29
+ /** Computed column: expected result type */
30
+ resultType?: ColumnDataType;
31
+ /** Computed column: column names this formula depends on */
32
+ dependencies?: string[];
33
+ /** Relation column: target table ID */
34
+ targetTableId?: string;
35
+ /** Relation column: display column name in target table */
36
+ displayColumn?: string;
37
+ }
38
+
39
+ // ── Filter & Sort Specs ──────────────────────────────────────────────
40
+
41
+ export type FilterOperator =
42
+ | "eq"
43
+ | "neq"
44
+ | "gt"
45
+ | "gte"
46
+ | "lt"
47
+ | "lte"
48
+ | "contains"
49
+ | "starts_with"
50
+ | "in"
51
+ | "is_empty"
52
+ | "is_not_empty";
53
+
54
+ export interface FilterSpec {
55
+ column: string;
56
+ operator: FilterOperator;
57
+ value?: string | number | boolean | string[];
58
+ }
59
+
60
+ export interface SortSpec {
61
+ column: string;
62
+ direction: "asc" | "desc";
63
+ }
64
+
65
+ // ── Query Options ────────────────────────────────────────────────────
66
+
67
+ export interface RowQueryOptions {
68
+ filters?: FilterSpec[];
69
+ sorts?: SortSpec[];
70
+ limit?: number;
71
+ offset?: number;
72
+ }
73
+
74
+ // ── Enriched Types (with joins) ──────────────────────────────────────
75
+
76
+ export interface TableWithRelations extends UserTableRow {
77
+ projectName?: string | null;
78
+ columnCount: number;
79
+ columns?: UserTableColumnRow[];
80
+ }
81
+
82
+ export interface RowWithMeta extends UserTableRowRow {
83
+ parsedData: Record<string, unknown>;
84
+ }
85
+
86
+ // ── Input Types ──────────────────────────────────────────────────────
87
+
88
+ export interface CreateTableInput {
89
+ name: string;
90
+ description?: string | null;
91
+ projectId?: string | null;
92
+ columns?: ColumnDef[];
93
+ source?: "manual" | "imported" | "agent" | "template";
94
+ templateId?: string | null;
95
+ }
96
+
97
+ export interface UpdateTableInput {
98
+ name?: string;
99
+ description?: string | null;
100
+ projectId?: string | null;
101
+ }
102
+
103
+ export interface AddColumnInput {
104
+ name: string;
105
+ displayName: string;
106
+ dataType: ColumnDataType;
107
+ required?: boolean;
108
+ defaultValue?: string | null;
109
+ config?: ColumnConfig | null;
110
+ }
111
+
112
+ export interface UpdateColumnInput {
113
+ displayName?: string;
114
+ dataType?: ColumnDataType;
115
+ required?: boolean;
116
+ defaultValue?: string | null;
117
+ config?: ColumnConfig | null;
118
+ }
119
+
120
+ export interface AddRowInput {
121
+ data: Record<string, unknown>;
122
+ createdBy?: string;
123
+ }
124
+
125
+ export interface UpdateRowInput {
126
+ data: Record<string, unknown>;
127
+ }
128
+
129
+ // ── Template Types ───────────────────────────────────────────────────
130
+
131
+ export interface TemplateWithPreview extends UserTableTemplateRow {
132
+ parsedColumns: ColumnDef[];
133
+ parsedSampleData: Record<string, unknown>[];
134
+ }
135
+
136
+ export interface CloneFromTemplateInput {
137
+ templateId: string;
138
+ name: string;
139
+ projectId?: string | null;
140
+ includeSampleData?: boolean;
141
+ }
@@ -0,0 +1,119 @@
1
+ import { z } from "zod";
2
+ import { COLUMN_DATA_TYPES, TABLE_SOURCES, TEMPLATE_CATEGORIES } from "@/lib/constants/table-status";
3
+
4
+ // ── Column Definition Schema ─────────────────────────────────────────
5
+
6
+ const columnConfigSchema = z.object({
7
+ options: z.array(z.string()).optional(),
8
+ formula: z.string().optional(),
9
+ formulaType: z.enum(["arithmetic", "text_concat", "date_diff", "conditional", "aggregate"]).optional(),
10
+ resultType: z.enum(COLUMN_DATA_TYPES).optional(),
11
+ dependencies: z.array(z.string()).optional(),
12
+ targetTableId: z.string().optional(),
13
+ displayColumn: z.string().optional(),
14
+ }).optional();
15
+
16
+ const columnDefSchema = z.object({
17
+ name: z.string().min(1).max(64),
18
+ displayName: z.string().min(1).max(128),
19
+ dataType: z.enum(COLUMN_DATA_TYPES),
20
+ position: z.number().int().min(0),
21
+ required: z.boolean().optional(),
22
+ defaultValue: z.string().nullable().optional(),
23
+ config: columnConfigSchema,
24
+ });
25
+
26
+ // ── Table Schemas ────────────────────────────────────────────────────
27
+
28
+ export const createTableSchema = z.object({
29
+ name: z.string().min(1).max(256),
30
+ description: z.string().max(1024).nullable().optional(),
31
+ projectId: z.string().nullable().optional(),
32
+ columns: z.array(columnDefSchema).optional(),
33
+ source: z.enum(TABLE_SOURCES).optional(),
34
+ templateId: z.string().nullable().optional(),
35
+ });
36
+
37
+ export const updateTableSchema = z.object({
38
+ name: z.string().min(1).max(256).optional(),
39
+ description: z.string().max(1024).nullable().optional(),
40
+ projectId: z.string().nullable().optional(),
41
+ });
42
+
43
+ // ── Column Schemas ───────────────────────────────────────────────────
44
+
45
+ export const addColumnSchema = z.object({
46
+ name: z.string().min(1).max(64),
47
+ displayName: z.string().min(1).max(128),
48
+ dataType: z.enum(COLUMN_DATA_TYPES),
49
+ required: z.boolean().optional(),
50
+ defaultValue: z.string().nullable().optional(),
51
+ config: columnConfigSchema,
52
+ });
53
+
54
+ export const updateColumnSchema = z.object({
55
+ displayName: z.string().min(1).max(128).optional(),
56
+ dataType: z.enum(COLUMN_DATA_TYPES).optional(),
57
+ required: z.boolean().optional(),
58
+ defaultValue: z.string().nullable().optional(),
59
+ config: columnConfigSchema,
60
+ });
61
+
62
+ export const reorderColumnsSchema = z.object({
63
+ /** Array of column IDs in the desired order */
64
+ columnIds: z.array(z.string()).min(1),
65
+ });
66
+
67
+ // ── Row Schemas ──────────────────────────────────────────────────────
68
+
69
+ export const addRowsSchema = z.object({
70
+ rows: z.array(
71
+ z.object({
72
+ data: z.record(z.string(), z.unknown()),
73
+ createdBy: z.string().optional(),
74
+ })
75
+ ).min(1).max(1000),
76
+ });
77
+
78
+ export const updateRowSchema = z.object({
79
+ data: z.record(z.string(), z.unknown()),
80
+ });
81
+
82
+ // ── Query Schemas ────────────────────────────────────────────────────
83
+
84
+ const filterOperators = [
85
+ "eq", "neq", "gt", "gte", "lt", "lte",
86
+ "contains", "starts_with", "in", "is_empty", "is_not_empty",
87
+ ] as const;
88
+
89
+ export const filterSpecSchema = z.object({
90
+ column: z.string().min(1),
91
+ operator: z.enum(filterOperators),
92
+ value: z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]).optional(),
93
+ });
94
+
95
+ export const sortSpecSchema = z.object({
96
+ column: z.string().min(1),
97
+ direction: z.enum(["asc", "desc"]),
98
+ });
99
+
100
+ export const rowQuerySchema = z.object({
101
+ filters: z.array(filterSpecSchema).optional(),
102
+ sorts: z.array(sortSpecSchema).optional(),
103
+ limit: z.number().int().min(1).max(1000).optional(),
104
+ offset: z.number().int().min(0).optional(),
105
+ });
106
+
107
+ // ── Template Schemas ─────────────────────────────────────────────────
108
+
109
+ export const cloneFromTemplateSchema = z.object({
110
+ templateId: z.string(),
111
+ name: z.string().min(1).max(256),
112
+ projectId: z.string().nullable().optional(),
113
+ includeSampleData: z.boolean().optional(),
114
+ });
115
+
116
+ export const listTemplatesSchema = z.object({
117
+ category: z.enum(TEMPLATE_CATEGORIES).optional(),
118
+ scope: z.enum(["system", "user"]).optional(),
119
+ });
@@ -20,3 +20,23 @@ export function getStagentBlueprintsDir(): string {
20
20
  export function getStagentScreenshotsDir(): string {
21
21
  return join(getStagentDataDir(), "screenshots");
22
22
  }
23
+
24
+ export function getStagentSnapshotsDir(): string {
25
+ return join(getStagentDataDir(), "snapshots");
26
+ }
27
+
28
+ export function getStagentOutputsDir(): string {
29
+ return join(getStagentDataDir(), "outputs");
30
+ }
31
+
32
+ export function getStagentSessionsDir(): string {
33
+ return join(getStagentDataDir(), "sessions");
34
+ }
35
+
36
+ export function getStagentLogsDir(): string {
37
+ return join(getStagentDataDir(), "logs");
38
+ }
39
+
40
+ export function getStagentDocumentsDir(): string {
41
+ return join(getStagentDataDir(), "documents");
42
+ }
package/tsconfig.json CHANGED
@@ -37,6 +37,8 @@
37
37
  ],
38
38
  "exclude": [
39
39
  "node_modules",
40
- "vitest.config*.ts"
40
+ "vitest.config*.ts",
41
+ "src/**/__tests__/**",
42
+ "src/__tests__/**"
41
43
  ]
42
44
  }
File without changes