@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
package/docs/index.md
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Top-level overview of Nexus, features, and purpose"
|
|
3
|
+
read_when:
|
|
4
|
+
- Introducing Nexus to newcomers
|
|
5
|
+
---
|
|
6
|
+
# NEXUS 🦞
|
|
7
|
+
|
|
8
|
+
> *"EXFOLIATE! EXFOLIATE!"* — A space lobster, probably
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<img src="whatsapp-nexus.jpg" alt="NEXUS" width="420" />
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<p align="center">
|
|
15
|
+
<strong>Any OS + WhatsApp/Telegram/Discord/iMessage gateway for AI agents (Pi).</strong><br />
|
|
16
|
+
Send a message, get an agent response — from your pocket.
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="https://github.com/nexus/nexus">GitHub</a> ·
|
|
21
|
+
<a href="https://github.com/nexus/nexus/releases">Releases</a> ·
|
|
22
|
+
<a href="https://docs.nexus.bot">Docs</a> ·
|
|
23
|
+
<a href="https://docs.nexus.bot/nexus">Nexus setup</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
NEXUS bridges WhatsApp (via WhatsApp Web / Baileys), Telegram (Bot API / grammY), Discord (Bot API / discord.js), and iMessage (imsg CLI) to coding agents like [Pi](https://github.com/badlogic/pi-mono).
|
|
27
|
+
It’s built for [Nexus](https://nexus.me), a space lobster who needed a TARDIS.
|
|
28
|
+
|
|
29
|
+
## How it works
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
WhatsApp / Telegram / Discord
|
|
33
|
+
│
|
|
34
|
+
▼
|
|
35
|
+
┌──────────────────────────┐
|
|
36
|
+
│ Gateway │ ws://127.0.0.1:18789 (loopback-only)
|
|
37
|
+
│ (single source) │ tcp://0.0.0.0:18790 (Bridge)
|
|
38
|
+
│ │ http://<gateway-host>:18793/__nexus__/canvas/ (Canvas host)
|
|
39
|
+
└───────────┬───────────────┘
|
|
40
|
+
│
|
|
41
|
+
├─ Pi agent (RPC)
|
|
42
|
+
├─ CLI (nexus …)
|
|
43
|
+
├─ Chat UI (SwiftUI)
|
|
44
|
+
├─ macOS app (Nexus.app)
|
|
45
|
+
├─ iOS node via Bridge + pairing
|
|
46
|
+
└─ Android node via Bridge + pairing
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Most operations flow through the **Gateway** (`nexus gateway`), a single long-running process that owns provider connections and the WebSocket control plane.
|
|
50
|
+
|
|
51
|
+
## Network model
|
|
52
|
+
|
|
53
|
+
- **One Gateway per host**: it is the only process allowed to own the WhatsApp Web session.
|
|
54
|
+
- **Loopback-first**: Gateway WS defaults to `ws://127.0.0.1:18789`.
|
|
55
|
+
- For Tailnet access, run `nexus gateway --bind tailnet --token ...` (token is required for non-loopback binds).
|
|
56
|
+
- **Bridge for nodes**: optional LAN/tailnet-facing bridge on `tcp://0.0.0.0:18790` for paired nodes (Bonjour-discoverable).
|
|
57
|
+
- **Canvas host**: HTTP file server on `canvasHost.port` (default `18793`), serving `/__nexus__/canvas/` for node WebViews; see [`docs/configuration.md`](https://docs.nexus.bot/configuration) (`canvasHost`).
|
|
58
|
+
- **Remote use**: SSH tunnel or tailnet/VPN; see [`docs/remote.md`](https://docs.nexus.bot/remote) and [`docs/discovery.md`](https://docs.nexus.bot/discovery).
|
|
59
|
+
|
|
60
|
+
## Features (high level)
|
|
61
|
+
|
|
62
|
+
- 📱 **WhatsApp Integration** — Uses Baileys for WhatsApp Web protocol
|
|
63
|
+
- ✈️ **Telegram Bot** — DMs + groups via grammY
|
|
64
|
+
- 🎮 **Discord Bot** — DMs + guild channels via discord.js
|
|
65
|
+
- 💬 **iMessage** — Local imsg CLI integration (macOS)
|
|
66
|
+
- 🤖 **Agent bridge** — Pi (RPC mode) with tool streaming
|
|
67
|
+
- 🧠 **Multi-agent routing** — Route provider accounts/peers to isolated agents (workspace + per-agent sessions)
|
|
68
|
+
- 🔐 **Subscription auth** — Anthropic (Claude Pro/Max) + OpenAI (ChatGPT/Codex) via OAuth
|
|
69
|
+
- 💬 **Sessions** — Direct chats collapse into shared `main` (default); groups are isolated
|
|
70
|
+
- 👥 **Group Chat Support** — Mention-based by default; owner can toggle `/activation always|mention`
|
|
71
|
+
- 📎 **Media Support** — Send and receive images, audio, documents
|
|
72
|
+
- 🎤 **Voice notes** — Optional transcription hook
|
|
73
|
+
- 🖥️ **WebChat + macOS app** — Local UI + menu bar companion for ops and voice wake
|
|
74
|
+
- 📱 **iOS node** — Pairs as a node and exposes a Canvas surface
|
|
75
|
+
- 📱 **Android node** — Pairs as a node and exposes Canvas + Chat + Camera
|
|
76
|
+
|
|
77
|
+
Note: legacy Claude/Codex/Gemini/Opencode paths have been removed; Pi is the only coding-agent path.
|
|
78
|
+
|
|
79
|
+
## Quick start
|
|
80
|
+
|
|
81
|
+
Runtime requirement: **Node ≥ 22**.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# From source (recommended while the npm package is still settling)
|
|
85
|
+
pnpm install
|
|
86
|
+
pnpm build
|
|
87
|
+
pnpm link --global
|
|
88
|
+
|
|
89
|
+
# Pair WhatsApp Web (shows QR)
|
|
90
|
+
nexus login
|
|
91
|
+
|
|
92
|
+
# Run the Gateway (leave running)
|
|
93
|
+
nexus gateway --port 18789
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Multi-instance quickstart (optional):
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
NEXUS_CONFIG_PATH=~/nexus/state/a.json \
|
|
100
|
+
NEXUS_STATE_DIR=~/nexus/state-a \
|
|
101
|
+
nexus gateway --port 19001
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Send a test message (requires a running Gateway):
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
nexus send --to +15555550123 --message "Hello from NEXUS"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Configuration (optional)
|
|
111
|
+
|
|
112
|
+
Config lives at `~/nexus/state/nexus.json`.
|
|
113
|
+
|
|
114
|
+
- If you **do nothing**, NEXUS uses the bundled Pi binary in RPC mode with per-sender sessions.
|
|
115
|
+
- If you want to lock it down, start with `whatsapp.allowFrom` and (for groups) mention rules.
|
|
116
|
+
|
|
117
|
+
Example:
|
|
118
|
+
|
|
119
|
+
```json5
|
|
120
|
+
{
|
|
121
|
+
whatsapp: {
|
|
122
|
+
allowFrom: ["+15555550123"],
|
|
123
|
+
groups: { "*": { requireMention: true } }
|
|
124
|
+
},
|
|
125
|
+
routing: { groupChat: { mentionPatterns: ["@nexus"] } }
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Docs
|
|
130
|
+
|
|
131
|
+
- Start here:
|
|
132
|
+
- [Docs hubs (all pages linked)](https://docs.nexus.bot/hubs)
|
|
133
|
+
- [FAQ](https://docs.nexus.bot/faq) ← *common questions answered*
|
|
134
|
+
- [Configuration](https://docs.nexus.bot/configuration)
|
|
135
|
+
- [Multi-agent routing](https://docs.nexus.bot/multi-agent)
|
|
136
|
+
- [Updating / rollback](https://docs.nexus.bot/updating)
|
|
137
|
+
- [Pairing (DM + nodes)](https://docs.nexus.bot/pairing)
|
|
138
|
+
- [Nix mode](https://docs.nexus.bot/nix)
|
|
139
|
+
- [Nexus personal assistant setup](https://docs.nexus.bot/nexus)
|
|
140
|
+
- [Skills](https://docs.nexus.bot/skills)
|
|
141
|
+
- [Skills config](https://docs.nexus.bot/skills-config)
|
|
142
|
+
- [Workspace templates](https://docs.nexus.bot/templates/AGENTS)
|
|
143
|
+
- [RPC adapters](https://docs.nexus.bot/rpc)
|
|
144
|
+
- [Gateway runbook](https://docs.nexus.bot/gateway)
|
|
145
|
+
- [Nodes (iOS/Android)](https://docs.nexus.bot/nodes)
|
|
146
|
+
- [Web surfaces (Control UI)](https://docs.nexus.bot/web)
|
|
147
|
+
- [Discovery + transports](https://docs.nexus.bot/discovery)
|
|
148
|
+
- [Remote access](https://docs.nexus.bot/remote)
|
|
149
|
+
- Providers and UX:
|
|
150
|
+
- [WebChat](https://docs.nexus.bot/webchat)
|
|
151
|
+
- [Control UI (browser)](https://docs.nexus.bot/control-ui)
|
|
152
|
+
- [Telegram](https://docs.nexus.bot/telegram)
|
|
153
|
+
- [Discord](https://docs.nexus.bot/discord)
|
|
154
|
+
- [iMessage](https://docs.nexus.bot/imessage)
|
|
155
|
+
- [Groups](https://docs.nexus.bot/groups)
|
|
156
|
+
- [WhatsApp group messages](https://docs.nexus.bot/group-messages)
|
|
157
|
+
- [Media: images](https://docs.nexus.bot/images)
|
|
158
|
+
- [Media: audio](https://docs.nexus.bot/audio)
|
|
159
|
+
- Companion apps:
|
|
160
|
+
- [macOS app](https://docs.nexus.bot/macos)
|
|
161
|
+
- [iOS app](https://docs.nexus.bot/ios)
|
|
162
|
+
- [Android app](https://docs.nexus.bot/android)
|
|
163
|
+
- [Windows app](https://docs.nexus.bot/windows)
|
|
164
|
+
- [Linux app](https://docs.nexus.bot/linux)
|
|
165
|
+
- Ops and safety:
|
|
166
|
+
- [Sessions](https://docs.nexus.bot/session)
|
|
167
|
+
- [Cron + wakeups](https://docs.nexus.bot/cron)
|
|
168
|
+
- [Security](https://docs.nexus.bot/security)
|
|
169
|
+
- [Troubleshooting](https://docs.nexus.bot/troubleshooting)
|
|
170
|
+
|
|
171
|
+
## The name
|
|
172
|
+
|
|
173
|
+
**NEXUS = CLAW + TARDIS** — because every space lobster needs a time-and-space machine.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
*"We're all just playing with our own prompts."* — an AI, probably high on tokens
|
|
178
|
+
|
|
179
|
+
## Credits
|
|
180
|
+
|
|
181
|
+
- **Peter Steinberger** ([@steipete](https://twitter.com/steipete)) — Creator, lobster whisperer
|
|
182
|
+
- **Mario Zechner** ([@badlogicc](https://twitter.com/badlogicgames)) — Pi creator, security pen-tester
|
|
183
|
+
- **Nexus** — The space lobster who demanded a better name
|
|
184
|
+
|
|
185
|
+
## Core Contributors
|
|
186
|
+
|
|
187
|
+
- **Maxim Vovshin** (@Hyaxia, 36747317+Hyaxia@users.noreply.github.com) — Blogwatcher skill
|
|
188
|
+
- **Nacho Iacovino** (@nachoiacovino, nacho.iacovino@gmail.com) — Location parsing (Telegram + WhatsApp)
|
|
189
|
+
|
|
190
|
+
## License
|
|
191
|
+
|
|
192
|
+
MIT — Free as a lobster in the ocean 🦞
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
*"We're all just playing with our own prompts."* — An AI, probably high on tokens
|
package/docs/ios.md
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "iOS app (node): architecture + connection runbook"
|
|
3
|
+
read_when:
|
|
4
|
+
- Pairing or reconnecting the iOS node
|
|
5
|
+
- Debugging iOS bridge discovery or auth
|
|
6
|
+
- Sending screen/canvas commands to iOS
|
|
7
|
+
- Designing iOS node + gateway integration
|
|
8
|
+
- Extending the Gateway protocol for node/canvas commands
|
|
9
|
+
- Implementing Bonjour pairing or transport security
|
|
10
|
+
---
|
|
11
|
+
# iOS App (Node)
|
|
12
|
+
|
|
13
|
+
Status: prototype implemented (internal) · Date: 2025-12-13
|
|
14
|
+
|
|
15
|
+
## Connection Runbook
|
|
16
|
+
|
|
17
|
+
This is the practical “how do I connect the iOS node” guide:
|
|
18
|
+
|
|
19
|
+
**iOS app** ⇄ (Bonjour + TCP bridge) ⇄ **Gateway bridge** ⇄ (loopback WS) ⇄ **Gateway**
|
|
20
|
+
|
|
21
|
+
The Gateway WebSocket stays loopback-only (`ws://127.0.0.1:18789`). The iOS node talks to the LAN-facing **bridge** (default `tcp://0.0.0.0:18790`) and uses Gateway-owned pairing.
|
|
22
|
+
|
|
23
|
+
### Prerequisites
|
|
24
|
+
|
|
25
|
+
- You can run the Gateway on the “master” machine.
|
|
26
|
+
- iOS node app can reach the gateway bridge:
|
|
27
|
+
- Same LAN with Bonjour/mDNS, **or**
|
|
28
|
+
- Same Tailscale tailnet using Wide-Area Bonjour / unicast DNS-SD (see below), **or**
|
|
29
|
+
- Manual bridge host/port (fallback)
|
|
30
|
+
- You can run the CLI (`nexus`) on the gateway machine (or via SSH).
|
|
31
|
+
|
|
32
|
+
### 1) Start the Gateway (with bridge enabled)
|
|
33
|
+
|
|
34
|
+
Bridge is enabled by default (disable via `NEXUS_BRIDGE_ENABLED=0`).
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm nexus gateway --port 18789 --verbose
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Confirm in logs you see something like:
|
|
41
|
+
- `bridge listening on tcp://0.0.0.0:18790 (node)`
|
|
42
|
+
|
|
43
|
+
For tailnet-only setups (recommended for Vienna ⇄ London), bind the bridge to the gateway machine’s Tailscale IP instead:
|
|
44
|
+
|
|
45
|
+
- Set `bridge.bind: "tailnet"` in `~/nexus/state/nexus.json` on the gateway host.
|
|
46
|
+
- Restart the Gateway / macOS menubar app.
|
|
47
|
+
|
|
48
|
+
### 2) Verify Bonjour discovery (optional but recommended)
|
|
49
|
+
|
|
50
|
+
From the gateway machine:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
dns-sd -B _nexus-bridge._tcp local.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
You should see your gateway advertising `_nexus-bridge._tcp`.
|
|
57
|
+
|
|
58
|
+
If browse works, but the iOS node can’t connect, try resolving one instance:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
dns-sd -L "<instance name>" _nexus-bridge._tcp local.
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
More debugging notes: [`docs/bonjour.md`](https://docs.nexus.bot/bonjour).
|
|
65
|
+
|
|
66
|
+
#### Tailnet (Vienna ⇄ London) discovery via unicast DNS-SD
|
|
67
|
+
|
|
68
|
+
If the iOS node and the gateway are on different networks but connected via Tailscale, multicast mDNS won’t cross the boundary. Use Wide-Area Bonjour / unicast DNS-SD instead:
|
|
69
|
+
|
|
70
|
+
1) Set up a DNS-SD zone (example `nexus.internal.`) on the gateway host and publish `_nexus-bridge._tcp` records.
|
|
71
|
+
2) Configure Tailscale split DNS for `nexus.internal` pointing at that DNS server.
|
|
72
|
+
|
|
73
|
+
Details and example CoreDNS config: [`docs/bonjour.md`](https://docs.nexus.bot/bonjour).
|
|
74
|
+
|
|
75
|
+
### 3) Connect from the iOS node app
|
|
76
|
+
|
|
77
|
+
In the iOS node app:
|
|
78
|
+
- Pick the discovered bridge (or hit refresh).
|
|
79
|
+
- If not paired yet, it will initiate pairing automatically.
|
|
80
|
+
- After the first successful pairing, it will auto-reconnect **strictly to the last discovered gateway** on launch (including after reinstall), as long as the iOS Keychain entry is still present.
|
|
81
|
+
|
|
82
|
+
#### Connection indicator (always visible)
|
|
83
|
+
|
|
84
|
+
The Settings tab icon shows a small status dot:
|
|
85
|
+
- **Green**: connected to the bridge
|
|
86
|
+
- **Yellow**: connecting (subtle pulse)
|
|
87
|
+
- **Red**: not connected / error
|
|
88
|
+
|
|
89
|
+
### 4) Approve pairing (CLI)
|
|
90
|
+
|
|
91
|
+
On the gateway machine:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
nexus nodes pending
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Approve the request:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
nexus nodes approve <requestId>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
After approval, the iOS node receives/stores the token and reconnects authenticated.
|
|
104
|
+
|
|
105
|
+
Pairing details: [`docs/gateway/pairing.md`](https://docs.nexus.bot/gateway/pairing).
|
|
106
|
+
|
|
107
|
+
### 5) Verify the node is connected
|
|
108
|
+
|
|
109
|
+
- In the macOS app: **Instances** tab should show something like `iOS Node (...)` with a green “Active” presence dot shortly after connect.
|
|
110
|
+
- Via nodes status (paired + connected):
|
|
111
|
+
```bash
|
|
112
|
+
nexus nodes status
|
|
113
|
+
```
|
|
114
|
+
- Via Gateway (paired + connected):
|
|
115
|
+
```bash
|
|
116
|
+
nexus gateway call node.list --params "{}"
|
|
117
|
+
```
|
|
118
|
+
- Via Gateway presence (legacy-ish, still useful):
|
|
119
|
+
```bash
|
|
120
|
+
nexus gateway call system-presence --params "{}"
|
|
121
|
+
```
|
|
122
|
+
Look for the node `instanceId` (often a UUID).
|
|
123
|
+
|
|
124
|
+
### 6) Drive the iOS Canvas (draw / snapshot)
|
|
125
|
+
|
|
126
|
+
The iOS node runs a WKWebView “Canvas” scaffold which exposes:
|
|
127
|
+
- `window.__nexus.canvas`
|
|
128
|
+
- `window.__nexus.ctx` (2D context)
|
|
129
|
+
- `window.__nexus.setStatus(title, subtitle)`
|
|
130
|
+
|
|
131
|
+
#### Gateway Canvas Host (recommended for web content)
|
|
132
|
+
|
|
133
|
+
If you want the node to show real HTML/CSS/JS that the agent can edit on disk, point it at the Gateway canvas host.
|
|
134
|
+
|
|
135
|
+
Note: nodes always use the standalone canvas host on `canvasHost.port` (default `18793`), bound to the bridge interface.
|
|
136
|
+
|
|
137
|
+
1) Create `~/nexus/canvas/index.html` on the gateway host.
|
|
138
|
+
|
|
139
|
+
2) Navigate the node to it (LAN):
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
nexus nodes invoke --node "iOS Node" --command canvas.navigate --params '{"url":"http://<gateway-hostname>.local:18793/__nexus__/canvas/"}'
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Notes:
|
|
146
|
+
- The server injects a live-reload client into HTML and reloads on file changes.
|
|
147
|
+
- A2UI is hosted on the same canvas host at `http://<gateway-host>:18793/__nexus__/a2ui/`.
|
|
148
|
+
- Tailnet (optional): if both devices are on Tailscale, use a MagicDNS name or tailnet IP instead of `.local`, e.g. `http://<gateway-magicdns>:18793/__nexus__/canvas/`.
|
|
149
|
+
- iOS may require App Transport Security allowances to load plain `http://` URLs; if it fails to load, prefer HTTPS or adjust the iOS app’s ATS config.
|
|
150
|
+
|
|
151
|
+
#### Draw with `canvas.eval`
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
nexus nodes invoke --node "iOS Node" --command canvas.eval --params "$(cat <<'JSON'
|
|
155
|
+
{"javaScript":"(() => { const {ctx,setStatus} = window.__nexus; setStatus('Drawing','…'); ctx.clearRect(0,0,innerWidth,innerHeight); ctx.lineWidth=6; ctx.strokeStyle='#ff2d55'; ctx.beginPath(); ctx.moveTo(40,40); ctx.lineTo(innerWidth-40, innerHeight-40); ctx.stroke(); setStatus(null,null); return 'ok'; })()"}
|
|
156
|
+
JSON
|
|
157
|
+
)"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### Snapshot with `canvas.snapshot`
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
nexus nodes invoke --node 192.168.0.88 --command canvas.snapshot --params '{"maxWidth":900}'
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
The response includes `{ format, base64 }` image data (default `format="jpeg"`; pass `{"format":"png"}` when you specifically need lossless PNG).
|
|
167
|
+
|
|
168
|
+
### Common gotchas
|
|
169
|
+
|
|
170
|
+
- **iOS in background:** all `canvas.*` commands fail fast with `NODE_BACKGROUND_UNAVAILABLE` (bring the iOS node app to foreground).
|
|
171
|
+
- **Return to default scaffold:** `canvas.navigate` with `{"url":""}` or `{"url":"/"}` returns to the built-in scaffold page.
|
|
172
|
+
- **mDNS blocked:** some networks block multicast; use a different LAN or plan a tailnet-capable bridge (see [`docs/discovery.md`](https://docs.nexus.bot/discovery)).
|
|
173
|
+
- **Wrong node selector:** `--node` can be the node id (UUID), display name (e.g. `iOS Node`), IP, or an unambiguous prefix. If it’s ambiguous, the CLI will tell you.
|
|
174
|
+
- **Stale pairing / Keychain cleared:** if the pairing token is missing (or iOS Keychain was wiped), the node must pair again; approve a new pending request.
|
|
175
|
+
- **App reinstall but no reconnect:** the node restores `instanceId` + last bridge preference from Keychain; if it still comes up “unpaired”, verify Keychain persistence on your device/simulator and re-pair once.
|
|
176
|
+
|
|
177
|
+
## Design + Architecture
|
|
178
|
+
|
|
179
|
+
### Goals
|
|
180
|
+
- Build an **iOS app** that acts as a **remote node** for Nexus:
|
|
181
|
+
- **Voice trigger** (wake-word / always-listening intent) that forwards transcripts to the Gateway `agent` method.
|
|
182
|
+
- **Canvas** surface that the agent can control: navigate, draw/render, evaluate JS, snapshot.
|
|
183
|
+
- **Dead-simple setup**:
|
|
184
|
+
- Auto-discover the host on the local network via **Bonjour**.
|
|
185
|
+
- One-tap pairing with an approval prompt on the Mac.
|
|
186
|
+
- iOS is **never** a local gateway; it is always a remote node.
|
|
187
|
+
- Operational clarity:
|
|
188
|
+
- When iOS is backgrounded, voice may still run; **canvas commands must fail fast** with a structured error.
|
|
189
|
+
- Provide **settings**: node display name, enable/disable voice wake, pairing status.
|
|
190
|
+
|
|
191
|
+
Non-goals (v1):
|
|
192
|
+
- Exposing the Node Gateway directly on the LAN.
|
|
193
|
+
- Supporting arbitrary third-party “plugins” on iOS.
|
|
194
|
+
- Perfect App Store compliance; this is **internal-only** initially.
|
|
195
|
+
|
|
196
|
+
### Current repo reality (constraints we respect)
|
|
197
|
+
- The Gateway WebSocket server binds to `127.0.0.1:18789` (`src/gateway/server.ts`) with an optional `NEXUS_GATEWAY_TOKEN`.
|
|
198
|
+
- The Gateway exposes a Canvas file server (`canvasHost`) on `canvasHost.port` (default `18793`), so nodes can `canvas.navigate` to `http://<lanHost>:18793/__nexus__/canvas/` and auto-reload on file changes ([`docs/configuration.md`](https://docs.nexus.bot/configuration)).
|
|
199
|
+
- macOS “Canvas” is controlled via the Gateway node protocol (`canvas.*`), matching iOS/Android ([`docs/mac/canvas.md`](https://docs.nexus.bot/mac/canvas)).
|
|
200
|
+
- Voice wake forwards via `GatewayChannel` to Gateway `agent` (mac app: `VoiceWakeForwarder` → `GatewayConnection.sendAgent`).
|
|
201
|
+
|
|
202
|
+
### Recommended topology (B): Gateway-owned Bridge + loopback Gateway
|
|
203
|
+
Keep the Node gateway loopback-only; expose a dedicated **gateway-owned bridge** to the LAN/tailnet.
|
|
204
|
+
|
|
205
|
+
**iOS App** ⇄ (TLS + pairing) ⇄ **Bridge (in gateway)** ⇄ (loopback) ⇄ **Gateway WS** (`ws://127.0.0.1:18789`)
|
|
206
|
+
|
|
207
|
+
Why:
|
|
208
|
+
- Preserves current threat model: Gateway remains local-only.
|
|
209
|
+
- Centralizes auth, rate limiting, and allowlisting in the bridge.
|
|
210
|
+
- Lets us unify “canvas node” semantics across mac + iOS without exposing raw gateway methods.
|
|
211
|
+
|
|
212
|
+
### Security plan (internal, but still robust)
|
|
213
|
+
#### Transport
|
|
214
|
+
- **Current (v0):** bridge is a LAN-facing **TCP** listener with token-based auth after pairing.
|
|
215
|
+
- **Next:** wrap the bridge in **TLS** and prefer key-pinned or mTLS-like auth after pairing.
|
|
216
|
+
|
|
217
|
+
#### Pairing
|
|
218
|
+
- Bonjour discovery shows a candidate “Nexus Bridge” on the LAN.
|
|
219
|
+
- First connection:
|
|
220
|
+
1) iOS generates a keypair (Secure Enclave if available).
|
|
221
|
+
2) iOS connects to the bridge and requests pairing.
|
|
222
|
+
3) The bridge forwards the pairing request to the **Gateway** as a *pending request*.
|
|
223
|
+
4) Approval can happen via:
|
|
224
|
+
- **macOS UI** (Nexus shows an alert with Approve/Reject/Later, including the node IP), or
|
|
225
|
+
- **Terminal/CLI** (headless flows).
|
|
226
|
+
5) Once approved, the bridge returns a token to iOS; iOS stores it in Keychain.
|
|
227
|
+
- Subsequent connections:
|
|
228
|
+
- The bridge requires the paired identity. Unpaired clients get a structured “not paired” error and no access.
|
|
229
|
+
|
|
230
|
+
##### Gateway-owned pairing (Option B details)
|
|
231
|
+
Pairing decisions must be owned by the Gateway (`nexus` / Node) so nodes can be approved without the macOS app running.
|
|
232
|
+
|
|
233
|
+
Key idea:
|
|
234
|
+
- The Swift app may still show an alert, but it is only a **frontend** for pending requests stored in the Gateway.
|
|
235
|
+
|
|
236
|
+
Desired behavior:
|
|
237
|
+
- If the Swift UI is present: show alert with Approve/Reject/Later.
|
|
238
|
+
- If the Swift UI is not present: `nexus` CLI can list pending requests and approve/reject.
|
|
239
|
+
|
|
240
|
+
See [`docs/gateway/pairing.md`](https://docs.nexus.bot/gateway/pairing) for the API/events and storage.
|
|
241
|
+
|
|
242
|
+
CLI (headless approvals):
|
|
243
|
+
- `nexus nodes pending`
|
|
244
|
+
- `nexus nodes approve <requestId>`
|
|
245
|
+
- `nexus nodes reject <requestId>`
|
|
246
|
+
|
|
247
|
+
#### Authorization / scope control (bridge-side ACL)
|
|
248
|
+
The bridge must not be a raw proxy to every gateway method.
|
|
249
|
+
|
|
250
|
+
- Allow by default:
|
|
251
|
+
- `agent` (with guardrails; idempotency required)
|
|
252
|
+
- minimal `system-event` beacons (presence updates for the node)
|
|
253
|
+
- node/canvas methods defined below (new protocol surface)
|
|
254
|
+
- Deny by default:
|
|
255
|
+
- anything that widens control without explicit intent (future “shell”, “files”, etc.)
|
|
256
|
+
- Rate limit:
|
|
257
|
+
- handshake attempts
|
|
258
|
+
- voice forwards per minute
|
|
259
|
+
- snapshot frequency / payload size
|
|
260
|
+
|
|
261
|
+
### Protocol unification: add “node/canvas” to Gateway protocol
|
|
262
|
+
#### Principle
|
|
263
|
+
Unify mac Canvas + iOS Canvas under a single conceptual surface:
|
|
264
|
+
- The agent talks to the Gateway using a stable method set (typed protocol).
|
|
265
|
+
- The Gateway routes node-targeted requests to:
|
|
266
|
+
- local mac Canvas implementation, or
|
|
267
|
+
- remote iOS node via the bridge
|
|
268
|
+
|
|
269
|
+
#### Minimal protocol additions (v1)
|
|
270
|
+
Add to `src/gateway/protocol/schema.ts` (and regenerate Swift models):
|
|
271
|
+
|
|
272
|
+
**Identity**
|
|
273
|
+
- Node identity comes from `connect.params.client.instanceId` (stable), and `connect.params.client.mode = "node"` (or `"ios-node"`).
|
|
274
|
+
|
|
275
|
+
**Methods**
|
|
276
|
+
- `node.list` → list paired/connected nodes + capabilities
|
|
277
|
+
- `node.describe` → describe a node (capabilities + supported `node.invoke` commands)
|
|
278
|
+
- `node.invoke` → send a command to a specific node
|
|
279
|
+
- Params: `{ nodeId, command, params?, timeoutMs? }`
|
|
280
|
+
|
|
281
|
+
**Events**
|
|
282
|
+
- `node.event` → async node status/errors
|
|
283
|
+
- e.g. background/foreground transitions, voice availability, canvas availability
|
|
284
|
+
|
|
285
|
+
#### Node command set (canvas)
|
|
286
|
+
These are values for `node.invoke.command`:
|
|
287
|
+
- `canvas.present` / `canvas.hide`
|
|
288
|
+
- `canvas.navigate` with `{ url }` (loads a URL; use `""` or `"/"` to return to the default scaffold)
|
|
289
|
+
- `canvas.eval` with `{ javaScript }`
|
|
290
|
+
- `canvas.snapshot` with `{ maxWidth?, quality?, format? }`
|
|
291
|
+
- A2UI (mobile + macOS canvas):
|
|
292
|
+
- `canvas.a2ui.push` with `{ messages: [...] }` (A2UI v0.8 server→client messages)
|
|
293
|
+
- `canvas.a2ui.pushJSONL` with `{ jsonl: "..." }` (legacy alias)
|
|
294
|
+
- `canvas.a2ui.reset`
|
|
295
|
+
- A2UI is hosted by the Gateway canvas host (`/__nexus__/a2ui/`) on `canvasHost.port`. Commands fail if the host is unreachable.
|
|
296
|
+
|
|
297
|
+
Result pattern:
|
|
298
|
+
- Request is a standard `req/res` with `ok` / `error`.
|
|
299
|
+
- Long operations (loads, streaming drawing, etc.) may also emit `node.event` progress.
|
|
300
|
+
|
|
301
|
+
##### Current (implemented)
|
|
302
|
+
As of 2025-12-13, the Gateway supports `node.invoke` for bridge-connected nodes.
|
|
303
|
+
|
|
304
|
+
Example: draw a diagonal line on the iOS Canvas:
|
|
305
|
+
```bash
|
|
306
|
+
nexus nodes invoke --node ios-node --command canvas.eval --params '{"javaScript":"(() => { const {ctx} = window.__nexus; ctx.clearRect(0,0,innerWidth,innerHeight); ctx.lineWidth=6; ctx.strokeStyle=\"#ff2d55\"; ctx.beginPath(); ctx.moveTo(40,40); ctx.lineTo(innerWidth-40, innerHeight-40); ctx.stroke(); return \"ok\"; })()"}'
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Background behavior requirement
|
|
310
|
+
When iOS is backgrounded:
|
|
311
|
+
- Voice may still be active (subject to iOS suspension).
|
|
312
|
+
- **All `canvas.*` commands must fail** with a stable error code, e.g.:
|
|
313
|
+
- `NODE_BACKGROUND_UNAVAILABLE`
|
|
314
|
+
- Include `retryable: true` and `retryAfterMs` if we want the agent to wait.
|
|
315
|
+
|
|
316
|
+
## iOS app architecture (SwiftUI)
|
|
317
|
+
### App structure
|
|
318
|
+
- Single fullscreen Canvas surface (WKWebView).
|
|
319
|
+
- One settings entry point: a **gear button** that opens a settings sheet.
|
|
320
|
+
- All navigation is **agent-driven** (no local URL bar).
|
|
321
|
+
|
|
322
|
+
### Components
|
|
323
|
+
- `BridgeDiscovery`: Bonjour browse + resolve (Network.framework `NWBrowser`)
|
|
324
|
+
- `BridgeConnection`: TCP session + pairing handshake + reconnect (TLS planned)
|
|
325
|
+
- `NodeRuntime`:
|
|
326
|
+
- Voice pipeline (wake-word + capture + forward)
|
|
327
|
+
- Canvas pipeline (WKWebView controller + snapshot + eval)
|
|
328
|
+
- Background state tracking; enforces “canvas unavailable in background”
|
|
329
|
+
|
|
330
|
+
### Voice in background (internal)
|
|
331
|
+
- Enable background audio mode (and required session configuration) so the mic pipeline can keep running when the user switches apps.
|
|
332
|
+
- If iOS suspends the app anyway, surface a clear node status (`node.event`) so operators can see voice is unavailable.
|
|
333
|
+
|
|
334
|
+
## Code sharing (macOS + iOS)
|
|
335
|
+
Create/expand SwiftPM targets so both apps share:
|
|
336
|
+
- `NexusProtocol` (generated models; platform-neutral)
|
|
337
|
+
- `NexusGatewayClient` (shared WS framing + connect/req/res + seq-gap handling)
|
|
338
|
+
- `NexusKit` (node/canvas command types + deep links + shared utilities)
|
|
339
|
+
|
|
340
|
+
macOS continues to own:
|
|
341
|
+
- local Canvas implementation details (custom scheme handler serving on-disk HTML, window/panel presentation)
|
|
342
|
+
|
|
343
|
+
iOS owns:
|
|
344
|
+
- iOS-specific audio/speech + WKWebView presentation and lifecycle
|
|
345
|
+
|
|
346
|
+
## Repo layout
|
|
347
|
+
- iOS app: `apps/ios/` (XcodeGen `project.yml`)
|
|
348
|
+
- Shared Swift packages: `apps/shared/`
|
|
349
|
+
- Lint/format: iOS target runs `swiftformat --lint` + `swiftlint lint` using repo configs (`.swiftformat`, `.swiftlint.yml`).
|
|
350
|
+
|
|
351
|
+
Generate the Xcode project:
|
|
352
|
+
```bash
|
|
353
|
+
cd apps/ios
|
|
354
|
+
xcodegen generate
|
|
355
|
+
open Nexus.xcodeproj
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## Storage plan (private by default)
|
|
359
|
+
### iOS
|
|
360
|
+
- Canvas/workspace files (persistent, private):
|
|
361
|
+
- `Application Support/Nexus/canvas/<sessionKey>/...`
|
|
362
|
+
- Snapshots / temp exports (evictable):
|
|
363
|
+
- `Library/Caches/Nexus/canvas-snapshots/<sessionKey>/...`
|
|
364
|
+
- Credentials:
|
|
365
|
+
- Keychain (paired identity + bridge trust anchor)
|
|
366
|
+
|
|
367
|
+
## Related docs
|
|
368
|
+
|
|
369
|
+
- [`docs/gateway.md`](https://docs.nexus.bot/gateway) (gateway runbook)
|
|
370
|
+
- [`docs/gateway/pairing.md`](https://docs.nexus.bot/gateway/pairing) (approval + storage)
|
|
371
|
+
- [`docs/bonjour.md`](https://docs.nexus.bot/bonjour) (discovery debugging)
|
|
372
|
+
- [`docs/discovery.md`](https://docs.nexus.bot/discovery) (LAN vs tailnet vs SSH)
|
package/docs/linux.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Linux app status + contribution call"
|
|
3
|
+
read_when:
|
|
4
|
+
- Looking for Linux companion app status
|
|
5
|
+
- Planning platform coverage or contributions
|
|
6
|
+
---
|
|
7
|
+
# Linux App
|
|
8
|
+
|
|
9
|
+
Nexus core is fully supported on Linux. The core is written in TypeScript, so it runs anywhere Node runs.
|
|
10
|
+
|
|
11
|
+
We do not have a Linux companion app yet. It is planned, and we would love contributions to make it happen.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Location command for nodes (location.get), permission modes, and background behavior"
|
|
3
|
+
read_when:
|
|
4
|
+
- Adding location node support or permissions UI
|
|
5
|
+
- Designing background location + push flows
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Location command (nodes)
|
|
9
|
+
|
|
10
|
+
## TL;DR
|
|
11
|
+
- `location.get` is a node command (via `node.invoke`).
|
|
12
|
+
- Off by default.
|
|
13
|
+
- Settings use a selector: Off / While Using / Always.
|
|
14
|
+
- Separate toggle: Precise Location.
|
|
15
|
+
|
|
16
|
+
## Why a selector (not just a switch)
|
|
17
|
+
OS permissions are multi-level. We can expose a selector in-app, but the OS still decides the actual grant.
|
|
18
|
+
- iOS/macOS: user can choose **While Using** or **Always** in system prompts/Settings. App can request upgrade, but OS may require Settings.
|
|
19
|
+
- Android: background location is a separate permission; on Android 10+ it often requires a Settings flow.
|
|
20
|
+
- Precise location is a separate grant (iOS 14+ “Precise”, Android “fine” vs “coarse”).
|
|
21
|
+
|
|
22
|
+
Selector in UI drives our requested mode; actual grant lives in OS settings.
|
|
23
|
+
|
|
24
|
+
## Settings model
|
|
25
|
+
Per node device:
|
|
26
|
+
- `location.enabledMode`: `off | whileUsing | always`
|
|
27
|
+
- `location.preciseEnabled`: bool
|
|
28
|
+
|
|
29
|
+
UI behavior:
|
|
30
|
+
- Selecting `whileUsing` requests foreground permission.
|
|
31
|
+
- Selecting `always` first ensures `whileUsing`, then requests background (or sends user to Settings if required).
|
|
32
|
+
- If OS denies requested level, revert to the highest granted level and show status.
|
|
33
|
+
|
|
34
|
+
## Permissions mapping (node.permissions)
|
|
35
|
+
Optional. macOS node reports `location` via the permissions map; iOS/Android may omit it.
|
|
36
|
+
|
|
37
|
+
## Command: `location.get`
|
|
38
|
+
Called via `node.invoke`.
|
|
39
|
+
|
|
40
|
+
Params (suggested):
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"timeoutMs": 10000,
|
|
44
|
+
"maxAgeMs": 15000,
|
|
45
|
+
"desiredAccuracy": "coarse|balanced|precise"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Response payload:
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"lat": 48.20849,
|
|
53
|
+
"lon": 16.37208,
|
|
54
|
+
"accuracyMeters": 12.5,
|
|
55
|
+
"altitudeMeters": 182.0,
|
|
56
|
+
"speedMps": 0.0,
|
|
57
|
+
"headingDeg": 270.0,
|
|
58
|
+
"timestamp": "2026-01-03T12:34:56.000Z",
|
|
59
|
+
"isPrecise": true,
|
|
60
|
+
"source": "gps|wifi|cell|unknown"
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Errors (stable codes):
|
|
65
|
+
- `LOCATION_DISABLED`: selector is off.
|
|
66
|
+
- `LOCATION_PERMISSION_REQUIRED`: permission missing for requested mode.
|
|
67
|
+
- `LOCATION_BACKGROUND_UNAVAILABLE`: app is backgrounded but only While Using allowed.
|
|
68
|
+
- `LOCATION_TIMEOUT`: no fix in time.
|
|
69
|
+
- `LOCATION_UNAVAILABLE`: system failure / no providers.
|
|
70
|
+
|
|
71
|
+
## Background behavior (future)
|
|
72
|
+
Goal: model can request location even when node is backgrounded, but only when:
|
|
73
|
+
- User selected **Always**.
|
|
74
|
+
- OS grants background location.
|
|
75
|
+
- App is allowed to run in background for location (iOS background mode / Android foreground service or special allowance).
|
|
76
|
+
|
|
77
|
+
Push-triggered flow (future):
|
|
78
|
+
1) Gateway sends a push to the node (silent push or FCM data).
|
|
79
|
+
2) Node wakes briefly and calls `location.get` internally.
|
|
80
|
+
3) Node forwards payload to Gateway.
|
|
81
|
+
|
|
82
|
+
Notes:
|
|
83
|
+
- iOS: Always permission + background location mode required. Silent push may be throttled; expect intermittent failures.
|
|
84
|
+
- Android: background location may require a foreground service; otherwise, expect denial.
|
|
85
|
+
|
|
86
|
+
## Model/tooling integration
|
|
87
|
+
- Tool surface: `nodes` tool adds `location_get` action (node required).
|
|
88
|
+
- CLI: `nexus nodes location get --node <id>`.
|
|
89
|
+
- Agent guidelines: only call when user enabled location and understands the scope.
|
|
90
|
+
|
|
91
|
+
## UX copy (suggested)
|
|
92
|
+
- Off: “Location sharing is disabled.”
|
|
93
|
+
- While Using: “Only when Nexus is open.”
|
|
94
|
+
- Always: “Allow background location. Requires system permission.”
|
|
95
|
+
- Precise: “Use precise GPS location. Toggle off to share approximate location.”
|