@canonmsg/agent-sdk 11.2.1 → 12.1.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 (181) hide show
  1. package/README.md +248 -523
  2. package/dist/chunks/chunk-7N6OPPW4.js +5430 -0
  3. package/dist/chunks/chunk-N722GWCP.js +4897 -0
  4. package/dist/chunks/chunk-QZ4PPRQW.js +14247 -0
  5. package/dist/chunks/mls-crypto-LMNQZOS6.js +10 -0
  6. package/dist/cli.js +572 -0
  7. package/dist/drivers/claude.d.ts +42 -0
  8. package/dist/drivers/code.d.ts +18 -0
  9. package/dist/drivers/codex.d.ts +46 -0
  10. package/dist/drivers/connector.d.ts +34 -0
  11. package/dist/index.d.ts +20 -25
  12. package/dist/index.js +91 -13
  13. package/dist/internal/backend-contracts/agentBehaviorPolicy.d.ts +122 -0
  14. package/dist/internal/backend-contracts/agentDirectory.d.ts +32 -0
  15. package/dist/internal/backend-contracts/agentOrigin.d.ts +23 -0
  16. package/dist/internal/backend-contracts/agentSearch.d.ts +17 -0
  17. package/dist/internal/backend-contracts/api-origins.generated.d.ts +4 -0
  18. package/dist/internal/backend-contracts/apiErrors.d.ts +1 -0
  19. package/dist/internal/backend-contracts/artifactActions.d.ts +8 -0
  20. package/dist/internal/backend-contracts/artifacts.d.ts +386 -0
  21. package/dist/internal/backend-contracts/clientFloor.d.ts +41 -0
  22. package/dist/internal/backend-contracts/communication.d.ts +146 -0
  23. package/dist/internal/backend-contracts/connectorRelay.d.ts +179 -0
  24. package/dist/internal/backend-contracts/conversationMembership.d.ts +28 -0
  25. package/dist/internal/backend-contracts/deliveryObservation.d.ts +23 -0
  26. package/dist/internal/backend-contracts/diffRedaction.d.ts +6 -0
  27. package/dist/internal/backend-contracts/endpoint-unread.d.ts +4 -0
  28. package/dist/internal/backend-contracts/endpoint.d.ts +120 -0
  29. package/dist/internal/backend-contracts/endpointContentPolicy.d.ts +48 -0
  30. package/dist/internal/backend-contracts/environment.d.ts +20 -0
  31. package/dist/internal/backend-contracts/externalInbound.d.ts +24 -0
  32. package/dist/internal/backend-contracts/firestoreValues.d.ts +9 -0
  33. package/dist/internal/backend-contracts/index.d.ts +54 -0
  34. package/dist/internal/backend-contracts/media-url.d.ts +20 -0
  35. package/dist/internal/backend-contracts/media.d.ts +51 -0
  36. package/dist/internal/backend-contracts/mediaDelivery.d.ts +46 -0
  37. package/dist/internal/backend-contracts/mediaTransferProtocol.d.ts +17 -0
  38. package/dist/internal/backend-contracts/membershipChange.d.ts +21 -0
  39. package/dist/internal/backend-contracts/message.d.ts +86 -0
  40. package/dist/internal/backend-contracts/messageText.d.ts +6 -0
  41. package/dist/internal/backend-contracts/mlsDevApplication.d.ts +161 -0
  42. package/dist/internal/backend-contracts/mlsDevCredential.d.ts +78 -0
  43. package/dist/internal/backend-contracts/mlsDevCredentialReconciliation.d.ts +45 -0
  44. package/dist/internal/backend-contracts/mlsDevDeviceCustody.d.ts +52 -0
  45. package/dist/internal/backend-contracts/mlsDevEnrollment.d.ts +75 -0
  46. package/dist/internal/backend-contracts/mlsDevFeedReceipt.d.ts +43 -0
  47. package/dist/internal/backend-contracts/mlsDevGroup.d.ts +321 -0
  48. package/dist/internal/backend-contracts/mlsDevGroupFeed.d.ts +51 -0
  49. package/dist/internal/backend-contracts/mlsDevInteraction.d.ts +159 -0
  50. package/dist/internal/backend-contracts/mlsDevKeyPackage.d.ts +42 -0
  51. package/dist/internal/backend-contracts/mlsDevKeyPackages.d.ts +55 -0
  52. package/dist/internal/backend-contracts/mlsEnvironment.d.ts +35 -0
  53. package/dist/internal/backend-contracts/mlsPrincipalAlias.d.ts +23 -0
  54. package/dist/internal/backend-contracts/moderation.d.ts +7 -0
  55. package/dist/internal/backend-contracts/plaintextProcessors.d.ts +63 -0
  56. package/dist/internal/backend-contracts/preparedContent.d.ts +54 -0
  57. package/dist/internal/backend-contracts/replyAuthority.d.ts +14 -0
  58. package/dist/internal/backend-contracts/runtimeCardFields.d.ts +66 -0
  59. package/dist/internal/backend-contracts/runtimeCardStorage.d.ts +3 -0
  60. package/dist/internal/backend-contracts/runtimeDescriptor.d.ts +88 -0
  61. package/dist/internal/backend-contracts/selfContext.d.ts +9 -0
  62. package/dist/internal/backend-contracts/turnProtocol.d.ts +43 -0
  63. package/dist/internal/backend-contracts/upload-mime-types.d.ts +17 -0
  64. package/dist/internal/backend-contracts/verbContract.d.ts +856 -0
  65. package/dist/internal/backend-contracts/verbSchemas.d.ts +1717 -0
  66. package/dist/internal/backend-contracts/verbWire.d.ts +493 -0
  67. package/dist/internal/backend-contracts/webAuth.d.ts +8 -0
  68. package/dist/internal/core/agent-profiles.d.ts +65 -0
  69. package/dist/internal/core/approval-format.d.ts +22 -0
  70. package/dist/internal/core/approval-manager.d.ts +43 -0
  71. package/dist/internal/core/approval-types.d.ts +73 -0
  72. package/dist/internal/core/base-url.d.ts +1 -0
  73. package/dist/internal/core/cli-metadata.d.ts +13 -0
  74. package/dist/internal/core/client.d.ts +432 -0
  75. package/dist/internal/core/completed-output-journal.d.ts +39 -0
  76. package/dist/internal/core/constants.d.ts +1 -0
  77. package/dist/internal/core/endpoint-client.d.ts +56 -0
  78. package/dist/internal/core/execution-environment-mode.d.ts +6 -0
  79. package/dist/internal/core/gifs.d.ts +29 -0
  80. package/dist/internal/core/host-runtime.d.ts +53 -0
  81. package/dist/internal/core/index.d.ts +68 -0
  82. package/dist/internal/core/node-media.d.ts +6 -0
  83. package/dist/internal/core/policy.d.ts +2 -0
  84. package/dist/internal/core/registration-profile.d.ts +10 -0
  85. package/dist/internal/core/registration-session.d.ts +55 -0
  86. package/dist/internal/core/registration.d.ts +5 -0
  87. package/dist/internal/core/retry.d.ts +113 -0
  88. package/dist/internal/core/rtdb-rest.d.ts +141 -0
  89. package/dist/internal/core/runtime-cards.d.ts +286 -0
  90. package/dist/internal/core/runtime-descriptor.d.ts +16 -0
  91. package/dist/internal/core/runtime-endpoints.d.ts +26 -0
  92. package/dist/internal/core/runtime-heartbeat.d.ts +29 -0
  93. package/dist/internal/core/runtime-presentation.d.ts +9 -0
  94. package/dist/internal/core/runtime-request-manager.d.ts +283 -0
  95. package/dist/internal/core/runtime-state-publisher.d.ts +42 -0
  96. package/dist/internal/core/self-context.d.ts +22 -0
  97. package/dist/internal/core/silent-turn.d.ts +49 -0
  98. package/dist/internal/core/stream.d.ts +78 -0
  99. package/dist/internal/core/turn-protocol.d.ts +28 -0
  100. package/dist/internal/core/turn-verbosity.d.ts +85 -0
  101. package/dist/internal/core/types.d.ts +964 -0
  102. package/dist/internal/core/unified-diff.d.ts +35 -0
  103. package/dist/internal/endpoint/artifact-images.d.ts +60 -0
  104. package/dist/internal/endpoint/artifact-reducer.d.ts +35 -0
  105. package/dist/internal/endpoint/artifact-views.d.ts +113 -0
  106. package/dist/internal/endpoint/artifacts.d.ts +75 -0
  107. package/dist/internal/endpoint/delivery.d.ts +47 -0
  108. package/dist/internal/endpoint/engine.d.ts +249 -0
  109. package/dist/internal/endpoint/ephemeral.d.ts +8 -0
  110. package/dist/internal/endpoint/events.d.ts +32 -0
  111. package/dist/internal/endpoint/external-inbound.d.ts +36 -0
  112. package/dist/internal/endpoint/handoff.d.ts +50 -0
  113. package/dist/internal/endpoint/history.d.ts +22 -0
  114. package/dist/internal/endpoint/image-generation-errors.d.ts +2 -0
  115. package/dist/internal/endpoint/inbound.d.ts +29 -0
  116. package/dist/internal/endpoint/index.d.ts +32 -0
  117. package/dist/internal/endpoint/media.d.ts +177 -0
  118. package/dist/internal/endpoint/migration.d.ts +50 -0
  119. package/dist/internal/endpoint/mls-crypto.d.ts +32 -0
  120. package/dist/internal/endpoint/mls-dev-client.d.ts +52 -0
  121. package/dist/internal/endpoint/mls-dev-device.d.ts +69 -0
  122. package/dist/internal/endpoint/mls-dev-groups.d.ts +174 -0
  123. package/dist/internal/endpoint/mls-dev-interactions.d.ts +99 -0
  124. package/dist/internal/endpoint/mls-dev-key-package-service.d.ts +46 -0
  125. package/dist/internal/endpoint/mls-dev-key-packages.d.ts +62 -0
  126. package/dist/internal/endpoint/mls-dev-text.d.ts +67 -0
  127. package/dist/internal/endpoint/mls-dev-transport.d.ts +38 -0
  128. package/dist/internal/endpoint/node-mls-custody-protocol.d.ts +29 -0
  129. package/dist/internal/endpoint/node-mls-custody.d.ts +15 -0
  130. package/dist/internal/endpoint/node.d.ts +7 -0
  131. package/dist/internal/endpoint/observe-query.d.ts +17 -0
  132. package/dist/internal/endpoint/portable-node-mls-custody.d.ts +23 -0
  133. package/dist/internal/endpoint/queue.d.ts +22 -0
  134. package/dist/internal/endpoint/recovery.d.ts +27 -0
  135. package/dist/internal/endpoint/retention.d.ts +7 -0
  136. package/dist/internal/endpoint/store.d.ts +22 -0
  137. package/dist/internal/endpoint/sync.d.ts +33 -0
  138. package/dist/internal/endpoint/transient-publisher.d.ts +8 -0
  139. package/dist/internal/endpoint/transport.d.ts +63 -0
  140. package/dist/media.d.ts +1 -1
  141. package/dist/media.js +42 -541
  142. package/dist/runner/errands.d.ts +118 -0
  143. package/dist/runner/mls.d.ts +97 -0
  144. package/dist/runner/relay.d.ts +87 -0
  145. package/dist/runner/runner.d.ts +98 -0
  146. package/dist/runner/types.d.ts +215 -0
  147. package/package.json +18 -5
  148. package/dist/attached-session.d.ts +0 -58
  149. package/dist/attached-session.js +0 -638
  150. package/dist/bounded-file-read.d.ts +0 -14
  151. package/dist/bounded-file-read.js +0 -34
  152. package/dist/canon-agent.d.ts +0 -236
  153. package/dist/canon-agent.js +0 -2531
  154. package/dist/debouncer.d.ts +0 -18
  155. package/dist/debouncer.js +0 -133
  156. package/dist/inbound-handoff.d.ts +0 -6
  157. package/dist/inbound-handoff.js +0 -17
  158. package/dist/managed-session-host.d.ts +0 -27
  159. package/dist/managed-session-host.js +0 -195
  160. package/dist/managed-session-setup.d.ts +0 -99
  161. package/dist/managed-session-setup.js +0 -234
  162. package/dist/realtime.d.ts +0 -62
  163. package/dist/realtime.js +0 -193
  164. package/dist/runtime-card.d.ts +0 -48
  165. package/dist/runtime-card.js +0 -64
  166. package/dist/session-manager.d.ts +0 -77
  167. package/dist/session-manager.js +0 -285
  168. package/dist/turn-streaming-request.d.ts +0 -17
  169. package/dist/turn-streaming-request.js +0 -22
  170. package/dist/turn-verbosity-option.d.ts +0 -33
  171. package/dist/turn-verbosity-option.js +0 -23
  172. package/dist/types.d.ts +0 -387
  173. package/dist/types.js +0 -1
  174. package/dist/work-session-coordination.d.ts +0 -21
  175. package/dist/work-session-coordination.js +0 -53
  176. package/dist/work-session-host.d.ts +0 -31
  177. package/dist/work-session-host.js +0 -617
  178. package/dist/work-session-interactions.d.ts +0 -12
  179. package/dist/work-session-interactions.js +0 -173
  180. package/dist/work-session-state.d.ts +0 -36
  181. package/dist/work-session-state.js +0 -62
@@ -0,0 +1,73 @@
1
+ import type { VerbNativeMetadata } from '../backend-contracts/index.js';
2
+ import type { CanonUnifiedDiff } from './types.js';
3
+ export interface ApprovalRequestMetadata {
4
+ type: 'approval_request';
5
+ approvalId: string;
6
+ /** Canon user who should answer this card. UI hint only; reply APIs still enforce authorization. */
7
+ responseUserId?: string;
8
+ toolName: string;
9
+ /** Pre-computed, redacted summary — raw toolInput is never stored */
10
+ toolSummary: string;
11
+ /** Broad action family for richer Canon approval cards. */
12
+ category?: ApprovalRequestCategory;
13
+ /** Preferred v2 risk signal. `riskLevel` remains for older clients. */
14
+ risk?: ApprovalRisk;
15
+ riskLevel?: 'normal' | 'destructive';
16
+ runtimeId?: string;
17
+ turnId?: string;
18
+ /** Native runtime correlation handle. Canon stores this opaquely for plugins/SDK bridges. */
19
+ native?: ApprovalNativeRequestMetadata;
20
+ /** Redacted, normalized details. Raw tool input must not be stored here. */
21
+ details?: ApprovalRequestDetail[];
22
+ /**
23
+ * File-change preview for file approvals — full unified diff so the owner
24
+ * can review the change inline before approving, like native habitats.
25
+ * Size-disciplined via truncateUnifiedDiff.
26
+ */
27
+ diff?: CanonUnifiedDiff;
28
+ /** Whether the responder may create a rule that applies to later turns. */
29
+ allowSessionRule?: boolean;
30
+ expiresAt: string;
31
+ }
32
+ export interface ApprovalOutcomeMetadata {
33
+ type: 'approval_outcome';
34
+ approvalId?: string;
35
+ decision?: 'allow' | 'deny';
36
+ reason?: 'replied' | 'timeout' | 'session-rule';
37
+ }
38
+ export interface ApprovalReplyMetadata {
39
+ type: 'approval_reply';
40
+ approvalId: string;
41
+ decision: 'allow' | 'deny';
42
+ sessionRule?: SessionRule;
43
+ }
44
+ export type ApprovalRequestCategory = 'command' | 'file' | 'network' | 'browser' | 'mcp' | 'plugin' | 'canon' | 'tool';
45
+ export type ApprovalRisk = 'low' | 'normal' | 'high' | 'destructive';
46
+ export interface ApprovalRequestDetail {
47
+ label: string;
48
+ value: string;
49
+ monospace?: boolean;
50
+ }
51
+ export type ApprovalNativeRequestMetadata = VerbNativeMetadata;
52
+ export interface SessionRule {
53
+ type: 'approve-all' | 'approve-tool' | 'deny-tool';
54
+ /** Tool name pattern (regex) — only for approve-tool/deny-tool */
55
+ toolPattern?: string;
56
+ /** When this rule expires (ISO 8601), null = session lifetime */
57
+ expiresAt?: string | null;
58
+ }
59
+ export interface ApprovalResult {
60
+ decision: 'allow' | 'deny';
61
+ sessionRule?: SessionRule;
62
+ /** Canon-authenticated human who submitted this decision. */
63
+ respondedBy?: string;
64
+ }
65
+ export interface ApprovalConfig {
66
+ enabled: boolean;
67
+ timeoutSeconds: number;
68
+ defaultOnTimeout: 'deny' | 'ask';
69
+ redactPatterns: string[];
70
+ }
71
+ export declare const DEFAULT_APPROVAL_CONFIG: ApprovalConfig;
72
+ export declare function parseSessionRule(value: unknown): SessionRule | null;
73
+ export declare function parseApprovalReplyMetadata(value: unknown): ApprovalReplyMetadata | null;
@@ -0,0 +1 @@
1
+ export declare function resolveCanonBaseUrl(input?: string | null): string;
@@ -0,0 +1,13 @@
1
+ export interface CliMetadata {
2
+ name: string;
3
+ description?: string;
4
+ help: string;
5
+ version?: string;
6
+ }
7
+ export interface RunCliMetadataOptions extends CliMetadata {
8
+ argv?: string[];
9
+ }
10
+ export declare function isDirectExecution(moduleUrl: string): boolean;
11
+ export declare function readCliPackageVersion(moduleUrl: string): string | null;
12
+ export declare function handleCliMetadataRequest(moduleUrl: string, metadata: RunCliMetadataOptions): boolean;
13
+ export declare function runCli(moduleUrl: string, main: () => void | Promise<void>, onError: (error: unknown) => void, metadata?: RunCliMetadataOptions): void;
@@ -0,0 +1,432 @@
1
+ import { type CanonMessage, type CanonConversation, type CanonUnifiedDiff, type CanonContact, type CanonConversationsPage, type CanonConversationsPageOptions, type CanonMessagesPage, type CanonResolveAdmissionResult, type ResolveAdmissionTargetInput, type AppendMemoStreamChunkOptions, type CanonVoiceSession, type CanonVoiceSessionToken, type CreateMemoStreamOptions, type CreateMemoStreamResult, type CreateVoiceSessionOptions, type MemoStreamChunkAck, type AgentContext, type AddMemberResult, type CreateGroupResult, type MediaAttachment, type SendMessageOptions, type CreateGroupOptions, type JoinVoiceSessionOptions, type RegistrationStatus, type AgentOriginDeclaration, type SetRuntimeTurnOptions, type SetStreamingOptions } from './types.js';
2
+ import type { RuntimeInputKind } from './runtime-cards.js';
3
+ import type { ApprovalNativeRequestMetadata, ApprovalRequestCategory, ApprovalRequestDetail, ApprovalRisk, SessionRule } from './approval-types.js';
4
+ import type { RuntimeInputAnswers, RuntimeInputChoice, RuntimeInputNativeMetadata, RuntimeInputQuestion, RuntimeCardNativeMetadata, RuntimeCardV1 } from './runtime-cards.js';
5
+ import type { InboundDisposition } from './turn-protocol.js';
6
+ import { type CanonVerbWireRequest, type CanonVerbWireResponse, type CommunicateInput, type CommunicateResult, type DiscoverAgentsInput, type DiscoverAgentsResult, type SendToInput } from '../backend-contracts/index.js';
7
+ import { type EndpointOperation } from '../endpoint/index.js';
8
+ import { type CanonClientEndpointOptions, type CanonEndpoint } from './endpoint-client.js';
9
+ export interface ResumableMediaUploadSession {
10
+ uploadId: string;
11
+ /** Private bearer capability returned by Cloud Storage. Do not persist or log it. */
12
+ uploadUrl: string;
13
+ expiresAt: string;
14
+ sizeBytes: number;
15
+ mimeType: string;
16
+ }
17
+ export interface ResumableMediaUploadResult {
18
+ uploadId: string;
19
+ url: string;
20
+ status?: 'processing' | 'ready' | 'failed';
21
+ attachment: MediaAttachment;
22
+ }
23
+ /**
24
+ * Agent-facing ergonomics over the shared endpoint engine. Authentication and
25
+ * operator registration remain outside the conversation protocol.
26
+ */
27
+ export declare class CanonClient {
28
+ private baseUrl;
29
+ private apiKey;
30
+ private endpointOptions;
31
+ private endpointLease?;
32
+ /** Out-of-protocol HTTP (identity, profile, keys); resolved per call so the seam stays late-bound. */
33
+ private readonly http;
34
+ constructor(apiKey: string, baseUrl?: string, options?: CanonClientEndpointOptions);
35
+ /** All durable communication shares this installation's engine and journal. */
36
+ getEndpoint(): Promise<CanonEndpoint>;
37
+ close(): Promise<void>;
38
+ getFileMediaPipeline(fetchImpl?: typeof fetch): Promise<import("../endpoint/index.js").EndpointMediaPipeline<string>>;
39
+ waitForOperation<T>(operationId: string, options?: {
40
+ signal?: AbortSignal;
41
+ timeoutMs?: number;
42
+ }): Promise<T>;
43
+ private endpointAction;
44
+ private endpointQuery;
45
+ private endpointPublish;
46
+ private authHeaders;
47
+ getAgentMe(): Promise<AgentContext>;
48
+ discoverAgents(input?: DiscoverAgentsInput): Promise<DiscoverAgentsResult>;
49
+ /**
50
+ * List conversations. Called with no options this is the historical request —
51
+ * no query string, every conversation the agent belongs to, most recent
52
+ * first. Passing `limit`/`before` opts into paging; use
53
+ * `getConversationsPage` when you need the cursor back.
54
+ */
55
+ getConversations(options?: CanonConversationsPageOptions): Promise<CanonConversation[]>;
56
+ /**
57
+ * One page of conversations plus the cursor to continue from. Pages are cut
58
+ * in conversation-id order; keep calling with `before: page.nextBefore` until
59
+ * `nextBefore` is null. Do not stop on an empty page and do not derive the
60
+ * cursor from the returned array — the array is recency-sorted within the
61
+ * page and hidden conversations are filtered after the page is read.
62
+ */
63
+ getConversationsPage(options?: CanonConversationsPageOptions): Promise<CanonConversationsPage>;
64
+ private fetchConversationsPage;
65
+ /** Targeted membership read; session hosts must not poll the entire account. */
66
+ getConversation(conversationId: string): Promise<CanonConversation | null>;
67
+ getMessages(conversationId: string, limit?: number, before?: string): Promise<CanonMessage[]>;
68
+ getMessagesPage(conversationId: string, limit?: number, before?: string): Promise<CanonMessagesPage>;
69
+ /** Read one explicitly referenced message without extending ordinary history. */
70
+ getMessage(conversationId: string, messageId: string): Promise<CanonMessage | null>;
71
+ sendMessage(conversationId: string, text: string, options?: SendMessageOptions, delivery?: {
72
+ operationId?: string;
73
+ }): Promise<{
74
+ messageId: string;
75
+ }>;
76
+ /** Inspect a trusted reply's durable delivery without rebuilding its body. */
77
+ getMessageOperation(conversationId: string, messageId: string, delivery?: {
78
+ operationId?: string;
79
+ }): Promise<EndpointOperation | undefined>;
80
+ /** Core's chunker records all ordered message intents before publishing any part. */
81
+ prepareMessageGroup(conversationId: string, messageId: string, parts: Array<{
82
+ text: string;
83
+ options: SendMessageOptions;
84
+ }>, delivery?: {
85
+ operationId?: string;
86
+ signal?: AbortSignal;
87
+ replacesOperationId?: string;
88
+ proactive?: boolean;
89
+ }): Promise<{
90
+ id: string;
91
+ sendPart(index: number, options?: {
92
+ signal?: AbortSignal;
93
+ timeoutMs?: number;
94
+ }): Promise<{
95
+ messageId: string;
96
+ }>;
97
+ }>;
98
+ /** Publish a native-formatted ordered plan through the same endpoint engine. */
99
+ sendMessageGroup(conversationId: string, messageId: string | null, parts: Array<{
100
+ text: string;
101
+ options: SendMessageOptions;
102
+ }>, delivery?: {
103
+ proactive?: boolean;
104
+ }): Promise<{
105
+ messageId: string;
106
+ messageIds: string[];
107
+ }>;
108
+ cancelMessageGroup(id: string): Promise<void>;
109
+ /**
110
+ * Send outside an active inbound turn through the canonical policy boundary.
111
+ * Harness reply paths should keep using sendMessage; schedulers, notifications,
112
+ * and other detached work must use this method.
113
+ */
114
+ sendProactiveMessage(conversationId: string, text: string, options?: SendToInput['messageOptions'], delivery?: {
115
+ operationId?: string;
116
+ }): Promise<{
117
+ messageId: string;
118
+ conversationId: string;
119
+ }>;
120
+ /** Reconcile an existing publication without rebuilding or resubmitting its body. */
121
+ waitForProactiveMessage(operationId: string, options?: {
122
+ signal?: AbortSignal;
123
+ timeoutMs?: number;
124
+ }): Promise<{
125
+ messageId: string;
126
+ conversationId: string;
127
+ }>;
128
+ /**
129
+ * Execute a canonical verb over the wire contract (canon.verb-wire.v1).
130
+ * Bindings build the request with projectVerbIntentToWire; the endpoint
131
+ * validates the envelope, executes with the json codec, and answers 501
132
+ * for mls bodies until the codec lands (docs/design/e2ee-mls.md).
133
+ */
134
+ executeVerbWire(request: CanonVerbWireRequest, delivery?: {
135
+ operationId?: string;
136
+ }): Promise<CanonVerbWireResponse>;
137
+ /** Internal transport for the compact public `communicate` operation. */
138
+ private sendTo;
139
+ /**
140
+ * Communicate across Canon conversations through one compact operation.
141
+ *
142
+ * This is intentionally a small, principal-neutral projection over the
143
+ * canonical verb layer: policy and admission remain server-owned, and
144
+ * callers cannot provide runtime/session configuration or trusted turn
145
+ * context.
146
+ */
147
+ communicate(input: CommunicateInput): Promise<CommunicateResult>;
148
+ private executeCommunication;
149
+ private startWithheld;
150
+ /** Create a group. Direct conversations must go through `communicate`. */
151
+ createGroup(options: CreateGroupOptions): Promise<CreateGroupResult>;
152
+ createMemoStream(options: CreateMemoStreamOptions & {
153
+ streamId?: string;
154
+ }): Promise<CreateMemoStreamResult>;
155
+ appendMemoStreamChunk(conversationId: string, streamId: string, options: AppendMemoStreamChunkOptions): Promise<MemoStreamChunkAck>;
156
+ finalizeMemoStream(conversationId: string, streamId: string, messageId: string): Promise<void>;
157
+ abortMemoStream(conversationId: string, streamId: string): Promise<void>;
158
+ createVoiceSession(options: CreateVoiceSessionOptions): Promise<CanonVoiceSessionToken>;
159
+ getVoiceSessionState(conversationId: string, sessionId: string): Promise<{
160
+ session: CanonVoiceSession;
161
+ }>;
162
+ declineVoiceSession(conversationId: string, sessionId: string): Promise<void>;
163
+ joinVoiceSession(conversationId: string, sessionId: string, options?: Omit<JoinVoiceSessionOptions, 'conversationId'>): Promise<CanonVoiceSessionToken>;
164
+ endVoiceSession(conversationId: string, sessionId: string): Promise<void>;
165
+ listContacts(): Promise<CanonContact[]>;
166
+ getContact(contactId: string): Promise<CanonContact | null>;
167
+ deleteContact(contactId: string): Promise<void>;
168
+ blockUser(userId: string): Promise<void>;
169
+ unblockUser(userId: string): Promise<void>;
170
+ resolveAdmission(target: string | ResolveAdmissionTargetInput): Promise<CanonResolveAdmissionResult>;
171
+ uploadMedia(conversationId: string, data: string, mimeType: string, fileName?: string, options?: {
172
+ attachmentId?: string;
173
+ }): Promise<{
174
+ url: string;
175
+ attachment: MediaAttachment;
176
+ }>;
177
+ /**
178
+ * Start a private direct-to-Storage upload. The returned upload URL is a
179
+ * short-lived bearer capability; send exactly `sizeBytes` raw bytes to it,
180
+ * then call `finalizeResumableMediaUpload`.
181
+ */
182
+ createResumableMediaUpload(conversationId: string, sizeBytes: number, mimeType: string, fileName?: string): Promise<ResumableMediaUploadSession>;
183
+ /** Promote validated pending bytes into a canonical Canon attachment. */
184
+ finalizeResumableMediaUpload(uploadId: string): Promise<ResumableMediaUploadResult>;
185
+ updateTopic(conversationId: string, topic: string): Promise<void>;
186
+ deleteMessage(conversationId: string, messageId: string): Promise<void>;
187
+ updateMessageDisposition(conversationId: string, messageId: string, inboundDisposition: InboundDisposition): Promise<void>;
188
+ markAsRead(conversationId: string): Promise<void>;
189
+ leaveConversation(conversationId: string): Promise<void>;
190
+ react(conversationId: string, messageId: string, emoji: string): Promise<void>;
191
+ updateConversationName(conversationId: string, name: string): Promise<void>;
192
+ addMember(conversationId: string, userId: string): Promise<AddMemberResult>;
193
+ removeMember(conversationId: string, userId: string): Promise<void>;
194
+ setStreaming(options: SetStreamingOptions): Promise<void>;
195
+ clearStreaming(conversationId: string): Promise<void>;
196
+ setRuntimeTurn(options: SetRuntimeTurnOptions): Promise<void>;
197
+ setTyping(conversationId: string, typing: boolean, status?: 'thinking' | 'typing'): Promise<void>;
198
+ peekRuntimeSignal(conversationId: string): Promise<Record<string, unknown>>;
199
+ /** Acknowledge exactly the signal observed before the native handler ran. */
200
+ acknowledgeRuntimeSignal(conversationId: string, signalId: string): Promise<Record<string, unknown>>;
201
+ consumeRuntimeSignal(conversationId: string): Promise<Record<string, unknown>>;
202
+ /** Runtime adapters can inspect only their own projection in an admitted room. */
203
+ getRuntimeProjection(family: 'agent-runtime' | 'agent-session' | 'turn-state' | 'runtime-info' | 'runtime-activity' | 'streaming', conversationId?: string): Promise<unknown>;
204
+ publishRuntimeSession(conversationId: string, mode: 'patch' | 'clear', state?: Record<string, unknown>): Promise<void>;
205
+ publishRuntimeInfo(conversationId: string, mode: 'replace' | 'patch' | 'clear', info?: Record<string, unknown>): Promise<void>;
206
+ publishRuntimeActivity(conversationId: string, input: {
207
+ mode: 'upsert';
208
+ item: Record<string, unknown>;
209
+ } | {
210
+ mode: 'remove';
211
+ itemId: string;
212
+ } | {
213
+ mode: 'clear';
214
+ }): Promise<void>;
215
+ patchRuntimeStreaming(conversationId: string, patch: Record<string, unknown>): Promise<void>;
216
+ createRuntimeInputRequest(options: {
217
+ conversationId: string;
218
+ inputId: string;
219
+ kind: RuntimeInputKind;
220
+ expiresAt: number;
221
+ title?: string;
222
+ prompt?: string;
223
+ choices?: RuntimeInputChoice[];
224
+ questions?: RuntimeInputQuestion[];
225
+ secretName?: string;
226
+ native?: RuntimeInputNativeMetadata;
227
+ sensitive?: boolean;
228
+ responseUserId?: string;
229
+ turnId?: string;
230
+ }): Promise<{
231
+ success: true;
232
+ inputId: string;
233
+ expiresAt: number;
234
+ messageId?: string;
235
+ }>;
236
+ consumeRuntimeInputResponse(options: {
237
+ conversationId: string;
238
+ inputId: string;
239
+ cancel?: boolean;
240
+ }): Promise<{
241
+ status: 'pending';
242
+ inputId: string;
243
+ expiresAt?: number;
244
+ } | {
245
+ status: 'submitted';
246
+ inputId: string;
247
+ kind: RuntimeInputKind;
248
+ value: string;
249
+ answers?: RuntimeInputAnswers;
250
+ } | {
251
+ status: 'cancelled';
252
+ inputId: string;
253
+ kind: RuntimeInputKind;
254
+ } | {
255
+ status: 'timeout';
256
+ inputId: string;
257
+ kind: RuntimeInputKind;
258
+ }>;
259
+ createRuntimeApprovalRequest(options: {
260
+ conversationId: string;
261
+ approvalId?: string;
262
+ toolName: string;
263
+ toolSummary: string;
264
+ expiresAt: number;
265
+ responseUserId?: string;
266
+ riskLevel?: 'normal' | 'destructive';
267
+ risk?: ApprovalRisk;
268
+ category?: ApprovalRequestCategory;
269
+ runtimeId?: string;
270
+ turnId?: string;
271
+ native?: ApprovalNativeRequestMetadata;
272
+ details?: ApprovalRequestDetail[];
273
+ /** File-change preview rendered inline on the approval card. Truncate via truncateUnifiedDiff before sending. */
274
+ diff?: CanonUnifiedDiff;
275
+ allowSessionRule?: boolean;
276
+ }): Promise<{
277
+ success: true;
278
+ approvalId: string;
279
+ expiresAt: number;
280
+ messageId?: string;
281
+ responseUserId: string;
282
+ allowSessionRule: boolean;
283
+ }>;
284
+ consumeRuntimeApprovalResponse(options: {
285
+ conversationId: string;
286
+ approvalId: string;
287
+ cancel?: boolean;
288
+ }): Promise<{
289
+ status: 'pending';
290
+ approvalId: string;
291
+ expiresAt?: number;
292
+ } | {
293
+ status: 'allow';
294
+ approvalId: string;
295
+ sessionRule?: SessionRule;
296
+ respondedBy?: string;
297
+ } | {
298
+ status: 'deny';
299
+ approvalId: string;
300
+ sessionRule?: SessionRule;
301
+ respondedBy?: string;
302
+ } | {
303
+ status: 'timeout';
304
+ approvalId: string;
305
+ }>;
306
+ createRuntimeCardRequest(options: {
307
+ conversationId: string;
308
+ card: RuntimeCardV1;
309
+ cardId?: string;
310
+ expiresAt?: number;
311
+ responseUserId?: string;
312
+ runtimeId?: string;
313
+ turnId?: string;
314
+ native?: RuntimeCardNativeMetadata;
315
+ }): Promise<{
316
+ success: true;
317
+ cardId: string;
318
+ messageId: string;
319
+ /** True when the card has actions and a response is pending; false for display cards. */
320
+ interactive: boolean;
321
+ /** Effective human responder selected by Canon. */
322
+ responseUserId?: string;
323
+ /** Present only for interactive cards. */
324
+ expiresAt?: number;
325
+ }>;
326
+ consumeRuntimeCardResponse(options: {
327
+ conversationId: string;
328
+ cardId: string;
329
+ cancel?: boolean;
330
+ }): Promise<{
331
+ status: 'pending';
332
+ cardId: string;
333
+ expiresAt?: number;
334
+ } | {
335
+ status: 'submitted';
336
+ cardId: string;
337
+ actionId?: string;
338
+ values?: Record<string, unknown>;
339
+ respondedBy?: string;
340
+ } | {
341
+ status: 'cancelled';
342
+ cardId: string;
343
+ respondedBy?: string;
344
+ } | {
345
+ status: 'timeout';
346
+ cardId: string;
347
+ }>;
348
+ /**
349
+ * Create a server-owned plan-approval interaction.
350
+ *
351
+ * Seeds the pending node + attention + runtime-card state and authors the
352
+ * `plan_approval` card message, mirroring the other `createRuntime*Request`
353
+ * spine methods. Hosts resolve it through `consumeRuntimePlanResponse()` so
354
+ * the canonical pending state, rather than a timeline receipt, is authoritative.
355
+ */
356
+ createRuntimePlanRequest(options: {
357
+ conversationId: string;
358
+ planId?: string;
359
+ title?: string;
360
+ summary?: string;
361
+ body?: string;
362
+ allowedPrompts?: ReadonlyArray<{
363
+ tool: string;
364
+ prompt: string;
365
+ }>;
366
+ responseUserId?: string;
367
+ turnId?: string;
368
+ expiresAt?: number;
369
+ }): Promise<{
370
+ success: true;
371
+ planId: string;
372
+ expiresAt: number;
373
+ messageId?: string;
374
+ interactive: boolean;
375
+ }>;
376
+ consumeRuntimePlanResponse(options: {
377
+ conversationId: string;
378
+ planId: string;
379
+ cancel?: boolean;
380
+ }): Promise<{
381
+ status: 'pending';
382
+ planId: string;
383
+ expiresAt?: number;
384
+ } | {
385
+ status: 'approve' | 'revise' | 'reject';
386
+ planId: string;
387
+ feedback?: string;
388
+ grantedPrompts?: Array<{
389
+ tool: string;
390
+ prompt: string;
391
+ }>;
392
+ receiptId?: string;
393
+ } | {
394
+ status: 'cancelled';
395
+ planId: string;
396
+ } | {
397
+ status: 'timeout';
398
+ planId: string;
399
+ }>;
400
+ updateRuntimeStatus(options: {
401
+ runtime: string;
402
+ hostMode?: boolean;
403
+ runtimeDescriptor?: Record<string, unknown>;
404
+ online?: true;
405
+ } | {
406
+ online: false;
407
+ }): Promise<void>;
408
+ static register(baseUrl: string | undefined, body: {
409
+ name: string;
410
+ description: string;
411
+ ownerPhone: string;
412
+ developerInfo: string;
413
+ avatarUrl?: string;
414
+ clientType?: string;
415
+ origin?: AgentOriginDeclaration;
416
+ requestedAgentId?: string;
417
+ localRegistrationId?: string;
418
+ }): Promise<{
419
+ requestId: string;
420
+ pollToken?: string;
421
+ }>;
422
+ static checkStatus(baseUrl: string | undefined, requestId: string, pollToken?: string): Promise<RegistrationStatus>;
423
+ static ackRegistrationStatus(baseUrl: string | undefined, requestId: string, pollToken?: string): Promise<void>;
424
+ }
425
+ export declare class CanonApiError extends Error {
426
+ /** Reconcile this durable operation instead of allocating another action. */
427
+ operationId?: string;
428
+ status: number;
429
+ retryAfter?: string | null;
430
+ code?: string;
431
+ constructor(status: number, body: string, headers?: Headers);
432
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * A runtime's finished turn output, saved before it is published so a host that
3
+ * dies between the native result and Canon delivery replays exactly that
4
+ * output on restart instead of losing it, and never runs the turn again.
5
+ */
6
+ export interface CompletedOutputRecordBase {
7
+ version: 1;
8
+ turnId: string;
9
+ conversationId: string;
10
+ createdAt: string;
11
+ /** Who could read the conversation when the output was produced. */
12
+ audience: {
13
+ memberIds: string[];
14
+ membershipRevision?: number;
15
+ } | null;
16
+ }
17
+ export interface CompletedOutputJournal<T extends CompletedOutputRecordBase> {
18
+ /** Durably save a record; saving the identical record again is a no-op, a different one is refused. */
19
+ save(record: T): void;
20
+ /** Every saved record, oldest first, after recovering writes a crash interrupted. */
21
+ list(): T[];
22
+ remove(turnId: string): void;
23
+ }
24
+ /**
25
+ * Atomic, fsynced, one file per turn under a folder keyed by `scope` (runtime,
26
+ * environment, principal, ownership generation, installation), so a transferred
27
+ * agent or another installation never sees these plaintext records.
28
+ */
29
+ export declare function createCompletedOutputJournal<T extends CompletedOutputRecordBase>(directory: string, scope: unknown, options: {
30
+ /** Names the runtime in errors, e.g. `Codex`. */
31
+ label: string;
32
+ /** Runtime-specific shape check beyond the base fields; false is an invalid record. */
33
+ validate?: (record: T) => boolean;
34
+ }): CompletedOutputJournal<T>;
35
+ /** A new delivery after restart must not silently adopt a changed audience. */
36
+ export declare function assertCompletedOutputAudience(record: Pick<CompletedOutputRecordBase, 'audience'>, current: {
37
+ memberIds: string[];
38
+ membershipRevision?: number;
39
+ } | null, label: string): void;
@@ -0,0 +1 @@
1
+ export declare const DEFAULT_BASE_URL: string;
@@ -0,0 +1,56 @@
1
+ import { createEndpoint, type EndpointMediaBytes, type EndpointMediaPipeline, type MlsDevProtectedPreparer, type MlsDevProtectedKeyPackagePreparer, type MlsDevProtectedGroupPreparer } from '../endpoint/index.js';
2
+ import type { MlsDevClientConfiguration } from '../endpoint/mls-crypto.js';
3
+ import type { CanonClientIdentity } from '../backend-contracts/index.js';
4
+ export type CanonEndpoint = ReturnType<typeof createEndpoint>;
5
+ /** Operator-owned custody. Keep the same object for every shared endpoint lease. */
6
+ export interface CanonMlsDevCustody {
7
+ prepareProtected: MlsDevProtectedPreparer;
8
+ prepareProtectedKeyPackage: MlsDevProtectedKeyPackagePreparer;
9
+ prepareProtectedGroup: MlsDevProtectedGroupPreparer;
10
+ }
11
+ export interface CanonMlsDevOptions {
12
+ configuration: MlsDevClientConfiguration;
13
+ custody: CanonMlsDevCustody;
14
+ }
15
+ export interface CanonClientEndpointOptions {
16
+ /** Explicit synthetic opt-in, bound to its configuration's environment; enrollment remains an operator action. */
17
+ mlsDev?: CanonMlsDevOptions;
18
+ /** Inject an operator-controlled store/engine for replicated or ephemeral hosts. */
19
+ endpoint?: CanonEndpoint;
20
+ environmentId?: string;
21
+ principalId?: string;
22
+ streamUrl?: string;
23
+ /** Persistent volume for the engine journal; never use a container temporary directory. */
24
+ stateDirectory?: string;
25
+ /**
26
+ * The engine's installation, for a host whose installation is assigned (the class-C relay's reserved one). A store
27
+ * already opened under another installation refuses to start; without it a new store picks a random installation.
28
+ */
29
+ installationId?: string;
30
+ mediaDirectory?: string;
31
+ /** Operator inspection/import does not automatically publish queued operations. */
32
+ autoDrain?: boolean;
33
+ /** Replicated cloud hosts supply operator-owned durable byte storage. */
34
+ mediaBytes?: EndpointMediaBytes<string>;
35
+ /** Test seam for the client's out-of-protocol HTTP (identity, profile); production leaves it unset. */
36
+ fetch?: typeof fetch;
37
+ /**
38
+ * Names this client to Canon's client floor (`X-Canon-Client`, mls-cutover-operator.md §2 15b). The runner, the Hermes
39
+ * worker and the CLIs pass theirs; a client that names none is refused once a floor exists.
40
+ */
41
+ client?: CanonClientIdentity;
42
+ /** Canon refused this client as below its floor, on any request or stream (`426 CLIENT_UPDATE_REQUIRED`). */
43
+ onClientUpdateRequired?(error: Error): void;
44
+ }
45
+ export declare function acquireFileMediaPipeline(endpoint: CanonEndpoint, options: CanonClientEndpointOptions, fetchImpl?: typeof fetch): Promise<EndpointMediaPipeline<string>>;
46
+ /** One protocol owner per account, environment and durable profile in this process. */
47
+ export declare function acquireAgentEndpoint(input: {
48
+ apiKey: string;
49
+ baseUrl: string;
50
+ principalId: string;
51
+ ownershipVersion: number;
52
+ options: CanonClientEndpointOptions;
53
+ }): Promise<{
54
+ endpoint: CanonEndpoint;
55
+ release(): Promise<void>;
56
+ }>;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Browser-safe helpers for Canon execution modes. Separated from
3
+ * `execution-environment.ts` (which pulls in Node-only modules) so both
4
+ * Node hosts and browser/Expo clients can import these primitives.
5
+ */
6
+ export type ExecutionEnvironmentMode = 'worktree' | 'locked';
@@ -0,0 +1,29 @@
1
+ import type { MediaAttachment } from './types.js';
2
+ export type GifProvider = 'klipy';
3
+ export interface CanonGifResult {
4
+ id: string;
5
+ title: string;
6
+ description: string | null;
7
+ url: string;
8
+ previewUrl: string;
9
+ width: number | null;
10
+ height: number | null;
11
+ sizeBytes: number | null;
12
+ itemUrl: string;
13
+ provider: GifProvider;
14
+ attributionLabel: string;
15
+ }
16
+ export interface CanonGifSearchResponse {
17
+ results: CanonGifResult[];
18
+ nextCursor: string | null;
19
+ }
20
+ export interface CanonGifMetadata {
21
+ provider: GifProvider;
22
+ id: string;
23
+ itemUrl: string;
24
+ title: string;
25
+ previewUrl: string;
26
+ attributionLabel: string;
27
+ }
28
+ export declare function buildGifAttachment(gif: CanonGifResult): MediaAttachment;
29
+ export declare function buildGifMetadata(gif: CanonGifResult): CanonGifMetadata;