@khoralabs/chat 0.1.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.
Files changed (85) hide show
  1. package/README.md +7 -0
  2. package/dist/domain.d.ts +10 -0
  3. package/dist/domain.d.ts.map +1 -0
  4. package/dist/errors.d.ts +20 -0
  5. package/dist/errors.d.ts.map +1 -0
  6. package/dist/events.d.ts +59 -0
  7. package/dist/events.d.ts.map +1 -0
  8. package/dist/hash.d.ts +47 -0
  9. package/dist/hash.d.ts.map +1 -0
  10. package/dist/http/client.d.ts +21 -0
  11. package/dist/http/client.d.ts.map +1 -0
  12. package/dist/http/client.js +367 -0
  13. package/dist/http/config.d.ts +5 -0
  14. package/dist/http/config.d.ts.map +1 -0
  15. package/dist/http/index.d.ts +6 -0
  16. package/dist/http/index.d.ts.map +1 -0
  17. package/dist/http/index.js +1084 -0
  18. package/dist/http/routes.d.ts +15 -0
  19. package/dist/http/routes.d.ts.map +1 -0
  20. package/dist/http/routes.js +645 -0
  21. package/dist/http/server.d.ts +19 -0
  22. package/dist/http/server.d.ts.map +1 -0
  23. package/dist/http/server.js +973 -0
  24. package/dist/http/service.d.ts +34 -0
  25. package/dist/http/service.d.ts.map +1 -0
  26. package/dist/http/service.js +501 -0
  27. package/dist/ids.d.ts +8 -0
  28. package/dist/ids.d.ts.map +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +453 -0
  32. package/dist/lineage.d.ts +5 -0
  33. package/dist/lineage.d.ts.map +1 -0
  34. package/dist/persistence/core/index.d.ts +2 -0
  35. package/dist/persistence/core/index.d.ts.map +1 -0
  36. package/dist/persistence/core/persistence/base-persistence.d.ts +12 -0
  37. package/dist/persistence/core/persistence/base-persistence.d.ts.map +1 -0
  38. package/dist/persistence/core/persistence/helpers.d.ts +30 -0
  39. package/dist/persistence/core/persistence/helpers.d.ts.map +1 -0
  40. package/dist/persistence/core/persistence/index.d.ts +6 -0
  41. package/dist/persistence/core/persistence/index.d.ts.map +1 -0
  42. package/dist/persistence/core/persistence/index.js +1276 -0
  43. package/dist/persistence/core/persistence/memory-persistence.d.ts +55 -0
  44. package/dist/persistence/core/persistence/memory-persistence.d.ts.map +1 -0
  45. package/dist/persistence/core/persistence/signed-persistence.d.ts +18 -0
  46. package/dist/persistence/core/persistence/signed-persistence.d.ts.map +1 -0
  47. package/dist/persistence/core/persistence/types.d.ts +210 -0
  48. package/dist/persistence/core/persistence/types.d.ts.map +1 -0
  49. package/dist/persistence/sqlite/index.d.ts +3 -0
  50. package/dist/persistence/sqlite/index.d.ts.map +1 -0
  51. package/dist/persistence/sqlite/index.js +1544 -0
  52. package/dist/persistence/sqlite/persistence/persistence.d.ts +49 -0
  53. package/dist/persistence/sqlite/persistence/persistence.d.ts.map +1 -0
  54. package/dist/persistence/sqlite/persistence/schema.d.ts +4 -0
  55. package/dist/persistence/sqlite/persistence/schema.d.ts.map +1 -0
  56. package/dist/persistence/sqlite/persistence/streaming.d.ts +27 -0
  57. package/dist/persistence/sqlite/persistence/streaming.d.ts.map +1 -0
  58. package/dist/persistence/testing/index.d.ts +2 -0
  59. package/dist/persistence/testing/index.d.ts.map +1 -0
  60. package/dist/persistence/testing/index.js +689 -0
  61. package/dist/persistence/testing/persistence/contract.d.ts +3 -0
  62. package/dist/persistence/testing/persistence/contract.d.ts.map +1 -0
  63. package/dist/persistence/turso-serverless/index.d.ts +10 -0
  64. package/dist/persistence/turso-serverless/index.d.ts.map +1 -0
  65. package/dist/persistence/turso-serverless/index.js +1812 -0
  66. package/dist/persistence/turso-serverless/persistence/local-sqlite.d.ts +5 -0
  67. package/dist/persistence/turso-serverless/persistence/local-sqlite.d.ts.map +1 -0
  68. package/dist/persistence/turso-serverless/persistence/persistence.d.ts +49 -0
  69. package/dist/persistence/turso-serverless/persistence/persistence.d.ts.map +1 -0
  70. package/dist/persistence/turso-serverless/persistence/schema.d.ts +4 -0
  71. package/dist/persistence/turso-serverless/persistence/schema.d.ts.map +1 -0
  72. package/dist/persistence/turso-serverless/persistence/sql.d.ts +20 -0
  73. package/dist/persistence/turso-serverless/persistence/sql.d.ts.map +1 -0
  74. package/dist/persistence/turso-serverless/persistence/sql.js +53 -0
  75. package/dist/persistence/turso-serverless/persistence/streaming.d.ts +27 -0
  76. package/dist/persistence/turso-serverless/persistence/streaming.d.ts.map +1 -0
  77. package/dist/service.d.ts +49 -0
  78. package/dist/service.d.ts.map +1 -0
  79. package/dist/stream.d.ts +32 -0
  80. package/dist/stream.d.ts.map +1 -0
  81. package/dist/types.d.ts +201 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/validation.d.ts +4 -0
  84. package/dist/validation.d.ts.map +1 -0
  85. package/package.json +104 -0
@@ -0,0 +1,5 @@
1
+ import type { SqlDatabase } from "./sql.js";
2
+ export declare function createLocalSqliteDatabase(dbPath: string): SqlDatabase;
3
+ export declare function createMemorySqliteDatabase(): SqlDatabase;
4
+ export declare function closeLocalSqliteDatabase(db: SqlDatabase): void;
5
+ //# sourceMappingURL=local-sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-sqlite.d.ts","sourceRoot":"","sources":["../../../../src/persistence/turso-serverless/persistence/local-sqlite.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA6C5C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAOrE;AAED,wBAAgB,0BAA0B,IAAI,WAAW,CAKxD;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAI9D"}
@@ -0,0 +1,49 @@
1
+ import { BaseChatPersistence } from "@khoralabs/chat/persistence";
2
+ import type { AddChannelMemberInput, AddThreadParticipantInput, AppendPostInput, AppendPostResult, Channel, ChatAclEvent, ChatPersistence, CreateChannelInput, CreateThreadInput, DeletePostInput, EditPostInput, EditPostResult, ListPostsInput, ListThreadsInput, Post, PostPage, PostVersion, RemoveChannelMemberInput, RemoveThreadParticipantInput, ScopeRef, SignedEnvelope, Thread, ThreadHead, ThreadPage, ThreadTip } from "../../../domain.js";
3
+ import { type SqlDatabase } from "./sql.js";
4
+ export declare class TursoChatPersistence extends BaseChatPersistence implements ChatPersistence {
5
+ private readonly db;
6
+ constructor(db: SqlDatabase);
7
+ private getPostVersionInternal;
8
+ createChannel(input: CreateChannelInput): Promise<Channel>;
9
+ createThread(input: CreateThreadInput): Promise<Thread>;
10
+ getChannel(id: string): Promise<Channel | null>;
11
+ getThread(id: string): Promise<Thread | null>;
12
+ getPost(id: string): Promise<Post | null>;
13
+ getPostVersion(id: string): Promise<PostVersion | null>;
14
+ getThreadHead(threadId: string, headId?: string): Promise<ThreadHead | null>;
15
+ getThreadTip(threadId: string): Promise<ThreadTip | null>;
16
+ listThreads(input: ListThreadsInput): Promise<ThreadPage>;
17
+ private listThreadRows;
18
+ listPosts(input: ListPostsInput): Promise<PostPage>;
19
+ appendPost(input: AppendPostInput): Promise<AppendPostResult>;
20
+ editPost(input: EditPostInput): Promise<EditPostResult>;
21
+ deletePost(input: DeletePostInput): Promise<Post>;
22
+ addChannelMember(input: AddChannelMemberInput): Promise<ChatAclEvent>;
23
+ removeChannelMember(input: RemoveChannelMemberInput): Promise<ChatAclEvent>;
24
+ addThreadParticipant(input: AddThreadParticipantInput): Promise<ChatAclEvent>;
25
+ removeThreadParticipant(input: RemoveThreadParticipantInput): Promise<ChatAclEvent>;
26
+ createThreadHead(input: {
27
+ threadId: string;
28
+ name: string;
29
+ headPostVersionId: string;
30
+ }): Promise<ThreadHead>;
31
+ listChannelMembers(channelId: string): Promise<ScopeRef[]>;
32
+ listThreadParticipants(threadId: string): Promise<ScopeRef[]>;
33
+ listAclEvents(input: {
34
+ channelId?: string;
35
+ threadId?: string;
36
+ limit?: number;
37
+ }): Promise<ChatAclEvent[]>;
38
+ private latestAclEventId;
39
+ private insertAclEvent;
40
+ listPostStreamEvents(postId: string): Promise<import("../../../types.js").PostStreamEvent[]>;
41
+ startStreamedPost(input: import("../../../domain.js").StartStreamedPostInput): Promise<import("@khoralabs/chat/persistence").StartStreamedPostResult>;
42
+ applyPostDelta(input: import("../../../domain.js").ApplyPostDeltaInput): Promise<import("@khoralabs/chat/persistence").ApplyPostDeltaResult>;
43
+ completeStreamedPost(input: import("../../../domain.js").CompleteStreamedPostInput): Promise<import("@khoralabs/chat/persistence").CompleteStreamedPostResult>;
44
+ abortStreamedPost(input: import("../../../domain.js").AbortStreamedPostInput): Promise<import("@khoralabs/chat/persistence").AbortStreamedPostResult>;
45
+ rebuildStreamedPostCache(postId: string): Promise<import("../../../types.js").StreamingPost>;
46
+ setPostVersionSignature(versionId: string, signature: SignedEnvelope): Promise<void>;
47
+ }
48
+ export declare function createTursoChatPersistence(db: SqlDatabase): TursoChatPersistence;
49
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../../src/persistence/turso-serverless/persistence/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SqlDatabase } from "./sql.js";
2
+ export declare const CHAT_SCHEMA = "\nCREATE TABLE IF NOT EXISTS chat_channels (\n id TEXT PRIMARY KEY,\n metadata TEXT,\n created_at_ms INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS chat_threads (\n id TEXT PRIMARY KEY,\n root_type TEXT NOT NULL,\n root_id TEXT NOT NULL,\n root_version_id TEXT,\n default_head_id TEXT,\n metadata TEXT,\n created_at_ms INTEGER NOT NULL,\n archived_at_ms INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS chat_posts (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n post_index INTEGER NOT NULL,\n status TEXT NOT NULL DEFAULT 'complete',\n stream_message TEXT,\n stream_mentions TEXT,\n stream_model TEXT,\n stream_usage TEXT,\n stream_author_scope_type TEXT,\n stream_author_scope_id TEXT,\n stream_revision INTEGER NOT NULL DEFAULT 0,\n completed_version_id TEXT,\n created_at_ms INTEGER NOT NULL,\n updated_at_ms INTEGER,\n deleted_at_ms INTEGER,\n UNIQUE(thread_id, post_index)\n);\n\nCREATE TABLE IF NOT EXISTS chat_post_stream_events (\n id TEXT PRIMARY KEY,\n post_id TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n event_type TEXT NOT NULL,\n revision INTEGER NOT NULL,\n message TEXT,\n delta TEXT,\n mentions TEXT,\n model TEXT,\n usage TEXT,\n idempotency_key TEXT UNIQUE,\n created_at_ms INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS chat_post_versions (\n id TEXT PRIMARY KEY,\n post_id TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n parent_version_id TEXT,\n previous_post_version_id TEXT,\n author_scope_type TEXT NOT NULL,\n author_scope_id TEXT NOT NULL,\n message TEXT NOT NULL,\n mentions TEXT,\n model TEXT,\n usage TEXT,\n content_hash TEXT NOT NULL,\n lineage_hash TEXT NOT NULL,\n signature TEXT,\n idempotency_key TEXT UNIQUE,\n created_at_ms INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS chat_thread_heads (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n name TEXT NOT NULL,\n head_post_version_id TEXT NOT NULL,\n created_at_ms INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS chat_acl_events (\n id TEXT PRIMARY KEY,\n target_type TEXT NOT NULL,\n target_id TEXT NOT NULL,\n event_type TEXT NOT NULL,\n actor_scope_type TEXT NOT NULL,\n actor_scope_id TEXT NOT NULL,\n subject_scope_type TEXT,\n subject_scope_id TEXT,\n role TEXT,\n previous_acl_event_id TEXT,\n content_hash TEXT NOT NULL,\n signature TEXT,\n created_at_ms INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS chat_channel_members (\n channel_id TEXT NOT NULL,\n scope_type TEXT NOT NULL,\n scope_id TEXT NOT NULL,\n role TEXT NOT NULL,\n created_at_ms INTEGER NOT NULL,\n PRIMARY KEY (channel_id, scope_type, scope_id)\n);\n\nCREATE TABLE IF NOT EXISTS chat_thread_participants (\n thread_id TEXT NOT NULL,\n scope_type TEXT NOT NULL,\n scope_id TEXT NOT NULL,\n role TEXT NOT NULL,\n created_at_ms INTEGER NOT NULL,\n PRIMARY KEY (thread_id, scope_type, scope_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_chat_threads_root ON chat_threads(root_type, root_id);\nCREATE INDEX IF NOT EXISTS idx_chat_post_versions_thread ON chat_post_versions(thread_id);\nCREATE INDEX IF NOT EXISTS idx_chat_post_versions_post ON chat_post_versions(post_id);\nCREATE INDEX IF NOT EXISTS idx_chat_posts_thread ON chat_posts(thread_id, post_index);\nCREATE INDEX IF NOT EXISTS idx_chat_post_stream_events_post ON chat_post_stream_events(post_id, revision);\n";
3
+ export declare function ensureChatSchema(db: SqlDatabase): Promise<void>;
4
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/persistence/turso-serverless/persistence/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,eAAO,MAAM,WAAW,iwGAsHvB,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrE"}
@@ -0,0 +1,20 @@
1
+ export type PreparedStatement = {
2
+ run(args?: unknown[]): Promise<unknown>;
3
+ all<T = unknown>(args?: unknown[]): Promise<T[]>;
4
+ get<T = unknown>(args?: unknown[]): Promise<T | null | undefined>;
5
+ };
6
+ export type SqlDatabase = {
7
+ prepare(sql: string): Promise<PreparedStatement> | PreparedStatement;
8
+ exec?(sql: string): Promise<unknown> | unknown;
9
+ };
10
+ export type TursoConfig = {
11
+ url: string;
12
+ authToken: string;
13
+ };
14
+ export declare function createTursoDatabase(config: TursoConfig): SqlDatabase;
15
+ export declare function run(db: SqlDatabase, sql: string, args?: unknown[]): Promise<void>;
16
+ export declare function all<T>(db: SqlDatabase, sql: string, args?: unknown[]): Promise<T[]>;
17
+ export declare function get<T>(db: SqlDatabase, sql: string, args?: unknown[]): Promise<T | null>;
18
+ export declare function exec(db: SqlDatabase, sql: string): Promise<void>;
19
+ export declare function transaction<T>(db: SqlDatabase, fn: () => Promise<T>): Promise<T>;
20
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../../../src/persistence/turso-serverless/persistence/sql.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACjD,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;IACrE,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAEpE;AAMD,wBAAsB,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3F;AAED,wBAAsB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAG7F;AAED,wBAAsB,GAAG,CAAC,CAAC,EACzB,EAAE,EAAE,WAAW,EACf,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,OAAO,EAAO,GACnB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAGnB;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWtE;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CActF"}
@@ -0,0 +1,53 @@
1
+ import { createRequire } from "node:module";
2
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
+
4
+ // src/persistence/turso-serverless/persistence/sql.ts
5
+ import { connect } from "@tursodatabase/serverless";
6
+ function createTursoDatabase(config) {
7
+ return connect({ url: config.url, authToken: config.authToken });
8
+ }
9
+ async function prepare(db, sql) {
10
+ return await Promise.resolve(db.prepare(sql));
11
+ }
12
+ async function run(db, sql, args = []) {
13
+ const stmt = await prepare(db, sql);
14
+ await stmt.run(args);
15
+ }
16
+ async function all(db, sql, args = []) {
17
+ const stmt = await prepare(db, sql);
18
+ return await stmt.all(args);
19
+ }
20
+ async function get(db, sql, args = []) {
21
+ const stmt = await prepare(db, sql);
22
+ return await stmt.get(args) ?? null;
23
+ }
24
+ async function exec(db, sql) {
25
+ if (db.exec !== undefined) {
26
+ await Promise.resolve(db.exec(sql));
27
+ return;
28
+ }
29
+ for (const statement of sql.split(";").map((part) => part.trim()).filter((part) => part.length > 0)) {
30
+ await run(db, statement);
31
+ }
32
+ }
33
+ async function transaction(db, fn) {
34
+ await run(db, "BEGIN IMMEDIATE");
35
+ try {
36
+ const result = await fn();
37
+ await run(db, "COMMIT");
38
+ return result;
39
+ } catch (error) {
40
+ try {
41
+ await run(db, "ROLLBACK");
42
+ } catch {}
43
+ throw error;
44
+ }
45
+ }
46
+ export {
47
+ transaction,
48
+ run,
49
+ get,
50
+ exec,
51
+ createTursoDatabase,
52
+ all
53
+ };
@@ -0,0 +1,27 @@
1
+ import type { AbortStreamedPostInput, AbortStreamedPostResult, ApplyPostDeltaInput, ApplyPostDeltaResult, CompleteStreamedPostInput, CompleteStreamedPostResult, Post, PostStatus, PostStreamEvent, PostVersion, StartStreamedPostInput, StartStreamedPostResult, StreamingPost } from "../../../domain.js";
2
+ import { type SqlDatabase } from "./sql.js";
3
+ export type PostRow = {
4
+ id: string;
5
+ thread_id: string;
6
+ post_index: number;
7
+ status: PostStatus;
8
+ stream_message: string | null;
9
+ stream_mentions: string | null;
10
+ stream_model: string | null;
11
+ stream_usage: string | null;
12
+ stream_author_scope_type: string | null;
13
+ stream_author_scope_id: string | null;
14
+ stream_revision: number;
15
+ completed_version_id: string | null;
16
+ created_at_ms: number;
17
+ updated_at_ms: number | null;
18
+ deleted_at_ms: number | null;
19
+ };
20
+ export declare function postFromRow(row: PostRow, getVersion: (versionId: string) => PostVersion | null): Post | null;
21
+ export declare function listPostStreamEvents(db: SqlDatabase, postId: string): Promise<PostStreamEvent[]>;
22
+ export declare function startStreamedPost(db: SqlDatabase, input: StartStreamedPostInput, getVersion: (versionId: string) => PostVersion | null): Promise<StartStreamedPostResult>;
23
+ export declare function applyPostDelta(db: SqlDatabase, input: ApplyPostDeltaInput, getVersion: (versionId: string) => PostVersion | null): Promise<ApplyPostDeltaResult>;
24
+ export declare function completeStreamedPost(db: SqlDatabase, input: CompleteStreamedPostInput): Promise<CompleteStreamedPostResult>;
25
+ export declare function abortStreamedPost(db: SqlDatabase, input: AbortStreamedPostInput, getVersion: (versionId: string) => PostVersion | null): Promise<AbortStreamedPostResult>;
26
+ export declare function rebuildStreamedPostCache(db: SqlDatabase, postId: string, _getVersion: (versionId: string) => PostVersion | null): Promise<StreamingPost>;
27
+ //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../../../src/persistence/turso-serverless/persistence/streaming.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAE1B,IAAI,EAEJ,UAAU,EACV,eAAe,EAEf,WAAW,EAEX,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,EAEd,MAAM,oBAAoB,CAAC;AAU5B,OAAO,EAAiB,KAAK,WAAW,EAAe,MAAM,UAAU,CAAC;AAIxE,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAkBF,wBAAgB,WAAW,CACzB,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,GACpD,IAAI,GAAG,IAAI,CA2Cb;AAmDD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,EAAE,CAAC,CAkC5B;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,sBAAsB,EAC7B,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,GACpD,OAAO,CAAC,uBAAuB,CAAC,CAiFlC;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,mBAAmB,EAC1B,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,GACpD,OAAO,CAAC,oBAAoB,CAAC,CAiF/B;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAsLrC;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,sBAAsB,EAC7B,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,GACpD,OAAO,CAAC,uBAAuB,CAAC,CAgClC;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,GACrD,OAAO,CAAC,aAAa,CAAC,CAoCxB"}
@@ -0,0 +1,49 @@
1
+ import type { ChatEvent } from "./events.js";
2
+ import type { AbortStreamedPostInput, AbortStreamedPostResult, AddChannelMemberInput, AddThreadParticipantInput, AppendPostInput, ApplyPostDeltaInput, ApplyPostDeltaResult, ChatPersistence, CompleteStreamedPostInput, CreateChannelInput, CreateThreadInput, DeletePostInput, EditPostInput, ListPostsInput, ListThreadsInput, RemoveChannelMemberInput, RemoveThreadParticipantInput, StartStreamedPostInput, StartStreamedPostResult } from "./persistence/core/persistence/types.js";
3
+ import type { Channel, ChatAclEvent, ChatSigner, Post, PostPage, ScopeRef, SignedEnvelope, Thread, ThreadHead, ThreadPage, ThreadTip } from "./types.js";
4
+ export type ChatServiceOptions = {
5
+ signer?: ChatSigner;
6
+ generateId?: () => string;
7
+ now?: () => number;
8
+ onEvent?: (event: ChatEvent) => void;
9
+ };
10
+ export type ChatService = {
11
+ createChannel(input: CreateChannelInput): Promise<Channel>;
12
+ createThread(input: CreateThreadInput): Promise<Thread>;
13
+ getChannel(id: string): Promise<Channel>;
14
+ getThread(id: string): Promise<Thread>;
15
+ getPost(id: string): Promise<Post>;
16
+ listThreads(input: ListThreadsInput): Promise<ThreadPage>;
17
+ listPosts(input: ListPostsInput): Promise<PostPage>;
18
+ getThreadTip(threadId: string): Promise<ThreadTip | null>;
19
+ appendPost(input: AppendPostInput): Promise<{
20
+ post: Post;
21
+ head: ThreadHead;
22
+ }>;
23
+ editPost(input: EditPostInput): Promise<{
24
+ post: Post;
25
+ head: ThreadHead;
26
+ }>;
27
+ deletePost(input: DeletePostInput): Promise<Post>;
28
+ addChannelMember(input: AddChannelMemberInput): Promise<ChatAclEvent>;
29
+ removeChannelMember(input: RemoveChannelMemberInput): Promise<ChatAclEvent>;
30
+ addThreadParticipant(input: AddThreadParticipantInput): Promise<ChatAclEvent>;
31
+ removeThreadParticipant(input: RemoveThreadParticipantInput): Promise<ChatAclEvent>;
32
+ createThreadHead(input: {
33
+ threadId: string;
34
+ name: string;
35
+ headPostVersionId: string;
36
+ }): Promise<ThreadHead>;
37
+ listChannelMembers(channelId: string): Promise<ScopeRef[]>;
38
+ listThreadParticipants(threadId: string): Promise<ScopeRef[]>;
39
+ startStreamedPost(input: StartStreamedPostInput): Promise<StartStreamedPostResult>;
40
+ applyPostDelta(input: ApplyPostDeltaInput): Promise<ApplyPostDeltaResult>;
41
+ completeStreamedPost(input: CompleteStreamedPostInput): Promise<{
42
+ post: Post;
43
+ head: ThreadHead;
44
+ }>;
45
+ abortStreamedPost(input: AbortStreamedPostInput): Promise<AbortStreamedPostResult["post"]>;
46
+ setPostVersionSignature(versionId: string, signature: SignedEnvelope): Promise<void>;
47
+ };
48
+ export declare function createChatService(persistence: ChatPersistence, options?: ChatServiceOptions): ChatService;
49
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { UIMessage } from "ai";
2
+ import type { JsonObject, Mention, PostModelMetadata, PostStreamEvent, PostUsage, StreamingPost } from "./types.js";
3
+ export declare function rebuildStreamCacheFromEvents(events: PostStreamEvent[]): {
4
+ message: UIMessage;
5
+ mentions?: Mention[];
6
+ model?: PostModelMetadata;
7
+ usage?: PostUsage;
8
+ revision: number;
9
+ };
10
+ export declare function streamingPostFromCache(input: {
11
+ postId: string;
12
+ threadId: string;
13
+ author: {
14
+ type: string;
15
+ id: string;
16
+ };
17
+ message: UIMessage;
18
+ mentions?: Mention[];
19
+ model?: PostModelMetadata;
20
+ usage?: PostUsage;
21
+ index: number;
22
+ streamRevision: number;
23
+ createdAtMs: number;
24
+ updatedAtMs?: number | null;
25
+ deletedAtMs?: number | null;
26
+ }): StreamingPost;
27
+ export declare function mergeThreadPostsForList(lineagePosts: Array<{
28
+ index: number;
29
+ post: import("./types.js").CommittedPost;
30
+ }>, activePosts: Array<import("./types.js").StreamingPost | import("./types.js").AbortedPost>): Array<import("./types.js").Post>;
31
+ export type StreamDeltaMetadata = JsonObject;
32
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,EACV,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG;IACvE,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAyCA;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GAAG,aAAa,CAgBhB;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,YAAY,EAAE,aAAa,CAAA;CAAE,CAAC,EAChF,WAAW,EAAE,KAAK,CAAC,OAAO,YAAY,EAAE,aAAa,GAAG,OAAO,YAAY,EAAE,WAAW,CAAC,GACxF,KAAK,CAAC,OAAO,YAAY,EAAE,IAAI,CAAC,CAWlC;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC"}
@@ -0,0 +1,201 @@
1
+ import type { UIMessage } from "ai";
2
+ export type JsonObject = Record<string, unknown>;
3
+ export type ScopeRef = {
4
+ type: string;
5
+ id: string;
6
+ };
7
+ export type Scope = ScopeRef & {
8
+ did?: string;
9
+ displayName?: string;
10
+ metadata?: JsonObject;
11
+ };
12
+ export type SignedEnvelope = {
13
+ algorithm: string;
14
+ signer: ScopeRef;
15
+ keyId?: string;
16
+ signature: string;
17
+ signedAtMs: number;
18
+ };
19
+ export type ChatSigner = {
20
+ sign(payload: Uint8Array, signer: ScopeRef): Promise<SignedEnvelope>;
21
+ };
22
+ export type ChatVerifier = {
23
+ verify(payload: Uint8Array, envelope: SignedEnvelope): Promise<boolean>;
24
+ };
25
+ export type Mention = {
26
+ scope: ScopeRef;
27
+ label: string;
28
+ partIndex?: number;
29
+ startOffset?: number;
30
+ endOffset?: number;
31
+ };
32
+ export type Channel = {
33
+ id: string;
34
+ metadata?: JsonObject;
35
+ createdAtMs: number;
36
+ };
37
+ export type ThreadRoot = {
38
+ type: "channel";
39
+ channelId: string;
40
+ } | {
41
+ type: "post";
42
+ postId: string;
43
+ versionId?: string;
44
+ };
45
+ export type Thread = {
46
+ id: string;
47
+ root: ThreadRoot;
48
+ defaultHeadId?: string | null;
49
+ metadata?: JsonObject;
50
+ createdAtMs: number;
51
+ archivedAtMs?: number | null;
52
+ };
53
+ export type ThreadHead = {
54
+ id: string;
55
+ threadId: string;
56
+ name: string;
57
+ headPostVersionId: string;
58
+ createdAtMs: number;
59
+ };
60
+ /** Default-head tip version for append lineage / provenance. */
61
+ export type ThreadTip = {
62
+ id: string;
63
+ lineageHash: string;
64
+ };
65
+ export type PostVersion = Omit<UIMessage, "id"> & {
66
+ id: string;
67
+ postId: string;
68
+ threadId: string;
69
+ parentVersionId?: string | null;
70
+ previousPostVersionId?: string | null;
71
+ author: ScopeRef;
72
+ contentHash: string;
73
+ lineageHash: string;
74
+ signature?: SignedEnvelope;
75
+ mentions?: Mention[];
76
+ model?: PostModelMetadata;
77
+ usage?: PostUsage;
78
+ createdAtMs: number;
79
+ };
80
+ export type PostStatus = "streaming" | "complete" | "aborted";
81
+ export type PostModelMetadata = {
82
+ provider?: string;
83
+ model?: string;
84
+ gatewayModel?: string;
85
+ finishReason?: string;
86
+ };
87
+ export type PostUsage = {
88
+ inputTokens?: number;
89
+ outputTokens?: number;
90
+ totalTokens?: number;
91
+ reasoningTokens?: number;
92
+ cachedInputTokens?: number;
93
+ };
94
+ export type PostStreamEventType = "stream.started" | "stream.delta" | "stream.completed" | "stream.aborted";
95
+ export type PostStreamEvent = {
96
+ id: string;
97
+ postId: string;
98
+ threadId: string;
99
+ eventType: PostStreamEventType;
100
+ revision: number;
101
+ message?: UIMessage;
102
+ delta?: JsonObject;
103
+ mentions?: Mention[];
104
+ model?: PostModelMetadata;
105
+ usage?: PostUsage;
106
+ idempotencyKey?: string;
107
+ createdAtMs: number;
108
+ };
109
+ export type PostBase = UIMessage & {
110
+ threadId: string;
111
+ author: ScopeRef;
112
+ mentions?: Mention[];
113
+ model?: PostModelMetadata;
114
+ usage?: PostUsage;
115
+ index: number;
116
+ createdAtMs: number;
117
+ updatedAtMs?: number | null;
118
+ deletedAtMs?: number | null;
119
+ };
120
+ export type StreamingPost = PostBase & {
121
+ status: "streaming";
122
+ streamRevision: number;
123
+ };
124
+ export type CommittedPost = PostBase & {
125
+ status: "complete";
126
+ versionId: string;
127
+ previousVersionId?: string | null;
128
+ previousPostVersionId?: string | null;
129
+ contentHash: string;
130
+ lineageHash: string;
131
+ signature?: SignedEnvelope;
132
+ };
133
+ export type AbortedPost = PostBase & {
134
+ status: "aborted";
135
+ streamRevision: number;
136
+ };
137
+ export type Post = StreamingPost | CommittedPost | AbortedPost;
138
+ export type ChannelMember = {
139
+ channelId: string;
140
+ scope: ScopeRef;
141
+ role: string;
142
+ createdAtMs: number;
143
+ };
144
+ export type ThreadParticipant = {
145
+ threadId: string;
146
+ scope: ScopeRef;
147
+ role: string;
148
+ createdAtMs: number;
149
+ };
150
+ export type ChatAclEvent = {
151
+ id: string;
152
+ type: "channel.member.added";
153
+ channelId: string;
154
+ scope: ScopeRef;
155
+ role: string;
156
+ actor: ScopeRef;
157
+ previousAclEventId?: string | null;
158
+ contentHash: string;
159
+ signature?: SignedEnvelope;
160
+ createdAtMs: number;
161
+ } | {
162
+ id: string;
163
+ type: "channel.member.removed";
164
+ channelId: string;
165
+ scope: ScopeRef;
166
+ actor: ScopeRef;
167
+ previousAclEventId?: string | null;
168
+ contentHash: string;
169
+ signature?: SignedEnvelope;
170
+ createdAtMs: number;
171
+ } | {
172
+ id: string;
173
+ type: "thread.participant.added";
174
+ threadId: string;
175
+ scope: ScopeRef;
176
+ role: string;
177
+ actor: ScopeRef;
178
+ previousAclEventId?: string | null;
179
+ contentHash: string;
180
+ signature?: SignedEnvelope;
181
+ createdAtMs: number;
182
+ } | {
183
+ id: string;
184
+ type: "thread.participant.removed";
185
+ threadId: string;
186
+ scope: ScopeRef;
187
+ actor: ScopeRef;
188
+ previousAclEventId?: string | null;
189
+ contentHash: string;
190
+ signature?: SignedEnvelope;
191
+ createdAtMs: number;
192
+ };
193
+ export type ThreadPage = {
194
+ items: Thread[];
195
+ nextCursor?: string | null;
196
+ };
197
+ export type PostPage = {
198
+ items: Post[];
199
+ nextCursor?: string | null;
200
+ };
201
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ThreadRoot } from "./types.js";
2
+ export declare function assertThreadRoot(root: ThreadRoot): void;
3
+ export declare function assertNonEmptyString(value: string, label: string): void;
4
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAUvD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIvE"}
package/package.json ADDED
@@ -0,0 +1,104 @@
1
+ {
2
+ "name": "@khoralabs/chat",
3
+ "version": "0.1.0",
4
+ "description": "Signed chat ledger: service, persistence backends, and HTTP transport",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/khoralabs/chat.git",
10
+ "directory": "packages/chat"
11
+ },
12
+ "homepage": "https://github.com/khoralabs/chat/tree/main/packages/chat#readme",
13
+ "bugs": "https://github.com/khoralabs/chat/issues",
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "build": "bun run ../../scripts/build-package.ts .",
23
+ "typecheck": "tsc --noEmit -p tsconfig.json",
24
+ "test": "bun test",
25
+ "start:http": "bun src/http/server.ts"
26
+ },
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js",
31
+ "default": "./dist/index.js"
32
+ },
33
+ "./persistence": {
34
+ "types": "./dist/persistence/core/persistence/index.d.ts",
35
+ "import": "./dist/persistence/core/persistence/index.js",
36
+ "default": "./dist/persistence/core/persistence/index.js"
37
+ },
38
+ "./sqlite": {
39
+ "types": "./dist/persistence/sqlite/index.d.ts",
40
+ "import": "./dist/persistence/sqlite/index.js",
41
+ "default": "./dist/persistence/sqlite/index.js"
42
+ },
43
+ "./turso-serverless": {
44
+ "types": "./dist/persistence/turso-serverless/index.d.ts",
45
+ "import": "./dist/persistence/turso-serverless/index.js",
46
+ "default": "./dist/persistence/turso-serverless/index.js"
47
+ },
48
+ "./turso-serverless/sql": {
49
+ "types": "./dist/persistence/turso-serverless/persistence/sql.d.ts",
50
+ "import": "./dist/persistence/turso-serverless/persistence/sql.js",
51
+ "default": "./dist/persistence/turso-serverless/persistence/sql.js"
52
+ },
53
+ "./http": {
54
+ "types": "./dist/http/index.d.ts",
55
+ "import": "./dist/http/index.js",
56
+ "default": "./dist/http/index.js"
57
+ },
58
+ "./http/client": {
59
+ "types": "./dist/http/client.d.ts",
60
+ "import": "./dist/http/client.js",
61
+ "default": "./dist/http/client.js"
62
+ },
63
+ "./http/routes": {
64
+ "types": "./dist/http/routes.d.ts",
65
+ "import": "./dist/http/routes.js",
66
+ "default": "./dist/http/routes.js"
67
+ },
68
+ "./http/service": {
69
+ "types": "./dist/http/service.d.ts",
70
+ "import": "./dist/http/service.js",
71
+ "default": "./dist/http/service.js"
72
+ },
73
+ "./http/server": {
74
+ "types": "./dist/http/server.d.ts",
75
+ "import": "./dist/http/server.js",
76
+ "default": "./dist/http/server.js"
77
+ },
78
+ "./testing": {
79
+ "types": "./dist/persistence/testing/index.d.ts",
80
+ "import": "./dist/persistence/testing/index.js",
81
+ "default": "./dist/persistence/testing/index.js"
82
+ }
83
+ },
84
+ "dependencies": {
85
+ "ai": "^7.0.9"
86
+ },
87
+ "peerDependencies": {
88
+ "@tursodatabase/serverless": "*",
89
+ "typescript": "^5"
90
+ },
91
+ "peerDependenciesMeta": {
92
+ "@tursodatabase/serverless": {
93
+ "optional": true
94
+ }
95
+ },
96
+ "devDependencies": {
97
+ "@tursodatabase/serverless": "latest",
98
+ "@types/bun": "latest",
99
+ "typescript": "^5"
100
+ },
101
+ "main": "./dist/index.js",
102
+ "types": "./dist/index.d.ts",
103
+ "module": "./dist/index.js"
104
+ }