Skip to content

ACP codebuddy.ai/* Extension Namespace Reference

A complete inventory of CodeBuddy's private extensions on ACP (Agent Client Protocol): _meta extension keys + _codebuddy.ai/* extension methods.

Intended for two audiences: ① Third-party ACP clients (Zed, etc.) — wanting to know which extensions can be read and which should never be self-fabricated; ② CodeBuddy / WorkBuddy internal developers — when modifying the admission chain, needing to know which key belongs to the standard surface and which to the multi-tenant private channel.

0. The Most Important Rule: The Standard ACP Surface Works with Zero _meta

The entire initialize / session/new / session/prompt chain of cbc --acp can function without a single codebuddy.ai/* _meta key, and must be fully usable. This is a hard contract, not "it happens to work right now."

Mechanistically guaranteed by the process-login composition root (profiles cbc-tui / cbc-headless / agent-sdk-js-single):

  • src/node/session/process-login-admission-authority.ts — maintains its own transport credential and principal in-process; issueMainAdmission() constructs the admission envelope and its grant in the same place;
  • src/node/session/process-login-acp-admission-service.ts:60-84admitAndActivate() wholly replacesmetadata with this process's self-produced ticket. The original comment is the contract: "client _meta does not participate in identity decisions at all."

External ACP clients neither can nor should construct a runtime admission envelope, so this zero-meta path is the only correct form for the standard surface.

Standing defense: src/e2e/acp-zero-meta-contract.spec.ts — drives bin/codebuddy --acp with bare stdio NDJSON, runs initialize → session/new → session/prompt entirely with zero meta, and flags any "missing … metadata" error as red.

Contrast surface: multi-owner-headless uses the session-payload composition root, whose session/newmandates explicitly carrying _meta['codebuddy.ai/sessionAdmissionV2'] (see runtime-admission-acp-adapter.ts:47-48 throwing ACP Session request is missing sessionAdmissionV2 metadata). That is a private channel, not an ACP protocol requirement — the difference between the two composition roots is only "who produces the envelope," and is unrelated to the standard surface.

C3 Change (workbuddy-single form officially named B1): WorkBuddy desktop (workbuddy-single) and workbuddy-completion-warm have changed from "per-session wire identity envelope" to process-level identity injection — the daemon injects a one-time owner authorization after initialize via _codebuddy.ai/activateWorkbuddyOwnerRuntime (warm side: _codebuddy.ai/activateCompletionRuntime), after which the CLI process self-produces the envelope. These two surfaces' session/new no longer carries sessionAdmissionV2 / authSession, retaining only the launcher's runtimeTransportCredential (transport authentication invariant, verified each time before self-signing) and two non-identity business authorization keys sessionGrantV1 / completionDispatchGrantV1 (§3.1).

The production surface for sessionAdmissionV2 converges to three locations, only the first still goes over the daemon→CLI wire: ① host control sidecar (daemon-side workbuddy-host-control-authority.ts); ② teammate leader self-signs in-process and distributes to children via the bootstrap channel (workbuddy-admission-security.ts issueTeammateAdmissionMetadata); ③ after C3, the main envelope self-signed in-process by workbuddy-single / completion-warm (same file: issueMainAdmissionMetadata / issueCompletionDispatchMetadata).

1. Classification Terminology

LabelMeaning
PublicPublic optional extension. Visible or optionally carried on the standard ACP surface (cbc --acp); absence does not affect protocol usability; third-party clients can safely read and optionally ignore.
PrivateMulti-tenant private channel, session-payload composition root only (WorkBuddy daemon ↔ CLI, multi-owner-headless) produces and consumes. Third-party ACP clients must not produce these keys; the standard surface will never require them.

Direction notation: A→C = Agent sends to Client (response / notification); C→A = Client sends to Agent (request parameters); Bidirectional = appears in both directions.

2. Inventory Reconciliation

Line number anchor disclaimer: All file:line anchors in this document correspond to the source code at the time of writing (and most recent review) and are for quick navigation only; line numbers will inevitably drift as the source evolves. Grep by "file + referenced text / symbol" is authoritative; line numbers are auxiliary.

Canonical grep (reproducible):

bash
# Run at the genie repo root; git grep naturally excludes build artifacts like node_modules / dist / lib / out-tsc
git grep --untracked -hoE "codebuddy\.ai/[A-Za-z0-9_.-]*" -- 'packages/**/*.ts' 'packages/**/*.tsx' | sort -u | wc -l
# => 195 (deduplicated token count)

--untracked is required: without it, only tracked files are counted, and any new source files not yet committed would be missed, causing the reconciliation number to drift with commit timing. Only reconcile token counts, not hit line counts — line counts are sensitive to unrelated comment changes and cannot form a stable anchor.

Note: the -oE character class does not include /, so _codebuddy.ai/foo produces the token codebuddy.ai/foo (dropping the leading underscore), and _codebuddy.ai/session/rollback produces codebuddy.ai/session. 195 is the token count, not the key count, and must be partitioned into the four buckets below to equal the true inventory.

195 = 142 + 44 + 3 + 6, each item traceable within this document:

BucketCountWhat it isWhere in this doc
A142Actual _meta extension keys§3 (all listed)
B44JSON-RPC extension method/notification names (_codebuddy.ai/*), with underscore stripped by grep§4 (all listed)
C3Namespace prefixes / wildcard patterns, not independent keys§5.1
D6Product site URL path false positives (https://www.codebuddy.ai/...)§5.2

C3 reconciliation change (194→195): Bucket A net unchanged (removed completionDispatchId / completionExecutionDigest, added sessionGrantV1 / completionDispatchGrantV1); Bucket B 43→44 (added _codebuddy.ai/activateWorkbuddyOwnerRuntime).

Discrimination method (reproducible): For each token, check the preceding character where it appears in the source — _ ⇒ extension method (B), . or / ⇒ URL (D), otherwise ⇒ _meta key (A); then pick out wildcard prefixes that "can be followed by / or *" (C).

3. Complete _meta Extension Key Inventory (142 entries)

3.1 Admission / Identity / Credentials (14 entries)

This group is where the "public vs private" boundary matters most.

KeyDirectionClassificationProducerConsumerSemantics
runtimeAdmissionA→CPublicCLI, runtime-admission-acp-adapter.ts:10-11,30-39 (initialize response)session-payload side daemon (constructs envelope from this); standard surface clients can ignoreProcess admission handshake: schemaVersion / runtimeProfile / runtimeConfigSha256 / processInstanceId / handshakeNonce. Both composition roots send it; zero-meta e2e uses it to anchor runtimeProfile === 'cbc-headless'
sessionAdmissionV2C→APrivatemulti-owner issuer (out-of-process signing); WorkBuddy family now only the host control sidecar (workbuddy-host-control-authority.ts)runtime-admission-acp-adapter.ts:47-53, multi-owner-acp-admission-service.ts:164Admission envelope for session/new / session/load. Missing ⇒ ACP Session request is missing sessionAdmissionV2 metadata. process-login and post-C3 workbuddy-single / completion-warm are all self-produced by the CLI; clients need not and should not carry it
sessionGrantV1C→APrivatedaemon, workbuddy-runtime-admission.ts buildSessionGrantMetadata (added in C3)workbuddy-single-admission-authority.ts readWorkbuddySessionGrant (assembled in workbuddy-single only)Non-identity business authorization still needed on the wire after identity is removed from _meta: canonicalSessionId (daemon's session primary key, asserted by captureRuntimeBinding to be equal on return) / environment.values (the sole delivery channel for session incremental env on the prewarm hit path) / workspace{root,cwd,allowedRoots}. Does not participate in identity decisions; the standard ACP surface does not read this key
completionDispatchGrantV1C→APrivatedaemon, workbuddy-runtime-admission.ts buildCompletionDispatchGrantMetadata (added in C3)workbuddy-single-admission-authority.ts readWorkbuddyCompletionDispatchGrant (assembled in completion-warm only)Per-dispatch execution authorization for completion warm: executionSubPolicyId + its digest / dispatchId / executionDigest / workspace. Identity comes from process-level injection; the execution ceiling is still per-dispatch from the daemon; missing this key triggers fail-closed
authSessionC→APrivatedaemon (session-payload identity seed)acp-agent.ts:2141-2143 → per-session auth holder{ auth: { accessToken, tokenType?, domain?, refreshToken? }, account?: { uid? } }. The account field is always derived from JWT; client self-reported values are never trusted
productConfigC→APrivatedaemon (workbuddy-server/src/agent/cli-product-env.ts:170)acp-agent.ts:2144-2146Per-session product config injection: endpoint / networkEnvironment
runtimeTransportCredentialBidirectionalPrivateAdmission core (multi-owner-acp-admission-service.ts:38-39, host-teammate-admission-security.ts:41)SameOne-time credential bound to transport, used to prove connection identity at admit time
runtimeSessionBindingV2A→CPrivatemulti-owner-acp-admission-service.ts:40-41, workbuddy-session-admission-authority.ts:18daemonExact binding projection returned after successful admission: ownerId / ownerGeneration / canonicalSessionId / sessionGeneration / resourceId
runtimeBindingTokenC→APrivatedaemonagent-client-protocol/src/common/runtime-wire-authority.ts:1, acp-agent.ts:2147-2155Binding token for wire requests; non-empty string or RUNTIME_BINDING_TOKEN_INVALID
runtimeAuthorityBidirectionalPrivatedaemon / CLIruntime-wire-authority.ts:2Wire fencing authority snapshot (processIncarnation / connectionEpoch / owner / session / run generations); mismatch throws RUNTIME_*_STALE
teamNamespaceActivationC→APublicLeader injects when starting teammates (host-teammate-launch.ts:138, workbuddy-teammate-launch.ts:124)teammate child processTeam namespace activation declaration. Shared by both composition roots, not session-payload exclusive; third-party clients will not encounter it. Constraint: the sole consumption channel is the teammate bootstrap startup chain (teammate-runner.ts:272 reads from the bootstrap metadata returned by receiveWorkbuddyTeammateBootstrap), not client _meta on the ACP wire; third-party clients producing this key on the standard ACP surface will not have it consumed by any path
userinfoA→CPublicacp-agent.ts:1963-1974 (authenticate response)Client UILogged-in user info: userId / userName / userNickname / enterpriseId / enterpriseName / authType
accessToken——PrivateNo producer (does not exist in protocol)——Only appears in log redaction coverage use case (workbuddy-core/.../conversation-file-logger.spec.ts:44): verifies that "token keys with namespace prefix are also [redacted]". Listed here to prevent future misinterpretation as a usable key
homeDir——PublicRetired——Retired dead field; both production and consumption code have been physically deleted (D6-7): the only repo-wide hit is a reverse guard test settings-persession-invariants.spec.ts:10, asserting that acp-agent.ts no longer contains this key — there is not even a legacy compat read side; clients carrying it will not have it read by any path. homeDir is always derived from JWT (resolveControlledHomeDir). Retained only for "do not re-enable this key name" documentation purposes

3.2 Request Correlation and Tracing (16 entries)

All Public: Agent echoes them on the _meta of responses / notifications; clients can optionally consume; requestId / messageRequestId / userMessageId / messageId also accept client-side pre-sending on session/prompt (acp-agent.ts:2925-2938); if absent, the CLI self-produces them.

KeyDirectionProducerSemantics
requestIdBidirectionalacp-agent.ts:2925,3412Full-chain correlation ID for a single model request (highest hit count key)
messageIdBidirectionalacp-agent.ts:2937,3349Message-level ID
messageRequestIdBidirectionalacp-agent.ts:2932,3423Message ↔ request correlation ID
userMessageIdBidirectionalacp-agent.ts:2931User message ID (also echoed in session/prompt response)
promptRequestIdBidirectionalacp-agent.ts:3415-3416Business correlation ID generated by Renderer for each send/resend, for Desktop instrumentation + Galileo tracing
clientRequestIdC→AClientClient-defined correlation ID on tool calls (workbuddy-server/src/session/handlers.ts:1634)
modelRequestIdA→Cacp-view.ts:694Model-side request ID
traceIdA→Cacp-agent.ts:3075CLI-side trace ID
traceparentA→Cacp-agent.ts:2866,3429W3C traceparent echoed so the renderer's stream_render span can attach under prompt.send
runIdA→Cacp-agent.ts:263SessionRunStateMachine's run ID
runStateRevisionA→Cacp-agent.ts:262Run state snapshot revision
agentPhaseA→Cacp-agent.ts:261Agent execution phase (AgentPhaseInfo)
timestampA→Cacp-timestamp-meta.ts:124-128Timestamp (the flat key is removed during normalization, unified through the canonical location)
sendTimeC→ARendererUser send-click timestamp, for message-level user-perspective TTFT calculation (galileo-timing-hook.ts:110)
lfConvIdA→CUpstreamLF conversation ID (flat passthrough, agent-ui/src/adapters/acp-message-accumulator.spec.ts:1132)
lfConvReqIdA→CUpstreamLF conversation request ID (same)

3.3 Session Attributes and Modes (14 entries)

KeyDirectionClassificationProducer → ConsumerSemantics
modeBidirectionalPublicacp-agent.ts:2984,3072Scene mode
userIdC→APublicRenderer → session.meta (acp-agent.ts:2888)User ID for instrumentation / trace attributes (does not participate in identity decisions; identity only trusts JWT)
conversationIdBidirectionalPublicacp-agent.ts:2889 / workbuddy-app/.../stream-span-manager.ts:144Upstream conversation ID
localeC→APublicacp-agent.ts:2890 (compatible with language)Language / locale
expertIdBidirectionalPublicacp-agent.ts:2891,2987Expert ID
expertSelectionA→CPublicworkbuddy-server/.../expert-selection-reminder.ts:7Expert selection reminder block marker
parentSessionIdA→CPublicacp-protocol.ts:319,342Parent session ID for sub-agent sessions
isSubAgentA→CPublicacp-protocol.ts:319,342Whether this is a sub-agent session (note the different casing from isSubagent below — a historical legacy double-write)
isSubagentA→CPublicapi-schema.ts:1803, use-acp.ts:284Tool-call-level "is this a sub-agent call"
subagentTypeA→CPublicapi-schema.ts:1804Sub-agent type (default general-purpose)
isBackgroundA→CPublicapi-schema.ts:1805Whether running in background
isPlaygroundA→CPublicstream-span-manager.ts:148Whether this is a playground scenario
continueC→APublicacp-agent.ts:2560Declares "continue last conversation" on session/new
sessionControlBidirectionalPublicworkbuddy-core/.../conversation-prompt-operations.ts:12Session control command payload

3.4 Session Lifecycle and Errors (12 entries)

KeyDirectionClassificationProducerSemantics
errorMessageA→CPublicacp-agent.ts:414,3066Human-readable error message accompanying stopReason: 'refusal'
finishReasonA→CPublicacp-view.ts:703Model finish reason
outcomeA→CPublicacp-agent.ts:3087-3088Prompt result verdict (SUCCESS, etc.)
businessFailedA→CPublicacp-utils.ts:1004Business failure marker, for UI renderer to distinguish from transport failure
cancelReasonA→CPublicacp-protocol.ts:973Cancellation reason
cancelCauseA→CPublicautomation-prompt-builder.ts:285Cancel cause on prompt result (automation reads this first)
terminationReasonA→CPublicacp-broadcast-service.ts:435Termination reason (e.g., prompt_timeout)
promptFailurePhaseA→CPublicworkbuddy-server/src/backend/prompt-replay-safety.ts:2Phase where prompt failure occurred
promptFailureReasonA→CPublicSame :3Prompt failure reason
promptReplaySafeA→CPublicSame :1Whether this failure is safe to replay
transportLostA→CPublicworkbuddy-agent-adapter-next.ts:10689Transport connection lost marker
transportErrorA→CPublicSame :10690Transport error code (e.g., ws_rpc_connection_lost)

3.5 Tool Call Extensions (20 entries)

All Public; the vast majority are centrally copied from provider data to toolCallMeta in a single block at acp-agent.ts:5013-5064.

KeyProducerSemantics
toolNameacp-agent.ts:4093,4168Tool name
toolCallIdacp-broadcast-service.ts:287Associated tool call ID
parentToolCallIdacp-agent.ts:3949,4004Parent tool call ID (sub-agent nesting)
toolCancelReasonacp-agent.ts:578Tool cancel reason (permission_denied used to distinguish from normal cancellation)
toolFailReasonacp-agent.ts:650Tool failure reason classification
toolResultTitlepersisted-transcript-projector.ts:72Tool result title (for transcript projection)
descriptionacp-agent.ts:5047,6344Tool call description
operationacp-agent.ts:5046,6343Operation type (e.g., mcp-ui reverse tools/call)
targetacp-agent.ts:5045,6342Operation target (e.g., MCP server name)
filenameacp-utils.ts:654Associated filename
imagesacp-broadcast-service.ts:684Image payload
rawResponseacp-utils.ts:997Tool raw structured result, passed through to UI renderer (e.g., web-search)
bulkDeleteInfoacp-agent.ts:5059-5060Bulk delete info
bypassHintacp-agent.ts:5056-5057Bypass hint
interceptTypeacp-agent.ts:5044,6758Intercept type
sandboxInterceptacp-agent.ts:5013,5043Sandbox intercept marker
sandboxApprovalModeacp-agent.ts:5053-5054Sandbox approval mode
mcpUiInterceptacp-agent.ts:4853,6341MCP-UI reverse call intercept marker
hookacp-utils.ts:770, session-manager.ts:766Hook structured block info
detailsacp-agent.ts:6800Event supplementary details

3.6 Permissions / Plans / Goals (8 entries)

All Public.

KeyProducerSemantics
decisionacp-broadcast-service.ts:289Permission decision result
permissionResolvedacp-broadcast-service.ts:286Permission resolved notification
planContentapi-schema.ts:1808ExitPlanMode plan body
goalProgressuse-acp.ts:491-492Goal progress
goalRecapacp-broadcast-service.ts:487Goal recap
goalStatususe-acp.ts:522-523Goal status
interruptionRequestacp-broadcast-service.ts:221, session-replay.ts:692Interruption (HITL) request payload
promptSuggestionprompt-suggestion-service.ts:502Prompt suggestion

3.7 History Replay and Transcript Projection (10 entries)

KeyDirectionClassificationProducerSemantics
historyReplayA→CPublicsession-replay.ts:392History replay boundary marker (start / end)
historyReplayTotalItemsA→CPublicsession-replay.ts:393Total replay item count (only at start)
rendererHistoryReplayA→CPublicconversation-frame-classifier.ts:83, replay-event-classifier.ts:82Renderer replay marker
ownerSnapshotHistoryReplayA→CPrivatereplay-event-classifier.ts:87, conversation-frame-classifier.ts:84Owner snapshot replay marker — the owner concept only holds under session-payload multi-tenancy
isSessionSeparatorA→CPublicconversation-frame-classifier.ts:91Session separator frame marker
separatorExtraA→CPublicSame :94Separator frame additional info
createTimeA→CPublicSame :93Frame creation time
offsetA→CPublicworkbuddy-agent-adapter-next.ts:6458Transcript source offset (legacy key)
sourceOffsetA→CPublicagent-member-utils.ts:242, team-runtime.ts:461Transcript source offset (new key, takes priority over offset)
originalBytesA→CPublicpersisted-transcript-projector.ts:71Original byte count before transcript truncation

3.8 Context Compaction (6 entries)

All Public, via session_info_update._meta.

KeyProducerSemantics
compactTypecontext-protocol.ts:231Compaction type; desktop adapter decides presentation based on this
compactStatusconversation-frame-classifier.ts:231Compaction status
compact-cancelledcontext-protocol.ts:287{ cancelled: true } — compaction was cancelled
compact-limit-reachedcontext-protocol.ts:295{ limitReached: true } — compaction limit reached
compactTruncatedpersisted-transcript-projector.ts:70This frame was truncated during compaction
isCompactInternalacp-agent.ts:3200,3396This prompt was internally triggered by compact (not counted as a user-visible turn)

3.9 Team / Teammate (7 entries)

KeyDirectionClassificationProducerSemantics
teamUpdateA→CPublicacp-team-bridge.ts:745,779Team status event (member status change, etc.)
memberEventA→CPublicacp-team-bridge.ts:602Attribution tag for member streaming messages (member name)
memberNameA→CPublicacp-agent.ts:5037Member name owning the tool call
isTeamMemberA→CPublicacp-agent.ts:5036This tool call is from a team member
agentColorA→CPublicacp-agent.ts:5039Member display color
syntheticTeammateMessageA→CPublicteam-runtime-loader.ts:691, workbuddy-agent-adapter-next.ts:4945Synthetic teammate message (not directly from model)
teammateSummaryA→CPublicSame :693 / :4946Teammate summary text

3.10 Workflow (14 entries)

All Public, centrally produced at src/node/workflow/acp/workflow-acp-bridge.ts:146-190, with a unified codebuddy.ai/workflow* key space.

KeyLineSemantics
workflowEventKind:151Event type
workflowRunId:156,168Run ID
workflowName:157Workflow name
workflowStatus:158Run status
workflowAgentCount:159Total agent count
workflowCachedCount:160Cached agent count
workflowPhaseCount:161Total phase count
workflowError:163Run-level error
workflowPhase:169Current phase
workflowAgentKey:175Agent key
workflowAgentLabel:177Agent display name
workflowAgentPhase:180Agent phase
workflowAgentError:183Agent-level error
workflowAgentTokens:186Agent token consumption

3.11 External Channel Access (6 entries)

All Public, produced by acp-utils.ts:481-491 and consumed by Web UI use-acp.ts:202-213. Carries source information for external channels such as WeCom.

KeySemantics
channelSourceChannel source identifier
channelSenderSender ID
channelSenderNameSender display name
channelChatIdConversation ID
channelChatTypeConversation type (single / group)
commandKindCommand kind (slash)

3.12 MCP-UI and Message Queue (4 entries)

KeyDirectionClassificationProducerSemantics
sendMessageModeC→APublicMCP-UI widget (mcp-app-handlers.ts:79,112)Widget write-back message behavior routing: send / fill
message_queue_updateA→CPublicacp-broadcast-service.ts:462Message queue incremental update
newSessionIdA→CPublicacp-command-attachment-router.ts:73New sessionId after command triggers new session creation
sessionResetA→CPublicacp-command-attachment-router.ts:72Session was reset (e.g., /clear)

3.13 Content and Usage (5 entries)

KeyDirectionClassificationProducerSemantics
usageByCategoryA→CPublicacp-protocol.ts:64,1331Categorized usage for usage_update; invariant: sum(usageByCategory) === update.used
contentFilterNoticeA→CPubliccontext-protocol.ts:258Content filter notice (true means this text block is a filter notification)
hiddenPromptContextC→APubliccolleague-mention-context.ts:15This prompt block is hidden context, not rendered in UI
progressA→CPublicacp-agent.ts:3820, stream-json-protocol.ts:554Progress payload on session_info_update
sourceEventA→CPublicacp-utils.ts:146Objective description of this update's source event (facets), for adapter dispatching

3.14 Model Identification (4 entries)

All Public, centrally backfilled at acp-agent.ts:3437-3447.

KeySemantics
requestModelIdModel ID used for the request
requestModelNameModel name used for the request
responseModelIdActual response model ID
responseModelNameActual response model name (conversation-event-machine.ts:334)

3.15 Completion Warm and Others (2 entries)

C3 change: completionDispatchId / completionExecutionDigest two flat keys have been physically deleted along with buildEphemeralMetadata; their semantics are merged into §3.1's completionDispatchGrantV1 (structured per-dispatch execution authorization).

KeyDirectionClassificationProducerSemantics
statusA→CPublicacp-session-info-router.ts:136-137, conversation-event-machine.ts:763Status field for session_info_update
modelA→CPublicstream-span-manager.ts:145Flat model name (for span attribution)

Private key subtotal (10 entries): sessionAdmissionV2, sessionGrantV1, completionDispatchGrantV1, authSession, productConfig, runtimeTransportCredential, runtimeSessionBindingV2, runtimeBindingToken, runtimeAuthority, ownerSnapshotHistoryReplay — plus accessToken which "has no producer but belongs to the credential surface", totaling 11 entries that never appear on the standard ACP surface. The remaining 131 entries are public optional extensions.

4. Complete _codebuddy.ai/* Extension Method / Notification Inventory (44 entries)

ACP requires custom methods to use underscore prefix + reverse domain namespace. These are not _meta keys, but share the same namespace; third-party clients likewise need to know their public / private classification. Inventory entry: packages/agent-client-protocol/src/common/types.ts:25-35.

Method NameDirectionClassificationSemantics
_codebuddy.ai/questionA→C (request)PublicHITL question, waiting for client response (acp-protocol.ts:900)
_codebuddy.ai/resolveInterruptionC→A (request)PublicClient answers interruption request (acp-agent.ts:5565-5570)
_codebuddy.ai/artifactA→C (notify)PublicArtifact push (session-replay.ts:523)
_codebuddy.ai/commandA→C (notify)PublicCommand event (types.ts:25)
_codebuddy.ai/checkpointA→C (notify)PublicCheckpoint event (session-replay.ts:601)
_codebuddy.ai/session/rollbackC→A (request)PublicSession rollback (acp-agent.ts:5812)
_codebuddy.ai/session/rollbackFilesC→A (request)PublicFile-level rollback
_codebuddy.ai/session/previewFileRollbackC→A (request)PublicRollback preview
_codebuddy.ai/file_history_snapshotA→C (notify)PublicFile history snapshot (types.ts:29)
_codebuddy.ai/fileTreeChangedA→C (notify)PublicFile tree changed (must include filePath)
_codebuddy.ai/authUrlA→C (notify)PublicLogin redirect URL (types.ts:27)
_codebuddy.ai/getUserInfoC→A (request)PublicFetch user info (acp-agent.ts:5578)
_codebuddy.ai/uiControlA→C (request)PublicUI control command (types.ts:35)
_codebuddy.ai/system_initA→C (notify)PublicSystem initialization notification
_codebuddy.ai/tool_inputA→C (request)PublicTool input inquiry (agent-provider/examples/question-example.ts:16)
_codebuddy.ai/delegateToolA→C (request)PublicTool proxy execution (delegate-tool-manager.ts:299)
_codebuddy.ai/delegateToolsChangedC→A (notify)PublicClient delegatable tool set changed (acp-agent.ts:5580)
_codebuddy.ai/refreshPluginsC→A (request)PublicRequest plugin refresh (acp-agent.ts:5584)
_codebuddy.ai/plugins_changedA→C (notify)PublicPlugin set changed
_codebuddy.ai/mcp_servers_changedA→C (notify)PublicMCP server set changed
_codebuddy.ai/models_changedA→C (notify)PublicModel list changed
_codebuddy.ai/product_config_changedA→C (notify)PublicProduct config changed
_codebuddy.ai/identity_changedA→C (notify)PublicIdentity change broadcast (broadcast to all live sessions after main process writes)
_codebuddy.ai/queue_state_changedA→C (notify)PublicQueue state changed
_codebuddy.ai/message_queue_snapshot_changedA→C (notify)PublicMessage queue snapshot changed
_codebuddy.ai/automation_snapshotA→C (notify)PublicAutomation snapshot
_codebuddy.ai/interaction_timeoutA→C (notify)PublicInteraction timeout (cloud-agent-event-bridge.ts:10)
_codebuddy.ai/teamsA→C (notify)PublicTeam SSE event (use-collab-queue.ts:5)
_codebuddy.ai/conversationA→C (notify)PublicConversation event (use-conversation-events.ts:50)
_codebuddy.ai/mcpUiCallToolC→A (request)PublicMCP-UI reverse tools/call
_codebuddy.ai/mcpUiReadResourceC→A (request)PublicMCP-UI read resource
_codebuddy.ai/mcpUiUpdateModelContextC→A (request)PublicMCP-UI update model context
_codebuddy.ai/mcpUiRequestDisplayModeC→A (request)PublicMCP-UI request display mode
_codebuddy.ai/mcpUiResourceTeardownC→A (request)PublicMCP-UI resource teardown
_codebuddy.ai/respondToSandboxInterceptC→A (request)PublicRespond to sandbox intercept (codebuddy-code-backend.ts:1909)
_codebuddy.ai/admitControlC→A (request)PrivateControl Session admission. process-login composition root directly throws (process-login-acp-admission-service.ts:87-90), only used by workbuddy-host-sidecar
_codebuddy.ai/runtimeCredentialUpdateC→A (request)Privateper-session exact credential update (acp-agent.ts:5595)
_codebuddy.ai/runtimeControlCredentialUpdateC→A (request)Privatecontrol binding credential update (acp-agent.ts:5597)
_codebuddy.ai/runtimeOwnerCredentialUpdateC→A (request)Privateowner-level bulk credential update (acp-agent.ts:5599), corresponds to bulkApplyExactCredentialUpdates
_codebuddy.ai/activateWorkbuddyOwnerRuntimeC→A (request)PrivateAdded in C3: injects a one-time owner authorization into the workbuddy-single process (authSession + product material + credential handle), after which session/new needs zero identity meta. Payload = {proof, processInstanceId, handshakeNonce, runtimeConfigSha256, ownerGeneration}, validation point workbuddy-admission-security.ts activateOwnerRuntime
_codebuddy.ai/activateCompletionRuntimeC→A (request)PrivateActivate completion warm runtime; from C3, claims append credentialMaterial, simultaneously serving as the warm side's process-level owner injection, and after credential refresh, it is called again with the same ownerGeneration and a new proof (full replacement semantics)
_codebuddy.ai/completionDispatchC→A (request)PrivateDispatch a completion (acp-agent.ts:5738)
_codebuddy.ai/completionRuntimeDiagnosticsC→A (request)PrivateCompletion runtime diagnostics (acp-agent.ts:5708)
_codebuddy.ai/disposeEphemeralSessionC→A (request)PrivateDestroy ephemeral session (acp-agent.ts:5676)
_codebuddy.ai/disposePersistentSessionC→A (request)PrivateDestroy persistent session (acp-agent.ts:5705)
_codebuddy.ai/example————Test-only placeholder method name, only appears in workbuddy-server/src/server-owned-handlers.spec.ts:2113, no production implementation

46 rows in the table = 44 grep tokens + session/rollbackFiles / session/previewFileRollback two sub-paths (they share the token codebuddy.ai/session with session/rollback; grep counts it only once).

5. Non-Key Hits (9 entries)

5.1 Namespace Prefixes / Wildcard Patterns (3 entries)

TokenOccurrence FormDescription
codebuddy.ai/startsWith('codebuddy.ai/') / startsWith('_codebuddy.ai/')The namespace prefix itself. Guard points: workflow-acp-bridge.spec.ts:82, sandbox-proxy/src/handler/artifacts-proxy.ts:70, sandbox-proxy/src/replay/replay.ts:1047
codebuddy.ai/workflowcodebuddy.ai/workflow* in commentsKey space wildcard pattern (workflow-acp-bridge.ts:146), not an independent key
codebuddy.ai/mcpUi_codebuddy.ai/mcpUi* in commentsWildcard pattern for 5 MCP-UI extension methods (mcp-apps-extmethod.spec.ts:4)

5.2 Product Site URL Path False Positives (6 entries)

The following tokens come from URLs like https://www.codebuddy.ai/... / https://code.codebuddy.ai/... and are unrelated to the protocol:

TokenSource
codebuddy.ai/docskeybinding-template.ts:18,52, mcp-approval-box.tsx:16
codebuddy.ai/schemaskeybinding-template.ts:17,51
codebuddy.ai/loginchat-ui/src/browser/login/login.tsx:149
codebuddy.ai/agentsagent-ui/src/utils/workbuddy-share-origin.spec.ts:312
codebuddy.ai/profileuse-error-banner.tsx:186 (.../profile/plan)
codebuddy.ai/v2model-provider.spec.ts:454,520 (API baseURL)

6. Rules for Third-Party ACP Clients

  1. Do not produce any codebuddy.ai/* _meta key for identity or admission. The keys marked "Private" in §3.1 are issued by CodeBuddy's internal composition roots; client-fabricated ones will only be rejected (envelope validation, digest comparison, fencing all fail).
  2. You can safely read all "Public" keys and optionally ignore them. They are all optional incremental information; semantic changes will not break the basic ACP flow.
  3. Correlation IDs optionally carried on session/prompt (requestId / messageId / messageRequestId / userMessageId / promptRequestId / clientRequestId / sendTime / traceparent) are the only group recommended for client-side production — they only affect instrumentation and tracing, and do not participate in any authentication decisions.
  4. _codebuddy.ai/* extension methods: the 9 marked "Private" in §4 (admitControl + three runtime*CredentialUpdate
    • completion trio + dispose duo) only appear in WorkBuddy's internal channels; standard surface calls will be rejected.
  • ACP Protocol Integration--acp startup, Zed configuration, protocol features
  • Zero _meta standing e2e: src/e2e/acp-zero-meta-contract.spec.ts
  • Admission contract implementation: src/node/session/runtime-admission-acp-adapter.ts, src/node/session/process-login-acp-admission-service.ts, src/node/session/multi-owner-acp-admission-service.ts
  • Profile registry: packages/runtime-admission-protocol/src/runtime-admission-contract.ts