From cfdd7b98175d5a8814027f44b848371fc6d3641f Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 16:54:04 -0700 Subject: [PATCH 1/9] Add tests for ask_user ending the turn without a message_response gate ask_user's beforeToolExtension-based suspend/gate mechanism is retired in favor of posting the question and returning an end-turn instruction from run(); update its tests accordingly, retire the message_response-specific reactor suspend/resume regression harness (CL-7190), and add coverage that SignalKind now accepts only approval. --- packages/chat/src/agent-turns.test.ts | 8 +- packages/chat/test/test-support.ts | 8 +- .../test/turn-cancellation-dispatch.test.ts | 6 +- packages/interaction-tools/src/tool.test.ts | 113 +++----- vendor/intx/inference/src/reactor.test.ts | 260 ------------------ vendor/intx/inference/src/testing/fakes.ts | 209 -------------- vendor/intx/types/src/signals.test.ts | 20 ++ 7 files changed, 69 insertions(+), 555 deletions(-) delete mode 100644 vendor/intx/inference/src/reactor.test.ts delete mode 100644 vendor/intx/inference/src/testing/fakes.ts create mode 100644 vendor/intx/types/src/signals.test.ts diff --git a/packages/chat/src/agent-turns.test.ts b/packages/chat/src/agent-turns.test.ts index 2e0112d9e9..2c48149324 100644 --- a/packages/chat/src/agent-turns.test.ts +++ b/packages/chat/src/agent-turns.test.ts @@ -339,8 +339,8 @@ describe("createInMemoryAgentTurnStore", () => { // guarantee CL-7193 already gives a timed-out turn against a late // reply, now exercised for the cancel outcome specifically, since // cancellation is a NEW way to close a turn out from under work - // that is still in flight (a `message_response` gate answer, an - // ordinary reply) and has no code of its own to fall back on if + // that is still in flight (an approval gate answer, an ordinary + // reply) and has no code of its own to fall back on if // this compare-and-set ever regressed. test("a turn cancelled while a real reply is in flight cannot be reopened by that reply landing late", async () => { const store = createInMemoryAgentTurnStore(); @@ -354,8 +354,8 @@ describe("createInMemoryAgentTurnStore", () => { }); expect(cancelled?.status).toBe("cancelled"); - // The agent (or a message_response gate answer correlating to - // this turn) finishes its work anyway -- CL-7230's known ceiling + // The agent (or an approval gate answer correlating to this + // turn) finishes its work anyway -- CL-7230's known ceiling // is that nothing here can stop it -- and tries to close the same // turn as a normal completed reply. const lateReply = await store.finishTurn({ diff --git a/packages/chat/test/test-support.ts b/packages/chat/test/test-support.ts index 930a296492..2030da58a0 100644 --- a/packages/chat/test/test-support.ts +++ b/packages/chat/test/test-support.ts @@ -83,7 +83,6 @@ export function fakePlatform( principalId?: string; content: MailContent; fromWorkbenchId?: string; - correlationId?: string; }[]; launchInviteCalls: { tenantId: string; @@ -97,7 +96,6 @@ export function fakePlatform( principalId?: string; content: MailContent; fromWorkbenchId?: string; - correlationId?: string; }[] = []; const launchInviteCalls: { tenantId: string; @@ -178,11 +176,7 @@ export function fakePlatform( input.fromWorkbenchId !== undefined ? { ...withPrincipal, fromWorkbenchId: input.fromWorkbenchId } : withPrincipal; - sentMail.push( - input.correlationId !== undefined - ? { ...withFromWorkbench, correlationId: input.correlationId } - : withFromWorkbench, - ); + sentMail.push(withFromWorkbench); const id = `mail_${++mailCounter}`; const createdAt = new Date().toISOString(); const list = mailByWorkbench.get(input.workbenchId) ?? []; diff --git a/packages/chat/test/turn-cancellation-dispatch.test.ts b/packages/chat/test/turn-cancellation-dispatch.test.ts index eebd67c983..b277bb02ba 100644 --- a/packages/chat/test/turn-cancellation-dispatch.test.ts +++ b/packages/chat/test/turn-cancellation-dispatch.test.ts @@ -7,9 +7,9 @@ // still waiting, or `dispatchTurn`'s `sendMail` still in flight) -- // the cancellation registry's `AbortSignal` cuts it short directly. // 2. The turn's dispatch has already resolved and moved off our call -// stack entirely (the agent is generating, or parked on a -// `message_response` gate somewhere in the execution plane this -// package has no visibility into) -- `cancelWorkbenchTurn`'s sweep +// stack entirely (the agent is generating, or parked on an approval +// gate somewhere in the execution plane this package has no +// visibility into) -- `cancelWorkbenchTurn`'s sweep // is the only thing left that can settle the row, per CL-7230's // ceiling: it can record the outcome, not stop the underlying work. import { describe, expect, test } from "bun:test"; diff --git a/packages/interaction-tools/src/tool.test.ts b/packages/interaction-tools/src/tool.test.ts index 3ded2673eb..de4e016336 100644 --- a/packages/interaction-tools/src/tool.test.ts +++ b/packages/interaction-tools/src/tool.test.ts @@ -1,6 +1,4 @@ import { expect, test } from "bun:test"; -import type { ToolBundle } from "@intx/agent"; -import type { ToolCall } from "@intx/types/runtime"; import { ASK_USER_TOOL, interactionTools } from "./tool"; import type { AskUserEnv } from "./tool"; @@ -26,16 +24,6 @@ async function withFetch( } } -function beforeTool(bundle: ToolBundle, call: ToolCall) { - const extension = bundle.beforeToolExtension; - if (extension === undefined) { - throw new Error( - "interactionTools did not contribute a beforeToolExtension", - ); - } - return extension.beforeTool(call, {} as never, new AbortController().signal); -} - test("declares exactly ask_user, with no approval gate", () => { expect(interactionTools.definitions).toEqual([{ name: ASK_USER_TOOL }]); }); @@ -48,7 +36,12 @@ test("requires the sanctioned env keys", () => { ]); }); -test("ask_user posts a question block and suspends on a message_response gate", async () => { +test("interactionTools contributes no beforeToolExtension: ask_user never suspends", () => { + const bundle = interactionTools(testEnv()); + expect(bundle.beforeToolExtension).toBeUndefined(); +}); + +test("ask_user posts a question block and ends the turn with the answer arriving as the next message", async () => { let posted = false; const fetchImpl = (async () => { posted = true; @@ -67,25 +60,18 @@ test("ask_user posts a question block and suspends on a message_response gate", options: ["Staging", "Production"], }, }; - const before = Date.now(); - const decision = await withFetch(fetchImpl, () => beforeTool(bundle, call)); + const result = await withFetch(fetchImpl, () => + bundle.run(call, new AbortController().signal), + ); expect(posted).toBe(true); - if (decision.type !== "suspend") { - throw new Error(`expected a suspend decision, got ${decision.type}`); - } - expect(decision.gate.type).toBe("message_response"); - expect(decision.gate.timeoutAt).toBeGreaterThan(before); - expect(decision.pendingOp.kind).toBe("message_response"); - expect(decision.pendingOp.suspendedCall).toEqual(call); - expect(decision.pendingOp.correlationId).toBe(decision.gate.correlationId); - // Derived from the tool-call id (`q_`), not minted per attempt — - // the gate and the question card share one id, and a retry of the same - // call reuses it. - expect(decision.gate.correlationId).toMatch(/^q_[0-9a-f]{32}$/); + expect(result.isError).toBeFalsy(); + expect(result.callId).toBe("call_1"); + expect(String(result.content)).toMatch(/end this turn/i); + expect(String(result.content)).toMatch(/next inbound message/i); }); -test("retrying ask_user for the same call reuses the questionId so a crash between post and suspend cannot orphan a second card", async () => { +test("retrying ask_user for the same call reuses the questionId so a crash between post and return cannot orphan a second card", async () => { const postedQuestionIds: string[] = []; const fetchImpl = (async (_url: string | URL, init?: RequestInit) => { const body = JSON.parse(String(init?.body)) as { @@ -114,8 +100,12 @@ test("retrying ask_user for the same call reuses the questionId so a crash betwe }, }; - const first = await withFetch(fetchImpl, () => beforeTool(bundle, call)); - const second = await withFetch(fetchImpl, () => beforeTool(bundle, call)); + await withFetch(fetchImpl, () => + bundle.run(call, new AbortController().signal), + ); + await withFetch(fetchImpl, () => + bundle.run(call, new AbortController().signal), + ); expect(postedQuestionIds).toHaveLength(2); const reusedId = postedQuestionIds[0]; @@ -124,11 +114,6 @@ test("retrying ask_user for the same call reuses the questionId so a crash betwe } expect(postedQuestionIds[1]).toBe(reusedId); expect(reusedId).toMatch(/^q_[0-9a-f]{32}$/); - if (first.type !== "suspend" || second.type !== "suspend") { - throw new Error("expected both retries to suspend"); - } - expect(first.gate.correlationId).toBe(reusedId); - expect(second.gate.correlationId).toBe(reusedId); }); test("ask_user rejects fewer than 2 options before ever posting", async () => { @@ -139,19 +124,22 @@ test("ask_user rejects fewer than 2 options before ever posting", async () => { }) as unknown as typeof fetch; const bundle = interactionTools(testEnv()); - const decision = await withFetch(fetchImpl, () => - beforeTool(bundle, { - id: "call_1", - name: ASK_USER_TOOL, - arguments: { question: "Q?", options: ["only one"] }, - }), + const result = await withFetch(fetchImpl, () => + bundle.run( + { + id: "call_1", + name: ASK_USER_TOOL, + arguments: { question: "Q?", options: ["only one"] }, + }, + new AbortController().signal, + ), ); expect(posted).toBe(false); - expect(decision.type).toBe("block"); + expect(result.isError).toBe(true); }); -test("ask_user surfaces a no-own-channel failure as a blocked call, not a throw", async () => { +test("ask_user surfaces a no-own-channel failure as an error result, not a throw", async () => { const fetchImpl = (async () => new Response( JSON.stringify({ @@ -165,38 +153,19 @@ test("ask_user surfaces a no-own-channel failure as a blocked call, not a throw" )) as unknown as typeof fetch; const bundle = interactionTools(testEnv()); - const decision = await withFetch(fetchImpl, () => - beforeTool(bundle, { - id: "call_1", - name: ASK_USER_TOOL, - arguments: { question: "Q?", options: ["a", "b"] }, - }), + const result = await withFetch(fetchImpl, () => + bundle.run( + { + id: "call_1", + name: ASK_USER_TOOL, + arguments: { question: "Q?", options: ["a", "b"] }, + }, + new AbortController().signal, + ), ); - if (decision.type !== "block") { - throw new Error(`expected a block decision, got ${decision.type}`); - } - expect(decision.reason).toBe("no channel found"); -}); - -test("a call for another tool name is allowed through unsuspended", async () => { - const bundle = interactionTools(testEnv()); - const decision = await beforeTool(bundle, { - id: "call_1", - name: "some_other_tool", - arguments: {}, - }); - expect(decision).toEqual({ type: "allow" }); -}); - -test("run() is never the ask_user path: reaching it fails loud", async () => { - const bundle = interactionTools(testEnv()); - const result = await bundle.run( - { id: "call_1", name: ASK_USER_TOOL, arguments: {} }, - new AbortController().signal, - ); expect(result.isError).toBe(true); - expect(String(result.content)).toContain("beforeToolExtension"); + expect(result.content).toBe("no channel found"); }); test("an unknown tool name returns an honest error", async () => { diff --git a/vendor/intx/inference/src/reactor.test.ts b/vendor/intx/inference/src/reactor.test.ts deleted file mode 100644 index f4a7425f7b..0000000000 --- a/vendor/intx/inference/src/reactor.test.ts +++ /dev/null @@ -1,260 +0,0 @@ -// Regression coverage for the `message_response` gate mechanism CL-7190 -// introduces: a `BeforeToolExtension` returning `suspend` must park a tool -// call structurally — no `tool.done`, no re-inference — until a correlated -// inbound message resolves it, at which point exactly one re-inference -// follows. This is the reactor's own dispatch loop, driven for real (not a -// mocked decision shape), because the bug this guards against -// (CL-7190/CL-7191) lives in that loop: a mocked reactor passes on the -// broken code just as easily as the fixed one. -import { expect, test } from "bun:test"; -import type { - BeforeToolExtension, - ReactorCapabilities, - ReactorDirector, - ToolCall, -} from "@intx/types/runtime"; - -import { createReactor } from "./reactor"; -import type { ReactorEmittedEvent } from "./reactor"; -import { - assistantTurnWithToolCall, - buildInboundMessage, - createFakeInferenceSource, - createInMemoryContextStore, - createRecordingToolRunner, - createScriptedInferenceRunner, - createUnusedDependencies, -} from "./testing/fakes"; - -/** - * A director simple enough to have no opinions of its own: infer on a - * fresh message or a correlated answer landing in history, and turn an - * assistant turn's `tool_call` blocks into `execute_tools`. Everything - * else waits. This is deliberately NOT `WorkbenchDirector` or - * `DefaultDirector` — the point of this test is that the suspend/resume - * mechanism itself (owned by the reactor, `@intx/agent`, and whichever - * `BeforeToolExtension` a tool package contributes) needs no director - * cooperation to behave correctly; CL-7190's own bug lived in a director - * that mishandled this, but the fix does not depend on director logic. - */ -function createMinimalDirector(): ReactorDirector { - return { - decide(event, _state, capabilities: ReactorCapabilities) { - switch (event.type) { - case "message.received": - return Promise.resolve(capabilities.infer()); - case "inference.done": { - const calls: ToolCall[] = event.turn.content - .filter( - (block): block is Extract => - block.type === "tool_call", - ) - .map((block) => ({ - id: block.id, - name: block.name, - arguments: block.arguments, - })); - if (calls.length > 0) { - return Promise.resolve(capabilities.executeTools(calls, false)); - } - // No tool call named: an ordinary reply completed. `wait()` - // returns the reactor to idle for this message — `done()` would - // shut the whole reactor down, which a routine reply must not do. - return Promise.resolve(capabilities.wait()); - } - case "resume.tool_result": - return Promise.resolve(capabilities.infer()); - case "resume.execute_tools": - return Promise.resolve(capabilities.executeTools(event.calls)); - default: - return Promise.resolve(capabilities.wait()); - } - }, - }; -} - -/** Always suspends whatever call it's given on a `message_response` gate - * keyed by the call's own id — mirrors `@corbits/interaction-tools`' - * `beforeAskUser`, generically, with no name-based special-casing. */ -function alwaysSuspendExtension(): BeforeToolExtension { - return { - beforeTool: (call) => { - const timeoutAt = Date.now() + 60_000; - return Promise.resolve({ - type: "suspend", - gate: { - type: "message_response", - gateId: `pending-${call.id}`, - correlationId: call.id, - timeoutAt, - }, - pendingOp: { - correlationId: call.id, - kind: "message_response", - registeredAt: Date.now(), - gateId: `pending-${call.id}`, - timeoutAt, - suspendedCall: call, - }, - }); - }, - }; -} - -function collectEvents() { - const events: ReactorEmittedEvent[] = []; - return { events, onEvent: (e: ReactorEmittedEvent) => events.push(e) }; -} - -test("a suspended tool call produces no tool.done and no re-inference", async () => { - const call: ToolCall = { id: "call_1", name: "ask_user", arguments: {} }; - const { runner, callCount } = createScriptedInferenceRunner([ - assistantTurnWithToolCall(call), - ]); - const toolRunner = createRecordingToolRunner(); - const { events, onEvent } = collectEvents(); - - const reactor = createReactor({ - sessionId: "session-1", - director: createMinimalDirector(), - source: createFakeInferenceSource(), - toolRunner, - contextStore: createInMemoryContextStore(), - onEvent, - deps: createUnusedDependencies(), - inferenceRunner: runner, - beforeToolExtensions: [alwaysSuspendExtension()], - }); - - reactor.start(); - reactor.deliver(buildInboundMessage({ content: "What should I do?" })); - - // Let the async start()/deliver() chain settle: load -> message.received - // -> infer -> inference.done -> execute_tools -> suspend -> commit. - await new Promise((resolve) => setTimeout(resolve, 50)); - - expect(callCount()).toBe(1); - expect(toolRunner.calls).toEqual([]); - expect(events.some((e) => e.type === "tool.done")).toBe(false); - - const blocked = events.find((e) => e.type === "reactor.gate.blocked"); - expect(blocked).toBeDefined(); - expect( - (blocked as Extract) - .data.correlationId, - ).toBe(call.id); -}); - -test("a correlated reply clears the gate and drives exactly one more infer", async () => { - const call: ToolCall = { id: "call_2", name: "ask_user", arguments: {} }; - const { runner, callCount } = createScriptedInferenceRunner([ - assistantTurnWithToolCall(call), - assistantTurnWithToolCall({ id: "call_2b", name: "noop", arguments: {} }), - ]); - const toolRunner = createRecordingToolRunner(); - const { events, onEvent } = collectEvents(); - - const reactor = createReactor({ - sessionId: "session-2", - director: createMinimalDirector(), - source: createFakeInferenceSource(), - toolRunner, - contextStore: createInMemoryContextStore(), - onEvent, - deps: createUnusedDependencies(), - inferenceRunner: runner, - beforeToolExtensions: [alwaysSuspendExtension()], - }); - - reactor.start(); - reactor.deliver(buildInboundMessage({ content: "What should I do?" })); - await new Promise((resolve) => setTimeout(resolve, 50)); - expect(callCount()).toBe(1); - - reactor.deliver( - buildInboundMessage({ content: "Staging", correlationId: call.id }), - ); - await new Promise((resolve) => setTimeout(resolve, 50)); - - expect(callCount()).toBe(2); - // The correlated reply resolves the parked call directly — it never - // becomes an ordinary `message.received` the director would infer twice - // over, and it never reaches `toolRunner.run` (there is nothing left to - // execute once the user has answered). - expect(events.filter((e) => e.type === "message.received").length).toBe(1); - expect(toolRunner.calls).toEqual([]); - expect(events.some((e) => e.type === "message.correlated")).toBe(true); -}); - -test("two concurrent questions answered out of order each resolve their own gate", async () => { - const callA: ToolCall = { id: "call_a", name: "ask_user", arguments: {} }; - const callB: ToolCall = { id: "call_b", name: "ask_user", arguments: {} }; - // Three inference cycles: the first two each surface one of the two - // ask_user calls (as if two questions were asked back to back before - // either was answered); the reactor parks each on its own gate keyed by - // its own call id, so no scripted turn is needed for a re-infer beyond - // this test's two correlated replies driving `resume.tool_result` - // directly rather than a fresh `inference.done`. - const plainReply = (text: string) => ({ - role: "assistant" as const, - content: [{ type: "text" as const, text }], - model: "fake-model", - timestamp: Date.now(), - }); - const { runner, callCount } = createScriptedInferenceRunner([ - assistantTurnWithToolCall(callA), - assistantTurnWithToolCall(callB), - // Each correlated answer below drives one more re-infer - // (`resume.tool_result` -> `capabilities.infer()`); neither reply names - // a further tool call, so the director's `inference.done` branch calls - // `capabilities.done()` and the run settles. - plainReply("got B's answer"), - plainReply("got A's answer"), - ]); - const toolRunner = createRecordingToolRunner(); - const { events, onEvent } = collectEvents(); - - const reactor = createReactor({ - sessionId: "session-3", - director: createMinimalDirector(), - source: createFakeInferenceSource(), - toolRunner, - contextStore: createInMemoryContextStore(), - onEvent, - deps: createUnusedDependencies(), - inferenceRunner: runner, - beforeToolExtensions: [alwaysSuspendExtension()], - }); - - reactor.start(); - reactor.deliver(buildInboundMessage({ content: "Question A?" })); - await new Promise((resolve) => setTimeout(resolve, 50)); - reactor.deliver(buildInboundMessage({ content: "Question B?" })); - await new Promise((resolve) => setTimeout(resolve, 50)); - expect(callCount()).toBe(2); - - // Answer B first, then A — reverse of arrival order. Cross-wired - // correlation would hand B's answer to A's parked call (or vice versa); - // asserting the resume.tool_result event body proves each answer lands - // on its own call id. - reactor.deliver( - buildInboundMessage({ content: "Answer to B", correlationId: callB.id }), - ); - await new Promise((resolve) => setTimeout(resolve, 50)); - reactor.deliver( - buildInboundMessage({ content: "Answer to A", correlationId: callA.id }), - ); - await new Promise((resolve) => setTimeout(resolve, 50)); - - expect(callCount()).toBe(4); - - const correlated = events.filter((e) => e.type === "message.correlated") as Extract< - ReactorEmittedEvent, - { type: "message.correlated" } - >[]; - expect(correlated).toHaveLength(2); - expect(correlated[0]?.data.correlationId).toBe(callB.id); - expect(correlated[0]?.data.message.content).toBe("Answer to B"); - expect(correlated[1]?.data.correlationId).toBe(callA.id); - expect(correlated[1]?.data.message.content).toBe("Answer to A"); -}); diff --git a/vendor/intx/inference/src/testing/fakes.ts b/vendor/intx/inference/src/testing/fakes.ts deleted file mode 100644 index 1d6409ff43..0000000000 --- a/vendor/intx/inference/src/testing/fakes.ts +++ /dev/null @@ -1,209 +0,0 @@ -// Minimal fakes for driving a real `createReactor(...)` cycle in tests, -// mirroring `@intx/agent/testing`'s pattern of no-op env-contract -// implementations one level up in this same vendored monorepo. Nothing -// here is provider- or tool-specific: a test wires in whichever -// `ReactorDirector`/`BeforeToolExtension`/turn content it needs. -import type { - AssistantTurn, - ContextCommit, - ContextStore, - ConversationTurn, - InboundMessage, - InferenceEvent, - InferenceSource, - LastCycleSource, - PendingOperation, - TokenUsage, - ToolCall, - ToolResult, - ToolRunner, -} from "@intx/types/runtime"; - -import type { Dependencies } from "../harness"; - -/** - * In-memory `ContextStore`: keeps the last-written turns/manifest/metadata - * in plain fields and answers `commit`/`log`/`readAt` off an in-memory - * commit list. Enough for the reactor's own per-cycle checkpoint sequence - * (`writeTurns` → `writeManifest` → `writeMetadata` → `commit`) — nothing - * here is a durability model, it just has to not throw. - */ -export function createInMemoryContextStore(): ContextStore { - const commits: ContextCommit[] = []; - let nextHash = 1; - - return { - load: () => - Promise.resolve({ - turns: [] as ConversationTurn[], - pendingOperations: [] as PendingOperation[], - tokenUsage: { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - thinking: 0, - }, - connectorState: null, - }), - setConnectorState: () => {}, - commit: ({ message }) => { - const commit: ContextCommit = { - hash: `commit-${String(nextHash)}`, - message, - timestamp: Date.now(), - }; - nextHash += 1; - commits.push(commit); - return Promise.resolve(commit); - }, - branch: () => Promise.resolve(), - log: (limit) => Promise.resolve(commits.slice(-(limit ?? commits.length))), - readAt: () => Promise.resolve([]), - writeBlob: () => Promise.resolve(), - readBlob: () => Promise.reject(new Error("no blob written")), - writePrompt: () => Promise.resolve(), - writeResponse: () => Promise.resolve(), - writeManifest: () => Promise.resolve(), - writeTurns: () => Promise.resolve(), - writeMetadata: () => Promise.resolve(), - readManifestHistory: () => Promise.resolve([]), - }; -} - -/** - * A `ToolRunner` that records every call it receives. A suspended call - * never reaches `run()` (the reactor answers it via the gate instead), so a - * test asserting the suspend path stays clean asserts `calls` is empty. - */ -export function createRecordingToolRunner( - resultFor: (call: ToolCall) => ToolResult = (call) => ({ - callId: call.id, - content: "", - isError: false, - }), -): ToolRunner & { calls: ToolCall[] } { - const calls: ToolCall[] = []; - return { - calls, - run: (call) => { - calls.push(call); - return Promise.resolve(resultFor(call)); - }, - }; -} - -/** A syntactically valid `InferenceSource` that no fake `inferenceRunner` - * ever actually dials out to. */ -export function createFakeInferenceSource(): InferenceSource { - return { - id: "fake-source", - provider: "fake", - baseURL: "https://fake.invalid", - apiKey: "fake-key", - model: "fake-model", - }; -} - -/** A `Dependencies` bag satisfying the reactor's config shape. Never - * actually invoked by a test that supplies its own `inferenceRunner` - * (which receives — and can ignore — these as part of its harness opts). */ -export function createUnusedDependencies(): Dependencies { - return { - fetch: () => Promise.reject(new Error("fetch should never be called")), - scheduler: { - now: () => Date.now(), - setTimeout: (fn, ms) => { - const id = globalThis.setTimeout(fn, ms); - return () => globalThis.clearTimeout(id); - }, - }, - adapters: { - resolve: () => { - throw new Error("adapters.resolve should never be called"); - }, - } as unknown as Dependencies["adapters"], - }; -} - -const FAKE_LAST_CYCLE_SOURCE: LastCycleSource = { - sourceId: "fake-source", - provider: "fake", - model: "fake-model", -}; - -const ZERO_USAGE: TokenUsage = { - input: 0, - output: 0, - cacheRead: 0, - cacheWrite: 0, - thinking: 0, -}; - -/** An `AssistantTurn` whose only content is one `tool_call` block — the - * shape the director needs to see to decide `executeTools`. */ -export function assistantTurnWithToolCall(call: ToolCall): AssistantTurn { - return { - role: "assistant", - content: [{ type: "tool_call", id: call.id, name: call.name, arguments: call.arguments }], - model: "fake-model", - timestamp: Date.now(), - }; -} - -/** - * A scripted `inferenceRunner`: each call to `runner(...)` pops the next - * queued `AssistantTurn` and yields exactly one `inference.done` event for - * it. `callCount` lets a test assert exactly how many times inference ran — - * the whole point of the suspend/resume regression coverage this supports. - */ -export function createScriptedInferenceRunner(turns: AssistantTurn[]): { - runner: () => AsyncGenerator; - callCount: () => number; -} { - const queue = [...turns]; - let calls = 0; - - async function* runner(): AsyncGenerator { - calls += 1; - const turn = queue.shift(); - if (turn === undefined) { - throw new Error( - `createScriptedInferenceRunner: no scripted turn left for call #${String(calls)}`, - ); - } - yield { - type: "inference.done", - seq: 0, - data: { turn, usage: ZERO_USAGE, source: FAKE_LAST_CYCLE_SOURCE }, - }; - } - - return { runner, callCount: () => calls }; -} - -/** Builds a real `InboundMessage`, optionally carrying an - * `interchangeCorrelationId` header — the one field `tryCorrelate` - * (`../reactor.ts`) keys a resumption on. */ -export function buildInboundMessage(opts: { - content: string; - correlationId?: string; - messageId?: string; -}): InboundMessage { - return { - ref: { uid: 1, mailbox: "INBOX" }, - headers: { - from: "user@local", - to: ["agent@local"], - date: new Date().toISOString(), - messageId: opts.messageId ?? `msg-${crypto.randomUUID()}`, - interchangeType: "conversation.message", - ...(opts.correlationId !== undefined - ? { interchangeCorrelationId: opts.correlationId } - : {}), - }, - flags: [], - content: opts.content, - signatureStatus: "missing", - }; -} diff --git a/vendor/intx/types/src/signals.test.ts b/vendor/intx/types/src/signals.test.ts new file mode 100644 index 0000000000..b7437c2f5a --- /dev/null +++ b/vendor/intx/types/src/signals.test.ts @@ -0,0 +1,20 @@ +import { expect, test } from "bun:test"; +import { type } from "arktype"; + +import { signalKinds, signalKindToGateType, SignalKind } from "./signals"; + +// CL-7443: `message_response` (CL-7190) is retired — `ask_user` posts its +// question and ends the turn instead of parking on a signal, so the reactor +// has no signal kind left but the native `approval` ask. +test("the only signal kind is approval", () => { + expect(signalKinds).toEqual(["approval"]); +}); + +test("SignalKind accepts approval and rejects message_response", () => { + expect(SignalKind("approval")).toBe("approval"); + expect(SignalKind("message_response")).toBeInstanceOf(type.errors); +}); + +test("signalKindToGateType maps approval to the approval gate", () => { + expect(signalKindToGateType("approval")).toBe("approval"); +}); From 9fde514d4d2ad66c3edbc7ce55cb28ab6c8ec14d Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 16:54:20 -0700 Subject: [PATCH 2/9] ask_user posts the question and ends the turn; delete the message_response delta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A Workbench agent is an unbounded interactive step: every inbound mail is its own next turn. The native "ask a person" is therefore to post the question and end the turn, not to structurally park it on a gate — the person's reply already arrives as the agent's next turn. ask_user no longer contributes a beforeToolExtension: it posts the question card from a plain run() and returns immediately with a tool result instructing the model to end its turn, since the answer is not this call's result but the agent's next inbound message. This retires CL-7190/CL-7191's message_response vendored delta: the signal kind is gone from vendor/intx/types/src/signals.ts (back to upstream's approval-only shape), its resume branch is gone from vendor/intx/inference/src/reactor.ts, and the correlationId plumbing that only existed to resolve it is gone from vendor/intx/hub-sessions' sendUserMessage and every hop above it (folded-runs' sendFoldedMail, chat's WorkbenchMail.sendMail/platform-adapter/workbench-service/ turn-queue). A block response is simply a new message that replies to the question card; the chat block-response route already sent it as a plain message with no gate resolution to remove. Bumps @corbits/interaction-tools to 0.0.7 and its pin in workflows/assistant. --- VENDORED.md | 34 ++--- packages/chat/src/platform-adapter.ts | 3 - packages/chat/src/platform-port.ts | 7 - packages/chat/src/turn-queue.ts | 4 - packages/chat/src/workbench-service.ts | 44 +----- packages/folded-runs/src/mail.ts | 6 - packages/interaction-tools/package.json | 4 +- packages/interaction-tools/src/client.ts | 26 ++-- packages/interaction-tools/src/tool.ts | 134 ++++++------------ scripts/checks/kill-dates.txt | 6 +- scripts/checks/report-error-baseline.txt | 1 - vendor/intx/hub-sessions/VENDORED-FROM | 2 +- .../intx/hub-sessions/src/session-service.ts | 8 +- vendor/intx/inference/VENDORED-FROM | 2 +- vendor/intx/inference/src/reactor.ts | 33 +---- vendor/intx/types/VENDORED-FROM | 2 +- vendor/intx/types/src/signals.ts | 4 +- workflows/assistant/src/index.ts | 2 +- 18 files changed, 92 insertions(+), 230 deletions(-) diff --git a/VENDORED.md b/VENDORED.md index 587825348e..80648ccae4 100644 --- a/VENDORED.md +++ b/VENDORED.md @@ -22,23 +22,23 @@ never a convenience. ## Ledger -| Vendored path | What was copied | Upstream repo @ commit | Why not a published package | Owner | Kill date | Kill-date test | -| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ---------- | ----------------- | -| `apps/sidecar` | Derived from upstream's own `apps/sidecar`: six modules byte-identical (`default-harness.ts`, `signing-keypair.ts`, `source-asset-delivery.ts`, `workflow-closure-apply.ts`, `workflow-probe-handler.ts`, `workflow-run-pack-restore.ts`), three near-verbatim (`atomic-write.ts` differs only by the repo-wide logger namespace), the rest (`index.ts`, `config.ts`, `tool-materialization.ts`, `step-agent-tools.ts`, `workflow-host-wiring/`, `workflow-substrate-factory/`, …) substantially rewritten, plus workbench-only modules. A living fork, not a frozen copy, so this row carries no tree hash. | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | An app is never npm-published, so no publish can cover the execution host; retired by consuming an upstream-published host, or by renewing this row deliberately | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/agent` | `@intx/agent` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the operator-configurable doom-loop threshold (`afd0c82b`, `c421c092`) the re-vendored `workflow-host` configures; one local delta (CL-7190): `ToolBundle.beforeToolExtension` (`tool.ts`) and its composition into `ResolvedTools.beforeToolExtensions` (`agent.ts`), so a tool package can contribute its own suspend-capable extension without the reactor or director special-casing it by name; retired by the next `@intx/agent` publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/db` | `@intx/db` source (`src/`, `migrations/`, drizzle config, manifest, tsconfigs) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 covers the base package but not the `wire_projection` column/loader delta (CL-6324) or the `workflow_definition.origin` column separating a definition from the per-run record of one folded run's deploy (CL-6452), shipped as migrations `0086`/`0087` behind upstream's `0085_add_approval_run_idx`, plus `0088` rewriting the retired `onBodyFailure: "continue"` literal to upstream's `"tolerate"` in stored wire projections, plus `0089` adding `workflow_definition.schedule_claimed_minute` for the hub's native ScheduleTrigger poller (CL-4455); retired when upstream absorbs the deltas | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/harness` | `@intx/harness` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the connector reply drain (`driveConnectorReplies`, `ConnectorReplyDrain`, `AgentEventStream`; `11590e66`) the sidecar's warm mail loop drives; no local delta; retired by the next `@intx/harness` publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/hub-agent` | `@intx/hub-agent` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the `agentDir` path export (`927556de`) the sidecar's deploy-tree lookup uses, and its own `@intx/mail-memory`/`@intx/harness` pins must resolve the vendored copies; one local delta (CL-6396): `SessionEventSink` / `publishWorkflowInferenceEvent` stamp optional `childRunId` on `agent.event`; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/hub-api` | `@intx/hub-api` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 covers the base package but not the null-principal `resolveApproval` for policy-resolved decisions (CL-6345) or the bearer-authenticated workflow-deploy mirror (`middleware/workflow-run-deploy-auth.ts`, CL-workflow-deploy-bearer); retired when upstream absorbs the deltas | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/hub-sessions` | `@intx/hub-sessions` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 covers the base package but not the pack-acceptance fixes (`ownsWorkflowRunRepo`, `anchorAddressForPackSource`, `decideTerminalRunFlip`), the adopted deploy front + `sourceRef` (CL-6324), the wire-projection writer (CL-6324), malformed tool-call-name sanitization (CL-6478), the sealed-run terminal-status backfill (CL-6595), the CL-7190 `registerSignalCorrelation` approval-only guard (fails loud on a future `SignalKind` this RPC has no persistence for, rather than silently mis-persisting one), or the CL-7191 `UserMessageParams.correlationId` plumbing into `sendUserMessage`'s `headers.interchangeCorrelationId` (a plain chat message can now resolve a parked `message_response` gate), or the CL-6396 `childRunId` forward on `agent.event`; retired when upstream absorbs the deltas | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/inference` | `@intx/inference` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates doom-loop detection (`8da4c827`, `afd0c82b`, `c421c092`); local deltas: `providers/google-genai-files.ts` builds its upload body as `new Uint8Array(bytes)` because TS 6's lib.dom `BodyInit` rejects `Uint8Array` (upstream compiles ESNext-only under TS 5.9); and CL-7190's `message_response` resume branch in `reactor.ts`'s `resumePendingOperation`/`timeoutMessageFor`, plus its `reactor.test.ts`/`testing/fakes.ts` regression harness (this package previously had zero tests); retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/mail-memory` | `@intx/mail-memory` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the `@intx/mailbox` extraction (`af03bb90`), on-demand body reads (`54f7c239`) and `expunge` returning the swept uids (`bcabb1f8`) that the re-vendored `workflow-host` binds against; no local delta; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/mailbox` | `@intx/mailbox` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | Never published: a new package at the target pin (`af03bb90`) that `workflow-host`'s substrate mailbox store and supervisor-backed transport import; no local delta; retired by its first publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/mime` | `@intx/mime` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the non-RFC message-id guard `isMessageId` (`d97e1832`), the full `References` chain (`65c6fe70`) and the lossless `decodeMail` decoder (`3b6d06b2`) that `mailbox`/`mail-memory` at the same pin import; no local delta; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/types` | `@intx/types` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the type surface the re-vendored trees compile against: `expunge` returning `expungedUids` (`bcabb1f8`), plain-string `PackRejectReason` (`7b42f405`), the run authorization/approvals REST types (`71ad6c08`), the decoded-mail `Mail`/`MailPartReader` model (`3b6d06b2`) and the `interchange.actions`/`loops` package-json refs (`3bd5b837`, `1ea2f39b`); one local delta (CL-7190): `"message_response"` added to `signals.ts`'s `signalKinds`, alongside `signalKindToGateType`; another (CL-6396): optional `childRunId` on `AgentEventFrame`; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/workflow` | `@intx/workflow` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | No local delta: npm 0.3.0 predates the `onBodyFailure: "tolerate"` section policy (`b977ade6`) that `@corbits/agent-runtime` authors and the action/loop primitives (`3bd5b837`, `1ea2f39b`) the re-vendored `workflow-host` runs; retired by the next `@intx/workflow` publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/workflow-deploy` | `@intx/workflow-deploy` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | No local delta: npm 0.3.0 predates `inertLoopBody` and the loop-body source pin (`1ea2f39b`) that the re-vendored `hub-sessions` imports; retired by the next `@intx/workflow-deploy` publish | sawyer | 2026-10-26 | `check:killdates` | -| `vendor/intx/workflow-host` | `@intx/workflow-host` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 covers the base package but not the body-spawn authorize/credential/mail-part-reader threading and grants head-collapse (CL-6448) that let the fork run tool-bearing onTrigger bodies, or the CL-6396 event-channel `childRunId` stamp so overlapping turns HMAC-bind the occurrence they belong to; retired when upstream absorbs the deltas | sawyer | 2026-10-26 | `check:killdates` | +| Vendored path | What was copied | Upstream repo @ commit | Why not a published package | Owner | Kill date | Kill-date test | +| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ---------- | ----------------- | +| `apps/sidecar` | Derived from upstream's own `apps/sidecar`: six modules byte-identical (`default-harness.ts`, `signing-keypair.ts`, `source-asset-delivery.ts`, `workflow-closure-apply.ts`, `workflow-probe-handler.ts`, `workflow-run-pack-restore.ts`), three near-verbatim (`atomic-write.ts` differs only by the repo-wide logger namespace), the rest (`index.ts`, `config.ts`, `tool-materialization.ts`, `step-agent-tools.ts`, `workflow-host-wiring/`, `workflow-substrate-factory/`, …) substantially rewritten, plus workbench-only modules. A living fork, not a frozen copy, so this row carries no tree hash. | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | An app is never npm-published, so no publish can cover the execution host; retired by consuming an upstream-published host, or by renewing this row deliberately | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/agent` | `@intx/agent` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the operator-configurable doom-loop threshold (`afd0c82b`, `c421c092`) the re-vendored `workflow-host` configures; one local delta (CL-7190): `ToolBundle.beforeToolExtension` (`tool.ts`) and its composition into `ResolvedTools.beforeToolExtensions` (`agent.ts`), so a tool package can contribute its own suspend-capable extension without the reactor or director special-casing it by name; retired by the next `@intx/agent` publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/db` | `@intx/db` source (`src/`, `migrations/`, drizzle config, manifest, tsconfigs) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 covers the base package but not the `wire_projection` column/loader delta (CL-6324) or the `workflow_definition.origin` column separating a definition from the per-run record of one folded run's deploy (CL-6452), shipped as migrations `0086`/`0087` behind upstream's `0085_add_approval_run_idx`, plus `0088` rewriting the retired `onBodyFailure: "continue"` literal to upstream's `"tolerate"` in stored wire projections, plus `0089` adding `workflow_definition.schedule_claimed_minute` for the hub's native ScheduleTrigger poller (CL-4455); retired when upstream absorbs the deltas | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/harness` | `@intx/harness` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the connector reply drain (`driveConnectorReplies`, `ConnectorReplyDrain`, `AgentEventStream`; `11590e66`) the sidecar's warm mail loop drives; no local delta; retired by the next `@intx/harness` publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/hub-agent` | `@intx/hub-agent` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the `agentDir` path export (`927556de`) the sidecar's deploy-tree lookup uses, and its own `@intx/mail-memory`/`@intx/harness` pins must resolve the vendored copies; one local delta (CL-6396): `SessionEventSink` / `publishWorkflowInferenceEvent` stamp optional `childRunId` on `agent.event`; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/hub-api` | `@intx/hub-api` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 covers the base package but not the null-principal `resolveApproval` for policy-resolved decisions (CL-6345) or the bearer-authenticated workflow-deploy mirror (`middleware/workflow-run-deploy-auth.ts`, CL-workflow-deploy-bearer); retired when upstream absorbs the deltas | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/hub-sessions` | `@intx/hub-sessions` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 covers the base package but not the pack-acceptance fixes (`ownsWorkflowRunRepo`, `anchorAddressForPackSource`, `decideTerminalRunFlip`), the adopted deploy front + `sourceRef` (CL-6324), the wire-projection writer (CL-6324), malformed tool-call-name sanitization (CL-6478), the sealed-run terminal-status backfill (CL-6595), the CL-7190 `registerSignalCorrelation` approval-only guard (fails loud on a future `SignalKind` this RPC has no persistence for, rather than silently mis-persisting one), or the CL-6396 `childRunId` forward on `agent.event`; CL-7443 retires CL-7191's `UserMessageParams.correlationId`/`sendUserMessage` plumbing (`ask_user` no longer parks a `message_response` gate for a plain chat message to resolve); retired when upstream absorbs the deltas | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/inference` | `@intx/inference` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates doom-loop detection (`8da4c827`, `afd0c82b`, `c421c092`); one local delta: `providers/google-genai-files.ts` builds its upload body as `new Uint8Array(bytes)` because TS 6's lib.dom `BodyInit` rejects `Uint8Array` (upstream compiles ESNext-only under TS 5.9). CL-7443 retired CL-7190's `message_response` resume branch in `reactor.ts`'s `resumePendingOperation`/`timeoutMessageFor` and its `reactor.test.ts`/`testing/fakes.ts` regression harness, back to zero tests; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/mail-memory` | `@intx/mail-memory` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the `@intx/mailbox` extraction (`af03bb90`), on-demand body reads (`54f7c239`) and `expunge` returning the swept uids (`bcabb1f8`) that the re-vendored `workflow-host` binds against; no local delta; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/mailbox` | `@intx/mailbox` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | Never published: a new package at the target pin (`af03bb90`) that `workflow-host`'s substrate mailbox store and supervisor-backed transport import; no local delta; retired by its first publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/mime` | `@intx/mime` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the non-RFC message-id guard `isMessageId` (`d97e1832`), the full `References` chain (`65c6fe70`) and the lossless `decodeMail` decoder (`3b6d06b2`) that `mailbox`/`mail-memory` at the same pin import; no local delta; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/types` | `@intx/types` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 predates the type surface the re-vendored trees compile against: `expunge` returning `expungedUids` (`bcabb1f8`), plain-string `PackRejectReason` (`7b42f405`), the run authorization/approvals REST types (`71ad6c08`), the decoded-mail `Mail`/`MailPartReader` model (`3b6d06b2`) and the `interchange.actions`/`loops` package-json refs (`3bd5b837`, `1ea2f39b`); CL-7443 retired CL-7190's local delta (`"message_response"` added to `signals.ts`'s `signalKinds`, alongside `signalKindToGateType`) back to upstream's approval-only shape; one remaining local delta (CL-6396): optional `childRunId` on `AgentEventFrame`; retired by the next publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/workflow` | `@intx/workflow` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | No local delta: npm 0.3.0 predates the `onBodyFailure: "tolerate"` section policy (`b977ade6`) that `@corbits/agent-runtime` authors and the action/loop primitives (`3bd5b837`, `1ea2f39b`) the re-vendored `workflow-host` runs; retired by the next `@intx/workflow` publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/workflow-deploy` | `@intx/workflow-deploy` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | No local delta: npm 0.3.0 predates `inertLoopBody` and the loop-body source pin (`1ea2f39b`) that the re-vendored `hub-sessions` imports; retired by the next `@intx/workflow-deploy` publish | sawyer | 2026-10-26 | `check:killdates` | +| `vendor/intx/workflow-host` | `@intx/workflow-host` source (`src/`, manifest, tsconfig) | [faremeter/interchange](https://github.com/faremeter/interchange) @ `a8bc06ae` (origin/main, 2026-08-27) | npm 0.3.0 covers the base package but not the body-spawn authorize/credential/mail-part-reader threading and grants head-collapse (CL-6448) that let the fork run tool-bearing onTrigger bodies, or the CL-6396 event-channel `childRunId` stamp so overlapping turns HMAC-bind the occurrence they belong to; retired when upstream absorbs the deltas | sawyer | 2026-10-26 | `check:killdates` | The pin is `a8bc06ae` (upstream `origin/main`, 2026-08-27), 72 commits past the `v0.3.0` release tag `b5580a02`. npm is still `0.3.0`, so every tree a diff --git a/packages/chat/src/platform-adapter.ts b/packages/chat/src/platform-adapter.ts index 9b9198f5cf..309f9582b4 100644 --- a/packages/chat/src/platform-adapter.ts +++ b/packages/chat/src/platform-adapter.ts @@ -1259,9 +1259,6 @@ export function createHubChatPlatform( domain, content: input.content.content, cryptoProvider, - ...(input.correlationId !== undefined - ? { correlationId: input.correlationId } - : {}), }; const withAttachments = attachments !== undefined diff --git a/packages/chat/src/platform-port.ts b/packages/chat/src/platform-port.ts index a05df780af..ecf525a750 100644 --- a/packages/chat/src/platform-port.ts +++ b/packages/chat/src/platform-port.ts @@ -174,13 +174,6 @@ export interface WorkbenchMail { * a principal address has no mailbox: a reply to it vanishes. */ readonly fromWorkbenchId?: string; - /** - * The MIME `Interchange-Correlation-ID` header to stamp on this mail - * (`vendor/intx/mime/src/mail-builder.ts` already accepts this as - * `opts.correlationId`) — set when this message is an answer that must - * resolve a specific parked `message_response` gate, absent otherwise. - */ - readonly correlationId?: string; }): Promise; fetchBlob(workbenchId: string, blobId: string): Promise; diff --git a/packages/chat/src/turn-queue.ts b/packages/chat/src/turn-queue.ts index 39c4fd189d..7bb67a8038 100644 --- a/packages/chat/src/turn-queue.ts +++ b/packages/chat/src/turn-queue.ts @@ -45,10 +45,6 @@ export type QueuedTurn = { readonly principalId: string; readonly recipients: readonly string[]; readonly parts: readonly PartType[]; - /** The id an answer must carry to resolve the `message_response` gate it - * answers (see `SendWorkbenchMessageInput.correlationId` in - * `./workbench-service.ts`). Absent for every ordinary message. */ - readonly correlationId?: string; }; export type WorkbenchTurnQueueDeps = { diff --git a/packages/chat/src/workbench-service.ts b/packages/chat/src/workbench-service.ts index 6bcc218391..149852dfff 100644 --- a/packages/chat/src/workbench-service.ts +++ b/packages/chat/src/workbench-service.ts @@ -1398,16 +1398,6 @@ export type SendWorkbenchMessageInput = { * into the run the room already has. */ readonly forcedRecipientAddress?: string; - /** - * The id an answer must carry to resolve the gate it answers — a - * `message_response` gate's own correlationId (`@corbits/interaction-tools`'s - * `beforeAskUser`), threaded down to `headers.interchangeCorrelationId` - * on the InboundMessage the reactor's `tryCorrelate` reads. Sourced from - * the answered block's own id for a question response - * (`packages/chat/src/routes.ts`'s blocks/responses route); absent for - * every ordinary message, which carries no correlation at all. - */ - readonly correlationId?: string; }; export type SendWorkbenchMessageResult = { @@ -1647,9 +1637,6 @@ async function routeToRecipients( principalId: input.principalId, recipients, parts: turnParts, - ...(input.correlationId !== undefined - ? { correlationId: input.correlationId } - : {}), }, (batch) => dispatchTurnBatch(deps, input.tenantId, input.workbenchId, batch), @@ -1696,18 +1683,6 @@ async function dispatchTurnBatch( const last = batch[batch.length - 1]; if (last === undefined) return; const messageIds = batch.map((turn) => turn.messageId); - // An answer's correlationId must survive batching regardless of where in - // the batch it landed — unlike `principalId`, which is legitimately - // "whoever sent last," a gate answer is a specific message a specific - // queued turn carries, not necessarily the batch's final one (a further - // unrelated message queued behind the answer, before this batch drains, - // would otherwise make `last.correlationId` undefined and silently strand - // the gate on its timeout instead of resolving it). At most one queued - // turn in a batch carries a correlationId in practice — a batch answering - // more than one live question is not a shape this dispatch produces. - const batchCorrelationId = batch.find( - (turn) => turn.correlationId !== undefined, - )?.correlationId; // CL-6644: unconditional entry marker — see the matching note on the // caller's own recipient-resolution log. This is the one line that @@ -1794,15 +1769,6 @@ async function dispatchTurnBatch( agentAddress, parts, requestMessageIds: messageIds, - // A batch concatenating more than one queued message's parts - // still stamps the whole combined body as the answer when any - // one of them carries a correlationId — acceptable (the user - // did answer), but a batch mixing the actual answer with an - // unrelated follow-up hands the gate the whole blob, not just - // the answer. - ...(batchCorrelationId !== undefined - ? { correlationId: batchCorrelationId } - : {}), }, signal, ), @@ -1867,9 +1833,6 @@ export type DispatchTurnInput = { readonly parts: PartType[]; /** The room messages this turn answers, in arrival order. */ readonly requestMessageIds: readonly string[]; - /** See `SendWorkbenchMessageInput.correlationId`; threaded straight - * through to `WorkbenchMail.sendMail`. */ - readonly correlationId?: string; }; /** @@ -1983,9 +1946,6 @@ export async function dispatchTurn( principalId: input.principalId, content: encodeParts(input.parts, { replyTo: input.workbenchId }), fromWorkbenchId: input.workbenchId, - ...(input.correlationId !== undefined - ? { correlationId: input.correlationId } - : {}), }); // The reply path threads under the turn that produced it (CL-6314), // and this mail is what opens that turn's bracket — so record which @@ -2201,8 +2161,8 @@ export type CancelWorkbenchTurnResult = { * race against this function's own sweep, below, for any turn that * was still reachable this way. * 2. Already off our call stack entirely — `sendMail` already resolved, - * the agent is generating (or parked on a `message_response` gate - * somewhere in the execution plane this package cannot see into). + * the agent is generating (or parked on an approval gate somewhere in + * the execution plane this package cannot see into). * Nothing is registered to abort any more, so the row is found via * `findRunningTurns` (snapshotted BEFORE `cancel` below, so a row * path 1 already claimed is still counted) and settled directly. diff --git a/packages/folded-runs/src/mail.ts b/packages/folded-runs/src/mail.ts index a6cb1d2599..d1e583944b 100644 --- a/packages/folded-runs/src/mail.ts +++ b/packages/folded-runs/src/mail.ts @@ -25,9 +25,6 @@ export type SendFoldedMailParams = { attachments?: MessageAttachment[]; replyTo?: string; cryptoProvider: CryptoProvider; - /** The MIME `Interchange-Correlation-ID` header — set when this message - * answers a specific parked `message_response` gate, absent otherwise. */ - correlationId?: string; }; /** @@ -53,9 +50,6 @@ async function deliverFoldedMailMIME( sessionId: params.sessionId, tenantId: params.tenantId, cryptoProvider: params.cryptoProvider, - ...(params.correlationId !== undefined - ? { correlationId: params.correlationId } - : {}), }; const withAttachments = params.attachments !== undefined diff --git a/packages/interaction-tools/package.json b/packages/interaction-tools/package.json index 7eb48110de..1e49867a98 100644 --- a/packages/interaction-tools/package.json +++ b/packages/interaction-tools/package.json @@ -1,8 +1,8 @@ { "name": "@corbits/interaction-tools", "private": true, - "description": "The ask_user tool: an @intx/agent bundle that poses an interview question in-thread as a question block and parks the turn on a message_response gate until the user answers", - "version": "0.0.6", + "description": "The ask_user tool: an @intx/agent bundle that poses an interview question in-thread as a question block, then ends the turn — the user's answer arrives as the agent's next message, not this call's result", + "version": "0.0.7", "license": "LGPL-2.1-or-later", "type": "module", "exports": { diff --git a/packages/interaction-tools/src/client.ts b/packages/interaction-tools/src/client.ts index 10bf445916..692276d848 100644 --- a/packages/interaction-tools/src/client.ts +++ b/packages/interaction-tools/src/client.ts @@ -73,8 +73,8 @@ const PostedMessageResponse = type({ id: "string", createdAt: "string" }); * Derives the question card's `questionId` from a tool-call id. The call * id is assigned by the runtime, not the model, so it is stable across a * crash-retry of the same `ask_user` invocation — hashing it into the - * `q_` shape `postQuestion` otherwise mints keeps the card and the - * `message_response` gate on one id without trusting model-supplied input. + * `q_` shape `postQuestion` otherwise mints keeps a retried call + * re-posting the same card without trusting model-supplied input. */ export function questionIdForCall(callId: string): string { return `q_${createHash("sha256").update(callId).digest("hex").slice(0, 32)}`; @@ -84,21 +84,19 @@ export function questionIdForCall(callId: string): string { * Posts a `question` block into the caller's own channel. Uses a caller- * supplied `questionId` when present (never trusts the model to supply a * stable, collision-free id — `ask_user` derives it from the tool-call id) - * and otherwise mints one here. Returns the id: `beforeAskUser` - * (`./tool.ts`) reuses it verbatim as the `message_response` gate's own - * `correlationId`, and the block-response route persists (and later - * relays) an answer keyed on this same id as `blockId` — a question - * block's `blockId` IS its `questionId`, the same way a poll's is its - * `pollId` (`packages/chat/src/schema.ts`'s `block_responses` table - * comment). `@intx/hub-common`'s `generateId` is a closed enum of - * platform id kinds (vendored, read-only source) with no "question" - * entry, so a minted id is `q_`-prefixed the same way - * `packages/chat/src/threads.ts`'s `thr_` ids are. + * and otherwise mints one here. Returns the id: the block-response route + * persists (and later relays, as an ordinary reply message) an answer keyed + * on this same id as `blockId` — a question block's `blockId` IS its + * `questionId`, the same way a poll's is its `pollId` + * (`packages/chat/src/schema.ts`'s `block_responses` table comment). + * `@intx/hub-common`'s `generateId` is a closed enum of platform id kinds + * (vendored, read-only source) with no "question" entry, so a minted id is + * `q_`-prefixed the same way `packages/chat/src/threads.ts`'s `thr_` ids are. * * Re-posting the same `questionId` into the same workbench is a no-op: * the participants/messages route returns the existing card rather than - * inserting a second one, so a crash between this post and - * `suspendOnGate` cannot orphan a duplicate on retry. + * inserting a second one, so a crash between this post and the tool call + * returning cannot orphan a duplicate on retry. */ export async function postQuestion( config: AskUserClientConfig, diff --git a/packages/interaction-tools/src/tool.ts b/packages/interaction-tools/src/tool.ts index ca26971c97..67de98b4f0 100644 --- a/packages/interaction-tools/src/tool.ts +++ b/packages/interaction-tools/src/tool.ts @@ -1,31 +1,22 @@ // The `ask_user` tool: poses an interview question in-thread as an // interactive `question` block (`@corbits/chat`'s `blocks.ts`) instead of -// prose bullet options, then structurally parks the turn on a -// `message_response` gate — the reactor neither runs nor answers the call -// until a correlated reply arrives. The answer surfaces as the responding -// user's own next message in this same channel -// (`packages/chat/src/routes.ts`'s question response handling relays it -// there), which clears the gate and becomes the call's tool result. No -// synchronous guess: the turn cannot proceed until it does. +// prose bullet options, then ends the turn. A Workbench agent is an +// unbounded interactive step — every inbound mail is its next turn — so +// "ask a person" is native as "post the question and stop," not a +// structural park: the person's answer, posted as an ordinary reply in the +// same channel (`packages/chat/src/routes.ts`'s block-response route, +// which sends it as a plain message), arrives as the next turn's own +// inbound message, not as this call's result. import { defineTool } from "@intx/agent"; import type { BaseEnv } from "@intx/agent"; -import type { - BeforeToolDecision, - PendingOperation, - ToolCall, - ToolResult, -} from "@intx/types/runtime"; +import type { ToolCall, ToolResult } from "@intx/types/runtime"; import { type } from "arktype"; -import { postQuestion, NoOwnChannelError, questionIdForCall } from "./client"; +import { postQuestion, questionIdForCall } from "./client"; import type { AskUserClientConfig } from "./client"; export const ASK_USER_TOOL = "ask_user"; -/** How long a posted question waits for an answer before the gate times out - * and the parked call is answered with a synthetic error. */ -export const ASK_USER_TIMEOUT_MS = 3_600_000; - export interface AskUserEnv extends BaseEnv { readonly hubChatUrl: string; readonly sidecarToken: string; @@ -57,70 +48,48 @@ function clientConfig(env: AskUserEnv): AskUserClientConfig { } /** - * `ask_user`'s `BeforeToolExtension.beforeTool`: posts the question card, - * then parks the call on a `message_response` gate rather than answering it. - * The reactor registers the gate and durably persists `pendingOp` before - * returning to its loop, so the suspension survives a hub restart; it clears - * only when a correlated reply arrives (or the gate times out). + * `ask_user`'s `run`: posts the question card, then answers the call with a + * short instruction telling the model to end its turn — the person's answer + * is not this call's result, it is the next turn's inbound message. No gate, + * no correlation id, no park: a Workbench agent's next mail is already its + * next turn, so posting and stopping IS "asking a person" here. + * + * `postQuestion` stamps `questionIdForCall(call.id)` (derived from the + * tool-call id, not minted per attempt) on the outbound question card, so a + * crash-retry of the same call re-posts the same id and the write path + * returns the existing card rather than a duplicate (CL-7248). */ -async function beforeAskUser( +async function runAskUser( env: AskUserEnv, call: ToolCall, -): Promise { - if (call.name !== ASK_USER_TOOL) { - return { type: "allow" }; - } - +): Promise { const parsed = AskUserInput(call.arguments); if (parsed instanceof type.errors) { - return { - type: "block", - reason: `${ASK_USER_TOOL} received invalid input: ${parsed.summary}`, - }; + return errorResult( + call.id, + new Error(`${ASK_USER_TOOL} received invalid input: ${parsed.summary}`), + ); } - let questionId: string; try { - ({ questionId } = await postQuestion(clientConfig(env), { + await postQuestion(clientConfig(env), { ...parsed, questionId: questionIdForCall(call.id), - })); + }); } catch (err) { - if (err instanceof NoOwnChannelError) { - return { type: "block", reason: err.message }; - } - return { - type: "block", - reason: err instanceof Error ? err.message : String(err), - }; + // report-error-ignore: surfaced to the model as this call's own error + // result (isError: true), which the caller can see and retry — not a + // swallowed failure, so no separate incident report is warranted. + return errorResult(call.id, err); } - // `postQuestion` stamps this `questionId` (derived from the tool-call - // id, not minted per attempt) on the outbound question card; reusing it - // as the gate's own `correlationId` (rather than minting a second, - // unrelated id) is what lets the answer route resolve this exact gate - // later (CL-7191) — the block a person answers is keyed on `blockId`, - // which for a question block IS `questionId` (`packages/chat/src/schema.ts`'s - // "agent-authored pollId/formId" comment applies identically here). The - // same derivation is what makes a crash between post and - // `suspendOnGate` retry-safe: the next attempt re-posts this id and the - // write path returns the existing card (CL-7248). - const correlationId = questionId; - const timeoutAt = Date.now() + ASK_USER_TIMEOUT_MS; - const gateId = `pending-${correlationId}`; - const pendingOp: PendingOperation = { - correlationId, - kind: "message_response", - registeredAt: Date.now(), - gateId, - timeoutAt, - suspendedCall: call, - }; - return { - type: "suspend", - gate: { type: "message_response", gateId, correlationId, timeoutAt }, - pendingOp, + callId: call.id, + isError: false, + content: + "Question posted to the user. Do not wait for a reply here or call " + + "another tool for it: end this turn now. The user's answer will " + + "arrive as your next inbound message, not as this call's result.", }; } @@ -128,8 +97,8 @@ async function beforeAskUser( * The `@corbits/interaction-tools` bundle factory: one tool, `ask_user`, * for posing an enumerable-option interview question as an in-thread card * instead of a prose list. No approval gate — showing a question is not an - * external side effect — but its own `message_response` gate parks the turn - * until the user answers. + * external side effect — and no `message_response` gate either: the call + * posts and returns immediately, ending the turn. */ export const interactionTools = defineTool({ id: "@corbits/interaction-tools/ask-user", @@ -144,9 +113,9 @@ export const interactionTools = defineTool({ "options, rendered as an interactive card in the conversation " + "instead of a prose list. Use this whenever interviewing the " + "user with a small set of enumerable options (2-6), rather " + - "than writing the options out as text. Parks the turn until " + - "the user answers: the answer becomes this call's result, not " + - "a separate message to watch for.", + "than writing the options out as text. Ends your turn once " + + "posted: the user's answer arrives as your next message, not " + + "as this call's result.", inputSchema: { type: "object", properties: { @@ -176,26 +145,9 @@ export const interactionTools = defineTool({ }, }, ], - beforeToolExtension: { - beforeTool: (call: ToolCall) => beforeAskUser(env, call), - }, run: (call: ToolCall, _signal: AbortSignal) => { - // `beforeToolExtension` above intercepts every ask_user call and parks - // it before dispatch ever reaches here; reaching this arm means - // `interactionTools`'s `beforeToolExtension` was never composed into - // `ResolvedTools.beforeToolExtensions` (`vendor/intx/agent/src/agent.ts`) - // — a re-pin or refactor dropped that wiring — not merely "unreachable". if (call.name === ASK_USER_TOOL) { - return Promise.resolve( - errorResult( - call.id, - new Error( - `${ASK_USER_TOOL}'s beforeToolExtension was not composed ` + - "into ResolvedTools.beforeToolExtensions — a re-pin or " + - "refactor dropped the wiring in vendor/intx/agent/src/agent.ts", - ), - ), - ); + return runAskUser(env, call); } return Promise.resolve( errorResult( diff --git a/scripts/checks/kill-dates.txt b/scripts/checks/kill-dates.txt index 3cf28682a2..fdc3be7029 100644 --- a/scripts/checks/kill-dates.txt +++ b/scripts/checks/kill-dates.txt @@ -19,12 +19,12 @@ vendor/intx/db | sawyer | 2026-10-26 | 1e81c60aa52652c08c57c12e0b78a56cbc17bcdba vendor/intx/harness | sawyer | 2026-10-26 | ca4c48e126951568967dfc296b7c4effe61d150d9809a2cd9fb00bc88c6e27b9 vendor/intx/hub-agent | sawyer | 2026-10-26 | fb5cb1f45199fd2ec41e1db0eeb16b1096addf137b33cce83e0cf5cd2ce2273e vendor/intx/hub-api | sawyer | 2026-10-26 | ce91e64049accf7f925d9845a909539bb432887416fdee590f967b58c99eea23 -vendor/intx/hub-sessions | sawyer | 2026-10-26 | 6f0845e5ddb7b62367bb7553c57e0ba5e0ba14e54b3a02150a5fe0aa01938f38 -vendor/intx/inference | sawyer | 2026-10-26 | 0bd31bc7a3553aa8d7741ca00354e94d798ec7505b6f4a2ed8c446e87657f5b9 +vendor/intx/hub-sessions | sawyer | 2026-10-26 | 39cd4d3f0188e8b086f6667949f1ba7f1330510cc56f57cb7e890ffbae1a592a +vendor/intx/inference | sawyer | 2026-10-26 | e97ec7be40ed0c120d93021b90b8c834fad85c1fcfa7a99f447e5bf7c9f21c52 vendor/intx/mail-memory | sawyer | 2026-10-26 | fdae7df7c68b447e8800ad8f5b00403f5f95dbbb62a7f9b7157474870508ca47 vendor/intx/mailbox | sawyer | 2026-10-26 | 6b9ba2978a7c31e408392803f4014dacf53f191e2101aae781bc2c37e9430cb2 vendor/intx/mime | sawyer | 2026-10-26 | 763898b7960e2ebd76ee3399f01f7973dd001834bb8bacc602d0c6f501e978b8 -vendor/intx/types | sawyer | 2026-10-26 | a159b80f8c6343a10b6d0562fe73137082a0665af70629f7044de187b120decc +vendor/intx/types | sawyer | 2026-10-26 | 4725b47a3b0dd754294dfe8966703d3ef05d609dba0cad886dc6e8b373adc016 vendor/intx/workflow | sawyer | 2026-10-26 | 641d9d20d928fe94dfa576aeda5014459d060f6ff218b7cf7bc8b97bbe081145 vendor/intx/workflow-deploy | sawyer | 2026-10-26 | d8074ac983cf00c7680e00aadce5abf087eddeb17a37e1ac2782cc90729d304c vendor/intx/workflow-host | sawyer | 2026-10-26 | 222b3586a6ad4d83d60aab14fdc79c55db4831db9719c316edbe687b693045e3 diff --git a/scripts/checks/report-error-baseline.txt b/scripts/checks/report-error-baseline.txt index 72c077dd6c..dfc9dfa220 100644 --- a/scripts/checks/report-error-baseline.txt +++ b/scripts/checks/report-error-baseline.txt @@ -168,7 +168,6 @@ packages/granola-tools/src/tool.ts 1 return null; packages/granola-tools/src/tool.ts 1 return { packages/granola-tools/src/tool.ts 2 return { packages/inbox/src/routes.ts 1 publishLog.error( -packages/interaction-tools/src/tool.ts 1 if (err instanceof NoOwnChannelError) { packages/jimmy-agent/src/gif-search-tool.ts 1 return false; packages/jimmy-agent/src/gif-search-tool.ts 1 return null; packages/jimmy-agent/src/gif-search-tool.ts 1 return { diff --git a/vendor/intx/hub-sessions/VENDORED-FROM b/vendor/intx/hub-sessions/VENDORED-FROM index ac2f80fd99..2b38852536 100644 --- a/vendor/intx/hub-sessions/VENDORED-FROM +++ b/vendor/intx/hub-sessions/VENDORED-FROM @@ -1,4 +1,4 @@ Source: https://github.com/faremeter/interchange (packages/hub-sessions) Commit: a8bc06ae38661c5e0ed91ded8559bf09f502213d (origin/main, 2026-08-27) License: LGPL-2.1-only (see vendor/intx/LICENSE) -Local modifications: exports map repointed from the upstream intx-src condition to direct TypeScript source resolution (types/default -> ./src/...); dist references removed. Terminal-anchor pack acceptance: hub-session-lookups.ts's receiveWorkflowRunPack gates the anchor lookup on the exported pure helper ownsWorkflowRunRepo (self-anchored row with a routable address, no liveness requirement) instead of upstream's `status in (deployed, running)`, so a terminal run can still land the inbox-enqueue and markConsumed-rejection packs that retire mail arriving in its teardown window; CL-6361 widens the same lookup to peel a per-step pack source address back to its base run's anchor via anchorAddressForPackSource; CL-6379 classifies an accepted pack's newly-terminal runs through decideTerminalRunFlip so a section occurrence's repo-local child run (turn__) is skipped quietly. CL-6324: a third code-sourced deploy front, deployAdoptedCodeSourcedWorkflow (plus the deployAdoptedWorkflowFromSource service method and its AdoptingWorkflowDeployer / DeployAdoptedWorkflowFromSourceParams types), deploys onto shared capacity while ADOPTING an anchor workflow_run row the caller already owns; it composes upstream's emitSourceRefDeployFrame and a guarded UPDATE. DeployWorkflowFromSourceParams / DeployPreparedCodeSourcedWorkflowParams gain an optional sourceRef threaded through bindAssetAttachmentResolver / bindSourceAttachmentResolver so a per-run source tree on refs/heads/runs/ packs the pinned commit. CL-6324: workflow-probe-gate.ts's PersistFrozenApprovalFn carries the inert projection and createDbFrozenApprovalWriter stamps workflow_definition_version.wire_projection in the same transaction as approved_wire_hash. CL-6478: sanitize-tool-name.ts + event-collector.ts's tool_call case persist only a tool-call name encodeToolName can re-invert (anything else collapses to MALFORMED_TOOL_NAME), so one bad name fails its turn instead of wedging the room; @intx/inference is a dependency for this. CL-6595: workflow-run-kind.ts's validatePush also reports a run sealed from birth (combined events.jsonl with no per-event blobs) as newly terminal, and the new readCommittedWorkflowRunTerminalStatus export backs a same-push markTerminal backfill in hub-session-lookups.ts; both classify through upstream's classifyTerminalEvent. Retired at this pin: the per-event inference.usage forward (upstream fab86ca9 emits TurnUsage once per turn), the collector-level event serialization (upstream a1d419c3 serializes at the registry) and the anchor-before-frame ordering with DeployFrameNotSentError (upstream a203a057 + 9e11829f, isDeployFrameFailure). CL-7190: registerSignalCorrelation (hub-session-lookups.ts) now throws for any signal kind other than "approval", failing loud instead of silently mis-persisting a future SignalKind it has no co-write for. CL-7191: UserMessageParams gains an optional correlationId (session-service.ts) stamped as sendUserMessage's headers.interchangeCorrelationId, so a plain chat message can resolve a parked message_response gate. CL-6396: sidecar-events.ts's agent.event map and sidecar-handler.ts's agent.event dispatch forward an optional childRunId from the sidecar frame so the hub can close the matching occurrence row. +Local modifications: exports map repointed from the upstream intx-src condition to direct TypeScript source resolution (types/default -> ./src/...); dist references removed. Terminal-anchor pack acceptance: hub-session-lookups.ts's receiveWorkflowRunPack gates the anchor lookup on the exported pure helper ownsWorkflowRunRepo (self-anchored row with a routable address, no liveness requirement) instead of upstream's `status in (deployed, running)`, so a terminal run can still land the inbox-enqueue and markConsumed-rejection packs that retire mail arriving in its teardown window; CL-6361 widens the same lookup to peel a per-step pack source address back to its base run's anchor via anchorAddressForPackSource; CL-6379 classifies an accepted pack's newly-terminal runs through decideTerminalRunFlip so a section occurrence's repo-local child run (turn__) is skipped quietly. CL-6324: a third code-sourced deploy front, deployAdoptedCodeSourcedWorkflow (plus the deployAdoptedWorkflowFromSource service method and its AdoptingWorkflowDeployer / DeployAdoptedWorkflowFromSourceParams types), deploys onto shared capacity while ADOPTING an anchor workflow_run row the caller already owns; it composes upstream's emitSourceRefDeployFrame and a guarded UPDATE. DeployWorkflowFromSourceParams / DeployPreparedCodeSourcedWorkflowParams gain an optional sourceRef threaded through bindAssetAttachmentResolver / bindSourceAttachmentResolver so a per-run source tree on refs/heads/runs/ packs the pinned commit. CL-6324: workflow-probe-gate.ts's PersistFrozenApprovalFn carries the inert projection and createDbFrozenApprovalWriter stamps workflow_definition_version.wire_projection in the same transaction as approved_wire_hash. CL-6478: sanitize-tool-name.ts + event-collector.ts's tool_call case persist only a tool-call name encodeToolName can re-invert (anything else collapses to MALFORMED_TOOL_NAME), so one bad name fails its turn instead of wedging the room; @intx/inference is a dependency for this. CL-6595: workflow-run-kind.ts's validatePush also reports a run sealed from birth (combined events.jsonl with no per-event blobs) as newly terminal, and the new readCommittedWorkflowRunTerminalStatus export backs a same-push markTerminal backfill in hub-session-lookups.ts; both classify through upstream's classifyTerminalEvent. Retired at this pin: the per-event inference.usage forward (upstream fab86ca9 emits TurnUsage once per turn), the collector-level event serialization (upstream a1d419c3 serializes at the registry) and the anchor-before-frame ordering with DeployFrameNotSentError (upstream a203a057 + 9e11829f, isDeployFrameFailure). CL-7190: registerSignalCorrelation (hub-session-lookups.ts) now throws for any signal kind other than "approval", failing loud instead of silently mis-persisting a future SignalKind it has no co-write for. CL-7443 retires CL-7191's UserMessageParams.correlationId (session-service.ts): `ask_user` no longer parks a message_response gate for a plain chat message to resolve, so sendUserMessage stamps no correlation id and session-service.ts is back to upstream's shape for this field. CL-6396: sidecar-events.ts's agent.event map and sidecar-handler.ts's agent.event dispatch forward an optional childRunId from the sidecar frame so the hub can close the matching occurrence row. diff --git a/vendor/intx/hub-sessions/src/session-service.ts b/vendor/intx/hub-sessions/src/session-service.ts index 03860dfd0b..455bcf79ab 100644 --- a/vendor/intx/hub-sessions/src/session-service.ts +++ b/vendor/intx/hub-sessions/src/session-service.ts @@ -334,11 +334,6 @@ export type UserMessageParams = { sessionId: string; tenantId: string; cryptoProvider: CryptoProvider; - /** Stamped as the MIME `Interchange-Correlation-ID` header (CL-7191) so - * the reactor's `tryCorrelate` can resolve a parked `message_response` - * gate against this message rather than only ordering. Absent for every - * ordinary message. */ - correlationId?: string; }; export type SessionServiceDeps = { @@ -2286,7 +2281,6 @@ export function createSessionService( sessionId, tenantId, cryptoProvider, - correlationId, } = params; const headers: MessageHeaders = { @@ -2300,7 +2294,7 @@ export function createSessionService( references, mimeVersion: "1.0", interchangeType: "conversation.message", - interchangeCorrelationId: correlationId, + interchangeCorrelationId: undefined, interchangeTenantId: tenantId, interchangeAgentId: undefined, interchangeSessionId: sessionId, diff --git a/vendor/intx/inference/VENDORED-FROM b/vendor/intx/inference/VENDORED-FROM index 507bec5c0d..b726fdc237 100644 --- a/vendor/intx/inference/VENDORED-FROM +++ b/vendor/intx/inference/VENDORED-FROM @@ -1,4 +1,4 @@ Source: https://github.com/faremeter/interchange (packages/inference) Commit: a8bc06ae38661c5e0ed91ded8559bf09f502213d (origin/main, 2026-08-27) License: LGPL-2.1-only (see vendor/intx/LICENSE) -Local modifications: exports map repointed from the upstream intx-src condition to direct TypeScript source resolution (types/default -> ./src/...); dist references removed. providers/google-genai-files.ts builds its upload body as `new Uint8Array(bytes)`: TS 6's lib.dom `BodyInit` rejects `Uint8Array` and workbench compiles this source under DOM-lib packages (upstream compiles ESNext-only under TS 5.9). CL-7190: a message_response resume branch in reactor.ts's resumePendingOperation/timeoutMessageFor, plus reactor.test.ts and testing/fakes.ts, a new regression-test harness driving createReactor directly (this package previously had zero tests). +Local modifications: exports map repointed from the upstream intx-src condition to direct TypeScript source resolution (types/default -> ./src/...); dist references removed. providers/google-genai-files.ts builds its upload body as `new Uint8Array(bytes)`: TS 6's lib.dom `BodyInit` rejects `Uint8Array` and workbench compiles this source under DOM-lib packages (upstream compiles ESNext-only under TS 5.9). CL-7443 retires CL-7190's message_response resume branch in reactor.ts's resumePendingOperation/timeoutMessageFor (and its answer_result resume mode), plus the reactor.test.ts/testing/fakes.ts regression harness CL-7190 added to cover it: `ask_user` posts its question and ends the turn instead of parking a gate, so the reactor is back to zero local delta and zero tests, matching upstream. diff --git a/vendor/intx/inference/src/reactor.ts b/vendor/intx/inference/src/reactor.ts index bd87080e7e..e9310220f8 100644 --- a/vendor/intx/inference/src/reactor.ts +++ b/vendor/intx/inference/src/reactor.ts @@ -80,8 +80,6 @@ function timeoutMessageFor(kind: SignalKind): string { switch (kind) { case "approval": return "approval timed out"; - case "message_response": - return "question timed out with no answer"; default: return assertNever(kind); } @@ -461,8 +459,7 @@ export function createReactor(config: ReactorConfig): Reactor { type ResumeDispatch = | { mode: "redispatch"; calls: ToolCall[] } | { mode: "gate-cleared" } - | { mode: "error_result"; result: ToolResult } - | { mode: "answer_result"; result: ToolResult }; + | { mode: "error_result"; result: ToolResult }; // Decide how a correlated ask-flow pending operation resumes. An operation // that carries a `suspendedCall` is an ask-flow suspension: the correlated @@ -473,9 +470,7 @@ export function createReactor(config: ReactorConfig): Reactor { // The outer switch is total: `assertNever(op.kind)` rejects a future // SignalKind at compile time. `approval` additionally parses its reply as a // structured `ApprovalDecision`, failing loud at that parse boundary rather - // than reaching its own nested `assertNever`; `message_response` takes the - // reply's body verbatim, since a question's answer is prose, not a decision - // to parse. + // than reaching its own nested `assertNever`. function resumePendingOperation( op: PendingOperation, message: InboundMessage, @@ -535,18 +530,6 @@ export function createReactor(config: ReactorConfig): Reactor { return assertNever(decision.outcome); } } - case "message_response": - // The correlated reply IS the answer: hand its body straight back as - // the parked call's result rather than re-running the call, since - // there is nothing left to execute once the user has answered. - return { - mode: "answer_result", - result: { - callId: suspendedCall.id, - content: message.content ?? "", - isError: false, - }, - }; default: return assertNever(op.kind); } @@ -615,13 +598,11 @@ export function createReactor(config: ReactorConfig): Reactor { enqueue({ type: "resume.execute_tools", calls: dispatch.calls }); break; } - case "error_result": - case "answer_result": { - // Either the approver denied the call or a parked question got its - // answer. Clear the gate SILENTLY (like the approved redispatch) so - // it cannot also trip onGateCleared and enqueue a second - // continuation. The result answers the parked call directly; the - // director appends it and re-infers once. + case "error_result": { + // The approver denied the call. Clear the gate SILENTLY (like the + // approved redispatch) so it cannot also trip onGateCleared and + // enqueue a second continuation. The result answers the parked call + // directly; the director appends it and re-infers once. if (gate !== undefined) { gates.clearSilently(gate.gateId); if (stateManager !== null) { diff --git a/vendor/intx/types/VENDORED-FROM b/vendor/intx/types/VENDORED-FROM index 2bf2e87a9a..cd0bc79c34 100644 --- a/vendor/intx/types/VENDORED-FROM +++ b/vendor/intx/types/VENDORED-FROM @@ -1,4 +1,4 @@ Source: https://github.com/faremeter/interchange (packages/types) Commit: a8bc06ae38661c5e0ed91ded8559bf09f502213d (origin/main, 2026-08-27) License: LGPL-2.1-only (see vendor/intx/LICENSE) -Local modifications: exports map repointed from the upstream intx-src condition to direct TypeScript source resolution (types/default -> ./src/...); dist references removed. CL-7190: "message_response" added to signals.ts's signalKinds, alongside signalKindToGateType. CL-6396: AgentEventFrame gains an optional childRunId so a sidecar can name the occurrence (turn__) the event belongs to. +Local modifications: exports map repointed from the upstream intx-src condition to direct TypeScript source resolution (types/default -> ./src/...); dist references removed. CL-7443 retires CL-7190's local delta ("message_response" added to signals.ts's signalKinds, alongside signalKindToGateType): `ask_user` posts its question and ends the turn instead of parking a signal, so signals.ts is back to upstream's approval-only shape. CL-6396: AgentEventFrame gains an optional childRunId so a sidecar can name the occurrence (turn__) the event belongs to. diff --git a/vendor/intx/types/src/signals.ts b/vendor/intx/types/src/signals.ts index 2f517d5a63..53855c26da 100644 --- a/vendor/intx/types/src/signals.ts +++ b/vendor/intx/types/src/signals.ts @@ -8,7 +8,7 @@ import type { GateType } from "./runtime"; * iterable and can be composed into wire validators) and a derived * TypeScript union. */ -export const signalKinds = ["approval", "message_response"] as const; +export const signalKinds = ["approval"] as const; export const SignalKind = type.enumerated(...signalKinds); export type SignalKind = typeof SignalKind.infer; @@ -53,8 +53,6 @@ export function signalKindToGateType(kind: SignalKind): GateType { switch (kind) { case "approval": return "approval"; - case "message_response": - return "message_response"; default: return assertNever(kind); } diff --git a/workflows/assistant/src/index.ts b/workflows/assistant/src/index.ts index 245bfa3757..088f5eb342 100644 --- a/workflows/assistant/src/index.ts +++ b/workflows/assistant/src/index.ts @@ -50,7 +50,7 @@ export const ASSISTANT_TOOL_PACKAGE_PINS: readonly ToolPackagePin[] = [ { name: "@corbits/catalog-tools", version: "0.0.2" }, { name: "@corbits/skills-tools", version: "0.0.6" }, { name: "@corbits/mcp-tools", version: "0.0.11" }, - { name: "@corbits/interaction-tools", version: "0.0.6" }, + { name: "@corbits/interaction-tools", version: "0.0.7" }, { name: "@corbits/manus-tools", version: "0.0.11" }, { name: "@corbits/workflow-authoring-tools", version: "0.0.4" }, ]; From 333f25b41a84b99677bc451a89cdd4bdc7bf57cd Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 16:54:24 -0700 Subject: [PATCH 3/9] Update docs: ask_user ends the turn instead of parking a gate docs/CHAT.md now describes ask_user's post-and-end-turn shape (CL-7443) instead of the retired message_response gate/correlation-id mechanism. --- docs/CHAT.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/CHAT.md b/docs/CHAT.md index b704943893..e6c4a60bb2 100644 --- a/docs/CHAT.md +++ b/docs/CHAT.md @@ -204,8 +204,8 @@ asks to stop it: turn row `cancelled` rather than `failed`. - **Already off our call stack.** `sendMail` has no cancellable primitive of its own (CL-7230) — once it resolves, the agent is - generating (or parked on a `message_response` gate somewhere in the - execution plane this package cannot see into) with nothing left + generating (or parked on an approval gate somewhere in the execution + plane this package cannot see into) with nothing left registered to abort. `cancelWorkbenchTurn` snapshots every turn `AgentTurnStore.findRunningTurns` reports for the workbench _before_ triggering the registry above (so a row the abort path already @@ -634,6 +634,21 @@ pinned strip the shell mock shows above the message list as a jump-to chip; clicking one scrolls the timeline to that message's own row (`messageDomId`). +### `ask_user` posts and ends the turn, not a park (CL-7443) + +`@corbits/interaction-tools`' `ask_user` tool has no gate: it posts a +`question` block card and returns immediately with a tool result that +tells the model to end its turn — a Workbench agent is an unbounded +interactive step where every inbound mail is already its next turn, so +"ask a person" is native as "post and stop," not a structural suspend. No +correlation id, no timeout, no parked call. The person's answer arrives +later as an ordinary reply through the block-response route below, which +becomes the agent's next inbound message and therefore its next turn — +never this call's own result. (Before CL-7443, `ask_user` parked the call +on a vendored `message_response` signal/gate until a correlated reply +resolved it; that machinery, and the correlation-id plumbing it needed +through `sendMail`/`sendUserMessage`, is retired.) + ### Question answers notify at most once (CL-7192) A question block's answer is relayed into the workbench as the From 6cd9b3232d12a5a99f0b5e3b94ad99c7ec3ddf9b Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 18:10:02 -0700 Subject: [PATCH 4/9] Add tests for dropping unclassified pending-op kinds on restore (CL-7443) A checkpoint fixture with a retired message_response pending operation alongside a valid approval one should restore with only the approval op surviving, not throw. --- apps/sidecar/src/conversation-state.test.ts | 56 ++++++++++++++++++++- vendor/intx/types/src/signals.test.ts | 20 -------- 2 files changed, 55 insertions(+), 21 deletions(-) delete mode 100644 vendor/intx/types/src/signals.test.ts diff --git a/apps/sidecar/src/conversation-state.test.ts b/apps/sidecar/src/conversation-state.test.ts index b905f68ed3..0f66038af8 100644 --- a/apps/sidecar/src/conversation-state.test.ts +++ b/apps/sidecar/src/conversation-state.test.ts @@ -9,7 +9,7 @@ import type { RepoId, RepoStore, } from "@intx/hub-sessions/substrate"; -import type { ConversationTurn } from "@intx/types/runtime"; +import type { ConversationTurn, PendingOperation } from "@intx/types/runtime"; import { createDurableConversationStore, @@ -169,6 +169,60 @@ test("two rooms of one agent keep isolated turns; a new room starts empty", asyn expect(await store.bindOriginatingWorkbench("chan_b")).toBe(false); }); +const EMPTY_TOKEN_USAGE = { + input: 0, + output: 0, + cacheRead: 0, + cacheWrite: 0, + thinking: 0, +}; + +test("a retired signal-kind pending op is dropped on restore, not thrown on", async () => { + const root = tmpDir("conv-retired-kind-"); + const agentStateDir = path.join(root, "agent-state", "default", "chan_a"); + await fs.promises.mkdir(agentStateDir, { recursive: true }); + + const survivingOp: PendingOperation = { + correlationId: "corr-approval", + kind: "approval", + registeredAt: 0, + gateId: "gate-approval", + }; + const retiredOp = { + correlationId: "corr-retired", + kind: "message_response", + registeredAt: 0, + gateId: "gate-retired", + }; + + await fs.promises.writeFile( + path.join(agentStateDir, "checkpoint.json"), + JSON.stringify({ + turns: [], + pendingOperations: [survivingOp, retiredOp], + tokenUsage: EMPTY_TOKEN_USAGE, + connectorState: null, + }), + ); + await fs.promises.writeFile( + path.join(agentStateDir, "checkpoint.meta.json"), + JSON.stringify({ + checkpointSeq: 0, + turnCount: 0, + pendingOperations: [survivingOp, retiredOp], + tokenUsage: EMPTY_TOKEN_USAGE, + connectorState: null, + }), + ); + + const reconstructed = await reconstructDurableConversation( + agentStateDir, + "default/chan_a", + ); + + expect(reconstructed?.pendingOperations).toEqual([survivingOp]); +}); + test("two queued mails bind and mirror under each message's From not a later origin", async () => { const root = tmpDir("conv-queued-"); const { store } = await makeStore(root); diff --git a/vendor/intx/types/src/signals.test.ts b/vendor/intx/types/src/signals.test.ts deleted file mode 100644 index b7437c2f5a..0000000000 --- a/vendor/intx/types/src/signals.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { expect, test } from "bun:test"; -import { type } from "arktype"; - -import { signalKinds, signalKindToGateType, SignalKind } from "./signals"; - -// CL-7443: `message_response` (CL-7190) is retired — `ask_user` posts its -// question and ends the turn instead of parking on a signal, so the reactor -// has no signal kind left but the native `approval` ask. -test("the only signal kind is approval", () => { - expect(signalKinds).toEqual(["approval"]); -}); - -test("SignalKind accepts approval and rejects message_response", () => { - expect(SignalKind("approval")).toBe("approval"); - expect(SignalKind("message_response")).toBeInstanceOf(type.errors); -}); - -test("signalKindToGateType maps approval to the approval gate", () => { - expect(signalKindToGateType("approval")).toBe("approval"); -}); From 5df9e340a6ac3e16887dfb08870130a60a03ea9d Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 18:10:11 -0700 Subject: [PATCH 5/9] Drop unclassified pending-op kinds on warm-agent restore (CL-7443) A warm agent's persisted checkpoint/WAL can still carry a pending operation with a signal kind this build no longer classifies (e.g. a message_response op written before CL-7443 retired that kind). Left alone, the reactor's rehydrateGates throws "Unclassified signal kind" on every respawn, permanently wedging the agent. Parse metadata.pendingOperations on restore and drop any op whose kind is not a current SignalKind, reporting each drop through reportError (operation: pending_op_dropped_unknown_kind) instead of letting it reach the reactor. --- apps/sidecar/src/conversation-state.ts | 49 +++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/apps/sidecar/src/conversation-state.ts b/apps/sidecar/src/conversation-state.ts index b411ef8b49..6179c1ca8a 100644 --- a/apps/sidecar/src/conversation-state.ts +++ b/apps/sidecar/src/conversation-state.ts @@ -131,6 +131,7 @@ import path from "node:path"; import { type } from "arktype"; import { getLogger } from "@intx/log"; +import { reportError } from "@corbits/error-sink"; import { createConnectorRouter } from "@intx/harness"; import type { ConnectorReplyParts, RouteDecision } from "@intx/harness"; import { @@ -143,6 +144,7 @@ import type { RepoStore, } from "@intx/hub-sessions/substrate"; import { WORKFLOW_RUN_AGENT_STATE_PREFIX } from "@intx/hub-sessions/substrate"; +import { SignalKind } from "@intx/types"; import { UNSCOPED_ORIGINATING_WORKBENCH_ID } from "./originating-workbench"; import { @@ -995,6 +997,51 @@ function castValidatedEnvelope(items: unknown[]): T[] { return items as T[]; } +/** + * A pending operation's `kind` envelope: just enough structure to read + * `kind` back off an otherwise-unvalidated `PendingOperation` (the element + * validator itself lives in the reactor, per `castValidatedEnvelope`'s + * doc comment above). Used only to detect a `kind` the running build's + * `SignalKind` no longer recognizes -- e.g. CL-7443 retired + * `message_response` -- before the reactor's `rehydrateGates` reaches it, + * since an unclassified kind there throws and blocks every future respawn. + */ +const PendingOperationKindEnvelope = type({ kind: "unknown" }); + +/** + * Drop any restored pending operation whose `kind` is not a `SignalKind` + * this build still classifies, reporting each drop through `reportError` + * rather than letting the reactor's `rehydrateGates` throw on it. A retired + * signal kind (CL-7443's `message_response`) can still be sitting in a warm + * agent's on-disk checkpoint/WAL from before the retirement; without this + * filter, every respawn of that agent would throw + * "Unclassified signal kind" and never start. The person's in-flight + * question is simply lost here -- their eventual reply just becomes the + * next ordinary turn (docs/CHAT.md). + */ +function dropUnclassifiedPendingOperations( + items: unknown[], + agentKey: string, +): unknown[] { + return items.filter((item) => { + const envelope = PendingOperationKindEnvelope(item); + const kind = envelope instanceof type.errors ? undefined : envelope.kind; + if (SignalKind(kind) instanceof type.errors) { + reportError( + new Error( + `pending operation with unclassified signal kind ${JSON.stringify(kind)} dropped on restore for agent ${agentKey}`, + ), + { + operation: "pending_op_dropped_unknown_kind", + agentId: agentKey, + }, + ); + return false; + } + return true; + }); +} + /** * Reconstruct the warm agent's conversation from the two-tier on-disk * layout under `agentStateDir` @@ -1050,7 +1097,7 @@ export async function reconstructDurableConversation( return { turns: castValidatedEnvelope(turns), pendingOperations: castValidatedEnvelope( - metadata.pendingOperations, + dropUnclassifiedPendingOperations(metadata.pendingOperations, agentKey), ), tokenUsage: metadata.tokenUsage, connectorState: metadata.connectorState, From 7ecb22227be7c8c8d33ca7605205cddb59f296ac Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 18:10:17 -0700 Subject: [PATCH 6/9] vendor/intx/inference: restore reactor.ts to pristine upstream (CL-7443) reactor.ts still carried the retired message_response resume branch (resumePendingOperation/timeoutMessageFor) and its own SignalKind import, even though CL-7443's docs/ledger already claimed the package was back to zero local delta. Replace it byte-for-byte with upstream a8bc06ae's packages/inference/src/reactor.ts and update the recorded kill-dates tree hash to match. --- scripts/checks/kill-dates.txt | 4 +- vendor/intx/inference/src/reactor.ts | 85 ++++++++++++---------------- 2 files changed, 38 insertions(+), 51 deletions(-) diff --git a/scripts/checks/kill-dates.txt b/scripts/checks/kill-dates.txt index fdc3be7029..211da56810 100644 --- a/scripts/checks/kill-dates.txt +++ b/scripts/checks/kill-dates.txt @@ -20,11 +20,11 @@ vendor/intx/harness | sawyer | 2026-10-26 | ca4c48e126951568967dfc296b7c4effe61d vendor/intx/hub-agent | sawyer | 2026-10-26 | fb5cb1f45199fd2ec41e1db0eeb16b1096addf137b33cce83e0cf5cd2ce2273e vendor/intx/hub-api | sawyer | 2026-10-26 | ce91e64049accf7f925d9845a909539bb432887416fdee590f967b58c99eea23 vendor/intx/hub-sessions | sawyer | 2026-10-26 | 39cd4d3f0188e8b086f6667949f1ba7f1330510cc56f57cb7e890ffbae1a592a -vendor/intx/inference | sawyer | 2026-10-26 | e97ec7be40ed0c120d93021b90b8c834fad85c1fcfa7a99f447e5bf7c9f21c52 +vendor/intx/inference | sawyer | 2026-10-26 | 7ada03fc9e6699e5451254ef84a3954cfbbebaf16645a96f15f3c162f5e14013 vendor/intx/mail-memory | sawyer | 2026-10-26 | fdae7df7c68b447e8800ad8f5b00403f5f95dbbb62a7f9b7157474870508ca47 vendor/intx/mailbox | sawyer | 2026-10-26 | 6b9ba2978a7c31e408392803f4014dacf53f191e2101aae781bc2c37e9430cb2 vendor/intx/mime | sawyer | 2026-10-26 | 763898b7960e2ebd76ee3399f01f7973dd001834bb8bacc602d0c6f501e978b8 -vendor/intx/types | sawyer | 2026-10-26 | 4725b47a3b0dd754294dfe8966703d3ef05d609dba0cad886dc6e8b373adc016 +vendor/intx/types | sawyer | 2026-10-26 | 02cc1222676a6a00239ef98f5394e4f62da6e8caa34c94a248dbdf7cee66ebd4 vendor/intx/workflow | sawyer | 2026-10-26 | 641d9d20d928fe94dfa576aeda5014459d060f6ff218b7cf7bc8b97bbe081145 vendor/intx/workflow-deploy | sawyer | 2026-10-26 | d8074ac983cf00c7680e00aadce5abf087eddeb17a37e1ac2782cc90729d304c vendor/intx/workflow-host | sawyer | 2026-10-26 | 222b3586a6ad4d83d60aab14fdc79c55db4831db9719c316edbe687b693045e3 diff --git a/vendor/intx/inference/src/reactor.ts b/vendor/intx/inference/src/reactor.ts index e9310220f8..9c6cb9542c 100644 --- a/vendor/intx/inference/src/reactor.ts +++ b/vendor/intx/inference/src/reactor.ts @@ -42,7 +42,6 @@ import type { import { getLogger } from "@intx/log"; import { ApprovalDecision, signalKindToGateType } from "@intx/types"; -import type { SignalKind } from "@intx/types"; import { canonicalJsonStringify } from "@intx/types/wire-definition-hash"; import { type } from "arktype"; import { runInference } from "./harness"; @@ -73,18 +72,6 @@ function assertNever(x: never): never { throw new Error(`Unhandled resume case: ${JSON.stringify(x)}`); } -// Synthetic error text for a parked call whose gate timed out with no reply. -// Exhaustive over SignalKind so a newly added kind must supply its own wording -// rather than inheriting another kind's message. -function timeoutMessageFor(kind: SignalKind): string { - switch (kind) { - case "approval": - return "approval timed out"; - default: - return assertNever(kind); - } -} - function buildHarnessOpts( turns: ConversationTurn[], source: InferenceSource, @@ -461,16 +448,17 @@ export function createReactor(config: ReactorConfig): Reactor { | { mode: "gate-cleared" } | { mode: "error_result"; result: ToolResult }; - // Decide how a correlated ask-flow pending operation resumes. An operation - // that carries a `suspendedCall` is an ask-flow suspension: the correlated - // reply routes it down whichever rail its `kind` defines. An operation - // without one is an async-tool pending marker, which resumes on the normal - // gate-cleared rail. + // Decide how a correlated approval-kind pending operation resumes, granting + // any one-shot bypass synchronously so no delivery can interleave between the + // grant and the re-dispatch enqueued by the caller. An operation that carries + // a `suspendedCall` is an ask-flow suspension: the approver's decision routes + // it down the re-dispatch rail. An operation without one is an async-tool + // pending marker, which resumes on the normal gate-cleared rail. // - // The outer switch is total: `assertNever(op.kind)` rejects a future - // SignalKind at compile time. `approval` additionally parses its reply as a - // structured `ApprovalDecision`, failing loud at that parse boundary rather - // than reaching its own nested `assertNever`. + // The nested switch is total: the outer `assertNever(op.kind)` rejects a + // future SignalKind at compile time, and the inner `assertNever` rejects a + // future decision outcome. A malformed decision body fails loud at the parse + // boundary before the switch. function resumePendingOperation( op: PendingOperation, message: InboundMessage, @@ -480,29 +468,29 @@ export function createReactor(config: ReactorConfig): Reactor { } const suspendedCall = op.suspendedCall; - switch (op.kind) { - case "approval": { - if (message.content === undefined) { - throw new Error( - `Correlated approval decision for ${op.correlationId} has no body to parse`, - ); - } - let raw: unknown; - try { - raw = JSON.parse(message.content); - } catch (cause) { - throw new Error( - `Correlated approval decision for ${op.correlationId} is not valid JSON`, - { cause }, - ); - } - const decision = ApprovalDecision(raw); - if (decision instanceof type.errors) { - throw new Error( - `Correlated approval decision for ${op.correlationId} is malformed: ${decision.summary}`, - ); - } + if (message.content === undefined) { + throw new Error( + `Correlated approval decision for ${op.correlationId} has no body to parse`, + ); + } + let raw: unknown; + try { + raw = JSON.parse(message.content); + } catch (cause) { + throw new Error( + `Correlated approval decision for ${op.correlationId} is not valid JSON`, + { cause }, + ); + } + const decision = ApprovalDecision(raw); + if (decision instanceof type.errors) { + throw new Error( + `Correlated approval decision for ${op.correlationId} is malformed: ${decision.summary}`, + ); + } + switch (op.kind) { + case "approval": switch (decision.outcome) { case "approved": // Authorize the exact parked call to run once, then re-dispatch it. @@ -529,7 +517,6 @@ export function createReactor(config: ReactorConfig): Reactor { default: return assertNever(decision.outcome); } - } default: return assertNever(op.kind); } @@ -600,9 +587,9 @@ export function createReactor(config: ReactorConfig): Reactor { } case "error_result": { // The approver denied the call. Clear the gate SILENTLY (like the - // approved redispatch) so it cannot also trip onGateCleared and - // enqueue a second continuation. The result answers the parked call - // directly; the director appends it and re-infers once. + // approved redispatch) so it cannot also trip onGateCleared and enqueue + // a second continuation. The synthetic error result answers the parked + // call; the director appends it and re-infers once. if (gate !== undefined) { gates.clearSilently(gate.gateId); if (stateManager !== null) { @@ -1158,7 +1145,7 @@ export function createReactor(config: ReactorConfig): Reactor { type: "resume.tool_result", result: { callId: op.suspendedCall.id, - content: timeoutMessageFor(op.kind), + content: "approval timed out", isError: true, }, }); From ebd8f58e428d75ed170e1c9e99083a5b9f365503 Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 18:10:22 -0700 Subject: [PATCH 7/9] Add tests for ask_user reporting post-question failures (CL-7443) Asserts the tool result text explicitly tells the model to stop (end this turn now / do not wait for a reply here), and exercises the existing no-own-channel failure path that the next commit routes through reportError. --- packages/interaction-tools/src/tool.test.ts | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/interaction-tools/src/tool.test.ts b/packages/interaction-tools/src/tool.test.ts index de4e016336..a32762c349 100644 --- a/packages/interaction-tools/src/tool.test.ts +++ b/packages/interaction-tools/src/tool.test.ts @@ -71,6 +71,32 @@ test("ask_user posts a question block and ends the turn with the answer arriving expect(String(result.content)).toMatch(/next inbound message/i); }); +test("ask_user's result text tells the model to stop, not to wait for a reply here", async () => { + const fetchImpl = (async () => + new Response( + JSON.stringify({ id: "msg_1", createdAt: "2026-08-17T00:00:00.000Z" }), + { status: 201 }, + )) as unknown as typeof fetch; + + const bundle = interactionTools(testEnv()); + const result = await withFetch(fetchImpl, () => + bundle.run( + { + id: "call_1", + name: ASK_USER_TOOL, + arguments: { question: "Which environment?", options: ["A", "B"] }, + }, + new AbortController().signal, + ), + ); + + // This is instruction text in the model's own context, not something the + // runtime enforces: nothing stops the model from calling another tool or + // continuing to talk after reading it (docs/CHAT.md). + expect(String(result.content)).toMatch(/end this turn now/i); + expect(String(result.content)).toMatch(/do not wait for a reply here/i); +}); + test("retrying ask_user for the same call reuses the questionId so a crash between post and return cannot orphan a second card", async () => { const postedQuestionIds: string[] = []; const fetchImpl = (async (_url: string | URL, init?: RequestInit) => { From 34b005de75bb69a85e142b5942cb3d635c2d7c52 Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 18:10:28 -0700 Subject: [PATCH 8/9] ask_user: report postQuestion failures through reportError (CL-7443) Replace the report-error-ignore on the postQuestion catch with a real reportError(err, { operation: "ask_user_post_question", agentId }) call before returning the error result to the model, so a failed post is a visible incident with a refId, not just a swallowed retry signal. Adds @corbits/error-sink as a dependency and regenerates the tsconfig project references. --- bun.lock | 205 ++++++++++--------- packages/interaction-tools/package.json | 1 + packages/interaction-tools/src/tool.ts | 9 +- packages/interaction-tools/tsconfig.json | 3 + packages/interaction-tools/tsconfig.src.json | 3 + 5 files changed, 122 insertions(+), 99 deletions(-) diff --git a/bun.lock b/bun.lock index 87cfc54aac..eaffc53d35 100644 --- a/bun.lock +++ b/bun.lock @@ -887,8 +887,9 @@ }, "packages/interaction-tools": { "name": "@corbits/interaction-tools", - "version": "0.0.6", + "version": "0.0.7", "dependencies": { + "@corbits/error-sink": "workspace:*", "@intx/agent": "workspace:*", "@intx/types": "workspace:*", "arktype": "catalog:", @@ -2087,13 +2088,17 @@ "@better-fetch/fetch": ["@better-fetch/fetch@1.3.1", "", {}, "sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g=="], - "@bufbuild/protobuf": ["@bufbuild/protobuf@2.14.0", "", {}, "sha512-C3UGsiCwSprE2NKIIFA3hCDlpXTMCAXRZuEVp88L1GY36Y41+rYL5fryE+nOFhp4p4JPQvdV8PQ4DWgHgeTE+w=="], + "@bufbuild/protobuf": ["@bufbuild/protobuf@2.14.1", "", {}, "sha512-agRJn3+EJDUe8AvxTx/LnHA/GErvLE62pSaSk7+MwFOtOv8eWBu/qCq2qoZjBjVZ3C2aiFJCveuSs17KMkYGOw=="], + + "@cacheable/memory": ["@cacheable/memory@2.2.0", "", { "dependencies": { "@cacheable/utils": "^2.5.0", "@keyv/bigmap": "^1.3.1", "hookified": "^1.15.1", "keyv": "^5.6.0" } }, "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ=="], + + "@cacheable/utils": ["@cacheable/utils@2.5.0", "", { "dependencies": { "hashery": "^1.5.1", "keyv": "^5.6.0" } }, "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA=="], - "@chat-adapter/shared": ["@chat-adapter/shared@4.38.1", "", { "dependencies": { "chat": "4.38.1" } }, "sha512-zJiMl43fiS3a2RjLFdCyTUTqcDY2xss1Acbzc9yfsw8YAkS0LZRdrNmp9/RjLhZB0+FzLarNAayvdKqF2GwnQg=="], + "@chat-adapter/shared": ["@chat-adapter/shared@4.39.0", "", { "dependencies": { "chat": "4.39.0" } }, "sha512-zc5mB5rYqbp4ts+Z3tG/YwkCypPYphriYpG95ZMRNGiEYx3cYZJZFmAFFM4YLfdz3VIQ99Fd0HFDYVNyAMV7cg=="], - "@chat-adapter/slack": ["@chat-adapter/slack@4.38.1", "", { "dependencies": { "@chat-adapter/shared": "4.38.1", "@slack/socket-mode": "^2.0.5", "@slack/web-api": "^7.18.0", "chat": "4.38.1" } }, "sha512-xMZ43YUQKzqOAiePR5mEFjhJPI6/jsEHCMq9Y+Rrm+N4+DotBddQDpbGMzb5oiogZD6iyMVCMvWSPLST7ZX0sg=="], + "@chat-adapter/slack": ["@chat-adapter/slack@4.39.0", "", { "dependencies": { "@chat-adapter/shared": "4.39.0", "@slack/socket-mode": "^2.0.5", "@slack/web-api": "^7.18.0", "chat": "4.39.0" } }, "sha512-nDBYFEmD9MUobUH+HJbOYwKYcaeoCFJDXVvd41flh5sslpixSUG2SFcz7F3py62jJ9c0YYNEdwprIExO20IyZQ=="], - "@chat-adapter/state-memory": ["@chat-adapter/state-memory@4.38.1", "", { "dependencies": { "chat": "4.38.1" } }, "sha512-XYRmnnuckJ7HubQIRqKTwOn2XbpK+GQclN7mRJEpiGk/4LXD46g0XKrYPrQMGe8PGLMdSQ4139Huu34rvyfgSw=="], + "@chat-adapter/state-memory": ["@chat-adapter/state-memory@4.39.0", "", { "dependencies": { "chat": "4.39.0" } }, "sha512-sTslMdRA9MG2MYUF9anD+eatZ1o3Nu64TkQCJ9GrGWfRCefM8DnIG/Op+Ej9XS6XjqOORb3eDJvy6IpvWrfT4A=="], "@connectrpc/connect": ["@connectrpc/connect@2.1.2", "", { "peerDependencies": { "@bufbuild/protobuf": "^2.7.0" } }, "sha512-MXkBijtcX09R10Eb6sFeIetc6w6746eio6xtfuyVOH7oQAacT1X0GzMIQFux6Qy8cq3W/T5qX5Bei8YbFtmRGA=="], @@ -2365,7 +2370,7 @@ "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.3", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q=="], "@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], @@ -2377,7 +2382,7 @@ "@gar/promise-retry": ["@gar/promise-retry@1.0.3", "", {}, "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA=="], - "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.11.6", "", { "dependencies": { "@types/node": ">=20.0.0", "happy-dom": "^20.11.6" } }, "sha512-ZQ47qUTeNbGhHkCGExJ1oZhruoxKRaxO44RgFETl3T4c1rRxIBlAOnM3SAH4XHu7Ue2owJXP+jOx1vOuKuxcSg=="], + "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.14.0", "", { "dependencies": { "@types/node": ">=20.0.0", "happy-dom": "^20.14.0" } }, "sha512-Xn0kdkaA1eHOaFFopr+YQ37sPNTZ3JScpUMz3j4rIsn1Nneqoh94z79iW23Ej0Ytt99+LlFr4JrSDd6ow9c7MQ=="], "@hono/node-server": ["@hono/node-server@2.1.1", "", { "peerDependencies": { "hono": "^4" } }, "sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg=="], @@ -2449,21 +2454,25 @@ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@logtape/hono": ["@logtape/hono@2.3.1", "", { "peerDependencies": { "@logtape/logtape": "^2.3.1", "hono": "^4.0.0" } }, "sha512-ryqg3HBdd79M0/wkiDIcFyB6RXBM1laauYDGWVqAVMrUu53mqRp5lDXrlQYmbIZBtyAyZK/TS2YJR22/79NzpQ=="], + "@keyv/bigmap": ["@keyv/bigmap@1.3.1", "", { "dependencies": { "hashery": "^1.4.0", "hookified": "^1.15.0" }, "peerDependencies": { "keyv": "^5.6.0" } }, "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ=="], - "@logtape/logtape": ["@logtape/logtape@2.3.1", "", {}, "sha512-nYLsBWMKk0Llp62U6cDbQxNcEKc0E0s5hWbAxkmUM8ax6VchGkPSjPrVp3ixFQUuvUB9ku7MSgPzFhmVTSh2Jw=="], + "@keyv/serialize": ["@keyv/serialize@1.1.1", "", {}, "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA=="], + + "@logtape/hono": ["@logtape/hono@2.3.3", "", { "peerDependencies": { "@logtape/logtape": "^2.3.3", "hono": "^4.0.0" } }, "sha512-Tu/O2sTRZ3OKSGRX3w1h/TO2ohva8ke38HtO01A4w7TA3lZpzqmtlnT869lOJtVAkzBrXjiLldZPa7mRB0OEhA=="], + + "@logtape/logtape": ["@logtape/logtape@2.3.3", "", {}, "sha512-H8AqgCq6M6Wu97FVPyfE5UT4w6H+Wdt9iGzLKPgtJRI/jrG9HbzzNUw9JL1LarkZD8xeKx9FqKfcLaXr0hGJuw=="], "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.30.0", "", { "dependencies": { "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA=="], "@napi-rs/lzma-linux-x64-gnu": ["@napi-rs/lzma-linux-x64-gnu@1.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="], - "@noble/ciphers": ["@noble/ciphers@2.3.0", "", {}, "sha512-Clu/xdfgVTf9o7ngLOURaxePwR0j8sjclKEtVij10/jGulwFsPWCvvRgG/XjUVf8Nei+jLG6uwyXzUTGY1DQrw=="], + "@noble/ciphers": ["@noble/ciphers@2.4.0", "", {}, "sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw=="], - "@noble/hashes": ["@noble/hashes@2.3.0", "", {}, "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ=="], + "@noble/hashes": ["@noble/hashes@2.4.0", "", {}, "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA=="], "@npmcli/agent": ["@npmcli/agent@4.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg=="], @@ -2475,7 +2484,7 @@ "@phosphor-icons/react": ["@phosphor-icons/react@2.1.10", "", { "peerDependencies": { "react": ">= 16.8", "react-dom": ">= 16.8" } }, "sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA=="], - "@puppeteer/browsers": ["@puppeteer/browsers@3.2.1", "", { "dependencies": { "modern-tar": "^0.8.0", "yargs": "^18.0.0" }, "peerDependencies": { "proxy-agent": ">=8.0.1", "yauzl": "^2.10.0 || ^3.4.0" }, "optionalPeers": ["proxy-agent", "yauzl"], "bin": { "browsers": "lib/main-cli.js" } }, "sha512-KDz+3qDRdBAlRlMjmKyj6dEs33YHTk/xRHEENSXq6TNnhgoU15ruSHtEBeVF6OZ9tBDY55Se4P0nFMNsipzU9A=="], + "@puppeteer/browsers": ["@puppeteer/browsers@3.2.2", "", { "dependencies": { "modern-tar": "^0.8.4", "yargs": "^18.0.0" }, "peerDependencies": { "proxy-agent": ">=8.0.1", "yauzl": "^2.10.0 || ^3.4.0" }, "optionalPeers": ["proxy-agent", "yauzl"], "bin": { "browsers": "lib/main-cli.js" } }, "sha512-q2BU4YfO9h/Wt7IcWPcggpOOqLk2Tbs1hDwolvKZrweRjy751OJBKMN9zO5bfD0pzU7X/tvKw/exQds4pM/LOg=="], "@radix-ui/primitive": ["@radix-ui/primitive@1.1.7", "", {}, "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q=="], @@ -2537,55 +2546,55 @@ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.5", "", { "os": "android", "cpu": "arm" }, "sha512-jfkGfTwhQpsiSckPF8r9bU3pn3vyd72NlWaO+TgEO6WPSDnUhXzrNYCHBMOYj0ACaUgjm6eERLF+XV9a6RstoA=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.1", "", { "os": "android", "cpu": "arm" }, "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.5", "", { "os": "android", "cpu": "arm64" }, "sha512-oGVqyQlxnrz9/ty89oHpU857VUHEl5/Xu4R2lS+aivCTrNnSsbiENzTnNaBsjxH0CNWGPhzHArOLFwo+oKXveA=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.1", "", { "os": "android", "cpu": "arm64" }, "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bW7B8xMEq8n99Q3ieEcPRGuphurdZAaFzQc9Efyyw3FL6DZO6pMy9xhdN+kBoD7Sy05xNXSr4OyPPnpkYriS/A=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-YSwBS86QeHOGlrxJ1PSOIZSkzRL/JmKeunhc+lV6M1a6En8QuVCD/T/qIA0J4Gd2Y86RIOBYrLcOUtqGh9+/1w=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-2fST8lILgl7cKbme/1KDdPCmbXbG+gqoV3bHp19L0ypX/3akYMBVdOunPleRCwonoLnXOZ/0F+Mt/v8POFmfcQ=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-cpIxQCP9J+EVad0a6LO1kY3ZGODlk80VlI+2I96B8xMcdHZ4pLVhfQ49JFpYqjPF91FFkQWftf57YlDcTiw9yQ=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.5", "", { "os": "linux", "cpu": "arm" }, "sha512-r9fGh3eFs3e/udWh5ZjXQtxiYK/xoFxQaYR/cELxac/Udkl5Th+IsFm0CX3Kl9hmUH/we7EoMpjJgeQNnE0+IA=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.5", "", { "os": "linux", "cpu": "arm" }, "sha512-xdvFdp7OM6KLJviJT2g/YuRSUjnZgGHk4RNgwIbN7X6cPugOucV60DdHXWzsBVCUdrGb6qSXnJQrrAKMmQuj3Q=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.1", "", { "os": "linux", "cpu": "arm" }, "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-rRqILAndyzHzP7T9NFQrq+4HFWNhqkqkKur7eiBpfLmz01PO0JKx5Vchu3YllE4YXI/Ftgq/szrDWg5GJ0mI8g=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-Gf4X3qVMucayUvux6aXXPgXovocSFUC0rrffDuPI/S2nHhNMhjcZxsrAFYCOF350PRreW1XwzFj3CT/3bKsWCw=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.5", "", { "os": "linux", "cpu": "none" }, "sha512-+s5qA0TNM0qm8PK/a5gt/1Hpx+NV08uSuCncvhziIlQzT6AEV2fnUQo7eBtFTFO0nA9scauvoR2HusfXmQnO4w=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.5", "", { "os": "linux", "cpu": "none" }, "sha512-ybb6QvWwWJCbBWqERpc8K3pYVGIrXlG8MEQ8IIuJY6Y9KdHQxoFoNyfkAOtKn1VHu3KuLidXvwrvGR1mEjeWCw=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nZb1DtnOyhCmYvsC8A2CwOkopVg+IS1+fPUa7rMOAXtNw5+lLCLLPqd6XAiNrGtoQKsbvIBOwsHnBH/3wnb4HQ=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-yMbj63Sp89ryrXLWyz+sy+fYD2HpOnMCLGbe4Oa1smclFSUukdtD/BgdiHaAetJNb74URD8U4hM+qG5KVzMEkg=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.5", "", { "os": "linux", "cpu": "none" }, "sha512-mhoan3OJw2kYV/e1jtIdmvUZgyBFeA6zGWsOswmR0Tg19TQbowZuR+JMLID6spbbBN7Zee2ejrgmy3+FxGrIdA=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.5", "", { "os": "linux", "cpu": "none" }, "sha512-5ZTLmjWbb1VZdjuyhe83K/8QO0/h11midQCBP+X5OYn32ra7eOBoM0ZqtaY4nkgNsYgmdVhMYPoyVPTjUpHf3w=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.1", "", { "os": "linux", "cpu": "none" }, "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-m53kG+br6PGxOTmgBEM2DHSDs9RVjsyEbUwjJPJGTFm1grWOG8EKJggDCTb60unD4Tjby8fi7/m9XfkEWasVWg=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.5", "", { "os": "linux", "cpu": "x64" }, "sha512-6RHPJR1g/uvdYU8uXBnfq3nlqyZCP82Fr6NHgfGoaIeSh0YEqnX/x6uA9MmJJbnSH7swqX4F+CkGdUF+6doiQA=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.5", "", { "os": "linux", "cpu": "x64" }, "sha512-xs+OXQtEXgpXT0DmA5+U3qnRZHdCST/5HRQxS8wSPZTUZN/EMWeHuSIod32LQklTBZBV9DyfncKBQ8n5V3eFdw=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.1", "", { "os": "linux", "cpu": "x64" }, "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-e7hD+sl3s+mcLQDZ8pbudBVsdG6r5yN4w3LqG2TJ8sQHDpblWj5lrJs/3m01Cvlxbt4x13zu5thLjgypgtkYzw=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.5", "", { "os": "none", "cpu": "arm64" }, "sha512-GiyJaCf+WpMub/17aPcKk27QMl5W6f+KhdPTjlFOn5akH5Wa/DCM9Stdx5cDfmasyKB08MqpVQ1uJE2RkkpbXg=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.1", "", { "os": "none", "cpu": "arm64" }, "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-+OQ8U2DdoEfXl8T4Fb18AjmEwbXMerKDKCL8yCPAYhKCEEKoul7rkbeGCBFCbAlaGaa7pmtRTpkAJM2LE/i5FA=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-KanvAZrPKbDBFwrgiU9yEVpQoox9QPV1WZOXX7HudJQY+eSlu82CtWxDU8WtuRRvtN5EGkLczkd6Y6DTcvm9wA=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.5", "", { "os": "win32", "cpu": "x64" }, "sha512-1aC3UEWTtRl3RK3VpDJ/Tqk1XI4SLTmXIthAq6wRWo8XiSXJNd+VprJM4/1P4+i6HIaFEFlVi9sTTziniD2tOQ=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.5", "", { "os": "win32", "cpu": "x64" }, "sha512-/gDJaRs4gl0NPIwqCz+6PkpmhhjRAD2j6P4rSNHBzUkO3naEx2mIU0pRle1vUNRQ7mE/+8OOeXLTv/J56FKiQg=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.1", "", { "os": "win32", "cpu": "x64" }, "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w=="], "@slack/logger": ["@slack/logger@4.0.1", "", { "dependencies": { "@types/node": ">=18" } }, "sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ=="], @@ -2631,9 +2640,9 @@ "@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="], - "@tanstack/query-core": ["@tanstack/query-core@5.101.4", "", {}, "sha512-gNwcvOJcRbLWPOLG/2OBm+zM+Yv+MKsXKEOWC57USuZDEsI71hEErQsiEGx5wX9rzWWkfwM0fVSPoiIFSsxfiw=="], + "@tanstack/query-core": ["@tanstack/query-core@5.102.8", "", {}, "sha512-ZNjkJ33CqvPNec/6lZBnHqLc3EVGPZ9ySLhYahU9TcuRFdmwXewuj0c4hwSWcGHqEUwcSrKeZ+oGcvPBqXcQcg=="], - "@tanstack/react-query": ["@tanstack/react-query@5.101.4", "", { "dependencies": { "@tanstack/query-core": "5.101.4" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA=="], + "@tanstack/react-query": ["@tanstack/react-query@5.102.8", "", { "dependencies": { "@tanstack/query-core": "5.102.8" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-TYBea4OuXWD7MhaSHq069TWbFe7rcwWN6kzT7JF0OKi1K6c1gTv2IzD6A6ExJsCMozdkqBWeuIUZmu4KQg0O5A=="], "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], @@ -2657,11 +2666,11 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@26.2.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg=="], + "@types/node": ["@types/node@26.4.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA=="], "@types/react": ["@types/react@19.2.18", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w=="], - "@types/react-dom": ["@types/react-dom@19.2.4", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw=="], + "@types/react-dom": ["@types/react-dom@19.2.7", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ=="], "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="], @@ -2675,25 +2684,25 @@ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.67.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/type-utils": "8.67.0", "@typescript-eslint/utils": "8.67.0", "@typescript-eslint/visitor-keys": "8.67.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.67.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.69.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/type-utils": "8.69.0", "@typescript-eslint/utils": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.69.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.67.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/types": "8.67.0", "@typescript-eslint/typescript-estree": "8.67.0", "@typescript-eslint/visitor-keys": "8.67.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.69.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.67.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.67.0", "@typescript-eslint/types": "^8.67.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.69.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.69.0", "@typescript-eslint/types": "^8.69.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.67.0", "", { "dependencies": { "@typescript-eslint/types": "8.67.0", "@typescript-eslint/visitor-keys": "8.67.0" } }, "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0" } }, "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.67.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.69.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.67.0", "", { "dependencies": { "@typescript-eslint/types": "8.67.0", "@typescript-eslint/typescript-estree": "8.67.0", "@typescript-eslint/utils": "8.67.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/utils": "8.69.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.67.0", "", {}, "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.69.0", "", {}, "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.67.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.67.0", "@typescript-eslint/tsconfig-utils": "8.67.0", "@typescript-eslint/types": "8.67.0", "@typescript-eslint/visitor-keys": "8.67.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.69.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.69.0", "@typescript-eslint/tsconfig-utils": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/visitor-keys": "8.69.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.67.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/types": "8.67.0", "@typescript-eslint/typescript-estree": "8.67.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.69.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.69.0", "@typescript-eslint/types": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.67.0", "", { "dependencies": { "@typescript-eslint/types": "8.67.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.69.0", "", { "dependencies": { "@typescript-eslint/types": "8.69.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w=="], "@vitejs/plugin-react": ["@vitejs/plugin-react@5.2.0", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="], @@ -2741,7 +2750,7 @@ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "axios": ["axios@1.19.0", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw=="], + "axios": ["axios@1.20.0", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], @@ -2749,7 +2758,7 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.11.16", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-H/bNPUFHewJHyCTdjn1n3Pit5+2GmWT6mmeHImPX+8MA9NA6b67jO4gYmi4jTbCJb2otq34KMZnovndDPqJwhQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.21", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ=="], "better-auth": ["better-auth@1.6.29", "", { "dependencies": { "@better-auth/core": "1.6.29", "@better-auth/drizzle-adapter": "1.6.29", "@better-auth/kysely-adapter": "1.6.29", "@better-auth/memory-adapter": "1.6.29", "@better-auth/mongo-adapter": "1.6.29", "@better-auth/prisma-adapter": "1.6.29", "@better-auth/telemetry": "1.6.29", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", "@noble/ciphers": "^2.1.1", "@noble/hashes": "^2.0.1", "better-call": "1.4.0", "defu": "^6.1.4", "jose": "^6.1.3", "kysely": "^0.28.17 || ^0.29.0", "nanostores": "^1.1.1", "zod": "^4.3.6" }, "peerDependencies": { "@lynx-js/react": "*", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "@sveltejs/kit": "^2.0.0", "@tanstack/react-start": "^1.0.0", "@tanstack/solid-start": "^1.0.0", "better-sqlite3": "^12.0.0", "drizzle-kit": ">=0.31.4", "drizzle-orm": "^0.45.2", "mongodb": "^6.0.0 || ^7.0.0", "mysql2": "^3.0.0", "next": "^14.0.0 || ^15.0.0 || ^16.0.0", "pg": "^8.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "solid-js": "^1.0.0", "svelte": "^4.0.0 || ^5.0.0", "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["@lynx-js/react", "@prisma/client", "@sveltejs/kit", "@tanstack/react-start", "@tanstack/solid-start", "better-sqlite3", "drizzle-kit", "drizzle-orm", "mongodb", "mysql2", "next", "pg", "prisma", "react", "react-dom", "solid-js", "svelte", "vitest", "vue"] }, "sha512-7i2kOry+Jb1mRUR14kCDVS23GCKUGWxayZRXULbNz/6nFLPT6XSuGJVrwo/d+Qfq/iubA0/4Acw2/eg/tPCCnA=="], @@ -2759,7 +2768,7 @@ "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], - "browserslist": ["browserslist@4.28.8", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="], + "browserslist": ["browserslist@4.28.9", "", { "dependencies": { "baseline-browser-mapping": "^2.11.20", "caniuse-lite": "^1.0.30001810", "electron-to-chromium": "^1.5.420", "node-releases": "^2.0.54", "update-browserslist-db": "^1.3.2" }, "bin": { "browserslist": "cli.js" } }, "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg=="], "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], @@ -2773,13 +2782,15 @@ "cacache": ["cacache@20.0.4", "", { "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0" } }, "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA=="], + "cacheable": ["cacheable@2.5.0", "", { "dependencies": { "@cacheable/memory": "^2.2.0", "@cacheable/utils": "^2.5.0", "hookified": "^1.15.0", "keyv": "^5.6.0", "qified": "^0.10.1" } }, "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g=="], + "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "caniuse-lite": ["caniuse-lite@1.0.30001809", "", {}, "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -2787,7 +2798,7 @@ "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], - "chat": ["chat@4.38.1", "", { "dependencies": { "@workflow/serde": "4.1.0-beta.2", "mdast-util-to-string": "^4.0.0", "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "remend": "^1.2.1", "unified": "^11.0.5" }, "peerDependencies": { "ai": "^6.0.182 || ^7.0.0", "workflow": "^5.0.0-beta.35", "zod": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["ai", "workflow", "zod"] }, "sha512-FD6vNLT8clXHKhN3I1m+3Bn2nz0rsB6/bmNPsJeh6Cr7kwWLg0MYl2uor9YaKBp38F77sBRVKdYKVA6ihUby3w=="], + "chat": ["chat@4.39.0", "", { "dependencies": { "@workflow/serde": "4.1.0-beta.2", "mdast-util-to-string": "^4.0.0", "remark-gfm": "^4.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "remend": "^1.2.1", "unified": "^11.0.5" }, "peerDependencies": { "ai": "^6.0.182 || ^7.0.0", "workflow": "^5.0.0-beta.35", "zod": "^3.0.0 || ^4.0.0" }, "optionalPeers": ["ai", "workflow", "zod"] }, "sha512-o7D+oAbQAYFVoc9+OH8wya11609ybRThNTF3s/5C1LAABGGi6IrxoQQEN/aIe+4h5pmKYzUjXeqTcuOZcpIAZA=="], "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], @@ -2863,11 +2874,11 @@ "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "e2b": ["e2b@2.44.1", "", { "dependencies": { "@bufbuild/protobuf": "^2.12.1", "@connectrpc/connect": "^2.1.2", "@connectrpc/connect-web": "^2.1.2", "chalk": "^5.3.0", "compare-versions": "^6.1.0", "dockerfile-ast": "^0.7.1", "glob": "^13.0.6", "openapi-fetch": "^0.14.1", "platform": "^1.3.6", "tar": "^7.5.19", "undici": "^7.29.0" }, "optionalDependencies": { "undici8": "npm:undici@8.10.0" } }, "sha512-6yx3FjYnR2zlidvF5QLaFQAtv7WndKAIrP8NEi9lhJm5+98Iinb7zHYel/Ug/o9BEZTb7ODYUvD/0P9b2Q6ufg=="], + "e2b": ["e2b@2.46.1", "", { "dependencies": { "@bufbuild/protobuf": "^2.14.0", "@connectrpc/connect": "^2.1.2", "@connectrpc/connect-web": "^2.1.2", "chalk": "^5.3.0", "compare-versions": "^6.1.0", "dockerfile-ast": "^0.7.1", "glob": "^13.0.6", "openapi-fetch": "^0.14.1", "platform": "^1.3.6", "tar": "^7.5.22", "undici": "^7.29.0" }, "optionalDependencies": { "undici8": "npm:undici@8.10.0" } }, "sha512-OqYovS2oFrt4mk737CgfW/RoMadBYK84l5qjKpvbEoOB9KKxaZIXm7YUwOKSRTlijrrwDRX7oZlyPoVXiCpyTw=="], "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "electron-to-chromium": ["electron-to-chromium@1.5.411", "", {}, "sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.422", "", {}, "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA=="], "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -2893,7 +2904,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.8.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ=="], + "eslint": ["eslint@10.10.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw=="], "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], @@ -2923,7 +2934,7 @@ "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], - "express-rate-limit": ["express-rate-limit@8.6.2", "", { "dependencies": { "debug": "^4.4.3", "ip-address": "^10.2.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A=="], + "express-rate-limit": ["express-rate-limit@8.7.0", "", { "dependencies": { "debug": "^4.4.3", "ip-address": "^10.2.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-hOwV7WOxXfjRpAM1DSJWZDXx3GhplwD8IfwuwvogD8i1Qnkgosw/H45s4ZnFAUHDAhPjlY9hLBvJhKmGMyY26g=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], @@ -2935,17 +2946,17 @@ "fast-text-encoding": ["fast-text-encoding@1.0.6", "", {}, "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w=="], - "fast-uri": ["fast-uri@3.1.5", "", {}, "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw=="], + "fast-uri": ["fast-uri@3.1.7", "", {}, "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "file-entry-cache": ["file-entry-cache@11.1.5", "", { "dependencies": { "flat-cache": "^6.1.23" } }, "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q=="], "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + "flat-cache": ["flat-cache@6.1.23", "", { "dependencies": { "cacheable": "^2.5.0", "flatted": "^3.4.2", "hookified": "^1.15.0" } }, "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA=="], "flatted": ["flatted@3.4.4", "", {}, "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q=="], @@ -2987,7 +2998,7 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "happy-dom": ["happy-dom@20.11.6", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-Hldbg8AdAa5a5oDcZpjqnGitp7JB0hqWmfv/8qr+kft4vzSD8BHsbdRfzYvL/0QcbKcURC/yyoygbeDQarPvYg=="], + "happy-dom": ["happy-dom@20.14.0", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-4bRh1KzRvKDnFNTlLhzT1RZTpkKhQbQDl9j+7GXszWsvuspYdo29k6OHRf4PwiM6oLb8r/pMWeYiJjkfod5AvQ=="], "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], @@ -2995,12 +3006,16 @@ "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + "hashery": ["hashery@1.5.1", "", { "dependencies": { "hookified": "^1.15.0" } }, "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ=="], + "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], "hono": ["hono@4.13.3", "", {}, "sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw=="], "hono-openapi": ["hono-openapi@1.3.1", "", { "peerDependencies": { "@hono/standard-validator": "^0.2.0", "@standard-community/standard-json": "^0.3.5", "@standard-community/standard-openapi": "^0.2.9", "@types/json-schema": "^7.0.15", "hono": "^4.11.2", "openapi-types": "^12.1.3" }, "optionalPeers": ["@hono/standard-validator", "hono"] }, "sha512-NLVeVkhKZ3drmQNEIPac8HX8Y54uf1hJAgIM/7MfDsaeVVmB+QILWQxx5x3R3NvRHgedcbEbOCGY2uR7WQYyMw=="], + "hookified": ["hookified@1.15.1", "", {}, "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg=="], + "hosted-git-info": ["hosted-git-info@8.1.0", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw=="], "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], @@ -3021,7 +3036,7 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ip-address": ["ip-address@10.5.0", "", {}, "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g=="], + "ip-address": ["ip-address@10.7.0", "", {}, "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA=="], "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], @@ -3045,7 +3060,7 @@ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "isomorphic-git": ["isomorphic-git@1.41.7", "", { "dependencies": { "async-lock": "^1.4.1", "clean-git-ref": "^2.0.1", "crc-32": "^1.2.0", "diff3": "0.0.3", "ignore": "^5.1.4", "minimisted": "^2.0.0", "pako": "^1.0.10", "pify": "^4.0.1", "readable-stream": "^4.0.0", "sha.js": "^2.4.12", "simple-get": "^4.0.1" }, "bin": { "isogit": "cli.cjs" } }, "sha512-ZCyMNg0eLUmuhGXdVQFi56fM93kwIqqlUSVnWbgzf1oDYidrQbWfrf+hEvn2E8xyo191zRPQyDCIlwg6YJ6isQ=="], + "isomorphic-git": ["isomorphic-git@1.41.9", "", { "dependencies": { "async-lock": "^1.4.1", "clean-git-ref": "^2.0.1", "crc-32": "^1.2.0", "diff3": "0.0.3", "ignore": "^5.1.4", "minimisted": "^2.0.0", "pako": "^1.0.10", "pify": "^4.0.1", "readable-stream": "^4.0.0", "sha.js": "^2.4.12", "simple-get": "^4.0.1" }, "bin": { "isogit": "cli.cjs" } }, "sha512-WOh4ujm5mznHphzQvwj9bVj+pQpV0oZ8H4lAnh4dSaie+lN/lJ2rb6rNOOcP+2m4z8IOQp186TkEULD28NMBJg=="], "isomorphic-textencoder": ["isomorphic-textencoder@1.0.1", "", { "dependencies": { "fast-text-encoding": "^1.0.0" } }, "sha512-676hESgHullDdHDsj469hr+7t3i/neBKU9J7q1T4RHaWwLAsaQnywC0D1dIUId0YZ+JtVrShzuBk1soo0+GVcQ=="], @@ -3053,14 +3068,12 @@ "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], - "jose": ["jose@6.2.9", "", {}, "sha512-XrchZOFZUl/T3vTwRe8XK+cJrGtMF4th1ARnDfwbBXFKThGhlsxEE4Zu03AD/bjJSt/9jT/mxrOCkJWOg77aPA=="], + "jose": ["jose@6.2.11", "", {}, "sha512-A5NPn7g8EAzGU3IzRs+Yiq8K5n3ypYS75M5+KKiVHdUexfpWK1kP4ZMq7QnTGDoMj6TJ1dtcEJjW60yZDXS4hg=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], @@ -3075,7 +3088,7 @@ "just-once": ["just-once@1.1.0", "", {}, "sha512-+rZVpl+6VyTilK7vB/svlMPil4pxqIJZkbnN7DKZTOzyXfun6ZiFeq2Pk4EtCEHZ0VU4EkdFzG8ZK5F3PErcDw=="], - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], "kysely": ["kysely@0.29.5", "", {}, "sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ=="], @@ -3113,7 +3126,7 @@ "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], - "lucide-react": ["lucide-react@1.33.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-MTRwMy0ZlL8Ur/vOAiJ9XGHE+kFPC7brq6MxAm0GiGXEBj0qy0jA/pG4N675oSzciO/UCdX8T+5yUQdmDeTLxg=="], + "lucide-react": ["lucide-react@1.41.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-6lksP35l6KszDKUeRTi4LV7i6DEe0Yzl2ALJm9j4c5xEYN91GdW1xGsawGMOg2mgjF5GHBVX8pKX9kP+cWsP3Q=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], @@ -3239,13 +3252,13 @@ "nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], - "nanostores": ["nanostores@1.5.2", "", {}, "sha512-B0UbxzK1s0CN8Xht6r+7iT5+xV8PTaRERR1nATeplRv1Rw5YLWfVAid0hkqY3EceqpG4RjTk8GAwIxQY39Rnwg=="], + "nanostores": ["nanostores@1.5.3", "", {}, "sha512-rQLB6eV4f2AW/n3L0JmwCROpaisYy9EDEADvEFSd1C/qG8hB6O5TPlh9A791JRbJr4CnMQBzptDcvD9OR1+6WA=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], "negotiator": ["negotiator@1.1.0", "", { "dependencies": { "content-type": "^2.1.0" } }, "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg=="], - "node-releases": ["node-releases@2.0.53", "", {}, "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="], + "node-releases": ["node-releases@2.0.54", "", {}, "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ=="], "npm-install-checks": ["npm-install-checks@7.1.2", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ=="], @@ -3279,7 +3292,7 @@ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - "p-map": ["p-map@7.0.6", "", {}, "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg=="], + "p-map": ["p-map@7.0.7", "", {}, "sha512-VaWRu2i4FJNRtiRWCuuQRgfQ1B7a6+gMSrO+3j0EQi/k0ULfS9kosRxGoiqwzIjZTDI02tGfk5mXXltLg6QtfQ=="], "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], @@ -3301,7 +3314,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], @@ -3311,7 +3324,7 @@ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.26", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="], + "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], "postgres": ["postgres@3.4.9", "", {}, "sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw=="], @@ -3329,9 +3342,11 @@ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "puppeteer-core": ["puppeteer-core@25.8.0", "", { "dependencies": { "@puppeteer/browsers": "3.2.1", "chromium-bidi": "17.0.2", "devtools-protocol": "0.0.1666840", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.2", "ws": "^8.21.1" } }, "sha512-LDOrawV8vfCVk+yLj2ozvajNP4Sv3OV9y3Tpiyy2g2Z+aQlbcozP6KJfI4iSBq7YQER+86ihEtPa5ioiZyWxMQ=="], + "puppeteer-core": ["puppeteer-core@25.10.0", "", { "dependencies": { "@puppeteer/browsers": "3.2.2", "chromium-bidi": "17.0.2", "devtools-protocol": "0.0.1666840", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.3", "ws": "^8.21.3" } }, "sha512-Hy5eMQshOEMil4JUUx03h5pw1HYkYCso1RG/gcpPlFSd4cYPOcopxcXEAxpLPOkOPJb9LIJtwxuj66bSdvknFg=="], + + "qified": ["qified@0.10.1", "", { "dependencies": { "hookified": "^2.1.1" } }, "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA=="], - "qs": ["qs@6.15.3", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A=="], + "qs": ["qs@6.16.0", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA=="], "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], @@ -3359,7 +3374,7 @@ "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], - "remend": ["remend@1.3.0", "", {}, "sha512-iIhggPkhW3hFImKtB10w0dz4EZbs28mV/dmbcYVonWEJ6UGHHpP+bFZnTh6GNWJONg5m+U56JrL+8IxZRdgWjw=="], + "remend": ["remend@1.3.1", "", {}, "sha512-N3DiY5qbRPoa5vkxn1oDLMyXOVTeo6Hp+XOj6SIqJAYUgLS0Q587gILPMom/qm86AQ/ZrcOdwEIzCz8V3J0nxQ=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], @@ -3367,7 +3382,7 @@ "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], - "rollup": ["rollup@4.62.5", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.62.5", "@rollup/rollup-android-arm64": "4.62.5", "@rollup/rollup-darwin-arm64": "4.62.5", "@rollup/rollup-darwin-x64": "4.62.5", "@rollup/rollup-freebsd-arm64": "4.62.5", "@rollup/rollup-freebsd-x64": "4.62.5", "@rollup/rollup-linux-arm-gnueabihf": "4.62.5", "@rollup/rollup-linux-arm-musleabihf": "4.62.5", "@rollup/rollup-linux-arm64-gnu": "4.62.5", "@rollup/rollup-linux-arm64-musl": "4.62.5", "@rollup/rollup-linux-loong64-gnu": "4.62.5", "@rollup/rollup-linux-loong64-musl": "4.62.5", "@rollup/rollup-linux-ppc64-gnu": "4.62.5", "@rollup/rollup-linux-ppc64-musl": "4.62.5", "@rollup/rollup-linux-riscv64-gnu": "4.62.5", "@rollup/rollup-linux-riscv64-musl": "4.62.5", "@rollup/rollup-linux-s390x-gnu": "4.62.5", "@rollup/rollup-linux-x64-gnu": "4.62.5", "@rollup/rollup-linux-x64-musl": "4.62.5", "@rollup/rollup-openbsd-x64": "4.62.5", "@rollup/rollup-openharmony-arm64": "4.62.5", "@rollup/rollup-win32-arm64-msvc": "4.62.5", "@rollup/rollup-win32-ia32-msvc": "4.62.5", "@rollup/rollup-win32-x64-gnu": "4.62.5", "@rollup/rollup-win32-x64-msvc": "4.62.5", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-/tqMfgP7GPA3PHhCmuiS4vIjrSVhHLgY++i+dhbG462euyAj7FpM4D9uq1X3BgjlqRdpcOrYhcQtfiQLNc8tqw=="], + "rollup": ["rollup@4.63.1", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.1", "@rollup/rollup-android-arm64": "4.63.1", "@rollup/rollup-darwin-arm64": "4.63.1", "@rollup/rollup-darwin-x64": "4.63.1", "@rollup/rollup-freebsd-arm64": "4.63.1", "@rollup/rollup-freebsd-x64": "4.63.1", "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", "@rollup/rollup-linux-arm-musleabihf": "4.63.1", "@rollup/rollup-linux-arm64-gnu": "4.63.1", "@rollup/rollup-linux-arm64-musl": "4.63.1", "@rollup/rollup-linux-loong64-gnu": "4.63.1", "@rollup/rollup-linux-loong64-musl": "4.63.1", "@rollup/rollup-linux-ppc64-gnu": "4.63.1", "@rollup/rollup-linux-ppc64-musl": "4.63.1", "@rollup/rollup-linux-riscv64-gnu": "4.63.1", "@rollup/rollup-linux-riscv64-musl": "4.63.1", "@rollup/rollup-linux-s390x-gnu": "4.63.1", "@rollup/rollup-linux-x64-gnu": "4.63.1", "@rollup/rollup-linux-x64-musl": "4.63.1", "@rollup/rollup-openbsd-x64": "4.63.1", "@rollup/rollup-openharmony-arm64": "4.63.1", "@rollup/rollup-win32-arm64-msvc": "4.63.1", "@rollup/rollup-win32-ia32-msvc": "4.63.1", "@rollup/rollup-win32-x64-gnu": "4.63.1", "@rollup/rollup-win32-x64-msvc": "4.63.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg=="], "rou3": ["rou3@0.9.2", "", {}, "sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ=="], @@ -3409,11 +3424,11 @@ "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], - "simple-icons": ["simple-icons@16.28.0", "", {}, "sha512-sQPR5AtK/ijRjou7zw7mlLp08oB6FH7i0lOy5XJ2zp9mJs/yejgiOn7KvQoe2q4YJIx6VmgUSW5AOefebPt5kg=="], + "simple-icons": ["simple-icons@16.29.0", "", {}, "sha512-4H94f5ZgcCcgJroc902TFlFdgPu2IU2eD7+WebN2Z14xKYrKHeJ4UQcZwzgSuH4Rgzw+jp7sbHl40NefuIEYsg=="], "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], + "socks": ["socks@2.8.10", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ=="], "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], @@ -3455,7 +3470,7 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tsx": ["tsx@4.23.12", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q=="], + "tsx": ["tsx@4.23.13", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], @@ -3467,9 +3482,9 @@ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], - "typescript-eslint": ["typescript-eslint@8.67.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.67.0", "@typescript-eslint/parser": "8.67.0", "@typescript-eslint/typescript-estree": "8.67.0", "@typescript-eslint/utils": "8.67.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg=="], + "typescript-eslint": ["typescript-eslint@8.69.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.69.0", "@typescript-eslint/parser": "8.69.0", "@typescript-eslint/typescript-estree": "8.69.0", "@typescript-eslint/utils": "8.69.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA=="], - "undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="], + "undici": ["undici@7.29.1", "", {}, "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q=="], "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], @@ -3487,7 +3502,7 @@ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "update-browserslist-db": ["update-browserslist-db@1.3.1", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ=="], + "update-browserslist-db": ["update-browserslist-db@1.3.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], @@ -3505,11 +3520,11 @@ "vite": ["vite@7.3.6", "", { "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg=="], - "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], + "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.14", "", {}, "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ=="], - "vscode-languageserver-types": ["vscode-languageserver-types@3.18.0", "", {}, "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g=="], + "vscode-languageserver-types": ["vscode-languageserver-types@3.18.3", "", {}, "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw=="], - "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.2", "", {}, "sha512-VSV+fzfChirL3e7jay2yUC7B4HQCGtEWEg/MSSQbK+qWbqeGlRLlXTzPpYr3XGUvbpDHumWZBJxgesg4N7dbtA=="], + "webdriver-bidi-protocol": ["webdriver-bidi-protocol@0.4.3", "", {}, "sha512-uuN0goWfxP22B7J/uAgBpOYNPttC+XVseYE+rSY5+rQ+YBeVz/VORw8WbmLVcqW78zNg5A4qnjNXYUWR3il2ig=="], "whatwg-mimetype": ["whatwg-mimetype@3.0.0", "", {}, "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="], @@ -3539,7 +3554,7 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + "zod": ["zod@4.5.4", "", {}, "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA=="], "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], @@ -3551,8 +3566,6 @@ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@corbits/memory-hub/@corbits/memory": ["@corbits/memory@github:corbitsdev/corbits-memory#9e6f213", { "dependencies": { "@intx/agent": "0.2.2", "@intx/authz": "0.2.2", "@intx/hub-api": "0.2.2", "@intx/log": "0.2.2", "@intx/workflow": "0.2.2", "arktype": "^2.1.29", "drizzle-orm": "^0.45.1", "hono": "^4.9.0", "hono-openapi": "^1.3.1", "postgres": "^3.4.7" } }, "corbitsdev-corbits-memory-9e6f213", "sha512-utnM4ZT2zmslcPXYWAAqxlDNLcpGsXFiTOtj8h7+OXnhCP0Eaw8yl25+yCTyHpvt3jcdeG4h5uFsSj7ou0BZCA=="], - "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], @@ -3573,9 +3586,7 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], - - "@workbench/hub/@corbits/memory": ["@corbits/memory@github:corbitsdev/corbits-memory#9e6f213", { "dependencies": { "@intx/agent": "0.2.2", "@intx/authz": "0.2.2", "@intx/hub-api": "0.2.2", "@intx/log": "0.2.2", "@intx/workflow": "0.2.2", "arktype": "^2.1.29", "drizzle-orm": "^0.45.1", "hono": "^4.9.0", "hono-openapi": "^1.3.1", "postgres": "^3.4.7" } }, "corbitsdev-corbits-memory-9e6f213", "sha512-utnM4ZT2zmslcPXYWAAqxlDNLcpGsXFiTOtj8h7+OXnhCP0Eaw8yl25+yCTyHpvt3jcdeG4h5uFsSj7ou0BZCA=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.8", "", {}, "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q=="], "ajv-formats/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], @@ -3613,6 +3624,8 @@ "p-queue/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + "qified/hookified": ["hookified@2.2.0", "", {}, "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA=="], + "tsx/esbuild": ["esbuild@0.28.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.2", "@esbuild/android-arm": "0.28.2", "@esbuild/android-arm64": "0.28.2", "@esbuild/android-x64": "0.28.2", "@esbuild/darwin-arm64": "0.28.2", "@esbuild/darwin-x64": "0.28.2", "@esbuild/freebsd-arm64": "0.28.2", "@esbuild/freebsd-x64": "0.28.2", "@esbuild/linux-arm": "0.28.2", "@esbuild/linux-arm64": "0.28.2", "@esbuild/linux-ia32": "0.28.2", "@esbuild/linux-loong64": "0.28.2", "@esbuild/linux-mips64el": "0.28.2", "@esbuild/linux-ppc64": "0.28.2", "@esbuild/linux-riscv64": "0.28.2", "@esbuild/linux-s390x": "0.28.2", "@esbuild/linux-x64": "0.28.2", "@esbuild/netbsd-arm64": "0.28.2", "@esbuild/netbsd-x64": "0.28.2", "@esbuild/openbsd-arm64": "0.28.2", "@esbuild/openbsd-x64": "0.28.2", "@esbuild/openharmony-arm64": "0.28.2", "@esbuild/sunos-x64": "0.28.2", "@esbuild/win32-arm64": "0.28.2", "@esbuild/win32-ia32": "0.28.2", "@esbuild/win32-x64": "0.28.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA=="], "type-is/content-type": ["content-type@2.1.0", "", {}, "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag=="], diff --git a/packages/interaction-tools/package.json b/packages/interaction-tools/package.json index 1e49867a98..0b17dc8a1d 100644 --- a/packages/interaction-tools/package.json +++ b/packages/interaction-tools/package.json @@ -13,6 +13,7 @@ "test": "bun test" }, "dependencies": { + "@corbits/error-sink": "workspace:*", "@intx/agent": "workspace:*", "@intx/types": "workspace:*", "arktype": "catalog:" diff --git a/packages/interaction-tools/src/tool.ts b/packages/interaction-tools/src/tool.ts index 67de98b4f0..47ce5736e9 100644 --- a/packages/interaction-tools/src/tool.ts +++ b/packages/interaction-tools/src/tool.ts @@ -12,6 +12,8 @@ import type { BaseEnv } from "@intx/agent"; import type { ToolCall, ToolResult } from "@intx/types/runtime"; import { type } from "arktype"; +import { reportError } from "@corbits/error-sink"; + import { postQuestion, questionIdForCall } from "./client"; import type { AskUserClientConfig } from "./client"; @@ -77,9 +79,10 @@ async function runAskUser( questionId: questionIdForCall(call.id), }); } catch (err) { - // report-error-ignore: surfaced to the model as this call's own error - // result (isError: true), which the caller can see and retry — not a - // swallowed failure, so no separate incident report is warranted. + reportError(err, { + operation: "ask_user_post_question", + agentId: env.address, + }); return errorResult(call.id, err); } diff --git a/packages/interaction-tools/tsconfig.json b/packages/interaction-tools/tsconfig.json index 0815303630..8d56256d5d 100644 --- a/packages/interaction-tools/tsconfig.json +++ b/packages/interaction-tools/tsconfig.json @@ -18,6 +18,9 @@ }, { "path": "../../vendor/intx/types/tsconfig.src.json" + }, + { + "path": "../error-sink/tsconfig.src.json" } ] } diff --git a/packages/interaction-tools/tsconfig.src.json b/packages/interaction-tools/tsconfig.src.json index 3959f6247b..2a035d55f9 100644 --- a/packages/interaction-tools/tsconfig.src.json +++ b/packages/interaction-tools/tsconfig.src.json @@ -15,6 +15,9 @@ }, { "path": "../../vendor/intx/types/tsconfig.src.json" + }, + { + "path": "../error-sink/tsconfig.src.json" } ] } From 5cc803658cfbd8d0a8b40ed229b9ac0c48c4f887 Mon Sep 17 00:00:00 2001 From: Sawyer Date: Fri, 4 Sep 2026 18:10:33 -0700 Subject: [PATCH 9/9] Update docs: ask_user's stop instruction is unenforced; dropped pending ops (CL-7443) Note that the tool result's "end this turn" instruction is plain text in the model's context, not something the runtime enforces, and that a warm agent's in-flight question at deploy time is silently dropped on restore rather than resolved -- the person's eventual answer just becomes an ordinary next turn. --- docs/CHAT.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/CHAT.md b/docs/CHAT.md index e6c4a60bb2..ba6d95c5a3 100644 --- a/docs/CHAT.md +++ b/docs/CHAT.md @@ -647,7 +647,17 @@ becomes the agent's next inbound message and therefore its next turn — never this call's own result. (Before CL-7443, `ask_user` parked the call on a vendored `message_response` signal/gate until a correlated reply resolved it; that machinery, and the correlation-id plumbing it needed -through `sendMail`/`sendUserMessage`, is retired.) +through `sendMail`/`sendUserMessage`, is retired.) The tool result's +instruction to end the turn is just text in the model's context — the +runtime does not enforce it, so a model that calls another tool or keeps +talking after `ask_user` is not stopped from doing so. + +Because there is no park, a warm agent's persisted pending operations can +still carry a retired kind from before this change (a `message_response` +op written by a pre-CL-7443 build). Restore drops any such unclassified +kind rather than throwing, reporting each drop — so an in-flight question +still open at deploy is simply lost: the person's eventual answer arrives +as an ordinary next turn instead of resolving anything. ### Question answers notify at most once (CL-7192)