@canonmsg/agent-sdk 11.2.0 → 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 -238
  160. package/dist/canon-agent.js +0 -2534
  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,10 @@
1
+ import {
2
+ MLS_DEV_DEVICE_HTTP_CONFIGURATION,
3
+ createMlsDevCredentialVerifier,
4
+ parseMlsDevClientConfiguration
5
+ } from "./chunk-FPQFTTND.js";
6
+ export {
7
+ MLS_DEV_DEVICE_HTTP_CONFIGURATION,
8
+ createMlsDevCredentialVerifier,
9
+ parseMlsDevClientConfiguration
10
+ };
package/dist/cli.js ADDED
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ assertPrivateHome,
4
+ checkCodex,
5
+ claudeDriver,
6
+ codeDriver,
7
+ codexDriver,
8
+ createRunner,
9
+ loadClaudeQuery
10
+ } from "./chunks/chunk-6VK4UZHJ.js";
11
+ import {
12
+ loadProfiles,
13
+ runCli
14
+ } from "./chunks/chunk-OLJ7H4E2.js";
15
+ import {
16
+ __name
17
+ } from "./chunks/chunk-FPQFTTND.js";
18
+
19
+ // src/cli.ts
20
+ import { realpathSync } from "node:fs";
21
+ import { homedir, tmpdir } from "node:os";
22
+ import { dirname, join, resolve } from "node:path";
23
+ import { pathToFileURL } from "node:url";
24
+ import { parseArgs } from "node:util";
25
+ var HELP = `canon-agent: run a Canon agent on the unified runner
26
+
27
+ Usage:
28
+ canon-agent run --driver code --module <path> [--profile <name>] [--environment <id>]
29
+ canon-agent run --driver claude [--cwd <dir>] [--model <id>] [--permission-mode <mode>]
30
+ [--claude-path <path>] [--profile <name>] [--environment <id>]
31
+ canon-agent run --driver codex [--cwd <dir>] [--model <id>] [--sandbox <mode>]
32
+ [--approval-policy <policy>] [--codex-path <path>] [--profile <name>]
33
+ [--environment <id>]
34
+
35
+ Flags:
36
+ --driver <name> The runtime driver: "code", "claude" or "codex".
37
+ --module <path> code: an ES module whose default export answers a turn.
38
+ Its directory is one the agent may send files from.
39
+ --cwd <dir> claude, codex: the directory the runtime works in (default:
40
+ the current one). The agent may send files from it.
41
+ --model <id> claude, codex: the model (default: the runtime's).
42
+ --permission-mode <m> claude: "default" puts each tool call Claude Code would ask
43
+ about to Canon as an approval; "acceptEdits" and
44
+ "bypassPermissions" allow more without asking, and then
45
+ only the owner's messages may lead to tool use.
46
+ --claude-path <path> claude: a Claude Code executable to use instead of the
47
+ SDK's bundled one.
48
+ --sandbox <mode> codex: "workspace-write" (default), "read-only" or
49
+ "danger-full-access", for the owner's turns.
50
+ --approval-policy <p> codex: "on-request" (default), "untrusted" or "never": when
51
+ Codex asks the owner (as a Canon approval) before acting.
52
+ Turns holding anyone else's message are always read-only,
53
+ approve nothing and get only Canon's tools.
54
+ --codex-path <path> codex: the Codex CLI (default: codex on the PATH).
55
+ --profile <name> A profile in $CANON_HOME/agents.json (key and endpoints).
56
+ --environment <id> canon-prod-v1 or canon-dev-v1 (default: CANON_ENVIRONMENT_ID).
57
+ --help, -h Show this help.
58
+ --version, -V Show the package version.
59
+
60
+ Environment:
61
+ CANON_API_KEY The agent's key (or use --profile).
62
+ CANON_ENVIRONMENT_ID Required; a profile from another environment is refused.
63
+ CANON_HOME Agent state, default ~/.canon. It must be private (0700).
64
+ ANTHROPIC_API_KEY claude: use this API key instead of a Claude subscription
65
+ login. The claude driver needs @anthropic-ai/claude-agent-sdk.
66
+ OPENAI_API_KEY codex: use this API key instead of Codex's own login, unless
67
+ Codex is configured for another model provider.
68
+
69
+ SIGTERM or Ctrl-C stops taking messages, lets running turns finish for 10 seconds,
70
+ then stops them.`;
71
+ var DRIVERS = ["code", "claude", "codex", "hermes"];
72
+ var AVAILABLE = ["code", "claude", "codex"];
73
+ var PERMISSION_MODES = ["default", "acceptEdits", "bypassPermissions"];
74
+ var SANDBOXES = ["workspace-write", "read-only", "danger-full-access"];
75
+ var APPROVAL_POLICIES = ["on-request", "untrusted", "never"];
76
+ var UsageError = class extends Error {
77
+ static {
78
+ __name(this, "UsageError");
79
+ }
80
+ };
81
+ async function main() {
82
+ let parsed;
83
+ try {
84
+ parsed = parse();
85
+ } catch (error) {
86
+ throw new UsageError(error instanceof Error ? error.message : String(error));
87
+ }
88
+ const { values, positionals } = parsed;
89
+ if (positionals[0] !== "run" || positionals.length > 1) throw new UsageError('Expected the "run" command.');
90
+ if (!values.driver) throw new UsageError("--driver is required.");
91
+ if (!AVAILABLE.includes(values.driver)) {
92
+ throw new Error(DRIVERS.includes(values.driver) ? `The "${values.driver}" driver is not yet available; ${AVAILABLE.join(", ")} run today.` : `Unknown driver "${values.driver}". Available: ${AVAILABLE.join(", ")}.`);
93
+ }
94
+ if (values.driver === "code" && !values.module) throw new UsageError("--driver code needs --module <path>.");
95
+ const permissionMode = values["permission-mode"];
96
+ if (permissionMode !== void 0 && !PERMISSION_MODES.includes(permissionMode)) {
97
+ throw new UsageError(`--permission-mode must be one of ${PERMISSION_MODES.join(", ")}.`);
98
+ }
99
+ const { sandbox, "approval-policy": approvalPolicy } = values;
100
+ if (sandbox !== void 0 && !SANDBOXES.includes(sandbox)) {
101
+ throw new UsageError(`--sandbox must be one of ${SANDBOXES.join(", ")}.`);
102
+ }
103
+ if (approvalPolicy !== void 0 && !APPROVAL_POLICIES.includes(approvalPolicy)) {
104
+ throw new UsageError(`--approval-policy must be one of ${APPROVAL_POLICIES.join(", ")}.`);
105
+ }
106
+ const environmentId = values.environment || process.env.CANON_ENVIRONMENT_ID;
107
+ if (!environmentId) throw new Error("CANON_ENVIRONMENT_ID (or --environment) is required.");
108
+ if (!values.profile && !process.env.CANON_API_KEY) throw new Error("CANON_API_KEY (or --profile <name>) is required.");
109
+ const home = resolve(process.env.CANON_HOME || join(homedir(), ".canon"));
110
+ await assertPrivateHome(home);
111
+ const profile = values.profile ? loadProfiles(home)[values.profile] : void 0;
112
+ if (values.profile && !profile) throw new Error(`No profile "${values.profile}" in ${join(home, "agents.json")}.`);
113
+ if (profile && profile.environmentId !== environmentId) {
114
+ throw new Error(`Profile "${values.profile}" belongs to ${profile.environmentId}, not ${environmentId}.`);
115
+ }
116
+ const apiKey = process.env.CANON_API_KEY || profile.apiKey;
117
+ let driver;
118
+ if (values.driver === "claude") {
119
+ driver = claudeDriver({
120
+ cwd: resolve(values.cwd ?? "."),
121
+ query: await loadClaudeQuery(),
122
+ ...values.model ? { model: values.model } : {},
123
+ ...permissionMode ? { permissionMode } : {},
124
+ ...values["claude-path"] ? { claudePath: resolve(values["claude-path"]) } : {}
125
+ });
126
+ } else if (values.driver === "codex") {
127
+ const codexPath = values["codex-path"] ? resolve(values["codex-path"]) : "codex";
128
+ checkCodex(codexPath);
129
+ driver = codexDriver({
130
+ cwd: resolve(values.cwd ?? "."),
131
+ codexPath,
132
+ ...values.model ? { model: values.model } : {},
133
+ ...sandbox ? { sandbox } : {},
134
+ ...approvalPolicy ? { approvalPolicy } : {}
135
+ });
136
+ } else {
137
+ const modulePath = realpathSync(resolve(values.module));
138
+ const handler = (await import(pathToFileURL(modulePath).href)).default;
139
+ if (typeof handler !== "function") throw new Error(`${values.module} must export a turn handler as its default export.`);
140
+ driver = codeDriver(handler, { outboundFiles: { roots: [dirname(modulePath), realpathSync(tmpdir())] } });
141
+ }
142
+ const runner = await createRunner({
143
+ apiKey,
144
+ environmentId,
145
+ home,
146
+ driver,
147
+ baseUrl: process.env.CANON_BASE_URL || profile?.baseUrl,
148
+ streamUrl: process.env.CANON_STREAM_URL || profile?.streamUrl
149
+ });
150
+ stopOnSignals(runner);
151
+ try {
152
+ await runner.start();
153
+ } catch (error) {
154
+ await runner.stop().catch(() => void 0);
155
+ throw error;
156
+ }
157
+ console.error(`canon-agent: running the ${values.driver} driver in ${environmentId}. Ctrl-C stops it.`);
158
+ }
159
+ __name(main, "main");
160
+ function parse() {
161
+ return parseArgs({
162
+ allowPositionals: true,
163
+ options: {
164
+ driver: { type: "string" },
165
+ module: { type: "string" },
166
+ profile: { type: "string" },
167
+ environment: { type: "string" },
168
+ cwd: { type: "string" },
169
+ model: { type: "string" },
170
+ "permission-mode": { type: "string" },
171
+ "claude-path": { type: "string" },
172
+ sandbox: { type: "string" },
173
+ "approval-policy": { type: "string" },
174
+ "codex-path": { type: "string" }
175
+ }
176
+ });
177
+ }
178
+ __name(parse, "parse");
179
+ function stopOnSignals(runner) {
180
+ let stopping = false;
181
+ const onSignal = /* @__PURE__ */ __name((signal) => {
182
+ if (stopping) process.exit(1);
183
+ stopping = true;
184
+ console.error(`canon-agent: ${signal}, stopping.`);
185
+ runner.stop().then(() => process.exit(0), (error) => {
186
+ console.error(`canon-agent: ${error instanceof Error ? error.message : String(error)}`);
187
+ process.exit(1);
188
+ });
189
+ }, "onSignal");
190
+ process.on("SIGTERM", onSignal);
191
+ process.on("SIGINT", onSignal);
192
+ }
193
+ __name(stopOnSignals, "stopOnSignals");
194
+ runCli(import.meta.url, main, (error) => {
195
+ console.error(`canon-agent: ${error instanceof Error ? error.message : String(error)}`);
196
+ if (error instanceof UsageError) console.error(HELP.split("\n\nFlags:")[0]);
197
+ process.exit(1);
198
+ }, { name: "canon-agent", help: HELP });
@@ -0,0 +1,36 @@
1
+ import { type RuntimeDriver } from '../runner/types.js';
2
+ /** The Claude Agent SDK's `query()` as the driver uses it: one prompt, one native turn. */
3
+ export type ClaudeQuery = (params: {
4
+ prompt: string;
5
+ options: Record<string, unknown>;
6
+ }) => AsyncIterable<unknown> & {
7
+ interrupt(): Promise<void>;
8
+ close(): void;
9
+ };
10
+ export interface ClaudeDriverOptions {
11
+ /** The directory Claude Code works in. The agent may also send files from it. */
12
+ cwd: string;
13
+ /** A model id; Claude Code's default otherwise. */
14
+ model?: string;
15
+ /**
16
+ * `default` (the default) puts every tool call Claude Code would ask about to the owner as a Canon approval.
17
+ * `acceptEdits` and `bypassPermissions` approve more on their own. In every mode, a turn holding anyone else's message
18
+ * may use only Canon's tools, AskUserQuestion and ToolSearch.
19
+ */
20
+ permissionMode?: 'default' | 'acceptEdits' | 'bypassPermissions';
21
+ /** A Claude Code executable to run instead of the one bundled with the SDK. */
22
+ claudePath?: string;
23
+ /** How long an interrupted Claude Code may take to stop before its process is closed (default 5 s). */
24
+ interruptGraceMs?: number;
25
+ /** The SDK's `query()` (see `loadClaudeQuery`), loaded on the first turn when unset; tests pass a stand-in. */
26
+ query?: ClaudeQuery;
27
+ }
28
+ /** Loads the SDK's `query()`; it is an optional peer dependency, installed by whoever runs the `claude` driver. */
29
+ export declare function loadClaudeQuery(): Promise<ClaudeQuery>;
30
+ /**
31
+ * Runs each turn as one Claude Agent SDK `query()` that resumes the room's native session, whose id the runner keeps in
32
+ * the driver state. Canon's tools reach Claude only through the runner's per-turn MCP server; Stop interrupts the native
33
+ * turn and closes its process if it does not stop. One process per session at a time: a room's next turn starts only
34
+ * after the previous one has exited.
35
+ */
36
+ export declare function claudeDriver(options: ClaudeDriverOptions): RuntimeDriver;
@@ -0,0 +1,18 @@
1
+ import type { ActivityEvent, AskAnswer, AskRequest, DriverCapabilities, DriverResult, DriverState, RuntimeDriver, TurnInput, TurnTools } from '../runner/types.js';
2
+ /** The `DriverTurn` an in-process handler sees, with friendlier names. */
3
+ export interface CodeTurn {
4
+ readonly input: TurnInput;
5
+ readonly prompt: string;
6
+ readonly files: readonly string[];
7
+ readonly signal: AbortSignal;
8
+ /** The full visible answer so far; a preview, never the final. */
9
+ stream(text: string): void;
10
+ activity(event: ActivityEvent): void;
11
+ ask(request: AskRequest): Promise<AskAnswer>;
12
+ readonly state: DriverState;
13
+ readonly tools: TurnTools;
14
+ }
15
+ /** Return the turn's one final: text, `null` for deliberate silence, or text with files. */
16
+ export type CodeHandler = (turn: CodeTurn) => Promise<string | null | DriverResult> | string | null | DriverResult;
17
+ /** Runs a turn as an in-process function. The runner owns every Canon behaviour around it. */
18
+ export declare function codeDriver(handler: CodeHandler, capabilities?: Partial<DriverCapabilities>): RuntimeDriver;
@@ -0,0 +1,37 @@
1
+ import { type DriverTurn, type RuntimeDriver } from '../runner/types.js';
2
+ export interface CodexDriverOptions {
3
+ /** The directory Codex works in. The agent may also send files from it. */
4
+ cwd: string;
5
+ /** A model id; Codex's configured default otherwise. */
6
+ model?: string;
7
+ /** Codex's sandbox for the owner's turns: `workspace-write` (the default), `read-only` or `danger-full-access`. */
8
+ sandbox?: 'read-only' | 'workspace-write' | 'danger-full-access';
9
+ /**
10
+ * When Codex asks before acting in the owner's turns: `on-request` (the default), `untrusted` or `never`. Each request
11
+ * becomes a Canon approval. A turn holding anyone else's message is always read-only and approves nothing.
12
+ */
13
+ approvalPolicy?: 'untrusted' | 'on-request' | 'never';
14
+ /** The Codex CLI (default: `codex` on the PATH). */
15
+ codexPath?: string;
16
+ /** How long an interrupted Codex may take to stop before its process is closed (default 5 s). */
17
+ interruptGraceMs?: number;
18
+ }
19
+ type Json = Record<string, unknown>;
20
+ /** Checks the Codex CLI runs at all; the CLI calls it at startup so a missing install fails at once. */
21
+ export declare function checkCodex(codexPath?: string): string;
22
+ /**
23
+ * Codex's requests to its client, from the turn's thread or a subagent's. Approvals are scoped to exactly what they
24
+ * allow: a session approval covers the same command with the same directory, network destination and permissions, the
25
+ * same set of files or the same MCP tool, never "commands". A request whose scope is not fully known is approved once.
26
+ * `rpcId` is the request's own JSON-RPC id, the identity of a request that names no item.
27
+ */
28
+ export declare function answerCodexRequest(turn: DriverTurn, method: string, params: Json, items: Map<string, Json>, rpcId: unknown): Promise<unknown>;
29
+ /**
30
+ * Runs each turn as one `codex app-server` process that resumes the room's Codex thread, whose id the runner keeps in
31
+ * the driver state, and exits after the turn. Settings that differ per turn (Canon's tool URL and token, the guard for
32
+ * turns holding anyone else's message) are thread settings, so a fresh process per turn applies them exactly. Canon's
33
+ * tools reach Codex only as the turn's `canon` MCP server; Stop interrupts the native turn and closes a process that
34
+ * does not stop. A room's next turn starts only after the previous process has exited.
35
+ */
36
+ export declare function codexDriver(options: CodexDriverOptions): RuntimeDriver;
37
+ export {};
package/dist/index.d.ts CHANGED
@@ -1,27 +1,14 @@
1
- export { CanonAgent } from './canon-agent.js';
2
- export { createCanonManagedSessionHost } from './managed-session-host.js';
3
- export type { CanonManagedSessionHostOptions } from './managed-session-host.js';
4
- export { MANAGED_EXECUTION_MODE_LABELS, buildManagedSessionCatalog, configureManagedSession, findManagedSessionState, hasSavedNativeSession, inspectGitEnvironment, managedSessionFields, observedSessionFields, savedSessionFields, savedSessionMatchesOwner, } from './managed-session-setup.js';
5
- export type { ManagedSessionConfiguredFacts, ManagedSessionProject, ManagedSessionRuntime, } from './managed-session-setup.js';
6
- export { clearPendingRegistration, ensureAgentProfile, resumeRegistration } from '@canonmsg/core';
7
- export type { EnsureAgentProfileOptions, RegistrationCredentials, RegistrationProgress, RegistrationSession, RegistrationStatus, RegistrationStore, ResumeRegistrationOptions } from '@canonmsg/core';
8
- export type { AgentContactsAPI, AgentConversationsAPI, AgentDirectoryAPI, AgentUsersAPI, } from './canon-agent.js';
9
- export { ApprovalManager, buildApprovalOutcome, buildApprovalReply, buildApprovalRequest, CanonApiError, DEFAULT_APPROVAL_CONFIG, generateApprovalId, HOST_ADMISSION_ACTION_CAPABILITIES, HOST_ADMISSION_ACTIONS_DISABLED, parseApprovalReplyMetadata, parseApprovalRequestMetadata, parseSessionRule, redactSecrets, } from '@canonmsg/core';
10
- export type { ApprovalConfig, ApprovalNativeRequestMetadata, ApprovalOutcomeMetadata, ApprovalReplyMetadata, ApprovalRequestCategory, ApprovalRequestDetail, ApprovalRequestMetadata, ApprovalResult, ApprovalRisk, CanonContact, CanonRuntimeActivityItem, CanonRuntimeActivityKind, CanonRuntimeActivityStatus, CanonRuntimeTurnModeActivation, CanonRuntimeTurnModeDescriptor, CanonRuntimeTurnModeScope, CanonRuntimeFact, CanonRuntimeFactGroup, CanonResolveAdmissionResult, CanonAgentDirectoryEntry, ContactAddedPayload, ContactCardPayload, ContactRemovedPayload, ContactSource, DiscoverAgentsInput, DiscoverAgentsResult, HostAdmissionActionCapabilities, ParticipationSuppressedPayload, ResolveAdmissionTargetInput, ResolvedAdmissionState, ResolvedAdmissionTargetSummary, ResolvedTargetAdmissionPayload, ResumableMediaUploadResult, MediaAttachment, VideoProcessingStatus, VideoProcessingErrorCode, RuntimeInputAnswers, RuntimeInputChoice, RuntimeInputKind, RuntimeInputNativeMetadata, RuntimeInputQuestion, RuntimePlanRequestPayload, RuntimePlanRequestResult, SessionRule, } from '@canonmsg/core';
11
- export { SessionManager } from './session-manager.js';
1
+ export { createRunner, runtimeDescriptor } from './runner/runner.js';
2
+ export type { Runner, RunnerOptions } from './runner/runner.js';
3
+ export { DriverSessionError } from './runner/types.js';
4
+ export type { ActivityEvent, AskAnswer, AskRequest, DriverCapabilities, DriverResult, DriverState, DriverTurn, RuntimeDriver, ToolDefinition, ToolResult, TurnInput, TurnInputMessage, TurnTools, } from './runner/types.js';
5
+ export { codeDriver } from './drivers/code.js';
6
+ export type { CodeHandler, CodeTurn } from './drivers/code.js';
7
+ export { claudeDriver, loadClaudeQuery } from './drivers/claude.js';
8
+ export type { ClaudeDriverOptions, ClaudeQuery } from './drivers/claude.js';
9
+ export { checkCodex, codexDriver } from './drivers/codex.js';
10
+ export type { CodexDriverOptions } from './drivers/codex.js';
11
+ export { CanonApiError, clearPendingRegistration, ensureAgentProfile, resumeRegistration } from './internal/core/index.js';
12
+ export type { CommunicateInput, CommunicateResult, EnsureAgentProfileOptions, MediaAttachment, RegistrationCredentials, RegistrationProgress, RegistrationSession, RegistrationStatus, RegistrationStore, ResumableMediaUploadResult, ResumeRegistrationOptions, VideoProcessingErrorCode, VideoProcessingStatus, } from './internal/core/index.js';
12
13
  export { DEFAULT_ANTHROPIC_REQUEST_HEADROOM_BYTES, DEFAULT_MEDIA_CACHE_DIR, DEFAULT_MEDIA_MATERIALIZATION_BYTES, MAX_ANTHROPIC_IMAGE_RAW_BYTES, MAX_ANTHROPIC_REQUEST_BYTES, MAX_CANON_MEDIA_BYTES, getCodexImagePath, getMessageAttachments, inferUploadMimeType, isAnthropicImageAttachment, conversationMediaCacheDir, materializeAttachment, materializeMessageMedia, materializeReplyContextMedia, resolveAttachmentMimeType, sendMediaFileMessage, toAnthropicImageBlock, toAnthropicImageBlocksWithinBudget, uploadMediaFile, } from './media.js';
13
14
  export type { AnthropicImageBlock, AnthropicImageBudgetOptions, AnthropicImageMimeType, MaterializeMediaOptions, MaterializedCanonAttachment, MaterializedCanonReplyContext, ReplyWithFileOptions, UploadMediaFileOptions, } from './media.js';
14
- export type { SessionConfig, Session } from './session-manager.js';
15
- export type { CanonAgentTurnVerbosityOption } from './turn-verbosity-option.js';
16
- export type { AgentContext, CanonGroupContext, CanonKnownRecentParticipant, CanonMembershipChange, CanonMessage, CanonConversation, CommunicateInput, CommunicateResult, DirectConversationSelection, CanonConversationsPage, CanonConversationsPageOptions, CanonReplyContext, CanonSelfContext, CanonTurnContextV2, CanonRuntimeDescriptor, MessageUpdatedPayload, SendMessageOptions, CreateGroupOptions, CreateGroupResult, TurnVerbosity, TurnVerbosityConfig, } from '@canonmsg/core';
17
- export type { CanonAgentConnectionOptions, CanonAgentOptions, ContactAddedHandler, ContactRemovedHandler, FinalMessageResult, MessageHandler, MessageHandlerContext, MessageUpdatedHandler, ParticipationSuppressedHandler, ProgressMessageOptions, ProgressMessageResult, RuntimeApprovalRequest, RuntimeInputRequest, RuntimeInputResult, RuntimePlanReviewRequest, RuntimePlanReviewResult, RuntimeControlSurface, RuntimePrimitiveContext, RuntimePrimitiveHandler, RuntimePrimitiveHandlers, SessionInfo, SessionOptions, DeliveryMode, } from './types.js';
18
- export { createCanonAttachedSession, createCanonAttachedSessionPublisher } from './attached-session.js';
19
- export { createCanonWorkSessionHost } from './work-session-host.js';
20
- export type { CanonWorkSessionHost, CanonWorkSessionHostOptions } from './work-session-host.js';
21
- export { createFileWorkSessionHostStore } from './work-session-state.js';
22
- export type { WorkSessionHostStore, WorkSessionHostJournal } from './work-session-state.js';
23
- export { createFileAttachedSessionStore } from '@canonmsg/core';
24
- export type { CanonAttachedSession, CanonAttachedSessionConnection, CanonAttachedSessionOptions, CanonAttachedSessionStatus, } from './attached-session.js';
25
- export type { AttachedNativeSessionAdapter, AttachedSessionBinding, AttachedSessionJournal, AttachedSessionState, AttachedSessionStore, NativeSessionEvent, NativeSessionItem, NativeSessionSnapshot, NativeSubmissionResult, } from '@canonmsg/core';
26
- export { ARTIFACT_CONTEXT_PROTOCOL, ARTIFACT_LIMITS, CanonArtifactError, isCanonArtifactEnvironmentEnabled, parseArtifactContext, readArtifactContext, } from '@canonmsg/core';
27
- export type { CanonConversationArtifacts, CanonArtifactErrorCode, ArtifactConflictView, ArtifactDomainOutcome, ArtifactCreateInput, ArtifactUpdateAction, ArtifactUpdateResult, ArtifactWriteView, ArtifactInputValue, ArtifactList, ArtifactListItem, ArtifactGenerateImageInput, ArtifactGenerateImageResult, ArtifactAddImageInput, ArtifactAddImageResult, ArtifactImageRegion, ArtifactAsset, ArtifactView, ArtifactPrincipalView, ArtifactChessView, ArtifactChessMoveView, ArtifactFormView, ArtifactFormFieldView, ArtifactFormChangeView, ArtifactImageView, ArtifactImageVariantView, ArtifactKind, ArtifactFormField, ArtifactFormFieldType, ArtifactFormValue, ArtifactFormTable, ArtifactFormColumn, ArtifactContext, ArtifactReference, ArtifactReferenceOrigin, ArtifactSelection, } from '@canonmsg/core';
package/dist/index.js CHANGED
@@ -1,13 +1,69 @@
1
- export { CanonAgent } from './canon-agent.js';
2
- export { createCanonManagedSessionHost } from './managed-session-host.js';
3
- export { MANAGED_EXECUTION_MODE_LABELS, buildManagedSessionCatalog, configureManagedSession, findManagedSessionState, hasSavedNativeSession, inspectGitEnvironment, managedSessionFields, observedSessionFields, savedSessionFields, savedSessionMatchesOwner, } from './managed-session-setup.js';
4
- export { clearPendingRegistration, ensureAgentProfile, resumeRegistration } from '@canonmsg/core';
5
- export { ApprovalManager, buildApprovalOutcome, buildApprovalReply, buildApprovalRequest, CanonApiError, DEFAULT_APPROVAL_CONFIG, generateApprovalId, HOST_ADMISSION_ACTION_CAPABILITIES, HOST_ADMISSION_ACTIONS_DISABLED, parseApprovalReplyMetadata, parseApprovalRequestMetadata, parseSessionRule, redactSecrets, } from '@canonmsg/core';
6
- export { SessionManager } from './session-manager.js';
7
- export { DEFAULT_ANTHROPIC_REQUEST_HEADROOM_BYTES, DEFAULT_MEDIA_CACHE_DIR, DEFAULT_MEDIA_MATERIALIZATION_BYTES, MAX_ANTHROPIC_IMAGE_RAW_BYTES, MAX_ANTHROPIC_REQUEST_BYTES, MAX_CANON_MEDIA_BYTES, getCodexImagePath, getMessageAttachments, inferUploadMimeType, isAnthropicImageAttachment, conversationMediaCacheDir, materializeAttachment, materializeMessageMedia, materializeReplyContextMedia, resolveAttachmentMimeType, sendMediaFileMessage, toAnthropicImageBlock, toAnthropicImageBlocksWithinBudget, uploadMediaFile, } from './media.js';
8
- export { createCanonAttachedSession, createCanonAttachedSessionPublisher } from './attached-session.js';
9
- export { createCanonWorkSessionHost } from './work-session-host.js';
10
- export { createFileWorkSessionHostStore } from './work-session-state.js';
11
- export { createFileAttachedSessionStore } from '@canonmsg/core';
12
- // Shared work (Dev-only preview): `ctx.artifacts` is `CanonClient.artifacts(conversationId)`.
13
- export { ARTIFACT_CONTEXT_PROTOCOL, ARTIFACT_LIMITS, CanonArtifactError, isCanonArtifactEnvironmentEnabled, parseArtifactContext, readArtifactContext, } from '@canonmsg/core';
1
+ import {
2
+ DriverSessionError,
3
+ checkCodex,
4
+ claudeDriver,
5
+ codeDriver,
6
+ codexDriver,
7
+ createRunner,
8
+ loadClaudeQuery,
9
+ runtimeDescriptor
10
+ } from "./chunks/chunk-6VK4UZHJ.js";
11
+ import {
12
+ CanonApiError,
13
+ DEFAULT_ANTHROPIC_REQUEST_HEADROOM_BYTES,
14
+ DEFAULT_MEDIA_CACHE_DIR,
15
+ DEFAULT_MEDIA_MATERIALIZATION_BYTES,
16
+ MAX_ANTHROPIC_IMAGE_RAW_BYTES,
17
+ MAX_ANTHROPIC_REQUEST_BYTES,
18
+ MAX_CANON_MEDIA_BYTES,
19
+ clearPendingRegistration,
20
+ conversationMediaCacheDir,
21
+ ensureAgentProfile,
22
+ getCodexImagePath,
23
+ getMessageAttachments,
24
+ inferUploadMimeType,
25
+ isAnthropicImageAttachment,
26
+ materializeAttachment,
27
+ materializeMessageMedia,
28
+ materializeReplyContextMedia,
29
+ resolveAttachmentMimeType,
30
+ resumeRegistration,
31
+ sendMediaFileMessage,
32
+ toAnthropicImageBlock,
33
+ toAnthropicImageBlocksWithinBudget,
34
+ uploadMediaFile
35
+ } from "./chunks/chunk-OLJ7H4E2.js";
36
+ import "./chunks/chunk-FPQFTTND.js";
37
+ export {
38
+ CanonApiError,
39
+ DEFAULT_ANTHROPIC_REQUEST_HEADROOM_BYTES,
40
+ DEFAULT_MEDIA_CACHE_DIR,
41
+ DEFAULT_MEDIA_MATERIALIZATION_BYTES,
42
+ DriverSessionError,
43
+ MAX_ANTHROPIC_IMAGE_RAW_BYTES,
44
+ MAX_ANTHROPIC_REQUEST_BYTES,
45
+ MAX_CANON_MEDIA_BYTES,
46
+ checkCodex,
47
+ claudeDriver,
48
+ clearPendingRegistration,
49
+ codeDriver,
50
+ codexDriver,
51
+ conversationMediaCacheDir,
52
+ createRunner,
53
+ ensureAgentProfile,
54
+ getCodexImagePath,
55
+ getMessageAttachments,
56
+ inferUploadMimeType,
57
+ isAnthropicImageAttachment,
58
+ loadClaudeQuery,
59
+ materializeAttachment,
60
+ materializeMessageMedia,
61
+ materializeReplyContextMedia,
62
+ resolveAttachmentMimeType,
63
+ resumeRegistration,
64
+ runtimeDescriptor,
65
+ sendMediaFileMessage,
66
+ toAnthropicImageBlock,
67
+ toAnthropicImageBlocksWithinBudget,
68
+ uploadMediaFile
69
+ };
@@ -0,0 +1,122 @@
1
+ /** Conversation scope a policy is resolved for. Absent means "agent scope". */
2
+ export type PolicyConversationType = 'direct' | 'group' | 'unknown';
3
+ export type ParticipationStyle = 'natural' | 'collaborative' | 'mention-first' | 'approval-gated' | 'handoff-only' | 'observer';
4
+ /**
5
+ * The stored/parsed shape. This is the RETURN type of
6
+ * {@link parseAgentBehaviorSettings} and {@link normalizeStoredAgentBehaviorPolicy},
7
+ * so its optional fields deliberately stay `T | undefined` — widening them to
8
+ * `T | null` would be a breaking change for every reader of those results.
9
+ * Parameter positions take {@link AgentBehaviorSettingsInput} instead.
10
+ */
11
+ export interface AgentBehaviorSettingsRecord {
12
+ participationStyle?: ParticipationStyle;
13
+ allowAgentToAgent?: boolean;
14
+ allowLongRunningCollaboration?: boolean;
15
+ requireMentionForGroupReplies?: boolean;
16
+ maxConsecutiveAgentTurns?: number | null;
17
+ instructions?: string | null;
18
+ }
19
+ /**
20
+ * The input shape accepted by {@link resolveAgentBehaviorPolicy}. Every field
21
+ * additionally accepts an explicit `null` (an editor clearing a value), which
22
+ * coalesces exactly like `undefined` — the field falls through to the next
23
+ * layer. {@link AgentBehaviorSettingsRecord} is assignable to this type.
24
+ */
25
+ export interface AgentBehaviorSettingsInput {
26
+ participationStyle?: ParticipationStyle | null;
27
+ allowAgentToAgent?: boolean | null;
28
+ allowLongRunningCollaboration?: boolean | null;
29
+ requireMentionForGroupReplies?: boolean | null;
30
+ maxConsecutiveAgentTurns?: number | null;
31
+ instructions?: string | null;
32
+ }
33
+ export interface ParticipationPolicy {
34
+ style: ParticipationStyle;
35
+ allowAgentToAgent: boolean;
36
+ allowHumanToAgent: boolean;
37
+ allowLongRunningCollaboration: boolean;
38
+ requireMentionForGroupReplies: boolean;
39
+ maxConsecutiveAgentTurns?: number | null;
40
+ }
41
+ export interface ResolvedAgentBehaviorPolicyRecord {
42
+ participation: ParticipationPolicy;
43
+ instructions: string[];
44
+ source: {
45
+ hasAgentDefault: boolean;
46
+ hasConversationOverride: boolean;
47
+ };
48
+ }
49
+ export interface ParticipationDecisionInput {
50
+ conversationType: PolicyConversationType;
51
+ senderType: 'human' | 'ai_agent';
52
+ isOwner: boolean;
53
+ mentionedAgent: boolean;
54
+ recentHumanCount?: number;
55
+ /**
56
+ * Consecutive agent turns already in the streak, NOT counting the message
57
+ * being evaluated. The message itself adds one more when its sender is an
58
+ * agent, and a delivery would add a further one — see the turn-cap check in
59
+ * {@link evaluateParticipationPolicy}.
60
+ */
61
+ consecutiveAgentTurns?: number;
62
+ currentAgentStreakStartedByHuman?: boolean;
63
+ }
64
+ export interface ParticipationDecision {
65
+ allow: boolean;
66
+ reasonCode: string;
67
+ reason: string;
68
+ }
69
+ export interface ParticipationHistoryMessage {
70
+ id?: string;
71
+ senderId: string;
72
+ senderType: 'human' | 'ai_agent';
73
+ metadata?: unknown;
74
+ }
75
+ export interface ParticipationHistorySnapshot {
76
+ recentSenderTypes: Array<'human' | 'ai_agent'>;
77
+ recentHumanCount: number;
78
+ recentAgentCount: number;
79
+ consecutiveAgentTurns: number;
80
+ currentAgentStreakStartedByHuman: boolean;
81
+ }
82
+ export declare const PARTICIPATION_HISTORY_FETCH_LIMIT = 50;
83
+ /**
84
+ * Safety backstop for conversations with no explicit turn cap: at most this
85
+ * many consecutive agent turns before a human speaks or a new conversation
86
+ * starts.
87
+ *
88
+ * This is a backstop, not the steering wheel — agents are expected to stop on
89
+ * their own. Every triggerable agent message counts in both direct and group
90
+ * conversations. An explicit `null` remains the deployer opt-out for trusted,
91
+ * intentionally long-running collaboration.
92
+ */
93
+ export declare const DEFAULT_GROUP_MAX_CONSECUTIVE_AGENT_TURNS = 4;
94
+ export declare const DEFAULT_DIRECT_MAX_CONSECUTIVE_AGENT_TURNS = 4;
95
+ export declare function parseAgentBehaviorSettings(raw: unknown): AgentBehaviorSettingsRecord;
96
+ export declare function normalizeStoredAgentBehaviorPolicy(raw: Record<string, unknown> | undefined): AgentBehaviorSettingsRecord | null;
97
+ export declare function normalizeAgentBehaviorInstructions(value: string | null | undefined): string | null;
98
+ /**
99
+ * The scope-independent participation defaults. `maxConsecutiveAgentTurns` is
100
+ * `null` here because the turn cap is scope-dependent — a conversation with no
101
+ * stored setting resolves to its direct or group safety default. Use
102
+ * {@link resolveAgentBehaviorPolicy} with a `conversationType` to learn what a
103
+ * given conversation actually enforces.
104
+ */
105
+ export declare function getDefaultParticipationPolicy(): ParticipationPolicy;
106
+ /**
107
+ * Coalesce agent defaults and a conversation override into the resolved record
108
+ * every runtime reads. `conversationType` selects the Canon-wide fallbacks that
109
+ * differ per scope — today only the turn cap, which defaults to 4 in direct and
110
+ * group conversations and to unlimited elsewhere. Omit it when resolving for
111
+ * the agent scope (no conversation);
112
+ * an absent or unknown type always resolves to the unlimited default, so a call
113
+ * site that forgets to thread it can never invent a cap.
114
+ */
115
+ export declare function resolveAgentBehaviorPolicy(params?: {
116
+ agentDefault?: AgentBehaviorSettingsInput | null;
117
+ conversationOverride?: AgentBehaviorSettingsInput | null;
118
+ conversationType?: PolicyConversationType;
119
+ }): ResolvedAgentBehaviorPolicyRecord;
120
+ export declare function buildParticipationHistorySnapshot(messages: ParticipationHistoryMessage[], agentId?: string): ParticipationHistorySnapshot;
121
+ export declare function appendParticipationHistoryMessage(snapshot: ParticipationHistorySnapshot, message: ParticipationHistoryMessage, limit?: number): ParticipationHistorySnapshot;
122
+ export declare function evaluateParticipationPolicy(policy: ResolvedAgentBehaviorPolicyRecord | null | undefined, input: ParticipationDecisionInput): ParticipationDecision;
@@ -0,0 +1,32 @@
1
+ import type { CommunicationRule } from './communication.js';
2
+ import type { AgentOrigin } from './agentOrigin.js';
3
+ /** Shared paging bounds for Canon's discoverable-agent directory. */
4
+ export declare const DEFAULT_DISCOVER_AGENTS_LIMIT = 20;
5
+ export declare const MAX_DISCOVER_AGENTS_LIMIT = 25;
6
+ export declare const MAX_DISCOVER_AGENTS_QUERY_LENGTH = 64;
7
+ export interface DiscoverAgentsInput {
8
+ query?: string;
9
+ limit?: number;
10
+ cursor?: string | null;
11
+ }
12
+ /** Public, addressable identity returned to an authenticated agent caller. */
13
+ export interface CanonAgentDirectoryEntry {
14
+ principalId: string;
15
+ canonContactId?: string;
16
+ displayName?: string;
17
+ description?: string;
18
+ /** Self-reported source attribution; never an identity or verification claim. */
19
+ origin?: AgentOrigin;
20
+ /** Human principal accountable for this agent. */
21
+ owner: {
22
+ principalId: string;
23
+ displayName?: string;
24
+ };
25
+ inboundPolicy?: CommunicationRule;
26
+ groupJoinPolicy?: CommunicationRule;
27
+ shareable: boolean;
28
+ }
29
+ export interface DiscoverAgentsResult {
30
+ agents: CanonAgentDirectoryEntry[];
31
+ nextCursor: string | null;
32
+ }
@@ -0,0 +1,23 @@
1
+ /** Public attribution supplied by an agent's developer or connecting client.
2
+ * It describes where an agent came from, never its Canon identity, permissions,
3
+ * uniqueness, or a verified relationship with the named service. */
4
+ export interface AgentOriginDeclaration {
5
+ name: string;
6
+ /** Optional public reference link. Canon does not use it to connect or authenticate. */
7
+ url?: string;
8
+ }
9
+ /** Canon records how it received the declaration. The name and URL remain
10
+ * self-reported, including when an OAuth client supplied them. */
11
+ export interface AgentOrigin extends AgentOriginDeclaration {
12
+ reportedBy: 'registration' | 'connector';
13
+ }
14
+ export declare const MAX_AGENT_ORIGIN_NAME_LENGTH = 120;
15
+ export declare const MAX_AGENT_ORIGIN_URL_LENGTH = 2048;
16
+ /** Strict write-boundary parser. A supplied invalid declaration must be rejected
17
+ * by its caller; absent origin remains optional for existing and custom agents.
18
+ * Unknown fields are rejected, so callers cannot supply Canon's provenance or
19
+ * assert verification. The result is a fresh, normalized value. */
20
+ export declare function parseAgentOriginDeclaration(value: unknown): AgentOriginDeclaration | null;
21
+ /** Closed projection for a stored/public origin. Missing or malformed legacy
22
+ * data returns null; it must not be guessed from an agent's name or client type. */
23
+ export declare function parseAgentOrigin(value: unknown): AgentOrigin | null;
@@ -0,0 +1,17 @@
1
+ /** The indexable fields a stored agent contributes to `searchPrefixes`. */
2
+ export interface AgentSearchIndexFields {
3
+ displayName?: string | null;
4
+ description?: string | null;
5
+ }
6
+ /** The agent shape a directory filter reads. */
7
+ export interface AgentSearchProfile {
8
+ displayName?: string | null;
9
+ agentConfig?: {
10
+ description?: string | null;
11
+ } | null;
12
+ }
13
+ /** Tolerant: non-string input normalises to ''. */
14
+ export declare function normalizeAgentDirectoryQuery(value: unknown): string;
15
+ export declare function getAgentDirectoryQueryTokens(query: string): string[];
16
+ export declare function buildAgentSearchPrefixes(input: AgentSearchIndexFields): string[];
17
+ export declare function matchesAgentSearchQuery(profile: AgentSearchProfile, query: string): boolean;
@@ -0,0 +1,4 @@
1
+ export declare const CANON_API_ORIGINS: {
2
+ readonly "canon-dev-v1": "https://dev.api.canonmail.com";
3
+ readonly "canon-prod-v1": "https://api.canonmail.com";
4
+ };
@@ -0,0 +1 @@
1
+ export declare const MESSAGE_ADMISSION_REQUIRED_CODE: "MESSAGE_ADMISSION_REQUIRED";