@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.
- package/CHANGELOG.md +118 -0
- package/README-header.png +0 -0
- package/dist/agents/bash-tools.exec.js +76 -25
- package/dist/agents/cli-runner/helpers.js +9 -11
- package/dist/agents/context.js +1 -1
- package/dist/agents/identity.js +47 -7
- package/dist/agents/memory-search.js +25 -8
- package/dist/agents/model-catalog.js +1 -1
- package/dist/agents/model-selection.js +21 -0
- package/dist/agents/pi-embedded-block-chunker.js +117 -42
- package/dist/agents/pi-embedded-helpers/errors.js +183 -78
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +8 -10
- package/dist/agents/pi-embedded-runner/model.js +62 -3
- package/dist/agents/pi-embedded-runner/run/attempt.js +21 -11
- package/dist/agents/pi-embedded-runner/run.js +199 -46
- package/dist/agents/pi-embedded-runner/system-prompt.js +10 -2
- package/dist/agents/pi-embedded-subscribe.js +118 -29
- package/dist/agents/pi-tools.js +10 -5
- package/dist/agents/poolbot-tools.js +15 -10
- package/dist/agents/sandbox-paths.js +31 -0
- package/dist/agents/session-tool-result-guard.js +94 -15
- package/dist/agents/shell-utils.js +51 -0
- package/dist/agents/skills/bundled-context.js +23 -0
- package/dist/agents/skills/bundled-dir.js +41 -7
- package/dist/agents/skills-install.js +60 -23
- package/dist/agents/subagent-announce.js +79 -34
- package/dist/agents/tool-policy.conformance.js +14 -0
- package/dist/agents/tool-policy.js +24 -0
- package/dist/agents/tools/cron-tool.js +166 -19
- package/dist/agents/tools/discord-actions-presence.js +78 -0
- package/dist/agents/tools/image-tool.js +1 -1
- package/dist/agents/tools/message-tool.js +56 -2
- package/dist/agents/tools/sessions-history-tool.js +69 -1
- package/dist/agents/tools/web-search.js +211 -42
- package/dist/agents/usage.js +23 -1
- package/dist/agents/workspace-run.js +67 -0
- package/dist/agents/workspace-templates.js +44 -0
- package/dist/auto-reply/command-auth.js +121 -6
- package/dist/auto-reply/envelope.js +74 -82
- package/dist/auto-reply/reply/commands-compact.js +1 -0
- package/dist/auto-reply/reply/commands-context-report.js +1 -0
- package/dist/auto-reply/reply/commands-context.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +107 -60
- package/dist/auto-reply/reply/commands-ptt.js +171 -0
- package/dist/auto-reply/reply/get-reply-run.js +2 -1
- package/dist/auto-reply/reply/inbound-context.js +5 -1
- package/dist/auto-reply/reply/mentions.js +1 -1
- package/dist/auto-reply/reply/model-selection.js +3 -3
- package/dist/auto-reply/thinking.js +88 -43
- package/dist/browser/bridge-server.js +13 -0
- package/dist/browser/cdp.helpers.js +38 -24
- package/dist/browser/client-fetch.js +50 -7
- package/dist/browser/config.js +1 -10
- package/dist/browser/extension-relay.js +101 -40
- package/dist/browser/pw-ai.js +1 -1
- package/dist/browser/pw-session.js +143 -8
- package/dist/browser/pw-tools-core.interactions.js +125 -27
- package/dist/browser/pw-tools-core.responses.js +1 -1
- package/dist/browser/pw-tools-core.state.js +1 -1
- package/dist/browser/routes/agent.act.js +86 -41
- package/dist/browser/routes/dispatcher.js +4 -4
- package/dist/browser/screenshot.js +1 -1
- package/dist/browser/server.js +13 -0
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/index.html +28 -28
- package/dist/channels/reply-prefix.js +8 -1
- package/dist/cli/cron-cli/register.cron-add.js +61 -40
- package/dist/cli/cron-cli/register.cron-edit.js +60 -34
- package/dist/cli/cron-cli/shared.js +56 -41
- package/dist/cli/dns-cli.js +26 -14
- package/dist/cli/gateway-cli/register.js +37 -19
- package/dist/cli/memory-cli.js +5 -5
- package/dist/cli/parse-bytes.js +37 -0
- package/dist/cli/update-cli.js +173 -52
- package/dist/commands/agent.js +1 -0
- package/dist/commands/auth-choice.apply.oauth.js +1 -1
- package/dist/commands/doctor-config-flow.js +61 -5
- package/dist/commands/doctor-state-migrations.js +1 -1
- package/dist/commands/health.js +1 -1
- package/dist/commands/model-allowlist.js +29 -0
- package/dist/commands/model-picker.js +2 -1
- package/dist/commands/models/list.registry.js +1 -1
- package/dist/commands/models/list.status-command.js +43 -23
- package/dist/commands/models/shared.js +15 -0
- package/dist/commands/onboard-custom.js +384 -0
- package/dist/commands/onboard-non-interactive/local/auth-choice-inference.js +35 -0
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +6 -3
- package/dist/commands/onboard-skills.js +63 -38
- package/dist/commands/openai-model-default.js +41 -0
- package/dist/compat/legacy-names.js +2 -0
- package/dist/config/defaults.js +3 -2
- package/dist/config/paths.js +136 -35
- package/dist/config/plugin-auto-enable.js +21 -5
- package/dist/config/redact-snapshot.js +153 -0
- package/dist/config/schema.field-metadata.js +590 -0
- package/dist/config/schema.js +2 -2
- package/dist/config/sessions/store.js +291 -23
- package/dist/config/zod-schema.agent-defaults.js +3 -0
- package/dist/config/zod-schema.agent-runtime.js +13 -2
- package/dist/config/zod-schema.providers-core.js +142 -0
- package/dist/config/zod-schema.session.js +3 -0
- package/dist/control-ui/assets/{index-CIRDm-Lu.css → index-CSfXd2LO.css} +1 -1
- package/dist/control-ui/assets/{index-CmNMuoem.js → index-HRr1grwl.js} +446 -413
- package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -0
- package/dist/control-ui/index.html +4 -4
- package/dist/cron/delivery.js +57 -0
- package/dist/cron/isolated-agent/delivery-target.js +18 -3
- package/dist/cron/isolated-agent/helpers.js +22 -5
- package/dist/cron/isolated-agent/run.js +172 -63
- package/dist/cron/isolated-agent/session.js +2 -0
- package/dist/cron/normalize.js +356 -28
- package/dist/cron/parse.js +10 -5
- package/dist/cron/run-log.js +35 -10
- package/dist/cron/schedule.js +41 -6
- package/dist/cron/service/jobs.js +208 -35
- package/dist/cron/service/ops.js +72 -16
- package/dist/cron/service/state.js +2 -0
- package/dist/cron/service/store.js +386 -14
- package/dist/cron/service/timer.js +390 -147
- package/dist/cron/session-reaper.js +86 -0
- package/dist/cron/store.js +23 -8
- package/dist/cron/validate-timestamp.js +43 -0
- package/dist/discord/monitor/agent-components.js +438 -0
- package/dist/discord/monitor/allow-list.js +28 -5
- package/dist/discord/monitor/gateway-registry.js +29 -0
- package/dist/discord/monitor/native-command.js +44 -23
- package/dist/discord/monitor/sender-identity.js +45 -0
- package/dist/discord/pluralkit.js +27 -0
- package/dist/discord/send.outbound.js +92 -5
- package/dist/discord/send.shared.js +60 -23
- package/dist/discord/targets.js +84 -1
- package/dist/entry.js +15 -9
- package/dist/extensionAPI.js +8 -0
- package/dist/gateway/control-ui.js +8 -1
- package/dist/gateway/hooks-mapping.js +3 -0
- package/dist/gateway/hooks.js +65 -0
- package/dist/gateway/net.js +96 -31
- package/dist/gateway/node-command-policy.js +50 -15
- package/dist/gateway/origin-check.js +56 -0
- package/dist/gateway/protocol/client-info.js +9 -0
- package/dist/gateway/protocol/index.js +9 -2
- package/dist/gateway/protocol/schema/agents-models-skills.js +71 -1
- package/dist/gateway/protocol/schema/cron.js +22 -10
- package/dist/gateway/protocol/schema/protocol-schemas.js +16 -2
- package/dist/gateway/protocol/schema/sessions.js +12 -0
- package/dist/gateway/server/hooks.js +1 -1
- package/dist/gateway/server-broadcast.js +26 -9
- package/dist/gateway/server-chat.js +112 -23
- package/dist/gateway/server-discovery-runtime.js +10 -2
- package/dist/gateway/server-http.js +109 -11
- package/dist/gateway/server-methods/agent-timestamp.js +60 -0
- package/dist/gateway/server-methods/agents.js +321 -2
- package/dist/gateway/server-methods/usage.js +559 -16
- package/dist/gateway/server-runtime-state.js +22 -8
- package/dist/gateway/server-startup-memory.js +16 -0
- package/dist/gateway/server.impl.js +5 -1
- package/dist/gateway/session-utils.fs.js +23 -25
- package/dist/gateway/session-utils.js +20 -10
- package/dist/gateway/sessions-patch.js +7 -22
- package/dist/gateway/test-helpers.mocks.js +11 -7
- package/dist/gateway/test-helpers.server.js +35 -2
- package/dist/imessage/constants.js +2 -0
- package/dist/imessage/monitor/deliver.js +4 -1
- package/dist/imessage/monitor/monitor-provider.js +51 -1
- package/dist/infra/bonjour-discovery.js +131 -70
- package/dist/infra/control-ui-assets.js +134 -12
- package/dist/infra/errors.js +12 -0
- package/dist/infra/exec-approvals.js +266 -57
- package/dist/infra/format-time/format-datetime.js +79 -0
- package/dist/infra/format-time/format-duration.js +81 -0
- package/dist/infra/format-time/format-relative.js +80 -0
- package/dist/infra/heartbeat-runner.js +140 -49
- package/dist/infra/home-dir.js +54 -0
- package/dist/infra/net/fetch-guard.js +122 -0
- package/dist/infra/net/ssrf.js +65 -29
- package/dist/infra/outbound/abort.js +14 -0
- package/dist/infra/outbound/message-action-runner.js +77 -13
- package/dist/infra/outbound/outbound-session.js +143 -37
- package/dist/infra/poolbot-root.js +43 -1
- package/dist/infra/session-cost-usage.js +631 -41
- package/dist/infra/state-migrations.js +317 -47
- package/dist/infra/update-global.js +35 -0
- package/dist/infra/update-runner.js +149 -43
- package/dist/infra/warning-filter.js +65 -0
- package/dist/infra/widearea-dns.js +30 -9
- package/dist/logging/redact-identifier.js +12 -0
- package/dist/media/fetch.js +81 -58
- package/dist/media/store.js +2 -0
- package/dist/media-understanding/apply.js +403 -3
- package/dist/media-understanding/attachments.js +38 -27
- package/dist/media-understanding/defaults.js +16 -0
- package/dist/media-understanding/providers/deepgram/audio.js +22 -14
- package/dist/media-understanding/providers/google/audio.js +24 -17
- package/dist/media-understanding/providers/google/video.js +24 -17
- package/dist/media-understanding/providers/image.js +3 -3
- package/dist/media-understanding/providers/index.js +4 -1
- package/dist/media-understanding/providers/openai/audio.js +22 -14
- package/dist/media-understanding/providers/shared.js +16 -11
- package/dist/media-understanding/providers/zai/index.js +6 -0
- package/dist/media-understanding/runner.js +158 -90
- package/dist/memory/batch-voyage.js +277 -0
- package/dist/memory/embeddings-voyage.js +75 -0
- package/dist/memory/embeddings.js +28 -16
- package/dist/memory/internal.js +101 -18
- package/dist/memory/manager.js +154 -48
- package/dist/memory/search-manager.js +173 -0
- package/dist/memory/session-files.js +9 -3
- package/dist/node-host/runner.js +34 -24
- package/dist/node-host/with-timeout.js +27 -0
- package/dist/plugins/commands.js +5 -1
- package/dist/plugins/config-state.js +86 -7
- package/dist/plugins/source-display.js +51 -0
- package/dist/process/exec.js +20 -2
- package/dist/routing/resolve-route.js +12 -0
- package/dist/routing/session-key.js +15 -0
- package/dist/runtime.js +2 -0
- package/dist/security/audit-extra.async.js +601 -0
- package/dist/security/audit-extra.js +2 -830
- package/dist/security/audit-extra.sync.js +505 -0
- package/dist/security/channel-metadata.js +34 -0
- package/dist/security/external-content.js +88 -6
- package/dist/security/skill-scanner.js +330 -0
- package/dist/sessions/session-key-utils.js +7 -0
- package/dist/signal/monitor/event-handler.js +80 -1
- package/dist/slack/monitor/media.js +85 -15
- package/dist/tailscale/detect.js +1 -2
- package/dist/telegram/bot/helpers.js +109 -28
- package/dist/telegram/bot-handlers.js +144 -3
- package/dist/telegram/bot-message-context.js +37 -10
- package/dist/telegram/bot-message-dispatch.js +54 -17
- package/dist/telegram/bot-native-commands.js +86 -29
- package/dist/telegram/bot.js +30 -29
- package/dist/telegram/model-buttons.js +163 -0
- package/dist/telegram/monitor.js +110 -85
- package/dist/telegram/send.js +129 -47
- package/dist/terminal/restore.js +45 -0
- package/dist/test-helpers/state-dir-env.js +16 -0
- package/dist/tts/tts.js +12 -6
- package/dist/tui/tui-session-actions.js +166 -54
- package/dist/utils/fetch-timeout.js +20 -0
- package/dist/utils/normalize-secret-input.js +19 -0
- package/dist/utils/transcript-tools.js +58 -0
- package/dist/utils.js +45 -14
- package/dist/version.js +42 -5
- package/dist/wizard/clack-prompter.js +9 -6
- package/extensions/googlechat/node_modules/.bin/poolbot +21 -0
- package/extensions/googlechat/package.json +2 -2
- package/extensions/line/node_modules/.bin/poolbot +21 -0
- package/extensions/line/package.json +1 -1
- package/extensions/matrix/node_modules/.bin/poolbot +21 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/memory-core/node_modules/.bin/poolbot +21 -0
- package/extensions/memory-core/package.json +4 -1
- package/extensions/twitch/node_modules/.bin/poolbot +21 -0
- package/extensions/twitch/package.json +1 -1
- package/package.json +183 -24
- 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 =
|
|
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"
|
package/dist/gateway/hooks.js
CHANGED
|
@@ -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,
|
package/dist/gateway/net.js
CHANGED
|
@@ -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
|
-
|
|
29
|
+
}
|
|
30
|
+
if (ip === "127.0.0.1") {
|
|
7
31
|
return true;
|
|
8
|
-
|
|
32
|
+
}
|
|
33
|
+
if (ip.startsWith("127.")) {
|
|
9
34
|
return true;
|
|
10
|
-
|
|
35
|
+
}
|
|
36
|
+
if (ip === "::1") {
|
|
11
37
|
return true;
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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";
|
|
118
|
-
|
|
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
|
-
|
|
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"
|
|
12
|
-
const
|
|
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
|
|
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: [
|
|
25
|
-
android: [
|
|
46
|
+
ios: [
|
|
26
47
|
...CANVAS_COMMANDS,
|
|
27
48
|
...CAMERA_COMMANDS,
|
|
28
|
-
...SCREEN_COMMANDS,
|
|
29
49
|
...LOCATION_COMMANDS,
|
|
30
|
-
...
|
|
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
|
-
|
|
58
|
+
android: [
|
|
33
59
|
...CANVAS_COMMANDS,
|
|
34
60
|
...CAMERA_COMMANDS,
|
|
35
|
-
...SCREEN_COMMANDS,
|
|
36
61
|
...LOCATION_COMMANDS,
|
|
37
|
-
...
|
|
62
|
+
...DEVICE_COMMANDS,
|
|
63
|
+
...CONTACTS_COMMANDS,
|
|
64
|
+
...CALENDAR_COMMANDS,
|
|
65
|
+
...REMINDERS_COMMANDS,
|
|
66
|
+
...PHOTOS_COMMANDS,
|
|
67
|
+
...MOTION_COMMANDS,
|
|
38
68
|
],
|
|
39
|
-
|
|
40
|
-
windows: [...SYSTEM_COMMANDS],
|
|
41
|
-
unknown: [
|
|
69
|
+
macos: [
|
|
42
70
|
...CANVAS_COMMANDS,
|
|
43
71
|
...CAMERA_COMMANDS,
|
|
44
|
-
...SCREEN_COMMANDS,
|
|
45
72
|
...LOCATION_COMMANDS,
|
|
46
|
-
...
|
|
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, };
|