@evelinka-ai/core 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +16 -0
  2. package/dist/agent-lib/llm-semaphore.d.ts +47 -0
  3. package/dist/agent-lib/llm-semaphore.d.ts.map +1 -0
  4. package/dist/agent-lib/llm-semaphore.js +255 -0
  5. package/dist/agent-lib/llm-semaphore.js.map +1 -0
  6. package/dist/agent-lib/managed-tool.d.ts +29 -0
  7. package/dist/agent-lib/managed-tool.d.ts.map +1 -0
  8. package/dist/agent-lib/managed-tool.js +28 -0
  9. package/dist/agent-lib/managed-tool.js.map +1 -0
  10. package/dist/channels/catalog.d.ts +3 -0
  11. package/dist/channels/catalog.d.ts.map +1 -0
  12. package/dist/channels/catalog.js +20 -0
  13. package/dist/channels/catalog.js.map +1 -0
  14. package/dist/channels/model-catalog.d.ts +3 -0
  15. package/dist/channels/model-catalog.d.ts.map +1 -0
  16. package/dist/channels/model-catalog.js +6 -0
  17. package/dist/channels/model-catalog.js.map +1 -0
  18. package/dist/channels/usage.d.ts +3 -0
  19. package/dist/channels/usage.d.ts.map +1 -0
  20. package/dist/channels/usage.js +35 -0
  21. package/dist/channels/usage.js.map +1 -0
  22. package/dist/lib/atomic-file.d.ts +2 -0
  23. package/dist/lib/atomic-file.d.ts.map +1 -0
  24. package/dist/lib/atomic-file.js +16 -0
  25. package/dist/lib/atomic-file.js.map +1 -0
  26. package/dist/lib/budgets/record-call-usage.d.ts +31 -0
  27. package/dist/lib/budgets/record-call-usage.d.ts.map +1 -0
  28. package/dist/lib/budgets/record-call-usage.js +44 -0
  29. package/dist/lib/budgets/record-call-usage.js.map +1 -0
  30. package/dist/lib/budgets/token-budget.d.ts +61 -0
  31. package/dist/lib/budgets/token-budget.d.ts.map +1 -0
  32. package/dist/lib/budgets/token-budget.js +250 -0
  33. package/dist/lib/budgets/token-budget.js.map +1 -0
  34. package/dist/lib/budgets/token-usage-pg.d.ts +96 -0
  35. package/dist/lib/budgets/token-usage-pg.d.ts.map +1 -0
  36. package/dist/lib/budgets/token-usage-pg.js +305 -0
  37. package/dist/lib/budgets/token-usage-pg.js.map +1 -0
  38. package/dist/lib/budgets/usage.d.ts +103 -0
  39. package/dist/lib/budgets/usage.d.ts.map +1 -0
  40. package/dist/lib/budgets/usage.js +151 -0
  41. package/dist/lib/budgets/usage.js.map +1 -0
  42. package/dist/lib/control-plane/call-context.d.ts +7 -0
  43. package/dist/lib/control-plane/call-context.d.ts.map +1 -0
  44. package/dist/lib/control-plane/call-context.js +9 -0
  45. package/dist/lib/control-plane/call-context.js.map +1 -0
  46. package/dist/lib/control-plane/catalog.d.ts +33 -0
  47. package/dist/lib/control-plane/catalog.d.ts.map +1 -0
  48. package/dist/lib/control-plane/catalog.js +163 -0
  49. package/dist/lib/control-plane/catalog.js.map +1 -0
  50. package/dist/lib/control-plane/flow-settings.d.ts +32 -0
  51. package/dist/lib/control-plane/flow-settings.d.ts.map +1 -0
  52. package/dist/lib/control-plane/flow-settings.js +139 -0
  53. package/dist/lib/control-plane/flow-settings.js.map +1 -0
  54. package/dist/lib/control-plane/tools-config.d.ts +30 -0
  55. package/dist/lib/control-plane/tools-config.d.ts.map +1 -0
  56. package/dist/lib/control-plane/tools-config.js +104 -0
  57. package/dist/lib/control-plane/tools-config.js.map +1 -0
  58. package/dist/lib/delivery/push-store.d.ts +20 -0
  59. package/dist/lib/delivery/push-store.d.ts.map +1 -0
  60. package/dist/lib/delivery/push-store.js +74 -0
  61. package/dist/lib/delivery/push-store.js.map +1 -0
  62. package/dist/lib/delivery/push.d.ts +15 -0
  63. package/dist/lib/delivery/push.d.ts.map +1 -0
  64. package/dist/lib/delivery/push.js +97 -0
  65. package/dist/lib/delivery/push.js.map +1 -0
  66. package/dist/lib/delivery/schedule-lock.d.ts +16 -0
  67. package/dist/lib/delivery/schedule-lock.d.ts.map +1 -0
  68. package/dist/lib/delivery/schedule-lock.js +86 -0
  69. package/dist/lib/delivery/schedule-lock.js.map +1 -0
  70. package/dist/lib/memory/memory-dream.d.ts +181 -0
  71. package/dist/lib/memory/memory-dream.d.ts.map +1 -0
  72. package/dist/lib/memory/memory-dream.js +405 -0
  73. package/dist/lib/memory/memory-dream.js.map +1 -0
  74. package/dist/lib/memory/memory-vault-git.d.ts +14 -0
  75. package/dist/lib/memory/memory-vault-git.d.ts.map +1 -0
  76. package/dist/lib/memory/memory-vault-git.js +345 -0
  77. package/dist/lib/memory/memory-vault-git.js.map +1 -0
  78. package/dist/lib/memory/memory-vault.d.ts +83 -0
  79. package/dist/lib/memory/memory-vault.d.ts.map +1 -0
  80. package/dist/lib/memory/memory-vault.js +466 -0
  81. package/dist/lib/memory/memory-vault.js.map +1 -0
  82. package/dist/lib/memory/static-instructions.d.ts +2 -0
  83. package/dist/lib/memory/static-instructions.d.ts.map +1 -0
  84. package/dist/lib/memory/static-instructions.js +48 -0
  85. package/dist/lib/memory/static-instructions.js.map +1 -0
  86. package/dist/lib/memory/vault-explorer.d.ts +37 -0
  87. package/dist/lib/memory/vault-explorer.d.ts.map +1 -0
  88. package/dist/lib/memory/vault-explorer.js +212 -0
  89. package/dist/lib/memory/vault-explorer.js.map +1 -0
  90. package/dist/lib/models/llm-concurrency.d.ts +29 -0
  91. package/dist/lib/models/llm-concurrency.d.ts.map +1 -0
  92. package/dist/lib/models/llm-concurrency.js +103 -0
  93. package/dist/lib/models/llm-concurrency.js.map +1 -0
  94. package/dist/lib/models/model-catalog.d.ts +32 -0
  95. package/dist/lib/models/model-catalog.d.ts.map +1 -0
  96. package/dist/lib/models/model-catalog.js +115 -0
  97. package/dist/lib/models/model-catalog.js.map +1 -0
  98. package/dist/lib/models/model-config.d.ts +27 -0
  99. package/dist/lib/models/model-config.d.ts.map +1 -0
  100. package/dist/lib/models/model-config.js +155 -0
  101. package/dist/lib/models/model-config.js.map +1 -0
  102. package/dist/lib/observability/console-link.d.ts +3 -0
  103. package/dist/lib/observability/console-link.d.ts.map +1 -0
  104. package/dist/lib/observability/console-link.js +15 -0
  105. package/dist/lib/observability/console-link.js.map +1 -0
  106. package/dist/lib/observability/event-bus.d.ts +11 -0
  107. package/dist/lib/observability/event-bus.d.ts.map +1 -0
  108. package/dist/lib/observability/event-bus.js +24 -0
  109. package/dist/lib/observability/event-bus.js.map +1 -0
  110. package/dist/lib/observability/logger.d.ts +5 -0
  111. package/dist/lib/observability/logger.d.ts.map +1 -0
  112. package/dist/lib/observability/logger.js +47 -0
  113. package/dist/lib/observability/logger.js.map +1 -0
  114. package/dist/lib/observability/payload-store.d.ts +8 -0
  115. package/dist/lib/observability/payload-store.d.ts.map +1 -0
  116. package/dist/lib/observability/payload-store.js +101 -0
  117. package/dist/lib/observability/payload-store.js.map +1 -0
  118. package/dist/lib/observability/recorder-hook.d.ts +22 -0
  119. package/dist/lib/observability/recorder-hook.d.ts.map +1 -0
  120. package/dist/lib/observability/recorder-hook.js +241 -0
  121. package/dist/lib/observability/recorder-hook.js.map +1 -0
  122. package/dist/lib/observability/recorder.d.ts +339 -0
  123. package/dist/lib/observability/recorder.d.ts.map +1 -0
  124. package/dist/lib/observability/recorder.js +1182 -0
  125. package/dist/lib/observability/recorder.js.map +1 -0
  126. package/dist/tenant.d.ts +59 -0
  127. package/dist/tenant.d.ts.map +1 -0
  128. package/dist/tenant.js +18 -0
  129. package/dist/tenant.js.map +1 -0
  130. package/package.json +119 -0
@@ -0,0 +1,212 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync } from "node:fs";
2
+ import { createHash } from "node:crypto";
3
+ import { dirname, join, normalize, sep } from "node:path";
4
+ import { writeFileAtomicSync } from "../atomic-file.js";
5
+ import { logger } from "../observability/logger.js";
6
+ import { parseRuleNote, serializeRuleNote, vaultDir, withVaultWriteLock, } from "./memory-vault.js";
7
+ import { vaultGitCommit, vaultGitSync } from "./memory-vault-git.js";
8
+ const log = logger.child({ module: "vault-explorer" });
9
+ export class VaultPathError extends Error {
10
+ }
11
+ export function contentRevision(content) {
12
+ return createHash("sha256").update(content).digest("hex").slice(0, 16);
13
+ }
14
+ export function resolveNotePath(relPath) {
15
+ if (!relPath || relPath.startsWith("/") || relPath.includes("\\") || !relPath.endsWith(".md")) {
16
+ throw new VaultPathError("invalid note path");
17
+ }
18
+ const root = vaultDir();
19
+ const abs = normalize(join(root, relPath));
20
+ if (abs !== join(root, relPath) || !abs.startsWith(root + sep)) {
21
+ throw new VaultPathError("path escapes the vault");
22
+ }
23
+ return abs;
24
+ }
25
+ function noteTypeOf(relPath) {
26
+ if (relPath.startsWith("rules/"))
27
+ return "rule";
28
+ if (relPath.startsWith("archive/"))
29
+ return "archived-rule";
30
+ if (relPath.startsWith("scopes/"))
31
+ return "scope";
32
+ if (relPath.startsWith("dreams/"))
33
+ return "dream";
34
+ return "note";
35
+ }
36
+ function titleOf(relPath, content) {
37
+ const type = noteTypeOf(relPath);
38
+ if (type === "rule" || type === "archived-rule") {
39
+ try {
40
+ const rule = parseRuleNote(content);
41
+ return { title: rule.rule.split("\n")[0].slice(0, 80), scope: rule.scope };
42
+ }
43
+ catch {
44
+ }
45
+ }
46
+ const heading = content.match(/^#\s+(.+)$/m)?.[1];
47
+ const name = relPath.split("/").pop()?.replace(/\.md$/, "") ?? relPath;
48
+ return { title: (heading ?? name).slice(0, 80) };
49
+ }
50
+ function walk(absDir, relDir) {
51
+ const out = [];
52
+ let names;
53
+ try {
54
+ names = readdirSync(absDir, { withFileTypes: true });
55
+ }
56
+ catch {
57
+ return out;
58
+ }
59
+ for (const d of names.sort((a, b) => a.name.localeCompare(b.name))) {
60
+ if (d.name.startsWith("."))
61
+ continue;
62
+ const rel = relDir ? `${relDir}/${d.name}` : d.name;
63
+ if (d.isDirectory()) {
64
+ out.push({ path: rel, name: d.name, type: "dir", children: walk(join(absDir, d.name), rel) });
65
+ }
66
+ else if (d.name.endsWith(".md")) {
67
+ let title;
68
+ try {
69
+ title = titleOf(rel, readFileSync(join(absDir, d.name), "utf8")).title;
70
+ }
71
+ catch {
72
+ }
73
+ out.push({ path: rel, name: d.name, type: "note", noteType: noteTypeOf(rel), title });
74
+ }
75
+ }
76
+ return out;
77
+ }
78
+ export function vaultTree() {
79
+ return walk(vaultDir(), "");
80
+ }
81
+ export function readNote(relPath) {
82
+ const abs = resolveNotePath(relPath);
83
+ if (!existsSync(abs))
84
+ return null;
85
+ const content = readFileSync(abs, "utf8");
86
+ return { path: relPath, content, revision: contentRevision(content) };
87
+ }
88
+ export async function writeNote(relPath, content, revision) {
89
+ return withVaultWriteLock(async () => {
90
+ const abs = resolveNotePath(relPath);
91
+ await vaultGitSync();
92
+ const current = existsSync(abs) ? readFileSync(abs, "utf8") : null;
93
+ if (current === null ? revision !== "new" : contentRevision(current) !== revision) {
94
+ throw new Error("stale");
95
+ }
96
+ let toWrite = content;
97
+ const type = noteTypeOf(relPath);
98
+ if (type === "rule" || type === "archived-rule") {
99
+ const rule = parseRuleNote(content);
100
+ toWrite = serializeRuleNote({ ...rule, provenance: "operator" });
101
+ }
102
+ mkdirSync(dirname(abs), { recursive: true });
103
+ writeFileAtomicSync(abs, toWrite);
104
+ await vaultGitCommit(`memory(console): edit ${relPath}`);
105
+ return { path: relPath, content: toWrite, revision: contentRevision(toWrite) };
106
+ });
107
+ }
108
+ export async function deleteNote(relPath) {
109
+ await withVaultWriteLock(async () => {
110
+ const abs = resolveNotePath(relPath);
111
+ if (!existsSync(abs))
112
+ return;
113
+ await vaultGitSync();
114
+ if (noteTypeOf(relPath) === "rule") {
115
+ try {
116
+ const rule = parseRuleNote(readFileSync(abs, "utf8"));
117
+ const archiveAbs = resolveNotePath(relPath.replace(/^rules\//, "archive/"));
118
+ mkdirSync(dirname(archiveAbs), { recursive: true });
119
+ writeFileAtomicSync(archiveAbs, serializeRuleNote({ ...rule, invalidatedAt: new Date().toISOString() }));
120
+ }
121
+ catch (err) {
122
+ log.warn({ err, relPath }, "unparseable rule on delete — removing without archive copy");
123
+ }
124
+ }
125
+ rmSync(abs, { force: true });
126
+ await vaultGitCommit(`memory(console): delete ${relPath}`);
127
+ });
128
+ }
129
+ const WIKILINK = /\[\[([^\]|#]+)(?:#[^\]|]*)?(?:\|[^\]]*)?\]\]/g;
130
+ export function vaultGraph() {
131
+ const nodes = [];
132
+ const links = [];
133
+ const byId = new Set();
134
+ const ruleIdToNode = new Map();
135
+ const scopeOfNode = new Map();
136
+ const contents = new Map();
137
+ const collect = (entries) => {
138
+ for (const e of entries) {
139
+ if (e.type === "dir") {
140
+ collect(e.children ?? []);
141
+ continue;
142
+ }
143
+ const id = e.path.replace(/\.md$/, "");
144
+ let content = "";
145
+ try {
146
+ content = readFileSync(join(vaultDir(), e.path), "utf8");
147
+ }
148
+ catch {
149
+ continue;
150
+ }
151
+ contents.set(id, content);
152
+ const { title, scope } = titleOf(e.path, content);
153
+ const type = noteTypeOf(e.path);
154
+ nodes.push({ id, label: title, type, ...(scope ? { scope } : {}) });
155
+ byId.add(id);
156
+ if (scope)
157
+ scopeOfNode.set(id, scope);
158
+ if (type === "rule" || type === "archived-rule") {
159
+ try {
160
+ const rule = parseRuleNote(content);
161
+ ruleIdToNode.set(rule.id, id);
162
+ }
163
+ catch {
164
+ }
165
+ }
166
+ }
167
+ };
168
+ collect(vaultTree());
169
+ const scopeNodeByName = new Map();
170
+ for (const n of nodes) {
171
+ if (n.type === "scope")
172
+ scopeNodeByName.set(n.id.replace(/^scopes\//, ""), n.id);
173
+ }
174
+ for (const nodeId of scopeOfNode.keys()) {
175
+ const parent = nodeId.split("/")[1];
176
+ const moc = parent ? scopeNodeByName.get(parent) : undefined;
177
+ if (moc)
178
+ links.push({ source: nodeId, target: moc, kind: "scope" });
179
+ }
180
+ for (const [id, content] of contents) {
181
+ if (id.startsWith("scopes/"))
182
+ continue;
183
+ for (const m of content.matchAll(WIKILINK)) {
184
+ const target = m[1].trim().replace(/\.md$/, "");
185
+ if (byId.has(target) && target !== id) {
186
+ links.push({ source: id, target, kind: "wikilink" });
187
+ }
188
+ }
189
+ }
190
+ for (const [id, content] of contents) {
191
+ if (!id.startsWith("archive/"))
192
+ continue;
193
+ try {
194
+ const rule = parseRuleNote(content);
195
+ const successor = rule.invalidatedBy ? ruleIdToNode.get(rule.invalidatedBy) : undefined;
196
+ if (successor)
197
+ links.push({ source: id, target: successor, kind: "successor" });
198
+ }
199
+ catch {
200
+ }
201
+ }
202
+ const seen = new Set();
203
+ const deduped = links.filter((l) => {
204
+ const k = `${l.source}→${l.target}:${l.kind}`;
205
+ if (seen.has(k))
206
+ return false;
207
+ seen.add(k);
208
+ return true;
209
+ });
210
+ return { nodes, links: deduped };
211
+ }
212
+ //# sourceMappingURL=vault-explorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-explorer.js","sourceRoot":"","sources":["../../../src/lib/memory/vault-explorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export declare const LLM_CONCURRENCY_MIN = 1;
2
+ export declare const LLM_CONCURRENCY_MAX = 50;
3
+ export declare const LLM_CONCURRENCY_DEFAULT = 10;
4
+ export declare const LLM_RAMP_BATCH_MIN = 0;
5
+ export declare const LLM_RAMP_BATCH_MAX = 50;
6
+ export declare const LLM_RAMP_BATCH_DEFAULT = 10;
7
+ export declare const LLM_RAMP_INTERVAL_MS_MIN = 0;
8
+ export declare const LLM_RAMP_INTERVAL_MS_MAX = 600000;
9
+ export declare const LLM_RAMP_INTERVAL_MS_DEFAULT = 90000;
10
+ export declare const LLM_RESERVED_BACKGROUND_MIN = 0;
11
+ export declare const LLM_RESERVED_BACKGROUND_MAX = 50;
12
+ export declare const LLM_RESERVED_BACKGROUND_DEFAULT = 2;
13
+ export interface LlmConcurrencyConfig {
14
+ limit: number;
15
+ rampBatch: number;
16
+ rampIntervalMs: number;
17
+ reservedBackgroundSlots: number;
18
+ }
19
+ export declare function clampLimit(n: number): number;
20
+ export declare function readLlmConfig(env?: NodeJS.ProcessEnv, file?: string): LlmConcurrencyConfig;
21
+ export declare function readLlmConcurrency(env?: NodeJS.ProcessEnv, file?: string): number;
22
+ export declare function readLlmRamp(env?: NodeJS.ProcessEnv, file?: string): {
23
+ batch: number;
24
+ intervalMs: number;
25
+ };
26
+ export declare function writeLlmConfig(patch: Partial<LlmConcurrencyConfig>, env?: NodeJS.ProcessEnv, file?: string): LlmConcurrencyConfig;
27
+ export declare function readReservedBackground(env?: NodeJS.ProcessEnv, file?: string): number;
28
+ export declare function writeLlmConcurrency(limit: number, env?: NodeJS.ProcessEnv, file?: string): number;
29
+ //# sourceMappingURL=llm-concurrency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-concurrency.d.ts","sourceRoot":"","sources":["../../../src/lib/models/llm-concurrency.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAI1C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAChD,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAInD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,2BAA2B,KAAsB,CAAC;AAC/D,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAeD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAmCD,wBAAgB,aAAa,CAC3B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,CAAC,EAAE,MAAM,GACZ,oBAAoB,CA6BtB;AAID,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9F;AAGD,wBAAgB,WAAW,CACzB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,CAAC,EAAE,MAAM,GACZ;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAGvC;AAID,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,EACpC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,CAAC,EAAE,MAAM,GACZ,oBAAoB,CA+BtB;AAID,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAER;AAGD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAER"}
@@ -0,0 +1,103 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { logger } from "../observability/logger.js";
4
+ const log = logger.child({ module: "llm-concurrency" });
5
+ export const LLM_CONCURRENCY_MIN = 1;
6
+ export const LLM_CONCURRENCY_MAX = 50;
7
+ export const LLM_CONCURRENCY_DEFAULT = 10;
8
+ export const LLM_RAMP_BATCH_MIN = 0;
9
+ export const LLM_RAMP_BATCH_MAX = 50;
10
+ export const LLM_RAMP_BATCH_DEFAULT = 10;
11
+ export const LLM_RAMP_INTERVAL_MS_MIN = 0;
12
+ export const LLM_RAMP_INTERVAL_MS_MAX = 600_000;
13
+ export const LLM_RAMP_INTERVAL_MS_DEFAULT = 90_000;
14
+ export const LLM_RESERVED_BACKGROUND_MIN = 0;
15
+ export const LLM_RESERVED_BACKGROUND_MAX = LLM_CONCURRENCY_MAX;
16
+ export const LLM_RESERVED_BACKGROUND_DEFAULT = 2;
17
+ function configPath(env) {
18
+ return (env.EVE_LLM_CONCURRENCY_CONFIG_PATH ??
19
+ join(process.cwd(), ".workflow-data", "llm-concurrency.json"));
20
+ }
21
+ function clampInt(n, min, max, fallback) {
22
+ if (typeof n !== "number" || !Number.isFinite(n))
23
+ return fallback;
24
+ return Math.min(max, Math.max(min, Math.floor(n)));
25
+ }
26
+ export function clampLimit(n) {
27
+ return clampInt(n, LLM_CONCURRENCY_MIN, LLM_CONCURRENCY_MAX, LLM_CONCURRENCY_DEFAULT);
28
+ }
29
+ function _envNum(raw, min, max, fallback) {
30
+ if (raw === undefined || raw.trim() === "")
31
+ return fallback;
32
+ return clampInt(Number(raw), min, max, fallback);
33
+ }
34
+ function codeDefaults() {
35
+ return {
36
+ limit: LLM_CONCURRENCY_DEFAULT,
37
+ rampBatch: LLM_RAMP_BATCH_DEFAULT,
38
+ rampIntervalMs: LLM_RAMP_INTERVAL_MS_DEFAULT,
39
+ reservedBackgroundSlots: LLM_RESERVED_BACKGROUND_DEFAULT,
40
+ };
41
+ }
42
+ function readRawFile(file) {
43
+ try {
44
+ const raw = JSON.parse(readFileSync(file, "utf8"));
45
+ return raw && typeof raw === "object" ? raw : {};
46
+ }
47
+ catch (err) {
48
+ if (err.code !== "ENOENT") {
49
+ log.error({ err }, "failed to read llm-concurrency, using defaults");
50
+ }
51
+ return {};
52
+ }
53
+ }
54
+ export function readLlmConfig(env = process.env, file) {
55
+ const defaults = codeDefaults();
56
+ const f = file ?? configPath(env);
57
+ const raw = readRawFile(f);
58
+ return {
59
+ limit: raw.limit === undefined ? defaults.limit : clampLimit(raw.limit),
60
+ rampBatch: raw.rampBatch === undefined
61
+ ? defaults.rampBatch
62
+ : clampInt(raw.rampBatch, LLM_RAMP_BATCH_MIN, LLM_RAMP_BATCH_MAX, defaults.rampBatch),
63
+ rampIntervalMs: raw.rampIntervalMs === undefined
64
+ ? defaults.rampIntervalMs
65
+ : clampInt(raw.rampIntervalMs, LLM_RAMP_INTERVAL_MS_MIN, LLM_RAMP_INTERVAL_MS_MAX, defaults.rampIntervalMs),
66
+ reservedBackgroundSlots: raw.reservedBackgroundSlots === undefined
67
+ ? defaults.reservedBackgroundSlots
68
+ : clampInt(raw.reservedBackgroundSlots, LLM_RESERVED_BACKGROUND_MIN, LLM_RESERVED_BACKGROUND_MAX, defaults.reservedBackgroundSlots),
69
+ };
70
+ }
71
+ export function readLlmConcurrency(env = process.env, file) {
72
+ return readLlmConfig(env, file).limit;
73
+ }
74
+ export function readLlmRamp(env = process.env, file) {
75
+ const cfg = readLlmConfig(env, file);
76
+ return { batch: cfg.rampBatch, intervalMs: cfg.rampIntervalMs };
77
+ }
78
+ export function writeLlmConfig(patch, env = process.env, file) {
79
+ const f = file ?? configPath(env);
80
+ const current = readLlmConfig(env, f);
81
+ const next = {
82
+ limit: patch.limit === undefined ? current.limit : clampLimit(patch.limit),
83
+ rampBatch: patch.rampBatch === undefined
84
+ ? current.rampBatch
85
+ : clampInt(patch.rampBatch, LLM_RAMP_BATCH_MIN, LLM_RAMP_BATCH_MAX, current.rampBatch),
86
+ rampIntervalMs: patch.rampIntervalMs === undefined
87
+ ? current.rampIntervalMs
88
+ : clampInt(patch.rampIntervalMs, LLM_RAMP_INTERVAL_MS_MIN, LLM_RAMP_INTERVAL_MS_MAX, current.rampIntervalMs),
89
+ reservedBackgroundSlots: patch.reservedBackgroundSlots === undefined
90
+ ? current.reservedBackgroundSlots
91
+ : clampInt(patch.reservedBackgroundSlots, LLM_RESERVED_BACKGROUND_MIN, LLM_RESERVED_BACKGROUND_MAX, current.reservedBackgroundSlots),
92
+ };
93
+ mkdirSync(dirname(f), { recursive: true });
94
+ writeFileSync(f, `${JSON.stringify(next)}\n`);
95
+ return next;
96
+ }
97
+ export function readReservedBackground(env = process.env, file) {
98
+ return readLlmConfig(env, file).reservedBackgroundSlots;
99
+ }
100
+ export function writeLlmConcurrency(limit, env = process.env, file) {
101
+ return writeLlmConfig({ limit }, env, file).limit;
102
+ }
103
+ //# sourceMappingURL=llm-concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-concurrency.js","sourceRoot":"","sources":["../../../src/lib/models/llm-concurrency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type TenantModelCatalogMeta } from "../../tenant.js";
2
+ export type CostKind = "real" | "notional";
3
+ export type ModelPrice = NonNullable<TenantModelCatalogMeta["price"]>;
4
+ export type ModelCatalogMeta = TenantModelCatalogMeta;
5
+ export interface ModelCatalogEntry {
6
+ id: string;
7
+ label: string;
8
+ provider: "openai" | "anthropic";
9
+ gateway: string | null;
10
+ efforts: string[];
11
+ defaultEffort: string;
12
+ price: ModelPrice | null;
13
+ costKind: CostKind;
14
+ routable: boolean;
15
+ }
16
+ export interface ModelCatalogResponse {
17
+ models: ModelCatalogEntry[];
18
+ generatedAt: string;
19
+ }
20
+ export declare const DEFAULT_EFFORTS: readonly ["none", "low", "medium", "high"];
21
+ export declare function defaultEffortFor(id: string, env?: NodeJS.ProcessEnv): string;
22
+ export declare function loadMeta(env?: NodeJS.ProcessEnv): Record<string, ModelCatalogMeta>;
23
+ export declare function buildCatalog(routableIds: string[], meta: Record<string, ModelCatalogMeta>): ModelCatalogEntry[];
24
+ export declare function fetchRoutableModels(env?: NodeJS.ProcessEnv, fetchImpl?: typeof fetch): Promise<string[]>;
25
+ export declare function readModelCatalog(env?: NodeJS.ProcessEnv, fetchImpl?: typeof fetch): Promise<ModelCatalogResponse>;
26
+ export declare function effortsFor(id: string, env?: NodeJS.ProcessEnv): string[];
27
+ export declare function priceFor(id: string, env?: NodeJS.ProcessEnv): ModelPrice | null;
28
+ export declare function costKindFor(id: string, env?: NodeJS.ProcessEnv): CostKind;
29
+ export declare function canonicalModelId(id: string): string;
30
+ export declare function catalogProvider(id: string, env?: NodeJS.ProcessEnv): "openai" | "anthropic";
31
+ export declare function isCatalogModel(id: string, env?: NodeJS.ProcessEnv): boolean;
32
+ //# sourceMappingURL=model-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../../src/lib/models/model-catalog.ts"],"names":[],"mappings":"AAUA,OAAO,EAAU,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAKtE,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC;IACjC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,eAAO,MAAM,eAAe,4CAA6C,CAAC;AAS1E,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGzF;AAeD,wBAAgB,QAAQ,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAY/F;AAID,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACrC,iBAAiB,EAAE,CA0CrB;AAID,wBAAsB,mBAAmB,CACvC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAS/B;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAErF;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,UAAU,GAAG,IAAI,CAE5F;AAID,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,QAAQ,CAEtF;AAOD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEnD;AAKD,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,QAAQ,GAAG,WAAW,CAExB;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAExF"}
@@ -0,0 +1,115 @@
1
+ import { tenant } from "../../tenant.js";
2
+ import { logger } from "../observability/logger.js";
3
+ const log = logger.child({ module: "model-catalog" });
4
+ export const DEFAULT_EFFORTS = ["none", "low", "medium", "high"];
5
+ function pickDefaultEffort(efforts) {
6
+ return efforts.includes("medium") ? "medium" : (efforts[0] ?? "medium");
7
+ }
8
+ export function defaultEffortFor(id, env = process.env) {
9
+ const m = loadMeta(env)[id];
10
+ return m?.defaultEffort ?? pickDefaultEffort(m?.efforts ?? [...DEFAULT_EFFORTS]);
11
+ }
12
+ function tenantCatalogMeta() {
13
+ const config = tenant();
14
+ if (config.modelCatalogMeta)
15
+ return { ...config.modelCatalogMeta };
16
+ return Object.fromEntries(config.modelOptions.map((option) => [
17
+ option.model,
18
+ { label: option.label, provider: option.provider },
19
+ ]));
20
+ }
21
+ export function loadMeta(env = process.env) {
22
+ const base = tenantCatalogMeta();
23
+ const raw = env.EVE_MODEL_CATALOG;
24
+ if (!raw)
25
+ return base;
26
+ try {
27
+ const parsed = JSON.parse(raw);
28
+ if (parsed && typeof parsed === "object")
29
+ return { ...base, ...parsed };
30
+ log.warn("EVE_MODEL_CATALOG malformed — using bundled sidecar");
31
+ }
32
+ catch {
33
+ log.warn("EVE_MODEL_CATALOG is not valid JSON — using bundled sidecar");
34
+ }
35
+ return base;
36
+ }
37
+ export function buildCatalog(routableIds, meta) {
38
+ const routable = new Set(routableIds);
39
+ const listable = Object.keys(meta).filter((id) => !meta[id]?.hidden);
40
+ const ids = tenant().curatedModelCatalog
41
+ ? new Set(listable)
42
+ : new Set([...routableIds, ...listable]);
43
+ const entries = [];
44
+ for (const id of ids) {
45
+ const m = meta[id] ?? {};
46
+ const efforts = m.efforts ?? [...DEFAULT_EFFORTS];
47
+ entries.push({
48
+ id,
49
+ label: m.label ?? id,
50
+ provider: m.provider ?? "openai",
51
+ gateway: m.gateway ?? null,
52
+ efforts,
53
+ defaultEffort: m.defaultEffort ?? pickDefaultEffort(efforts),
54
+ price: m.price ?? null,
55
+ costKind: m.costKind ?? "notional",
56
+ routable: routable.has(id),
57
+ });
58
+ }
59
+ entries.sort((a, b) => {
60
+ if (a.routable !== b.routable)
61
+ return a.routable ? -1 : 1;
62
+ return a.label.localeCompare(b.label);
63
+ });
64
+ return entries;
65
+ }
66
+ export async function fetchRoutableModels(env = process.env, fetchImpl = fetch) {
67
+ const baseURL = env.EVE_OPENAI_BASE_URL ?? "http://litellm:4000/v1";
68
+ const apiKey = env.EVE_OPENAI_API_KEY ?? env.OPENAI_API_KEY ?? "sk-eve-local";
69
+ const ctrl = new AbortController();
70
+ const timer = setTimeout(() => ctrl.abort(), 3_000);
71
+ try {
72
+ const res = await fetchImpl(`${baseURL}/models`, {
73
+ headers: { authorization: `Bearer ${apiKey}` },
74
+ signal: ctrl.signal,
75
+ });
76
+ if (!res.ok)
77
+ return [];
78
+ const json = (await res.json());
79
+ return (json.data ?? [])
80
+ .map((d) => d.id)
81
+ .filter((id) => typeof id === "string" && id.length > 0);
82
+ }
83
+ catch (err) {
84
+ log.warn({ err }, "litellm /models unreachable — falling back to sidecar keys");
85
+ return [];
86
+ }
87
+ finally {
88
+ clearTimeout(timer);
89
+ }
90
+ }
91
+ export async function readModelCatalog(env = process.env, fetchImpl = fetch) {
92
+ const meta = loadMeta(env);
93
+ const routable = await fetchRoutableModels(env, fetchImpl);
94
+ const models = buildCatalog(routable, meta);
95
+ return { models, generatedAt: new Date().toISOString() };
96
+ }
97
+ export function effortsFor(id, env = process.env) {
98
+ return loadMeta(env)[id]?.efforts ?? [...DEFAULT_EFFORTS];
99
+ }
100
+ export function priceFor(id, env = process.env) {
101
+ return loadMeta(env)[id]?.price ?? null;
102
+ }
103
+ export function costKindFor(id, env = process.env) {
104
+ return loadMeta(env)[id]?.costKind ?? "notional";
105
+ }
106
+ export function canonicalModelId(id) {
107
+ return tenant().modelAliases?.[id] ?? id;
108
+ }
109
+ export function catalogProvider(id, env = process.env) {
110
+ return loadMeta(env)[id]?.provider ?? "openai";
111
+ }
112
+ export function isCatalogModel(id, env = process.env) {
113
+ return Object.hasOwn(loadMeta(env), id);
114
+ }
115
+ //# sourceMappingURL=model-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../../src/lib/models/model-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type ModelProvider = "openai" | "anthropic";
2
+ export interface ModelConfig {
3
+ provider: ModelProvider;
4
+ model: string;
5
+ }
6
+ export interface ModelSelection extends ModelConfig {
7
+ effort?: string;
8
+ }
9
+ export interface ModelOption extends ModelConfig {
10
+ label: string;
11
+ note: string;
12
+ }
13
+ export declare function modelOptions(env?: NodeJS.ProcessEnv): ModelOption[];
14
+ export declare function isKnownOption(provider: string, model: string, env?: NodeJS.ProcessEnv): boolean;
15
+ export declare function envDefault(env?: NodeJS.ProcessEnv): ModelSelection;
16
+ export declare function resolveSelection(key?: string, file?: string, env?: NodeJS.ProcessEnv, override?: ModelSelection): ModelSelection;
17
+ export declare function readModelConfig(file?: string, env?: NodeJS.ProcessEnv): ModelConfig;
18
+ export declare function readModelStore(file?: string, env?: NodeJS.ProcessEnv): {
19
+ default: ModelSelection;
20
+ byKey: Record<string, ModelSelection>;
21
+ };
22
+ export declare function sessionKeyFor(sessionId: string): string;
23
+ export declare function sessionSelection(sessionId: string, file?: string, env?: NodeJS.ProcessEnv): ModelSelection | null;
24
+ export declare function writeSelection(key: string | undefined, sel: ModelSelection, file?: string): void;
25
+ export declare function writeModelConfig(cfg: ModelConfig, file?: string): void;
26
+ export declare function clearSelection(key: string, file?: string): void;
27
+ //# sourceMappingURL=model-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../../src/lib/models/model-config.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAaD,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,WAAW,EAAE,CAahF;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAc,GAAG,OAAO,CAEzF;AAQD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CAyB/E;AA+CD,wBAAgB,gBAAgB,CAC9B,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,SAAe,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,CAAC,EAAE,cAAc,GACxB,cAAc,CAiBhB;AAID,wBAAgB,eAAe,CAAC,IAAI,SAAe,EAAE,GAAG,oBAAc,GAAG,WAAW,CAGnF;AAGD,wBAAgB,cAAc,CAC5B,IAAI,SAAe,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;CAAE,CASpE;AAiBD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAGD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,IAAI,SAAe,EACnB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,cAAc,GAAG,IAAI,CAEvB;AAKD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,EAAE,cAAc,EACnB,IAAI,SAAe,GAClB,IAAI,CAqBN;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,SAAe,GAAG,IAAI,CAE5E;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAe,GAAG,IAAI,CAMrE"}