liminal 0.5.4 → 0.5.5

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 (96) hide show
  1. package/Agent.ts +12 -14
  2. package/CHANGELOG.md +6 -0
  3. package/Context.ts +44 -0
  4. package/EventBase.ts +21 -8
  5. package/L/L.ts +0 -2
  6. package/L/_infer.ts +4 -5
  7. package/L/_message.ts +2 -3
  8. package/L/branch.ts +12 -26
  9. package/L/emit.ts +9 -3
  10. package/L/model.ts +2 -3
  11. package/L/rune.ts +1 -2
  12. package/LEvent.ts +10 -20
  13. package/Rune.ts +1 -3
  14. package/dist/Agent.d.ts +2 -6
  15. package/dist/Agent.js +9 -8
  16. package/dist/Agent.js.map +1 -1
  17. package/dist/Context.d.ts +10 -0
  18. package/dist/Context.js +37 -0
  19. package/dist/Context.js.map +1 -0
  20. package/dist/EventBase.d.ts +7 -4
  21. package/dist/EventBase.js +17 -11
  22. package/dist/EventBase.js.map +1 -1
  23. package/dist/L/L.d.ts +0 -2
  24. package/dist/L/L.js +0 -2
  25. package/dist/L/L.js.map +1 -1
  26. package/dist/L/_infer.js +4 -5
  27. package/dist/L/_infer.js.map +1 -1
  28. package/dist/L/_message.js +2 -3
  29. package/dist/L/_message.js.map +1 -1
  30. package/dist/L/branch.js +12 -25
  31. package/dist/L/branch.js.map +1 -1
  32. package/dist/L/emit.js +9 -3
  33. package/dist/L/emit.js.map +1 -1
  34. package/dist/L/model.js +2 -3
  35. package/dist/L/model.js.map +1 -1
  36. package/dist/L/rune.d.ts +1 -2
  37. package/dist/L/rune.js.map +1 -1
  38. package/dist/LEvent.d.ts +43 -9
  39. package/dist/LEvent.js +10 -16
  40. package/dist/LEvent.js.map +1 -1
  41. package/dist/Rune.d.ts +1 -2
  42. package/dist/Rune.js.map +1 -1
  43. package/dist/index.d.ts +0 -2
  44. package/dist/index.js +0 -2
  45. package/dist/index.js.map +1 -1
  46. package/dist/run.d.ts +3 -2
  47. package/dist/run.js +16 -16
  48. package/dist/run.js.map +1 -1
  49. package/dist/state/Fiber.d.ts +9 -0
  50. package/dist/state/Fiber.js +14 -0
  51. package/dist/state/Fiber.js.map +1 -0
  52. package/dist/state/Globals.d.ts +9 -0
  53. package/dist/state/Globals.js +10 -0
  54. package/dist/state/Globals.js.map +1 -0
  55. package/dist/state/MessageRegistry.d.ts +0 -1
  56. package/dist/state/MessageRegistry.js +0 -3
  57. package/dist/state/MessageRegistry.js.map +1 -1
  58. package/dist/state/ModelConfig.d.ts +1 -19
  59. package/dist/state/ModelConfig.js +13 -14
  60. package/dist/state/ModelConfig.js.map +1 -1
  61. package/dist/state/ModelRegistry.d.ts +0 -1
  62. package/dist/state/ModelRegistry.js +0 -7
  63. package/dist/state/ModelRegistry.js.map +1 -1
  64. package/dist/state/StateMap.d.ts +1 -8
  65. package/dist/state/StateMap.js +1 -17
  66. package/dist/state/StateMap.js.map +1 -1
  67. package/dist/tsconfig.tsbuildinfo +1 -1
  68. package/index.ts +0 -2
  69. package/package.json +1 -1
  70. package/run.ts +18 -20
  71. package/state/Fiber.ts +13 -0
  72. package/state/Globals.ts +12 -0
  73. package/state/MessageRegistry.ts +0 -4
  74. package/state/ModelConfig.ts +13 -15
  75. package/state/ModelRegistry.ts +0 -8
  76. package/state/StateMap.ts +0 -24
  77. package/Fiber.ts +0 -67
  78. package/L/all.ts +0 -11
  79. package/L/join.ts +0 -9
  80. package/L/self.ts +0 -13
  81. package/dist/Fiber.d.ts +0 -24
  82. package/dist/Fiber.js +0 -37
  83. package/dist/Fiber.js.map +0 -1
  84. package/dist/L/all.d.ts +0 -7
  85. package/dist/L/all.js +0 -5
  86. package/dist/L/all.js.map +0 -1
  87. package/dist/L/join.d.ts +0 -5
  88. package/dist/L/join.js +0 -5
  89. package/dist/L/join.js.map +0 -1
  90. package/dist/L/self.d.ts +0 -6
  91. package/dist/L/self.js +0 -7
  92. package/dist/L/self.js.map +0 -1
  93. package/dist/state/Context.d.ts +0 -8
  94. package/dist/state/Context.js +0 -17
  95. package/dist/state/Context.js.map +0 -1
  96. package/state/Context.ts +0 -19
package/Agent.ts CHANGED
@@ -1,28 +1,26 @@
1
- import type { FiberConfig, FiberInfo } from "./Fiber.ts"
1
+ import { Context } from "./Context.ts"
2
2
  import { run } from "./run.ts"
3
3
  import type { Rune, RuneKey } from "./Rune.ts"
4
4
  import type { Runic } from "./Runic.ts"
5
+ import { Fiber } from "./state/Fiber.ts"
6
+ import { Globals } from "./state/Globals.ts"
5
7
 
6
8
  export interface Agent<out T, out E> extends PromiseLike<T> {
7
9
  T: T
8
10
  E: E
9
11
  }
10
12
 
11
- export function Agent<Y extends Rune, T>(runic: Runic<Y, T>, config?: AgentConfig<Y, T>): Agent<T, Rune.E<Y>> {
13
+ export function Agent<Y extends Rune, T>(
14
+ runic: Runic<Y, T>,
15
+ globals?: Partial<Globals<Y[RuneKey]>>,
16
+ ): Agent<T, Rune.E<Y>> {
12
17
  return {
13
18
  then(onfulfilled, onrejected) {
14
- return run(runic, {
15
- T: null!,
16
- globals: {
17
- handler: config?.handler ?? (() => {}),
18
- },
19
- signal: config?.signal,
20
- }).then(onfulfilled, onrejected)
19
+ const context = new Context([
20
+ [Globals.make, Globals.make(globals)],
21
+ [Fiber.make, Fiber.make()],
22
+ ])
23
+ return Context.storage.run(context, () => run(runic).then(onfulfilled, onrejected))
21
24
  },
22
25
  } satisfies Omit<Agent<T, Rune.E<Y>>, "E" | "T"> as never
23
26
  }
24
-
25
- export interface AgentConfig<Y extends Rune, _T> {
26
- handler: (event: Y[RuneKey], info: FiberInfo) => void
27
- signal?: AbortSignal
28
- }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # liminal
2
2
 
3
+ ## 0.5.5
4
+
5
+ ### Patch Changes
6
+
7
+ - 43afd27: Fixing misc. bugs and refactoring context management.
8
+
3
9
  ## 0.5.4
4
10
 
5
11
  ### Patch Changes
package/Context.ts ADDED
@@ -0,0 +1,44 @@
1
+ import { assert } from "liminal-util"
2
+ import { AsyncLocalStorage } from "node:async_hooks"
3
+
4
+ export class Context extends Map<StateFactory, unknown> {
5
+ static storage: AsyncLocalStorage<Context> = new AsyncLocalStorage<Context>()
6
+
7
+ static make(context?: Context): Context {
8
+ const instance = new Context()
9
+ if (context) {
10
+ for (const [key, value] of context.entries()) {
11
+ instance.set(key, key(value))
12
+ }
13
+ }
14
+ return instance
15
+ }
16
+
17
+ static unwrap(): Context {
18
+ const context = this.storage.getStore()
19
+ assert(context)
20
+ return context
21
+ }
22
+
23
+ static get<T>(factory: StateFactory<T>): T | undefined {
24
+ return this.unwrap().get(factory) as never
25
+ }
26
+
27
+ static getAssert<T>(factory: StateFactory<T>): T {
28
+ const value = this.get(factory)
29
+ assert(value)
30
+ return value
31
+ }
32
+
33
+ static getOrInit<T>(factory: StateFactory<T>): T {
34
+ let context = this.unwrap()
35
+ let instance = context.get(factory)
36
+ if (!instance) {
37
+ instance = factory()
38
+ context.set(factory, instance)
39
+ }
40
+ return instance as never
41
+ }
42
+ }
43
+
44
+ export type StateFactory<T = any> = (instance?: T) => T
package/EventBase.ts CHANGED
@@ -1,13 +1,26 @@
1
1
  import { inspect, type InspectOptions } from "node:util"
2
2
 
3
- export abstract class EventBase<B extends symbol, K extends string> {
4
- constructor(
5
- readonly brand: B,
6
- readonly type: K,
7
- ) {}
3
+ export interface EventBase<B extends symbol = symbol, K extends string = string> {
4
+ readonly brand: B
5
+ readonly type: K
6
+ }
7
+
8
+ export function EventBase<B extends symbol, K extends string>(brand: B, type: K) {
9
+ return class implements EventBase<B, K> {
10
+ readonly brand = brand
11
+ readonly type = type
8
12
 
9
- [inspect.custom](depth: number, options: InspectOptions) {
10
- const { brand: _0, type: _1, ...rest } = this
11
- return `${this.constructor.name} ` + inspect(rest, { ...options, depth })
13
+ // Allows us to circumvent a false positive ts error related to private symbols.
14
+ // https://github.com/microsoft/TypeScript/issues/58496
15
+ static {
16
+ Object.defineProperties(this.prototype, {
17
+ [inspect.custom]: {
18
+ value(depth: number, options: InspectOptions) {
19
+ const { brand: _0, type: _1, ...rest } = this
20
+ return `${this.constructor.name} ` + inspect(rest, { ...options, depth })
21
+ },
22
+ },
23
+ })
24
+ }
12
25
  }
13
26
  }
package/L/L.ts CHANGED
@@ -5,8 +5,6 @@ export * from "./assistant.ts"
5
5
  export * from "./branch.ts"
6
6
  export * from "./emit.ts"
7
7
  export * from "./fork.ts"
8
- export * from "./join.ts"
9
8
  export * from "./model.ts"
10
- export * from "./self.ts"
11
9
  export * from "./system.ts"
12
10
  export * from "./user.ts"
package/L/_infer.ts CHANGED
@@ -1,20 +1,19 @@
1
1
  import type { SchemaObject } from "liminal-schema"
2
2
  import { assert } from "liminal-util"
3
+ import { Context } from "../Context.ts"
3
4
  import { InferenceRequested, Inferred, type LEvent } from "../LEvent.ts"
4
5
  import type { Rune } from "../Rune.ts"
5
- import { context } from "../state/Context.ts"
6
6
  import { MessageRegistry } from "../state/MessageRegistry.ts"
7
7
  import { ModelRegistry } from "../state/ModelRegistry.ts"
8
8
  import { emit } from "./emit.ts"
9
9
  import { rune } from "./rune.ts"
10
10
 
11
11
  export function* _infer(schema?: SchemaObject): Generator<Rune<LEvent>, string> {
12
- const state = context.get()
13
- const modelRegistry = state.getOrInit(ModelRegistry.make)
12
+ const modelRegistry = Context.getOrInit(ModelRegistry.make)
14
13
  const model = modelRegistry.peek()
15
- const messageRegistry = state.getOrInit(MessageRegistry.make)
16
- const counter = state.getOrInit(InferenceRequestCounter)
17
14
  assert(model)
15
+ const messageRegistry = Context.getOrInit(MessageRegistry.make)
16
+ const counter = Context.getOrInit(InferenceRequestCounter)
18
17
  const requestId = counter.next()
19
18
  yield* emit(new InferenceRequested(requestId, schema))
20
19
  const inference = yield* rune(() => model.resolve(messageRegistry.messages, schema))
package/L/_message.ts CHANGED
@@ -1,15 +1,14 @@
1
+ import { Context } from "../Context.ts"
1
2
  import { type LEvent, MessageAppended } from "../LEvent.ts"
2
3
  import type { ContentPart, Message, MessageRole } from "../Message.ts"
3
4
  import type { Rune } from "../Rune.ts"
4
- import { context } from "../state/Context.ts"
5
5
  import { MessageRegistry } from "../state/MessageRegistry.ts"
6
6
  import { emit } from "./emit.ts"
7
7
 
8
8
  export interface _message extends Generator<Rune<LEvent>, void> {}
9
9
 
10
10
  export function* _message(role: MessageRole, content: Array<ContentPart>): _message {
11
- const state = context.get()
12
- const messageRegistry = state.getOrInit(MessageRegistry.make)
11
+ const messageRegistry = Context.getOrInit(MessageRegistry.make)
13
12
  const message: Message = { role, content }
14
13
  yield* emit(new MessageAppended(message))
15
14
  messageRegistry.append(message)
package/L/branch.ts CHANGED
@@ -1,10 +1,9 @@
1
- import type { FiberConfig } from "../Fiber.ts"
1
+ import { Context } from "../Context.ts"
2
2
  import { run } from "../run.ts"
3
3
  import { type Rune } from "../Rune.ts"
4
4
  import type { Runic } from "../Runic.ts"
5
- import { context } from "../state/Context.ts"
5
+ import { Fiber } from "../state/Fiber.ts"
6
6
  import { rune } from "./rune.ts"
7
- import { self } from "./self.ts"
8
7
 
9
8
  export interface branch<Y extends Rune, T> extends Generator<Y, T> {}
10
9
 
@@ -16,36 +15,23 @@ export function branch<XR extends Record<keyof any, Runic>>(
16
15
  runics: XR,
17
16
  ): branch<Runic.Y<XR[keyof XR]> | Rune<never>, { [K in keyof XR]: Runic.T<XR[K]> }>
18
17
  export function* branch(value: Runic | Array<Runic> | Record<keyof any, Runic>): branch<Rune, any> {
19
- const parent = yield* self
20
- const { globals } = parent
18
+ const parent = Context.get(Fiber.make)
21
19
  if (Array.isArray(value)) {
22
20
  const runners = value.map((runic) => {
23
- const state = context.get()
24
- const fiberConfig: FiberConfig = {
25
- T: null!,
26
- globals,
27
- state,
28
- }
29
- return () => run(runic, fiberConfig)
21
+ const context = Context.make(Context.unwrap())
22
+ context.set(Fiber.make, new Fiber(parent))
23
+ return () => run(runic, context)
30
24
  })
31
25
  return yield* rune(() => Promise.all(runners.map((runner) => runner())))
32
26
  } else if (typeof value === "object") {
33
27
  const runners = Object.entries(value).map(([key, runic]) => {
34
- const state = context.get()
35
- const fiberConfig: FiberConfig = {
36
- T: null!,
37
- globals,
38
- state,
39
- }
40
- return async () => [key, await run(runic, fiberConfig)]
28
+ const context = Context.make(Context.unwrap())
29
+ context.set(Fiber.make, new Fiber(parent))
30
+ return async () => [key, await run(runic, context)]
41
31
  })
42
32
  return yield* rune(() => Promise.all(runners.map((runner) => runner())).then(Object.fromEntries))
43
33
  }
44
- const state = context.get()
45
- const fiberConfig: FiberConfig = {
46
- T: null!,
47
- globals,
48
- state,
49
- }
50
- return yield* rune(() => run(typeof value === "function" ? value() : value, fiberConfig))
34
+ const context = Context.make(Context.unwrap())
35
+ context.set(Fiber.make, new Fiber(parent))
36
+ return yield* rune(() => run(typeof value === "function" ? value() : value, context))
51
37
  }
package/L/emit.ts CHANGED
@@ -1,10 +1,16 @@
1
1
  import type { EnsureNarrow } from "liminal-util"
2
- import { handler } from "../Fiber.ts"
2
+ import { Context } from "../Context.ts"
3
3
  import type { Rune } from "../Rune.ts"
4
- import { rune } from "./rune.ts"
4
+ import { Fiber } from "../state/Fiber.ts"
5
+ import { Globals } from "../state/Globals.ts"
5
6
 
6
7
  export interface emit<E> extends Generator<Rune<E>, void> {}
7
8
 
8
9
  export function* emit<const E>(event: EnsureNarrow<E>): emit<E> {
9
- yield* rune((fiberConfig) => handler(fiberConfig, event))<E>()
10
+ const globals = Context.getAssert(Globals.make)
11
+ const fiber = Context.getAssert(Fiber.make)
12
+ globals.handler?.(event, {
13
+ fiber: fiber.index,
14
+ timestamp: Date.now(),
15
+ })
10
16
  }
package/L/model.ts CHANGED
@@ -1,12 +1,11 @@
1
+ import { Context } from "../Context.ts"
1
2
  import type { Model } from "../Model.ts"
2
3
  import type { Rune } from "../Rune.ts"
3
- import { context } from "../state/Context.ts"
4
4
  import { ModelRegistry } from "../state/ModelRegistry.ts"
5
5
 
6
6
  export interface model extends Generator<Rune<never>, void> {}
7
7
 
8
8
  export function* model(model: Model): model {
9
- const state = context.get()
10
- const modelRegistry = state.getOrInit(ModelRegistry.make)
9
+ const modelRegistry = Context.getOrInit(ModelRegistry.make)
11
10
  modelRegistry.register(model)
12
11
  }
package/L/rune.ts CHANGED
@@ -1,11 +1,10 @@
1
- import type { FiberConfig } from "../Fiber.ts"
2
1
  import { type Rune, RuneKey } from "../Rune.ts"
3
2
 
4
3
  export interface rune<T> extends Iterable<Rune<never>, T> {
5
4
  <E>(): Generator<Rune<E>, T>
6
5
  }
7
6
 
8
- export function rune<R>(source: (fiberConfig: FiberConfig) => R): rune<Awaited<R>> {
7
+ export function rune<R>(source: () => R): rune<Awaited<R>> {
9
8
  return Object.assign(
10
9
  function*<E>(): Generator<Rune<E>, Awaited<R>> {
11
10
  return yield Object.assign(source, { [RuneKey]: {} as never })
package/LEvent.ts CHANGED
@@ -7,49 +7,39 @@ export type LEvent = InferenceRequested | Inferred | MessageAppended | FiberCrea
7
7
  export const LEventTag: unique symbol = Symbol.for("liminal/LEvent")
8
8
  export type LEventTag = typeof LEventTag
9
9
 
10
- export class InferenceRequested extends EventBase<LEventTag, "inference_requested"> {
10
+ export class InferenceRequested extends EventBase(LEventTag, "inference_requested") {
11
11
  declare schema?: SchemaObject
12
12
  constructor(
13
13
  readonly requestId: number,
14
14
  schema?: SchemaObject | undefined,
15
15
  ) {
16
- super(LEventTag, "inference_requested")
16
+ super()
17
17
  if (schema) {
18
18
  this.schema = schema
19
19
  }
20
20
  }
21
21
  }
22
22
 
23
- export class Inferred extends EventBase<LEventTag, "inferred"> {
23
+ export class Inferred extends EventBase(LEventTag, "inferred") {
24
24
  constructor(
25
25
  readonly requestId: number,
26
26
  readonly inference: string,
27
27
  ) {
28
- super(LEventTag, "inferred")
28
+ super()
29
29
  }
30
30
  }
31
31
 
32
- export class MessageAppended extends EventBase<LEventTag, "message_appended"> {
32
+ export class MessageAppended extends EventBase(LEventTag, "message_appended") {
33
33
  constructor(readonly message: Message) {
34
- super(LEventTag, "message_appended")
34
+ super()
35
35
  }
36
36
  }
37
37
 
38
- export class FiberCreated extends EventBase<LEventTag, "fiber_created"> {
39
- constructor() {
40
- super(LEventTag, "fiber_created")
41
- }
42
- }
43
-
44
- export class FiberStarted extends EventBase<LEventTag, "fiber_started"> {
45
- constructor() {
46
- super(LEventTag, "fiber_started")
47
- }
48
- }
49
-
50
- export class FiberResolved extends EventBase<LEventTag, "fiber_resolved"> {
38
+ export class FiberCreated extends EventBase(LEventTag, "fiber_created") {}
39
+ export class FiberStarted extends EventBase(LEventTag, "fiber_started") {}
40
+ export class FiberResolved extends EventBase(LEventTag, "fiber_resolved") {
51
41
  constructor(readonly value: any) {
52
- super(LEventTag, "fiber_resolved")
42
+ super()
53
43
  }
54
44
  }
55
45
 
package/Rune.ts CHANGED
@@ -1,7 +1,5 @@
1
- import type { FiberConfig } from "./Fiber.ts"
2
-
3
1
  export interface Rune<out E = any> {
4
- (fiber: FiberConfig): any
2
+ (): any
5
3
  [RuneKey]: E
6
4
  }
7
5
 
package/dist/Agent.d.ts CHANGED
@@ -1,12 +1,8 @@
1
- import type { FiberInfo } from "./Fiber.ts";
2
1
  import type { Rune, RuneKey } from "./Rune.ts";
3
2
  import type { Runic } from "./Runic.ts";
3
+ import { Globals } from "./state/Globals.ts";
4
4
  export interface Agent<out T, out E> extends PromiseLike<T> {
5
5
  T: T;
6
6
  E: E;
7
7
  }
8
- export declare function Agent<Y extends Rune, T>(runic: Runic<Y, T>, config?: AgentConfig<Y, T>): Agent<T, Rune.E<Y>>;
9
- export interface AgentConfig<Y extends Rune, _T> {
10
- handler: (event: Y[RuneKey], info: FiberInfo) => void;
11
- signal?: AbortSignal;
12
- }
8
+ export declare function Agent<Y extends Rune, T>(runic: Runic<Y, T>, globals?: Partial<Globals<Y[RuneKey]>>): Agent<T, Rune.E<Y>>;
package/dist/Agent.js CHANGED
@@ -1,14 +1,15 @@
1
+ import { Context } from "./Context.js";
1
2
  import { run } from "./run.js";
2
- export function Agent(runic, config) {
3
+ import { Fiber } from "./state/Fiber.js";
4
+ import { Globals } from "./state/Globals.js";
5
+ export function Agent(runic, globals) {
3
6
  return {
4
7
  then(onfulfilled, onrejected) {
5
- return run(runic, {
6
- T: null,
7
- globals: {
8
- handler: config?.handler ?? (() => { }),
9
- },
10
- signal: config?.signal,
11
- }).then(onfulfilled, onrejected);
8
+ const context = new Context([
9
+ [Globals.make, Globals.make(globals)],
10
+ [Fiber.make, Fiber.make()],
11
+ ]);
12
+ return Context.storage.run(context, () => run(runic).then(onfulfilled, onrejected));
12
13
  },
13
14
  };
14
15
  }
package/dist/Agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Agent.js","sourceRoot":"","sources":["../Agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAS9B,MAAM,UAAU,KAAK,CAAoB,KAAkB,EAAE,MAA0B;IACrF,OAAO;QACL,IAAI,CAAC,WAAW,EAAE,UAAU;YAC1B,OAAO,GAAG,CAAC,KAAK,EAAE;gBAChB,CAAC,EAAE,IAAK;gBACR,OAAO,EAAE;oBACP,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;iBACvC;gBACD,MAAM,EAAE,MAAM,EAAE,MAAM;aACvB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;QAClC,CAAC;KACsD,CAAA;AAC3D,CAAC"}
1
+ {"version":3,"file":"Agent.js","sourceRoot":"","sources":["../Agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAG9B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAO5C,MAAM,UAAU,KAAK,CACnB,KAAkB,EAClB,OAAsC;IAEtC,OAAO;QACL,IAAI,CAAC,WAAW,EAAE,UAAU;YAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;gBAC1B,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;aAC3B,CAAC,CAAA;YACF,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;QACrF,CAAC;KACsD,CAAA;AAC3D,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ export declare class Context extends Map<StateFactory, unknown> {
3
+ static storage: AsyncLocalStorage<Context>;
4
+ static make(context?: Context): Context;
5
+ static unwrap(): Context;
6
+ static get<T>(factory: StateFactory<T>): T | undefined;
7
+ static getAssert<T>(factory: StateFactory<T>): T;
8
+ static getOrInit<T>(factory: StateFactory<T>): T;
9
+ }
10
+ export type StateFactory<T = any> = (instance?: T) => T;
@@ -0,0 +1,37 @@
1
+ import { assert } from "liminal-util";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ export class Context extends Map {
4
+ static storage = new AsyncLocalStorage();
5
+ static make(context) {
6
+ const instance = new Context();
7
+ if (context) {
8
+ for (const [key, value] of context.entries()) {
9
+ instance.set(key, key(value));
10
+ }
11
+ }
12
+ return instance;
13
+ }
14
+ static unwrap() {
15
+ const context = this.storage.getStore();
16
+ assert(context);
17
+ return context;
18
+ }
19
+ static get(factory) {
20
+ return this.unwrap().get(factory);
21
+ }
22
+ static getAssert(factory) {
23
+ const value = this.get(factory);
24
+ assert(value);
25
+ return value;
26
+ }
27
+ static getOrInit(factory) {
28
+ let context = this.unwrap();
29
+ let instance = context.get(factory);
30
+ if (!instance) {
31
+ instance = factory();
32
+ context.set(factory, instance);
33
+ }
34
+ return instance;
35
+ }
36
+ }
37
+ //# sourceMappingURL=Context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.js","sourceRoot":"","sources":["../Context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,OAAO,OAAQ,SAAQ,GAA0B;IACrD,MAAM,CAAC,OAAO,GAA+B,IAAI,iBAAiB,EAAW,CAAA;IAE7E,MAAM,CAAC,IAAI,CAAC,OAAiB;QAC3B,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAA;QAC9B,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC7C,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,MAAM;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;QACvC,MAAM,CAAC,OAAO,CAAC,CAAA;QACf,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,CAAC,GAAG,CAAI,OAAwB;QACpC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAU,CAAA;IAC5C,CAAC;IAED,MAAM,CAAC,SAAS,CAAI,OAAwB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAA;QACb,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,CAAC,SAAS,CAAI,OAAwB;QAC1C,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAC3B,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,OAAO,EAAE,CAAA;YACpB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,QAAiB,CAAA;IAC1B,CAAC"}
@@ -1,7 +1,10 @@
1
- import { inspect, type InspectOptions } from "node:util";
2
- export declare abstract class EventBase<B extends symbol, K extends string> {
1
+ export interface EventBase<B extends symbol = symbol, K extends string = string> {
3
2
  readonly brand: B;
4
3
  readonly type: K;
5
- constructor(brand: B, type: K);
6
- [inspect.custom](depth: number, options: InspectOptions): string;
7
4
  }
5
+ export declare function EventBase<B extends symbol, K extends string>(brand: B, type: K): {
6
+ new (): {
7
+ readonly brand: B;
8
+ readonly type: K;
9
+ };
10
+ };
package/dist/EventBase.js CHANGED
@@ -1,14 +1,20 @@
1
1
  import { inspect } from "node:util";
2
- export class EventBase {
3
- brand;
4
- type;
5
- constructor(brand, type) {
6
- this.brand = brand;
7
- this.type = type;
8
- }
9
- [inspect.custom](depth, options) {
10
- const { brand: _0, type: _1, ...rest } = this;
11
- return `${this.constructor.name} ` + inspect(rest, { ...options, depth });
12
- }
2
+ export function EventBase(brand, type) {
3
+ return class {
4
+ brand = brand;
5
+ type = type;
6
+ // Allows us to circumvent a false positive ts error related to private symbols.
7
+ // https://github.com/microsoft/TypeScript/issues/58496
8
+ static {
9
+ Object.defineProperties(this.prototype, {
10
+ [inspect.custom]: {
11
+ value(depth, options) {
12
+ const { brand: _0, type: _1, ...rest } = this;
13
+ return `${this.constructor.name} ` + inspect(rest, { ...options, depth });
14
+ },
15
+ },
16
+ });
17
+ }
18
+ };
13
19
  }
14
20
  //# sourceMappingURL=EventBase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventBase.js","sourceRoot":"","sources":["../EventBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,WAAW,CAAA;AAExD,MAAM,OAAgB,SAAS;IAElB;IACA;IAFX,YACW,KAAQ,EACR,IAAO;QADP,UAAK,GAAL,KAAK,CAAG;QACR,SAAI,GAAJ,IAAI,CAAG;IACf,CAAC;IAEJ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAa,EAAE,OAAuB;QACrD,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;QAC7C,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3E,CAAC;CACF"}
1
+ {"version":3,"file":"EventBase.js","sourceRoot":"","sources":["../EventBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,MAAM,WAAW,CAAA;AAOxD,MAAM,UAAU,SAAS,CAAqC,KAAQ,EAAE,IAAO;IAC7E,OAAO;QACI,KAAK,GAAG,KAAK,CAAA;QACb,IAAI,GAAG,IAAI,CAAA;QAEpB,gFAAgF;QAChF,uDAAuD;QACvD;YACE,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE;gBACtC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBAChB,KAAK,CAAC,KAAa,EAAE,OAAuB;wBAC1C,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;wBAC7C,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;oBAC3E,CAAC;iBACF;aACF,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
package/dist/L/L.d.ts CHANGED
@@ -5,8 +5,6 @@ export * from "./assistant.ts";
5
5
  export * from "./branch.ts";
6
6
  export * from "./emit.ts";
7
7
  export * from "./fork.ts";
8
- export * from "./join.ts";
9
8
  export * from "./model.ts";
10
- export * from "./self.ts";
11
9
  export * from "./system.ts";
12
10
  export * from "./user.ts";
package/dist/L/L.js CHANGED
@@ -5,9 +5,7 @@ export * from "./assistant.js";
5
5
  export * from "./branch.js";
6
6
  export * from "./emit.js";
7
7
  export * from "./fork.js";
8
- export * from "./join.js";
9
8
  export * from "./model.js";
10
- export * from "./self.js";
11
9
  export * from "./system.js";
12
10
  export * from "./user.js";
13
11
  //# sourceMappingURL=L.js.map
package/dist/L/L.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"L.js","sourceRoot":"","sources":["../../L/L.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"L.js","sourceRoot":"","sources":["../../L/L.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
package/dist/L/_infer.js CHANGED
@@ -1,17 +1,16 @@
1
1
  import { assert } from "liminal-util";
2
+ import { Context } from "../Context.js";
2
3
  import { InferenceRequested, Inferred } from "../LEvent.js";
3
- import { context } from "../state/Context.js";
4
4
  import { MessageRegistry } from "../state/MessageRegistry.js";
5
5
  import { ModelRegistry } from "../state/ModelRegistry.js";
6
6
  import { emit } from "./emit.js";
7
7
  import { rune } from "./rune.js";
8
8
  export function* _infer(schema) {
9
- const state = context.get();
10
- const modelRegistry = state.getOrInit(ModelRegistry.make);
9
+ const modelRegistry = Context.getOrInit(ModelRegistry.make);
11
10
  const model = modelRegistry.peek();
12
- const messageRegistry = state.getOrInit(MessageRegistry.make);
13
- const counter = state.getOrInit(InferenceRequestCounter);
14
11
  assert(model);
12
+ const messageRegistry = Context.getOrInit(MessageRegistry.make);
13
+ const counter = Context.getOrInit(InferenceRequestCounter);
15
14
  const requestId = counter.next();
16
15
  yield* emit(new InferenceRequested(requestId, schema));
17
16
  const inference = yield* rune(() => model.resolve(messageRegistry.messages, schema));
@@ -1 +1 @@
1
- {"version":3,"file":"_infer.js","sourceRoot":"","sources":["../../L/_infer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAe,MAAM,cAAc,CAAA;AAExE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,SAAS,CAAC,CAAC,MAAM,CAAC,MAAqB;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IAC3B,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACzD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAA;IAClC,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;IACxD,MAAM,CAAC,KAAK,CAAC,CAAA;IACb,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAChC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;IACpF,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;IAC/C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAkB;IACjD,OAAO;QACL,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;QAC3B,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QACD,KAAK;YACH,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAA;QACtC,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"_infer.js","sourceRoot":"","sources":["../../L/_infer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAe,MAAM,cAAc,CAAA;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,SAAS,CAAC,CAAC,MAAM,CAAC,MAAqB;IAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAC3D,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAA;IAClC,MAAM,CAAC,KAAK,CAAC,CAAA;IACb,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAChC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;IACpF,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;IAC/C,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAkB;IACjD,OAAO;QACL,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;QAC3B,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QACD,KAAK;YACH,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAA;QACtC,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,10 +1,9 @@
1
+ import { Context } from "../Context.js";
1
2
  import { MessageAppended } from "../LEvent.js";
2
- import { context } from "../state/Context.js";
3
3
  import { MessageRegistry } from "../state/MessageRegistry.js";
4
4
  import { emit } from "./emit.js";
5
5
  export function* _message(role, content) {
6
- const state = context.get();
7
- const messageRegistry = state.getOrInit(MessageRegistry.make);
6
+ const messageRegistry = Context.getOrInit(MessageRegistry.make);
8
7
  const message = { role, content };
9
8
  yield* emit(new MessageAppended(message));
10
9
  messageRegistry.append(message);
@@ -1 +1 @@
1
- {"version":3,"file":"_message.js","sourceRoot":"","sources":["../../L/_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,eAAe,EAAE,MAAM,cAAc,CAAA;AAG3D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAIhC,MAAM,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAiB,EAAE,OAA2B;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IAC3B,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1C,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;IACzC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC"}
1
+ {"version":3,"file":"_message.js","sourceRoot":"","sources":["../../L/_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAe,eAAe,EAAE,MAAM,cAAc,CAAA;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAIhC,MAAM,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAiB,EAAE,OAA2B;IACtE,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IAC/D,MAAM,OAAO,GAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1C,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;IACzC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC"}