@llm4ts/runner 2.30.0 → 2.30.1

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/Otel.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as Duration from "effect/Duration";
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Layer from "effect/Layer";
4
+ import type * as HttpClient from "effect/http/HttpClient";
4
5
  import * as OtlpExporter from "effect/observability/OtlpExporter";
5
6
  export type OtelConfig = {
6
7
  readonly mode: "off";
@@ -32,10 +33,16 @@ export declare const runnerVersion: string;
32
33
  * traces and metrics from the standard variables for a generic endpoint.
33
34
  * Logs are never exported. Export errors are the exporter's to swallow; the
34
35
  * run never fails on them.
36
+ *
37
+ * Bodies are protobuf, OTLP/HTTP's default encoding and the only one Phoenix
38
+ * accepts: its traces endpoint answers 415 to `application/json`, and the
39
+ * exporter then drops every batch for a minute, at debug level.
35
40
  */
36
41
  export declare const otelLayer: (config: OtelConfig, resource: OtelResource,
37
42
  /** What the standard variables are read from in env mode (the run's environment). */
38
- environment?: Readonly<Record<string, string | undefined>>) => Layer.Layer<OtlpExporter.Flusher>;
43
+ environment?: Readonly<Record<string, string | undefined>>,
44
+ /** The HTTP client the exporter posts with; fetch by default, a fake in tests. */
45
+ http?: Layer.Layer<HttpClient.HttpClient>) => Layer.Layer<OtlpExporter.Flusher>;
39
46
  /**
40
47
  * `layerFromConfig` exports nothing unless `OTEL_TRACES_EXPORTER` names
41
48
  * `otlp`; an endpoint in the environment is the operator's intent, so the
@@ -52,6 +59,12 @@ export declare const otelSummary: (config: OtelConfig) => string | undefined;
52
59
  export declare const otelWarning: (config: OtelConfig, answers: boolean | undefined) => string | undefined;
53
60
  /** The doctor's line: `answers` is the probe's result, undefined when export is off. */
54
61
  export declare const otelDoctorLine: (config: OtelConfig, answers: boolean | undefined) => string;
55
- /** Whether anything listens at the endpoint: any HTTP answer counts, a refused connection does not. */
56
- export declare const probeOtelEndpoint: (config: OtelConfig) => Effect.Effect<boolean | undefined>;
62
+ /** How the probe posts: `fetch` in the runner, a fake in tests. */
63
+ export type Post = (url: string, init: RequestInit) => Promise<Response>;
64
+ /**
65
+ * Whether the endpoint takes what the exporter will send: an empty protobuf
66
+ * traces batch, answered 2xx. A refused connection, a 404 or a 415 (the
67
+ * answer Phoenix gives JSON) all count as "does not answer".
68
+ */
69
+ export declare const probeOtelEndpoint: (config: OtelConfig, post?: Post) => Effect.Effect<boolean | undefined>;
57
70
  //# sourceMappingURL=Otel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Otel.d.ts","sourceRoot":"","sources":["../src/Otel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,YAAY,MAAM,mCAAmC,CAAA;AAMjE,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvD,eAAO,MAAM,gBAAgB,oCAAoC,CAAA;AAOjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,UAmBF,CAAA;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,yFAAyF;AACzF,eAAO,MAAM,YAAY,mBAAsB,CAAA;AAE/C,oDAAoD;AACpD,eAAO,MAAM,aAAa,EAAE,MAAuB,CAAA;AAQnD;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GACpB,QAAQ,UAAU,EAClB,UAAU,YAAY;AACtB,qFAAqF;AACrF,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,KACtE,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CA+BlC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,UAAU,EAClB,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQ3B,CAAA;AAEP,eAAO,MAAM,WAAW,GAAI,QAAQ,UAAU,KAAG,MAAM,GAAG,SASzD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,UAAU,EAClB,SAAS,OAAO,GAAG,SAAS,KAC3B,MAAM,GAAG,SAWX,CAAA;AAED,wFAAwF;AACxF,eAAO,MAAM,cAAc,GAAI,QAAQ,UAAU,EAAE,SAAS,OAAO,GAAG,SAAS,KAAG,MAcjF,CAAA;AAED,uGAAuG;AACvG,eAAO,MAAM,iBAAiB,GAAI,QAAQ,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,CAWjF,CAAA"}
1
+ {"version":3,"file":"Otel.d.ts","sourceRoot":"","sources":["../src/Otel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,UAAU,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,YAAY,MAAM,mCAAmC,CAAA;AAMjE,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvD,eAAO,MAAM,gBAAgB,oCAAoC,CAAA;AAOjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,UAmBF,CAAA;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,yFAAyF;AACzF,eAAO,MAAM,YAAY,mBAAsB,CAAA;AAE/C,oDAAoD;AACpD,eAAO,MAAM,aAAa,EAAE,MAAuB,CAAA;AAQnD;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GACpB,QAAQ,UAAU,EAClB,UAAU,YAAY;AACtB,qFAAqF;AACrF,cAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe;AACvE,kFAAkF;AAClF,OAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAyB,KAC/D,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CA+BlC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,UAAU,EAClB,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQ3B,CAAA;AAEP,eAAO,MAAM,WAAW,GAAI,QAAQ,UAAU,KAAG,MAAM,GAAG,SASzD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,UAAU,EAClB,SAAS,OAAO,GAAG,SAAS,KAC3B,MAAM,GAAG,SAWX,CAAA;AAED,wFAAwF;AACxF,eAAO,MAAM,cAAc,GAAI,QAAQ,UAAU,EAAE,SAAS,OAAO,GAAG,SAAS,KAAG,MAcjF,CAAA;AAED,mEAAmE;AACnE,MAAM,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAExE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,UAAU,EAClB,OAAM,IAAsC,KAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,CAa7B,CAAA"}
package/dist/Otel.js CHANGED
@@ -53,10 +53,16 @@ const resourceOf = (resource) => ({
53
53
  * traces and metrics from the standard variables for a generic endpoint.
54
54
  * Logs are never exported. Export errors are the exporter's to swallow; the
55
55
  * run never fails on them.
56
+ *
57
+ * Bodies are protobuf, OTLP/HTTP's default encoding and the only one Phoenix
58
+ * accepts: its traces endpoint answers 415 to `application/json`, and the
59
+ * exporter then drops every batch for a minute, at debug level.
56
60
  */
57
61
  export const otelLayer = (config, resource,
58
62
  /** What the standard variables are read from in env mode (the run's environment). */
59
- environment = process.env) => {
63
+ environment = process.env,
64
+ /** The HTTP client the exporter posts with; fetch by default, a fake in tests. */
65
+ http = FetchHttpClient.layer) => {
60
66
  switch (config.mode) {
61
67
  case "off":
62
68
  // The exporter's no-op flusher: nothing to export, nothing to flush.
@@ -66,12 +72,12 @@ environment = process.env) => {
66
72
  url: config.tracesUrl,
67
73
  resource: resourceOf(resource),
68
74
  shutdownTimeout: flushTimeout
69
- }).pipe(Layer.provide(OtlpSerialization.layerJson), Layer.provide(FetchHttpClient.layer));
75
+ }).pipe(Layer.provide(OtlpSerialization.layerProtobuf), Layer.provide(http));
70
76
  case "env":
71
77
  // The standard variables are read from the run's own environment, with
72
78
  // the two exporter defaults an endpoint implies; the process env is
73
79
  // never written.
74
- return Layer.mergeAll(OtlpTracer.layerFromConfig({ resource: resourceOf(resource) }), OtlpMetrics.layerFromConfig({ resource: resourceOf(resource) })).pipe(Layer.provide(OtlpSerialization.layerJson), Layer.provide(FetchHttpClient.layer), Layer.provide(ConfigProvider.layer(ConfigProvider.fromEnvRecord({
80
+ return Layer.mergeAll(OtlpTracer.layerFromConfig({ resource: resourceOf(resource) }), OtlpMetrics.layerFromConfig({ resource: resourceOf(resource) })).pipe(Layer.provide(OtlpSerialization.layerProtobuf), Layer.provide(http), Layer.provide(ConfigProvider.layer(ConfigProvider.fromEnvRecord({
75
81
  ...environment,
76
82
  ...otelEnvironmentDefaults(config, environment)
77
83
  }))));
@@ -130,11 +136,19 @@ export const otelDoctorLine = (config, answers) => {
130
136
  }
131
137
  }
132
138
  };
133
- /** Whether anything listens at the endpoint: any HTTP answer counts, a refused connection does not. */
134
- export const probeOtelEndpoint = (config) => config.mode === "off"
139
+ /**
140
+ * Whether the endpoint takes what the exporter will send: an empty protobuf
141
+ * traces batch, answered 2xx. A refused connection, a 404 or a 415 (the
142
+ * answer Phoenix gives JSON) all count as "does not answer".
143
+ */
144
+ export const probeOtelEndpoint = (config, post = (url, init) => fetch(url, init)) => config.mode === "off"
135
145
  ? Effect.succeed(undefined)
136
- : Effect.tryPromise(() => fetch(config.mode === "phoenix" ? config.tracesUrl : config.endpoint, {
137
- method: "OPTIONS",
146
+ : Effect.tryPromise(() => post(config.mode === "phoenix" ? config.tracesUrl : tracesUrlOf(config.endpoint), {
147
+ method: "POST",
148
+ headers: { "content-type": "application/x-protobuf" },
149
+ body: new Uint8Array(0),
138
150
  signal: AbortSignal.timeout(1_500)
139
- })).pipe(Effect.as(true), Effect.orElseSucceed(() => false));
151
+ })).pipe(Effect.map((response) => response.ok), Effect.orElseSucceed(() => false));
152
+ /** The traces URL the standard variables imply: a bare endpoint gets `/v1/traces`. */
153
+ const tracesUrlOf = (endpoint) => /\/v1\/traces\/?$/u.test(endpoint) ? endpoint : `${endpoint.replace(/\/+$/u, "")}/v1/traces`;
140
154
  //# sourceMappingURL=Otel.js.map
package/dist/Otel.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Otel.js","sourceRoot":"","sources":["../src/Otel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Otel.js","sourceRoot":"","sources":["../src/Otel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llm4ts/runner",
3
- "version": "2.30.0",
3
+ "version": "2.30.1",
4
4
  "description": "Node runner, CLI, terminal, and MCP composition for llm4ts",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -69,8 +69,8 @@
69
69
  "typescript"
70
70
  ],
71
71
  "dependencies": {
72
- "@llm4ts/core": "2.30.0",
73
- "@llm4ts/flow": "2.30.0"
72
+ "@llm4ts/flow": "2.30.1",
73
+ "@llm4ts/core": "2.30.1"
74
74
  },
75
75
  "peerDependencies": {
76
76
  "effect": "4.0.0"
package/src/Otel.ts CHANGED
@@ -7,6 +7,7 @@ import * as Duration from "effect/Duration"
7
7
  import * as Effect from "effect/Effect"
8
8
  import * as Layer from "effect/Layer"
9
9
  import * as FetchHttpClient from "effect/http/FetchHttpClient"
10
+ import type * as HttpClient from "effect/http/HttpClient"
10
11
  import * as OtlpExporter from "effect/observability/OtlpExporter"
11
12
  import * as OtlpMetrics from "effect/observability/OtlpMetrics"
12
13
  import * as OtlpSerialization from "effect/observability/OtlpSerialization"
@@ -76,12 +77,18 @@ const resourceOf = (resource: OtelResource) => ({
76
77
  * traces and metrics from the standard variables for a generic endpoint.
77
78
  * Logs are never exported. Export errors are the exporter's to swallow; the
78
79
  * run never fails on them.
80
+ *
81
+ * Bodies are protobuf, OTLP/HTTP's default encoding and the only one Phoenix
82
+ * accepts: its traces endpoint answers 415 to `application/json`, and the
83
+ * exporter then drops every batch for a minute, at debug level.
79
84
  */
80
85
  export const otelLayer = (
81
86
  config: OtelConfig,
82
87
  resource: OtelResource,
83
88
  /** What the standard variables are read from in env mode (the run's environment). */
84
- environment: Readonly<Record<string, string | undefined>> = process.env
89
+ environment: Readonly<Record<string, string | undefined>> = process.env,
90
+ /** The HTTP client the exporter posts with; fetch by default, a fake in tests. */
91
+ http: Layer.Layer<HttpClient.HttpClient> = FetchHttpClient.layer
85
92
  ): Layer.Layer<OtlpExporter.Flusher> => {
86
93
  switch (config.mode) {
87
94
  case "off":
@@ -92,7 +99,7 @@ export const otelLayer = (
92
99
  url: config.tracesUrl,
93
100
  resource: resourceOf(resource),
94
101
  shutdownTimeout: flushTimeout
95
- }).pipe(Layer.provide(OtlpSerialization.layerJson), Layer.provide(FetchHttpClient.layer))
102
+ }).pipe(Layer.provide(OtlpSerialization.layerProtobuf), Layer.provide(http))
96
103
  case "env":
97
104
  // The standard variables are read from the run's own environment, with
98
105
  // the two exporter defaults an endpoint implies; the process env is
@@ -101,8 +108,8 @@ export const otelLayer = (
101
108
  OtlpTracer.layerFromConfig({ resource: resourceOf(resource) }),
102
109
  OtlpMetrics.layerFromConfig({ resource: resourceOf(resource) })
103
110
  ).pipe(
104
- Layer.provide(OtlpSerialization.layerJson),
105
- Layer.provide(FetchHttpClient.layer),
111
+ Layer.provide(OtlpSerialization.layerProtobuf),
112
+ Layer.provide(http),
106
113
  Layer.provide(
107
114
  ConfigProvider.layer(
108
115
  ConfigProvider.fromEnvRecord({
@@ -183,16 +190,32 @@ export const otelDoctorLine = (config: OtelConfig, answers: boolean | undefined)
183
190
  }
184
191
  }
185
192
 
186
- /** Whether anything listens at the endpoint: any HTTP answer counts, a refused connection does not. */
187
- export const probeOtelEndpoint = (config: OtelConfig): Effect.Effect<boolean | undefined> =>
193
+ /** How the probe posts: `fetch` in the runner, a fake in tests. */
194
+ export type Post = (url: string, init: RequestInit) => Promise<Response>
195
+
196
+ /**
197
+ * Whether the endpoint takes what the exporter will send: an empty protobuf
198
+ * traces batch, answered 2xx. A refused connection, a 404 or a 415 (the
199
+ * answer Phoenix gives JSON) all count as "does not answer".
200
+ */
201
+ export const probeOtelEndpoint = (
202
+ config: OtelConfig,
203
+ post: Post = (url, init) => fetch(url, init)
204
+ ): Effect.Effect<boolean | undefined> =>
188
205
  config.mode === "off"
189
206
  ? Effect.succeed(undefined)
190
207
  : Effect.tryPromise(() =>
191
- fetch(config.mode === "phoenix" ? config.tracesUrl : config.endpoint, {
192
- method: "OPTIONS",
208
+ post(config.mode === "phoenix" ? config.tracesUrl : tracesUrlOf(config.endpoint), {
209
+ method: "POST",
210
+ headers: { "content-type": "application/x-protobuf" },
211
+ body: new Uint8Array(0),
193
212
  signal: AbortSignal.timeout(1_500)
194
213
  })
195
214
  ).pipe(
196
- Effect.as(true),
215
+ Effect.map((response) => response.ok),
197
216
  Effect.orElseSucceed(() => false)
198
217
  )
218
+
219
+ /** The traces URL the standard variables imply: a bare endpoint gets `/v1/traces`. */
220
+ const tracesUrlOf = (endpoint: string): string =>
221
+ /\/v1\/traces\/?$/u.test(endpoint) ? endpoint : `${endpoint.replace(/\/+$/u, "")}/v1/traces`