diff --git a/.changeset/close-frontend-review.md b/.changeset/close-frontend-review.md new file mode 100644 index 00000000..7e4be0f7 --- /dev/null +++ b/.changeset/close-frontend-review.md @@ -0,0 +1,5 @@ +--- +'neondeck': patch +--- + +Close the frontend review with stable PR-finding provenance, operation-scoped review feedback, stricter Flue chat configuration, and final dashboard polish. diff --git a/.plans/DIFF_IMPROVEMENTS_PLAN.md b/.plans/DIFF_IMPROVEMENTS_PLAN.md index 594a2da4..04c43662 100644 --- a/.plans/DIFF_IMPROVEMENTS_PLAN.md +++ b/.plans/DIFF_IMPROVEMENTS_PLAN.md @@ -1,6 +1,8 @@ # Diff Improvements Plan -Status: proposed +Status: proposed; Phase A performance reconciliation is complete, and normalized source/revision contracts are next + +Progress note (2026-07-18): the specialized large-PR work now has real registered-PR measurements, stable review-thread identity, bounded local metadata reuse, active-patch priority, and a passing first-patch browser budget. The one-time cold-fetch decision remains deferred in `.plans/PR_REVIEW_PERF_PLAN.md`; it does not block the remaining Phase A source/revision contract work. Related plans: diff --git a/.plans/FRONTEND_STATIC_REVIEW_20260715.html b/.plans/FRONTEND_STATIC_REVIEW_20260715.html index 30e0393b..0298004b 100644 --- a/.plans/FRONTEND_STATIC_REVIEW_20260715.html +++ b/.plans/FRONTEND_STATIC_REVIEW_20260715.html @@ -992,9 +992,10 @@

Performance first: discussion report

CodeView are implemented and verified. The real large-PR backend/browser trace is also complete. The two approved request-path fixes are now implemented and remeasured: review-thread identity is stable and immutable local PR metadata is reused across - patch reads. Active-patch prioritization remains the next performance discussion; - keep cold-fetch changes, Runtime aggregation, review-subtree consolidation, and - registry splitting behind workload and budget evidence. + patch reads. Active-patch prioritization is also implemented and remeasured: the + selected patch now passes the one-second target in all three retained samples. Keep + cold-fetch changes, Runtime aggregation, review-subtree consolidation, and registry + splitting behind workload and budget evidence.
@@ -1262,29 +1263,29 @@

All non-performance findings

Impact

Close or switch a heavy diff/runtime surface and abandoned reads continue transferring, doing backend work, and populating unused cache entries.

Recommendation

Standardize API read options with AbortSignal and use queryFn: ({ signal }) => apiCall(input, { signal }), starting with patches, diffs, runtime fan-out, session activity, and PR records.

Evidence

web/src/api/http.ts:13
web/src/features/diff-viewer/queries.ts:32
web/src/features/pr-review/queries.ts:76
web/src/features/runtime-overview/plugin.tsx:59
web/src/api/github.ts:31

TanStack Query 5.101.2
-
- P3Shared live metrics do not consistently use tabular numerals -

Impact

Refetched counts subtly change width and create jitter, contrary to the design system’s Tabular-Numbers Rule.

Recommendation

Add tabular numerals to Metric and numeric StatusPill values.

Evidence

web/src/components/ui.tsx:86-109
web/src/features/runtime-overview/components/runtime-view.tsx:500-524
web/src/plugins/WorkflowObservabilityPanel.tsx:132-138

$impeccable polish
+
+ P3COMPLETED · FINAL PASSShared live metrics do not consistently use tabular numerals +

Impact

Refetched counts subtly change width and create jitter, contrary to the design system’s Tabular-Numbers Rule.

Recommendation

Add tabular numerals to Metric and numeric StatusPill values.

Implemented

The shared Metric and StatusPill value slots now use tabular numerals, covering Runtime Overview and Workflow Observability without one-off caller styles.

Evidence

web/src/components/ui.tsx
web/src/components/ui.test.tsx

$impeccable polish
-
- P3Old mutation errors permanently mask later success messages -

Impact

A failed operation’s persistent mutation error wins over later success status, making correct state look broken.

Recommendation

Reset superseded mutation errors or use one operation-scoped status/error channel.

Evidence

web/src/features/pr-review/GitHubPrReview.tsx:231-245, 343-353, 443-503

status ownership
+
+ P3COMPLETED · FINAL PASSOld mutation errors permanently mask later success messages +

Impact

A failed operation’s persistent mutation error wins over later success status, making correct state look broken.

Recommendation

Reset superseded mutation errors or use one operation-scoped status/error channel.

Implemented

The review workbench now owns one generation-scoped status channel. Starting newer work supersedes older status, and late success or failure callbacks update the UI only when their operation generation is still current.

Evidence

web/src/features/pr-review/GitHubPrReview.tsx
web/src/features/pr-review/review-ui-helpers.ts
web/src/features/pr-review/GitHubPrReview.test.ts

status ownership
-
- P3Report-only findings use body substring matching as identity -

Impact

Overlapping summaries can mark unrelated findings drafted; editing generated text can make a drafted finding appear available again.

Recommendation

Persist a stable source-finding ID; until then match the exact generated template plus path.

Evidence

web/src/features/pr-review/GitHubPrReview.tsx:1360-1388

identity
+
+ P3COMPLETED · FINAL PASSReport-only findings use body substring matching as identity +

Impact

Overlapping summaries can mark unrelated findings drafted; editing generated text can make a drafted finding appear available again.

Recommendation

Persist a stable source-finding ID; until then match the exact generated template plus path.

Implemented

Review assist now assigns a deterministic source ID to each finding and persists it on generated draft comments. The sidebar compares that provenance rather than display text; legacy records use exact generated-body plus path matching.

Evidence

src/modules/pr-reviews/finding-id.ts
src/modules/pr-review-assist/service.ts
src/modules/github/reviews.ts
src/runtime-home/app-db/schema.ts
web/src/features/pr-review/PrReviewFindingsSidebar.tsx

identity
-
- P3Navigation highlight timers race and survive panel unmount -

Impact

Rapid navigation lets the first timeout clear the second highlight early; stale timers survive unmount.

Recommendation

Store the timer ID in a ref, clear before rescheduling, and clean up on effect teardown.

Evidence

web/src/App.tsx:349-371

timer cleanup
+
+ P3COMPLETED · FINAL PASSNavigation highlight timers race and survive panel unmount +

Impact

Rapid navigation lets the first timeout clear the second highlight early; stale timers survive unmount.

Recommendation

Store the timer ID in a ref, clear before rescheduling, and clean up on effect teardown.

Implemented

The tab-region navigation effect now keeps the pulse timer in a ref, cancels the previous timer before rescheduling, and clears the timer during effect teardown.

Evidence

web/src/App.tsx

timer cleanup
-
- P3Config accepts agent names incompatible with the session model and exposed routes -

Impact

Set another agent name and the selector still supplies display-assistant session IDs; history appears missing and sends fail because other agents are not exposed.

Recommendation

Validate the literal display-assistant or remove the option until agent identity is modeled in session selection and routing.

Evidence

web/src/features/flue-chat/config.ts:16
web/src/features/flue-chat/plugin.tsx:359
src/modules/sessions/active-session.ts:18
src/agents/display-assistant.ts:49

config contract
+
+ P3COMPLETED · FINAL PASSConfig accepts agent names incompatible with the session model and exposed routes +

Impact

Set another agent name and the selector still supplies display-assistant session IDs; history appears missing and sends fail because other agents are not exposed.

Recommendation

Validate the literal display-assistant or remove the option until agent identity is modeled in session selection and routing.

Implemented

The Flue chat config type and parser now accept only display-assistant. Unsupported values produce a visible config issue and safely fall back to the routed agent.

Evidence

web/src/features/flue-chat/config.ts
web/src/features/flue-chat/config.test.ts
web/src/features/flue-chat/types.ts

config contract
No findings match this filter.
@@ -1353,8 +1354,8 @@

Recommended sequence

  • COMPLETED · ACTIVE PATCH PRIORITY P1 · Active patch priority: discuss whether neighbor and unresolved-path prefetch should wait for the active patch. The retained remediated trace was 195 ms over target; the implemented active-first schedule now reaches a 798 ms median and passes all three samples while preserving zero abandoned reads.
  • COMPLETED · COPY/DISCLOSURE P2 · Copy/disclosure: row-specific action names and full-value affordances for operational text. Suggested command: $impeccable clarify.
  • COMPLETED · PR #140 P2 · Editor state ownership: keep new-comment, draft-edit, and thread-reply bodies scoped to their editor generation so older async completions cannot clear newer work.
  • -
  • P3 · Final pass: tabular metrics, timer cleanup, operation-scoped status, stable finding IDs, and config tightening. Suggested command: $impeccable polish.
  • -
  • Re-audit: repeat the static audit, then run focused runtime and accessibility checks against the agreed fixtures.
  • +
  • COMPLETED · FINAL PASS P3 · Final pass: tabular metrics, timer cleanup, operation-scoped status, stable finding IDs, and config tightening. Suggested command: $impeccable polish.
  • +
  • COMPLETED · CLOSING GATE Re-audit: repeat the static audit, then run focused runtime and accessibility checks against the agreed fixtures.
  • You can ask to run these one at a time, all at once, or in any order. Re-run diff --git a/src/modules/github/reviews.ts b/src/modules/github/reviews.ts index 814bb7ee..04384291 100644 --- a/src/modules/github/reviews.ts +++ b/src/modules/github/reviews.ts @@ -42,6 +42,7 @@ export type GitHubPrReviewDraftComment = { startSide: GitHubPrReviewDraftCommentSide | null; body: string; origin: GitHubPrReviewDraftCommentOrigin; + sourceFindingId: string | null; createdAt: string; updatedAt: string; }; @@ -146,6 +147,7 @@ const draftCommentRowSchema = v.object({ start_side: v.nullable(reviewCommentSideSchema), body: v.string(), origin: reviewCommentOriginSchema, + source_finding_id: v.nullable(v.string()), created_at: v.string(), updated_at: v.string(), }); @@ -386,6 +388,7 @@ export function addPrReviewDraftComment(options: { startSide?: GitHubPrReviewDraftCommentSide | null; body: string; origin?: GitHubPrReviewDraftCommentOrigin; + sourceFindingId?: string | null; }): GitHubPrReviewDraft { const database = openDb(options.databasePath); const now = new Date().toISOString(); @@ -405,10 +408,11 @@ export function addPrReviewDraftComment(options: { start_side, body, origin, + source_finding_id, created_at, updated_at ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); `, ) .run( @@ -421,6 +425,7 @@ export function addPrReviewDraftComment(options: { options.startSide ?? null, options.body.trim(), options.origin ?? 'human', + options.sourceFindingId ?? null, now, now, ); @@ -1192,6 +1197,7 @@ function readDraftComments( startSide: parsed.start_side, body: parsed.body, origin: parsed.origin, + sourceFindingId: parsed.source_finding_id, createdAt: parsed.created_at, updatedAt: parsed.updated_at, }; diff --git a/src/modules/pr-events/schemas.ts b/src/modules/pr-events/schemas.ts index bf01817a..97218cf6 100644 --- a/src/modules/pr-events/schemas.ts +++ b/src/modules/pr-events/schemas.ts @@ -159,6 +159,9 @@ export const prReviewDraftCommentInputSchema = v.object({ ), startSide: v.optional(v.nullable(v.picklist(['RIGHT', 'LEFT']))), body: v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(65_536)), + sourceFindingId: v.optional( + v.nullable(v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(128))), + ), }); export const prReviewDraftCommentUpdateInputSchema = v.object({ body: v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(65_536)), diff --git a/src/modules/pr-events/service.ts b/src/modules/pr-events/service.ts index 9fef567d..cd795d18 100644 --- a/src/modules/pr-events/service.ts +++ b/src/modules/pr-events/service.ts @@ -583,6 +583,7 @@ export async function postGitHubPrReviewDraftComment( startLine: parsed.output.startLine ?? null, startSide: parsed.output.startSide ?? null, body: parsed.output.body, + sourceFindingId: parsed.output.sourceFindingId ?? null, }); return okResult( 'github_pr_review_draft_comment_post', diff --git a/src/modules/pr-review-assist/service.ts b/src/modules/pr-review-assist/service.ts index ca816476..271950ad 100644 --- a/src/modules/pr-review-assist/service.ts +++ b/src/modules/pr-review-assist/service.ts @@ -42,6 +42,7 @@ import { type ReviewAssistStructuredOutput, } from './schemas'; import { buildReviewReportDecks } from './report-deck'; +import { prReviewFindingSourceId } from '../pr-reviews/finding-id'; export type ReviewAssistFacts = { target: PullRequestTarget; @@ -198,6 +199,10 @@ export async function reviewPrForHuman( seededCount: seedResult.seeded.length, reportOnlyCount: seedResult.reportOnly.length, reportOnlyFindings: seedResult.reportOnly.map((item) => ({ + sourceId: prReviewFindingSourceId({ + ...item.finding, + line: findingLine(item.finding), + }), severity: item.finding.severity, path: item.finding.path, line: findingLine(item.finding), @@ -417,6 +422,10 @@ async function seedDraftComments( startSide: item.anchor.startSide ?? null, body: seededCommentBody(item.finding), origin: 'neon', + sourceFindingId: prReviewFindingSourceId({ + ...item.finding, + line: findingLine(item.finding), + }), }); const added = draft.comments.find( (comment) => !beforeIds.has(comment.id), diff --git a/src/modules/pr-reviews/finding-id.ts b/src/modules/pr-reviews/finding-id.ts new file mode 100644 index 00000000..e7a6f3c6 --- /dev/null +++ b/src/modules/pr-reviews/finding-id.ts @@ -0,0 +1,20 @@ +import { createHash } from 'node:crypto'; + +export type PrReviewFindingIdentity = { + line: number | null; + path: string; + severity: 'critical' | 'major' | 'minor' | 'nit'; + suggestedFix: string; + summary: string; +}; + +export function prReviewFindingSourceId(finding: PrReviewFindingIdentity) { + const canonicalFinding = JSON.stringify([ + finding.severity, + finding.path, + finding.line, + finding.summary, + finding.suggestedFix, + ]); + return `prf_${createHash('sha256').update(canonicalFinding).digest('hex').slice(0, 24)}`; +} diff --git a/src/modules/pr-reviews/store.ts b/src/modules/pr-reviews/store.ts index ed3d668d..811f99c2 100644 --- a/src/modules/pr-reviews/store.ts +++ b/src/modules/pr-reviews/store.ts @@ -7,6 +7,7 @@ import type { PrReviewStatus, PrReviewVerdict, } from './types'; +import { prReviewFindingSourceId } from './finding-id'; export function readPrReview(id: string, paths: RuntimePaths) { return readOne('id = ?', id.trim(), paths); @@ -161,26 +162,46 @@ function reportOnlyFindings(value: unknown): PrReviewReportOnlyFinding[] { try { const parsed = JSON.parse(stringValue(value)); if (!Array.isArray(parsed)) return []; - return parsed.filter(isReportOnlyFinding); + return parsed.flatMap((item) => { + const finding = reportOnlyFinding(item); + return finding ? [finding] : []; + }); } catch { return []; } } -function isReportOnlyFinding( - value: unknown, -): value is PrReviewReportOnlyFinding { - if (!value || typeof value !== 'object' || Array.isArray(value)) return false; +function reportOnlyFinding(value: unknown): PrReviewReportOnlyFinding | null { + if (!value || typeof value !== 'object' || Array.isArray(value)) return null; const item = value as Record; - return ( - (item.severity === 'critical' || + if ( + !( + item.severity === 'critical' || item.severity === 'major' || item.severity === 'minor' || - item.severity === 'nit') && - typeof item.path === 'string' && - (item.line === null || typeof item.line === 'number') && - typeof item.summary === 'string' && - typeof item.suggestedFix === 'string' && - typeof item.reason === 'string' - ); + item.severity === 'nit' + ) || + typeof item.path !== 'string' || + !(item.line === null || typeof item.line === 'number') || + typeof item.summary !== 'string' || + typeof item.suggestedFix !== 'string' || + typeof item.reason !== 'string' + ) { + return null; + } + const finding: Omit = { + severity: item.severity, + path: item.path, + line: item.line, + summary: item.summary, + suggestedFix: item.suggestedFix, + reason: item.reason, + }; + return { + ...finding, + sourceId: + typeof item.sourceId === 'string' && item.sourceId.trim().length > 0 + ? item.sourceId + : prReviewFindingSourceId(finding), + }; } diff --git a/src/modules/pr-reviews/types.ts b/src/modules/pr-reviews/types.ts index 8b591fd0..5081598b 100644 --- a/src/modules/pr-reviews/types.ts +++ b/src/modules/pr-reviews/types.ts @@ -6,6 +6,7 @@ export type PrReviewOrigin = 'chat' | 'panel' | 'api'; export type PrReviewVerdict = 'comment' | 'approve' | 'request-changes'; export type PrReviewReportOnlyFinding = { + sourceId?: string; severity: 'critical' | 'major' | 'minor' | 'nit'; path: string; line: number | null; diff --git a/src/pr-review-assist.test.ts b/src/pr-review-assist.test.ts index de24d33d..80240cb0 100644 --- a/src/pr-review-assist.test.ts +++ b/src/pr-review-assist.test.ts @@ -58,10 +58,14 @@ describe('PR review assist', () => { line: 3, body: 'Neon draft', origin: 'neon', + sourceFindingId: 'prf_seeded_finding', }); expect(withHuman.comments.at(-1)).toMatchObject({ origin: 'human' }); - expect(withNeon.comments.at(-1)).toMatchObject({ origin: 'neon' }); + expect(withNeon.comments.at(-1)).toMatchObject({ + origin: 'neon', + sourceFindingId: 'prf_seeded_finding', + }); }); it('seeds only anchor-valid Neon draft comments and writes escaped reports', async () => { @@ -124,6 +128,12 @@ describe('PR review assist', () => { seededCount: 1, reportOnlyCount: 1, skippedSeedingReason: null, + reportOnlyFindings: [ + expect.objectContaining({ + sourceId: expect.stringMatching(/^prf_[a-f0-9]{24}$/), + summary: 'This cannot be anchored.', + }), + ], }); const draft = readLivePrReviewDraft({ @@ -136,6 +146,7 @@ describe('PR review assist', () => { path: 'src/app.ts', line: 2, origin: 'neon', + sourceFindingId: expect.stringMatching(/^prf_[a-f0-9]{24}$/), body: expect.stringContaining('Generated by Neon'), }, ]); diff --git a/src/runtime-home/app-db/migrations/20260718025447_pr_review_finding_provenance/migration.sql b/src/runtime-home/app-db/migrations/20260718025447_pr_review_finding_provenance/migration.sql new file mode 100644 index 00000000..6238c075 --- /dev/null +++ b/src/runtime-home/app-db/migrations/20260718025447_pr_review_finding_provenance/migration.sql @@ -0,0 +1 @@ +ALTER TABLE `pr_review_draft_comments` ADD `source_finding_id` text; diff --git a/src/runtime-home/app-db/migrations/20260718025447_pr_review_finding_provenance/snapshot.json b/src/runtime-home/app-db/migrations/20260718025447_pr_review_finding_provenance/snapshot.json new file mode 100644 index 00000000..190a064b --- /dev/null +++ b/src/runtime-home/app-db/migrations/20260718025447_pr_review_finding_provenance/snapshot.json @@ -0,0 +1,7819 @@ +{ + "version": "7", + "dialect": "sqlite", + "id": "31eab6a2-f07c-40f5-a945-84cf17590ab0", + "prevIds": ["80df034a-5dab-4102-a17a-86963235711d"], + "ddl": [ + { + "name": "app_metadata", + "entityType": "tables" + }, + { + "name": "autopilot_admissions", + "entityType": "tables" + }, + { + "name": "briefing_profiles", + "entityType": "tables" + }, + { + "name": "briefing_runs", + "entityType": "tables" + }, + { + "name": "chat_session_audit", + "entityType": "tables" + }, + { + "name": "chat_session_command_events", + "entityType": "tables" + }, + { + "name": "chat_session_surfaces", + "entityType": "tables" + }, + { + "name": "chat_sessions", + "entityType": "tables" + }, + { + "name": "config_history", + "entityType": "tables" + }, + { + "name": "execution_approvals", + "entityType": "tables" + }, + { + "name": "github_pr_file_cache", + "entityType": "tables" + }, + { + "name": "kilo_result_events", + "entityType": "tables" + }, + { + "name": "kilo_result_state", + "entityType": "tables" + }, + { + "name": "kilo_session_audit", + "entityType": "tables" + }, + { + "name": "kilo_task_events", + "entityType": "tables" + }, + { + "name": "kilo_tasks", + "entityType": "tables" + }, + { + "name": "learning_candidates", + "entityType": "tables" + }, + { + "name": "learning_events", + "entityType": "tables" + }, + { + "name": "learning_reviews", + "entityType": "tables" + }, + { + "name": "mcp_oauth_logins", + "entityType": "tables" + }, + { + "name": "mcp_oauth_tokens", + "entityType": "tables" + }, + { + "name": "mcp_tool_approvals", + "entityType": "tables" + }, + { + "name": "mcp_tool_audit", + "entityType": "tables" + }, + { + "name": "mcp_tool_catalog", + "entityType": "tables" + }, + { + "name": "memories", + "entityType": "tables" + }, + { + "name": "memory_events", + "entityType": "tables" + }, + { + "name": "notifications", + "entityType": "tables" + }, + { + "name": "pr_review_draft_comments", + "entityType": "tables" + }, + { + "name": "pr_review_drafts", + "entityType": "tables" + }, + { + "name": "pr_review_neon_seeded_comments", + "entityType": "tables" + }, + { + "name": "pr_reviews", + "entityType": "tables" + }, + { + "name": "pr_watch_event_watermarks", + "entityType": "tables" + }, + { + "name": "pr_watches", + "entityType": "tables" + }, + { + "name": "prepared_diff_approvals", + "entityType": "tables" + }, + { + "name": "prepared_diffs", + "entityType": "tables" + }, + { + "name": "ref_watches", + "entityType": "tables" + }, + { + "name": "repo_edit_events", + "entityType": "tables" + }, + { + "name": "repo_file_reads", + "entityType": "tables" + }, + { + "name": "reports", + "entityType": "tables" + }, + { + "name": "scheduled_task_runs", + "entityType": "tables" + }, + { + "name": "scheduled_tasks", + "entityType": "tables" + }, + { + "name": "workflow_events", + "entityType": "tables" + }, + { + "name": "workflow_run_observations", + "entityType": "tables" + }, + { + "name": "workflow_summaries", + "entityType": "tables" + }, + { + "name": "worktree_cleanup_attempts", + "entityType": "tables" + }, + { + "name": "worktree_events", + "entityType": "tables" + }, + { + "name": "worktree_locks", + "entityType": "tables" + }, + { + "name": "worktrees", + "entityType": "tables" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "key", + "entityType": "columns", + "table": "app_metadata" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "value", + "entityType": "columns", + "table": "app_metadata" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "app_metadata" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "watch_id", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "event_fingerprint", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "mode", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": "'{}'", + "generated": null, + "name": "input_json", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "state", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "priority", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "current_workflow", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "current_run_id", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "prepared_diff_id", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "attempt_count", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "next_attempt_at", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_error", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "autopilot_admissions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "name", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "1", + "generated": null, + "name": "enabled", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "instructions", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "1", + "generated": null, + "name": "instructions_version", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "schedule", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "timezone", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "briefing_profiles" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "profile_id", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "trigger", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "snapshot_json", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "instructions", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "instructions_version", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "command_event_id", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "dispatch_id", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "workflow_run_id", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "queued_at", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "completed_at", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "briefing_runs" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": true, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "chat_session_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "action", + "entityType": "columns", + "table": "chat_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "chat_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "surface", + "entityType": "columns", + "table": "chat_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "reason", + "entityType": "columns", + "table": "chat_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "metadata_json", + "entityType": "columns", + "table": "chat_session_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "chat_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "input", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "result_json", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "flue_run_id", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "workflow_summary_id", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "completed_at", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "chat_session_command_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "surface", + "entityType": "columns", + "table": "chat_session_surfaces" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "chat_session_surfaces" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "chat_session_surfaces" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "title", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "agent_name", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "kind", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "pinned", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "archived_at", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "linked_repo_id", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "linked_watch_id", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "linked_task_id", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "stale_reasons_json", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "ui_metadata_json", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary_generated_at", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary_source", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary_refresh_note", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "context_loaded_at", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "context_memory_ids_json", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "learning_turn_count", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "last_learning_review_turn_count", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_learning_review_at", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "last_learning_curation_turn_count", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_learning_curation_at", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_active_at", + "entityType": "columns", + "table": "chat_sessions" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": true, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "config_history" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "action", + "entityType": "columns", + "table": "config_history" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "file", + "entityType": "columns", + "table": "config_history" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "target", + "entityType": "columns", + "table": "config_history" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "before_json", + "entityType": "columns", + "table": "config_history" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "after_json", + "entityType": "columns", + "table": "config_history" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "changed_at", + "entityType": "columns", + "table": "config_history" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "command", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "backend", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "cwd", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "context", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "risk", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "policy_decision", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "approval_decision", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "approver_surface", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "request_context_json", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "result_json", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "exit_code", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "stdout_preview", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "stderr_preview", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "resolved_at", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "used_at", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "executed_at", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "execution_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo", + "entityType": "columns", + "table": "github_pr_file_cache" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "github_pr_file_cache" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_sha", + "entityType": "columns", + "table": "github_pr_file_cache" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "payload", + "entityType": "columns", + "table": "github_pr_file_cache" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "byte_size", + "entityType": "columns", + "table": "github_pr_file_cache" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "fetched_at", + "entityType": "columns", + "table": "github_pr_file_cache" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "kilo_result_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "task_id", + "entityType": "columns", + "table": "kilo_result_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "event_type", + "entityType": "columns", + "table": "kilo_result_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary", + "entityType": "columns", + "table": "kilo_result_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "data_json", + "entityType": "columns", + "table": "kilo_result_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "kilo_result_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "task_id", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "prepared_diff_id", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "classification", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "verification_status", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "promotion_status", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "diff_fingerprint", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "verified_diff_fingerprint", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "review_summary_json", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "diff_summary_json", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "policy_json", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "verification_json", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "promotion_json", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": "'[]'", + "generated": null, + "name": "pending_approvals_json", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "reviewed_at", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "verified_at", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "promoted_at", + "entityType": "columns", + "table": "kilo_result_state" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "task_id", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "child_session_id", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "read_type", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "requester_surface", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "reason", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "limit_count", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "offset_count", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "include_full_transcript", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "include_tool_output", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "include_diff", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "kilo_session_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "task_id", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "event_index", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "event_type", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "stream", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "child_session_id", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "data_json", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "kilo_task_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "title", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "prompt", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_full_name", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "lock_id", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "cwd", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "mode", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "explicit_user_request", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "auto_enabled", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "cli_path", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "args_json", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pid", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "process_started_at", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "root_session_id", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": "'[]'", + "generated": null, + "name": "child_session_ids_json", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "raw_log_path", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "exit_code", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "completed_at", + "entityType": "columns", + "table": "kilo_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "target", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "action", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "scope", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "key", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "value_json", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "skill_id", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "patch_json", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "reason", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "review_id", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "decided_at", + "entityType": "columns", + "table": "learning_candidates" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "type", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source_id", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_key", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "data_json", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "learning_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "kind", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "model", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "thinking_level", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "trigger_json", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "input_summary_json", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "result_json", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "flue_run_id", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "started_at", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "completed_at", + "entityType": "columns", + "table": "learning_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "server_id", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "server_identity", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "state", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "redirect_url", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "authorization_url", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "discovery_state_json", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "code_verifier", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "expires_at", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "completed_at", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "mcp_oauth_logins" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "server_id", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "server_identity", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "access_token", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "refresh_token", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "token_type", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id_token", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "expires_at", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "scopes_json", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "client_information_json", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "discovery_state_json", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "code_verifier", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "mcp_oauth_tokens" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "server_id", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "tool_name", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "adapted_name", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "arguments_hash", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "arguments_preview", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "approver_surface", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "expires_at", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "resolved_at", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "used_at", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "mcp_tool_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "server_id", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "tool_name", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "adapted_name", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "arguments_hash", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "decision", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "approval_id", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "duration_ms", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "ok", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "result_preview", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "mcp_tool_audit" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "server_id", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "tool_name", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "adapted_name", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "description", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "input_schema_json", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "output_schema_json", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "annotations_json", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "mcp_tool_catalog" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "scope", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "key", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "value_json", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": "'active'", + "generated": null, + "name": "status", + "entityType": "columns", + "table": "memories" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "use_count", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_used_at", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "memories" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "memory_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "memory_id", + "entityType": "columns", + "table": "memory_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "action", + "entityType": "columns", + "table": "memory_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "actor", + "entityType": "columns", + "table": "memory_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "reason", + "entityType": "columns", + "table": "memory_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "before_json", + "entityType": "columns", + "table": "memory_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "after_json", + "entityType": "columns", + "table": "memory_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "memory_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "level", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "title", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "message", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source_id", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "data_json", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "read_at", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "resolved_at", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "1", + "generated": null, + "name": "occurrence_count", + "entityType": "columns", + "table": "notifications" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "draft_id", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "path", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "side", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "line", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "start_line", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "start_side", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "body", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": "'human'", + "generated": null, + "name": "origin", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source_finding_id", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "pr_review_draft_comments" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_sha", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "verdict", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "body", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "submitted_at", + "entityType": "columns", + "table": "pr_review_drafts" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "comment_id", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "draft_id", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_sha", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "path", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "side", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "line", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "start_line", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "start_side", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "severity", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "outcome", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "outcome_at", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "seeded_at", + "entityType": "columns", + "table": "pr_review_neon_seeded_comments" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "ref", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_full_name", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "title", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "author", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_url", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "attempt_id", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "run_id", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_sha", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "origin", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "review_url", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": "'[]'", + "generated": null, + "name": "report_ids_json", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "finding_count", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "seeded_count", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "report_only_count", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": "'[]'", + "generated": null, + "name": "report_only_findings_json", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "trust_boundary", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "verdict", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "previous_verdict", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "github_review_url", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "failure_message", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "ready_at", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "submitted_at", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "failed_at", + "entityType": "columns", + "table": "pr_reviews" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "watch_id", + "entityType": "columns", + "table": "pr_watch_event_watermarks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "category", + "entityType": "columns", + "table": "pr_watch_event_watermarks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "watermark_json", + "entityType": "columns", + "table": "pr_watch_event_watermarks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source_updated_at", + "entityType": "columns", + "table": "pr_watch_event_watermarks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "checked_at", + "entityType": "columns", + "table": "pr_watch_event_watermarks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "pr_watch_event_watermarks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "pr_watch_event_watermarks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_full_name", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "github_owner", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "github_name", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "desired_terminal_state", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_state", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "title", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "url", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "merge_commit_sha", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_snapshot_json", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_outcome", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_checked_at", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_by", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "pr_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "prepared_diff_id", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "approval_type", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "target_sha", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "policy_hash", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "policy_decision", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "reason", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "approver_surface", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "requested_at", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "resolved_at", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "prepared_diff_approvals" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_full_name", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "title", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source_worktree_path", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "base_ref", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_ref", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_sha", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "push_approval_status", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "verification_status", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary_json", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_by", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "abandoned_at", + "entityType": "columns", + "table": "prepared_diffs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_full_name", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "github_owner", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "github_name", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "ref", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "title", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "url", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_snapshot_json", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_outcome", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_checked_at", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "ref_watches" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "workflow_run_id", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "actor_type", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "actor_id", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "action", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "reason", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "paths_json", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "input_hash", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "diff_summary_json", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "diff_patch", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error_json", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "repo_edit_events" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": true, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "path", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "real", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "mtime_ms", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "size", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "sha256", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "partial", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "read_at", + "entityType": "columns", + "table": "repo_file_reads" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "kind", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "title", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "source_ref", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "html_path", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary_json", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_by", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "reports" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "task_id", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "outcome", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "message", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "workflow_run_id", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "session_id", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "result_json", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "started_at", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "completed_at", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "scheduled_task_runs" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "kind", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "trigger_json", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "payload_json", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "1", + "generated": null, + "name": "enabled", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "next_run_at", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "claim_id", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "claim_expires_at", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_run_at", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "scheduled_tasks" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": true, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "run_id", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "workflow", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "event_type", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "event_index", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "level", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "message", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "name", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "operation_kind", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "operation_id", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "duration_ms", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "is_error", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary_json", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "workflow_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "run_id", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "workflow", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "started_at", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "ended_at", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_event_at", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_message", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "event_count", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "duration_ms", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "is_error", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "workflow_run_observations" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "workflow_summaries" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "workflow", + "entityType": "columns", + "table": "workflow_summaries" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "run_id", + "entityType": "columns", + "table": "workflow_summaries" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "workflow_summaries" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "summary_json", + "entityType": "columns", + "table": "workflow_summaries" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "workflow_summaries" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "workflow_summaries" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "action", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "outcome", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "reason", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "error", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "deleted", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "attempted_at", + "entityType": "columns", + "table": "worktree_cleanup_attempts" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "worktree_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "worktree_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "worktree_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "event_type", + "entityType": "columns", + "table": "worktree_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "status", + "entityType": "columns", + "table": "worktree_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "message", + "entityType": "columns", + "table": "worktree_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "data_json", + "entityType": "columns", + "table": "worktree_events" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "worktree_events" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "scope", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "scope_key", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "worktree_id", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "owner", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "workflow_run_id", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "expires_at", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "revoked_at", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "released_at", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "stale_recovered_at", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "worktree_locks" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "id", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_id", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "repo_full_name", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "github_owner", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "github_name", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "pr_number", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "base_ref", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_owner", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_name", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_ref", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "head_sha", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "local_path", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "storage_kind", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "owning_workflow_run_id", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "lifecycle_status", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_synced_sha", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "last_pushed_sha", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "cleanup_policy_json", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "direct_push_allowed", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "integer", + "notNull": true, + "autoincrement": false, + "default": "0", + "generated": null, + "name": "adopted", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_by", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "created_at", + "entityType": "columns", + "table": "worktrees" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "updated_at", + "entityType": "columns", + "table": "worktrees" + }, + { + "columns": ["draft_id"], + "tableTo": "pr_review_drafts", + "columnsTo": ["id"], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "nameExplicit": false, + "name": "fk_pr_review_draft_comments_draft_id_pr_review_drafts_id_fk", + "entityType": "fks", + "table": "pr_review_draft_comments" + }, + { + "columns": ["draft_id"], + "tableTo": "pr_review_drafts", + "columnsTo": ["id"], + "onUpdate": "NO ACTION", + "onDelete": "NO ACTION", + "nameExplicit": false, + "name": "fk_pr_review_neon_seeded_comments_draft_id_pr_review_drafts_id_fk", + "entityType": "fks", + "table": "pr_review_neon_seeded_comments" + }, + { + "columns": ["repo", "pr_number", "head_sha"], + "nameExplicit": false, + "name": "github_pr_file_cache_pk", + "entityType": "pks", + "table": "github_pr_file_cache" + }, + { + "columns": ["server_id", "tool_name"], + "nameExplicit": false, + "name": "mcp_tool_catalog_pk", + "entityType": "pks", + "table": "mcp_tool_catalog" + }, + { + "columns": ["watch_id", "category"], + "nameExplicit": false, + "name": "pr_watch_event_watermarks_pk", + "entityType": "pks", + "table": "pr_watch_event_watermarks" + }, + { + "columns": ["key"], + "nameExplicit": false, + "name": "app_metadata_pk", + "table": "app_metadata", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "autopilot_admissions_pk", + "table": "autopilot_admissions", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "briefing_profiles_pk", + "table": "briefing_profiles", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "briefing_runs_pk", + "table": "briefing_runs", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "chat_session_audit_pk", + "table": "chat_session_audit", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "chat_session_command_events_pk", + "table": "chat_session_command_events", + "entityType": "pks" + }, + { + "columns": ["surface"], + "nameExplicit": false, + "name": "chat_session_surfaces_pk", + "table": "chat_session_surfaces", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "chat_sessions_pk", + "table": "chat_sessions", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "config_history_pk", + "table": "config_history", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "execution_approvals_pk", + "table": "execution_approvals", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "kilo_result_events_pk", + "table": "kilo_result_events", + "entityType": "pks" + }, + { + "columns": ["task_id"], + "nameExplicit": false, + "name": "kilo_result_state_pk", + "table": "kilo_result_state", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "kilo_session_audit_pk", + "table": "kilo_session_audit", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "kilo_task_events_pk", + "table": "kilo_task_events", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "kilo_tasks_pk", + "table": "kilo_tasks", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "learning_candidates_pk", + "table": "learning_candidates", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "learning_events_pk", + "table": "learning_events", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "learning_reviews_pk", + "table": "learning_reviews", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "mcp_oauth_logins_pk", + "table": "mcp_oauth_logins", + "entityType": "pks" + }, + { + "columns": ["server_id"], + "nameExplicit": false, + "name": "mcp_oauth_tokens_pk", + "table": "mcp_oauth_tokens", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "mcp_tool_approvals_pk", + "table": "mcp_tool_approvals", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "mcp_tool_audit_pk", + "table": "mcp_tool_audit", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "memories_pk", + "table": "memories", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "memory_events_pk", + "table": "memory_events", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "notifications_pk", + "table": "notifications", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "pr_review_draft_comments_pk", + "table": "pr_review_draft_comments", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "pr_review_drafts_pk", + "table": "pr_review_drafts", + "entityType": "pks" + }, + { + "columns": ["comment_id"], + "nameExplicit": false, + "name": "pr_review_neon_seeded_comments_pk", + "table": "pr_review_neon_seeded_comments", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "pr_reviews_pk", + "table": "pr_reviews", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "pr_watches_pk", + "table": "pr_watches", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "prepared_diff_approvals_pk", + "table": "prepared_diff_approvals", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "prepared_diffs_pk", + "table": "prepared_diffs", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "ref_watches_pk", + "table": "ref_watches", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "repo_edit_events_pk", + "table": "repo_edit_events", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "repo_file_reads_pk", + "table": "repo_file_reads", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "reports_pk", + "table": "reports", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "scheduled_task_runs_pk", + "table": "scheduled_task_runs", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "scheduled_tasks_pk", + "table": "scheduled_tasks", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "workflow_events_pk", + "table": "workflow_events", + "entityType": "pks" + }, + { + "columns": ["run_id"], + "nameExplicit": false, + "name": "workflow_run_observations_pk", + "table": "workflow_run_observations", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "workflow_summaries_pk", + "table": "workflow_summaries", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "worktree_cleanup_attempts_pk", + "table": "worktree_cleanup_attempts", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "worktree_events_pk", + "table": "worktree_events", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "worktree_locks_pk", + "table": "worktree_locks", + "entityType": "pks" + }, + { + "columns": ["id"], + "nameExplicit": false, + "name": "worktrees_pk", + "table": "worktrees", + "entityType": "pks" + }, + { + "columns": [ + { + "value": "watch_id", + "isExpression": false + }, + { + "value": "event_fingerprint", + "isExpression": false + } + ], + "isUnique": true, + "where": null, + "origin": "manual", + "name": "idx_autopilot_admissions_watch_event", + "entityType": "indexes", + "table": "autopilot_admissions" + }, + { + "columns": [ + { + "value": "state", + "isExpression": false + }, + { + "value": "next_attempt_at", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_autopilot_admissions_state_due", + "entityType": "indexes", + "table": "autopilot_admissions" + }, + { + "columns": [ + { + "value": "repo_id", + "isExpression": false + }, + { + "value": "pr_number", + "isExpression": false + }, + { + "value": "state", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_autopilot_admissions_repo_pr", + "entityType": "indexes", + "table": "autopilot_admissions" + }, + { + "columns": [ + { + "value": "profile_id", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_briefing_runs_profile", + "entityType": "indexes", + "table": "briefing_runs" + }, + { + "columns": [ + { + "value": "dispatch_id", + "isExpression": false + } + ], + "isUnique": true, + "where": null, + "origin": "manual", + "name": "idx_briefing_runs_dispatch", + "entityType": "indexes", + "table": "briefing_runs" + }, + { + "columns": [ + { + "value": "status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_briefing_runs_status", + "entityType": "indexes", + "table": "briefing_runs" + }, + { + "columns": [ + { + "value": "session_id", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_chat_session_audit_session", + "entityType": "indexes", + "table": "chat_session_audit" + }, + { + "columns": [ + { + "value": "session_id", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_chat_session_command_events_session", + "entityType": "indexes", + "table": "chat_session_command_events" + }, + { + "columns": [ + { + "value": "archived_at", + "isExpression": false + }, + { + "value": "\"pinned\" DESC", + "isExpression": true + }, + { + "value": "\"last_active_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_chat_sessions_recent", + "entityType": "indexes", + "table": "chat_sessions" + }, + { + "columns": [ + { + "value": "kind", + "isExpression": false + }, + { + "value": "archived_at", + "isExpression": false + }, + { + "value": "\"last_active_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_chat_sessions_kind", + "entityType": "indexes", + "table": "chat_sessions" + }, + { + "columns": [ + { + "value": "status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_execution_approvals_status", + "entityType": "indexes", + "table": "execution_approvals" + }, + { + "columns": [ + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_execution_approvals_updated", + "entityType": "indexes", + "table": "execution_approvals" + }, + { + "columns": [ + { + "value": "task_id", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_kilo_result_events_task", + "entityType": "indexes", + "table": "kilo_result_events" + }, + { + "columns": [ + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_kilo_result_state_updated", + "entityType": "indexes", + "table": "kilo_result_state" + }, + { + "columns": [ + { + "value": "session_id", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_kilo_session_audit_session", + "entityType": "indexes", + "table": "kilo_session_audit" + }, + { + "columns": [ + { + "value": "task_id", + "isExpression": false + }, + { + "value": "event_index", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_kilo_task_events_task", + "entityType": "indexes", + "table": "kilo_task_events" + }, + { + "columns": [ + { + "value": "status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_kilo_tasks_status", + "entityType": "indexes", + "table": "kilo_tasks" + }, + { + "columns": [ + { + "value": "repo_id", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_kilo_tasks_repo", + "entityType": "indexes", + "table": "kilo_tasks" + }, + { + "columns": [ + { + "value": "root_session_id", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_kilo_tasks_session", + "entityType": "indexes", + "table": "kilo_tasks" + }, + { + "columns": [ + { + "value": "target", + "isExpression": false + }, + { + "value": "status", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_learning_candidates_status", + "entityType": "indexes", + "table": "learning_candidates" + }, + { + "columns": [ + { + "value": "type", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_learning_events_type", + "entityType": "indexes", + "table": "learning_events" + }, + { + "columns": [ + { + "value": "source_id", + "isExpression": false + } + ], + "isUnique": true, + "where": "\"learning_events\".\"type\" = 'pr_handled' AND \"learning_events\".\"source_id\" IS NOT NULL", + "origin": "manual", + "name": "idx_learning_pr_handled_source", + "entityType": "indexes", + "table": "learning_events" + }, + { + "columns": [ + { + "value": "kind", + "isExpression": false + }, + { + "value": "status", + "isExpression": false + }, + { + "value": "\"started_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_learning_reviews_kind", + "entityType": "indexes", + "table": "learning_reviews" + }, + { + "columns": [ + { + "value": "server_id", + "isExpression": false + }, + { + "value": "tool_name", + "isExpression": false + }, + { + "value": "adapted_name", + "isExpression": false + }, + { + "value": "arguments_hash", + "isExpression": false + }, + { + "value": "status", + "isExpression": false + }, + { + "value": "expires_at", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_mcp_tool_approvals_pending", + "entityType": "indexes", + "table": "mcp_tool_approvals" + }, + { + "columns": [ + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_mcp_tool_audit_created", + "entityType": "indexes", + "table": "mcp_tool_audit" + }, + { + "columns": [ + { + "value": "server_id", + "isExpression": false + }, + { + "value": "status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_mcp_tool_catalog_status", + "entityType": "indexes", + "table": "mcp_tool_catalog" + }, + { + "columns": [ + { + "value": "status", + "isExpression": false + }, + { + "value": "scope", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_memories_active_scope", + "entityType": "indexes", + "table": "memories" + }, + { + "columns": [ + { + "value": "scope", + "isExpression": false + }, + { + "value": "key", + "isExpression": false + }, + { + "value": "COALESCE(\"repo_id\", '')", + "isExpression": true + } + ], + "isUnique": true, + "where": null, + "origin": "manual", + "name": "idx_memories_scope_key_repo", + "entityType": "indexes", + "table": "memories" + }, + { + "columns": [ + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_memory_events_changed", + "entityType": "indexes", + "table": "memory_events" + }, + { + "columns": [ + { + "value": "source", + "isExpression": false + }, + { + "value": "source_id", + "isExpression": false + }, + { + "value": "resolved_at", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_notifications_source_unresolved", + "entityType": "indexes", + "table": "notifications" + }, + { + "columns": [ + { + "value": "resolved_at", + "isExpression": false + }, + { + "value": "read_at", + "isExpression": false + }, + { + "value": "level", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_notifications_attention", + "entityType": "indexes", + "table": "notifications" + }, + { + "columns": [ + { + "value": "draft_id", + "isExpression": false + }, + { + "value": "\"created_at\" ASC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_pr_review_draft_comments_draft", + "entityType": "indexes", + "table": "pr_review_draft_comments" + }, + { + "columns": [ + { + "value": "repo", + "isExpression": false + }, + { + "value": "pr_number", + "isExpression": false + } + ], + "isUnique": true, + "where": "\"pr_review_drafts\".\"status\" = 'draft'", + "origin": "manual", + "name": "idx_pr_review_drafts_live", + "entityType": "indexes", + "table": "pr_review_drafts" + }, + { + "columns": [ + { + "value": "repo", + "isExpression": false + }, + { + "value": "pr_number", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_pr_review_drafts_pr", + "entityType": "indexes", + "table": "pr_review_drafts" + }, + { + "columns": [ + { + "value": "draft_id", + "isExpression": false + }, + { + "value": "\"seeded_at\" ASC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_pr_review_neon_seeded_comments_draft", + "entityType": "indexes", + "table": "pr_review_neon_seeded_comments" + }, + { + "columns": [ + { + "value": "repo", + "isExpression": false + }, + { + "value": "pr_number", + "isExpression": false + }, + { + "value": "\"seeded_at\" ASC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_pr_review_neon_seeded_comments_pr", + "entityType": "indexes", + "table": "pr_review_neon_seeded_comments" + }, + { + "columns": [ + { + "value": "repo_full_name", + "isExpression": false + }, + { + "value": "pr_number", + "isExpression": false + } + ], + "isUnique": true, + "where": null, + "origin": "manual", + "name": "idx_pr_reviews_target", + "entityType": "indexes", + "table": "pr_reviews" + }, + { + "columns": [ + { + "value": "run_id", + "isExpression": false + } + ], + "isUnique": true, + "where": null, + "origin": "manual", + "name": "idx_pr_reviews_run", + "entityType": "indexes", + "table": "pr_reviews" + }, + { + "columns": [ + { + "value": "status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_pr_reviews_status_updated", + "entityType": "indexes", + "table": "pr_reviews" + }, + { + "columns": [ + { + "value": "watch_id", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_pr_watch_event_watermarks_watch", + "entityType": "indexes", + "table": "pr_watch_event_watermarks" + }, + { + "columns": [ + { + "value": "status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_prepared_diff_approvals_pending", + "entityType": "indexes", + "table": "prepared_diff_approvals" + }, + { + "columns": [ + { + "value": "prepared_diff_id", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_prepared_diff_approvals_diff", + "entityType": "indexes", + "table": "prepared_diff_approvals" + }, + { + "columns": [ + { + "value": "status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_prepared_diffs_status", + "entityType": "indexes", + "table": "prepared_diffs" + }, + { + "columns": [ + { + "value": "repo_id", + "isExpression": false + }, + { + "value": "pr_number", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_prepared_diffs_repo", + "entityType": "indexes", + "table": "prepared_diffs" + }, + { + "columns": [ + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_repo_edit_events_updated", + "entityType": "indexes", + "table": "repo_edit_events" + }, + { + "columns": [ + { + "value": "repo_id", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_repo_edit_events_repo", + "entityType": "indexes", + "table": "repo_edit_events" + }, + { + "columns": [ + { + "value": "session_id", + "isExpression": false + }, + { + "value": "repo_id", + "isExpression": false + }, + { + "value": "worktree_id", + "isExpression": false + }, + { + "value": "path", + "isExpression": false + }, + { + "value": "\"read_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_repo_file_reads_lookup", + "entityType": "indexes", + "table": "repo_file_reads" + }, + { + "columns": [ + { + "value": "kind", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_reports_kind_created", + "entityType": "indexes", + "table": "reports" + }, + { + "columns": [ + { + "value": "repo_id", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_reports_repo_created", + "entityType": "indexes", + "table": "reports" + }, + { + "columns": [ + { + "value": "task_id", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_scheduled_task_runs_task", + "entityType": "indexes", + "table": "scheduled_task_runs" + }, + { + "columns": [ + { + "value": "status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_scheduled_task_runs_status", + "entityType": "indexes", + "table": "scheduled_task_runs" + }, + { + "columns": [ + { + "value": "enabled", + "isExpression": false + }, + { + "value": "next_run_at", + "isExpression": false + }, + { + "value": "claim_expires_at", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_scheduled_tasks_due", + "entityType": "indexes", + "table": "scheduled_tasks" + }, + { + "columns": [ + { + "value": "kind", + "isExpression": false + }, + { + "value": "enabled", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_scheduled_tasks_kind", + "entityType": "indexes", + "table": "scheduled_tasks" + }, + { + "columns": [ + { + "value": "run_id", + "isExpression": false + }, + { + "value": "event_index", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_workflow_events_run", + "entityType": "indexes", + "table": "workflow_events" + }, + { + "columns": [ + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_workflow_events_created", + "entityType": "indexes", + "table": "workflow_events" + }, + { + "columns": [ + { + "value": "worktree_id", + "isExpression": false + }, + { + "value": "\"attempted_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_worktree_cleanup_attempts_worktree", + "entityType": "indexes", + "table": "worktree_cleanup_attempts" + }, + { + "columns": [ + { + "value": "worktree_id", + "isExpression": false + }, + { + "value": "\"created_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_worktree_events_worktree", + "entityType": "indexes", + "table": "worktree_events" + }, + { + "columns": [ + { + "value": "scope_key", + "isExpression": false + }, + { + "value": "released_at", + "isExpression": false + }, + { + "value": "expires_at", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_worktree_locks_active", + "entityType": "indexes", + "table": "worktree_locks" + }, + { + "columns": [ + { + "value": "scope_key", + "isExpression": false + } + ], + "isUnique": true, + "where": "\"worktree_locks\".\"released_at\" IS NULL", + "origin": "manual", + "name": "idx_worktree_locks_one_active", + "entityType": "indexes", + "table": "worktree_locks" + }, + { + "columns": [ + { + "value": "repo_id", + "isExpression": false + }, + { + "value": "lifecycle_status", + "isExpression": false + }, + { + "value": "\"updated_at\" DESC", + "isExpression": true + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_worktrees_repo", + "entityType": "indexes", + "table": "worktrees" + }, + { + "columns": [ + { + "value": "repo_id", + "isExpression": false + }, + { + "value": "pr_number", + "isExpression": false + }, + { + "value": "head_ref", + "isExpression": false + }, + { + "value": "lifecycle_status", + "isExpression": false + } + ], + "isUnique": false, + "where": null, + "origin": "manual", + "name": "idx_worktrees_pr", + "entityType": "indexes", + "table": "worktrees" + }, + { + "columns": ["repo_full_name", "pr_number"], + "nameExplicit": false, + "name": "pr_watches_repo_full_name_pr_number_unique", + "entityType": "uniques", + "table": "pr_watches" + }, + { + "columns": ["worktree_id"], + "nameExplicit": false, + "name": "prepared_diffs_worktree_id_unique", + "entityType": "uniques", + "table": "prepared_diffs" + }, + { + "columns": ["repo_full_name", "ref"], + "nameExplicit": false, + "name": "ref_watches_repo_full_name_ref_unique", + "entityType": "uniques", + "table": "ref_watches" + }, + { + "columns": ["local_path"], + "nameExplicit": false, + "name": "worktrees_local_path_unique", + "entityType": "uniques", + "table": "worktrees" + } + ], + "renames": [] +} diff --git a/src/runtime-home/app-db/schema.ts b/src/runtime-home/app-db/schema.ts index f3467d29..a4bf6c4b 100644 --- a/src/runtime-home/app-db/schema.ts +++ b/src/runtime-home/app-db/schema.ts @@ -465,6 +465,7 @@ export const prReviewDraftComments = sqliteTable( startSide: text('start_side'), body: text('body').notNull(), origin: text('origin').default('human').notNull(), + sourceFindingId: text('source_finding_id'), createdAt: text('created_at').notNull(), updatedAt: text('updated_at').notNull(), }, diff --git a/web/src/App.tsx b/web/src/App.tsx index 18bdb89c..b4b01cc4 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -354,6 +354,7 @@ function DashboardPanel({ const initialTabId = region.defaultTab ?? region.tabs[0]?.id ?? ''; const [activeTabId, setActiveTabId] = useState(initialTabId); const [focusPulse, setFocusPulse] = useState(false); + const focusPulseTimeoutRef = useRef(null); const tabIdPrefix = useId(); const defaultTabRef = useRef({ regionId: region.id, tabId: initialTabId }); const activeTab = @@ -395,7 +396,13 @@ function DashboardPanel({ detail.handled = true; setActiveTabId(tab.id); setFocusPulse(true); - window.setTimeout(() => setFocusPulse(false), 900); + if (focusPulseTimeoutRef.current !== null) { + window.clearTimeout(focusPulseTimeoutRef.current); + } + focusPulseTimeoutRef.current = window.setTimeout(() => { + focusPulseTimeoutRef.current = null; + setFocusPulse(false); + }, 900); } window.addEventListener('neondeck:navigate', handleNavigation); @@ -406,6 +413,15 @@ function DashboardPanel({ }; }, [region.tabs]); + useEffect(() => { + return () => { + if (focusPulseTimeoutRef.current !== null) { + window.clearTimeout(focusPulseTimeoutRef.current); + focusPulseTimeoutRef.current = null; + } + }; + }, []); + // In column mode an error frame must stay visible, not be capped under the // data band's max-height. Promote the failing region to the agent role so it // uses the floor + grow behavior and the misconfiguration is unmissable. diff --git a/web/src/api/github.ts b/web/src/api/github.ts index bca0f28b..fb45cb4e 100644 --- a/web/src/api/github.ts +++ b/web/src/api/github.ts @@ -155,6 +155,7 @@ export async function postGitHubPrReviewDraftComment(input: { startLine?: number | null; startSide?: 'RIGHT' | 'LEFT' | null; body: string; + sourceFindingId?: string | null; }) { const [owner, name] = parseRepo(input.repo); const response = await postJson( @@ -167,6 +168,7 @@ export async function postGitHubPrReviewDraftComment(input: { startLine: input.startLine ?? null, startSide: input.startSide ?? null, body: input.body, + sourceFindingId: input.sourceFindingId ?? null, }, ); if (!response.data?.draft) throw new Error(response.message); diff --git a/web/src/api/types.ts b/web/src/api/types.ts index 246c5dab..1dc26e86 100644 --- a/web/src/api/types.ts +++ b/web/src/api/types.ts @@ -107,6 +107,7 @@ export type PrReviewStatus = export type PrReviewVerdict = 'comment' | 'approve' | 'request-changes'; export type PrReviewReportOnlyFinding = { + sourceId?: string; severity: 'critical' | 'major' | 'minor' | 'nit'; path: string; line: number | null; @@ -349,6 +350,7 @@ export type GitHubPrReviewDraftComment = { startSide: 'RIGHT' | 'LEFT' | null; body: string; origin: 'human' | 'neon'; + sourceFindingId?: string | null; createdAt: string; updatedAt: string; }; diff --git a/web/src/components/ui.test.tsx b/web/src/components/ui.test.tsx index 661e614a..a141bee4 100644 --- a/web/src/components/ui.test.tsx +++ b/web/src/components/ui.test.tsx @@ -1,6 +1,6 @@ import { renderToStaticMarkup } from 'react-dom/server'; import { describe, expect, it } from 'vitest'; -import { EmptyState } from './ui'; +import { EmptyState, Metric, StatusPill } from './ui'; describe('EmptyState accessibility', () => { it('announces ordinary loading and empty states politely', () => { @@ -25,3 +25,16 @@ describe('EmptyState accessibility', () => { expect(html).toContain('aria-live="assertive"'); }); }); + +describe('live metric typography', () => { + it('uses tabular numerals for shared metric and status values', () => { + const html = renderToStaticMarkup( + <> + + + , + ); + + expect(html.match(/tabular-nums/g)).toHaveLength(2); + }); +}); diff --git a/web/src/components/ui.tsx b/web/src/components/ui.tsx index fb3704a5..982fa449 100644 --- a/web/src/components/ui.tsx +++ b/web/src/components/ui.tsx @@ -86,7 +86,7 @@ export function Kbd({ className, ...props }: HTMLAttributes) { export function Metric({ label, value }: { label: string; value: ReactNode }) { return (

    - {value} + {value} {label}
    ); @@ -103,7 +103,9 @@ export function StatusPill({ }) { return (
    - {value} + + {value} + {label}
    ); diff --git a/web/src/features/flue-chat/config.test.ts b/web/src/features/flue-chat/config.test.ts new file mode 100644 index 00000000..3cf2d1a3 --- /dev/null +++ b/web/src/features/flue-chat/config.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from 'vitest'; +import { parseFlueChatConfig } from './config'; + +describe('parseFlueChatConfig', () => { + it('accepts the routed display assistant agent', () => { + expect( + parseFlueChatConfig({ agentName: 'display-assistant' }), + ).toMatchObject({ + config: { agentName: 'display-assistant' }, + issues: [], + }); + }); + + it('rejects agent names that do not share the session and route model', () => { + expect(parseFlueChatConfig({ agentName: 'other-agent' })).toMatchObject({ + config: { agentName: 'display-assistant' }, + issues: ['agentName must be "display-assistant".'], + }); + }); +}); diff --git a/web/src/features/flue-chat/config.ts b/web/src/features/flue-chat/config.ts index a67bac34..c3daff33 100644 --- a/web/src/features/flue-chat/config.ts +++ b/web/src/features/flue-chat/config.ts @@ -1,4 +1,4 @@ -import { nonEmptyString, plainConfigRecord } from '../../plugins/config'; +import { plainConfigRecord } from '../../plugins/config'; import { flueChatDefaultConfig, type FlueChatCommand, @@ -13,12 +13,7 @@ export function parseFlueChatConfig( return { config: { - agentName: nonEmptyString( - source.agentName, - flueChatDefaultConfig.agentName, - 'agentName', - issues, - ), + agentName: parseAgentName(source.agentName, issues), sessions: parseSessions(source.sessions, issues), quickCommands: parseQuickCommands(source.quickCommands, issues), }, @@ -26,6 +21,14 @@ export function parseFlueChatConfig( }; } +function parseAgentName(value: unknown, issues: string[]) { + if (value === undefined || value === flueChatDefaultConfig.agentName) { + return flueChatDefaultConfig.agentName; + } + issues.push('agentName must be "display-assistant".'); + return flueChatDefaultConfig.agentName; +} + function parseSessions(value: unknown, issues: string[]) { if (value === undefined) return flueChatDefaultConfig.sessions; if (!Array.isArray(value)) { diff --git a/web/src/features/flue-chat/types.ts b/web/src/features/flue-chat/types.ts index 6b942e2b..61f3479b 100644 --- a/web/src/features/flue-chat/types.ts +++ b/web/src/features/flue-chat/types.ts @@ -11,7 +11,7 @@ export type FlueChatCommand = { }; export type FlueChatConfig = { - agentName: string; + agentName: 'display-assistant'; sessions: FlueChatSession[]; quickCommands: FlueChatCommand[]; }; diff --git a/web/src/features/pr-review/GitHubPrReview.test.ts b/web/src/features/pr-review/GitHubPrReview.test.ts index 322feab5..e1d2a99f 100644 --- a/web/src/features/pr-review/GitHubPrReview.test.ts +++ b/web/src/features/pr-review/GitHubPrReview.test.ts @@ -21,7 +21,14 @@ import { draftCommentIdsWithUnknownPatch, reviewPatchQuerySettled, } from './review-view-model'; -import { clearCompletedEditor } from './review-ui-helpers'; +import { + reportOnlyFindingBody, + isReportOnlyFindingDrafted, +} from './PrReviewFindingsSidebar'; +import { + clearCompletedEditor, + isCurrentReviewOperation, +} from './review-ui-helpers'; import capturedReviewPatch from './fixtures/captured-review.patch?raw'; describe('GitHubPrReview helpers', () => { @@ -366,6 +373,60 @@ describe('GitHubPrReview helpers', () => { reopenedComment, ); }); + + it('ignores status from an operation superseded by newer work', () => { + expect(isCurrentReviewOperation(2, 1)).toBe(false); + expect(isCurrentReviewOperation(2, 2)).toBe(true); + }); + + it('matches report-only drafts by persisted source identity', () => { + const finding = { + sourceId: 'prf_source_1', + severity: 'minor' as const, + path: 'src/review.ts', + line: null, + summary: 'Overlapping summary', + suggestedFix: 'Keep the source identity.', + reason: 'unanchorable', + }; + const draft = draftWithComments([draftComment('generated', finding.path)]); + const comment = draft.comments[0]; + if (!comment) throw new Error('Expected draft comment fixture.'); + comment.body = 'The user edited the generated text.'; + comment.path = 'src/another-file.ts'; + comment.sourceFindingId = finding.sourceId; + + expect(isReportOnlyFindingDrafted(draft, finding)).toBe(true); + expect( + isReportOnlyFindingDrafted(draft, { + ...finding, + sourceId: 'prf_source_2', + }), + ).toBe(false); + }); + + it('falls back to exact text and path for provenance-less legacy drafts', () => { + const finding = { + sourceId: 'prf_synthesized_on_read', + severity: 'minor' as const, + path: 'src/review.ts', + line: null, + summary: 'Shared words', + suggestedFix: 'Use exact matching.', + reason: 'unanchorable', + }; + const draft = draftWithComments([draftComment('legacy', finding.path)]); + const comment = draft.comments[0]; + if (!comment) throw new Error('Expected draft comment fixture.'); + comment.body = reportOnlyFindingBody(finding); + + expect(isReportOnlyFindingDrafted(draft, finding)).toBe(true); + comment.sourceFindingId = 'prf_different_finding'; + expect(isReportOnlyFindingDrafted(draft, finding)).toBe(false); + comment.sourceFindingId = null; + comment.path = 'src/other.ts'; + expect(isReportOnlyFindingDrafted(draft, finding)).toBe(false); + }); }); function selection(input: { side: 'additions' | 'deletions'; line: number }) { diff --git a/web/src/features/pr-review/GitHubPrReview.tsx b/web/src/features/pr-review/GitHubPrReview.tsx index 4202a213..c839bc0c 100644 --- a/web/src/features/pr-review/GitHubPrReview.tsx +++ b/web/src/features/pr-review/GitHubPrReview.tsx @@ -47,7 +47,10 @@ import { reviewPatchQuerySettled, summaryLabel, } from './review-view-model'; -import { clearCompletedEditor } from './review-ui-helpers'; +import { + clearCompletedEditor, + isCurrentReviewOperation, +} from './review-ui-helpers'; import { usePrReviewRecord } from './usePrReviewRecord'; type ComposerState = { @@ -55,6 +58,7 @@ type ComposerState = { path: string; selection: SelectedLineRange; annotation: DiffReviewAnnotation; + sourceFindingId: string | null; token: number; }; @@ -99,6 +103,7 @@ export function GitHubPrReview({ start: startReview, } = usePrReviewRecord(pr); const nextEditorToken = useRef(0); + const nextOperationToken = useRef(0); const [activePath, setActivePath] = useState(null); const [composer, setComposer] = useState(null); const [commentEditor, setCommentEditor] = useState( @@ -119,11 +124,31 @@ export function GitHubPrReview({ const [submitFailedCommentIds, setSubmitFailedCommentIds] = useState< Set >(() => new Set()); - const [statusMessage, setStatusMessage] = useState(null); + const [statusMessage, setStatusMessageState] = useState(null); const createEditorToken = () => { nextEditorToken.current += 1; return nextEditorToken.current; }; + const beginOperation = () => { + nextOperationToken.current += 1; + setStatusMessageState(null); + return nextOperationToken.current; + }; + const finishOperation = (token: number, message: string) => { + if (isCurrentReviewOperation(nextOperationToken.current, token)) { + setStatusMessageState(message); + } + }; + const failOperation = (token: number, error: unknown) => { + if (!isCurrentReviewOperation(nextOperationToken.current, token)) return; + setStatusMessageState( + mutationErrorMessage(error, draft) ?? 'The operation failed.', + ); + }; + const setStatusMessage = (message: string | null) => { + nextOperationToken.current += 1; + setStatusMessageState(message); + }; const fileList = useMemo( () => (filesQuery.data?.files ?? []) as DiffFilePatch[], [filesQuery.data?.files], @@ -241,21 +266,7 @@ export function GitHubPrReview({ const isThreadMutationPending = mutations.replyToThread.isPending || mutations.setThreadResolution.isPending; - const reviewBarStatusMessage = - mutationErrorMessage( - mutations.submitReview.error ?? - mutations.saveDraft.error ?? - mutations.addComment.error ?? - mutations.updateComment.error ?? - mutations.deleteComment.error ?? - mutations.discardDraft.error ?? - mutations.replyToThread.error ?? - mutations.setThreadResolution.error ?? - startReview.error ?? - restartReview.error ?? - reconcileSubmission.error, - draft, - ) ?? statusMessage; + const reviewBarStatusMessage = statusMessage; const fileLoadMessage = filesQuery.isLoading ? 'Loading PR files.' : filesQuery.error @@ -307,7 +318,6 @@ export function GitHubPrReview({ }> = {}, headSha = currentHeadSha, ) => { - setStatusMessage(null); if (!headSha) throw new Error('PR head SHA is unavailable.'); return mutations.saveDraft.mutateAsync({ repo: pr.repo, @@ -345,7 +355,7 @@ export function GitHubPrReview({ }; const refreshDraftHead = async () => { if (!draft) return; - setStatusMessage(null); + const operationToken = beginOperation(); try { const refreshedHeadSha = await mutations .refetchPullRequestHeadSha() @@ -354,9 +364,12 @@ export function GitHubPrReview({ await saveDraft({ reanchorHeadSha: true }, nextHeadSha); await mutations.invalidateReviewSources(); setSubmitFailedCommentIds(new Set()); - setStatusMessage('Draft head updated to the current PR revision.'); - } catch { - // React Query owns the visible error state. + finishOperation( + operationToken, + 'Draft head updated to the current PR revision.', + ); + } catch (error) { + failOperation(operationToken, error); } }; const onSelectionChange = (selection: SelectedLineRange | null) => { @@ -375,7 +388,7 @@ export function GitHubPrReview({ setReanchoringCommentId(null); return; } - setStatusMessage(null); + const operationToken = beginOperation(); mutations.updateComment .mutateAsync({ repo: pr.repo, @@ -392,9 +405,9 @@ export function GitHubPrReview({ return next; }); setReanchoringCommentId(null); - setStatusMessage('Draft comment re-anchored.'); + finishOperation(operationToken, 'Draft comment re-anchored.'); }) - .catch(() => undefined); + .catch((error) => failOperation(operationToken, error)); return; } const annotation = annotationFromSelection(selection, index); @@ -403,6 +416,7 @@ export function GitHubPrReview({ body: anchoringFinding ? reportOnlyFindingBody(anchoringFinding) : '', path: activePath, selection, + sourceFindingId: anchoringFinding?.sourceId ?? null, token: createEditorToken(), }); setAnchoringFinding(null); @@ -413,7 +427,7 @@ export function GitHubPrReview({ const submittedComposer = composer; if (!submittedComposer || submittedComposer.body.trim().length === 0) return; - setStatusMessage(null); + const operationToken = beginOperation(); try { const nextDraft = await ensureDraft(); const index = patchIndexesByPath.get(submittedComposer.path); @@ -422,7 +436,10 @@ export function GitHubPrReview({ index, ); if (index && !commentAnchorExists(index, input)) { - setStatusMessage('Selected range is not valid for the current patch.'); + finishOperation( + operationToken, + 'Selected range is not valid for the current patch.', + ); return; } await mutations.addComment.mutateAsync({ @@ -432,20 +449,21 @@ export function GitHubPrReview({ path: submittedComposer.path, ...input, body: submittedComposer.body, + sourceFindingId: submittedComposer.sourceFindingId, }); setComposer((current) => clearCompletedEditor(current, submittedComposer.token), ); - setStatusMessage('Draft comment saved.'); - } catch { - // React Query owns the visible error state. + finishOperation(operationToken, 'Draft comment saved.'); + } catch (error) { + failOperation(operationToken, error); } }; const submitEdit = async (event: FormEvent) => { event.preventDefault(); const submittedEditor = commentEditor; if (!submittedEditor || submittedEditor.body.trim().length === 0) return; - setStatusMessage(null); + const operationToken = beginOperation(); try { await mutations.updateComment.mutateAsync({ repo: pr.repo, @@ -456,8 +474,9 @@ export function GitHubPrReview({ setCommentEditor((current) => clearCompletedEditor(current, submittedEditor.token), ); - } catch { - // React Query owns the visible error state. + finishOperation(operationToken, 'Draft comment updated.'); + } catch (error) { + failOperation(operationToken, error); } }; const submitReply = async (threadId: string, event: FormEvent) => { @@ -469,7 +488,7 @@ export function GitHubPrReview({ submittedEditor.body.trim().length === 0 ) return; - setStatusMessage(null); + const operationToken = beginOperation(); try { await mutations.replyToThread.mutateAsync({ repo: pr.repo, @@ -480,11 +499,26 @@ export function GitHubPrReview({ setReplyEditor((current) => clearCompletedEditor(current, submittedEditor.token), ); - setStatusMessage('Thread reply posted.'); - } catch { - // React Query owns the visible error state. + finishOperation(operationToken, 'Thread reply posted.'); + } catch (error) { + failOperation(operationToken, error); } }; + const deleteDraftComment = (commentId: string) => { + const operationToken = beginOperation(); + mutations.deleteComment.mutate( + { + repo: pr.repo, + number: pr.number, + id: commentId, + }, + { + onError: (error) => failOperation(operationToken, error), + onSuccess: () => + finishOperation(operationToken, 'Draft comment deleted.'), + }, + ); + }; const renderAnnotation = (annotation: DiffReviewAnnotation) => ( setComposer((current) => (current ? { ...current, body } : current)) } - onDeleteComment={(commentId) => { - setStatusMessage(null); - mutations.deleteComment.mutate({ - repo: pr.repo, - number: pr.number, - id: commentId, - }); - }} + onDeleteComment={deleteDraftComment} onEditingBodyChange={(body) => setCommentEditor((current) => current ? { ...current, body } : current, @@ -530,13 +557,24 @@ export function GitHubPrReview({ setReplyEditor((current) => (current ? { ...current, body } : current)) } onSetThreadResolution={(thread) => { - setStatusMessage(null); - mutations.setThreadResolution.mutate({ - repo: pr.repo, - number: pr.number, - threadId: thread.id, - resolved: !thread.isResolved, - }); + const operationToken = beginOperation(); + const resolved = !thread.isResolved; + mutations.setThreadResolution.mutate( + { + repo: pr.repo, + number: pr.number, + threadId: thread.id, + resolved, + }, + { + onError: (error) => failOperation(operationToken, error), + onSuccess: () => + finishOperation( + operationToken, + resolved ? 'Thread resolved.' : 'Thread reopened.', + ), + }, + ); }} onStartEdit={(commentId, body) => { setCommentEditor({ @@ -565,7 +603,7 @@ export function GitHubPrReview({ ); return; } - setStatusMessage(null); + const operationToken = beginOperation(); try { const normalizedBody = normalizeReviewBody(reviewBody); await mutations.submitReview.mutateAsync({ @@ -577,13 +615,13 @@ export function GitHubPrReview({ commentIds: cleanCommentIds, }); setSubmitFailedCommentIds(new Set()); - setStatusMessage('Review submitted.'); + finishOperation(operationToken, 'Review submitted.'); } catch (error) { const failingIds = failingCommentIdsFromError(error); if (failingIds.length > 0) { setSubmitFailedCommentIds(new Set(failingIds)); } - // React Query owns the visible error state. + failOperation(operationToken, error); } }; const focusNextPendingComment = () => { @@ -621,14 +659,7 @@ export function GitHubPrReview({ isDeleting: mutations.deleteComment.isPending, isLoadingThreads: threadsQuery.isLoading, onChooseLine: beginAnchorFinding, - onDelete: (commentId: string) => { - setStatusMessage(null); - mutations.deleteComment.mutate({ - repo: pr.repo, - number: pr.number, - id: commentId, - }); - }, + onDelete: deleteDraftComment, onReanchor: (comment: GitHubPrReviewDraftComment) => beginReanchorComment(comment.id, comment.path), review: reviewRecord, @@ -679,13 +710,19 @@ export function GitHubPrReview({ reviewRecord.status === 'reviewing' } onClick={() => { - setStatusMessage(null); + const operationToken = beginOperation(); if (reviewRecord.status === 'submitting') { reconcileSubmission.mutate(reviewRecord.id, { - onSuccess: (result) => setStatusMessage(result.message), + onError: (error) => failOperation(operationToken, error), + onSuccess: (result) => + finishOperation(operationToken, result.message), }); } else { - restartReview.mutate(reviewRecord.id); + restartReview.mutate(reviewRecord.id, { + onError: (error) => failOperation(operationToken, error), + onSuccess: () => + finishOperation(operationToken, 'Neon review restarted.'), + }); } }} title={ @@ -714,8 +751,12 @@ export function GitHubPrReview({ className="pr-review-popout-button" disabled={startReview.isPending} onClick={() => { - setStatusMessage(null); - startReview.mutate(); + const operationToken = beginOperation(); + startReview.mutate(undefined, { + onError: (error) => failOperation(operationToken, error), + onSuccess: () => + finishOperation(operationToken, 'Neon review started.'), + }); }} title="Run Neon review assistance for this pull request" type="button" @@ -811,9 +852,13 @@ export function GitHubPrReview({ setIsReviewBodyFocused(false); const normalizedBody = normalizeReviewBody(reviewBody); if ((draft?.body ?? null) !== normalizedBody) { + const operationToken = beginOperation(); void saveDraft({ body: normalizedBody }) - .then(() => setHasPendingReviewBodyEdit(false)) - .catch(() => undefined); + .then(() => { + setHasPendingReviewBodyEdit(false); + finishOperation(operationToken, 'Review summary saved.'); + }) + .catch((error) => failOperation(operationToken, error)); } else { setHasPendingReviewBodyEdit(false); } @@ -825,20 +870,30 @@ export function GitHubPrReview({ onBodyFocus={() => setIsReviewBodyFocused(true)} onDiscard={() => { if (!draft) return; - setStatusMessage(null); const confirmed = window.confirm('Discard this PR review draft?'); if (confirmed) { - mutations.discardDraft.mutate({ - repo: pr.repo, - number: pr.number, - }); + const operationToken = beginOperation(); + mutations.discardDraft.mutate( + { + repo: pr.repo, + number: pr.number, + }, + { + onError: (error) => failOperation(operationToken, error), + onSuccess: () => + finishOperation(operationToken, 'Review draft discarded.'), + }, + ); } }} onSubmit={submitReview} onPendingCountClick={focusNextPendingComment} onVerdictChange={(next) => { setVerdict(next); - void saveDraft({ verdict: next }).catch(() => undefined); + const operationToken = beginOperation(); + void saveDraft({ verdict: next }) + .then(() => finishOperation(operationToken, 'Verdict saved.')) + .catch((error) => failOperation(operationToken, error)); }} isSubmitting={mutations.submitReview.isPending} reviewBody={reviewBody} diff --git a/web/src/features/pr-review/PrReviewFindingsSidebar.tsx b/web/src/features/pr-review/PrReviewFindingsSidebar.tsx index b74b6a14..2a2c7f83 100644 --- a/web/src/features/pr-review/PrReviewFindingsSidebar.tsx +++ b/web/src/features/pr-review/PrReviewFindingsSidebar.tsx @@ -268,13 +268,13 @@ function ReportOnlyFindingPanel({
    {review.reportOnlyFindings.map((finding, index) => { - const drafted = draft?.comments.some((comment) => - comment.body.includes(finding.summary), - ); + const drafted = isReportOnlyFindingDrafted(draft, finding); return (

    {finding.severity} · {finding.path} @@ -322,3 +322,22 @@ export function reportOnlyFindingBody(finding: PrReviewReportOnlyFinding) { 'Manually anchored from a report-only finding. Edit or delete before submitting the review.', ].join('\n'); } + +export function isReportOnlyFindingDrafted( + draft: GitHubPrReviewDraft | null, + finding: PrReviewReportOnlyFinding, +) { + const generatedBody = reportOnlyFindingBody(finding); + return Boolean( + draft?.comments.some((comment) => { + if (finding.sourceId && comment.sourceFindingId === finding.sourceId) { + return true; + } + return ( + !comment.sourceFindingId && + comment.path === finding.path && + comment.body === generatedBody + ); + }), + ); +} diff --git a/web/src/features/pr-review/review-ui-helpers.ts b/web/src/features/pr-review/review-ui-helpers.ts index dd92c06f..925324d9 100644 --- a/web/src/features/pr-review/review-ui-helpers.ts +++ b/web/src/features/pr-review/review-ui-helpers.ts @@ -26,3 +26,10 @@ export function clearCompletedEditor( ) { return current?.token === completedToken ? null : current; } + +export function isCurrentReviewOperation( + currentToken: number, + completedToken: number, +) { + return currentToken === completedToken; +}