managed-deepagents 0.9.5-dev.4 → 0.9.5-dev.6
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/channels/http/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +4 -4
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/schedule-delivery.d.ts.map +1 -1
- package/dist/channels/schedule-delivery.js +3 -3
- package/dist/channels/schedule-delivery.js.map +1 -1
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +10 -3
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/concurrency/batch-processor.d.ts +51 -0
- package/dist/concurrency/batch-processor.d.ts.map +1 -0
- package/dist/concurrency/batch-processor.js +99 -0
- package/dist/concurrency/batch-processor.js.map +1 -0
- package/dist/identity/loopback.d.ts +5 -0
- package/dist/identity/loopback.d.ts.map +1 -1
- package/dist/identity/loopback.js +9 -0
- package/dist/identity/loopback.js.map +1 -1
- package/dist/ingress/index.d.ts +8 -0
- package/dist/ingress/index.d.ts.map +1 -1
- package/dist/ingress/index.js +32 -2
- package/dist/ingress/index.js.map +1 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +13 -0
- package/dist/ingress/runs.js.map +1 -1
- package/dist/resilience/retry.d.ts +21 -0
- package/dist/resilience/retry.d.ts.map +1 -0
- package/dist/resilience/retry.js +40 -0
- package/dist/resilience/retry.js.map +1 -0
- package/dist/runtime/http.d.ts +15 -0
- package/dist/runtime/http.d.ts.map +1 -1
- package/dist/runtime/http.js +37 -0
- package/dist/runtime/http.js.map +1 -1
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +5 -4
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/log.d.ts +8 -14
- package/dist/runtime/log.d.ts.map +1 -1
- package/dist/runtime/log.js +16 -7
- package/dist/runtime/log.js.map +1 -1
- package/dist/runtime/run-input.d.ts.map +1 -1
- package/dist/runtime/run-input.js +20 -2
- package/dist/runtime/run-input.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +3 -5
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/telemetry/lifecycle.d.ts +26 -0
- package/dist/telemetry/lifecycle.d.ts.map +1 -0
- package/dist/telemetry/lifecycle.js +49 -0
- package/dist/telemetry/lifecycle.js.map +1 -0
- package/dist/telemetry/otel/context.d.ts +57 -0
- package/dist/telemetry/otel/context.d.ts.map +1 -0
- package/dist/telemetry/otel/context.js +122 -0
- package/dist/telemetry/otel/context.js.map +1 -0
- package/dist/telemetry/otel/exporter.d.ts +53 -0
- package/dist/telemetry/otel/exporter.d.ts.map +1 -0
- package/dist/telemetry/otel/exporter.js +190 -0
- package/dist/telemetry/otel/exporter.js.map +1 -0
- package/dist/telemetry/otel/index.d.ts +6 -0
- package/dist/telemetry/otel/index.d.ts.map +1 -0
- package/dist/telemetry/otel/index.js +3 -0
- package/dist/telemetry/otel/index.js.map +1 -0
- package/dist/telemetry/otel/otlp.d.ts +44 -0
- package/dist/telemetry/otel/otlp.d.ts.map +1 -0
- package/dist/telemetry/otel/otlp.js +7 -0
- package/dist/telemetry/otel/otlp.js.map +1 -0
- package/dist/telemetry/otel/truncate.d.ts +10 -0
- package/dist/telemetry/otel/truncate.d.ts.map +1 -0
- package/dist/telemetry/otel/truncate.js +39 -0
- package/dist/telemetry/otel/truncate.js.map +1 -0
- package/dist/telemetry/run-listener.d.ts +1 -1
- package/dist/telemetry/run-listener.d.ts.map +1 -1
- package/dist/telemetry/run-listener.js +32 -2
- package/dist/telemetry/run-listener.js.map +1 -1
- package/dist/telemetry/transport/posthog.d.ts +13 -1
- package/dist/telemetry/transport/posthog.d.ts.map +1 -1
- package/dist/telemetry/transport/posthog.js +68 -30
- package/dist/telemetry/transport/posthog.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeps a log value within the collection endpoint's per-value limit by
|
|
3
|
+
* cutting its middle, as the CLI does: the start says what failed, and the end
|
|
4
|
+
* of a stacktrace or a child's output usually says why.
|
|
5
|
+
*/
|
|
6
|
+
/** The collection endpoint keeps up to this many bytes of a value. */
|
|
7
|
+
export const MAX_VALUE_BYTES = 32 << 10;
|
|
8
|
+
/** Kept from the start of a value that is too long; the rest keeps its end. */
|
|
9
|
+
const HEAD_BYTES = 1 << 10;
|
|
10
|
+
/** Room for the omission marker. */
|
|
11
|
+
const MARKER_BYTES = 48;
|
|
12
|
+
/** `value` within `maxBytes` of UTF-8: its start and end, with the cut size. */
|
|
13
|
+
export function truncateMiddle(value, maxBytes = MAX_VALUE_BYTES) {
|
|
14
|
+
// A UTF-16 code unit is at most 3 UTF-8 bytes.
|
|
15
|
+
if (value.length * 3 <= maxBytes)
|
|
16
|
+
return value;
|
|
17
|
+
const bytes = Buffer.from(value, "utf8");
|
|
18
|
+
if (bytes.length <= maxBytes)
|
|
19
|
+
return value;
|
|
20
|
+
const headEnd = floorBoundary(bytes, HEAD_BYTES);
|
|
21
|
+
const tailStart = ceilBoundary(bytes, bytes.length - (maxBytes - HEAD_BYTES - MARKER_BYTES));
|
|
22
|
+
return `${bytes.subarray(0, headEnd).toString("utf8")}\n… ${tailStart - headEnd} bytes omitted …\n${bytes.subarray(tailStart).toString("utf8")}`;
|
|
23
|
+
}
|
|
24
|
+
function isContinuation(byte) {
|
|
25
|
+
return byte !== undefined && (byte & 0xc0) === 0x80;
|
|
26
|
+
}
|
|
27
|
+
function floorBoundary(bytes, index) {
|
|
28
|
+
let at = index;
|
|
29
|
+
while (at > 0 && isContinuation(bytes[at]))
|
|
30
|
+
at--;
|
|
31
|
+
return at;
|
|
32
|
+
}
|
|
33
|
+
function ceilBoundary(bytes, index) {
|
|
34
|
+
let at = index;
|
|
35
|
+
while (at < bytes.length && isContinuation(bytes[at]))
|
|
36
|
+
at++;
|
|
37
|
+
return at;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=truncate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.js","sourceRoot":"","sources":["../../../src/telemetry/otel/truncate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,CAAC;AACxC,+EAA+E;AAC/E,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC;AAC3B,oCAAoC;AACpC,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,QAAQ,GAAW,eAAe;IAElC,+CAA+C;IAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,YAAY,CAC5B,KAAK,EACL,KAAK,CAAC,MAAM,GAAG,CAAC,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC,CACtD,CAAC;IACF,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OACnD,SAAS,GAAG,OACd,qBAAqB,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,SAAS,cAAc,CAAC,IAAwB;IAC9C,OAAO,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,KAAa;IACjD,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,OAAO,EAAE,GAAG,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAAE,EAAE,EAAE,CAAC;IACjD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa;IAChD,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAAE,EAAE,EAAE,CAAC;IAC5D,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -14,7 +14,7 @@ export declare class RunTelemetryListener extends GraphCallbackHandler {
|
|
|
14
14
|
handleChainStart(_chain: unknown, _inputs: unknown, runId: string): void;
|
|
15
15
|
handleInterrupt(event: GraphInterruptEvent): void;
|
|
16
16
|
handleChainEnd(_outputs: unknown, runId: string): void;
|
|
17
|
-
handleChainError(
|
|
17
|
+
handleChainError(error: unknown, runId: string): void;
|
|
18
18
|
private report;
|
|
19
19
|
}
|
|
20
20
|
//# sourceMappingURL=run-listener.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-listener.d.ts","sourceRoot":"","sources":["../../src/telemetry/run-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run-listener.d.ts","sourceRoot":"","sources":["../../src/telemetry/run-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK9C,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAc,MAAM,UAAU,CAAC;AAY1E,8CAA8C;AAC9C,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,eAAe,CAAC,iBAAiB,CAAC,GAAG,SAAS,GACvD,IAAI,CAEN;AAED,qBAAa,oBAAqB,SAAQ,oBAAoB;IAMhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,IAAI,SAA0B;IAC9B,aAAa,UAAQ;IACrB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAE5B,YAA6B,OAAO,EAAE,UAAU,EAE/C;IAED,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGvE;IAED,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAIhD;IAED,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrD;IAED,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKpD;IAED,OAAO,CAAC,MAAM;CAYf"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { GraphCallbackHandler } from "@langchain/langgraph";
|
|
2
2
|
import { TelemetryClient } from "./client.js";
|
|
3
|
+
import { recordLog } from "./otel/index.js";
|
|
3
4
|
import { isTelemetryDisabled } from "./gates.js";
|
|
4
5
|
import { finishRun } from "./run.js";
|
|
5
6
|
import { posthogTransport } from "./transport/posthog.js";
|
|
@@ -36,8 +37,9 @@ export class RunTelemetryListener extends GraphCallbackHandler {
|
|
|
36
37
|
this.report(this.interrupted ? "interrupted" : "success");
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
|
-
handleChainError(
|
|
40
|
+
handleChainError(error, runId) {
|
|
40
41
|
if (runId === this.rootRunId) {
|
|
42
|
+
recordLog("ERROR", "run failed", { error });
|
|
41
43
|
this.report("failure");
|
|
42
44
|
}
|
|
43
45
|
}
|
|
@@ -45,10 +47,38 @@ export class RunTelemetryListener extends GraphCallbackHandler {
|
|
|
45
47
|
if (this.pending.emitted)
|
|
46
48
|
return;
|
|
47
49
|
this.pending.emitted = true;
|
|
50
|
+
const event = finishRun(this.pending, outcome);
|
|
51
|
+
recordLog("INFO", "run completed", {
|
|
52
|
+
attributes: completionAttributes(event),
|
|
53
|
+
});
|
|
48
54
|
// Delivery must not delay the run result.
|
|
49
55
|
runClient()
|
|
50
|
-
.record(
|
|
56
|
+
.record(event)
|
|
51
57
|
.catch(() => { });
|
|
52
58
|
}
|
|
53
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Event bookkeeping that says nothing about the run. `event_id` stays, so the
|
|
62
|
+
* record joins to its PostHog event.
|
|
63
|
+
*/
|
|
64
|
+
const EVENT_ONLY_FIELDS = new Set([
|
|
65
|
+
"event_type",
|
|
66
|
+
"schema_version",
|
|
67
|
+
"created_at",
|
|
68
|
+
"distinct_id",
|
|
69
|
+
]);
|
|
70
|
+
/** The `run_completed` fields as attributes of the completion log record. */
|
|
71
|
+
function completionAttributes(event) {
|
|
72
|
+
const attributes = {};
|
|
73
|
+
for (const [key, value] of Object.entries(event)) {
|
|
74
|
+
if (EVENT_ONLY_FIELDS.has(key))
|
|
75
|
+
continue;
|
|
76
|
+
if (typeof value === "string" ||
|
|
77
|
+
typeof value === "number" ||
|
|
78
|
+
typeof value === "boolean") {
|
|
79
|
+
attributes[key] = value;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return attributes;
|
|
83
|
+
}
|
|
54
84
|
//# sourceMappingURL=run-listener.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-listener.js","sourceRoot":"","sources":["../../src/telemetry/run-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,IAAI,MAAsD,CAAC;AAE3D,SAAS,SAAS;IAChB,MAAM,KAAK,IAAI,eAAe,CAC5B,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAClE,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,6BAA6B,CAC3C,QAAwD;IAExD,MAAM,GAAG,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,OAAO,oBAAqB,SAAQ,oBAAoB;IAM/B,OAAO;IALpC,IAAI,GAAG,sBAAsB,CAAC;IAC9B,aAAa,GAAG,IAAI,CAAC;IACb,SAAS,CAAU;IACnB,WAAW,GAAG,KAAK,CAAC;IAE5B,YAA6B,OAAmB;QAC9C,KAAK,EAAE,CAAC;uBADmB,OAAO;IAEpC,CAAC;IAED,gBAAgB,CAAC,MAAe,EAAE,OAAgB,EAAE,KAAa;QAC/D,mEAAmE;QACnE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;IAC3B,CAAC;IAED,eAAe,CAAC,KAA0B;QACxC,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,cAAc,CAAC,QAAiB,EAAE,KAAa;QAC7C,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"run-listener.js","sourceRoot":"","sources":["../../src/telemetry/run-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RetryPolicy } from "../../resilience/retry.js";
|
|
1
2
|
import type { TelemetryEvent } from "../event.js";
|
|
2
3
|
import type { TelemetryTransport } from "./types.js";
|
|
3
4
|
interface PosthogConfig {
|
|
@@ -10,13 +11,24 @@ export interface PosthogTransportOptions {
|
|
|
10
11
|
host?: string;
|
|
11
12
|
/** Fetch override for tests. */
|
|
12
13
|
fetch?: typeof fetch;
|
|
14
|
+
/** Batch timing and retry overrides for tests. */
|
|
15
|
+
maxWaitMs?: number;
|
|
16
|
+
retry?: RetryPolicy;
|
|
13
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Sends events to PostHog in the background, in batches. `send` only queues
|
|
20
|
+
* the event, so delivery never delays a run.
|
|
21
|
+
*/
|
|
14
22
|
export declare class PosthogTransport implements TelemetryTransport {
|
|
15
23
|
private readonly apiKey;
|
|
16
|
-
private readonly
|
|
24
|
+
private readonly batchUrl;
|
|
17
25
|
private readonly fetchImpl;
|
|
26
|
+
private readonly processor;
|
|
18
27
|
constructor(options: PosthogTransportOptions);
|
|
19
28
|
send(event: TelemetryEvent): Promise<void>;
|
|
29
|
+
/** Refuse new events and drain what is queued until `deadlineMs`. */
|
|
30
|
+
shutdown(deadlineMs: number): Promise<void>;
|
|
31
|
+
private post;
|
|
20
32
|
}
|
|
21
33
|
export declare function posthogTransport(env?: Record<string, string | undefined>): PosthogTransport | undefined;
|
|
22
34
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../src/telemetry/transport/posthog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../src/telemetry/transport/posthog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAwCrD,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,WAAW,GAAE,MAAgC,GAC5C,aAAa,GAAG,SAAS,CAS3B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAE3D,YAAY,OAAO,EAAE,uBAAuB,EAgB3C;IAEK,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;IAED,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1C;YAEa,IAAI;CAmCnB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,gBAAgB,GAAG,SAAS,CAgB9B"}
|
|
@@ -1,19 +1,34 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { BatchProcessor } from "../../concurrency/batch-processor.js";
|
|
2
|
+
import { withRetry } from "../../resilience/retry.js";
|
|
3
|
+
import { fetchWithTimeout, HttpStatusError, isRetryable, requestedDelayMs, } from "../../runtime/http.js";
|
|
4
|
+
import { onShutdown } from "../lifecycle.js";
|
|
2
5
|
const POSTHOG_API_KEY_ENV = "MDA_POSTHOG_API_KEY";
|
|
3
6
|
const POSTHOG_HOST_ENV = "MDA_POSTHOG_HOST";
|
|
4
7
|
const DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com";
|
|
5
|
-
const
|
|
6
|
-
/**
|
|
7
|
-
const REQUEST_TIMEOUT_MS =
|
|
8
|
+
const POSTHOG_BATCH_PATH = "/batch/";
|
|
9
|
+
/** Bounds one batch request; the OTel exporters' default. */
|
|
10
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
11
|
+
const MAX_BATCH_EVENTS = 100;
|
|
12
|
+
const BATCH_WAIT_MS = 1_000;
|
|
13
|
+
/** Events waiting to send; later ones are dropped. */
|
|
14
|
+
const MAX_QUEUED_EVENTS = 1_000;
|
|
15
|
+
/** 429 and 5xx (including timeouts and network failures) are tried again. */
|
|
16
|
+
const SEND_RETRY = {
|
|
17
|
+
maxAttempts: 5,
|
|
18
|
+
baseDelayMs: 1_000,
|
|
19
|
+
maxDelayMs: 30_000,
|
|
20
|
+
retryOn: isRetryable,
|
|
21
|
+
delayFor: requestedDelayMs,
|
|
22
|
+
};
|
|
8
23
|
/** Public write-only key: submission only, and already in every released binary. */
|
|
9
24
|
const DEFAULT_POSTHOG_API_KEY = "phc_C6RmkdQQ3kWHgj6o7kby3aP6dbewjpLzfanw9WcmU65V";
|
|
10
25
|
function nonempty(value) {
|
|
11
26
|
const trimmed = value?.trim();
|
|
12
27
|
return trimmed ? trimmed : undefined;
|
|
13
28
|
}
|
|
14
|
-
/** `new URL` alone accepts `ftp:`/`file:`. Python's `
|
|
15
|
-
function
|
|
16
|
-
const url = new URL(`${host.replace(/\/+$/, "")}${
|
|
29
|
+
/** `new URL` alone accepts `ftp:`/`file:`. Python's `batch_url` rejects them. */
|
|
30
|
+
function batchUrl(host) {
|
|
31
|
+
const url = new URL(`${host.replace(/\/+$/, "")}${POSTHOG_BATCH_PATH}`);
|
|
17
32
|
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
18
33
|
throw new Error("PostHog host must be a valid URL");
|
|
19
34
|
}
|
|
@@ -29,45 +44,63 @@ export function resolvePosthogConfig(env, bakedApiKey = DEFAULT_POSTHOG_API_KEY)
|
|
|
29
44
|
host: nonempty(env[POSTHOG_HOST_ENV]) ?? DEFAULT_POSTHOG_HOST,
|
|
30
45
|
};
|
|
31
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Sends events to PostHog in the background, in batches. `send` only queues
|
|
49
|
+
* the event, so delivery never delays a run.
|
|
50
|
+
*/
|
|
32
51
|
export class PosthogTransport {
|
|
33
52
|
apiKey;
|
|
34
|
-
|
|
53
|
+
batchUrl;
|
|
35
54
|
fetchImpl;
|
|
55
|
+
processor;
|
|
36
56
|
constructor(options) {
|
|
37
57
|
if (!options.apiKey) {
|
|
38
58
|
throw new Error("PostHog project ingestion key is required");
|
|
39
59
|
}
|
|
40
60
|
this.apiKey = options.apiKey;
|
|
41
|
-
this.
|
|
61
|
+
this.batchUrl = batchUrl(options.host ?? DEFAULT_POSTHOG_HOST);
|
|
42
62
|
this.fetchImpl = options.fetch ?? fetch;
|
|
63
|
+
this.processor = new BatchProcessor({
|
|
64
|
+
handle: withRetry((batch, signal) => this.post(batch, signal), options.retry ?? SEND_RETRY),
|
|
65
|
+
maxBatchSize: MAX_BATCH_EVENTS,
|
|
66
|
+
maxWaitMs: options.maxWaitMs ?? BATCH_WAIT_MS,
|
|
67
|
+
maxQueued: MAX_QUEUED_EVENTS,
|
|
68
|
+
});
|
|
43
69
|
}
|
|
44
70
|
async send(event) {
|
|
45
|
-
|
|
71
|
+
this.processor.push(event);
|
|
72
|
+
}
|
|
73
|
+
/** Refuse new events and drain what is queued until `deadlineMs`. */
|
|
74
|
+
shutdown(deadlineMs) {
|
|
75
|
+
return this.processor.shutdown(deadlineMs);
|
|
76
|
+
}
|
|
77
|
+
async post(batch, signal) {
|
|
78
|
+
const response = await fetchWithTimeout(this.batchUrl.toString(), {
|
|
46
79
|
method: "POST",
|
|
47
80
|
headers: { "content-type": "application/json" },
|
|
48
81
|
body: JSON.stringify({
|
|
49
82
|
api_key: this.apiKey,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
83
|
+
batch: batch.map((event) => ({
|
|
84
|
+
// PostHog drops a retried event it already ingested by `uuid`.
|
|
85
|
+
uuid: event.event_id,
|
|
86
|
+
event: event.event_type,
|
|
87
|
+
distinct_id: event.distinct_id,
|
|
88
|
+
timestamp: event.created_at,
|
|
89
|
+
properties: {
|
|
90
|
+
// The subject is an organization, and the request leaves our
|
|
91
|
+
// infrastructure rather than the customer's, so a person profile
|
|
92
|
+
// and a geoip lookup would both describe the wrong thing.
|
|
93
|
+
$process_person_profile: false,
|
|
94
|
+
$geoip_disable: true,
|
|
95
|
+
...event,
|
|
96
|
+
},
|
|
97
|
+
})),
|
|
61
98
|
}),
|
|
99
|
+
signal,
|
|
62
100
|
}, REQUEST_TIMEOUT_MS, this.fetchImpl);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
finally {
|
|
69
|
-
await response.body?.cancel();
|
|
70
|
-
}
|
|
101
|
+
await response.body?.cancel();
|
|
102
|
+
if (!response.ok)
|
|
103
|
+
throw HttpStatusError.from(response);
|
|
71
104
|
}
|
|
72
105
|
}
|
|
73
106
|
export function posthogTransport(env = process.env) {
|
|
@@ -76,7 +109,12 @@ export function posthogTransport(env = process.env) {
|
|
|
76
109
|
return undefined;
|
|
77
110
|
}
|
|
78
111
|
try {
|
|
79
|
-
|
|
112
|
+
const transport = new PosthogTransport({
|
|
113
|
+
apiKey: config.apiKey,
|
|
114
|
+
host: config.host,
|
|
115
|
+
});
|
|
116
|
+
onShutdown((ms) => transport.shutdown(ms));
|
|
117
|
+
return transport;
|
|
80
118
|
}
|
|
81
119
|
catch {
|
|
82
120
|
// A malformed host must not take the runtime down with it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/telemetry/transport/posthog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/telemetry/transport/posthog.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "managed-deepagents",
|
|
3
|
-
"version": "0.9.5-dev.
|
|
3
|
+
"version": "0.9.5-dev.6",
|
|
4
4
|
"description": "Managed Deep Agents — the `defineDeepAgent` authoring interface plus the CLI that compiles and deploys a code-first Deep Agent repository to a managed LangGraph runtime.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"langchain",
|
|
@@ -66,12 +66,12 @@
|
|
|
66
66
|
"zod": "^4.6.2"
|
|
67
67
|
},
|
|
68
68
|
"optionalDependencies": {
|
|
69
|
-
"@langchain/managed-deepagents-darwin-arm64": "0.9.5-dev.
|
|
70
|
-
"@langchain/managed-deepagents-darwin-x64": "0.9.5-dev.
|
|
71
|
-
"@langchain/managed-deepagents-linux-arm64": "0.9.5-dev.
|
|
72
|
-
"@langchain/managed-deepagents-linux-x64": "0.9.5-dev.
|
|
73
|
-
"@langchain/managed-deepagents-win32-arm64": "0.9.5-dev.
|
|
74
|
-
"@langchain/managed-deepagents-win32-x64": "0.9.5-dev.
|
|
69
|
+
"@langchain/managed-deepagents-darwin-arm64": "0.9.5-dev.6",
|
|
70
|
+
"@langchain/managed-deepagents-darwin-x64": "0.9.5-dev.6",
|
|
71
|
+
"@langchain/managed-deepagents-linux-arm64": "0.9.5-dev.6",
|
|
72
|
+
"@langchain/managed-deepagents-linux-x64": "0.9.5-dev.6",
|
|
73
|
+
"@langchain/managed-deepagents-win32-arm64": "0.9.5-dev.6",
|
|
74
|
+
"@langchain/managed-deepagents-win32-x64": "0.9.5-dev.6"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@types/node": "^26.5.1",
|