Brings the backend from a scaffold to a working end-to-end MVP — real auth, persistent actor registry, Anthropic tool-use loop in the Grow Agent, and per-user Gitea+OpenCode provisioning. Also adds the client-facing architecture diagram under docs/architecture.html.
81 lines
3.4 KiB
SQL
81 lines
3.4 KiB
SQL
CREATE TABLE "actors" (
|
|
"actor_id" text NOT NULL,
|
|
"user_id" text NOT NULL,
|
|
"kind" text NOT NULL,
|
|
"sub_type" text,
|
|
"status" text DEFAULT 'idle' NOT NULL,
|
|
"channel_id" text,
|
|
"parent_actor_id" text,
|
|
"last_activity_at" timestamp with time zone,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
CONSTRAINT "actors_user_id_actor_id_pk" PRIMARY KEY("user_id","actor_id")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "events" (
|
|
"id" text PRIMARY KEY DEFAULT gen_random_uuid()::text NOT NULL,
|
|
"user_id" text NOT NULL,
|
|
"actor_id" text,
|
|
"type" text NOT NULL,
|
|
"payload" jsonb,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "opencode_sessions" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"user_id" text NOT NULL,
|
|
"actor_id" text,
|
|
"title" text,
|
|
"parent_id" text,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "repos" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"user_id" text NOT NULL,
|
|
"name" text NOT NULL,
|
|
"role" text NOT NULL,
|
|
"gitea_owner" text NOT NULL,
|
|
"gitea_name" text NOT NULL,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "user_stacks" (
|
|
"user_id" text PRIMARY KEY NOT NULL,
|
|
"status" text DEFAULT 'provisioning' NOT NULL,
|
|
"gitea_container_id" text,
|
|
"gitea_container_name" text,
|
|
"gitea_host" text,
|
|
"gitea_http_port" integer,
|
|
"gitea_ssh_port" integer,
|
|
"gitea_admin_user" text,
|
|
"gitea_admin_token" text,
|
|
"gitea_memory_repo" text,
|
|
"opencode_container_id" text,
|
|
"opencode_container_name" text,
|
|
"opencode_host" text,
|
|
"opencode_port" integer,
|
|
"opencode_password" text,
|
|
"workspace_path" text,
|
|
"last_error" text,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "users" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"email" text NOT NULL,
|
|
"display_name" text,
|
|
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "actors" ADD CONSTRAINT "actors_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "opencode_sessions" ADD CONSTRAINT "opencode_sessions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "repos" ADD CONSTRAINT "repos_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "user_stacks" ADD CONSTRAINT "user_stacks_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
CREATE INDEX "actors_user_kind_idx" ON "actors" USING btree ("user_id","kind");--> statement-breakpoint
|
|
CREATE INDEX "events_user_idx" ON "events" USING btree ("user_id","created_at");--> statement-breakpoint
|
|
CREATE INDEX "opencode_sessions_user_idx" ON "opencode_sessions" USING btree ("user_id");--> statement-breakpoint
|
|
CREATE INDEX "repos_user_role_idx" ON "repos" USING btree ("user_id","role");--> statement-breakpoint
|
|
CREATE INDEX "user_stacks_status_idx" ON "user_stacks" USING btree ("status");--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "users_email_idx" ON "users" USING btree ("email"); |