@shivaedev/agent-claude-code 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 (148) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +71 -1
  3. package/dist/SessionConnection.d.ts +10 -0
  4. package/dist/SessionConnection.d.ts.map +1 -0
  5. package/dist/SessionConnection.js +2 -0
  6. package/dist/SessionConnection.js.map +1 -0
  7. package/dist/adapters/ClaudeProvider.d.ts +15 -0
  8. package/dist/adapters/ClaudeProvider.d.ts.map +1 -0
  9. package/dist/adapters/ClaudeProvider.js +6 -0
  10. package/dist/adapters/ClaudeProvider.js.map +1 -0
  11. package/dist/adapters/InputQueue.d.ts +11 -0
  12. package/dist/adapters/InputQueue.d.ts.map +1 -0
  13. package/dist/adapters/InputQueue.js +84 -0
  14. package/dist/adapters/InputQueue.js.map +1 -0
  15. package/dist/adapters/blocks.d.ts +7 -0
  16. package/dist/adapters/blocks.d.ts.map +1 -0
  17. package/dist/adapters/blocks.js +57 -0
  18. package/dist/adapters/blocks.js.map +1 -0
  19. package/dist/adapters/consumeSession.d.ts +8 -0
  20. package/dist/adapters/consumeSession.d.ts.map +1 -0
  21. package/dist/adapters/consumeSession.js +26 -0
  22. package/dist/adapters/consumeSession.js.map +1 -0
  23. package/dist/adapters/loadClaudeSdk.d.ts +4 -0
  24. package/dist/adapters/loadClaudeSdk.d.ts.map +1 -0
  25. package/dist/adapters/loadClaudeSdk.js +7 -0
  26. package/dist/adapters/loadClaudeSdk.js.map +1 -0
  27. package/dist/adapters/mirrorKeys.d.ts +10 -0
  28. package/dist/adapters/mirrorKeys.d.ts.map +1 -0
  29. package/dist/adapters/mirrorKeys.js +26 -0
  30. package/dist/adapters/mirrorKeys.js.map +1 -0
  31. package/dist/adapters/openSession.d.ts +23 -0
  32. package/dist/adapters/openSession.d.ts.map +1 -0
  33. package/dist/adapters/openSession.js +78 -0
  34. package/dist/adapters/openSession.js.map +1 -0
  35. package/dist/adapters/openSessionMapping.d.ts +9 -0
  36. package/dist/adapters/openSessionMapping.d.ts.map +1 -0
  37. package/dist/adapters/openSessionMapping.js +65 -0
  38. package/dist/adapters/openSessionMapping.js.map +1 -0
  39. package/dist/adapters/openSubsessions.d.ts +10 -0
  40. package/dist/adapters/openSubsessions.d.ts.map +1 -0
  41. package/dist/adapters/openSubsessions.js +45 -0
  42. package/dist/adapters/openSubsessions.js.map +1 -0
  43. package/dist/adapters/openTurnUsage.d.ts +9 -0
  44. package/dist/adapters/openTurnUsage.d.ts.map +1 -0
  45. package/dist/adapters/openTurnUsage.js +40 -0
  46. package/dist/adapters/openTurnUsage.js.map +1 -0
  47. package/dist/adapters/openWorkflowNodes.d.ts +13 -0
  48. package/dist/adapters/openWorkflowNodes.d.ts.map +1 -0
  49. package/dist/adapters/openWorkflowNodes.js +60 -0
  50. package/dist/adapters/openWorkflowNodes.js.map +1 -0
  51. package/dist/adapters/rateLimitEvent.d.ts +7 -0
  52. package/dist/adapters/rateLimitEvent.d.ts.map +1 -0
  53. package/dist/adapters/rateLimitEvent.js +27 -0
  54. package/dist/adapters/rateLimitEvent.js.map +1 -0
  55. package/dist/adapters/rawPayload.d.ts +5 -0
  56. package/dist/adapters/rawPayload.d.ts.map +1 -0
  57. package/dist/adapters/rawPayload.js +12 -0
  58. package/dist/adapters/rawPayload.js.map +1 -0
  59. package/dist/adapters/repairSession.d.ts +5 -0
  60. package/dist/adapters/repairSession.d.ts.map +1 -0
  61. package/dist/adapters/repairSession.js +17 -0
  62. package/dist/adapters/repairSession.js.map +1 -0
  63. package/dist/adapters/sessionLanes.d.ts +22 -0
  64. package/dist/adapters/sessionLanes.d.ts.map +1 -0
  65. package/dist/adapters/sessionLanes.js +100 -0
  66. package/dist/adapters/sessionLanes.js.map +1 -0
  67. package/dist/adapters/sessionOptions.d.ts +6 -0
  68. package/dist/adapters/sessionOptions.d.ts.map +1 -0
  69. package/dist/adapters/sessionOptions.js +30 -0
  70. package/dist/adapters/sessionOptions.js.map +1 -0
  71. package/dist/adapters/spilledPreview.d.ts +5 -0
  72. package/dist/adapters/spilledPreview.d.ts.map +1 -0
  73. package/dist/adapters/spilledPreview.js +22 -0
  74. package/dist/adapters/spilledPreview.js.map +1 -0
  75. package/dist/adapters/subsessionEndings.d.ts +23 -0
  76. package/dist/adapters/subsessionEndings.d.ts.map +1 -0
  77. package/dist/adapters/subsessionEndings.js +54 -0
  78. package/dist/adapters/subsessionEndings.js.map +1 -0
  79. package/dist/adapters/systemEvents.d.ts +9 -0
  80. package/dist/adapters/systemEvents.d.ts.map +1 -0
  81. package/dist/adapters/systemEvents.js +39 -0
  82. package/dist/adapters/systemEvents.js.map +1 -0
  83. package/dist/adapters/toolIdentity.d.ts +5 -0
  84. package/dist/adapters/toolIdentity.d.ts.map +1 -0
  85. package/dist/adapters/toolIdentity.js +10 -0
  86. package/dist/adapters/toolIdentity.js.map +1 -0
  87. package/dist/adapters/toolServer.d.ts +4 -0
  88. package/dist/adapters/toolServer.d.ts.map +1 -0
  89. package/dist/adapters/toolServer.js +30 -0
  90. package/dist/adapters/toolServer.js.map +1 -0
  91. package/dist/adapters/transcriptEvents.d.ts +5 -0
  92. package/dist/adapters/transcriptEvents.d.ts.map +1 -0
  93. package/dist/adapters/transcriptEvents.js +18 -0
  94. package/dist/adapters/transcriptEvents.js.map +1 -0
  95. package/dist/adapters/workflowAdoption.d.ts +13 -0
  96. package/dist/adapters/workflowAdoption.d.ts.map +1 -0
  97. package/dist/adapters/workflowAdoption.js +48 -0
  98. package/dist/adapters/workflowAdoption.js.map +1 -0
  99. package/dist/adapters/workflowIdentity.d.ts +22 -0
  100. package/dist/adapters/workflowIdentity.d.ts.map +1 -0
  101. package/dist/adapters/workflowIdentity.js +50 -0
  102. package/dist/adapters/workflowIdentity.js.map +1 -0
  103. package/dist/claudeCode.d.ts +6 -1
  104. package/dist/claudeCode.d.ts.map +1 -1
  105. package/dist/claudeCode.js +101 -1
  106. package/dist/claudeCode.js.map +1 -1
  107. package/dist/options.d.ts +17 -0
  108. package/dist/options.d.ts.map +1 -0
  109. package/dist/options.js +2 -0
  110. package/dist/options.js.map +1 -0
  111. package/dist/protocol.d.ts +7 -0
  112. package/dist/protocol.d.ts.map +1 -0
  113. package/dist/protocol.js +2 -0
  114. package/dist/protocol.js.map +1 -0
  115. package/dist/runState.d.ts +584 -0
  116. package/dist/runState.d.ts.map +1 -0
  117. package/dist/runState.js +52 -0
  118. package/dist/runState.js.map +1 -0
  119. package/package.json +34 -6
  120. package/src/SessionConnection.ts +10 -0
  121. package/src/adapters/ClaudeProvider.ts +16 -0
  122. package/src/adapters/InputQueue.ts +89 -0
  123. package/src/adapters/blocks.ts +63 -0
  124. package/src/adapters/consumeSession.ts +35 -0
  125. package/src/adapters/loadClaudeSdk.ts +6 -0
  126. package/src/adapters/mirrorKeys.ts +33 -0
  127. package/src/adapters/openSession.ts +102 -0
  128. package/src/adapters/openSessionMapping.ts +84 -0
  129. package/src/adapters/openSubsessions.ts +70 -0
  130. package/src/adapters/openTurnUsage.ts +52 -0
  131. package/src/adapters/openWorkflowNodes.ts +73 -0
  132. package/src/adapters/rateLimitEvent.ts +45 -0
  133. package/src/adapters/rawPayload.ts +13 -0
  134. package/src/adapters/repairSession.ts +20 -0
  135. package/src/adapters/sessionLanes.ts +127 -0
  136. package/src/adapters/sessionOptions.ts +42 -0
  137. package/src/adapters/spilledPreview.ts +24 -0
  138. package/src/adapters/subsessionEndings.ts +80 -0
  139. package/src/adapters/systemEvents.ts +60 -0
  140. package/src/adapters/toolIdentity.ts +12 -0
  141. package/src/adapters/toolServer.ts +31 -0
  142. package/src/adapters/transcriptEvents.ts +21 -0
  143. package/src/adapters/workflowAdoption.ts +58 -0
  144. package/src/adapters/workflowIdentity.ts +75 -0
  145. package/src/claudeCode.ts +117 -1
  146. package/src/options.ts +19 -0
  147. package/src/protocol.ts +9 -0
  148. package/src/runState.ts +70 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 - 2026-11-04
4
+
5
+ ### Added
6
+
7
+ - Implement the shared agent port for Claude Code with native session resume, distinct queued input and priority-now steering, interruption and scoped query cleanup.
8
+ - Bind application MCP tools and convert provider messages, child lineage, usage and cost into shared agent events.
9
+ - Reconcile stream, mirror and repair transcript lanes by provider UUID, declaring missing and spilled output as explicit gaps. Keep the Claude and MCP SDKs optional peers; image input and model discovery remain unsupported.
10
+
11
+ ## 0.2.0 - 2026-11-04
12
+
13
+ ### Breaking
14
+
15
+ - 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.
16
+
3
17
  ## 0.1.0 - 2026-11-03
4
18
 
5
19
  ### Added
package/README.md CHANGED
@@ -1,3 +1,73 @@
1
1
  # @shivaedev/agent-claude-code
2
2
 
3
- Claude Code integration for Effect applications; no API yet.
3
+ Run Claude Code through Platform's shared agent port. Keep native sessions, queued input and mid-turn steering while consuming the same Effect events as other agent backends.
4
+
5
+ ## Claude sessions in an Effect scope
6
+
7
+ An application can continue a native Claude session and steer its active work without translating provider messages itself.
8
+
9
+ ```ts
10
+ import { Effect } from "effect";
11
+ import { requireFeatures } from "@shivaedev/agent/agent.ts";
12
+ import { claudeCodeLayer } from "@shivaedev/agent-claude-code/claudeCode.ts";
13
+
14
+ const work = Effect.gen(function* () {
15
+ const agent = yield* requireFeatures(["sessions", "steering"]);
16
+ const receipt = yield* agent.start({
17
+ operationId: "build-search",
18
+ cwd: "/project",
19
+ input: { parts: [{ type: "text", text: "Build search" }] },
20
+ });
21
+ yield* agent.steering.steer(receipt, {
22
+ parts: [{ type: "text", text: "Keep the public API" }],
23
+ });
24
+ });
25
+
26
+ const program = work.pipe(Effect.scoped, Effect.provide(claudeCodeLayer()));
27
+ ```
28
+
29
+ ## Working with the adapter
30
+
31
+ `claudeCodeLayer(options)` provides the shared `Backend` service. Each start belongs to the caller's Effect scope, which closes the query and rejects input that Claude has not pulled. `start` acknowledges a native session identity; it does not wait for the turn to finish. Consume `agent.events(receipt)` while the scope is open. Native scope cancellation remains Effect interruption.
32
+
33
+ The adapter declares sessions, queued input, steering, interruption and transcript reads as supported. Image input and model discovery are unsupported. Pass a model directly in `StartRequest.model`; `effort` accepts `low`, `medium`, `high`, `xhigh` or `max`. Invalid effort is rejected before dispatch.
34
+
35
+ `queuedInput.queue` sends an ordinary SDK user message. `steering.steer` sends priority `now`. Both finish when the provider pulls that input; neither claims the model has acted on it. `interruption.interrupt` requests interruption through the active SDK query. A subsequent provider result determines the observed outcome.
36
+
37
+ ### Sessions and evidence
38
+
39
+ Keep the receipt's `session` reference to call `sessions.resume(session, request)` with a new operation ID. The reference contains Claude's native session ID, versioned by this adapter. Working directories are resolved to absolute paths for the SDK and transcript recovery. The mirror's load returns `null`, allowing Claude to resume from its own local transcript.
40
+
41
+ Receipts, event replay and transcript snapshots live only in the backend instance. `reconcile(operationId)` returns an observed acknowledgement or uncertainty; it never submits replacement work. `inspect` returns missing evidence for an operation this instance does not know. Persisting receipts, application agent identity, runner logs, wakeups and durable history belongs to the application.
42
+
43
+ `transcript.read` reconciles live SDK frames, session-store mirrors and subagent transcript repair into one event history. Provider UUIDs distinguish messages even when their text is identical. Workflow nodes retain their agent ID and spawning call, including identities learned after their first output. Repair runs after natural stream completion and reads provider transcripts; host teardown does not run a repair census.
44
+
45
+ Recovered missing output, unreadable recovery sources, spilled tool previews and a stream ending without a terminal turn result produce explicit `gap` events. A snapshot with a gap is `partial`. Spilled files are named, not read automatically. Unknown SDK frames remain `raw` events, and mapped events retain their provider payload. Usage and cost are separate events with per-turn deltas from the SDK's cumulative model totals; missing accounting stays absent.
46
+
47
+ ### Application tools
48
+
49
+ Configure MCP tool bindings once on the backend. A tool callback returns an Effect with its dependencies already provided. Tool call IDs are scoped to this MCP server instance; they are not application agent identities.
50
+
51
+ ```ts
52
+ import { Effect } from "effect";
53
+ import { claudeCodeLayer } from "@shivaedev/agent-claude-code/claudeCode.ts";
54
+
55
+ const backend = claudeCodeLayer({
56
+ tools: [
57
+ {
58
+ name: "lookup",
59
+ description: "Look up an item",
60
+ inputSchema: { properties: { name: { type: "string" } } },
61
+ call: (args, callId) => Effect.succeed({ text: "Found the item", ok: true }),
62
+ },
63
+ ],
64
+ });
65
+ ```
66
+
67
+ Bindings are served under `mcp__platform__<name>`. `ClaudeOptions` in `options.ts` also accepts an executable path, a local skills plugin path and a system prompt. A supplied system prompt disables the ambient settings and built-in tool set; configured MCP tools remain available. The default permission mode is Claude's `auto`; application approval-response integration is not provided by the shared port.
68
+
69
+ ### Installation and provider boundary
70
+
71
+ Install `@shivaedev/agent-claude-code`, `@shivaedev/agent`, `effect` and `@anthropic-ai/claude-agent-sdk`. Install `@modelcontextprotocol/sdk` when binding tools. Both SDKs are optional peers, with exact compatible pins in the package manifest. Importing the package does not load either SDK; the live Layer loads Claude's SDK and tool binding loads the MCP SDK.
72
+
73
+ `makeClaudeBackend(options)` constructs the same adapter from `ClaudeProvider` in `adapters/ClaudeProvider.ts`. That boundary speaks the SDK query, message and transcript protocols, enabling scripted-provider stories without replacing the adapter. These stories establish adapter behavior; live authentication, executable compatibility and provider smokes belong to application adoption.
@@ -0,0 +1,10 @@
1
+ import type { Effect, Stream } from "effect";
2
+ import type { RunEvent } from "@shivaedev/agent/events.ts";
3
+ import type { BackendUnavailable } from "@shivaedev/agent/failures.ts";
4
+ import type { Input } from "@shivaedev/agent/run.ts";
5
+ export interface SessionConnection {
6
+ readonly events: Stream.Stream<RunEvent, BackendUnavailable>;
7
+ readonly interrupt: Effect.Effect<void, BackendUnavailable>;
8
+ readonly queue: (input: Input, priority?: "now") => Effect.Effect<void, BackendUnavailable>;
9
+ }
10
+ //# sourceMappingURL=SessionConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionConnection.d.ts","sourceRoot":"","sources":["../src/SessionConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC5D,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;CAC5F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SessionConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionConnection.js","sourceRoot":"","sources":["../src/SessionConnection.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { getSubagentMessages, listSubagents, Options, Query, SDKMessage, SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
2
+ import { Context, Layer } from "effect";
3
+ declare const ClaudeProvider_base: Context.ServiceClass<ClaudeProvider, "@shivaedev/agent-claude-code/ClaudeProvider", {
4
+ readonly query: (request: {
5
+ readonly prompt: AsyncIterable<SDKUserMessage>;
6
+ readonly options: Options;
7
+ }) => AsyncIterable<SDKMessage> & Pick<Query, "interrupt" | "close">;
8
+ readonly getSubagentMessages: typeof getSubagentMessages;
9
+ readonly listSubagents: typeof listSubagents;
10
+ }>;
11
+ export declare class ClaudeProvider extends ClaudeProvider_base {
12
+ static layer: Layer.Layer<ClaudeProvider, import("@shivaedev/agent/failures.ts").BackendUnavailable, never>;
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=ClaudeProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeProvider.d.ts","sourceRoot":"","sources":["../../src/adapters/ClaudeProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;;oBAKtB,CAAC,OAAO,EAAE;QACzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;QAC/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;KAC1B,KAAK,aAAa,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;kCACtC,OAAO,mBAAmB;4BAChC,OAAO,aAAa;;AAR9C,qBAAa,cAAe,SAAQ,mBAUc;IACjD,MAAM,CAAC,KAAK,gGAAqC;CACjD"}
@@ -0,0 +1,6 @@
1
+ import { Context, Layer } from "effect";
2
+ import { loadClaudeSdk } from "#adapters/loadClaudeSdk.ts";
3
+ export class ClaudeProvider extends Context.Service()("@shivaedev/agent-claude-code/ClaudeProvider") {
4
+ static layer = Layer.effect(this, loadClaudeSdk);
5
+ }
6
+ //# sourceMappingURL=ClaudeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeProvider.js","sourceRoot":"","sources":["../../src/adapters/ClaudeProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAUhD,CAAC,6CAA6C,CAAC;IACjD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;CACjD"}
@@ -0,0 +1,11 @@
1
+ import type { SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
2
+ import { Effect } from "effect";
3
+ import { BackendUnavailable } from "@shivaedev/agent/failures.ts";
4
+ export declare class InputQueue {
5
+ #private;
6
+ constructor(handOff: (message: SDKUserMessage) => void);
7
+ push(message: SDKUserMessage): Effect.Effect<void, BackendUnavailable>;
8
+ close(): void;
9
+ stream(): AsyncIterable<SDKUserMessage>;
10
+ }
11
+ //# sourceMappingURL=InputQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputQueue.d.ts","sourceRoot":"","sources":["../../src/adapters/InputQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAY,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAalE,qBAAa,UAAU;;IAKtB,YAAY,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,EAErD;IAsBD,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAOrE;IACD,KAAK,IAAI,IAAI,CAUZ;IACD,MAAM,IAAI,aAAa,CAAC,cAAc,CAAC,CAwBtC;CACD"}
@@ -0,0 +1,84 @@
1
+ import { Deferred, Effect } from "effect";
2
+ import { BackendUnavailable } from "@shivaedev/agent/failures.ts";
3
+ function closedFailure() {
4
+ return new BackendUnavailable({
5
+ backend: "claude-code",
6
+ message: "session closed before delivery reached the provider",
7
+ });
8
+ }
9
+ // Claude accepts a user message when `query` pulls it from the prompt iterable.
10
+ export class InputQueue {
11
+ #buffer = [];
12
+ #handOff;
13
+ #pending = null;
14
+ #done = false;
15
+ constructor(handOff) {
16
+ this.#handOff = handOff;
17
+ }
18
+ #accept(input) {
19
+ this.#handOff(input.message);
20
+ Deferred.doneUnsafe(input.accepted, Effect.void);
21
+ }
22
+ #fail(input) {
23
+ Deferred.doneUnsafe(input.accepted, Effect.fail(closedFailure()));
24
+ }
25
+ #offer(input) {
26
+ if (this.#done) {
27
+ this.#fail(input);
28
+ return;
29
+ }
30
+ const pending = this.#pending;
31
+ if (pending !== null) {
32
+ this.#pending = null;
33
+ pending({ done: false, value: input.message });
34
+ this.#accept(input);
35
+ return;
36
+ }
37
+ this.#buffer.push(input);
38
+ }
39
+ push(message) {
40
+ const queue = this;
41
+ return Effect.gen(function* () {
42
+ const accepted = yield* Deferred.make();
43
+ yield* Effect.sync(() => queue.#offer({ accepted, message }));
44
+ yield* Deferred.await(accepted);
45
+ });
46
+ }
47
+ close() {
48
+ this.#done = true;
49
+ for (const input of this.#buffer.splice(0)) {
50
+ this.#fail(input);
51
+ }
52
+ const pending = this.#pending;
53
+ if (pending !== null) {
54
+ this.#pending = null;
55
+ pending({ done: true, value: undefined });
56
+ }
57
+ }
58
+ stream() {
59
+ return {
60
+ [Symbol.asyncIterator]: () => ({
61
+ next: () => {
62
+ const buffered = this.#buffer.shift();
63
+ if (buffered !== undefined) {
64
+ this.#accept(buffered);
65
+ return Promise.resolve({
66
+ done: false,
67
+ value: buffered.message,
68
+ });
69
+ }
70
+ if (this.#done) {
71
+ return Promise.resolve({
72
+ done: true,
73
+ value: undefined,
74
+ });
75
+ }
76
+ return new Promise((promiseResolve) => {
77
+ this.#pending = promiseResolve;
78
+ });
79
+ },
80
+ }),
81
+ };
82
+ }
83
+ }
84
+ //# sourceMappingURL=InputQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputQueue.js","sourceRoot":"","sources":["../../src/adapters/InputQueue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { RunEvent } from "@shivaedev/agent/events.ts";
2
+ import type { Origin, RawPayload } from "#protocol.ts";
3
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
4
+ export declare function contentBlocks(message: object): readonly Record<string, unknown>[];
5
+ export declare function textOf(content: unknown): string;
6
+ export declare function blockEvent(raw: RawPayload, role: "agent" | "user", block: Record<string, unknown>, origin: Origin | undefined): RunEvent | undefined;
7
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/adapters/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AACD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CASjF;AACD,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAW/C;AACD,wBAAgB,UAAU,CACzB,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,OAAO,GAAG,MAAM,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,QAAQ,GAAG,SAAS,CA6BtB"}
@@ -0,0 +1,57 @@
1
+ import { toolIdentity } from "#adapters/toolIdentity.ts";
2
+ export function isRecord(value) {
3
+ return typeof value === "object" && value !== null;
4
+ }
5
+ export function contentBlocks(message) {
6
+ if (!("message" in message && isRecord(message.message))) {
7
+ return [];
8
+ }
9
+ const content = message.message.content;
10
+ if (typeof content === "string") {
11
+ return [{ text: content, type: "text" }];
12
+ }
13
+ return Array.isArray(content) ? content.filter(isRecord) : [];
14
+ }
15
+ export function textOf(content) {
16
+ if (typeof content === "string") {
17
+ return content;
18
+ }
19
+ if (Array.isArray(content)) {
20
+ return content
21
+ .filter(isRecord)
22
+ .map((block) => (typeof block.text === "string" ? block.text : ""))
23
+ .join("");
24
+ }
25
+ return JSON.stringify(content);
26
+ }
27
+ export function blockEvent(raw, role, block, origin) {
28
+ const from = origin === undefined ? {} : { origin };
29
+ if (block.type === "text" && typeof block.text === "string") {
30
+ return { ...from, parts: [{ text: block.text, type: "text" }], raw, role, type: "message" };
31
+ }
32
+ if (block.type === "thinking" && typeof block.thinking === "string") {
33
+ return { ...from, raw, text: block.thinking, type: "thinking" };
34
+ }
35
+ if (block.type === "tool_use" && typeof block.id === "string" && typeof block.name === "string") {
36
+ return {
37
+ ...from,
38
+ input: JSON.stringify(block.input),
39
+ ...toolIdentity(block.name),
40
+ raw,
41
+ toolId: block.id,
42
+ type: "tool.started",
43
+ };
44
+ }
45
+ if (block.type === "tool_result" && typeof block.tool_use_id === "string") {
46
+ return {
47
+ ...from,
48
+ ok: block.is_error !== true,
49
+ output: textOf(block.content),
50
+ raw,
51
+ toolId: block.tool_use_id,
52
+ type: "tool.completed",
53
+ };
54
+ }
55
+ return undefined;
56
+ }
57
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/adapters/blocks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,UAAU,QAAQ,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,OAAe;IAC5C,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACxC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/D,CAAC;AACD,MAAM,UAAU,MAAM,CAAC,OAAgB;IACtC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,OAAO;aACZ,MAAM,CAAC,QAAQ,CAAC;aAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAClE,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AACD,MAAM,UAAU,UAAU,CACzB,GAAe,EACf,IAAsB,EACtB,KAA8B,EAC9B,MAA0B;IAE1B,MAAM,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IACpD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7D,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7F,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACrE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACjG,OAAO;YACN,GAAG,IAAI;YACP,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;YAClC,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3B,GAAG;YACH,MAAM,EAAE,KAAK,CAAC,EAAE;YAChB,IAAI,EAAE,cAAc;SACpB,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC3E,OAAO;YACN,GAAG,IAAI;YACP,EAAE,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI;YAC3B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YAC7B,GAAG;YACH,MAAM,EAAE,KAAK,CAAC,WAAW;YACzB,IAAI,EAAE,gBAAgB;SACtB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SDKMessage } from "@anthropic-ai/claude-agent-sdk";
2
+ import { Cause, Queue } from "effect";
3
+ import { BackendUnavailable } from "@shivaedev/agent/failures.ts";
4
+ import type { InputQueue } from "#adapters/InputQueue.ts";
5
+ import type { Delivery } from "#adapters/sessionLanes.ts";
6
+ import type { Repair } from "#adapters/workflowAdoption.ts";
7
+ export declare function consumeSession(live: AsyncIterable<SDKMessage>, input: InputQueue, queue: Queue.Queue<Delivery, BackendUnavailable | Cause.Done>, deliver: (delivery: Delivery) => void, repair: () => Promise<Repair | undefined>, stopped: () => boolean): Promise<void>;
8
+ //# sourceMappingURL=consumeSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumeSession.d.ts","sourceRoot":"","sources":["../../src/adapters/consumeSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE5D,wBAAsB,cAAc,CACnC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,EAC/B,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,EAC7D,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,EACrC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,EAAE,MAAM,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,26 @@
1
+ import { Cause, Queue } from "effect";
2
+ import { BackendUnavailable } from "@shivaedev/agent/failures.ts";
3
+ export async function consumeSession(live, input, queue, deliver, repair, stopped) {
4
+ try {
5
+ for await (const message of live) {
6
+ if (stopped()) {
7
+ break;
8
+ }
9
+ deliver({ kind: "frame", message });
10
+ }
11
+ const recovered = await repair();
12
+ if (!stopped() && recovered !== undefined) {
13
+ deliver({ kind: "repair", repair: recovered });
14
+ }
15
+ }
16
+ catch (error) {
17
+ if (!stopped()) {
18
+ Queue.failCauseUnsafe(queue, Cause.fail(new BackendUnavailable({ backend: "claude-code", message: String(error) })));
19
+ }
20
+ }
21
+ finally {
22
+ input.close();
23
+ Queue.endUnsafe(queue);
24
+ }
25
+ }
26
+ //# sourceMappingURL=consumeSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumeSession.js","sourceRoot":"","sources":["../../src/adapters/consumeSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAKlE,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,IAA+B,EAC/B,KAAiB,EACjB,KAA6D,EAC7D,OAAqC,EACrC,MAAyC,EACzC,OAAsB;IAEtB,IAAI,CAAC;QACJ,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;YAClC,IAAI,OAAO,EAAE,EAAE,CAAC;gBACf,MAAM;YACP,CAAC;YACD,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC3C,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAChB,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtH,CAAC;IACF,CAAC;YAAS,CAAC;QACV,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;AACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Effect } from "effect";
2
+ import { BackendUnavailable } from "@shivaedev/agent/failures.ts";
3
+ export declare const loadClaudeSdk: Effect.Effect<typeof import("@anthropic-ai/claude-agent-sdk"), BackendUnavailable, never>;
4
+ //# sourceMappingURL=loadClaudeSdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadClaudeSdk.d.ts","sourceRoot":"","sources":["../../src/adapters/loadClaudeSdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,eAAO,MAAM,aAAa,2FAGxB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Effect } from "effect";
2
+ import { BackendUnavailable } from "@shivaedev/agent/failures.ts";
3
+ export const loadClaudeSdk = Effect.tryPromise({
4
+ catch: (error) => new BackendUnavailable({ backend: "claude-code", message: String(error) }),
5
+ try: () => import("@anthropic-ai/claude-agent-sdk"),
6
+ });
7
+ //# sourceMappingURL=loadClaudeSdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadClaudeSdk.js","sourceRoot":"","sources":["../../src/adapters/loadClaudeSdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC;IAC9C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5F,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,gCAAgC,CAAC;CACnD,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { SessionKey } from "@anthropic-ai/claude-agent-sdk";
2
+ export interface WorkflowAgentRef {
3
+ readonly agentId: string;
4
+ readonly runId: string;
5
+ }
6
+ export declare function workflowAgentRef(key: SessionKey): WorkflowAgentRef | undefined;
7
+ export declare function subagentRef(key: SessionKey): string | undefined;
8
+ export declare function agentFileRef(agentId: string): string;
9
+ export declare function workflowRunRef(runId: string): string;
10
+ //# sourceMappingURL=mirrorKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirrorKeys.d.ts","sourceRoot":"","sources":["../../src/adapters/mirrorKeys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAOjE,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAID,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAQ9E;AACD,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAG/D;AACD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,26 @@
1
+ const SUBAGENTS = "subagents";
2
+ const WORKFLOWS = "workflows";
3
+ const AGENT = "agent-";
4
+ function agentIdOf(segment = "") {
5
+ return segment.startsWith(AGENT) ? segment.slice(AGENT.length) : undefined;
6
+ }
7
+ export function workflowAgentRef(key) {
8
+ const segments = key.subpath?.split("/") ?? [];
9
+ const [scope, kind, runId] = segments;
10
+ if (scope !== SUBAGENTS || kind !== WORKFLOWS || runId === undefined) {
11
+ return undefined;
12
+ }
13
+ const agentId = agentIdOf(segments.at(-1));
14
+ return agentId === undefined || segments.length < 4 ? undefined : { agentId, runId };
15
+ }
16
+ export function subagentRef(key) {
17
+ const segments = key.subpath?.split("/") ?? [];
18
+ return segments.length >= 2 && segments[0] === SUBAGENTS ? agentIdOf(segments.at(-1)) : undefined;
19
+ }
20
+ export function agentFileRef(agentId) {
21
+ return [SUBAGENTS, `${AGENT}${agentId}`].join("/");
22
+ }
23
+ export function workflowRunRef(runId) {
24
+ return [SUBAGENTS, WORKFLOWS, runId].join("/");
25
+ }
26
+ //# sourceMappingURL=mirrorKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirrorKeys.js","sourceRoot":"","sources":["../../src/adapters/mirrorKeys.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,WAAW,CAAC;AAC9B,MAAM,SAAS,GAAG,WAAW,CAAC;AAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC;AAOvB,SAAS,SAAS,CAAC,OAAO,GAAG,EAAE;IAC9B,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5E,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,GAAe;IAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACtF,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,GAAe;IAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACnG,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,OAAO,CAAC,SAAS,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,KAAa;IAC3C,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { EffortLevel } from "@anthropic-ai/claude-agent-sdk";
2
+ import { Effect, type Scope } from "effect";
3
+ import { BackendUnavailable } from "@shivaedev/agent/failures.ts";
4
+ import { ClaudeProvider } from "#adapters/ClaudeProvider.ts";
5
+ import type { ClaudeOptions } from "#options.ts";
6
+ import type { SessionConnection } from "#SessionConnection.ts";
7
+ export declare const openSession: (request: {
8
+ readonly cwd: string;
9
+ readonly effort?: string | undefined;
10
+ readonly input: {
11
+ readonly id?: string | undefined;
12
+ readonly parts: readonly [{
13
+ readonly text: string;
14
+ readonly type: "text";
15
+ }, ...{
16
+ readonly text: string;
17
+ readonly type: "text";
18
+ }[]];
19
+ };
20
+ readonly model?: string | undefined;
21
+ readonly operationId: string;
22
+ }, config: ClaudeOptions, effort: EffortLevel | undefined, resume: string | undefined) => Effect.Effect<SessionConnection, BackendUnavailable, ClaudeProvider | Scope.Scope>;
23
+ //# sourceMappingURL=openSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openSession.d.ts","sourceRoot":"","sources":["../../src/adapters/openSession.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAc,MAAM,EAAS,KAAK,KAAK,EAAU,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAO7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAM/D,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;4KAiFtB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { resolve } from "node:path";
3
+ import { Effect, Queue, Stream } from "effect";
4
+ import { BackendUnavailable } from "@shivaedev/agent/failures.ts";
5
+ import { ClaudeProvider } from "#adapters/ClaudeProvider.ts";
6
+ import { consumeSession } from "#adapters/consumeSession.ts";
7
+ import { InputQueue } from "#adapters/InputQueue.ts";
8
+ import { repairSession } from "#adapters/repairSession.ts";
9
+ import { openSessionLanes } from "#adapters/sessionLanes.ts";
10
+ import { sessionOptions } from "#adapters/sessionOptions.ts";
11
+ import { makeToolServer } from "#adapters/toolServer.ts";
12
+ function unavailable(error) {
13
+ return new BackendUnavailable({ backend: "claude-code", message: String(error) });
14
+ }
15
+ export const openSession = Effect.fn("ClaudeCode.openSession")(function* (request, config, effort, resume) {
16
+ const peer = yield* ClaudeProvider;
17
+ const deliveries = yield* Queue.unbounded();
18
+ const tools = config.tools ?? [];
19
+ const server = tools.length === 0
20
+ ? undefined
21
+ : yield* Effect.acquireRelease(Effect.tryPromise({ catch: unavailable, try: () => makeToolServer(tools) }), (instance) => Effect.promise(() => instance.close()));
22
+ return yield* Effect.acquireRelease(Effect.try({
23
+ catch: unavailable,
24
+ try: () => {
25
+ let nativeRef = resume;
26
+ let stopped = false;
27
+ function deliver(delivery) {
28
+ if (delivery.kind === "frame" && delivery.message.type === "system" && delivery.message.subtype === "init") {
29
+ nativeRef = delivery.message.session_id;
30
+ }
31
+ Queue.offerUnsafe(deliveries, delivery);
32
+ }
33
+ const inputIds = new Map();
34
+ const input = new InputQueue((message) => {
35
+ const inputId = message.uuid === undefined ? undefined : inputIds.get(message.uuid);
36
+ deliver({ kind: "frame", message, ...(inputId === undefined ? {} : { inputId }) });
37
+ });
38
+ const store = {
39
+ append: (key, entries) => {
40
+ deliver({ kind: "mirror", write: { entries, key } });
41
+ return Promise.resolve();
42
+ },
43
+ load: () => Promise.resolve(null),
44
+ };
45
+ const live = peer.query({
46
+ options: sessionOptions(request, config, store, effort, resume, server),
47
+ prompt: input.stream(),
48
+ });
49
+ void consumeSession(live, input, deliveries, deliver, () => stopped || nativeRef === undefined
50
+ ? Promise.resolve(undefined)
51
+ : Effect.runPromise(repairSession(nativeRef, resolve(request.cwd)).pipe(Effect.provideService(ClaudeProvider, peer))), () => stopped);
52
+ return {
53
+ close: () => {
54
+ stopped = true;
55
+ input.close();
56
+ live.close();
57
+ Queue.endUnsafe(deliveries);
58
+ },
59
+ events: Stream.fromQueue(deliveries).pipe(Stream.map(openSessionLanes().deliver), Stream.flattenIterable),
60
+ interrupt: Effect.tryPromise({ catch: unavailable, try: () => live.interrupt() }).pipe(Effect.asVoid),
61
+ queue: (value, priority) => {
62
+ const uuid = randomUUID();
63
+ if (value.id !== undefined) {
64
+ inputIds.set(uuid, value.id);
65
+ }
66
+ return input.push({
67
+ message: { content: value.parts.map((part) => part.text).join("\n"), role: "user" },
68
+ "parent_tool_use_id": null,
69
+ type: "user",
70
+ uuid,
71
+ ...(priority === undefined ? {} : { priority }),
72
+ });
73
+ },
74
+ };
75
+ },
76
+ }), (session) => Effect.sync(session.close));
77
+ });
78
+ //# sourceMappingURL=openSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openSession.js","sourceRoot":"","sources":["../../src/adapters/openSession.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SDKMessage } from "@anthropic-ai/claude-agent-sdk";
2
+ import type { RunEvent } from "@shivaedev/agent/events.ts";
3
+ interface SessionMapping {
4
+ readonly frame: (message: SDKMessage) => readonly RunEvent[];
5
+ readonly spawnerOf: (childRef: string) => string | undefined;
6
+ }
7
+ export declare function openSessionMapping(): SessionMapping;
8
+ export {};
9
+ //# sourceMappingURL=openSessionMapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openSessionMapping.d.ts","sourceRoot":"","sources":["../../src/adapters/openSessionMapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAiD3D,UAAU,cAAc;IACvB,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,SAAS,QAAQ,EAAE,CAAC;IAC7D,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7D;AACD,wBAAgB,kBAAkB,IAAI,cAAc,CA6BnD"}