@canonmsg/agent-sdk 11.2.1 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +171 -536
  2. package/dist/chunks/chunk-6VK4UZHJ.js +2806 -0
  3. package/dist/chunks/chunk-FPQFTTND.js +4899 -0
  4. package/dist/chunks/chunk-OLJ7H4E2.js +14705 -0
  5. package/dist/chunks/mls-crypto-NZDNSPAO.js +10 -0
  6. package/dist/cli.js +198 -0
  7. package/dist/drivers/claude.d.ts +36 -0
  8. package/dist/drivers/code.d.ts +18 -0
  9. package/dist/drivers/codex.d.ts +37 -0
  10. package/dist/index.d.ts +12 -25
  11. package/dist/index.js +69 -13
  12. package/dist/internal/backend-contracts/agentBehaviorPolicy.d.ts +122 -0
  13. package/dist/internal/backend-contracts/agentDirectory.d.ts +32 -0
  14. package/dist/internal/backend-contracts/agentOrigin.d.ts +23 -0
  15. package/dist/internal/backend-contracts/agentSearch.d.ts +17 -0
  16. package/dist/internal/backend-contracts/api-origins.generated.d.ts +4 -0
  17. package/dist/internal/backend-contracts/apiErrors.d.ts +1 -0
  18. package/dist/internal/backend-contracts/artifactActions.d.ts +159 -0
  19. package/dist/internal/backend-contracts/artifacts.d.ts +386 -0
  20. package/dist/internal/backend-contracts/communication.d.ts +131 -0
  21. package/dist/internal/backend-contracts/conversationMembership.d.ts +28 -0
  22. package/dist/internal/backend-contracts/deliveryObservation.d.ts +23 -0
  23. package/dist/internal/backend-contracts/diffRedaction.d.ts +6 -0
  24. package/dist/internal/backend-contracts/endpoint-unread.d.ts +4 -0
  25. package/dist/internal/backend-contracts/endpoint.d.ts +103 -0
  26. package/dist/internal/backend-contracts/endpointContentPolicy.d.ts +37 -0
  27. package/dist/internal/backend-contracts/environment.d.ts +20 -0
  28. package/dist/internal/backend-contracts/externalInbound.d.ts +24 -0
  29. package/dist/internal/backend-contracts/firestoreValues.d.ts +9 -0
  30. package/dist/internal/backend-contracts/index.d.ts +48 -0
  31. package/dist/internal/backend-contracts/media-url.d.ts +6 -0
  32. package/dist/internal/backend-contracts/media.d.ts +51 -0
  33. package/dist/internal/backend-contracts/mediaDelivery.d.ts +46 -0
  34. package/dist/internal/backend-contracts/mediaTransferProtocol.d.ts +17 -0
  35. package/dist/internal/backend-contracts/membershipChange.d.ts +21 -0
  36. package/dist/internal/backend-contracts/message.d.ts +86 -0
  37. package/dist/internal/backend-contracts/messageText.d.ts +6 -0
  38. package/dist/internal/backend-contracts/mlsDevApplication.d.ts +73 -0
  39. package/dist/internal/backend-contracts/mlsDevCredential.d.ts +75 -0
  40. package/dist/internal/backend-contracts/mlsDevCredentialReconciliation.d.ts +45 -0
  41. package/dist/internal/backend-contracts/mlsDevDeviceCustody.d.ts +51 -0
  42. package/dist/internal/backend-contracts/mlsDevEnrollment.d.ts +74 -0
  43. package/dist/internal/backend-contracts/mlsDevGroup.d.ts +197 -0
  44. package/dist/internal/backend-contracts/mlsDevGroupFeed.d.ts +47 -0
  45. package/dist/internal/backend-contracts/mlsDevKeyPackage.d.ts +42 -0
  46. package/dist/internal/backend-contracts/mlsDevKeyPackages.d.ts +55 -0
  47. package/dist/internal/backend-contracts/moderation.d.ts +7 -0
  48. package/dist/internal/backend-contracts/plaintextProcessors.d.ts +63 -0
  49. package/dist/internal/backend-contracts/preparedContent.d.ts +54 -0
  50. package/dist/internal/backend-contracts/replyAuthority.d.ts +14 -0
  51. package/dist/internal/backend-contracts/runtimeCardFields.d.ts +66 -0
  52. package/dist/internal/backend-contracts/runtimeCardStorage.d.ts +3 -0
  53. package/dist/internal/backend-contracts/runtimeDescriptor.d.ts +88 -0
  54. package/dist/internal/backend-contracts/selfContext.d.ts +9 -0
  55. package/dist/internal/backend-contracts/turnProtocol.d.ts +43 -0
  56. package/dist/internal/backend-contracts/verbContract.d.ts +848 -0
  57. package/dist/internal/backend-contracts/verbSchemas.d.ts +1707 -0
  58. package/dist/internal/backend-contracts/verbWire.d.ts +493 -0
  59. package/dist/internal/backend-contracts/webAuth.d.ts +8 -0
  60. package/dist/internal/backend-contracts/workSessions.d.ts +205 -0
  61. package/dist/internal/core/agent-profiles.d.ts +69 -0
  62. package/dist/internal/core/agent-resolver.d.ts +49 -0
  63. package/dist/internal/core/agent-session.d.ts +12 -0
  64. package/dist/internal/core/approval-format.d.ts +26 -0
  65. package/dist/internal/core/approval-manager.d.ts +43 -0
  66. package/dist/internal/core/approval-types.d.ts +74 -0
  67. package/dist/internal/core/artifacts.d.ts +262 -0
  68. package/dist/internal/core/attached-native-session.d.ts +174 -0
  69. package/dist/internal/core/attached-session-file-store.d.ts +3 -0
  70. package/dist/internal/core/base-url.d.ts +1 -0
  71. package/dist/internal/core/cli-metadata.d.ts +13 -0
  72. package/dist/internal/core/client.d.ts +486 -0
  73. package/dist/internal/core/completed-output-journal.d.ts +39 -0
  74. package/dist/internal/core/constants.d.ts +4 -0
  75. package/dist/internal/core/control-poller.d.ts +221 -0
  76. package/dist/internal/core/endpoint-client.d.ts +43 -0
  77. package/dist/internal/core/exclusive-json-file-store.d.ts +7 -0
  78. package/dist/internal/core/execution-environment-mode.d.ts +8 -0
  79. package/dist/internal/core/execution-environment.d.ts +55 -0
  80. package/dist/internal/core/gifs.d.ts +35 -0
  81. package/dist/internal/core/group-context.d.ts +25 -0
  82. package/dist/internal/core/host-runtime.d.ts +257 -0
  83. package/dist/internal/core/inbound-frame.d.ts +64 -0
  84. package/dist/internal/core/index.d.ts +107 -0
  85. package/dist/internal/core/local-runtime-catalog.d.ts +131 -0
  86. package/dist/internal/core/message-format.d.ts +13 -0
  87. package/dist/internal/core/native-session-interaction.d.ts +44 -0
  88. package/dist/internal/core/node-media.d.ts +6 -0
  89. package/dist/internal/core/policy.d.ts +2 -0
  90. package/dist/internal/core/provenance.d.ts +31 -0
  91. package/dist/internal/core/registration-cli.d.ts +40 -0
  92. package/dist/internal/core/registration-profile.d.ts +10 -0
  93. package/dist/internal/core/registration-session.d.ts +55 -0
  94. package/dist/internal/core/registration.d.ts +21 -0
  95. package/dist/internal/core/retry.d.ts +122 -0
  96. package/dist/internal/core/rtdb-rest.d.ts +145 -0
  97. package/dist/internal/core/runtime-cards.d.ts +331 -0
  98. package/dist/internal/core/runtime-descriptor.d.ts +75 -0
  99. package/dist/internal/core/runtime-endpoints.d.ts +26 -0
  100. package/dist/internal/core/runtime-heartbeat.d.ts +29 -0
  101. package/dist/internal/core/runtime-presentation.d.ts +35 -0
  102. package/dist/internal/core/runtime-request-manager.d.ts +284 -0
  103. package/dist/internal/core/runtime-state-publisher.d.ts +42 -0
  104. package/dist/internal/core/self-context.d.ts +61 -0
  105. package/dist/internal/core/silent-turn.d.ts +86 -0
  106. package/dist/internal/core/stream.d.ts +77 -0
  107. package/dist/internal/core/turn-output-controller.d.ts +69 -0
  108. package/dist/internal/core/turn-protocol.d.ts +33 -0
  109. package/dist/internal/core/turn-verbosity.d.ts +97 -0
  110. package/dist/internal/core/types.d.ts +1075 -0
  111. package/dist/internal/core/typing-status-publisher.d.ts +14 -0
  112. package/dist/internal/core/unified-diff.d.ts +35 -0
  113. package/dist/internal/core/work-session-provider.d.ts +29 -0
  114. package/dist/internal/core/workspace-discovery.d.ts +17 -0
  115. package/dist/internal/endpoint/artifact-images.d.ts +60 -0
  116. package/dist/internal/endpoint/artifact-reducer.d.ts +35 -0
  117. package/dist/internal/endpoint/artifact-views.d.ts +113 -0
  118. package/dist/internal/endpoint/artifacts.d.ts +75 -0
  119. package/dist/internal/endpoint/delivery.d.ts +47 -0
  120. package/dist/internal/endpoint/engine.d.ts +219 -0
  121. package/dist/internal/endpoint/ephemeral.d.ts +8 -0
  122. package/dist/internal/endpoint/events.d.ts +32 -0
  123. package/dist/internal/endpoint/external-inbound.d.ts +36 -0
  124. package/dist/internal/endpoint/handoff.d.ts +50 -0
  125. package/dist/internal/endpoint/history.d.ts +22 -0
  126. package/dist/internal/endpoint/image-generation-errors.d.ts +2 -0
  127. package/dist/internal/endpoint/inbound.d.ts +29 -0
  128. package/dist/internal/endpoint/index.d.ts +32 -0
  129. package/dist/internal/endpoint/media.d.ts +172 -0
  130. package/dist/internal/endpoint/migration.d.ts +50 -0
  131. package/dist/internal/endpoint/mls-crypto.d.ts +25 -0
  132. package/dist/internal/endpoint/mls-dev-client.d.ts +44 -0
  133. package/dist/internal/endpoint/mls-dev-device.d.ts +67 -0
  134. package/dist/internal/endpoint/mls-dev-groups.d.ts +114 -0
  135. package/dist/internal/endpoint/mls-dev-key-package-service.d.ts +33 -0
  136. package/dist/internal/endpoint/mls-dev-key-packages.d.ts +42 -0
  137. package/dist/internal/endpoint/mls-dev-transport.d.ts +37 -0
  138. package/dist/internal/endpoint/node-mls-custody-protocol.d.ts +24 -0
  139. package/dist/internal/endpoint/node-mls-custody.d.ts +15 -0
  140. package/dist/internal/endpoint/node.d.ts +7 -0
  141. package/dist/internal/endpoint/observe-query.d.ts +17 -0
  142. package/dist/internal/endpoint/portable-node-mls-custody.d.ts +23 -0
  143. package/dist/internal/endpoint/queue.d.ts +22 -0
  144. package/dist/internal/endpoint/recovery.d.ts +27 -0
  145. package/dist/internal/endpoint/retention.d.ts +7 -0
  146. package/dist/internal/endpoint/store.d.ts +22 -0
  147. package/dist/internal/endpoint/sync.d.ts +33 -0
  148. package/dist/internal/endpoint/transient-publisher.d.ts +8 -0
  149. package/dist/internal/endpoint/transport.d.ts +58 -0
  150. package/dist/media.d.ts +1 -1
  151. package/dist/media.js +42 -541
  152. package/dist/runner/runner.d.ts +37 -0
  153. package/dist/runner/types.d.ts +168 -0
  154. package/package.json +18 -5
  155. package/dist/attached-session.d.ts +0 -58
  156. package/dist/attached-session.js +0 -638
  157. package/dist/bounded-file-read.d.ts +0 -14
  158. package/dist/bounded-file-read.js +0 -34
  159. package/dist/canon-agent.d.ts +0 -236
  160. package/dist/canon-agent.js +0 -2531
  161. package/dist/debouncer.d.ts +0 -18
  162. package/dist/debouncer.js +0 -133
  163. package/dist/inbound-handoff.d.ts +0 -6
  164. package/dist/inbound-handoff.js +0 -17
  165. package/dist/managed-session-host.d.ts +0 -27
  166. package/dist/managed-session-host.js +0 -195
  167. package/dist/managed-session-setup.d.ts +0 -99
  168. package/dist/managed-session-setup.js +0 -234
  169. package/dist/realtime.d.ts +0 -62
  170. package/dist/realtime.js +0 -193
  171. package/dist/runtime-card.d.ts +0 -48
  172. package/dist/runtime-card.js +0 -64
  173. package/dist/session-manager.d.ts +0 -77
  174. package/dist/session-manager.js +0 -285
  175. package/dist/turn-streaming-request.d.ts +0 -17
  176. package/dist/turn-streaming-request.js +0 -22
  177. package/dist/turn-verbosity-option.d.ts +0 -33
  178. package/dist/turn-verbosity-option.js +0 -23
  179. package/dist/types.d.ts +0 -387
  180. package/dist/types.js +0 -1
  181. package/dist/work-session-coordination.d.ts +0 -21
  182. package/dist/work-session-coordination.js +0 -53
  183. package/dist/work-session-host.d.ts +0 -31
  184. package/dist/work-session-host.js +0 -617
  185. package/dist/work-session-interactions.d.ts +0 -12
  186. package/dist/work-session-interactions.js +0 -173
  187. package/dist/work-session-state.d.ts +0 -36
  188. package/dist/work-session-state.js +0 -62
@@ -0,0 +1,122 @@
1
+ import type { SendMessageOptions } from './types.js';
2
+ import { type CanonClient } from './client.js';
3
+ export interface SendMessageRetryOptions {
4
+ /** Stable replacement recorded by the product after a conclusive rejection. */
5
+ operationId?: string;
6
+ replacesOperationId?: string;
7
+ signal?: AbortSignal;
8
+ timeoutMs?: number;
9
+ maxAttempts?: number;
10
+ baseDelayMs?: number;
11
+ maxDelayMs?: number;
12
+ sleep?: (ms: number) => Promise<void>;
13
+ }
14
+ export declare const CANON_MESSAGE_TEXT_MAX_BYTES: number;
15
+ export declare const DEFAULT_CHUNKED_MESSAGE_TEXT_MAX_BYTES = 3800;
16
+ export interface SendMessageChunkingOptions {
17
+ maxTextBytes?: number;
18
+ /**
19
+ * Opt in to resumable chunked delivery.
20
+ *
21
+ * With it on, a mid-sequence failure throws a `ChunkedSendMessageError`
22
+ * carrying the ids of the parts that ARE durable, so a later attempt can pick
23
+ * up the tail. Off by default so callers that do not resume keep today's
24
+ * behaviour: the raw send error, unwrapped.
25
+ *
26
+ * Implied by a non-empty `deliveredMessageIds` — passing progress back IS
27
+ * opting in.
28
+ */
29
+ resumable?: boolean;
30
+ /**
31
+ * Ids of the parts an earlier attempt already made durable, in part order.
32
+ * Those parts are skipped and their ids are carried into the result, so a
33
+ * resumed send still reports the whole answer.
34
+ */
35
+ deliveredMessageIds?: readonly string[];
36
+ }
37
+ export interface ChunkedSendMessageResult {
38
+ messageIds: string[];
39
+ }
40
+ /**
41
+ * The server's message-id idempotency guard rejecting a send.
42
+ *
43
+ * A byte-identical replay of a message succeeds (`created: false`), so a 409
44
+ * `MESSAGE_ID_EXISTS` means a message already exists under this id whose stored
45
+ * content diverges from what is being sent now. Either way the id is TAKEN:
46
+ * that message is durable in Canon and re-sending it is impossible.
47
+ */
48
+ export declare function isCanonMessageIdConflict(error: unknown): boolean;
49
+ /** Pending delivery is visible, but cannot truthfully produce a failure notice. */
50
+ export declare function isPendingCanonOperation(error: unknown): boolean;
51
+ /**
52
+ * A chunked send that stopped part-way, with the progress needed to resume it.
53
+ *
54
+ * Parts 1..`deliveredMessageIds.length` are durable in Canon; only the tail is
55
+ * missing. Handing `deliveredMessageIds` back to `sendMessageWithRetryChunked`
56
+ * restarts at the next part instead of re-sending the answer's head — which the
57
+ * server would reject or duplicate, and which the reader has already seen.
58
+ */
59
+ export declare class ChunkedSendMessageError extends Error {
60
+ /** Ids of the parts that are durable in Canon, in part order. */
61
+ readonly deliveredMessageIds: string[];
62
+ /** The part the send stopped on (1-based). */
63
+ readonly failedPart: number;
64
+ /** How many parts the text splits into in total. */
65
+ readonly totalParts: number;
66
+ /** The underlying send failure — what callers should classify. */
67
+ readonly cause: unknown;
68
+ constructor(input: {
69
+ cause: unknown;
70
+ deliveredMessageIds: readonly string[];
71
+ failedPart: number;
72
+ totalParts: number;
73
+ });
74
+ /** How many parts are durable — a resume starts at the next one. */
75
+ get deliveredParts(): number;
76
+ }
77
+ /**
78
+ * Structural check as well as `instanceof`, so progress survives a caller that
79
+ * ended up with a second copy of this module (a workspace package resolved to
80
+ * both `dist` and source, say) instead of silently degrading to "no progress".
81
+ */
82
+ export declare function isChunkedSendMessageError(error: unknown): error is ChunkedSendMessageError;
83
+ export declare function isRetryableCanonDeliveryError(error: unknown): boolean;
84
+ export declare function sendMessageWithRetry(client: CanonClient, conversationId: string, text: string, options?: SendMessageOptions, retryOptions?: SendMessageRetryOptions): Promise<{
85
+ messageId: string;
86
+ }>;
87
+ export declare function utf8ByteLength(value: string): number;
88
+ export declare function splitTextByUtf8Bytes(text: string, maxBytes?: number): string[];
89
+ export declare function chunkMessageId(baseMessageId: string | undefined, index: number): string | undefined;
90
+ export interface ChunkedMessagePartMetadataInput {
91
+ /** Stable group id shared by every part, normally the unsuffixed message id. */
92
+ groupId?: string;
93
+ metadata?: Record<string, unknown>;
94
+ index: number;
95
+ count: number;
96
+ }
97
+ /**
98
+ * Build metadata for one visible part of a logically single message.
99
+ *
100
+ * Earlier parts are progress-only and cannot trigger replies or notifications.
101
+ * The last part preserves the caller's terminal semantics while removing
102
+ * streamed text from the trail, because that text is already visible in the
103
+ * preceding message parts.
104
+ */
105
+ export declare function buildChunkedMessagePartMetadata(input: ChunkedMessagePartMetadataInput): Record<string, unknown>;
106
+ /**
107
+ * Send `text` as one message, or as an ordered sequence of `-part-N` messages
108
+ * when it exceeds the byte budget.
109
+ *
110
+ * Sequential by construction, so a failure leaves parts 1..k durable and the
111
+ * tail unsent. Callers that opt into `resumable` get that progress back (see
112
+ * `ChunkedSendMessageError`) and can hand it to a later attempt, which then
113
+ * picks up at part k+1. The split is a pure function of the text and the byte
114
+ * budget, so part N of a resumed attempt is byte-identical to part N of the
115
+ * attempt that delivered it — which is what makes the `-part-N` ids a safe
116
+ * resume cursor.
117
+ *
118
+ * A byte-identical replay succeeds at the server. Any idempotency conflict
119
+ * therefore means the stored part differs and is always reported; treating it
120
+ * as delivered would stitch two different answers together.
121
+ */
122
+ export declare function sendMessageWithRetryChunked(client: CanonClient, conversationId: string, text: string, options?: SendMessageOptions, retryOptions?: SendMessageRetryOptions, chunkingOptions?: SendMessageChunkingOptions): Promise<ChunkedSendMessageResult>;
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Compatibility-shaped runtime state handle backed exclusively by the shared
3
+ * endpoint. Paths are parsed locally into fixed typed projections; no database
4
+ * path or Firebase credential is sent to the server.
5
+ */
6
+ import type { CanonClient } from './client.js';
7
+ import type { DeliveryIntent, RuntimeCapabilities, TurnLifecycleState } from './turn-protocol.js';
8
+ import type { CanonControlValue, CanonRuntimeActivityItem, ModelOption, RuntimeControlError, RuntimeControlState, RuntimeInfoPayload } from './types.js';
9
+ export interface SessionStatePayload {
10
+ lastError?: string;
11
+ hostMode?: boolean;
12
+ clientType?: string;
13
+ isActive: boolean;
14
+ /** Runtimes that cannot report a context window (e.g. Codex) publish totalTokens only. */
15
+ contextUsage?: {
16
+ percentage?: number;
17
+ totalTokens: number;
18
+ maxTokens?: number;
19
+ };
20
+ updatedAt: {
21
+ '.sv': 'timestamp';
22
+ };
23
+ }
24
+ export interface TurnStatePayload {
25
+ turnId?: string | null;
26
+ state: TurnLifecycleState;
27
+ queueDepth: number;
28
+ currentSpeakerId?: string | null;
29
+ lastAcceptedIntent?: DeliveryIntent | null;
30
+ activeMessageIds?: string[];
31
+ capabilities?: RuntimeCapabilities;
32
+ openedAt?: number | {
33
+ '.sv': 'timestamp';
34
+ };
35
+ turnUpdatedAt?: number | {
36
+ '.sv': 'timestamp';
37
+ } | null;
38
+ completedAt?: number | {
39
+ '.sv': 'timestamp';
40
+ } | null;
41
+ updatedAt: {
42
+ '.sv': 'timestamp';
43
+ };
44
+ }
45
+ export interface AgentSessionSnapshotPatch {
46
+ clientType?: string;
47
+ hostMode?: boolean;
48
+ model?: string | null;
49
+ modelOptions?: ModelOption[] | null;
50
+ permissionMode?: string | null;
51
+ permissionModeOptions?: Array<{
52
+ value: string;
53
+ label: string;
54
+ }> | null;
55
+ effort?: string | null;
56
+ runtimeControlValues?: Record<string, CanonControlValue> | null;
57
+ controlState?: Record<string, RuntimeControlState> | null;
58
+ runtimeControlErrors?: Record<string, RuntimeControlError> | null;
59
+ workspaceId?: string | null;
60
+ workspaceOptions?: Array<{
61
+ id: string;
62
+ label: string;
63
+ }> | null;
64
+ executionMode?: 'worktree' | 'locked' | null;
65
+ availableExecutionModes?: Array<'worktree' | 'locked'> | null;
66
+ executionBranch?: string | null;
67
+ resolvedCwd?: string | null;
68
+ worktreePath?: string | null;
69
+ executionFallbackReason?: string | null;
70
+ state?: null;
71
+ turnState?: TurnLifecycleState | null;
72
+ turnId?: string | null;
73
+ turnOpenedAt?: number | {
74
+ '.sv': 'timestamp';
75
+ } | null;
76
+ turnUpdatedAt?: number | {
77
+ '.sv': 'timestamp';
78
+ } | null;
79
+ supportsQueue?: boolean | null;
80
+ supportsInputInterrupt?: boolean | null;
81
+ queueDepth?: number;
82
+ waitingForInput?: boolean;
83
+ contextUsage?: {
84
+ percentage?: number;
85
+ totalTokens: number;
86
+ maxTokens?: number;
87
+ } | null;
88
+ lastError?: string | null;
89
+ configurationStatus?: 'ready' | 'configuration_required' | null;
90
+ lastHeartbeatAt?: number | {
91
+ '.sv': 'timestamp';
92
+ };
93
+ updatedAt?: {
94
+ '.sv': 'timestamp';
95
+ };
96
+ }
97
+ /**
98
+ * Canon stores only operational conversation state. Runtime configuration is
99
+ * owned by the adapter and its local session factory, even when an older host
100
+ * still supplies those fields to this compatibility-shaped API.
101
+ */
102
+ export declare function sanitizeAgentSessionSnapshotPatch(snapshot: Omit<AgentSessionSnapshotPatch, 'updatedAt'>): Omit<AgentSessionSnapshotPatch, 'updatedAt'>;
103
+ export interface RuntimeInfoPayloadData extends Omit<RuntimeInfoPayload, 'updatedAt'> {
104
+ updatedAt: {
105
+ '.sv': 'timestamp';
106
+ };
107
+ }
108
+ export interface RuntimeActivityPayloadData extends Omit<CanonRuntimeActivityItem, 'updatedAt'> {
109
+ updatedAt: number | {
110
+ '.sv': 'timestamp';
111
+ };
112
+ }
113
+ /** Retained only for callers upgrading from the old RTDB helper. */
114
+ interface RTDBAuthOptions {
115
+ rtdbUrl?: string;
116
+ firebaseApiKey?: string;
117
+ }
118
+ export interface RTDBClientHandle {
119
+ observeControls?(changed: (conversationId?: string) => void, connected: (value: boolean) => void): () => void;
120
+ /** Consume only the exact value returned by this handle before dispatch. */
121
+ consume(path: string, observed: unknown): Promise<void>;
122
+ observedRevision(path: string, observed: unknown): string | undefined;
123
+ read(path: string): Promise<unknown>;
124
+ write(path: string, data: unknown): Promise<void>;
125
+ patch(path: string, data: unknown): Promise<void>;
126
+ remove(path: string): Promise<void>;
127
+ writeSessionState(conversationId: string, agentId: string, state: Omit<SessionStatePayload, 'updatedAt'>): Promise<void>;
128
+ clearSessionState(conversationId: string, agentId: string): Promise<void>;
129
+ writeTurnState(conversationId: string, agentId: string, state: Omit<TurnStatePayload, 'updatedAt'>): Promise<void>;
130
+ clearTurnState(conversationId: string, agentId: string): Promise<void>;
131
+ patchAgentSessionSnapshot(conversationId: string, agentId: string, snapshot: Omit<AgentSessionSnapshotPatch, 'updatedAt'>): Promise<void>;
132
+ writeRuntimeInfo(conversationId: string, agentId: string, payload: Omit<RuntimeInfoPayload, 'updatedAt'>): Promise<void>;
133
+ patchRuntimeInfo(conversationId: string, agentId: string, payload: Partial<Omit<RuntimeInfoPayload, 'updatedAt'>>): Promise<void>;
134
+ clearRuntimeInfo(conversationId: string, agentId: string): Promise<void>;
135
+ readRuntimeActivity(conversationId: string, agentId: string): Promise<Record<string, CanonRuntimeActivityItem>>;
136
+ writeRuntimeActivity(conversationId: string, agentId: string, item: CanonRuntimeActivityItem): Promise<void>;
137
+ removeRuntimeActivityItem(conversationId: string, agentId: string, itemId: string): Promise<void>;
138
+ clearRuntimeActivity(conversationId: string, agentId: string): Promise<void>;
139
+ }
140
+ /**
141
+ * Existing adapters keep this scoped handle while all runtime traffic uses
142
+ * their CanonClient endpoint. Legacy Firebase options have no effect.
143
+ */
144
+ export declare function initRTDBAuth(client: CanonClient, _options?: RTDBAuthOptions): RTDBClientHandle;
145
+ export {};
@@ -0,0 +1,331 @@
1
+ import { RUNTIME_CARD_FIELD_TYPES, RUNTIME_CARD_LIMITS, RUNTIME_CARD_LINE_ITEM_COLUMN_TYPES, validateRuntimeCardFieldValues, type RuntimeCardField, type RuntimeCardFieldChoice, type RuntimeCardFieldType, type RuntimeCardLineItemColumn, type RuntimeCardLineItemColumnType, type VerbNativeMetadata } from '../backend-contracts/index.js';
2
+ export { RUNTIME_CARD_FIELD_TYPES, RUNTIME_CARD_LIMITS, RUNTIME_CARD_LINE_ITEM_COLUMN_TYPES, validateRuntimeCardFieldValues, };
3
+ export type { RuntimeCardField, RuntimeCardFieldChoice, RuntimeCardFieldType, RuntimeCardLineItemColumn, RuntimeCardLineItemColumnType, };
4
+ export interface PlanApprovalMetadata {
5
+ type: 'plan_approval';
6
+ planId: string;
7
+ /** Canon user who should answer this card. UI hint only; reply APIs still enforce authorization. */
8
+ responseUserId?: string;
9
+ title?: string;
10
+ summary?: string;
11
+ body?: string;
12
+ allowedPrompts?: ReadonlyArray<{
13
+ tool: string;
14
+ prompt: string;
15
+ }>;
16
+ }
17
+ /**
18
+ * Plan approval decision.
19
+ * - `approve`: proceed with the plan.
20
+ * - `revise`: request changes (carries free-text `feedback`).
21
+ * - `reject`: decline / keep planning — the Mac-app "No, keep planning" path,
22
+ * distinct from a feedback-bearing revision.
23
+ */
24
+ export type PlanApprovalDecision = 'approve' | 'revise' | 'reject';
25
+ export interface PlanApprovalReplyMetadata {
26
+ type: 'plan_approval_reply';
27
+ planId: string;
28
+ decision: PlanApprovalDecision;
29
+ feedback?: string;
30
+ /**
31
+ * When the plan card showed `allowedPrompts`, the subset the user granted on
32
+ * approval. The host pre-approves these as session rules. Absent = grant all
33
+ * (legacy/full-approve behavior).
34
+ */
35
+ grantedPrompts?: ReadonlyArray<{
36
+ tool: string;
37
+ prompt: string;
38
+ }>;
39
+ }
40
+ export type RuntimeInputKind = 'clarify' | 'sudo' | 'secret';
41
+ export type RuntimeInputReplyStatus = 'submitted' | 'cancelled';
42
+ export type RuntimeInputResolutionStatus = RuntimeInputReplyStatus | 'timeout';
43
+ export interface RuntimeInputChoice {
44
+ label: string;
45
+ value?: string;
46
+ description?: string;
47
+ /**
48
+ * Optional preview content rendered when this option is focused/expanded —
49
+ * mockups, code snippets, or comparisons. Matches the Mac-app
50
+ * AskUserQuestion option preview.
51
+ */
52
+ preview?: string;
53
+ }
54
+ export interface RuntimeInputQuestion {
55
+ id: string;
56
+ question: string;
57
+ header?: string;
58
+ choices?: RuntimeInputChoice[];
59
+ allowOther?: boolean;
60
+ isSecret?: boolean;
61
+ multiSelect?: boolean;
62
+ }
63
+ export type RuntimeInputAnswers = Record<string, {
64
+ answers: string[];
65
+ }>;
66
+ export type RuntimeInputNativeMetadata = Pick<VerbNativeMetadata, 'runtime' | 'method' | 'requestId' | 'sessionKey' | 'turnId' | 'handles'>;
67
+ export interface RuntimeInputRequestMetadata {
68
+ type: 'runtime_input_request';
69
+ inputId: string;
70
+ /** Canon user who should answer this card. UI hint only; reply APIs still enforce authorization. */
71
+ responseUserId?: string;
72
+ kind: RuntimeInputKind;
73
+ prompt: string;
74
+ title?: string;
75
+ choices?: RuntimeInputChoice[];
76
+ questions?: RuntimeInputQuestion[];
77
+ secretName?: string;
78
+ native?: RuntimeInputNativeMetadata;
79
+ expiresAt: string;
80
+ sensitive?: boolean;
81
+ }
82
+ export interface RuntimeInputReplyMetadata {
83
+ type: 'runtime_input_reply';
84
+ inputId: string;
85
+ kind?: RuntimeInputKind;
86
+ status: RuntimeInputReplyStatus;
87
+ answerSummary?: string;
88
+ answersSummary?: string;
89
+ sensitive?: boolean;
90
+ }
91
+ export interface RuntimeInputOutcomeMetadata {
92
+ type: 'runtime_input_outcome';
93
+ inputId: string;
94
+ kind?: RuntimeInputKind;
95
+ status: RuntimeInputResolutionStatus;
96
+ reason?: 'submitted' | 'cancelled' | 'timeout' | 'expired' | 'interrupted';
97
+ }
98
+ export declare const RUNTIME_CARD_SCHEMA_V1: "canon.card.v1";
99
+ export declare const RUNTIME_CARD_PUBLIC_REQUEST_TEXT: "Action requested";
100
+ export type RuntimeCardSchemaV1 = typeof RUNTIME_CARD_SCHEMA_V1;
101
+ export type RuntimeCardBlockKind = 'summary' | 'metricGrid' | 'chart' | 'table' | 'list' | 'callout' | 'actions' | 'mediaPreview' | 'details';
102
+ export type RuntimeCardTone = 'neutral' | 'primary' | 'positive' | 'warning' | 'negative' | 'danger' | 'critical' | 'welcome';
103
+ export type RuntimeCardReplyStatus = 'submitted' | 'cancelled';
104
+ export type RuntimeCardResolutionStatus = RuntimeCardReplyStatus | 'timeout';
105
+ export interface RuntimeCardSummaryBlock {
106
+ kind: 'summary';
107
+ title?: string;
108
+ text: string;
109
+ }
110
+ export interface RuntimeCardMetric {
111
+ label: string;
112
+ value: string;
113
+ delta?: string;
114
+ tone?: RuntimeCardTone;
115
+ }
116
+ export interface RuntimeCardMetricGridBlock {
117
+ kind: 'metricGrid';
118
+ title?: string;
119
+ metrics: RuntimeCardMetric[];
120
+ }
121
+ export interface RuntimeCardChartPoint {
122
+ x: string;
123
+ y: number;
124
+ }
125
+ export interface RuntimeCardChartSeries {
126
+ name?: string;
127
+ points: RuntimeCardChartPoint[];
128
+ }
129
+ export interface RuntimeCardChartBlock {
130
+ kind: 'chart';
131
+ chart: 'line' | 'bar';
132
+ title?: string;
133
+ yLabel?: string;
134
+ series: RuntimeCardChartSeries[];
135
+ }
136
+ export interface RuntimeCardTableBlock {
137
+ kind: 'table';
138
+ title?: string;
139
+ columns: string[];
140
+ rows: string[][];
141
+ }
142
+ export interface RuntimeCardListItem {
143
+ label: string;
144
+ detail?: string;
145
+ status?: 'pending' | 'done' | 'blocked' | 'warning';
146
+ }
147
+ export interface RuntimeCardListBlock {
148
+ kind: 'list';
149
+ title?: string;
150
+ items: RuntimeCardListItem[];
151
+ }
152
+ export interface RuntimeCardCalloutBlock {
153
+ kind: 'callout';
154
+ title?: string;
155
+ text: string;
156
+ tone?: RuntimeCardTone;
157
+ }
158
+ export type RuntimeCardMediaKind = 'image' | 'file';
159
+ export interface RuntimeCardMediaPreviewMedia {
160
+ /** 'file' covers application/pdf and other documents. */
161
+ kind: RuntimeCardMediaKind;
162
+ /** REQUIRED. Canon Storage URL only (server enforces). */
163
+ url: string;
164
+ /** Resumable-upload identity for the primary media, when applicable. */
165
+ uploadId?: string;
166
+ /** REQUIRED. Allowlist enforced server-side: image/*, application/pdf. */
167
+ mimeType: string;
168
+ fileName?: string;
169
+ sizeBytes?: number;
170
+ /** Canon Storage URL; inline preview for non-image media (e.g. pdf page render). */
171
+ thumbnailUrl?: string;
172
+ /** Resumable-upload identity for thumbnailUrl, when it is a separate upload. */
173
+ thumbnailUploadId?: string;
174
+ /** 1-based page the thumbnail shows. */
175
+ page?: number;
176
+ pageCount?: number;
177
+ }
178
+ export interface RuntimeCardMediaPreviewBlock {
179
+ kind: 'mediaPreview';
180
+ title?: string;
181
+ media: RuntimeCardMediaPreviewMedia;
182
+ /** Recommended — old clients render this; should contain the open-link text. */
183
+ fallbackText?: string;
184
+ }
185
+ export interface RuntimeCardDetailsRow {
186
+ label: string;
187
+ value: string;
188
+ tone?: RuntimeCardTone;
189
+ /** 0..1 inclusive. */
190
+ confidence?: number;
191
+ hint?: string;
192
+ }
193
+ export interface RuntimeCardDetailsBlock {
194
+ kind: 'details';
195
+ title?: string;
196
+ rows: RuntimeCardDetailsRow[];
197
+ }
198
+ /**
199
+ * Block preserved when a renderer/normalizer does not recognize `kind`. Forward
200
+ * compatibility: unknown blocks are kept (not dropped) so renderers can degrade
201
+ * to `fallbackText` instead of silently losing content.
202
+ */
203
+ export interface RuntimeCardUnknownBlock {
204
+ kind: string;
205
+ fallbackText?: string;
206
+ }
207
+ export interface RuntimeCardAction {
208
+ id: string;
209
+ label: string;
210
+ tone?: RuntimeCardTone;
211
+ fields?: RuntimeCardField[];
212
+ }
213
+ export interface RuntimeCardActionsBlock {
214
+ kind: 'actions';
215
+ title?: string;
216
+ actions: RuntimeCardAction[];
217
+ }
218
+ export type RuntimeCardBlock = RuntimeCardSummaryBlock | RuntimeCardMetricGridBlock | RuntimeCardChartBlock | RuntimeCardTableBlock | RuntimeCardListBlock | RuntimeCardCalloutBlock | RuntimeCardActionsBlock | RuntimeCardMediaPreviewBlock | RuntimeCardDetailsBlock | RuntimeCardUnknownBlock;
219
+ export interface RuntimeCardV1 {
220
+ schema: RuntimeCardSchemaV1;
221
+ cardId?: string;
222
+ template?: string;
223
+ tone?: RuntimeCardTone;
224
+ title: string;
225
+ fallbackText: string;
226
+ blocks: RuntimeCardBlock[];
227
+ }
228
+ export interface RuntimeCardPreview {
229
+ title?: string;
230
+ tone?: RuntimeCardTone;
231
+ template?: string;
232
+ blockKinds: RuntimeCardBlockKind[];
233
+ }
234
+ export type RuntimeCardNativeMetadata = RuntimeInputNativeMetadata;
235
+ export interface RuntimeCardRequestMetadata {
236
+ type: 'runtime_card_request';
237
+ cardId: string;
238
+ cardKind: string;
239
+ schemaVersion: RuntimeCardSchemaV1;
240
+ fallbackText: string;
241
+ responseUserId?: string;
242
+ expiresAt: string;
243
+ runtimeId?: string;
244
+ turnId?: string;
245
+ native?: RuntimeCardNativeMetadata;
246
+ /** True when the card carries an actions block (the agent waits for a
247
+ * response); false/absent for display/report cards shown to all members. */
248
+ interactive?: boolean;
249
+ cardPreview: RuntimeCardPreview;
250
+ turnSemantics: 'control';
251
+ replyBehavior: 'suppress_auto_reply';
252
+ }
253
+ export interface RuntimeCardReplyMetadata {
254
+ type: 'runtime_card_reply';
255
+ cardId: string;
256
+ status: RuntimeCardReplyStatus;
257
+ actionId?: string;
258
+ answerSummary?: string;
259
+ sensitive?: boolean;
260
+ turnSemantics: 'control';
261
+ replyBehavior: 'suppress_auto_reply';
262
+ }
263
+ export interface RuntimeCardOutcomeMetadata {
264
+ type: 'runtime_card_outcome';
265
+ cardId: string;
266
+ status: RuntimeCardResolutionStatus;
267
+ reason?: 'submitted' | 'cancelled' | 'timeout' | 'expired' | 'interrupted';
268
+ turnSemantics: 'control';
269
+ replyBehavior: 'suppress_auto_reply';
270
+ }
271
+ /**
272
+ * Mac-app parity: a choice-bearing question always offers a free-text "Other"
273
+ * escape hatch unless the producing agent explicitly opts out. Shared by every
274
+ * runtime's question mapper so the fallback is consistent across agents.
275
+ */
276
+ export declare function resolveQuestionAllowOther(hasChoices: boolean, explicit?: unknown): boolean;
277
+ /** Block kinds this version of core knows how to fully normalize/render. */
278
+ export type RuntimeCardKnownBlockKind = 'summary' | 'metricGrid' | 'chart' | 'table' | 'list' | 'callout' | 'actions' | 'mediaPreview' | 'details';
279
+ export declare function parseRuntimeCardV1(value: unknown): RuntimeCardV1 | null;
280
+ export declare function buildRuntimeCardPreview(card: RuntimeCardV1): RuntimeCardPreview;
281
+ export declare function buildRuntimeInputRequest(inputId: string, input: Omit<RuntimeInputRequestMetadata, 'type' | 'inputId'>): {
282
+ text: string;
283
+ metadata: RuntimeInputRequestMetadata;
284
+ };
285
+ export declare function buildRuntimeInputReply(inputId: string, status: RuntimeInputReplyStatus, details?: {
286
+ kind?: RuntimeInputKind;
287
+ answerSummary?: string;
288
+ answersSummary?: string;
289
+ sensitive?: boolean;
290
+ }): {
291
+ text: string;
292
+ metadata: RuntimeInputReplyMetadata;
293
+ };
294
+ export declare function buildRuntimeInputOutcome(inputId: string, status: RuntimeInputResolutionStatus, details?: {
295
+ kind?: RuntimeInputKind;
296
+ reason?: RuntimeInputOutcomeMetadata['reason'];
297
+ }): {
298
+ text: string;
299
+ metadata: RuntimeInputOutcomeMetadata;
300
+ };
301
+ export declare function buildRuntimeCardRequest(card: RuntimeCardV1, input: {
302
+ cardId?: string;
303
+ responseUserId?: string;
304
+ expiresAt: string | number | Date;
305
+ runtimeId?: string;
306
+ turnId?: string;
307
+ native?: RuntimeCardNativeMetadata;
308
+ }): {
309
+ text: string;
310
+ metadata: RuntimeCardRequestMetadata;
311
+ };
312
+ export declare function buildRuntimeCardReply(cardId: string, status: RuntimeCardReplyStatus, details?: {
313
+ actionId?: string;
314
+ answerSummary?: string;
315
+ sensitive?: boolean;
316
+ }): {
317
+ text: string;
318
+ metadata: RuntimeCardReplyMetadata;
319
+ };
320
+ export declare function buildRuntimeCardOutcome(cardId: string, status: RuntimeCardResolutionStatus, details?: {
321
+ reason?: RuntimeCardOutcomeMetadata['reason'];
322
+ }): {
323
+ text: string;
324
+ metadata: RuntimeCardOutcomeMetadata;
325
+ };
326
+ export declare function parseRuntimeInputRequestMetadata(value: unknown): RuntimeInputRequestMetadata | null;
327
+ export declare function parseRuntimeCardRequestMetadata(value: unknown): RuntimeCardRequestMetadata | null;
328
+ export declare function parseRuntimeCardReplyMetadata(value: unknown): RuntimeCardReplyMetadata | null;
329
+ export declare function parseRuntimeCardOutcomeMetadata(value: unknown): RuntimeCardOutcomeMetadata | null;
330
+ export declare function parseRuntimeInputReplyMetadata(value: unknown): RuntimeInputReplyMetadata | null;
331
+ export declare function parseRuntimeInputOutcomeMetadata(value: unknown): RuntimeInputOutcomeMetadata | null;
@@ -0,0 +1,75 @@
1
+ export { normalizeRuntimeCommandAlias, normalizeRuntimeCommandAliases } from '../backend-contracts/index.js';
2
+ import type { ExecutionEnvironmentMode } from './execution-environment-mode.js';
3
+ import { type AgentCapabilities, type AgentClientType, type CanonControlDescriptor, type CanonControlLiveBehavior, type CanonRuntimeCommandDescriptor, type CanonRuntimeDescriptor, type CanonRuntimeStreamingMode, type CanonRuntimeTurnModeDescriptor, type CanonWorkspaceRootMetadata, type ModelOption, type PermissionModeOption, type WorkspaceOption } from './types.js';
4
+ import type { CanonRuntimePresentationPolicy } from './types.js';
5
+ import type { HostAdmissionActionCapabilities } from './turn-protocol.js';
6
+ export interface NormalizeRuntimeCommandDescriptorsOptions {
7
+ reservedAliases?: Iterable<string>;
8
+ maxCommands?: number;
9
+ }
10
+ export declare function normalizeRuntimeCommandDescriptors(commands: ReadonlyArray<CanonRuntimeCommandDescriptor>, options?: NormalizeRuntimeCommandDescriptorsOptions): CanonRuntimeCommandDescriptor[];
11
+ /**
12
+ * Default reasoning/thinking-level options. This is plain data, not Claude
13
+ * logic — any coding agent can reuse it or supply its own option set. Each
14
+ * agent passes its native effort levels into the shared descriptor builder.
15
+ */
16
+ export declare const EFFORT_OPTIONS: readonly [{
17
+ readonly value: "low";
18
+ readonly label: "Low";
19
+ }, {
20
+ readonly value: "medium";
21
+ readonly label: "Medium";
22
+ }, {
23
+ readonly value: "high";
24
+ readonly label: "High";
25
+ }, {
26
+ readonly value: "xhigh";
27
+ readonly label: "Extra high";
28
+ }, {
29
+ readonly value: "max";
30
+ readonly label: "Max";
31
+ }];
32
+ export declare const EXECUTION_MODE_CONTROL_OPTIONS: ReadonlyArray<{
33
+ value: ExecutionEnvironmentMode;
34
+ label: string;
35
+ description: string;
36
+ }>;
37
+ export declare function buildRuntimeWorkspaceControlOptions(workspaces: ReadonlyArray<WorkspaceOption>): ModelOption[];
38
+ export declare const RUNTIME_STOP_ACTION: CanonRuntimeCommandDescriptor;
39
+ export declare const RUNTIME_STOP_AND_DROP_ACTION: CanonRuntimeCommandDescriptor;
40
+ export declare const RUNTIME_NEW_SESSION_ACTION: CanonRuntimeCommandDescriptor;
41
+ export declare function buildFirstPartyCodingRuntimeDescriptor(input: {
42
+ /**
43
+ * Any agent client type may use this builder. Per-agent differences are
44
+ * driven by the {@link AGENT_CAPABILITIES} table and the option/behavior
45
+ * fields below — not by hard-coded clientType branches — so adding a coding
46
+ * agent is a capability-table entry plus its own option lists.
47
+ */
48
+ clientType: AgentClientType;
49
+ models: ReadonlyArray<ModelOption>;
50
+ workspaces: ReadonlyArray<WorkspaceOption>;
51
+ workspaceRoots?: ReadonlyArray<CanonWorkspaceRootMetadata>;
52
+ executionModes: ReadonlyArray<ExecutionEnvironmentMode>;
53
+ /** Deployer-owned local default used when a conversation has no override. */
54
+ defaultExecutionMode?: ExecutionEnvironmentMode;
55
+ permissionModes?: ReadonlyArray<PermissionModeOption>;
56
+ defaultPermissionMode?: string | null;
57
+ /** Permission-mode control label override (e.g. Codex uses "Execution policy"). */
58
+ permissionModeLabel?: string;
59
+ /** Effort/thinking-level options. When provided, an effort control is emitted. */
60
+ effortOptions?: ReadonlyArray<ModelOption>;
61
+ defaultEffort?: string | null;
62
+ effortLiveBehavior?: CanonControlLiveBehavior;
63
+ /** Model control live behavior. Defaults to immediate; Codex applies next turn. */
64
+ modelLiveBehavior?: 'immediate' | 'next_turn';
65
+ /** Capability overrides; defaults to the AGENT_CAPABILITIES entry for clientType. */
66
+ capabilities?: AgentCapabilities;
67
+ commands?: ReadonlyArray<CanonRuntimeCommandDescriptor>;
68
+ turnModes?: ReadonlyArray<CanonRuntimeTurnModeDescriptor>;
69
+ /** Extra runtime controls appended after the built-in effort control. */
70
+ extraRuntimeControls?: ReadonlyArray<CanonControlDescriptor>;
71
+ streamingTextMode: CanonRuntimeStreamingMode;
72
+ admissionActions?: HostAdmissionActionCapabilities;
73
+ presentation?: CanonRuntimePresentationPolicy;
74
+ runtimeCards?: CanonRuntimeDescriptor['runtimeCards'];
75
+ }): CanonRuntimeDescriptor;