@jpowersdev/effect-pi 0.1.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 (97) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/CONTRIBUTING.md +40 -0
  3. package/LICENSE +21 -0
  4. package/README.md +91 -0
  5. package/dist/ClusterSessions.d.ts +2 -0
  6. package/dist/ClusterSessions.d.ts.map +1 -0
  7. package/dist/ClusterSessions.js +2 -0
  8. package/dist/ClusterSessions.js.map +1 -0
  9. package/dist/LocalSessions.d.ts +2 -0
  10. package/dist/LocalSessions.d.ts.map +1 -0
  11. package/dist/LocalSessions.js +2 -0
  12. package/dist/LocalSessions.js.map +1 -0
  13. package/dist/ModelRuntime.d.ts +2 -0
  14. package/dist/ModelRuntime.d.ts.map +1 -0
  15. package/dist/ModelRuntime.js +2 -0
  16. package/dist/ModelRuntime.js.map +1 -0
  17. package/dist/ResourceLoader.d.ts +2 -0
  18. package/dist/ResourceLoader.d.ts.map +1 -0
  19. package/dist/ResourceLoader.js +2 -0
  20. package/dist/ResourceLoader.js.map +1 -0
  21. package/dist/Session.d.ts +3 -0
  22. package/dist/Session.d.ts.map +1 -0
  23. package/dist/Session.js +3 -0
  24. package/dist/Session.js.map +1 -0
  25. package/dist/Sessions.d.ts +14 -0
  26. package/dist/Sessions.d.ts.map +1 -0
  27. package/dist/Sessions.js +5 -0
  28. package/dist/Sessions.js.map +1 -0
  29. package/dist/index.d.ts +7 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +7 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/internal/ClusterSessions.d.ts +44 -0
  34. package/dist/internal/ClusterSessions.d.ts.map +1 -0
  35. package/dist/internal/ClusterSessions.js +72 -0
  36. package/dist/internal/ClusterSessions.js.map +1 -0
  37. package/dist/internal/LocalSessions.d.ts +19 -0
  38. package/dist/internal/LocalSessions.d.ts.map +1 -0
  39. package/dist/internal/LocalSessions.js +25 -0
  40. package/dist/internal/LocalSessions.js.map +1 -0
  41. package/dist/internal/ModelRuntime.d.ts +42 -0
  42. package/dist/internal/ModelRuntime.d.ts.map +1 -0
  43. package/dist/internal/ModelRuntime.js +66 -0
  44. package/dist/internal/ModelRuntime.js.map +1 -0
  45. package/dist/internal/Persistence.d.ts +12 -0
  46. package/dist/internal/Persistence.d.ts.map +1 -0
  47. package/dist/internal/Persistence.js +26 -0
  48. package/dist/internal/Persistence.js.map +1 -0
  49. package/dist/internal/Pi.d.ts +51 -0
  50. package/dist/internal/Pi.d.ts.map +1 -0
  51. package/dist/internal/Pi.js +258 -0
  52. package/dist/internal/Pi.js.map +1 -0
  53. package/dist/internal/Protocol.d.ts +41 -0
  54. package/dist/internal/Protocol.d.ts.map +1 -0
  55. package/dist/internal/Protocol.js +33 -0
  56. package/dist/internal/Protocol.js.map +1 -0
  57. package/dist/internal/ResourceLoader.d.ts +46 -0
  58. package/dist/internal/ResourceLoader.d.ts.map +1 -0
  59. package/dist/internal/ResourceLoader.js +77 -0
  60. package/dist/internal/ResourceLoader.js.map +1 -0
  61. package/dist/internal/Session.d.ts +82 -0
  62. package/dist/internal/Session.d.ts.map +1 -0
  63. package/dist/internal/Session.js +63 -0
  64. package/dist/internal/Session.js.map +1 -0
  65. package/dist-examples/cluster-session.d.ts +2 -0
  66. package/dist-examples/cluster-session.d.ts.map +1 -0
  67. package/dist-examples/cluster-session.js +77 -0
  68. package/dist-examples/cluster-session.js.map +1 -0
  69. package/dist-examples/local-session-pool.d.ts +2 -0
  70. package/dist-examples/local-session-pool.d.ts.map +1 -0
  71. package/dist-examples/local-session-pool.js +60 -0
  72. package/dist-examples/local-session-pool.js.map +1 -0
  73. package/dist-examples/single-session.d.ts +2 -0
  74. package/dist-examples/single-session.d.ts.map +1 -0
  75. package/dist-examples/single-session.js +49 -0
  76. package/dist-examples/single-session.js.map +1 -0
  77. package/docs/reference.md +248 -0
  78. package/examples/README.md +111 -0
  79. package/examples/cluster-session.ts +131 -0
  80. package/examples/local-session-pool.ts +107 -0
  81. package/examples/single-session.ts +85 -0
  82. package/package.json +62 -0
  83. package/src/ClusterSessions.ts +6 -0
  84. package/src/LocalSessions.ts +1 -0
  85. package/src/ModelRuntime.ts +10 -0
  86. package/src/ResourceLoader.ts +13 -0
  87. package/src/Session.ts +14 -0
  88. package/src/Sessions.ts +17 -0
  89. package/src/index.ts +6 -0
  90. package/src/internal/ClusterSessions.ts +126 -0
  91. package/src/internal/LocalSessions.ts +45 -0
  92. package/src/internal/ModelRuntime.ts +105 -0
  93. package/src/internal/Persistence.ts +40 -0
  94. package/src/internal/Pi.ts +346 -0
  95. package/src/internal/Protocol.ts +39 -0
  96. package/src/internal/ResourceLoader.ts +128 -0
  97. package/src/internal/Session.ts +109 -0
@@ -0,0 +1,66 @@
1
+ import * as Pi from "@earendil-works/pi-coding-agent";
2
+ import * as Config from "effect/Config";
3
+ import * as Context from "effect/Context";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Layer from "effect/Layer";
6
+ import * as Redacted from "effect/Redacted";
7
+ import * as Schema from "effect/Schema";
8
+ import * as ResourceLoader from "./ResourceLoader.js";
9
+ export class Error extends Schema.TaggedError()("ModelRuntimeError", {
10
+ operation: Schema.Literals(["create", "providers", "credentials", "model"]),
11
+ message: Schema.String
12
+ }) {
13
+ }
14
+ export class ModelRuntime extends Context.Service()("@jpowersdev/effect-pi/ModelRuntime") {
15
+ }
16
+ /** Capture the loading policy; SDK objects are owned by each live session's scope. */
17
+ export const make = Effect.fn("ModelRuntime.make")(function* (options = {}) {
18
+ const resources = yield* ResourceLoader.ResourceLoader;
19
+ const { model: selection, apiKeys, ...runtimeOptions } = options;
20
+ const sessionOptions = Effect.fn("ModelRuntime.sessionOptions")(function* (cwd) {
21
+ const loaded = yield* resources.load(cwd);
22
+ const modelRuntime = yield* Effect.tryPromise({
23
+ try: (signal) => Pi.ModelRuntime.create({ ...runtimeOptions, signal }),
24
+ // SDK credential errors can contain raw keys. Do not retain or stringify them.
25
+ catch: () => new Error({ operation: "create", message: "Unable to create Pi model runtime" })
26
+ });
27
+ // Extensions can define the selected model. Register their providers before
28
+ // lookup; leave Pi's pending queues intact for its own subsequent binding.
29
+ yield* Effect.try({
30
+ try: () => {
31
+ const runtime = loaded.resourceLoader.getExtensions().runtime;
32
+ for (const { name, config } of runtime.pendingProviderRegistrations) {
33
+ modelRuntime.registerProvider(name, config);
34
+ }
35
+ for (const { provider } of runtime.pendingNativeProviderRegistrations) {
36
+ modelRuntime.registerNativeProvider(provider);
37
+ }
38
+ },
39
+ catch: () => new Error({ operation: "providers", message: "Unable to register resource providers" })
40
+ });
41
+ for (const [provider, key] of Object.entries(apiKeys ?? {})) {
42
+ yield* Effect.tryPromise({
43
+ try: (signal) => modelRuntime.setRuntimeApiKey(provider, Redacted.value(key), { signal }),
44
+ catch: () => new Error({ operation: "credentials", message: "Unable to configure runtime credentials" })
45
+ });
46
+ }
47
+ if (selection === undefined)
48
+ return { ...loaded, modelRuntime };
49
+ const model = yield* Effect.try({
50
+ try: () => modelRuntime.getModel(selection.provider, selection.id),
51
+ catch: () => new Error({ operation: "model", message: "Unable to resolve the configured model" })
52
+ });
53
+ if (model === undefined) {
54
+ return yield* new Error({
55
+ operation: "model",
56
+ message: `Unknown model ${selection.provider}/${selection.id}`
57
+ });
58
+ }
59
+ return { ...loaded, modelRuntime, model };
60
+ });
61
+ return ModelRuntime.of({ sessionOptions });
62
+ });
63
+ export const layer = (options = {}) => Layer.effect(ModelRuntime, make(options));
64
+ /** Resolve configuration when the layer is built, using the active ConfigProvider. */
65
+ export const layerConfig = (options) => Layer.unwrap(Effect.map(Config.unwrap(options), layer));
66
+ //# sourceMappingURL=ModelRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelRuntime.js","sourceRoot":"","sources":["../../src/internal/ModelRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as KeyValueStore from "effect/unstable/persistence/KeyValueStore";
3
+ import * as Session from "./Session.js";
4
+ export interface Store {
5
+ readonly load: Effect.Effect<string | undefined, Session.Error>;
6
+ readonly save: (jsonl: string) => Effect.Effect<void, Session.Error>;
7
+ }
8
+ export declare const make: (id: string & import("effect/Brand").Brand<"@jpowersdev/effect-pi/SessionId">, keyPrefix?: any) => Effect.Effect<{
9
+ load: Effect.Effect<string | undefined, Session.Error, never>;
10
+ save: (jsonl: string) => Effect.Effect<void, Session.Error, never>;
11
+ }, never, KeyValueStore.KeyValueStore>;
12
+ //# sourceMappingURL=Persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Persistence.d.ts","sourceRoot":"","sources":["../../src/internal/Persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,aAAa,MAAM,2CAA2C,CAAA;AAE1E,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AASvC,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IAC/D,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;CACrE;AAED,eAAO,MAAM,IAAI;;;sCAsBf,CAAA"}
@@ -0,0 +1,26 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as KeyValueStore from "effect/unstable/persistence/KeyValueStore";
3
+ import * as Session from "./Session.js";
4
+ const message = (cause) => {
5
+ if (typeof cause === "object" && cause !== null && "message" in cause) {
6
+ return String(cause.message);
7
+ }
8
+ return String(cause);
9
+ };
10
+ export const make = Effect.fnUntraced(function* (id, keyPrefix = "effect-pi/sessions/") {
11
+ const backing = yield* KeyValueStore.KeyValueStore;
12
+ const store = KeyValueStore.prefix(backing, keyPrefix);
13
+ return {
14
+ load: store.get(id).pipe(Effect.mapError((cause) => new Session.Error({
15
+ sessionId: id,
16
+ operation: "load",
17
+ message: message(cause)
18
+ }))),
19
+ save: (jsonl) => store.set(id, jsonl).pipe(Effect.mapError((cause) => new Session.Error({
20
+ sessionId: id,
21
+ operation: "save",
22
+ message: message(cause)
23
+ })))
24
+ };
25
+ });
26
+ //# sourceMappingURL=Persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Persistence.js","sourceRoot":"","sources":["../../src/internal/Persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,aAAa,MAAM,2CAA2C,CAAA;AAE1E,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAU,EAAE;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACtE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC,CAAA;AAOD,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAC7C,EAAc,EACd,SAAS,GAAG,qBAAqB;IAEjC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,aAAa,CAAA;IAClD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACtD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CACtB,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;YAC3C,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;SACxB,CAAC,CAAC,CACJ;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,IAAI,CACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;YAC3C,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;SACxB,CAAC,CAAC,CACJ;KACc,CAAA;AACnB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,51 @@
1
+ import * as Pi from "@earendil-works/pi-coding-agent";
2
+ import * as Effect from "effect/Effect";
3
+ import * as FileSystem from "effect/FileSystem";
4
+ import * as Path from "effect/Path";
5
+ import * as Scope from "effect/Scope";
6
+ import * as Stream from "effect/Stream";
7
+ import type * as KeyValueStore from "effect/unstable/persistence/KeyValueStore";
8
+ import * as ModelRuntime from "./ModelRuntime.js";
9
+ import * as Session from "./Session.js";
10
+ type SdkSession = Pick<Pi.AgentSession, "messages" | "isStreaming" | "subscribe" | "prompt" | "dispose" | "abortRetry" | "abortCompaction" | "abortBranchSummary" | "abortBash"> & {
11
+ readonly agent: Pick<Pi.AgentSession["agent"], "abort">;
12
+ };
13
+ /** Internal SDK boundary for deterministic lifecycle tests. */
14
+ export type CreateSession = (options: Pi.CreateAgentSessionOptions & {
15
+ readonly cwd: string;
16
+ readonly sessionManager: Pi.SessionManager;
17
+ }) => Promise<{
18
+ readonly session: SdkSession;
19
+ readonly modelFallbackMessage?: string;
20
+ readonly extensionsResult?: Pick<Pi.CreateAgentSessionResult["extensionsResult"], "errors">;
21
+ }>;
22
+ /** Internal constructor seam; all lifecycle and persistence behavior is shared with make. */
23
+ export declare const makeWith: (options: Session.MakeOptions, createSession: CreateSession, prepare?: ((cwd: string) => Effect.Effect<ModelRuntime.Binding, ModelRuntime.Error | import("./ResourceLoader.js").Error, Scope.Scope>) | undefined) => Effect.Effect<{
24
+ id: string & import("effect/Brand").Brand<"@jpowersdev/effect-pi/SessionId">;
25
+ snapshot: Effect.Effect<Session.Snapshot, Session.Error, never>;
26
+ prompt: (text: string) => Effect.Effect<Session.PromptResult, Session.Error>;
27
+ abort: Effect.Effect<void, Session.Error, never>;
28
+ events: Stream.Stream<{
29
+ readonly _tag: "Status";
30
+ readonly sequence: number;
31
+ readonly status: "idle" | "streaming";
32
+ } | {
33
+ readonly _tag: "TextDelta";
34
+ readonly sequence: number;
35
+ readonly delta: string;
36
+ } | {
37
+ readonly _tag: "ToolStarted";
38
+ readonly sequence: number;
39
+ readonly toolName: string;
40
+ } | {
41
+ readonly _tag: "ToolFinished";
42
+ readonly sequence: number;
43
+ readonly toolName: string;
44
+ readonly isError: boolean;
45
+ }, Session.Error, never>;
46
+ jsonl: Effect.Effect<string, Session.Error, never>;
47
+ }, Session.Error, FileSystem.FileSystem | KeyValueStore.KeyValueStore | Path.Path | Scope.Scope>;
48
+ /** Construct one scoped Pi SDK session backed by its KeyValueStore document. */
49
+ export declare const make: (options: Session.MakeOptions) => Effect.Effect<Session.Session, Session.Error, FileSystem.FileSystem | KeyValueStore.KeyValueStore | Path.Path | Scope.Scope | ModelRuntime.ModelRuntime>;
50
+ export {};
51
+ //# sourceMappingURL=Pi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pi.d.ts","sourceRoot":"","sources":["../../src/internal/Pi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iCAAiC,CAAA;AACrD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAInC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,aAAa,MAAM,2CAA2C,CAAA;AAE/E,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC,KAAK,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,EACpC,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAC/D,YAAY,GAAG,iBAAiB,GAAG,oBAAoB,GAAG,WAAW,CACtE,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;CAAE,CAAA;AAE/D,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,yBAAyB,GAAG;IACnE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,CAAA;CAC3C,KAAK,OAAO,CAAC;IACZ,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,CAAA;CAC5F,CAAC,CAAA;AAmDF,6FAA6F;AAC7F,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;gGA4PnB,CAAA;AAEF,gFAAgF;AAChF,eAAO,MAAM,IAAI,EAAE,CACjB,OAAO,EAAE,OAAO,CAAC,WAAW,KACzB,MAAM,CAAC,MAAM,CAChB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,KAAK,EACb,UAAU,CAAC,UAAU,GAAG,aAAa,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,YAAY,CAExC,CAAA"}
@@ -0,0 +1,258 @@
1
+ import * as Pi from "@earendil-works/pi-coding-agent";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Exit from "effect/Exit";
4
+ import * as Fiber from "effect/Fiber";
5
+ import * as FileSystem from "effect/FileSystem";
6
+ import * as Path from "effect/Path";
7
+ import * as PubSub from "effect/PubSub";
8
+ import * as Queue from "effect/Queue";
9
+ import * as Schema from "effect/Schema";
10
+ import * as Scope from "effect/Scope";
11
+ import * as Semaphore from "effect/Semaphore";
12
+ import * as Stream from "effect/Stream";
13
+ import * as ModelRuntime from "./ModelRuntime.js";
14
+ import * as Persistence from "./Persistence.js";
15
+ import * as Session from "./Session.js";
16
+ const failureMessage = (cause) => {
17
+ if (typeof cause === "object" && cause !== null && "message" in cause) {
18
+ return String(cause.message);
19
+ }
20
+ return String(cause);
21
+ };
22
+ const sessionError = (id, operation, cause) => new Session.Error({ sessionId: id, operation, message: failureMessage(cause) });
23
+ const serialize = (id, manager, operation = "save") => Effect.gen(function* () {
24
+ const header = yield* Effect.try({
25
+ try: () => manager.getHeader(),
26
+ catch: (cause) => sessionError(id, operation, cause)
27
+ });
28
+ if (header === null)
29
+ return yield* sessionError(id, operation, "Pi session has no header");
30
+ return yield* Effect.try({
31
+ try: () => [header, ...manager.getEntries()].map((entry) => JSON.stringify(entry)).join("\n") + "\n",
32
+ catch: (cause) => sessionError(id, operation, cause)
33
+ });
34
+ });
35
+ const assistantText = (message) => {
36
+ if (message.role !== "assistant")
37
+ return "";
38
+ return message.content
39
+ .filter((part) => part.type === "text")
40
+ .map((part) => part.text)
41
+ .join("");
42
+ };
43
+ const snapshot = (id, session) => {
44
+ const lastAssistant = session.messages
45
+ .filter((message) => message.role === "assistant")
46
+ .at(-1);
47
+ return new Session.Snapshot({
48
+ id,
49
+ status: session.isStreaming ? "streaming" : "idle",
50
+ messageCount: session.messages.length,
51
+ lastAssistantText: lastAssistant === undefined ? "" : assistantText(lastAssistant)
52
+ });
53
+ };
54
+ /** Internal constructor seam; all lifecycle and persistence behavior is shared with make. */
55
+ export const makeWith = Effect.fn("Session.make")(function* (options, createSession, prepare) {
56
+ const id = options.id;
57
+ const fs = yield* FileSystem.FileSystem;
58
+ const path = yield* Path.Path;
59
+ const store = yield* Persistence.make(id, options.keyPrefix);
60
+ const persisted = yield* store.load;
61
+ const temporaryDirectory = yield* fs.makeTempDirectoryScoped({ prefix: "effect-pi-" }).pipe(Effect.mapError((cause) => sessionError(id, "make", cause)));
62
+ let manager;
63
+ if (persisted === undefined) {
64
+ manager = yield* Effect.try({
65
+ try: () => Pi.SessionManager.create(options.cwd, temporaryDirectory, { id }),
66
+ catch: (cause) => sessionError(id, "make", cause)
67
+ });
68
+ }
69
+ else {
70
+ // Reject torn JSON instead of allowing Pi's tolerant reader to silently skip
71
+ // it and overwrite the authoritative document with a shorter conversation.
72
+ // Entry shapes, versions, migrations, and tree semantics still belong to Pi.
73
+ yield* Effect.forEach(persisted.split("\n"), (line, index) => line.trim() === ""
74
+ ? Effect.void
75
+ : Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown))(line).pipe(Effect.mapError(() => sessionError(id, "load", `Invalid JSON at line ${index + 1}`))), { discard: true });
76
+ const sessionFile = path.join(temporaryDirectory, `${id}.jsonl`);
77
+ yield* fs.writeFileString(sessionFile, persisted).pipe(Effect.mapError((cause) => sessionError(id, "load", cause)));
78
+ manager = yield* Effect.try({
79
+ try: () => Pi.SessionManager.open(sessionFile, temporaryDirectory, options.cwd),
80
+ catch: (cause) => sessionError(id, "load", cause)
81
+ });
82
+ }
83
+ if (manager.getSessionId() !== id) {
84
+ return yield* sessionError(id, "load", `stored session id ${manager.getSessionId()} does not match ${id}`);
85
+ }
86
+ const piOptions = yield* Effect.try({
87
+ try: () => options.configure?.(id) ?? {},
88
+ catch: (cause) => sessionError(id, "make", cause)
89
+ });
90
+ const runtimeOptions = prepare === undefined ? {} : yield* prepare(options.cwd).pipe(Effect.mapError((cause) => sessionError(id, "make", cause)));
91
+ // Pi's factory has no cancellation API. Wait for acquisition before honoring
92
+ // interruption, so even a late result is disposed before its temp directory.
93
+ const result = yield* Effect.acquireRelease(Effect.tryPromise({
94
+ try: () => createSession({ ...piOptions, ...runtimeOptions, cwd: options.cwd, sessionManager: manager }),
95
+ catch: (cause) => sessionError(id, "make", cause)
96
+ }), (result) => Effect.try({
97
+ try: () => result.session.dispose(),
98
+ catch: (cause) => sessionError(id, "make", cause)
99
+ }).pipe(Effect.orDie));
100
+ const pi = result.session;
101
+ if (result.modelFallbackMessage !== undefined) {
102
+ yield* Effect.logWarning("Pi model selection", { sessionId: id, message: result.modelFallbackMessage });
103
+ }
104
+ for (const diagnostic of result.extensionsResult?.errors ?? []) {
105
+ yield* Effect.logWarning("Pi extension failed to load", { sessionId: id, ...diagnostic });
106
+ }
107
+ const events = yield* Effect.acquireRelease(PubSub.sliding(1024), PubSub.shutdown);
108
+ // A checkpoint serializes current state, not the state at notification time.
109
+ const checkpoints = yield* Effect.acquireRelease(Queue.dropping(1), Queue.shutdown);
110
+ const operations = yield* Effect.acquireRelease(Scope.make("parallel"), (scope) => Scope.close(scope, Exit.void));
111
+ const promptGate = yield* Semaphore.make(1);
112
+ const saveGate = yield* Semaphore.make(1);
113
+ let sequence = 0;
114
+ let closed = false;
115
+ let active;
116
+ const ensureOpen = (operation) => Effect.suspend(() => closed
117
+ ? sessionError(id, operation, "Session scope is closed")
118
+ : Effect.void);
119
+ // Don't interrupt an in-flight replacement of the authoritative document.
120
+ // Atomicity and crash durability still depend on the supplied store.
121
+ const save = saveGate.withPermits(1)(serialize(id, manager).pipe(Effect.flatMap(store.save), Effect.uninterruptible));
122
+ // Sliding publish is synchronous; publishUnsafe would silently use dropping
123
+ // behavior on overflow. This is the one synchronous SDK-to-Effect boundary.
124
+ const publish = (event) => { Effect.runSync(PubSub.publish(events, event)); };
125
+ yield* Effect.acquireRelease(Effect.try({
126
+ try: () => pi.subscribe((event) => {
127
+ switch (event.type) {
128
+ case "entry_appended":
129
+ case "session_info_changed":
130
+ case "thinking_level_changed":
131
+ case "turn_end":
132
+ case "compaction_end":
133
+ case "agent_settled":
134
+ Queue.offerUnsafe(checkpoints, undefined);
135
+ if (event.type === "agent_settled") {
136
+ publish({ _tag: "Status", sequence: sequence++, status: "idle" });
137
+ }
138
+ return;
139
+ case "agent_start":
140
+ publish({ _tag: "Status", sequence: sequence++, status: "streaming" });
141
+ return;
142
+ case "message_update":
143
+ if (event.assistantMessageEvent.type === "text_delta") {
144
+ publish({ _tag: "TextDelta", sequence: sequence++, delta: event.assistantMessageEvent.delta });
145
+ }
146
+ return;
147
+ case "tool_execution_start":
148
+ publish({ _tag: "ToolStarted", sequence: sequence++, toolName: event.toolName });
149
+ return;
150
+ case "tool_execution_end":
151
+ publish({ _tag: "ToolFinished", sequence: sequence++, toolName: event.toolName, isError: event.isError });
152
+ return;
153
+ default:
154
+ return;
155
+ }
156
+ }),
157
+ catch: (cause) => sessionError(id, "make", cause)
158
+ }), (unsubscribe) => Effect.try({
159
+ try: unsubscribe,
160
+ catch: (cause) => sessionError(id, "events", cause)
161
+ }).pipe(Effect.orDie));
162
+ const checkpointWorker = yield* Queue.take(checkpoints).pipe(Effect.andThen(save.pipe(Effect.tapError((cause) => Effect.logError("Unable to checkpoint Pi session", {
163
+ sessionId: id, cause: cause.message
164
+ })), Effect.ignore)), Effect.forever, Effect.forkScoped);
165
+ // Pi.abort() waits for idle and only signals the agent/retry path. Using the
166
+ // public synchronous signals also stops compaction/summaries/bash and lets us
167
+ // re-signal a later continuation without accumulating pending abort promises.
168
+ const abortSdk = Effect.forEach([
169
+ () => pi.abortRetry(),
170
+ () => pi.abortCompaction(),
171
+ () => pi.abortBranchSummary(),
172
+ () => pi.abortBash(),
173
+ () => pi.agent.abort()
174
+ ], (abort) => Effect.try({
175
+ try: abort,
176
+ catch: (cause) => sessionError(id, "abort", cause)
177
+ }).pipe(Effect.ignore), { discard: true });
178
+ const cancel = (wait) => Effect.raceFirst(wait.pipe(Effect.ignore, Effect.interruptible),
179
+ // Abort signals during async preflight may be a no-op. Keep requesting cancellation
180
+ // until the invocation settles, including any later model run or retry.
181
+ abortSdk.pipe(Effect.andThen(Effect.sleep("25 millis")), Effect.forever, Effect.interruptible));
182
+ const runPrompt = (text) => promptGate.withPermits(1)(Effect.uninterruptibleMask((restore) => Effect.gen(function* () {
183
+ yield* ensureOpen("prompt");
184
+ active = yield* Effect.fiber;
185
+ const firstEntry = manager.getEntries().length;
186
+ const invocation = Promise.resolve().then(() => pi.prompt(text));
187
+ const wait = Effect.tryPromise({
188
+ try: () => invocation,
189
+ catch: (cause) => sessionError(id, "prompt", cause)
190
+ });
191
+ const exit = yield* Effect.exit(restore(wait).pipe(Effect.onInterrupt(() => cancel(wait))));
192
+ yield* save;
193
+ yield* exit;
194
+ // Read newly appended entries, not the active context: compaction can shrink
195
+ // that context, and handled extension commands need not produce a response.
196
+ const entries = manager.getEntries().slice(firstEntry);
197
+ const messages = entries.flatMap((entry) => entry.type === "message" && entry.message.role === "assistant" ? [entry.message] : []);
198
+ const message = messages.at(-1);
199
+ if (message === undefined) {
200
+ return yield* sessionError(id, "prompt", "Pi returned no new assistant response");
201
+ }
202
+ if (message.stopReason === "error" || message.stopReason === "aborted") {
203
+ return yield* sessionError(id, "prompt", message.errorMessage ?? `Pi response ${message.stopReason}`);
204
+ }
205
+ const usage = entries.flatMap((entry) => {
206
+ if (entry.type === "message") {
207
+ const message = entry.message;
208
+ return (message.role === "assistant" || message.role === "toolResult") && message.usage !== undefined
209
+ ? [message.usage] : [];
210
+ }
211
+ return (entry.type === "compaction" || entry.type === "branch_summary") && entry.usage !== undefined
212
+ ? [entry.usage] : [];
213
+ });
214
+ return new Session.PromptResult({
215
+ snapshot: snapshot(id, pi),
216
+ text: assistantText(message),
217
+ stopReason: message.stopReason,
218
+ inputTokens: usage.reduce((sum, item) => sum + item.input, 0),
219
+ outputTokens: usage.reduce((sum, item) => sum + item.output, 0),
220
+ totalTokens: usage.reduce((sum, item) => sum + item.totalTokens, 0),
221
+ costUsd: usage.reduce((sum, item) => sum + item.cost.total, 0)
222
+ });
223
+ }).pipe(Effect.ensuring(Effect.sync(() => { active = undefined; })))));
224
+ const owned = (operation, work) => Effect.uninterruptibleMask((restore) => Effect.gen(function* () {
225
+ yield* ensureOpen(operation);
226
+ // Own work in the session scope as well as in its caller. Closing either
227
+ // scope must settle Pi before another owner can restore the document.
228
+ const fiber = yield* Effect.forkIn(work, operations);
229
+ return yield* restore(Fiber.join(fiber)).pipe(Effect.onInterrupt(() => Fiber.interrupt(fiber)));
230
+ }));
231
+ const prompt = Effect.fn("Session.prompt")((text) => owned("prompt", Schema.decodeUnknownEffect(Schema.NonEmptyString)(text).pipe(Effect.mapError((cause) => sessionError(id, "prompt", cause)), Effect.andThen(runPrompt(text)))));
232
+ const abort = owned("abort", Effect.uninterruptible(Effect.gen(function* () {
233
+ const running = active;
234
+ if (running !== undefined)
235
+ yield* Fiber.interrupt(running);
236
+ yield* save;
237
+ })));
238
+ yield* Effect.addFinalizer(() => Effect.gen(function* () {
239
+ closed = true;
240
+ yield* Scope.close(operations, Exit.void);
241
+ yield* Fiber.interrupt(checkpointWorker);
242
+ // Finalizer errors cannot inhabit the typed error channel. Surface a defect
243
+ // rather than reporting successful release after losing the last checkpoint.
244
+ yield* save.pipe(Effect.orDie);
245
+ }));
246
+ yield* save;
247
+ return {
248
+ id,
249
+ snapshot: ensureOpen("snapshot").pipe(Effect.andThen(Effect.sync(() => snapshot(id, pi)))),
250
+ prompt,
251
+ abort,
252
+ events: Stream.unwrap(ensureOpen("events").pipe(Effect.as(Stream.fromPubSub(events)))),
253
+ jsonl: ensureOpen("jsonl").pipe(Effect.andThen(serialize(id, manager, "jsonl")))
254
+ };
255
+ });
256
+ /** Construct one scoped Pi SDK session backed by its KeyValueStore document. */
257
+ export const make = (options) => Effect.flatMap(ModelRuntime.ModelRuntime, (runtime) => makeWith(options, Pi.createAgentSession, runtime.sessionOptions));
258
+ //# sourceMappingURL=Pi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pi.js","sourceRoot":"","sources":["../../src/internal/Pi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import * as Schema from "effect/Schema";
2
+ import * as Entity from "effect/unstable/cluster/Entity";
3
+ import * as Rpc from "effect/unstable/rpc/Rpc";
4
+ import * as Session from "./Session.js";
5
+ export declare const Snapshot: Rpc.Rpc<"Snapshot", Schema.Void, typeof Session.Snapshot, typeof Session.Error, never, never>;
6
+ export declare const Prompt: Rpc.Rpc<"Prompt", Schema.Struct<{
7
+ text: Schema.NonEmptyString;
8
+ }>, typeof Session.PromptResult, typeof Session.Error, never, never>;
9
+ export declare const Abort: Rpc.Rpc<"Abort", Schema.Void, Schema.Void, typeof Session.Error, never, never>;
10
+ export declare const Jsonl: Rpc.Rpc<"Jsonl", Schema.Void, Schema.String, typeof Session.Error, never, never>;
11
+ export declare const Events: Rpc.Rpc<"Events", Schema.Void, import("effect/unstable/rpc/RpcSchema").Stream<Schema.Union<readonly [Schema.TaggedStruct<"Status", {
12
+ readonly sequence: Schema.Natural;
13
+ readonly status: Schema.Literals<readonly ["idle", "streaming"]>;
14
+ }>, Schema.TaggedStruct<"TextDelta", {
15
+ readonly sequence: Schema.Natural;
16
+ readonly delta: Schema.String;
17
+ }>, Schema.TaggedStruct<"ToolStarted", {
18
+ readonly sequence: Schema.Natural;
19
+ readonly toolName: Schema.String;
20
+ }>, Schema.TaggedStruct<"ToolFinished", {
21
+ readonly sequence: Schema.Natural;
22
+ readonly toolName: Schema.String;
23
+ readonly isError: Schema.Boolean;
24
+ }>]>, typeof Session.Error>, Schema.Never, never, never>;
25
+ export declare const entity: Entity.Entity<"PiSession", Rpc.Rpc<"Abort", Schema.Void, Schema.Void, typeof Session.Error, never, never> | Rpc.Rpc<"Events", Schema.Void, import("effect/unstable/rpc/RpcSchema").Stream<Schema.Union<readonly [Schema.TaggedStruct<"Status", {
26
+ readonly sequence: Schema.Natural;
27
+ readonly status: Schema.Literals<readonly ["idle", "streaming"]>;
28
+ }>, Schema.TaggedStruct<"TextDelta", {
29
+ readonly sequence: Schema.Natural;
30
+ readonly delta: Schema.String;
31
+ }>, Schema.TaggedStruct<"ToolStarted", {
32
+ readonly sequence: Schema.Natural;
33
+ readonly toolName: Schema.String;
34
+ }>, Schema.TaggedStruct<"ToolFinished", {
35
+ readonly sequence: Schema.Natural;
36
+ readonly toolName: Schema.String;
37
+ readonly isError: Schema.Boolean;
38
+ }>]>, typeof Session.Error>, Schema.Never, never, never> | Rpc.Rpc<"Jsonl", Schema.Void, Schema.String, typeof Session.Error, never, never> | Rpc.Rpc<"Prompt", Schema.Struct<{
39
+ text: Schema.NonEmptyString;
40
+ }>, typeof Session.PromptResult, typeof Session.Error, never, never> | Rpc.Rpc<"Snapshot", Schema.Void, typeof Session.Snapshot, typeof Session.Error, never, never>>;
41
+ //# sourceMappingURL=Protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../src/internal/Protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAA;AACxD,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAE9C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC,eAAO,MAAM,QAAQ,+FAGnB,CAAA;AAEF,eAAO,MAAM,MAAM;;oEAIjB,CAAA;AAEF,eAAO,MAAM,KAAK,gFAEhB,CAAA;AAEF,eAAO,MAAM,KAAK,kFAGhB,CAAA;AAEF,eAAO,MAAM,MAAM;;;;;;;;;;;;;wDAIjB,CAAA;AAEF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;qKAMjB,CAAA"}
@@ -0,0 +1,33 @@
1
+ import * as Schema from "effect/Schema";
2
+ import * as Entity from "effect/unstable/cluster/Entity";
3
+ import * as Rpc from "effect/unstable/rpc/Rpc";
4
+ import * as Session from "./Session.js";
5
+ export const Snapshot = Rpc.make("Snapshot", {
6
+ success: Session.Snapshot,
7
+ error: Session.Error
8
+ });
9
+ export const Prompt = Rpc.make("Prompt", {
10
+ payload: { text: Schema.NonEmptyString },
11
+ success: Session.PromptResult,
12
+ error: Session.Error
13
+ });
14
+ export const Abort = Rpc.make("Abort", {
15
+ error: Session.Error
16
+ });
17
+ export const Jsonl = Rpc.make("Jsonl", {
18
+ success: Schema.String,
19
+ error: Session.Error
20
+ });
21
+ export const Events = Rpc.make("Events", {
22
+ success: Session.Event,
23
+ error: Session.Error,
24
+ stream: true
25
+ });
26
+ export const entity = Entity.make("PiSession", [
27
+ Snapshot,
28
+ Prompt,
29
+ Abort,
30
+ Jsonl,
31
+ Events
32
+ ]);
33
+ //# sourceMappingURL=Protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Protocol.js","sourceRoot":"","sources":["../../src/internal/Protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,gCAAgC,CAAA;AACxD,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAE9C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE;IAC3C,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,KAAK,EAAE,OAAO,CAAC,KAAK;CACrB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;IACvC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,cAAc,EAAE;IACxC,OAAO,EAAE,OAAO,CAAC,YAAY;IAC7B,KAAK,EAAE,OAAO,CAAC,KAAK;CACrB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;IACrC,KAAK,EAAE,OAAO,CAAC,KAAK;CACrB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,OAAO,CAAC,KAAK;CACrB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;IACvC,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,MAAM,EAAE,IAAI;CACb,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;IAC7C,QAAQ;IACR,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;CACP,CAAC,CAAA"}
@@ -0,0 +1,46 @@
1
+ import * as Pi from "@earendil-works/pi-coding-agent";
2
+ import * as Config from "effect/Config";
3
+ import * as Context from "effect/Context";
4
+ import * as Effect from "effect/Effect";
5
+ import * as Layer from "effect/Layer";
6
+ import * as Schema from "effect/Schema";
7
+ import type * as Scope from "effect/Scope";
8
+ export type Settings = NonNullable<Parameters<typeof Pi.SettingsManager.inMemory>[0]>;
9
+ type SdkOptions = ConstructorParameters<typeof Pi.DefaultResourceLoader>[0];
10
+ export interface Options extends Omit<SdkOptions, "cwd" | "settingsManager" | "agentDir"> {
11
+ /** Defaults to Pi's agent directory. Discovery executes trusted extensions. */
12
+ readonly agentDir?: string;
13
+ /** When supplied, use in-memory settings rather than discovering settings files. */
14
+ readonly settings?: Settings;
15
+ }
16
+ export interface EmptyOptions {
17
+ readonly systemPrompt?: string;
18
+ readonly settings?: Settings;
19
+ }
20
+ declare const Error_base: Schema.Class<Error, Schema.TaggedStruct<"ResourceLoaderError", {
21
+ readonly operation: Schema.Literals<readonly ["load", "release"]>;
22
+ readonly message: Schema.String;
23
+ }>, import("effect/Cause").YieldableError>;
24
+ export declare class Error extends Error_base {
25
+ }
26
+ /** SDK interoperability values. Each load owns a fresh, session-local extension runtime. */
27
+ export interface Loaded {
28
+ readonly resourceLoader: Pi.ResourceLoader;
29
+ readonly settingsManager: Pi.SettingsManager;
30
+ }
31
+ export interface Operations {
32
+ readonly load: (cwd: string) => Effect.Effect<Loaded, Error, Scope.Scope>;
33
+ }
34
+ declare const ResourceLoader_base: Context.ServiceClass<ResourceLoader, "@jpowersdev/effect-pi/ResourceLoader", Operations>;
35
+ export declare class ResourceLoader extends ResourceLoader_base {
36
+ }
37
+ /** Opt into Pi resource discovery. Prefer layerEmpty for isolated applications. */
38
+ export declare const layer: (options?: Options) => Layer.Layer<ResourceLoader>;
39
+ /** Resolve discovery options using the active ConfigProvider at layer build time. */
40
+ export declare const layerConfig: (options: Config.Wrap<Options>) => Layer.Layer<ResourceLoader, Config.ConfigError, never>;
41
+ /** Resolve isolated resource options using the active ConfigProvider at layer build time. */
42
+ export declare const layerEmptyConfig: (options: Config.Wrap<EmptyOptions>) => Layer.Layer<ResourceLoader, Config.ConfigError, never>;
43
+ /** No filesystem discovery, extensions, context files, or ambient settings. */
44
+ export declare const layerEmpty: (options?: EmptyOptions) => Layer.Layer<ResourceLoader>;
45
+ export {};
46
+ //# sourceMappingURL=ResourceLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceLoader.d.ts","sourceRoot":"","sources":["../../src/internal/ResourceLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iCAAiC,CAAA;AACrD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,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,KAAK,KAAK,MAAM,cAAc,CAAA;AAE1C,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAErF,KAAK,UAAU,GAAG,qBAAqB,CAAC,OAAO,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAA;AAE3E,MAAM,WAAW,OAAQ,SAAQ,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,iBAAiB,GAAG,UAAU,CAAC;IACvF,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAE1B,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAC7B;;;;;AAED,qBAAa,KAAM,SAAQ,UAGzB;CAAG;AAEL,4FAA4F;AAC5F,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,CAAA;IAC1C,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,eAAe,CAAA;CAC7C;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAC1E;;AAED,qBAAa,cAAe,SAAQ,mBAEnC;CAAG;AA0BJ,mFAAmF;AACnF,eAAO,MAAM,KAAK,aAAa,OAAO,KAAQ,KAAK,CAAC,KAAK,CAAC,cAAc,CAqBrE,CAAA;AAEH,qFAAqF;AACrF,eAAO,MAAM,WAAW,YAAa,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,2DACS,CAAA;AAElE,6FAA6F;AAC7F,eAAO,MAAM,gBAAgB,YAAa,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,2DACS,CAAA;AAE5E,+EAA+E;AAC/E,eAAO,MAAM,UAAU,aAAa,YAAY,KAAQ,KAAK,CAAC,KAAK,CAAC,cAAc,CA0B/E,CAAA"}