@raisindb/client 0.1.5 → 0.1.17

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 (44) hide show
  1. package/README.md +281 -70
  2. package/dist/chunk-DJDP5CX6.mjs +866 -0
  3. package/dist/chunk-DJDP5CX6.mjs.map +1 -0
  4. package/dist/chunk-JRFBP4WK.mjs +170 -0
  5. package/dist/chunk-JRFBP4WK.mjs.map +1 -0
  6. package/dist/chunk-OLJOZIIU.mjs +1348 -0
  7. package/dist/chunk-OLJOZIIU.mjs.map +1 -0
  8. package/dist/chunk-T2ZSNYFG.mjs +248 -0
  9. package/dist/chunk-T2ZSNYFG.mjs.map +1 -0
  10. package/dist/chunk-VZX3ACSO.mjs +190 -0
  11. package/dist/chunk-VZX3ACSO.mjs.map +1 -0
  12. package/dist/chunk-WFBAWOVM.mjs +532 -0
  13. package/dist/chunk-WFBAWOVM.mjs.map +1 -0
  14. package/dist/conversation-list-store-CNcVagmw.d.mts +6120 -0
  15. package/dist/conversation-list-store-CNcVagmw.d.ts +6120 -0
  16. package/dist/index-DQjE-4Oj.d.ts +301 -0
  17. package/dist/index-FkFH4HHQ.d.mts +301 -0
  18. package/dist/index.d.mts +66 -6108
  19. package/dist/index.d.ts +66 -6108
  20. package/dist/index.js +859 -109
  21. package/dist/index.js.map +1 -0
  22. package/dist/index.mjs +639 -3108
  23. package/dist/index.mjs.map +1 -0
  24. package/dist/react.d.mts +4 -0
  25. package/dist/react.d.ts +4 -0
  26. package/dist/react.js +2500 -0
  27. package/dist/react.js.map +1 -0
  28. package/dist/react.mjs +9 -0
  29. package/dist/react.mjs.map +1 -0
  30. package/dist/svelte-sql-62EaYoeM.d.ts +52 -0
  31. package/dist/svelte-sql-CgT-Ij-P.d.mts +52 -0
  32. package/dist/svelte.d.mts +288 -0
  33. package/dist/svelte.d.ts +288 -0
  34. package/dist/svelte.js +2413 -0
  35. package/dist/svelte.js.map +1 -0
  36. package/dist/svelte.mjs +25 -0
  37. package/dist/svelte.mjs.map +1 -0
  38. package/dist/vue.d.mts +197 -0
  39. package/dist/vue.d.ts +197 -0
  40. package/dist/vue.js +1441 -0
  41. package/dist/vue.js.map +1 -0
  42. package/dist/vue.mjs +9 -0
  43. package/dist/vue.mjs.map +1 -0
  44. package/package.json +18 -3
@@ -0,0 +1,190 @@
1
+ import {
2
+ FlowClient
3
+ } from "./chunk-DJDP5CX6.mjs";
4
+ import {
5
+ ConversationListStore,
6
+ ConversationStore
7
+ } from "./chunk-OLJOZIIU.mjs";
8
+
9
+ // src/integrations/svelte/svelte-flow.ts
10
+ function createFlowAdapter(options) {
11
+ let snapshot = {
12
+ events: [],
13
+ status: "idle",
14
+ isRunning: false,
15
+ error: null,
16
+ output: null,
17
+ instanceId: null
18
+ };
19
+ const listeners = /* @__PURE__ */ new Set();
20
+ let aborted = false;
21
+ function emit() {
22
+ for (const cb of listeners) cb(snapshot);
23
+ }
24
+ function update(partial) {
25
+ snapshot = { ...snapshot, ...partial };
26
+ if ("status" in partial) {
27
+ snapshot.isRunning = snapshot.status === "running";
28
+ }
29
+ emit();
30
+ }
31
+ let flowClient = null;
32
+ if (options.database) {
33
+ flowClient = options.database.flow;
34
+ } else if (options.baseUrl && options.repository && options.authManager) {
35
+ flowClient = new FlowClient(
36
+ options.baseUrl,
37
+ options.repository,
38
+ options.authManager,
39
+ options.clientOptions,
40
+ options.flowsApi
41
+ );
42
+ }
43
+ return {
44
+ subscribe(cb) {
45
+ listeners.add(cb);
46
+ return () => {
47
+ listeners.delete(cb);
48
+ };
49
+ },
50
+ getSnapshot: () => snapshot,
51
+ async run(flowPath, input = {}) {
52
+ if (!flowClient) return;
53
+ aborted = false;
54
+ update({
55
+ events: [],
56
+ error: null,
57
+ output: null,
58
+ status: "running"
59
+ });
60
+ try {
61
+ const result = await flowClient.run(flowPath, input);
62
+ update({ instanceId: result.instance_id });
63
+ for await (const event of flowClient.streamEvents(result.instance_id)) {
64
+ if (aborted) break;
65
+ update({ events: [...snapshot.events, event] });
66
+ if (event.type === "flow_waiting") {
67
+ update({ status: "waiting" });
68
+ } else if (event.type === "flow_completed") {
69
+ update({ output: event.output, status: "completed" });
70
+ } else if (event.type === "flow_failed") {
71
+ update({ error: event.error, status: "failed" });
72
+ }
73
+ }
74
+ } catch (err) {
75
+ update({
76
+ error: err instanceof Error ? err.message : String(err),
77
+ status: "failed"
78
+ });
79
+ }
80
+ },
81
+ async resume(data) {
82
+ if (!flowClient || !snapshot.instanceId) return;
83
+ update({ status: "running", error: null });
84
+ try {
85
+ const stream = await flowClient.createEventStream(snapshot.instanceId);
86
+ await flowClient.resume(snapshot.instanceId, data);
87
+ for await (const event of stream.events) {
88
+ if (aborted) break;
89
+ update({ events: [...snapshot.events, event] });
90
+ if (event.type === "flow_waiting") {
91
+ update({ status: "waiting" });
92
+ stream.close();
93
+ return;
94
+ } else if (event.type === "flow_completed") {
95
+ update({ output: event.output, status: "completed" });
96
+ stream.close();
97
+ return;
98
+ } else if (event.type === "flow_failed") {
99
+ update({ error: event.error, status: "failed" });
100
+ stream.close();
101
+ return;
102
+ }
103
+ }
104
+ stream.close();
105
+ } catch (err) {
106
+ update({
107
+ error: err instanceof Error ? err.message : String(err),
108
+ status: "failed"
109
+ });
110
+ }
111
+ },
112
+ reset() {
113
+ aborted = true;
114
+ update({
115
+ events: [],
116
+ status: "idle",
117
+ error: null,
118
+ output: null,
119
+ instanceId: null
120
+ });
121
+ },
122
+ destroy() {
123
+ aborted = true;
124
+ listeners.clear();
125
+ }
126
+ };
127
+ }
128
+
129
+ // src/integrations/svelte/svelte-context.ts
130
+ var RAISIN_CONTEXT_KEY = /* @__PURE__ */ Symbol("raisin");
131
+
132
+ // src/integrations/svelte-conversation.ts
133
+ function createConversationAdapter(options) {
134
+ const store = new ConversationStore(options);
135
+ return {
136
+ /** The underlying ConversationStore instance */
137
+ store,
138
+ /** Get the current snapshot */
139
+ getSnapshot: () => store.getSnapshot(),
140
+ /** Subscribe to snapshot changes. Returns unsubscribe function. */
141
+ subscribe: (cb) => store.subscribe(cb),
142
+ /** Send a user message */
143
+ sendMessage: (content) => store.sendMessage(content),
144
+ /** Load persisted messages */
145
+ loadMessages: () => store.loadMessages(),
146
+ /** Approve a pending plan */
147
+ approvePlan: (planPath) => store.approvePlan(planPath),
148
+ /** Reject a pending plan */
149
+ rejectPlan: (planPath, feedback) => store.rejectPlan(planPath, feedback),
150
+ /** Mark a message as read */
151
+ markMessageAsRead: (messagePath) => store.markMessageAsRead(messagePath),
152
+ /** Stop streaming */
153
+ stop: () => store.stop(),
154
+ /** Get the conversation path */
155
+ getConversationPath: () => store.getConversationPath(),
156
+ /** Destroy the store and release resources */
157
+ destroy: () => store.destroy()
158
+ };
159
+ }
160
+ function createConversationListAdapter(options) {
161
+ const store = new ConversationListStore(options);
162
+ return {
163
+ /** The underlying ConversationListStore instance */
164
+ store,
165
+ /** Get the current snapshot */
166
+ getSnapshot: () => store.getSnapshot(),
167
+ /** Subscribe to snapshot changes. Returns unsubscribe function. */
168
+ subscribe: (cb) => store.subscribe(cb),
169
+ /** Load conversations from the server */
170
+ load: () => store.load(),
171
+ /** Create a new conversation */
172
+ createConversation: (opts) => store.createConversation(opts),
173
+ /** Delete a conversation */
174
+ deleteConversation: (path) => store.deleteConversation(path),
175
+ /** Mark a conversation as read */
176
+ markAsRead: (path) => store.markAsRead(path),
177
+ /** Get or create a ConversationStore for a specific path */
178
+ getConversationStore: (path) => store.getConversationStore(path),
179
+ /** Destroy the store and release resources */
180
+ destroy: () => store.destroy()
181
+ };
182
+ }
183
+
184
+ export {
185
+ createConversationAdapter,
186
+ createConversationListAdapter,
187
+ createFlowAdapter,
188
+ RAISIN_CONTEXT_KEY
189
+ };
190
+ //# sourceMappingURL=chunk-VZX3ACSO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integrations/svelte/svelte-flow.ts","../src/integrations/svelte/svelte-context.ts","../src/integrations/svelte-conversation.ts"],"sourcesContent":["import { FlowClient } from '../../flow-client';\nimport type { FlowClientOptions } from '../../flow-client';\nimport type { AuthManager } from '../../auth';\nimport type { FlowsApi } from '../../flows';\nimport type { Database } from '../../database';\nimport type { FlowExecutionEvent } from '../../types/flow';\n\nexport type FlowStatus = 'idle' | 'running' | 'waiting' | 'completed' | 'failed';\n\nexport interface FlowSnapshot {\n events: FlowExecutionEvent[];\n status: FlowStatus;\n isRunning: boolean;\n error: string | null;\n output: unknown | null;\n instanceId: string | null;\n}\n\nexport interface FlowAdapterOptions {\n database?: Database;\n baseUrl?: string;\n repository?: string;\n authManager?: AuthManager;\n clientOptions?: FlowClientOptions;\n flowsApi?: FlowsApi;\n}\n\nexport interface FlowAdapter {\n subscribe: (cb: (snapshot: FlowSnapshot) => void) => () => void;\n getSnapshot: () => FlowSnapshot;\n run: (flowPath: string, input?: Record<string, unknown>) => Promise<void>;\n resume: (data: unknown) => Promise<void>;\n reset: () => void;\n destroy: () => void;\n}\n\n/**\n * Create a flow execution adapter for Svelte 5.\n *\n * Manages the full flow lifecycle: starting, streaming events, resuming\n * waiting flows, and tracking completion. Bind snapshot to `$state` for reactivity.\n *\n * @example\n * ```typescript\n * // lib/flow.svelte.ts\n * import { createFlowAdapter } from '@raisindb/client/svelte';\n * import { db } from '$lib/raisin';\n *\n * const adapter = createFlowAdapter({ database: db });\n * let snapshot = $state(adapter.getSnapshot());\n * adapter.subscribe(s => { snapshot = s; });\n *\n * export const flow = {\n * get events() { return snapshot.events; },\n * get status() { return snapshot.status; },\n * get isRunning() { return snapshot.isRunning; },\n * get error() { return snapshot.error; },\n * get output() { return snapshot.output; },\n * run: adapter.run,\n * resume: adapter.resume,\n * reset: adapter.reset,\n * };\n * ```\n */\nexport function createFlowAdapter(options: FlowAdapterOptions): FlowAdapter {\n let snapshot: FlowSnapshot = {\n events: [],\n status: 'idle',\n isRunning: false,\n error: null,\n output: null,\n instanceId: null,\n };\n\n const listeners = new Set<(s: FlowSnapshot) => void>();\n let aborted = false;\n\n function emit() {\n for (const cb of listeners) cb(snapshot);\n }\n\n function update(partial: Partial<FlowSnapshot>) {\n snapshot = { ...snapshot, ...partial };\n if ('status' in partial) {\n snapshot.isRunning = snapshot.status === 'running';\n }\n emit();\n }\n\n // Resolve FlowClient\n let flowClient: FlowClient | null = null;\n if (options.database) {\n flowClient = options.database.flow;\n } else if (options.baseUrl && options.repository && options.authManager) {\n flowClient = new FlowClient(\n options.baseUrl,\n options.repository,\n options.authManager,\n options.clientOptions,\n options.flowsApi,\n );\n }\n\n return {\n subscribe(cb: (s: FlowSnapshot) => void) {\n listeners.add(cb);\n return () => { listeners.delete(cb); };\n },\n\n getSnapshot: () => snapshot,\n\n async run(flowPath: string, input: Record<string, unknown> = {}) {\n if (!flowClient) return;\n\n aborted = false;\n update({\n events: [],\n error: null,\n output: null,\n status: 'running',\n });\n\n try {\n const result = await flowClient.run(flowPath, input);\n update({ instanceId: result.instance_id });\n\n for await (const event of flowClient.streamEvents(result.instance_id)) {\n if (aborted) break;\n\n update({ events: [...snapshot.events, event] });\n\n if (event.type === 'flow_waiting') {\n update({ status: 'waiting' });\n } else if (event.type === 'flow_completed') {\n update({ output: event.output, status: 'completed' });\n } else if (event.type === 'flow_failed') {\n update({ error: event.error, status: 'failed' });\n }\n }\n } catch (err) {\n update({\n error: err instanceof Error ? err.message : String(err),\n status: 'failed',\n });\n }\n },\n\n async resume(data: unknown) {\n if (!flowClient || !snapshot.instanceId) return;\n\n update({ status: 'running', error: null });\n\n try {\n const stream = await flowClient.createEventStream(snapshot.instanceId);\n await flowClient.resume(snapshot.instanceId, data);\n\n for await (const event of stream.events) {\n if (aborted) break;\n\n update({ events: [...snapshot.events, event] });\n\n if (event.type === 'flow_waiting') {\n update({ status: 'waiting' });\n stream.close();\n return;\n } else if (event.type === 'flow_completed') {\n update({ output: event.output, status: 'completed' });\n stream.close();\n return;\n } else if (event.type === 'flow_failed') {\n update({ error: event.error, status: 'failed' });\n stream.close();\n return;\n }\n }\n\n stream.close();\n } catch (err) {\n update({\n error: err instanceof Error ? err.message : String(err),\n status: 'failed',\n });\n }\n },\n\n reset() {\n aborted = true;\n update({\n events: [],\n status: 'idle',\n error: null,\n output: null,\n instanceId: null,\n });\n },\n\n destroy() {\n aborted = true;\n listeners.clear();\n },\n };\n}\n","import type { RaisinClient } from '../../client';\n\n/**\n * Context value for the RaisinDB Svelte integration.\n *\n * Use with Svelte's `setContext`/`getContext` in `.svelte` files.\n *\n * @example Setup in `+layout.svelte`:\n * ```svelte\n * <script>\n * import { setContext } from 'svelte';\n * import { RAISIN_CONTEXT_KEY, type RaisinContext } from '@raisindb/client/svelte';\n * import { client } from '$lib/raisin';\n *\n * setContext<RaisinContext>(RAISIN_CONTEXT_KEY, { client, repository: 'myrepo' });\n * </script>\n *\n * {@render children()}\n * ```\n *\n * @example Usage in a child component:\n * ```svelte\n * <script>\n * import { getContext } from 'svelte';\n * import { RAISIN_CONTEXT_KEY, type RaisinContext } from '@raisindb/client/svelte';\n *\n * const { client, repository } = getContext<RaisinContext>(RAISIN_CONTEXT_KEY);\n * const db = client.database(repository!);\n * </script>\n * ```\n */\nexport interface RaisinContext {\n client: RaisinClient;\n repository?: string;\n}\n\n/**\n * Shared context key for RaisinDB. Use this with `setContext` and `getContext`\n * to ensure consistent key usage across your application.\n */\nexport const RAISIN_CONTEXT_KEY: unique symbol = Symbol('raisin');\n","/**\n * Svelte 5 helpers for RaisinDB conversation stores.\n *\n * Unlike the React integration which provides hooks, the Svelte 5 integration\n * provides factory functions that return objects designed to work seamlessly\n * with Svelte 5 runes. Use these in `.svelte.ts` files with `$state`.\n *\n * The SDK stores (ConversationStore, ConversationListStore) already have a\n * `.subscribe(callback)` API compatible with Svelte's reactivity. These\n * helpers simplify the most common patterns.\n *\n * @example Svelte 5 runes (in .svelte.ts file):\n * ```typescript\n * // stores/chat.svelte.ts\n * import { ConversationStore, type ConversationStoreSnapshot, type Database } from '@raisindb/client';\n *\n * class ChatState {\n * snapshot = $state<ConversationStoreSnapshot | null>(null);\n * #store: ConversationStore | null = null;\n * #unsub: (() => void) | null = null;\n *\n * get messages() { return this.snapshot?.messages ?? []; }\n * get isStreaming() { return this.snapshot?.isStreaming ?? false; }\n * get streamingText() { return this.snapshot?.streamingText ?? ''; }\n * get plans() { return this.snapshot?.plans ?? []; }\n * get error() { return this.snapshot?.error ?? null; }\n *\n * async open(db: Database, path: string) {\n * this.close();\n * this.#store = new ConversationStore({ database: db, conversationPath: path });\n * this.#unsub = this.#store.subscribe(s => { this.snapshot = s; });\n * await this.#store.loadMessages();\n * }\n *\n * sendMessage = async (content: string) => {\n * await this.#store?.sendMessage(content);\n * };\n *\n * close() {\n * this.#unsub?.();\n * this.#store?.destroy();\n * this.#store = null;\n * this.snapshot = null;\n * }\n * }\n *\n * export const chat = new ChatState();\n * ```\n *\n * @example In a .svelte component:\n * ```svelte\n * <script>\n * import { chat } from '$lib/stores/chat.svelte';\n *\n * // Properties are reactive — no $ prefix needed\n * const messages = $derived(chat.messages);\n * </script>\n *\n * {#each messages as msg}\n * <div>{msg.content}</div>\n * {/each}\n * {#if chat.isStreaming}\n * <p class=\"streaming\">{chat.streamingText}</p>\n * {/if}\n * ```\n *\n * @module\n */\n\nimport {\n ConversationStore,\n type ConversationStoreOptions,\n type ConversationStoreSnapshot,\n} from '../stores/conversation-store';\nimport {\n ConversationListStore,\n type ConversationListStoreOptions,\n type ConversationListSnapshot,\n} from '../stores/conversation-list-store';\n\n/**\n * Create a conversation store adapter for Svelte 5.\n *\n * Returns an object with the store, a snapshot getter, actions, and a\n * destroy function. In a `.svelte.ts` file, bind `snapshot` to `$state`\n * to get fine-grained reactivity.\n *\n * @example\n * ```typescript\n * const adapter = createConversationAdapter({ database: db, conversationPath: path });\n * let snapshot = $state(adapter.getSnapshot());\n * adapter.subscribe(s => { snapshot = s; });\n * // ...later\n * adapter.destroy();\n * ```\n */\nexport function createConversationAdapter(options: ConversationStoreOptions) {\n const store = new ConversationStore(options);\n\n return {\n /** The underlying ConversationStore instance */\n store,\n\n /** Get the current snapshot */\n getSnapshot: (): ConversationStoreSnapshot => store.getSnapshot(),\n\n /** Subscribe to snapshot changes. Returns unsubscribe function. */\n subscribe: (cb: (s: ConversationStoreSnapshot) => void) => store.subscribe(cb),\n\n /** Send a user message */\n sendMessage: (content: string) => store.sendMessage(content),\n\n /** Load persisted messages */\n loadMessages: () => store.loadMessages(),\n\n /** Approve a pending plan */\n approvePlan: (planPath: string) => store.approvePlan(planPath),\n\n /** Reject a pending plan */\n rejectPlan: (planPath: string, feedback?: string) => store.rejectPlan(planPath, feedback),\n\n /** Mark a message as read */\n markMessageAsRead: (messagePath: string) => store.markMessageAsRead(messagePath),\n\n /** Stop streaming */\n stop: () => store.stop(),\n\n /** Get the conversation path */\n getConversationPath: () => store.getConversationPath(),\n\n /** Destroy the store and release resources */\n destroy: () => store.destroy(),\n };\n}\n\n/**\n * Create a conversation list store adapter for Svelte 5.\n *\n * @example\n * ```typescript\n * const adapter = createConversationListAdapter({ database: db, realtime: true });\n * let snapshot = $state(adapter.getSnapshot());\n * adapter.subscribe(s => { snapshot = s; });\n * await adapter.load();\n * ```\n */\nexport function createConversationListAdapter(options: ConversationListStoreOptions) {\n const store = new ConversationListStore(options);\n\n return {\n /** The underlying ConversationListStore instance */\n store,\n\n /** Get the current snapshot */\n getSnapshot: (): ConversationListSnapshot => store.getSnapshot(),\n\n /** Subscribe to snapshot changes. Returns unsubscribe function. */\n subscribe: (cb: (s: ConversationListSnapshot) => void) => store.subscribe(cb),\n\n /** Load conversations from the server */\n load: () => store.load(),\n\n /** Create a new conversation */\n createConversation: (opts: { participant: string; subject?: string; input?: Record<string, unknown> }) =>\n store.createConversation(opts),\n\n /** Delete a conversation */\n deleteConversation: (path: string) => store.deleteConversation(path),\n\n /** Mark a conversation as read */\n markAsRead: (path: string) => store.markAsRead(path),\n\n /** Get or create a ConversationStore for a specific path */\n getConversationStore: (path: string) => store.getConversationStore(path),\n\n /** Destroy the store and release resources */\n destroy: () => store.destroy(),\n };\n}\n"],"mappings":"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","names":[]}