@theokit/sdk-memory 0.2.2 → 0.3.1

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 (54) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/dist/index.cjs +248 -308
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +4 -0
  5. package/dist/index.d.ts +4 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +232 -301
  8. package/dist/index.js.map +1 -1
  9. package/dist/internal/active-memory/active-memory-cache.d.ts +1 -1
  10. package/dist/internal/active-memory/active-memory.d.ts +2 -2
  11. package/dist/internal/active-memory/composite-scorer.d.ts +1 -1
  12. package/dist/internal/active-memory/query-analyzer.d.ts +1 -1
  13. package/dist/internal/adapter-catalog.d.ts +21 -52
  14. package/dist/internal/adapter-catalog.d.ts.map +1 -1
  15. package/dist/internal/circuit-breaker.d.ts +1 -1
  16. package/dist/internal/dreaming/dreaming-run.d.ts +1 -1
  17. package/dist/internal/embedding/azure-openai-embedding.d.ts +21 -0
  18. package/dist/internal/embedding/azure-openai-embedding.d.ts.map +1 -0
  19. package/dist/internal/embedding/batch-encoder.d.ts +1 -1
  20. package/dist/internal/embedding/cohere-embedding.d.ts +14 -0
  21. package/dist/internal/embedding/cohere-embedding.d.ts.map +1 -0
  22. package/dist/internal/embedding/deepinfra-embedding.d.ts +2 -9
  23. package/dist/internal/embedding/deepinfra-embedding.d.ts.map +1 -1
  24. package/dist/internal/embedding/embedding-adapter.d.ts +5 -5
  25. package/dist/internal/embedding/embedding-adapter.d.ts.map +1 -1
  26. package/dist/internal/embedding/gemini-embedding.d.ts +18 -0
  27. package/dist/internal/embedding/gemini-embedding.d.ts.map +1 -0
  28. package/dist/internal/embedding/jina-embedding.d.ts +13 -0
  29. package/dist/internal/embedding/jina-embedding.d.ts.map +1 -0
  30. package/dist/internal/embedding/mistral-embedding.d.ts +3 -10
  31. package/dist/internal/embedding/mistral-embedding.d.ts.map +1 -1
  32. package/dist/internal/embedding/ollama-embedding.d.ts +3 -10
  33. package/dist/internal/embedding/ollama-embedding.d.ts.map +1 -1
  34. package/dist/internal/embedding/openai-compatible.d.ts +24 -23
  35. package/dist/internal/embedding/openai-compatible.d.ts.map +1 -1
  36. package/dist/internal/embedding/openai-embedding.d.ts +2 -9
  37. package/dist/internal/embedding/openai-embedding.d.ts.map +1 -1
  38. package/dist/internal/embedding/openrouter-embedding.d.ts +2 -9
  39. package/dist/internal/embedding/openrouter-embedding.d.ts.map +1 -1
  40. package/dist/internal/embedding/voyage-embedding.d.ts +2 -9
  41. package/dist/internal/embedding/voyage-embedding.d.ts.map +1 -1
  42. package/dist/internal/index/index-schema.d.ts +0 -5
  43. package/dist/internal/index/index-schema.d.ts.map +1 -1
  44. package/dist/internal/index/memory-index.d.ts +1 -1
  45. package/dist/internal/index/vec-index.d.ts +1 -1
  46. package/dist/internal/memory-scope.d.ts +1 -1
  47. package/dist/internal/memory-types.d.ts +4 -4
  48. package/dist/internal/store/chunk-markdown.d.ts +2 -2
  49. package/dist/internal/store/reader.d.ts +1 -1
  50. package/dist/internal/store/wiki-loader.d.ts +1 -1
  51. package/dist/internal/tools.d.ts +2 -2
  52. package/package.json +5 -5
  53. package/dist/internal/embedding/embedding-cache.d.ts +0 -16
  54. package/dist/internal/embedding/embedding-cache.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -4,6 +4,8 @@ import { Security } from '@theokit/sdk';
4
4
  import { replaceFileAtomic, withCwdMutex, atomicWriteJson, openSqliteResilient, sanitizeFts5Query } from '@theokit/sdk/persistence';
5
5
  import { sanitizeIdentifier, safePathJoin } from '@theokit/sdk/path-safety';
6
6
  import { createHash } from 'crypto';
7
+ import { createOpenAiCompatibleRuntime } from '@theokit/sdk/internal/memory-adapters';
8
+ export { createOpenAiCompatibleRuntime } from '@theokit/sdk/internal/memory-adapters';
7
9
  import { AuthenticationError, RateLimitError, ConfigurationError, NetworkError, UnknownAgentError } from '@theokit/sdk/errors';
8
10
  import { mkdirSync, existsSync, rmSync, renameSync } from 'fs';
9
11
  import { createRequire } from 'module';
@@ -623,296 +625,85 @@ function cacheKey(userText, queryMode, ctx) {
623
625
  const parts = [queryMode, ctx?.namespace ?? "", ctx?.userId ?? "", ctx?.scope ?? "", userText];
624
626
  return createHash("sha256").update(parts.join("\0")).digest("hex");
625
627
  }
626
- var RAW_MAX_BYTES = 2048;
627
- function parseRetryAfter(headers) {
628
- if (headers === void 0) return void 0;
629
- const raw = headers.get("retry-after");
630
- if (raw === null) return void 0;
631
- const n = Number(raw);
632
- if (Number.isFinite(n) && n >= 0) return Math.ceil(n);
633
- return void 0;
634
- }
635
- function truncateRaw(body) {
636
- if (body === null || body === void 0) return void 0;
637
- const s = typeof body === "string" ? body : JSON.stringify(body);
638
- const truncated = s.length <= RAW_MAX_BYTES ? s : `${s.slice(0, RAW_MAX_BYTES)}\u2026`;
639
- return redactSecrets(truncated);
640
- }
641
- function buildErrorMetadata(args) {
642
- const retryAfter = parseRetryAfter(args.headers);
643
- const raw = truncateRaw(args.body);
644
- return {
645
- provider: args.provider,
646
- endpoint: args.endpoint,
647
- code: args.code,
648
- statusCode: args.status,
649
- ...retryAfter !== void 0 ? { retryAfter } : {},
650
- ...raw !== void 0 ? { raw } : {}
651
- };
652
- }
653
- function mapOpenAICompatibleError(args) {
654
- const { providerId, status, body, headers, endpoint } = args;
655
- const code = mapOpenAiStatusToCode(status, body);
656
- const message = formatMessage(providerId, status, code);
657
- const metadata = buildErrorMetadata({
658
- provider: providerId,
659
- endpoint,
660
- code,
661
- status,
662
- headers,
663
- body
664
- });
665
- if (status === 401 || status === 403) {
666
- return new AuthenticationError(message, { code: `${providerId}_auth_failed`, metadata });
667
- }
668
- if (status === 429) {
669
- return new RateLimitError(message, { code: `${providerId}_rate_limit`, metadata });
670
- }
671
- if (status === 400) {
672
- return new ConfigurationError(message, { code: `${providerId}_${code}`, metadata });
673
- }
674
- if (status === 408) {
675
- return new NetworkError(message, { code: `${providerId}_timeout`, metadata });
676
- }
677
- if (status >= 500 && status < 600) {
678
- return new NetworkError(message, { code: `${providerId}_server_error`, metadata });
679
- }
680
- return new UnknownAgentError(message, { code: `${providerId}_unknown`, metadata });
681
- }
682
- function extractOpenAiErrorCode(body) {
683
- if (body === null || typeof body !== "object") return void 0;
684
- const err = body.error;
685
- if (err === void 0 || err === null) return void 0;
686
- if (typeof err.code === "string") return err.code;
687
- if (typeof err.type === "string") return err.type;
688
- return void 0;
689
- }
690
- function mapOpenAiStatusToCode(status, body) {
691
- const rawCode = extractOpenAiErrorCode(body)?.toLowerCase() ?? "";
692
- if (rawCode.includes("context_length") || rawCode.includes("context_window") || rawCode.includes("too_many_tokens") || rawCode.includes("max_tokens")) {
693
- return "context_too_long";
694
- }
695
- if (rawCode.includes("content_filter") || rawCode.includes("content_policy") || rawCode.includes("safety")) {
696
- return "content_filtered";
697
- }
698
- if (rawCode.includes("model_not_found") || rawCode.includes("model_unavailable") || rawCode.includes("invalid_model")) {
699
- return "model_unavailable";
700
- }
701
- if (status === 402 || rawCode.includes("insufficient_quota") || rawCode.includes("quota_exceeded")) {
702
- return "quota_exceeded";
703
- }
704
- if (status === 401 || status === 403) return "auth_failed";
705
- if (status === 429) return "rate_limit";
706
- if (status === 408) return "timeout";
707
- if (status === 400) return "invalid_request";
708
- if (status >= 500 && status < 600) return "server_error";
709
- return "unknown";
710
- }
711
- function formatMessage(providerId, status, code) {
712
- return `${providerId} API error: ${code} (HTTP ${status})`;
713
- }
714
628
 
715
- // src/internal/embedding/embedding-cache.ts
716
- var LruEmbeddingCache = class {
717
- constructor(capacity = 5e3) {
718
- this.capacity = capacity;
719
- }
720
- capacity;
721
- map = /* @__PURE__ */ new Map();
722
- get(key) {
723
- const value = this.map.get(key);
724
- if (value === void 0) return void 0;
725
- this.map.delete(key);
726
- this.map.set(key, value);
727
- return value;
728
- }
729
- set(key, value) {
730
- if (this.map.has(key)) this.map.delete(key);
731
- else if (this.map.size >= this.capacity) {
732
- const oldest = this.map.keys().next().value;
733
- if (oldest !== void 0) this.map.delete(oldest);
734
- }
735
- this.map.set(key, value);
736
- }
737
- size() {
738
- return this.map.size;
739
- }
629
+ // src/internal/embedding/azure-openai-embedding.ts
630
+ var DEFAULT_AZURE_OPENAI_EMBEDDING_MODEL = "text-embedding-3-small";
631
+ var DIMENSION_BY_MODEL = {
632
+ "text-embedding-3-small": 1536,
633
+ "text-embedding-3-large": 3072,
634
+ "text-embedding-ada-002": 1536
740
635
  };
741
-
742
- // src/internal/embedding/openai-compatible.ts
743
- var MAX_BATCH = 100;
744
- var MAX_RETRIES = 2;
745
- async function createOpenAiCompatibleRuntime(cfg, options) {
746
- const model = options.model ?? cfg.defaultModel;
747
- const apiKey = options.apiKey ?? process.env[cfg.apiKeyEnv];
748
- if (apiKey === void 0 || apiKey.length === 0) {
749
- throw new AuthenticationError(`${cfg.apiKeyEnv} missing`, {
750
- code: "embedding_missing_api_key"
751
- });
752
- }
753
- const envBaseUrl = cfg.baseUrlEnv !== void 0 ? process.env[cfg.baseUrlEnv] : void 0;
754
- const baseUrl = options.baseUrl ?? envBaseUrl ?? cfg.defaultBaseUrl;
755
- const fetchImpl = options.fetch ?? fetch;
756
- const cache = options.cache ?? new LruEmbeddingCache();
757
- const dimension = cfg.dimensionByModel[model];
758
- if (dimension === void 0) {
759
- throw new ConfigurationError(
760
- `${cfg.id} adapter: model "${model}" is not in the dimension table. Use one of: ${Object.keys(cfg.dimensionByModel).join(", ")}. To add it, update dimensionByModel in the adapter source.`,
761
- { code: "embedding_unknown_model" }
762
- );
763
- }
764
- const embeddingsPath = cfg.embeddingsPath ?? "/v1/embeddings";
765
- const stats = {
766
- cacheHits: 0,
767
- cacheMisses: 0,
768
- httpCalls: 0,
769
- retries: 0
770
- };
771
- return {
772
- id: cfg.id,
773
- model,
774
- dimension,
775
- stats: () => ({ ...stats }),
776
- embed: (texts) => embedTexts({
777
- texts,
778
- cache,
779
- stats,
780
- model,
781
- dimension,
782
- apiKey,
783
- baseUrl,
784
- embeddingsPath,
785
- fetchImpl,
786
- providerId: cfg.id
787
- })
788
- };
789
- }
790
- async function embedTexts(input) {
791
- const { texts, cache, stats, model, dimension } = input;
792
- const results = new Array(texts.length);
793
- const pending = [];
794
- for (let i = 0; i < texts.length; i++) {
795
- classifyEntry({
796
- index: i,
797
- text: texts[i] ?? "",
798
- model,
799
- dimension,
800
- cache,
801
- stats,
802
- results,
803
- pending
804
- });
805
- }
806
- await runBatches(input, pending, results);
807
- return results.map((v) => v ?? new Array(dimension).fill(0));
808
- }
809
- function classifyEntry(args) {
810
- if (args.text.trim().length === 0) {
811
- args.results[args.index] = new Array(args.dimension).fill(0);
812
- return;
813
- }
814
- const key = hashKey(args.model, args.text);
815
- const cached = args.cache.get(key);
816
- if (cached !== void 0) {
817
- args.stats.cacheHits += 1;
818
- args.results[args.index] = cached;
819
- return;
820
- }
821
- args.stats.cacheMisses += 1;
822
- args.pending.push({ index: args.index, text: args.text, key });
823
- }
824
- async function runBatches(input, pending, results) {
825
- for (let offset = 0; offset < pending.length; offset += MAX_BATCH) {
826
- const batch = pending.slice(offset, offset + MAX_BATCH);
827
- const vectors = await embedBatch({
828
- apiKey: input.apiKey,
829
- baseUrl: input.baseUrl,
830
- embeddingsPath: input.embeddingsPath,
831
- model: input.model,
832
- inputs: batch.map((b) => b.text),
833
- fetchImpl: input.fetchImpl,
834
- stats: input.stats,
835
- providerId: input.providerId
836
- });
837
- for (let j = 0; j < batch.length; j++) {
838
- const slot = batch[j];
839
- const vector = vectors[j];
840
- if (slot === void 0 || vector === void 0) continue;
841
- results[slot.index] = vector;
842
- input.cache.set(slot.key, vector);
843
- }
844
- }
845
- }
846
- async function embedBatch(opts) {
847
- const url = `${opts.baseUrl.replace(/\/$/, "")}${opts.embeddingsPath}`;
848
- let attempt = 0;
849
- while (true) {
850
- opts.stats.httpCalls += 1;
851
- const response = await postEmbedRequest(opts, url);
852
- if (response.ok)
853
- return await parseEmbedResponse(response, opts.providerId, opts.embeddingsPath);
854
- if (isRetryable(response.status) && attempt < MAX_RETRIES) {
855
- attempt += 1;
856
- opts.stats.retries += 1;
857
- await sleep(linearBackoffMs(attempt));
858
- continue;
859
- }
860
- const text = await response.text().catch(() => "");
861
- let body = text;
862
- try {
863
- body = JSON.parse(text);
864
- } catch {
865
- }
866
- throw mapOpenAICompatibleError({
867
- providerId: opts.providerId,
868
- status: response.status,
869
- body,
870
- headers: response.headers,
871
- endpoint: opts.embeddingsPath
872
- });
873
- }
874
- }
875
- async function postEmbedRequest(opts, url) {
876
- return opts.fetchImpl(url, {
877
- method: "POST",
878
- headers: {
879
- "content-type": "application/json",
880
- authorization: `Bearer ${opts.apiKey}`
636
+ var azureOpenAiMemoryEmbeddingProviderAdapter = {
637
+ id: "azure-openai",
638
+ defaultModel: DEFAULT_AZURE_OPENAI_EMBEDDING_MODEL,
639
+ transport: "remote",
640
+ authProviderId: "azure-openai",
641
+ autoSelectPriority: 25,
642
+ create: (options) => createOpenAiCompatibleRuntime(
643
+ {
644
+ id: "azure-openai",
645
+ defaultBaseUrl: "https://your-resource.openai.azure.com",
646
+ apiKeyEnv: "AZURE_OPENAI_API_KEY",
647
+ baseUrlEnv: "AZURE_OPENAI_ENDPOINT",
648
+ defaultModel: DEFAULT_AZURE_OPENAI_EMBEDDING_MODEL,
649
+ embeddingsPath: "/openai/deployments/{model}/embeddings?api-version=2024-02-01",
650
+ dimensionByModel: DIMENSION_BY_MODEL,
651
+ // theokit#159 Azure is NOT OpenAI on the wire, despite the name. It authenticates an API
652
+ // key with the `api-key` header (`Authorization: Bearer` is for Entra ID tokens, not for
653
+ // AZURE_OPENAI_API_KEY), and the deployment already rides in the path, so `model` has no
654
+ // place in the body. Sending the OpenAI shape meant every request was rejected.
655
+ dialect: {
656
+ authHeaders: (apiKey) => ({ "api-key": apiKey }),
657
+ body: (_model, inputs) => ({ input: inputs })
658
+ }
881
659
  },
882
- body: JSON.stringify({ model: opts.model, input: opts.inputs })
883
- });
884
- }
885
- async function parseEmbedResponse(response, providerId, endpoint) {
886
- const json = await response.json();
887
- if (!Array.isArray(json.data)) {
888
- throw new NetworkError(`${providerId} ${endpoint} returned no data`, {
889
- code: "embedding_invalid_response",
890
- metadata: {
891
- provider: providerId,
892
- endpoint,
893
- code: "invalid_request",
894
- raw: json
660
+ options
661
+ )
662
+ };
663
+
664
+ // src/internal/embedding/cohere-embedding.ts
665
+ var DEFAULT_COHERE_EMBEDDING_MODEL = "embed-english-v3.0";
666
+ var DIMENSION_BY_MODEL2 = {
667
+ "embed-english-v3.0": 1024,
668
+ "embed-multilingual-v3.0": 1024,
669
+ "embed-english-light-v3.0": 384,
670
+ "embed-multilingual-light-v3.0": 384
671
+ };
672
+ var cohereMemoryEmbeddingProviderAdapter = {
673
+ id: "cohere",
674
+ defaultModel: DEFAULT_COHERE_EMBEDDING_MODEL,
675
+ transport: "remote",
676
+ authProviderId: "cohere",
677
+ autoSelectPriority: 30,
678
+ create: (options) => createOpenAiCompatibleRuntime(
679
+ {
680
+ id: "cohere",
681
+ defaultBaseUrl: "https://api.cohere.com",
682
+ apiKeyEnv: "COHERE_API_KEY",
683
+ defaultModel: DEFAULT_COHERE_EMBEDDING_MODEL,
684
+ embeddingsPath: "/v2/embed",
685
+ dimensionByModel: DIMENSION_BY_MODEL2,
686
+ // theokit#159 — `/v2/embed` diverges in BOTH directions: it names the payload `texts`, requires
687
+ // `input_type`, and answers `{embeddings:{float:[[...]]}}` rather than `{data:[{embedding}]}`.
688
+ // `search_document` is the right default here because this runtime embeds material for
689
+ // storage; a query-side embedder would use `search_query`.
690
+ dialect: {
691
+ body: (model, inputs) => ({
692
+ model,
693
+ texts: [...inputs],
694
+ input_type: "search_document",
695
+ embedding_types: ["float"]
696
+ }),
697
+ vectors: (json) => json.embeddings?.float
895
698
  }
896
- });
897
- }
898
- return json.data.map((d) => d.embedding);
899
- }
900
- function isRetryable(status) {
901
- return status === 429 || status >= 500 && status < 600;
902
- }
903
- function hashKey(model, text) {
904
- return createHash("sha256").update(`${model} ${text}`).digest("hex");
905
- }
906
- function linearBackoffMs(attempt) {
907
- return 50 * attempt;
908
- }
909
- function sleep(ms) {
910
- return new Promise((resolve) => setTimeout(resolve, ms));
911
- }
699
+ },
700
+ options
701
+ )
702
+ };
912
703
 
913
704
  // src/internal/embedding/deepinfra-embedding.ts
914
705
  var DEFAULT_DEEPINFRA_EMBEDDING_MODEL = "BAAI/bge-large-en-v1.5";
915
- var DIMENSION_BY_MODEL = {
706
+ var DIMENSION_BY_MODEL3 = {
916
707
  "BAAI/bge-large-en-v1.5": 1024,
917
708
  "BAAI/bge-base-en-v1.5": 768,
918
709
  "BAAI/bge-small-en-v1.5": 384,
@@ -937,16 +728,68 @@ var deepinfraMemoryEmbeddingProviderAdapter = {
937
728
  apiKeyEnv: "DEEPINFRA_API_KEY",
938
729
  baseUrlEnv: "DEEPINFRA_API_BASE_URL",
939
730
  defaultModel: DEFAULT_DEEPINFRA_EMBEDDING_MODEL,
940
- dimensionByModel: DIMENSION_BY_MODEL,
731
+ dimensionByModel: DIMENSION_BY_MODEL3,
941
732
  embeddingsPath: "/v1/openai/embeddings"
942
733
  },
943
734
  options
944
735
  )
945
736
  };
946
737
 
738
+ // src/internal/embedding/gemini-embedding.ts
739
+ var DEFAULT_GEMINI_EMBEDDING_MODEL = "text-embedding-004";
740
+ var DIMENSION_BY_MODEL4 = {
741
+ "text-embedding-004": 768,
742
+ "embedding-001": 768
743
+ };
744
+ var geminiMemoryEmbeddingProviderAdapter = {
745
+ id: "gemini",
746
+ defaultModel: DEFAULT_GEMINI_EMBEDDING_MODEL,
747
+ transport: "remote",
748
+ authProviderId: "gemini",
749
+ autoSelectPriority: 30,
750
+ create: (options) => createOpenAiCompatibleRuntime(
751
+ {
752
+ id: "gemini",
753
+ defaultBaseUrl: "https://generativelanguage.googleapis.com",
754
+ apiKeyEnv: "GEMINI_API_KEY",
755
+ defaultModel: DEFAULT_GEMINI_EMBEDDING_MODEL,
756
+ // theokit#159 — the compat surface is under `/v1beta/openai/`, not the default
757
+ // `/v1/embeddings`; the previous path 404'd on every call.
758
+ embeddingsPath: "/v1beta/openai/embeddings",
759
+ dimensionByModel: DIMENSION_BY_MODEL4
760
+ },
761
+ options
762
+ )
763
+ };
764
+
765
+ // src/internal/embedding/jina-embedding.ts
766
+ var DEFAULT_JINA_EMBEDDING_MODEL = "jina-embeddings-v3";
767
+ var DIMENSION_BY_MODEL5 = {
768
+ "jina-embeddings-v3": 1024,
769
+ "jina-embeddings-v2-base-en": 768,
770
+ "jina-embeddings-v2-small-en": 512
771
+ };
772
+ var jinaMemoryEmbeddingProviderAdapter = {
773
+ id: "jina",
774
+ defaultModel: DEFAULT_JINA_EMBEDDING_MODEL,
775
+ transport: "remote",
776
+ authProviderId: "jina",
777
+ autoSelectPriority: 35,
778
+ create: (options) => createOpenAiCompatibleRuntime(
779
+ {
780
+ id: "jina",
781
+ defaultBaseUrl: "https://api.jina.ai",
782
+ apiKeyEnv: "JINA_API_KEY",
783
+ defaultModel: DEFAULT_JINA_EMBEDDING_MODEL,
784
+ dimensionByModel: DIMENSION_BY_MODEL5
785
+ },
786
+ options
787
+ )
788
+ };
789
+
947
790
  // src/internal/embedding/mistral-embedding.ts
948
791
  var DEFAULT_MISTRAL_EMBEDDING_MODEL = "mistral-embed";
949
- var DIMENSION_BY_MODEL2 = {
792
+ var DIMENSION_BY_MODEL6 = {
950
793
  "mistral-embed": 1024
951
794
  };
952
795
  var mistralMemoryEmbeddingProviderAdapter = {
@@ -962,7 +805,7 @@ var mistralMemoryEmbeddingProviderAdapter = {
962
805
  apiKeyEnv: "MISTRAL_API_KEY",
963
806
  baseUrlEnv: "MISTRAL_API_BASE_URL",
964
807
  defaultModel: DEFAULT_MISTRAL_EMBEDDING_MODEL,
965
- dimensionByModel: DIMENSION_BY_MODEL2
808
+ dimensionByModel: DIMENSION_BY_MODEL6
966
809
  },
967
810
  options
968
811
  )
@@ -971,7 +814,7 @@ var mistralMemoryEmbeddingProviderAdapter = {
971
814
  // src/internal/embedding/ollama-embedding.ts
972
815
  var DEFAULT_OLLAMA_EMBEDDING_MODEL = "nomic-embed-text";
973
816
  var OLLAMA_LOCAL_SENTINEL_KEY = "ollama-local";
974
- var DIMENSION_BY_MODEL3 = {
817
+ var DIMENSION_BY_MODEL7 = {
975
818
  // Nomic — local default, recommended quality/size balance.
976
819
  "nomic-embed-text": 768,
977
820
  "nomic-embed-text:latest": 768,
@@ -1004,7 +847,7 @@ var ollamaMemoryEmbeddingProviderAdapter = {
1004
847
  apiKeyEnv: "OLLAMA_API_KEY",
1005
848
  baseUrlEnv: "OLLAMA_HOST",
1006
849
  defaultModel: DEFAULT_OLLAMA_EMBEDDING_MODEL,
1007
- dimensionByModel: DIMENSION_BY_MODEL3
850
+ dimensionByModel: DIMENSION_BY_MODEL7
1008
851
  },
1009
852
  { ...options, apiKey }
1010
853
  );
@@ -1013,7 +856,7 @@ var ollamaMemoryEmbeddingProviderAdapter = {
1013
856
 
1014
857
  // src/internal/embedding/openai-embedding.ts
1015
858
  var DEFAULT_OPENAI_EMBEDDING_MODEL = "text-embedding-3-small";
1016
- var DIMENSION_BY_MODEL4 = {
859
+ var DIMENSION_BY_MODEL8 = {
1017
860
  "text-embedding-3-small": 1536,
1018
861
  "text-embedding-3-large": 3072,
1019
862
  "text-embedding-ada-002": 1536
@@ -1031,7 +874,7 @@ var openAiMemoryEmbeddingProviderAdapter = {
1031
874
  apiKeyEnv: "OPENAI_API_KEY",
1032
875
  baseUrlEnv: "OPENAI_API_BASE_URL",
1033
876
  defaultModel: DEFAULT_OPENAI_EMBEDDING_MODEL,
1034
- dimensionByModel: DIMENSION_BY_MODEL4
877
+ dimensionByModel: DIMENSION_BY_MODEL8
1035
878
  },
1036
879
  options
1037
880
  )
@@ -1039,7 +882,7 @@ var openAiMemoryEmbeddingProviderAdapter = {
1039
882
 
1040
883
  // src/internal/embedding/openrouter-embedding.ts
1041
884
  var DEFAULT_OPENROUTER_EMBEDDING_MODEL = "openai/text-embedding-3-small";
1042
- var DIMENSION_BY_MODEL5 = {
885
+ var DIMENSION_BY_MODEL9 = {
1043
886
  "openai/text-embedding-3-small": 1536,
1044
887
  "openai/text-embedding-3-large": 3072,
1045
888
  "openai/text-embedding-ada-002": 1536,
@@ -1058,7 +901,7 @@ var openRouterMemoryEmbeddingProviderAdapter = {
1058
901
  apiKeyEnv: "OPENROUTER_API_KEY",
1059
902
  baseUrlEnv: "OPENROUTER_API_BASE_URL",
1060
903
  defaultModel: DEFAULT_OPENROUTER_EMBEDDING_MODEL,
1061
- dimensionByModel: DIMENSION_BY_MODEL5
904
+ dimensionByModel: DIMENSION_BY_MODEL9
1062
905
  },
1063
906
  options
1064
907
  )
@@ -1066,7 +909,7 @@ var openRouterMemoryEmbeddingProviderAdapter = {
1066
909
 
1067
910
  // src/internal/embedding/voyage-embedding.ts
1068
911
  var DEFAULT_VOYAGE_EMBEDDING_MODEL = "voyage-3-lite";
1069
- var DIMENSION_BY_MODEL6 = {
912
+ var DIMENSION_BY_MODEL10 = {
1070
913
  "voyage-3-lite": 512,
1071
914
  "voyage-3": 1024,
1072
915
  "voyage-3-large": 1024,
@@ -1086,7 +929,7 @@ var voyageMemoryEmbeddingProviderAdapter = {
1086
929
  apiKeyEnv: "VOYAGE_API_KEY",
1087
930
  baseUrlEnv: "VOYAGE_API_BASE_URL",
1088
931
  defaultModel: DEFAULT_VOYAGE_EMBEDDING_MODEL,
1089
- dimensionByModel: DIMENSION_BY_MODEL6
932
+ dimensionByModel: DIMENSION_BY_MODEL10
1090
933
  },
1091
934
  options
1092
935
  )
@@ -1099,8 +942,101 @@ var MEMORY_EMBEDDING_ADAPTERS = {
1099
942
  openrouter: openRouterMemoryEmbeddingProviderAdapter,
1100
943
  voyage: voyageMemoryEmbeddingProviderAdapter,
1101
944
  deepinfra: deepinfraMemoryEmbeddingProviderAdapter,
1102
- ollama: ollamaMemoryEmbeddingProviderAdapter
945
+ ollama: ollamaMemoryEmbeddingProviderAdapter,
946
+ // theokit#128 — mirrors sdk-core's T4.10 additions, which the peer had drifted behind.
947
+ "azure-openai": azureOpenAiMemoryEmbeddingProviderAdapter,
948
+ cohere: cohereMemoryEmbeddingProviderAdapter,
949
+ jina: jinaMemoryEmbeddingProviderAdapter,
950
+ gemini: geminiMemoryEmbeddingProviderAdapter
1103
951
  };
952
+ var RAW_MAX_BYTES = 2048;
953
+ function parseRetryAfter(headers) {
954
+ if (headers === void 0) return void 0;
955
+ const raw = headers.get("retry-after");
956
+ if (raw === null) return void 0;
957
+ const n = Number(raw);
958
+ if (Number.isFinite(n) && n >= 0) return Math.ceil(n);
959
+ return void 0;
960
+ }
961
+ function truncateRaw(body) {
962
+ if (body === null || body === void 0) return void 0;
963
+ const s = typeof body === "string" ? body : JSON.stringify(body);
964
+ const truncated = s.length <= RAW_MAX_BYTES ? s : `${s.slice(0, RAW_MAX_BYTES)}\u2026`;
965
+ return redactSecrets(truncated);
966
+ }
967
+ function buildErrorMetadata(args) {
968
+ const retryAfter = parseRetryAfter(args.headers);
969
+ const raw = truncateRaw(args.body);
970
+ return {
971
+ provider: args.provider,
972
+ endpoint: args.endpoint,
973
+ code: args.code,
974
+ statusCode: args.status,
975
+ ...retryAfter !== void 0 ? { retryAfter } : {},
976
+ ...raw !== void 0 ? { raw } : {}
977
+ };
978
+ }
979
+ function mapOpenAICompatibleError(args) {
980
+ const { providerId, status, body, headers, endpoint } = args;
981
+ const code = mapOpenAiStatusToCode(status, body);
982
+ const message = formatMessage(providerId, status, code);
983
+ const metadata = buildErrorMetadata({
984
+ provider: providerId,
985
+ endpoint,
986
+ code,
987
+ status,
988
+ headers,
989
+ body
990
+ });
991
+ if (status === 401 || status === 403) {
992
+ return new AuthenticationError(message, { code: `${providerId}_auth_failed`, metadata });
993
+ }
994
+ if (status === 429) {
995
+ return new RateLimitError(message, { code: `${providerId}_rate_limit`, metadata });
996
+ }
997
+ if (status === 400) {
998
+ return new ConfigurationError(message, { code: `${providerId}_${code}`, metadata });
999
+ }
1000
+ if (status === 408) {
1001
+ return new NetworkError(message, { code: `${providerId}_timeout`, metadata });
1002
+ }
1003
+ if (status >= 500 && status < 600) {
1004
+ return new NetworkError(message, { code: `${providerId}_server_error`, metadata });
1005
+ }
1006
+ return new UnknownAgentError(message, { code: `${providerId}_unknown`, metadata });
1007
+ }
1008
+ function extractOpenAiErrorCode(body) {
1009
+ if (body === null || typeof body !== "object") return void 0;
1010
+ const err = body.error;
1011
+ if (err === void 0 || err === null) return void 0;
1012
+ if (typeof err.code === "string") return err.code;
1013
+ if (typeof err.type === "string") return err.type;
1014
+ return void 0;
1015
+ }
1016
+ function mapOpenAiStatusToCode(status, body) {
1017
+ const rawCode = extractOpenAiErrorCode(body)?.toLowerCase() ?? "";
1018
+ if (rawCode.includes("context_length") || rawCode.includes("context_window") || rawCode.includes("too_many_tokens") || rawCode.includes("max_tokens")) {
1019
+ return "context_too_long";
1020
+ }
1021
+ if (rawCode.includes("content_filter") || rawCode.includes("content_policy") || rawCode.includes("safety")) {
1022
+ return "content_filtered";
1023
+ }
1024
+ if (rawCode.includes("model_not_found") || rawCode.includes("model_unavailable") || rawCode.includes("invalid_model")) {
1025
+ return "model_unavailable";
1026
+ }
1027
+ if (status === 402 || rawCode.includes("insufficient_quota") || rawCode.includes("quota_exceeded")) {
1028
+ return "quota_exceeded";
1029
+ }
1030
+ if (status === 401 || status === 403) return "auth_failed";
1031
+ if (status === 429) return "rate_limit";
1032
+ if (status === 408) return "timeout";
1033
+ if (status === 400) return "invalid_request";
1034
+ if (status >= 500 && status < 600) return "server_error";
1035
+ return "unknown";
1036
+ }
1037
+ function formatMessage(providerId, status, code) {
1038
+ return `${providerId} API error: ${code} (HTTP ${status})`;
1039
+ }
1104
1040
  var FACTS_HEADING2 = "## Facts";
1105
1041
  function createCategorizedMemory(options) {
1106
1042
  const { root, categories } = options;
@@ -1463,11 +1399,6 @@ var SCHEMA_STATEMENTS = [
1463
1399
  )`,
1464
1400
  `CREATE INDEX IF NOT EXISTS idx_chunks_file_id ON chunks(file_id)`
1465
1401
  ];
1466
- var MIGRATION_V2_STATEMENTS = [
1467
- "ALTER TABLE chunks ADD COLUMN created_at INTEGER",
1468
- "ALTER TABLE chunks ADD COLUMN importance REAL DEFAULT 0.5",
1469
- "ALTER TABLE chunks ADD COLUMN scope TEXT DEFAULT '/'"
1470
- ];
1471
1402
  var PRAGMA_STATEMENTS = [
1472
1403
  "PRAGMA synchronous=NORMAL",
1473
1404
  "PRAGMA foreign_keys=ON"
@@ -2594,6 +2525,6 @@ function isPathInside(root, candidate) {
2594
2525
  return candidate === root || candidate.startsWith(normalizedRoot);
2595
2526
  }
2596
2527
 
2597
- export { ActiveMemoryCache, CircuitBreaker, DEFAULT_DEEPINFRA_EMBEDDING_MODEL, DEFAULT_MEMORY_READ_LINES, DEFAULT_MISTRAL_EMBEDDING_MODEL, DEFAULT_OLLAMA_EMBEDDING_MODEL, DEFAULT_OPENAI_EMBEDDING_MODEL, DEFAULT_OPENROUTER_EMBEDDING_MODEL, DEFAULT_VOYAGE_EMBEDDING_MODEL, IndexManager, LanceIndex, LanceMemoryAdapter, MEMORY_EMBEDDING_ADAPTERS, META_KEY_DIMENSION, META_KEY_MODEL, META_KEY_PROVIDER_ID, MIGRATION_V2_STATEMENTS, PRAGMA_STATEMENTS, SCHEMA_STATEMENTS, VALID_BACKENDS, appendDiaryEntry, appendFact, appendFactToMarkdown, assertValidBackend, buildErrorMetadata, chunkMarkdown, createCategorizedMemory, createInMemoryMarkdownProvider, createMemoryGetTool, createMemorySearchTool, createOpenAiCompatibleRuntime, createVectorIndex, deepPhase, deepinfraMemoryEmbeddingProviderAdapter, defaultIndexPath, diaryPath, discoverSessionFiles, discoverWikiFiles, dropVectorIndex, embedMissingChunks, entryHash, identityMatches, isLanceAvailable, isSqliteVecLoaded, lanceStoragePath, legacyMemoryJsonPath, lightPhase, listNotes, loadSqliteVecExtension, mapOpenAICompatibleError, memoryDir, memoryMdPath, migrateLegacyJson, migrateSqliteToLance, mistralMemoryEmbeddingProviderAdapter, notesDir, ollamaMemoryEmbeddingProviderAdapter, openAiMemoryEmbeddingProviderAdapter, openLanceIndex, openMemoryDb, openRouterMemoryEmbeddingProviderAdapter, packVector, parseRetryAfter, parseSearchOptions, persistActiveMemoryTranscript, readEmbeddingIdentity, readFacts, readFactsFromMarkdown, readMemoryFileBounded, redactSecrets, remPhase, renderDiaryEntry, resetMigrationStateForTests, runActiveMemory, runDreamingSweep, sessionSummaryPath, sessionsDir, truncateRaw, upsertEmbedding, vectorSearch, voyageMemoryEmbeddingProviderAdapter, wikiDir, writeEmbeddingIdentity, writeSessionSummary };
2528
+ export { ActiveMemoryCache, CircuitBreaker, DEFAULT_AZURE_OPENAI_EMBEDDING_MODEL, DEFAULT_COHERE_EMBEDDING_MODEL, DEFAULT_DEEPINFRA_EMBEDDING_MODEL, DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_JINA_EMBEDDING_MODEL, DEFAULT_MEMORY_READ_LINES, DEFAULT_MISTRAL_EMBEDDING_MODEL, DEFAULT_OLLAMA_EMBEDDING_MODEL, DEFAULT_OPENAI_EMBEDDING_MODEL, DEFAULT_OPENROUTER_EMBEDDING_MODEL, DEFAULT_VOYAGE_EMBEDDING_MODEL, IndexManager, LanceIndex, LanceMemoryAdapter, MEMORY_EMBEDDING_ADAPTERS, META_KEY_DIMENSION, META_KEY_MODEL, META_KEY_PROVIDER_ID, PRAGMA_STATEMENTS, SCHEMA_STATEMENTS, VALID_BACKENDS, appendDiaryEntry, appendFact, appendFactToMarkdown, assertValidBackend, azureOpenAiMemoryEmbeddingProviderAdapter, buildErrorMetadata, chunkMarkdown, cohereMemoryEmbeddingProviderAdapter, createCategorizedMemory, createInMemoryMarkdownProvider, createMemoryGetTool, createMemorySearchTool, createVectorIndex, deepPhase, deepinfraMemoryEmbeddingProviderAdapter, defaultIndexPath, diaryPath, discoverSessionFiles, discoverWikiFiles, dropVectorIndex, embedMissingChunks, entryHash, geminiMemoryEmbeddingProviderAdapter, identityMatches, isLanceAvailable, isSqliteVecLoaded, jinaMemoryEmbeddingProviderAdapter, lanceStoragePath, legacyMemoryJsonPath, lightPhase, listNotes, loadSqliteVecExtension, mapOpenAICompatibleError, memoryDir, memoryMdPath, migrateLegacyJson, migrateSqliteToLance, mistralMemoryEmbeddingProviderAdapter, notesDir, ollamaMemoryEmbeddingProviderAdapter, openAiMemoryEmbeddingProviderAdapter, openLanceIndex, openMemoryDb, openRouterMemoryEmbeddingProviderAdapter, packVector, parseRetryAfter, parseSearchOptions, persistActiveMemoryTranscript, readEmbeddingIdentity, readFacts, readFactsFromMarkdown, readMemoryFileBounded, redactSecrets, remPhase, renderDiaryEntry, resetMigrationStateForTests, runActiveMemory, runDreamingSweep, sessionSummaryPath, sessionsDir, truncateRaw, upsertEmbedding, vectorSearch, voyageMemoryEmbeddingProviderAdapter, wikiDir, writeEmbeddingIdentity, writeSessionSummary };
2598
2529
  //# sourceMappingURL=index.js.map
2599
2530
  //# sourceMappingURL=index.js.map