From 4cbe79b26dac7dcef7eaa20911f4f4ecfc18f55b Mon Sep 17 00:00:00 2001 From: Jason O'Neal Date: Wed, 16 Sep 2026 21:22:58 -0400 Subject: [PATCH 01/17] feat(review): integrate Claw & Order detection pipeline with Krill GPT-6 Astra evaluator --- drizzle/0013_lively_umar.sql | 47 + drizzle/meta/0013_snapshot.json | 2345 +++++++++++++++++++++++ drizzle/meta/_journal.json | 7 + src/commands/review.ts | 208 ++ src/components/reviewButtons.ts | 220 +++ src/config/review.ts | 20 + src/data/review.ts | 148 ++ src/db/schema.ts | 66 + src/events/reviewIngestMessageCreate.ts | 115 ++ src/index.ts | 6 + src/review/analyzer.ts | 278 +++ src/review/features.ts | 212 ++ src/review/krillEvaluator.ts | 137 ++ src/review/repetition.ts | 41 + src/review/timing.ts | 205 ++ src/review/types.ts | 81 + src/services/reviewNotifier.ts | 35 + tests/review.test.ts | 307 +++ 18 files changed, 4478 insertions(+) create mode 100644 drizzle/0013_lively_umar.sql create mode 100644 drizzle/meta/0013_snapshot.json create mode 100644 src/commands/review.ts create mode 100644 src/components/reviewButtons.ts create mode 100644 src/config/review.ts create mode 100644 src/data/review.ts create mode 100644 src/events/reviewIngestMessageCreate.ts create mode 100644 src/review/analyzer.ts create mode 100644 src/review/features.ts create mode 100644 src/review/krillEvaluator.ts create mode 100644 src/review/repetition.ts create mode 100644 src/review/timing.ts create mode 100644 src/review/types.ts create mode 100644 src/services/reviewNotifier.ts create mode 100644 tests/review.test.ts diff --git a/drizzle/0013_lively_umar.sql b/drizzle/0013_lively_umar.sql new file mode 100644 index 0000000..e473f78 --- /dev/null +++ b/drizzle/0013_lively_umar.sql @@ -0,0 +1,47 @@ +CREATE TABLE `review_cases` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `case_id` text NOT NULL, + `guild_id` text NOT NULL, + `target_user_id` text NOT NULL, + `status` text DEFAULT 'open' NOT NULL, + `heuristic_score` integer NOT NULL, + `concordance` text NOT NULL, + `behavioral_families` text NOT NULL, + `evidence_message_id` text, + `krill_probability` text, + `krill_brief` text, + `krill_model` text, + `review_message_id` text, + `review_channel_id` text, + `decided_by_id` text, + `decision_reason` text, + `created_at` text DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL, + `updated_at` text DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `review_cases_case_id_unique` ON `review_cases` (`case_id`);--> statement-breakpoint +CREATE INDEX `idx_review_cases_guild_target` ON `review_cases` (`guild_id`,`target_user_id`);--> statement-breakpoint +CREATE INDEX `idx_review_cases_status` ON `review_cases` (`status`);--> statement-breakpoint +CREATE INDEX `idx_review_cases_review_msg` ON `review_cases` (`review_message_id`);--> statement-breakpoint +CREATE TABLE `review_observations` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `message_id` text NOT NULL, + `guild_id` text NOT NULL, + `channel_id` text NOT NULL, + `author_id` text NOT NULL, + `created_at` text NOT NULL, + `reply_to_id` text, + `content_length` integer NOT NULL, + `line_count` integer NOT NULL, + `fingerprint` text NOT NULL, + `artifacts` text NOT NULL, + `similarity` text, + `semantic_score` integer, + `received_at` text DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `review_observations_message_id_unique` ON `review_observations` (`message_id`);--> statement-breakpoint +CREATE INDEX `idx_review_obs_guild_author` ON `review_observations` (`guild_id`,`author_id`,`created_at`);--> statement-breakpoint +CREATE INDEX `idx_review_obs_author` ON `review_observations` (`author_id`,`created_at`);--> statement-breakpoint +CREATE INDEX `idx_review_obs_channel` ON `review_observations` (`channel_id`,`created_at`);--> statement-breakpoint +CREATE INDEX `idx_review_obs_message` ON `review_observations` (`message_id`); \ No newline at end of file diff --git a/drizzle/meta/0013_snapshot.json b/drizzle/meta/0013_snapshot.json new file mode 100644 index 0000000..ad7beac --- /dev/null +++ b/drizzle/meta/0013_snapshot.json @@ -0,0 +1,2345 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "793d4b1d-494e-40d0-85a7-cc0f143a5fd8", + "prevId": "30731fe5-aff9-413c-b7c6-cbe4ac734ebc", + "tables": { + "action_cooldown_events": { + "name": "action_cooldown_events", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "interaction_id": { + "name": "interaction_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "action_kind": { + "name": "action_kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "guild_id": { + "name": "guild_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "channel_id": { + "name": "channel_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "actor_id": { + "name": "actor_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "actor_expires_at": { + "name": "actor_expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_expires_at": { + "name": "target_expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "channel_expires_at": { + "name": "channel_expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "action_cooldown_events_interaction_id_unique": { + "name": "action_cooldown_events_interaction_id_unique", + "columns": [ + "interaction_id" + ], + "isUnique": true + }, + "idx_action_cooldowns_actor": { + "name": "idx_action_cooldowns_actor", + "columns": [ + "guild_id", + "actor_id", + "actor_expires_at" + ], + "isUnique": false + }, + "idx_action_cooldowns_target": { + "name": "idx_action_cooldowns_target", + "columns": [ + "guild_id", + "target_id", + "target_expires_at" + ], + "isUnique": false + }, + "idx_action_cooldowns_channel": { + "name": "idx_action_cooldowns_channel", + "columns": [ + "guild_id", + "channel_id", + "channel_expires_at" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "claim_requests": { + "name": "claim_requests", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "guild_id": { + "name": "guild_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'submitted'" + }, + "github_username": { + "name": "github_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "merged_pr_count": { + "name": "merged_pr_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "review_message_id": { + "name": "review_message_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "review_thread_id": { + "name": "review_thread_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "decided_at": { + "name": "decided_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "decided_by_id": { + "name": "decided_by_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "decision_reason": { + "name": "decision_reason", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "idx_claim_requests_guild_user": { + "name": "idx_claim_requests_guild_user", + "columns": [ + "guild_id", + "user_id" + ], + "isUnique": true + }, + "idx_claim_requests_user_id": { + "name": "idx_claim_requests_user_id", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "idx_claim_requests_status": { + "name": "idx_claim_requests_status", + "columns": [ + "status" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "clawhub_content_rights_cases": { + "name": "clawhub_content_rights_cases", + "columns": { + "case_id": { + "name": "case_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "form_submission_id": { + "name": "form_submission_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'submitted'" + }, + "requester_name": { + "name": "requester_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organization": { + "name": "organization", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "clawhub_urls": { + "name": "clawhub_urls", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "explanation": { + "name": "explanation", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "clawhub_content_rights_cases_form_submission_id_unique": { + "name": "clawhub_content_rights_cases_form_submission_id_unique", + "columns": [ + "form_submission_id" + ], + "isUnique": true + }, + "idx_clawhub_content_rights_cases_status": { + "name": "idx_clawhub_content_rights_cases_status", + "columns": [ + "status" + ], + "isUnique": false + }, + "idx_clawhub_content_rights_cases_email": { + "name": "idx_clawhub_content_rights_cases_email", + "columns": [ + "email" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "clawhub_content_rights_events": { + "name": "clawhub_content_rights_events", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "case_id": { + "name": "case_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "event_type": { + "name": "event_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "actor": { + "name": "actor", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "idx_clawhub_content_rights_events_case_id": { + "name": "idx_clawhub_content_rights_events_case_id", + "columns": [ + "case_id" + ], + "isUnique": false + }, + "idx_clawhub_content_rights_events_event_type": { + "name": "idx_clawhub_content_rights_events_event_type", + "columns": [ + "event_type" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "clawhub_content_rights_files": { + "name": "clawhub_content_rights_files", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "case_id": { + "name": "case_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "object_key": { + "name": "object_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "original_name": { + "name": "original_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "size_bytes": { + "name": "size_bytes", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sha256": { + "name": "sha256", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "clawhub_content_rights_files_object_key_unique": { + "name": "clawhub_content_rights_files_object_key_unique", + "columns": [ + "object_key" + ], + "isUnique": true + }, + "idx_clawhub_content_rights_files_case_id": { + "name": "idx_clawhub_content_rights_files_case_id", + "columns": [ + "case_id" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "form_submissions": { + "name": "form_submissions", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "form_id": { + "name": "form_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'submitted'" + }, + "auth_provider": { + "name": "auth_provider", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "applicant_id": { + "name": "applicant_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "applicant_username": { + "name": "applicant_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payload": { + "name": "payload", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "review_channel_id": { + "name": "review_channel_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "review_message_id": { + "name": "review_message_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "review_thread_id": { + "name": "review_thread_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "decided_at": { + "name": "decided_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "decided_by_id": { + "name": "decided_by_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "decision_reason": { + "name": "decision_reason", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "action_result": { + "name": "action_result", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "idx_form_submissions_form_id": { + "name": "idx_form_submissions_form_id", + "columns": [ + "form_id" + ], + "isUnique": false + }, + "idx_form_submissions_status": { + "name": "idx_form_submissions_status", + "columns": [ + "status" + ], + "isUnique": false + }, + "idx_form_submissions_applicant_id": { + "name": "idx_form_submissions_applicant_id", + "columns": [ + "applicant_id" + ], + "isUnique": false + }, + "idx_form_submissions_review_message_id": { + "name": "idx_form_submissions_review_message_id", + "columns": [ + "review_message_id" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "helper_events": { + "name": "helper_events", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "event_type": { + "name": "event_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'helper_command'" + }, + "thread_id": { + "name": "thread_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "message_count": { + "name": "message_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "event_time": { + "name": "event_time", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "invoked_by_id": { + "name": "invoked_by_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "invoked_by_username": { + "name": "invoked_by_username", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "invoked_by_global_name": { + "name": "invoked_by_global_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "received_at": { + "name": "received_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "raw_payload": { + "name": "raw_payload", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "idx_helper_events_event_time": { + "name": "idx_helper_events_event_time", + "columns": [ + "event_time" + ], + "isUnique": false + }, + "idx_helper_events_command": { + "name": "idx_helper_events_command", + "columns": [ + "command" + ], + "isUnique": false + }, + "idx_helper_events_thread_id": { + "name": "idx_helper_events_thread_id", + "columns": [ + "thread_id" + ], + "isUnique": false + }, + "idx_helper_events_invoked_by_id": { + "name": "idx_helper_events_invoked_by_id", + "columns": [ + "invoked_by_id" + ], + "isUnique": false + }, + "idx_helper_events_event_type": { + "name": "idx_helper_events_event_type", + "columns": [ + "event_type" + ], + "isUnique": false + }, + "idx_helper_events_thread_time": { + "name": "idx_helper_events_thread_time", + "columns": [ + "thread_id", + "event_time" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "keyValue": { + "name": "keyValue", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "lobster_encounters": { + "name": "lobster_encounters", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "interaction_id": { + "name": "interaction_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "cooldown_event_id": { + "name": "cooldown_event_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "guild_id": { + "name": "guild_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "channel_id": { + "name": "channel_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "message_id": { + "name": "message_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "actor_id": { + "name": "actor_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_is_bot": { + "name": "target_is_bot", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "taxonomy_snapshot_id": { + "name": "taxonomy_snapshot_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "species_aphia_id": { + "name": "species_aphia_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "species_accepted_name": { + "name": "species_accepted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "species_display_name": { + "name": "species_display_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "species_family": { + "name": "species_family", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "scene_id": { + "name": "scene_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_url": { + "name": "asset_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_checksum": { + "name": "asset_checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "headline": { + "name": "headline", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "narrative": { + "name": "narrative", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "metrics_json": { + "name": "metrics_json", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "accessibility_description": { + "name": "accessibility_description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "publication_status": { + "name": "publication_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "publication_failure": { + "name": "publication_failure", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publication_failed_at": { + "name": "publication_failed_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "message_bound_at": { + "name": "message_bound_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "response_status": { + "name": "response_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "response_type": { + "name": "response_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "response_actor_id": { + "name": "response_actor_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "responded_at": { + "name": "responded_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "response_result_json": { + "name": "response_result_json", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_actor_id": { + "name": "counter_actor_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_target_id": { + "name": "counter_target_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_scene_id": { + "name": "counter_scene_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_asset_url": { + "name": "counter_asset_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_asset_checksum": { + "name": "counter_asset_checksum", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_headline": { + "name": "counter_headline", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_narrative": { + "name": "counter_narrative", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_metrics_json": { + "name": "counter_metrics_json", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_accessibility_description": { + "name": "counter_accessibility_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "lobster_encounters_interaction_id_unique": { + "name": "lobster_encounters_interaction_id_unique", + "columns": [ + "interaction_id" + ], + "isUnique": true + }, + "lobster_encounters_cooldown_event_id_unique": { + "name": "lobster_encounters_cooldown_event_id_unique", + "columns": [ + "cooldown_event_id" + ], + "isUnique": true + }, + "idx_lobster_encounters_message": { + "name": "idx_lobster_encounters_message", + "columns": [ + "guild_id", + "channel_id", + "message_id" + ], + "isUnique": false + }, + "idx_lobster_encounters_species": { + "name": "idx_lobster_encounters_species", + "columns": [ + "species_aphia_id" + ], + "isUnique": false + }, + "idx_lobster_encounters_publication": { + "name": "idx_lobster_encounters_publication", + "columns": [ + "publication_status" + ], + "isUnique": false + }, + "idx_lobster_encounters_response": { + "name": "idx_lobster_encounters_response", + "columns": [ + "response_status" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "nomination_approvals": { + "name": "nomination_approvals", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "nomination_id": { + "name": "nomination_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "approver_id": { + "name": "approver_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "vote_choice": { + "name": "vote_choice", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'approve'" + }, + "mutation_id": { + "name": "mutation_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "idx_nomination_approvals_nomination_approver": { + "name": "idx_nomination_approvals_nomination_approver", + "columns": [ + "nomination_id", + "approver_id" + ], + "isUnique": true + }, + "idx_nomination_approvals_nomination_id": { + "name": "idx_nomination_approvals_nomination_id", + "columns": [ + "nomination_id" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "nominations": { + "name": "nominations", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "guild_id": { + "name": "guild_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "channel_id": { + "name": "channel_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nominee_id": { + "name": "nominee_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nominator_id": { + "name": "nominator_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reason": { + "name": "reason", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No reason provided.'" + }, + "message_id": { + "name": "message_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "target_role_id": { + "name": "target_role_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "required_approvals": { + "name": "required_approvals", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'submitted'" + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "completed_at": { + "name": "completed_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "desired_card_revision": { + "name": "desired_card_revision", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "synced_card_revision": { + "name": "synced_card_revision", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "card_sync_started_at": { + "name": "card_sync_started_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "card_sync_failure_count": { + "name": "card_sync_failure_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "grant_started_at": { + "name": "grant_started_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "grant_failure_count": { + "name": "grant_failure_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "idx_nominations_active_unique": { + "name": "idx_nominations_active_unique", + "columns": [ + "guild_id", + "nominee_id", + "target_role_id" + ], + "isUnique": true, + "where": "\"nominations\".\"status\" in ('submitted', 'granting')" + }, + "idx_nominations_status": { + "name": "idx_nominations_status", + "columns": [ + "status" + ], + "isUnique": false + }, + "idx_nominations_card_sync": { + "name": "idx_nominations_card_sync", + "columns": [ + "desired_card_revision", + "synced_card_revision" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "reddit_moderation_contexts": { + "name": "reddit_moderation_contexts", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "subreddit": { + "name": "subreddit", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'moderated'" + }, + "unaction": { + "name": "unaction", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'reviewed'" + }, + "ban_reason": { + "name": "ban_reason", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "moderator": { + "name": "moderator", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banned_at": { + "name": "banned_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "raw_payload": { + "name": "raw_payload", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "idx_reddit_moderation_contexts_subreddit_username": { + "name": "idx_reddit_moderation_contexts_subreddit_username", + "columns": [ + "subreddit", + "username" + ], + "isUnique": true + }, + "idx_reddit_moderation_contexts_username": { + "name": "idx_reddit_moderation_contexts_username", + "columns": [ + "username" + ], + "isUnique": false + }, + "idx_reddit_moderation_contexts_action": { + "name": "idx_reddit_moderation_contexts_action", + "columns": [ + "action" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "review_cases": { + "name": "review_cases", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "case_id": { + "name": "case_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "guild_id": { + "name": "guild_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_user_id": { + "name": "target_user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'open'" + }, + "heuristic_score": { + "name": "heuristic_score", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "concordance": { + "name": "concordance", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "behavioral_families": { + "name": "behavioral_families", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "evidence_message_id": { + "name": "evidence_message_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "krill_probability": { + "name": "krill_probability", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "krill_brief": { + "name": "krill_brief", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "krill_model": { + "name": "krill_model", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "review_message_id": { + "name": "review_message_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "review_channel_id": { + "name": "review_channel_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "decided_by_id": { + "name": "decided_by_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "decision_reason": { + "name": "decision_reason", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "review_cases_case_id_unique": { + "name": "review_cases_case_id_unique", + "columns": [ + "case_id" + ], + "isUnique": true + }, + "idx_review_cases_guild_target": { + "name": "idx_review_cases_guild_target", + "columns": [ + "guild_id", + "target_user_id" + ], + "isUnique": false + }, + "idx_review_cases_status": { + "name": "idx_review_cases_status", + "columns": [ + "status" + ], + "isUnique": false + }, + "idx_review_cases_review_msg": { + "name": "idx_review_cases_review_msg", + "columns": [ + "review_message_id" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "review_observations": { + "name": "review_observations", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "message_id": { + "name": "message_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "guild_id": { + "name": "guild_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "channel_id": { + "name": "channel_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "author_id": { + "name": "author_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reply_to_id": { + "name": "reply_to_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "content_length": { + "name": "content_length", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "line_count": { + "name": "line_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "fingerprint": { + "name": "fingerprint", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "artifacts": { + "name": "artifacts", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "similarity": { + "name": "similarity", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "semantic_score": { + "name": "semantic_score", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "received_at": { + "name": "received_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "review_observations_message_id_unique": { + "name": "review_observations_message_id_unique", + "columns": [ + "message_id" + ], + "isUnique": true + }, + "idx_review_obs_guild_author": { + "name": "idx_review_obs_guild_author", + "columns": [ + "guild_id", + "author_id", + "created_at" + ], + "isUnique": false + }, + "idx_review_obs_author": { + "name": "idx_review_obs_author", + "columns": [ + "author_id", + "created_at" + ], + "isUnique": false + }, + "idx_review_obs_channel": { + "name": "idx_review_obs_channel", + "columns": [ + "channel_id", + "created_at" + ], + "isUnique": false + }, + "idx_review_obs_message": { + "name": "idx_review_obs_message", + "columns": [ + "message_id" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "slap_events": { + "name": "slap_events", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "interaction_id": { + "name": "interaction_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "guild_id": { + "name": "guild_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "channel_id": { + "name": "channel_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "message_id": { + "name": "message_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "actor_id": { + "name": "actor_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "target_is_bot": { + "name": "target_is_bot", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "fish_slug": { + "name": "fish_slug", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "fish_name": { + "name": "fish_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "rarity": { + "name": "rarity", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "outcome": { + "name": "outcome", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "headline": { + "name": "headline", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "narrative": { + "name": "narrative", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "impact": { + "name": "impact", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "dignity_remaining": { + "name": "dignity_remaining", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "fish_condition": { + "name": "fish_condition", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image_url": { + "name": "image_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "counter_actor_id": { + "name": "counter_actor_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_target_id": { + "name": "counter_target_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_fish_slug": { + "name": "counter_fish_slug", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_fish_name": { + "name": "counter_fish_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_rarity": { + "name": "counter_rarity", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_outcome": { + "name": "counter_outcome", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_headline": { + "name": "counter_headline", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_narrative": { + "name": "counter_narrative", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_impact": { + "name": "counter_impact", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_dignity_remaining": { + "name": "counter_dignity_remaining", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_fish_condition": { + "name": "counter_fish_condition", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "counter_image_url": { + "name": "counter_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "countered_at": { + "name": "countered_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "appealed_by_id": { + "name": "appealed_by_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "appeal_ruling": { + "name": "appeal_ruling", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "appealed_at": { + "name": "appealed_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + } + }, + "indexes": { + "slap_events_interaction_id_unique": { + "name": "slap_events_interaction_id_unique", + "columns": [ + "interaction_id" + ], + "isUnique": true + }, + "idx_slap_events_actor_cooldown": { + "name": "idx_slap_events_actor_cooldown", + "columns": [ + "guild_id", + "actor_id", + "created_at" + ], + "isUnique": false + }, + "idx_slap_events_target_cooldown": { + "name": "idx_slap_events_target_cooldown", + "columns": [ + "guild_id", + "target_id", + "created_at" + ], + "isUnique": false + }, + "idx_slap_events_channel_cooldown": { + "name": "idx_slap_events_channel_cooldown", + "columns": [ + "guild_id", + "channel_id", + "created_at" + ], + "isUnique": false + }, + "idx_slap_events_message": { + "name": "idx_slap_events_message", + "columns": [ + "guild_id", + "channel_id", + "message_id" + ], + "isUnique": false + }, + "idx_slap_events_outcome": { + "name": "idx_slap_events_outcome", + "columns": [ + "outcome" + ], + "isUnique": false + }, + "idx_slap_events_rarity": { + "name": "idx_slap_events_rarity", + "columns": [ + "rarity" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tracked_threads": { + "name": "tracked_threads", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "thread_id": { + "name": "thread_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_checked": { + "name": "last_checked", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "solved": { + "name": "solved", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "warning_level": { + "name": "warning_level", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "closed": { + "name": "closed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_message_count": { + "name": "last_message_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "received_at": { + "name": "received_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))" + }, + "raw_payload": { + "name": "raw_payload", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "tracked_threads_thread_id_unique": { + "name": "tracked_threads_thread_id_unique", + "columns": [ + "thread_id" + ], + "isUnique": true + }, + "idx_tracked_threads_solved": { + "name": "idx_tracked_threads_solved", + "columns": [ + "solved" + ], + "isUnique": false + }, + "idx_tracked_threads_last_checked": { + "name": "idx_tracked_threads_last_checked", + "columns": [ + "last_checked" + ], + "isUnique": false + }, + "idx_tracked_threads_received_at": { + "name": "idx_tracked_threads_received_at", + "columns": [ + "received_at" + ], + "isUnique": false + }, + "idx_tracked_threads_closed": { + "name": "idx_tracked_threads_closed", + "columns": [ + "closed" + ], + "isUnique": false + }, + "idx_tracked_threads_warning_level": { + "name": "idx_tracked_threads_warning_level", + "columns": [ + "warning_level" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 218dae8..44dd1a4 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -92,6 +92,13 @@ "when": 1784999050821, "tag": "0012_remove_form_review_locks", "breakpoints": true + }, + { + "idx": 13, + "version": "6", + "when": 1789607963897, + "tag": "0013_lively_umar", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/commands/review.ts b/src/commands/review.ts new file mode 100644 index 0000000..a797d4c --- /dev/null +++ b/src/commands/review.ts @@ -0,0 +1,208 @@ +import { + ApplicationCommandOptionType, + ApplicationIntegrationType, + Button, + type CommandInteraction, + Container, + InteractionContextType, + Row, + Separator, + TextDisplay +} from "@buape/carbon" +import BaseCommand from "./base.js" +import { reviewConfig } from "../config/review.js" +import { + createReviewCase, + getRecentUserObservations, + getReviewCase +} from "../data/review.js" +import { analyze } from "../review/analyzer.js" +import { evaluateWithKrill } from "../review/krillEvaluator.js" +import { + ReviewConfirmBotButton, + ReviewDismissButton, + ReviewWatchlistButton +} from "../components/reviewButtons.js" + +const hasStaffRole = (interaction: CommandInteraction) => + interaction.member?.roles.some((role) => + (reviewConfig.staffRoleIds as readonly string[]).includes(role.id) + ) ?? false + +export default class ReviewCommand extends BaseCommand { + name = "review" + description = "Run automation & AI behavioral review on a user" + defer = true + ephemeral = true + contexts = [InteractionContextType.Guild] + integrationTypes = [ApplicationIntegrationType.GuildInstall] + + options = [ + { + type: ApplicationCommandOptionType.User as const, + name: "user", + description: "The user to evaluate", + required: true + }, + { + type: ApplicationCommandOptionType.Boolean as const, + name: "krill", + description: + "Request deep Krill evaluation using gpt-6-astra low-thinking", + required: false + } + ] + + async run(interaction: CommandInteraction) { + if (!hasStaffRole(interaction)) { + await interaction.reply({ + components: [ + new Container( + [ + new TextDisplay("### Staff role required"), + new TextDisplay( + "You need Community Team or Maintainer role to use this command." + ) + ], + { accentColor: "#f85149" } + ) + ], + ephemeral: true + }) + return + } + + const guildId = interaction.guild?.id + if (!guildId) { + await interaction.reply({ + content: "This command can only be used in a server.", + ephemeral: true + }) + return + } + + const targetUserId = interaction.options.getString("user", true) + const forceKrill = + interaction.options.getBoolean("krill", false) ?? false + + const observations = await getRecentUserObservations( + guildId, + targetUserId, + reviewConfig.windowDays, + reviewConfig.maxObservationsPerSample + ) + + if (observations.length === 0) { + await interaction.reply({ + components: [ + new Container( + [ + new TextDisplay("### 🦞 Claw & Order | Automation Review"), + new TextDisplay(`**Target:** <@${targetUserId}>`), + new TextDisplay( + `No messages observed for this user in the last ${reviewConfig.windowDays} days.` + ) + ], + { accentColor: "#8b949e" } + ) + ], + ephemeral: true + }) + return + } + + const now = Date.now() + const windowStart = now - reviewConfig.windowDays * 86400000 + const report = analyze({ + guildId, + authorId: targetUserId, + startAt: windowStart, + endAt: now, + messages: observations, + scoreGate: { minMessages: 10, minSpanMs: 60000 } + }) + + let krill = null + if (report.priority === "review-recommended" || forceKrill) { + krill = await evaluateWithKrill(report) + } + + const caseId = `case-${guildId}-${targetUserId}` + let reviewCase = await getReviewCase(caseId) + + if (report.priority === "review-recommended" || forceKrill || reviewCase) { + reviewCase = await createReviewCase({ + caseId, + guildId, + targetUserId, + status: reviewCase?.status || (report.priority === "review-recommended" ? "escalated" : "open"), + heuristicScore: report.heuristicScore ?? 0, + concordance: report.concordance, + behavioralFamilies: JSON.stringify(Object.keys(report.familyScores)), + evidenceMessageId: observations[0]?.messageId, + krillProbability: krill + ? `${(krill.automationProbability * 100).toFixed(1)}%` + : reviewCase?.krillProbability ?? null, + krillBrief: krill?.brief ?? reviewCase?.krillBrief ?? null, + krillModel: krill?.model ?? reviewCase?.krillModel ?? null, + reviewChannelId: reviewConfig.reviewChannelId + }) + } + + const accentColor = + report.priority === "review-recommended" + ? "#f85149" + : report.priority === "some-indicators" + ? "#d29922" + : "#3fb950" + + const cardSections: (TextDisplay | Separator | Row