@anuma/sdk 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +54 -53
  2. package/dist/api/spec.cjs +30 -0
  3. package/dist/api/spec.d.mts +3 -0
  4. package/dist/api/spec.d.ts +3 -0
  5. package/dist/api/spec.mjs +12 -0
  6. package/dist/chunk-4ETHWSXJ.mjs +25 -0
  7. package/dist/client/index.cjs +2344 -0
  8. package/dist/client/index.d.mts +10368 -0
  9. package/dist/client/index.d.ts +10368 -0
  10. package/dist/client/index.mjs +2168 -0
  11. package/dist/clientConfig-WITO4T6L.mjs +12 -0
  12. package/dist/constants/index.cjs +30 -0
  13. package/dist/constants/index.d.mts +20 -0
  14. package/dist/constants/index.d.ts +20 -0
  15. package/dist/constants/index.mjs +5 -0
  16. package/dist/design/index.cjs +1523 -0
  17. package/dist/design/index.d.mts +561 -0
  18. package/dist/design/index.d.ts +561 -0
  19. package/dist/design/index.mjs +1468 -0
  20. package/dist/expo/chunk-3HZFU3PV.mjs +5283 -0
  21. package/dist/expo/chunk-DFVCS3QQ.mjs +246 -0
  22. package/dist/{react/chunk-MJJIYFAX.mjs → expo/chunk-GYKJOWEO.mjs} +13 -1
  23. package/dist/expo/chunk-Y7XT2VNQ.mjs +646 -0
  24. package/dist/expo/clientConfig-VPOGQRNP.mjs +12 -0
  25. package/dist/expo/consolidate-HEMQGOUD.mjs +131 -0
  26. package/dist/expo/index.cjs +16904 -6750
  27. package/dist/expo/index.d.mts +5755 -1474
  28. package/dist/expo/index.d.ts +5755 -1474
  29. package/dist/expo/index.mjs +9718 -6182
  30. package/dist/expo/recall-MCB3TVBW.mjs +8 -0
  31. package/dist/index.cjs +2992 -42
  32. package/dist/index.d.mts +7719 -1835
  33. package/dist/index.d.ts +7719 -1835
  34. package/dist/index.mjs +2859 -39
  35. package/dist/next/index.cjs +6 -2
  36. package/dist/next/index.d.mts +24 -1
  37. package/dist/next/index.d.ts +24 -1
  38. package/dist/next/index.mjs +6 -2
  39. package/dist/pii/transformers.cjs +126 -0
  40. package/dist/pii/transformers.d.mts +103 -0
  41. package/dist/pii/transformers.d.ts +103 -0
  42. package/dist/pii/transformers.mjs +90 -0
  43. package/dist/react/chunk-DFVCS3QQ.mjs +246 -0
  44. package/dist/react/chunk-ELDXIXRE.mjs +5656 -0
  45. package/dist/{expo/chunk-MJJIYFAX.mjs → react/chunk-GYKJOWEO.mjs} +13 -1
  46. package/dist/react/chunk-TP6CJZ25.mjs +645 -0
  47. package/dist/react/clientConfig-VPOGQRNP.mjs +12 -0
  48. package/dist/react/consolidate-IJH7LD2T.mjs +131 -0
  49. package/dist/react/index.cjs +25683 -11143
  50. package/dist/react/index.d.mts +7399 -1393
  51. package/dist/react/index.d.ts +7399 -1393
  52. package/dist/react/index.mjs +16709 -9196
  53. package/dist/react/recall-CSOMIT4H.mjs +8 -0
  54. package/dist/server/chunk-FMGZTVXQ.mjs +62 -0
  55. package/dist/server/chunk-G3DC7QBH.mjs +19457 -0
  56. package/dist/server/chunk-PXN5Q3MD.mjs +643 -0
  57. package/dist/server/chunk-RCCKRTBI.mjs +230 -0
  58. package/dist/server/clientConfig-GMADOBPK.mjs +12 -0
  59. package/dist/server/consolidate-A2ZIX5WF.mjs +131 -0
  60. package/dist/server/index.cjs +32161 -0
  61. package/dist/server/index.d.mts +7319 -0
  62. package/dist/server/index.d.ts +7319 -0
  63. package/dist/server/index.mjs +11217 -0
  64. package/dist/server/recall-LFYTTIIY.mjs +8 -0
  65. package/dist/tools/index.cjs +12682 -34
  66. package/dist/tools/index.d.mts +2733 -18
  67. package/dist/tools/index.d.ts +2733 -18
  68. package/dist/tools/index.mjs +12565 -33
  69. package/dist/utils/index.cjs +165 -0
  70. package/dist/utils/index.d.mts +14 -0
  71. package/dist/utils/index.d.ts +14 -0
  72. package/dist/utils/index.mjs +145 -0
  73. package/dist/vercel/index.d.mts +0 -3
  74. package/dist/vercel/index.d.ts +0 -3
  75. package/package.json +127 -16
  76. package/dist/expo/chunk-LJYAMK62.mjs +0 -25
  77. package/dist/expo/chunk-PJCZO4BQ.mjs +0 -25
  78. package/dist/expo/clientConfig-2MI4KULF.mjs +0 -10
  79. package/dist/expo/clientConfig-QDAXFL3W.mjs +0 -10
  80. package/dist/expo/clientConfig-R4IOW7I2.mjs +0 -10
  81. package/dist/react/chunk-LJYAMK62.mjs +0 -25
  82. package/dist/react/chunk-PJCZO4BQ.mjs +0 -25
  83. package/dist/react/clientConfig-2MI4KULF.mjs +0 -10
  84. package/dist/react/clientConfig-QDAXFL3W.mjs +0 -10
  85. package/dist/react/clientConfig-R4IOW7I2.mjs +0 -10
  86. package/dist/tools/chunk-KDFGY4SK.mjs +0 -13
  87. package/dist/tools/clientConfig-RMDOT5YM.mjs +0 -10
@@ -0,0 +1,246 @@
1
+ import {
2
+ BASE_URL
3
+ } from "./chunk-GYKJOWEO.mjs";
4
+
5
+ // src/lib/logger.ts
6
+ var consoleLogger = {
7
+ debug: console.log.bind(console),
8
+ info: console.info.bind(console),
9
+ warn: console.warn.bind(console),
10
+ error: console.error.bind(console)
11
+ };
12
+ var noopLogger = {
13
+ debug: () => {
14
+ },
15
+ info: () => {
16
+ },
17
+ warn: () => {
18
+ },
19
+ error: () => {
20
+ }
21
+ };
22
+ var currentLogger = consoleLogger;
23
+ function setLogger(logger) {
24
+ currentLogger = logger;
25
+ }
26
+ function getLogger() {
27
+ return currentLogger;
28
+ }
29
+
30
+ // src/lib/memory/portalLlm.ts
31
+ function defaultBaseUrl() {
32
+ return typeof process !== "undefined" && process.env?.ANUMA_PORTAL_BASE_URL || BASE_URL;
33
+ }
34
+ var RESPONSE_FORMAT_OK = /* @__PURE__ */ new Set(["openai", "inclusionai", "deepseek"]);
35
+ var RESPONSE_SCHEMA_OK = /* @__PURE__ */ new Set(["openai"]);
36
+ function supportsResponseFormat(model, variant = "json_object") {
37
+ const allow = variant === "json_schema" ? RESPONSE_SCHEMA_OK : RESPONSE_FORMAT_OK;
38
+ return model.split("/").some((seg) => allow.has(seg));
39
+ }
40
+ var RETRYABLE_HTTP = /* @__PURE__ */ new Set([408, 409, 425, 429]);
41
+ function isRetryableStatus(status) {
42
+ return status >= 500 || RETRYABLE_HTTP.has(status);
43
+ }
44
+ function parseRetryAfterMs(header) {
45
+ if (!header) return null;
46
+ const secs = Number(header);
47
+ if (Number.isFinite(secs)) return Math.max(0, secs * 1e3);
48
+ const dateMs = Date.parse(header);
49
+ if (Number.isFinite(dateMs)) return Math.max(0, dateMs - Date.now());
50
+ return null;
51
+ }
52
+ function defaultBackoffMs(attempt) {
53
+ const base = Math.min(2e3, 250 * 2 ** (attempt - 1));
54
+ return base + Math.floor(Math.random() * 100);
55
+ }
56
+ function sleep(ms) {
57
+ return new Promise((resolve) => setTimeout(resolve, ms));
58
+ }
59
+ async function resolvePortalAuthHeaders(auth, tag) {
60
+ if (auth.apiKey) {
61
+ return { "x-api-key": auth.apiKey };
62
+ }
63
+ if (auth.getToken) {
64
+ let token;
65
+ try {
66
+ token = await auth.getToken();
67
+ } catch (err) {
68
+ getLogger().warn(`[${tag}] getToken threw`, err);
69
+ return null;
70
+ }
71
+ if (!token) {
72
+ getLogger().warn(`[${tag}] getToken returned no token`);
73
+ return null;
74
+ }
75
+ return { Authorization: `Bearer ${token}` };
76
+ }
77
+ throw new Error(`[${tag}] Either apiKey or getToken must be provided`);
78
+ }
79
+ async function callPortalJsonCompletion(req) {
80
+ const log = getLogger();
81
+ const maxAttempts = Math.max(1, req.maxAttempts ?? 3);
82
+ const startedAt = Date.now();
83
+ const overBudget = () => req.totalTimeoutMs !== void 0 && Date.now() - startedAt >= req.totalTimeoutMs;
84
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
85
+ if (attempt > 1 && overBudget()) {
86
+ log.warn(`[${req.tag}] over time budget before attempt ${attempt}, giving up`);
87
+ break;
88
+ }
89
+ const attemptReq = req.totalTimeoutMs !== void 0 ? {
90
+ ...req,
91
+ timeoutMs: Math.max(
92
+ 1,
93
+ Math.min(req.timeoutMs ?? 6e4, req.totalTimeoutMs - (Date.now() - startedAt))
94
+ )
95
+ } : req;
96
+ const outcome = await attemptPortalJson(attemptReq);
97
+ if (outcome.kind === "ok") return outcome.value;
98
+ if (outcome.kind === "terminal") {
99
+ log.warn(`[${req.tag}] ${outcome.reason}`);
100
+ return null;
101
+ }
102
+ if (attempt >= maxAttempts) {
103
+ log.warn(`[${req.tag}] ${outcome.reason} \u2014 attempt ${attempt}/${maxAttempts}, giving up`);
104
+ break;
105
+ }
106
+ const backoff = (req.backoffMs ?? defaultBackoffMs)(attempt);
107
+ const delay = Math.max(backoff, outcome.retryAfterMs ?? 0);
108
+ if (overBudget() || req.totalTimeoutMs !== void 0 && Date.now() - startedAt + delay >= req.totalTimeoutMs) {
109
+ log.warn(
110
+ `[${req.tag}] ${outcome.reason} \u2014 attempt ${attempt}/${maxAttempts}, over time budget, giving up`
111
+ );
112
+ break;
113
+ }
114
+ log.warn(`[${req.tag}] ${outcome.reason} \u2014 attempt ${attempt}/${maxAttempts}, retrying`);
115
+ if (delay > 0) await sleep(delay);
116
+ }
117
+ return null;
118
+ }
119
+ async function attemptPortalJson(req) {
120
+ const baseUrl = req.baseUrl ?? defaultBaseUrl();
121
+ const fetchImpl = req.fetchFn ?? fetch;
122
+ const timeoutMs = req.timeoutMs ?? 6e4;
123
+ const authHeaders = await resolvePortalAuthHeaders(req, req.tag);
124
+ if (authHeaders === null) return { kind: "terminal", reason: "auth unavailable (no token)" };
125
+ const isAnthropic = req.model.startsWith("anthropic/");
126
+ const prefill = isAnthropic ? "{" : "";
127
+ const messages = [
128
+ { role: "system", content: req.systemPrompt },
129
+ { role: "user", content: req.userMessage }
130
+ ];
131
+ if (prefill) messages.push({ role: "assistant", content: prefill });
132
+ const supportsJsonObjectFormat = supportsResponseFormat(req.model);
133
+ const controller = new AbortController();
134
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
135
+ const requestBody = {
136
+ model: req.model,
137
+ messages,
138
+ ...supportsJsonObjectFormat && { response_format: { type: "json_object" } },
139
+ ...req.extra
140
+ };
141
+ if (!supportsJsonObjectFormat) delete requestBody.response_format;
142
+ let response;
143
+ try {
144
+ response = await fetchImpl(`${baseUrl}/api/v1/chat/completions`, {
145
+ method: "POST",
146
+ headers: { ...authHeaders, "Content-Type": "application/json" },
147
+ body: JSON.stringify(requestBody),
148
+ signal: controller.signal
149
+ });
150
+ } catch (err) {
151
+ clearTimeout(timer);
152
+ return { kind: "retryable", reason: `fetch failed: ${err.message}` };
153
+ }
154
+ if (!response.ok) {
155
+ clearTimeout(timer);
156
+ const reason = `portal returned ${response.status}`;
157
+ if (response.status === 401) {
158
+ const tokenAuth = !req.apiKey && !!req.getToken;
159
+ return tokenAuth ? { kind: "retryable", reason: `${reason} (token may be expired; refreshing)` } : { kind: "terminal", reason };
160
+ }
161
+ if (!isRetryableStatus(response.status)) return { kind: "terminal", reason };
162
+ const retryAfterMs = parseRetryAfterMs(response.headers.get("retry-after"));
163
+ return retryAfterMs !== null ? { kind: "retryable", reason, retryAfterMs } : { kind: "retryable", reason };
164
+ }
165
+ let body;
166
+ try {
167
+ body = await response.json();
168
+ } catch (err) {
169
+ clearTimeout(timer);
170
+ return { kind: "retryable", reason: `response body parse failed: ${err.message}` };
171
+ }
172
+ clearTimeout(timer);
173
+ const rawContent = extractCompletionContent(body);
174
+ if (!rawContent) {
175
+ return { kind: "retryable", reason: "portal response had no completion content" };
176
+ }
177
+ const looksLikeContinuation = prefill && /^\s*"/.test(rawContent);
178
+ const content = looksLikeContinuation ? prefill + rawContent : rawContent;
179
+ const candidate = extractJsonCandidate(content);
180
+ let value;
181
+ try {
182
+ value = JSON.parse(candidate);
183
+ } catch (err) {
184
+ return {
185
+ kind: "retryable",
186
+ reason: `completion was not valid JSON: ${err.message}`
187
+ };
188
+ }
189
+ if (value === null) {
190
+ return { kind: "retryable", reason: "completion parsed to null" };
191
+ }
192
+ return { kind: "ok", value };
193
+ }
194
+ function extractJsonCandidate(raw) {
195
+ const trimmed = raw.trim();
196
+ const fence = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/i);
197
+ const body = fence ? fence[1].trim() : trimmed;
198
+ const start = body.search(/[{[]/);
199
+ if (start < 0) return body;
200
+ const open = body[start];
201
+ const close = open === "{" ? "}" : "]";
202
+ let depth = 0;
203
+ let inString = false;
204
+ let escape = false;
205
+ for (let i = start; i < body.length; i++) {
206
+ const ch = body[i];
207
+ if (escape) {
208
+ escape = false;
209
+ continue;
210
+ }
211
+ if (ch === "\\" && inString) {
212
+ escape = true;
213
+ continue;
214
+ }
215
+ if (ch === '"') {
216
+ inString = !inString;
217
+ continue;
218
+ }
219
+ if (inString) continue;
220
+ if (ch === open) depth++;
221
+ else if (ch === close) {
222
+ depth--;
223
+ if (depth === 0) return body.slice(start, i + 1);
224
+ }
225
+ }
226
+ return body;
227
+ }
228
+ function extractCompletionContent(body) {
229
+ if (typeof body !== "object" || body === null) return null;
230
+ const choices = body.choices;
231
+ if (!Array.isArray(choices) || choices.length === 0) return null;
232
+ const first = choices[0];
233
+ const content = first?.message?.content;
234
+ return typeof content === "string" ? content : null;
235
+ }
236
+
237
+ export {
238
+ consoleLogger,
239
+ noopLogger,
240
+ setLogger,
241
+ getLogger,
242
+ supportsResponseFormat,
243
+ resolvePortalAuthHeaders,
244
+ callPortalJsonCompletion,
245
+ extractJsonCandidate
246
+ };
@@ -10,7 +10,18 @@ var __decorateClass = (decorators, target, key, kind) => {
10
10
  };
11
11
 
12
12
  // src/clientConfig.ts
13
- var BASE_URL = "https://portal.anuma-dev.ai";
13
+ var DEFAULT_BASE_URL = "https://portal.anuma-dev.ai";
14
+ function readGlobal(key) {
15
+ if (typeof globalThis === "undefined") return void 0;
16
+ const value = globalThis[key];
17
+ return typeof value === "string" && value.length > 0 ? value : void 0;
18
+ }
19
+ function resolveBaseUrl() {
20
+ const fromProcess = typeof process !== "undefined" ? process.env.API_URL || process.env.NEXT_PUBLIC_API_URL || process.env.EXPO_PUBLIC_API_URL : void 0;
21
+ const fromGlobal = readGlobal("API_URL") ?? readGlobal("NEXT_PUBLIC_API_URL") ?? readGlobal("EXPO_PUBLIC_API_URL");
22
+ return (fromProcess || fromGlobal || DEFAULT_BASE_URL).replace(/\/+$/, "");
23
+ }
24
+ var BASE_URL = resolveBaseUrl();
14
25
  var MCP_R2_DOMAIN = "4cf0e0ea50b97e72386fcf2f92a2d4e8.r2.cloudflarestorage.com";
15
26
  var createClientConfig = (config) => ({
16
27
  ...config,
@@ -19,6 +30,7 @@ var createClientConfig = (config) => ({
19
30
 
20
31
  export {
21
32
  __decorateClass,
33
+ resolveBaseUrl,
22
34
  BASE_URL,
23
35
  MCP_R2_DOMAIN,
24
36
  createClientConfig