@intent-systems/nexus 2026.1.5-3
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 +222 -0
- package/LICENSE +21 -0
- package/README-header.png +0 -0
- package/README.md +462 -0
- package/dist/agents/agent-paths.js +16 -0
- package/dist/agents/agent-scope.js +44 -0
- package/dist/agents/auth-profiles.js +626 -0
- package/dist/agents/bash-process-registry.js +126 -0
- package/dist/agents/bash-tools.js +838 -0
- package/dist/agents/chutes-oauth.js +47 -0
- package/dist/agents/clawdbot-tools.js +62 -0
- package/dist/agents/context.js +34 -0
- package/dist/agents/defaults.js +6 -0
- package/dist/agents/memory-search.js +80 -0
- package/dist/agents/model-auth.js +115 -0
- package/dist/agents/model-catalog.js +55 -0
- package/dist/agents/model-fallback.js +210 -0
- package/dist/agents/model-scan.js +263 -0
- package/dist/agents/model-selection.js +152 -0
- package/dist/agents/models-config.js +171 -0
- package/dist/agents/nexus-tools.js +46 -0
- package/dist/agents/pi-embedded-block-chunker.js +188 -0
- package/dist/agents/pi-embedded-helpers.js +139 -0
- package/dist/agents/pi-embedded-runner.js +932 -0
- package/dist/agents/pi-embedded-subscribe.js +541 -0
- package/dist/agents/pi-embedded-utils.js +20 -0
- package/dist/agents/pi-embedded.js +1 -0
- package/dist/agents/pi-extensions/compaction-safeguard.js +140 -0
- package/dist/agents/pi-tool-definition-adapter.js +17 -0
- package/dist/agents/pi-tools.js +510 -0
- package/dist/agents/pi-tools.schema.js +358 -0
- package/dist/agents/sandbox-paths.js +68 -0
- package/dist/agents/sandbox.js +667 -0
- package/dist/agents/shell-utils.js +53 -0
- package/dist/agents/skill-runner.js +224 -0
- package/dist/agents/skill-state.js +164 -0
- package/dist/agents/skill-tools.js +191 -0
- package/dist/agents/skill-usage.js +43 -0
- package/dist/agents/skills-install.js +244 -0
- package/dist/agents/skills-status.js +157 -0
- package/dist/agents/skills.js +472 -0
- package/dist/agents/subagent-registry.js +321 -0
- package/dist/agents/subagent-registry.store.js +47 -0
- package/dist/agents/system-prompt.js +179 -0
- package/dist/agents/timeout.js +26 -0
- package/dist/agents/tool-display.js +155 -0
- package/dist/agents/tool-display.json +236 -0
- package/dist/agents/tool-images.js +138 -0
- package/dist/agents/tool-policy.js +87 -0
- package/dist/agents/tools/agent-step.js +41 -0
- package/dist/agents/tools/browser-tool.js +295 -0
- package/dist/agents/tools/canvas-tool.js +193 -0
- package/dist/agents/tools/common.js +88 -0
- package/dist/agents/tools/cron-tool.js +141 -0
- package/dist/agents/tools/discord-actions-guild.js +186 -0
- package/dist/agents/tools/discord-actions-messaging.js +313 -0
- package/dist/agents/tools/discord-actions-moderation.js +70 -0
- package/dist/agents/tools/discord-actions.js +56 -0
- package/dist/agents/tools/discord-schema.js +199 -0
- package/dist/agents/tools/discord-tool.js +16 -0
- package/dist/agents/tools/gateway-tool.js +46 -0
- package/dist/agents/tools/gateway.js +28 -0
- package/dist/agents/tools/image-tool.js +140 -0
- package/dist/agents/tools/memory-tool.js +92 -0
- package/dist/agents/tools/nodes-tool.js +413 -0
- package/dist/agents/tools/nodes-utils.js +92 -0
- package/dist/agents/tools/sessions-announce-target.js +35 -0
- package/dist/agents/tools/sessions-helpers.js +88 -0
- package/dist/agents/tools/sessions-history-tool.js +137 -0
- package/dist/agents/tools/sessions-list-tool.js +196 -0
- package/dist/agents/tools/sessions-send-helpers.js +103 -0
- package/dist/agents/tools/sessions-send-tool.js +371 -0
- package/dist/agents/tools/sessions-spawn-tool.js +319 -0
- package/dist/agents/tools/slack-actions.js +129 -0
- package/dist/agents/tools/slack-schema.js +59 -0
- package/dist/agents/tools/slack-tool.js +16 -0
- package/dist/agents/tools/telegram-actions.js +159 -0
- package/dist/agents/tools/telegram-schema.js +28 -0
- package/dist/agents/tools/telegram-tool.js +16 -0
- package/dist/agents/tools/whatsapp-login-tool.js +63 -0
- package/dist/agents/usage.js +58 -0
- package/dist/agents/workspace.js +264 -0
- package/dist/auto-reply/chunk.js +177 -0
- package/dist/auto-reply/command-auth.js +44 -0
- package/dist/auto-reply/command-detection.js +22 -0
- package/dist/auto-reply/envelope.js +30 -0
- package/dist/auto-reply/group-activation.js +20 -0
- package/dist/auto-reply/heartbeat.js +58 -0
- package/dist/auto-reply/model.js +22 -0
- package/dist/auto-reply/reply/abort.js +14 -0
- package/dist/auto-reply/reply/agent-runner.js +426 -0
- package/dist/auto-reply/reply/bash-command.js +314 -0
- package/dist/auto-reply/reply/block-streaming.js +34 -0
- package/dist/auto-reply/reply/body.js +29 -0
- package/dist/auto-reply/reply/commands.js +332 -0
- package/dist/auto-reply/reply/directive-handling.js +626 -0
- package/dist/auto-reply/reply/directives.js +59 -0
- package/dist/auto-reply/reply/dispatch-from-config.js +23 -0
- package/dist/auto-reply/reply/followup-runner.js +181 -0
- package/dist/auto-reply/reply/groups.js +152 -0
- package/dist/auto-reply/reply/mentions.js +64 -0
- package/dist/auto-reply/reply/model-selection.js +209 -0
- package/dist/auto-reply/reply/queue.js +399 -0
- package/dist/auto-reply/reply/reply-dispatcher.js +68 -0
- package/dist/auto-reply/reply/reply-tags.js +26 -0
- package/dist/auto-reply/reply/session-updates.js +103 -0
- package/dist/auto-reply/reply/session.js +169 -0
- package/dist/auto-reply/reply/typing.js +125 -0
- package/dist/auto-reply/reply.js +655 -0
- package/dist/auto-reply/send-policy.js +28 -0
- package/dist/auto-reply/status.js +197 -0
- package/dist/auto-reply/templating.js +9 -0
- package/dist/auto-reply/thinking.js +49 -0
- package/dist/auto-reply/tokens.js +2 -0
- package/dist/auto-reply/tool-meta.js +74 -0
- package/dist/auto-reply/transcription.js +57 -0
- package/dist/auto-reply/types.js +1 -0
- package/dist/browser/bridge-server.js +37 -0
- package/dist/browser/cdp.js +382 -0
- package/dist/browser/chrome.js +432 -0
- package/dist/browser/client-actions-core.js +67 -0
- package/dist/browser/client-actions-observe.js +24 -0
- package/dist/browser/client-actions-types.js +1 -0
- package/dist/browser/client-actions.js +3 -0
- package/dist/browser/client-fetch.js +43 -0
- package/dist/browser/client.js +105 -0
- package/dist/browser/config.js +155 -0
- package/dist/browser/constants.js +5 -0
- package/dist/browser/profiles-service.js +124 -0
- package/dist/browser/profiles.js +96 -0
- package/dist/browser/pw-ai.js +2 -0
- package/dist/browser/pw-session.js +144 -0
- package/dist/browser/pw-tools-core.js +363 -0
- package/dist/browser/routes/agent.js +535 -0
- package/dist/browser/routes/basic.js +155 -0
- package/dist/browser/routes/index.js +8 -0
- package/dist/browser/routes/tabs.js +105 -0
- package/dist/browser/routes/utils.js +62 -0
- package/dist/browser/screenshot.js +40 -0
- package/dist/browser/server-context.js +377 -0
- package/dist/browser/server.js +81 -0
- package/dist/browser/target-id.js +18 -0
- package/dist/browser/trash.js +21 -0
- package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
- package/dist/canvas-host/a2ui/index.html +246 -0
- package/dist/canvas-host/a2ui.js +187 -0
- package/dist/canvas-host/server.js +382 -0
- package/dist/channel-web.js +8 -0
- package/dist/cli/browser-cli-actions-input.js +459 -0
- package/dist/cli/browser-cli-actions-observe.js +56 -0
- package/dist/cli/browser-cli-examples.js +31 -0
- package/dist/cli/browser-cli-inspect.js +97 -0
- package/dist/cli/browser-cli-manage.js +286 -0
- package/dist/cli/browser-cli-shared.js +1 -0
- package/dist/cli/browser-cli.js +26 -0
- package/dist/cli/canvas-cli.js +416 -0
- package/dist/cli/cloud-cli.js +336 -0
- package/dist/cli/credential-cli.js +227 -0
- package/dist/cli/cron-cli.js +454 -0
- package/dist/cli/deps.js +17 -0
- package/dist/cli/dns-cli.js +180 -0
- package/dist/cli/gateway-cli.js +665 -0
- package/dist/cli/gateway-rpc.js +20 -0
- package/dist/cli/hooks-cli.js +135 -0
- package/dist/cli/memory-cli.js +101 -0
- package/dist/cli/models-cli.js +248 -0
- package/dist/cli/nodes-camera.js +57 -0
- package/dist/cli/nodes-canvas.js +26 -0
- package/dist/cli/nodes-cli.js +946 -0
- package/dist/cli/nodes-screen.js +37 -0
- package/dist/cli/pairing-cli.js +100 -0
- package/dist/cli/parse-duration.js +20 -0
- package/dist/cli/plugins-cli.js +158 -0
- package/dist/cli/ports.js +97 -0
- package/dist/cli/profile.js +81 -0
- package/dist/cli/program.js +162 -0
- package/dist/cli/prompt.js +19 -0
- package/dist/cli/run-main.js +48 -0
- package/dist/cli/skills-cli.js +132 -0
- package/dist/cli/skills-hub-cli.js +1093 -0
- package/dist/cli/telegram-cli.js +56 -0
- package/dist/cli/tool-connector-cli.js +118 -0
- package/dist/cli/tui-cli.js +35 -0
- package/dist/cli/upstream-sync-cli.js +2833 -0
- package/dist/cli/usage-cli.js +24 -0
- package/dist/cli/wait.js +8 -0
- package/dist/commands/agent-via-gateway.js +115 -0
- package/dist/commands/agent.js +665 -0
- package/dist/commands/antigravity-oauth.js +327 -0
- package/dist/commands/auth-choice-options.js +80 -0
- package/dist/commands/auth-choice.js +134 -0
- package/dist/commands/auth-token.js +31 -0
- package/dist/commands/bootstrap-preset.js +214 -0
- package/dist/commands/capabilities.js +36 -0
- package/dist/commands/chutes-oauth.js +144 -0
- package/dist/commands/claude-md.js +137 -0
- package/dist/commands/config-view.js +11 -0
- package/dist/commands/configure.js +648 -0
- package/dist/commands/credential.js +236 -0
- package/dist/commands/cursor-rules.js +230 -0
- package/dist/commands/doctor-state-migrations.js +358 -0
- package/dist/commands/doctor-ui.js +113 -0
- package/dist/commands/doctor.js +673 -0
- package/dist/commands/health.js +112 -0
- package/dist/commands/identity.js +54 -0
- package/dist/commands/init.js +167 -0
- package/dist/commands/models/aliases.js +85 -0
- package/dist/commands/models/fallbacks.js +123 -0
- package/dist/commands/models/image-fallbacks.js +123 -0
- package/dist/commands/models/list.js +347 -0
- package/dist/commands/models/scan.js +271 -0
- package/dist/commands/models/set-image.js +27 -0
- package/dist/commands/models/set.js +27 -0
- package/dist/commands/models/shared.js +73 -0
- package/dist/commands/models.js +7 -0
- package/dist/commands/onboard-auth.js +101 -0
- package/dist/commands/onboard-channels.js +814 -0
- package/dist/commands/onboard-eve-identity.js +98 -0
- package/dist/commands/onboard-github.js +153 -0
- package/dist/commands/onboard-helpers.js +303 -0
- package/dist/commands/onboard-interactive.js +17 -0
- package/dist/commands/onboard-non-interactive.js +228 -0
- package/dist/commands/onboard-providers.js +829 -0
- package/dist/commands/onboard-quickstart.js +185 -0
- package/dist/commands/onboard-remote.js +120 -0
- package/dist/commands/onboard-skills.js +148 -0
- package/dist/commands/onboard-types.js +1 -0
- package/dist/commands/onboard.js +19 -0
- package/dist/commands/openai-codex-model-default.js +38 -0
- package/dist/commands/poll.js +64 -0
- package/dist/commands/quest.js +27 -0
- package/dist/commands/reset.js +61 -0
- package/dist/commands/send.js +124 -0
- package/dist/commands/sessions-ingest.js +359 -0
- package/dist/commands/sessions.js +212 -0
- package/dist/commands/setup.js +59 -0
- package/dist/commands/signal-install.js +135 -0
- package/dist/commands/skills-manifest.js +235 -0
- package/dist/commands/status.js +139 -0
- package/dist/commands/suggestions.js +54 -0
- package/dist/commands/systemd-linger.js +71 -0
- package/dist/commands/update.js +16 -0
- package/dist/commands/usage-upload.js +27 -0
- package/dist/config/config.js +6 -0
- package/dist/config/defaults.js +140 -0
- package/dist/config/group-policy.js +49 -0
- package/dist/config/includes.js +183 -0
- package/dist/config/io.js +188 -0
- package/dist/config/legacy-migrate.js +13 -0
- package/dist/config/legacy.js +425 -0
- package/dist/config/paths.js +82 -0
- package/dist/config/port-defaults.js +32 -0
- package/dist/config/schema.js +173 -0
- package/dist/config/sessions.js +611 -0
- package/dist/config/talk.js +31 -0
- package/dist/config/types.js +1 -0
- package/dist/config/validation.js +29 -0
- package/dist/config/zod-schema.js +1110 -0
- package/dist/control-ui/assets/index-D8Q5AI4D.js +2393 -0
- package/dist/control-ui/assets/index-D8Q5AI4D.js.map +1 -0
- package/dist/control-ui/assets/index-g06q5Xc3.css +1 -0
- package/dist/control-ui/favicon.ico +0 -0
- package/dist/control-ui/index.html +16 -0
- package/dist/cron/isolated-agent.js +529 -0
- package/dist/cron/normalize.js +73 -0
- package/dist/cron/parse.js +24 -0
- package/dist/cron/run-log.js +72 -0
- package/dist/cron/schedule.js +24 -0
- package/dist/cron/service.js +471 -0
- package/dist/cron/store.js +43 -0
- package/dist/cron/types.js +1 -0
- package/dist/daemon/constants.js +10 -0
- package/dist/daemon/launchd.js +295 -0
- package/dist/daemon/legacy.js +63 -0
- package/dist/daemon/program-args.js +141 -0
- package/dist/daemon/schtasks.js +269 -0
- package/dist/daemon/service.js +69 -0
- package/dist/daemon/systemd.js +332 -0
- package/dist/discord/index.js +2 -0
- package/dist/discord/monitor.js +1089 -0
- package/dist/discord/probe.js +54 -0
- package/dist/discord/send.js +652 -0
- package/dist/discord/token.js +8 -0
- package/dist/entry.js +16 -0
- package/dist/gateway/auth.js +121 -0
- package/dist/gateway/call.js +103 -0
- package/dist/gateway/chat-attachments.js +41 -0
- package/dist/gateway/client.js +180 -0
- package/dist/gateway/config-reload.js +274 -0
- package/dist/gateway/control-ui.js +184 -0
- package/dist/gateway/hooks-mapping.js +282 -0
- package/dist/gateway/hooks.js +168 -0
- package/dist/gateway/net.js +29 -0
- package/dist/gateway/protocol/index.js +62 -0
- package/dist/gateway/protocol/schema.js +577 -0
- package/dist/gateway/server-bridge-subscriptions.js +93 -0
- package/dist/gateway/server-bridge.js +1066 -0
- package/dist/gateway/server-browser.js +11 -0
- package/dist/gateway/server-channels.js +680 -0
- package/dist/gateway/server-chat.js +159 -0
- package/dist/gateway/server-constants.js +8 -0
- package/dist/gateway/server-discovery.js +62 -0
- package/dist/gateway/server-http.js +165 -0
- package/dist/gateway/server-methods/agent-job.js +114 -0
- package/dist/gateway/server-methods/agent.js +254 -0
- package/dist/gateway/server-methods/channels.js +239 -0
- package/dist/gateway/server-methods/chat.js +207 -0
- package/dist/gateway/server-methods/config.js +50 -0
- package/dist/gateway/server-methods/connect.js +6 -0
- package/dist/gateway/server-methods/cron.js +89 -0
- package/dist/gateway/server-methods/health.js +28 -0
- package/dist/gateway/server-methods/models.js +16 -0
- package/dist/gateway/server-methods/nodes.js +294 -0
- package/dist/gateway/server-methods/providers.js +257 -0
- package/dist/gateway/server-methods/send.js +254 -0
- package/dist/gateway/server-methods/sessions.js +382 -0
- package/dist/gateway/server-methods/skills.js +83 -0
- package/dist/gateway/server-methods/system.js +118 -0
- package/dist/gateway/server-methods/talk.js +22 -0
- package/dist/gateway/server-methods/types.js +1 -0
- package/dist/gateway/server-methods/voicewake.js +30 -0
- package/dist/gateway/server-methods/web.js +81 -0
- package/dist/gateway/server-methods/wizard.js +100 -0
- package/dist/gateway/server-methods.js +53 -0
- package/dist/gateway/server-providers.js +687 -0
- package/dist/gateway/server-shared.js +1 -0
- package/dist/gateway/server-utils.js +35 -0
- package/dist/gateway/server.js +1478 -0
- package/dist/gateway/session-utils.js +355 -0
- package/dist/gateway/ws-log.js +343 -0
- package/dist/gateway/ws-logging.js +8 -0
- package/dist/globals.js +41 -0
- package/dist/hooks/gmail-ops.js +236 -0
- package/dist/hooks/gmail-setup-utils.js +278 -0
- package/dist/hooks/gmail-watcher.js +190 -0
- package/dist/hooks/gmail.js +177 -0
- package/dist/imessage/client.js +165 -0
- package/dist/imessage/index.js +3 -0
- package/dist/imessage/monitor.js +365 -0
- package/dist/imessage/probe.js +26 -0
- package/dist/imessage/send.js +83 -0
- package/dist/imessage/targets.js +176 -0
- package/dist/index.js +55 -0
- package/dist/infra/agent-events.js +46 -0
- package/dist/infra/binaries.js +9 -0
- package/dist/infra/bonjour-discovery.js +163 -0
- package/dist/infra/bonjour.js +200 -0
- package/dist/infra/bridge/server.js +564 -0
- package/dist/infra/canvas-host-url.js +54 -0
- package/dist/infra/channel-summary.js +78 -0
- package/dist/infra/control-ui-assets.js +112 -0
- package/dist/infra/dotenv.js +15 -0
- package/dist/infra/env.js +8 -0
- package/dist/infra/errors.js +28 -0
- package/dist/infra/event-log.js +251 -0
- package/dist/infra/gateway-lock.js +8 -0
- package/dist/infra/git-commit.js +91 -0
- package/dist/infra/heartbeat-events.js +21 -0
- package/dist/infra/heartbeat-runner.js +458 -0
- package/dist/infra/heartbeat-wake.js +61 -0
- package/dist/infra/is-main.js +37 -0
- package/dist/infra/json-file.js +21 -0
- package/dist/infra/machine-name.js +40 -0
- package/dist/infra/nexus-root.js +56 -0
- package/dist/infra/node-pairing.js +212 -0
- package/dist/infra/path-env.js +93 -0
- package/dist/infra/ports.js +87 -0
- package/dist/infra/provider-summary.js +80 -0
- package/dist/infra/provider-usage.auth.js +189 -0
- package/dist/infra/provider-usage.fetch.claude.js +129 -0
- package/dist/infra/provider-usage.fetch.codex.js +62 -0
- package/dist/infra/provider-usage.fetch.copilot.js +42 -0
- package/dist/infra/provider-usage.fetch.gemini.js +57 -0
- package/dist/infra/provider-usage.fetch.js +6 -0
- package/dist/infra/provider-usage.fetch.minimax.js +214 -0
- package/dist/infra/provider-usage.fetch.shared.js +11 -0
- package/dist/infra/provider-usage.fetch.zai.js +62 -0
- package/dist/infra/provider-usage.format.js +77 -0
- package/dist/infra/provider-usage.js +145 -0
- package/dist/infra/provider-usage.load.js +54 -0
- package/dist/infra/provider-usage.shared.js +19 -0
- package/dist/infra/provider-usage.types.js +1 -0
- package/dist/infra/restart.js +29 -0
- package/dist/infra/retry.js +16 -0
- package/dist/infra/runtime-guard.js +59 -0
- package/dist/infra/shell-env.js +88 -0
- package/dist/infra/system-events.js +71 -0
- package/dist/infra/system-presence.js +217 -0
- package/dist/infra/tailnet.js +46 -0
- package/dist/infra/tailscale.js +149 -0
- package/dist/infra/unhandled-rejections.js +19 -0
- package/dist/infra/usage-suggestions.js +241 -0
- package/dist/infra/usage-upload.js +290 -0
- package/dist/infra/voicewake.js +78 -0
- package/dist/infra/widearea-dns.js +123 -0
- package/dist/infra/ws.js +13 -0
- package/dist/logger.js +52 -0
- package/dist/logging.js +506 -0
- package/dist/macos/gateway-daemon.js +145 -0
- package/dist/macos/relay.js +49 -0
- package/dist/media/constants.js +33 -0
- package/dist/media/host.js +42 -0
- package/dist/media/image-ops.js +119 -0
- package/dist/media/mime.js +123 -0
- package/dist/media/parse.js +83 -0
- package/dist/media/server.js +64 -0
- package/dist/media/store.js +139 -0
- package/dist/polls.js +43 -0
- package/dist/process/command-queue.js +97 -0
- package/dist/process/exec.js +75 -0
- package/dist/provider-web.js +8 -0
- package/dist/providers/github-copilot-auth.js +123 -0
- package/dist/providers/github-copilot-models.js +35 -0
- package/dist/providers/github-copilot-token.js +11 -0
- package/dist/providers/location.js +48 -0
- package/dist/providers/web/index.js +2 -0
- package/dist/runtime.js +8 -0
- package/dist/sessions/level-overrides.js +9 -0
- package/dist/sessions/send-policy.js +68 -0
- package/dist/signal/client.js +134 -0
- package/dist/signal/daemon.js +69 -0
- package/dist/signal/index.js +3 -0
- package/dist/signal/monitor.js +411 -0
- package/dist/signal/probe.js +46 -0
- package/dist/signal/send.js +91 -0
- package/dist/slack/actions.js +97 -0
- package/dist/slack/index.js +5 -0
- package/dist/slack/monitor.js +1270 -0
- package/dist/slack/probe.js +47 -0
- package/dist/slack/send.js +131 -0
- package/dist/slack/token.js +10 -0
- package/dist/telegram/allowed-updates.js +8 -0
- package/dist/telegram/bot.js +724 -0
- package/dist/telegram/download.js +34 -0
- package/dist/telegram/index.js +4 -0
- package/dist/telegram/monitor.js +47 -0
- package/dist/telegram/pairing-store.js +77 -0
- package/dist/telegram/probe.js +63 -0
- package/dist/telegram/proxy.js +9 -0
- package/dist/telegram/reaction-level.js +45 -0
- package/dist/telegram/send.js +151 -0
- package/dist/telegram/sent-message-cache.js +65 -0
- package/dist/telegram/token.js +30 -0
- package/dist/telegram/update-offset-store.js +61 -0
- package/dist/telegram/webhook-set.js +12 -0
- package/dist/telegram/webhook.js +56 -0
- package/dist/tui/commands.js +87 -0
- package/dist/tui/components/assistant-message.js +16 -0
- package/dist/tui/components/chat-log.js +92 -0
- package/dist/tui/components/custom-editor.js +55 -0
- package/dist/tui/components/selectors.js +8 -0
- package/dist/tui/components/tool-execution.js +111 -0
- package/dist/tui/components/user-message.js +17 -0
- package/dist/tui/gateway-chat.js +140 -0
- package/dist/tui/theme/theme.js +80 -0
- package/dist/tui/tui.js +708 -0
- package/dist/utils.js +153 -0
- package/dist/version.js +18 -0
- package/dist/web/accounts.js +86 -0
- package/dist/web/active-listener.js +25 -0
- package/dist/web/auto-reply.js +1256 -0
- package/dist/web/inbound.js +649 -0
- package/dist/web/login-qr.js +230 -0
- package/dist/web/login.js +71 -0
- package/dist/web/media.js +175 -0
- package/dist/web/outbound.js +102 -0
- package/dist/web/qr-image.js +97 -0
- package/dist/web/reconnect.js +60 -0
- package/dist/web/session.js +370 -0
- package/dist/wizard/clack-prompter.js +56 -0
- package/dist/wizard/onboarding.js +620 -0
- package/dist/wizard/prompts.js +6 -0
- package/dist/wizard/session.js +203 -0
- package/docs/AGENTS.default.md +116 -0
- package/docs/CAPABILITIES.md +444 -0
- package/docs/CNAME +1 -0
- package/docs/NEXUS_CORE_REWRITE_SPEC.md +226 -0
- package/docs/RELEASING.md +69 -0
- package/docs/_config.yml +53 -0
- package/docs/_layouts/default.html +145 -0
- package/docs/agent-assisted-install.md +95 -0
- package/docs/agent-loop.md +61 -0
- package/docs/agent-send.md +21 -0
- package/docs/agent.md +108 -0
- package/docs/android.md +133 -0
- package/docs/architecture.md +114 -0
- package/docs/assets/markdown.css +133 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/terminal.css +470 -0
- package/docs/assets/theme.js +55 -0
- package/docs/audio.md +48 -0
- package/docs/automation/nexus-sync.md +371 -0
- package/docs/background-process.md +74 -0
- package/docs/bash.md +32 -0
- package/docs/bedrock.md +71 -0
- package/docs/bonjour.md +159 -0
- package/docs/browser-linux-troubleshooting.md +114 -0
- package/docs/browser.md +293 -0
- package/docs/bun.md +56 -0
- package/docs/camera.md +152 -0
- package/docs/clawd.md +212 -0
- package/docs/concepts/usage-tracking.md +29 -0
- package/docs/configuration.md +1666 -0
- package/docs/control-ui.md +83 -0
- package/docs/cron.md +385 -0
- package/docs/dashboard.md +17 -0
- package/docs/device-models.md +46 -0
- package/docs/discord.md +308 -0
- package/docs/discovery.md +112 -0
- package/docs/docker.md +258 -0
- package/docs/docs.json +105 -0
- package/docs/doctor.md +68 -0
- package/docs/elevated.md +31 -0
- package/docs/faq.md +736 -0
- package/docs/feature-inventory/overview.md +141 -0
- package/docs/feature-inventory/rollout-checklist.md +53 -0
- package/docs/feature-inventory/test-matrix.md +87 -0
- package/docs/feature-inventory.md +9 -0
- package/docs/gateway/configuration-examples.md +221 -0
- package/docs/gateway/configuration.md +172 -0
- package/docs/gateway/cron.md +61 -0
- package/docs/gateway/heartbeat.md +207 -0
- package/docs/gateway/pairing.md +109 -0
- package/docs/gateway-lock.md +28 -0
- package/docs/gateway.md +227 -0
- package/docs/gmail-pubsub.md +191 -0
- package/docs/grammy.md +27 -0
- package/docs/group-messages.md +73 -0
- package/docs/groups.md +130 -0
- package/docs/health.md +28 -0
- package/docs/heartbeat.md +73 -0
- package/docs/home-userspace.md +277 -0
- package/docs/hubs.md +148 -0
- package/docs/images.md +51 -0
- package/docs/imessage.md +94 -0
- package/docs/index.md +196 -0
- package/docs/ios.md +372 -0
- package/docs/linux.md +11 -0
- package/docs/location-command.md +95 -0
- package/docs/location.md +46 -0
- package/docs/logging.md +110 -0
- package/docs/lore.md +131 -0
- package/docs/mac/bun.md +133 -0
- package/docs/mac/canvas.md +161 -0
- package/docs/mac/child-process.md +72 -0
- package/docs/mac/dev-setup.md +81 -0
- package/docs/mac/health.md +28 -0
- package/docs/mac/icon.md +26 -0
- package/docs/mac/logging.md +51 -0
- package/docs/mac/menu-bar.md +69 -0
- package/docs/mac/peekaboo.md +170 -0
- package/docs/mac/permissions.md +40 -0
- package/docs/mac/release.md +76 -0
- package/docs/mac/remote.md +57 -0
- package/docs/mac/signing.md +41 -0
- package/docs/mac/skills.md +27 -0
- package/docs/mac/voice-overlay.md +52 -0
- package/docs/mac/voicewake.md +56 -0
- package/docs/mac/webchat.md +27 -0
- package/docs/mac/xpc.md +40 -0
- package/docs/macos.md +104 -0
- package/docs/model-failover.md +75 -0
- package/docs/models.md +91 -0
- package/docs/multi-agent.md +74 -0
- package/docs/nix.md +95 -0
- package/docs/nodes.md +157 -0
- package/docs/onboarding-config-protocol.md +34 -0
- package/docs/onboarding.md +189 -0
- package/docs/pairing.md +85 -0
- package/docs/plans/cron-add-hardening.md +72 -0
- package/docs/plans/group-policy-hardening.md +121 -0
- package/docs/poll.md +52 -0
- package/docs/prereqs.md +67 -0
- package/docs/presence.md +133 -0
- package/docs/proposals/model-config.md +147 -0
- package/docs/provider-routing.md +25 -0
- package/docs/queue.md +78 -0
- package/docs/reference/templates/AGENTS.md +164 -0
- package/docs/remote-gateway-readme.md +153 -0
- package/docs/remote.md +61 -0
- package/docs/research/memory.md +227 -0
- package/docs/rpc.md +35 -0
- package/docs/security.md +200 -0
- package/docs/session-ingestion.md +119 -0
- package/docs/session-tool.md +154 -0
- package/docs/session.md +85 -0
- package/docs/sessions.md +8 -0
- package/docs/setup.md +131 -0
- package/docs/showcase.md +37 -0
- package/docs/signal.md +122 -0
- package/docs/skills-config.md +58 -0
- package/docs/skills.md +153 -0
- package/docs/slack.md +221 -0
- package/docs/subagents.md +72 -0
- package/docs/tailscale.md +71 -0
- package/docs/talk.md +79 -0
- package/docs/telegram.md +96 -0
- package/docs/templates/AGENTS.md +286 -0
- package/docs/templates/BOOTSTRAP.md +35 -0
- package/docs/templates/IDENTITY.md +17 -0
- package/docs/templates/PROFILE.md +14 -0
- package/docs/templates/SOUL.md +41 -0
- package/docs/templates/TOOLS.md +41 -0
- package/docs/templates/USER.md +8 -0
- package/docs/test.md +43 -0
- package/docs/testing-onboarding-quickstart.md +76 -0
- package/docs/testing-philosophy.md +211 -0
- package/docs/thinking.md +46 -0
- package/docs/timezone.md +40 -0
- package/docs/tools.md +346 -0
- package/docs/troubleshooting.md +257 -0
- package/docs/tui.md +71 -0
- package/docs/typebox.md +42 -0
- package/docs/updating.md +138 -0
- package/docs/usage-cloud-aggregation-spec.md +133 -0
- package/docs/usage-suggestions-pipeline.md +126 -0
- package/docs/voicewake.md +61 -0
- package/docs/web.md +115 -0
- package/docs/webchat.md +34 -0
- package/docs/webhook.md +132 -0
- package/docs/whatsapp-clawd.jpg +0 -0
- package/docs/whatsapp.md +170 -0
- package/docs/windows.md +11 -0
- package/docs/wizard.md +167 -0
- package/package.json +209 -0
- package/skills/1password/SKILL.md +54 -0
- package/skills/1password/docs/setup.md +85 -0
- package/skills/1password/docs/troubleshooting.md +63 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/agent-browser/SKILL.md +450 -0
- package/skills/agent-browser/docs/browser-use-eval.md +95 -0
- package/skills/agent-browser/docs/first-tests.md +261 -0
- package/skills/agent-browser/docs/wordle-nyt-eval.js +32 -0
- package/skills/aix/SKILL.md +93 -0
- package/skills/aix/docs/embeddings.md +40 -0
- package/skills/aix/docs/setup.md +58 -0
- package/skills/aix/docs/troubleshooting.md +41 -0
- package/skills/aix/references/sql.md +48 -0
- package/skills/apple-notes/SKILL.md +50 -0
- package/skills/apple-reminders/SKILL.md +67 -0
- package/skills/bear-notes/SKILL.md +79 -0
- package/skills/bird/SKILL.md +32 -0
- package/skills/bird/docs/auth.md +31 -0
- package/skills/bird/docs/troubleshooting.md +31 -0
- package/skills/blogwatcher/SKILL.md +46 -0
- package/skills/blucli/SKILL.md +27 -0
- package/skills/brave-search/SKILL.md +36 -0
- package/skills/brave-search/docs/setup.md +40 -0
- package/skills/brave-search/docs/troubleshooting.md +37 -0
- package/skills/brave-search/docs/usage.md +28 -0
- package/skills/brave-search/scripts/content.mjs +53 -0
- package/skills/brave-search/scripts/search.mjs +79 -0
- package/skills/browser-use-agent-sdk/SKILL.md +90 -0
- package/skills/camsnap/SKILL.md +25 -0
- package/skills/clawdhub/SKILL.md +53 -0
- package/skills/coding-agent/SKILL.md +274 -0
- package/skills/comms/SKILL.md +249 -0
- package/skills/comms/docs/adapters.md +54 -0
- package/skills/comms/docs/setup.md +56 -0
- package/skills/comms/docs/troubleshooting.md +44 -0
- package/skills/comms/references/schema.md +49 -0
- package/skills/computer-use/SKILL.md +204 -0
- package/skills/computer-use/docs/open-interpreter.md +26 -0
- package/skills/computer-use/docs/peekaboo.md +26 -0
- package/skills/computer-use/docs/setup.md +47 -0
- package/skills/computer-use/docs/troubleshooting.md +33 -0
- package/skills/discord/SKILL.md +370 -0
- package/skills/eightctl/SKILL.md +29 -0
- package/skills/eve/SKILL.md +215 -0
- package/skills/eve/docs/dual-account.md +84 -0
- package/skills/eve/docs/intelligence.md +58 -0
- package/skills/eve/docs/setup.md +60 -0
- package/skills/eve/docs/troubleshooting.md +54 -0
- package/skills/eve/scripts/setup-dual-account.sh +125 -0
- package/skills/filesystem/SKILL.md +217 -0
- package/skills/food-order/SKILL.md +41 -0
- package/skills/gemini/SKILL.md +23 -0
- package/skills/gh/SKILL.md +22 -0
- package/skills/gh/docs/usage.md +41 -0
- package/skills/gifgrep/SKILL.md +47 -0
- package/skills/github/SKILL.md +26 -0
- package/skills/github/docs/setup.md +21 -0
- package/skills/github/docs/troubleshooting.md +24 -0
- package/skills/gog/SKILL.md +104 -0
- package/skills/gog/docs/portability.md +94 -0
- package/skills/gog/docs/setup.md +76 -0
- package/skills/gog/docs/troubleshooting.md +94 -0
- package/skills/gog/scripts/cdp/README.md +90 -0
- package/skills/gog/scripts/cdp/add_test_users.py +69 -0
- package/skills/gog/scripts/cdp/auth_add_accounts.py +209 -0
- package/skills/gog/scripts/cdp/auth_add_accounts_manual.py +206 -0
- package/skills/gog/scripts/cdp/create_oauth_client.py +165 -0
- package/skills/gog/scripts/cdp/launch_cdp_chrome.sh +58 -0
- package/skills/google-oauth/SKILL.md +94 -0
- package/skills/goplaces/SKILL.md +30 -0
- package/skills/imsg/SKILL.md +25 -0
- package/skills/json-render/SKILL.md +154 -0
- package/skills/json-render/assets/components/README.md +21 -0
- package/skills/json-render/assets/components/catalog.ts +78 -0
- package/skills/json-render/assets/components/registry.tsx +172 -0
- package/skills/json-render/assets/demo/App.css +397 -0
- package/skills/json-render/assets/demo/App.tsx +897 -0
- package/skills/json-render/assets/demo/README.md +22 -0
- package/skills/json-render/assets/demo/catalog.ts +78 -0
- package/skills/json-render/assets/demo/data/nexus-core.json +31 -0
- package/skills/json-render/assets/demo/index.css +27 -0
- package/skills/json-render/assets/demo/registry.tsx +150 -0
- package/skills/json-render/docs/nexus-state-demo.md +84 -0
- package/skills/json-render/docs/shadcn-preset.md +33 -0
- package/skills/json-render/scripts/create-vite-demo.sh +45 -0
- package/skills/json-render/scripts/llm-server/README.md +33 -0
- package/skills/json-render/scripts/llm-server/catalog.ts +78 -0
- package/skills/json-render/scripts/llm-server/package-lock.json +702 -0
- package/skills/json-render/scripts/llm-server/package.json +18 -0
- package/skills/json-render/scripts/llm-server/server.ts +285 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +91 -0
- package/skills/local-places/pyproject.toml +27 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +38 -0
- package/skills/model-usage/SKILL.md +45 -0
- package/skills/model-usage/references/codexbar-cli.md +28 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +30 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +169 -0
- package/skills/nano-pdf/SKILL.md +20 -0
- package/skills/nexus-cloud/SKILL.md +53 -0
- package/skills/nexus-cloud/docs/security.md +24 -0
- package/skills/nexus-cloud/docs/setup.md +51 -0
- package/skills/nexus-cloud/docs/troubleshooting.md +28 -0
- package/skills/notion/SKILL.md +156 -0
- package/skills/obsidian/SKILL.md +55 -0
- package/skills/onboarding/SKILL.md +515 -0
- package/skills/onboarding/docs/CAPABILITIES.md +444 -0
- package/skills/onboarding/docs/CAPABILITY_TAXONOMY.md +608 -0
- package/skills/onboarding/docs/CLI_GRAMMAR.md +797 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_CREDENTIALS.md +632 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_ONBOARDING.md +815 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_SKILLS.md +449 -0
- package/skills/onboarding/docs/DOCUMENTATION_OVERVIEW.md +290 -0
- package/skills/onboarding/docs/ENTITY_MODEL.md +582 -0
- package/skills/onboarding/docs/GOAL_STATE_ARCHITECTURE.md +395 -0
- package/skills/onboarding/docs/NEXUS_SYSTEM_OVERVIEW.md +476 -0
- package/skills/onboarding/docs/SKILLS_HUB_SPEC.md +477 -0
- package/skills/onboarding/docs/SKILLS_SPECIFICATION.md +947 -0
- package/skills/onboarding/docs/SKILL_GATEWAY_DESIGN.md +702 -0
- package/skills/onboarding/docs/SKILL_GATEWAY_PRD.md +278 -0
- package/skills/onboarding/docs/SKILL_INVENTORY.md +266 -0
- package/skills/onboarding/docs/STATE_ARCHITECTURE.md +547 -0
- package/skills/onboarding/docs/TROUBLESHOOTING.md +363 -0
- package/skills/onboarding/docs/USER_JOURNEY.md +797 -0
- package/skills/onboarding/docs/WOW_MOMENTS.md +232 -0
- package/skills/onboarding/docs/agent-apple-id.md +289 -0
- package/skills/onboarding/docs/skill-deep-dives/1password.md +367 -0
- package/skills/onboarding/docs/skill-deep-dives/TEMPLATE.md +197 -0
- package/skills/onboarding/docs/skill-deep-dives/aix.md +498 -0
- package/skills/onboarding/docs/skill-deep-dives/bird.md +357 -0
- package/skills/onboarding/docs/skill-deep-dives/brave-search.md +601 -0
- package/skills/onboarding/docs/skill-deep-dives/comms.md +607 -0
- package/skills/onboarding/docs/skill-deep-dives/computer-use.md +599 -0
- package/skills/onboarding/docs/skill-deep-dives/cron-and-heartbeat.md +576 -0
- package/skills/onboarding/docs/skill-deep-dives/eve.md +711 -0
- package/skills/onboarding/docs/skill-deep-dives/github.md +333 -0
- package/skills/onboarding/docs/skill-deep-dives/gog.md +640 -0
- package/skills/onboarding/docs/skill-deep-dives/homebrew-prereqs.md +785 -0
- package/skills/onboarding/docs/skill-deep-dives/nexus-cloud.md +689 -0
- package/skills/onboarding/docs/skill-deep-dives/qmd.md +742 -0
- package/skills/onboarding/docs/skill-deep-dives/telegram.md +379 -0
- package/skills/onboarding/docs/skill-deep-dives/wacli.md +399 -0
- package/skills/onboarding/docs/skill-deep-dives/weather.md +513 -0
- package/skills/onboarding/scripts/ralph/prd.json +215 -0
- package/skills/onboarding/scripts/ralph/progress.txt +99 -0
- package/skills/onboarding/scripts/ralph/prompt.md +87 -0
- package/skills/onboarding/scripts/ralph/ralph.log +84 -0
- package/skills/onboarding/scripts/ralph/ralph.sh +45 -0
- package/skills/onboarding/scripts/setup-cursor-skills.sh +40 -0
- package/skills/openai-image-gen/SKILL.md +31 -0
- package/skills/openai-image-gen/scripts/gen.py +173 -0
- package/skills/openai-whisper/SKILL.md +19 -0
- package/skills/openai-whisper-api/SKILL.md +43 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +30 -0
- package/skills/oracle/SKILL.md +105 -0
- package/skills/ordercli/SKILL.md +47 -0
- package/skills/peekaboo/SKILL.md +153 -0
- package/skills/qmd/SKILL.md +32 -0
- package/skills/qmd/docs/mcp.md +30 -0
- package/skills/qmd/docs/ollama.md +42 -0
- package/skills/qmd/docs/setup.md +44 -0
- package/skills/sag/SKILL.md +62 -0
- package/skills/skill-cli-template/SKILL.md +109 -0
- package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-311.pyc +0 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +29 -0
- package/skills/sonoscli/SKILL.md +26 -0
- package/skills/spotify-player/SKILL.md +34 -0
- package/skills/summarize/SKILL.md +49 -0
- package/skills/telegram/SKILL.md +20 -0
- package/skills/telegram/docs/pairing.md +30 -0
- package/skills/telegram/docs/setup.md +41 -0
- package/skills/telegram/docs/webhook.md +17 -0
- package/skills/things-mac/SKILL.md +61 -0
- package/skills/tmux/SKILL.md +121 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +84 -0
- package/skills/upstream-sync/SKILL.md +151 -0
- package/skills/upstream-sync/scripts/auto-port.sh +227 -0
- package/skills/upstream-sync/scripts/check-all.sh +88 -0
- package/skills/upstream-sync/scripts/check-nexus.sh +146 -0
- package/skills/upstream-sync/scripts/check-pi-ai.sh +129 -0
- package/skills/video-frames/SKILL.md +29 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/wacli/SKILL.md +48 -0
- package/skills/wacli/docs/auth.md +21 -0
- package/skills/wacli/docs/backup.md +9 -0
- package/skills/wacli/docs/troubleshooting.md +21 -0
- package/skills/weather/SKILL.md +53 -0
- package/skills/weather/docs/usage.md +40 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gateway cron jobs: scheduling tasks and automation"
|
|
3
|
+
read_when:
|
|
4
|
+
- Scheduling periodic tasks
|
|
5
|
+
- Automating syncs, backups, or reports
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Cron (Gateway)
|
|
9
|
+
|
|
10
|
+
Cron jobs schedule tasks through the Gateway. Use them for recurring syncs, backups, and reports.
|
|
11
|
+
|
|
12
|
+
## Basic commands
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
nexus cron list
|
|
16
|
+
nexus cron add --schedule "0 2 * * *" --command "eve sync" --name "Daily iMessage sync"
|
|
17
|
+
nexus cron remove <job-id>
|
|
18
|
+
nexus cron disable <job-id>
|
|
19
|
+
nexus cron enable <job-id>
|
|
20
|
+
nexus cron logs <job-id>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Schedule format
|
|
24
|
+
|
|
25
|
+
Standard cron syntax: `minute hour day month weekday`
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
|
|
29
|
+
- `0 9 * * *` daily at 9:00
|
|
30
|
+
- `*/30 * * * *` every 30 minutes
|
|
31
|
+
- `0 * * * *` hourly
|
|
32
|
+
- `0 0 * * 0` Sundays at midnight
|
|
33
|
+
|
|
34
|
+
## Common use cases
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Hourly WhatsApp sync
|
|
38
|
+
nexus cron add --schedule "0 * * * *" --command "wacli sync" --name "Hourly WhatsApp sync"
|
|
39
|
+
|
|
40
|
+
# Nightly backup
|
|
41
|
+
nexus cron add --schedule "0 3 * * *" --command "nexus-cloud push -m 'Daily backup'" --name "Daily backup"
|
|
42
|
+
|
|
43
|
+
# Update qmd index
|
|
44
|
+
nexus cron add --schedule "0 * * * *" --command "qmd update" --name "Index update"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Best practices
|
|
48
|
+
|
|
49
|
+
- Test commands manually before scheduling.
|
|
50
|
+
- Use absolute paths for binaries if PATH is unknown.
|
|
51
|
+
- Redirect output to logs for debugging.
|
|
52
|
+
|
|
53
|
+
## Troubleshooting
|
|
54
|
+
|
|
55
|
+
If jobs do not run:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
nexus status
|
|
59
|
+
nexus cron list
|
|
60
|
+
nexus cron logs <job-id>
|
|
61
|
+
```
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Heartbeat polling messages and notification rules"
|
|
3
|
+
read_when:
|
|
4
|
+
- Adjusting heartbeat cadence or messaging
|
|
5
|
+
---
|
|
6
|
+
# Heartbeat (Gateway)
|
|
7
|
+
|
|
8
|
+
Heartbeat runs **periodic agent turns** in the main session so the model can
|
|
9
|
+
surface anything that needs attention without spamming you.
|
|
10
|
+
|
|
11
|
+
## Quick start (beginner)
|
|
12
|
+
|
|
13
|
+
1. Leave heartbeats enabled (default is `30m`) or set your own cadence.
|
|
14
|
+
2. Create a tiny `HEARTBEAT.md` checklist in the agent workspace (optional but recommended).
|
|
15
|
+
3. Decide where heartbeat messages should go (`target: "last"` is the default).
|
|
16
|
+
4. Optional: enable heartbeat reasoning delivery for transparency.
|
|
17
|
+
|
|
18
|
+
Example config:
|
|
19
|
+
|
|
20
|
+
```json5
|
|
21
|
+
{
|
|
22
|
+
agents: {
|
|
23
|
+
defaults: {
|
|
24
|
+
heartbeat: {
|
|
25
|
+
every: "30m",
|
|
26
|
+
target: "last",
|
|
27
|
+
// includeReasoning: true, // optional: send separate `Reasoning:` message too
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Defaults
|
|
35
|
+
|
|
36
|
+
- Interval: `30m` (set `agents.defaults.heartbeat.every`; use `0m` to disable).
|
|
37
|
+
- Prompt body (configurable via `agents.defaults.heartbeat.prompt`):
|
|
38
|
+
`Read HEARTBEAT.md if exists. Consider outstanding tasks. Checkup sometimes on your human during (user local) day time.`
|
|
39
|
+
- The heartbeat prompt is sent **verbatim** as the user message. The system
|
|
40
|
+
prompt includes a “Heartbeat” section and the run is flagged internally.
|
|
41
|
+
|
|
42
|
+
## What the heartbeat prompt is for
|
|
43
|
+
|
|
44
|
+
The default prompt is intentionally broad:
|
|
45
|
+
- **Background tasks**: “Consider outstanding tasks” nudges the agent to review
|
|
46
|
+
follow-ups (inbox, calendar, reminders, queued work) and surface anything urgent.
|
|
47
|
+
- **Human check-in**: “Checkup sometimes on your human during day time” nudges an
|
|
48
|
+
occasional lightweight “anything you need?” message, but avoids night-time spam
|
|
49
|
+
by using your configured local timezone (see [/concepts/timezone](/concepts/timezone)).
|
|
50
|
+
|
|
51
|
+
If you want a heartbeat to do something very specific (e.g. “check Gmail PubSub
|
|
52
|
+
stats” or “verify gateway health”), set `agents.defaults.heartbeat.prompt` to a
|
|
53
|
+
custom body (sent verbatim).
|
|
54
|
+
|
|
55
|
+
## Response contract
|
|
56
|
+
|
|
57
|
+
- If nothing needs attention, reply with **`HEARTBEAT_OK`**.
|
|
58
|
+
- During heartbeat runs, Nexus treats `HEARTBEAT_OK` as an ack when it appears
|
|
59
|
+
at the **start or end** of the reply. The token is stripped and the reply is
|
|
60
|
+
dropped if the remaining content is **≤ `ackMaxChars`** (default: 300).
|
|
61
|
+
- If `HEARTBEAT_OK` appears in the **middle** of a reply, it is not treated
|
|
62
|
+
specially.
|
|
63
|
+
- For alerts, **do not** include `HEARTBEAT_OK`; return only the alert text.
|
|
64
|
+
|
|
65
|
+
Outside heartbeats, stray `HEARTBEAT_OK` at the start/end of a message is stripped
|
|
66
|
+
and logged; a message that is only `HEARTBEAT_OK` is dropped.
|
|
67
|
+
|
|
68
|
+
## Config
|
|
69
|
+
|
|
70
|
+
```json5
|
|
71
|
+
{
|
|
72
|
+
agents: {
|
|
73
|
+
defaults: {
|
|
74
|
+
heartbeat: {
|
|
75
|
+
every: "30m", // default: 30m (0m disables)
|
|
76
|
+
model: "anthropic/claude-opus-4-5",
|
|
77
|
+
includeReasoning: false, // default: false (deliver separate Reasoning: message when available)
|
|
78
|
+
target: "last", // last | whatsapp | telegram | discord | slack | signal | imessage | none
|
|
79
|
+
to: "+15551234567", // optional provider-specific override
|
|
80
|
+
prompt: "Read HEARTBEAT.md if exists. Consider outstanding tasks. Checkup sometimes on your human during (user local) day time.",
|
|
81
|
+
ackMaxChars: 300 // max chars allowed after HEARTBEAT_OK
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Field notes
|
|
89
|
+
|
|
90
|
+
- `every`: heartbeat interval (duration string; default unit = minutes).
|
|
91
|
+
- `model`: optional model override for heartbeat runs (`provider/model`).
|
|
92
|
+
- `includeReasoning`: when enabled, also deliver the separate `Reasoning:` message when available (same shape as `/reasoning on`).
|
|
93
|
+
- `target`:
|
|
94
|
+
- `last` (default): deliver to the last used external provider.
|
|
95
|
+
- explicit provider: `whatsapp` / `telegram` / `discord` / `slack` / `signal` / `imessage`.
|
|
96
|
+
- `none`: run the heartbeat but **do not deliver** externally.
|
|
97
|
+
- `to`: optional recipient override (E.164 for WhatsApp, chat id for Telegram, etc.).
|
|
98
|
+
- `prompt`: overrides the default prompt body (not merged).
|
|
99
|
+
- `ackMaxChars`: max chars allowed after `HEARTBEAT_OK` before delivery.
|
|
100
|
+
|
|
101
|
+
## Delivery behavior
|
|
102
|
+
|
|
103
|
+
- Heartbeats run in the **main session** (`main`, or `global` when scope is global).
|
|
104
|
+
- If the main queue is busy, the heartbeat is skipped and retried later.
|
|
105
|
+
- If `target` resolves to no external destination, the run still happens but no
|
|
106
|
+
outbound message is sent.
|
|
107
|
+
- Heartbeat-only replies do **not** keep the session alive; the last `updatedAt`
|
|
108
|
+
is restored so idle expiry behaves normally.
|
|
109
|
+
|
|
110
|
+
## HEARTBEAT.md (optional)
|
|
111
|
+
|
|
112
|
+
If a `HEARTBEAT.md` file exists in the workspace, the default prompt tells the
|
|
113
|
+
agent to read it. Think of it as your “heartbeat checklist”: small, stable, and
|
|
114
|
+
safe to include every 30 minutes.
|
|
115
|
+
|
|
116
|
+
Keep it tiny (short checklist or reminders) to avoid prompt bloat.
|
|
117
|
+
|
|
118
|
+
Example `HEARTBEAT.md`:
|
|
119
|
+
|
|
120
|
+
```md
|
|
121
|
+
# Heartbeat checklist
|
|
122
|
+
|
|
123
|
+
- Quick scan: anything urgent in inboxes?
|
|
124
|
+
- If it’s daytime, do a lightweight check-in if nothing else is pending.
|
|
125
|
+
- If a task is blocked, write down *what is missing* and ask Peter next time.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Can the agent update HEARTBEAT.md?
|
|
129
|
+
|
|
130
|
+
Yes — if you ask it to.
|
|
131
|
+
|
|
132
|
+
`HEARTBEAT.md` is just a normal file in the agent workspace, so you can tell the
|
|
133
|
+
agent (in a normal chat) something like:
|
|
134
|
+
- “Update `HEARTBEAT.md` to add a daily calendar check.”
|
|
135
|
+
- “Rewrite `HEARTBEAT.md` so it’s shorter and focused on inbox follow-ups.”
|
|
136
|
+
|
|
137
|
+
If you want this to happen proactively, you can also include an explicit line in
|
|
138
|
+
your heartbeat prompt like: “If the checklist becomes stale, update HEARTBEAT.md
|
|
139
|
+
with a better one.”
|
|
140
|
+
|
|
141
|
+
Safety note: don’t put secrets (API keys, phone numbers, private tokens) into
|
|
142
|
+
`HEARTBEAT.md` — it becomes part of the prompt context.
|
|
143
|
+
|
|
144
|
+
## Manual wake (on-demand)
|
|
145
|
+
|
|
146
|
+
You can enqueue a system event and trigger an immediate heartbeat with:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
nexus wake --text "Check for urgent follow-ups" --mode now
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Use `--mode next-heartbeat` to wait for the next scheduled tick.
|
|
153
|
+
|
|
154
|
+
## Reasoning delivery (optional)
|
|
155
|
+
|
|
156
|
+
By default, heartbeats deliver only the final “answer” payload.
|
|
157
|
+
|
|
158
|
+
If you want transparency, enable:
|
|
159
|
+
- `agents.defaults.heartbeat.includeReasoning: true`
|
|
160
|
+
|
|
161
|
+
When enabled, heartbeats will also deliver a separate message prefixed
|
|
162
|
+
`Reasoning:` (same shape as `/reasoning on`). This can be useful when the agent
|
|
163
|
+
is managing multiple sessions/codexes and you want to see why it decided to ping
|
|
164
|
+
you — but it can also leak more internal detail than you want. Prefer keeping it
|
|
165
|
+
off in group chats.
|
|
166
|
+
|
|
167
|
+
## Cost awareness
|
|
168
|
+
|
|
169
|
+
Heartbeats run full agent turns. Shorter intervals burn more tokens. Keep
|
|
170
|
+
`HEARTBEAT.md` small and consider a cheaper `model` or `target: "none"` if you
|
|
171
|
+
only want internal state updates.
|
|
172
|
+
|
|
173
|
+
## Heartbeat commands
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
nexus heartbeat list
|
|
177
|
+
nexus heartbeat status <heartbeat-name>
|
|
178
|
+
nexus heartbeat logs <heartbeat-name>
|
|
179
|
+
nexus heartbeat run <heartbeat-name>
|
|
180
|
+
nexus heartbeat disable <heartbeat-name>
|
|
181
|
+
nexus heartbeat enable <heartbeat-name>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Example heartbeats
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
heartbeats:
|
|
188
|
+
- name: "Ollama health"
|
|
189
|
+
interval: 60
|
|
190
|
+
command: "curl -sf http://localhost:11434/api/tags > /dev/null"
|
|
191
|
+
alert_on_failure: true
|
|
192
|
+
alert_after: 2
|
|
193
|
+
|
|
194
|
+
- name: "Disk space"
|
|
195
|
+
interval: 300
|
|
196
|
+
command: "df -h / | awk 'NR==2 {print $5}' | sed 's/%//' | awk '{if ($1 > 90) exit 1}'"
|
|
197
|
+
alert_on_failure: true
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Troubleshooting
|
|
201
|
+
|
|
202
|
+
If heartbeats do not run:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
nexus status
|
|
206
|
+
nexus heartbeat list
|
|
207
|
+
```
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gateway-owned node pairing (Option B) for iOS and other remote nodes"
|
|
3
|
+
read_when:
|
|
4
|
+
- Implementing node pairing approvals without macOS UI
|
|
5
|
+
- Adding CLI flows for approving remote nodes
|
|
6
|
+
- Extending gateway protocol with node management
|
|
7
|
+
---
|
|
8
|
+
# Gateway-owned pairing (Option B)
|
|
9
|
+
|
|
10
|
+
Goal: The Gateway (`nexus`) is the **source of truth** for which nodes are allowed to join the network.
|
|
11
|
+
|
|
12
|
+
This enables:
|
|
13
|
+
- Headless approval via terminal/CLI (no Swift UI required).
|
|
14
|
+
- Optional macOS UI approval (Swift app is just a frontend).
|
|
15
|
+
- One consistent membership store for iOS, mac nodes, future hardware nodes.
|
|
16
|
+
|
|
17
|
+
## Concepts
|
|
18
|
+
- **Pending request**: a node asked to join; requires explicit approve/reject.
|
|
19
|
+
- **Paired node**: node is allowed; gateway returns an auth token for subsequent connects.
|
|
20
|
+
- **Bridge**: direct transport endpoint owned by the gateway. The bridge does not decide membership.
|
|
21
|
+
|
|
22
|
+
## API surface (gateway protocol)
|
|
23
|
+
These are conceptual method names; wire them into [`src/gateway/protocol/schema.ts`](https://github.com/nexus/nexus/blob/main/src/gateway/protocol/schema.ts) and regenerate Swift types.
|
|
24
|
+
|
|
25
|
+
### Events
|
|
26
|
+
- `node.pair.requested`
|
|
27
|
+
- Emitted whenever a new pending pairing request is created.
|
|
28
|
+
- Payload:
|
|
29
|
+
- `requestId` (string)
|
|
30
|
+
- `nodeId` (string)
|
|
31
|
+
- `displayName?` (string)
|
|
32
|
+
- `platform?` (string)
|
|
33
|
+
- `version?` (string)
|
|
34
|
+
- `remoteIp?` (string)
|
|
35
|
+
- `silent?` (boolean) — hint that the UI may attempt auto-approval
|
|
36
|
+
- `ts` (ms since epoch)
|
|
37
|
+
- `node.pair.resolved`
|
|
38
|
+
- Emitted when a pending request is approved/rejected.
|
|
39
|
+
- Payload:
|
|
40
|
+
- `requestId` (string)
|
|
41
|
+
- `nodeId` (string)
|
|
42
|
+
- `decision` ("approved" | "rejected" | "expired")
|
|
43
|
+
- `ts` (ms since epoch)
|
|
44
|
+
|
|
45
|
+
### Methods
|
|
46
|
+
- `node.pair.request`
|
|
47
|
+
- Creates (or returns) a pending request.
|
|
48
|
+
- Params: node metadata (same shape as `node.pair.requested` payload, minus `requestId`/`ts`).
|
|
49
|
+
- Optional `silent` flag hints that the UI can attempt an SSH auto-approve before showing an alert.
|
|
50
|
+
- Result:
|
|
51
|
+
- `status` ("pending")
|
|
52
|
+
- `created` (boolean) — whether this call created the pending request
|
|
53
|
+
- `request` (pending request object), including `isRepair` when the node was already paired
|
|
54
|
+
- Security: **never returns an existing token**. If a paired node “lost” its token, it must be approved again (token rotation).
|
|
55
|
+
- `node.pair.list`
|
|
56
|
+
- Returns:
|
|
57
|
+
- `pending[]` (pending requests)
|
|
58
|
+
- `paired[]` (paired node records)
|
|
59
|
+
- `node.pair.approve`
|
|
60
|
+
- Params: `{ requestId }`
|
|
61
|
+
- Result: `{ requestId, node: { nodeId, token, ... } }`
|
|
62
|
+
- Must be idempotent (first decision wins).
|
|
63
|
+
- `node.pair.reject`
|
|
64
|
+
- Params: `{ requestId }`
|
|
65
|
+
- Result: `{ requestId, nodeId }`
|
|
66
|
+
- `node.pair.verify`
|
|
67
|
+
- Params: `{ nodeId, token }`
|
|
68
|
+
- Result: `{ ok: boolean, node?: { nodeId, ... } }`
|
|
69
|
+
|
|
70
|
+
## CLI flows
|
|
71
|
+
CLI must be able to fully operate without any GUI:
|
|
72
|
+
- `nexus nodes pending`
|
|
73
|
+
- `nexus nodes approve <requestId>`
|
|
74
|
+
- `nexus nodes reject <requestId>`
|
|
75
|
+
- `nexus nodes status` (paired nodes + connection status/capabilities)
|
|
76
|
+
|
|
77
|
+
Optional interactive helper:
|
|
78
|
+
- `nexus nodes watch` (subscribe to `node.pair.requested` and prompt in-place)
|
|
79
|
+
|
|
80
|
+
Implementation pointers:
|
|
81
|
+
- CLI commands: [`src/cli/nodes-cli.ts`](https://github.com/nexus/nexus/blob/main/src/cli/nodes-cli.ts)
|
|
82
|
+
- Gateway handlers + events: [`src/gateway/server.ts`](https://github.com/nexus/nexus/blob/main/src/gateway/server.ts) + [`src/gateway/server-methods/nodes.ts`](https://github.com/nexus/nexus/blob/main/src/gateway/server-methods/nodes.ts)
|
|
83
|
+
- Pairing store: [`src/infra/node-pairing.ts`](https://github.com/nexus/nexus/blob/main/src/infra/node-pairing.ts) (under `~/nexus/state/nodes/`)
|
|
84
|
+
- Optional macOS UI prompt (frontend only): [`apps/macos/Sources/Nexus/NodePairingApprovalPrompter.swift`](https://github.com/nexus/nexus/blob/main/apps/macos/Sources/Nexus/NodePairingApprovalPrompter.swift)
|
|
85
|
+
- Push-first: listens to `node.pair.requested`/`node.pair.resolved`, does a `node.pair.list` on startup/reconnect,
|
|
86
|
+
and only runs a slow safety poll while a request is pending/visible.
|
|
87
|
+
|
|
88
|
+
## Storage (private, local)
|
|
89
|
+
Gateway stores the authoritative state under `~/nexus/state/`:
|
|
90
|
+
- `~/nexus/state/nodes/paired.json`
|
|
91
|
+
- `~/nexus/state/nodes/pending.json` (or `~/nexus/state/nodes/pending/*.json`)
|
|
92
|
+
|
|
93
|
+
Notes:
|
|
94
|
+
- Tokens are secrets. Treat `paired.json` as sensitive.
|
|
95
|
+
- Pending entries should have a TTL (e.g. 5 minutes) and expire automatically.
|
|
96
|
+
|
|
97
|
+
## Bridge integration
|
|
98
|
+
Target direction:
|
|
99
|
+
- The gateway runs the bridge listener (LAN/tailnet-facing) and advertises discovery beacons (Bonjour).
|
|
100
|
+
- The bridge is transport only; it forwards/scopes requests and enforces ACLs, but pairing decisions are made by the gateway.
|
|
101
|
+
|
|
102
|
+
The macOS UI (Swift) can:
|
|
103
|
+
- Subscribe to `node.pair.requested`, show an alert (including `remoteIp`), and call `node.pair.approve` or `node.pair.reject`.
|
|
104
|
+
- Or ignore/dismiss (“Later”) and let CLI handle it.
|
|
105
|
+
- When `silent` is set, it can try a short SSH probe (same user) and auto-approve if reachable; otherwise fall back to the normal alert.
|
|
106
|
+
|
|
107
|
+
## Implementation note
|
|
108
|
+
If the bridge is only provided by the macOS app, then “no Swift app running” cannot work end-to-end.
|
|
109
|
+
The long-term goal is to move bridge hosting + Bonjour advertising into the Node gateway so headless pairing works by default.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gateway singleton guard using the WebSocket listener bind"
|
|
3
|
+
read_when:
|
|
4
|
+
- Running or debugging the gateway process
|
|
5
|
+
- Investigating single-instance enforcement
|
|
6
|
+
---
|
|
7
|
+
# Gateway lock
|
|
8
|
+
|
|
9
|
+
Last updated: 2025-12-11
|
|
10
|
+
|
|
11
|
+
## Why
|
|
12
|
+
- Ensure only one gateway instance runs per host.
|
|
13
|
+
- Survive crashes/SIGKILL without leaving stale lock files.
|
|
14
|
+
- Fail fast with a clear error when the control port is already occupied.
|
|
15
|
+
|
|
16
|
+
## Mechanism
|
|
17
|
+
- The gateway binds the WebSocket listener (default `ws://127.0.0.1:18789`) immediately on startup using an exclusive TCP listener.
|
|
18
|
+
- If the bind fails with `EADDRINUSE`, startup throws `GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>")`.
|
|
19
|
+
- The OS releases the listener automatically on any process exit, including crashes and SIGKILL—no separate lock file or cleanup step is needed.
|
|
20
|
+
- On shutdown the gateway closes the WebSocket server and underlying HTTP server to free the port promptly.
|
|
21
|
+
|
|
22
|
+
## Error surface
|
|
23
|
+
- If another process holds the port, startup throws `GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>")`.
|
|
24
|
+
- Other bind failures surface as `GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: …")`.
|
|
25
|
+
|
|
26
|
+
## Operational notes
|
|
27
|
+
- If the port is occupied by *another* process, the error is the same; free the port or choose another with `nexus gateway --port <port>`.
|
|
28
|
+
- The macOS app still maintains its own lightweight PID guard before spawning the gateway; the runtime lock is enforced by the WebSocket bind.
|
package/docs/gateway.md
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Runbook for the Gateway daemon, lifecycle, and operations"
|
|
3
|
+
read_when:
|
|
4
|
+
- Running or debugging the gateway process
|
|
5
|
+
---
|
|
6
|
+
# Gateway (daemon) runbook
|
|
7
|
+
|
|
8
|
+
Last updated: 2025-12-09
|
|
9
|
+
|
|
10
|
+
## What it is
|
|
11
|
+
- The always-on process that owns the single Baileys/Telegram connection and the control/event plane.
|
|
12
|
+
- Replaces the legacy `gateway` command. CLI entry point: `nexus gateway`.
|
|
13
|
+
- Runs until stopped; exits non-zero on fatal errors so the supervisor restarts it.
|
|
14
|
+
|
|
15
|
+
## How to run (local)
|
|
16
|
+
```bash
|
|
17
|
+
pnpm nexus gateway --port 18789
|
|
18
|
+
# for full debug/trace logs in stdio:
|
|
19
|
+
pnpm nexus gateway --port 18789 --verbose
|
|
20
|
+
# if the port is busy, terminate listeners then start:
|
|
21
|
+
pnpm nexus gateway --force
|
|
22
|
+
# dev loop (auto-reload on TS changes):
|
|
23
|
+
pnpm gateway:watch
|
|
24
|
+
```
|
|
25
|
+
- Config hot reload watches `~/nexus/state/nexus.json` (or `NEXUS_CONFIG_PATH`).
|
|
26
|
+
- Default mode: `gateway.reload.mode="hybrid"` (hot-apply safe changes, restart on critical).
|
|
27
|
+
- Hot reload uses in-process restart via **SIGUSR1** when needed.
|
|
28
|
+
- Disable with `gateway.reload.mode="off"`.
|
|
29
|
+
- Binds WebSocket control plane to `127.0.0.1:<port>` (default 18789).
|
|
30
|
+
- The same port also serves HTTP (control UI, hooks, A2UI). Single-port multiplex.
|
|
31
|
+
- Starts a Canvas file server by default on `canvasHost.port` (default `18793`), serving `http://<gateway-host>:18793/__nexus__/canvas/` from `~/nexus/canvas`. Disable with `canvasHost.enabled=false` or `NEXUS_SKIP_CANVAS_HOST=1`.
|
|
32
|
+
- Logs to stdout; use launchd/systemd to keep it alive and rotate logs.
|
|
33
|
+
- Pass `--verbose` to mirror debug logging (handshakes, req/res, events) from the log file into stdio when troubleshooting.
|
|
34
|
+
- `--force` uses `lsof` to find listeners on the chosen port, sends SIGTERM, logs what it killed, then starts the gateway (fails fast if `lsof` is missing).
|
|
35
|
+
- If you run under a supervisor (launchd/systemd/mac app child-process mode), a stop/restart typically sends **SIGTERM**; older builds may surface this as `pnpm` `ELIFECYCLE` exit code **143** (SIGTERM), which is a normal shutdown, not a crash.
|
|
36
|
+
- **SIGUSR1** triggers an in-process restart (no external supervisor required). This is what the `gateway` agent tool uses.
|
|
37
|
+
- Optional shared secret: pass `--token <value>` or set `NEXUS_GATEWAY_TOKEN` to require clients to send `connect.params.auth.token`.
|
|
38
|
+
- Port precedence: `--port` > `NEXUS_GATEWAY_PORT` > `gateway.port` > default `18789`.
|
|
39
|
+
|
|
40
|
+
## Remote access
|
|
41
|
+
- Tailscale/VPN preferred; otherwise SSH tunnel:
|
|
42
|
+
```bash
|
|
43
|
+
ssh -N -L 18789:127.0.0.1:18789 user@host
|
|
44
|
+
```
|
|
45
|
+
- Clients then connect to `ws://127.0.0.1:18789` through the tunnel.
|
|
46
|
+
- If a token is configured, clients must include it in `connect.params.auth.token` even over the tunnel.
|
|
47
|
+
|
|
48
|
+
## Multiple gateways (same host)
|
|
49
|
+
|
|
50
|
+
Supported if you isolate state + config and use unique ports.
|
|
51
|
+
|
|
52
|
+
### Dev profile (`--dev`)
|
|
53
|
+
|
|
54
|
+
Fast path: run a fully-isolated dev instance (config/state/workspace) without touching your primary setup.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
nexus --dev setup
|
|
58
|
+
nexus --dev gateway --allow-unconfigured
|
|
59
|
+
# then target the dev instance:
|
|
60
|
+
nexus --dev status
|
|
61
|
+
nexus --dev health
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Defaults (can be overridden via env/flags/config):
|
|
65
|
+
- `NEXUS_STATE_DIR=~/nexus/state-dev`
|
|
66
|
+
- `NEXUS_CONFIG_PATH=~/nexus/state-dev/nexus.json`
|
|
67
|
+
- `NEXUS_GATEWAY_PORT=19001` (Gateway WS + HTTP)
|
|
68
|
+
- `bridge.port=19002` (derived: `gateway.port+1`)
|
|
69
|
+
- `browser.controlUrl=http://127.0.0.1:19003` (derived: `gateway.port+2`)
|
|
70
|
+
- `canvasHost.port=19005` (derived: `gateway.port+4`)
|
|
71
|
+
- `agent.workspace` default becomes `~/nexus-dev` when you run `setup`/`onboard` under `--dev`.
|
|
72
|
+
|
|
73
|
+
Derived ports (rules of thumb):
|
|
74
|
+
- Base port = `gateway.port` (or `NEXUS_GATEWAY_PORT` / `--port`)
|
|
75
|
+
- `bridge.port = base + 1` (or `NEXUS_BRIDGE_PORT` / config override)
|
|
76
|
+
- `browser.controlUrl port = base + 2` (or `NEXUS_BROWSER_CONTROL_URL` / config override)
|
|
77
|
+
- `canvasHost.port = base + 4` (or `NEXUS_CANVAS_HOST_PORT` / config override)
|
|
78
|
+
- Browser profile CDP ports auto-allocate from `browser.controlPort + 9 .. + 108` (persisted per profile).
|
|
79
|
+
|
|
80
|
+
Checklist per instance:
|
|
81
|
+
- unique `gateway.port`
|
|
82
|
+
- unique `NEXUS_CONFIG_PATH`
|
|
83
|
+
- unique `NEXUS_STATE_DIR`
|
|
84
|
+
- unique `agent.workspace`
|
|
85
|
+
- separate WhatsApp numbers (if using WA)
|
|
86
|
+
|
|
87
|
+
Example:
|
|
88
|
+
```bash
|
|
89
|
+
NEXUS_CONFIG_PATH=~/nexus/state/a.json NEXUS_STATE_DIR=~/nexus/state-a nexus gateway --port 19001
|
|
90
|
+
NEXUS_CONFIG_PATH=~/nexus/state/b.json NEXUS_STATE_DIR=~/nexus/state-b nexus gateway --port 19002
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Protocol (operator view)
|
|
94
|
+
- Mandatory first frame from client: `req {type:"req", id, method:"connect", params:{minProtocol,maxProtocol,client:{name,version,platform,deviceFamily?,modelIdentifier?,mode,instanceId}, caps, auth?, locale?, userAgent? } }`.
|
|
95
|
+
- Gateway replies `res {type:"res", id, ok:true, payload:hello-ok }` (or `ok:false` with an error, then closes).
|
|
96
|
+
- After handshake:
|
|
97
|
+
- Requests: `{type:"req", id, method, params}` → `{type:"res", id, ok, payload|error}`
|
|
98
|
+
- Events: `{type:"event", event, payload, seq?, stateVersion?}`
|
|
99
|
+
- Structured presence entries: `{host, ip, version, platform?, deviceFamily?, modelIdentifier?, mode, lastInputSeconds?, ts, reason?, tags?[], instanceId? }`.
|
|
100
|
+
- `agent` responses are two-stage: first `res` ack `{runId,status:"accepted"}`, then a final `res` `{runId,status:"ok"|"error",summary}` after the run finishes; streamed output arrives as `event:"agent"`.
|
|
101
|
+
|
|
102
|
+
## Methods (initial set)
|
|
103
|
+
- `health` — full health snapshot (same shape as `nexus health --json`).
|
|
104
|
+
- `status` — short summary.
|
|
105
|
+
- `system-presence` — current presence list.
|
|
106
|
+
- `system-event` — post a presence/system note (structured).
|
|
107
|
+
- `send` — send a message via the active provider(s).
|
|
108
|
+
- `agent` — run an agent turn (streams events back on same connection).
|
|
109
|
+
- `node.list` — list paired + currently-connected bridge nodes (includes `caps`, `deviceFamily`, `modelIdentifier`, `paired`, `connected`, and advertised `commands`).
|
|
110
|
+
- `node.describe` — describe a node (capabilities + supported `node.invoke` commands; works for paired nodes and for currently-connected unpaired nodes).
|
|
111
|
+
- `node.invoke` — invoke a command on a node (e.g. `canvas.*`, `camera.*`).
|
|
112
|
+
- `node.pair.*` — pairing lifecycle (`request`, `list`, `approve`, `reject`, `verify`).
|
|
113
|
+
|
|
114
|
+
See also: [`docs/presence.md`](https://docs.nexus.bot/presence) for how presence is produced/deduped and why `instanceId` matters.
|
|
115
|
+
|
|
116
|
+
## Events
|
|
117
|
+
- `agent` — streamed tool/output events from the agent run (seq-tagged).
|
|
118
|
+
- `presence` — presence updates (deltas with stateVersion) pushed to all connected clients.
|
|
119
|
+
- `tick` — periodic keepalive/no-op to confirm liveness.
|
|
120
|
+
- `shutdown` — Gateway is exiting; payload includes `reason` and optional `restartExpectedMs`. Clients should reconnect.
|
|
121
|
+
|
|
122
|
+
## WebChat integration
|
|
123
|
+
- WebChat is a native SwiftUI UI that talks directly to the Gateway WebSocket for history, sends, abort, and events.
|
|
124
|
+
- Remote use goes through the same SSH/Tailscale tunnel; if a gateway token is configured, the client includes it during `connect`.
|
|
125
|
+
- macOS app connects via a single WS (shared connection); it hydrates presence from the initial snapshot and listens for `presence` events to update the UI.
|
|
126
|
+
|
|
127
|
+
## Typing and validation
|
|
128
|
+
- Server validates every inbound frame with AJV against JSON Schema emitted from the protocol definitions.
|
|
129
|
+
- Clients (TS/Swift) consume generated types (TS directly; Swift via the repo’s generator).
|
|
130
|
+
- Types live in `src/gateway/protocol/*.ts`; regenerate schemas/models with `pnpm protocol:gen` (writes `dist/protocol.schema.json`) and `pnpm protocol:gen:swift` (writes `apps/macos/Sources/NexusProtocol/GatewayModels.swift`).
|
|
131
|
+
|
|
132
|
+
## Connection snapshot
|
|
133
|
+
- `hello-ok` includes a `snapshot` with `presence`, `health`, `stateVersion`, and `uptimeMs` plus `policy {maxPayload,maxBufferedBytes,tickIntervalMs}` so clients can render immediately without extra requests.
|
|
134
|
+
- `health`/`system-presence` remain available for manual refresh, but are not required at connect time.
|
|
135
|
+
|
|
136
|
+
## Error codes (res.error shape)
|
|
137
|
+
- Errors use `{ code, message, details?, retryable?, retryAfterMs? }`.
|
|
138
|
+
- Standard codes:
|
|
139
|
+
- `NOT_LINKED` — WhatsApp not authenticated.
|
|
140
|
+
- `AGENT_TIMEOUT` — agent did not respond within the configured deadline.
|
|
141
|
+
- `INVALID_REQUEST` — schema/param validation failed.
|
|
142
|
+
- `UNAVAILABLE` — Gateway is shutting down or a dependency is unavailable.
|
|
143
|
+
|
|
144
|
+
## Keepalive behavior
|
|
145
|
+
- `tick` events (or WS ping/pong) are emitted periodically so clients know the Gateway is alive even when no traffic occurs.
|
|
146
|
+
- Send/agent acknowledgements remain separate responses; do not overload ticks for sends.
|
|
147
|
+
|
|
148
|
+
## Replay / gaps
|
|
149
|
+
- Events are not replayed. Clients detect seq gaps and should refresh (`health` + `system-presence`) before continuing. WebChat and macOS clients now auto-refresh on gap.
|
|
150
|
+
|
|
151
|
+
## Supervision (macOS example)
|
|
152
|
+
- Use launchd to keep the daemon alive:
|
|
153
|
+
- Program: path to `nexus`
|
|
154
|
+
- Arguments: `gateway`
|
|
155
|
+
- KeepAlive: true
|
|
156
|
+
- StandardOut/Err: file paths or `syslog`
|
|
157
|
+
- On failure, launchd restarts; fatal misconfig should keep exiting so the operator notices.
|
|
158
|
+
- LaunchAgents are per-user and require a logged-in session; for headless setups use a custom LaunchDaemon (not shipped).
|
|
159
|
+
|
|
160
|
+
Bundled mac app:
|
|
161
|
+
- Nexus.app can bundle a bun-compiled gateway binary and install a per-user LaunchAgent labeled `com.nexus.gateway`.
|
|
162
|
+
- To stop it cleanly, use `nexus gateway stop` (or `launchctl bootout gui/$UID/com.nexus.gateway`).
|
|
163
|
+
- To restart, use `nexus gateway restart` (or `launchctl kickstart -k gui/$UID/com.nexus.gateway`).
|
|
164
|
+
|
|
165
|
+
## Supervision (systemd user unit)
|
|
166
|
+
Create `~/.config/systemd/user/nexus-gateway.service`:
|
|
167
|
+
```
|
|
168
|
+
[Unit]
|
|
169
|
+
Description=Nexus Gateway
|
|
170
|
+
After=network-online.target
|
|
171
|
+
Wants=network-online.target
|
|
172
|
+
|
|
173
|
+
[Service]
|
|
174
|
+
ExecStart=/usr/local/bin/nexus gateway --port 18789
|
|
175
|
+
Restart=always
|
|
176
|
+
RestartSec=5
|
|
177
|
+
Environment=NEXUS_GATEWAY_TOKEN=
|
|
178
|
+
WorkingDirectory=/home/youruser
|
|
179
|
+
|
|
180
|
+
[Install]
|
|
181
|
+
WantedBy=default.target
|
|
182
|
+
```
|
|
183
|
+
Enable lingering (required so the user service survives logout/idle):
|
|
184
|
+
```
|
|
185
|
+
sudo loginctl enable-linger youruser
|
|
186
|
+
```
|
|
187
|
+
Onboarding runs this on Linux (may prompt for sudo; writes `/var/lib/systemd/linger`).
|
|
188
|
+
Then enable the service:
|
|
189
|
+
```
|
|
190
|
+
systemctl --user enable --now nexus-gateway.service
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Alternative (system service)** - for always-on or multi-user servers, you can
|
|
194
|
+
install a systemd **system** unit instead of a user unit (no lingering needed).
|
|
195
|
+
Create `/etc/systemd/system/nexus-gateway.service` (copy the unit above,
|
|
196
|
+
switch `WantedBy=multi-user.target`, set `User=` + `WorkingDirectory=`), then:
|
|
197
|
+
```
|
|
198
|
+
sudo systemctl daemon-reload
|
|
199
|
+
sudo systemctl enable --now nexus-gateway.service
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Supervision (Windows scheduled task)
|
|
203
|
+
- Onboarding installs a Scheduled Task named `Nexus Gateway` (runs on user logon).
|
|
204
|
+
- Requires a logged-in user session; for headless setups use a system service or a task configured to run without a logged-in user (not shipped).
|
|
205
|
+
|
|
206
|
+
## Operational checks
|
|
207
|
+
- Liveness: open WS and send `req:connect` → expect `res` with `payload.type="hello-ok"` (with snapshot).
|
|
208
|
+
- Readiness: call `health` → expect `ok: true` and `web.linked=true`.
|
|
209
|
+
- Debug: subscribe to `tick` and `presence` events; ensure `status` shows linked/auth age; presence entries show Gateway host and connected clients.
|
|
210
|
+
|
|
211
|
+
## Safety guarantees
|
|
212
|
+
- Only one Gateway per host; all sends/agent calls must go through it.
|
|
213
|
+
- No fallback to direct Baileys connections; if the Gateway is down, sends fail fast.
|
|
214
|
+
- Non-connect first frames or malformed JSON are rejected and the socket is closed.
|
|
215
|
+
- Graceful shutdown: emit `shutdown` event before closing; clients must handle close + reconnect.
|
|
216
|
+
|
|
217
|
+
## CLI helpers
|
|
218
|
+
- `nexus gateway health|status` — request health/status over the Gateway WS.
|
|
219
|
+
- `nexus gateway send --to <num> --message "hi" [--media-url ...]` — send via Gateway (idempotent).
|
|
220
|
+
- `nexus gateway agent --message "hi" [--to ...]` — run an agent turn (waits for final by default).
|
|
221
|
+
- `nexus gateway call <method> --params '{"k":"v"}'` — raw method invoker for debugging.
|
|
222
|
+
- `nexus gateway stop|restart` — stop/restart the supervised gateway service (launchd/systemd/schtasks).
|
|
223
|
+
- Gateway helper subcommands assume a running gateway on `--url`; they no longer auto-spawn one.
|
|
224
|
+
|
|
225
|
+
## Migration guidance
|
|
226
|
+
- Retire uses of `nexus gateway` and the legacy TCP control port.
|
|
227
|
+
- Update clients to speak the WS protocol with mandatory connect and structured presence.
|