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