Skip to content

feat(examples): add experimental pi harness example - #2210

Open
mattzcarey wants to merge 8 commits into
mainfrom
feat/pi-harness-example
Open

feat(examples): add experimental pi harness example#2210
mattzcarey wants to merge 8 commits into
mainfrom
feat/pi-harness-example

Conversation

@mattzcarey

@mattzcarey mattzcarey commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Reduces #2197 to an example. Nothing is added to the agents package.

  • examples/next/harnesses/pi hosts pi's durable AgentHarness on a plain DurableObject composed with Lifecycle, Tasks, Streams, WebSockets, and agents/skills.
  • PiHarness, the Workers AI provider, and the pi session adapter are example-local code on a pinned pi dev build (c4b0e35a, vendored under vendor/pi-dev).
  • A real Durable Object test drives a tool call with pi-ai's faux provider, evicts the object, and checks the transcript and a second turn survive.
  • The client uses the same Kumo chat layout as the other examples.
  • design/rfc-pi-harness-example.md records the composition, the known costs, and what must land before this becomes a package export.

Why not a package export yet

  • agents/sessions (feat(agents): move sessions into a Lifecycle capability #2196) has not landed, so pi's session lives in a namespaced SQLite adapter carrying pi's own schema.
  • The harness uses the framework-internal Tasks apertures for a capability-owned driver.
  • Pi has not released the harness API, so the build vendors archives.

Supersedes #2197.


Devin Review

…e UI

Trim the example-local harness to what the demo and test use: drop the
execution-environment type surface, routed calls, lane access, and the
follow-up, next-run, cancel-queued, and lane-config transport commands.
The WebSocket protocol is now snapshot, subscribe, submit, abort, and steer.

Rebuild the client on the same Kumo chat layout as the other examples:
a pinned header, a scrolling transcript with user bubbles and assistant
tool cards, an Empty state with suggestion buttons, and an InputArea
composer with a stop button while a turn runs.

Rewrite the README and RFC to describe this as an experimental example on
a pinned pi dev build, not a package API, and list what must land before
it becomes one.

Claude-Session: https://claude.ai/code/session_01KEFnjoMnZBMewsuD9qxGrL
@changeset-bot

changeset-bot Bot commented Sep 3, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: b751ae0

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

Devin Review found 4 potential issues.

2 flags not posted on this PR by your GitHub settings — view them in Devin Review. (Configure)

Devin Review

Comment thread examples/next/harnesses/pi/package.json
Comment on lines +209 to +210
default:
return;

@devin-ai-integration devin-ai-integration Bot Sep 3, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Hibernated replies stop streaming

After hibernation reopens a nonempty stream, streamOpened waits for the browser to resubscribe. The browser ignores stream_start, so the active reply stops updating.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

error: PiOperationRejectedError,
submission?: QueuedSubmission
): void {
this.#rejections.set(operationId, error);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Rejected operations lose terminal results

When pi rejects or withdraws queued work, #reject records the outcome only in memory. Eviction loses it, making later waitForResult calls poll forever.

Prompt for agents
PiHarness deletes a rejected submission from durable intake but stores its terminal PiOperationRejectedError only in #rejections. Persist declined and withdrawn outcomes keyed by operation ID, and make waitForResult and getResult consult that durable record. Preserve results for repeated or concurrent waiters instead of consuming them on the first read. Reconcile the durable result with operation_end stream delivery and any retention policy.
Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +1041 to +1042
const existing = this.#writers.get(operationId);
if (existing) return existing;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Concurrent lanes share operation output

When concurrent lanes use the same explicit operation ID, #writerFor returns one shared writer. Their events merge, and either operation can close both output streams.

Prompt for agents
PiHarness stream IDs are lane-scoped, but #writers is keyed only by operationId. The duplicate check in submit also checks current and settled operations only on the requested lane, so the same explicit operation ID can become active on two lanes. Either enforce operation IDs globally across pending, active, and settled operations, matching the receipt contract, or key all writer and waiter state by both lane and operation ID. Add a two-lane concurrency test covering event routing and independent settlement.
Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@agent-think

agent-think Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

🟡 agents import sizes

Measured 294 runtime imports as minified bundles. The primary size is gzip; raw minified size is included for diagnosis. An existing import growing by more than 10% is marked red. This report is informational.

Red Yellow Green Unchanged New Removed
0 101 0 159 7 27

Compared 6da4c44b with b751ae0c. Open workflow run.

Changed imports (135)
Status Import Base gzip Head gzip Delta
🟡 agents/chat#byteLength 2.3 KiB 2.5 KiB +148 B (+6.26%)
🟡 agents/skills#SkillRegistry 397.5 KiB 416.4 KiB +18.9 KiB (+4.75%)
🟡 agents/chat#enforceRowSizeLimit 3.4 KiB 3.5 KiB +145 B (+4.21%)
🟡 agents/chat#CHAT_RECOVERY_INCIDENT_KEY_PREFIX 2.3 KiB 2.3 KiB +20 B (+0.85%)
🟡 agents/chat#crossMessageToolResultUpdate 2.4 KiB 2.4 KiB +20 B (+0.81%)
🟡 agents/chat#buildInClauseStrings 2.4 KiB 2.4 KiB +20 B (+0.81%)
🟡 agents/chat#AutoContinuationController 2.3 KiB 2.3 KiB +19 B (+0.81%)
🟡 agents/chat#CHAT_RECOVERY_STABLE_RETRY_DELAY_SECONDS 2.3 KiB 2.3 KiB +19 B (+0.81%)
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_MAX_OOM_RETRIES 2.3 KiB 2.3 KiB +19 B (+0.81%)
🟡 agents/chat#CHAT_RECOVERY_PROGRESS_KEY 2.3 KiB 2.3 KiB +19 B (+0.8%)
🟡 agents/chat#CHAT_LAST_TERMINAL_KEY 2.3 KiB 2.3 KiB +19 B (+0.8%)
🟡 agents/chat#pendingChatTerminal 2.3 KiB 2.3 KiB +19 B (+0.8%)
🟡 agents/chat#clearChatTerminal 2.3 KiB 2.3 KiB +19 B (+0.8%)
🟡 agents/chat#recordChatTerminal 2.3 KiB 2.4 KiB +19 B (+0.79%)
🟡 agents/chat#ChatStreamStalledError 2.3 KiB 2.4 KiB +19 B (+0.79%)
🟡 agents/chat#sendIfOpen 2.4 KiB 2.4 KiB +19 B (+0.78%)
🟡 agents/chat#resolveToolMergeId 2.4 KiB 2.4 KiB +19 B (+0.78%)
🟡 agents/chat#reconcileOrphanPartial 2.4 KiB 2.4 KiB +19 B (+0.78%)
🟡 agents/chat#unwrapChatFiberSnapshot 2.4 KiB 2.4 KiB +19 B (+0.77%)
🟡 agents/chat#CHAT_RECOVERING_FLAG_TTL_MS 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#CHAT_RECOVERY_INCIDENT_TTL_MS 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#normalizeToolInput 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#applyChunkToParts 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#CHAT_MESSAGE_TYPES 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#chatRecoveryTaskRunOptions 2.4 KiB 2.4 KiB +19 B (+0.77%)
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_MAX_ATTEMPTS 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#KV_DELETE_MAX_KEYS 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#AGENT_TOOL_STREAM_PROGRESS_BUMP_THROTTLE_MS 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#CHAT_STREAM_PROGRESS_CREDIT_THROTTLE_MS 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_MAX_WORK 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_STABLE_TIMEOUT_MS 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#MAX_BOUND_PARAMS 2.3 KiB 2.3 KiB +18 B (+0.77%)
🟡 agents/chat#sweepStaleChatRecoveryIncidents 2.4 KiB 2.4 KiB +19 B (+0.76%)
🟡 agents/chat#CHAT_RECOVERING_KEY 2.3 KiB 2.3 KiB +18 B (+0.76%)
🟡 agents/chat#wrapChatFiberSnapshot 2.3 KiB 2.3 KiB +18 B (+0.76%)
🟡 agents/chat#cleanupStreamBuffers 2.3 KiB 2.3 KiB +18 B (+0.76%)
🟡 agents/chat#clientResolvableToolNames 2.3 KiB 2.3 KiB +18 B (+0.76%)
🟡 agents/chat#readChatRecoveryProgress 2.3 KiB 2.3 KiB +18 B (+0.76%)
🟡 agents/chat#drainInteractionApplies 2.3 KiB 2.3 KiB +18 B (+0.75%)
🟡 agents/chat#AgentToolStreamProgressThrottle 2.3 KiB 2.4 KiB +18 B (+0.75%)
🟡 agents/chat#StreamProgressCreditThrottle 2.3 KiB 2.4 KiB +18 B (+0.75%)
🟡 agents/chat#bumpChatRecoveryProgress 2.3 KiB 2.4 KiB +18 B (+0.75%)
🟡 agents/chat#repairInterruptedToolParts 2.6 KiB 2.6 KiB +20 B (+0.75%)
🟡 agents/chat#shouldCreditStreamProgress 2.3 KiB 2.4 KiB +18 B (+0.75%)
🟡 agents/chat#applyToolUpdate 2.4 KiB 2.4 KiB +18 B (+0.74%)
🟡 agents/chat#buildChatRecoveringFrame 2.4 KiB 2.4 KiB +18 B (+0.74%)
🟡 agents/chat#isReplayChunk 2.4 KiB 2.4 KiB +18 B (+0.74%)
🟡 agents/chat#pausedExecutionUpdate 2.4 KiB 2.4 KiB +18 B (+0.74%)
🟡 agents/chat#toolResultUpdate 2.4 KiB 2.4 KiB +18 B (+0.74%)
🟡 agents/chat#awaitWithDeadline 2.4 KiB 2.4 KiB +18 B (+0.74%)
🟡 agents/chat#partAwaitsClientInteraction 2.4 KiB 2.4 KiB +18 B (+0.74%)
🟡 agents/chat#toolApprovalUpdate 2.4 KiB 2.4 KiB +18 B (+0.73%)
🟡 agents/chat#runChatRecoveryExhaustion 2.5 KiB 2.6 KiB +19 B (+0.73%)
🟡 agents/chat#classifyAgentToolChildRecovery 2.4 KiB 2.4 KiB +18 B (+0.73%)
🟡 agents/chat#hasIncompleteToolBatch 2.4 KiB 2.4 KiB +18 B (+0.73%)
🟡 agents/chat#aiSdkRecoveryCodec 2.3 KiB 2.3 KiB +17 B (+0.72%)
🟡 agents/chat#CHAT_RECOVERY_ALARM_DEBOUNCE_MS 2.3 KiB 2.3 KiB +17 B (+0.72%)
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_NO_PROGRESS_TIMEOUT_MS 2.3 KiB 2.3 KiB +17 B (+0.72%)
🟡 agents/chat#STREAM_CLEANUP_DELAY_SECONDS 2.3 KiB 2.3 KiB +17 B (+0.72%)
🟡 agents/chat#setChatRecovering 2.4 KiB 2.5 KiB +18 B (+0.72%)
🟡 agents/chat#TIMED_OUT 2.3 KiB 2.3 KiB +17 B (+0.72%)
🟡 agents/chat#createChatFiberSnapshot 2.4 KiB 2.5 KiB +18 B (+0.72%)
🟡 agents/chat#createChatRecoveryTaskDefinition 2.6 KiB 2.6 KiB +19 B (+0.72%)
🟡 agents/chat#isPlatformFailure 2.6 KiB 2.6 KiB +19 B (+0.71%)
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_TERMINAL_MESSAGE 2.3 KiB 2.4 KiB +17 B (+0.71%)
🟡 agents/chat#createChatTurnTaskDefinition 2.6 KiB 2.7 KiB +19 B (+0.7%)
🟡 agents/chat#ContinuationState 2.6 KiB 2.7 KiB +19 B (+0.7%)
🟡 agents/chat#AbortRegistry 2.5 KiB 2.5 KiB +18 B (+0.7%)
🟡 agents/chat#listActiveChatRecoveryIncidents 2.4 KiB 2.4 KiB +17 B (+0.69%)
🟡 agents/chat#resolveChatRecoveryConfig 2.5 KiB 2.6 KiB +18 B (+0.69%)
🟡 agents/chat#MessageType 2.4 KiB 2.4 KiB +17 B (+0.69%)
🟡 agents/chat#iterateWithStallWatchdog 2.6 KiB 2.6 KiB +18 B (+0.68%)
🟡 agents/chat#ROW_MAX_BYTES 2.3 KiB 2.3 KiB +16 B (+0.68%)
🟡 agents/chat#CHAT_RECOVERY_TASK_NAME 2.3 KiB 2.3 KiB +16 B (+0.68%)
🟡 agents/chat#interceptAgentToolBroadcast 2.5 KiB 2.5 KiB +17 B (+0.67%)
🟡 agents/chat#PreStreamTurns 2.6 KiB 2.6 KiB +18 B (+0.67%)
🟡 agents/chat#createAgentToolEventState 2.3 KiB 2.3 KiB +16 B (+0.67%)
🟡 agents/chat#STREAM_RESUME_NONE_REASONS 2.3 KiB 2.3 KiB +16 B (+0.67%)
🟡 agents/chat#StreamAccumulator 2.9 KiB 2.9 KiB +20 B (+0.67%)
🟡 agents/chat#AgentToolProgressEmitter 2.6 KiB 2.7 KiB +18 B (+0.66%)
🟡 agents/chat#parseProtocolMessage 2.5 KiB 2.5 KiB +17 B (+0.66%)
🟡 agents/chat#TurnQueue 2.6 KiB 2.6 KiB +17 B (+0.64%)
🟡 agents/chat#reconcileMessages 2.8 KiB 2.8 KiB +18 B (+0.64%)
🟡 agents/chat#applyAgentToolEvent 3.2 KiB 3.2 KiB +20 B (+0.62%)
🟡 agents/chat#TextSegmentJoiner 2.7 KiB 2.7 KiB +17 B (+0.62%)
🟡 agents/chat#persistReconstructedOrphan 3.0 KiB 3.1 KiB +19 B (+0.61%)
🟡 agents/chat#broadcastTransition 3.1 KiB 3.1 KiB +19 B (+0.59%)
🟡 agents/chat#toolPartHasSettledResult 2.3 KiB 2.3 KiB +14 B (+0.59%)
🟡 agents/chat#SubmitConcurrencyController 2.9 KiB 2.9 KiB +17 B (+0.58%)
🟡 agents/chat#ResumeHandshake 2.9 KiB 3.0 KiB +17 B (+0.56%)
🟡 agents/chat#dispatchChatRecoveryToHandoff 3.0 KiB 3.0 KiB +16 B (+0.52%)
🟡 agents/chat#ChatRecoveryEngine 4.4 KiB 4.4 KiB +16 B (+0.36%)
🟡 agents/chat#ResumableStream 4.6 KiB 4.6 KiB +15 B (+0.32%)
🟡 agents/chat#sanitizeMessage 2.5 KiB 2.5 KiB +8 B (+0.31%)
🟡 agents/chat#createChatStreams 5.5 KiB 5.5 KiB +17 B (+0.3%)
🟡 agents/chat#createToolsFromClientSchemas 114.3 KiB 114.3 KiB +19 B (+0.02%)
🟡 agents/skills#runner 369.0 KiB 369.0 KiB +9 B (+0%)
🟡 agents/skills#parseSkillFrontmatter 328.4 KiB 328.4 KiB +4 B (+0%)
🟡 agents/skills#r2 330.2 KiB 330.2 KiB +4 B (+0%)
🟡 agents/skills#fromManifest 309.8 KiB 309.8 KiB +2 B (+0%)
🟡 agents/skills#parseSkillMarkdown 328.6 KiB 328.6 KiB +1 B (+0%)
agents/chat#truncateOlderMessages 3.2 KiB
agents/context#AgentContextProvider 412 B
agents/context#AgentSearchProvider 640 B
agents/context#ContextBlocks 87.4 KiB
agents/sessions#createCompactFunction 1.7 KiB
agents/sessions#Session 1.9 KiB
agents/sessions#Sessions 8.8 KiB
🟢 agents/experimental/memory/session#AgentContextProvider 425 B
🟢 agents/experimental/memory/session#AgentSearchProvider 821 B
🟢 agents/experimental/memory/session#AgentSessionProvider 2.5 KiB
🟢 agents/experimental/memory/session#isSearchProvider 128 B
🟢 agents/experimental/memory/session#isSkillProvider 127 B
🟢 agents/experimental/memory/session#isWritableProvider 126 B
🟢 agents/experimental/memory/session#PostgresContextProvider 422 B
🟢 agents/experimental/memory/session#PostgresSearchProvider 630 B
🟢 agents/experimental/memory/session#PostgresSessionProvider 1.7 KiB
🟢 agents/experimental/memory/session#R2SkillProvider 436 B
🟢 agents/experimental/memory/session#Session 93.4 KiB
🟢 agents/experimental/memory/session#SessionManager 94.5 KiB
🟢 agents/experimental/memory/utils#alignBoundaryBackward 291 B
🟢 agents/experimental/memory/utils#alignBoundaryForward 275 B
🟢 agents/experimental/memory/utils#buildSummaryPrompt 867 B
🟢 agents/experimental/memory/utils#CHARS_PER_TOKEN 51 B
🟢 agents/experimental/memory/utils#COMPACTION_PREFIX 63 B
🟢 agents/experimental/memory/utils#computeSummaryBudget 363 B
🟢 agents/experimental/memory/utils#createCompactFunction 1.8 KiB
🟢 agents/experimental/memory/utils#estimateMessageTokens 336 B
🟢 agents/experimental/memory/utils#estimateStringTokens 142 B
🟢 agents/experimental/memory/utils#findTailCutByTokens 597 B
🟢 agents/experimental/memory/utils#isCompactionMessage 98 B
🟢 agents/experimental/memory/utils#sanitizeToolPairs 537 B
🟢 agents/experimental/memory/utils#TOKENS_PER_MESSAGE 51 B
🟢 agents/experimental/memory/utils#truncateOlderMessages 1022 B
🟢 agents/experimental/memory/utils#WORDS_TOKEN_MULTIPLIER 53 B
All 267 current runtime imports
Status Import Gzip Raw minified
agents#__DO_NOT_USE_WILL_BREAK__agentContext 258.6 KiB 1130.0 KiB
agents#__DO_NOT_USE_WILL_BREAK__withInvocationScope 258.6 KiB 1130.0 KiB
agents#Agent 258.6 KiB 1130.0 KiB
agents#AGENT_TOOL_MILESTONE_PART 258.6 KiB 1130.0 KiB
agents#AGENT_TOOL_PROGRESS_PART 258.6 KiB 1130.0 KiB
agents#buildAgentPath 259.1 KiB 1132.3 KiB
agents#buildAgentUrl 259.3 KiB 1132.7 KiB
agents#callable 258.6 KiB 1130.1 KiB
agents#camelCaseToKebabCase 258.6 KiB 1130.0 KiB
agents#createHeaderBasedEmailResolver 258.8 KiB 1130.4 KiB
agents#DEFAULT_AGENT_STATIC_OPTIONS 258.6 KiB 1130.0 KiB
agents#DurableObjectOAuthClientProvider 258.6 KiB 1130.0 KiB
agents#getAgentByName 258.6 KiB 1130.0 KiB
agents#getCurrentAgent 258.6 KiB 1130.0 KiB
agents#getSubAgentByName 258.9 KiB 1130.7 KiB
agents#isDurableObjectCodeUpdateReset 258.6 KiB 1130.0 KiB
agents#isDurableObjectMemoryLimitReset 258.6 KiB 1130.0 KiB
agents#isDurableObjectStorageReset 258.6 KiB 1130.1 KiB
agents#isPlatformTransientError 258.6 KiB 1130.0 KiB
agents#MCP_SERVER_ID_MAX_LENGTH 258.6 KiB 1130.0 KiB
agents#MessageType 258.8 KiB 1130.3 KiB
agents#normalizeServerId 258.6 KiB 1130.0 KiB
agents#parseSubAgentPath 258.6 KiB 1130.0 KiB
agents#routeAgentEmail 258.9 KiB 1130.7 KiB
agents#routeAgentRequest 259.2 KiB 1131.9 KiB
agents#routeSubAgentRequest 258.8 KiB 1130.6 KiB
agents#SqlError 258.6 KiB 1130.0 KiB
agents#StreamingResponse 258.6 KiB 1130.0 KiB
agents#SUB_PREFIX 258.6 KiB 1130.0 KiB
agents#unstable_callable 258.7 KiB 1130.2 KiB
agents/agent-tools#agentTool 112.5 KiB 538.2 KiB
agents/browser#BrowserConnector 50.5 KiB 176.6 KiB
agents/browser#browserContent 36.3 KiB 127.4 KiB
agents/browser#browserExtract 36.3 KiB 127.4 KiB
agents/browser#browserLinks 36.3 KiB 127.4 KiB
agents/browser#browserMarkdown 36.3 KiB 127.4 KiB
agents/browser#browserPdf 36.3 KiB 127.3 KiB
agents/browser#BrowserRenderingError 36.0 KiB 126.7 KiB
agents/browser#browserScrape 36.3 KiB 127.4 KiB
agents/browser#browserScreenshot 36.3 KiB 127.3 KiB
agents/browser#browserSnapshot 36.3 KiB 127.4 KiB
agents/browser#CdpSession 37.2 KiB 129.8 KiB
agents/browser#CodemodeRuntime 39.6 KiB 139.0 KiB
agents/browser#connectBrowser 37.8 KiB 131.4 KiB
agents/browser#connectBrowserSession 37.5 KiB 130.4 KiB
agents/browser#connectUrl 37.6 KiB 130.5 KiB
agents/browser#createBrowserSession 36.3 KiB 127.5 KiB
agents/browser#DEFAULT_EXEC_SWEEP_IDLE_MS 36.0 KiB 126.6 KiB
agents/browser#DEFAULT_SWEEP_IDLE_MS 36.0 KiB 126.6 KiB
agents/browser#deleteBrowserSession 36.1 KiB 126.9 KiB
agents/browser#DurableBrowserSessionStore 36.4 KiB 127.6 KiB
agents/browser#getBrowserRecording 36.2 KiB 127.1 KiB
agents/browser#listBrowserTargets 36.1 KiB 126.9 KiB
agents/browser#loadCdpSpec 36.6 KiB 128.3 KiB
agents/browser#runQuickAction 36.0 KiB 126.6 KiB
agents/browser/ai#createBrowserRuntime 146.0 KiB 630.3 KiB
agents/browser/ai#createBrowserTools 146.0 KiB 630.3 KiB
agents/browser/ai#createQuickActionTools 122.5 KiB 554.3 KiB
agents/browser/tanstack-ai#createBrowserTools 161.7 KiB 699.2 KiB
🟡 agents/chat#AbortRegistry 2.5 KiB 8.9 KiB
🟡 agents/chat#AGENT_TOOL_STREAM_PROGRESS_BUMP_THROTTLE_MS 2.3 KiB 8.2 KiB
🟡 agents/chat#AgentToolProgressEmitter 2.7 KiB 9.5 KiB
🟡 agents/chat#AgentToolStreamProgressThrottle 2.4 KiB 8.3 KiB
🟡 agents/chat#aiSdkRecoveryCodec 2.3 KiB 8.2 KiB
🟡 agents/chat#applyAgentToolEvent 3.2 KiB 11.0 KiB
🟡 agents/chat#applyChunkToParts 2.3 KiB 8.2 KiB
🟡 agents/chat#applyToolUpdate 2.4 KiB 8.4 KiB
🟡 agents/chat#AutoContinuationController 2.3 KiB 8.2 KiB
🟡 agents/chat#awaitWithDeadline 2.4 KiB 8.4 KiB
🟡 agents/chat#broadcastTransition 3.1 KiB 11.4 KiB
🟡 agents/chat#buildChatRecoveringFrame 2.4 KiB 8.4 KiB
🟡 agents/chat#buildInClauseStrings 2.4 KiB 8.4 KiB
🟡 agents/chat#bumpChatRecoveryProgress 2.4 KiB 8.3 KiB
🟡 agents/chat#byteLength 2.5 KiB 8.5 KiB
🟡 agents/chat#CHAT_LAST_TERMINAL_KEY 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_MESSAGE_TYPES 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_RECOVERING_FLAG_TTL_MS 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_RECOVERING_KEY 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_RECOVERY_ALARM_DEBOUNCE_MS 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_RECOVERY_INCIDENT_KEY_PREFIX 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_RECOVERY_INCIDENT_TTL_MS 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_RECOVERY_PROGRESS_KEY 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_RECOVERY_STABLE_RETRY_DELAY_SECONDS 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_RECOVERY_TASK_NAME 2.3 KiB 8.2 KiB
🟡 agents/chat#CHAT_STREAM_PROGRESS_CREDIT_THROTTLE_MS 2.3 KiB 8.2 KiB
🟡 agents/chat#ChatRecoveryEngine 4.4 KiB 15.3 KiB
🟡 agents/chat#chatRecoveryTaskRunOptions 2.4 KiB 8.6 KiB
🟡 agents/chat#ChatStreamStalledError 2.4 KiB 8.3 KiB
🟡 agents/chat#classifyAgentToolChildRecovery 2.4 KiB 8.5 KiB
🟡 agents/chat#cleanupStreamBuffers 2.3 KiB 8.2 KiB
🟡 agents/chat#clearChatTerminal 2.3 KiB 8.3 KiB
🟡 agents/chat#clientResolvableToolNames 2.3 KiB 8.3 KiB
🟡 agents/chat#ContinuationState 2.7 KiB 9.8 KiB
🟡 agents/chat#createAgentToolEventState 2.3 KiB 8.3 KiB
🟡 agents/chat#createChatFiberSnapshot 2.5 KiB 8.6 KiB
🟡 agents/chat#createChatRecoveryTaskDefinition 2.6 KiB 9.0 KiB
🟡 agents/chat#createChatStreams 5.5 KiB 19.3 KiB
🟡 agents/chat#createChatTurnTaskDefinition 2.7 KiB 8.9 KiB
🟡 agents/chat#createToolsFromClientSchemas 114.3 KiB 545.4 KiB
🟡 agents/chat#crossMessageToolResultUpdate 2.4 KiB 8.6 KiB
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_MAX_ATTEMPTS 2.3 KiB 8.2 KiB
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_MAX_OOM_RETRIES 2.3 KiB 8.2 KiB
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_MAX_WORK 2.3 KiB 8.2 KiB
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_NO_PROGRESS_TIMEOUT_MS 2.3 KiB 8.2 KiB
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_STABLE_TIMEOUT_MS 2.3 KiB 8.2 KiB
🟡 agents/chat#DEFAULT_CHAT_RECOVERY_TERMINAL_MESSAGE 2.4 KiB 8.3 KiB
🟡 agents/chat#dispatchChatRecoveryToHandoff 3.0 KiB 9.9 KiB
🟡 agents/chat#drainInteractionApplies 2.3 KiB 8.3 KiB
🟡 agents/chat#enforceRowSizeLimit 3.5 KiB 11.2 KiB
🟡 agents/chat#hasIncompleteToolBatch 2.4 KiB 8.6 KiB
🟡 agents/chat#interceptAgentToolBroadcast 2.5 KiB 8.7 KiB
🟡 agents/chat#isPlatformFailure 2.6 KiB 8.9 KiB
🟡 agents/chat#isReplayChunk 2.4 KiB 8.7 KiB
🟡 agents/chat#iterateWithStallWatchdog 2.6 KiB 8.8 KiB
🟡 agents/chat#KV_DELETE_MAX_KEYS 2.3 KiB 8.2 KiB
🟡 agents/chat#listActiveChatRecoveryIncidents 2.4 KiB 8.4 KiB
🟡 agents/chat#MAX_BOUND_PARAMS 2.3 KiB 8.2 KiB
🟡 agents/chat#MessageType 2.4 KiB 9.0 KiB
🟡 agents/chat#normalizeToolInput 2.3 KiB 8.2 KiB
🟡 agents/chat#parseProtocolMessage 2.5 KiB 9.0 KiB
🟡 agents/chat#partAwaitsClientInteraction 2.4 KiB 8.6 KiB
🟡 agents/chat#pausedExecutionUpdate 2.4 KiB 8.4 KiB
🟡 agents/chat#pendingChatTerminal 2.3 KiB 8.3 KiB
🟡 agents/chat#persistReconstructedOrphan 3.1 KiB 11.0 KiB
🟡 agents/chat#PreStreamTurns 2.6 KiB 9.3 KiB
🟡 agents/chat#readChatRecoveryProgress 2.3 KiB 8.3 KiB
🟡 agents/chat#reconcileMessages 2.8 KiB 9.6 KiB
🟡 agents/chat#reconcileOrphanPartial 2.4 KiB 8.5 KiB
🟡 agents/chat#recordChatTerminal 2.4 KiB 8.3 KiB
🟡 agents/chat#repairInterruptedToolParts 2.6 KiB 9.1 KiB
🟡 agents/chat#resolveChatRecoveryConfig 2.6 KiB 8.9 KiB
🟡 agents/chat#resolveToolMergeId 2.4 KiB 8.5 KiB
🟡 agents/chat#ResumableStream 4.6 KiB 15.3 KiB
🟡 agents/chat#ResumeHandshake 3.0 KiB 10.4 KiB
🟡 agents/chat#ROW_MAX_BYTES 2.3 KiB 8.2 KiB
🟡 agents/chat#runChatRecoveryExhaustion 2.6 KiB 8.9 KiB
🟡 agents/chat#sanitizeMessage 2.5 KiB 8.8 KiB
🟡 agents/chat#sendIfOpen 2.4 KiB 8.4 KiB
🟡 agents/chat#setChatRecovering 2.5 KiB 8.5 KiB
🟡 agents/chat#shouldCreditStreamProgress 2.4 KiB 8.3 KiB
🟡 agents/chat#STREAM_CLEANUP_DELAY_SECONDS 2.3 KiB 8.2 KiB
🟡 agents/chat#STREAM_RESUME_NONE_REASONS 2.3 KiB 8.3 KiB
🟡 agents/chat#StreamAccumulator 2.9 KiB 10.7 KiB
🟡 agents/chat#StreamProgressCreditThrottle 2.4 KiB 8.3 KiB
🟡 agents/chat#SubmitConcurrencyController 2.9 KiB 10.3 KiB
🟡 agents/chat#sweepStaleChatRecoveryIncidents 2.4 KiB 8.5 KiB
🟡 agents/chat#TextSegmentJoiner 2.7 KiB 9.2 KiB
🟡 agents/chat#TIMED_OUT 2.3 KiB 8.2 KiB
🟡 agents/chat#toolApprovalUpdate 2.4 KiB 8.5 KiB
🟡 agents/chat#toolPartHasSettledResult 2.3 KiB 8.4 KiB
🟡 agents/chat#toolResultUpdate 2.4 KiB 8.5 KiB
agents/chat#truncateOlderMessages 3.2 KiB 10.4 KiB
🟡 agents/chat#TurnQueue 2.6 KiB 9.2 KiB
🟡 agents/chat#unwrapChatFiberSnapshot 2.4 KiB 8.5 KiB
🟡 agents/chat#wrapChatFiberSnapshot 2.3 KiB 8.2 KiB
agents/chat-sdk#ChatSdkStateAdapter 261.0 KiB 1141.6 KiB
agents/chat-sdk#ChatSdkStateAgent 260.4 KiB 1139.1 KiB
agents/chat-sdk#createChatSdkState 261.0 KiB 1141.6 KiB
agents/chat-sdk#defaultKeyShard 258.8 KiB 1130.2 KiB
agents/chat-sdk#defaultThreadShard 258.7 KiB 1130.1 KiB
agents/chat/react#detectToolsRequiringConfirmation 3.3 KiB 8.3 KiB
agents/chat/react#extractClientToolSchemas 3.2 KiB 8.3 KiB
agents/chat/react#getAgentMessages 3.4 KiB 8.6 KiB
agents/chat/react#getToolApproval 3.1 KiB 8.0 KiB
agents/chat/react#getToolCallId 3.1 KiB 8.0 KiB
agents/chat/react#getToolInput 3.1 KiB 8.0 KiB
agents/chat/react#getToolOutput 3.1 KiB 8.0 KiB
agents/chat/react#getToolPartState 3.2 KiB 8.2 KiB
agents/chat/react#useAgentChat 132.9 KiB 609.7 KiB
agents/chat/react#WebSocketChatTransport 5.7 KiB 17.1 KiB
agents/chat/transport#WebSocketChatTransport 2.8 KiB 9.2 KiB
agents/client#AgentClient 5.7 KiB 16.6 KiB
agents/client#AgentConnectionError 582 B 993 B
agents/client#agentFetch 4.2 KiB 12.3 KiB
agents/client#createStubProxy 638 B 1.0 KiB
agents/client#DEFAULT_CALL_TIMEOUT_MS 473 B 770 B
agents/client#isTerminalCloseEvent 509 B 822 B
agents/context#AgentContextProvider 412 B 792 B
agents/context#AgentSearchProvider 640 B 1.3 KiB
agents/context#ContextBlocks 87.4 KiB 429.7 KiB
agents/email#createAddressBasedEmailResolver 193 B 227 B
agents/email#createCatchAllEmailResolver 110 B 97 B
agents/email#createHeaderBasedEmailResolver 334 B 492 B
agents/email#createSecureReplyEmailResolver 718 B 1.3 KiB
agents/email#DEFAULT_MAX_AGE_SECONDS 56 B 39 B
agents/email#isAutoReplyEmail 201 B 249 B
agents/email#signAgentHeaders 424 B 812 B
agents/experimental/webmcp#registerWebMcp 85.2 KiB 295.8 KiB
agents/lifecycle#getCurrentAgent 376 B 798 B
agents/lifecycle#Lifecycle 8.3 KiB 25.8 KiB
agents/lifecycle#LifecycleCapability 484 B 975 B
agents/mcp#createLegacyMcpHandler 375.9 KiB 1572.2 KiB
agents/mcp#createMcpHandler 388.2 KiB 1617.4 KiB
agents/mcp#DurableObjectEventStore 342.5 KiB 1430.7 KiB
agents/mcp#ElicitRequestSchema 342.5 KiB 1430.7 KiB
agents/mcp#experimental_createMcpHandler 376.1 KiB 1572.5 KiB
agents/mcp#getMcpAuthContext 342.5 KiB 1430.8 KiB
agents/mcp#MCP_SERVER_ID_MAX_LENGTH 342.5 KiB 1430.7 KiB
agents/mcp#McpAgent 342.5 KiB 1430.7 KiB
agents/mcp#normalizeServerId 342.5 KiB 1430.7 KiB
agents/mcp#RPC_DO_PREFIX 342.5 KiB 1430.7 KiB
agents/mcp#RPCClientTransport 342.5 KiB 1430.7 KiB
agents/mcp#RPCServerTransport 342.5 KiB 1430.7 KiB
agents/mcp#SSEEdgeClientTransport 342.6 KiB 1431.0 KiB
agents/mcp#StreamableHTTPEdgeClientTransport 342.6 KiB 1431.0 KiB
agents/mcp#WorkerTransport 345.8 KiB 1447.6 KiB
agents/mcp/client#getNamespacedData 62.9 KiB 240.0 KiB
agents/mcp/client#MCP_SERVER_ID_MAX_LENGTH 62.9 KiB 239.9 KiB
agents/mcp/client#MCPClientManager 158.6 KiB 702.6 KiB
agents/mcp/client#normalizeServerId 63.0 KiB 240.2 KiB
agents/mcp/do-oauth-client-provider#DurableObjectOAuthClientProvider 2.1 KiB 6.6 KiB
agents/mcp/server#createMcpHandler 80.5 KiB 307.2 KiB
agents/mcp/server#getMcpAuthContext 64.0 KiB 245.5 KiB
agents/observability#channels 259 B 549 B
agents/observability#genericObservability 470 B 1.2 KiB
agents/observability#subscribe 324 B 668 B
agents/observability/ai#wrapAISDK 8.8 KiB 30.5 KiB
agents/react#_testUtils 3.8 KiB 9.5 KiB
agents/react#useAgent 10.8 KiB 31.1 KiB
agents/react#useAgentToolEvents 5.6 KiB 16.8 KiB
agents/routing#getAgentByName 795 B 1.7 KiB
agents/routing#routeAgentRequest 1.6 KiB 3.6 KiB
agents/routing#RoutedAgents 2.4 KiB 6.2 KiB
agents/schedule#getSchedulePrompt 85.8 KiB 424.7 KiB
agents/schedule#scheduleSchema 85.3 KiB 423.6 KiB
agents/schedule#unstable_getSchedulePrompt 85.9 KiB 424.9 KiB
agents/schedule#unstable_scheduleSchema 85.3 KiB 423.6 KiB
agents/schedules#Scheduler 6.8 KiB 22.0 KiB
agents/schedules/parser#getSchedulePrompt 85.8 KiB 424.7 KiB
agents/schedules/parser#scheduleSchema 85.3 KiB 423.6 KiB
agents/sessions#createCompactFunction 1.7 KiB 4.0 KiB
agents/sessions#Session 1.9 KiB 5.4 KiB
agents/sessions#Sessions 8.8 KiB 31.2 KiB
🟡 agents/skills#fromManifest 309.8 KiB 1084.0 KiB
🟡 agents/skills#parseSkillFrontmatter 328.4 KiB 1146.2 KiB
🟡 agents/skills#parseSkillMarkdown 328.6 KiB 1146.5 KiB
🟡 agents/skills#r2 330.2 KiB 1150.4 KiB
🟡 agents/skills#runner 369.0 KiB 1297.8 KiB
🟡 agents/skills#SkillRegistry 416.4 KiB 1581.7 KiB
agents/skills/compile#compileSkillScript 15.4 KiB 43.4 KiB
agents/skills/compile#isCompilableSkillScript 15.4 KiB 43.3 KiB
agents/streams#DEFAULT_MAX_CHUNK_BYTES 83 B 81 B
agents/streams#sseResponse 843 B 1.6 KiB
agents/streams#StreamClosedError 161 B 197 B
agents/streams#StreamNotFoundError 201 B 261 B
agents/streams#Streams 3.4 KiB 11.1 KiB
agents/streams#StreamSerializationError 158 B 186 B
agents/tasks#DuplicateTaskStepError 328 B 463 B
agents/tasks#MAX_SERIALIZED_BYTES 190 B 232 B
agents/tasks#MissingTaskDefinitionError 358 B 536 B
agents/tasks#NonRetryableError 238 B 308 B
agents/tasks#TaskReplayDivergedError 341 B 483 B
agents/tasks#Tasks 8.9 KiB 31.8 KiB
agents/tasks#TaskSerializationError 258 B 339 B
agents/types#MessageType 211 B 365 B
agents/vite#default 353.8 KiB 1356.1 KiB
agents/websockets#CALLABLES_RPC_QUERY 12.4 KiB 43.3 KiB
agents/websockets#CALLABLES_RPC_VALUE 12.4 KiB 43.3 KiB
agents/websockets#callablesFromDecorated 12.7 KiB 44.3 KiB
agents/websockets#callablesRpcUrl 12.5 KiB 43.5 KiB
agents/websockets#isCallablesRpcUpgrade 12.4 KiB 43.4 KiB
agents/websockets#WebSockets 17.7 KiB 62.2 KiB
agents/workflows#AgentWorkflow 260.0 KiB 1134.8 KiB
agents/workflows#WorkflowRejectedError 258.7 KiB 1130.2 KiB
agents/x402#normalizeNetwork 14.7 KiB 61.1 KiB
agents/x402#withX402 23.0 KiB 89.2 KiB
agents/x402#withX402Client 104.1 KiB 346.5 KiB

Reported by agent-think[bot].

Build usePiSession on useAgent from agents/react instead of a hand-rolled
WebSocket with its own reconnect loop. The protocol over the WebSockets
capability is unchanged.

Claude-Session: https://claude.ai/code/session_01KEFnjoMnZBMewsuD9qxGrL

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

Devin Review found 4 new potential issues.

2 flags not posted on this PR by your GitHub settings — view them in Devin Review. (Configure)

Devin Review

Comment on lines +486 to +490
this.#reject(
lane,
operationId,
"run",
new PiOperationRejectedError(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Queued maintenance aborts become runs

Aborting a queued compaction or navigation passes "run" to #reject. Listeners receive the wrong kind, corrupting status displays and operation-specific handling.

Prompt for agents
When aborting a queued operation in PiHarness.abort, recover the deleted submission’s request and derive its kind with requestKind instead of hardcoding run. PiSubmissions.deleteOperation currently returns only a boolean, so adjust the intake API or read the queued row before deletion while preserving atomic withdrawal semantics.
Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +308 to +312
try {
return (
(await routeAgentRequest(request, env, { cors: true })) ??
new Response("Not found", { status: 404 })
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟥 Session IDs grant full conversation control

Anyone holding a session UUID can connect through routeAgentRequest without authentication. They can read conversations, invoke tools, submit prompts, and abort work.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +66 to +72
function isClientMessage(value: unknown): value is PiClientMessage {
return (
typeof value === "object" &&
value !== null &&
"type" in value &&
typeof value.type === "string"
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟨 WebSocket payloads lack runtime validation

isClientMessage checks only a string type. Malformed commands reach stream and operation APIs, enabling repeated failures or unintended resource consumption.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

}
try {
return (
(await routeAgentRequest(request, env, { cors: true })) ??

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟨 Agent routes allow cross-origin access

routeAgentRequest enables CORS for every Agent route. Any origin can access sessions when it obtains their bearer-like identifiers.

Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@pkg-pr-new

pkg-pr-new Bot commented Sep 3, 2026

Copy link
Copy Markdown

Open in StackBlitz

agents

npm i https://pkg.pr.new/agents@2210

@cloudflare/ai-chat

npm i https://pkg.pr.new/@cloudflare/ai-chat@2210

@cloudflare/codemode

npm i https://pkg.pr.new/@cloudflare/codemode@2210

hono-agents

npm i https://pkg.pr.new/hono-agents@2210

@cloudflare/shell

npm i https://pkg.pr.new/@cloudflare/shell@2210

@cloudflare/think

npm i https://pkg.pr.new/@cloudflare/think@2210

@cloudflare/voice

npm i https://pkg.pr.new/@cloudflare/voice@2210

@cloudflare/worker-bundler

npm i https://pkg.pr.new/@cloudflare/worker-bundler@2210

commit: b751ae0

Deploy as pi-harness-example, give the Vite dev server its own inspector
port so it can run beside the other harness examples, and note
CLOUDFLARE_ACCOUNT_ID for logins with several accounts.
agents/react resolved a second React copy from the agents package, which
broke every hook call in the browser. Also load the agents Vite plugin
for the bundled skill.
Resync the transcript from the durable snapshot at operation boundaries
so the prompt entry appears, and ignore a message event whose id is
already in the transcript. Shorten the empty-state copy.
devin-ai-integration[bot]

This comment was marked as resolved.

The client resyncs its transcript from the durable snapshot at operation
boundaries, so the reply must arrive as a snapshot rather than a generic
result.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant