atabey-shared 0.1.0-beta.0 → 0.1.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/README.md +63 -24
- package/dist/agent-identity.d.ts +1 -34
- package/dist/agent-identity.js +1 -76
- package/dist/agent-identity.js.map +1 -1
- package/dist/api-catalog.d.ts +1 -57
- package/dist/api-catalog.js +1 -253
- package/dist/api-catalog.js.map +1 -1
- package/dist/audit-chain.d.ts +1 -80
- package/dist/audit-chain.js +1 -261
- package/dist/audit-chain.js.map +1 -1
- package/dist/audit.d.ts +1 -121
- package/dist/audit.js +1 -321
- package/dist/audit.js.map +1 -1
- package/dist/constants.d.ts +1 -153
- package/dist/constants.js +1 -214
- package/dist/constants.js.map +1 -1
- package/dist/database.d.ts +1 -5
- package/dist/database.js +1 -12
- package/dist/database.js.map +1 -1
- package/dist/errors.d.ts +1 -46
- package/dist/errors.js +1 -68
- package/dist/errors.js.map +1 -1
- package/dist/file-lock.d.ts +1 -93
- package/dist/file-lock.js +1 -239
- package/dist/file-lock.js.map +1 -1
- package/dist/fs.d.ts +1 -9
- package/dist/fs.js +1 -53
- package/dist/fs.js.map +1 -1
- package/dist/index.d.ts +2 -31
- package/dist/index.js +2 -31
- package/dist/index.js.map +1 -1
- package/dist/job-queue.d.ts +1 -53
- package/dist/job-queue.js +1 -126
- package/dist/job-queue.js.map +1 -1
- package/dist/lock.d.ts +1 -82
- package/dist/lock.js +1 -158
- package/dist/lock.js.map +1 -1
- package/dist/logger.d.ts +1 -31
- package/dist/logger.js +1 -152
- package/dist/logger.js.map +1 -1
- package/dist/memory-prune.d.ts +1 -18
- package/dist/memory-prune.js +1 -47
- package/dist/memory-prune.js.map +1 -1
- package/dist/migrations.d.ts +1 -69
- package/dist/migrations.js +1 -374
- package/dist/migrations.js.map +1 -1
- package/dist/modules/agent/agent-identity.d.ts +34 -0
- package/dist/modules/agent/agent-identity.js +77 -0
- package/dist/modules/agent/agent-identity.js.map +1 -0
- package/dist/modules/agent/api-catalog.d.ts +57 -0
- package/dist/modules/agent/api-catalog.js +254 -0
- package/dist/modules/agent/api-catalog.js.map +1 -0
- package/dist/modules/agent/index.d.ts +3 -0
- package/dist/modules/agent/index.js +4 -0
- package/dist/modules/agent/index.js.map +1 -0
- package/dist/modules/agent/tokenizer.d.ts +54 -0
- package/dist/modules/agent/tokenizer.js +272 -0
- package/dist/modules/agent/tokenizer.js.map +1 -0
- package/dist/modules/concurrency/file-lock.d.ts +93 -0
- package/dist/modules/concurrency/file-lock.js +240 -0
- package/dist/modules/concurrency/file-lock.js.map +1 -0
- package/dist/modules/concurrency/index.d.ts +6 -0
- package/dist/modules/concurrency/index.js +7 -0
- package/dist/modules/concurrency/index.js.map +1 -0
- package/dist/modules/concurrency/job-queue.d.ts +76 -0
- package/dist/modules/concurrency/job-queue.js +200 -0
- package/dist/modules/concurrency/job-queue.js.map +1 -0
- package/dist/modules/concurrency/lock.d.ts +82 -0
- package/dist/modules/concurrency/lock.js +159 -0
- package/dist/modules/concurrency/lock.js.map +1 -0
- package/dist/modules/concurrency/resilience.d.ts +84 -0
- package/dist/modules/concurrency/resilience.js +217 -0
- package/dist/modules/concurrency/resilience.js.map +1 -0
- package/dist/modules/concurrency/worker-pool.d.ts +52 -0
- package/dist/modules/concurrency/worker-pool.js +229 -0
- package/dist/modules/concurrency/worker-pool.js.map +1 -0
- package/dist/modules/concurrency/worker-thread.d.ts +21 -0
- package/dist/modules/concurrency/worker-thread.js +67 -0
- package/dist/modules/concurrency/worker-thread.js.map +1 -0
- package/dist/modules/index.d.ts +14 -0
- package/dist/modules/index.js +15 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/observability/audit-chain.d.ts +80 -0
- package/dist/modules/observability/audit-chain.js +262 -0
- package/dist/modules/observability/audit-chain.js.map +1 -0
- package/dist/modules/observability/audit.d.ts +121 -0
- package/dist/modules/observability/audit.js +322 -0
- package/dist/modules/observability/audit.js.map +1 -0
- package/dist/modules/observability/index.d.ts +4 -0
- package/dist/modules/observability/index.js +5 -0
- package/dist/modules/observability/index.js.map +1 -0
- package/dist/modules/observability/logger.d.ts +31 -0
- package/dist/modules/observability/logger.js +153 -0
- package/dist/modules/observability/logger.js.map +1 -0
- package/dist/modules/observability/otel.d.ts +39 -0
- package/dist/modules/observability/otel.js +93 -0
- package/dist/modules/observability/otel.js.map +1 -0
- package/dist/modules/primitives/constants.d.ts +150 -0
- package/dist/modules/primitives/constants.js +212 -0
- package/dist/modules/primitives/constants.js.map +1 -0
- package/dist/modules/primitives/errors.d.ts +46 -0
- package/dist/modules/primitives/errors.js +69 -0
- package/dist/modules/primitives/errors.js.map +1 -0
- package/dist/modules/primitives/fs.d.ts +9 -0
- package/dist/modules/primitives/fs.js +54 -0
- package/dist/modules/primitives/fs.js.map +1 -0
- package/dist/modules/primitives/index.d.ts +7 -0
- package/dist/modules/primitives/index.js +8 -0
- package/dist/modules/primitives/index.js.map +1 -0
- package/dist/modules/primitives/outbound-http.d.ts +32 -0
- package/dist/modules/primitives/outbound-http.js +88 -0
- package/dist/modules/primitives/outbound-http.js.map +1 -0
- package/dist/modules/primitives/string.d.ts +1 -0
- package/dist/modules/primitives/string.js +30 -0
- package/dist/modules/primitives/string.js.map +1 -0
- package/dist/modules/primitives/time.d.ts +5 -0
- package/dist/modules/primitives/time.js +35 -0
- package/dist/modules/primitives/time.js.map +1 -0
- package/dist/modules/primitives/types.d.ts +27 -0
- package/dist/modules/primitives/types.js +17 -0
- package/dist/modules/primitives/types.js.map +1 -0
- package/dist/modules/sandbox/index.d.ts +3 -0
- package/dist/modules/sandbox/index.js +4 -0
- package/dist/modules/sandbox/index.js.map +1 -0
- package/dist/modules/sandbox/sandbox-fs.d.ts +28 -0
- package/dist/modules/sandbox/sandbox-fs.js +143 -0
- package/dist/modules/sandbox/sandbox-fs.js.map +1 -0
- package/dist/modules/sandbox/sandbox-runtime.d.ts +78 -0
- package/dist/modules/sandbox/sandbox-runtime.js +282 -0
- package/dist/modules/sandbox/sandbox-runtime.js.map +1 -0
- package/dist/modules/sandbox/sandbox.d.ts +54 -0
- package/dist/modules/sandbox/sandbox.js +179 -0
- package/dist/modules/sandbox/sandbox.js.map +1 -0
- package/dist/modules/security/index.d.ts +5 -0
- package/dist/modules/security/index.js +6 -0
- package/dist/modules/security/index.js.map +1 -0
- package/dist/modules/security/pii.d.ts +70 -0
- package/dist/modules/security/pii.js +276 -0
- package/dist/modules/security/pii.js.map +1 -0
- package/dist/modules/security/policy-gate.d.ts +42 -0
- package/dist/modules/security/policy-gate.js +172 -0
- package/dist/modules/security/policy-gate.js.map +1 -0
- package/dist/modules/security/retention.d.ts +68 -0
- package/dist/modules/security/retention.js +218 -0
- package/dist/modules/security/retention.js.map +1 -0
- package/dist/modules/security/secrets.d.ts +99 -0
- package/dist/modules/security/secrets.js +371 -0
- package/dist/modules/security/secrets.js.map +1 -0
- package/dist/modules/security/tls.d.ts +87 -0
- package/dist/modules/security/tls.js +154 -0
- package/dist/modules/security/tls.js.map +1 -0
- package/dist/modules/storage/database.d.ts +6 -0
- package/dist/modules/storage/database.js +16 -0
- package/dist/modules/storage/database.js.map +1 -0
- package/dist/modules/storage/index.d.ts +4 -0
- package/dist/modules/storage/index.js +5 -0
- package/dist/modules/storage/index.js.map +1 -0
- package/dist/modules/storage/memory-prune.d.ts +18 -0
- package/dist/modules/storage/memory-prune.js +48 -0
- package/dist/modules/storage/memory-prune.js.map +1 -0
- package/dist/modules/storage/migrations.d.ts +69 -0
- package/dist/modules/storage/migrations.js +394 -0
- package/dist/modules/storage/migrations.js.map +1 -0
- package/dist/modules/storage/storage.d.ts +341 -0
- package/dist/modules/storage/storage.js +1004 -0
- package/dist/modules/storage/storage.js.map +1 -0
- package/dist/otel.d.ts +1 -39
- package/dist/otel.js +1 -92
- package/dist/otel.js.map +1 -1
- package/dist/outbound-http.d.ts +1 -32
- package/dist/outbound-http.js +1 -87
- package/dist/outbound-http.js.map +1 -1
- package/dist/pii.d.ts +1 -70
- package/dist/pii.js +1 -275
- package/dist/pii.js.map +1 -1
- package/dist/policy-gate.d.ts +1 -42
- package/dist/policy-gate.js +1 -171
- package/dist/policy-gate.js.map +1 -1
- package/dist/resilience.d.ts +1 -84
- package/dist/resilience.js +1 -216
- package/dist/resilience.js.map +1 -1
- package/dist/retention.d.ts +1 -68
- package/dist/retention.js +1 -217
- package/dist/retention.js.map +1 -1
- package/dist/sandbox-fs.d.ts +1 -28
- package/dist/sandbox-fs.js +1 -142
- package/dist/sandbox-fs.js.map +1 -1
- package/dist/sandbox-runtime.d.ts +1 -78
- package/dist/sandbox-runtime.js +1 -281
- package/dist/sandbox-runtime.js.map +1 -1
- package/dist/sandbox.d.ts +1 -54
- package/dist/sandbox.js +1 -178
- package/dist/sandbox.js.map +1 -1
- package/dist/secrets.d.ts +1 -99
- package/dist/secrets.js +1 -370
- package/dist/secrets.js.map +1 -1
- package/dist/storage.d.ts +1 -341
- package/dist/storage.js +1 -1003
- package/dist/storage.js.map +1 -1
- package/dist/string.d.ts +1 -1
- package/dist/string.js +1 -29
- package/dist/string.js.map +1 -1
- package/dist/time.d.ts +1 -5
- package/dist/time.js +1 -34
- package/dist/time.js.map +1 -1
- package/dist/tls.d.ts +1 -87
- package/dist/tls.js +1 -153
- package/dist/tls.js.map +1 -1
- package/dist/tokenizer.d.ts +1 -54
- package/dist/tokenizer.js +1 -271
- package/dist/tokenizer.js.map +1 -1
- package/dist/types.d.ts +1 -27
- package/dist/types.js +1 -16
- package/dist/types.js.map +1 -1
- package/dist/worker-pool.d.ts +1 -52
- package/dist/worker-pool.js +1 -228
- package/dist/worker-pool.js.map +1 -1
- package/dist/worker-thread.d.ts +1 -21
- package/dist/worker-thread.js +1 -66
- package/dist/worker-thread.js.map +1 -1
- package/package.json +44 -34
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Catalog — endpoint registry, route/OpenAPI scanner, and drift detection.
|
|
3
|
+
*
|
|
4
|
+
* Purpose: let frontend/mobile agents integrate against the backend API using
|
|
5
|
+
* a compact JSON catalog instead of reading large route source files (token
|
|
6
|
+
* savings + zero context pollution).
|
|
7
|
+
*
|
|
8
|
+
* The scanner is HEURISTIC (regex/AST-lite) and covers:
|
|
9
|
+
* - Express / Fastify: app|router|server|fastify.get('/path', ...)
|
|
10
|
+
* - Fastify route(): fastify.route({ method, url, ... })
|
|
11
|
+
* - NestJS decorators: @Get('path') / @Post('path')
|
|
12
|
+
* - OpenAPI v3 / Swagger v2 JSON specs
|
|
13
|
+
*/
|
|
14
|
+
import fs from "fs";
|
|
15
|
+
import path from "path";
|
|
16
|
+
const HTTP_METHODS = ["get", "post", "put", "patch", "delete", "options", "head"];
|
|
17
|
+
const ROUTE_EXTENSIONS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"]);
|
|
18
|
+
const SKIP_DIRS = new Set(["node_modules", "dist", "build", ".git", "coverage", ".atabey", ".next"]);
|
|
19
|
+
export function endpointKey(e) {
|
|
20
|
+
return `${e.method.toUpperCase()} ${normalizePath(e.path)}`;
|
|
21
|
+
}
|
|
22
|
+
export function normalizePath(p) {
|
|
23
|
+
if (!p)
|
|
24
|
+
return "/";
|
|
25
|
+
let out = p.trim();
|
|
26
|
+
if (!out.startsWith("/"))
|
|
27
|
+
out = `/${out}`;
|
|
28
|
+
// Collapse :param and {param} to a stable placeholder for drift comparison.
|
|
29
|
+
out = out.replace(/\{[^}]+\}/g, ":param").replace(/:[A-Za-z0-9_]+/g, ":param");
|
|
30
|
+
out = out.replace(/\/+$/, "");
|
|
31
|
+
return out || "/";
|
|
32
|
+
}
|
|
33
|
+
function defaultTag(p) {
|
|
34
|
+
const seg = p.split("/").filter(Boolean);
|
|
35
|
+
return seg[0] || "root";
|
|
36
|
+
}
|
|
37
|
+
/** Extract a route statement plus a few following lines for schema hints. */
|
|
38
|
+
function scanRouteSource(filePath, content) {
|
|
39
|
+
const now = new Date().toISOString();
|
|
40
|
+
const lines = content.split("\n");
|
|
41
|
+
const found = new Map();
|
|
42
|
+
const add = (method, rawPath, schemaHint, authHint) => {
|
|
43
|
+
if (!rawPath || rawPath === "*")
|
|
44
|
+
return;
|
|
45
|
+
const m = method.toUpperCase();
|
|
46
|
+
const p = rawPath;
|
|
47
|
+
const key = endpointKey({ method: m, path: p });
|
|
48
|
+
if (found.has(key))
|
|
49
|
+
return;
|
|
50
|
+
const schemaMatch = /(?:schema|body|response)\s*:\s*([A-Za-z0-9_.]+)/.exec(schemaHint);
|
|
51
|
+
found.set(key, {
|
|
52
|
+
method: m,
|
|
53
|
+
path: p.startsWith("/") ? p : `/${p}`,
|
|
54
|
+
tag: defaultTag(p),
|
|
55
|
+
authRequired: authHint,
|
|
56
|
+
requestSchema: schemaMatch?.[1],
|
|
57
|
+
source: filePath,
|
|
58
|
+
updatedAt: now,
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const isRouteLine = (l) => /\.(get|post|put|patch|delete|options|head)\s*\(/.test(l) ||
|
|
62
|
+
/@(Get|Post|Put|Patch|Delete|Options|Head)\s*\(/.test(l) ||
|
|
63
|
+
/\broute\s*\(/.test(l);
|
|
64
|
+
for (let i = 0; i < lines.length; i++) {
|
|
65
|
+
const line = lines[i];
|
|
66
|
+
// Statement-bounded window: stop at the next route line or statement end
|
|
67
|
+
// so schema/auth hints cannot bleed into the following route.
|
|
68
|
+
let window = line;
|
|
69
|
+
for (let j = i + 1; j < Math.min(i + 12, lines.length); j++) {
|
|
70
|
+
if (isRouteLine(lines[j]))
|
|
71
|
+
break;
|
|
72
|
+
window += `\n${lines[j]}`;
|
|
73
|
+
if (/;\s*$/.test(lines[j]))
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
const authHint = /\b(authenticate|authGuard|verifyToken|preHandler\s*:\s*\[?\s*auth|requireAuth|jwt)\b/i.test(window);
|
|
77
|
+
// Express / Fastify shorthand: app.get('/x', ...) / router.post("/x", ...)
|
|
78
|
+
const short = /\.(get|post|put|patch|delete|options|head)\s*\(\s*[`'"]([^`'"]+)[`'"]/gi;
|
|
79
|
+
let m;
|
|
80
|
+
while ((m = short.exec(line)) !== null) {
|
|
81
|
+
add(m[1], m[2], window, authHint);
|
|
82
|
+
}
|
|
83
|
+
// Fastify route({ method: 'GET', url: '/x' }) — method/url may be in either order.
|
|
84
|
+
if (/\broute\s*\(/.test(line) || /\burl\s*:/.test(line)) {
|
|
85
|
+
const methodM = /method\s*:\s*[`'"](\w+)[`'"]/i.exec(window);
|
|
86
|
+
const urlM = /url\s*:\s*[`'"]([^`'"]+)[`'"]/i.exec(window);
|
|
87
|
+
if (methodM && urlM)
|
|
88
|
+
add(methodM[1], urlM[1], window, authHint);
|
|
89
|
+
}
|
|
90
|
+
// NestJS decorators: @Get('path') @Post()
|
|
91
|
+
const dec = /@(Get|Post|Put|Patch|Delete|Options|Head)\s*\(\s*[`'"]?([^`'")]*)[`'"]?\s*\)/g;
|
|
92
|
+
while ((m = dec.exec(line)) !== null) {
|
|
93
|
+
add(m[1], m[2] || "/", window, authHint);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return [...found.values()];
|
|
97
|
+
}
|
|
98
|
+
/** Parse an OpenAPI v3 or Swagger v2 spec object into endpoints. */
|
|
99
|
+
export function parseOpenApiSpec(spec) {
|
|
100
|
+
const now = new Date().toISOString();
|
|
101
|
+
const doc = spec;
|
|
102
|
+
const paths = doc?.["paths"];
|
|
103
|
+
if (!paths || typeof paths !== "object")
|
|
104
|
+
return [];
|
|
105
|
+
const out = [];
|
|
106
|
+
for (const [rawPath, item] of Object.entries(paths)) {
|
|
107
|
+
if (!item || typeof item !== "object")
|
|
108
|
+
continue;
|
|
109
|
+
for (const method of HTTP_METHODS) {
|
|
110
|
+
const op = item[method];
|
|
111
|
+
if (!op)
|
|
112
|
+
continue;
|
|
113
|
+
const tags = Array.isArray(op["tags"]) ? op["tags"] : [];
|
|
114
|
+
const security = op["security"];
|
|
115
|
+
const requestSchema = refName(op["requestBody"]?.["content"]?.["application/json"]) ??
|
|
116
|
+
refName(op["parameters"]);
|
|
117
|
+
const responses = op["responses"];
|
|
118
|
+
const okResp = responses?.["200"] ?? responses?.["201"] ?? Object.values(responses || {})[0];
|
|
119
|
+
const responseSchema = refName((okResp?.["content"]?.["application/json"]) ?? okResp?.["schema"]);
|
|
120
|
+
out.push({
|
|
121
|
+
method: method.toUpperCase(),
|
|
122
|
+
path: rawPath,
|
|
123
|
+
tag: tags[0] || defaultTag(rawPath),
|
|
124
|
+
summary: typeof op["summary"] === "string" ? op["summary"] : undefined,
|
|
125
|
+
authRequired: Array.isArray(security) ? security.length > 0 : false,
|
|
126
|
+
requestSchema,
|
|
127
|
+
responseSchema,
|
|
128
|
+
source: "openapi",
|
|
129
|
+
updatedAt: now,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
function refName(node) {
|
|
136
|
+
if (!node || typeof node !== "object")
|
|
137
|
+
return undefined;
|
|
138
|
+
const obj = node;
|
|
139
|
+
if (typeof obj["$ref"] === "string")
|
|
140
|
+
return obj["$ref"];
|
|
141
|
+
if (typeof obj["title"] === "string")
|
|
142
|
+
return obj["title"];
|
|
143
|
+
const schema = obj["schema"];
|
|
144
|
+
if (schema && typeof schema === "object") {
|
|
145
|
+
const s = schema;
|
|
146
|
+
if (typeof s["$ref"] === "string")
|
|
147
|
+
return s["$ref"];
|
|
148
|
+
if (typeof s["title"] === "string")
|
|
149
|
+
return s["title"];
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Walk a project tree and collect endpoints from route source files and any
|
|
155
|
+
* OpenAPI/Swagger JSON specs.
|
|
156
|
+
*/
|
|
157
|
+
export function scanProjectForEndpoints(rootDir, options = {}) {
|
|
158
|
+
const maxFiles = options.maxFiles ?? 5000;
|
|
159
|
+
const results = [];
|
|
160
|
+
let visited = 0;
|
|
161
|
+
const walk = (dir) => {
|
|
162
|
+
if (visited >= maxFiles)
|
|
163
|
+
return;
|
|
164
|
+
let entries;
|
|
165
|
+
try {
|
|
166
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
for (const entry of entries) {
|
|
172
|
+
if (visited >= maxFiles)
|
|
173
|
+
return;
|
|
174
|
+
const full = path.join(dir, entry.name);
|
|
175
|
+
if (entry.isDirectory()) {
|
|
176
|
+
if (SKIP_DIRS.has(entry.name))
|
|
177
|
+
continue;
|
|
178
|
+
walk(full);
|
|
179
|
+
}
|
|
180
|
+
else if (entry.isFile()) {
|
|
181
|
+
visited++;
|
|
182
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
183
|
+
try {
|
|
184
|
+
if (ext === ".json" && /openapi|swagger/i.test(entry.name)) {
|
|
185
|
+
const spec = JSON.parse(fs.readFileSync(full, "utf8"));
|
|
186
|
+
results.push(...parseOpenApiSpec(spec));
|
|
187
|
+
}
|
|
188
|
+
else if (ROUTE_EXTENSIONS.has(ext)) {
|
|
189
|
+
const content = fs.readFileSync(full, "utf8");
|
|
190
|
+
if (/\.(get|post|put|patch|delete)\(|@(Get|Post|Put|Patch|Delete)\(|\broute\(/.test(content)) {
|
|
191
|
+
results.push(...scanRouteSource(path.relative(rootDir, full), content));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
/* skip unreadable files */
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
walk(rootDir);
|
|
202
|
+
return dedupe(results);
|
|
203
|
+
}
|
|
204
|
+
export function dedupe(endpoints) {
|
|
205
|
+
const map = new Map();
|
|
206
|
+
for (const e of endpoints) {
|
|
207
|
+
const key = endpointKey(e);
|
|
208
|
+
const existing = map.get(key);
|
|
209
|
+
if (!existing) {
|
|
210
|
+
map.set(key, e);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
// Prefer the record with richer schema info.
|
|
214
|
+
map.set(key, {
|
|
215
|
+
...existing,
|
|
216
|
+
requestSchema: existing.requestSchema ?? e.requestSchema,
|
|
217
|
+
responseSchema: existing.responseSchema ?? e.responseSchema,
|
|
218
|
+
authRequired: existing.authRequired || e.authRequired,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return [...map.values()].sort((a, b) => endpointKey(a).localeCompare(endpointKey(b)));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Diff a previous catalog against a freshly scanned one.
|
|
226
|
+
*/
|
|
227
|
+
export function detectApiDrift(previous, current) {
|
|
228
|
+
const prevMap = new Map(previous.map((e) => [endpointKey(e), e]));
|
|
229
|
+
const curMap = new Map(current.map((e) => [endpointKey(e), e]));
|
|
230
|
+
const added = [];
|
|
231
|
+
const removed = [];
|
|
232
|
+
const changed = [];
|
|
233
|
+
for (const [key, cur] of curMap) {
|
|
234
|
+
const prev = prevMap.get(key);
|
|
235
|
+
if (!prev) {
|
|
236
|
+
added.push(cur);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if ((prev.requestSchema ?? "") !== (cur.requestSchema ?? "") ||
|
|
240
|
+
(prev.responseSchema ?? "") !== (cur.responseSchema ?? "") ||
|
|
241
|
+
prev.authRequired !== cur.authRequired) {
|
|
242
|
+
changed.push({ previous: prev, current: cur });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
for (const [key, prev] of prevMap) {
|
|
246
|
+
if (!curMap.has(key))
|
|
247
|
+
removed.push(prev);
|
|
248
|
+
}
|
|
249
|
+
return { added, removed, changed };
|
|
250
|
+
}
|
|
251
|
+
export function isApiDriftClean(drift) {
|
|
252
|
+
return drift.added.length === 0 && drift.removed.length === 0 && drift.changed.length === 0;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=api-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-catalog.js","sourceRoot":"","sources":["../../../src/modules/agent/api-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/agent/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Counter & Pricing Catalog (Phase 1.5)
|
|
3
|
+
*
|
|
4
|
+
* Uses the REAL `cl100k_base` BPE tokenizer via `js-tiktoken` (lite build +
|
|
5
|
+
* cl100k ranks ≈ ±2% vs provider tokenizers). If the BPE table cannot be
|
|
6
|
+
* loaded, it falls back to a cl100k-style pre-tokenization heuristic.
|
|
7
|
+
*
|
|
8
|
+
* Model-specific tokenizers (o200k_base, Claude, Gemini) are not applied yet;
|
|
9
|
+
* `_model` is accepted for API compatibility. Use counts for token awareness
|
|
10
|
+
* and token-awareness guardrails, not exact billing.
|
|
11
|
+
*/
|
|
12
|
+
export interface ModelPricing {
|
|
13
|
+
provider: "anthropic" | "openai" | "google" | "deepseek" | "generic";
|
|
14
|
+
model: string;
|
|
15
|
+
/** USD per 1,000,000 input tokens */
|
|
16
|
+
inputPer1MUsd: number;
|
|
17
|
+
/** USD per 1,000,000 output tokens */
|
|
18
|
+
outputPer1MUsd: number;
|
|
19
|
+
tokenizer: "cl100k_base" | "o200k_base" | "claude_bpe" | "gemini_spm";
|
|
20
|
+
}
|
|
21
|
+
export interface TokenUsageBreakdown {
|
|
22
|
+
inputTokens: number;
|
|
23
|
+
outputTokens: number;
|
|
24
|
+
totalTokens: number;
|
|
25
|
+
estimatedCostUsd: number;
|
|
26
|
+
model: string;
|
|
27
|
+
provider: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Up-to-date model pricing catalog (USD per 1M tokens).
|
|
31
|
+
*/
|
|
32
|
+
export declare const MODEL_PRICING_CATALOG: Record<string, ModelPricing>;
|
|
33
|
+
/**
|
|
34
|
+
* Count BPE tokens in a string.
|
|
35
|
+
*
|
|
36
|
+
* Uses the REAL `cl100k_base` tokenizer (js-tiktoken) for ~±2% accuracy.
|
|
37
|
+
* Falls back to a cl100k-style heuristic only if the BPE table cannot load.
|
|
38
|
+
*/
|
|
39
|
+
export declare function countTokens(text: string, _model?: string): number;
|
|
40
|
+
/**
|
|
41
|
+
* Resolve pricing for a given model name (supports partial matches and env overrides).
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveModelPricing(model?: string): ModelPricing;
|
|
44
|
+
/**
|
|
45
|
+
* Calculate USD cost from separate input and output token counts.
|
|
46
|
+
*/
|
|
47
|
+
export declare function calculateModelCost(inputTokens: number, outputTokens: number, model?: string): {
|
|
48
|
+
costUsd: number;
|
|
49
|
+
pricing: ModelPricing;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Compute full input/output token and estimated-cost breakdown for an MCP tool invocation.
|
|
53
|
+
*/
|
|
54
|
+
export declare function measureToolCallUsage(toolName: string, args: unknown, resultText: string, model?: string): TokenUsageBreakdown;
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Counter & Pricing Catalog (Phase 1.5)
|
|
3
|
+
*
|
|
4
|
+
* Uses the REAL `cl100k_base` BPE tokenizer via `js-tiktoken` (lite build +
|
|
5
|
+
* cl100k ranks ≈ ±2% vs provider tokenizers). If the BPE table cannot be
|
|
6
|
+
* loaded, it falls back to a cl100k-style pre-tokenization heuristic.
|
|
7
|
+
*
|
|
8
|
+
* Model-specific tokenizers (o200k_base, Claude, Gemini) are not applied yet;
|
|
9
|
+
* `_model` is accepted for API compatibility. Use counts for token awareness
|
|
10
|
+
* and token-awareness guardrails, not exact billing.
|
|
11
|
+
*/
|
|
12
|
+
import { Tiktoken } from "js-tiktoken/lite";
|
|
13
|
+
import cl100kRanks from "js-tiktoken/ranks/cl100k_base";
|
|
14
|
+
/**
|
|
15
|
+
* Up-to-date model pricing catalog (USD per 1M tokens).
|
|
16
|
+
*/
|
|
17
|
+
export const MODEL_PRICING_CATALOG = {
|
|
18
|
+
"claude-sonnet-4": {
|
|
19
|
+
provider: "anthropic",
|
|
20
|
+
model: "claude-sonnet-4",
|
|
21
|
+
inputPer1MUsd: 3.0,
|
|
22
|
+
outputPer1MUsd: 15.0,
|
|
23
|
+
tokenizer: "claude_bpe",
|
|
24
|
+
},
|
|
25
|
+
"claude-opus-4": {
|
|
26
|
+
provider: "anthropic",
|
|
27
|
+
model: "claude-opus-4",
|
|
28
|
+
inputPer1MUsd: 15.0,
|
|
29
|
+
outputPer1MUsd: 75.0,
|
|
30
|
+
tokenizer: "claude_bpe",
|
|
31
|
+
},
|
|
32
|
+
"claude-3-7-sonnet": {
|
|
33
|
+
provider: "anthropic",
|
|
34
|
+
model: "claude-3-7-sonnet",
|
|
35
|
+
inputPer1MUsd: 3.0,
|
|
36
|
+
outputPer1MUsd: 15.0,
|
|
37
|
+
tokenizer: "claude_bpe",
|
|
38
|
+
},
|
|
39
|
+
"claude-3-5-sonnet": {
|
|
40
|
+
provider: "anthropic",
|
|
41
|
+
model: "claude-3-5-sonnet",
|
|
42
|
+
inputPer1MUsd: 3.0,
|
|
43
|
+
outputPer1MUsd: 15.0,
|
|
44
|
+
tokenizer: "claude_bpe",
|
|
45
|
+
},
|
|
46
|
+
"claude-3-5-haiku": {
|
|
47
|
+
provider: "anthropic",
|
|
48
|
+
model: "claude-3-5-haiku",
|
|
49
|
+
inputPer1MUsd: 0.8,
|
|
50
|
+
outputPer1MUsd: 4.0,
|
|
51
|
+
tokenizer: "claude_bpe",
|
|
52
|
+
},
|
|
53
|
+
"gpt-4o": {
|
|
54
|
+
provider: "openai",
|
|
55
|
+
model: "gpt-4o",
|
|
56
|
+
inputPer1MUsd: 2.5,
|
|
57
|
+
outputPer1MUsd: 10.0,
|
|
58
|
+
tokenizer: "o200k_base",
|
|
59
|
+
},
|
|
60
|
+
"gpt-4o-mini": {
|
|
61
|
+
provider: "openai",
|
|
62
|
+
model: "gpt-4o-mini",
|
|
63
|
+
inputPer1MUsd: 0.15,
|
|
64
|
+
outputPer1MUsd: 0.6,
|
|
65
|
+
tokenizer: "o200k_base",
|
|
66
|
+
},
|
|
67
|
+
"gpt-4.1": {
|
|
68
|
+
provider: "openai",
|
|
69
|
+
model: "gpt-4.1",
|
|
70
|
+
inputPer1MUsd: 2.0,
|
|
71
|
+
outputPer1MUsd: 8.0,
|
|
72
|
+
tokenizer: "o200k_base",
|
|
73
|
+
},
|
|
74
|
+
"o3-mini": {
|
|
75
|
+
provider: "openai",
|
|
76
|
+
model: "o3-mini",
|
|
77
|
+
inputPer1MUsd: 1.1,
|
|
78
|
+
outputPer1MUsd: 4.4,
|
|
79
|
+
tokenizer: "o200k_base",
|
|
80
|
+
},
|
|
81
|
+
"gemini-2.5-pro": {
|
|
82
|
+
provider: "google",
|
|
83
|
+
model: "gemini-2.5-pro",
|
|
84
|
+
inputPer1MUsd: 1.25,
|
|
85
|
+
outputPer1MUsd: 10.0,
|
|
86
|
+
tokenizer: "gemini_spm",
|
|
87
|
+
},
|
|
88
|
+
"gemini-2.5-flash": {
|
|
89
|
+
provider: "google",
|
|
90
|
+
model: "gemini-2.5-flash",
|
|
91
|
+
inputPer1MUsd: 0.15,
|
|
92
|
+
outputPer1MUsd: 0.6,
|
|
93
|
+
tokenizer: "gemini_spm",
|
|
94
|
+
},
|
|
95
|
+
"deepseek-chat": {
|
|
96
|
+
provider: "deepseek",
|
|
97
|
+
model: "deepseek-chat",
|
|
98
|
+
inputPer1MUsd: 0.27,
|
|
99
|
+
outputPer1MUsd: 1.1,
|
|
100
|
+
tokenizer: "cl100k_base",
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Official cl100k_base pre-tokenization pattern:
|
|
105
|
+
* - English contractions ('s, 'd, 'm, 't, 'll, 've, 're)
|
|
106
|
+
* - Optional space + Unicode letters
|
|
107
|
+
* - Optional space + 1..3 Unicode digits (numbers split every 3 digits in cl100k)
|
|
108
|
+
* - Optional space + non-whitespace/non-alphanumeric punctuation
|
|
109
|
+
* - Newlines / trailing whitespace runs
|
|
110
|
+
*/
|
|
111
|
+
const CL100K_PRETOKEN_REGEX = /'(?:[sdmt]|ll|ve|re)| ?\p{L}+| ?\p{N}{1,3}| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu;
|
|
112
|
+
/**
|
|
113
|
+
* Common high-frequency programming/English tokens that map 1:1 to a single BPE token
|
|
114
|
+
* in cl100k_base / o200k_base.
|
|
115
|
+
*/
|
|
116
|
+
const SINGLE_BPE_WORDS = new Set([
|
|
117
|
+
"function", "return", "const", "let", "var", "import", "export", "from", "async", "await",
|
|
118
|
+
"interface", "type", "class", "public", "private", "protected", "static", "readonly",
|
|
119
|
+
"string", "number", "boolean", "object", "undefined", "null", "true", "false", "void",
|
|
120
|
+
"promise", "record", "array", "error", "default", "switch", "case", "break", "continue",
|
|
121
|
+
"throw", "catch", "finally", "typeof", "instanceof", "extends", "implements", "constructor",
|
|
122
|
+
"package", "module", "require", "process", "console", "Buffer", "Math", "JSON", "Date",
|
|
123
|
+
"SELECT", "INSERT", "UPDATE", "DELETE", "FROM", "WHERE", "CREATE", "TABLE", "INDEX",
|
|
124
|
+
]);
|
|
125
|
+
/**
|
|
126
|
+
* Estimate how many BPE subword tokens a single pre-token chunk splits into.
|
|
127
|
+
*/
|
|
128
|
+
function countChunkBpeTokens(chunk) {
|
|
129
|
+
const trimmed = chunk.trimStart();
|
|
130
|
+
if (!trimmed) {
|
|
131
|
+
// Pure whitespace run: 1 token per ~4 spaces or per newline group
|
|
132
|
+
return Math.max(1, Math.ceil(chunk.length / 4));
|
|
133
|
+
}
|
|
134
|
+
// 1-3 digit numbers are guaranteed 1 token by CL100K_PRETOKEN_REGEX
|
|
135
|
+
if (/^\p{N}{1,3}$/u.test(trimmed)) {
|
|
136
|
+
return 1;
|
|
137
|
+
}
|
|
138
|
+
// Punctuation runs: common 1-3 char operators (===, !==, =>, ->, ::, ..., etc.) are 1 token
|
|
139
|
+
if (/^[^\s\p{L}\p{N}]+$/u.test(trimmed)) {
|
|
140
|
+
if (trimmed.length <= 3)
|
|
141
|
+
return 1;
|
|
142
|
+
return Math.ceil(trimmed.length / 2.5);
|
|
143
|
+
}
|
|
144
|
+
// ASCII word/identifier
|
|
145
|
+
if (/^[A-Za-z]+$/.test(trimmed)) {
|
|
146
|
+
if (trimmed.length <= 6 || SINGLE_BPE_WORDS.has(trimmed) || SINGLE_BPE_WORDS.has(trimmed.toLowerCase())) {
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
// Split camelCase / PascalCase subwords first
|
|
150
|
+
const camelParts = trimmed.split(/(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])/);
|
|
151
|
+
if (camelParts.length > 1) {
|
|
152
|
+
let subTokens = 0;
|
|
153
|
+
for (const part of camelParts) {
|
|
154
|
+
subTokens += part.length <= 6 ? 1 : Math.ceil(part.length / 4.5);
|
|
155
|
+
}
|
|
156
|
+
return subTokens;
|
|
157
|
+
}
|
|
158
|
+
// Longer natural word: BPE averages ~4.5 chars per subword token
|
|
159
|
+
return Math.ceil(trimmed.length / 4.5);
|
|
160
|
+
}
|
|
161
|
+
// Non-ASCII Unicode (Turkish diacritics, CJK, emoji, etc.) — count UTF-8 byte density
|
|
162
|
+
const byteLength = Buffer.byteLength(trimmed, "utf8");
|
|
163
|
+
// In BPE, 2-byte UTF-8 chars (e.g. ş, ğ, ı, ö, ü, ç) take ~1 token per 2.8 bytes
|
|
164
|
+
return Math.max(1, Math.ceil(byteLength / 2.8));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Estimate BPE tokens in a string using cl100k-style pre-tokenization.
|
|
168
|
+
* NOTE: approximate — see file header. `_model` is accepted for API
|
|
169
|
+
* compatibility but per-model tokenizer differences are not yet applied.
|
|
170
|
+
*/
|
|
171
|
+
/** Heuristic fallback used only if the real BPE encoder cannot be initialised. */
|
|
172
|
+
function approximateCountTokens(text) {
|
|
173
|
+
const matches = text.match(CL100K_PRETOKEN_REGEX);
|
|
174
|
+
if (!matches)
|
|
175
|
+
return 0;
|
|
176
|
+
let total = 0;
|
|
177
|
+
for (const chunk of matches) {
|
|
178
|
+
total += countChunkBpeTokens(chunk);
|
|
179
|
+
}
|
|
180
|
+
return total;
|
|
181
|
+
}
|
|
182
|
+
/** Lazily-initialised real cl100k_base BPE encoder (js-tiktoken, lite build). */
|
|
183
|
+
let realEncoder = null;
|
|
184
|
+
let realEncoderFailed = false;
|
|
185
|
+
function getRealEncoder() {
|
|
186
|
+
if (realEncoder)
|
|
187
|
+
return realEncoder;
|
|
188
|
+
if (realEncoderFailed)
|
|
189
|
+
return null;
|
|
190
|
+
try {
|
|
191
|
+
realEncoder = new Tiktoken(cl100kRanks);
|
|
192
|
+
return realEncoder;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
realEncoderFailed = true;
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Count BPE tokens in a string.
|
|
201
|
+
*
|
|
202
|
+
* Uses the REAL `cl100k_base` tokenizer (js-tiktoken) for ~±2% accuracy.
|
|
203
|
+
* Falls back to a cl100k-style heuristic only if the BPE table cannot load.
|
|
204
|
+
*/
|
|
205
|
+
export function countTokens(text, _model) {
|
|
206
|
+
if (!text)
|
|
207
|
+
return 0;
|
|
208
|
+
const encoder = getRealEncoder();
|
|
209
|
+
if (encoder) {
|
|
210
|
+
try {
|
|
211
|
+
return encoder.encode(text).length;
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
/* fall through to heuristic */
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return approximateCountTokens(text);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Resolve pricing for a given model name (supports partial matches and env overrides).
|
|
221
|
+
*/
|
|
222
|
+
export function resolveModelPricing(model) {
|
|
223
|
+
const requested = (model || process.env.ATABEY_MODEL || "claude-sonnet-4").toLowerCase().trim();
|
|
224
|
+
if (MODEL_PRICING_CATALOG[requested]) {
|
|
225
|
+
return MODEL_PRICING_CATALOG[requested];
|
|
226
|
+
}
|
|
227
|
+
for (const [key, pricing] of Object.entries(MODEL_PRICING_CATALOG)) {
|
|
228
|
+
if (requested.includes(key) || key.includes(requested)) {
|
|
229
|
+
return pricing;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const envPer1k = parseFloat(process.env.ATABEY_COST_PER_1K_TOKENS_USD || "");
|
|
233
|
+
if (Number.isFinite(envPer1k) && envPer1k > 0) {
|
|
234
|
+
return {
|
|
235
|
+
provider: "generic",
|
|
236
|
+
model: requested || "custom",
|
|
237
|
+
inputPer1MUsd: envPer1k * 1000,
|
|
238
|
+
outputPer1MUsd: envPer1k * 1000,
|
|
239
|
+
tokenizer: "cl100k_base",
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return MODEL_PRICING_CATALOG["claude-sonnet-4"];
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Calculate USD cost from separate input and output token counts.
|
|
246
|
+
*/
|
|
247
|
+
export function calculateModelCost(inputTokens, outputTokens, model) {
|
|
248
|
+
const pricing = resolveModelPricing(model);
|
|
249
|
+
const inputCost = (Math.max(0, inputTokens) / 1_000_000) * pricing.inputPer1MUsd;
|
|
250
|
+
const outputCost = (Math.max(0, outputTokens) / 1_000_000) * pricing.outputPer1MUsd;
|
|
251
|
+
const costUsd = Number((inputCost + outputCost).toFixed(8));
|
|
252
|
+
return { costUsd, pricing };
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Compute full input/output token and estimated-cost breakdown for an MCP tool invocation.
|
|
256
|
+
*/
|
|
257
|
+
export function measureToolCallUsage(toolName, args, resultText, model) {
|
|
258
|
+
const argsSerialized = typeof args === "string" ? args : JSON.stringify(args ?? {});
|
|
259
|
+
// Include MCP tool framing overhead (+8 tokens for tool call envelope)
|
|
260
|
+
const inputTokens = countTokens(toolName, model) + countTokens(argsSerialized, model) + 8;
|
|
261
|
+
const outputTokens = countTokens(resultText || "", model);
|
|
262
|
+
const { costUsd, pricing } = calculateModelCost(inputTokens, outputTokens, model);
|
|
263
|
+
return {
|
|
264
|
+
inputTokens,
|
|
265
|
+
outputTokens,
|
|
266
|
+
totalTokens: inputTokens + outputTokens,
|
|
267
|
+
estimatedCostUsd: costUsd,
|
|
268
|
+
model: pricing.model,
|
|
269
|
+
provider: pricing.provider,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../src/modules/agent/tokenizer.ts"],"names":[],"mappings":"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"}
|