@mikesaintsg/core 0.0.1 → 0.0.3

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/README.md CHANGED
@@ -1,365 +1,320 @@
1
- # @mikesaintsg/core
2
-
3
- > Shared types, contracts, bridge functions, and adapters for the @mikesaintsg ecosystem.
4
-
5
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
6
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
-
8
- ## Overview
9
-
10
- `@mikesaintsg/core` provides the integration layer for the @mikesaintsg ecosystem, including:
11
-
12
- - **Shared Types** — Contracts used across multiple packages
13
- - **Result Pattern** — Functional error handling helpers
14
- - **Embedding Adapters** — OpenAI, Anthropic (Voyage AI), batched, cached
15
- - **Tool Format Adapters** — Convert between internal and provider formats
16
- - **Persistence Adapters** — IndexedDB, OPFS, HTTP for VectorStore
17
- - **Bridge Functions** — Connect packages without circular dependencies
18
-
19
- ## Installation
20
-
21
- ```bash
22
- npm install @mikesaintsg/core
23
- ```
24
-
25
- ## Quick Start
26
-
27
- ### Result Pattern
28
-
29
- Handle errors functionally without try/catch:
30
-
31
- ```typescript
32
- import { ok, err, isOk, map, chain } from '@mikesaintsg/core'
33
- import type { Result } from '@mikesaintsg/core'
34
-
35
- // Create results
36
- const success = ok(42)
37
- const failure = err('NOT_FOUND')
38
-
39
- // Check and unwrap
40
- if (isOk(success)) {
41
- console.log(success.value) // 42
42
- }
43
-
44
- // Transform values
45
- const doubled = map(ok(5), x => x * 2) // ok(10)
46
-
47
- // Chain operations
48
- function parse(s: string): Result<number, string> {
49
- const n = parseInt(s, 10)
50
- return isNaN(n) ? err('PARSE_ERROR') : ok(n)
51
- }
52
-
53
- const result = chain(ok('42'), parse) // ok(42)
54
- ```
55
-
56
- ### Tool Call Bridge
57
-
58
- Connect LLM tool calls to a tool registry:
59
-
60
- ```typescript
61
- import { createToolCallBridge } from '@mikesaintsg/core'
62
- import type { ToolRegistryMinimal, ToolCall } from '@mikesaintsg/core'
63
-
64
- // Create a minimal registry (from contextprotocol or custom)
65
- const registry: ToolRegistryMinimal = {
66
- has: (name) => name === 'get_weather',
67
- execute: async (name, args) => {
68
- if (name === 'get_weather') {
69
- return { temperature: 72, conditions: 'sunny' }
70
- }
71
- throw new Error('Unknown tool')
72
- }
73
- }
74
-
75
- // Create bridge
76
- const bridge = createToolCallBridge({
77
- registry,
78
- timeout: 30000,
79
- onError: (error, toolCall) => console.error(`Tool ${toolCall.name} failed:`, error),
80
- })
81
-
82
- // Execute tool calls from LLM
83
- const toolCall: ToolCall = {
84
- id: 'call-1',
85
- name: 'get_weather',
86
- arguments: { location: 'Seattle' },
87
- }
88
-
89
- const result = await bridge.execute(toolCall)
90
- // { callId: 'call-1', name: 'get_weather', success: true, value: { temperature: 72, conditions: 'sunny' } }
91
- ```
92
-
93
- ### Retrieval Tool Factory
94
-
95
- Create vectorstore-backed tools for RAG:
96
-
97
- ```typescript
98
- import { createRetrievalTool } from '@mikesaintsg/core'
99
- import type { VectorStoreMinimal } from '@mikesaintsg/core'
100
-
101
- // Your vectorstore implementation
102
- const vectorStore: VectorStoreMinimal = {
103
- search: async (query, options) => {
104
- // Return scored results from your vector database
105
- return [
106
- { id: '1', content: 'Relevant document', score: 0.95 },
107
- ]
108
- }
109
- }
110
-
111
- // Create retrieval tool
112
- const { schema, handler } = createRetrievalTool({
113
- vectorStore,
114
- name: 'search_knowledge',
115
- description: 'Search the knowledge base for relevant information',
116
- defaultLimit: 5,
117
- scoreThreshold: 0.7,
118
- })
119
-
120
- // Register with your tool registry
121
- registry.register(schema.name, handler)
122
- ```
123
-
124
- ### Form Dirty Guard
125
-
126
- Prevent navigation when forms have unsaved changes:
127
-
128
- ```typescript
129
- import { createFormDirtyGuard } from '@mikesaintsg/core'
130
- import type { FormMinimal } from '@mikesaintsg/core'
131
-
132
- const form: FormMinimal = {
133
- isDirty: () => formState.hasUnsavedChanges,
134
- }
135
-
136
- const guard = createFormDirtyGuard({
137
- form,
138
- confirmFn: (message) => window.confirm(message),
139
- message: 'You have unsaved changes. Are you sure you want to leave?',
140
- excludePages: ['logout', 'help'],
141
- })
142
-
143
- // Use with your router
144
- router.beforeNavigate(guard)
145
- ```
146
-
147
- ### Session Persistence
148
-
149
- Persist inference sessions to IndexedDB:
150
-
151
- ```typescript
152
- import { createSessionPersistence } from '@mikesaintsg/core'
153
- import type { MinimalDatabaseAccess } from '@mikesaintsg/core'
154
-
155
- // Your database implementation (from @mikesaintsg/indexeddb)
156
- const database: MinimalDatabaseAccess = createDatabase({ name: 'sessions' })
157
-
158
- const persistence = createSessionPersistence({
159
- database,
160
- storeName: 'chat_sessions',
161
- autoprune: 7 * 24 * 60 * 60 * 1000, // 7 days
162
- })
163
-
164
- // Save session
165
- await persistence.save('session-1', session)
166
-
167
- // Load session
168
- const saved = await persistence.load('session-1')
169
-
170
- // List all sessions
171
- const sessionIds = await persistence.list()
172
-
173
- // Prune old sessions
174
- const prunedCount = await persistence.prune(24 * 60 * 60 * 1000)
175
- ```
176
-
177
- ### Embedding Adapters
178
-
179
- Generate embeddings with OpenAI or Anthropic:
180
-
181
- ```typescript
182
- import {
183
- createOpenAIEmbeddingAdapter,
184
- createAnthropicEmbeddingAdapter,
185
- createBatchedEmbeddingAdapter,
186
- createEmbeddingCache,
187
- } from '@mikesaintsg/core'
188
-
189
- // OpenAI adapter
190
- const openai = createOpenAIEmbeddingAdapter({
191
- apiKey: process.env.OPENAI_API_KEY,
192
- model: 'text-embedding-3-small',
193
- })
194
-
195
- // Anthropic adapter (uses Voyage AI)
196
- const anthropic = createAnthropicEmbeddingAdapter({
197
- apiKey: process.env.VOYAGE_API_KEY,
198
- model: 'voyage-2',
199
- })
200
-
201
- // Add batching and caching
202
- const cache = createEmbeddingCache({ maxEntries: 1000, ttlMs: 3600000 })
203
- const batched = createBatchedEmbeddingAdapter(openai, {
204
- maxBatchSize: 100,
205
- flushDelayMs: 50,
206
- deduplicate: true,
207
- cache,
208
- })
209
-
210
- // Generate embeddings
211
- const embeddings = await batched.queueBatch([
212
- 'Hello, world!',
213
- 'How are you?',
214
- ])
215
- ```
216
-
217
- ### Tool Format Adapters
218
-
219
- Convert tool schemas between formats:
220
-
221
- ```typescript
222
- import {
223
- createOpenAIToolFormatAdapter,
224
- createAnthropicToolFormatAdapter,
225
- } from '@mikesaintsg/core'
226
- import type { ToolSchema } from '@mikesaintsg/core'
227
-
228
- const schema: ToolSchema = {
229
- name: 'get_weather',
230
- description: 'Get the current weather',
231
- parameters: {
232
- type: 'object',
233
- properties: {
234
- location: { type: 'string', description: 'City name' },
235
- },
236
- required: ['location'],
237
- },
238
- }
239
-
240
- // OpenAI format
241
- const openaiAdapter = createOpenAIToolFormatAdapter()
242
- const openaiTools = openaiAdapter.formatSchemas([schema])
243
-
244
- // Anthropic format
245
- const anthropicAdapter = createAnthropicToolFormatAdapter()
246
- const anthropicTools = anthropicAdapter.formatSchemas([schema])
247
- ```
248
-
249
- ### Persistence Adapters
250
-
251
- Store VectorStore data in different backends:
252
-
253
- ```typescript
254
- import {
255
- createIndexedDBVectorStorePersistence,
256
- createOPFSVectorStorePersistence,
257
- createHTTPVectorStorePersistence,
258
- } from '@mikesaintsg/core'
259
-
260
- // IndexedDB
261
- const idbPersistence = createIndexedDBVectorStorePersistence({
262
- database,
263
- documentsStore: 'embeddings',
264
- })
265
-
266
- // OPFS (Origin Private File System)
267
- const opfsPersistence = createOPFSVectorStorePersistence({
268
- directory,
269
- chunkSize: 100,
270
- })
271
-
272
- // HTTP (remote storage)
273
- const httpPersistence = createHTTPVectorStorePersistence({
274
- baseURL: 'https://api.example.com/vectors',
275
- headers: { Authorization: 'Bearer token' },
276
- timeout: 30000,
277
- })
278
- ```
279
-
280
- ## API Reference
281
-
282
- ### Result Pattern
283
-
284
- | Function | Description |
285
- |----------|-------------|
286
- | `ok(value)` | Create a success result |
287
- | `err(error)` | Create a failure result |
288
- | `isOk(result)` | Check if result is success |
289
- | `isErr(result)` | Check if result is failure |
290
- | `unwrap(result, default)` | Get value or default |
291
- | `unwrapOrThrow(result)` | Get value or throw |
292
- | `map(result, fn)` | Transform success value |
293
- | `mapErr(result, fn)` | Transform error value |
294
- | `chain(result, fn)` | Sequence operations |
295
-
296
- ### Bridge Functions
297
-
298
- | Function | Description |
299
- |----------|-------------|
300
- | `createToolCallBridge(options)` | Connect tool calls to registry |
301
- | `createRetrievalTool(options)` | Create vectorstore search tool |
302
- | `createFormDirtyGuard(options)` | Navigation guard for dirty forms |
303
- | `createSessionPersistence(options)` | Persist sessions to IndexedDB |
304
-
305
- ### Embedding Adapters
306
-
307
- | Function | Description |
308
- |----------|-------------|
309
- | `createOpenAIEmbeddingAdapter(options)` | OpenAI embeddings API |
310
- | `createAnthropicEmbeddingAdapter(options)` | Voyage AI embeddings |
311
- | `createBatchedEmbeddingAdapter(adapter, options)` | Batching wrapper |
312
- | `createEmbeddingCache(options)` | LRU cache with TTL |
313
-
314
- ### Tool Format Adapters
315
-
316
- | Function | Description |
317
- |----------|-------------|
318
- | `createOpenAIToolFormatAdapter(options)` | OpenAI tool format |
319
- | `createAnthropicToolFormatAdapter(options)` | Anthropic tool format |
320
-
321
- ### Persistence Adapters
322
-
323
- | Function | Description |
324
- |----------|-------------|
325
- | `createIndexedDBVectorStorePersistence(options)` | IndexedDB storage |
326
- | `createOPFSVectorStorePersistence(options)` | OPFS storage |
327
- | `createHTTPVectorStorePersistence(options)` | HTTP storage |
328
-
329
- ## Types
330
-
331
- All types are exported from the main entry point:
332
-
333
- ```typescript
334
- import type {
335
- // Result pattern
336
- Result, Ok, Err,
337
-
338
- // Embedding types
339
- Embedding, EmbeddingAdapterInterface, EmbeddingModelMetadata,
340
-
341
- // Tool types
342
- ToolCall, ToolResult, ToolSchema, JSONSchema7,
343
-
344
- // Bridge types
345
- ToolCallBridgeInterface, ToolRegistryMinimal,
346
- RetrievalToolOptions, VectorStoreMinimal,
347
- FormDirtyGuardOptions, NavigationGuard,
348
- SessionPersistenceInterface, SerializedSession,
349
-
350
- // Persistence types
351
- VectorStorePersistenceAdapterInterface, StoredDocument,
352
-
353
- // Minimal cross-package interfaces
354
- MinimalDatabaseAccess, MinimalStoreAccess,
355
- MinimalDirectoryAccess, MinimalFileAccess,
356
- } from '@mikesaintsg/core'
357
- ```
358
-
359
- ## License
360
-
361
- MIT © mikesaintsg
362
-
363
- ## Contributing
364
-
365
- See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
1
+ # @mikesaintsg/core
2
+
3
+ > **Shared types, contracts, and bridge functions for the @mikesaintsg ecosystem.**
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@mikesaintsg/core.svg)](https://www.npmjs.com/package/@mikesaintsg/core)
6
+ [![bundle size](https://img.shields.io/bundlephobia/minzip/@mikesaintsg/core)](https://bundlephobia.com/package/@mikesaintsg/core)
7
+ [![license](https://img.shields.io/npm/l/@mikesaintsg/core.svg)](LICENSE)
8
+
9
+ ---
10
+
11
+ ## Features
12
+
13
+ - **Shared Types** — Contracts used across multiple packages
14
+ - **Result Pattern** — Functional error handling (`ok`, `err`, `map`, `chain`)
15
+ - **Bridge Functions** — Connect packages without circular dependencies
16
+ - **Adapter Interfaces** — Embedding, tool format, persistence, and policy adapters
17
+ - **Base Error Class** — `EcosystemError` for all package-specific errors
18
+ - ✅ **Content Hashing** — SHA-256 based deduplication support
19
+ - ✅ **Zero dependencies** — Built on native platform APIs
20
+ - ✅ **TypeScript first** — Full type safety with generics
21
+ - ✅ **Tree-shakeable** — ESM-only, import what you need
22
+
23
+ ---
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ npm install @mikesaintsg/core
29
+ ```
30
+
31
+ ---
32
+
33
+ ## Quick Start
34
+
35
+ ### Result Pattern
36
+
37
+ ```ts
38
+ import { ok, err, isOk, map, chain } from '@mikesaintsg/core'
39
+ import type { Result } from '@mikesaintsg/core'
40
+
41
+ // Create results
42
+ const success = ok(42)
43
+ const failure = err('NOT_FOUND')
44
+
45
+ // Check and unwrap
46
+ if (isOk(success)) {
47
+ console.log(success.value) // 42
48
+ }
49
+
50
+ // Transform values
51
+ const doubled = map(ok(5), x => x * 2) // ok(10)
52
+
53
+ // Chain operations
54
+ function parse(s: string): Result<number, string> {
55
+ const n = parseInt(s, 10)
56
+ return isNaN(n) ? err('PARSE_ERROR') : ok(n)
57
+ }
58
+
59
+ const result = chain(ok('42'), parse) // ok(42)
60
+ ```
61
+
62
+ ### Content Hashing
63
+
64
+ ```ts
65
+ import { computeContentHash } from '@mikesaintsg/core'
66
+
67
+ const hash = await computeContentHash('Hello, world!')
68
+ // 'a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e'
69
+ ```
70
+
71
+ ### Tool Call Bridge
72
+
73
+ ```ts
74
+ import { createToolCallBridge } from '@mikesaintsg/core'
75
+
76
+ const bridge = createToolCallBridge({
77
+ registry,
78
+ timeout: 30000,
79
+ onError: (error, toolCall) => console.error(error),
80
+ })
81
+
82
+ // Execute single call
83
+ const result = await bridge.execute(toolCall)
84
+
85
+ // Execute multiple calls in parallel
86
+ const results = await bridge.execute([call1, call2, call3])
87
+ ```
88
+
89
+ ---
90
+
91
+ ## Documentation
92
+
93
+ 📚 **[Full API Guide](./guides/core.md)** — Comprehensive documentation with examples
94
+
95
+ ### Key Sections
96
+
97
+ - [Introduction](./guides/core.md#introduction) — Value proposition and use cases
98
+ - [Core Concepts](./guides/core.md#core-concepts) Understand the fundamentals
99
+ - [Result Pattern](./guides/core.md#result-pattern) Functional error handling
100
+ - [Bridge Interfaces](./guides/core.md#bridge-interfaces) — Cross-package communication
101
+ - [API Reference](./guides/core.md#api-reference) — Complete API documentation
102
+
103
+ ---
104
+
105
+ ## API Overview
106
+
107
+ ### Result Functions
108
+
109
+ | Function | Description |
110
+ |------------------------------|------------------------------|
111
+ | `ok(value)` | Create a success result |
112
+ | `err(error)` | Create a failure result |
113
+ | `isOk(result)` | Check if result is success |
114
+ | `isErr(result)` | Check if result is failure |
115
+ | `unwrap(result, default)` | Get value or default |
116
+ | `unwrapOrThrow(result)` | Get value or throw error |
117
+ | `map(result, fn)` | Transform success value |
118
+ | `mapErr(result, fn)` | Transform error value |
119
+ | `chain(result, fn)` | Chain results (flatMap) |
120
+
121
+ ### Content Hashing
122
+
123
+ | Function | Description |
124
+ |------------------------------|------------------------------|
125
+ | `computeContentHash(text)` | SHA-256 hash for text |
126
+
127
+ ### Bridge Helper Functions
128
+
129
+ | Function | Description |
130
+ |------------------------------|-----------------------------------|
131
+ | `isToolCall(value)` | Type guard for ToolCall objects |
132
+ | `shouldSkipFormGuard(...)` | Check if form guard should skip |
133
+ | `formatScoredResult(result)` | Default result formatter |
134
+
135
+ ### Factory Functions
136
+
137
+ | Function | Description |
138
+ |-------------------------------------|----------------------------------|
139
+ | `createToolCallBridge(options)` | Connect tool calls to registry |
140
+ | `createRetrievalTool(options)` | Create vectorstore search tool |
141
+ | `createFormDirtyGuard(options)` | Navigation guard for dirty forms |
142
+ | `createSessionPersistence(options)` | Session storage adapter |
143
+
144
+ ### Error Handling
145
+
146
+ | Export | Description |
147
+ |------------------------|------------------------------------|
148
+ | `EcosystemError` | Base error class for all packages |
149
+ | `isEcosystemError(e)` | Type guard for ecosystem errors |
150
+
151
+ ### Shared Types
152
+
153
+ | Type | Description |
154
+ |-------------------------------------------|---------------------------------------|
155
+ | `Result<T, E>` | Success or failure union |
156
+ | `Ok<T>`, `Err<E>` | Result discriminants |
157
+ | `Unsubscribe` | Cleanup function type |
158
+ | `DestroyFn` | Resource cleanup function |
159
+ | `SubscriptionToHook<T>` | Convert subscriptions to hooks |
160
+ | `Embedding` | Float32Array embedding vector |
161
+ | `ToolCall`, `ToolResult`, `ToolSchema` | Tool-related types |
162
+ | `ScoredResult` | Search result with score |
163
+ | `ContextFrame`, `BuiltContext` | Context management types |
164
+ | `TokenBudgetState`, `TokenBudgetLevel` | Token budget types |
165
+
166
+ ### Adapter Interfaces
167
+
168
+ | Interface | Category | Description |
169
+ |-------------------------------------------|---------------|--------------------------------|
170
+ | `EmbeddingAdapterInterface` | Source | Embedding generation |
171
+ | `ToolFormatAdapterInterface` | Transform | Provider tool formatting |
172
+ | `SimilarityAdapterInterface` | Transform | Vector similarity computation |
173
+ | `DeduplicationAdapterInterface` | Transform | Frame deduplication |
174
+ | `TruncationAdapterInterface` | Transform | Context truncation |
175
+ | `PriorityAdapterInterface` | Transform | Frame priority ordering |
176
+ | `RetryAdapterInterface` | Policy | Retry behavior |
177
+ | `RateLimitAdapterInterface` | Policy | Rate limiting |
178
+ | `EmbeddingCacheAdapterInterface` | Enhancement | Embedding caching |
179
+ | `BatchAdapterInterface` | Enhancement | Batch processing |
180
+ | `RerankerAdapterInterface` | Enhancement | Result reranking |
181
+ | `VectorStorePersistenceAdapterInterface` | Persistence | Vector storage |
182
+
183
+ ### Minimal Cross-Package Interfaces
184
+
185
+ | Interface | Description |
186
+ |-----------------------------|--------------------------------------|
187
+ | `MinimalDatabaseAccess<T>` | IndexedDB access without dependency |
188
+ | `MinimalStoreAccess<T>` | Store operations interface |
189
+ | `MinimalDirectoryAccess` | OPFS directory access |
190
+ | `MinimalFileAccess` | OPFS file access |
191
+ | `ToolRegistryMinimal` | Tool registry without dependency |
192
+ | `VectorStoreMinimal<T>` | Vector store without dependency |
193
+ | `FormMinimal<T>` | Form state without dependency |
194
+ | `SerializableSession` | Session serialization interface |
195
+
196
+ ---
197
+
198
+ ## Examples
199
+
200
+ ### Result Pattern
201
+
202
+ ```ts
203
+ import { ok, err, isOk, unwrap, map, chain } from '@mikesaintsg/core'
204
+
205
+ function divide(a: number, b: number) {
206
+ if (b === 0) return err('DIVISION_BY_ZERO')
207
+ return ok(a / b)
208
+ }
209
+
210
+ const result = divide(10, 2)
211
+ const value = unwrap(result, 0) // 5
212
+
213
+ // Chain operations
214
+ const doubled = chain(divide(10, 2), n => ok(n * 2)) // ok(10)
215
+ ```
216
+
217
+ ### Custom Error Class
218
+
219
+ ```ts
220
+ import { EcosystemError, isEcosystemError } from '@mikesaintsg/core'
221
+
222
+ type StorageErrorCode = 'NOT_FOUND' | 'QUOTA_EXCEEDED' | 'WRITE_FAILED'
223
+
224
+ class StorageError extends EcosystemError {
225
+ readonly code: StorageErrorCode
226
+
227
+ constructor(code: StorageErrorCode, message: string, cause?: Error) {
228
+ super(message, cause)
229
+ this.code = code
230
+ }
231
+ }
232
+
233
+ try {
234
+ throw new StorageError('NOT_FOUND', 'Document not found')
235
+ } catch (error) {
236
+ if (isEcosystemError(error)) {
237
+ console.log(error.code) // 'NOT_FOUND'
238
+ }
239
+ }
240
+ ```
241
+
242
+ ### Retrieval Tool
243
+
244
+ ```ts
245
+ import { createRetrievalTool } from '@mikesaintsg/core'
246
+
247
+ const { schema, handler } = createRetrievalTool({
248
+ vectorStore,
249
+ name: 'search_docs',
250
+ description: 'Search documentation for relevant information',
251
+ defaultLimit: 5,
252
+ scoreThreshold: 0.7,
253
+ })
254
+
255
+ // Register with tool registry
256
+ registry.register(schema, handler)
257
+ ```
258
+
259
+ ### Session Persistence
260
+
261
+ ```ts
262
+ import { createSessionPersistence } from '@mikesaintsg/core'
263
+
264
+ const persistence = createSessionPersistence({
265
+ database,
266
+ storeName: 'chat_sessions',
267
+ autoprune: 7 * 24 * 60 * 60 * 1000, // 7 days
268
+ })
269
+
270
+ await persistence.save('session-1', session)
271
+ const loaded = await persistence.load('session-1')
272
+ ```
273
+
274
+ ### Form Dirty Guard
275
+
276
+ ```ts
277
+ import { createFormDirtyGuard } from '@mikesaintsg/core'
278
+
279
+ const guard = createFormDirtyGuard({
280
+ form,
281
+ confirmFn: (message) => window.confirm(message),
282
+ message: 'You have unsaved changes. Continue?',
283
+ excludePages: ['logout'],
284
+ })
285
+
286
+ router.beforeNavigate(guard)
287
+ ```
288
+
289
+ ---
290
+
291
+ ## Constants
292
+
293
+ | Constant | Value | Description |
294
+ |------------------------------|--------|--------------------------------|
295
+ | `BRIDGE_DEFAULT_TIMEOUT` | 30000 | Default bridge timeout (ms) |
296
+ | `RETRIEVAL_DEFAULT_LIMIT` | 10 | Default retrieval result limit |
297
+ | `RETRIEVAL_MAX_LIMIT` | 100 | Maximum retrieval result limit |
298
+ | `FORM_DIRTY_DEFAULT_MESSAGE` | string | Default form guard message |
299
+
300
+ ---
301
+
302
+ ## Ecosystem Integration
303
+
304
+ | Package | Integration |
305
+ |--------------------------------|------------------------------------------------|
306
+ | `@mikesaintsg/adapters` | Implements adapter interfaces |
307
+ | `@mikesaintsg/inference` | Uses shared types and bridge functions |
308
+ | `@mikesaintsg/vectorstore` | Uses embedding and persistence interfaces |
309
+ | `@mikesaintsg/contextprotocol` | Uses tool types and registry interface |
310
+ | `@mikesaintsg/contextbuilder` | Uses context frame and budget types |
311
+ | `@mikesaintsg/indexeddb` | Implements MinimalDatabaseAccess |
312
+ | `@mikesaintsg/filesystem` | Implements MinimalDirectoryAccess |
313
+
314
+ See [Integration Guide](./guides/integration.md) for detailed patterns.
315
+
316
+ ---
317
+
318
+ ## License
319
+
320
+ MIT © [mikesaintsg](https://github.com/mikesaintsg)