atabey-shared 0.0.36 → 0.1.0-beta.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 +2 -2
- package/dist/agent-identity.d.ts +34 -0
- package/dist/agent-identity.js +77 -0
- package/dist/agent-identity.js.map +1 -0
- package/dist/api-catalog.d.ts +57 -0
- package/dist/api-catalog.js +254 -0
- package/dist/api-catalog.js.map +1 -0
- package/dist/audit-chain.d.ts +32 -3
- package/dist/audit-chain.js +188 -11
- package/dist/audit-chain.js.map +1 -1
- package/dist/audit.d.ts +8 -0
- package/dist/audit.js +44 -7
- package/dist/audit.js.map +1 -1
- package/dist/constants.d.ts +4 -3
- package/dist/constants.js +11 -12
- package/dist/constants.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/file-lock.d.ts +5 -0
- package/dist/file-lock.js +20 -31
- package/dist/file-lock.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +33 -7
- package/dist/logger.js.map +1 -1
- package/dist/memory-prune.d.ts +18 -0
- package/dist/memory-prune.js +48 -0
- package/dist/memory-prune.js.map +1 -0
- package/dist/migrations.d.ts +69 -0
- package/dist/migrations.js +375 -0
- package/dist/migrations.js.map +1 -0
- package/dist/otel.d.ts +39 -0
- package/dist/otel.js +93 -0
- package/dist/otel.js.map +1 -0
- package/dist/outbound-http.d.ts +32 -0
- package/dist/outbound-http.js +88 -0
- package/dist/outbound-http.js.map +1 -0
- package/dist/pii.d.ts +1 -0
- package/dist/pii.js +82 -26
- package/dist/pii.js.map +1 -1
- package/dist/policy-gate.js +27 -3
- package/dist/policy-gate.js.map +1 -1
- package/dist/retention.d.ts +6 -1
- package/dist/retention.js +56 -9
- package/dist/retention.js.map +1 -1
- package/dist/sandbox-fs.d.ts +1 -1
- package/dist/sandbox-fs.js +34 -39
- package/dist/sandbox-fs.js.map +1 -1
- package/dist/sandbox-runtime.d.ts +21 -28
- package/dist/sandbox-runtime.js +124 -92
- package/dist/sandbox-runtime.js.map +1 -1
- package/dist/secrets.d.ts +99 -0
- package/dist/secrets.js +371 -0
- package/dist/secrets.js.map +1 -0
- package/dist/storage.d.ts +67 -0
- package/dist/storage.js +291 -11
- package/dist/storage.js.map +1 -1
- package/dist/time.js +6 -2
- package/dist/time.js.map +1 -1
- package/dist/tls.d.ts +87 -0
- package/dist/tls.js +154 -0
- package/dist/tls.js.map +1 -0
- package/dist/tokenizer.d.ts +54 -0
- package/dist/tokenizer.js +272 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/worker-pool.js +19 -0
- package/dist/worker-pool.js.map +1 -1
- package/package.json +18 -6
package/dist/tls.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TLS 1.3 / mTLS transport security for Atabey HTTP + WebSocket servers.
|
|
3
|
+
*
|
|
4
|
+
* All network-facing servers (MCP unified server, dashboard) go through
|
|
5
|
+
* `createHttpOrHttpsServer()` so encryption is applied uniformly.
|
|
6
|
+
*
|
|
7
|
+
* Environment:
|
|
8
|
+
* ATABEY_TLS_ENABLED=auto|true|false (auto = enabled when cert+key set)
|
|
9
|
+
* ATABEY_TLS_CERT_FILE=/path/cert.pem (server certificate, PEM)
|
|
10
|
+
* ATABEY_TLS_KEY_FILE=/path/key.pem (server private key, PEM)
|
|
11
|
+
* ATABEY_TLS_CA_FILE=/path/ca.pem (CA bundle; required for mTLS)
|
|
12
|
+
* ATABEY_TLS_MIN_VERSION=TLSv1.3 (TLSv1.3 | TLSv1.2)
|
|
13
|
+
* ATABEY_MTLS_REQUIRED=true (require + verify client certificates)
|
|
14
|
+
* ATABEY_TLS_REQUIRED=true (fail hard if TLS not configured)
|
|
15
|
+
* ATABEY_ALLOW_INSECURE_BIND=true (allow plaintext on non-loopback host)
|
|
16
|
+
*
|
|
17
|
+
* Cipher suites are left to Node's secure defaults, which already prefer
|
|
18
|
+
* TLS 1.3 (AES-256-GCM / CHACHA20-POLY1305). We additionally enforce a modern
|
|
19
|
+
* minimum version and disable session tickets for HITL-sensitive traffic.
|
|
20
|
+
*/
|
|
21
|
+
import fs from "fs";
|
|
22
|
+
import http from "http";
|
|
23
|
+
import https from "https";
|
|
24
|
+
function envBool(key, fallback = false) {
|
|
25
|
+
const v = process.env[key];
|
|
26
|
+
if (v === undefined)
|
|
27
|
+
return fallback;
|
|
28
|
+
return v === "true" || v === "1" || v === "yes";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the TLS configuration from environment. Throws when TLS is enabled
|
|
32
|
+
* but the certificate material is missing/invalid, or when mTLS is required
|
|
33
|
+
* without a CA bundle.
|
|
34
|
+
*/
|
|
35
|
+
export function resolveTlsConfig() {
|
|
36
|
+
const certFile = process.env.ATABEY_TLS_CERT_FILE?.trim() || undefined;
|
|
37
|
+
const keyFile = process.env.ATABEY_TLS_KEY_FILE?.trim() || undefined;
|
|
38
|
+
const caFile = process.env.ATABEY_TLS_CA_FILE?.trim() || undefined;
|
|
39
|
+
const mtlsRequired = envBool("ATABEY_MTLS_REQUIRED", false);
|
|
40
|
+
const required = envBool("ATABEY_TLS_REQUIRED", false);
|
|
41
|
+
const minVersion = (process.env.ATABEY_TLS_MIN_VERSION?.trim() || "TLSv1.3");
|
|
42
|
+
if (minVersion !== "TLSv1.2" && minVersion !== "TLSv1.3") {
|
|
43
|
+
throw new Error(`[TLS] Invalid ATABEY_TLS_MIN_VERSION "${minVersion}" (use TLSv1.2 or TLSv1.3).`);
|
|
44
|
+
}
|
|
45
|
+
const hasKeyPair = Boolean(certFile && keyFile);
|
|
46
|
+
const explicit = process.env.ATABEY_TLS_ENABLED;
|
|
47
|
+
const enabled = explicit === undefined ? hasKeyPair : envBool("ATABEY_TLS_ENABLED", hasKeyPair);
|
|
48
|
+
if (!enabled) {
|
|
49
|
+
return { enabled: false, minVersion, mtlsRequired, required, certFile, keyFile, caFile };
|
|
50
|
+
}
|
|
51
|
+
if (!certFile || !keyFile) {
|
|
52
|
+
throw new Error("[TLS] ATABEY_TLS_ENABLED is set but ATABEY_TLS_CERT_FILE / ATABEY_TLS_KEY_FILE are missing.");
|
|
53
|
+
}
|
|
54
|
+
for (const f of [certFile, keyFile]) {
|
|
55
|
+
if (!fs.existsSync(f))
|
|
56
|
+
throw new Error(`[TLS] Certificate file not found: ${f}`);
|
|
57
|
+
}
|
|
58
|
+
if (mtlsRequired && !caFile) {
|
|
59
|
+
throw new Error("[TLS] ATABEY_MTLS_REQUIRED=true requires ATABEY_TLS_CA_FILE (client CA bundle).");
|
|
60
|
+
}
|
|
61
|
+
if (caFile && !fs.existsSync(caFile)) {
|
|
62
|
+
throw new Error(`[TLS] CA file not found: ${caFile}`);
|
|
63
|
+
}
|
|
64
|
+
const serverOptions = {
|
|
65
|
+
minVersion,
|
|
66
|
+
cert: fs.readFileSync(certFile),
|
|
67
|
+
key: fs.readFileSync(keyFile),
|
|
68
|
+
honorCipherOrder: true,
|
|
69
|
+
// Avoid stale TLS sessions after key rotation.
|
|
70
|
+
sessionTimeout: 0,
|
|
71
|
+
};
|
|
72
|
+
if (caFile)
|
|
73
|
+
serverOptions.ca = fs.readFileSync(caFile);
|
|
74
|
+
if (mtlsRequired) {
|
|
75
|
+
serverOptions.requestCert = true;
|
|
76
|
+
serverOptions.rejectUnauthorized = true;
|
|
77
|
+
}
|
|
78
|
+
return { enabled: true, minVersion, mtlsRequired, required, certFile, keyFile, caFile, serverOptions };
|
|
79
|
+
}
|
|
80
|
+
export function resolveOutboundTlsOptions() {
|
|
81
|
+
const certFile = process.env.ATABEY_TLS_CLIENT_CERT_FILE?.trim() || undefined;
|
|
82
|
+
const keyFile = process.env.ATABEY_TLS_CLIENT_KEY_FILE?.trim() || undefined;
|
|
83
|
+
const caFile = process.env.ATABEY_TLS_CLIENT_CA_FILE?.trim() || undefined;
|
|
84
|
+
const minVersion = (process.env.ATABEY_TLS_CLIENT_MIN_VERSION?.trim() || "TLSv1.3");
|
|
85
|
+
const servername = process.env.ATABEY_TLS_CLIENT_SERVERNAME?.trim() || undefined;
|
|
86
|
+
if (minVersion !== "TLSv1.2" && minVersion !== "TLSv1.3") {
|
|
87
|
+
throw new Error(`[TLS] Invalid ATABEY_TLS_CLIENT_MIN_VERSION "${minVersion}".`);
|
|
88
|
+
}
|
|
89
|
+
if ((certFile && !keyFile) || (keyFile && !certFile)) {
|
|
90
|
+
throw new Error("[TLS] Outbound mTLS requires BOTH ATABEY_TLS_CLIENT_CERT_FILE and ATABEY_TLS_CLIENT_KEY_FILE.");
|
|
91
|
+
}
|
|
92
|
+
for (const f of [certFile, keyFile, caFile]) {
|
|
93
|
+
if (f && !fs.existsSync(f))
|
|
94
|
+
throw new Error(`[TLS] Outbound certificate file not found: ${f}`);
|
|
95
|
+
}
|
|
96
|
+
const enabled = Boolean(certFile || keyFile || caFile);
|
|
97
|
+
const options = { minVersion };
|
|
98
|
+
if (certFile)
|
|
99
|
+
options.cert = fs.readFileSync(certFile);
|
|
100
|
+
if (keyFile)
|
|
101
|
+
options.key = fs.readFileSync(keyFile);
|
|
102
|
+
if (caFile)
|
|
103
|
+
options.ca = fs.readFileSync(caFile);
|
|
104
|
+
if (servername)
|
|
105
|
+
options.servername = servername;
|
|
106
|
+
return { enabled, minVersion, options };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create an HTTPS server when TLS is configured, otherwise a plain HTTP server.
|
|
110
|
+
* Both server types satisfy `http.Server`, so callers stay type-safe.
|
|
111
|
+
*/
|
|
112
|
+
export function createHttpOrHttpsServer(tls, handler) {
|
|
113
|
+
if (tls.enabled && tls.serverOptions) {
|
|
114
|
+
return https.createServer(tls.serverOptions, handler);
|
|
115
|
+
}
|
|
116
|
+
return http.createServer(handler);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Human-readable description for logs / `/api/health`.
|
|
120
|
+
*/
|
|
121
|
+
export function describeTls(tls) {
|
|
122
|
+
if (!tls.enabled)
|
|
123
|
+
return "disabled (plaintext)";
|
|
124
|
+
return `${tls.minVersion}${tls.mtlsRequired ? " + mTLS (client cert required)" : ""}`;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Enforce the transport-security policy before binding.
|
|
128
|
+
*
|
|
129
|
+
* - If ATABEY_TLS_REQUIRED=true and TLS is not configured → throw (fail closed).
|
|
130
|
+
* - If binding to a non-loopback host over plaintext → throw unless
|
|
131
|
+
* ATABEY_ALLOW_INSECURE_BIND=true (prevents accidental public plaintext).
|
|
132
|
+
*/
|
|
133
|
+
export function assertTransportSecurity(tls, host, opts = {}) {
|
|
134
|
+
if (tls.required && !tls.enabled) {
|
|
135
|
+
throw new Error("[TLS] ATABEY_TLS_REQUIRED=true but TLS is not configured. " +
|
|
136
|
+
"Provide ATABEY_TLS_CERT_FILE / ATABEY_TLS_KEY_FILE (and ATABEY_TLS_CA_FILE for mTLS).");
|
|
137
|
+
}
|
|
138
|
+
const normalized = host.replace(/^\[|\]$/g, "");
|
|
139
|
+
const isLoopback = normalized === "127.0.0.1" || normalized === "::1" || normalized === "localhost";
|
|
140
|
+
const allowInsecure = opts.allowInsecureBind ?? envBool("ATABEY_ALLOW_INSECURE_BIND", false);
|
|
141
|
+
if (!tls.enabled && !isLoopback && !allowInsecure) {
|
|
142
|
+
throw new Error(`[TLS] Refusing to bind plaintext HTTP to "${host}" (non-loopback). ` +
|
|
143
|
+
"Configure TLS (ATABEY_TLS_CERT_FILE/KEY_FILE) or set ATABEY_ALLOW_INSECURE_BIND=true.");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** The scheme clients should use to reach this server. */
|
|
147
|
+
export function tlsScheme(tls) {
|
|
148
|
+
return tls.enabled ? "https" : "http";
|
|
149
|
+
}
|
|
150
|
+
/** The WebSocket scheme clients should use. */
|
|
151
|
+
export function wsScheme(tls) {
|
|
152
|
+
return tls.enabled ? "wss" : "ws";
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=tls.js.map
|
package/dist/tls.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tls.js","sourceRoot":"","sources":["../src/tls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAkB1B,SAAS,OAAO,CAAC,GAAW,EAAE,QAAQ,GAAG,KAAK;IAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACrC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACrE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACnE,MAAM,YAAY,GAAG,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAkB,CAAC;IAE9F,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,6BAA6B,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChD,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;IAEhG,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7F,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;IACnH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,aAAa,GAAwB;QACvC,UAAU;QACV,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC/B,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;QAC7B,gBAAgB,EAAE,IAAI;QACtB,+CAA+C;QAC/C,cAAc,EAAE,CAAC;KACpB,CAAC;IACF,IAAI,MAAM;QAAE,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,YAAY,EAAE,CAAC;QACf,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC;QACjC,aAAa,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAC3G,CAAC;AAwBD,MAAM,UAAU,yBAAyB;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAC1E,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,EAAE,IAAI,SAAS,CAAkB,CAAC;IACrG,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAEjF,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,gDAAgD,UAAU,IAAI,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IACrH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,IAAI,MAAM,CAAC,CAAC;IACvD,MAAM,OAAO,GAAiC,EAAE,UAAU,EAAE,CAAC;IAC7D,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,OAAO;QAAE,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,MAAM;QAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,UAAU;QAAE,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;IAChD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACnC,GAAsB,EACtB,OAA6B;IAE7B,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAsB;IAC9C,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,sBAAsB,CAAC;IAChD,OAAO,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC1F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACnC,GAAsB,EACtB,IAAY,EACZ,OAAwC,EAAE;IAE1C,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACX,4DAA4D;YAC5D,uFAAuF,CAC1F,CAAC;IACN,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,WAAW,CAAC;IACpG,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IAC7F,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACX,6CAA6C,IAAI,oBAAoB;YACrE,uFAAuF,CAC1F,CAAC;IACN,CAAC;AACL,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,SAAS,CAAC,GAAsB;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1C,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,QAAQ,CAAC,GAAsB;IAC3C,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Counter & FinOps 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 FinOps awareness
|
|
10
|
+
* and budget guardrails.
|
|
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 FinOps 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 & FinOps 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 FinOps awareness
|
|
10
|
+
* and budget guardrails.
|
|
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 FinOps 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/tokenizer.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.js
CHANGED
package/dist/worker-pool.js
CHANGED
|
@@ -69,7 +69,20 @@ export class WorkerPool {
|
|
|
69
69
|
return new Promise((resolve, reject) => {
|
|
70
70
|
const timer = setTimeout(() => {
|
|
71
71
|
this.inflight.delete(id);
|
|
72
|
+
// Free (and recycle) the worker stuck on this job so a hung job
|
|
73
|
+
// cannot permanently occupy the pool and deadlock every caller.
|
|
74
|
+
const stuck = this.workers.find((w) => w.currentJobId === id);
|
|
75
|
+
if (stuck) {
|
|
76
|
+
stuck.busy = false;
|
|
77
|
+
stuck.currentJobId = null;
|
|
78
|
+
this.removeWorker(stuck);
|
|
79
|
+
void stuck.worker.terminate().catch(() => { });
|
|
80
|
+
}
|
|
72
81
|
reject(new Error(`[WorkerPool] Job ${id} timed out after ${this.jobTimeoutMs}ms`));
|
|
82
|
+
this.dispatch();
|
|
83
|
+
if (!this.closed && this.workers.length < this.minWorkers) {
|
|
84
|
+
this.spawnWorker();
|
|
85
|
+
}
|
|
73
86
|
}, this.jobTimeoutMs);
|
|
74
87
|
const pending = {
|
|
75
88
|
job,
|
|
@@ -99,6 +112,12 @@ export class WorkerPool {
|
|
|
99
112
|
p.reject(new Error("[WorkerPool] Pool closed while job was queued."));
|
|
100
113
|
}
|
|
101
114
|
}
|
|
115
|
+
// Settle any in-flight jobs so their awaiters don't hang forever.
|
|
116
|
+
for (const pending of this.inflight.values()) {
|
|
117
|
+
clearTimeout(pending.timer);
|
|
118
|
+
pending.reject(new Error("[WorkerPool] Pool closed while the job was in flight."));
|
|
119
|
+
}
|
|
120
|
+
this.inflight.clear();
|
|
102
121
|
await Promise.all(this.workers.map((pw) => new Promise((resolve) => {
|
|
103
122
|
pw.worker.once("exit", () => resolve());
|
|
104
123
|
void pw.worker.terminate();
|
package/dist/worker-pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../src/worker-pool.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../src/worker-pool.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atabey-shared",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "Shared utility modules for Atabey — AI
|
|
3
|
+
"version": "0.1.0-beta.0",
|
|
4
|
+
"description": "Shared utility modules for Atabey — Local AI Control Plane & Discipline Layer",
|
|
5
5
|
"author": "Yusuf BEKAR",
|
|
6
6
|
"license": "AGPL-3.0",
|
|
7
7
|
"repository": {
|
|
@@ -56,7 +56,16 @@
|
|
|
56
56
|
"./resilience.js": "./dist/resilience.js",
|
|
57
57
|
"./policy-gate.js": "./dist/policy-gate.js",
|
|
58
58
|
"./storage.js": "./dist/storage.js",
|
|
59
|
-
"./time.js": "./dist/time.js"
|
|
59
|
+
"./time.js": "./dist/time.js",
|
|
60
|
+
"./secrets.js": "./dist/secrets.js",
|
|
61
|
+
"./tokenizer.js": "./dist/tokenizer.js",
|
|
62
|
+
"./migrations.js": "./dist/migrations.js",
|
|
63
|
+
"./tls.js": "./dist/tls.js",
|
|
64
|
+
"./outbound-http.js": "./dist/outbound-http.js",
|
|
65
|
+
"./api-catalog.js": "./dist/api-catalog.js",
|
|
66
|
+
"./agent-identity.js": "./dist/agent-identity.js",
|
|
67
|
+
"./memory-prune.js": "./dist/memory-prune.js",
|
|
68
|
+
"./otel.js": "./dist/otel.js"
|
|
60
69
|
},
|
|
61
70
|
"scripts": {
|
|
62
71
|
"build": "tsc",
|
|
@@ -72,9 +81,12 @@
|
|
|
72
81
|
"devDependencies": {
|
|
73
82
|
"@types/better-sqlite3": "^7.6.13",
|
|
74
83
|
"@types/node": "^25.9.1",
|
|
75
|
-
"typescript": "^5.9.3",
|
|
76
|
-
"vitest": "^5.0.0",
|
|
77
84
|
"@vitest/coverage-v8": "^5.0.0",
|
|
78
|
-
"tsx": "^4.22.3"
|
|
85
|
+
"tsx": "^4.22.3",
|
|
86
|
+
"typescript": "^5.9.3",
|
|
87
|
+
"vitest": "^5.0.0"
|
|
88
|
+
},
|
|
89
|
+
"dependencies": {
|
|
90
|
+
"js-tiktoken": "^1.0.21"
|
|
79
91
|
}
|
|
80
92
|
}
|