circuschief 0.8.0 → 1.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/package.json +1 -1
- package/packages/server/src/agents/AgentGateway.js +2 -0
- package/packages/server/src/agents/adapters/GeminiAdapter.js +105 -0
- package/packages/server/src/agents/adapters/cliUtils.js +15 -0
- package/packages/server/src/agents/adapters/codexCliRunner.js +1 -8
- package/packages/server/src/agents/adapters/geminiCliRunner.js +183 -0
- package/packages/server/src/agents/adapters/geminiEventMapper.js +195 -0
- package/packages/server/src/api/commandButtons.js +16 -15
- package/packages/server/src/api/projects-commandButtons.js +6 -6
- package/packages/server/src/api/projects-session-create.js +109 -0
- package/packages/server/src/api/projects-session-defaults.js +51 -0
- package/packages/server/src/api/projects-session-helpers.js +47 -1
- package/packages/server/src/api/projects-templates.js +38 -0
- package/packages/server/src/api/projects.js +28 -180
- package/packages/server/src/api/sessions-commands.js +21 -18
- package/packages/server/src/api/sessions-patch.js +41 -1
- package/packages/server/src/db/ProviderRepository.js +4 -2
- package/packages/server/src/db/SessionRepository.js +1 -1
- package/packages/server/src/db/SessionTemplateRepository.js +23 -2
- package/packages/server/src/db/migrations/canvasItemsMigrations.js +109 -0
- package/packages/server/src/db/migrations/conversationsMigrations.js +187 -0
- package/packages/server/src/db/migrations/index.js +234 -6
- package/packages/server/src/db/migrations/kanbanMigrations.js +99 -0
- package/packages/server/src/db/migrations/miscMigrations.js +244 -0
- package/packages/server/src/db/migrations/projectsMigrations.js +130 -0
- package/packages/server/src/db/migrations/providerCommitAttributionMigrations.js +30 -0
- package/packages/server/src/db/migrations/providerMigrations.js +250 -0
- package/packages/server/src/db/migrations/sessionTableRecreate.js +136 -0
- package/packages/server/src/db/migrations/sessionsMigrations.js +300 -0
- package/packages/server/src/db/seedBaselineData.js +23 -1
- package/packages/server/src/db/session-helpers.js +26 -1
- package/packages/server/src/schema.sql +5 -1
- package/packages/server/src/services/commandButtonPrompts.js +9 -7
- package/packages/server/src/services/e2eSpawnCapture.js +47 -6
- package/packages/server/src/services/geminiSpawnHelper.js +47 -0
- package/packages/server/src/services/gitCommitAttribution.js +38 -8
- package/packages/server/src/services/gitDiff.js +107 -0
- package/packages/server/src/services/gitRepoUrl.js +174 -0
- package/packages/server/src/services/gitService.js +43 -311
- package/packages/server/src/services/gitWorktree.js +127 -0
- package/packages/server/src/services/providerTestService.js +59 -1
- package/packages/server/src/services/queryParamBuilder.js +33 -1
- package/packages/server/src/services/sessionExecution.js +4 -0
- package/packages/server/src/services/sessionPrompts.js +23 -1
- package/packages/server/src/services/sessionProvider.js +41 -1
- package/packages/shared/src/constants.js +1 -1
- package/packages/shared/src/contracts/providers.js +1 -1
- package/packages/shared/src/contracts/sessions.js +27 -1
- package/packages/shared/src/contracts/templates.js +10 -0
- package/packages/shared/src/types.js +7 -0
- package/packages/web/dist/assets/{ActiveSessionsView-B0XHqLmv.js → ActiveSessionsView-EdNxmPmZ.js} +1 -1
- package/packages/web/dist/assets/{AgentLogsView-DmsjUMlB.js → AgentLogsView-C2wX0JPP.js} +2 -2
- package/packages/web/dist/assets/ApiClient-DfbJwzpz.js +1 -0
- package/packages/web/dist/assets/ArchiveConfirmModal-DJERn5XO.js +1 -0
- package/packages/web/dist/assets/CommandButtonDetailView-CBPI8-US.js +1 -0
- package/packages/web/dist/assets/CommandButtonDetailView-D9zjx9ME.css +1 -0
- package/packages/web/dist/assets/EffortLevelSelector-PaBpUveC.js +1 -0
- package/packages/web/dist/assets/{GeneralSettingsView-D1nI8_zk.js → GeneralSettingsView-Dw-x83R0.js} +1 -1
- package/packages/web/dist/assets/{InputWithButton-CAkttyqx.js → InputWithButton-CHHcpF4I.js} +1 -1
- package/packages/web/dist/assets/{InterpolationHelp-BO1j9Z3_.js → InterpolationHelp-CLNPz8s8.js} +1 -1
- package/packages/web/dist/assets/MarkdownEditor-DYi1igfT.js +2 -0
- package/packages/web/dist/assets/ModelSelector-Cko_yTO5.js +1 -0
- package/packages/web/dist/assets/{ModelSelector-BSxKUSus.css → ModelSelector-Dtwe5xLH.css} +1 -1
- package/packages/web/dist/assets/{NewSessionView-BDPb-1qr.css → NewSessionView-DBl7T2Xp.css} +1 -1
- package/packages/web/dist/assets/NewSessionView-DwUfBg70.js +3 -0
- package/packages/web/dist/assets/ProjectEditView-CSbsea3U.js +1 -0
- package/packages/web/dist/assets/ProjectEditView-DbqTbA0q.css +1 -0
- package/packages/web/dist/assets/{ProjectListView-DcNyuINs.js → ProjectListView-CEc_LWZL.js} +1 -1
- package/packages/web/dist/assets/{ProjectNewView-B5YV62hv.js → ProjectNewView-D4U0uRlp.js} +1 -1
- package/packages/web/dist/assets/ProvidersView-2KCOiY6Q.css +1 -0
- package/packages/web/dist/assets/ProvidersView-CD1j8BOv.js +1 -0
- package/packages/web/dist/assets/QuickResponsesPanel-Dp39f12o.js +1 -0
- package/packages/web/dist/assets/QuickResponsesPanel-dk-Rj8xx.css +1 -0
- package/packages/web/dist/assets/ResizableTextarea-BWywIqOv.js +1 -0
- package/packages/web/dist/assets/ResizableTextarea-DERSH3Wz.css +1 -0
- package/packages/web/dist/assets/SessionCard-B6d5ijDW.js +1 -0
- package/packages/web/dist/assets/SessionDetailView-DWbXdx7A.js +36 -0
- package/packages/web/dist/assets/SessionDetailView-ULeIkWS0.css +1 -0
- package/packages/web/dist/assets/{SessionFormOptions-B6AxyREh.js → SessionFormOptions-Dz9ik4Fo.js} +1 -1
- package/packages/web/dist/assets/{SessionListView-B5_6gW49.css → SessionListView-3-xx6EVs.css} +1 -1
- package/packages/web/dist/assets/SessionListView-C129buBe.js +1 -0
- package/packages/web/dist/assets/{SessionLogStream-LlZ3z_Xj.js → SessionLogStream-BvXUNNBZ.js} +6 -6
- package/packages/web/dist/assets/{SettingsView-CTGiGvR2.js → SettingsView-DW1NvpX_.js} +1 -1
- package/packages/web/dist/assets/SlashCommandWizard-DleYBxrE.js +1 -0
- package/packages/web/dist/assets/{SummarySettingsView-BR2ZjEa3.js → SummarySettingsView-CLUfcWvf.js} +1 -1
- package/packages/web/dist/assets/TemplateDetailView-B5NI2oTR.css +1 -0
- package/packages/web/dist/assets/TemplateDetailView-Cukb205e.js +1 -0
- package/packages/web/dist/assets/{commandButtons-BfqR-fqq.js → commandButtons-DejH0rVN.js} +1 -1
- package/packages/web/dist/assets/index-BD7Y3rBE.js +3 -0
- package/packages/web/dist/assets/{index-BY174HVJ.css → index-Bd20AzX1.css} +1 -1
- package/packages/web/dist/assets/index-BgJiarKe.js +1 -0
- package/packages/web/dist/assets/index-Bk32fSSG.js +1 -0
- package/packages/web/dist/assets/index-BkA6pF2Z.js +1 -0
- package/packages/web/dist/assets/index-Cltr-Ldt.js +7 -0
- package/packages/web/dist/assets/index-Co-46Tp3.js +1 -0
- package/packages/web/dist/assets/index-Cpykk857.js +1 -0
- package/packages/web/dist/assets/index-CtABl0D1.js +1 -0
- package/packages/web/dist/assets/index-Cuqk5m9S.js +1 -0
- package/packages/web/dist/assets/{index-fK8FIZgP.js → index-CvXApbVC.js} +15 -15
- package/packages/web/dist/assets/index-D2gN-xEH.js +1 -0
- package/packages/web/dist/assets/index-Dd3WpmyQ.js +1 -0
- package/packages/web/dist/assets/index-Dk6--9rj.js +1 -0
- package/packages/web/dist/assets/{index-DgkC10TW.js → index-MZf7MlPX.js} +3 -3
- package/packages/web/dist/assets/{index-DtfUt785.js → index-NShCcwfj.js} +1 -1
- package/packages/web/dist/assets/index-hA3VEuSq.js +1 -0
- package/packages/web/dist/assets/index-p0mp3nca.js +1 -0
- package/packages/web/dist/assets/index-qntNa5r_.js +1 -0
- package/packages/web/dist/assets/index-qq9ceNSK.js +1 -0
- package/packages/web/dist/assets/projectDefaults-D9xkp2XR.js +1 -0
- package/packages/web/dist/assets/{projects-DXYQNJIi.js → projects-BvLADGKx.js} +1 -1
- package/packages/web/dist/assets/{providers-1bnH-exJ.js → providers-DZ-fOa4G.js} +1 -1
- package/packages/web/dist/assets/{sessions-6zGUlFrt.js → sessions-DETEyjPI.js} +1 -1
- package/packages/web/dist/assets/{settings-MbfRir0d.js → settings-TWfbahn5.js} +1 -1
- package/packages/web/dist/index.html +2 -2
- package/packages/web/dist/assets/ApiClient-C3ztI9s9.js +0 -1
- package/packages/web/dist/assets/ArchiveConfirmModal-BlCyn5Vt.js +0 -1
- package/packages/web/dist/assets/CommandButtonDetailView-CdSCPp78.js +0 -1
- package/packages/web/dist/assets/CommandButtonDetailView-DBm3rzhw.css +0 -1
- package/packages/web/dist/assets/EffortLevelSelector-hc2MNKg6.js +0 -1
- package/packages/web/dist/assets/MarkdownEditor-ucRAP_UM.js +0 -2
- package/packages/web/dist/assets/ModelSelector-CwTz8ZWO.js +0 -1
- package/packages/web/dist/assets/NewSessionView-BsDrp8mj.js +0 -3
- package/packages/web/dist/assets/ProjectEditView-CwTOeSun.js +0 -1
- package/packages/web/dist/assets/ProjectEditView-J15mcsWz.css +0 -1
- package/packages/web/dist/assets/ProvidersView-bZemq_Rv.css +0 -1
- package/packages/web/dist/assets/ProvidersView-nY9GnDdO.js +0 -1
- package/packages/web/dist/assets/QuickResponseSettings-B352c75l.css +0 -1
- package/packages/web/dist/assets/QuickResponseSettings-BQwQXuL7.js +0 -1
- package/packages/web/dist/assets/QuickResponsesPanel-BlFDvnZ2.css +0 -1
- package/packages/web/dist/assets/QuickResponsesPanel-BzSYcCSP.js +0 -1
- package/packages/web/dist/assets/ResizableTextarea-B3YIdIXv.js +0 -1
- package/packages/web/dist/assets/ResizableTextarea-DsU3TVwF.css +0 -1
- package/packages/web/dist/assets/SessionCard-CjE1tXiT.js +0 -1
- package/packages/web/dist/assets/SessionDetailView-3cPZrbS3.js +0 -36
- package/packages/web/dist/assets/SessionDetailView-CZRZMrfM.css +0 -1
- package/packages/web/dist/assets/SessionListView-CLXBfLcq.js +0 -1
- package/packages/web/dist/assets/SlashCommandWizard-Cy04d7-o.js +0 -1
- package/packages/web/dist/assets/TemplateDetailView-DH6Oswsp.js +0 -1
- package/packages/web/dist/assets/TemplateDetailView-DT2m06W7.css +0 -1
- package/packages/web/dist/assets/index-1zziPL6l.js +0 -1
- package/packages/web/dist/assets/index-7kzHPxSF.js +0 -1
- package/packages/web/dist/assets/index-B0N_obMc.js +0 -1
- package/packages/web/dist/assets/index-BNk_gdfI.js +0 -1
- package/packages/web/dist/assets/index-CSqaAH-0.js +0 -1
- package/packages/web/dist/assets/index-C_q4WlK8.js +0 -1
- package/packages/web/dist/assets/index-D1wpU4y0.js +0 -7
- package/packages/web/dist/assets/index-D5zCA8sD.js +0 -1
- package/packages/web/dist/assets/index-DGR8ELWY.js +0 -1
- package/packages/web/dist/assets/index-DHga8pXo.js +0 -1
- package/packages/web/dist/assets/index-DSby02Wl.js +0 -1
- package/packages/web/dist/assets/index-DqjXJTVI.js +0 -1
- package/packages/web/dist/assets/index-_4S2uLDI.js +0 -1
- package/packages/web/dist/assets/index-gmiZeFXN.js +0 -1
- package/packages/web/dist/assets/index-irD539ZM.js +0 -3
- package/packages/web/dist/assets/index-yq-E1Y00.js +0 -1
|
@@ -1,3 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central registry of all database migrations in execution order.
|
|
3
|
+
*
|
|
4
|
+
* Each migration is idempotent (checks before acting), so the exact ordering
|
|
5
|
+
* only matters where there are hard dependencies (e.g. a table must exist
|
|
6
|
+
* before a column references it via FK).
|
|
7
|
+
*
|
|
8
|
+
* The ordering below mirrors the original #runMigrations() top-to-bottom flow
|
|
9
|
+
* as closely as possible.
|
|
10
|
+
*/
|
|
11
|
+
import { sessionsMigrations } from './sessionsMigrations.js';
|
|
12
|
+
import { projectsMigrations } from './projectsMigrations.js';
|
|
13
|
+
import { conversationsMigrations } from './conversationsMigrations.js';
|
|
14
|
+
import { canvasItemsMigrations } from './canvasItemsMigrations.js';
|
|
15
|
+
import { miscMigrations } from './miscMigrations.js';
|
|
16
|
+
import { kanbanMigrations } from './kanbanMigrations.js';
|
|
17
|
+
import { providerMigrations } from './providerMigrations.js';
|
|
18
|
+
import { providerCommitAttributionMigrations } from './providerCommitAttributionMigrations.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Build a lookup map from a migrations array keyed by migration name.
|
|
22
|
+
* @param {Array<{name: string, up: Function}>} migrations
|
|
23
|
+
* @returns {Map<string, {name: string, up: Function}>}
|
|
24
|
+
*/
|
|
25
|
+
function toLookup(migrations) {
|
|
26
|
+
const map = new Map();
|
|
27
|
+
for (const m of migrations) {
|
|
28
|
+
map.set(m.name, m);
|
|
29
|
+
}
|
|
30
|
+
return map;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const s = toLookup(sessionsMigrations);
|
|
34
|
+
const p = toLookup(projectsMigrations);
|
|
35
|
+
const c = toLookup(conversationsMigrations);
|
|
36
|
+
const ci = toLookup(canvasItemsMigrations);
|
|
37
|
+
const m = toLookup(miscMigrations);
|
|
38
|
+
const k = toLookup(kanbanMigrations);
|
|
39
|
+
const pr = toLookup(providerMigrations);
|
|
40
|
+
const pca = toLookup(providerCommitAttributionMigrations);
|
|
41
|
+
|
|
1
42
|
/**
|
|
2
43
|
* Repair sessions whose parent link was lost during schema consolidation.
|
|
3
44
|
*
|
|
@@ -32,13 +73,200 @@ export const repairMissingSessionParentsFromWorktree = {
|
|
|
32
73
|
};
|
|
33
74
|
|
|
34
75
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* Pre-release migration history was consolidated into schema.sql. Future
|
|
38
|
-
* shipped schema changes should be added here as explicit migrations.
|
|
76
|
+
* Flat, ordered list of every migration, matching the original execution order
|
|
77
|
+
* from DatabaseManager.#runMigrations().
|
|
39
78
|
*
|
|
40
79
|
* @type {Array<{name: string, up: (db: import('better-sqlite3').Database) => void}>}
|
|
41
80
|
*/
|
|
42
|
-
|
|
81
|
+
// Validate that all migrations are properly defined
|
|
82
|
+
function validateMigrations(migrationsArray) {
|
|
83
|
+
for (const migration of migrationsArray) {
|
|
84
|
+
if (!migration || typeof migration.up !== 'function') {
|
|
85
|
+
const name = migration?.name || 'unknown';
|
|
86
|
+
throw new Error(`Migration "${name}" is undefined or missing an up() function`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return migrationsArray;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const allMigrations = validateMigrations([
|
|
93
|
+
// --- Sessions initial columns ---
|
|
94
|
+
s.get('sessions-add-cost_usd'),
|
|
95
|
+
s.get('sessions-add-claude_session_id'),
|
|
96
|
+
s.get('sessions-add-model'),
|
|
97
|
+
s.get('sessions-add-provider_id-early'),
|
|
98
|
+
s.get('sessions-add-effort_level'),
|
|
99
|
+
|
|
100
|
+
// --- Projects columns ---
|
|
101
|
+
p.get('projects-add-system_prompt'),
|
|
102
|
+
p.get('projects-add-on_session_created'),
|
|
103
|
+
p.get('projects-add-on_session_deleted'),
|
|
104
|
+
p.get('projects-add-repo_url'),
|
|
105
|
+
p.get('projects-add-worktree_path'),
|
|
106
|
+
p.get('projects-drop-summary-columns'),
|
|
107
|
+
|
|
108
|
+
// --- Sessions scheduling columns ---
|
|
109
|
+
s.get('sessions-add-scheduled_at'),
|
|
110
|
+
s.get('sessions-add-reschedule_delay_minutes'),
|
|
111
|
+
s.get('sessions-add-auto_reschedule_enabled'),
|
|
112
|
+
s.get('sessions-add-reschedule_on_token_limit'),
|
|
113
|
+
s.get('sessions-add-reschedule_on_service_error'),
|
|
114
|
+
s.get('sessions-add-max_reschedule_count'),
|
|
115
|
+
s.get('sessions-add-max_total_tokens'),
|
|
116
|
+
s.get('sessions-add-reschedule_count'),
|
|
117
|
+
s.get('sessions-add-reschedule_at_token_count'),
|
|
118
|
+
|
|
119
|
+
// --- Sessions status constraint migration (table recreation) ---
|
|
120
|
+
s.get('sessions-migrate-status-constraint'),
|
|
121
|
+
|
|
122
|
+
// --- Session summaries PR columns ---
|
|
123
|
+
c.get('session_summaries-add-pr_merged'),
|
|
124
|
+
c.get('session_summaries-add-pr_state'),
|
|
125
|
+
c.get('session_summaries-add-has_merge_conflicts'),
|
|
126
|
+
c.get('session_summaries-add-ci_status'),
|
|
127
|
+
c.get('session_summaries-add-ci_failures'),
|
|
128
|
+
c.get('session_summaries-add-last_summarized_message_id'),
|
|
129
|
+
|
|
130
|
+
// --- Sessions template chaining ---
|
|
131
|
+
s.get('sessions-add-next_template_id'),
|
|
132
|
+
s.get('sessions-add-parent_session_id'),
|
|
133
|
+
s.get('sessions-template-chaining-indexes'),
|
|
134
|
+
|
|
135
|
+
// --- Message attachments ---
|
|
136
|
+
c.get('message_attachments-add-file_path'),
|
|
137
|
+
|
|
138
|
+
// --- Conversation messages: conversation_id ---
|
|
139
|
+
c.get('conversation_messages-add-conversation_id'),
|
|
140
|
+
|
|
141
|
+
// --- Migrate existing sessions to conversations ---
|
|
142
|
+
c.get('conversations-migrate-existing-sessions'),
|
|
143
|
+
|
|
144
|
+
// --- Canvas items ---
|
|
145
|
+
ci.get('canvas_items-migrate-type-constraint'),
|
|
146
|
+
ci.get('canvas_items-add-deleted_at'),
|
|
147
|
+
ci.get('canvas_items-drop-label'),
|
|
148
|
+
ci.get('canvas_items-add-updated_at'),
|
|
149
|
+
|
|
150
|
+
// --- Conversations: claude_session_id + token usage ---
|
|
151
|
+
c.get('conversations-add-claude_session_id'),
|
|
152
|
+
c.get('conversations-add-input_tokens'),
|
|
153
|
+
c.get('conversations-add-output_tokens'),
|
|
154
|
+
c.get('conversations-add-thinking_tokens'),
|
|
155
|
+
c.get('conversations-add-cache_read_input_tokens'),
|
|
156
|
+
c.get('conversations-add-cache_creation_input_tokens'),
|
|
157
|
+
c.get('conversations-add-web_search_requests'),
|
|
158
|
+
c.get('conversations-add-context_window'),
|
|
159
|
+
c.get('conversations-add-model'),
|
|
160
|
+
|
|
161
|
+
// --- Sessions token usage ---
|
|
162
|
+
s.get('sessions-add-input_tokens'),
|
|
163
|
+
s.get('sessions-add-output_tokens'),
|
|
164
|
+
s.get('sessions-add-thinking_tokens'),
|
|
165
|
+
s.get('sessions-add-cache_read_input_tokens'),
|
|
166
|
+
s.get('sessions-add-cache_creation_input_tokens'),
|
|
167
|
+
s.get('sessions-add-web_search_requests'),
|
|
168
|
+
s.get('sessions-add-context_window'),
|
|
169
|
+
|
|
170
|
+
// --- Sessions archived / starred / manually_named ---
|
|
171
|
+
s.get('sessions-add-archived'),
|
|
172
|
+
s.get('sessions-add-starred'),
|
|
173
|
+
s.get('sessions-add-manually_named'),
|
|
174
|
+
s.get('sessions-add-pr_url_auto_link_disabled'),
|
|
175
|
+
|
|
176
|
+
// --- Project session defaults table ---
|
|
177
|
+
p.get('project_session_defaults-create-table'),
|
|
178
|
+
|
|
179
|
+
// --- Command buttons ---
|
|
180
|
+
m.get('command_buttons-add-show_on_list'),
|
|
181
|
+
|
|
182
|
+
// --- Session todos ---
|
|
183
|
+
c.get('session_todos-add-conversation_id'),
|
|
184
|
+
|
|
185
|
+
// --- Conversation branching ---
|
|
186
|
+
c.get('conversations-add-parent_conversation_id'),
|
|
187
|
+
c.get('conversations-add-branch_from_message_id'),
|
|
188
|
+
|
|
189
|
+
// --- Sessions pending prompt / slash commands / pending model / auto send ---
|
|
190
|
+
s.get('sessions-add-pending_prompt'),
|
|
191
|
+
s.get('sessions-add-slash_commands'),
|
|
192
|
+
s.get('sessions-add-pending_model'),
|
|
193
|
+
s.get('sessions-add-auto_send_pending_prompt'),
|
|
194
|
+
|
|
195
|
+
// --- Session templates ---
|
|
196
|
+
m.get('session_templates-add-model'),
|
|
197
|
+
m.get('session_templates-add-mode'),
|
|
198
|
+
m.get('session_templates-add-effort_level'),
|
|
199
|
+
m.get('session_templates-add-quick-response-fields'),
|
|
200
|
+
|
|
201
|
+
// --- Conversation messages model ---
|
|
202
|
+
c.get('conversation_messages-add-model'),
|
|
203
|
+
|
|
204
|
+
// --- App settings table ---
|
|
205
|
+
m.get('app_settings-create-table'),
|
|
206
|
+
|
|
207
|
+
// --- Legacy model_providers cleanup ---
|
|
208
|
+
pr.get('model_providers-cleanup-legacy'),
|
|
209
|
+
|
|
210
|
+
// --- Providers + provider_models tables + seed ---
|
|
211
|
+
pr.get('providers-create-tables'),
|
|
212
|
+
pr.get('providers-add-kind'),
|
|
213
|
+
pr.get('providers-add-commit_attribution_override'),
|
|
214
|
+
pca.get('providers-normalize-commit_attribution_override'),
|
|
215
|
+
pr.get('providers-seed-built-in'),
|
|
216
|
+
pr.get('providers-seed-built-in-openai'),
|
|
217
|
+
|
|
218
|
+
// --- Sessions provider_id (from providers FK) ---
|
|
219
|
+
s.get('sessions-add-provider_id-from-providers'),
|
|
220
|
+
|
|
221
|
+
// --- Project session defaults provider_id / effort_level ---
|
|
222
|
+
p.get('project_session_defaults-add-provider_id'),
|
|
223
|
+
p.get('project_session_defaults-add-effort_level'),
|
|
224
|
+
|
|
225
|
+
// --- Update built-in models ---
|
|
226
|
+
pr.get('providers-update-built-in-models'),
|
|
227
|
+
|
|
228
|
+
// --- Sessions agent_type ---
|
|
229
|
+
s.get('sessions-add-agent_type'),
|
|
230
|
+
|
|
231
|
+
// --- Agent call logs table ---
|
|
232
|
+
m.get('agent_call_logs-create-table'),
|
|
233
|
+
|
|
234
|
+
// --- Kanban feature ---
|
|
235
|
+
k.get('projects-add-kanban_enabled'),
|
|
236
|
+
k.get('kanban-create-tables'),
|
|
237
|
+
k.get('sessions-add-target_lane_id'),
|
|
238
|
+
k.get('sessions-add-lane_trigger_depth'),
|
|
239
|
+
k.get('session_templates-add-target_lane_id'),
|
|
240
|
+
k.get('kanban_lanes-add-on_enter_prompt'),
|
|
241
|
+
k.get('kanban_lanes-add-agent-settings'),
|
|
242
|
+
|
|
243
|
+
// --- Sessions default mode / thinking defaults (table recreation) ---
|
|
244
|
+
s.get('sessions-migrate-default-mode-thinking'),
|
|
245
|
+
|
|
246
|
+
// --- Seed default global quick responses ---
|
|
247
|
+
m.get('quick_responses-seed-defaults'),
|
|
248
|
+
|
|
249
|
+
// --- Convert legacy quick responses into template-backed quick responses ---
|
|
250
|
+
m.get('session_templates-convert-quick-responses'),
|
|
251
|
+
|
|
252
|
+
// --- Seed default global session templates ---
|
|
253
|
+
m.get('session_templates-seed-defaults'),
|
|
254
|
+
|
|
255
|
+
// --- Update built-in Opus model to 4.7 ---
|
|
256
|
+
pr.get('providers-update-built-in-opus-4-7'),
|
|
257
|
+
|
|
258
|
+
// --- Widen providers kind CHECK constraint to include 'google' ---
|
|
259
|
+
pr.get('providers-widen-kind-check-google'),
|
|
260
|
+
|
|
261
|
+
// --- Seed built-in Google provider + Gemini models ---
|
|
262
|
+
pr.get('providers-seed-built-in-google'),
|
|
263
|
+
|
|
264
|
+
// --- Update expired Gemini Flash Lite preview model to stable GA ---
|
|
265
|
+
pr.get('providers-update-gemini-flash-lite-model'),
|
|
266
|
+
|
|
267
|
+
// --- Project session defaults: add 'current' git mode ---
|
|
268
|
+
p.get('project_session_defaults-git_mode-add-current'),
|
|
269
|
+
|
|
270
|
+
// --- Repair missing session parent links from worktree paths ---
|
|
43
271
|
repairMissingSessionParentsFromWorktree,
|
|
44
|
-
];
|
|
272
|
+
]);
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrations for Kanban board feature: kanban_boards, kanban_lanes,
|
|
3
|
+
* kanban_cards, kanban_card_sessions tables, and related columns on
|
|
4
|
+
* projects, sessions, and session_templates.
|
|
5
|
+
*/
|
|
6
|
+
import { addColumnIfMissing } from './migrationUtils.js';
|
|
7
|
+
|
|
8
|
+
export const kanbanMigrations = [
|
|
9
|
+
{
|
|
10
|
+
name: 'projects-add-kanban_enabled',
|
|
11
|
+
up(db) {
|
|
12
|
+
addColumnIfMissing(db, 'projects', 'kanban_enabled', 'INTEGER NOT NULL DEFAULT 1');
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'kanban-create-tables',
|
|
17
|
+
up(db) {
|
|
18
|
+
db.exec(`
|
|
19
|
+
CREATE TABLE IF NOT EXISTS kanban_boards (
|
|
20
|
+
id TEXT PRIMARY KEY,
|
|
21
|
+
project_id TEXT NOT NULL UNIQUE REFERENCES projects(id) ON DELETE CASCADE,
|
|
22
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
23
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
CREATE TABLE IF NOT EXISTS kanban_lanes (
|
|
27
|
+
id TEXT PRIMARY KEY,
|
|
28
|
+
board_id TEXT NOT NULL REFERENCES kanban_boards(id) ON DELETE CASCADE,
|
|
29
|
+
name TEXT NOT NULL,
|
|
30
|
+
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
31
|
+
on_enter_template_id TEXT REFERENCES session_templates(id) ON DELETE SET NULL,
|
|
32
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
33
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE TABLE IF NOT EXISTS kanban_cards (
|
|
37
|
+
id TEXT PRIMARY KEY,
|
|
38
|
+
lane_id TEXT NOT NULL REFERENCES kanban_lanes(id) ON DELETE CASCADE,
|
|
39
|
+
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
40
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
|
|
41
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE TABLE IF NOT EXISTS kanban_card_sessions (
|
|
45
|
+
id TEXT PRIMARY KEY,
|
|
46
|
+
card_id TEXT NOT NULL REFERENCES kanban_cards(id) ON DELETE CASCADE,
|
|
47
|
+
session_id TEXT NOT NULL UNIQUE REFERENCES sessions(id) ON DELETE CASCADE,
|
|
48
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_kanban_boards_project ON kanban_boards(project_id);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_kanban_lanes_board ON kanban_lanes(board_id, sort_order);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_kanban_cards_lane ON kanban_cards(lane_id, sort_order);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_kanban_card_sessions_session ON kanban_card_sessions(session_id);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_kanban_card_sessions_card ON kanban_card_sessions(card_id);
|
|
56
|
+
`);
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'sessions-add-target_lane_id',
|
|
61
|
+
up(db) {
|
|
62
|
+
addColumnIfMissing(db, 'sessions', 'target_lane_id', 'TEXT REFERENCES kanban_lanes(id) ON DELETE SET NULL');
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'sessions-add-lane_trigger_depth',
|
|
67
|
+
up(db) {
|
|
68
|
+
addColumnIfMissing(db, 'sessions', 'lane_trigger_depth', 'INTEGER NOT NULL DEFAULT 0');
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'session_templates-add-target_lane_id',
|
|
73
|
+
up(db) {
|
|
74
|
+
addColumnIfMissing(db, 'session_templates', 'target_lane_id', 'TEXT REFERENCES kanban_lanes(id) ON DELETE SET NULL');
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'kanban_lanes-add-on_enter_prompt',
|
|
79
|
+
up(db) {
|
|
80
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_prompt', 'TEXT');
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'kanban_lanes-add-agent-settings',
|
|
85
|
+
up(db) {
|
|
86
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_mode', 'TEXT');
|
|
87
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_model', 'TEXT');
|
|
88
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_effort_level', 'TEXT');
|
|
89
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_thinking_enabled', 'INTEGER');
|
|
90
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_auto_reschedule_enabled', 'INTEGER DEFAULT 0');
|
|
91
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_reschedule_delay_minutes', 'INTEGER DEFAULT 60'); // keep in sync with DEFAULT_RESCHEDULE_DELAY_MINUTES
|
|
92
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_reschedule_on_token_limit', 'INTEGER DEFAULT 1');
|
|
93
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_reschedule_on_service_error', 'INTEGER DEFAULT 1');
|
|
94
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_max_reschedule_count', 'INTEGER');
|
|
95
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_max_total_tokens', 'INTEGER');
|
|
96
|
+
addColumnIfMissing(db, 'kanban_lanes', 'on_enter_reschedule_at_token_count', 'INTEGER');
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
];
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrations for miscellaneous tables: command_buttons, session_templates,
|
|
3
|
+
* app_settings, providers, provider_models, agent_call_logs.
|
|
4
|
+
* Each export is an array of { name, up(db) } migration objects.
|
|
5
|
+
*/
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { addColumnIfMissing } from './migrationUtils.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Prompt strings for the default global session templates.
|
|
11
|
+
* Exported so tests can assert verbatim equality.
|
|
12
|
+
*/
|
|
13
|
+
export const DEFAULT_SESSION_TEMPLATE_PROMPTS = {
|
|
14
|
+
REVIEW: `Review the plan on the canvas. If there's more than one plan then review the most recently updated plan. if there are no plans on the canvas then look for the most recently updated plan on the root session canvas.
|
|
15
|
+
|
|
16
|
+
Make sure there are tests explicitly called out for all changes. Make sure that all context necessary to hand off the task is included in the plan.
|
|
17
|
+
|
|
18
|
+
Are there any gaps in the plan? Is test coverage spelled out explicitly? Does the code match the assumptions in the plan?
|
|
19
|
+
|
|
20
|
+
Update the plan according to your review recommendations.`,
|
|
21
|
+
IMPLEMENT: `Implement the plan on the canvas. If there's more than one plan on the canvas then use the most recently updated plan. If you don't see a plan on the canvas then look at the parent session's canvas.`,
|
|
22
|
+
PR: `Ensure all relevant changes are committed and pushed. Then determine the session's goals. You can typically find details about the goals of the session by looking at the most recently modified markdown documents on the root session's canvas - these are typically plans that were implemented during the session. You can also look at the root session's summary, but don't trigger a new summary to be created if the summary is missing.
|
|
23
|
+
|
|
24
|
+
Create a draft pr and ensure all changes are committed and pushed.`,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Seed default global session templates when no global template exists.
|
|
29
|
+
* Idempotent: if any global session template already exists, does nothing.
|
|
30
|
+
*/
|
|
31
|
+
function seedDefaultSessionTemplates(db) {
|
|
32
|
+
const count = db.prepare(
|
|
33
|
+
`SELECT COUNT(*) AS cnt
|
|
34
|
+
FROM session_templates
|
|
35
|
+
WHERE project_id IS NULL
|
|
36
|
+
AND legacy_quick_response_id IS NULL`
|
|
37
|
+
).get().cnt;
|
|
38
|
+
if (count > 0) return;
|
|
39
|
+
|
|
40
|
+
const defaults = [
|
|
41
|
+
{ name: 'Review the plan', prompt: DEFAULT_SESSION_TEMPLATE_PROMPTS.REVIEW },
|
|
42
|
+
{ name: 'Implement the plan on the canvas', prompt: DEFAULT_SESSION_TEMPLATE_PROMPTS.IMPLEMENT },
|
|
43
|
+
{ name: 'Create/update PR', prompt: DEFAULT_SESSION_TEMPLATE_PROMPTS.PR },
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const stmt = db.prepare(`
|
|
47
|
+
INSERT INTO session_templates (
|
|
48
|
+
id, project_id, name, prompt,
|
|
49
|
+
next_template_id, thinking_enabled,
|
|
50
|
+
git_branch, git_mode, model, mode, effort_level, target_lane_id,
|
|
51
|
+
show_in_quick_responses, quick_response_auto_submit,
|
|
52
|
+
quick_response_sort_order, legacy_quick_response_id,
|
|
53
|
+
created_at, updated_at
|
|
54
|
+
) VALUES (?, NULL, ?, ?, NULL, 1, NULL, NULL, NULL, 'yolo', NULL, NULL, 0, 0, 0, NULL, ?, ?)
|
|
55
|
+
`);
|
|
56
|
+
|
|
57
|
+
const now = Date.now();
|
|
58
|
+
for (const item of defaults) {
|
|
59
|
+
stmt.run(randomUUID(), item.name, item.prompt, now, now);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Seed default global quick responses when the table is empty.
|
|
65
|
+
*/
|
|
66
|
+
function seedDefaultQuickResponses(db) {
|
|
67
|
+
const count = db.prepare('SELECT COUNT(*) AS cnt FROM quick_responses').get().cnt;
|
|
68
|
+
if (count > 0) return;
|
|
69
|
+
|
|
70
|
+
const defaults = [
|
|
71
|
+
{ label: 'Put a plan on the canvas', content: 'Put a plan on the canvas to get this done', autoSubmit: false, sortOrder: 0 },
|
|
72
|
+
{ label: 'Yes', content: 'Yes', autoSubmit: true, sortOrder: 1 },
|
|
73
|
+
{ label: 'Review the plan', content: `Review the plan on the canvas. Are there any issues that you can find? Is test coverage specified explicitly enough? Does the current code match the assumptions in the plan?\n\nList the issues that you find and then update the plan on the canvas to address any issues that you find. Don't talk about issues with the original plan in the plan itself. Just tell me what the issues are, and update the plan so that the plan doesn't have the issues.`, autoSubmit: true, sortOrder: 2 },
|
|
74
|
+
{ label: 'Implement the plan on the canvas', content: 'Implement the plan on the canvas', autoSubmit: true, sortOrder: 3 },
|
|
75
|
+
{ label: 'Create / Update PR', content: `Ensure all relevant changes are committed and pushed. Then look at the session's summary and create a draft PR if no PR already exists.`, autoSubmit: true, sortOrder: 4 },
|
|
76
|
+
{ label: 'Review PR', content: 'Look at the PR related to the root session. Review the PR. Are there any issues? Are best practices adhered to? Does the PR accomplish the goal? Are all changes covered by tests?', autoSubmit: true, sortOrder: 5 },
|
|
77
|
+
{ label: 'Add tests', content: 'Inspect the changes on our branch. For each change, ensure we have tests that assert the change is working in the expected way. Implement the tests.', autoSubmit: true, sortOrder: 6 },
|
|
78
|
+
{ label: 'Merge in main', content: 'Merge in the latest main branch', autoSubmit: true, sortOrder: 7 },
|
|
79
|
+
{ label: 'Add tests to the plan', content: 'Call out specific test cases in the plan, we should have an assertion for each change called for in the plan', autoSubmit: true, sortOrder: 8 },
|
|
80
|
+
{ label: 'Tests are failing', content: 'Tests are failing. Look at the canvas for details', autoSubmit: true, sortOrder: 9 },
|
|
81
|
+
{ label: 'Continue', content: 'Continue', autoSubmit: true, sortOrder: 10 },
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
const stmt = db.prepare(
|
|
85
|
+
`INSERT INTO quick_responses
|
|
86
|
+
(id, project_id, label, content, auto_submit, category, sort_order, created_at, updated_at)
|
|
87
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const now = Date.now();
|
|
91
|
+
for (const item of defaults) {
|
|
92
|
+
stmt.run(randomUUID(), null, item.label, item.content, item.autoSubmit ? 1 : 0, null, item.sortOrder, now, now);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function convertQuickResponsesToTemplates(db) {
|
|
97
|
+
const rows = db.prepare('SELECT * FROM quick_responses ORDER BY sort_order ASC, created_at ASC').all();
|
|
98
|
+
const exists = db.prepare(
|
|
99
|
+
'SELECT 1 FROM session_templates WHERE legacy_quick_response_id = ? LIMIT 1'
|
|
100
|
+
);
|
|
101
|
+
const insert = db.prepare(`
|
|
102
|
+
INSERT INTO session_templates (
|
|
103
|
+
id, project_id, name, prompt,
|
|
104
|
+
next_template_id, thinking_enabled,
|
|
105
|
+
git_branch, git_mode, model, mode, effort_level, target_lane_id,
|
|
106
|
+
show_in_quick_responses, quick_response_auto_submit,
|
|
107
|
+
quick_response_sort_order, legacy_quick_response_id,
|
|
108
|
+
created_at, updated_at
|
|
109
|
+
) VALUES (?, ?, ?, ?, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, ?, ?, ?, ?, ?)
|
|
110
|
+
`);
|
|
111
|
+
|
|
112
|
+
for (const row of rows) {
|
|
113
|
+
if (exists.get(row.id)) continue;
|
|
114
|
+
insert.run(
|
|
115
|
+
randomUUID(),
|
|
116
|
+
row.project_id || null,
|
|
117
|
+
row.label,
|
|
118
|
+
row.content,
|
|
119
|
+
row.auto_submit ? 1 : 0,
|
|
120
|
+
row.sort_order ?? 0,
|
|
121
|
+
row.id,
|
|
122
|
+
row.created_at,
|
|
123
|
+
row.updated_at
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** @type {Array<{name: string, up: (db: import('better-sqlite3').Database) => void}>} */
|
|
129
|
+
export const miscMigrations = [
|
|
130
|
+
// --- Command buttons ---
|
|
131
|
+
{
|
|
132
|
+
name: 'command_buttons-add-show_on_list',
|
|
133
|
+
up(db) {
|
|
134
|
+
addColumnIfMissing(db, 'command_buttons', 'show_on_list', 'INTEGER NOT NULL DEFAULT 0');
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
// --- Session templates ---
|
|
139
|
+
{
|
|
140
|
+
name: 'session_templates-add-model',
|
|
141
|
+
up(db) { addColumnIfMissing(db, 'session_templates', 'model', 'TEXT'); },
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'session_templates-add-mode',
|
|
145
|
+
up(db) {
|
|
146
|
+
addColumnIfMissing(
|
|
147
|
+
db, 'session_templates', 'mode',
|
|
148
|
+
"TEXT DEFAULT 'yolo' CHECK(mode IN ('plan', 'standard', 'yolo'))"
|
|
149
|
+
);
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: 'session_templates-add-effort_level',
|
|
154
|
+
up(db) {
|
|
155
|
+
addColumnIfMissing(
|
|
156
|
+
db, 'session_templates', 'effort_level',
|
|
157
|
+
"TEXT CHECK(effort_level IN ('low', 'medium', 'high', 'max', 'auto'))"
|
|
158
|
+
);
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: 'session_templates-add-quick-response-fields',
|
|
163
|
+
up(db) {
|
|
164
|
+
addColumnIfMissing(db, 'session_templates', 'show_in_quick_responses', 'INTEGER NOT NULL DEFAULT 0');
|
|
165
|
+
addColumnIfMissing(db, 'session_templates', 'quick_response_auto_submit', 'INTEGER NOT NULL DEFAULT 0');
|
|
166
|
+
addColumnIfMissing(db, 'session_templates', 'quick_response_sort_order', 'INTEGER NOT NULL DEFAULT 0');
|
|
167
|
+
addColumnIfMissing(db, 'session_templates', 'legacy_quick_response_id', 'TEXT');
|
|
168
|
+
db.exec(`
|
|
169
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_session_templates_legacy_quick_response_id
|
|
170
|
+
ON session_templates(legacy_quick_response_id)
|
|
171
|
+
WHERE legacy_quick_response_id IS NOT NULL
|
|
172
|
+
`);
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
// --- App settings table ---
|
|
177
|
+
{
|
|
178
|
+
name: 'app_settings-create-table',
|
|
179
|
+
up(db) {
|
|
180
|
+
db.exec(`
|
|
181
|
+
CREATE TABLE IF NOT EXISTS app_settings (
|
|
182
|
+
key TEXT PRIMARY KEY,
|
|
183
|
+
value TEXT NOT NULL,
|
|
184
|
+
updated_at INTEGER NOT NULL
|
|
185
|
+
)
|
|
186
|
+
`);
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
// --- Agent call logs table ---
|
|
191
|
+
{
|
|
192
|
+
name: 'agent_call_logs-create-table',
|
|
193
|
+
up(db) {
|
|
194
|
+
db.exec(`
|
|
195
|
+
CREATE TABLE IF NOT EXISTS agent_call_logs (
|
|
196
|
+
id TEXT PRIMARY KEY,
|
|
197
|
+
session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
|
198
|
+
conversation_id TEXT,
|
|
199
|
+
agent_type TEXT NOT NULL,
|
|
200
|
+
model TEXT,
|
|
201
|
+
call_type TEXT NOT NULL,
|
|
202
|
+
prompt_length INTEGER,
|
|
203
|
+
input_tokens INTEGER DEFAULT 0,
|
|
204
|
+
output_tokens INTEGER DEFAULT 0,
|
|
205
|
+
thinking_tokens INTEGER DEFAULT 0,
|
|
206
|
+
cache_read_tokens INTEGER DEFAULT 0,
|
|
207
|
+
cache_write_tokens INTEGER DEFAULT 0,
|
|
208
|
+
total_tokens INTEGER DEFAULT 0,
|
|
209
|
+
started_at INTEGER NOT NULL,
|
|
210
|
+
completed_at INTEGER,
|
|
211
|
+
duration_ms INTEGER,
|
|
212
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'streaming', 'completed', 'error')),
|
|
213
|
+
error_message TEXT,
|
|
214
|
+
metadata TEXT,
|
|
215
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
|
|
216
|
+
);
|
|
217
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_session ON agent_call_logs(session_id);
|
|
218
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_started ON agent_call_logs(started_at);
|
|
219
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_agent_type ON agent_call_logs(agent_type);
|
|
220
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_call_type ON agent_call_logs(call_type);
|
|
221
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_status ON agent_call_logs(status);
|
|
222
|
+
CREATE INDEX IF NOT EXISTS idx_agent_call_logs_model ON agent_call_logs(model);
|
|
223
|
+
`);
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
// --- Seed default global quick responses ---
|
|
228
|
+
{
|
|
229
|
+
name: 'quick_responses-seed-defaults',
|
|
230
|
+
up(db) { seedDefaultQuickResponses(db); },
|
|
231
|
+
},
|
|
232
|
+
|
|
233
|
+
{
|
|
234
|
+
name: 'session_templates-convert-quick-responses',
|
|
235
|
+
up(db) { convertQuickResponsesToTemplates(db); },
|
|
236
|
+
},
|
|
237
|
+
|
|
238
|
+
// --- Seed default global session templates ---
|
|
239
|
+
{
|
|
240
|
+
name: 'session_templates-seed-defaults',
|
|
241
|
+
up(db) { seedDefaultSessionTemplates(db); },
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
];
|