fix(secretaria): migra colunas de telemetria em sec_messages (42703)

O createTable de sec_messages não tinha usage_tokens/provider_used/model_used,
mas brain.ts insere esses campos — quebrando com "column does not exist" em
qualquer banco criado antes dessas colunas (ex.: clones). Adiciona as colunas
ao createTable e um bloco idempotente hasColumn/alterTable (padrão já usado no
arquivo) que garante as colunas em tabelas pré-existentes no boot.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Deploy Agent
2026-06-27 23:43:37 +02:00
parent 93be34d463
commit 2a15e8ea1e
2 changed files with 35 additions and 0 deletions
@@ -59,10 +59,28 @@ export async function runMigrations(db: Knex): Promise<void> {
t.uuid('conversation_id').notNullable().references('id').inTable('sec_conversations').onDelete('CASCADE')
t.string('role', 20).notNullable() // user | assistant | system
t.text('content').notNullable()
t.text('usage_tokens').nullable() // telemetria de tokens (JSON)
t.string('provider_used', 40).nullable() // provedor LLM usado na resposta
t.string('model_used', 80).nullable() // modelo LLM usado na resposta
t.timestamps(true, true)
})
}
// ── sec_messages — telemetria: garante colunas em tabelas pré-existentes ────
// (o insert em brain.ts grava usage_tokens/provider_used/model_used; sem este
// bloco, bancos criados antes dessas colunas quebram com 42703.)
if (await db.schema.hasTable('sec_messages')) {
if (!(await db.schema.hasColumn('sec_messages', 'usage_tokens'))) {
await db.schema.alterTable('sec_messages', (t) => { t.text('usage_tokens').nullable() })
}
if (!(await db.schema.hasColumn('sec_messages', 'provider_used'))) {
await db.schema.alterTable('sec_messages', (t) => { t.string('provider_used', 40).nullable() })
}
if (!(await db.schema.hasColumn('sec_messages', 'model_used'))) {
await db.schema.alterTable('sec_messages', (t) => { t.string('model_used', 80).nullable() })
}
}
// ── sec_brain_nodes — adiciona node_model se ainda não existe ────────────
if (await db.schema.hasTable('sec_brain_nodes')) {
if (!(await db.schema.hasColumn('sec_brain_nodes', 'node_model'))) {