@effect-agent/testing 0.1.0-beta.39 → 0.1.0-beta.40

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/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as ScriptedStreamTermination, i as ScriptedStreamPart, n as ScriptedGenerateTurn, o as ScriptedStreamTurn, r as ScriptedModel, s as ScriptedTurn, t as ScriptedGeneratePart } from "./scripted-model-CEwVM9JY.mjs";
1
+ import { a as ScriptedStreamTermination, i as ScriptedStreamPart, n as ScriptedGenerateTurn, o as ScriptedStreamTurn, r as ScriptedModel, s as ScriptedTurn, t as ScriptedGeneratePart } from "./scripted-model-C2y0ztuj.mjs";
2
2
  export { ScriptedGeneratePart, ScriptedGenerateTurn, ScriptedModel, ScriptedStreamPart, ScriptedStreamTermination, ScriptedStreamTurn, ScriptedTurn };
@@ -119,9 +119,7 @@ const streamForTurn = (turn) => {
119
119
  case "Fail":
120
120
  stream = stream.pipe(Stream.concat(Stream.fail(scriptedError("stream", turn.termination.description))));
121
121
  break;
122
- case "Hang":
123
- stream = stream.pipe(Stream.concat(Stream.never));
124
- break;
122
+ case "Hang": stream = stream.pipe(Stream.concat(Stream.never));
125
123
  }
126
124
  if (turn.onStreamStart !== void 0) stream = Stream.fromEffectDrain(turn.onStreamStart).pipe(Stream.concat(stream));
127
125
  if (turn.onStreamFinalize !== void 0) stream = stream.pipe(Stream.ensuring(turn.onStreamFinalize));
@@ -166,4 +164,4 @@ var ScriptedModel = class ScriptedModel extends Context.Service()("@effect-agent
166
164
  //#endregion
167
165
  export { ScriptedStreamTermination as a, ScriptedStreamPart as i, ScriptedGenerateTurn as n, ScriptedStreamTurn as o, ScriptedModel as r, ScriptedTurn as s, ScriptedGeneratePart as t };
168
166
 
169
- //# sourceMappingURL=scripted-model-CEwVM9JY.mjs.map
167
+ //# sourceMappingURL=scripted-model-C2y0ztuj.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripted-model-CEwVM9JY.mjs","names":[],"sources":["../src/scripted-model.ts"],"sourcesContent":["import { Context, Effect, Layer, Ref, Schema, Stream } from \"effect\";\nimport { AiError, LanguageModel, Response } from \"effect/unstable/ai\";\n\nconst ScriptedPartMetadata = Schema.Record(Schema.String, Schema.NullOr(Schema.Json));\nconst ScriptedPartBase = {\n metadata: Schema.optionalKey(ScriptedPartMetadata),\n};\nconst ScriptedToolCallPart = Schema.Struct({\n ...ScriptedPartBase,\n type: Schema.Literal(\"tool-call\"),\n id: Schema.String,\n name: Schema.String,\n params: Schema.Unknown,\n providerExecuted: Schema.optionalKey(Schema.Boolean),\n});\nconst ScriptedToolResultPart = Schema.Struct({\n ...ScriptedPartBase,\n type: Schema.Literal(\"tool-result\"),\n id: Schema.String,\n name: Schema.String,\n result: Schema.Unknown,\n isFailure: Schema.Boolean,\n providerExecuted: Schema.optionalKey(Schema.Boolean),\n preliminary: Schema.optionalKey(Schema.Boolean),\n});\n\n/**\n * Schema for encoded, non-streaming Effect AI response parts.\n *\n * Generic Tool payloads remain explicitly unknown here. `LanguageModel.make`\n * performs the toolkit-specific decode when the scripted response is consumed.\n */\nexport const ScriptedGeneratePart = Schema.Union([\n Schema.toEncoded(Response.TextPart),\n Schema.toEncoded(Response.ReasoningPart),\n Schema.toEncoded(Response.ReasoningDeltaPart),\n Schema.toEncoded(Response.ReasoningEndPart),\n ScriptedToolCallPart,\n ScriptedToolResultPart,\n Schema.toEncoded(Response.ToolApprovalRequestPart),\n Schema.toEncoded(Response.FilePart),\n Schema.toEncoded(Response.DocumentSourcePart),\n Schema.toEncoded(Response.UrlSourcePart),\n Schema.toEncoded(Response.ResponseMetadataPart),\n Schema.toEncoded(Response.FinishPart),\n]).annotate({ identifier: \"ScriptedGeneratePart\" });\nexport type ScriptedGeneratePart = typeof ScriptedGeneratePart.Type;\n\n/**\n * Schema for encoded Effect AI streaming response parts.\n */\nexport const ScriptedStreamPart = Schema.Union([\n Schema.toEncoded(Response.TextStartPart),\n Schema.toEncoded(Response.TextDeltaPart),\n Schema.toEncoded(Response.TextEndPart),\n Schema.toEncoded(Response.ReasoningStartPart),\n Schema.toEncoded(Response.ReasoningDeltaPart),\n Schema.toEncoded(Response.ReasoningEndPart),\n Schema.toEncoded(Response.ToolParamsStartPart),\n Schema.toEncoded(Response.ToolParamsDeltaPart),\n Schema.toEncoded(Response.ToolParamsEndPart),\n ScriptedToolCallPart,\n ScriptedToolResultPart,\n Schema.toEncoded(Response.ToolApprovalRequestPart),\n Schema.toEncoded(Response.FilePart),\n Schema.toEncoded(Response.DocumentSourcePart),\n Schema.toEncoded(Response.UrlSourcePart),\n Schema.toEncoded(Response.ResponseMetadataPart),\n Schema.toEncoded(Response.FinishPart),\n Schema.toEncoded(Response.ErrorPart),\n]).annotate({ identifier: \"ScriptedStreamPart\" });\nexport type ScriptedStreamPart = typeof ScriptedStreamPart.Type;\n\n/** Controls whether a scripted stream completes, fails, or waits for interruption. */\nexport const ScriptedStreamTermination = Schema.Union([\n Schema.TaggedStruct(\"Complete\", {}),\n Schema.TaggedStruct(\"Fail\", {\n description: Schema.String,\n }),\n Schema.TaggedStruct(\"Hang\", {}),\n]);\nexport type ScriptedStreamTermination = typeof ScriptedStreamTermination.Type;\n\n/** One non-streaming invocation and the encoded response parts it returns. */\nexport const ScriptedGenerateTurn = Schema.TaggedStruct(\"Generate\", {\n parts: Schema.Array(ScriptedGeneratePart),\n});\nexport type ScriptedGenerateTurn = typeof ScriptedGenerateTurn.Type;\n\n/** One streaming invocation with its encoded parts and terminal behavior. */\nexport const ScriptedStreamTurn = Schema.TaggedStruct(\"Stream\", {\n parts: Schema.Array(ScriptedStreamPart),\n termination: ScriptedStreamTermination,\n});\nexport type ScriptedStreamTurn = typeof ScriptedStreamTurn.Type;\n\n/**\n * Serializable grammar for one finite scripted provider invocation.\n */\nexport const ScriptedTurn = Schema.Union([ScriptedGenerateTurn, ScriptedStreamTurn]);\nexport type ScriptedTurn = typeof ScriptedTurn.Type;\n\nexport type ScriptedRequestKind = \"generate\" | \"stream\";\n\n/**\n * A request after Effect AI has normalized its prompt, tools, response format,\n * tool choice, span, and incremental-response fields.\n */\nexport interface ScriptedRequest {\n readonly kind: ScriptedRequestKind;\n readonly options: LanguageModel.ProviderOptions;\n}\n\n/** Optional request assertions and stream lifecycle effects for one scripted turn. */\nexport interface ScriptedTurnHooks {\n /** Runs against the normalized provider request before producing the response. */\n readonly assertRequest?: (\n request: LanguageModel.ProviderOptions,\n ) => Effect.Effect<void, AiError.AiError> | void;\n /** Runs immediately before the scripted stream begins emitting parts. */\n readonly onStreamStart?: Effect.Effect<void> | undefined;\n /** Runs when the scripted stream completes, fails, or is interrupted. */\n readonly onStreamFinalize?: Effect.Effect<void> | undefined;\n}\n\n/**\n * Runtime hooks are deliberately separate from the serializable turn grammar.\n */\nexport type ScriptedTurnInput = ScriptedTurn & ScriptedTurnHooks;\n\ninterface ScriptState {\n readonly remaining: ReadonlyArray<ScriptedTurnInput>;\n readonly requests: ReadonlyArray<ScriptedRequest>;\n}\n\nconst scriptedError = (method: string, description: string): AiError.AiError =>\n AiError.AiError.make({\n module: \"@effect-agent/testing/ScriptedModel\",\n method,\n reason: AiError.UnknownError.make({ description }),\n });\n\nconst runAssertion = Effect.fn(\"ScriptedModel.runAssertion\")((\n assertion: ScriptedTurnHooks[\"assertRequest\"],\n request: LanguageModel.ProviderOptions,\n): Effect.Effect<void, AiError.AiError> => {\n if (assertion === undefined) {\n return Effect.void;\n }\n return Effect.suspend(() => {\n const result = assertion(request);\n return Effect.isEffect(result) ? result : Effect.void;\n });\n});\n\nconst takeTurn = Effect.fn(\"ScriptedModel.takeTurn\")(\n (\n state: Ref.Ref<ScriptState>,\n kind: ScriptedRequestKind,\n options: LanguageModel.ProviderOptions,\n ): Effect.Effect<ScriptedTurnInput, AiError.AiError> =>\n Ref.modify(state, (current) => {\n const turn = current.remaining[0];\n if (turn === undefined) {\n return [\n undefined,\n {\n ...current,\n requests: [...current.requests, { kind, options }],\n },\n ] as const;\n }\n return [\n turn,\n {\n remaining: current.remaining.slice(1),\n requests: [...current.requests, { kind, options }],\n },\n ] as const;\n }).pipe(\n Effect.flatMap((turn) =>\n turn === undefined\n ? Effect.fail(scriptedError(kind, `Script exhausted before the ${kind} request`))\n : Effect.succeed(turn),\n ),\n ),\n);\n\nconst requireGenerateTurn = (\n turn: ScriptedTurnInput,\n): Effect.Effect<ScriptedGenerateTurn & ScriptedTurnHooks, AiError.AiError> =>\n turn._tag === \"Generate\"\n ? Effect.succeed(turn)\n : Effect.fail(scriptedError(\"generate\", `Expected a Generate turn but found ${turn._tag}`));\n\nconst requireStreamTurn = (\n turn: ScriptedTurnInput,\n): Effect.Effect<ScriptedStreamTurn & ScriptedTurnHooks, AiError.AiError> =>\n turn._tag === \"Stream\"\n ? Effect.succeed(turn)\n : Effect.fail(scriptedError(\"stream\", `Expected a Stream turn but found ${turn._tag}`));\n\nconst streamForTurn = (\n turn: ScriptedStreamTurn & ScriptedTurnHooks,\n): Stream.Stream<Response.StreamPartEncoded, AiError.AiError> => {\n let stream: Stream.Stream<Response.StreamPartEncoded, AiError.AiError> = Stream.fromIterable(\n turn.parts,\n );\n switch (turn.termination._tag) {\n case \"Complete\": {\n break;\n }\n case \"Fail\": {\n stream = stream.pipe(\n Stream.concat(Stream.fail(scriptedError(\"stream\", turn.termination.description))),\n );\n break;\n }\n case \"Hang\": {\n stream = stream.pipe(Stream.concat(Stream.never));\n break;\n }\n }\n if (turn.onStreamStart !== undefined) {\n stream = Stream.fromEffectDrain(turn.onStreamStart).pipe(Stream.concat(stream));\n }\n if (turn.onStreamFinalize !== undefined) {\n stream = stream.pipe(Stream.ensuring(turn.onStreamFinalize));\n }\n return stream;\n};\n\n/** Inspection service for a deterministic LanguageModel backed by finite scripted turns. */\nexport class ScriptedModel extends Context.Service<\n ScriptedModel,\n {\n /** Normalized provider requests captured in invocation order. */\n readonly requests: Effect.Effect<ReadonlyArray<ScriptedRequest>>;\n /** Number of scripted turns not yet consumed. */\n readonly remaining: Effect.Effect<number>;\n /** Fails with `AiError` when any scripted turns remain. */\n readonly assertExhausted: Effect.Effect<void, AiError.AiError>;\n }\n>()(\"@effect-agent/testing/ScriptedModel\") {\n /**\n * Provides the native Effect AI `LanguageModel` and this inspection service.\n * Supplying the extra inspection service does not add it to model-call\n * requirements. Each model invocation consumes one turn before assertion and\n * turn-kind validation.\n */\n static layer(\n turns: ReadonlyArray<ScriptedTurnInput>,\n ): Layer.Layer<LanguageModel.LanguageModel | ScriptedModel, never, never> {\n return Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* Ref.make<ScriptState>({\n remaining: [...turns],\n requests: [],\n });\n\n const languageModel = yield* LanguageModel.make({\n generateText: (options) =>\n Effect.gen(function* () {\n const turn = yield* takeTurn(state, \"generate\", options);\n yield* runAssertion(turn.assertRequest, options);\n const generateTurn = yield* requireGenerateTurn(turn);\n return [...generateTurn.parts];\n }),\n streamText: (options) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const turn = yield* takeTurn(state, \"stream\", options);\n yield* runAssertion(turn.assertRequest, options);\n const streamTurn = yield* requireStreamTurn(turn);\n return streamForTurn(streamTurn);\n }),\n ),\n });\n\n const inspection = ScriptedModel.of({\n requests: Ref.get(state).pipe(Effect.map((current) => current.requests)),\n remaining: Ref.get(state).pipe(Effect.map((current) => current.remaining.length)),\n assertExhausted: Ref.get(state).pipe(\n Effect.flatMap((current) =>\n current.remaining.length === 0\n ? Effect.void\n : Effect.fail(\n scriptedError(\n \"assertExhausted\",\n `${current.remaining.length} scripted turn(s) remain`,\n ),\n ),\n ),\n ),\n });\n\n return Context.make(LanguageModel.LanguageModel, languageModel).pipe(\n Context.add(ScriptedModel, inspection),\n );\n }),\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"scripted-model-C2y0ztuj.mjs","names":[],"sources":["../src/scripted-model.ts"],"sourcesContent":["import { Context, Effect, Layer, Ref, Schema, Stream } from \"effect\";\nimport { AiError, LanguageModel, Response } from \"effect/unstable/ai\";\n\nconst ScriptedPartMetadata = Schema.Record(Schema.String, Schema.NullOr(Schema.Json));\nconst ScriptedPartBase = {\n metadata: Schema.optionalKey(ScriptedPartMetadata),\n};\nconst ScriptedToolCallPart = Schema.Struct({\n ...ScriptedPartBase,\n type: Schema.Literal(\"tool-call\"),\n id: Schema.String,\n name: Schema.String,\n params: Schema.Unknown,\n providerExecuted: Schema.optionalKey(Schema.Boolean),\n});\nconst ScriptedToolResultPart = Schema.Struct({\n ...ScriptedPartBase,\n type: Schema.Literal(\"tool-result\"),\n id: Schema.String,\n name: Schema.String,\n result: Schema.Unknown,\n isFailure: Schema.Boolean,\n providerExecuted: Schema.optionalKey(Schema.Boolean),\n preliminary: Schema.optionalKey(Schema.Boolean),\n});\n\n/**\n * Schema for encoded, non-streaming Effect AI response parts.\n *\n * Generic Tool payloads remain explicitly unknown here. `LanguageModel.make`\n * performs the toolkit-specific decode when the scripted response is consumed.\n */\nexport const ScriptedGeneratePart = Schema.Union([\n Schema.toEncoded(Response.TextPart),\n Schema.toEncoded(Response.ReasoningPart),\n Schema.toEncoded(Response.ReasoningDeltaPart),\n Schema.toEncoded(Response.ReasoningEndPart),\n ScriptedToolCallPart,\n ScriptedToolResultPart,\n Schema.toEncoded(Response.ToolApprovalRequestPart),\n Schema.toEncoded(Response.FilePart),\n Schema.toEncoded(Response.DocumentSourcePart),\n Schema.toEncoded(Response.UrlSourcePart),\n Schema.toEncoded(Response.ResponseMetadataPart),\n Schema.toEncoded(Response.FinishPart),\n]).annotate({ identifier: \"ScriptedGeneratePart\" });\nexport type ScriptedGeneratePart = typeof ScriptedGeneratePart.Type;\n\n/**\n * Schema for encoded Effect AI streaming response parts.\n */\nexport const ScriptedStreamPart = Schema.Union([\n Schema.toEncoded(Response.TextStartPart),\n Schema.toEncoded(Response.TextDeltaPart),\n Schema.toEncoded(Response.TextEndPart),\n Schema.toEncoded(Response.ReasoningStartPart),\n Schema.toEncoded(Response.ReasoningDeltaPart),\n Schema.toEncoded(Response.ReasoningEndPart),\n Schema.toEncoded(Response.ToolParamsStartPart),\n Schema.toEncoded(Response.ToolParamsDeltaPart),\n Schema.toEncoded(Response.ToolParamsEndPart),\n ScriptedToolCallPart,\n ScriptedToolResultPart,\n Schema.toEncoded(Response.ToolApprovalRequestPart),\n Schema.toEncoded(Response.FilePart),\n Schema.toEncoded(Response.DocumentSourcePart),\n Schema.toEncoded(Response.UrlSourcePart),\n Schema.toEncoded(Response.ResponseMetadataPart),\n Schema.toEncoded(Response.FinishPart),\n Schema.toEncoded(Response.ErrorPart),\n]).annotate({ identifier: \"ScriptedStreamPart\" });\nexport type ScriptedStreamPart = typeof ScriptedStreamPart.Type;\n\n/** Controls whether a scripted stream completes, fails, or waits for interruption. */\nexport const ScriptedStreamTermination = Schema.Union([\n Schema.TaggedStruct(\"Complete\", {}),\n Schema.TaggedStruct(\"Fail\", {\n description: Schema.String,\n }),\n Schema.TaggedStruct(\"Hang\", {}),\n]);\nexport type ScriptedStreamTermination = typeof ScriptedStreamTermination.Type;\n\n/** One non-streaming invocation and the encoded response parts it returns. */\nexport const ScriptedGenerateTurn = Schema.TaggedStruct(\"Generate\", {\n parts: Schema.Array(ScriptedGeneratePart),\n});\nexport type ScriptedGenerateTurn = typeof ScriptedGenerateTurn.Type;\n\n/** One streaming invocation with its encoded parts and terminal behavior. */\nexport const ScriptedStreamTurn = Schema.TaggedStruct(\"Stream\", {\n parts: Schema.Array(ScriptedStreamPart),\n termination: ScriptedStreamTermination,\n});\nexport type ScriptedStreamTurn = typeof ScriptedStreamTurn.Type;\n\n/**\n * Serializable grammar for one finite scripted provider invocation.\n */\nexport const ScriptedTurn = Schema.Union([ScriptedGenerateTurn, ScriptedStreamTurn]);\nexport type ScriptedTurn = typeof ScriptedTurn.Type;\n\nexport type ScriptedRequestKind = \"generate\" | \"stream\";\n\n/**\n * A request after Effect AI has normalized its prompt, tools, response format,\n * tool choice, span, and incremental-response fields.\n */\nexport interface ScriptedRequest {\n readonly kind: ScriptedRequestKind;\n readonly options: LanguageModel.ProviderOptions;\n}\n\n/** Optional request assertions and stream lifecycle effects for one scripted turn. */\nexport interface ScriptedTurnHooks {\n /** Runs against the normalized provider request before producing the response. */\n readonly assertRequest?: (\n request: LanguageModel.ProviderOptions,\n ) => Effect.Effect<void, AiError.AiError> | void;\n /** Runs immediately before the scripted stream begins emitting parts. */\n readonly onStreamStart?: Effect.Effect<void> | undefined;\n /** Runs when the scripted stream completes, fails, or is interrupted. */\n readonly onStreamFinalize?: Effect.Effect<void> | undefined;\n}\n\n/**\n * Runtime hooks are deliberately separate from the serializable turn grammar.\n */\nexport type ScriptedTurnInput = ScriptedTurn & ScriptedTurnHooks;\n\ninterface ScriptState {\n readonly remaining: ReadonlyArray<ScriptedTurnInput>;\n readonly requests: ReadonlyArray<ScriptedRequest>;\n}\n\nconst scriptedError = (method: string, description: string): AiError.AiError =>\n AiError.AiError.make({\n module: \"@effect-agent/testing/ScriptedModel\",\n method,\n reason: AiError.UnknownError.make({ description }),\n });\n\nconst runAssertion = Effect.fn(\"ScriptedModel.runAssertion\")((\n assertion: ScriptedTurnHooks[\"assertRequest\"],\n request: LanguageModel.ProviderOptions,\n): Effect.Effect<void, AiError.AiError> => {\n if (assertion === undefined) {\n return Effect.void;\n }\n return Effect.suspend(() => {\n const result = assertion(request);\n return Effect.isEffect(result) ? result : Effect.void;\n });\n});\n\nconst takeTurn = Effect.fn(\"ScriptedModel.takeTurn\")(\n (\n state: Ref.Ref<ScriptState>,\n kind: ScriptedRequestKind,\n options: LanguageModel.ProviderOptions,\n ): Effect.Effect<ScriptedTurnInput, AiError.AiError> =>\n Ref.modify(state, (current) => {\n const turn = current.remaining[0];\n if (turn === undefined) {\n return [\n undefined,\n {\n ...current,\n requests: [...current.requests, { kind, options }],\n },\n ] as const;\n }\n return [\n turn,\n {\n remaining: current.remaining.slice(1),\n requests: [...current.requests, { kind, options }],\n },\n ] as const;\n }).pipe(\n Effect.flatMap((turn) =>\n turn === undefined\n ? Effect.fail(scriptedError(kind, `Script exhausted before the ${kind} request`))\n : Effect.succeed(turn),\n ),\n ),\n);\n\nconst requireGenerateTurn = (\n turn: ScriptedTurnInput,\n): Effect.Effect<ScriptedGenerateTurn & ScriptedTurnHooks, AiError.AiError> =>\n turn._tag === \"Generate\"\n ? Effect.succeed(turn)\n : Effect.fail(scriptedError(\"generate\", `Expected a Generate turn but found ${turn._tag}`));\n\nconst requireStreamTurn = (\n turn: ScriptedTurnInput,\n): Effect.Effect<ScriptedStreamTurn & ScriptedTurnHooks, AiError.AiError> =>\n turn._tag === \"Stream\"\n ? Effect.succeed(turn)\n : Effect.fail(scriptedError(\"stream\", `Expected a Stream turn but found ${turn._tag}`));\n\nconst streamForTurn = (\n turn: ScriptedStreamTurn & ScriptedTurnHooks,\n): Stream.Stream<Response.StreamPartEncoded, AiError.AiError> => {\n let stream: Stream.Stream<Response.StreamPartEncoded, AiError.AiError> = Stream.fromIterable(\n turn.parts,\n );\n switch (turn.termination._tag) {\n case \"Complete\": {\n break;\n }\n case \"Fail\": {\n stream = stream.pipe(\n Stream.concat(Stream.fail(scriptedError(\"stream\", turn.termination.description))),\n );\n break;\n }\n case \"Hang\": {\n stream = stream.pipe(Stream.concat(Stream.never));\n break;\n }\n }\n if (turn.onStreamStart !== undefined) {\n stream = Stream.fromEffectDrain(turn.onStreamStart).pipe(Stream.concat(stream));\n }\n if (turn.onStreamFinalize !== undefined) {\n stream = stream.pipe(Stream.ensuring(turn.onStreamFinalize));\n }\n return stream;\n};\n\n/** Inspection service for a deterministic LanguageModel backed by finite scripted turns. */\nexport class ScriptedModel extends Context.Service<\n ScriptedModel,\n {\n /** Normalized provider requests captured in invocation order. */\n readonly requests: Effect.Effect<ReadonlyArray<ScriptedRequest>>;\n /** Number of scripted turns not yet consumed. */\n readonly remaining: Effect.Effect<number>;\n /** Fails with `AiError` when any scripted turns remain. */\n readonly assertExhausted: Effect.Effect<void, AiError.AiError>;\n }\n>()(\"@effect-agent/testing/ScriptedModel\") {\n /**\n * Provides the native Effect AI `LanguageModel` and this inspection service.\n * Supplying the extra inspection service does not add it to model-call\n * requirements. Each model invocation consumes one turn before assertion and\n * turn-kind validation.\n */\n static layer(\n turns: ReadonlyArray<ScriptedTurnInput>,\n ): Layer.Layer<LanguageModel.LanguageModel | ScriptedModel, never, never> {\n return Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* Ref.make<ScriptState>({\n remaining: [...turns],\n requests: [],\n });\n\n const languageModel = yield* LanguageModel.make({\n generateText: (options) =>\n Effect.gen(function* () {\n const turn = yield* takeTurn(state, \"generate\", options);\n yield* runAssertion(turn.assertRequest, options);\n const generateTurn = yield* requireGenerateTurn(turn);\n return [...generateTurn.parts];\n }),\n streamText: (options) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const turn = yield* takeTurn(state, \"stream\", options);\n yield* runAssertion(turn.assertRequest, options);\n const streamTurn = yield* requireStreamTurn(turn);\n return streamForTurn(streamTurn);\n }),\n ),\n });\n\n const inspection = ScriptedModel.of({\n requests: Ref.get(state).pipe(Effect.map((current) => current.requests)),\n remaining: Ref.get(state).pipe(Effect.map((current) => current.remaining.length)),\n assertExhausted: Ref.get(state).pipe(\n Effect.flatMap((current) =>\n current.remaining.length === 0\n ? Effect.void\n : Effect.fail(\n scriptedError(\n \"assertExhausted\",\n `${current.remaining.length} scripted turn(s) remain`,\n ),\n ),\n ),\n ),\n });\n\n return Context.make(LanguageModel.LanguageModel, languageModel).pipe(\n Context.add(ScriptedModel, inspection),\n );\n }),\n );\n }\n}\n"],"mappings":"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"}
@@ -320,7 +320,7 @@ declare class SupplierBookingDesk extends SupplierBookingDesk_base {
320
320
  }
321
321
  declare const TravelGuidanceLayer: Layer.Layer<TravelGuidance, never, never>;
322
322
  declare const DeterministicIdGeneratorLayer: Layer.Layer<IdGenerator, never, never>;
323
- declare const TravelPlannerRuntimeLayer: Layer.Layer<ActivityCatalog | FlightCatalog | IdGenerator | LodgingCatalog | ThreadHistory | TravelGuidance | import("effect/unstable/ai/Tool").HandlersFor<{
323
+ declare const TravelPlannerRuntimeLayer: Layer.Layer<ActivityCatalog | FlightCatalog | IdGenerator | LodgingCatalog | import("@effect-agent/engine").RunContextPreparation | ThreadHistory | TravelGuidance | import("effect/unstable/ai/Tool").HandlersFor<{
324
324
  readonly search_activities: import("effect/unstable/ai/Tool").Tool<"search_activities", {
325
325
  readonly parameters: typeof ActivityQuery;
326
326
  readonly success: typeof ActivitySearchResult;
@@ -1,5 +1,5 @@
1
- import { r as ScriptedModel } from "./scripted-model-CEwVM9JY.mjs";
2
- import { A as LodgingQuery, B as TravelPlannerToolkitLayer, C as FlightOption, D as Itinerary, E as GuidanceFailure, F as SearchLodging, I as TravelGuidance, L as TravelPlan, M as QuoteId, N as SearchActivities, O as LodgingCatalog, P as SearchFlights, R as TravelPlanner, S as FlightCatalog, T as FlightUnavailable, V as TripRequest, _ as ActivityCatalog, a as DeterministicIdGeneratorLayer, b as ActivityUnavailable, c as ReverseCompletionToolkitLayer, d as SupplierOperation, f as SupplierUnavailable, g as supplierBookingRefFor, h as cancelBookingIdempotencyKey, i as CatalogLifecycleCounts, j as LodgingUnavailable, k as LodgingOption, l as SupplierBookingDesk, m as TravelPlannerRuntimeLayer, n as BookingRef, o as FlightCatalogLayer, p as TravelGuidanceLayer, r as CatalogLifecycle, s as LodgingCatalogLayer, t as ActivityCatalogLayer, u as SupplierBookingRecord, v as ActivityQuery, w as FlightQuery, x as AirportCode, y as ActivitySearchResult, z as TravelPlannerToolkit } from "./deterministic-layers-D6gCdoPM.mjs";
1
+ import { r as ScriptedModel } from "./scripted-model-C2y0ztuj.mjs";
2
+ import { A as LodgingQuery, B as TravelPlannerToolkitLayer, C as FlightOption, D as Itinerary, E as GuidanceFailure, F as SearchLodging, I as TravelGuidance, L as TravelPlan, M as QuoteId, N as SearchActivities, O as LodgingCatalog, P as SearchFlights, R as TravelPlanner, S as FlightCatalog, T as FlightUnavailable, V as TripRequest, _ as ActivityCatalog, a as DeterministicIdGeneratorLayer, b as ActivityUnavailable, c as ReverseCompletionToolkitLayer, d as SupplierOperation, f as SupplierUnavailable, g as supplierBookingRefFor, h as cancelBookingIdempotencyKey, i as CatalogLifecycleCounts, j as LodgingUnavailable, k as LodgingOption, l as SupplierBookingDesk, m as TravelPlannerRuntimeLayer, n as BookingRef, o as FlightCatalogLayer, p as TravelGuidanceLayer, r as CatalogLifecycle, s as LodgingCatalogLayer, t as ActivityCatalogLayer, u as SupplierBookingRecord, v as ActivityQuery, w as FlightQuery, x as AirportCode, y as ActivitySearchResult, z as TravelPlannerToolkit } from "./deterministic-layers-CKyYxBhN.mjs";
3
3
  import { Context, Deferred, Duration, Effect, Layer, Option, Ref, Schema, Stream } from "effect";
4
4
  import { LanguageModel, Model, Tool, Toolkit } from "effect/unstable/ai";
5
5
  import { Subagent, SubagentPolicy, SubagentReservationsMemoryLive, SubagentRuntime, delegationAllocationFromPolicy } from "@effect-agent/capabilities";
@@ -1339,7 +1339,8 @@ const decodeComparableEnvelopes = Schema.decodeUnknownEffect(Schema.Array(Compar
1339
1339
  * the one committed `phase6TravelPlannerGoldenEvidence`, so DN ≡ DC transitively.
1340
1340
  */
1341
1341
  const normalizeCrossPlatformTravelPlannerEvidence = Effect.fn("TravelPlannerPhase6.normalizeCrossPlatformTravelPlannerEvidence")(function* (records, receipt, identity) {
1342
- const base = yield* normalizeDurableTravelPlannerEvidence(records.filter((envelope) => envelope.record.payload._tag !== "RepairAnnotated"), receipt);
1342
+ const canonical = records.filter((envelope) => envelope.record.payload._tag !== "RepairAnnotated");
1343
+ const base = yield* normalizeDurableTravelPlannerEvidence(canonical, receipt);
1343
1344
  const scrubbed = JSON.parse(JSON.stringify(base).replaceAll(identity.producerId, "{producerId}").replaceAll(identity.deploymentId, "{deploymentId}").replaceAll(identity.threadId, "{threadId}").replaceAll(/\d{4}-\d{2}-\d{2}T[0-9:.]+Z/g, "{timestamp}").replaceAll(/"[0-9a-f]{64}"/g, "\"{digest}\""));
1344
1345
  const renumbered = (yield* decodeComparableEnvelopes(scrubbed).pipe(Effect.mapError((error) => TravelPlannerDurableEvidenceError.make({ message: `Cross-platform normalized evidence lost the comparable shape: ${error.message}` })))).map((entry, index) => ({
1345
1346
  batchId: entry.batchId,