om-memory-system 3.0.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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +587 -0
  3. package/dist/adapters/opencode/auto-capture-host.d.ts +3 -0
  4. package/dist/adapters/opencode/auto-capture-host.js +29 -0
  5. package/dist/adapters/opencode/auto-capture-summary.d.ts +4 -0
  6. package/dist/adapters/opencode/auto-capture-summary.js +147 -0
  7. package/dist/adapters/opencode/conversation.d.ts +2 -0
  8. package/dist/adapters/opencode/conversation.js +50 -0
  9. package/dist/adapters/opencode/user-prompt.d.ts +9 -0
  10. package/dist/adapters/opencode/user-prompt.js +26 -0
  11. package/dist/adapters/pi/capture.d.ts +41 -0
  12. package/dist/adapters/pi/capture.js +91 -0
  13. package/dist/adapters/pi/conversation.d.ts +38 -0
  14. package/dist/adapters/pi/conversation.js +118 -0
  15. package/dist/adapters/pi/extension.d.ts +18 -0
  16. package/dist/adapters/pi/extension.js +234 -0
  17. package/dist/adapters/pi/import-command.d.ts +29 -0
  18. package/dist/adapters/pi/import-command.js +232 -0
  19. package/dist/adapters/pi/profile.d.ts +39 -0
  20. package/dist/adapters/pi/profile.js +148 -0
  21. package/dist/adapters/pi/provider.d.ts +50 -0
  22. package/dist/adapters/pi/provider.js +77 -0
  23. package/dist/config.d.ts +290 -0
  24. package/dist/config.js +742 -0
  25. package/dist/core/capture-context.d.ts +4 -0
  26. package/dist/core/capture-context.js +132 -0
  27. package/dist/core/capture.d.ts +15 -0
  28. package/dist/core/capture.js +68 -0
  29. package/dist/core/extraction.d.ts +80 -0
  30. package/dist/core/extraction.js +140 -0
  31. package/dist/core/host.d.ts +52 -0
  32. package/dist/core/host.js +1 -0
  33. package/dist/core/memory-operations.d.ts +27 -0
  34. package/dist/core/memory-operations.js +247 -0
  35. package/dist/core/retrieval.d.ts +12 -0
  36. package/dist/core/retrieval.js +72 -0
  37. package/dist/importer/discovery.d.ts +31 -0
  38. package/dist/importer/discovery.js +88 -0
  39. package/dist/importer/importer.d.ts +87 -0
  40. package/dist/importer/importer.js +260 -0
  41. package/dist/importer/ledger.d.ts +44 -0
  42. package/dist/importer/ledger.js +137 -0
  43. package/dist/importer/session-loader.d.ts +19 -0
  44. package/dist/importer/session-loader.js +12 -0
  45. package/dist/index.d.ts +24 -0
  46. package/dist/index.js +601 -0
  47. package/dist/plugin.d.ts +9 -0
  48. package/dist/plugin.js +11 -0
  49. package/dist/services/ai/ai-provider-factory.d.ts +7 -0
  50. package/dist/services/ai/ai-provider-factory.js +41 -0
  51. package/dist/services/ai/api-key-placeholder.d.ts +1 -0
  52. package/dist/services/ai/api-key-placeholder.js +14 -0
  53. package/dist/services/ai/internal-capture-sessions.d.ts +6 -0
  54. package/dist/services/ai/internal-capture-sessions.js +33 -0
  55. package/dist/services/ai/opencode-diagnostics.d.ts +7 -0
  56. package/dist/services/ai/opencode-diagnostics.js +36 -0
  57. package/dist/services/ai/opencode-host-config.d.ts +10 -0
  58. package/dist/services/ai/opencode-host-config.js +51 -0
  59. package/dist/services/ai/opencode-provider-loader.d.ts +3 -0
  60. package/dist/services/ai/opencode-provider-loader.js +4 -0
  61. package/dist/services/ai/opencode-provider.d.ts +92 -0
  62. package/dist/services/ai/opencode-provider.js +419 -0
  63. package/dist/services/ai/opencode-sdk-client.d.ts +6 -0
  64. package/dist/services/ai/opencode-sdk-client.js +38 -0
  65. package/dist/services/ai/profile-llm-client.d.ts +2 -0
  66. package/dist/services/ai/profile-llm-client.js +27 -0
  67. package/dist/services/ai/provider-config.d.ts +17 -0
  68. package/dist/services/ai/provider-config.js +30 -0
  69. package/dist/services/ai/providers/anthropic-messages.d.ts +34 -0
  70. package/dist/services/ai/providers/anthropic-messages.js +220 -0
  71. package/dist/services/ai/providers/base-provider.d.ts +24 -0
  72. package/dist/services/ai/providers/base-provider.js +24 -0
  73. package/dist/services/ai/providers/google-gemini.d.ts +15 -0
  74. package/dist/services/ai/providers/google-gemini.js +228 -0
  75. package/dist/services/ai/providers/minimax.d.ts +35 -0
  76. package/dist/services/ai/providers/minimax.js +55 -0
  77. package/dist/services/ai/providers/openai-chat-completion.d.ts +22 -0
  78. package/dist/services/ai/providers/openai-chat-completion.js +387 -0
  79. package/dist/services/ai/providers/openai-responses.d.ts +13 -0
  80. package/dist/services/ai/providers/openai-responses.js +182 -0
  81. package/dist/services/ai/providers/orcarouter.d.ts +51 -0
  82. package/dist/services/ai/providers/orcarouter.js +66 -0
  83. package/dist/services/ai/session/ai-session-manager.d.ts +24 -0
  84. package/dist/services/ai/session/ai-session-manager.js +211 -0
  85. package/dist/services/ai/session/session-types.d.ts +42 -0
  86. package/dist/services/ai/session/session-types.js +1 -0
  87. package/dist/services/ai/tools/tool-schema.d.ts +40 -0
  88. package/dist/services/ai/tools/tool-schema.js +24 -0
  89. package/dist/services/ai/validators/user-profile-validator.d.ts +12 -0
  90. package/dist/services/ai/validators/user-profile-validator.js +114 -0
  91. package/dist/services/api-handlers.d.ts +186 -0
  92. package/dist/services/api-handlers.js +1284 -0
  93. package/dist/services/auth-token.d.ts +14 -0
  94. package/dist/services/auth-token.js +59 -0
  95. package/dist/services/auto-capture.d.ts +3 -0
  96. package/dist/services/auto-capture.js +127 -0
  97. package/dist/services/cleanup-service.d.ts +22 -0
  98. package/dist/services/cleanup-service.js +109 -0
  99. package/dist/services/client.d.ts +134 -0
  100. package/dist/services/client.js +327 -0
  101. package/dist/services/context.d.ts +10 -0
  102. package/dist/services/context.js +27 -0
  103. package/dist/services/cors.d.ts +12 -0
  104. package/dist/services/cors.js +52 -0
  105. package/dist/services/deduplication-service.d.ts +28 -0
  106. package/dist/services/deduplication-service.js +111 -0
  107. package/dist/services/embedding.d.ts +36 -0
  108. package/dist/services/embedding.js +200 -0
  109. package/dist/services/jsonc.d.ts +6 -0
  110. package/dist/services/jsonc.js +76 -0
  111. package/dist/services/language-detector.d.ts +2 -0
  112. package/dist/services/language-detector.js +33 -0
  113. package/dist/services/legacy-migration.d.ts +77 -0
  114. package/dist/services/legacy-migration.js +343 -0
  115. package/dist/services/logger.d.ts +1 -0
  116. package/dist/services/logger.js +119 -0
  117. package/dist/services/memory-portability-service.d.ts +37 -0
  118. package/dist/services/memory-portability-service.js +340 -0
  119. package/dist/services/memory-scope.d.ts +16 -0
  120. package/dist/services/memory-scope.js +43 -0
  121. package/dist/services/migration-service.d.ts +42 -0
  122. package/dist/services/migration-service.js +307 -0
  123. package/dist/services/onnxruntime-resolve.d.ts +24 -0
  124. package/dist/services/onnxruntime-resolve.js +174 -0
  125. package/dist/services/privacy.d.ts +26 -0
  126. package/dist/services/privacy.js +69 -0
  127. package/dist/services/request-timeouts.d.ts +9 -0
  128. package/dist/services/request-timeouts.js +11 -0
  129. package/dist/services/runtime-require.d.ts +17 -0
  130. package/dist/services/runtime-require.js +75 -0
  131. package/dist/services/secret-resolver.d.ts +1 -0
  132. package/dist/services/secret-resolver.js +65 -0
  133. package/dist/services/shard-inventory-service.d.ts +69 -0
  134. package/dist/services/shard-inventory-service.js +315 -0
  135. package/dist/services/shard-path-migration-service.d.ts +31 -0
  136. package/dist/services/shard-path-migration-service.js +367 -0
  137. package/dist/services/tag-prefix-migration.d.ts +60 -0
  138. package/dist/services/tag-prefix-migration.js +439 -0
  139. package/dist/services/tag-prefix-scan.d.ts +26 -0
  140. package/dist/services/tag-prefix-scan.js +91 -0
  141. package/dist/services/tags.d.ts +29 -0
  142. package/dist/services/tags.js +251 -0
  143. package/dist/services/turso/connection-manager.d.ts +15 -0
  144. package/dist/services/turso/connection-manager.js +163 -0
  145. package/dist/services/turso/cross-process-write-lock.d.ts +1 -0
  146. package/dist/services/turso/cross-process-write-lock.js +89 -0
  147. package/dist/services/turso/legacy-migrator.d.ts +1 -0
  148. package/dist/services/turso/legacy-migrator.js +540 -0
  149. package/dist/services/turso/lifecycle.d.ts +1 -0
  150. package/dist/services/turso/lifecycle.js +14 -0
  151. package/dist/services/turso/operation-lock.d.ts +2 -0
  152. package/dist/services/turso/operation-lock.js +61 -0
  153. package/dist/services/turso/ready.d.ts +2 -0
  154. package/dist/services/turso/ready.js +36 -0
  155. package/dist/services/turso/shard-manager.d.ts +38 -0
  156. package/dist/services/turso/shard-manager.js +496 -0
  157. package/dist/services/turso/sqlite-handle-release.d.ts +16 -0
  158. package/dist/services/turso/sqlite-handle-release.js +56 -0
  159. package/dist/services/turso/turso-db.d.ts +18 -0
  160. package/dist/services/turso/turso-db.js +53 -0
  161. package/dist/services/turso/types.d.ts +42 -0
  162. package/dist/services/turso/types.js +1 -0
  163. package/dist/services/turso/vector-search.d.ts +41 -0
  164. package/dist/services/turso/vector-search.js +384 -0
  165. package/dist/services/turso/vector-utils.d.ts +7 -0
  166. package/dist/services/turso/vector-utils.js +67 -0
  167. package/dist/services/user-memory-learning.d.ts +97 -0
  168. package/dist/services/user-memory-learning.js +673 -0
  169. package/dist/services/user-profile/ai-cleanup.d.ts +58 -0
  170. package/dist/services/user-profile/ai-cleanup.js +486 -0
  171. package/dist/services/user-profile/profile-context.d.ts +1 -0
  172. package/dist/services/user-profile/profile-context.js +105 -0
  173. package/dist/services/user-profile/profile-utils.d.ts +2 -0
  174. package/dist/services/user-profile/profile-utils.js +45 -0
  175. package/dist/services/user-profile/types.d.ts +92 -0
  176. package/dist/services/user-profile/types.js +1 -0
  177. package/dist/services/user-profile/user-profile-manager.d.ts +65 -0
  178. package/dist/services/user-profile/user-profile-manager.js +1660 -0
  179. package/dist/services/user-prompt/user-prompt-manager.d.ts +53 -0
  180. package/dist/services/user-prompt/user-prompt-manager.js +303 -0
  181. package/dist/services/web-api-auth.d.ts +3 -0
  182. package/dist/services/web-api-auth.js +25 -0
  183. package/dist/services/web-auth.d.ts +46 -0
  184. package/dist/services/web-auth.js +105 -0
  185. package/dist/services/web-server.d.ts +57 -0
  186. package/dist/services/web-server.js +659 -0
  187. package/dist/shared/api/index.d.ts +4 -0
  188. package/dist/shared/api/index.js +2 -0
  189. package/dist/shared/api/portability-schemas.d.ts +56 -0
  190. package/dist/shared/api/portability-schemas.js +39 -0
  191. package/dist/shared/api/schemas.d.ts +295 -0
  192. package/dist/shared/api/schemas.js +134 -0
  193. package/dist/shared/api/types.d.ts +28 -0
  194. package/dist/shared/api/types.js +1 -0
  195. package/dist/types/index.d.ts +27 -0
  196. package/dist/types/index.js +1 -0
  197. package/dist/utils/context-limit.d.ts +10 -0
  198. package/dist/utils/context-limit.js +43 -0
  199. package/dist/utils/math.d.ts +7 -0
  200. package/dist/utils/math.js +48 -0
  201. package/dist/utils/profile.d.ts +2 -0
  202. package/dist/utils/profile.js +15 -0
  203. package/dist/v2/adapter.d.ts +5 -0
  204. package/dist/v2/adapter.js +218 -0
  205. package/dist/v2/legacy-client.d.ts +15 -0
  206. package/dist/v2/legacy-client.js +257 -0
  207. package/dist/v2/memory-bridge.d.ts +18 -0
  208. package/dist/v2/memory-bridge.js +29 -0
  209. package/dist/v2/plugin.d.ts +3 -0
  210. package/dist/v2/plugin.js +24 -0
  211. package/dist/web/assets/index-DPjEpD1h.css +2 -0
  212. package/dist/web/assets/index-do26c4JJ.js +122 -0
  213. package/dist/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  214. package/dist/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  215. package/dist/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  216. package/dist/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  217. package/dist/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  218. package/dist/web/favicon.ico +0 -0
  219. package/dist/web/index.html +14 -0
  220. package/dist/web/omms-icon.png +0 -0
  221. package/package.json +138 -0
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ export declare const PORTABILITY_SCHEMA_VERSION: 1;
3
+ export declare const ExportedMemorySchema: z.ZodObject<{
4
+ id: z.ZodString;
5
+ content: z.ZodString;
6
+ type: z.ZodOptional<z.ZodString>;
7
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
8
+ createdAt: z.ZodNumber;
9
+ updatedAt: z.ZodOptional<z.ZodNumber>;
10
+ isPinned: z.ZodOptional<z.ZodBoolean>;
11
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
12
+ displayName: z.ZodOptional<z.ZodString>;
13
+ userName: z.ZodOptional<z.ZodString>;
14
+ userEmail: z.ZodOptional<z.ZodString>;
15
+ projectPath: z.ZodOptional<z.ZodString>;
16
+ projectName: z.ZodOptional<z.ZodString>;
17
+ gitRepoUrl: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ export declare const MemoryExportDocumentSchema: z.ZodObject<{
20
+ schemaVersion: z.ZodLiteral<1>;
21
+ exportedAt: z.ZodString;
22
+ plugin: z.ZodObject<{
23
+ package: z.ZodString;
24
+ version: z.ZodString;
25
+ }, z.core.$strip>;
26
+ source: z.ZodObject<{
27
+ containerTag: z.ZodString;
28
+ scope: z.ZodLiteral<"project">;
29
+ scopeHash: z.ZodString;
30
+ projectPath: z.ZodOptional<z.ZodString>;
31
+ projectName: z.ZodOptional<z.ZodString>;
32
+ gitRepoUrl: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strip>;
34
+ embedding: z.ZodObject<{
35
+ model: z.ZodString;
36
+ dimensions: z.ZodNumber;
37
+ }, z.core.$strip>;
38
+ memories: z.ZodArray<z.ZodObject<{
39
+ id: z.ZodString;
40
+ content: z.ZodString;
41
+ type: z.ZodOptional<z.ZodString>;
42
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
43
+ createdAt: z.ZodNumber;
44
+ updatedAt: z.ZodOptional<z.ZodNumber>;
45
+ isPinned: z.ZodOptional<z.ZodBoolean>;
46
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
47
+ displayName: z.ZodOptional<z.ZodString>;
48
+ userName: z.ZodOptional<z.ZodString>;
49
+ userEmail: z.ZodOptional<z.ZodString>;
50
+ projectPath: z.ZodOptional<z.ZodString>;
51
+ projectName: z.ZodOptional<z.ZodString>;
52
+ gitRepoUrl: z.ZodOptional<z.ZodString>;
53
+ }, z.core.$strip>>;
54
+ }, z.core.$strip>;
55
+ export type ExportedMemory = z.infer<typeof ExportedMemorySchema>;
56
+ export type MemoryExportDocument = z.infer<typeof MemoryExportDocumentSchema>;
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ export const PORTABILITY_SCHEMA_VERSION = 1;
3
+ export const ExportedMemorySchema = z.object({
4
+ id: z.string().min(1),
5
+ content: z.string().min(1),
6
+ type: z.string().optional(),
7
+ tags: z.array(z.string()).optional(),
8
+ createdAt: z.number().int().nonnegative(),
9
+ updatedAt: z.number().int().nonnegative().optional(),
10
+ isPinned: z.boolean().optional(),
11
+ metadata: z.record(z.string(), z.unknown()).optional(),
12
+ displayName: z.string().optional(),
13
+ userName: z.string().optional(),
14
+ userEmail: z.string().optional(),
15
+ projectPath: z.string().optional(),
16
+ projectName: z.string().optional(),
17
+ gitRepoUrl: z.string().optional(),
18
+ });
19
+ export const MemoryExportDocumentSchema = z.object({
20
+ schemaVersion: z.literal(PORTABILITY_SCHEMA_VERSION),
21
+ exportedAt: z.string().min(1),
22
+ plugin: z.object({
23
+ package: z.string(),
24
+ version: z.string(),
25
+ }),
26
+ source: z.object({
27
+ containerTag: z.string().min(1),
28
+ scope: z.literal("project"),
29
+ scopeHash: z.string().regex(/^[a-f0-9]{16}$/),
30
+ projectPath: z.string().optional(),
31
+ projectName: z.string().optional(),
32
+ gitRepoUrl: z.string().optional(),
33
+ }),
34
+ embedding: z.object({
35
+ model: z.string(),
36
+ dimensions: z.number().int().positive(),
37
+ }),
38
+ memories: z.array(ExportedMemorySchema),
39
+ });
@@ -0,0 +1,295 @@
1
+ import { z } from "zod";
2
+ /** Envelope used by all JSON API responses. */
3
+ export declare const ApiResultSchema: z.ZodObject<{
4
+ success: z.ZodBoolean;
5
+ data: z.ZodOptional<z.ZodUnknown>;
6
+ error: z.ZodOptional<z.ZodString>;
7
+ message: z.ZodOptional<z.ZodString>;
8
+ }, z.core.$strip>;
9
+ export declare const TagInfoSchema: z.ZodObject<{
10
+ tag: z.ZodString;
11
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
12
+ displayName: z.ZodOptional<z.ZodString>;
13
+ userName: z.ZodOptional<z.ZodString>;
14
+ userEmail: z.ZodOptional<z.ZodString>;
15
+ projectPath: z.ZodOptional<z.ZodString>;
16
+ projectName: z.ZodOptional<z.ZodString>;
17
+ gitRepoUrl: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>;
19
+ export declare const MemoryItemSchema: z.ZodObject<{
20
+ id: z.ZodString;
21
+ type: z.ZodEnum<{
22
+ memory: "memory";
23
+ prompt: "prompt";
24
+ }>;
25
+ content: z.ZodString;
26
+ createdAt: z.ZodString;
27
+ updatedAt: z.ZodOptional<z.ZodString>;
28
+ displayName: z.ZodOptional<z.ZodString>;
29
+ projectPath: z.ZodOptional<z.ZodString>;
30
+ projectName: z.ZodOptional<z.ZodString>;
31
+ gitRepoUrl: z.ZodOptional<z.ZodString>;
32
+ userName: z.ZodOptional<z.ZodString>;
33
+ userEmail: z.ZodOptional<z.ZodString>;
34
+ memoryType: z.ZodOptional<z.ZodString>;
35
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
36
+ isPinned: z.ZodOptional<z.ZodBoolean>;
37
+ linkedPromptId: z.ZodOptional<z.ZodString>;
38
+ linkedMemoryId: z.ZodOptional<z.ZodString>;
39
+ sessionId: z.ZodOptional<z.ZodString>;
40
+ similarity: z.ZodOptional<z.ZodNumber>;
41
+ isContext: z.ZodOptional<z.ZodBoolean>;
42
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
43
+ }, z.core.$strip>;
44
+ export declare const PaginatedMemoriesSchema: z.ZodObject<{
45
+ items: z.ZodArray<z.ZodObject<{
46
+ id: z.ZodString;
47
+ type: z.ZodEnum<{
48
+ memory: "memory";
49
+ prompt: "prompt";
50
+ }>;
51
+ content: z.ZodString;
52
+ createdAt: z.ZodString;
53
+ updatedAt: z.ZodOptional<z.ZodString>;
54
+ displayName: z.ZodOptional<z.ZodString>;
55
+ projectPath: z.ZodOptional<z.ZodString>;
56
+ projectName: z.ZodOptional<z.ZodString>;
57
+ gitRepoUrl: z.ZodOptional<z.ZodString>;
58
+ userName: z.ZodOptional<z.ZodString>;
59
+ userEmail: z.ZodOptional<z.ZodString>;
60
+ memoryType: z.ZodOptional<z.ZodString>;
61
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
62
+ isPinned: z.ZodOptional<z.ZodBoolean>;
63
+ linkedPromptId: z.ZodOptional<z.ZodString>;
64
+ linkedMemoryId: z.ZodOptional<z.ZodString>;
65
+ sessionId: z.ZodOptional<z.ZodString>;
66
+ similarity: z.ZodOptional<z.ZodNumber>;
67
+ isContext: z.ZodOptional<z.ZodBoolean>;
68
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
69
+ }, z.core.$strip>>;
70
+ total: z.ZodNumber;
71
+ page: z.ZodNumber;
72
+ pageSize: z.ZodNumber;
73
+ totalPages: z.ZodNumber;
74
+ }, z.core.$strip>;
75
+ export declare const ProfileItemSchema: z.ZodObject<{
76
+ category: z.ZodOptional<z.ZodString>;
77
+ description: z.ZodOptional<z.ZodString>;
78
+ confidence: z.ZodOptional<z.ZodNumber>;
79
+ frequency: z.ZodOptional<z.ZodNumber>;
80
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
81
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
82
+ }, z.core.$strip>;
83
+ export declare const ProfileDataSchema: z.ZodObject<{
84
+ preferences: z.ZodOptional<z.ZodArray<z.ZodObject<{
85
+ category: z.ZodOptional<z.ZodString>;
86
+ description: z.ZodOptional<z.ZodString>;
87
+ confidence: z.ZodOptional<z.ZodNumber>;
88
+ frequency: z.ZodOptional<z.ZodNumber>;
89
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
90
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
91
+ }, z.core.$strip>>>;
92
+ patterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
93
+ category: z.ZodOptional<z.ZodString>;
94
+ description: z.ZodOptional<z.ZodString>;
95
+ confidence: z.ZodOptional<z.ZodNumber>;
96
+ frequency: z.ZodOptional<z.ZodNumber>;
97
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
98
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
99
+ }, z.core.$strip>>>;
100
+ workflows: z.ZodOptional<z.ZodArray<z.ZodObject<{
101
+ category: z.ZodOptional<z.ZodString>;
102
+ description: z.ZodOptional<z.ZodString>;
103
+ confidence: z.ZodOptional<z.ZodNumber>;
104
+ frequency: z.ZodOptional<z.ZodNumber>;
105
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
106
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
107
+ }, z.core.$strip>>>;
108
+ }, z.core.$strip>;
109
+ export declare const UserProfileSchema: z.ZodObject<{
110
+ exists: z.ZodBoolean;
111
+ message: z.ZodOptional<z.ZodString>;
112
+ id: z.ZodOptional<z.ZodString>;
113
+ userId: z.ZodOptional<z.ZodString>;
114
+ displayName: z.ZodOptional<z.ZodString>;
115
+ userName: z.ZodOptional<z.ZodString>;
116
+ userEmail: z.ZodOptional<z.ZodString>;
117
+ version: z.ZodOptional<z.ZodNumber>;
118
+ totalPromptsAnalyzed: z.ZodOptional<z.ZodNumber>;
119
+ lastAnalyzedAt: z.ZodOptional<z.ZodString>;
120
+ createdAt: z.ZodOptional<z.ZodString>;
121
+ profileData: z.ZodOptional<z.ZodObject<{
122
+ preferences: z.ZodOptional<z.ZodArray<z.ZodObject<{
123
+ category: z.ZodOptional<z.ZodString>;
124
+ description: z.ZodOptional<z.ZodString>;
125
+ confidence: z.ZodOptional<z.ZodNumber>;
126
+ frequency: z.ZodOptional<z.ZodNumber>;
127
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
128
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
129
+ }, z.core.$strip>>>;
130
+ patterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
131
+ category: z.ZodOptional<z.ZodString>;
132
+ description: z.ZodOptional<z.ZodString>;
133
+ confidence: z.ZodOptional<z.ZodNumber>;
134
+ frequency: z.ZodOptional<z.ZodNumber>;
135
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
136
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
137
+ }, z.core.$strip>>>;
138
+ workflows: z.ZodOptional<z.ZodArray<z.ZodObject<{
139
+ category: z.ZodOptional<z.ZodString>;
140
+ description: z.ZodOptional<z.ZodString>;
141
+ confidence: z.ZodOptional<z.ZodNumber>;
142
+ frequency: z.ZodOptional<z.ZodNumber>;
143
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
144
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
145
+ }, z.core.$strip>>>;
146
+ }, z.core.$strip>>;
147
+ }, z.core.$strip>;
148
+ export declare const CleanupChangesSchema: z.ZodObject<{
149
+ merged: z.ZodOptional<z.ZodArray<z.ZodObject<{
150
+ ids: z.ZodArray<z.ZodString>;
151
+ result: z.ZodOptional<z.ZodString>;
152
+ }, z.core.$strip>>>;
153
+ removed: z.ZodOptional<z.ZodArray<z.ZodObject<{
154
+ id: z.ZodString;
155
+ reason: z.ZodString;
156
+ }, z.core.$strip>>>;
157
+ kept: z.ZodOptional<z.ZodArray<z.ZodString>>;
158
+ }, z.core.$strip>;
159
+ export declare const PendingCleanupSchema: z.ZodObject<{
160
+ old: z.ZodOptional<z.ZodObject<{
161
+ preferences: z.ZodOptional<z.ZodArray<z.ZodObject<{
162
+ category: z.ZodOptional<z.ZodString>;
163
+ description: z.ZodOptional<z.ZodString>;
164
+ confidence: z.ZodOptional<z.ZodNumber>;
165
+ frequency: z.ZodOptional<z.ZodNumber>;
166
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
167
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
168
+ }, z.core.$strip>>>;
169
+ patterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
170
+ category: z.ZodOptional<z.ZodString>;
171
+ description: z.ZodOptional<z.ZodString>;
172
+ confidence: z.ZodOptional<z.ZodNumber>;
173
+ frequency: z.ZodOptional<z.ZodNumber>;
174
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
175
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
176
+ }, z.core.$strip>>>;
177
+ workflows: z.ZodOptional<z.ZodArray<z.ZodObject<{
178
+ category: z.ZodOptional<z.ZodString>;
179
+ description: z.ZodOptional<z.ZodString>;
180
+ confidence: z.ZodOptional<z.ZodNumber>;
181
+ frequency: z.ZodOptional<z.ZodNumber>;
182
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
183
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
184
+ }, z.core.$strip>>>;
185
+ }, z.core.$strip>>;
186
+ new: z.ZodOptional<z.ZodObject<{
187
+ preferences: z.ZodOptional<z.ZodArray<z.ZodObject<{
188
+ category: z.ZodOptional<z.ZodString>;
189
+ description: z.ZodOptional<z.ZodString>;
190
+ confidence: z.ZodOptional<z.ZodNumber>;
191
+ frequency: z.ZodOptional<z.ZodNumber>;
192
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
193
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
194
+ }, z.core.$strip>>>;
195
+ patterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
196
+ category: z.ZodOptional<z.ZodString>;
197
+ description: z.ZodOptional<z.ZodString>;
198
+ confidence: z.ZodOptional<z.ZodNumber>;
199
+ frequency: z.ZodOptional<z.ZodNumber>;
200
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
201
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
202
+ }, z.core.$strip>>>;
203
+ workflows: z.ZodOptional<z.ZodArray<z.ZodObject<{
204
+ category: z.ZodOptional<z.ZodString>;
205
+ description: z.ZodOptional<z.ZodString>;
206
+ confidence: z.ZodOptional<z.ZodNumber>;
207
+ frequency: z.ZodOptional<z.ZodNumber>;
208
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
209
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
210
+ }, z.core.$strip>>>;
211
+ }, z.core.$strip>>;
212
+ changes: z.ZodObject<{
213
+ merged: z.ZodOptional<z.ZodArray<z.ZodObject<{
214
+ ids: z.ZodArray<z.ZodString>;
215
+ result: z.ZodOptional<z.ZodString>;
216
+ }, z.core.$strip>>>;
217
+ removed: z.ZodOptional<z.ZodArray<z.ZodObject<{
218
+ id: z.ZodString;
219
+ reason: z.ZodString;
220
+ }, z.core.$strip>>>;
221
+ kept: z.ZodOptional<z.ZodArray<z.ZodString>>;
222
+ }, z.core.$strip>;
223
+ }, z.core.$strip>;
224
+ export declare const AICleanupRequestSchema: z.ZodObject<{
225
+ userId: z.ZodOptional<z.ZodString>;
226
+ includeIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
227
+ profileVersion: z.ZodOptional<z.ZodNumber>;
228
+ }, z.core.$strip>;
229
+ export declare const ApplyCleanupRequestSchema: z.ZodObject<{
230
+ userId: z.ZodOptional<z.ZodString>;
231
+ profile: z.ZodOptional<z.ZodObject<{
232
+ preferences: z.ZodOptional<z.ZodArray<z.ZodObject<{
233
+ category: z.ZodOptional<z.ZodString>;
234
+ description: z.ZodOptional<z.ZodString>;
235
+ confidence: z.ZodOptional<z.ZodNumber>;
236
+ frequency: z.ZodOptional<z.ZodNumber>;
237
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
238
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
239
+ }, z.core.$strip>>>;
240
+ patterns: z.ZodOptional<z.ZodArray<z.ZodObject<{
241
+ category: z.ZodOptional<z.ZodString>;
242
+ description: z.ZodOptional<z.ZodString>;
243
+ confidence: z.ZodOptional<z.ZodNumber>;
244
+ frequency: z.ZodOptional<z.ZodNumber>;
245
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
246
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
247
+ }, z.core.$strip>>>;
248
+ workflows: z.ZodOptional<z.ZodArray<z.ZodObject<{
249
+ category: z.ZodOptional<z.ZodString>;
250
+ description: z.ZodOptional<z.ZodString>;
251
+ confidence: z.ZodOptional<z.ZodNumber>;
252
+ frequency: z.ZodOptional<z.ZodNumber>;
253
+ evidence: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodString]>>;
254
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
255
+ }, z.core.$strip>>>;
256
+ }, z.core.$strip>>;
257
+ acceptedMerged: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodString>>>;
258
+ acceptedRemoved: z.ZodOptional<z.ZodArray<z.ZodString>>;
259
+ }, z.core.$strip>;
260
+ export declare const UpdateProfileItemRequestSchema: z.ZodObject<{
261
+ type: z.ZodEnum<{
262
+ preferences: "preferences";
263
+ patterns: "patterns";
264
+ workflows: "workflows";
265
+ }>;
266
+ index: z.ZodNumber;
267
+ action: z.ZodEnum<{
268
+ delete: "delete";
269
+ edit: "edit";
270
+ }>;
271
+ category: z.ZodOptional<z.ZodString>;
272
+ description: z.ZodOptional<z.ZodString>;
273
+ steps: z.ZodOptional<z.ZodArray<z.ZodString>>;
274
+ }, z.core.$strip>;
275
+ export declare const AddMemoryRequestSchema: z.ZodObject<{
276
+ content: z.ZodString;
277
+ containerTag: z.ZodString;
278
+ type: z.ZodOptional<z.ZodString>;
279
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
280
+ displayName: z.ZodOptional<z.ZodString>;
281
+ userName: z.ZodOptional<z.ZodString>;
282
+ userEmail: z.ZodOptional<z.ZodString>;
283
+ projectPath: z.ZodOptional<z.ZodString>;
284
+ projectName: z.ZodOptional<z.ZodString>;
285
+ gitRepoUrl: z.ZodOptional<z.ZodString>;
286
+ }, z.core.$strip>;
287
+ export declare const UpdateMemoryRequestSchema: z.ZodObject<{
288
+ content: z.ZodOptional<z.ZodString>;
289
+ type: z.ZodOptional<z.ZodString>;
290
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
291
+ }, z.core.$strip>;
292
+ export declare const BulkIdsRequestSchema: z.ZodObject<{
293
+ ids: z.ZodArray<z.ZodString>;
294
+ cascade: z.ZodOptional<z.ZodBoolean>;
295
+ }, z.core.$strip>;
@@ -0,0 +1,134 @@
1
+ import { z } from "zod";
2
+ /** Envelope used by all JSON API responses. */
3
+ export const ApiResultSchema = z.object({
4
+ success: z.boolean(),
5
+ data: z.unknown().optional(),
6
+ error: z.string().optional(),
7
+ message: z.string().optional(),
8
+ });
9
+ export const TagInfoSchema = z.object({
10
+ tag: z.string(),
11
+ tags: z.array(z.string()).optional(),
12
+ displayName: z.string().optional(),
13
+ userName: z.string().optional(),
14
+ userEmail: z.string().optional(),
15
+ projectPath: z.string().optional(),
16
+ projectName: z.string().optional(),
17
+ gitRepoUrl: z.string().optional(),
18
+ });
19
+ export const MemoryItemSchema = z.object({
20
+ id: z.string(),
21
+ type: z.enum(["memory", "prompt"]),
22
+ content: z.string(),
23
+ createdAt: z.string(),
24
+ updatedAt: z.string().optional(),
25
+ displayName: z.string().optional(),
26
+ projectPath: z.string().optional(),
27
+ projectName: z.string().optional(),
28
+ gitRepoUrl: z.string().optional(),
29
+ userName: z.string().optional(),
30
+ userEmail: z.string().optional(),
31
+ memoryType: z.string().optional(),
32
+ tags: z.array(z.string()).optional(),
33
+ isPinned: z.boolean().optional(),
34
+ linkedPromptId: z.string().optional(),
35
+ linkedMemoryId: z.string().optional(),
36
+ sessionId: z.string().optional(),
37
+ similarity: z.number().optional(),
38
+ isContext: z.boolean().optional(),
39
+ metadata: z.record(z.string(), z.unknown()).optional(),
40
+ });
41
+ export const PaginatedMemoriesSchema = z.object({
42
+ items: z.array(MemoryItemSchema),
43
+ total: z.number(),
44
+ page: z.number(),
45
+ pageSize: z.number(),
46
+ totalPages: z.number(),
47
+ });
48
+ export const ProfileItemSchema = z.object({
49
+ category: z.string().optional(),
50
+ description: z.string().optional(),
51
+ confidence: z.number().optional(),
52
+ frequency: z.number().optional(),
53
+ evidence: z.union([z.array(z.string()), z.string()]).optional(),
54
+ steps: z.array(z.string()).optional(),
55
+ });
56
+ export const ProfileDataSchema = z.object({
57
+ preferences: z.array(ProfileItemSchema).optional(),
58
+ patterns: z.array(ProfileItemSchema).optional(),
59
+ workflows: z.array(ProfileItemSchema).optional(),
60
+ });
61
+ export const UserProfileSchema = z.object({
62
+ exists: z.boolean(),
63
+ message: z.string().optional(),
64
+ id: z.string().optional(),
65
+ userId: z.string().optional(),
66
+ displayName: z.string().optional(),
67
+ userName: z.string().optional(),
68
+ userEmail: z.string().optional(),
69
+ version: z.number().optional(),
70
+ totalPromptsAnalyzed: z.number().optional(),
71
+ lastAnalyzedAt: z.string().optional(),
72
+ createdAt: z.string().optional(),
73
+ profileData: ProfileDataSchema.optional(),
74
+ });
75
+ export const CleanupChangesSchema = z.object({
76
+ merged: z
77
+ .array(z.object({
78
+ ids: z.array(z.string()),
79
+ result: z.string().optional(),
80
+ }))
81
+ .optional(),
82
+ removed: z
83
+ .array(z.object({
84
+ id: z.string(),
85
+ reason: z.string(),
86
+ }))
87
+ .optional(),
88
+ kept: z.array(z.string()).optional(),
89
+ });
90
+ export const PendingCleanupSchema = z.object({
91
+ old: ProfileDataSchema.optional(),
92
+ new: ProfileDataSchema.optional(),
93
+ changes: CleanupChangesSchema,
94
+ });
95
+ export const AICleanupRequestSchema = z.object({
96
+ userId: z.string().optional(),
97
+ includeIds: z.array(z.string()).optional(),
98
+ profileVersion: z.number().int().nonnegative().optional(),
99
+ });
100
+ export const ApplyCleanupRequestSchema = z.object({
101
+ userId: z.string().optional(),
102
+ profile: ProfileDataSchema.optional(),
103
+ acceptedMerged: z.array(z.array(z.string())).optional(),
104
+ acceptedRemoved: z.array(z.string()).optional(),
105
+ });
106
+ export const UpdateProfileItemRequestSchema = z.object({
107
+ type: z.enum(["preferences", "patterns", "workflows"]),
108
+ index: z.number().int().nonnegative(),
109
+ action: z.enum(["edit", "delete"]),
110
+ category: z.string().optional(),
111
+ description: z.string().optional(),
112
+ steps: z.array(z.string()).optional(),
113
+ });
114
+ export const AddMemoryRequestSchema = z.object({
115
+ content: z.string().min(1),
116
+ containerTag: z.string().min(1),
117
+ type: z.string().optional(),
118
+ tags: z.array(z.string()).optional(),
119
+ displayName: z.string().optional(),
120
+ userName: z.string().optional(),
121
+ userEmail: z.string().optional(),
122
+ projectPath: z.string().optional(),
123
+ projectName: z.string().optional(),
124
+ gitRepoUrl: z.string().optional(),
125
+ });
126
+ export const UpdateMemoryRequestSchema = z.object({
127
+ content: z.string().optional(),
128
+ type: z.string().optional(),
129
+ tags: z.array(z.string()).optional(),
130
+ });
131
+ export const BulkIdsRequestSchema = z.object({
132
+ ids: z.array(z.string()).min(1),
133
+ cascade: z.boolean().optional(),
134
+ });
@@ -0,0 +1,28 @@
1
+ import type { z } from "zod";
2
+ import type { AddMemoryRequestSchema, AICleanupRequestSchema, ApiResultSchema, ApplyCleanupRequestSchema, BulkIdsRequestSchema, CleanupChangesSchema, MemoryItemSchema, PaginatedMemoriesSchema, PendingCleanupSchema, ProfileDataSchema, ProfileItemSchema, TagInfoSchema, UpdateMemoryRequestSchema, UpdateProfileItemRequestSchema, UserProfileSchema } from "./schemas.js";
3
+ export type ApiResult<T = unknown> = Omit<z.infer<typeof ApiResultSchema>, "data"> & {
4
+ data?: T;
5
+ };
6
+ export type TagInfo = z.infer<typeof TagInfoSchema>;
7
+ export type MemoryItem = z.infer<typeof MemoryItemSchema>;
8
+ export type PaginatedMemories = z.infer<typeof PaginatedMemoriesSchema>;
9
+ export type MemoryGroup = {
10
+ isPair: true;
11
+ memory: MemoryItem;
12
+ prompt: MemoryItem;
13
+ } | {
14
+ isPair: false;
15
+ type: "memory" | "prompt";
16
+ item: MemoryItem;
17
+ };
18
+ export type ProfileItem = z.infer<typeof ProfileItemSchema>;
19
+ export type ProfileData = z.infer<typeof ProfileDataSchema>;
20
+ export type UserProfile = z.infer<typeof UserProfileSchema>;
21
+ export type CleanupChanges = z.infer<typeof CleanupChangesSchema>;
22
+ export type PendingCleanup = z.infer<typeof PendingCleanupSchema>;
23
+ export type AICleanupRequest = z.infer<typeof AICleanupRequestSchema>;
24
+ export type ApplyCleanupRequest = z.infer<typeof ApplyCleanupRequestSchema>;
25
+ export type UpdateProfileItemRequest = z.infer<typeof UpdateProfileItemRequestSchema>;
26
+ export type AddMemoryRequest = z.infer<typeof AddMemoryRequestSchema>;
27
+ export type UpdateMemoryRequest = z.infer<typeof UpdateMemoryRequestSchema>;
28
+ export type BulkIdsRequest = z.infer<typeof BulkIdsRequestSchema>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ export type MemoryType = string;
2
+ export type MemoryHost = "opencode" | "pi";
3
+ export type MemorySourceType = "live-capture" | "history-import";
4
+ export interface MemoryMetadata {
5
+ type?: MemoryType;
6
+ source?: "manual" | "auto-capture" | "import" | "api";
7
+ tool?: string;
8
+ sessionID?: string;
9
+ host?: MemoryHost;
10
+ hostSessionId?: string;
11
+ sourceType?: MemorySourceType;
12
+ sourceEntryIds?: string[];
13
+ sourceTimestamp?: number;
14
+ sourceFile?: string;
15
+ importId?: string;
16
+ reasoning?: string;
17
+ captureTimestamp?: number;
18
+ promptId?: string;
19
+ displayName?: string;
20
+ userName?: string;
21
+ userEmail?: string;
22
+ projectPath?: string;
23
+ projectName?: string;
24
+ gitRepoUrl?: string;
25
+ [key: string]: unknown;
26
+ }
27
+ export type AIProviderType = "openai-chat" | "openai-responses" | "anthropic" | "minimax" | "google-gemini" | "orcarouter";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ /** UTF-8 byte length of a string. */
2
+ export declare function utf8ByteLength(text: string): number;
3
+ /** Decode a UTF-8 byte slice without splitting multi-byte characters. */
4
+ export declare function sliceUtf8Bytes(text: string, start: number, end?: number): string;
5
+ /**
6
+ * Truncate text to at most `maxBytes` UTF-8 bytes.
7
+ * Prefers keeping the start and end (head + tail) when space allows,
8
+ * so summaries retain both opening context and closing conclusions.
9
+ */
10
+ export declare function truncateToMaxBytes(text: string, maxBytes: number, marker?: string): string;
@@ -0,0 +1,43 @@
1
+ const encoder = new TextEncoder();
2
+ const decoder = new TextDecoder();
3
+ /** UTF-8 byte length of a string. */
4
+ export function utf8ByteLength(text) {
5
+ return encoder.encode(text).byteLength;
6
+ }
7
+ /** Decode a UTF-8 byte slice without splitting multi-byte characters. */
8
+ export function sliceUtf8Bytes(text, start, end) {
9
+ const bytes = encoder.encode(text);
10
+ let from = Math.max(0, Math.min(start, bytes.length));
11
+ let to = Math.min(bytes.length, end ?? bytes.length);
12
+ if (to <= from)
13
+ return "";
14
+ // If `from` lands inside a multi-byte character, advance to the next lead byte.
15
+ while (from < to && (bytes[from] & 0xc0) === 0x80) {
16
+ from++;
17
+ }
18
+ // If `to` lands inside a multi-byte character, back up to that character's start.
19
+ while (to > from && (bytes[to] & 0xc0) === 0x80) {
20
+ to--;
21
+ }
22
+ return decoder.decode(bytes.subarray(from, to));
23
+ }
24
+ /**
25
+ * Truncate text to at most `maxBytes` UTF-8 bytes.
26
+ * Prefers keeping the start and end (head + tail) when space allows,
27
+ * so summaries retain both opening context and closing conclusions.
28
+ */
29
+ export function truncateToMaxBytes(text, maxBytes, marker = "\n[... truncated ...]\n") {
30
+ if (maxBytes <= 0)
31
+ return "";
32
+ if (utf8ByteLength(text) <= maxBytes)
33
+ return text;
34
+ const markerBytes = utf8ByteLength(marker);
35
+ if (maxBytes <= markerBytes) {
36
+ return sliceUtf8Bytes(text, 0, maxBytes);
37
+ }
38
+ const available = maxBytes - markerBytes;
39
+ const headBytes = Math.floor(available / 2);
40
+ const tailBytes = available - headBytes;
41
+ const totalBytes = utf8ByteLength(text);
42
+ return sliceUtf8Bytes(text, 0, headBytes) + marker + sliceUtf8Bytes(text, totalBytes - tailBytes);
43
+ }
@@ -0,0 +1,7 @@
1
+ export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
2
+ /**
3
+ * Cosine similarity for number[] (JSON-stored centroids), otherwise
4
+ * identical to the Float32Array version above.
5
+ */
6
+ export declare function cosineSimilarityNumbers(a: number[], b: number[]): number;
7
+ export declare function l2Normalize(vec: number[]): number[];