@shivaedev/agent-pi 0.1.0 → 0.3.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 (63) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +55 -1
  3. package/dist/PiOptions.d.ts +5 -0
  4. package/dist/PiOptions.d.ts.map +1 -0
  5. package/dist/PiOptions.js +2 -0
  6. package/dist/PiOptions.js.map +1 -0
  7. package/dist/adapters/deliver.d.ts +4 -0
  8. package/dist/adapters/deliver.d.ts.map +1 -0
  9. package/dist/adapters/deliver.js +19 -0
  10. package/dist/adapters/deliver.js.map +1 -0
  11. package/dist/adapters/effort.d.ts +5 -0
  12. package/dist/adapters/effort.d.ts.map +1 -0
  13. package/dist/adapters/effort.js +13 -0
  14. package/dist/adapters/effort.js.map +1 -0
  15. package/dist/adapters/failure.d.ts +6 -0
  16. package/dist/adapters/failure.d.ts.map +1 -0
  17. package/dist/adapters/failure.js +14 -0
  18. package/dist/adapters/failure.js.map +1 -0
  19. package/dist/adapters/listPiModels.d.ts +8 -0
  20. package/dist/adapters/listPiModels.d.ts.map +1 -0
  21. package/dist/adapters/listPiModels.js +11 -0
  22. package/dist/adapters/listPiModels.js.map +1 -0
  23. package/dist/adapters/mapping.d.ts +9 -0
  24. package/dist/adapters/mapping.d.ts.map +1 -0
  25. package/dist/adapters/mapping.js +44 -0
  26. package/dist/adapters/mapping.js.map +1 -0
  27. package/dist/adapters/messageEvents.d.ts +9 -0
  28. package/dist/adapters/messageEvents.d.ts.map +1 -0
  29. package/dist/adapters/messageEvents.js +41 -0
  30. package/dist/adapters/messageEvents.js.map +1 -0
  31. package/dist/adapters/openSession.d.ts +323 -0
  32. package/dist/adapters/openSession.d.ts.map +1 -0
  33. package/dist/adapters/openSession.js +41 -0
  34. package/dist/adapters/openSession.js.map +1 -0
  35. package/dist/adapters/runtime.d.ts +24 -0
  36. package/dist/adapters/runtime.d.ts.map +1 -0
  37. package/dist/adapters/runtime.js +60 -0
  38. package/dist/adapters/runtime.js.map +1 -0
  39. package/dist/adapters/textOf.d.ts +3 -0
  40. package/dist/adapters/textOf.d.ts.map +1 -0
  41. package/dist/adapters/textOf.js +4 -0
  42. package/dist/adapters/textOf.js.map +1 -0
  43. package/dist/makeOperations.d.ts +668 -0
  44. package/dist/makeOperations.d.ts.map +1 -0
  45. package/dist/makeOperations.js +55 -0
  46. package/dist/makeOperations.js.map +1 -0
  47. package/dist/pi.d.ts +4 -1
  48. package/dist/pi.d.ts.map +1 -1
  49. package/dist/pi.js +39 -1
  50. package/dist/pi.js.map +1 -1
  51. package/package.json +29 -6
  52. package/src/PiOptions.ts +4 -0
  53. package/src/adapters/deliver.ts +24 -0
  54. package/src/adapters/effort.ts +15 -0
  55. package/src/adapters/failure.ts +14 -0
  56. package/src/adapters/listPiModels.ts +16 -0
  57. package/src/adapters/mapping.ts +50 -0
  58. package/src/adapters/messageEvents.ts +50 -0
  59. package/src/adapters/openSession.ts +46 -0
  60. package/src/adapters/runtime.ts +70 -0
  61. package/src/adapters/textOf.ts +5 -0
  62. package/src/makeOperations.ts +75 -0
  63. package/src/pi.ts +44 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 - 2026-11-04
4
+
5
+ ### Added
6
+
7
+ - Run embedded Pi sessions through the shared agent port, with preflight acceptance, file-backed resume, credential-aware models, distinct follow-up and steering delivery, scoped abort and disposal, and provider event conversion. Keep retrying runs open and preserve unmapped events as raw payloads. The Pi coding-agent SDK is an optional peer; image input and transcript reads remain unsupported.
8
+
9
+ ## 0.2.0 - 2026-11-04
10
+
11
+ ### Breaking
12
+
13
+ - TypeScript source exports now use `@shivaedev/source` instead of `source`. Replace `source` with `@shivaedev/source` in Node `--conditions`, TypeScript `customConditions`, and Vite/Vitest `resolve.conditions`. Bare `source` selects built JavaScript; no compatibility alias is provided.
14
+
3
15
  ## 0.1.0 - 2026-11-03
4
16
 
5
17
  ### Added
package/README.md CHANGED
@@ -1,3 +1,57 @@
1
1
  # @shivaedev/agent-pi
2
2
 
3
- Pi integration for Effect applications; no API yet.
3
+ Run Pi through the shared Effect agent port. Keep Pi's embedded sessions and provider events while applications use the same acceptance, input and lifecycle vocabulary across backends.
4
+
5
+ ## Pi sessions with an Effect lifetime
6
+
7
+ Submit work without waiting for the model to finish, then steer it through the negotiated agent facade. Closing the scope aborts and disposes the embedded session.
8
+
9
+ ```ts
10
+ import { Effect } from "effect";
11
+ import { requireFeatures } from "@shivaedev/agent/agent.ts";
12
+ import { pi } from "@shivaedev/agent-pi/pi.ts";
13
+
14
+ const work = Effect.gen(function* () {
15
+ const agent = yield* requireFeatures(["steering"]);
16
+ const receipt = yield* agent.start({
17
+ operationId: "search-field",
18
+ cwd: "/project",
19
+ input: { parts: [{ type: "text", text: "Add a search field" }] },
20
+ });
21
+ yield* agent.steering.steer(receipt, {
22
+ parts: [{ type: "text", text: "Keep the public API" }],
23
+ });
24
+ }).pipe(Effect.provide(pi()), Effect.scoped);
25
+ ```
26
+
27
+ ## Working with Pi
28
+
29
+ `pi(options?)` supplies the `Backend` Layer from `@shivaedev/agent/backend.ts`. Build it once for an application lifetime, and call `start` or `sessions.resume` inside a scope that lasts as long as the run. Each submission opens an embedded SDK session. A failed start releases that session before returning. Consume events until the execution outcome you need, then close the run scope. Pi owns its native session files; the application owns storing receipts, runner identity, logs, storage and wake policy.
30
+
31
+ ### Acceptance, events and recovery
32
+
33
+ A receipt acknowledges Pi's successful preflight, independently of its still-running prompt promise. A preflight refusal becomes `Rejected`. A prompt failure without preflight evidence becomes `UnknownAcceptance` with the submitted operation ID. Reconciliation returns remembered acceptance or refusal evidence within this backend instance; unknown IDs remain uncertain because Pi has no operation-ID lookup. An operation ID cannot be submitted twice to the same backend instance.
34
+
35
+ The version-one session reference contains the native session-file path. Save `receipt.session`, close its prior run scope, then pass it with a new start request to `agent.sessions.resume`; the adapter opens that file through `SessionManager.open`, preserving its native history. An unavailable file fails with `BackendUnavailable` before submission rather than silently creating replacement history. An unsupported reference version fails with `ProtocolFailure`. References do not contain application agent identities.
36
+
37
+ `events(receipt)` is a live, single-consumer stream buffered from subscription until the run scope closes. It includes the session-file reference, acknowledgement, execution state, settled user and assistant messages, thinking, tool calls and results, turn token deltas and separate provider USD cost deltas. Raw payloads preserve the complete provider event. Unmapped events, including retry and compaction notifications, remain `raw` events. An `agent_end` with `willRetry` does not report completion. Final assistant stop reasons distinguish completed, failed and interrupted runs; `agent_settled` stays raw and does not overwrite that outcome.
38
+
39
+ `inspect` reads execution evidence from the live session; after its scope closes it returns missing evidence. This is not a persisted run monitor or a transcript reader. Interruption calls Pi's abort; the scope finalizer unsubscribes, aborts and disposes even if abort fails.
40
+
41
+ ### Configuration and input
42
+
43
+ `PiOptions` in `@shivaedev/agent-pi/PiOptions.ts` accepts `skills` (additional skill directory paths), and `constrainedPrompt`. Ordinary sessions retain Pi's discovered resources and add those skills. A constrained prompt disables discovered context files, extensions, templates, skills and themes, and supplies an empty tool allowlist. Custom tool registration is not implemented by this adapter.
44
+
45
+ Start requests accept an optional `provider/model-id` and thinking effort. Model listing and selection use `ModelRuntime.getAvailable`, so only models available with credentials participate. With no model, the first available model is selected and listed as the default. Supported thinking levels are `off`, `minimal`, `low`, `medium`, `high`, `xhigh` and `max`; other values are rejected before opening a session.
46
+
47
+ `queuedInput.queue` uses Pi's `followUp` delivery; `steering.steer` uses `steer`. Text parts join with newlines. `interruption`, `sessions`, `queuedInput`, `steering` and `models` are supported. `imageInput` and `transcript` are explicitly unsupported and fail capability negotiation.
48
+
49
+ ### Installation and limits
50
+
51
+ ```sh
52
+ pnpm add @shivaedev/agent-pi @shivaedev/agent effect @earendil-works/pi-coding-agent
53
+ ```
54
+
55
+ The Pi coding-agent SDK is an optional peer loaded when a provider operation needs it. Importing the package or building its Layer does not require it. Without the peer, provider operations fail with `BackendUnavailable`. Installing this package does not install another backend's SDK.
56
+
57
+ The scripted SDK story kit proves adapter protocol wiring, acceptance, file-backed resume and disposal without a live model. It does not establish live provider integration; live smokes belong to the application's adoption.
@@ -0,0 +1,5 @@
1
+ export interface PiOptions {
2
+ readonly constrainedPrompt?: string;
3
+ readonly skills?: readonly string[];
4
+ }
5
+ //# sourceMappingURL=PiOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiOptions.d.ts","sourceRoot":"","sources":["../src/PiOptions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PiOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiOptions.js","sourceRoot":"","sources":["../src/PiOptions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { AgentSession } from "@earendil-works/pi-coding-agent";
2
+ import { Effect } from "effect";
3
+ export declare function deliver(session: AgentSession, text: string, delivery: "followUp" | "steer"): Effect.Effect<void, import("@shivaedev/agent/failures.ts").BackendUnavailable | import("@shivaedev/agent/failures.ts").ProtocolFailure | import("@shivaedev/agent/failures.ts").Rejected | import("@shivaedev/agent/failures.ts").UnknownAcceptance, never>;
4
+ //# sourceMappingURL=deliver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../src/adapters/deliver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,wBAAgB,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,+PAkB1F"}
@@ -0,0 +1,19 @@
1
+ import { Effect } from "effect";
2
+ import { protocolFailure, rejected } from "#adapters/failure.ts";
3
+ export function deliver(session, text, delivery) {
4
+ return Effect.callback((resume) => {
5
+ let preflight;
6
+ session
7
+ .prompt(text, {
8
+ preflightResult: (ok) => {
9
+ preflight = ok;
10
+ if (ok) {
11
+ resume(Effect.void);
12
+ }
13
+ },
14
+ streamingBehavior: delivery,
15
+ })
16
+ .then(() => resume(Effect.void), (error) => resume(Effect.fail(preflight === false ? rejected(error) : protocolFailure(error))));
17
+ });
18
+ }
19
+ //# sourceMappingURL=deliver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliver.js","sourceRoot":"","sources":["../../src/adapters/deliver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,UAAU,OAAO,CAAC,OAAqB,EAAE,IAAY,EAAE,QAA8B;IAC1F,OAAO,MAAM,CAAC,QAAQ,CAAuB,CAAC,MAAM,EAAE,EAAE;QACvD,IAAI,SAA8B,CAAC;QACnC,OAAO;aACL,MAAM,CAAC,IAAI,EAAE;YACb,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE;gBACvB,SAAS,GAAG,EAAE,CAAC;gBACf,IAAI,EAAE,EAAE,CAAC;oBACR,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;YACF,CAAC;YACD,iBAAiB,EAAE,QAAQ;SAC3B,CAAC;aACD,IAAI,CACJ,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EACzB,CAAC,KAAc,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CACvG,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Effect } from "effect";
2
+ export declare const piEfforts: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
3
+ export type PiThinkingLevel = (typeof piEfforts)[number];
4
+ export declare function thinkingLevel(effort: string | undefined): Effect.Effect<undefined, never, never> | Effect.Effect<never, import("@shivaedev/agent/failures.ts").Rejected, never> | Effect.Effect<"high" | "low" | "max" | "medium" | "minimal" | "off" | "xhigh", never, never>;
5
+ //# sourceMappingURL=effort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effort.d.ts","sourceRoot":"","sources":["../../src/adapters/effort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,eAAO,MAAM,SAAS,YAAI,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAC9F,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,wNAQvD"}
@@ -0,0 +1,13 @@
1
+ import { Effect } from "effect";
2
+ import { rejected } from "#adapters/failure.ts";
3
+ export const piEfforts = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
4
+ export function thinkingLevel(effort) {
5
+ if (effort === undefined) {
6
+ return Effect.succeed(undefined);
7
+ }
8
+ const level = piEfforts.find((candidate) => candidate === effort);
9
+ return level === undefined
10
+ ? Effect.fail(rejected(`effort ${effort} is not a thinking level Pi offers; choose one of ${piEfforts.join(", ")}`))
11
+ : Effect.succeed(level);
12
+ }
13
+ //# sourceMappingURL=effort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effort.js","sourceRoot":"","sources":["../../src/adapters/effort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAG9F,MAAM,UAAU,aAAa,CAAC,MAA0B;IACvD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;IAClE,OAAO,KAAK,KAAK,SAAS;QACzB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,MAAM,qDAAqD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpH,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { BackendUnavailable, ProtocolFailure, Rejected } from "@shivaedev/agent/failures.ts";
2
+ export declare function describe(detail: unknown): string;
3
+ export declare function unavailable(detail: unknown): BackendUnavailable;
4
+ export declare function protocolFailure(detail: unknown): ProtocolFailure;
5
+ export declare function rejected(detail: unknown): Rejected;
6
+ //# sourceMappingURL=failure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../../src/adapters/failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7F,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEhD;AACD,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,sBAE1C;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,mBAE9C;AACD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,YAEvC"}
@@ -0,0 +1,14 @@
1
+ import { BackendUnavailable, ProtocolFailure, Rejected } from "@shivaedev/agent/failures.ts";
2
+ export function describe(detail) {
3
+ return detail instanceof Error ? detail.message : String(detail);
4
+ }
5
+ export function unavailable(detail) {
6
+ return new BackendUnavailable({ backend: "pi", message: describe(detail) });
7
+ }
8
+ export function protocolFailure(detail) {
9
+ return new ProtocolFailure({ backend: "pi", message: describe(detail) });
10
+ }
11
+ export function rejected(detail) {
12
+ return new Rejected({ backend: "pi", message: describe(detail) });
13
+ }
14
+ //# sourceMappingURL=failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["../../src/adapters/failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7F,MAAM,UAAU,QAAQ,CAAC,MAAe;IACvC,OAAO,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,MAAe;IAC1C,OAAO,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC7E,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,MAAe;IAC9C,OAAO,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,MAAe;IACvC,OAAO,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Effect } from "effect";
2
+ export declare const listPiModels: Effect.Effect<{
3
+ efforts: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
4
+ id: string;
5
+ isDefault: boolean;
6
+ name: string;
7
+ }[], import("@shivaedev/agent/failures.ts").BackendUnavailable, never>;
8
+ //# sourceMappingURL=listPiModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listPiModels.d.ts","sourceRoot":"","sources":["../../src/adapters/listPiModels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,eAAO,MAAM,YAAY;;;;;sEAUxB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Effect } from "effect";
2
+ import { piEfforts } from "#adapters/effort.ts";
3
+ import { unavailable } from "#adapters/failure.ts";
4
+ import { loadSdk } from "#adapters/runtime.ts";
5
+ export const listPiModels = loadSdk.pipe(Effect.flatMap((sdk) => Effect.tryPromise({ catch: unavailable, try: async () => (await sdk.ModelRuntime.create()).getAvailable() })), Effect.map((models) => models.map((model, index) => ({
6
+ efforts: piEfforts,
7
+ id: `${model.provider}/${model.id}`,
8
+ isDefault: index === 0,
9
+ name: `${model.name} (${model.provider})`,
10
+ }))));
11
+ //# sourceMappingURL=listPiModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listPiModels.js","sourceRoot":"","sources":["../../src/adapters/listPiModels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CACvC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,EACrI,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACrB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE;IACnC,SAAS,EAAE,KAAK,KAAK,CAAC;IACtB,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,GAAG;CACzC,CAAC,CAAC,CACH,CACD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { AgentSessionEvent } from "@earendil-works/pi-coding-agent";
2
+ import type { RunEvent } from "@shivaedev/agent/events.ts";
3
+ export declare function rawOf(kind: string, payload: unknown): {
4
+ kind: string;
5
+ payload: string;
6
+ source: string;
7
+ };
8
+ export declare function toAgentEvents(event: AgentSessionEvent): RunEvent[];
9
+ //# sourceMappingURL=mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../../src/adapters/mapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAG3D,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;;;;EAEnD;AAKD,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,QAAQ,EAAE,CA2BlE"}
@@ -0,0 +1,44 @@
1
+ import { Option, Schema } from "effect";
2
+ import { messageEvents } from "./messageEvents.js";
3
+ export function rawOf(kind, payload) {
4
+ return { kind, payload: JSON.stringify(payload), source: "pi" };
5
+ }
6
+ const decodeOutput = Schema.decodeUnknownOption(Schema.Struct({ content: Schema.Array(Schema.Struct({ text: Schema.optional(Schema.String), type: Schema.String })) }));
7
+ export function toAgentEvents(event) {
8
+ const raw = rawOf(event.type, event);
9
+ switch (event.type) {
10
+ case "agent_start":
11
+ return [{ raw, state: "running", type: "execution" }];
12
+ case "agent_end": {
13
+ if (event.willRetry) {
14
+ return [{ raw, type: "raw" }];
15
+ }
16
+ const ending = event.messages.filter((message) => message.role === "assistant").at(-1);
17
+ const state = endState(ending?.stopReason);
18
+ return [{ raw, state, type: "execution" }];
19
+ }
20
+ case "message_end":
21
+ return messageEvents(event.message, raw);
22
+ case "tool_execution_start":
23
+ return [{ input: JSON.stringify(event.args), name: event.toolName, raw, toolId: event.toolCallId, type: "tool.started" }];
24
+ case "tool_execution_end": {
25
+ const output = Option.match(decodeOutput(event.result), {
26
+ onNone: () => "",
27
+ onSome: ({ content }) => content.flatMap((part) => (part.type === "text" && part.text !== undefined ? [part.text] : [])).join("\n"),
28
+ });
29
+ return [{ ok: !event.isError, output, raw, toolId: event.toolCallId, type: "tool.completed" }];
30
+ }
31
+ default:
32
+ return [{ raw, type: "raw" }];
33
+ }
34
+ }
35
+ function endState(reason) {
36
+ if (reason === "aborted") {
37
+ return "interrupted";
38
+ }
39
+ if (reason === "error") {
40
+ return "failed";
41
+ }
42
+ return "completed";
43
+ }
44
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/adapters/mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AgentSessionEvent } from "@earendil-works/pi-coding-agent";
2
+ import type { RunEvent } from "@shivaedev/agent/events.ts";
3
+ type PiMessage = Extract<AgentSessionEvent, {
4
+ type: "message_end";
5
+ }>["message"];
6
+ type Raw = NonNullable<RunEvent["raw"]>;
7
+ export declare function messageEvents(message: PiMessage, raw: Raw): RunEvent[];
8
+ export {};
9
+ //# sourceMappingURL=messageEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageEvents.d.ts","sourceRoot":"","sources":["../../src/adapters/messageEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,KAAK,SAAS,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,SAAS,CAAC,CAAC;AAChF,KAAK,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAExC,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,EAAE,CA2CtE"}
@@ -0,0 +1,41 @@
1
+ export function messageEvents(message, raw) {
2
+ if (message.role === "user") {
3
+ const text = typeof message.content === "string" ? message.content : message.content.flatMap((part) => (part.type === "text" ? [part.text] : [])).join("\n");
4
+ return [{ parts: [{ text, type: "text" }], raw, role: "user", type: "message" }];
5
+ }
6
+ if (message.role !== "assistant") {
7
+ return [{ raw, type: "raw" }];
8
+ }
9
+ const events = [];
10
+ const thinking = message.content.flatMap((part) => (part.type === "thinking" ? [part.thinking] : [])).join("\n");
11
+ const text = message.content.flatMap((part) => (part.type === "text" ? [part.text] : [])).join("\n");
12
+ if (thinking !== "") {
13
+ events.push({ raw, text: thinking, type: "thinking" });
14
+ }
15
+ if (text !== "") {
16
+ events.push({ parts: [{ text, type: "text" }], raw, role: "agent", type: "message" });
17
+ }
18
+ const model = `${message.provider}/${message.model}`;
19
+ events.push({
20
+ cacheReadTokens: message.usage.cacheRead,
21
+ cacheWriteTokens: message.usage.cacheWrite,
22
+ inputTokens: message.usage.input,
23
+ model,
24
+ outputTokens: message.usage.output,
25
+ raw,
26
+ scope: "delta",
27
+ type: "usage",
28
+ unit: "turn",
29
+ }, {
30
+ amount: message.usage.cost.total,
31
+ currency: "USD",
32
+ model,
33
+ raw,
34
+ scope: "delta",
35
+ source: "provider",
36
+ type: "cost",
37
+ unit: "turn",
38
+ });
39
+ return events;
40
+ }
41
+ //# sourceMappingURL=messageEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageEvents.js","sourceRoot":"","sources":["../../src/adapters/messageEvents.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,aAAa,CAAC,OAAkB,EAAE,GAAQ;IACzD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,GACT,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjJ,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjH,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrG,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IACrD,MAAM,CAAC,IAAI,CACV;QACC,eAAe,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS;QACxC,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;QAC1C,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;QAChC,KAAK;QACL,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;QAClC,GAAG;QACH,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,MAAM;KACZ,EACD;QACC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;QAChC,QAAQ,EAAE,KAAK;QACf,KAAK;QACL,GAAG;QACH,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;KACZ,CACD,CAAC;IACF,OAAO,MAAM,CAAC;AACf,CAAC"}