@koda-sl/baker-bridge 0.39.14 → 0.39.24-dev.b4473486

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 (79) hide show
  1. package/README.md +40 -11
  2. package/dist/cli.d.ts +1 -1
  3. package/dist/cli.js +1 -1
  4. package/dist/hono/agent-session.d.ts +67 -0
  5. package/dist/hono/agent-session.d.ts.map +1 -0
  6. package/dist/hono/agent-session.js +235 -0
  7. package/dist/hono/agent-session.js.map +1 -0
  8. package/dist/hono/agent-session.test.d.ts +2 -0
  9. package/dist/hono/agent-session.test.d.ts.map +1 -0
  10. package/dist/hono/agent-session.test.js +297 -0
  11. package/dist/hono/agent-session.test.js.map +1 -0
  12. package/dist/hono/agent.d.ts +19 -43
  13. package/dist/hono/agent.d.ts.map +1 -1
  14. package/dist/hono/agent.js +152 -481
  15. package/dist/hono/agent.js.map +1 -1
  16. package/dist/hono/agent.test.js +209 -59
  17. package/dist/hono/agent.test.js.map +1 -1
  18. package/dist/hono/attachments.d.ts +0 -9
  19. package/dist/hono/attachments.d.ts.map +1 -1
  20. package/dist/hono/attachments.js +35 -31
  21. package/dist/hono/attachments.js.map +1 -1
  22. package/dist/hono/bridge-job.d.ts +129 -0
  23. package/dist/hono/bridge-job.d.ts.map +1 -0
  24. package/dist/hono/bridge-job.js +399 -0
  25. package/dist/hono/bridge-job.js.map +1 -0
  26. package/dist/hono/bridge-job.test.d.ts +2 -0
  27. package/dist/hono/bridge-job.test.d.ts.map +1 -0
  28. package/dist/hono/bridge-job.test.js +563 -0
  29. package/dist/hono/bridge-job.test.js.map +1 -0
  30. package/dist/hono/convex.d.ts +2 -8
  31. package/dist/hono/convex.d.ts.map +1 -1
  32. package/dist/hono/convex.js +76 -185
  33. package/dist/hono/convex.js.map +1 -1
  34. package/dist/hono/relay.d.ts +101 -0
  35. package/dist/hono/relay.d.ts.map +1 -0
  36. package/dist/hono/relay.js +205 -0
  37. package/dist/hono/relay.js.map +1 -0
  38. package/dist/hono/relay.test.d.ts +2 -0
  39. package/dist/hono/relay.test.d.ts.map +1 -0
  40. package/dist/hono/relay.test.js +225 -0
  41. package/dist/hono/relay.test.js.map +1 -0
  42. package/dist/hono/repo-context.d.ts.map +1 -1
  43. package/dist/hono/repo-context.js +5 -5
  44. package/dist/hono/repo-context.js.map +1 -1
  45. package/dist/hono/runtime-files.d.ts +58 -0
  46. package/dist/hono/runtime-files.d.ts.map +1 -0
  47. package/dist/hono/runtime-files.js +82 -0
  48. package/dist/hono/runtime-files.js.map +1 -0
  49. package/dist/hono/runtime-files.test.d.ts +2 -0
  50. package/dist/hono/runtime-files.test.d.ts.map +1 -0
  51. package/dist/hono/runtime-files.test.js +43 -0
  52. package/dist/hono/runtime-files.test.js.map +1 -0
  53. package/dist/hono/sandbox-content.d.ts +43 -0
  54. package/dist/hono/sandbox-content.d.ts.map +1 -0
  55. package/dist/hono/sandbox-content.js +136 -0
  56. package/dist/hono/sandbox-content.js.map +1 -0
  57. package/dist/hono/sandbox-content.test.d.ts +2 -0
  58. package/dist/hono/sandbox-content.test.d.ts.map +1 -0
  59. package/dist/hono/sandbox-content.test.js +107 -0
  60. package/dist/hono/sandbox-content.test.js.map +1 -0
  61. package/dist/hono/server.d.ts +6 -1
  62. package/dist/hono/server.d.ts.map +1 -1
  63. package/dist/hono/server.js +45 -120
  64. package/dist/hono/server.js.map +1 -1
  65. package/dist/hono/server.test.js +2 -4
  66. package/dist/hono/server.test.js.map +1 -1
  67. package/dist/hono/session-continuity.d.ts +31 -0
  68. package/dist/hono/session-continuity.d.ts.map +1 -0
  69. package/dist/hono/session-continuity.integration.test.d.ts +2 -0
  70. package/dist/hono/session-continuity.integration.test.d.ts.map +1 -0
  71. package/dist/hono/session-continuity.integration.test.js +435 -0
  72. package/dist/hono/session-continuity.integration.test.js.map +1 -0
  73. package/dist/hono/session-continuity.js +91 -0
  74. package/dist/hono/session-continuity.js.map +1 -0
  75. package/dist/hono/session-store.d.ts +17 -3
  76. package/dist/hono/session-store.d.ts.map +1 -1
  77. package/dist/hono/session-store.js +56 -13
  78. package/dist/hono/session-store.js.map +1 -1
  79. package/package.json +6 -4
package/README.md CHANGED
@@ -112,9 +112,10 @@ Convex action ──POST /message/async──▶ Bridge AgentSession
112
112
  - **Stop button** flips the thread to `cancelled` via Convex first (UI is
113
113
  freed immediately) and best-effort POSTs `/message/abort` to kill the SDK.
114
114
  - **AskUserQuestion** posts `/api/chat/input-request` and blocks until the
115
- dashboard answers via Convex action → bridge `/answer-question`. Convex
116
- persists the answer before proxying it so a bridge restart does not erase the
117
- user's response.
115
+ dashboard answers via Convex action → bridge `/answer-question`, with a 15m
116
+ bridge-side timeout so unanswered questions do not leave runs hanging forever.
117
+ Convex persists the answer before proxying it so a bridge restart does not
118
+ erase the user's response.
118
119
  - **Turn Result changes and output guards** use Claude Agent SDK structured
119
120
  output. Convex sends the current accumulated `chat.changes` snapshot as
120
121
  context; the bridge asks the SDK for the full satisfied-artifact snapshot and
@@ -129,7 +130,7 @@ Convex action ──POST /message/async──▶ Bridge AgentSession
129
130
  Summary.
130
131
  - **Context source diagnostics** go to `/api/chat/context` so support can tell
131
132
  whether a turn used `local_resume`, `rehydrated_missing_session`,
132
- `rehydrated_invalid_resume`, or `rehydrated_repaired_tool_state`.
133
+ `rehydrated_invalid_resume`, or hit `rehydration_failed`.
133
134
 
134
135
  ## Attachment validation
135
136
 
@@ -159,8 +160,8 @@ oversized images still block the commit.
159
160
  ## Resilience
160
161
 
161
162
  - All Convex POSTs retry 3× with exponential backoff (1s, 2s, 4s).
162
- - Persistent failures of `/api/chat/event` and `/api/chat/complete` are
163
- appended to `~/.baker/relay-errors.jsonl` for post-mortem.
163
+ - Persistent failures of non-silent Convex callbacks are appended to
164
+ `~/.baker/relay-errors.jsonl` for post-mortem.
164
165
  - The SDK iterator is wrapped in a 30 min watchdog: if no event arrives for
165
166
  that long, the run is aborted and the thread is marked errored.
166
167
  - A 45s heartbeat keeps the Convex thread alive during long tool executions
@@ -169,9 +170,16 @@ oversized images still block the commit.
169
170
  `~/.baker/relay-errors.jsonl` with the thread and turn ids for diagnosis.
170
171
  - The session registry evicts entries idle for >24h to bound memory.
171
172
  - Convex dispatches include a bounded rendered current-thread history snapshot.
172
- The bridge uses the local SDK session id when valid, but falls back to this
173
- persisted transcript when the session file is missing or invalid; invalid
174
- resume is retried at most once before surfacing an error. Prior attachment
173
+ The bridge uses a local clean Claude session boundary when valid, but falls
174
+ back to this persisted transcript when the session boundary is missing or
175
+ invalid; invalid resume is retried at most once before surfacing an error.
176
+ Session ids observed before a non-error final SDK result are treated as
177
+ in-progress only and are never persisted as resumable state. Session-boundary
178
+ save/clear mutations are fenced to active runs and reconciled by generation,
179
+ so stale aborts or delayed cleanup from replaced runs cannot delete a newer
180
+ clean boundary. Session creation and replacement are single-flight per thread,
181
+ so concurrent dispatches cannot split continuity across duplicate runtime
182
+ sessions or let a stale watchdog abort the current replacement. Prior attachment
175
183
  metadata is rendered by Convex, capped, and counted against the same
176
184
  deterministic history budget.
177
185
  - Each dispatched turn carries an explicit `turnId`; bridge callbacks preserve
@@ -197,13 +205,34 @@ returned in the dispatch response besides 202.
197
205
 
198
206
  - **One session per thread** — `getOrCreateSession(threadId)` ensures every
199
207
  message on the same thread shares an `AgentSession`. Multi-turn context uses
200
- `~/.baker/sessions/<threadId>.json` as the fast path and Convex persisted
201
- current-thread history as the fallback when local continuity is unavailable.
208
+ `~/.baker/sessions/<threadId>.json` as the fast path only after Bridge has
209
+ persisted a v2 clean Claude session boundary. Convex persisted current-thread
210
+ history remains the fallback when local continuity is unavailable or legacy
211
+ `{ "sessionId": "..." }` files are encountered.
202
212
  - **Run-token cancellation** — each call to `sendAndStream` mints a Symbol; if
203
213
  the symbol changes (abort, replace) the run cleans up and exits without
204
214
  writing further. No globally-mutable abort flag.
205
215
  - **Single-writer to Convex** — there is no parallel WebSocket. Convex is the
206
216
  only place the UI reads state from, eliminating dual-write races.
217
+ - **Relay-owned callbacks** — stream preview buffering, callback ordering, heartbeat
218
+ delivery, and completion drain behavior live behind the Relay module so callback
219
+ behavior is tested at the Bridge-to-Convex seam.
220
+ - **Bridge Job execution** — one dispatched turn is executed by the Bridge Job
221
+ executor, which owns prompt preparation, SDK query/resume fallback, message
222
+ consumption, AskUserQuestion blocking, output guards, and final outcome
223
+ classification while `AgentSession` stays focused on thread continuity and
224
+ active-run replacement.
225
+ - **Agent Session coordination** — per-thread sessions own active Bridge Job
226
+ replacement/drain, abort propagation, pending AskUserQuestion answers, and
227
+ idle eviction while preserving the public `/message/*` and `/answer-question`
228
+ endpoint behavior.
229
+ - **Sandbox Content API** — local file-backed `/company`, `/brand`, `/knowledge`,
230
+ `/landings`, `/documents`, and `/flows` endpoints share one content module for
231
+ slug/path safety, markdown cleanup, flow encryption/decryption, and document
232
+ format lookup while keeping HTTP response shapes unchanged.
233
+ - **Bridge Local Runtime Files** — session continuity, attachments, Relay Error
234
+ logs, and sandbox content roots derive their filesystem locations from one
235
+ runtime-files module, keeping production paths stable while tests use temp roots.
207
236
 
208
237
  ## Development
209
238
 
package/dist/cli.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  declare const args: string[];
3
3
  declare const command: string;
4
- declare const VERSION = "0.39.12";
4
+ declare const VERSION = "0.39.24";
5
5
  declare function printUsage(): void;
6
6
  declare function main(): Promise<void>;
7
7
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.js CHANGED
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  const args = process.argv.slice(2);
4
4
  const command = args[0];
5
- const VERSION = "0.39.12";
5
+ const VERSION = "0.39.24";
6
6
  function printUsage() {
7
7
  console.error("Usage: baker-bridge <command>");
8
8
  console.error("");
@@ -0,0 +1,67 @@
1
+ import type { BridgeJob, BridgeJobControls, BridgeJobOutcome } from "./bridge-job.ts";
2
+ type AskUserAnswer = {
3
+ toolUseId: string;
4
+ answers: Record<string, string>;
5
+ };
6
+ export type AgentSessionExecutor = {
7
+ execute(job: BridgeJob, controls: BridgeJobControls): Promise<BridgeJobOutcome>;
8
+ };
9
+ type AgentSessionDependencies = {
10
+ createExecutor(): AgentSessionExecutor;
11
+ complete(outcome: BridgeJobOutcome, job: BridgeJob, runToken: symbol): Promise<void>;
12
+ heartbeat(job: BridgeJob): Promise<void>;
13
+ beforeReplace?(): Promise<void>;
14
+ replaceTimeoutMs?: number;
15
+ heartbeatIntervalMs?: number;
16
+ sdkWatchdogMs?: number;
17
+ watchdogIntervalMs?: number;
18
+ now?: () => number;
19
+ };
20
+ export declare class AgentSession {
21
+ readonly threadId: string;
22
+ private readonly dependencies;
23
+ private readonly pendingQuestions;
24
+ private activeRun;
25
+ private continuityRun;
26
+ private activeAbort;
27
+ private streamingPromise;
28
+ private latestStartSequence;
29
+ private readonly suppressedCompletionRuns;
30
+ lastUsedAt: number;
31
+ constructor(threadId: string, dependencies: AgentSessionDependencies);
32
+ start(job: BridgeJob): Promise<void>;
33
+ abort(): symbol | null;
34
+ private drainPreviousStreamForReplacement;
35
+ private previousStreamTimeout;
36
+ answer(input: AskUserAnswer): boolean;
37
+ isContinuityMutationCurrent(runToken: symbol): boolean;
38
+ markContinuityCommitted(runToken: symbol): void;
39
+ private abortForReplacement;
40
+ private abortRun;
41
+ private abortCurrentRun;
42
+ private run;
43
+ private clearRunState;
44
+ }
45
+ type AgentSessionRegistryDependencies<TSession extends {
46
+ lastUsedAt: number;
47
+ abort(): unknown;
48
+ }> = {
49
+ createSession(threadId: string): TSession | Promise<TSession>;
50
+ idleTtlMs: number;
51
+ now?: () => number;
52
+ };
53
+ export declare class AgentSessionRegistry<TSession extends {
54
+ lastUsedAt: number;
55
+ abort(): unknown;
56
+ } = AgentSession> {
57
+ private readonly sessions;
58
+ private readonly pendingSessions;
59
+ private readonly dependencies;
60
+ constructor(dependencies: AgentSessionRegistryDependencies<TSession>);
61
+ get(threadId: string): Promise<TSession>;
62
+ abort(threadId: string): boolean;
63
+ sweepIdle(now?: number): void;
64
+ has(threadId: string): boolean;
65
+ }
66
+ export {};
67
+ //# sourceMappingURL=agent-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../src/hono/agent-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ const DEFAULT_REPLACE_TIMEOUT_MS = 30_000;
2
+ const DEFAULT_HEARTBEAT_INTERVAL_MS = 45_000;
3
+ const DEFAULT_SDK_WATCHDOG_MS = 30 * 60 * 1000;
4
+ const DEFAULT_WATCHDOG_INTERVAL_MS = 30_000;
5
+ export class AgentSession {
6
+ threadId;
7
+ dependencies;
8
+ pendingQuestions = new Map();
9
+ activeRun = null;
10
+ continuityRun = null;
11
+ activeAbort = null;
12
+ streamingPromise = null;
13
+ latestStartSequence = 0;
14
+ suppressedCompletionRuns = new Set();
15
+ lastUsedAt;
16
+ constructor(threadId, dependencies) {
17
+ this.threadId = threadId;
18
+ this.dependencies = dependencies;
19
+ this.lastUsedAt = (dependencies.now ?? Date.now)();
20
+ }
21
+ async start(job) {
22
+ const startSequence = ++this.latestStartSequence;
23
+ if (this.streamingPromise) {
24
+ await this.drainPreviousStreamForReplacement();
25
+ if (startSequence !== this.latestStartSequence) {
26
+ return;
27
+ }
28
+ }
29
+ const runPromise = this.run(job);
30
+ this.streamingPromise = runPromise;
31
+ try {
32
+ await runPromise;
33
+ }
34
+ finally {
35
+ if (this.streamingPromise === runPromise) {
36
+ this.streamingPromise = null;
37
+ }
38
+ }
39
+ }
40
+ abort() {
41
+ return this.abortCurrentRun();
42
+ }
43
+ async drainPreviousStreamForReplacement() {
44
+ const previousPromise = this.streamingPromise;
45
+ if (!previousPromise) {
46
+ return;
47
+ }
48
+ const continuityRunToReplace = this.continuityRun;
49
+ const shouldClearContinuity = continuityRunToReplace !== null;
50
+ if (continuityRunToReplace) {
51
+ this.suppressedCompletionRuns.add(continuityRunToReplace);
52
+ }
53
+ this.abortForReplacement();
54
+ if (shouldClearContinuity) {
55
+ await this.dependencies.beforeReplace?.();
56
+ }
57
+ try {
58
+ await Promise.race([previousPromise, this.previousStreamTimeout()]);
59
+ }
60
+ catch (err) {
61
+ console.error(`[AgentSession] previous stream did not drain on thread ${this.threadId} — forcing reset:`, err instanceof Error ? err.message : err);
62
+ }
63
+ finally {
64
+ if (this.streamingPromise === previousPromise) {
65
+ this.streamingPromise = null;
66
+ }
67
+ if (shouldClearContinuity) {
68
+ await this.dependencies.beforeReplace?.();
69
+ }
70
+ }
71
+ }
72
+ previousStreamTimeout() {
73
+ return new Promise((_, reject) => setTimeout(() => reject(new Error("previous stream timed out")), this.dependencies.replaceTimeoutMs ?? DEFAULT_REPLACE_TIMEOUT_MS));
74
+ }
75
+ answer(input) {
76
+ const pending = this.pendingQuestions.get(input.toolUseId);
77
+ if (!pending) {
78
+ return false;
79
+ }
80
+ pending.resolve(input.answers);
81
+ this.pendingQuestions.delete(input.toolUseId);
82
+ return true;
83
+ }
84
+ isContinuityMutationCurrent(runToken) {
85
+ return this.continuityRun === runToken;
86
+ }
87
+ markContinuityCommitted(runToken) {
88
+ if (this.continuityRun === runToken) {
89
+ this.continuityRun = null;
90
+ }
91
+ }
92
+ abortForReplacement() {
93
+ const abortedRun = this.abortCurrentRun();
94
+ if (abortedRun) {
95
+ this.suppressedCompletionRuns.add(abortedRun);
96
+ }
97
+ return abortedRun;
98
+ }
99
+ abortRun(runToken) {
100
+ if (this.activeRun !== runToken) {
101
+ return null;
102
+ }
103
+ return this.abortCurrentRun();
104
+ }
105
+ abortCurrentRun() {
106
+ const abortedRun = this.activeRun;
107
+ this.activeRun = null;
108
+ if (this.activeAbort) {
109
+ this.activeAbort.abort();
110
+ this.activeAbort = null;
111
+ }
112
+ for (const [id, pending] of this.pendingQuestions) {
113
+ this.pendingQuestions.delete(id);
114
+ pending.reject(new Error("AskUserQuestion aborted"));
115
+ }
116
+ return abortedRun;
117
+ }
118
+ async run(job) {
119
+ const runToken = Symbol("agent-run");
120
+ this.activeRun = runToken;
121
+ this.continuityRun = runToken;
122
+ this.lastUsedAt = (this.dependencies.now ?? Date.now)();
123
+ const abortController = new AbortController();
124
+ this.activeAbort = abortController;
125
+ let lastEventAt = (this.dependencies.now ?? Date.now)();
126
+ const heartbeat = setInterval(() => void this.dependencies.heartbeat(job), this.dependencies.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS).unref();
127
+ const watchdog = setInterval(() => {
128
+ const now = (this.dependencies.now ?? Date.now)();
129
+ if (now - lastEventAt <= (this.dependencies.sdkWatchdogMs ?? DEFAULT_SDK_WATCHDOG_MS)) {
130
+ return;
131
+ }
132
+ console.error(`[AgentSession] watchdog: no SDK event for ${this.dependencies.sdkWatchdogMs ?? DEFAULT_SDK_WATCHDOG_MS}ms — aborting thread ${this.threadId}`);
133
+ this.abortRun(runToken);
134
+ }, this.dependencies.watchdogIntervalMs ?? DEFAULT_WATCHDOG_INTERVAL_MS).unref();
135
+ try {
136
+ let outcome;
137
+ try {
138
+ outcome = await this.dependencies.createExecutor().execute(job, {
139
+ runToken,
140
+ abortSignal: abortController.signal,
141
+ abortController,
142
+ pendingQuestions: this.pendingQuestions,
143
+ markEvent: () => {
144
+ lastEventAt = (this.dependencies.now ?? Date.now)();
145
+ this.lastUsedAt = lastEventAt;
146
+ },
147
+ isActive: () => this.activeRun === runToken,
148
+ });
149
+ }
150
+ catch (error) {
151
+ outcome =
152
+ this.activeRun === runToken
153
+ ? { kind: "errored", costUsd: 0, errors: [errorMessage(error)] }
154
+ : { kind: "cancelled", costUsd: 0 };
155
+ }
156
+ if (outcome.kind === "cancelled" || this.activeRun !== runToken) {
157
+ if (!this.suppressedCompletionRuns.has(runToken)) {
158
+ await this.dependencies.complete({ kind: "cancelled", costUsd: outcome.costUsd, model: outcome.model }, job, runToken);
159
+ }
160
+ return;
161
+ }
162
+ await this.dependencies.complete(outcome, job, runToken);
163
+ }
164
+ finally {
165
+ clearInterval(heartbeat);
166
+ clearInterval(watchdog);
167
+ this.suppressedCompletionRuns.delete(runToken);
168
+ this.clearRunState(runToken, abortController);
169
+ }
170
+ }
171
+ clearRunState(runToken, abortController) {
172
+ if (this.activeAbort === abortController) {
173
+ this.activeAbort = null;
174
+ }
175
+ if (this.activeRun === runToken) {
176
+ this.activeRun = null;
177
+ }
178
+ if (this.continuityRun === runToken) {
179
+ this.continuityRun = null;
180
+ }
181
+ }
182
+ }
183
+ export class AgentSessionRegistry {
184
+ sessions = new Map();
185
+ pendingSessions = new Map();
186
+ dependencies;
187
+ constructor(dependencies) {
188
+ this.dependencies = dependencies;
189
+ }
190
+ async get(threadId) {
191
+ const existing = this.sessions.get(threadId);
192
+ if (existing) {
193
+ existing.lastUsedAt = (this.dependencies.now ?? Date.now)();
194
+ return existing;
195
+ }
196
+ const pending = this.pendingSessions.get(threadId);
197
+ if (pending) {
198
+ const session = await pending;
199
+ session.lastUsedAt = (this.dependencies.now ?? Date.now)();
200
+ return session;
201
+ }
202
+ const pendingSession = Promise.resolve(this.dependencies.createSession(threadId));
203
+ this.pendingSessions.set(threadId, pendingSession);
204
+ try {
205
+ const session = await pendingSession;
206
+ this.sessions.set(threadId, session);
207
+ return session;
208
+ }
209
+ finally {
210
+ this.pendingSessions.delete(threadId);
211
+ }
212
+ }
213
+ abort(threadId) {
214
+ const session = this.sessions.get(threadId);
215
+ if (!session) {
216
+ return false;
217
+ }
218
+ return Boolean(session.abort());
219
+ }
220
+ sweepIdle(now = (this.dependencies.now ?? Date.now)()) {
221
+ const cutoff = now - this.dependencies.idleTtlMs;
222
+ for (const [threadId, session] of this.sessions) {
223
+ if (session.lastUsedAt < cutoff) {
224
+ this.sessions.delete(threadId);
225
+ }
226
+ }
227
+ }
228
+ has(threadId) {
229
+ return this.sessions.has(threadId);
230
+ }
231
+ }
232
+ function errorMessage(error) {
233
+ return error instanceof Error ? error.message : String(error);
234
+ }
235
+ //# sourceMappingURL=agent-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/hono/agent-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-session.test.d.ts","sourceRoot":"","sources":["../../src/hono/agent-session.test.ts"],"names":[],"mappings":""}