@stackbone/sdk 0.1.0-alpha.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/CHANGELOG.md +34 -0
- package/README.md +693 -0
- package/db/index.cjs +21 -0
- package/db/index.cjs.map +1 -0
- package/db/index.d.cts +3 -0
- package/db/index.d.ts +3 -0
- package/db/index.js +4 -0
- package/db/index.js.map +1 -0
- package/db/testing/index.cjs +83 -0
- package/db/testing/index.cjs.map +1 -0
- package/db/testing/index.d.cts +48 -0
- package/db/testing/index.d.ts +48 -0
- package/db/testing/index.js +77 -0
- package/db/testing/index.js.map +1 -0
- package/index.cjs +19977 -0
- package/index.cjs.map +1 -0
- package/index.d.cts +1325 -0
- package/index.d.ts +1325 -0
- package/index.js +19961 -0
- package/index.js.map +1 -0
- package/package.json +108 -0
- package/queues/types.cjs +4 -0
- package/queues/types.cjs.map +1 -0
- package/queues/types.d.cts +14 -0
- package/queues/types.d.ts +14 -0
- package/queues/types.js +3 -0
- package/queues/types.js.map +1 -0
- package/rag/migrations/index.cjs +71 -0
- package/rag/migrations/index.cjs.map +1 -0
- package/rag/migrations/index.d.cts +29 -0
- package/rag/migrations/index.d.ts +29 -0
- package/rag/migrations/index.js +66 -0
- package/rag/migrations/index.js.map +1 -0
- package/rag/schema.cjs +124 -0
- package/rag/schema.cjs.map +1 -0
- package/rag/schema.d.cts +446 -0
- package/rag/schema.d.ts +446 -0
- package/rag/schema.js +96 -0
- package/rag/schema.js.map +1 -0
- package/stackbone-sdk-0.1.0-alpha.0.tgz +0 -0
package/package.json
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stackbone/sdk",
|
|
3
|
+
"version": "0.1.0-alpha.0",
|
|
4
|
+
"license": "UNLICENSED",
|
|
5
|
+
"description": "Official TypeScript SDK for Stackbone — the marketplace and managed runtime for containerized AI agents.",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./index.cjs",
|
|
8
|
+
"module": "./index.js",
|
|
9
|
+
"types": "./index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./index.d.ts",
|
|
14
|
+
"default": "./index.js"
|
|
15
|
+
},
|
|
16
|
+
"require": {
|
|
17
|
+
"types": "./index.d.cts",
|
|
18
|
+
"default": "./index.cjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"./db": {
|
|
22
|
+
"import": {
|
|
23
|
+
"types": "./db/index.d.ts",
|
|
24
|
+
"default": "./db/index.js"
|
|
25
|
+
},
|
|
26
|
+
"require": {
|
|
27
|
+
"types": "./db/index.d.cts",
|
|
28
|
+
"default": "./db/index.cjs"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"./db/testing": {
|
|
32
|
+
"import": {
|
|
33
|
+
"types": "./db/testing/index.d.ts",
|
|
34
|
+
"default": "./db/testing/index.js"
|
|
35
|
+
},
|
|
36
|
+
"require": {
|
|
37
|
+
"types": "./db/testing/index.d.cts",
|
|
38
|
+
"default": "./db/testing/index.cjs"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"./queues/types": {
|
|
42
|
+
"import": {
|
|
43
|
+
"types": "./queues/types.d.ts",
|
|
44
|
+
"default": "./queues/types.js"
|
|
45
|
+
},
|
|
46
|
+
"require": {
|
|
47
|
+
"types": "./queues/types.d.cts",
|
|
48
|
+
"default": "./queues/types.cjs"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"./rag/migrations": {
|
|
52
|
+
"import": {
|
|
53
|
+
"types": "./rag/migrations/index.d.ts",
|
|
54
|
+
"default": "./rag/migrations/index.js"
|
|
55
|
+
},
|
|
56
|
+
"require": {
|
|
57
|
+
"types": "./rag/migrations/index.d.cts",
|
|
58
|
+
"default": "./rag/migrations/index.cjs"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"./rag/schema": {
|
|
62
|
+
"import": {
|
|
63
|
+
"types": "./rag/schema.d.ts",
|
|
64
|
+
"default": "./rag/schema.js"
|
|
65
|
+
},
|
|
66
|
+
"require": {
|
|
67
|
+
"types": "./rag/schema.d.cts",
|
|
68
|
+
"default": "./rag/schema.cjs"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"./package.json": "./package.json"
|
|
72
|
+
},
|
|
73
|
+
"engines": {
|
|
74
|
+
"node": ">=24"
|
|
75
|
+
},
|
|
76
|
+
"publishConfig": {
|
|
77
|
+
"access": "public"
|
|
78
|
+
},
|
|
79
|
+
"repository": {
|
|
80
|
+
"type": "git",
|
|
81
|
+
"url": "git+https://github.com/stackbone/stackbone.git",
|
|
82
|
+
"directory": "libs/sdk"
|
|
83
|
+
},
|
|
84
|
+
"homepage": "https://stackbone.ai",
|
|
85
|
+
"bugs": {
|
|
86
|
+
"url": "https://github.com/stackbone/stackbone/issues"
|
|
87
|
+
},
|
|
88
|
+
"keywords": [
|
|
89
|
+
"stackbone",
|
|
90
|
+
"ai-agents",
|
|
91
|
+
"agent-sdk",
|
|
92
|
+
"containerized-agents",
|
|
93
|
+
"openrouter",
|
|
94
|
+
"rag",
|
|
95
|
+
"pgvector",
|
|
96
|
+
"drizzle",
|
|
97
|
+
"openai",
|
|
98
|
+
"postgres"
|
|
99
|
+
],
|
|
100
|
+
"dependencies": {
|
|
101
|
+
"@aws-sdk/client-s3": "^3.1038.0",
|
|
102
|
+
"@aws-sdk/s3-request-presigner": "^3.1038.0",
|
|
103
|
+
"drizzle-orm": "0.45.2",
|
|
104
|
+
"openai": "^4.104.0",
|
|
105
|
+
"postgres": "3.4.9",
|
|
106
|
+
"unpdf": "^0.12.1"
|
|
107
|
+
}
|
|
108
|
+
}
|
package/queues/types.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"types.cjs"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of typed queue jobs. Consumers extend this interface via module
|
|
3
|
+
* augmentation so publisher and receiver share payload shapes:
|
|
4
|
+
*
|
|
5
|
+
* declare module '@stackbone/sdk/queues/types' {
|
|
6
|
+
* interface QueueJobs {
|
|
7
|
+
* 'send-email': { to: string; templateId: string };
|
|
8
|
+
* }
|
|
9
|
+
* }
|
|
10
|
+
*/
|
|
11
|
+
interface QueueJobs {
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type { QueueJobs };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of typed queue jobs. Consumers extend this interface via module
|
|
3
|
+
* augmentation so publisher and receiver share payload shapes:
|
|
4
|
+
*
|
|
5
|
+
* declare module '@stackbone/sdk/queues/types' {
|
|
6
|
+
* interface QueueJobs {
|
|
7
|
+
* 'send-email': { to: string; templateId: string };
|
|
8
|
+
* }
|
|
9
|
+
* }
|
|
10
|
+
*/
|
|
11
|
+
interface QueueJobs {
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type { QueueJobs };
|
package/queues/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"types.js"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/modules/rag/migrations/index.ts
|
|
4
|
+
var STACKBONE_RAG_MARKER_PREFIX = "-- @stackbone:rag@";
|
|
5
|
+
var STACKBONE_RAG_MARKER_REGEX = /^-- @stackbone:rag@v(\d+)$/;
|
|
6
|
+
var STACKBONE_RAG_V1_FILENAME_SUFFIX = "stackbone_rag_v1.sql";
|
|
7
|
+
var STACKBONE_RAG_V1_SQL = `-- @stackbone:rag@v1
|
|
8
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
9
|
+
--> statement-breakpoint
|
|
10
|
+
CREATE TABLE "stackbone_rag_collections" (
|
|
11
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
12
|
+
"name" text NOT NULL,
|
|
13
|
+
"metadata" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
14
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
15
|
+
CONSTRAINT "stackbone_rag_collections_name_unique" UNIQUE("name")
|
|
16
|
+
);
|
|
17
|
+
--> statement-breakpoint
|
|
18
|
+
CREATE TABLE "stackbone_rag_documents" (
|
|
19
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
20
|
+
"collection_id" uuid NOT NULL,
|
|
21
|
+
"source" text NOT NULL,
|
|
22
|
+
"content_hash" text NOT NULL,
|
|
23
|
+
"metadata" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
24
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
25
|
+
);
|
|
26
|
+
--> statement-breakpoint
|
|
27
|
+
CREATE TABLE "stackbone_rag_chunks" (
|
|
28
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
29
|
+
"document_id" uuid NOT NULL,
|
|
30
|
+
"ordinal" integer NOT NULL,
|
|
31
|
+
"content" text NOT NULL,
|
|
32
|
+
"embedding" vector(1536) NOT NULL,
|
|
33
|
+
"metadata" jsonb DEFAULT '{}'::jsonb NOT NULL
|
|
34
|
+
);
|
|
35
|
+
--> statement-breakpoint
|
|
36
|
+
CREATE TABLE "stackbone_rag_jobs" (
|
|
37
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
38
|
+
"collection_id" uuid NOT NULL,
|
|
39
|
+
"status" text DEFAULT 'queued' NOT NULL,
|
|
40
|
+
"progress" jsonb DEFAULT '{"totalChunks":0,"processedChunks":0}'::jsonb NOT NULL,
|
|
41
|
+
"error" text,
|
|
42
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
43
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
44
|
+
CONSTRAINT "stackbone_rag_jobs_status_check" CHECK ("status" IN ('queued','running','succeeded','failed','cancelled'))
|
|
45
|
+
);
|
|
46
|
+
--> statement-breakpoint
|
|
47
|
+
ALTER TABLE "stackbone_rag_documents" ADD CONSTRAINT "stackbone_rag_documents_collection_id_fk" FOREIGN KEY ("collection_id") REFERENCES "public"."stackbone_rag_collections"("id") ON DELETE cascade ON UPDATE no action;
|
|
48
|
+
--> statement-breakpoint
|
|
49
|
+
ALTER TABLE "stackbone_rag_chunks" ADD CONSTRAINT "stackbone_rag_chunks_document_id_fk" FOREIGN KEY ("document_id") REFERENCES "public"."stackbone_rag_documents"("id") ON DELETE cascade ON UPDATE no action;
|
|
50
|
+
--> statement-breakpoint
|
|
51
|
+
ALTER TABLE "stackbone_rag_jobs" ADD CONSTRAINT "stackbone_rag_jobs_collection_id_fk" FOREIGN KEY ("collection_id") REFERENCES "public"."stackbone_rag_collections"("id") ON DELETE cascade ON UPDATE no action;
|
|
52
|
+
--> statement-breakpoint
|
|
53
|
+
CREATE INDEX "stackbone_rag_documents_collection_idx" ON "stackbone_rag_documents" USING btree ("collection_id");
|
|
54
|
+
--> statement-breakpoint
|
|
55
|
+
CREATE INDEX "stackbone_rag_documents_hash_idx" ON "stackbone_rag_documents" USING btree ("collection_id","content_hash");
|
|
56
|
+
--> statement-breakpoint
|
|
57
|
+
CREATE INDEX "stackbone_rag_chunks_document_idx" ON "stackbone_rag_chunks" USING btree ("document_id");
|
|
58
|
+
--> statement-breakpoint
|
|
59
|
+
CREATE INDEX "stackbone_rag_chunks_embedding_hnsw" ON "stackbone_rag_chunks" USING hnsw ("embedding" vector_cosine_ops);
|
|
60
|
+
--> statement-breakpoint
|
|
61
|
+
CREATE INDEX "stackbone_rag_jobs_collection_idx" ON "stackbone_rag_jobs" USING btree ("collection_id");
|
|
62
|
+
--> statement-breakpoint
|
|
63
|
+
CREATE INDEX "stackbone_rag_jobs_status_idx" ON "stackbone_rag_jobs" USING btree ("status");
|
|
64
|
+
`;
|
|
65
|
+
|
|
66
|
+
exports.STACKBONE_RAG_MARKER_PREFIX = STACKBONE_RAG_MARKER_PREFIX;
|
|
67
|
+
exports.STACKBONE_RAG_MARKER_REGEX = STACKBONE_RAG_MARKER_REGEX;
|
|
68
|
+
exports.STACKBONE_RAG_V1_FILENAME_SUFFIX = STACKBONE_RAG_V1_FILENAME_SUFFIX;
|
|
69
|
+
exports.STACKBONE_RAG_V1_SQL = STACKBONE_RAG_V1_SQL;
|
|
70
|
+
//# sourceMappingURL=index.cjs.map
|
|
71
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/sdk/src/modules/rag/migrations/index.ts"],"names":["STACKBONE_RAG_MARKER_PREFIX","STACKBONE_RAG_MARKER_REGEX","STACKBONE_RAG_V1_FILENAME_SUFFIX","STACKBONE_RAG_V1_SQL"],"mappings":";;;AAqBO,IAAMA,2BAAAA,GAA8B;AAOpC,IAAMC,0BAAAA,GAA6B;AAGnC,IAAMC,gCAAAA,GAAmC;AAUzC,IAAMC,oBAAAA,GAAuB,CAAA","file":"index.cjs","sourcesContent":["// Runtime-resolvable bundle of the canonical RAG migrations. The CLI's\n// `add-rag` installer copies `STACKBONE_RAG_V1_SQL` verbatim into the\n// creator's `.stackbone/migrations/` directory. The literal `.sql` sibling\n// (`stackbone_rag_v1.sql`) is the human-readable source — a snapshot test\n// pins the two together so they cannot drift.\n//\n// We inline the body here (instead of `readFileSync`) because tsup bundles\n// the SDK into `dist/*.{js,cjs}` and does NOT copy `.sql` assets across.\n// Inlining sidesteps the runtime-asset question: any consumer that imports\n// `@stackbone/sdk/rag/migrations` gets the SQL as a plain string, no fs\n// access required, no path-resolution edge cases inside packed CLIs.\n\n/**\n * Header marker stamped on the first line of every Stackbone-managed RAG\n * migration. The `add-rag` installer is **idempotent** by detection of this\n * exact regex on the first line of any file under\n * `.stackbone/migrations/*.sql`.\n *\n * Format locked in ADR 2026-05-10 §D3: literal `-- @stackbone:rag@v<N>` with\n * no leading/trailing whitespace and no quoting.\n */\nexport const STACKBONE_RAG_MARKER_PREFIX = '-- @stackbone:rag@';\n\n/**\n * Regex matching the marker on the first line of a migration file. Group 1\n * is the integer version. Anchored on both ends so the match is robust to\n * accidental copy-paste of the marker into a comment further down the file.\n */\nexport const STACKBONE_RAG_MARKER_REGEX = /^-- @stackbone:rag@v(\\d+)$/;\n\n/** Filename used when bundling into `.stackbone/migrations/<NNNN>_stackbone_rag_v<N>.sql`. */\nexport const STACKBONE_RAG_V1_FILENAME_SUFFIX = 'stackbone_rag_v1.sql';\n\n/**\n * Canonical body of `stackbone_rag_v1.sql`. Generated from\n * `libs/sdk/src/modules/rag/schema.ts` via `drizzle-kit generate`, then\n * prefixed with the `-- @stackbone:rag@v1` marker required by the installer.\n *\n * The literal `.sql` sibling exists for tooling (drizzle-kit studio, manual\n * inspection); a snapshot test asserts the two stay byte-equal.\n */\nexport const STACKBONE_RAG_V1_SQL = `-- @stackbone:rag@v1\nCREATE EXTENSION IF NOT EXISTS vector;\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_collections\" (\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\\t\"name\" text NOT NULL,\n\\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL,\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\\tCONSTRAINT \"stackbone_rag_collections_name_unique\" UNIQUE(\"name\")\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_documents\" (\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\\t\"collection_id\" uuid NOT NULL,\n\\t\"source\" text NOT NULL,\n\\t\"content_hash\" text NOT NULL,\n\\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL,\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_chunks\" (\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\\t\"document_id\" uuid NOT NULL,\n\\t\"ordinal\" integer NOT NULL,\n\\t\"content\" text NOT NULL,\n\\t\"embedding\" vector(1536) NOT NULL,\n\\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_jobs\" (\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\\t\"collection_id\" uuid NOT NULL,\n\\t\"status\" text DEFAULT 'queued' NOT NULL,\n\\t\"progress\" jsonb DEFAULT '{\"totalChunks\":0,\"processedChunks\":0}'::jsonb NOT NULL,\n\\t\"error\" text,\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\\tCONSTRAINT \"stackbone_rag_jobs_status_check\" CHECK (\"status\" IN ('queued','running','succeeded','failed','cancelled'))\n);\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_documents\" ADD CONSTRAINT \"stackbone_rag_documents_collection_id_fk\" FOREIGN KEY (\"collection_id\") REFERENCES \"public\".\"stackbone_rag_collections\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_chunks\" ADD CONSTRAINT \"stackbone_rag_chunks_document_id_fk\" FOREIGN KEY (\"document_id\") REFERENCES \"public\".\"stackbone_rag_documents\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_jobs\" ADD CONSTRAINT \"stackbone_rag_jobs_collection_id_fk\" FOREIGN KEY (\"collection_id\") REFERENCES \"public\".\"stackbone_rag_collections\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_documents_collection_idx\" ON \"stackbone_rag_documents\" USING btree (\"collection_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_documents_hash_idx\" ON \"stackbone_rag_documents\" USING btree (\"collection_id\",\"content_hash\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_chunks_document_idx\" ON \"stackbone_rag_chunks\" USING btree (\"document_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_chunks_embedding_hnsw\" ON \"stackbone_rag_chunks\" USING hnsw (\"embedding\" vector_cosine_ops);\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_jobs_collection_idx\" ON \"stackbone_rag_jobs\" USING btree (\"collection_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_jobs_status_idx\" ON \"stackbone_rag_jobs\" USING btree (\"status\");\n`;\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header marker stamped on the first line of every Stackbone-managed RAG
|
|
3
|
+
* migration. The `add-rag` installer is **idempotent** by detection of this
|
|
4
|
+
* exact regex on the first line of any file under
|
|
5
|
+
* `.stackbone/migrations/*.sql`.
|
|
6
|
+
*
|
|
7
|
+
* Format locked in ADR 2026-05-10 §D3: literal `-- @stackbone:rag@v<N>` with
|
|
8
|
+
* no leading/trailing whitespace and no quoting.
|
|
9
|
+
*/
|
|
10
|
+
declare const STACKBONE_RAG_MARKER_PREFIX = "-- @stackbone:rag@";
|
|
11
|
+
/**
|
|
12
|
+
* Regex matching the marker on the first line of a migration file. Group 1
|
|
13
|
+
* is the integer version. Anchored on both ends so the match is robust to
|
|
14
|
+
* accidental copy-paste of the marker into a comment further down the file.
|
|
15
|
+
*/
|
|
16
|
+
declare const STACKBONE_RAG_MARKER_REGEX: RegExp;
|
|
17
|
+
/** Filename used when bundling into `.stackbone/migrations/<NNNN>_stackbone_rag_v<N>.sql`. */
|
|
18
|
+
declare const STACKBONE_RAG_V1_FILENAME_SUFFIX = "stackbone_rag_v1.sql";
|
|
19
|
+
/**
|
|
20
|
+
* Canonical body of `stackbone_rag_v1.sql`. Generated from
|
|
21
|
+
* `libs/sdk/src/modules/rag/schema.ts` via `drizzle-kit generate`, then
|
|
22
|
+
* prefixed with the `-- @stackbone:rag@v1` marker required by the installer.
|
|
23
|
+
*
|
|
24
|
+
* The literal `.sql` sibling exists for tooling (drizzle-kit studio, manual
|
|
25
|
+
* inspection); a snapshot test asserts the two stay byte-equal.
|
|
26
|
+
*/
|
|
27
|
+
declare const STACKBONE_RAG_V1_SQL = "-- @stackbone:rag@v1\nCREATE EXTENSION IF NOT EXISTS vector;\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_collections\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"name\" text NOT NULL,\n\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\tCONSTRAINT \"stackbone_rag_collections_name_unique\" UNIQUE(\"name\")\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_documents\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"collection_id\" uuid NOT NULL,\n\t\"source\" text NOT NULL,\n\t\"content_hash\" text NOT NULL,\n\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_chunks\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"document_id\" uuid NOT NULL,\n\t\"ordinal\" integer NOT NULL,\n\t\"content\" text NOT NULL,\n\t\"embedding\" vector(1536) NOT NULL,\n\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_jobs\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"collection_id\" uuid NOT NULL,\n\t\"status\" text DEFAULT 'queued' NOT NULL,\n\t\"progress\" jsonb DEFAULT '{\"totalChunks\":0,\"processedChunks\":0}'::jsonb NOT NULL,\n\t\"error\" text,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\tCONSTRAINT \"stackbone_rag_jobs_status_check\" CHECK (\"status\" IN ('queued','running','succeeded','failed','cancelled'))\n);\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_documents\" ADD CONSTRAINT \"stackbone_rag_documents_collection_id_fk\" FOREIGN KEY (\"collection_id\") REFERENCES \"public\".\"stackbone_rag_collections\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_chunks\" ADD CONSTRAINT \"stackbone_rag_chunks_document_id_fk\" FOREIGN KEY (\"document_id\") REFERENCES \"public\".\"stackbone_rag_documents\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_jobs\" ADD CONSTRAINT \"stackbone_rag_jobs_collection_id_fk\" FOREIGN KEY (\"collection_id\") REFERENCES \"public\".\"stackbone_rag_collections\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_documents_collection_idx\" ON \"stackbone_rag_documents\" USING btree (\"collection_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_documents_hash_idx\" ON \"stackbone_rag_documents\" USING btree (\"collection_id\",\"content_hash\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_chunks_document_idx\" ON \"stackbone_rag_chunks\" USING btree (\"document_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_chunks_embedding_hnsw\" ON \"stackbone_rag_chunks\" USING hnsw (\"embedding\" vector_cosine_ops);\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_jobs_collection_idx\" ON \"stackbone_rag_jobs\" USING btree (\"collection_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_jobs_status_idx\" ON \"stackbone_rag_jobs\" USING btree (\"status\");\n";
|
|
28
|
+
|
|
29
|
+
export { STACKBONE_RAG_MARKER_PREFIX, STACKBONE_RAG_MARKER_REGEX, STACKBONE_RAG_V1_FILENAME_SUFFIX, STACKBONE_RAG_V1_SQL };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header marker stamped on the first line of every Stackbone-managed RAG
|
|
3
|
+
* migration. The `add-rag` installer is **idempotent** by detection of this
|
|
4
|
+
* exact regex on the first line of any file under
|
|
5
|
+
* `.stackbone/migrations/*.sql`.
|
|
6
|
+
*
|
|
7
|
+
* Format locked in ADR 2026-05-10 §D3: literal `-- @stackbone:rag@v<N>` with
|
|
8
|
+
* no leading/trailing whitespace and no quoting.
|
|
9
|
+
*/
|
|
10
|
+
declare const STACKBONE_RAG_MARKER_PREFIX = "-- @stackbone:rag@";
|
|
11
|
+
/**
|
|
12
|
+
* Regex matching the marker on the first line of a migration file. Group 1
|
|
13
|
+
* is the integer version. Anchored on both ends so the match is robust to
|
|
14
|
+
* accidental copy-paste of the marker into a comment further down the file.
|
|
15
|
+
*/
|
|
16
|
+
declare const STACKBONE_RAG_MARKER_REGEX: RegExp;
|
|
17
|
+
/** Filename used when bundling into `.stackbone/migrations/<NNNN>_stackbone_rag_v<N>.sql`. */
|
|
18
|
+
declare const STACKBONE_RAG_V1_FILENAME_SUFFIX = "stackbone_rag_v1.sql";
|
|
19
|
+
/**
|
|
20
|
+
* Canonical body of `stackbone_rag_v1.sql`. Generated from
|
|
21
|
+
* `libs/sdk/src/modules/rag/schema.ts` via `drizzle-kit generate`, then
|
|
22
|
+
* prefixed with the `-- @stackbone:rag@v1` marker required by the installer.
|
|
23
|
+
*
|
|
24
|
+
* The literal `.sql` sibling exists for tooling (drizzle-kit studio, manual
|
|
25
|
+
* inspection); a snapshot test asserts the two stay byte-equal.
|
|
26
|
+
*/
|
|
27
|
+
declare const STACKBONE_RAG_V1_SQL = "-- @stackbone:rag@v1\nCREATE EXTENSION IF NOT EXISTS vector;\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_collections\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"name\" text NOT NULL,\n\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\tCONSTRAINT \"stackbone_rag_collections_name_unique\" UNIQUE(\"name\")\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_documents\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"collection_id\" uuid NOT NULL,\n\t\"source\" text NOT NULL,\n\t\"content_hash\" text NOT NULL,\n\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_chunks\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"document_id\" uuid NOT NULL,\n\t\"ordinal\" integer NOT NULL,\n\t\"content\" text NOT NULL,\n\t\"embedding\" vector(1536) NOT NULL,\n\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_jobs\" (\n\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\t\"collection_id\" uuid NOT NULL,\n\t\"status\" text DEFAULT 'queued' NOT NULL,\n\t\"progress\" jsonb DEFAULT '{\"totalChunks\":0,\"processedChunks\":0}'::jsonb NOT NULL,\n\t\"error\" text,\n\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\tCONSTRAINT \"stackbone_rag_jobs_status_check\" CHECK (\"status\" IN ('queued','running','succeeded','failed','cancelled'))\n);\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_documents\" ADD CONSTRAINT \"stackbone_rag_documents_collection_id_fk\" FOREIGN KEY (\"collection_id\") REFERENCES \"public\".\"stackbone_rag_collections\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_chunks\" ADD CONSTRAINT \"stackbone_rag_chunks_document_id_fk\" FOREIGN KEY (\"document_id\") REFERENCES \"public\".\"stackbone_rag_documents\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_jobs\" ADD CONSTRAINT \"stackbone_rag_jobs_collection_id_fk\" FOREIGN KEY (\"collection_id\") REFERENCES \"public\".\"stackbone_rag_collections\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_documents_collection_idx\" ON \"stackbone_rag_documents\" USING btree (\"collection_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_documents_hash_idx\" ON \"stackbone_rag_documents\" USING btree (\"collection_id\",\"content_hash\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_chunks_document_idx\" ON \"stackbone_rag_chunks\" USING btree (\"document_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_chunks_embedding_hnsw\" ON \"stackbone_rag_chunks\" USING hnsw (\"embedding\" vector_cosine_ops);\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_jobs_collection_idx\" ON \"stackbone_rag_jobs\" USING btree (\"collection_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_jobs_status_idx\" ON \"stackbone_rag_jobs\" USING btree (\"status\");\n";
|
|
28
|
+
|
|
29
|
+
export { STACKBONE_RAG_MARKER_PREFIX, STACKBONE_RAG_MARKER_REGEX, STACKBONE_RAG_V1_FILENAME_SUFFIX, STACKBONE_RAG_V1_SQL };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// src/modules/rag/migrations/index.ts
|
|
2
|
+
var STACKBONE_RAG_MARKER_PREFIX = "-- @stackbone:rag@";
|
|
3
|
+
var STACKBONE_RAG_MARKER_REGEX = /^-- @stackbone:rag@v(\d+)$/;
|
|
4
|
+
var STACKBONE_RAG_V1_FILENAME_SUFFIX = "stackbone_rag_v1.sql";
|
|
5
|
+
var STACKBONE_RAG_V1_SQL = `-- @stackbone:rag@v1
|
|
6
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
7
|
+
--> statement-breakpoint
|
|
8
|
+
CREATE TABLE "stackbone_rag_collections" (
|
|
9
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
10
|
+
"name" text NOT NULL,
|
|
11
|
+
"metadata" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
12
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
13
|
+
CONSTRAINT "stackbone_rag_collections_name_unique" UNIQUE("name")
|
|
14
|
+
);
|
|
15
|
+
--> statement-breakpoint
|
|
16
|
+
CREATE TABLE "stackbone_rag_documents" (
|
|
17
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
18
|
+
"collection_id" uuid NOT NULL,
|
|
19
|
+
"source" text NOT NULL,
|
|
20
|
+
"content_hash" text NOT NULL,
|
|
21
|
+
"metadata" jsonb DEFAULT '{}'::jsonb NOT NULL,
|
|
22
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL
|
|
23
|
+
);
|
|
24
|
+
--> statement-breakpoint
|
|
25
|
+
CREATE TABLE "stackbone_rag_chunks" (
|
|
26
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
27
|
+
"document_id" uuid NOT NULL,
|
|
28
|
+
"ordinal" integer NOT NULL,
|
|
29
|
+
"content" text NOT NULL,
|
|
30
|
+
"embedding" vector(1536) NOT NULL,
|
|
31
|
+
"metadata" jsonb DEFAULT '{}'::jsonb NOT NULL
|
|
32
|
+
);
|
|
33
|
+
--> statement-breakpoint
|
|
34
|
+
CREATE TABLE "stackbone_rag_jobs" (
|
|
35
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
36
|
+
"collection_id" uuid NOT NULL,
|
|
37
|
+
"status" text DEFAULT 'queued' NOT NULL,
|
|
38
|
+
"progress" jsonb DEFAULT '{"totalChunks":0,"processedChunks":0}'::jsonb NOT NULL,
|
|
39
|
+
"error" text,
|
|
40
|
+
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
41
|
+
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
|
42
|
+
CONSTRAINT "stackbone_rag_jobs_status_check" CHECK ("status" IN ('queued','running','succeeded','failed','cancelled'))
|
|
43
|
+
);
|
|
44
|
+
--> statement-breakpoint
|
|
45
|
+
ALTER TABLE "stackbone_rag_documents" ADD CONSTRAINT "stackbone_rag_documents_collection_id_fk" FOREIGN KEY ("collection_id") REFERENCES "public"."stackbone_rag_collections"("id") ON DELETE cascade ON UPDATE no action;
|
|
46
|
+
--> statement-breakpoint
|
|
47
|
+
ALTER TABLE "stackbone_rag_chunks" ADD CONSTRAINT "stackbone_rag_chunks_document_id_fk" FOREIGN KEY ("document_id") REFERENCES "public"."stackbone_rag_documents"("id") ON DELETE cascade ON UPDATE no action;
|
|
48
|
+
--> statement-breakpoint
|
|
49
|
+
ALTER TABLE "stackbone_rag_jobs" ADD CONSTRAINT "stackbone_rag_jobs_collection_id_fk" FOREIGN KEY ("collection_id") REFERENCES "public"."stackbone_rag_collections"("id") ON DELETE cascade ON UPDATE no action;
|
|
50
|
+
--> statement-breakpoint
|
|
51
|
+
CREATE INDEX "stackbone_rag_documents_collection_idx" ON "stackbone_rag_documents" USING btree ("collection_id");
|
|
52
|
+
--> statement-breakpoint
|
|
53
|
+
CREATE INDEX "stackbone_rag_documents_hash_idx" ON "stackbone_rag_documents" USING btree ("collection_id","content_hash");
|
|
54
|
+
--> statement-breakpoint
|
|
55
|
+
CREATE INDEX "stackbone_rag_chunks_document_idx" ON "stackbone_rag_chunks" USING btree ("document_id");
|
|
56
|
+
--> statement-breakpoint
|
|
57
|
+
CREATE INDEX "stackbone_rag_chunks_embedding_hnsw" ON "stackbone_rag_chunks" USING hnsw ("embedding" vector_cosine_ops);
|
|
58
|
+
--> statement-breakpoint
|
|
59
|
+
CREATE INDEX "stackbone_rag_jobs_collection_idx" ON "stackbone_rag_jobs" USING btree ("collection_id");
|
|
60
|
+
--> statement-breakpoint
|
|
61
|
+
CREATE INDEX "stackbone_rag_jobs_status_idx" ON "stackbone_rag_jobs" USING btree ("status");
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
export { STACKBONE_RAG_MARKER_PREFIX, STACKBONE_RAG_MARKER_REGEX, STACKBONE_RAG_V1_FILENAME_SUFFIX, STACKBONE_RAG_V1_SQL };
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
66
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../libs/sdk/src/modules/rag/migrations/index.ts"],"names":["STACKBONE_RAG_MARKER_PREFIX","STACKBONE_RAG_MARKER_REGEX","STACKBONE_RAG_V1_FILENAME_SUFFIX","STACKBONE_RAG_V1_SQL"],"mappings":";AAqBO,IAAMA,2BAAAA,GAA8B;AAOpC,IAAMC,0BAAAA,GAA6B;AAGnC,IAAMC,gCAAAA,GAAmC;AAUzC,IAAMC,oBAAAA,GAAuB,CAAA","file":"index.js","sourcesContent":["// Runtime-resolvable bundle of the canonical RAG migrations. The CLI's\n// `add-rag` installer copies `STACKBONE_RAG_V1_SQL` verbatim into the\n// creator's `.stackbone/migrations/` directory. The literal `.sql` sibling\n// (`stackbone_rag_v1.sql`) is the human-readable source — a snapshot test\n// pins the two together so they cannot drift.\n//\n// We inline the body here (instead of `readFileSync`) because tsup bundles\n// the SDK into `dist/*.{js,cjs}` and does NOT copy `.sql` assets across.\n// Inlining sidesteps the runtime-asset question: any consumer that imports\n// `@stackbone/sdk/rag/migrations` gets the SQL as a plain string, no fs\n// access required, no path-resolution edge cases inside packed CLIs.\n\n/**\n * Header marker stamped on the first line of every Stackbone-managed RAG\n * migration. The `add-rag` installer is **idempotent** by detection of this\n * exact regex on the first line of any file under\n * `.stackbone/migrations/*.sql`.\n *\n * Format locked in ADR 2026-05-10 §D3: literal `-- @stackbone:rag@v<N>` with\n * no leading/trailing whitespace and no quoting.\n */\nexport const STACKBONE_RAG_MARKER_PREFIX = '-- @stackbone:rag@';\n\n/**\n * Regex matching the marker on the first line of a migration file. Group 1\n * is the integer version. Anchored on both ends so the match is robust to\n * accidental copy-paste of the marker into a comment further down the file.\n */\nexport const STACKBONE_RAG_MARKER_REGEX = /^-- @stackbone:rag@v(\\d+)$/;\n\n/** Filename used when bundling into `.stackbone/migrations/<NNNN>_stackbone_rag_v<N>.sql`. */\nexport const STACKBONE_RAG_V1_FILENAME_SUFFIX = 'stackbone_rag_v1.sql';\n\n/**\n * Canonical body of `stackbone_rag_v1.sql`. Generated from\n * `libs/sdk/src/modules/rag/schema.ts` via `drizzle-kit generate`, then\n * prefixed with the `-- @stackbone:rag@v1` marker required by the installer.\n *\n * The literal `.sql` sibling exists for tooling (drizzle-kit studio, manual\n * inspection); a snapshot test asserts the two stay byte-equal.\n */\nexport const STACKBONE_RAG_V1_SQL = `-- @stackbone:rag@v1\nCREATE EXTENSION IF NOT EXISTS vector;\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_collections\" (\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\\t\"name\" text NOT NULL,\n\\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL,\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\\tCONSTRAINT \"stackbone_rag_collections_name_unique\" UNIQUE(\"name\")\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_documents\" (\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\\t\"collection_id\" uuid NOT NULL,\n\\t\"source\" text NOT NULL,\n\\t\"content_hash\" text NOT NULL,\n\\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL,\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_chunks\" (\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\\t\"document_id\" uuid NOT NULL,\n\\t\"ordinal\" integer NOT NULL,\n\\t\"content\" text NOT NULL,\n\\t\"embedding\" vector(1536) NOT NULL,\n\\t\"metadata\" jsonb DEFAULT '{}'::jsonb NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE \"stackbone_rag_jobs\" (\n\\t\"id\" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,\n\\t\"collection_id\" uuid NOT NULL,\n\\t\"status\" text DEFAULT 'queued' NOT NULL,\n\\t\"progress\" jsonb DEFAULT '{\"totalChunks\":0,\"processedChunks\":0}'::jsonb NOT NULL,\n\\t\"error\" text,\n\\t\"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\\t\"updated_at\" timestamp with time zone DEFAULT now() NOT NULL,\n\\tCONSTRAINT \"stackbone_rag_jobs_status_check\" CHECK (\"status\" IN ('queued','running','succeeded','failed','cancelled'))\n);\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_documents\" ADD CONSTRAINT \"stackbone_rag_documents_collection_id_fk\" FOREIGN KEY (\"collection_id\") REFERENCES \"public\".\"stackbone_rag_collections\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_chunks\" ADD CONSTRAINT \"stackbone_rag_chunks_document_id_fk\" FOREIGN KEY (\"document_id\") REFERENCES \"public\".\"stackbone_rag_documents\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nALTER TABLE \"stackbone_rag_jobs\" ADD CONSTRAINT \"stackbone_rag_jobs_collection_id_fk\" FOREIGN KEY (\"collection_id\") REFERENCES \"public\".\"stackbone_rag_collections\"(\"id\") ON DELETE cascade ON UPDATE no action;\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_documents_collection_idx\" ON \"stackbone_rag_documents\" USING btree (\"collection_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_documents_hash_idx\" ON \"stackbone_rag_documents\" USING btree (\"collection_id\",\"content_hash\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_chunks_document_idx\" ON \"stackbone_rag_chunks\" USING btree (\"document_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_chunks_embedding_hnsw\" ON \"stackbone_rag_chunks\" USING hnsw (\"embedding\" vector_cosine_ops);\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_jobs_collection_idx\" ON \"stackbone_rag_jobs\" USING btree (\"collection_id\");\n--> statement-breakpoint\nCREATE INDEX \"stackbone_rag_jobs_status_idx\" ON \"stackbone_rag_jobs\" USING btree (\"status\");\n`;\n"]}
|
package/rag/schema.cjs
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var drizzle_orm_star = require('drizzle-orm');
|
|
4
|
+
var pg_core_star = require('drizzle-orm/pg-core');
|
|
5
|
+
|
|
6
|
+
function _interopNamespace(e) {
|
|
7
|
+
if (e && e.__esModule) return e;
|
|
8
|
+
var n = Object.create(null);
|
|
9
|
+
if (e) {
|
|
10
|
+
Object.keys(e).forEach(function (k) {
|
|
11
|
+
if (k !== 'default') {
|
|
12
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () { return e[k]; }
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
n.default = e;
|
|
21
|
+
return Object.freeze(n);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var drizzle_orm_star__namespace = /*#__PURE__*/_interopNamespace(drizzle_orm_star);
|
|
25
|
+
var pg_core_star__namespace = /*#__PURE__*/_interopNamespace(pg_core_star);
|
|
26
|
+
|
|
27
|
+
var __defProp = Object.defineProperty;
|
|
28
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
29
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
30
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
31
|
+
var __copyProps = (to, from, except, desc) => {
|
|
32
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
33
|
+
for (let key of __getOwnPropNames(from))
|
|
34
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
35
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
36
|
+
}
|
|
37
|
+
return to;
|
|
38
|
+
};
|
|
39
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget);
|
|
40
|
+
|
|
41
|
+
// src/db/index.ts
|
|
42
|
+
var db_exports = {};
|
|
43
|
+
__reExport(db_exports, drizzle_orm_star__namespace);
|
|
44
|
+
__reExport(db_exports, pg_core_star__namespace);
|
|
45
|
+
|
|
46
|
+
// src/modules/rag/schema.ts
|
|
47
|
+
var RAG_EMBEDDING_DIMENSIONS = 1536;
|
|
48
|
+
var STACKBONE_RAG_SCHEMA_VERSION = "v1";
|
|
49
|
+
var stackboneRagCollections = (0, db_exports.pgTable)("stackbone_rag_collections", {
|
|
50
|
+
id: (0, db_exports.uuid)("id").defaultRandom().primaryKey(),
|
|
51
|
+
name: (0, db_exports.text)("name").notNull().unique(),
|
|
52
|
+
metadata: (0, db_exports.jsonb)("metadata").$type().notNull().default({}),
|
|
53
|
+
createdAt: (0, db_exports.timestamp)("created_at", {
|
|
54
|
+
withTimezone: true
|
|
55
|
+
}).notNull().defaultNow()
|
|
56
|
+
});
|
|
57
|
+
var stackboneRagDocuments = (0, db_exports.pgTable)("stackbone_rag_documents", {
|
|
58
|
+
id: (0, db_exports.uuid)("id").defaultRandom().primaryKey(),
|
|
59
|
+
collectionId: (0, db_exports.uuid)("collection_id").notNull().references(() => stackboneRagCollections.id, {
|
|
60
|
+
onDelete: "cascade"
|
|
61
|
+
}),
|
|
62
|
+
source: (0, db_exports.text)("source").notNull(),
|
|
63
|
+
contentHash: (0, db_exports.text)("content_hash").notNull(),
|
|
64
|
+
metadata: (0, db_exports.jsonb)("metadata").$type().notNull().default({}),
|
|
65
|
+
createdAt: (0, db_exports.timestamp)("created_at", {
|
|
66
|
+
withTimezone: true
|
|
67
|
+
}).notNull().defaultNow()
|
|
68
|
+
}, (t) => ({
|
|
69
|
+
byCollection: (0, db_exports.index)("stackbone_rag_documents_collection_idx").on(t.collectionId),
|
|
70
|
+
byHash: (0, db_exports.index)("stackbone_rag_documents_hash_idx").on(t.collectionId, t.contentHash)
|
|
71
|
+
}));
|
|
72
|
+
var stackboneRagChunks = (0, db_exports.pgTable)("stackbone_rag_chunks", {
|
|
73
|
+
id: (0, db_exports.uuid)("id").defaultRandom().primaryKey(),
|
|
74
|
+
documentId: (0, db_exports.uuid)("document_id").notNull().references(() => stackboneRagDocuments.id, {
|
|
75
|
+
onDelete: "cascade"
|
|
76
|
+
}),
|
|
77
|
+
ordinal: (0, db_exports.integer)("ordinal").notNull(),
|
|
78
|
+
content: (0, db_exports.text)("content").notNull(),
|
|
79
|
+
embedding: (0, db_exports.vector)("embedding", {
|
|
80
|
+
dimensions: RAG_EMBEDDING_DIMENSIONS
|
|
81
|
+
}).notNull(),
|
|
82
|
+
metadata: (0, db_exports.jsonb)("metadata").$type().notNull().default({})
|
|
83
|
+
}, (t) => ({
|
|
84
|
+
byDocument: (0, db_exports.index)("stackbone_rag_chunks_document_idx").on(t.documentId),
|
|
85
|
+
ann: (0, db_exports.index)("stackbone_rag_chunks_embedding_hnsw").using("hnsw", t.embedding.op("vector_cosine_ops"))
|
|
86
|
+
}));
|
|
87
|
+
var stackboneRagJobs = (0, db_exports.pgTable)("stackbone_rag_jobs", {
|
|
88
|
+
id: (0, db_exports.uuid)("id").defaultRandom().primaryKey(),
|
|
89
|
+
collectionId: (0, db_exports.uuid)("collection_id").notNull().references(() => stackboneRagCollections.id, {
|
|
90
|
+
onDelete: "cascade"
|
|
91
|
+
}),
|
|
92
|
+
status: (0, db_exports.text)("status", {
|
|
93
|
+
enum: [
|
|
94
|
+
"queued",
|
|
95
|
+
"running",
|
|
96
|
+
"succeeded",
|
|
97
|
+
"failed",
|
|
98
|
+
"cancelled"
|
|
99
|
+
]
|
|
100
|
+
}).notNull().default("queued"),
|
|
101
|
+
progress: (0, db_exports.jsonb)("progress").$type().notNull().default({
|
|
102
|
+
totalChunks: 0,
|
|
103
|
+
processedChunks: 0
|
|
104
|
+
}),
|
|
105
|
+
error: (0, db_exports.text)("error"),
|
|
106
|
+
createdAt: (0, db_exports.timestamp)("created_at", {
|
|
107
|
+
withTimezone: true
|
|
108
|
+
}).notNull().defaultNow(),
|
|
109
|
+
updatedAt: (0, db_exports.timestamp)("updated_at", {
|
|
110
|
+
withTimezone: true
|
|
111
|
+
}).notNull().defaultNow()
|
|
112
|
+
}, (t) => ({
|
|
113
|
+
byCollection: (0, db_exports.index)("stackbone_rag_jobs_collection_idx").on(t.collectionId),
|
|
114
|
+
byStatus: (0, db_exports.index)("stackbone_rag_jobs_status_idx").on(t.status)
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
exports.RAG_EMBEDDING_DIMENSIONS = RAG_EMBEDDING_DIMENSIONS;
|
|
118
|
+
exports.STACKBONE_RAG_SCHEMA_VERSION = STACKBONE_RAG_SCHEMA_VERSION;
|
|
119
|
+
exports.stackboneRagChunks = stackboneRagChunks;
|
|
120
|
+
exports.stackboneRagCollections = stackboneRagCollections;
|
|
121
|
+
exports.stackboneRagDocuments = stackboneRagDocuments;
|
|
122
|
+
exports.stackboneRagJobs = stackboneRagJobs;
|
|
123
|
+
//# sourceMappingURL=schema.cjs.map
|
|
124
|
+
//# sourceMappingURL=schema.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../libs/sdk/src/db/index.ts","../../../../libs/sdk/src/modules/rag/schema.ts"],"names":["pg_core_star","RAG_EMBEDDING_DIMENSIONS","STACKBONE_RAG_SCHEMA_VERSION","stackboneRagCollections","pgTable","id","uuid","defaultRandom","primaryKey","name","text","notNull","unique","metadata","jsonb","$type","default","createdAt","timestamp","withTimezone","defaultNow","stackboneRagDocuments","collectionId","references","onDelete","source","contentHash","t","byCollection","index","on","byHash","stackboneRagChunks","documentId","ordinal","integer","content","embedding","vector","dimensions","byDocument","ann","using","op","stackboneRagJobs","status","enum","progress","totalChunks","processedChunks","error","updatedAt","byStatus"],"mappings":"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","file":"schema.cjs","sourcesContent":["export * from 'drizzle-orm';\nexport * from 'drizzle-orm/pg-core';\n\n// Re-exporting both `drizzle-orm` and `drizzle-orm/pg-core` produces TS2308\n// (ambiguous re-export) for the type names below, since both barrels expose\n// them. Pinning them to the pg-core variant — the one creators write Postgres\n// schemas against — resolves the ambiguity.\nexport type {\n ColumnsWithTable,\n SelectedFields,\n SelectedFieldsFlat,\n SelectedFieldsOrdered,\n TableConfig,\n} from 'drizzle-orm/pg-core';\n","// Single source of truth for the RAG tables installed by `stackbone db\n// migrate add-rag`. This module is **internal** — never re-exported from\n// `@stackbone/sdk`'s public barrel. Only the SDK's own RAG pipeline (slices\n// F03–F07) and the CLI (this slice) read from it.\n//\n// The bundled SQL migration in `./migrations/stackbone_rag_v1.sql` is the\n// snapshot generated from the Drizzle definitions below via\n// `drizzle-kit generate`. The two MUST stay in sync; the snapshot test in\n// `schema.spec.ts` pins the expected table/column shape so a drift in the\n// hand-maintained SQL is caught at CI.\n//\n// Column helpers come from `@stackbone/sdk/db` (its public re-export of\n// `drizzle-orm/pg-core`) so creators and the SDK use the exact same `vector`\n// implementation. Importing directly from `drizzle-orm/pg-core` here would\n// fork the chain; routing through the SDK's barrel is the canonical path\n// locked in ADR 2026-05-10 §D1.\nimport { index, integer, jsonb, pgTable, text, timestamp, uuid, vector } from '../../db';\n\nexport type RagJobStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled';\n\nexport interface RagJobProgress {\n totalChunks: number;\n processedChunks: number;\n currentDocument?: { source: string; ordinal: number };\n}\n\n/** Embedding vector dimension — atado a `openai/text-embedding-3-small` (ADR §D2). */\nexport const RAG_EMBEDDING_DIMENSIONS = 1536;\n\n/** Schema major version. Bumped only on breaking change (ADR §D4). */\nexport const STACKBONE_RAG_SCHEMA_VERSION = 'v1';\n\nexport const stackboneRagCollections = pgTable('stackbone_rag_collections', {\n id: uuid('id').defaultRandom().primaryKey(),\n name: text('name').notNull().unique(),\n metadata: jsonb('metadata').$type<Record<string, unknown>>().notNull().default({}),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport const stackboneRagDocuments = pgTable(\n 'stackbone_rag_documents',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n collectionId: uuid('collection_id')\n .notNull()\n .references(() => stackboneRagCollections.id, { onDelete: 'cascade' }),\n source: text('source').notNull(),\n contentHash: text('content_hash').notNull(),\n metadata: jsonb('metadata').$type<Record<string, unknown>>().notNull().default({}),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n },\n (t) => ({\n byCollection: index('stackbone_rag_documents_collection_idx').on(t.collectionId),\n byHash: index('stackbone_rag_documents_hash_idx').on(t.collectionId, t.contentHash),\n }),\n);\n\nexport const stackboneRagChunks = pgTable(\n 'stackbone_rag_chunks',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n documentId: uuid('document_id')\n .notNull()\n .references(() => stackboneRagDocuments.id, { onDelete: 'cascade' }),\n ordinal: integer('ordinal').notNull(),\n content: text('content').notNull(),\n embedding: vector('embedding', { dimensions: RAG_EMBEDDING_DIMENSIONS }).notNull(),\n metadata: jsonb('metadata').$type<Record<string, unknown>>().notNull().default({}),\n },\n (t) => ({\n byDocument: index('stackbone_rag_chunks_document_idx').on(t.documentId),\n ann: index('stackbone_rag_chunks_embedding_hnsw').using(\n 'hnsw',\n t.embedding.op('vector_cosine_ops'),\n ),\n }),\n);\n\nexport const stackboneRagJobs = pgTable(\n 'stackbone_rag_jobs',\n {\n id: uuid('id').defaultRandom().primaryKey(),\n collectionId: uuid('collection_id')\n .notNull()\n .references(() => stackboneRagCollections.id, { onDelete: 'cascade' }),\n status: text('status', {\n enum: ['queued', 'running', 'succeeded', 'failed', 'cancelled'],\n })\n .notNull()\n .default('queued'),\n progress: jsonb('progress')\n .$type<RagJobProgress>()\n .notNull()\n .default({ totalChunks: 0, processedChunks: 0 }),\n error: text('error'),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),\n },\n (t) => ({\n byCollection: index('stackbone_rag_jobs_collection_idx').on(t.collectionId),\n byStatus: index('stackbone_rag_jobs_status_idx').on(t.status),\n }),\n);\n"]}
|