@agentuity/runtime 0.1.14 → 0.1.16
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/dist/_config.d.ts +100 -0
- package/dist/_config.d.ts.map +1 -0
- package/dist/_config.js +147 -0
- package/dist/_config.js.map +1 -0
- package/dist/_context.d.ts +76 -0
- package/dist/_context.d.ts.map +1 -0
- package/dist/_context.js +147 -0
- package/dist/_context.js.map +1 -0
- package/dist/_events.d.ts +64 -0
- package/dist/_events.d.ts.map +1 -0
- package/dist/_events.js +92 -0
- package/dist/_events.js.map +1 -0
- package/dist/_idle.d.ts +7 -0
- package/dist/_idle.d.ts.map +1 -0
- package/dist/_idle.js +10 -0
- package/dist/_idle.js.map +1 -0
- package/dist/_metadata.d.ts +117 -0
- package/dist/_metadata.d.ts.map +1 -0
- package/dist/_metadata.js +246 -0
- package/dist/_metadata.js.map +1 -0
- package/dist/_process-protection.d.ts +25 -0
- package/dist/_process-protection.d.ts.map +1 -0
- package/dist/_process-protection.js +65 -0
- package/dist/_process-protection.js.map +1 -0
- package/dist/_server.d.ts +46 -0
- package/dist/_server.d.ts.map +1 -0
- package/dist/_server.js +85 -0
- package/dist/_server.js.map +1 -0
- package/dist/_services.d.ts +21 -0
- package/dist/_services.d.ts.map +1 -0
- package/dist/_services.js +248 -0
- package/dist/_services.js.map +1 -0
- package/dist/_standalone.d.ts +208 -0
- package/dist/_standalone.d.ts.map +1 -0
- package/dist/_standalone.js +569 -0
- package/dist/_standalone.js.map +1 -0
- package/dist/_tokens.d.ts +12 -0
- package/dist/_tokens.d.ts.map +1 -0
- package/dist/_tokens.js +96 -0
- package/dist/_tokens.js.map +1 -0
- package/dist/_util.d.ts +16 -0
- package/dist/_util.d.ts.map +1 -0
- package/dist/_util.js +54 -0
- package/dist/_util.js.map +1 -0
- package/dist/_validation.d.ts +89 -0
- package/dist/_validation.d.ts.map +1 -0
- package/dist/_validation.js +29 -0
- package/dist/_validation.js.map +1 -0
- package/dist/_waituntil.d.ts +18 -0
- package/dist/_waituntil.d.ts.map +1 -0
- package/dist/_waituntil.js +97 -0
- package/dist/_waituntil.js.map +1 -0
- package/dist/agent.d.ts +1210 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +903 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +322 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +160 -0
- package/dist/app.js.map +1 -0
- package/dist/bun-s3-patch.d.ts +37 -0
- package/dist/bun-s3-patch.d.ts.map +1 -0
- package/dist/bun-s3-patch.js +139 -0
- package/dist/bun-s3-patch.js.map +1 -0
- package/dist/cors.d.ts +42 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +117 -0
- package/dist/cors.js.map +1 -0
- package/dist/devmode.d.ts +3 -0
- package/dist/devmode.d.ts.map +1 -0
- package/dist/devmode.js +167 -0
- package/dist/devmode.js.map +1 -0
- package/dist/eval.d.ts +91 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/eval.js +16 -0
- package/dist/eval.js.map +1 -0
- package/dist/handlers/cron.d.ts +47 -0
- package/dist/handlers/cron.d.ts.map +1 -0
- package/dist/handlers/cron.js +49 -0
- package/dist/handlers/cron.js.map +1 -0
- package/dist/handlers/index.d.ts +5 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +5 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/sse.d.ts +91 -0
- package/dist/handlers/sse.d.ts.map +1 -0
- package/dist/handlers/sse.js +213 -0
- package/dist/handlers/sse.js.map +1 -0
- package/dist/handlers/stream.d.ts +52 -0
- package/dist/handlers/stream.d.ts.map +1 -0
- package/dist/handlers/stream.js +116 -0
- package/dist/handlers/stream.js.map +1 -0
- package/dist/handlers/websocket.d.ts +49 -0
- package/dist/handlers/websocket.d.ts.map +1 -0
- package/dist/handlers/websocket.js +143 -0
- package/dist/handlers/websocket.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/console.d.ts +70 -0
- package/dist/logger/console.d.ts.map +1 -0
- package/dist/logger/console.js +274 -0
- package/dist/logger/console.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/internal.d.ts +79 -0
- package/dist/logger/internal.d.ts.map +1 -0
- package/dist/logger/internal.js +133 -0
- package/dist/logger/internal.js.map +1 -0
- package/dist/logger/logger.d.ts +41 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +2 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/user.d.ts +8 -0
- package/dist/logger/user.d.ts.map +1 -0
- package/dist/logger/user.js +7 -0
- package/dist/logger/user.js.map +1 -0
- package/dist/logger/util.d.ts +11 -0
- package/dist/logger/util.d.ts.map +1 -0
- package/dist/logger/util.js +77 -0
- package/dist/logger/util.js.map +1 -0
- package/dist/middleware.d.ts +112 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +507 -0
- package/dist/middleware.js.map +1 -0
- package/dist/otel/config.d.ts +19 -0
- package/dist/otel/config.d.ts.map +1 -0
- package/dist/otel/config.js +26 -0
- package/dist/otel/config.js.map +1 -0
- package/dist/otel/console.d.ts +33 -0
- package/dist/otel/console.d.ts.map +1 -0
- package/dist/otel/console.js +86 -0
- package/dist/otel/console.js.map +1 -0
- package/dist/otel/exporters/index.d.ts +4 -0
- package/dist/otel/exporters/index.d.ts.map +1 -0
- package/dist/otel/exporters/index.js +4 -0
- package/dist/otel/exporters/index.js.map +1 -0
- package/dist/otel/exporters/jsonl-log-exporter.d.ts +36 -0
- package/dist/otel/exporters/jsonl-log-exporter.d.ts.map +1 -0
- package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
- package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-metric-exporter.d.ts +40 -0
- package/dist/otel/exporters/jsonl-metric-exporter.d.ts.map +1 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-trace-exporter.d.ts +36 -0
- package/dist/otel/exporters/jsonl-trace-exporter.d.ts.map +1 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
- package/dist/otel/fetch.d.ts +12 -0
- package/dist/otel/fetch.d.ts.map +1 -0
- package/dist/otel/fetch.js +82 -0
- package/dist/otel/fetch.js.map +1 -0
- package/dist/otel/http.d.ts +16 -0
- package/dist/otel/http.d.ts.map +1 -0
- package/dist/otel/http.js +44 -0
- package/dist/otel/http.js.map +1 -0
- package/dist/otel/logger.d.ts +37 -0
- package/dist/otel/logger.d.ts.map +1 -0
- package/dist/otel/logger.js +268 -0
- package/dist/otel/logger.js.map +1 -0
- package/dist/otel/otel.d.ts +65 -0
- package/dist/otel/otel.d.ts.map +1 -0
- package/dist/otel/otel.js +261 -0
- package/dist/otel/otel.js.map +1 -0
- package/dist/router.d.ts +100 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +163 -0
- package/dist/router.js.map +1 -0
- package/dist/services/evalrun/composite.d.ts +21 -0
- package/dist/services/evalrun/composite.d.ts.map +1 -0
- package/dist/services/evalrun/composite.js +26 -0
- package/dist/services/evalrun/composite.js.map +1 -0
- package/dist/services/evalrun/http.d.ts +24 -0
- package/dist/services/evalrun/http.d.ts.map +1 -0
- package/dist/services/evalrun/http.js +86 -0
- package/dist/services/evalrun/http.js.map +1 -0
- package/dist/services/evalrun/index.d.ts +5 -0
- package/dist/services/evalrun/index.d.ts.map +1 -0
- package/dist/services/evalrun/index.js +5 -0
- package/dist/services/evalrun/index.js.map +1 -0
- package/dist/services/evalrun/json.d.ts +21 -0
- package/dist/services/evalrun/json.d.ts.map +1 -0
- package/dist/services/evalrun/json.js +38 -0
- package/dist/services/evalrun/json.js.map +1 -0
- package/dist/services/evalrun/local.d.ts +19 -0
- package/dist/services/evalrun/local.d.ts.map +1 -0
- package/dist/services/evalrun/local.js +22 -0
- package/dist/services/evalrun/local.js.map +1 -0
- package/dist/services/local/_db.d.ts +4 -0
- package/dist/services/local/_db.d.ts.map +1 -0
- package/dist/services/local/_db.js +123 -0
- package/dist/services/local/_db.js.map +1 -0
- package/dist/services/local/_router.d.ts +3 -0
- package/dist/services/local/_router.d.ts.map +1 -0
- package/dist/services/local/_router.js +28 -0
- package/dist/services/local/_router.js.map +1 -0
- package/dist/services/local/_util.d.ts +18 -0
- package/dist/services/local/_util.d.ts.map +1 -0
- package/dist/services/local/_util.js +44 -0
- package/dist/services/local/_util.js.map +1 -0
- package/dist/services/local/index.d.ts +7 -0
- package/dist/services/local/index.d.ts.map +1 -0
- package/dist/services/local/index.js +7 -0
- package/dist/services/local/index.js.map +1 -0
- package/dist/services/local/keyvalue.d.ts +17 -0
- package/dist/services/local/keyvalue.d.ts.map +1 -0
- package/dist/services/local/keyvalue.js +125 -0
- package/dist/services/local/keyvalue.js.map +1 -0
- package/dist/services/local/stream.d.ts +12 -0
- package/dist/services/local/stream.d.ts.map +1 -0
- package/dist/services/local/stream.js +262 -0
- package/dist/services/local/stream.js.map +1 -0
- package/dist/services/local/vector.d.ts +17 -0
- package/dist/services/local/vector.d.ts.map +1 -0
- package/dist/services/local/vector.js +303 -0
- package/dist/services/local/vector.js.map +1 -0
- package/dist/services/sandbox/http.d.ts +13 -0
- package/dist/services/sandbox/http.d.ts.map +1 -0
- package/dist/services/sandbox/http.js +130 -0
- package/dist/services/sandbox/http.js.map +1 -0
- package/dist/services/sandbox/index.d.ts +2 -0
- package/dist/services/sandbox/index.d.ts.map +1 -0
- package/dist/services/sandbox/index.js +2 -0
- package/dist/services/sandbox/index.js.map +1 -0
- package/dist/services/session/composite.d.ts +21 -0
- package/dist/services/session/composite.d.ts.map +1 -0
- package/dist/services/session/composite.js +26 -0
- package/dist/services/session/composite.js.map +1 -0
- package/dist/services/session/http.d.ts +34 -0
- package/dist/services/session/http.d.ts.map +1 -0
- package/dist/services/session/http.js +80 -0
- package/dist/services/session/http.js.map +1 -0
- package/dist/services/session/index.d.ts +5 -0
- package/dist/services/session/index.d.ts.map +1 -0
- package/dist/services/session/index.js +5 -0
- package/dist/services/session/index.js.map +1 -0
- package/dist/services/session/json.d.ts +22 -0
- package/dist/services/session/json.d.ts.map +1 -0
- package/dist/services/session/json.js +35 -0
- package/dist/services/session/json.js.map +1 -0
- package/dist/services/session/local.d.ts +19 -0
- package/dist/services/session/local.d.ts.map +1 -0
- package/dist/services/session/local.js +23 -0
- package/dist/services/session/local.js.map +1 -0
- package/dist/services/thread/local.d.ts +20 -0
- package/dist/services/thread/local.d.ts.map +1 -0
- package/dist/services/thread/local.js +158 -0
- package/dist/services/thread/local.js.map +1 -0
- package/dist/session.d.ts +734 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +1139 -0
- package/dist/session.js.map +1 -0
- package/dist/validator.d.ts +142 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +149 -0
- package/dist/validator.js.map +1 -0
- package/dist/web.d.ts +8 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +66 -0
- package/dist/web.js.map +1 -0
- package/dist/workbench.d.ts +17 -0
- package/dist/workbench.d.ts.map +1 -0
- package/dist/workbench.js +507 -0
- package/dist/workbench.js.map +1 -0
- package/package.json +8 -8
package/dist/_tokens.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { inAgentContext, inHTTPContext, getHTTPContext } from './_context';
|
|
2
|
+
import { SpanAttributes } from '@traceloop/ai-semantic-conventions';
|
|
3
|
+
export const TOKENS_HEADER = 'x-agentuity-tokens';
|
|
4
|
+
export const DURATION_HEADER = 'x-agentuity-duration';
|
|
5
|
+
// AI SDK span names: ai.generateText, ai.streamText, ai.generateObject, ai.streamObject, ai.embed, ai.embedMany
|
|
6
|
+
const AI_SDK_SPAN_PREFIX = 'ai.';
|
|
7
|
+
const AI_SDK_MODEL_NAME = 'ai.model.id';
|
|
8
|
+
const AI_SDK_USAGE_PROMPT_TOKENS = 'ai.usage.promptTokens';
|
|
9
|
+
const AI_SDK_USAGE_COMPLETION_TOKENS = 'ai.usage.completionTokens';
|
|
10
|
+
const parseTokenHeader = (val) => {
|
|
11
|
+
const kv = new Map();
|
|
12
|
+
if (val) {
|
|
13
|
+
// format is: [model]:[count] [model:count]
|
|
14
|
+
const tok = val.split(' ');
|
|
15
|
+
for (const entry of tok) {
|
|
16
|
+
const [name, count] = entry.split(':');
|
|
17
|
+
if (name) {
|
|
18
|
+
kv.set(name, parseInt(count ?? '0') ?? 0);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return kv;
|
|
23
|
+
};
|
|
24
|
+
const serializeTokenHeader = (kv) => {
|
|
25
|
+
const lines = [];
|
|
26
|
+
for (const [k, v] of kv) {
|
|
27
|
+
lines.push(`${k}:${v}`);
|
|
28
|
+
}
|
|
29
|
+
return lines.join(' ');
|
|
30
|
+
};
|
|
31
|
+
const getTokenValue = (val) => {
|
|
32
|
+
if (val) {
|
|
33
|
+
const v = val.valueOf();
|
|
34
|
+
switch (typeof v) {
|
|
35
|
+
case 'number':
|
|
36
|
+
return v;
|
|
37
|
+
case 'string':
|
|
38
|
+
return parseInt(v, 10);
|
|
39
|
+
default:
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return 0;
|
|
43
|
+
};
|
|
44
|
+
export class TokenSpanProcessor {
|
|
45
|
+
onStart(_span, _context) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
onEnd(span) {
|
|
49
|
+
if (inAgentContext() && inHTTPContext()) {
|
|
50
|
+
const ctx = getHTTPContext();
|
|
51
|
+
const tokenLine = ctx.res.headers.get(TOKENS_HEADER) ?? undefined;
|
|
52
|
+
const tokens = parseTokenHeader(tokenLine);
|
|
53
|
+
let mutated = false;
|
|
54
|
+
// AI SDK uses ai.* span names but doesn't use the semantic attribute names
|
|
55
|
+
if (span.name.startsWith(AI_SDK_SPAN_PREFIX) && AI_SDK_MODEL_NAME in span.attributes) {
|
|
56
|
+
const model = span.attributes[AI_SDK_MODEL_NAME].toString();
|
|
57
|
+
let totalTokens = tokens.get(model) ?? 0;
|
|
58
|
+
if (AI_SDK_USAGE_PROMPT_TOKENS in span.attributes) {
|
|
59
|
+
totalTokens += getTokenValue(span.attributes[AI_SDK_USAGE_PROMPT_TOKENS]);
|
|
60
|
+
}
|
|
61
|
+
if (AI_SDK_USAGE_COMPLETION_TOKENS in span.attributes) {
|
|
62
|
+
totalTokens += getTokenValue(span.attributes[AI_SDK_USAGE_COMPLETION_TOKENS]);
|
|
63
|
+
}
|
|
64
|
+
if (totalTokens > 0) {
|
|
65
|
+
tokens.set(model, totalTokens);
|
|
66
|
+
mutated = true;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (SpanAttributes.LLM_SYSTEM in span.attributes &&
|
|
70
|
+
SpanAttributes.LLM_RESPONSE_MODEL in span.attributes) {
|
|
71
|
+
const model = span.attributes[SpanAttributes.LLM_RESPONSE_MODEL].toString();
|
|
72
|
+
let totalTokens = tokens.get(model) ?? 0;
|
|
73
|
+
if (SpanAttributes.LLM_USAGE_PROMPT_TOKENS in span.attributes) {
|
|
74
|
+
totalTokens += getTokenValue(span.attributes[SpanAttributes.LLM_USAGE_PROMPT_TOKENS]);
|
|
75
|
+
}
|
|
76
|
+
if (SpanAttributes.LLM_USAGE_COMPLETION_TOKENS in span.attributes) {
|
|
77
|
+
totalTokens += getTokenValue(span.attributes[SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]);
|
|
78
|
+
}
|
|
79
|
+
if (totalTokens > 0) {
|
|
80
|
+
tokens.set(model, totalTokens);
|
|
81
|
+
mutated = true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (mutated) {
|
|
85
|
+
ctx.header(TOKENS_HEADER, serializeTokenHeader(tokens));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
forceFlush() {
|
|
90
|
+
return Promise.resolve();
|
|
91
|
+
}
|
|
92
|
+
shutdown() {
|
|
93
|
+
return Promise.resolve();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=_tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_tokens.js","sourceRoot":"","sources":["../src/_tokens.ts"],"names":[],"mappings":"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"}
|
package/dist/_util.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
export declare function returnResponse(ctx: Context, result: unknown): Response;
|
|
3
|
+
/**
|
|
4
|
+
* SHA256 hash of the given values
|
|
5
|
+
*
|
|
6
|
+
* @param val one or more strings to hash
|
|
7
|
+
* @returns hash string in hex format
|
|
8
|
+
*/
|
|
9
|
+
export declare function hash(...val: string[]): string;
|
|
10
|
+
/**
|
|
11
|
+
* Safely stringify an object to JSON, handling circular references
|
|
12
|
+
* @param obj - The object to stringify
|
|
13
|
+
* @returns JSON string representation
|
|
14
|
+
*/
|
|
15
|
+
export declare function safeStringify(obj: unknown): string;
|
|
16
|
+
//# sourceMappingURL=_util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_util.d.ts","sourceRoot":"","sources":["../src/_util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,YAM3D;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAI7C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAkClD"}
|
package/dist/_util.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function returnResponse(ctx, result) {
|
|
2
|
+
if (result instanceof ReadableStream)
|
|
3
|
+
return ctx.body(result);
|
|
4
|
+
if (result instanceof Response)
|
|
5
|
+
return result;
|
|
6
|
+
if (typeof result === 'string')
|
|
7
|
+
return ctx.text(result);
|
|
8
|
+
if (typeof result === 'number' || typeof result === 'boolean')
|
|
9
|
+
return ctx.text(String(result));
|
|
10
|
+
return ctx.json(result);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* SHA256 hash of the given values
|
|
14
|
+
*
|
|
15
|
+
* @param val one or more strings to hash
|
|
16
|
+
* @returns hash string in hex format
|
|
17
|
+
*/
|
|
18
|
+
export function hash(...val) {
|
|
19
|
+
const hasher = new Bun.CryptoHasher('sha256');
|
|
20
|
+
val.map((val) => hasher.update(val));
|
|
21
|
+
return hasher.digest().toHex();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Safely stringify an object to JSON, handling circular references
|
|
25
|
+
* @param obj - The object to stringify
|
|
26
|
+
* @returns JSON string representation
|
|
27
|
+
*/
|
|
28
|
+
export function safeStringify(obj) {
|
|
29
|
+
const stack = [];
|
|
30
|
+
function replacer(_key, value) {
|
|
31
|
+
if (typeof value === 'bigint') {
|
|
32
|
+
return value.toString();
|
|
33
|
+
}
|
|
34
|
+
if (typeof value === 'object' && value !== null) {
|
|
35
|
+
// Check if this object is already in our ancestor chain
|
|
36
|
+
if (stack.includes(value)) {
|
|
37
|
+
return '[Circular]';
|
|
38
|
+
}
|
|
39
|
+
// Add to stack before processing
|
|
40
|
+
stack.push(value);
|
|
41
|
+
// Process the object
|
|
42
|
+
const result = Array.isArray(value) ? [] : {};
|
|
43
|
+
for (const [k, v] of Object.entries(value)) {
|
|
44
|
+
result[k] = replacer(k, v);
|
|
45
|
+
}
|
|
46
|
+
// Remove from stack after processing
|
|
47
|
+
stack.pop();
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
return JSON.stringify(replacer('', obj));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=_util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_util.js","sourceRoot":"","sources":["../src/_util.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,GAAY,EAAE,MAAe;IAC3D,IAAI,MAAM,YAAY,cAAc;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,MAAM,YAAY,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/F,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,GAAG,GAAa;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACzC,MAAM,KAAK,GAAc,EAAE,CAAC;IAE5B,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAc;QAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,wDAAwD;YACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,YAAY,CAAC;YACrB,CAAC;YAED,iCAAiC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAElB,qBAAqB;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAE9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAkC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;YAED,qCAAqC;YACrC,KAAK,CAAC,GAAG,EAAE,CAAC;YAEZ,OAAO,MAAM,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { StandardSchemaV1, InferInput, InferOutput } from '@agentuity/core';
|
|
2
|
+
/**
|
|
3
|
+
* Schema definition for routes that can have input (POST, PUT, PATCH, DELETE).
|
|
4
|
+
* Both input and output are optional, but output is recommended.
|
|
5
|
+
*
|
|
6
|
+
* @template TInput - Input schema (StandardSchemaV1 or undefined)
|
|
7
|
+
* @template TOutput - Output schema (StandardSchemaV1 or undefined)
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const schema: RouteSchema<z.ZodObject<{name: z.ZodString}>, z.ZodString> = {
|
|
12
|
+
* input: z.object({ name: z.string() }),
|
|
13
|
+
* output: z.string()
|
|
14
|
+
* };
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export type RouteSchema<TInput extends StandardSchemaV1 | undefined = StandardSchemaV1 | undefined, TOutput extends StandardSchemaV1 | undefined = StandardSchemaV1 | undefined> = {
|
|
18
|
+
input?: TInput;
|
|
19
|
+
output?: TOutput;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Schema definition for GET routes.
|
|
23
|
+
* Input is not allowed (enforced as never), only output validation is supported.
|
|
24
|
+
*
|
|
25
|
+
* @template TOutput - Output schema (StandardSchemaV1 or undefined)
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const schema: GetRouteSchema<z.ZodString> = {
|
|
30
|
+
* output: z.string()
|
|
31
|
+
* };
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export type GetRouteSchema<TOutput extends StandardSchemaV1 | undefined = StandardSchemaV1 | undefined> = {
|
|
35
|
+
input?: never;
|
|
36
|
+
output?: TOutput;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Infer the input type from a StandardSchema.
|
|
40
|
+
* Returns the input type of the schema (before validation/transformation).
|
|
41
|
+
*
|
|
42
|
+
* @template T - Schema type
|
|
43
|
+
*/
|
|
44
|
+
export type InferSchemaInput<T> = T extends StandardSchemaV1 ? InferInput<T> : undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Infer the output type from a StandardSchema.
|
|
47
|
+
* Returns the output type of the schema (after validation/transformation).
|
|
48
|
+
*
|
|
49
|
+
* @template T - Schema type
|
|
50
|
+
*/
|
|
51
|
+
export type InferSchemaOutput<T> = T extends StandardSchemaV1 ? InferOutput<T> : undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Extract input schema from RouteSchema or GetRouteSchema.
|
|
54
|
+
*
|
|
55
|
+
* @template T - RouteSchema or GetRouteSchema type
|
|
56
|
+
*/
|
|
57
|
+
export type ExtractInputSchema<T> = T extends RouteSchema<infer I, any> ? I : T extends GetRouteSchema<any> ? never : never;
|
|
58
|
+
/**
|
|
59
|
+
* Extract output schema from RouteSchema or GetRouteSchema.
|
|
60
|
+
*
|
|
61
|
+
* @template T - RouteSchema or GetRouteSchema type
|
|
62
|
+
*/
|
|
63
|
+
export type ExtractOutputSchema<T> = T extends RouteSchema<any, infer O> ? O : T extends GetRouteSchema<infer O> ? O : never;
|
|
64
|
+
/**
|
|
65
|
+
* Validation result from StandardSchema validation.
|
|
66
|
+
*/
|
|
67
|
+
export type ValidationResult<T> = {
|
|
68
|
+
success: true;
|
|
69
|
+
data: T;
|
|
70
|
+
} | {
|
|
71
|
+
success: false;
|
|
72
|
+
issues: StandardSchemaV1.Issue[];
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Validates a value against a StandardSchema.
|
|
76
|
+
*
|
|
77
|
+
* @param schema - The StandardSchema to validate against
|
|
78
|
+
* @param value - The value to validate
|
|
79
|
+
* @returns ValidationResult with success/failure and data/issues
|
|
80
|
+
*/
|
|
81
|
+
export declare function validateSchema<T>(schema: StandardSchemaV1, value: unknown): Promise<ValidationResult<T>>;
|
|
82
|
+
/**
|
|
83
|
+
* Format validation issues into a readable error message.
|
|
84
|
+
*
|
|
85
|
+
* @param issues - Array of validation issues
|
|
86
|
+
* @returns Formatted error message
|
|
87
|
+
*/
|
|
88
|
+
export declare function formatValidationIssues(issues: StandardSchemaV1.Issue[]): string;
|
|
89
|
+
//# sourceMappingURL=_validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_validation.d.ts","sourceRoot":"","sources":["../src/_validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEjF;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,WAAW,CACtB,MAAM,SAAS,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,EAC1E,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,IACxE;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,cAAc,CACzB,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,IACxE;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAEzF;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAE3F;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC/B,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,cAAc,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;AAEzF;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAChC,CAAC,SAAS,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEzF;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC3B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAA;CAAE,CAAC;AAExD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACrC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,OAAO,GACZ,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAQ9B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAAK,EAAE,GAAG,MAAM,CAO/E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates a value against a StandardSchema.
|
|
3
|
+
*
|
|
4
|
+
* @param schema - The StandardSchema to validate against
|
|
5
|
+
* @param value - The value to validate
|
|
6
|
+
* @returns ValidationResult with success/failure and data/issues
|
|
7
|
+
*/
|
|
8
|
+
export async function validateSchema(schema, value) {
|
|
9
|
+
const result = await schema['~standard'].validate(value);
|
|
10
|
+
if ('issues' in result && result.issues) {
|
|
11
|
+
return { success: false, issues: Array.from(result.issues) };
|
|
12
|
+
}
|
|
13
|
+
return { success: true, data: result.value };
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Format validation issues into a readable error message.
|
|
17
|
+
*
|
|
18
|
+
* @param issues - Array of validation issues
|
|
19
|
+
* @returns Formatted error message
|
|
20
|
+
*/
|
|
21
|
+
export function formatValidationIssues(issues) {
|
|
22
|
+
return issues
|
|
23
|
+
.map((issue) => {
|
|
24
|
+
const path = issue.path?.map((p) => (typeof p === 'object' ? p.key : p)).join('.') || '';
|
|
25
|
+
return path ? `${path}: ${issue.message}` : issue.message;
|
|
26
|
+
})
|
|
27
|
+
.join(', ');
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=_validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_validation.js","sourceRoot":"","sources":["../src/_validation.ts"],"names":[],"mappings":"AAqFA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,MAAwB,EACxB,KAAc;IAEd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEzD,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAU,EAAE,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAgC;IACtE,OAAO,MAAM;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACzF,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAC3D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Tracer } from '@opentelemetry/api';
|
|
2
|
+
import type { Logger } from './logger';
|
|
3
|
+
/**
|
|
4
|
+
* returns true if wait until is pending
|
|
5
|
+
* @returns boolean
|
|
6
|
+
*/
|
|
7
|
+
export declare function hasWaitUntilPending(): boolean;
|
|
8
|
+
export default class WaitUntilHandler {
|
|
9
|
+
private promises;
|
|
10
|
+
private tracer;
|
|
11
|
+
private started;
|
|
12
|
+
private hasCalledWaitUntilAll;
|
|
13
|
+
constructor(tracer: Tracer);
|
|
14
|
+
waitUntil(promise: Promise<void> | (() => void | Promise<void>)): void;
|
|
15
|
+
hasPending(): boolean;
|
|
16
|
+
waitUntilAll(logger: Logger, sessionId: string): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=_waituntil.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_waituntil.d.ts","sourceRoot":"","sources":["../src/_waituntil.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,MAAM,EAAS,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAMvC;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAG7C;AAYD,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACpC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,qBAAqB,CAAS;gBAEnB,MAAM,EAAE,MAAM;IAK1B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI;IAsCtE,UAAU,IAAI,OAAO;IAIf,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsC3E"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { context, SpanStatusCode, trace } from '@opentelemetry/api';
|
|
2
|
+
import { internal } from './logger/internal';
|
|
3
|
+
import { StructuredError } from '@agentuity/core';
|
|
4
|
+
let running = 0;
|
|
5
|
+
/**
|
|
6
|
+
* returns true if wait until is pending
|
|
7
|
+
* @returns boolean
|
|
8
|
+
*/
|
|
9
|
+
export function hasWaitUntilPending() {
|
|
10
|
+
internal.debug('hasWaitUntilPending called: %d', running);
|
|
11
|
+
return running > 0;
|
|
12
|
+
}
|
|
13
|
+
const WaitUntilInvalidStateError = StructuredError('WaitUntilInvalidStateError', 'waitUntil cannot be called after waitUntilAll has been called');
|
|
14
|
+
const WaitUntilAllInvalidStateError = StructuredError('WaitUntilAllInvalidStateError', 'waitUntilAll can only be called once per instance');
|
|
15
|
+
export default class WaitUntilHandler {
|
|
16
|
+
promises;
|
|
17
|
+
tracer;
|
|
18
|
+
started;
|
|
19
|
+
hasCalledWaitUntilAll = false;
|
|
20
|
+
constructor(tracer) {
|
|
21
|
+
this.tracer = tracer;
|
|
22
|
+
this.promises = [];
|
|
23
|
+
}
|
|
24
|
+
waitUntil(promise) {
|
|
25
|
+
if (this.hasCalledWaitUntilAll) {
|
|
26
|
+
throw new WaitUntilInvalidStateError();
|
|
27
|
+
}
|
|
28
|
+
running++;
|
|
29
|
+
internal.debug('wait until called, running: %d', running);
|
|
30
|
+
const currentContext = context.active();
|
|
31
|
+
// Start execution immediately, don't defer it
|
|
32
|
+
const executingPromise = (async () => {
|
|
33
|
+
if (this.started === undefined) {
|
|
34
|
+
this.started = Date.now(); /// this first execution marks the start time
|
|
35
|
+
}
|
|
36
|
+
const span = this.tracer.startSpan('waitUntil', {}, currentContext);
|
|
37
|
+
const spanContext = trace.setSpan(currentContext, span);
|
|
38
|
+
try {
|
|
39
|
+
internal.debug('starting waituntil');
|
|
40
|
+
await context.with(spanContext, async () => {
|
|
41
|
+
const resolvedPromise = typeof promise === 'function' ? promise() : promise;
|
|
42
|
+
return await Promise.resolve(resolvedPromise);
|
|
43
|
+
});
|
|
44
|
+
internal.debug('completed waituntil');
|
|
45
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
46
|
+
}
|
|
47
|
+
catch (ex) {
|
|
48
|
+
span.recordException(ex);
|
|
49
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
50
|
+
// Log the error but don't re-throw - background tasks should never crash the server
|
|
51
|
+
internal.error('Background task error: %s', ex);
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
span.end();
|
|
55
|
+
}
|
|
56
|
+
// NOTE: we only decrement when the promise is removed from the array in waitUntilAll
|
|
57
|
+
})();
|
|
58
|
+
// Store the executing promise for cleanup tracking
|
|
59
|
+
this.promises.push(executingPromise);
|
|
60
|
+
}
|
|
61
|
+
hasPending() {
|
|
62
|
+
return this.promises.length > 0;
|
|
63
|
+
}
|
|
64
|
+
async waitUntilAll(logger, sessionId) {
|
|
65
|
+
internal.debug(`🔍 waitUntilAll() called for session ${sessionId} (count: %d)`, running);
|
|
66
|
+
if (this.hasCalledWaitUntilAll) {
|
|
67
|
+
throw new WaitUntilAllInvalidStateError();
|
|
68
|
+
}
|
|
69
|
+
this.hasCalledWaitUntilAll = true;
|
|
70
|
+
if (this.promises.length === 0) {
|
|
71
|
+
internal.debug('No promises to wait for, executing evals directly');
|
|
72
|
+
// await this.executeEvalsForSession(logger, sessionId);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
internal.debug(`⏳ Waiting for ${this.promises.length} promises to complete...`);
|
|
76
|
+
try {
|
|
77
|
+
// Promises are already executing, just wait for them to complete
|
|
78
|
+
// Use allSettled so one failing promise doesn't stop others
|
|
79
|
+
const results = await Promise.allSettled(this.promises);
|
|
80
|
+
const duration = Date.now() - this.started;
|
|
81
|
+
// Log any failures
|
|
82
|
+
const failures = results.filter((r) => r.status === 'rejected');
|
|
83
|
+
if (failures.length > 0) {
|
|
84
|
+
logger.error('%d background task(s) failed during execution', failures.length);
|
|
85
|
+
}
|
|
86
|
+
internal.debug('✅ All promises completed, marking session completed (duration %dms)', duration);
|
|
87
|
+
}
|
|
88
|
+
catch (ex) {
|
|
89
|
+
logger.error('error sending session completed', ex);
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
running -= this.promises.length;
|
|
93
|
+
this.promises.length = 0;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=_waituntil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_waituntil.js","sourceRoot":"","sources":["../src/_waituntil.ts"],"names":[],"mappings":"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"}
|