fourth-spark 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ const { spawn } = require("child_process")
3
+ const { join, dirname } = require("path")
4
+
5
+ const pkg = dirname(__dirname)
6
+ const bin = join(pkg, "fourth-spark")
7
+ const child = spawn(bin, process.argv.slice(2), { stdio: "inherit" })
8
+ child.on("exit", (code) => process.exit(code ?? 1))
@@ -0,0 +1,20 @@
1
+ services:
2
+ postgres:
3
+ image: postgres:16-alpine
4
+ container_name: fourth-spark-db
5
+ ports:
6
+ - "5432:5432"
7
+ environment:
8
+ POSTGRES_USER: fourth_spark
9
+ POSTGRES_PASSWORD: fourth_spark
10
+ POSTGRES_DB: fourth_spark
11
+ volumes:
12
+ - pgdata:/var/lib/postgresql/data
13
+ healthcheck:
14
+ test: ["CMD", "pg_isready", "-U", "fourth_spark"]
15
+ interval: 5s
16
+ timeout: 3s
17
+ retries: 5
18
+
19
+ volumes:
20
+ pgdata:
@@ -0,0 +1,61 @@
1
+ CREATE TABLE "messages" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "session_id" text NOT NULL,
4
+ "role" text NOT NULL,
5
+ "agent" text,
6
+ "model" text,
7
+ "provider" text,
8
+ "variant" text,
9
+ "cost" real,
10
+ "time_created" bigint NOT NULL,
11
+ "time_updated" bigint NOT NULL
12
+ );
13
+ --> statement-breakpoint
14
+ CREATE TABLE "parts" (
15
+ "id" text PRIMARY KEY NOT NULL,
16
+ "message_id" text NOT NULL,
17
+ "session_id" text NOT NULL,
18
+ "type" text NOT NULL,
19
+ "data" jsonb NOT NULL,
20
+ "time_created" bigint NOT NULL,
21
+ "time_updated" bigint NOT NULL
22
+ );
23
+ --> statement-breakpoint
24
+ CREATE TABLE "sessions" (
25
+ "id" text PRIMARY KEY NOT NULL,
26
+ "parent_id" text,
27
+ "title" text DEFAULT '' NOT NULL,
28
+ "agent" text,
29
+ "model" jsonb,
30
+ "directory" text,
31
+ "cost" real DEFAULT 0 NOT NULL,
32
+ "tokens_input" bigint DEFAULT 0 NOT NULL,
33
+ "tokens_output" bigint DEFAULT 0 NOT NULL,
34
+ "tokens_reasoning" bigint DEFAULT 0 NOT NULL,
35
+ "tokens_cache_read" bigint DEFAULT 0 NOT NULL,
36
+ "tokens_cache_write" bigint DEFAULT 0 NOT NULL,
37
+ "user_id" text,
38
+ "time_created" bigint NOT NULL,
39
+ "time_updated" bigint NOT NULL
40
+ );
41
+ --> statement-breakpoint
42
+ CREATE TABLE "todos" (
43
+ "session_id" text NOT NULL,
44
+ "position" integer NOT NULL,
45
+ "content" text NOT NULL,
46
+ "status" text NOT NULL,
47
+ "priority" text DEFAULT 'medium' NOT NULL,
48
+ "time_created" bigint NOT NULL,
49
+ "time_updated" bigint NOT NULL,
50
+ CONSTRAINT "todos_session_id_position_pk" PRIMARY KEY("session_id","position")
51
+ );
52
+ --> statement-breakpoint
53
+ ALTER TABLE "messages" ADD CONSTRAINT "messages_session_id_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
54
+ ALTER TABLE "parts" ADD CONSTRAINT "parts_message_id_messages_id_fk" FOREIGN KEY ("message_id") REFERENCES "public"."messages"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
55
+ ALTER TABLE "parts" ADD CONSTRAINT "parts_session_id_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
56
+ ALTER TABLE "todos" ADD CONSTRAINT "todos_session_id_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
57
+ CREATE INDEX "messages_session_idx" ON "messages" USING btree ("session_id","time_created");--> statement-breakpoint
58
+ CREATE INDEX "parts_message_idx" ON "parts" USING btree ("message_id");--> statement-breakpoint
59
+ CREATE INDEX "parts_session_idx" ON "parts" USING btree ("session_id");--> statement-breakpoint
60
+ CREATE INDEX "sessions_user_idx" ON "sessions" USING btree ("user_id");--> statement-breakpoint
61
+ CREATE INDEX "sessions_time_created_idx" ON "sessions" USING btree ("time_created");
@@ -0,0 +1,12 @@
1
+ CREATE TABLE "repos" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "name" text NOT NULL,
4
+ "git_url" text NOT NULL,
5
+ "local_path" text NOT NULL,
6
+ "port" integer,
7
+ "status" text DEFAULT 'inactive' NOT NULL,
8
+ "created_at" bigint NOT NULL,
9
+ "updated_at" bigint NOT NULL
10
+ );
11
+ --> statement-breakpoint
12
+ CREATE UNIQUE INDEX "repos_local_path_idx" ON "repos" USING btree ("local_path");
@@ -0,0 +1,91 @@
1
+ CREATE TABLE "custom_agent_fragments" (
2
+ "custom_agent_id" text NOT NULL,
3
+ "fragment_id" text NOT NULL,
4
+ "position" integer DEFAULT 0 NOT NULL,
5
+ CONSTRAINT "custom_agent_fragments_custom_agent_id_fragment_id_pk" PRIMARY KEY("custom_agent_id","fragment_id")
6
+ );
7
+ --> statement-breakpoint
8
+ CREATE TABLE "custom_agents" (
9
+ "id" text PRIMARY KEY NOT NULL,
10
+ "name" text NOT NULL,
11
+ "base_agent" text NOT NULL,
12
+ "model" text,
13
+ "system_prompt" text DEFAULT '' NOT NULL,
14
+ "repo_id" text,
15
+ "sort_order" integer DEFAULT 0 NOT NULL,
16
+ "created_at" bigint NOT NULL,
17
+ "updated_at" bigint NOT NULL
18
+ );
19
+ --> statement-breakpoint
20
+ CREATE TABLE "git_hosts" (
21
+ "id" text PRIMARY KEY NOT NULL,
22
+ "host" text NOT NULL,
23
+ "platform" text DEFAULT 'gitea' NOT NULL,
24
+ "name" text NOT NULL,
25
+ "token" text NOT NULL,
26
+ "created_at" bigint NOT NULL,
27
+ "updated_at" bigint NOT NULL
28
+ );
29
+ --> statement-breakpoint
30
+ CREATE TABLE "issue_comments" (
31
+ "id" text PRIMARY KEY NOT NULL,
32
+ "issue_id" text NOT NULL,
33
+ "repo_id" text NOT NULL,
34
+ "author_login" text NOT NULL,
35
+ "author_avatar" text,
36
+ "body" text NOT NULL,
37
+ "created_at" bigint NOT NULL,
38
+ "updated_at" bigint NOT NULL
39
+ );
40
+ --> statement-breakpoint
41
+ CREATE TABLE "issues" (
42
+ "id" text PRIMARY KEY NOT NULL,
43
+ "repo_id" text NOT NULL,
44
+ "parent_id" text,
45
+ "number" integer NOT NULL,
46
+ "title" text NOT NULL,
47
+ "body" text,
48
+ "state" text DEFAULT 'open' NOT NULL,
49
+ "labels" jsonb,
50
+ "html_url" text,
51
+ "created_at" bigint NOT NULL,
52
+ "updated_at" bigint NOT NULL
53
+ );
54
+ --> statement-breakpoint
55
+ CREATE TABLE "prompt_fragments" (
56
+ "id" text PRIMARY KEY NOT NULL,
57
+ "name" text NOT NULL,
58
+ "content" text DEFAULT '' NOT NULL,
59
+ "repo_id" text,
60
+ "sort_order" integer DEFAULT 0 NOT NULL,
61
+ "created_at" bigint NOT NULL,
62
+ "updated_at" bigint NOT NULL
63
+ );
64
+ --> statement-breakpoint
65
+ CREATE TABLE "settings" (
66
+ "key" text PRIMARY KEY NOT NULL,
67
+ "value" text NOT NULL,
68
+ "updated_at" bigint NOT NULL
69
+ );
70
+ --> statement-breakpoint
71
+ ALTER TABLE "sessions" ADD COLUMN "issue_id" text;--> statement-breakpoint
72
+ ALTER TABLE "sessions" ADD COLUMN "custom_agent_id" text;--> statement-breakpoint
73
+ ALTER TABLE "custom_agent_fragments" ADD CONSTRAINT "custom_agent_fragments_custom_agent_id_custom_agents_id_fk" FOREIGN KEY ("custom_agent_id") REFERENCES "public"."custom_agents"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
74
+ ALTER TABLE "custom_agent_fragments" ADD CONSTRAINT "custom_agent_fragments_fragment_id_prompt_fragments_id_fk" FOREIGN KEY ("fragment_id") REFERENCES "public"."prompt_fragments"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
75
+ ALTER TABLE "custom_agents" ADD CONSTRAINT "custom_agents_repo_id_repos_id_fk" FOREIGN KEY ("repo_id") REFERENCES "public"."repos"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
76
+ ALTER TABLE "issue_comments" ADD CONSTRAINT "issue_comments_issue_id_issues_id_fk" FOREIGN KEY ("issue_id") REFERENCES "public"."issues"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
77
+ ALTER TABLE "issue_comments" ADD CONSTRAINT "issue_comments_repo_id_repos_id_fk" FOREIGN KEY ("repo_id") REFERENCES "public"."repos"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
78
+ ALTER TABLE "issues" ADD CONSTRAINT "issues_repo_id_repos_id_fk" FOREIGN KEY ("repo_id") REFERENCES "public"."repos"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
79
+ ALTER TABLE "prompt_fragments" ADD CONSTRAINT "prompt_fragments_repo_id_repos_id_fk" FOREIGN KEY ("repo_id") REFERENCES "public"."repos"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
80
+ CREATE INDEX "custom_agents_repo_idx" ON "custom_agents" USING btree ("repo_id");--> statement-breakpoint
81
+ CREATE UNIQUE INDEX "git_hosts_host_idx" ON "git_hosts" USING btree ("host");--> statement-breakpoint
82
+ CREATE INDEX "issue_comments_issue_idx" ON "issue_comments" USING btree ("issue_id");--> statement-breakpoint
83
+ CREATE INDEX "issue_comments_repo_idx" ON "issue_comments" USING btree ("repo_id");--> statement-breakpoint
84
+ CREATE UNIQUE INDEX "issues_repo_number_idx" ON "issues" USING btree ("repo_id","number");--> statement-breakpoint
85
+ CREATE INDEX "issues_repo_state_idx" ON "issues" USING btree ("repo_id","state");--> statement-breakpoint
86
+ CREATE INDEX "issues_parent_idx" ON "issues" USING btree ("parent_id");--> statement-breakpoint
87
+ CREATE INDEX "prompt_fragments_repo_idx" ON "prompt_fragments" USING btree ("repo_id");--> statement-breakpoint
88
+ ALTER TABLE "sessions" ADD CONSTRAINT "sessions_issue_id_issues_id_fk" FOREIGN KEY ("issue_id") REFERENCES "public"."issues"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
89
+ ALTER TABLE "sessions" ADD CONSTRAINT "sessions_custom_agent_id_custom_agents_id_fk" FOREIGN KEY ("custom_agent_id") REFERENCES "public"."custom_agents"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
90
+ CREATE INDEX "sessions_issue_idx" ON "sessions" USING btree ("issue_id");--> statement-breakpoint
91
+ CREATE INDEX "sessions_custom_agent_idx" ON "sessions" USING btree ("custom_agent_id");
@@ -0,0 +1,51 @@
1
+ CREATE TABLE "device_tokens" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "token" text NOT NULL,
4
+ "platform" text DEFAULT 'ios' NOT NULL,
5
+ "created_at" bigint NOT NULL,
6
+ "updated_at" bigint NOT NULL
7
+ );
8
+ --> statement-breakpoint
9
+ CREATE TABLE "issue_tags" (
10
+ "issue_id" text NOT NULL,
11
+ "tag_id" text NOT NULL,
12
+ CONSTRAINT "issue_tags_issue_id_tag_id_pk" PRIMARY KEY("issue_id","tag_id")
13
+ );
14
+ --> statement-breakpoint
15
+ CREATE TABLE "milestones" (
16
+ "id" text PRIMARY KEY NOT NULL,
17
+ "repo_id" text NOT NULL,
18
+ "number" integer NOT NULL,
19
+ "title" text NOT NULL,
20
+ "description" text,
21
+ "state" text DEFAULT 'open' NOT NULL,
22
+ "due_on" bigint,
23
+ "open_issues" integer DEFAULT 0 NOT NULL,
24
+ "closed_issues" integer DEFAULT 0 NOT NULL,
25
+ "created_at" bigint NOT NULL,
26
+ "updated_at" bigint NOT NULL
27
+ );
28
+ --> statement-breakpoint
29
+ CREATE TABLE "tags" (
30
+ "id" text PRIMARY KEY NOT NULL,
31
+ "repo_id" text NOT NULL,
32
+ "name" text NOT NULL,
33
+ "color" text DEFAULT '6b7280' NOT NULL,
34
+ "description" text,
35
+ "created_at" bigint NOT NULL
36
+ );
37
+ --> statement-breakpoint
38
+ ALTER TABLE "custom_agents" ADD COLUMN "system_prompt_position" integer DEFAULT -1 NOT NULL;--> statement-breakpoint
39
+ ALTER TABLE "issues" ADD COLUMN "milestone_id" text;--> statement-breakpoint
40
+ ALTER TABLE "issue_tags" ADD CONSTRAINT "issue_tags_issue_id_issues_id_fk" FOREIGN KEY ("issue_id") REFERENCES "public"."issues"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
41
+ ALTER TABLE "issue_tags" ADD CONSTRAINT "issue_tags_tag_id_tags_id_fk" FOREIGN KEY ("tag_id") REFERENCES "public"."tags"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
42
+ ALTER TABLE "milestones" ADD CONSTRAINT "milestones_repo_id_repos_id_fk" FOREIGN KEY ("repo_id") REFERENCES "public"."repos"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
43
+ ALTER TABLE "tags" ADD CONSTRAINT "tags_repo_id_repos_id_fk" FOREIGN KEY ("repo_id") REFERENCES "public"."repos"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
44
+ CREATE UNIQUE INDEX "device_tokens_token_idx" ON "device_tokens" USING btree ("token");--> statement-breakpoint
45
+ CREATE INDEX "issue_tags_tag_idx" ON "issue_tags" USING btree ("tag_id");--> statement-breakpoint
46
+ CREATE UNIQUE INDEX "milestones_repo_number_idx" ON "milestones" USING btree ("repo_id","number");--> statement-breakpoint
47
+ CREATE INDEX "milestones_repo_idx" ON "milestones" USING btree ("repo_id");--> statement-breakpoint
48
+ CREATE UNIQUE INDEX "tags_repo_name_idx" ON "tags" USING btree ("repo_id","name");--> statement-breakpoint
49
+ CREATE INDEX "tags_repo_idx" ON "tags" USING btree ("repo_id");--> statement-breakpoint
50
+ ALTER TABLE "issues" ADD CONSTRAINT "issues_milestone_id_milestones_id_fk" FOREIGN KEY ("milestone_id") REFERENCES "public"."milestones"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
51
+ CREATE INDEX "issues_milestone_idx" ON "issues" USING btree ("milestone_id");
@@ -0,0 +1,50 @@
1
+ CREATE TABLE "pr_issue_links" (
2
+ "pr_id" text NOT NULL,
3
+ "issue_id" text NOT NULL,
4
+ CONSTRAINT "pr_issue_links_pr_id_issue_id_pk" PRIMARY KEY("pr_id","issue_id")
5
+ );
6
+ --> statement-breakpoint
7
+ CREATE TABLE "pull_requests" (
8
+ "id" text PRIMARY KEY NOT NULL,
9
+ "repo_id" text NOT NULL,
10
+ "number" integer NOT NULL,
11
+ "title" text NOT NULL,
12
+ "body" text,
13
+ "state" text DEFAULT 'open' NOT NULL,
14
+ "head_branch" text NOT NULL,
15
+ "base_branch" text NOT NULL,
16
+ "labels" jsonb,
17
+ "html_url" text,
18
+ "author_login" text,
19
+ "author_avatar" text,
20
+ "assignees" jsonb,
21
+ "mergeable" text,
22
+ "draft" integer DEFAULT 0 NOT NULL,
23
+ "comment_count" integer DEFAULT 0 NOT NULL,
24
+ "created_at" bigint NOT NULL,
25
+ "updated_at" bigint NOT NULL,
26
+ "merged_at" bigint
27
+ );
28
+ --> statement-breakpoint
29
+ CREATE TABLE "session_links" (
30
+ "session_id" text NOT NULL,
31
+ "type" text NOT NULL,
32
+ "target_id" text NOT NULL,
33
+ "created_at" bigint NOT NULL,
34
+ CONSTRAINT "session_links_session_id_type_target_id_pk" PRIMARY KEY("session_id","type","target_id")
35
+ );
36
+ --> statement-breakpoint
37
+ ALTER TABLE "custom_agents" ADD COLUMN "is_system" integer DEFAULT 0 NOT NULL;--> statement-breakpoint
38
+ ALTER TABLE "issues" ADD COLUMN "author_login" text;--> statement-breakpoint
39
+ ALTER TABLE "issues" ADD COLUMN "author_avatar" text;--> statement-breakpoint
40
+ ALTER TABLE "issues" ADD COLUMN "assignees" jsonb;--> statement-breakpoint
41
+ ALTER TABLE "issues" ADD COLUMN "comment_count" integer DEFAULT 0 NOT NULL;--> statement-breakpoint
42
+ ALTER TABLE "pr_issue_links" ADD CONSTRAINT "pr_issue_links_pr_id_pull_requests_id_fk" FOREIGN KEY ("pr_id") REFERENCES "public"."pull_requests"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
43
+ ALTER TABLE "pr_issue_links" ADD CONSTRAINT "pr_issue_links_issue_id_issues_id_fk" FOREIGN KEY ("issue_id") REFERENCES "public"."issues"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
44
+ ALTER TABLE "pull_requests" ADD CONSTRAINT "pull_requests_repo_id_repos_id_fk" FOREIGN KEY ("repo_id") REFERENCES "public"."repos"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
45
+ ALTER TABLE "session_links" ADD CONSTRAINT "session_links_session_id_sessions_id_fk" FOREIGN KEY ("session_id") REFERENCES "public"."sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
46
+ CREATE INDEX "pr_issue_links_issue_idx" ON "pr_issue_links" USING btree ("issue_id");--> statement-breakpoint
47
+ CREATE UNIQUE INDEX "pull_requests_repo_number_idx" ON "pull_requests" USING btree ("repo_id","number");--> statement-breakpoint
48
+ CREATE INDEX "pull_requests_repo_state_idx" ON "pull_requests" USING btree ("repo_id","state");--> statement-breakpoint
49
+ CREATE INDEX "session_links_session_idx" ON "session_links" USING btree ("session_id");--> statement-breakpoint
50
+ CREATE INDEX "session_links_target_idx" ON "session_links" USING btree ("type","target_id");