liminal 0.11.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/L.ts +5 -4
  3. package/{pretty.ts → LPretty.ts} +3 -3
  4. package/Strand.ts +24 -4
  5. package/append.ts +1 -1
  6. package/assistant.ts +3 -1
  7. package/assistantSchema.ts +60 -0
  8. package/assistantStream.ts +25 -0
  9. package/branch.ts +3 -3
  10. package/clear.ts +1 -1
  11. package/disable.ts +5 -0
  12. package/dist/L.d.ts +5 -4
  13. package/dist/L.js +5 -4
  14. package/dist/L.js.map +1 -1
  15. package/dist/LPretty.d.ts +4 -0
  16. package/dist/{pretty.js → LPretty.js} +4 -4
  17. package/dist/LPretty.js.map +1 -0
  18. package/dist/Strand.d.ts +9 -3
  19. package/dist/Strand.js +11 -1
  20. package/dist/Strand.js.map +1 -1
  21. package/dist/append.d.ts +1 -1
  22. package/dist/append.js +0 -1
  23. package/dist/append.js.map +1 -1
  24. package/dist/assistant.js +3 -1
  25. package/dist/assistant.js.map +1 -1
  26. package/dist/{assistantStruct.d.ts → assistantSchema.d.ts} +3 -2
  27. package/dist/assistantSchema.js +44 -0
  28. package/dist/assistantSchema.js.map +1 -0
  29. package/dist/assistantStream.d.ts +7 -0
  30. package/dist/assistantStream.js +17 -0
  31. package/dist/assistantStream.js.map +1 -0
  32. package/dist/branch.d.ts +1 -1
  33. package/dist/branch.js +2 -2
  34. package/dist/branch.js.map +1 -1
  35. package/dist/clear.d.ts +1 -1
  36. package/dist/clear.js +0 -1
  37. package/dist/clear.js.map +1 -1
  38. package/dist/disable.d.ts +4 -0
  39. package/dist/disable.js +3 -0
  40. package/dist/disable.js.map +1 -0
  41. package/dist/enable.d.ts +5 -0
  42. package/dist/enable.js +3 -0
  43. package/dist/enable.js.map +1 -0
  44. package/dist/events.d.ts +2 -2
  45. package/dist/events.js +2 -2
  46. package/dist/events.js.map +1 -1
  47. package/dist/handle.d.ts +7 -0
  48. package/dist/handle.js +14 -0
  49. package/dist/handle.js.map +1 -0
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.js +1 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/sequence.d.ts +2 -0
  54. package/dist/{sequence_.js → sequence.js} +1 -1
  55. package/dist/sequence.js.map +1 -0
  56. package/dist/strand_.d.ts +1 -1
  57. package/dist/strand_.js +3 -13
  58. package/dist/strand_.js.map +1 -1
  59. package/dist/system.d.ts +3 -3
  60. package/dist/system.js +3 -2
  61. package/dist/system.js.map +1 -1
  62. package/dist/tsconfig.tsbuildinfo +1 -1
  63. package/dist/user.d.ts +3 -4
  64. package/dist/user.js +8 -9
  65. package/dist/user.js.map +1 -1
  66. package/dist/user.test.js.map +1 -0
  67. package/dist/userJson.d.ts +4 -4
  68. package/dist/userJson.js +5 -4
  69. package/dist/userJson.js.map +1 -1
  70. package/dist/{internal → util}/JsonValue.d.ts +3 -0
  71. package/dist/util/JsonValue.js +109 -0
  72. package/dist/util/JsonValue.js.map +1 -0
  73. package/dist/util/Sequence.d.ts +2 -0
  74. package/dist/util/Sequence.js +2 -0
  75. package/dist/util/Sequence.js.map +1 -0
  76. package/dist/util/Taggable.d.ts +6 -0
  77. package/dist/util/Taggable.js +24 -0
  78. package/dist/util/Taggable.js.map +1 -0
  79. package/dist/util/fixRaw.d.ts +4 -0
  80. package/dist/util/fixRaw.js +75 -0
  81. package/dist/util/fixRaw.js.map +1 -0
  82. package/enable.ts +8 -0
  83. package/events.ts +5 -4
  84. package/handle.ts +25 -0
  85. package/index.ts +1 -1
  86. package/package.json +4 -4
  87. package/{sequence_.ts → sequence.ts} +1 -1
  88. package/strand_.ts +3 -17
  89. package/system.ts +8 -9
  90. package/user.test.ts +30 -0
  91. package/user.ts +15 -11
  92. package/userJson.ts +9 -7
  93. package/util/JsonValue.ts +144 -0
  94. package/util/Sequence.ts +9 -0
  95. package/util/Taggable.ts +52 -0
  96. package/util/fixRaw.ts +93 -0
  97. package/Sequence.ts +0 -14
  98. package/assistantStruct.ts +0 -34
  99. package/dist/Sequence.d.ts +0 -2
  100. package/dist/Sequence.js +0 -2
  101. package/dist/Sequence.js.map +0 -1
  102. package/dist/assistantStruct.js +0 -22
  103. package/dist/assistantStruct.js.map +0 -1
  104. package/dist/internal/JsonValue.js +0 -2
  105. package/dist/internal/JsonValue.js.map +0 -1
  106. package/dist/internal/Taggable.d.ts +0 -11
  107. package/dist/internal/Taggable.js +0 -2
  108. package/dist/internal/Taggable.js.map +0 -1
  109. package/dist/pretty.d.ts +0 -2
  110. package/dist/pretty.js.map +0 -1
  111. package/dist/reduce.d.ts +0 -4
  112. package/dist/reduce.js +0 -20
  113. package/dist/reduce.js.map +0 -1
  114. package/dist/sequence_.d.ts +0 -2
  115. package/dist/sequence_.js.map +0 -1
  116. package/dist/todo.test.js +0 -3
  117. package/dist/todo.test.js.map +0 -1
  118. package/internal/JsonValue.ts +0 -5
  119. package/internal/Taggable.ts +0 -17
  120. package/reduce.ts +0 -32
  121. package/todo.test.ts +0 -3
  122. package/tsconfig.json +0 -18
  123. /package/dist/{todo.test.d.ts → user.test.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # liminal
2
2
 
3
+ ## 0.13.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 0e4954e: Rename `L.assistantStruct` to `L.assistantSchema`, is it now supports all schemas, not just struct schemas. Template tag calls are properly dedented and normalized. Additionally, `L.userJson` now uses the optional schema to JSONC-encode with description annotations as comments on corresponding fields.
8
+
9
+ ## 0.12.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 6df720c: Fix NPM publish.
14
+
15
+ ## 0.12.0
16
+
17
+ ### Minor Changes
18
+
19
+ - a04ae8b: Introduce L.handle / rework strand event-handling mechanism.
20
+
3
21
  ## 0.11.1
4
22
 
5
23
  ### Patch Changes
package/L.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  export * from "./append.ts"
2
2
  export * from "./assistant.ts"
3
- export * from "./assistantStruct.ts"
3
+ export * from "./assistantSchema.ts"
4
+ export * from "./assistantStream.ts"
4
5
  export * from "./branch.ts"
5
6
  export * from "./clear.ts"
7
+ export * from "./enable.ts"
6
8
  export * from "./events.ts"
9
+ export * from "./handle.ts"
7
10
  export * from "./messages.ts"
8
- export * from "./reduce.ts"
9
- export * from "./Sequence.ts"
10
- export * from "./sequence_.ts"
11
+ export * from "./sequence.ts"
11
12
  export * from "./strand_.ts"
12
13
  export * from "./system.ts"
13
14
  export * from "./user.ts"
@@ -6,11 +6,11 @@ const RESET = "\x1b[0m"
6
6
  const BOLD = "\x1b[1m"
7
7
  const GRAY_BG = "\x1b[47m"
8
8
 
9
- export const pretty: (event: typeof LEvent["Type"]) => string = (event) => {
9
+ export const event: (event: typeof LEvent["Type"]) => string = (event) => {
10
10
  let text = `${GRAY}${event._tag}${RESET}`
11
11
  switch (event._tag) {
12
12
  case "MessagesAppended": {
13
- text += event.messages.map(formatMessage).join("\n")
13
+ text += event.messages.map(message).join("\n")
14
14
  break
15
15
  }
16
16
  case "MessagesCleared": {
@@ -21,7 +21,7 @@ export const pretty: (event: typeof LEvent["Type"]) => string = (event) => {
21
21
  return text
22
22
  }
23
23
 
24
- const formatMessage = ({ _tag, parts }: Message): string => {
24
+ export const message = ({ _tag, parts }: Message): string => {
25
25
  let value = ""
26
26
  for (const part of parts) {
27
27
  value += `\n${BOLD}${_tag}\n${GRAY_BG}`
package/Strand.ts CHANGED
@@ -1,6 +1,8 @@
1
- import { Message } from "@effect/ai/AiInput"
2
- import type { AiTool } from "@effect/ai/AiTool"
1
+ import type { Message } from "@effect/ai/AiInput"
2
+ import type * as AiToolkit from "@effect/ai/AiToolkit"
3
3
  import * as Context from "effect/Context"
4
+ import * as Effect from "effect/Effect"
5
+ import * as Layer from "effect/Layer"
4
6
  import * as Option from "effect/Option"
5
7
  import * as PubSub from "effect/PubSub"
6
8
  import type { LEvent } from "./LEvent.ts"
@@ -16,9 +18,27 @@ export declare namespace Strand {
16
18
  /** The list of messages that the model uses to infer the next message. */
17
19
  messages: Array<Message>
18
20
  /** The tools available to the model. */
19
- tools: Array<AiTool<string>>
21
+ tools: Set<AiToolkit.Any>
20
22
  }
21
23
  }
22
24
 
23
25
  /** A context tag that denotes the boundary of a conversation isolate. */
24
- export class Strand extends Context.Tag("liminal/Strand")<Strand, Strand.Service>() {}
26
+ export class Strand extends Context.Tag("liminal/Strand")<Strand, Strand.Service>() {
27
+ static layer: (init?: {
28
+ system?: string | undefined
29
+ messages?: Array<Message> | undefined
30
+ tools?: Set<AiToolkit.Any>
31
+ }) => Layer.Layer<Strand> = ({ system, messages, tools } = {}) =>
32
+ Layer.effect(
33
+ Strand,
34
+ Effect.gen(function*() {
35
+ return Strand.of({
36
+ parent: yield* Effect.serviceOption(Strand),
37
+ events: yield* PubSub.unbounded<LEvent>(),
38
+ system: Option.fromNullable(system),
39
+ messages: [...messages ?? []],
40
+ tools: new Set(tools ?? []),
41
+ })
42
+ }),
43
+ )
44
+ }
package/append.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Message } from "@effect/ai/AiInput"
1
+ import type { Message } from "@effect/ai/AiInput"
2
2
  import * as Effect from "effect/Effect"
3
3
  import { MessagesAppended } from "./LEvent.ts"
4
4
  import { Strand } from "./Strand.ts"
package/assistant.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { AiError } from "@effect/ai/AiError"
2
2
  import { AssistantMessage, TextPart } from "@effect/ai/AiInput"
3
3
  import { AiLanguageModel } from "@effect/ai/AiLanguageModel"
4
+ import * as AiToolkit from "@effect/ai/AiToolkit"
4
5
  import * as Effect from "effect/Effect"
5
6
  import * as Option from "effect/Option"
6
7
  import { append } from "./append.ts"
@@ -9,10 +10,11 @@ import { Strand } from "./Strand.ts"
9
10
  /** Infer an assistant message and append it to the conversation. */
10
11
  export const assistant: Effect.Effect<string, AiError, AiLanguageModel | Strand> = Effect.gen(function*() {
11
12
  const model = yield* AiLanguageModel
12
- const { system, messages } = yield* Strand
13
+ const { system, messages, tools } = yield* Strand
13
14
  const { text } = yield* model.generateText({
14
15
  system: Option.getOrUndefined(system),
15
16
  prompt: messages,
17
+ toolkit: AiToolkit.merge(...tools) as never,
16
18
  })
17
19
  yield* append(
18
20
  new AssistantMessage({
@@ -0,0 +1,60 @@
1
+ import type { AiError } from "@effect/ai/AiError"
2
+ import { AssistantMessage, TextPart } from "@effect/ai/AiInput"
3
+ import { AiLanguageModel } from "@effect/ai/AiLanguageModel"
4
+ import * as Effect from "effect/Effect"
5
+ import * as Option from "effect/Option"
6
+ import * as Schema from "effect/Schema"
7
+ import * as SchemaAST from "effect/SchemaAST"
8
+ import { append } from "./append.ts"
9
+ import { Strand } from "./Strand.ts"
10
+ import { encodeJsonc, type JsonValue } from "./util/JsonValue.ts"
11
+
12
+ /** Infer a structured assistant message and append its JSON representation to the conversation. */
13
+ export const assistantSchema: {
14
+ <F extends Record<string, Schema.Schema.AnyNoContext>>(
15
+ fields: F,
16
+ ): Effect.Effect<{ [K in keyof F]: Schema.Schema.Type<F[K]> }, AiError, AiLanguageModel | Strand>
17
+ <O, I extends JsonValue>(
18
+ schema: Schema.Schema<O, I, never>,
19
+ ): Effect.Effect<O, AiError, AiLanguageModel | Strand>
20
+ } = Effect.fnUntraced(function*(schema) {
21
+ const model = yield* AiLanguageModel
22
+ const { system, messages } = yield* Strand
23
+
24
+ const isSchema = Schema.isSchema(schema)
25
+ const schema_ = isSchema ? schema : Schema.Struct(schema) as Schema.Schema.AnyNoContext
26
+ const isObject = !isSchema || isObjectSchema(SchemaAST.encodedAST(schema.ast))
27
+ const wrapped = isObject ? schema_ : Schema.Struct({ inner: schema_ })
28
+
29
+ const value = yield* model.generateObject({
30
+ system: Option.getOrUndefined(system),
31
+ schema: wrapped,
32
+ prompt: messages,
33
+ }).pipe(
34
+ Effect.map(({ value }) => isObject ? value : value["inner"]),
35
+ )
36
+
37
+ yield* append(
38
+ new AssistantMessage({
39
+ parts: [
40
+ new TextPart({
41
+ text: yield* encodeJsonc(schema_)(value),
42
+ }),
43
+ ],
44
+ }),
45
+ )
46
+ return value
47
+ })
48
+
49
+ const isObjectSchema = (ast: SchemaAST.AST): boolean => {
50
+ switch (ast._tag) {
51
+ case "TypeLiteral": {
52
+ return true
53
+ }
54
+ case "Refinement":
55
+ case "Transformation": {
56
+ return isObjectSchema(ast.from)
57
+ }
58
+ }
59
+ return false
60
+ }
@@ -0,0 +1,25 @@
1
+ import type { AiError } from "@effect/ai/AiError"
2
+ import { AiLanguageModel } from "@effect/ai/AiLanguageModel"
3
+ import type { AiResponse } from "@effect/ai/AiResponse"
4
+ import * as AiToolkit from "@effect/ai/AiToolkit"
5
+ import * as Effect from "effect/Effect"
6
+ import * as Option from "effect/Option"
7
+ import * as Stream from "effect/Stream"
8
+ import { Strand } from "./Strand"
9
+
10
+ /** Get a streamed inference from the assistant without appending it to the strand's messages. */
11
+ export const assistantStream: Stream.Stream<
12
+ AiResponse,
13
+ AiError,
14
+ AiLanguageModel | Strand
15
+ > = Stream.unwrap(
16
+ Effect.gen(function*() {
17
+ const model = yield* AiLanguageModel
18
+ const { system, messages, tools } = yield* Strand
19
+ return model.streamText({
20
+ system: Option.getOrUndefined(system),
21
+ prompt: messages,
22
+ toolkit: AiToolkit.merge(...tools) as never,
23
+ })
24
+ }),
25
+ )
package/branch.ts CHANGED
@@ -3,9 +3,9 @@ import { flow, identity } from "effect/Function"
3
3
  import * as Option from "effect/Option"
4
4
  import * as PubSub from "effect/PubSub"
5
5
  import type { LEvent } from "./LEvent.ts"
6
- import type { Sequence } from "./Sequence.ts"
7
- import { sequence } from "./sequence_.ts"
6
+ import { sequence } from "./sequence.ts"
8
7
  import { Strand } from "./Strand.ts"
8
+ import type { Sequence } from "./util/Sequence.ts"
9
9
 
10
10
  /** Isolate the effect with a new strand in context. */
11
11
  export const branch: Sequence<never, Strand> = flow(
@@ -19,7 +19,7 @@ export const branch: Sequence<never, Strand> = flow(
19
19
  system: Option.map(parent.system, identity),
20
20
  events: yield* PubSub.unbounded<LEvent>(),
21
21
  messages: parent.messages.slice(),
22
- tools: parent.tools.slice(),
22
+ tools: new Set(parent.tools),
23
23
  })
24
24
  }),
25
25
  ),
package/clear.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Message } from "@effect/ai/AiInput"
1
+ import type { Message } from "@effect/ai/AiInput"
2
2
  import * as Effect from "effect/Effect"
3
3
  import { MessagesCleared } from "./LEvent.ts"
4
4
  import { Strand } from "./Strand.ts"
package/disable.ts ADDED
@@ -0,0 +1,5 @@
1
+ import * as AiTool from "@effect/ai/AiTool"
2
+ import type { AiToolkit } from "@effect/ai/AiToolkit"
3
+ import * as Effect from "effect/Effect"
4
+
5
+ export declare const disable: (toolkit: AiToolkit<AiTool.Any>) => Effect.Effect<void>
package/dist/L.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  export * from "./append.ts";
2
2
  export * from "./assistant.ts";
3
- export * from "./assistantStruct.ts";
3
+ export * from "./assistantSchema.ts";
4
+ export * from "./assistantStream.ts";
4
5
  export * from "./branch.ts";
5
6
  export * from "./clear.ts";
7
+ export * from "./enable.ts";
6
8
  export * from "./events.ts";
9
+ export * from "./handle.ts";
7
10
  export * from "./messages.ts";
8
- export * from "./reduce.ts";
9
- export * from "./Sequence.ts";
10
- export * from "./sequence_.ts";
11
+ export * from "./sequence.ts";
11
12
  export * from "./strand_.ts";
12
13
  export * from "./system.ts";
13
14
  export * from "./user.ts";
package/dist/L.js CHANGED
@@ -1,13 +1,14 @@
1
1
  export * from "./append.js";
2
2
  export * from "./assistant.js";
3
- export * from "./assistantStruct.js";
3
+ export * from "./assistantSchema.js";
4
+ export * from "./assistantStream.js";
4
5
  export * from "./branch.js";
5
6
  export * from "./clear.js";
7
+ export * from "./enable.js";
6
8
  export * from "./events.js";
9
+ export * from "./handle.js";
7
10
  export * from "./messages.js";
8
- export * from "./reduce.js";
9
- export * from "./Sequence.js";
10
- export * from "./sequence_.js";
11
+ export * from "./sequence.js";
11
12
  export * from "./strand_.js";
12
13
  export * from "./system.js";
13
14
  export * from "./user.js";
package/dist/L.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"L.js","sourceRoot":"","sources":["../L.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA"}
1
+ {"version":3,"file":"L.js","sourceRoot":"","sources":["../L.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Message } from "@effect/ai/AiInput";
2
+ import type { LEvent } from "./LEvent.ts";
3
+ export declare const event: (event: typeof LEvent["Type"]) => string;
4
+ export declare const message: ({ _tag, parts }: Message) => string;
@@ -2,11 +2,11 @@ const GRAY = "\x1b[90m";
2
2
  const RESET = "\x1b[0m";
3
3
  const BOLD = "\x1b[1m";
4
4
  const GRAY_BG = "\x1b[47m";
5
- export const pretty = (event) => {
5
+ export const event = (event) => {
6
6
  let text = `${GRAY}${event._tag}${RESET}`;
7
7
  switch (event._tag) {
8
8
  case "MessagesAppended": {
9
- text += event.messages.map(formatMessage).join("\n");
9
+ text += event.messages.map(message).join("\n");
10
10
  break;
11
11
  }
12
12
  case "MessagesCleared": {
@@ -16,7 +16,7 @@ export const pretty = (event) => {
16
16
  }
17
17
  return text;
18
18
  };
19
- const formatMessage = ({ _tag, parts }) => {
19
+ export const message = ({ _tag, parts }) => {
20
20
  let value = "";
21
21
  for (const part of parts) {
22
22
  value += `\n${BOLD}${_tag}\n${GRAY_BG}`;
@@ -34,4 +34,4 @@ const formatMessage = ({ _tag, parts }) => {
34
34
  }
35
35
  return value;
36
36
  };
37
- //# sourceMappingURL=pretty.js.map
37
+ //# sourceMappingURL=LPretty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LPretty.js","sourceRoot":"","sources":["../LPretty.ts"],"names":[],"mappings":"AAGA,MAAM,IAAI,GAAG,UAAU,CAAA;AACvB,MAAM,KAAK,GAAG,SAAS,CAAA;AACvB,MAAM,IAAI,GAAG,SAAS,CAAA;AACtB,MAAM,OAAO,GAAG,UAAU,CAAA;AAE1B,MAAM,CAAC,MAAM,KAAK,GAA6C,CAAC,KAAK,EAAE,EAAE;IACvE,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,EAAE,CAAA;IACzC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9C,MAAK;QACP,CAAC;QACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,IAAI,IAAI,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,oBAAoB,CAAA;YACrD,MAAK;QACP,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAW,EAAU,EAAE;IAC1D,IAAI,KAAK,GAAG,EAAE,CAAA;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,OAAO,EAAE,CAAA;QACvC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;gBACvB,MAAK;YACP,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,KAAK,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;gBAC3C,MAAK;YACP,CAAC;QACH,CAAC;QACD,KAAK,IAAI,KAAK,CAAA;IAChB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
package/dist/Strand.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { Message } from "@effect/ai/AiInput";
2
- import type { AiTool } from "@effect/ai/AiTool";
1
+ import type { Message } from "@effect/ai/AiInput";
2
+ import type * as AiToolkit from "@effect/ai/AiToolkit";
3
3
  import * as Context from "effect/Context";
4
+ import * as Layer from "effect/Layer";
4
5
  import * as Option from "effect/Option";
5
6
  import * as PubSub from "effect/PubSub";
6
7
  import type { LEvent } from "./LEvent.ts";
@@ -15,11 +16,16 @@ export declare namespace Strand {
15
16
  /** The list of messages that the model uses to infer the next message. */
16
17
  messages: Array<Message>;
17
18
  /** The tools available to the model. */
18
- tools: Array<AiTool<string>>;
19
+ tools: Set<AiToolkit.Any>;
19
20
  }
20
21
  }
21
22
  declare const Strand_base: Context.TagClass<Strand, "liminal/Strand", Strand.Service>;
22
23
  /** A context tag that denotes the boundary of a conversation isolate. */
23
24
  export declare class Strand extends Strand_base {
25
+ static layer: (init?: {
26
+ system?: string | undefined;
27
+ messages?: Array<Message> | undefined;
28
+ tools?: Set<AiToolkit.Any>;
29
+ }) => Layer.Layer<Strand>;
24
30
  }
25
31
  export {};
package/dist/Strand.js CHANGED
@@ -1,8 +1,18 @@
1
- import { Message } from "@effect/ai/AiInput";
2
1
  import * as Context from "effect/Context";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
3
4
  import * as Option from "effect/Option";
4
5
  import * as PubSub from "effect/PubSub";
5
6
  /** A context tag that denotes the boundary of a conversation isolate. */
6
7
  export class Strand extends Context.Tag("liminal/Strand")() {
8
+ static layer = ({ system, messages, tools } = {}) => Layer.effect(Strand, Effect.gen(function* () {
9
+ return Strand.of({
10
+ parent: yield* Effect.serviceOption(Strand),
11
+ events: yield* PubSub.unbounded(),
12
+ system: Option.fromNullable(system),
13
+ messages: [...messages ?? []],
14
+ tools: new Set(tools ?? []),
15
+ });
16
+ }));
7
17
  }
8
18
  //# sourceMappingURL=Strand.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Strand.js","sourceRoot":"","sources":["../Strand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAkBvC,yEAAyE;AACzE,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAA0B;CAAG"}
1
+ {"version":3,"file":"Strand.js","sourceRoot":"","sources":["../Strand.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAkBvC,yEAAyE;AACzE,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAA0B;IACjF,MAAM,CAAC,KAAK,GAIgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAC/D,KAAK,CAAC,MAAM,CACV,MAAM,EACN,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,OAAO,MAAM,CAAC,EAAE,CAAC;YACf,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;YAC3C,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAAU;YACzC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC;YAC7B,KAAK,EAAE,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;SAC5B,CAAC,CAAA;IACJ,CAAC,CAAC,CACH,CAAA"}
package/dist/append.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Message } from "@effect/ai/AiInput";
1
+ import type { Message } from "@effect/ai/AiInput";
2
2
  import * as Effect from "effect/Effect";
3
3
  import { Strand } from "./Strand.ts";
4
4
  /** Append messages to the current strand's message list. */
package/dist/append.js CHANGED
@@ -1,4 +1,3 @@
1
- import { Message } from "@effect/ai/AiInput";
2
1
  import * as Effect from "effect/Effect";
3
2
  import { MessagesAppended } from "./LEvent.js";
4
3
  import { Strand } from "./Strand.js";
@@ -1 +1 @@
1
- {"version":3,"file":"append.js","sourceRoot":"","sources":["../append.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,MAAM,GAEuB,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAC,GAAG,QAAQ;IAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;IACjC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"append.js","sourceRoot":"","sources":["../append.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,MAAM,GAEuB,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAC,GAAG,QAAQ;IAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;IACjC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA"}
package/dist/assistant.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { AssistantMessage, TextPart } from "@effect/ai/AiInput";
2
2
  import { AiLanguageModel } from "@effect/ai/AiLanguageModel";
3
+ import * as AiToolkit from "@effect/ai/AiToolkit";
3
4
  import * as Effect from "effect/Effect";
4
5
  import * as Option from "effect/Option";
5
6
  import { append } from "./append.js";
@@ -7,10 +8,11 @@ import { Strand } from "./Strand.js";
7
8
  /** Infer an assistant message and append it to the conversation. */
8
9
  export const assistant = Effect.gen(function* () {
9
10
  const model = yield* AiLanguageModel;
10
- const { system, messages } = yield* Strand;
11
+ const { system, messages, tools } = yield* Strand;
11
12
  const { text } = yield* model.generateText({
12
13
  system: Option.getOrUndefined(system),
13
14
  prompt: messages,
15
+ toolkit: AiToolkit.merge(...tools),
14
16
  });
15
17
  yield* append(new AssistantMessage({
16
18
  parts: [new TextPart({ text })],
@@ -1 +1 @@
1
- {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../assistant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,oEAAoE;AACpE,MAAM,CAAC,MAAM,SAAS,GAA6D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrG,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,MAAM,CACX,IAAI,gBAAgB,CAAC;QACnB,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KAChC,CAAC,CACH,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../assistant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,oEAAoE;AACpE,MAAM,CAAC,MAAM,SAAS,GAA6D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrG,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IACjD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAU;KAC5C,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,MAAM,CACX,IAAI,gBAAgB,CAAC;QACnB,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KAChC,CAAC,CACH,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA"}
@@ -3,10 +3,11 @@ import { AiLanguageModel } from "@effect/ai/AiLanguageModel";
3
3
  import * as Effect from "effect/Effect";
4
4
  import * as Schema from "effect/Schema";
5
5
  import { Strand } from "./Strand.ts";
6
+ import { type JsonValue } from "./util/JsonValue.ts";
6
7
  /** Infer a structured assistant message and append its JSON representation to the conversation. */
7
- export declare const assistantStruct: {
8
+ export declare const assistantSchema: {
8
9
  <F extends Record<string, Schema.Schema.AnyNoContext>>(fields: F): Effect.Effect<{
9
10
  [K in keyof F]: Schema.Schema.Type<F[K]>;
10
11
  }, AiError, AiLanguageModel | Strand>;
11
- <O, I extends Record<string, unknown>>(schema: Schema.Schema<O, I, never>): Effect.Effect<O, AiError, AiLanguageModel | Strand>;
12
+ <O, I extends JsonValue>(schema: Schema.Schema<O, I, never>): Effect.Effect<O, AiError, AiLanguageModel | Strand>;
12
13
  };
@@ -0,0 +1,44 @@
1
+ import { AssistantMessage, TextPart } from "@effect/ai/AiInput";
2
+ import { AiLanguageModel } from "@effect/ai/AiLanguageModel";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Option from "effect/Option";
5
+ import * as Schema from "effect/Schema";
6
+ import * as SchemaAST from "effect/SchemaAST";
7
+ import { append } from "./append.js";
8
+ import { Strand } from "./Strand.js";
9
+ import { encodeJsonc } from "./util/JsonValue.js";
10
+ /** Infer a structured assistant message and append its JSON representation to the conversation. */
11
+ export const assistantSchema = Effect.fnUntraced(function* (schema) {
12
+ const model = yield* AiLanguageModel;
13
+ const { system, messages } = yield* Strand;
14
+ const isSchema = Schema.isSchema(schema);
15
+ const schema_ = isSchema ? schema : Schema.Struct(schema);
16
+ const isObject = !isSchema || isObjectSchema(SchemaAST.encodedAST(schema.ast));
17
+ const wrapped = isObject ? schema_ : Schema.Struct({ inner: schema_ });
18
+ const value = yield* model.generateObject({
19
+ system: Option.getOrUndefined(system),
20
+ schema: wrapped,
21
+ prompt: messages,
22
+ }).pipe(Effect.map(({ value }) => isObject ? value : value["inner"]));
23
+ yield* append(new AssistantMessage({
24
+ parts: [
25
+ new TextPart({
26
+ text: yield* encodeJsonc(schema_)(value),
27
+ }),
28
+ ],
29
+ }));
30
+ return value;
31
+ });
32
+ const isObjectSchema = (ast) => {
33
+ switch (ast._tag) {
34
+ case "TypeLiteral": {
35
+ return true;
36
+ }
37
+ case "Refinement":
38
+ case "Transformation": {
39
+ return isObjectSchema(ast.from);
40
+ }
41
+ }
42
+ return false;
43
+ };
44
+ //# sourceMappingURL=assistantSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistantSchema.js","sourceRoot":"","sources":["../assistantSchema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,WAAW,EAAkB,MAAM,qBAAqB,CAAA;AAEjE,mGAAmG;AACnG,MAAM,CAAC,MAAM,eAAe,GAOxB,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAC,MAAM;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAE1C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAA+B,CAAA;IACvF,MAAM,QAAQ,GAAG,CAAC,QAAQ,IAAI,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC9E,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IAEtE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;QACxC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAC7D,CAAA;IAED,KAAK,CAAC,CAAC,MAAM,CACX,IAAI,gBAAgB,CAAC;QACnB,KAAK,EAAE;YACL,IAAI,QAAQ,CAAC;gBACX,IAAI,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;aACzC,CAAC;SACH;KACF,CAAC,CACH,CAAA;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,GAAkB,EAAW,EAAE;IACrD,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,KAAK,YAAY,CAAC;QAClB,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { AiError } from "@effect/ai/AiError";
2
+ import { AiLanguageModel } from "@effect/ai/AiLanguageModel";
3
+ import type { AiResponse } from "@effect/ai/AiResponse";
4
+ import * as Stream from "effect/Stream";
5
+ import { Strand } from "./Strand";
6
+ /** Get a streamed inference from the assistant without appending it to the strand's messages. */
7
+ export declare const assistantStream: Stream.Stream<AiResponse, AiError, AiLanguageModel | Strand>;
@@ -0,0 +1,17 @@
1
+ import { AiLanguageModel } from "@effect/ai/AiLanguageModel";
2
+ import * as AiToolkit from "@effect/ai/AiToolkit";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Option from "effect/Option";
5
+ import * as Stream from "effect/Stream";
6
+ import { Strand } from "./Strand";
7
+ /** Get a streamed inference from the assistant without appending it to the strand's messages. */
8
+ export const assistantStream = Stream.unwrap(Effect.gen(function* () {
9
+ const model = yield* AiLanguageModel;
10
+ const { system, messages, tools } = yield* Strand;
11
+ return model.streamText({
12
+ system: Option.getOrUndefined(system),
13
+ prompt: messages,
14
+ toolkit: AiToolkit.merge(...tools),
15
+ });
16
+ }));
17
+ //# sourceMappingURL=assistantStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistantStream.js","sourceRoot":"","sources":["../assistantStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAIxB,MAAM,CAAC,MAAM,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IACjD,OAAO,KAAK,CAAC,UAAU,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAU;KAC5C,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CAAA"}
package/dist/branch.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Sequence } from "./Sequence.ts";
2
1
  import { Strand } from "./Strand.ts";
2
+ import type { Sequence } from "./util/Sequence.ts";
3
3
  /** Isolate the effect with a new strand in context. */
4
4
  export declare const branch: Sequence<never, Strand>;
package/dist/branch.js CHANGED
@@ -2,7 +2,7 @@ import * as Effect from "effect/Effect";
2
2
  import { flow, identity } from "effect/Function";
3
3
  import * as Option from "effect/Option";
4
4
  import * as PubSub from "effect/PubSub";
5
- import { sequence } from "./sequence_.js";
5
+ import { sequence } from "./sequence.js";
6
6
  import { Strand } from "./Strand.js";
7
7
  /** Isolate the effect with a new strand in context. */
8
8
  export const branch = flow(sequence, Effect.provideServiceEffect(Strand, Effect.gen(function* () {
@@ -12,7 +12,7 @@ export const branch = flow(sequence, Effect.provideServiceEffect(Strand, Effect.
12
12
  system: Option.map(parent.system, identity),
13
13
  events: yield* PubSub.unbounded(),
14
14
  messages: parent.messages.slice(),
15
- tools: parent.tools.slice(),
15
+ tools: new Set(parent.tools),
16
16
  });
17
17
  })));
18
18
  //# sourceMappingURL=branch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"branch.js","sourceRoot":"","sources":["../branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,uDAAuD;AACvD,MAAM,CAAC,MAAM,MAAM,GAA4B,IAAI,CACjD,QAAQ,EACR,MAAM,CAAC,oBAAoB,CACzB,MAAM,EACN,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC5B,OAAO,MAAM,CAAC,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC3C,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAAU;QACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;QACjC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;KAC5B,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CACF,CAAA"}
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,uDAAuD;AACvD,MAAM,CAAC,MAAM,MAAM,GAA4B,IAAI,CACjD,QAAQ,EACR,MAAM,CAAC,oBAAoB,CACzB,MAAM,EACN,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC5B,OAAO,MAAM,CAAC,EAAE,CAAC;QACf,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC3C,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAAU;QACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;QACjC,KAAK,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;KAC7B,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CACF,CAAA"}
package/dist/clear.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Message } from "@effect/ai/AiInput";
1
+ import type { Message } from "@effect/ai/AiInput";
2
2
  import * as Effect from "effect/Effect";
3
3
  import { Strand } from "./Strand.ts";
4
4
  /** Clear the strand's conversation. */
package/dist/clear.js CHANGED
@@ -1,4 +1,3 @@
1
- import { Message } from "@effect/ai/AiInput";
2
1
  import * as Effect from "effect/Effect";
3
2
  import { MessagesCleared } from "./LEvent.js";
4
3
  import { Strand } from "./Strand.js";
package/dist/clear.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"clear.js","sourceRoot":"","sources":["../clear.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,uCAAuC;AACvC,MAAM,CAAC,MAAM,KAAK,GAAiD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC5B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IACnC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAA;IACpB,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC;QACzC,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAC,CAAA;IACH,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"clear.js","sourceRoot":"","sources":["../clear.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,uCAAuC;AACvC,MAAM,CAAC,MAAM,KAAK,GAAiD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC5B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IACnC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAA;IACpB,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC;QACzC,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAC,CAAA;IACH,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import * as AiTool from "@effect/ai/AiTool";
2
+ import type { AiToolkit } from "@effect/ai/AiToolkit";
3
+ import * as Effect from "effect/Effect";
4
+ export declare const disable: (toolkit: AiToolkit<AiTool.Any>) => Effect.Effect<void>;
@@ -0,0 +1,3 @@
1
+ import * as AiTool from "@effect/ai/AiTool";
2
+ import * as Effect from "effect/Effect";
3
+ //# sourceMappingURL=disable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disable.js","sourceRoot":"","sources":["../disable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA"}
@@ -0,0 +1,5 @@
1
+ import * as AiTool from "@effect/ai/AiTool";
2
+ import type { AiToolkit } from "@effect/ai/AiToolkit";
3
+ import * as Effect from "effect/Effect";
4
+ import type { Strand } from "./Strand.ts";
5
+ export declare const enable: <Tools extends AiTool.Any>(toolkit: AiToolkit<Tools>) => Effect.Effect<never, never, AiTool.Handler<Tools["name"]> | Strand>;
package/dist/enable.js ADDED
@@ -0,0 +1,3 @@
1
+ import * as AiTool from "@effect/ai/AiTool";
2
+ import * as Effect from "effect/Effect";
3
+ //# sourceMappingURL=enable.js.map