liminal 0.17.0 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Accumulator.ts +97 -0
- package/Actor.ts +118 -0
- package/Audition.ts +105 -0
- package/CHANGELOG.md +2 -212
- package/Client.ts +560 -0
- package/ClientHandle.ts +39 -0
- package/F.ts +18 -0
- package/Method.ts +39 -0
- package/Protocol.ts +142 -0
- package/Send.ts +8 -0
- package/_constants.ts +1 -0
- package/_types.ts +27 -0
- package/_util/Mutex.ts +13 -0
- package/_util/phantom.ts +1 -0
- package/dist/Accumulator.d.ts +22 -0
- package/dist/Accumulator.js +33 -0
- package/dist/Accumulator.js.map +1 -0
- package/dist/Actor.d.ts +30 -0
- package/dist/Actor.js +31 -0
- package/dist/Actor.js.map +1 -0
- package/dist/Audition.d.ts +18 -0
- package/dist/Audition.js +27 -0
- package/dist/Audition.js.map +1 -0
- package/dist/Client.d.ts +65 -0
- package/dist/Client.js +248 -0
- package/dist/Client.js.map +1 -0
- package/dist/ClientHandle.d.ts +18 -0
- package/dist/ClientHandle.js +10 -0
- package/dist/ClientHandle.js.map +1 -0
- package/dist/F.d.ts +13 -0
- package/dist/F.js +4 -0
- package/dist/F.js.map +1 -0
- package/dist/Method.d.ts +23 -0
- package/dist/Method.js +4 -0
- package/dist/Method.js.map +1 -0
- package/dist/Protocol.d.ts +96 -0
- package/dist/Protocol.js +13 -0
- package/dist/Protocol.js.map +1 -0
- package/dist/Send.d.ts +3 -0
- package/dist/Send.js +2 -0
- package/dist/Send.js.map +1 -0
- package/dist/_constants.d.ts +1 -0
- package/dist/_constants.js +2 -0
- package/dist/_constants.js.map +1 -0
- package/dist/_types.d.ts +22 -0
- package/dist/_types.js +2 -0
- package/dist/_types.js.map +1 -0
- package/dist/_util/Mutex.d.ts +7 -0
- package/dist/_util/Mutex.js +9 -0
- package/dist/_util/Mutex.js.map +1 -0
- package/dist/_util/phantom.d.ts +3 -0
- package/dist/_util/phantom.js +2 -0
- package/dist/_util/phantom.js.map +1 -0
- package/dist/errors.d.ts +20 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/experimental/BranchLive.d.ts +3 -0
- package/dist/experimental/BranchLive.js +5 -0
- package/dist/experimental/BranchLive.js.map +1 -0
- package/dist/experimental/L/L.d.ts +11 -0
- package/dist/experimental/L/L.js +12 -0
- package/dist/experimental/L/L.js.map +1 -0
- package/dist/experimental/L/append.d.ts +3 -0
- package/dist/experimental/L/append.js +4 -0
- package/dist/experimental/L/append.js.map +1 -0
- package/dist/experimental/L/assistant.d.ts +3 -0
- package/dist/experimental/L/assistant.js +13 -0
- package/dist/experimental/L/assistant.js.map +1 -0
- package/dist/experimental/L/assistantSchema.d.ts +3 -0
- package/dist/experimental/L/assistantSchema.js +13 -0
- package/dist/experimental/L/assistantSchema.js.map +1 -0
- package/dist/experimental/L/assistantStream.d.ts +3 -0
- package/dist/experimental/L/assistantStream.js +5 -0
- package/dist/experimental/L/assistantStream.js.map +1 -0
- package/dist/experimental/L/branch.d.ts +2 -0
- package/dist/experimental/L/branch.js +4 -0
- package/dist/experimental/L/branch.js.map +1 -0
- package/dist/experimental/L/clear.d.ts +3 -0
- package/dist/experimental/L/clear.js +7 -0
- package/dist/experimental/L/clear.js.map +1 -0
- package/dist/experimental/L/history.d.ts +3 -0
- package/dist/experimental/L/history.js +4 -0
- package/dist/experimental/L/history.js.map +1 -0
- package/dist/experimental/L/init.d.ts +3 -0
- package/dist/experimental/L/init.js +4 -0
- package/dist/experimental/L/init.js.map +1 -0
- package/dist/experimental/L/matrix.d.ts +10 -0
- package/dist/experimental/L/matrix.js +6 -0
- package/dist/experimental/L/matrix.js.map +1 -0
- package/dist/experimental/L/system.d.ts +1 -0
- package/dist/experimental/L/system.js +4 -0
- package/dist/experimental/L/system.js.map +1 -0
- package/dist/experimental/L/user.d.ts +1 -0
- package/dist/experimental/L/user.js +6 -0
- package/dist/experimental/L/user.js.map +1 -0
- package/dist/experimental/Loader.d.ts +16 -0
- package/dist/experimental/Loader.js +20 -0
- package/dist/experimental/Loader.js.map +1 -0
- package/dist/experimental/TaggedTemplateFunction.d.ts +11 -0
- package/dist/experimental/TaggedTemplateFunction.js +14 -0
- package/dist/experimental/TaggedTemplateFunction.js.map +1 -0
- package/dist/experimental/Template.d.ts +32 -0
- package/dist/experimental/Template.js +58 -0
- package/dist/experimental/Template.js.map +1 -0
- package/dist/experimental/index.d.ts +4 -0
- package/dist/experimental/index.js +5 -0
- package/dist/experimental/index.js.map +1 -0
- package/dist/index.d.ts +9 -7
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/errors.ts +14 -0
- package/experimental/BranchLive.ts +6 -0
- package/experimental/L/L.ts +11 -0
- package/experimental/L/append.ts +12 -0
- package/experimental/L/assistant.ts +16 -0
- package/experimental/L/assistantSchema.ts +18 -0
- package/experimental/L/assistantStream.ts +9 -0
- package/experimental/L/branch.ts +5 -0
- package/experimental/L/clear.ts +7 -0
- package/experimental/L/history.ts +4 -0
- package/experimental/L/init.ts +4 -0
- package/experimental/L/matrix.ts +26 -0
- package/experimental/L/system.ts +5 -0
- package/experimental/L/user.ts +10 -0
- package/experimental/Loader.ts +35 -0
- package/experimental/TaggedTemplateFunction.ts +44 -0
- package/experimental/Template.ts +93 -0
- package/experimental/index.ts +4 -0
- package/index.ts +9 -7
- package/package.json +21 -30
- package/tsconfig.json +9 -0
- package/Digest.ts +0 -30
- package/Envelope.ts +0 -16
- package/F/F.ts +0 -1
- package/L/L.ts +0 -20
- package/L/append.ts +0 -14
- package/L/assistant.ts +0 -30
- package/L/assistantSchema.ts +0 -61
- package/L/assistantStream.ts +0 -22
- package/L/branch.ts +0 -20
- package/L/clear.ts +0 -14
- package/L/disable.ts +0 -13
- package/L/enable.ts +0 -24
- package/L/events.ts +0 -11
- package/L/json.ts +0 -12
- package/L/line.ts +0 -22
- package/L/listen.ts +0 -26
- package/L/messages.ts +0 -10
- package/L/prev.ts +0 -4
- package/L/provide.ts +0 -10
- package/L/self.ts +0 -5
- package/L/send.ts +0 -56
- package/L/system.ts +0 -25
- package/L/thread.ts +0 -16
- package/L/toolkit.ts +0 -14
- package/L/user.test.ts +0 -33
- package/L/user.ts +0 -32
- package/LEvent.ts +0 -33
- package/Thread.ts +0 -67
- package/dist/Digest.d.ts +0 -17
- package/dist/Digest.js +0 -7
- package/dist/Digest.js.map +0 -1
- package/dist/Envelope.d.ts +0 -13
- package/dist/Envelope.js +0 -2
- package/dist/Envelope.js.map +0 -1
- package/dist/F/F.d.ts +0 -1
- package/dist/F/F.js +0 -2
- package/dist/F/F.js.map +0 -1
- package/dist/L/L.d.ts +0 -20
- package/dist/L/L.js +0 -21
- package/dist/L/L.js.map +0 -1
- package/dist/L/append.d.ts +0 -5
- package/dist/L/append.js +0 -10
- package/dist/L/append.js.map +0 -1
- package/dist/L/assistant.d.ts +0 -6
- package/dist/L/assistant.js +0 -26
- package/dist/L/assistant.js.map +0 -1
- package/dist/L/assistantSchema.d.ts +0 -13
- package/dist/L/assistantSchema.js +0 -44
- package/dist/L/assistantSchema.js.map +0 -1
- package/dist/L/assistantStream.d.ts +0 -7
- package/dist/L/assistantStream.js +0 -17
- package/dist/L/assistantStream.js.map +0 -1
- package/dist/L/branch.d.ts +0 -3
- package/dist/L/branch.js +0 -19
- package/dist/L/branch.js.map +0 -1
- package/dist/L/clear.d.ts +0 -5
- package/dist/L/clear.js +0 -12
- package/dist/L/clear.js.map +0 -1
- package/dist/L/disable.d.ts +0 -4
- package/dist/L/disable.js +0 -10
- package/dist/L/disable.js.map +0 -1
- package/dist/L/enable.d.ts +0 -5
- package/dist/L/enable.js +0 -13
- package/dist/L/enable.js.map +0 -1
- package/dist/L/events.d.ts +0 -5
- package/dist/L/events.js +0 -6
- package/dist/L/events.js.map +0 -1
- package/dist/L/json.d.ts +0 -5
- package/dist/L/json.js +0 -8
- package/dist/L/json.js.map +0 -1
- package/dist/L/line.d.ts +0 -5
- package/dist/L/line.js +0 -11
- package/dist/L/line.js.map +0 -1
- package/dist/L/listen.d.ts +0 -7
- package/dist/L/listen.js +0 -14
- package/dist/L/listen.js.map +0 -1
- package/dist/L/messages.d.ts +0 -5
- package/dist/L/messages.js +0 -5
- package/dist/L/messages.js.map +0 -1
- package/dist/L/prev.d.ts +0 -5
- package/dist/L/prev.js +0 -5
- package/dist/L/prev.js.map +0 -1
- package/dist/L/provide.d.ts +0 -3
- package/dist/L/provide.js +0 -4
- package/dist/L/provide.js.map +0 -1
- package/dist/L/self.d.ts +0 -3
- package/dist/L/self.js +0 -4
- package/dist/L/self.js.map +0 -1
- package/dist/L/send.d.ts +0 -6
- package/dist/L/send.js +0 -34
- package/dist/L/send.js.map +0 -1
- package/dist/L/system.d.ts +0 -5
- package/dist/L/system.js +0 -14
- package/dist/L/system.js.map +0 -1
- package/dist/L/thread.d.ts +0 -3
- package/dist/L/thread.js +0 -15
- package/dist/L/thread.js.map +0 -1
- package/dist/L/toolkit.d.ts +0 -4
- package/dist/L/toolkit.js +0 -9
- package/dist/L/toolkit.js.map +0 -1
- package/dist/L/user.d.ts +0 -6
- package/dist/L/user.js +0 -13
- package/dist/L/user.js.map +0 -1
- package/dist/L/user.test.d.ts +0 -1
- package/dist/L/user.test.js.map +0 -1
- package/dist/LEvent.d.ts +0 -154
- package/dist/LEvent.js +0 -19
- package/dist/LEvent.js.map +0 -1
- package/dist/Thread.d.ts +0 -52
- package/dist/Thread.js +0 -32
- package/dist/Thread.js.map +0 -1
- package/dist/patterns/Debate.d.ts +0 -1
- package/dist/patterns/Debate.js +0 -3
- package/dist/patterns/Debate.js.map +0 -1
- package/dist/patterns/Model.d.ts +0 -6
- package/dist/patterns/Model.js +0 -14
- package/dist/patterns/Model.js.map +0 -1
- package/dist/patterns/Route.d.ts +0 -3
- package/dist/patterns/Route.js +0 -14
- package/dist/patterns/Route.js.map +0 -1
- package/dist/util/JsonValue.d.ts +0 -8
- package/dist/util/JsonValue.js +0 -109
- package/dist/util/JsonValue.js.map +0 -1
- package/dist/util/NeverTool.d.ts +0 -3
- package/dist/util/NeverTool.js +0 -3
- package/dist/util/NeverTool.js.map +0 -1
- package/dist/util/Taggable.d.ts +0 -6
- package/dist/util/Taggable.js +0 -13
- package/dist/util/Taggable.js.map +0 -1
- package/dist/util/extract.d.ts +0 -3
- package/dist/util/extract.js +0 -2
- package/dist/util/extract.js.map +0 -1
- package/dist/util/messageCodec.d.ts +0 -98
- package/dist/util/messageCodec.js +0 -5
- package/dist/util/messageCodec.js.map +0 -1
- package/dist/util/normalizeRaw.d.ts +0 -4
- package/dist/util/normalizeRaw.js +0 -75
- package/dist/util/normalizeRaw.js.map +0 -1
- package/dist/util/prefix.d.ts +0 -1
- package/dist/util/prefix.js +0 -2
- package/dist/util/prefix.js.map +0 -1
- package/dist/util/raw.d.ts +0 -6
- package/dist/util/raw.js +0 -5
- package/dist/util/raw.js.map +0 -1
- package/patterns/Debate.ts +0 -2
- package/patterns/Model.ts +0 -29
- package/patterns/Route.ts +0 -25
- package/util/JsonValue.ts +0 -144
- package/util/NeverTool.ts +0 -10
- package/util/Taggable.ts +0 -33
- package/util/extract.ts +0 -7
- package/util/messageCodec.ts +0 -5
- package/util/normalizeRaw.ts +0 -93
- package/util/prefix.ts +0 -1
- package/util/raw.ts +0 -27
package/Accumulator.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Deferred, Types, Option, Ref, PubSub, Stream, Effect, Context, Layer } from "effect"
|
|
2
|
+
|
|
3
|
+
const TypeId = "~liminal/Accumulator" as const
|
|
4
|
+
|
|
5
|
+
export interface Service<State> {
|
|
6
|
+
readonly ref: Ref.Ref<State>
|
|
7
|
+
|
|
8
|
+
readonly pubsub: PubSub.PubSub<State>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface AccumulatorLayerConfig<Item, E, R, State, E2, R2, E3, R3> {
|
|
12
|
+
readonly source: Stream.Stream<Item, E, R>
|
|
13
|
+
|
|
14
|
+
readonly reduce: (item: Item) => (state: State) => Effect.Effect<State, E2, R2>
|
|
15
|
+
|
|
16
|
+
readonly initial: (item: Item) => Effect.Effect<Option.Option<State>, E3, R3>
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type Reduce<State, Item, K extends Types.Tags<Item> = Types.Tags<Item>, E = never, R = never> = (
|
|
20
|
+
item: Types.ExtractTag<Item, K>,
|
|
21
|
+
) => (accumulator: State) => Effect.Effect<State, E, R>
|
|
22
|
+
|
|
23
|
+
export interface Accumulator<Self, Id extends string, State> extends Context.Tag<Self, Service<State>> {
|
|
24
|
+
new (_: never): Context.TagClassShape<Id, Service<State>>
|
|
25
|
+
|
|
26
|
+
readonly [TypeId]: typeof TypeId
|
|
27
|
+
|
|
28
|
+
readonly get: Effect.Effect<State, never, Self>
|
|
29
|
+
|
|
30
|
+
readonly stream: Stream.Stream<State, never, Self>
|
|
31
|
+
|
|
32
|
+
readonly reducer: <Item>() => <K extends Types.Tags<Item>, E, R>(
|
|
33
|
+
_tag: K,
|
|
34
|
+
f: Reduce<State, Item, K, E, R>,
|
|
35
|
+
) => Reduce<State, Item, K, E, R>
|
|
36
|
+
|
|
37
|
+
readonly layer: <Item, E, R, E2, R2, E3, R3>(
|
|
38
|
+
config: AccumulatorLayerConfig<Item, E, R, State, E2, R2, E3, R3>,
|
|
39
|
+
) => Layer.Layer<Self, E | E2 | E3, R | R2 | R3>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const Service =
|
|
43
|
+
<Self, State>() =>
|
|
44
|
+
<Id extends string>(id: Id): Accumulator<Self, Id, State> => {
|
|
45
|
+
const tag = Context.Tag(id)<Self, Service<State>>()
|
|
46
|
+
|
|
47
|
+
const get = tag.pipe(
|
|
48
|
+
Effect.map(({ ref }) => ref),
|
|
49
|
+
Effect.flatMap(Ref.get),
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
const stream = tag.pipe(
|
|
53
|
+
Effect.map(({ pubsub }) => Stream.fromPubSub(pubsub)),
|
|
54
|
+
Stream.unwrap,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
const reducer =
|
|
58
|
+
<Item>() =>
|
|
59
|
+
<K extends Types.Tags<Item>, E, R>(_tag: K, f: Reduce<State, Item, K, E, R>): Reduce<State, Item, K, E, R> =>
|
|
60
|
+
f
|
|
61
|
+
|
|
62
|
+
const layer = <Item, E, R, E2, R2, E3, R3>({
|
|
63
|
+
source,
|
|
64
|
+
initial,
|
|
65
|
+
reduce,
|
|
66
|
+
}: AccumulatorLayerConfig<Item, E, R, State, E2, R2, E3, R3>): Layer.Layer<Self, E | E2 | E3, R | R2 | R3> =>
|
|
67
|
+
Effect.gen(function* () {
|
|
68
|
+
const semaphore = yield* Effect.makeSemaphore(1)
|
|
69
|
+
const deferred = yield* Deferred.make<State>()
|
|
70
|
+
const pubsub = yield* PubSub.unbounded<State>({ replay: 1 })
|
|
71
|
+
yield* source.pipe(
|
|
72
|
+
Stream.runForEach(
|
|
73
|
+
Effect.fn(function* (item) {
|
|
74
|
+
if (!(yield* Deferred.isDone(deferred))) {
|
|
75
|
+
const match = yield* initial(item)
|
|
76
|
+
if (Option.isSome(match)) {
|
|
77
|
+
const { value } = match
|
|
78
|
+
yield* Deferred.succeed(deferred, value)
|
|
79
|
+
}
|
|
80
|
+
return
|
|
81
|
+
}
|
|
82
|
+
const current = yield* Ref.get(ref)
|
|
83
|
+
const reduced = yield* reduce(item)(current)
|
|
84
|
+
yield* Ref.set(ref, reduced)
|
|
85
|
+
yield* pubsub.publish(reduced)
|
|
86
|
+
}, semaphore.withPermits(1)),
|
|
87
|
+
),
|
|
88
|
+
Effect.forkScoped,
|
|
89
|
+
)
|
|
90
|
+
const initial_ = yield* Deferred.await(deferred)
|
|
91
|
+
const ref = yield* Ref.make(initial_)
|
|
92
|
+
yield* pubsub.publish(initial_)
|
|
93
|
+
return { ref, pubsub }
|
|
94
|
+
}).pipe(Layer.scoped(tag))
|
|
95
|
+
|
|
96
|
+
return Object.assign(tag, { [TypeId]: TypeId, get, stream, reducer, layer })
|
|
97
|
+
}
|
package/Actor.ts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Context, Schema as S, Effect } from "effect"
|
|
2
|
+
|
|
3
|
+
import type { FieldsRecord, Fields } from "./_types.ts"
|
|
4
|
+
import type * as ActorClient from "./Client.ts"
|
|
5
|
+
import type * as ClientHandle from "./ClientHandle.ts"
|
|
6
|
+
import type { MethodDefinition } from "./Method.ts"
|
|
7
|
+
import * as Method from "./Method.ts"
|
|
8
|
+
import type { Send } from "./Send.ts"
|
|
9
|
+
|
|
10
|
+
export const TypeId = "~liminal/Actor" as const
|
|
11
|
+
|
|
12
|
+
export interface Service<ActorSelf, NameA, AttachmentFields extends Fields, EventDefinitions extends FieldsRecord> {
|
|
13
|
+
readonly name: NameA
|
|
14
|
+
|
|
15
|
+
readonly currentClient: ClientHandle.ClientHandle<ActorSelf, AttachmentFields, EventDefinitions>
|
|
16
|
+
|
|
17
|
+
readonly clients: ReadonlySet<ClientHandle.ClientHandle<ActorSelf, AttachmentFields, EventDefinitions>>
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ActorDefinition<
|
|
21
|
+
NameA,
|
|
22
|
+
AttachmentFields extends Fields,
|
|
23
|
+
ClientSelf,
|
|
24
|
+
ClientId extends string,
|
|
25
|
+
MethodDefinitions extends Record<string, MethodDefinition.Any>,
|
|
26
|
+
EventDefinitions extends FieldsRecord,
|
|
27
|
+
> {
|
|
28
|
+
readonly name: S.Schema<NameA, string>
|
|
29
|
+
|
|
30
|
+
readonly attachments: AttachmentFields
|
|
31
|
+
|
|
32
|
+
readonly client: ActorClient.Client<ClientSelf, ClientId, MethodDefinitions, EventDefinitions>
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface Actor<
|
|
36
|
+
ActorSelf,
|
|
37
|
+
ActorId extends string,
|
|
38
|
+
NameA,
|
|
39
|
+
AttachmentFields extends Fields,
|
|
40
|
+
ActorClientSelf,
|
|
41
|
+
ActorClientId extends string,
|
|
42
|
+
MethodDefinitions extends Record<string, MethodDefinition.Any>,
|
|
43
|
+
EventDefinitions extends FieldsRecord,
|
|
44
|
+
> extends Context.Tag<ActorSelf, Service<ActorSelf, NameA, AttachmentFields, EventDefinitions>> {
|
|
45
|
+
new (_: never): Context.TagClassShape<ActorId, Service<ActorSelf, NameA, AttachmentFields, EventDefinitions>>
|
|
46
|
+
|
|
47
|
+
readonly [TypeId]: typeof TypeId
|
|
48
|
+
|
|
49
|
+
readonly definition: ActorDefinition<
|
|
50
|
+
NameA,
|
|
51
|
+
AttachmentFields,
|
|
52
|
+
ActorClientSelf,
|
|
53
|
+
ActorClientId,
|
|
54
|
+
MethodDefinitions,
|
|
55
|
+
EventDefinitions
|
|
56
|
+
>
|
|
57
|
+
|
|
58
|
+
readonly schema: {
|
|
59
|
+
readonly attachments: S.Schema<S.Struct<AttachmentFields>["Type"], S.Struct<AttachmentFields>["Encoded"]>
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
readonly sendAll: Send<ActorSelf, EventDefinitions>
|
|
63
|
+
|
|
64
|
+
readonly evict: Effect.Effect<void, never, ActorSelf>
|
|
65
|
+
|
|
66
|
+
readonly handler: <K extends keyof MethodDefinitions, R>(
|
|
67
|
+
tag: K,
|
|
68
|
+
f: Method.Handler<MethodDefinitions[K], R>,
|
|
69
|
+
) => Method.Handler<MethodDefinitions[K], R>
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export const Service =
|
|
73
|
+
<ActorSelf>() =>
|
|
74
|
+
<
|
|
75
|
+
ActorId extends string,
|
|
76
|
+
NameA,
|
|
77
|
+
AttachmentFields extends Fields,
|
|
78
|
+
ClientSelf,
|
|
79
|
+
ClientId extends string,
|
|
80
|
+
MethodDefinitions extends Record<string, MethodDefinition.Any>,
|
|
81
|
+
EventDefinitions extends FieldsRecord,
|
|
82
|
+
>(
|
|
83
|
+
id: ActorId,
|
|
84
|
+
definition: ActorDefinition<NameA, AttachmentFields, ClientSelf, ClientId, MethodDefinitions, EventDefinitions>,
|
|
85
|
+
): Actor<ActorSelf, ActorId, NameA, AttachmentFields, ClientSelf, ClientId, MethodDefinitions, EventDefinitions> => {
|
|
86
|
+
const tag = Context.Tag(id)<ActorSelf, Service<ActorSelf, NameA, AttachmentFields, EventDefinitions>>()
|
|
87
|
+
|
|
88
|
+
const sendAll: Send<ActorSelf, EventDefinitions> = Effect.fnUntraced(function* (key, payload) {
|
|
89
|
+
const { clients } = yield* tag
|
|
90
|
+
yield* Effect.forEach(clients, (client) => client.send(key, payload), {
|
|
91
|
+
concurrency: "unbounded",
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
// TODO: more eviction
|
|
96
|
+
const evict = Effect.gen(function* () {
|
|
97
|
+
const { clients } = yield* tag
|
|
98
|
+
for (const client of clients) {
|
|
99
|
+
yield* client.disconnect
|
|
100
|
+
}
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
const handler = <K extends keyof MethodDefinitions, R>(
|
|
104
|
+
_tag: K,
|
|
105
|
+
f: Method.Handler<MethodDefinitions[K], R>,
|
|
106
|
+
): Method.Handler<MethodDefinitions[K], R> => f
|
|
107
|
+
|
|
108
|
+
return Object.assign(tag, {
|
|
109
|
+
[TypeId]: TypeId,
|
|
110
|
+
definition,
|
|
111
|
+
schema: {
|
|
112
|
+
attachments: S.Struct(definition.attachments) as never,
|
|
113
|
+
},
|
|
114
|
+
sendAll,
|
|
115
|
+
evict,
|
|
116
|
+
handler,
|
|
117
|
+
})
|
|
118
|
+
}
|
package/Audition.ts
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { Pipeable, Stream, Effect, Function, Console } from "effect"
|
|
2
|
+
|
|
3
|
+
import type { FieldsRecord } from "./_types.ts"
|
|
4
|
+
import type { F } from "./F.ts"
|
|
5
|
+
import type * as Method from "./Method.ts"
|
|
6
|
+
|
|
7
|
+
import * as Client from "./Client.ts"
|
|
8
|
+
import { type ClientError, AuditionError } from "./errors.ts"
|
|
9
|
+
|
|
10
|
+
const TypeId = "~liminal/Audition" as const
|
|
11
|
+
|
|
12
|
+
export interface Audition<ClientSelf, MethodDefinitions extends Record<string, Method.MethodDefinition.Any>, Event>
|
|
13
|
+
extends Pipeable.Pipeable {
|
|
14
|
+
readonly [TypeId]: typeof TypeId
|
|
15
|
+
|
|
16
|
+
readonly events: Stream.Stream<Event, ClientError, ClientSelf>
|
|
17
|
+
|
|
18
|
+
readonly f: F<ClientSelf, MethodDefinitions>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const empty: Audition<never, never, never> = {
|
|
22
|
+
[TypeId]: TypeId,
|
|
23
|
+
pipe() {
|
|
24
|
+
return Pipeable.pipeArguments(this, arguments)
|
|
25
|
+
},
|
|
26
|
+
events: Stream.fail(AuditionError.make()),
|
|
27
|
+
f: () => () => AuditionError.make(),
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const add: {
|
|
31
|
+
<
|
|
32
|
+
ClientSelf,
|
|
33
|
+
ClientId extends string,
|
|
34
|
+
ClientMethodDefinitions extends Record<string, Method.MethodDefinition.Any>,
|
|
35
|
+
ClientEventDefinitions extends FieldsRecord,
|
|
36
|
+
>(
|
|
37
|
+
client: Client.Client<ClientSelf, ClientId, ClientMethodDefinitions, ClientEventDefinitions>,
|
|
38
|
+
): <AuditionSelf, AuditionMethodDefinitions extends Record<string, Method.MethodDefinition.Any>, AuditionEvent>(
|
|
39
|
+
audition: Audition<AuditionSelf, AuditionMethodDefinitions, AuditionEvent>,
|
|
40
|
+
) => Audition<
|
|
41
|
+
AuditionSelf | ClientSelf,
|
|
42
|
+
Method.MethodDefinition.Merge<AuditionMethodDefinitions, ClientMethodDefinitions>,
|
|
43
|
+
AuditionEvent | FieldsRecord.TaggedMember.Type<ClientEventDefinitions>
|
|
44
|
+
>
|
|
45
|
+
<
|
|
46
|
+
AuditionClientSelf,
|
|
47
|
+
AuditionMethodDefinitions extends Record<string, Method.MethodDefinition.Any>,
|
|
48
|
+
AuditionEvent,
|
|
49
|
+
ClientSelf,
|
|
50
|
+
ClientId extends string,
|
|
51
|
+
ClientMethodDefinitions extends Record<string, Method.MethodDefinition.Any>,
|
|
52
|
+
ClientEventDefinitions extends FieldsRecord,
|
|
53
|
+
>(
|
|
54
|
+
audition: Audition<AuditionClientSelf, AuditionMethodDefinitions, AuditionEvent>,
|
|
55
|
+
client: Client.Client<ClientSelf, ClientId, ClientMethodDefinitions, ClientEventDefinitions>,
|
|
56
|
+
): Audition<
|
|
57
|
+
AuditionClientSelf | ClientSelf,
|
|
58
|
+
Method.MethodDefinition.Merge<AuditionMethodDefinitions, ClientMethodDefinitions>,
|
|
59
|
+
AuditionEvent | FieldsRecord.TaggedMember.Type<ClientEventDefinitions>
|
|
60
|
+
>
|
|
61
|
+
} = Function.dual(
|
|
62
|
+
2,
|
|
63
|
+
<
|
|
64
|
+
AuditionSelf,
|
|
65
|
+
AuditionMethodDefinitions extends Record<string, Method.MethodDefinition.Any>,
|
|
66
|
+
AuditionEvent,
|
|
67
|
+
ClientSelf,
|
|
68
|
+
ClientId extends string,
|
|
69
|
+
ClientMethodDefinitions extends Record<string, Method.MethodDefinition.Any>,
|
|
70
|
+
ClientEventDefinitions extends FieldsRecord,
|
|
71
|
+
>(
|
|
72
|
+
audition: Audition<AuditionSelf, AuditionMethodDefinitions, AuditionEvent>,
|
|
73
|
+
client: Client.Client<ClientSelf, ClientId, ClientMethodDefinitions, ClientEventDefinitions>,
|
|
74
|
+
): Audition<
|
|
75
|
+
AuditionSelf | ClientSelf,
|
|
76
|
+
Method.MethodDefinition.Merge<AuditionMethodDefinitions, ClientMethodDefinitions>,
|
|
77
|
+
AuditionEvent | FieldsRecord.TaggedMember.Type<ClientEventDefinitions>
|
|
78
|
+
> => {
|
|
79
|
+
const f: F<
|
|
80
|
+
AuditionSelf | ClientSelf,
|
|
81
|
+
Method.MethodDefinition.Merge<AuditionMethodDefinitions, ClientMethodDefinitions>
|
|
82
|
+
> = (method) => (payload) =>
|
|
83
|
+
audition
|
|
84
|
+
.f(method as never)(payload)
|
|
85
|
+
.pipe(Effect.catchTag("AuditionError", () => client.f(method as never)(payload)))
|
|
86
|
+
|
|
87
|
+
const events = audition.events.pipe(
|
|
88
|
+
Stream.catchTag("AuditionError", () =>
|
|
89
|
+
Effect.succeed(client.events).pipe(
|
|
90
|
+
Effect.tap(() => Console.log(`Auditioning ${client.key}`)),
|
|
91
|
+
Stream.unwrap,
|
|
92
|
+
),
|
|
93
|
+
),
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
[TypeId]: TypeId,
|
|
98
|
+
pipe() {
|
|
99
|
+
return Pipeable.pipeArguments(this, arguments)
|
|
100
|
+
},
|
|
101
|
+
events,
|
|
102
|
+
f,
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
)
|
package/CHANGELOG.md
CHANGED
|
@@ -1,217 +1,7 @@
|
|
|
1
1
|
# liminal
|
|
2
2
|
|
|
3
|
-
## 0.17.
|
|
4
|
-
|
|
5
|
-
### Minor Changes
|
|
6
|
-
|
|
7
|
-
- 8212083: Refactor L.sequence -> L.line. Decouple thread effects from the providing of effects via L.provide.
|
|
8
|
-
|
|
9
|
-
## 0.16.0
|
|
10
|
-
|
|
11
|
-
### Minor Changes
|
|
12
|
-
|
|
13
|
-
- 2e96076: Refactoring "strands" into "threads", which can provide a handle with which to operate on the thread context outside of the thread's sequencers arguments.
|
|
14
|
-
|
|
15
|
-
## 0.15.0
|
|
16
|
-
|
|
17
|
-
### Minor Changes
|
|
18
|
-
|
|
19
|
-
- 3b4ec1a: - Instead of providing `AiToolkit` to `L.enable`/`L.disable`, we now provide tools directly.
|
|
20
|
-
- Also includes the beginnings of a `coalesceModels` pattern.
|
|
21
|
-
|
|
22
|
-
## 0.14.0
|
|
23
|
-
|
|
24
|
-
### Minor Changes
|
|
25
|
-
|
|
26
|
-
- e7006b7: Implement tool enablement and disablement.
|
|
27
|
-
|
|
28
|
-
## 0.13.0
|
|
29
|
-
|
|
30
|
-
### Minor Changes
|
|
31
|
-
|
|
32
|
-
- 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.
|
|
33
|
-
|
|
34
|
-
## 0.12.1
|
|
35
|
-
|
|
36
|
-
### Patch Changes
|
|
37
|
-
|
|
38
|
-
- 6df720c: Fix NPM publish.
|
|
39
|
-
|
|
40
|
-
## 0.12.0
|
|
41
|
-
|
|
42
|
-
### Minor Changes
|
|
43
|
-
|
|
44
|
-
- a04ae8b: Introduce L.handle / rework strand event-handling mechanism.
|
|
45
|
-
|
|
46
|
-
## 0.11.1
|
|
47
|
-
|
|
48
|
-
### Patch Changes
|
|
49
|
-
|
|
50
|
-
- feee30f: Testing provenance capture in changeset-driven publishes.
|
|
51
|
-
|
|
52
|
-
## 0.11.0
|
|
53
|
-
|
|
54
|
-
### Minor Changes
|
|
55
|
-
|
|
56
|
-
- 48aa187: Rework mechanism of denoting strand boundary.
|
|
57
|
-
|
|
58
|
-
## 0.10.0
|
|
59
|
-
|
|
60
|
-
### Minor Changes
|
|
61
|
-
|
|
62
|
-
- 866e64a: Redesigning much of the API.
|
|
63
|
-
|
|
64
|
-
## 0.9.0
|
|
65
|
-
|
|
66
|
-
### Minor Changes
|
|
67
|
-
|
|
68
|
-
- df8861a: Separate L.assistant into L.assistantText and L.assistantStruct.
|
|
69
|
-
|
|
70
|
-
## 0.8.0
|
|
71
|
-
|
|
72
|
-
### Minor Changes
|
|
73
|
-
|
|
74
|
-
- bf980fb: Major redesign of the Liminal API to be more effect-idiomatic.
|
|
75
|
-
|
|
76
|
-
## 0.7.0
|
|
77
|
-
|
|
78
|
-
### Minor Changes
|
|
79
|
-
|
|
80
|
-
- d6fe173: Remove approach to passing handlers to strands.
|
|
81
|
-
|
|
82
|
-
## 0.6.0
|
|
83
|
-
|
|
84
|
-
### Minor Changes
|
|
85
|
-
|
|
86
|
-
- e88b9af: Rewrite using Effect-TS.
|
|
87
|
-
|
|
88
|
-
## 0.5.17
|
|
89
|
-
|
|
90
|
-
### Patch Changes
|
|
91
|
-
|
|
92
|
-
- 5c421c8: Re-add string dedenting for template-fn-style usage of user, system and schema.
|
|
93
|
-
|
|
94
|
-
## 0.5.16
|
|
95
|
-
|
|
96
|
-
### Patch Changes
|
|
97
|
-
|
|
98
|
-
- 6e70190: Renaming Model to Adapter and L.model to L.focus
|
|
99
|
-
|
|
100
|
-
## 0.5.15
|
|
101
|
-
|
|
102
|
-
### Patch Changes
|
|
103
|
-
|
|
104
|
-
- 9c276c3: Fix message list cloning, add streaming to ollama adapter.
|
|
105
|
-
|
|
106
|
-
## 0.5.14
|
|
107
|
-
|
|
108
|
-
### Patch Changes
|
|
109
|
-
|
|
110
|
-
- d12049c: Fix L.run return type. Add L.<type> for JSON-schema building.
|
|
111
|
-
|
|
112
|
-
## 0.5.13
|
|
113
|
-
|
|
114
|
-
### Patch Changes
|
|
115
|
-
|
|
116
|
-
- bbd0e74: Liminal schema and util now exist within the liminal package itself. Runtime type compatibility changes.
|
|
117
|
-
|
|
118
|
-
## 0.5.12
|
|
119
|
-
|
|
120
|
-
### Patch Changes
|
|
121
|
-
|
|
122
|
-
- 4808a57: Fix handling of standalone iterables supplied to L.strand. Also introduce strandard, a standard library of strands.
|
|
123
|
-
- Updated dependencies [4808a57]
|
|
124
|
-
- liminal-util@0.0.7
|
|
125
|
-
|
|
126
|
-
## 0.5.11
|
|
127
|
-
|
|
128
|
-
### Patch Changes
|
|
129
|
-
|
|
130
|
-
- cf42ed2: Agent -> Strand. Making the API more uniform. Ie. Agent -> L.strand. L.branch -> L.strand.
|
|
131
|
-
- Updated dependencies [cf42ed2]
|
|
132
|
-
- liminal-schema@0.0.5
|
|
133
|
-
- liminal-util@0.0.6
|
|
134
|
-
|
|
135
|
-
## 0.5.10
|
|
136
|
-
|
|
137
|
-
### Patch Changes
|
|
138
|
-
|
|
139
|
-
- aef5564: Update Model interface to support streaming. Improve event-related functionality and emit fiber-related events.
|
|
140
|
-
- Updated dependencies [aef5564]
|
|
141
|
-
- liminal-schema@0.0.4
|
|
142
|
-
- liminal-util@0.0.5
|
|
143
|
-
|
|
144
|
-
## 0.5.9
|
|
145
|
-
|
|
146
|
-
### Patch Changes
|
|
147
|
-
|
|
148
|
-
- dbd5e93: Reintroduced tools and various examples.
|
|
149
|
-
|
|
150
|
-
## 0.5.8
|
|
151
|
-
|
|
152
|
-
### Patch Changes
|
|
153
|
-
|
|
154
|
-
- 23a24ae: Reintroduce L.catch and clean up parts of the generator runtime.
|
|
155
|
-
- f2f360c: Continue to clean up the generator runtime internals.
|
|
156
|
-
- Updated dependencies [23a24ae]
|
|
157
|
-
- Updated dependencies [f2f360c]
|
|
158
|
-
- liminal-schema@0.0.3
|
|
159
|
-
- liminal-util@0.0.4
|
|
160
|
-
|
|
161
|
-
## 0.5.7
|
|
162
|
-
|
|
163
|
-
### Patch Changes
|
|
164
|
-
|
|
165
|
-
- a56f121: Re-flatten events. Make fiber info available in event handler via this.
|
|
166
|
-
- Updated dependencies [a56f121]
|
|
167
|
-
- liminal-util@0.0.3
|
|
168
|
-
|
|
169
|
-
## 0.5.6
|
|
170
|
-
|
|
171
|
-
### Patch Changes
|
|
172
|
-
|
|
173
|
-
- f79205e: Include fiber information in the event type supplied to user-specified handlers. Continue reworking runtime implementation.
|
|
174
|
-
|
|
175
|
-
## 0.5.5
|
|
176
|
-
|
|
177
|
-
### Patch Changes
|
|
178
|
-
|
|
179
|
-
- 43afd27: Fixing misc. bugs and refactoring context management.
|
|
180
|
-
|
|
181
|
-
## 0.5.4
|
|
182
|
-
|
|
183
|
-
### Patch Changes
|
|
184
|
-
|
|
185
|
-
- 284adab: Reintroduce AI SDK adapter and begin simplifying runic execution.
|
|
186
|
-
- Updated dependencies [284adab]
|
|
187
|
-
- liminal-schema@0.0.2
|
|
188
|
-
- liminal-util@0.0.2
|
|
189
|
-
|
|
190
|
-
## 0.5.3
|
|
191
|
-
|
|
192
|
-
### Patch Changes
|
|
193
|
-
|
|
194
|
-
- 2d3a717: Complete rewrite of Liminal. Includes new packages for various integrations.
|
|
195
|
-
- Updated dependencies [2d3a717]
|
|
196
|
-
- Updated dependencies [ff04b9f]
|
|
197
|
-
- liminal-schema@0.0.1
|
|
198
|
-
- liminal-util@0.0.1
|
|
199
|
-
|
|
200
|
-
## 0.5.2
|
|
201
|
-
|
|
202
|
-
### Patch Changes
|
|
203
|
-
|
|
204
|
-
- de74823: Various API changes, such as infer as a callable object (the object of which implements Symbol.iterator and yields the actual action). Introduced initial "section" action. Also created an adapter for Ollama.
|
|
205
|
-
|
|
206
|
-
## 0.5.1
|
|
207
|
-
|
|
208
|
-
### Patch Changes
|
|
209
|
-
|
|
210
|
-
- 96339de: Fixing continuous publishing. No other changes contained in this release.
|
|
211
|
-
|
|
212
|
-
## 0.1.1
|
|
3
|
+
## 0.17.1
|
|
213
4
|
|
|
214
5
|
### Patch Changes
|
|
215
6
|
|
|
216
|
-
-
|
|
217
|
-
More publishes to come!
|
|
7
|
+
- 17342eb: This version marks a complete reimagining of Liminal. More information coming soon.
|