@theokit/sdk-memory 0.2.1 → 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.
- package/CHANGELOG.md +60 -0
- package/dist/in-memory-provider.d.ts +1 -1
- package/dist/index.cjs +249 -309
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +233 -302
- package/dist/index.js.map +1 -1
- package/dist/internal/active-memory/active-memory-cache.d.ts +1 -1
- package/dist/internal/active-memory/active-memory.d.ts +2 -2
- package/dist/internal/active-memory/composite-scorer.d.ts +1 -1
- package/dist/internal/active-memory/query-analyzer.d.ts +1 -1
- package/dist/internal/adapter-catalog.d.ts +21 -52
- package/dist/internal/adapter-catalog.d.ts.map +1 -1
- package/dist/internal/circuit-breaker.d.ts +1 -1
- package/dist/internal/dreaming/dreaming-diary.d.ts +1 -1
- package/dist/internal/dreaming/dreaming-run.d.ts +1 -1
- package/dist/internal/embedding/azure-openai-embedding.d.ts +21 -0
- package/dist/internal/embedding/azure-openai-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/batch-encoder.d.ts +1 -1
- package/dist/internal/embedding/cohere-embedding.d.ts +14 -0
- package/dist/internal/embedding/cohere-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/deepinfra-embedding.d.ts +2 -9
- package/dist/internal/embedding/deepinfra-embedding.d.ts.map +1 -1
- package/dist/internal/embedding/embedding-adapter.d.ts +5 -5
- package/dist/internal/embedding/embedding-adapter.d.ts.map +1 -1
- package/dist/internal/embedding/gemini-embedding.d.ts +18 -0
- package/dist/internal/embedding/gemini-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/jina-embedding.d.ts +13 -0
- package/dist/internal/embedding/jina-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/mistral-embedding.d.ts +3 -10
- package/dist/internal/embedding/mistral-embedding.d.ts.map +1 -1
- package/dist/internal/embedding/ollama-embedding.d.ts +3 -10
- package/dist/internal/embedding/ollama-embedding.d.ts.map +1 -1
- package/dist/internal/embedding/openai-compatible.d.ts +24 -23
- package/dist/internal/embedding/openai-compatible.d.ts.map +1 -1
- package/dist/internal/embedding/openai-embedding.d.ts +2 -9
- package/dist/internal/embedding/openai-embedding.d.ts.map +1 -1
- package/dist/internal/embedding/openrouter-embedding.d.ts +2 -9
- package/dist/internal/embedding/openrouter-embedding.d.ts.map +1 -1
- package/dist/internal/embedding/voyage-embedding.d.ts +2 -9
- package/dist/internal/embedding/voyage-embedding.d.ts.map +1 -1
- package/dist/internal/index/index-db.d.ts +1 -1
- package/dist/internal/index/index-schema.d.ts +0 -5
- package/dist/internal/index/index-schema.d.ts.map +1 -1
- package/dist/internal/index/vec-index.d.ts +1 -1
- package/dist/internal/memory-scope.d.ts +1 -1
- package/dist/internal/memory-types.d.ts +4 -4
- package/dist/internal/store/chunk-markdown.d.ts +2 -2
- package/dist/internal/store/reader.d.ts +1 -1
- package/dist/internal/store/session-summary-writer.d.ts +1 -1
- package/dist/internal/store/transcript-store.d.ts +1 -1
- package/dist/internal/store/wiki-loader.d.ts +1 -1
- package/dist/internal/tools.d.ts +2 -2
- package/package.json +6 -6
- package/dist/internal/embedding/embedding-cache.d.ts +0 -16
- package/dist/internal/embedding/embedding-cache.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { mkdir, readFile, readdir, stat, access, unlink } from 'fs/promises';
|
|
2
2
|
import { join, resolve, relative } from 'path';
|
|
3
3
|
import { Security } from '@theokit/sdk';
|
|
4
|
-
import { replaceFileAtomic, withCwdMutex, atomicWriteJson, openSqliteResilient, sanitizeFts5Query } from '@theokit/sdk/
|
|
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
|
|
716
|
-
var
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
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
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
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
|
-
|
|
883
|
-
|
|
884
|
-
}
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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,
|
|
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
|