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.
Files changed (221) hide show
  1. package/README.md +63 -24
  2. package/dist/agent-identity.d.ts +1 -34
  3. package/dist/agent-identity.js +1 -76
  4. package/dist/agent-identity.js.map +1 -1
  5. package/dist/api-catalog.d.ts +1 -57
  6. package/dist/api-catalog.js +1 -253
  7. package/dist/api-catalog.js.map +1 -1
  8. package/dist/audit-chain.d.ts +1 -80
  9. package/dist/audit-chain.js +1 -261
  10. package/dist/audit-chain.js.map +1 -1
  11. package/dist/audit.d.ts +1 -121
  12. package/dist/audit.js +1 -321
  13. package/dist/audit.js.map +1 -1
  14. package/dist/constants.d.ts +1 -153
  15. package/dist/constants.js +1 -214
  16. package/dist/constants.js.map +1 -1
  17. package/dist/database.d.ts +1 -5
  18. package/dist/database.js +1 -12
  19. package/dist/database.js.map +1 -1
  20. package/dist/errors.d.ts +1 -46
  21. package/dist/errors.js +1 -68
  22. package/dist/errors.js.map +1 -1
  23. package/dist/file-lock.d.ts +1 -93
  24. package/dist/file-lock.js +1 -239
  25. package/dist/file-lock.js.map +1 -1
  26. package/dist/fs.d.ts +1 -9
  27. package/dist/fs.js +1 -53
  28. package/dist/fs.js.map +1 -1
  29. package/dist/index.d.ts +2 -31
  30. package/dist/index.js +2 -31
  31. package/dist/index.js.map +1 -1
  32. package/dist/job-queue.d.ts +1 -53
  33. package/dist/job-queue.js +1 -126
  34. package/dist/job-queue.js.map +1 -1
  35. package/dist/lock.d.ts +1 -82
  36. package/dist/lock.js +1 -158
  37. package/dist/lock.js.map +1 -1
  38. package/dist/logger.d.ts +1 -31
  39. package/dist/logger.js +1 -152
  40. package/dist/logger.js.map +1 -1
  41. package/dist/memory-prune.d.ts +1 -18
  42. package/dist/memory-prune.js +1 -47
  43. package/dist/memory-prune.js.map +1 -1
  44. package/dist/migrations.d.ts +1 -69
  45. package/dist/migrations.js +1 -374
  46. package/dist/migrations.js.map +1 -1
  47. package/dist/modules/agent/agent-identity.d.ts +34 -0
  48. package/dist/modules/agent/agent-identity.js +77 -0
  49. package/dist/modules/agent/agent-identity.js.map +1 -0
  50. package/dist/modules/agent/api-catalog.d.ts +57 -0
  51. package/dist/modules/agent/api-catalog.js +254 -0
  52. package/dist/modules/agent/api-catalog.js.map +1 -0
  53. package/dist/modules/agent/index.d.ts +3 -0
  54. package/dist/modules/agent/index.js +4 -0
  55. package/dist/modules/agent/index.js.map +1 -0
  56. package/dist/modules/agent/tokenizer.d.ts +54 -0
  57. package/dist/modules/agent/tokenizer.js +272 -0
  58. package/dist/modules/agent/tokenizer.js.map +1 -0
  59. package/dist/modules/concurrency/file-lock.d.ts +93 -0
  60. package/dist/modules/concurrency/file-lock.js +240 -0
  61. package/dist/modules/concurrency/file-lock.js.map +1 -0
  62. package/dist/modules/concurrency/index.d.ts +6 -0
  63. package/dist/modules/concurrency/index.js +7 -0
  64. package/dist/modules/concurrency/index.js.map +1 -0
  65. package/dist/modules/concurrency/job-queue.d.ts +76 -0
  66. package/dist/modules/concurrency/job-queue.js +200 -0
  67. package/dist/modules/concurrency/job-queue.js.map +1 -0
  68. package/dist/modules/concurrency/lock.d.ts +82 -0
  69. package/dist/modules/concurrency/lock.js +159 -0
  70. package/dist/modules/concurrency/lock.js.map +1 -0
  71. package/dist/modules/concurrency/resilience.d.ts +84 -0
  72. package/dist/modules/concurrency/resilience.js +217 -0
  73. package/dist/modules/concurrency/resilience.js.map +1 -0
  74. package/dist/modules/concurrency/worker-pool.d.ts +52 -0
  75. package/dist/modules/concurrency/worker-pool.js +229 -0
  76. package/dist/modules/concurrency/worker-pool.js.map +1 -0
  77. package/dist/modules/concurrency/worker-thread.d.ts +21 -0
  78. package/dist/modules/concurrency/worker-thread.js +67 -0
  79. package/dist/modules/concurrency/worker-thread.js.map +1 -0
  80. package/dist/modules/index.d.ts +14 -0
  81. package/dist/modules/index.js +15 -0
  82. package/dist/modules/index.js.map +1 -0
  83. package/dist/modules/observability/audit-chain.d.ts +80 -0
  84. package/dist/modules/observability/audit-chain.js +262 -0
  85. package/dist/modules/observability/audit-chain.js.map +1 -0
  86. package/dist/modules/observability/audit.d.ts +121 -0
  87. package/dist/modules/observability/audit.js +322 -0
  88. package/dist/modules/observability/audit.js.map +1 -0
  89. package/dist/modules/observability/index.d.ts +4 -0
  90. package/dist/modules/observability/index.js +5 -0
  91. package/dist/modules/observability/index.js.map +1 -0
  92. package/dist/modules/observability/logger.d.ts +31 -0
  93. package/dist/modules/observability/logger.js +153 -0
  94. package/dist/modules/observability/logger.js.map +1 -0
  95. package/dist/modules/observability/otel.d.ts +39 -0
  96. package/dist/modules/observability/otel.js +93 -0
  97. package/dist/modules/observability/otel.js.map +1 -0
  98. package/dist/modules/primitives/constants.d.ts +150 -0
  99. package/dist/modules/primitives/constants.js +212 -0
  100. package/dist/modules/primitives/constants.js.map +1 -0
  101. package/dist/modules/primitives/errors.d.ts +46 -0
  102. package/dist/modules/primitives/errors.js +69 -0
  103. package/dist/modules/primitives/errors.js.map +1 -0
  104. package/dist/modules/primitives/fs.d.ts +9 -0
  105. package/dist/modules/primitives/fs.js +54 -0
  106. package/dist/modules/primitives/fs.js.map +1 -0
  107. package/dist/modules/primitives/index.d.ts +7 -0
  108. package/dist/modules/primitives/index.js +8 -0
  109. package/dist/modules/primitives/index.js.map +1 -0
  110. package/dist/modules/primitives/outbound-http.d.ts +32 -0
  111. package/dist/modules/primitives/outbound-http.js +88 -0
  112. package/dist/modules/primitives/outbound-http.js.map +1 -0
  113. package/dist/modules/primitives/string.d.ts +1 -0
  114. package/dist/modules/primitives/string.js +30 -0
  115. package/dist/modules/primitives/string.js.map +1 -0
  116. package/dist/modules/primitives/time.d.ts +5 -0
  117. package/dist/modules/primitives/time.js +35 -0
  118. package/dist/modules/primitives/time.js.map +1 -0
  119. package/dist/modules/primitives/types.d.ts +27 -0
  120. package/dist/modules/primitives/types.js +17 -0
  121. package/dist/modules/primitives/types.js.map +1 -0
  122. package/dist/modules/sandbox/index.d.ts +3 -0
  123. package/dist/modules/sandbox/index.js +4 -0
  124. package/dist/modules/sandbox/index.js.map +1 -0
  125. package/dist/modules/sandbox/sandbox-fs.d.ts +28 -0
  126. package/dist/modules/sandbox/sandbox-fs.js +143 -0
  127. package/dist/modules/sandbox/sandbox-fs.js.map +1 -0
  128. package/dist/modules/sandbox/sandbox-runtime.d.ts +78 -0
  129. package/dist/modules/sandbox/sandbox-runtime.js +282 -0
  130. package/dist/modules/sandbox/sandbox-runtime.js.map +1 -0
  131. package/dist/modules/sandbox/sandbox.d.ts +54 -0
  132. package/dist/modules/sandbox/sandbox.js +179 -0
  133. package/dist/modules/sandbox/sandbox.js.map +1 -0
  134. package/dist/modules/security/index.d.ts +5 -0
  135. package/dist/modules/security/index.js +6 -0
  136. package/dist/modules/security/index.js.map +1 -0
  137. package/dist/modules/security/pii.d.ts +70 -0
  138. package/dist/modules/security/pii.js +276 -0
  139. package/dist/modules/security/pii.js.map +1 -0
  140. package/dist/modules/security/policy-gate.d.ts +42 -0
  141. package/dist/modules/security/policy-gate.js +172 -0
  142. package/dist/modules/security/policy-gate.js.map +1 -0
  143. package/dist/modules/security/retention.d.ts +68 -0
  144. package/dist/modules/security/retention.js +218 -0
  145. package/dist/modules/security/retention.js.map +1 -0
  146. package/dist/modules/security/secrets.d.ts +99 -0
  147. package/dist/modules/security/secrets.js +371 -0
  148. package/dist/modules/security/secrets.js.map +1 -0
  149. package/dist/modules/security/tls.d.ts +87 -0
  150. package/dist/modules/security/tls.js +154 -0
  151. package/dist/modules/security/tls.js.map +1 -0
  152. package/dist/modules/storage/database.d.ts +6 -0
  153. package/dist/modules/storage/database.js +16 -0
  154. package/dist/modules/storage/database.js.map +1 -0
  155. package/dist/modules/storage/index.d.ts +4 -0
  156. package/dist/modules/storage/index.js +5 -0
  157. package/dist/modules/storage/index.js.map +1 -0
  158. package/dist/modules/storage/memory-prune.d.ts +18 -0
  159. package/dist/modules/storage/memory-prune.js +48 -0
  160. package/dist/modules/storage/memory-prune.js.map +1 -0
  161. package/dist/modules/storage/migrations.d.ts +69 -0
  162. package/dist/modules/storage/migrations.js +394 -0
  163. package/dist/modules/storage/migrations.js.map +1 -0
  164. package/dist/modules/storage/storage.d.ts +341 -0
  165. package/dist/modules/storage/storage.js +1004 -0
  166. package/dist/modules/storage/storage.js.map +1 -0
  167. package/dist/otel.d.ts +1 -39
  168. package/dist/otel.js +1 -92
  169. package/dist/otel.js.map +1 -1
  170. package/dist/outbound-http.d.ts +1 -32
  171. package/dist/outbound-http.js +1 -87
  172. package/dist/outbound-http.js.map +1 -1
  173. package/dist/pii.d.ts +1 -70
  174. package/dist/pii.js +1 -275
  175. package/dist/pii.js.map +1 -1
  176. package/dist/policy-gate.d.ts +1 -42
  177. package/dist/policy-gate.js +1 -171
  178. package/dist/policy-gate.js.map +1 -1
  179. package/dist/resilience.d.ts +1 -84
  180. package/dist/resilience.js +1 -216
  181. package/dist/resilience.js.map +1 -1
  182. package/dist/retention.d.ts +1 -68
  183. package/dist/retention.js +1 -217
  184. package/dist/retention.js.map +1 -1
  185. package/dist/sandbox-fs.d.ts +1 -28
  186. package/dist/sandbox-fs.js +1 -142
  187. package/dist/sandbox-fs.js.map +1 -1
  188. package/dist/sandbox-runtime.d.ts +1 -78
  189. package/dist/sandbox-runtime.js +1 -281
  190. package/dist/sandbox-runtime.js.map +1 -1
  191. package/dist/sandbox.d.ts +1 -54
  192. package/dist/sandbox.js +1 -178
  193. package/dist/sandbox.js.map +1 -1
  194. package/dist/secrets.d.ts +1 -99
  195. package/dist/secrets.js +1 -370
  196. package/dist/secrets.js.map +1 -1
  197. package/dist/storage.d.ts +1 -341
  198. package/dist/storage.js +1 -1003
  199. package/dist/storage.js.map +1 -1
  200. package/dist/string.d.ts +1 -1
  201. package/dist/string.js +1 -29
  202. package/dist/string.js.map +1 -1
  203. package/dist/time.d.ts +1 -5
  204. package/dist/time.js +1 -34
  205. package/dist/time.js.map +1 -1
  206. package/dist/tls.d.ts +1 -87
  207. package/dist/tls.js +1 -153
  208. package/dist/tls.js.map +1 -1
  209. package/dist/tokenizer.d.ts +1 -54
  210. package/dist/tokenizer.js +1 -271
  211. package/dist/tokenizer.js.map +1 -1
  212. package/dist/types.d.ts +1 -27
  213. package/dist/types.js +1 -16
  214. package/dist/types.js.map +1 -1
  215. package/dist/worker-pool.d.ts +1 -52
  216. package/dist/worker-pool.js +1 -228
  217. package/dist/worker-pool.js.map +1 -1
  218. package/dist/worker-thread.d.ts +1 -21
  219. package/dist/worker-thread.js +1 -66
  220. package/dist/worker-thread.js.map +1 -1
  221. 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,3 @@
1
+ export * from "./agent-identity.js";
2
+ export * from "./api-catalog.js";
3
+ export * from "./tokenizer.js";
@@ -0,0 +1,4 @@
1
+ export * from "./agent-identity.js";
2
+ export * from "./api-catalog.js";
3
+ export * from "./tokenizer.js";
4
+ //# sourceMappingURL=index.js.map
@@ -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":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,WAAW,MAAM,+BAA+B,CAAC;AAqBxD;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiC;IAC/D,iBAAiB,EAAE;QACf,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,iBAAiB;QACxB,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,YAAY;KAC1B;IACD,eAAe,EAAE;QACb,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,eAAe;QACtB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,YAAY;KAC1B;IACD,mBAAmB,EAAE;QACjB,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,mBAAmB;QAC1B,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,YAAY;KAC1B;IACD,mBAAmB,EAAE;QACjB,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,mBAAmB;QAC1B,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,YAAY;KAC1B;IACD,kBAAkB,EAAE;QAChB,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,kBAAkB;QACzB,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE,YAAY;KAC1B;IACD,QAAQ,EAAE;QACN,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,QAAQ;QACf,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,YAAY;KAC1B;IACD,aAAa,EAAE;QACX,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,aAAa;QACpB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE,YAAY;KAC1B;IACD,SAAS,EAAE;QACP,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;QAChB,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE,YAAY;KAC1B;IACD,SAAS,EAAE;QACP,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;QAChB,aAAa,EAAE,GAAG;QAClB,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE,YAAY;KAC1B;IACD,gBAAgB,EAAE;QACd,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,gBAAgB;QACvB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,YAAY;KAC1B;IACD,kBAAkB,EAAE;QAChB,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,kBAAkB;QACzB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE,YAAY;KAC1B;IACD,eAAe,EAAE;QACb,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,eAAe;QACtB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE,aAAa;KAC3B;CACJ,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,qBAAqB,GACvB,+EAA+E,CAAC;AAEpF;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC7B,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IACzF,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU;IACpF,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IACrF,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;IACvF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa;IAC3F,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACtF,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO;CACtF,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,kEAAkE;QAClE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,oEAAoE;IACpE,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,CAAC;IACb,CAAC;IAED,4FAA4F;IAC5F,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,wBAAwB;IACxB,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACtG,OAAO,CAAC,CAAC;QACb,CAAC;QACD,8CAA8C;QAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACvE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC5B,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,iEAAiE;QACjE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,sFAAsF;IACtF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,iFAAiF;IACjF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,kFAAkF;AAClF,SAAS,sBAAsB,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAEvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC1B,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,iFAAiF;AACjF,IAAI,WAAW,GAAoB,IAAI,CAAC;AACxC,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAE9B,SAAS,cAAc;IACnB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACD,WAAW,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxC,OAAO,WAAW,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACL,iBAAiB,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAe;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,IAAI,OAAO,EAAE,CAAC;QACV,IAAI,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACL,+BAA+B;QACnC,CAAC;IACL,CAAC;IACD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAC9C,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAChG,IAAI,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACjE,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,OAAO,OAAO,CAAC;QACnB,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO;YACH,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,SAAS,IAAI,QAAQ;YAC5B,aAAa,EAAE,QAAQ,GAAG,IAAI;YAC9B,cAAc,EAAE,QAAQ,GAAG,IAAI;YAC/B,SAAS,EAAE,aAAa;SAC3B,CAAC;IACN,CAAC;IACD,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAC9B,WAAmB,EACnB,YAAoB,EACpB,KAAc;IAEd,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IACjF,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IACpF,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAChC,QAAgB,EAChB,IAAa,EACb,UAAkB,EAClB,KAAc;IAEd,MAAM,cAAc,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACpF,uEAAuE;IACvE,MAAM,WAAW,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1F,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAElF,OAAO;QACH,WAAW;QACX,YAAY;QACZ,WAAW,EAAE,WAAW,GAAG,YAAY;QACvC,gBAAgB,EAAE,OAAO;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC7B,CAAC;AACN,CAAC"}