ACP codebuddy.ai/* Extension Namespace Reference
A complete inventory of CodeBuddy's private extensions on ACP (Agent Client Protocol):
_metaextension 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-84—admitAndActivate()wholly replacesmetadatawith this process's self-produced ticket. The original comment is the contract: "client_metadoes 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) andworkbuddy-completion-warmhave changed from "per-session wire identity envelope" to process-level identity injection — the daemon injects a one-time owner authorization afterinitializevia_codebuddy.ai/activateWorkbuddyOwnerRuntime(warm side:_codebuddy.ai/activateCompletionRuntime), after which the CLI process self-produces the envelope. These two surfaces'session/newno longer carriessessionAdmissionV2/authSession, retaining only the launcher'sruntimeTransportCredential(transport authentication invariant, verified each time before self-signing) and two non-identity business authorization keyssessionGrantV1/completionDispatchGrantV1(§3.1).The production surface for
sessionAdmissionV2converges to three locations, only the first still goes over the daemon→CLI wire: ① host control sidecar (daemon-sideworkbuddy-host-control-authority.ts); ② teammate leader self-signs in-process and distributes to children via the bootstrap channel (workbuddy-admission-security.tsissueTeammateAdmissionMetadata); ③ after C3, the main envelope self-signed in-process by workbuddy-single / completion-warm (same file:issueMainAdmissionMetadata/issueCompletionDispatchMetadata).
1. Classification Terminology
| Label | Meaning |
|---|---|
| Public | Public 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. |
| Private | Multi-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:lineanchors 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)
--untrackedis 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
-oEcharacter class does not include/, so_codebuddy.ai/fooproduces the tokencodebuddy.ai/foo(dropping the leading underscore), and_codebuddy.ai/session/rollbackproducescodebuddy.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:
| Bucket | Count | What it is | Where in this doc |
|---|---|---|---|
| A | 142 | Actual _meta extension keys | §3 (all listed) |
| B | 44 | JSON-RPC extension method/notification names (_codebuddy.ai/*), with underscore stripped by grep | §4 (all listed) |
| C | 3 | Namespace prefixes / wildcard patterns, not independent keys | §5.1 |
| D | 6 | Product site URL path false positives (https://www.codebuddy.ai/...) | §5.2 |
C3 reconciliation change (194→195): Bucket A net unchanged (removed
completionDispatchId/completionExecutionDigest, addedsessionGrantV1/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.
| Key | Direction | Classification | Producer | Consumer | Semantics |
|---|---|---|---|---|---|
runtimeAdmission | A→C | Public | CLI, runtime-admission-acp-adapter.ts:10-11,30-39 (initialize response) | session-payload side daemon (constructs envelope from this); standard surface clients can ignore | Process admission handshake: schemaVersion / runtimeProfile / runtimeConfigSha256 / processInstanceId / handshakeNonce. Both composition roots send it; zero-meta e2e uses it to anchor runtimeProfile === 'cbc-headless' |
sessionAdmissionV2 | C→A | Private | multi-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:164 | Admission 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 |
sessionGrantV1 | C→A | Private | daemon, 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 |
completionDispatchGrantV1 | C→A | Private | daemon, 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 |
authSession | C→A | Private | daemon (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 |
productConfig | C→A | Private | daemon (workbuddy-server/src/agent/cli-product-env.ts:170) | acp-agent.ts:2144-2146 | Per-session product config injection: endpoint / networkEnvironment |
runtimeTransportCredential | Bidirectional | Private | Admission core (multi-owner-acp-admission-service.ts:38-39, host-teammate-admission-security.ts:41) | Same | One-time credential bound to transport, used to prove connection identity at admit time |
runtimeSessionBindingV2 | A→C | Private | multi-owner-acp-admission-service.ts:40-41, workbuddy-session-admission-authority.ts:18 | daemon | Exact binding projection returned after successful admission: ownerId / ownerGeneration / canonicalSessionId / sessionGeneration / resourceId |
runtimeBindingToken | C→A | Private | daemon | agent-client-protocol/src/common/runtime-wire-authority.ts:1, acp-agent.ts:2147-2155 | Binding token for wire requests; non-empty string or RUNTIME_BINDING_TOKEN_INVALID |
runtimeAuthority | Bidirectional | Private | daemon / CLI | runtime-wire-authority.ts:2 | Wire fencing authority snapshot (processIncarnation / connectionEpoch / owner / session / run generations); mismatch throws RUNTIME_*_STALE |
teamNamespaceActivation | C→A | Public | Leader injects when starting teammates (host-teammate-launch.ts:138, workbuddy-teammate-launch.ts:124) | teammate child process | Team 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 |
userinfo | A→C | Public | acp-agent.ts:1963-1974 (authenticate response) | Client UI | Logged-in user info: userId / userName / userNickname / enterpriseId / enterpriseName / authType |
accessToken | —— | Private | No 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 | —— | Public | Retired | —— | 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.
| Key | Direction | Producer | Semantics |
|---|---|---|---|
requestId | Bidirectional | acp-agent.ts:2925,3412 | Full-chain correlation ID for a single model request (highest hit count key) |
messageId | Bidirectional | acp-agent.ts:2937,3349 | Message-level ID |
messageRequestId | Bidirectional | acp-agent.ts:2932,3423 | Message ↔ request correlation ID |
userMessageId | Bidirectional | acp-agent.ts:2931 | User message ID (also echoed in session/prompt response) |
promptRequestId | Bidirectional | acp-agent.ts:3415-3416 | Business correlation ID generated by Renderer for each send/resend, for Desktop instrumentation + Galileo tracing |
clientRequestId | C→A | Client | Client-defined correlation ID on tool calls (workbuddy-server/src/session/handlers.ts:1634) |
modelRequestId | A→C | acp-view.ts:694 | Model-side request ID |
traceId | A→C | acp-agent.ts:3075 | CLI-side trace ID |
traceparent | A→C | acp-agent.ts:2866,3429 | W3C traceparent echoed so the renderer's stream_render span can attach under prompt.send |
runId | A→C | acp-agent.ts:263 | SessionRunStateMachine's run ID |
runStateRevision | A→C | acp-agent.ts:262 | Run state snapshot revision |
agentPhase | A→C | acp-agent.ts:261 | Agent execution phase (AgentPhaseInfo) |
timestamp | A→C | acp-timestamp-meta.ts:124-128 | Timestamp (the flat key is removed during normalization, unified through the canonical location) |
sendTime | C→A | Renderer | User send-click timestamp, for message-level user-perspective TTFT calculation (galileo-timing-hook.ts:110) |
lfConvId | A→C | Upstream | LF conversation ID (flat passthrough, agent-ui/src/adapters/acp-message-accumulator.spec.ts:1132) |
lfConvReqId | A→C | Upstream | LF conversation request ID (same) |
3.3 Session Attributes and Modes (14 entries)
| Key | Direction | Classification | Producer → Consumer | Semantics |
|---|---|---|---|---|
mode | Bidirectional | Public | acp-agent.ts:2984,3072 | Scene mode |
userId | C→A | Public | Renderer → session.meta (acp-agent.ts:2888) | User ID for instrumentation / trace attributes (does not participate in identity decisions; identity only trusts JWT) |
conversationId | Bidirectional | Public | acp-agent.ts:2889 / workbuddy-app/.../stream-span-manager.ts:144 | Upstream conversation ID |
locale | C→A | Public | acp-agent.ts:2890 (compatible with language) | Language / locale |
expertId | Bidirectional | Public | acp-agent.ts:2891,2987 | Expert ID |
expertSelection | A→C | Public | workbuddy-server/.../expert-selection-reminder.ts:7 | Expert selection reminder block marker |
parentSessionId | A→C | Public | acp-protocol.ts:319,342 | Parent session ID for sub-agent sessions |
isSubAgent | A→C | Public | acp-protocol.ts:319,342 | Whether this is a sub-agent session (note the different casing from isSubagent below — a historical legacy double-write) |
isSubagent | A→C | Public | api-schema.ts:1803, use-acp.ts:284 | Tool-call-level "is this a sub-agent call" |
subagentType | A→C | Public | api-schema.ts:1804 | Sub-agent type (default general-purpose) |
isBackground | A→C | Public | api-schema.ts:1805 | Whether running in background |
isPlayground | A→C | Public | stream-span-manager.ts:148 | Whether this is a playground scenario |
continue | C→A | Public | acp-agent.ts:2560 | Declares "continue last conversation" on session/new |
sessionControl | Bidirectional | Public | workbuddy-core/.../conversation-prompt-operations.ts:12 | Session control command payload |
3.4 Session Lifecycle and Errors (12 entries)
| Key | Direction | Classification | Producer | Semantics |
|---|---|---|---|---|
errorMessage | A→C | Public | acp-agent.ts:414,3066 | Human-readable error message accompanying stopReason: 'refusal' |
finishReason | A→C | Public | acp-view.ts:703 | Model finish reason |
outcome | A→C | Public | acp-agent.ts:3087-3088 | Prompt result verdict (SUCCESS, etc.) |
businessFailed | A→C | Public | acp-utils.ts:1004 | Business failure marker, for UI renderer to distinguish from transport failure |
cancelReason | A→C | Public | acp-protocol.ts:973 | Cancellation reason |
cancelCause | A→C | Public | automation-prompt-builder.ts:285 | Cancel cause on prompt result (automation reads this first) |
terminationReason | A→C | Public | acp-broadcast-service.ts:435 | Termination reason (e.g., prompt_timeout) |
promptFailurePhase | A→C | Public | workbuddy-server/src/backend/prompt-replay-safety.ts:2 | Phase where prompt failure occurred |
promptFailureReason | A→C | Public | Same :3 | Prompt failure reason |
promptReplaySafe | A→C | Public | Same :1 | Whether this failure is safe to replay |
transportLost | A→C | Public | workbuddy-agent-adapter-next.ts:10689 | Transport connection lost marker |
transportError | A→C | Public | Same :10690 | Transport 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.
| Key | Producer | Semantics |
|---|---|---|
toolName | acp-agent.ts:4093,4168 | Tool name |
toolCallId | acp-broadcast-service.ts:287 | Associated tool call ID |
parentToolCallId | acp-agent.ts:3949,4004 | Parent tool call ID (sub-agent nesting) |
toolCancelReason | acp-agent.ts:578 | Tool cancel reason (permission_denied used to distinguish from normal cancellation) |
toolFailReason | acp-agent.ts:650 | Tool failure reason classification |
toolResultTitle | persisted-transcript-projector.ts:72 | Tool result title (for transcript projection) |
description | acp-agent.ts:5047,6344 | Tool call description |
operation | acp-agent.ts:5046,6343 | Operation type (e.g., mcp-ui reverse tools/call) |
target | acp-agent.ts:5045,6342 | Operation target (e.g., MCP server name) |
filename | acp-utils.ts:654 | Associated filename |
images | acp-broadcast-service.ts:684 | Image payload |
rawResponse | acp-utils.ts:997 | Tool raw structured result, passed through to UI renderer (e.g., web-search) |
bulkDeleteInfo | acp-agent.ts:5059-5060 | Bulk delete info |
bypassHint | acp-agent.ts:5056-5057 | Bypass hint |
interceptType | acp-agent.ts:5044,6758 | Intercept type |
sandboxIntercept | acp-agent.ts:5013,5043 | Sandbox intercept marker |
sandboxApprovalMode | acp-agent.ts:5053-5054 | Sandbox approval mode |
mcpUiIntercept | acp-agent.ts:4853,6341 | MCP-UI reverse call intercept marker |
hook | acp-utils.ts:770, session-manager.ts:766 | Hook structured block info |
details | acp-agent.ts:6800 | Event supplementary details |
3.6 Permissions / Plans / Goals (8 entries)
All Public.
| Key | Producer | Semantics |
|---|---|---|
decision | acp-broadcast-service.ts:289 | Permission decision result |
permissionResolved | acp-broadcast-service.ts:286 | Permission resolved notification |
planContent | api-schema.ts:1808 | ExitPlanMode plan body |
goalProgress | use-acp.ts:491-492 | Goal progress |
goalRecap | acp-broadcast-service.ts:487 | Goal recap |
goalStatus | use-acp.ts:522-523 | Goal status |
interruptionRequest | acp-broadcast-service.ts:221, session-replay.ts:692 | Interruption (HITL) request payload |
promptSuggestion | prompt-suggestion-service.ts:502 | Prompt suggestion |
3.7 History Replay and Transcript Projection (10 entries)
| Key | Direction | Classification | Producer | Semantics |
|---|---|---|---|---|
historyReplay | A→C | Public | session-replay.ts:392 | History replay boundary marker (start / end) |
historyReplayTotalItems | A→C | Public | session-replay.ts:393 | Total replay item count (only at start) |
rendererHistoryReplay | A→C | Public | conversation-frame-classifier.ts:83, replay-event-classifier.ts:82 | Renderer replay marker |
ownerSnapshotHistoryReplay | A→C | Private | replay-event-classifier.ts:87, conversation-frame-classifier.ts:84 | Owner snapshot replay marker — the owner concept only holds under session-payload multi-tenancy |
isSessionSeparator | A→C | Public | conversation-frame-classifier.ts:91 | Session separator frame marker |
separatorExtra | A→C | Public | Same :94 | Separator frame additional info |
createTime | A→C | Public | Same :93 | Frame creation time |
offset | A→C | Public | workbuddy-agent-adapter-next.ts:6458 | Transcript source offset (legacy key) |
sourceOffset | A→C | Public | agent-member-utils.ts:242, team-runtime.ts:461 | Transcript source offset (new key, takes priority over offset) |
originalBytes | A→C | Public | persisted-transcript-projector.ts:71 | Original byte count before transcript truncation |
3.8 Context Compaction (6 entries)
All Public, via session_info_update._meta.
| Key | Producer | Semantics |
|---|---|---|
compactType | context-protocol.ts:231 | Compaction type; desktop adapter decides presentation based on this |
compactStatus | conversation-frame-classifier.ts:231 | Compaction status |
compact-cancelled | context-protocol.ts:287 | { cancelled: true } — compaction was cancelled |
compact-limit-reached | context-protocol.ts:295 | { limitReached: true } — compaction limit reached |
compactTruncated | persisted-transcript-projector.ts:70 | This frame was truncated during compaction |
isCompactInternal | acp-agent.ts:3200,3396 | This prompt was internally triggered by compact (not counted as a user-visible turn) |
3.9 Team / Teammate (7 entries)
| Key | Direction | Classification | Producer | Semantics |
|---|---|---|---|---|
teamUpdate | A→C | Public | acp-team-bridge.ts:745,779 | Team status event (member status change, etc.) |
memberEvent | A→C | Public | acp-team-bridge.ts:602 | Attribution tag for member streaming messages (member name) |
memberName | A→C | Public | acp-agent.ts:5037 | Member name owning the tool call |
isTeamMember | A→C | Public | acp-agent.ts:5036 | This tool call is from a team member |
agentColor | A→C | Public | acp-agent.ts:5039 | Member display color |
syntheticTeammateMessage | A→C | Public | team-runtime-loader.ts:691, workbuddy-agent-adapter-next.ts:4945 | Synthetic teammate message (not directly from model) |
teammateSummary | A→C | Public | Same :693 / :4946 | Teammate 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.
| Key | Line | Semantics |
|---|---|---|
workflowEventKind | :151 | Event type |
workflowRunId | :156,168 | Run ID |
workflowName | :157 | Workflow name |
workflowStatus | :158 | Run status |
workflowAgentCount | :159 | Total agent count |
workflowCachedCount | :160 | Cached agent count |
workflowPhaseCount | :161 | Total phase count |
workflowError | :163 | Run-level error |
workflowPhase | :169 | Current phase |
workflowAgentKey | :175 | Agent key |
workflowAgentLabel | :177 | Agent display name |
workflowAgentPhase | :180 | Agent phase |
workflowAgentError | :183 | Agent-level error |
workflowAgentTokens | :186 | Agent 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.
| Key | Semantics |
|---|---|
channelSource | Channel source identifier |
channelSender | Sender ID |
channelSenderName | Sender display name |
channelChatId | Conversation ID |
channelChatType | Conversation type (single / group) |
commandKind | Command kind (slash) |
3.12 MCP-UI and Message Queue (4 entries)
| Key | Direction | Classification | Producer | Semantics |
|---|---|---|---|---|
sendMessageMode | C→A | Public | MCP-UI widget (mcp-app-handlers.ts:79,112) | Widget write-back message behavior routing: send / fill |
message_queue_update | A→C | Public | acp-broadcast-service.ts:462 | Message queue incremental update |
newSessionId | A→C | Public | acp-command-attachment-router.ts:73 | New sessionId after command triggers new session creation |
sessionReset | A→C | Public | acp-command-attachment-router.ts:72 | Session was reset (e.g., /clear) |
3.13 Content and Usage (5 entries)
| Key | Direction | Classification | Producer | Semantics |
|---|---|---|---|---|
usageByCategory | A→C | Public | acp-protocol.ts:64,1331 | Categorized usage for usage_update; invariant: sum(usageByCategory) === update.used |
contentFilterNotice | A→C | Public | context-protocol.ts:258 | Content filter notice (true means this text block is a filter notification) |
hiddenPromptContext | C→A | Public | colleague-mention-context.ts:15 | This prompt block is hidden context, not rendered in UI |
progress | A→C | Public | acp-agent.ts:3820, stream-json-protocol.ts:554 | Progress payload on session_info_update |
sourceEvent | A→C | Public | acp-utils.ts:146 | Objective 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.
| Key | Semantics |
|---|---|
requestModelId | Model ID used for the request |
requestModelName | Model name used for the request |
responseModelId | Actual response model ID |
responseModelName | Actual response model name (conversation-event-machine.ts:334) |
3.15 Completion Warm and Others (2 entries)
C3 change:
completionDispatchId/completionExecutionDigesttwo flat keys have been physically deleted along withbuildEphemeralMetadata; their semantics are merged into §3.1'scompletionDispatchGrantV1(structured per-dispatch execution authorization).
| Key | Direction | Classification | Producer | Semantics |
|---|---|---|---|---|
status | A→C | Public | acp-session-info-router.ts:136-137, conversation-event-machine.ts:763 | Status field for session_info_update |
model | A→C | Public | stream-span-manager.ts:145 | Flat 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 Name | Direction | Classification | Semantics |
|---|---|---|---|
_codebuddy.ai/question | A→C (request) | Public | HITL question, waiting for client response (acp-protocol.ts:900) |
_codebuddy.ai/resolveInterruption | C→A (request) | Public | Client answers interruption request (acp-agent.ts:5565-5570) |
_codebuddy.ai/artifact | A→C (notify) | Public | Artifact push (session-replay.ts:523) |
_codebuddy.ai/command | A→C (notify) | Public | Command event (types.ts:25) |
_codebuddy.ai/checkpoint | A→C (notify) | Public | Checkpoint event (session-replay.ts:601) |
_codebuddy.ai/session/rollback | C→A (request) | Public | Session rollback (acp-agent.ts:5812) |
_codebuddy.ai/session/rollbackFiles | C→A (request) | Public | File-level rollback |
_codebuddy.ai/session/previewFileRollback | C→A (request) | Public | Rollback preview |
_codebuddy.ai/file_history_snapshot | A→C (notify) | Public | File history snapshot (types.ts:29) |
_codebuddy.ai/fileTreeChanged | A→C (notify) | Public | File tree changed (must include filePath) |
_codebuddy.ai/authUrl | A→C (notify) | Public | Login redirect URL (types.ts:27) |
_codebuddy.ai/getUserInfo | C→A (request) | Public | Fetch user info (acp-agent.ts:5578) |
_codebuddy.ai/uiControl | A→C (request) | Public | UI control command (types.ts:35) |
_codebuddy.ai/system_init | A→C (notify) | Public | System initialization notification |
_codebuddy.ai/tool_input | A→C (request) | Public | Tool input inquiry (agent-provider/examples/question-example.ts:16) |
_codebuddy.ai/delegateTool | A→C (request) | Public | Tool proxy execution (delegate-tool-manager.ts:299) |
_codebuddy.ai/delegateToolsChanged | C→A (notify) | Public | Client delegatable tool set changed (acp-agent.ts:5580) |
_codebuddy.ai/refreshPlugins | C→A (request) | Public | Request plugin refresh (acp-agent.ts:5584) |
_codebuddy.ai/plugins_changed | A→C (notify) | Public | Plugin set changed |
_codebuddy.ai/mcp_servers_changed | A→C (notify) | Public | MCP server set changed |
_codebuddy.ai/models_changed | A→C (notify) | Public | Model list changed |
_codebuddy.ai/product_config_changed | A→C (notify) | Public | Product config changed |
_codebuddy.ai/identity_changed | A→C (notify) | Public | Identity change broadcast (broadcast to all live sessions after main process writes) |
_codebuddy.ai/queue_state_changed | A→C (notify) | Public | Queue state changed |
_codebuddy.ai/message_queue_snapshot_changed | A→C (notify) | Public | Message queue snapshot changed |
_codebuddy.ai/automation_snapshot | A→C (notify) | Public | Automation snapshot |
_codebuddy.ai/interaction_timeout | A→C (notify) | Public | Interaction timeout (cloud-agent-event-bridge.ts:10) |
_codebuddy.ai/teams | A→C (notify) | Public | Team SSE event (use-collab-queue.ts:5) |
_codebuddy.ai/conversation | A→C (notify) | Public | Conversation event (use-conversation-events.ts:50) |
_codebuddy.ai/mcpUiCallTool | C→A (request) | Public | MCP-UI reverse tools/call |
_codebuddy.ai/mcpUiReadResource | C→A (request) | Public | MCP-UI read resource |
_codebuddy.ai/mcpUiUpdateModelContext | C→A (request) | Public | MCP-UI update model context |
_codebuddy.ai/mcpUiRequestDisplayMode | C→A (request) | Public | MCP-UI request display mode |
_codebuddy.ai/mcpUiResourceTeardown | C→A (request) | Public | MCP-UI resource teardown |
_codebuddy.ai/respondToSandboxIntercept | C→A (request) | Public | Respond to sandbox intercept (codebuddy-code-backend.ts:1909) |
_codebuddy.ai/admitControl | C→A (request) | Private | Control Session admission. process-login composition root directly throws (process-login-acp-admission-service.ts:87-90), only used by workbuddy-host-sidecar |
_codebuddy.ai/runtimeCredentialUpdate | C→A (request) | Private | per-session exact credential update (acp-agent.ts:5595) |
_codebuddy.ai/runtimeControlCredentialUpdate | C→A (request) | Private | control binding credential update (acp-agent.ts:5597) |
_codebuddy.ai/runtimeOwnerCredentialUpdate | C→A (request) | Private | owner-level bulk credential update (acp-agent.ts:5599), corresponds to bulkApplyExactCredentialUpdates |
_codebuddy.ai/activateWorkbuddyOwnerRuntime | C→A (request) | Private | Added 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/activateCompletionRuntime | C→A (request) | Private | Activate 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/completionDispatch | C→A (request) | Private | Dispatch a completion (acp-agent.ts:5738) |
_codebuddy.ai/completionRuntimeDiagnostics | C→A (request) | Private | Completion runtime diagnostics (acp-agent.ts:5708) |
_codebuddy.ai/disposeEphemeralSession | C→A (request) | Private | Destroy ephemeral session (acp-agent.ts:5676) |
_codebuddy.ai/disposePersistentSession | C→A (request) | Private | Destroy 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/previewFileRollbacktwo sub-paths (they share the tokencodebuddy.ai/sessionwithsession/rollback; grep counts it only once).
5. Non-Key Hits (9 entries)
5.1 Namespace Prefixes / Wildcard Patterns (3 entries)
| Token | Occurrence Form | Description |
|---|---|---|
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/workflow | codebuddy.ai/workflow* in comments | Key space wildcard pattern (workflow-acp-bridge.ts:146), not an independent key |
codebuddy.ai/mcpUi | _codebuddy.ai/mcpUi* in comments | Wildcard 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:
| Token | Source |
|---|---|
codebuddy.ai/docs | keybinding-template.ts:18,52, mcp-approval-box.tsx:16 |
codebuddy.ai/schemas | keybinding-template.ts:17,51 |
codebuddy.ai/login | chat-ui/src/browser/login/login.tsx:149 |
codebuddy.ai/agents | agent-ui/src/utils/workbuddy-share-origin.spec.ts:312 |
codebuddy.ai/profile | use-error-banner.tsx:186 (.../profile/plan) |
codebuddy.ai/v2 | model-provider.spec.ts:454,520 (API baseURL) |
6. Rules for Third-Party ACP Clients
- Do not produce any
codebuddy.ai/*_metakey 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). - 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.
- 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. _codebuddy.ai/*extension methods: the 9 marked "Private" in §4 (admitControl+ threeruntime*CredentialUpdate- completion trio + dispose duo) only appear in WorkBuddy's internal channels; standard surface calls will be rejected.
7. Related Documentation
- ACP Protocol Integration —
--acpstartup, Zed configuration, protocol features - Zero
_metastanding 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