@poolzin/pool-bot 2026.2.0 → 2026.2.2

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 (258) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README-header.png +0 -0
  3. package/dist/agents/bash-tools.exec.js +76 -25
  4. package/dist/agents/cli-runner/helpers.js +9 -11
  5. package/dist/agents/context.js +1 -1
  6. package/dist/agents/identity.js +47 -7
  7. package/dist/agents/memory-search.js +25 -8
  8. package/dist/agents/model-catalog.js +1 -1
  9. package/dist/agents/model-selection.js +21 -0
  10. package/dist/agents/pi-embedded-block-chunker.js +117 -42
  11. package/dist/agents/pi-embedded-helpers/errors.js +183 -78
  12. package/dist/agents/pi-embedded-helpers.js +1 -1
  13. package/dist/agents/pi-embedded-runner/compact.js +8 -10
  14. package/dist/agents/pi-embedded-runner/model.js +62 -3
  15. package/dist/agents/pi-embedded-runner/run/attempt.js +21 -11
  16. package/dist/agents/pi-embedded-runner/run.js +199 -46
  17. package/dist/agents/pi-embedded-runner/system-prompt.js +10 -2
  18. package/dist/agents/pi-embedded-subscribe.js +118 -29
  19. package/dist/agents/pi-tools.js +10 -5
  20. package/dist/agents/poolbot-tools.js +15 -10
  21. package/dist/agents/sandbox-paths.js +31 -0
  22. package/dist/agents/session-tool-result-guard.js +94 -15
  23. package/dist/agents/shell-utils.js +51 -0
  24. package/dist/agents/skills/bundled-context.js +23 -0
  25. package/dist/agents/skills/bundled-dir.js +41 -7
  26. package/dist/agents/skills-install.js +60 -23
  27. package/dist/agents/subagent-announce.js +79 -34
  28. package/dist/agents/tool-policy.conformance.js +14 -0
  29. package/dist/agents/tool-policy.js +24 -0
  30. package/dist/agents/tools/cron-tool.js +166 -19
  31. package/dist/agents/tools/discord-actions-presence.js +78 -0
  32. package/dist/agents/tools/image-tool.js +1 -1
  33. package/dist/agents/tools/message-tool.js +56 -2
  34. package/dist/agents/tools/sessions-history-tool.js +69 -1
  35. package/dist/agents/tools/web-search.js +211 -42
  36. package/dist/agents/usage.js +23 -1
  37. package/dist/agents/workspace-run.js +67 -0
  38. package/dist/agents/workspace-templates.js +44 -0
  39. package/dist/auto-reply/command-auth.js +121 -6
  40. package/dist/auto-reply/envelope.js +74 -82
  41. package/dist/auto-reply/reply/commands-compact.js +1 -0
  42. package/dist/auto-reply/reply/commands-context-report.js +1 -0
  43. package/dist/auto-reply/reply/commands-context.js +1 -0
  44. package/dist/auto-reply/reply/commands-models.js +107 -60
  45. package/dist/auto-reply/reply/commands-ptt.js +171 -0
  46. package/dist/auto-reply/reply/get-reply-run.js +2 -1
  47. package/dist/auto-reply/reply/inbound-context.js +5 -1
  48. package/dist/auto-reply/reply/mentions.js +1 -1
  49. package/dist/auto-reply/reply/model-selection.js +3 -3
  50. package/dist/auto-reply/thinking.js +88 -43
  51. package/dist/browser/bridge-server.js +13 -0
  52. package/dist/browser/cdp.helpers.js +38 -24
  53. package/dist/browser/client-fetch.js +50 -7
  54. package/dist/browser/config.js +1 -10
  55. package/dist/browser/extension-relay.js +101 -40
  56. package/dist/browser/pw-ai.js +1 -1
  57. package/dist/browser/pw-session.js +143 -8
  58. package/dist/browser/pw-tools-core.interactions.js +125 -27
  59. package/dist/browser/pw-tools-core.responses.js +1 -1
  60. package/dist/browser/pw-tools-core.state.js +1 -1
  61. package/dist/browser/routes/agent.act.js +86 -41
  62. package/dist/browser/routes/dispatcher.js +4 -4
  63. package/dist/browser/screenshot.js +1 -1
  64. package/dist/browser/server.js +13 -0
  65. package/dist/build-info.json +3 -3
  66. package/dist/canvas-host/a2ui/index.html +28 -28
  67. package/dist/channels/reply-prefix.js +8 -1
  68. package/dist/cli/cron-cli/register.cron-add.js +61 -40
  69. package/dist/cli/cron-cli/register.cron-edit.js +60 -34
  70. package/dist/cli/cron-cli/shared.js +56 -41
  71. package/dist/cli/dns-cli.js +26 -14
  72. package/dist/cli/gateway-cli/register.js +37 -19
  73. package/dist/cli/memory-cli.js +5 -5
  74. package/dist/cli/parse-bytes.js +37 -0
  75. package/dist/cli/update-cli.js +173 -52
  76. package/dist/commands/agent.js +1 -0
  77. package/dist/commands/auth-choice.apply.oauth.js +1 -1
  78. package/dist/commands/doctor-config-flow.js +61 -5
  79. package/dist/commands/doctor-state-migrations.js +1 -1
  80. package/dist/commands/health.js +1 -1
  81. package/dist/commands/model-allowlist.js +29 -0
  82. package/dist/commands/model-picker.js +2 -1
  83. package/dist/commands/models/list.registry.js +1 -1
  84. package/dist/commands/models/list.status-command.js +43 -23
  85. package/dist/commands/models/shared.js +15 -0
  86. package/dist/commands/onboard-custom.js +384 -0
  87. package/dist/commands/onboard-non-interactive/local/auth-choice-inference.js +35 -0
  88. package/dist/commands/onboard-non-interactive/local/auth-choice.js +6 -3
  89. package/dist/commands/onboard-skills.js +63 -38
  90. package/dist/commands/openai-model-default.js +41 -0
  91. package/dist/compat/legacy-names.js +2 -0
  92. package/dist/config/defaults.js +3 -2
  93. package/dist/config/paths.js +136 -35
  94. package/dist/config/plugin-auto-enable.js +21 -5
  95. package/dist/config/redact-snapshot.js +153 -0
  96. package/dist/config/schema.field-metadata.js +590 -0
  97. package/dist/config/schema.js +2 -2
  98. package/dist/config/sessions/store.js +291 -23
  99. package/dist/config/zod-schema.agent-defaults.js +3 -0
  100. package/dist/config/zod-schema.agent-runtime.js +13 -2
  101. package/dist/config/zod-schema.providers-core.js +142 -0
  102. package/dist/config/zod-schema.session.js +3 -0
  103. package/dist/control-ui/assets/{index-CIRDm-Lu.css → index-CSfXd2LO.css} +1 -1
  104. package/dist/control-ui/assets/{index-CmNMuoem.js → index-HRr1grwl.js} +446 -413
  105. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -0
  106. package/dist/control-ui/index.html +4 -4
  107. package/dist/cron/delivery.js +57 -0
  108. package/dist/cron/isolated-agent/delivery-target.js +18 -3
  109. package/dist/cron/isolated-agent/helpers.js +22 -5
  110. package/dist/cron/isolated-agent/run.js +172 -63
  111. package/dist/cron/isolated-agent/session.js +2 -0
  112. package/dist/cron/normalize.js +356 -28
  113. package/dist/cron/parse.js +10 -5
  114. package/dist/cron/run-log.js +35 -10
  115. package/dist/cron/schedule.js +41 -6
  116. package/dist/cron/service/jobs.js +208 -35
  117. package/dist/cron/service/ops.js +72 -16
  118. package/dist/cron/service/state.js +2 -0
  119. package/dist/cron/service/store.js +386 -14
  120. package/dist/cron/service/timer.js +390 -147
  121. package/dist/cron/session-reaper.js +86 -0
  122. package/dist/cron/store.js +23 -8
  123. package/dist/cron/validate-timestamp.js +43 -0
  124. package/dist/discord/monitor/agent-components.js +438 -0
  125. package/dist/discord/monitor/allow-list.js +28 -5
  126. package/dist/discord/monitor/gateway-registry.js +29 -0
  127. package/dist/discord/monitor/native-command.js +44 -23
  128. package/dist/discord/monitor/sender-identity.js +45 -0
  129. package/dist/discord/pluralkit.js +27 -0
  130. package/dist/discord/send.outbound.js +92 -5
  131. package/dist/discord/send.shared.js +60 -23
  132. package/dist/discord/targets.js +84 -1
  133. package/dist/entry.js +15 -9
  134. package/dist/extensionAPI.js +8 -0
  135. package/dist/gateway/control-ui.js +8 -1
  136. package/dist/gateway/hooks-mapping.js +3 -0
  137. package/dist/gateway/hooks.js +65 -0
  138. package/dist/gateway/net.js +96 -31
  139. package/dist/gateway/node-command-policy.js +50 -15
  140. package/dist/gateway/origin-check.js +56 -0
  141. package/dist/gateway/protocol/client-info.js +9 -0
  142. package/dist/gateway/protocol/index.js +9 -2
  143. package/dist/gateway/protocol/schema/agents-models-skills.js +71 -1
  144. package/dist/gateway/protocol/schema/cron.js +22 -10
  145. package/dist/gateway/protocol/schema/protocol-schemas.js +16 -2
  146. package/dist/gateway/protocol/schema/sessions.js +12 -0
  147. package/dist/gateway/server/hooks.js +1 -1
  148. package/dist/gateway/server-broadcast.js +26 -9
  149. package/dist/gateway/server-chat.js +112 -23
  150. package/dist/gateway/server-discovery-runtime.js +10 -2
  151. package/dist/gateway/server-http.js +109 -11
  152. package/dist/gateway/server-methods/agent-timestamp.js +60 -0
  153. package/dist/gateway/server-methods/agents.js +321 -2
  154. package/dist/gateway/server-methods/usage.js +559 -16
  155. package/dist/gateway/server-runtime-state.js +22 -8
  156. package/dist/gateway/server-startup-memory.js +16 -0
  157. package/dist/gateway/server.impl.js +5 -1
  158. package/dist/gateway/session-utils.fs.js +23 -25
  159. package/dist/gateway/session-utils.js +20 -10
  160. package/dist/gateway/sessions-patch.js +7 -22
  161. package/dist/gateway/test-helpers.mocks.js +11 -7
  162. package/dist/gateway/test-helpers.server.js +35 -2
  163. package/dist/imessage/constants.js +2 -0
  164. package/dist/imessage/monitor/deliver.js +4 -1
  165. package/dist/imessage/monitor/monitor-provider.js +51 -1
  166. package/dist/infra/bonjour-discovery.js +131 -70
  167. package/dist/infra/control-ui-assets.js +134 -12
  168. package/dist/infra/errors.js +12 -0
  169. package/dist/infra/exec-approvals.js +266 -57
  170. package/dist/infra/format-time/format-datetime.js +79 -0
  171. package/dist/infra/format-time/format-duration.js +81 -0
  172. package/dist/infra/format-time/format-relative.js +80 -0
  173. package/dist/infra/heartbeat-runner.js +140 -49
  174. package/dist/infra/home-dir.js +54 -0
  175. package/dist/infra/net/fetch-guard.js +122 -0
  176. package/dist/infra/net/ssrf.js +65 -29
  177. package/dist/infra/outbound/abort.js +14 -0
  178. package/dist/infra/outbound/message-action-runner.js +77 -13
  179. package/dist/infra/outbound/outbound-session.js +143 -37
  180. package/dist/infra/poolbot-root.js +43 -1
  181. package/dist/infra/session-cost-usage.js +631 -41
  182. package/dist/infra/state-migrations.js +317 -47
  183. package/dist/infra/update-global.js +35 -0
  184. package/dist/infra/update-runner.js +149 -43
  185. package/dist/infra/warning-filter.js +65 -0
  186. package/dist/infra/widearea-dns.js +30 -9
  187. package/dist/logging/redact-identifier.js +12 -0
  188. package/dist/media/fetch.js +81 -58
  189. package/dist/media/store.js +2 -0
  190. package/dist/media-understanding/apply.js +403 -3
  191. package/dist/media-understanding/attachments.js +38 -27
  192. package/dist/media-understanding/defaults.js +16 -0
  193. package/dist/media-understanding/providers/deepgram/audio.js +22 -14
  194. package/dist/media-understanding/providers/google/audio.js +24 -17
  195. package/dist/media-understanding/providers/google/video.js +24 -17
  196. package/dist/media-understanding/providers/image.js +3 -3
  197. package/dist/media-understanding/providers/index.js +4 -1
  198. package/dist/media-understanding/providers/openai/audio.js +22 -14
  199. package/dist/media-understanding/providers/shared.js +16 -11
  200. package/dist/media-understanding/providers/zai/index.js +6 -0
  201. package/dist/media-understanding/runner.js +158 -90
  202. package/dist/memory/batch-voyage.js +277 -0
  203. package/dist/memory/embeddings-voyage.js +75 -0
  204. package/dist/memory/embeddings.js +28 -16
  205. package/dist/memory/internal.js +101 -18
  206. package/dist/memory/manager.js +154 -48
  207. package/dist/memory/search-manager.js +173 -0
  208. package/dist/memory/session-files.js +9 -3
  209. package/dist/node-host/runner.js +34 -24
  210. package/dist/node-host/with-timeout.js +27 -0
  211. package/dist/plugins/commands.js +5 -1
  212. package/dist/plugins/config-state.js +86 -7
  213. package/dist/plugins/source-display.js +51 -0
  214. package/dist/process/exec.js +20 -2
  215. package/dist/routing/resolve-route.js +12 -0
  216. package/dist/routing/session-key.js +15 -0
  217. package/dist/runtime.js +2 -0
  218. package/dist/security/audit-extra.async.js +601 -0
  219. package/dist/security/audit-extra.js +2 -830
  220. package/dist/security/audit-extra.sync.js +505 -0
  221. package/dist/security/channel-metadata.js +34 -0
  222. package/dist/security/external-content.js +88 -6
  223. package/dist/security/skill-scanner.js +330 -0
  224. package/dist/sessions/session-key-utils.js +7 -0
  225. package/dist/signal/monitor/event-handler.js +80 -1
  226. package/dist/slack/monitor/media.js +85 -15
  227. package/dist/tailscale/detect.js +1 -2
  228. package/dist/telegram/bot/helpers.js +109 -28
  229. package/dist/telegram/bot-handlers.js +144 -3
  230. package/dist/telegram/bot-message-context.js +37 -10
  231. package/dist/telegram/bot-message-dispatch.js +54 -17
  232. package/dist/telegram/bot-native-commands.js +86 -29
  233. package/dist/telegram/bot.js +30 -29
  234. package/dist/telegram/model-buttons.js +163 -0
  235. package/dist/telegram/monitor.js +110 -85
  236. package/dist/telegram/send.js +129 -47
  237. package/dist/terminal/restore.js +45 -0
  238. package/dist/test-helpers/state-dir-env.js +16 -0
  239. package/dist/tts/tts.js +12 -6
  240. package/dist/tui/tui-session-actions.js +166 -54
  241. package/dist/utils/fetch-timeout.js +20 -0
  242. package/dist/utils/normalize-secret-input.js +19 -0
  243. package/dist/utils/transcript-tools.js +58 -0
  244. package/dist/utils.js +45 -14
  245. package/dist/version.js +42 -5
  246. package/dist/wizard/clack-prompter.js +9 -6
  247. package/extensions/googlechat/node_modules/.bin/poolbot +21 -0
  248. package/extensions/googlechat/package.json +2 -2
  249. package/extensions/line/node_modules/.bin/poolbot +21 -0
  250. package/extensions/line/package.json +1 -1
  251. package/extensions/matrix/node_modules/.bin/poolbot +21 -0
  252. package/extensions/matrix/package.json +1 -1
  253. package/extensions/memory-core/node_modules/.bin/poolbot +21 -0
  254. package/extensions/memory-core/package.json +4 -1
  255. package/extensions/twitch/node_modules/.bin/poolbot +21 -0
  256. package/extensions/twitch/package.json +1 -1
  257. package/package.json +183 -24
  258. package/dist/control-ui/assets/index-CmNMuoem.js.map +0 -1
@@ -0,0 +1,8 @@
1
+ export { resolveAgentDir, resolveAgentWorkspaceDir } from "./agents/agent-scope.js";
2
+ export { DEFAULT_MODEL, DEFAULT_PROVIDER } from "./agents/defaults.js";
3
+ export { resolveAgentIdentity } from "./agents/identity.js";
4
+ export { resolveThinkingDefault } from "./agents/model-selection.js";
5
+ export { runEmbeddedPiAgent } from "./agents/pi-embedded.js";
6
+ export { resolveAgentTimeoutMs } from "./agents/timeout.js";
7
+ export { ensureAgentWorkspace } from "./agents/workspace.js";
8
+ export { resolveStorePath, loadSessionStore, saveSessionStore, resolveSessionFilePath, } from "./config/sessions.js";
@@ -204,7 +204,14 @@ export function handleControlUiHttpRequest(req, res, opts) {
204
204
  if (!pathname.startsWith(`${basePath}/`))
205
205
  return false;
206
206
  }
207
- const root = resolveControlUiRoot();
207
+ const root = (() => {
208
+ if (opts?.root) {
209
+ if (opts.root.kind === "resolved")
210
+ return opts.root.path;
211
+ return null;
212
+ }
213
+ return resolveControlUiRoot();
214
+ })();
208
215
  if (!root) {
209
216
  res.statusCode = 503;
210
217
  res.setHeader("Content-Type", "text/plain; charset=utf-8");
@@ -87,6 +87,7 @@ function normalizeHookMapping(mapping, index, transformsDir) {
87
87
  action,
88
88
  wakeMode,
89
89
  name: mapping.name,
90
+ agentId: mapping.agentId?.trim() || undefined,
90
91
  sessionKey: mapping.sessionKey,
91
92
  messageTemplate: mapping.messageTemplate,
92
93
  textTemplate: mapping.textTemplate,
@@ -131,6 +132,7 @@ function buildActionFromMapping(mapping, ctx) {
131
132
  kind: "agent",
132
133
  message,
133
134
  name: renderOptional(mapping.name, ctx),
135
+ agentId: mapping.agentId,
134
136
  wakeMode: mapping.wakeMode ?? "now",
135
137
  sessionKey: renderOptional(mapping.sessionKey, ctx),
136
138
  deliver: mapping.deliver,
@@ -162,6 +164,7 @@ function mergeAction(base, override, defaultAction) {
162
164
  message,
163
165
  wakeMode,
164
166
  name: override.name ?? baseAgent?.name,
167
+ agentId: override.agentId ?? baseAgent?.agentId,
165
168
  sessionKey: override.sessionKey ?? baseAgent?.sessionKey,
166
169
  deliver: typeof override.deliver === "boolean" ? override.deliver : baseAgent?.deliver,
167
170
  allowUnsafeExternalContent: typeof override.allowUnsafeExternalContent === "boolean"
@@ -1,5 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { listAgentIds, resolveDefaultAgentId } from "../agents/agent-scope.js";
2
3
  import { listChannelPlugins } from "../channels/plugins/index.js";
4
+ import { normalizeAgentId } from "../routing/session-key.js";
3
5
  import { normalizeMessageChannel } from "../utils/message-channel.js";
4
6
  import { resolveHookMappings } from "./hooks-mapping.js";
5
7
  const DEFAULT_HOOKS_PATH = "/hooks";
@@ -21,13 +23,48 @@ export function resolveHooksConfig(cfg) {
21
23
  ? cfg.hooks.maxBodyBytes
22
24
  : DEFAULT_HOOKS_MAX_BODY_BYTES;
23
25
  const mappings = resolveHookMappings(cfg.hooks);
26
+ const defaultAgentId = resolveDefaultAgentId(cfg);
27
+ const knownAgentIds = resolveKnownAgentIds(cfg, defaultAgentId);
28
+ const allowedAgentIds = resolveAllowedAgentIds(cfg.hooks?.allowedAgentIds);
24
29
  return {
25
30
  basePath: trimmed,
26
31
  token,
27
32
  maxBodyBytes,
28
33
  mappings,
34
+ agentPolicy: {
35
+ defaultAgentId,
36
+ knownAgentIds,
37
+ allowedAgentIds,
38
+ },
29
39
  };
30
40
  }
41
+ function resolveKnownAgentIds(cfg, defaultAgentId) {
42
+ const known = new Set(listAgentIds(cfg));
43
+ known.add(defaultAgentId);
44
+ return known;
45
+ }
46
+ function resolveAllowedAgentIds(raw) {
47
+ if (!Array.isArray(raw)) {
48
+ return undefined;
49
+ }
50
+ const allowed = new Set();
51
+ let hasWildcard = false;
52
+ for (const entry of raw) {
53
+ const trimmed = entry.trim();
54
+ if (!trimmed) {
55
+ continue;
56
+ }
57
+ if (trimmed === "*") {
58
+ hasWildcard = true;
59
+ break;
60
+ }
61
+ allowed.add(normalizeAgentId(trimmed));
62
+ }
63
+ if (hasWildcard) {
64
+ return undefined;
65
+ }
66
+ return allowed;
67
+ }
31
68
  export function extractHookToken(req, url) {
32
69
  const auth = typeof req.headers.authorization === "string" ? req.headers.authorization.trim() : "";
33
70
  if (auth.toLowerCase().startsWith("bearer ")) {
@@ -120,12 +157,39 @@ export function resolveHookChannel(raw) {
120
157
  export function resolveHookDeliver(raw) {
121
158
  return raw !== false;
122
159
  }
160
+ export function resolveHookTargetAgentId(hooksConfig, agentId) {
161
+ const raw = agentId?.trim();
162
+ if (!raw) {
163
+ return undefined;
164
+ }
165
+ const normalized = normalizeAgentId(raw);
166
+ if (hooksConfig.agentPolicy.knownAgentIds.has(normalized)) {
167
+ return normalized;
168
+ }
169
+ return hooksConfig.agentPolicy.defaultAgentId;
170
+ }
171
+ export function isHookAgentAllowed(hooksConfig, agentId) {
172
+ // Keep backwards compatibility for callers that omit agentId.
173
+ const raw = agentId?.trim();
174
+ if (!raw) {
175
+ return true;
176
+ }
177
+ const allowed = hooksConfig.agentPolicy.allowedAgentIds;
178
+ if (allowed === undefined) {
179
+ return true;
180
+ }
181
+ const resolved = resolveHookTargetAgentId(hooksConfig, raw);
182
+ return resolved ? allowed.has(resolved) : false;
183
+ }
184
+ export const getHookAgentPolicyError = () => "agentId is not allowed by hooks.allowedAgentIds";
123
185
  export function normalizeAgentPayload(payload, opts) {
124
186
  const message = typeof payload.message === "string" ? payload.message.trim() : "";
125
187
  if (!message)
126
188
  return { ok: false, error: "message required" };
127
189
  const nameRaw = payload.name;
128
190
  const name = typeof nameRaw === "string" && nameRaw.trim() ? nameRaw.trim() : "Hook";
191
+ const agentIdRaw = payload.agentId;
192
+ const agentId = typeof agentIdRaw === "string" && agentIdRaw.trim() ? agentIdRaw.trim() : undefined;
129
193
  const wakeMode = payload.wakeMode === "next-heartbeat" ? "next-heartbeat" : "now";
130
194
  const sessionKeyRaw = payload.sessionKey;
131
195
  const idFactory = opts?.idFactory ?? randomUUID;
@@ -154,6 +218,7 @@ export function normalizeAgentPayload(payload, opts) {
154
218
  value: {
155
219
  message,
156
220
  name,
221
+ agentId,
157
222
  wakeMode,
158
223
  sessionKey,
159
224
  deliver,
@@ -1,83 +1,125 @@
1
1
  import net from "node:net";
2
+ import os from "node:os";
2
3
  import { pickPrimaryTailnetIPv4, pickPrimaryTailnetIPv6 } from "../infra/tailnet.js";
4
+ /**
5
+ * Pick the primary non-internal IPv4 address (LAN IP).
6
+ * Prefers common interface names (en0, eth0) then falls back to any external IPv4.
7
+ */
8
+ export function pickPrimaryLanIPv4() {
9
+ const nets = os.networkInterfaces();
10
+ const preferredNames = ["en0", "eth0"];
11
+ for (const name of preferredNames) {
12
+ const list = nets[name];
13
+ const entry = list?.find((n) => n.family === "IPv4" && !n.internal);
14
+ if (entry?.address) {
15
+ return entry.address;
16
+ }
17
+ }
18
+ for (const list of Object.values(nets)) {
19
+ const entry = list?.find((n) => n.family === "IPv4" && !n.internal);
20
+ if (entry?.address) {
21
+ return entry.address;
22
+ }
23
+ }
24
+ return undefined;
25
+ }
3
26
  export function isLoopbackAddress(ip) {
4
- if (!ip)
27
+ if (!ip) {
5
28
  return false;
6
- if (ip === "127.0.0.1")
29
+ }
30
+ if (ip === "127.0.0.1") {
7
31
  return true;
8
- if (ip.startsWith("127."))
32
+ }
33
+ if (ip.startsWith("127.")) {
9
34
  return true;
10
- if (ip === "::1")
35
+ }
36
+ if (ip === "::1") {
11
37
  return true;
12
- if (ip.startsWith("::ffff:127."))
38
+ }
39
+ if (ip.startsWith("::ffff:127.")) {
13
40
  return true;
41
+ }
14
42
  return false;
15
43
  }
16
44
  function normalizeIPv4MappedAddress(ip) {
17
- if (ip.startsWith("::ffff:"))
45
+ if (ip.startsWith("::ffff:")) {
18
46
  return ip.slice("::ffff:".length);
47
+ }
19
48
  return ip;
20
49
  }
21
50
  function normalizeIp(ip) {
22
51
  const trimmed = ip?.trim();
23
- if (!trimmed)
52
+ if (!trimmed) {
24
53
  return undefined;
54
+ }
25
55
  return normalizeIPv4MappedAddress(trimmed.toLowerCase());
26
56
  }
27
57
  function stripOptionalPort(ip) {
28
58
  if (ip.startsWith("[")) {
29
59
  const end = ip.indexOf("]");
30
- if (end !== -1)
60
+ if (end !== -1) {
31
61
  return ip.slice(1, end);
62
+ }
32
63
  }
33
- if (net.isIP(ip))
64
+ if (net.isIP(ip)) {
34
65
  return ip;
66
+ }
35
67
  const lastColon = ip.lastIndexOf(":");
36
68
  if (lastColon > -1 && ip.includes(".") && ip.indexOf(":") === lastColon) {
37
69
  const candidate = ip.slice(0, lastColon);
38
- if (net.isIP(candidate) === 4)
70
+ if (net.isIP(candidate) === 4) {
39
71
  return candidate;
72
+ }
40
73
  }
41
74
  return ip;
42
75
  }
43
76
  export function parseForwardedForClientIp(forwardedFor) {
44
77
  const raw = forwardedFor?.split(",")[0]?.trim();
45
- if (!raw)
78
+ if (!raw) {
46
79
  return undefined;
80
+ }
47
81
  return normalizeIp(stripOptionalPort(raw));
48
82
  }
49
83
  function parseRealIp(realIp) {
50
84
  const raw = realIp?.trim();
51
- if (!raw)
85
+ if (!raw) {
52
86
  return undefined;
87
+ }
53
88
  return normalizeIp(stripOptionalPort(raw));
54
89
  }
55
90
  export function isTrustedProxyAddress(ip, trustedProxies) {
56
91
  const normalized = normalizeIp(ip);
57
- if (!normalized || !trustedProxies || trustedProxies.length === 0)
92
+ if (!normalized || !trustedProxies || trustedProxies.length === 0) {
58
93
  return false;
94
+ }
59
95
  return trustedProxies.some((proxy) => normalizeIp(proxy) === normalized);
60
96
  }
61
97
  export function resolveGatewayClientIp(params) {
62
98
  const remote = normalizeIp(params.remoteAddr);
63
- if (!remote)
99
+ if (!remote) {
64
100
  return undefined;
65
- if (!isTrustedProxyAddress(remote, params.trustedProxies))
101
+ }
102
+ if (!isTrustedProxyAddress(remote, params.trustedProxies)) {
66
103
  return remote;
104
+ }
67
105
  return parseForwardedForClientIp(params.forwardedFor) ?? parseRealIp(params.realIp) ?? remote;
68
106
  }
69
107
  export function isLocalGatewayAddress(ip) {
70
- if (isLoopbackAddress(ip))
108
+ if (isLoopbackAddress(ip)) {
71
109
  return true;
72
- if (!ip)
110
+ }
111
+ if (!ip) {
73
112
  return false;
113
+ }
74
114
  const normalized = normalizeIPv4MappedAddress(ip.trim().toLowerCase());
75
115
  const tailnetIPv4 = pickPrimaryTailnetIPv4();
76
- if (tailnetIPv4 && normalized === tailnetIPv4.toLowerCase())
116
+ if (tailnetIPv4 && normalized === tailnetIPv4.toLowerCase()) {
77
117
  return true;
118
+ }
78
119
  const tailnetIPv6 = pickPrimaryTailnetIPv6();
79
- if (tailnetIPv6 && ip.trim().toLowerCase() === tailnetIPv6.toLowerCase())
120
+ if (tailnetIPv6 && ip.trim().toLowerCase() === tailnetIPv6.toLowerCase()) {
80
121
  return true;
122
+ }
81
123
  return false;
82
124
  }
83
125
  /**
@@ -96,16 +138,19 @@ export async function resolveGatewayBindHost(bind, customHost) {
96
138
  const mode = bind ?? "loopback";
97
139
  if (mode === "loopback") {
98
140
  // 127.0.0.1 rarely fails, but handle gracefully
99
- if (await canBindToHost("127.0.0.1"))
141
+ if (await canBindToHost("127.0.0.1")) {
100
142
  return "127.0.0.1";
143
+ }
101
144
  return "0.0.0.0"; // extreme fallback
102
145
  }
103
146
  if (mode === "tailnet") {
104
147
  const tailnetIP = pickPrimaryTailnetIPv4();
105
- if (tailnetIP && (await canBindToHost(tailnetIP)))
148
+ if (tailnetIP && (await canBindToHost(tailnetIP))) {
106
149
  return tailnetIP;
107
- if (await canBindToHost("127.0.0.1"))
150
+ }
151
+ if (await canBindToHost("127.0.0.1")) {
108
152
  return "127.0.0.1";
153
+ }
109
154
  return "0.0.0.0";
110
155
  }
111
156
  if (mode === "lan") {
@@ -113,16 +158,19 @@ export async function resolveGatewayBindHost(bind, customHost) {
113
158
  }
114
159
  if (mode === "custom") {
115
160
  const host = customHost?.trim();
116
- if (!host)
117
- return "0.0.0.0"; // invalid config → fall back to all
118
- if (isValidIPv4(host) && (await canBindToHost(host)))
161
+ if (!host) {
162
+ return "0.0.0.0";
163
+ } // invalid config → fall back to all
164
+ if (isValidIPv4(host) && (await canBindToHost(host))) {
119
165
  return host;
166
+ }
120
167
  // Custom IP failed → fall back to LAN
121
168
  return "0.0.0.0";
122
169
  }
123
170
  if (mode === "auto") {
124
- if (await canBindToHost("127.0.0.1"))
171
+ if (await canBindToHost("127.0.0.1")) {
125
172
  return "127.0.0.1";
173
+ }
126
174
  return "0.0.0.0";
127
175
  }
128
176
  return "0.0.0.0";
@@ -149,11 +197,13 @@ export async function canBindToHost(host) {
149
197
  });
150
198
  }
151
199
  export async function resolveGatewayListenHosts(bindHost, opts) {
152
- if (bindHost !== "127.0.0.1")
200
+ if (bindHost !== "127.0.0.1") {
153
201
  return [bindHost];
202
+ }
154
203
  const canBind = opts?.canBindToHost ?? canBindToHost;
155
- if (await canBind("::1"))
204
+ if (await canBind("::1")) {
156
205
  return [bindHost, "::1"];
206
+ }
157
207
  return [bindHost];
158
208
  }
159
209
  /**
@@ -162,15 +212,30 @@ export async function resolveGatewayListenHosts(bindHost, opts) {
162
212
  * @param host - The string to validate
163
213
  * @returns True if valid IPv4 format
164
214
  */
165
- function isValidIPv4(host) {
215
+ export function isValidIPv4(host) {
166
216
  const parts = host.split(".");
167
- if (parts.length !== 4)
217
+ if (parts.length !== 4) {
168
218
  return false;
219
+ }
169
220
  return parts.every((part) => {
170
221
  const n = parseInt(part, 10);
171
222
  return !Number.isNaN(n) && n >= 0 && n <= 255 && part === String(n);
172
223
  });
173
224
  }
225
+ /**
226
+ * Check if a hostname or IP refers to the local machine.
227
+ * Handles: localhost, 127.x.x.x, ::1, [::1], ::ffff:127.x.x.x
228
+ * Note: 0.0.0.0 and :: are NOT loopback - they bind to all interfaces.
229
+ */
174
230
  export function isLoopbackHost(host) {
175
- return isLoopbackAddress(host);
231
+ if (!host) {
232
+ return false;
233
+ }
234
+ const h = host.trim().toLowerCase();
235
+ if (h === "localhost") {
236
+ return true;
237
+ }
238
+ // Handle bracketed IPv6 addresses like [::1]
239
+ const unbracket = h.startsWith("[") && h.endsWith("]") ? h.slice(1, -1) : h;
240
+ return isLoopbackAddress(unbracket);
176
241
  }
@@ -8,10 +8,22 @@ const CANVAS_COMMANDS = [
8
8
  "canvas.a2ui.pushJSONL",
9
9
  "canvas.a2ui.reset",
10
10
  ];
11
- const CAMERA_COMMANDS = ["camera.list", "camera.snap", "camera.clip"];
12
- const SCREEN_COMMANDS = ["screen.record"];
11
+ const CAMERA_COMMANDS = ["camera.list"];
12
+ const CAMERA_DANGEROUS_COMMANDS = ["camera.snap", "camera.clip"];
13
+ const SCREEN_DANGEROUS_COMMANDS = ["screen.record"];
13
14
  const LOCATION_COMMANDS = ["location.get"];
14
- const SMS_COMMANDS = ["sms.send"];
15
+ const DEVICE_COMMANDS = ["device.info", "device.status"];
16
+ const CONTACTS_COMMANDS = ["contacts.search"];
17
+ const CONTACTS_DANGEROUS_COMMANDS = ["contacts.add"];
18
+ const CALENDAR_COMMANDS = ["calendar.events"];
19
+ const CALENDAR_DANGEROUS_COMMANDS = ["calendar.add"];
20
+ const REMINDERS_COMMANDS = ["reminders.list"];
21
+ const REMINDERS_DANGEROUS_COMMANDS = ["reminders.add"];
22
+ const PHOTOS_COMMANDS = ["photos.latest"];
23
+ const MOTION_COMMANDS = ["motion.activity", "motion.pedometer"];
24
+ const SMS_DANGEROUS_COMMANDS = ["sms.send"];
25
+ // iOS nodes don't implement system.run/which, but they do support notifications.
26
+ const IOS_SYSTEM_COMMANDS = ["system.notify"];
15
27
  const SYSTEM_COMMANDS = [
16
28
  "system.run",
17
29
  "system.which",
@@ -20,32 +32,55 @@ const SYSTEM_COMMANDS = [
20
32
  "system.execApprovals.set",
21
33
  "browser.proxy",
22
34
  ];
35
+ // "High risk" node commands. These can be enabled by explicitly adding them to
36
+ // `gateway.nodes.allowCommands` (and ensuring they're not blocked by denyCommands).
37
+ export const DEFAULT_DANGEROUS_NODE_COMMANDS = [
38
+ ...CAMERA_DANGEROUS_COMMANDS,
39
+ ...SCREEN_DANGEROUS_COMMANDS,
40
+ ...CONTACTS_DANGEROUS_COMMANDS,
41
+ ...CALENDAR_DANGEROUS_COMMANDS,
42
+ ...REMINDERS_DANGEROUS_COMMANDS,
43
+ ...SMS_DANGEROUS_COMMANDS,
44
+ ];
23
45
  const PLATFORM_DEFAULTS = {
24
- ios: [...CANVAS_COMMANDS, ...CAMERA_COMMANDS, ...SCREEN_COMMANDS, ...LOCATION_COMMANDS],
25
- android: [
46
+ ios: [
26
47
  ...CANVAS_COMMANDS,
27
48
  ...CAMERA_COMMANDS,
28
- ...SCREEN_COMMANDS,
29
49
  ...LOCATION_COMMANDS,
30
- ...SMS_COMMANDS,
50
+ ...DEVICE_COMMANDS,
51
+ ...CONTACTS_COMMANDS,
52
+ ...CALENDAR_COMMANDS,
53
+ ...REMINDERS_COMMANDS,
54
+ ...PHOTOS_COMMANDS,
55
+ ...MOTION_COMMANDS,
56
+ ...IOS_SYSTEM_COMMANDS,
31
57
  ],
32
- macos: [
58
+ android: [
33
59
  ...CANVAS_COMMANDS,
34
60
  ...CAMERA_COMMANDS,
35
- ...SCREEN_COMMANDS,
36
61
  ...LOCATION_COMMANDS,
37
- ...SYSTEM_COMMANDS,
62
+ ...DEVICE_COMMANDS,
63
+ ...CONTACTS_COMMANDS,
64
+ ...CALENDAR_COMMANDS,
65
+ ...REMINDERS_COMMANDS,
66
+ ...PHOTOS_COMMANDS,
67
+ ...MOTION_COMMANDS,
38
68
  ],
39
- linux: [...SYSTEM_COMMANDS],
40
- windows: [...SYSTEM_COMMANDS],
41
- unknown: [
69
+ macos: [
42
70
  ...CANVAS_COMMANDS,
43
71
  ...CAMERA_COMMANDS,
44
- ...SCREEN_COMMANDS,
45
72
  ...LOCATION_COMMANDS,
46
- ...SMS_COMMANDS,
73
+ ...DEVICE_COMMANDS,
74
+ ...CONTACTS_COMMANDS,
75
+ ...CALENDAR_COMMANDS,
76
+ ...REMINDERS_COMMANDS,
77
+ ...PHOTOS_COMMANDS,
78
+ ...MOTION_COMMANDS,
47
79
  ...SYSTEM_COMMANDS,
48
80
  ],
81
+ linux: [...SYSTEM_COMMANDS],
82
+ windows: [...SYSTEM_COMMANDS],
83
+ unknown: [...CANVAS_COMMANDS, ...CAMERA_COMMANDS, ...LOCATION_COMMANDS, ...SYSTEM_COMMANDS],
49
84
  };
50
85
  function normalizePlatformId(platform, deviceFamily) {
51
86
  const raw = (platform ?? "").trim().toLowerCase();
@@ -0,0 +1,56 @@
1
+ import { isLoopbackHost } from "./net.js";
2
+ function normalizeHostHeader(hostHeader) {
3
+ return (hostHeader ?? "").trim().toLowerCase();
4
+ }
5
+ function resolveHostName(hostHeader) {
6
+ const host = normalizeHostHeader(hostHeader);
7
+ if (!host) {
8
+ return "";
9
+ }
10
+ if (host.startsWith("[")) {
11
+ const end = host.indexOf("]");
12
+ if (end !== -1) {
13
+ return host.slice(1, end);
14
+ }
15
+ }
16
+ const [name] = host.split(":");
17
+ return name ?? "";
18
+ }
19
+ function parseOrigin(originRaw) {
20
+ const trimmed = (originRaw ?? "").trim();
21
+ if (!trimmed || trimmed === "null") {
22
+ return null;
23
+ }
24
+ try {
25
+ const url = new URL(trimmed);
26
+ return {
27
+ origin: url.origin.toLowerCase(),
28
+ host: url.host.toLowerCase(),
29
+ hostname: url.hostname.toLowerCase(),
30
+ };
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ export function checkBrowserOrigin(params) {
37
+ const parsedOrigin = parseOrigin(params.origin);
38
+ if (!parsedOrigin) {
39
+ return { ok: false, reason: "origin missing or invalid" };
40
+ }
41
+ const allowlist = (params.allowedOrigins ?? [])
42
+ .map((value) => value.trim().toLowerCase())
43
+ .filter(Boolean);
44
+ if (allowlist.includes(parsedOrigin.origin)) {
45
+ return { ok: true };
46
+ }
47
+ const requestHost = normalizeHostHeader(params.requestHost);
48
+ if (requestHost && parsedOrigin.host === requestHost) {
49
+ return { ok: true };
50
+ }
51
+ const requestHostname = resolveHostName(requestHost);
52
+ if (isLoopbackHost(parsedOrigin.hostname) && isLoopbackHost(requestHostname)) {
53
+ return { ok: true };
54
+ }
55
+ return { ok: false, reason: "origin not allowed" };
56
+ }
@@ -23,6 +23,9 @@ export const GATEWAY_CLIENT_MODES = {
23
23
  PROBE: "probe",
24
24
  TEST: "test",
25
25
  };
26
+ export const GATEWAY_CLIENT_CAPS = {
27
+ TOOL_EVENTS: "tool-events",
28
+ };
26
29
  const GATEWAY_CLIENT_ID_SET = new Set(Object.values(GATEWAY_CLIENT_IDS));
27
30
  const GATEWAY_CLIENT_MODE_SET = new Set(Object.values(GATEWAY_CLIENT_MODES));
28
31
  export function normalizeGatewayClientId(raw) {
@@ -44,3 +47,9 @@ export function normalizeGatewayClientMode(raw) {
44
47
  ? normalized
45
48
  : undefined;
46
49
  }
50
+ export function hasGatewayClientCap(caps, cap) {
51
+ if (!Array.isArray(caps)) {
52
+ return false;
53
+ }
54
+ return caps.includes(cap);
55
+ }
@@ -1,5 +1,5 @@
1
1
  import AjvPkg from "ajv";
2
- import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PresenceEntrySchema, ProtocolSchemas, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
2
+ import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PresenceEntrySchema, ProtocolSchemas, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
3
3
  const ajv = new AjvPkg({
4
4
  allErrors: true,
5
5
  strict: false,
@@ -16,6 +16,12 @@ export const validateAgentIdentityParams = ajv.compile(AgentIdentityParamsSchema
16
16
  export const validateAgentWaitParams = ajv.compile(AgentWaitParamsSchema);
17
17
  export const validateWakeParams = ajv.compile(WakeParamsSchema);
18
18
  export const validateAgentsListParams = ajv.compile(AgentsListParamsSchema);
19
+ export const validateAgentsCreateParams = ajv.compile(AgentsCreateParamsSchema);
20
+ export const validateAgentsUpdateParams = ajv.compile(AgentsUpdateParamsSchema);
21
+ export const validateAgentsDeleteParams = ajv.compile(AgentsDeleteParamsSchema);
22
+ export const validateAgentsFilesListParams = ajv.compile(AgentsFilesListParamsSchema);
23
+ export const validateAgentsFilesGetParams = ajv.compile(AgentsFilesGetParamsSchema);
24
+ export const validateAgentsFilesSetParams = ajv.compile(AgentsFilesSetParamsSchema);
19
25
  export const validateNodePairRequestParams = ajv.compile(NodePairRequestParamsSchema);
20
26
  export const validateNodePairListParams = ajv.compile(NodePairListParamsSchema);
21
27
  export const validateNodePairApproveParams = ajv.compile(NodePairApproveParamsSchema);
@@ -34,6 +40,7 @@ export const validateSessionsPatchParams = ajv.compile(SessionsPatchParamsSchema
34
40
  export const validateSessionsResetParams = ajv.compile(SessionsResetParamsSchema);
35
41
  export const validateSessionsDeleteParams = ajv.compile(SessionsDeleteParamsSchema);
36
42
  export const validateSessionsCompactParams = ajv.compile(SessionsCompactParamsSchema);
43
+ export const validateSessionsUsageParams = ajv.compile(SessionsUsageParamsSchema);
37
44
  export const validateConfigGetParams = ajv.compile(ConfigGetParamsSchema);
38
45
  export const validateConfigSetParams = ajv.compile(ConfigSetParamsSchema);
39
46
  export const validateConfigApplyParams = ajv.compile(ConfigApplyParamsSchema);
@@ -106,4 +113,4 @@ export function formatValidationErrors(errors) {
106
113
  }
107
114
  return unique.join("; ");
108
115
  }
109
- export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsListParamsSchema, AgentsListResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };
116
+ export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsListParamsSchema, AgentsListResultSchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };