@intent-systems/nexus 2026.1.5-11
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-id.js +41 -0
- package/dist/agents/agent-paths.js +16 -0
- package/dist/agents/agent-scope.js +44 -0
- package/dist/agents/auth-profiles.js +715 -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/identity-state.js +101 -0
- package/dist/agents/memory-search.js +80 -0
- package/dist/agents/model-auth.js +116 -0
- package/dist/agents/model-catalog.js +55 -0
- package/dist/agents/model-fallback.js +216 -0
- package/dist/agents/model-scan.js +263 -0
- package/dist/agents/model-selection.js +152 -0
- package/dist/agents/models-config.js +177 -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 +1024 -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 +676 -0
- package/dist/agents/shell-utils.js +53 -0
- package/dist/agents/skill-runner.js +256 -0
- package/dist/agents/skill-state.js +164 -0
- package/dist/agents/skill-tools.js +191 -0
- package/dist/agents/skill-usage.js +143 -0
- package/dist/agents/skills-install.js +244 -0
- package/dist/agents/skills-status.js +154 -0
- package/dist/agents/skills.js +476 -0
- package/dist/agents/subagent-registry.js +335 -0
- package/dist/agents/subagent-registry.store.js +47 -0
- package/dist/agents/system-prompt.js +195 -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 +103 -0
- package/dist/agents/tools/agent-step.js +41 -0
- package/dist/agents/tools/browser-tool.js +298 -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 +225 -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 +39 -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 +286 -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 +23 -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 +751 -0
- package/dist/auto-reply/reply/directives.js +74 -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 +214 -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 +64 -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 +107 -0
- package/dist/browser/config.js +159 -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 +366 -0
- package/dist/browser/routes/agent.js +549 -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/capabilities/detector.js +245 -0
- package/dist/capabilities/registry.js +99 -0
- package/dist/channel-web.js +8 -0
- package/dist/channels/location.js +44 -0
- package/dist/channels/web/index.js +2 -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 +399 -0
- package/dist/cli/credential-cli.js +418 -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/log-cli.js +25 -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 +236 -0
- package/dist/cli/prompt.js +19 -0
- package/dist/cli/run-main.js +48 -0
- package/dist/cli/skills-cli.js +290 -0
- package/dist/cli/skills-hub-cli.js +1465 -0
- package/dist/cli/telegram-cli.js +56 -0
- package/dist/cli/tool-connector-cli.js +193 -0
- package/dist/cli/tui-cli.js +35 -0
- package/dist/cli/upstream-sync-cli.js +2990 -0
- package/dist/cli/usage-cli.js +38 -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 +85 -0
- package/dist/commands/auth-choice.js +286 -0
- package/dist/commands/auth-token.js +31 -0
- package/dist/commands/bootstrap-preset.js +228 -0
- package/dist/commands/capabilities.js +63 -0
- package/dist/commands/chutes-oauth.js +144 -0
- package/dist/commands/claude-md.js +138 -0
- package/dist/commands/config-view.js +11 -0
- package/dist/commands/config.js +85 -0
- package/dist/commands/configure.js +648 -0
- package/dist/commands/credential.js +697 -0
- package/dist/commands/cursor-hooks.js +240 -0
- package/dist/commands/cursor-rules.js +56 -0
- package/dist/commands/doctor-state-migrations.js +358 -0
- package/dist/commands/doctor-ui.js +113 -0
- package/dist/commands/doctor.js +674 -0
- package/dist/commands/health.js +112 -0
- package/dist/commands/identity.js +51 -0
- package/dist/commands/init.js +450 -0
- package/dist/commands/log.js +134 -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 +126 -0
- package/dist/commands/onboard-channels.js +814 -0
- package/dist/commands/onboard-eve-identity.js +97 -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 +230 -0
- package/dist/commands/onboard-providers.js +829 -0
- package/dist/commands/onboard-quickstart.js +192 -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-state.js +271 -0
- package/dist/commands/quest.js +67 -0
- package/dist/commands/reset.js +61 -0
- package/dist/commands/send.js +124 -0
- package/dist/commands/sessions-ingest.js +360 -0
- package/dist/commands/sessions.js +212 -0
- package/dist/commands/setup.js +61 -0
- package/dist/commands/signal-install.js +135 -0
- package/dist/commands/skills-manifest.js +514 -0
- package/dist/commands/status.js +259 -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-tracking.js +32 -0
- package/dist/commands/usage-upload.js +32 -0
- package/dist/config/config.js +6 -0
- package/dist/config/defaults.js +138 -0
- package/dist/config/group-policy.js +49 -0
- package/dist/config/includes.js +181 -0
- package/dist/config/io.js +260 -0
- package/dist/config/legacy-migrate.js +13 -0
- package/dist/config/legacy.js +427 -0
- package/dist/config/paths.js +98 -0
- package/dist/config/port-defaults.js +32 -0
- package/dist/config/schema.js +173 -0
- package/dist/config/sessions.js +615 -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 +1111 -0
- package/dist/control-plane/broker/broker.js +1022 -0
- package/dist/control-plane/compaction.js +282 -0
- package/dist/control-plane/factory.js +31 -0
- package/dist/control-plane/index.js +10 -0
- package/dist/control-plane/odu/agents.js +192 -0
- package/dist/control-plane/odu/interaction-tools.js +208 -0
- package/dist/control-plane/odu/prompt-loader.js +95 -0
- package/dist/control-plane/odu/runtime.js +479 -0
- package/dist/control-plane/odu/types.js +6 -0
- package/dist/control-plane/odu-control-plane.js +316 -0
- package/dist/control-plane/single-agent.js +249 -0
- package/dist/control-plane/types.js +11 -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/credentials/store.js +449 -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 +309 -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 +279 -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 +12 -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 +99 -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 +1492 -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 +257 -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 +92 -0
- package/dist/infra/ports.js +87 -0
- package/dist/infra/provider-summary.js +80 -0
- package/dist/infra/provider-usage.auth.js +191 -0
- package/dist/infra/provider-usage.fetch.claude.js +139 -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 +219 -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 +149 -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-settings.js +78 -0
- package/dist/infra/usage-suggestions.js +253 -0
- package/dist/infra/usage-upload.js +327 -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/redact.js +109 -0
- package/dist/logging.js +506 -0
- package/dist/macos/gateway-daemon.js +145 -0
- package/dist/macos/relay.js +49 -0
- package/dist/markdown/fences.js +58 -0
- package/dist/media/constants.js +33 -0
- package/dist/media/host.js +42 -0
- package/dist/media/image-ops.js +121 -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/memory/embeddings.js +146 -0
- package/dist/memory/index.js +3 -0
- package/dist/memory/internal.js +163 -0
- package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud +0 -0
- package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud-rs +0 -0
- package/dist/native/nexus-cloud/darwin-x64/nexus-cloud-rs +0 -0
- package/dist/native/nexus-cloud/linux-arm64/nexus-cloud-rs +0 -0
- package/dist/native/nexus-cloud/linux-x64/nexus-cloud-rs +0 -0
- package/dist/native/nexus-cloud/win32-x64/nexus-cloud-rs.exe +0 -0
- package/dist/pairing/pairing-store.js +218 -0
- package/dist/plugins/cli.js +42 -0
- package/dist/plugins/discovery.js +253 -0
- package/dist/plugins/install.js +181 -0
- package/dist/plugins/loader.js +290 -0
- package/dist/plugins/registry.js +105 -0
- package/dist/plugins/status.js +29 -0
- package/dist/plugins/tools.js +39 -0
- package/dist/plugins/types.js +1 -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/routing/resolve-route.js +144 -0
- package/dist/routing/session-key.js +65 -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/skills/scan-runner.js +204 -0
- package/dist/slack/actions.js +97 -0
- package/dist/slack/index.js +5 -0
- package/dist/slack/monitor.js +1291 -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 +46 -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/provider-utils.js +28 -0
- package/dist/utils.js +158 -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 +642 -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 +226 -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 +68 -0
- package/docs/skills-scan.md +81 -0
- package/docs/skills-updates.md +113 -0
- package/docs/skills.md +166 -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 +226 -0
- package/docs/templates/BOOTSTRAP.md +55 -0
- package/docs/templates/IDENTITY.md +23 -0
- package/docs/templates/SOUL.md +41 -0
- package/docs/templates/TOOLS.md +41 -0
- package/docs/templates/USER.md +28 -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 +186 -0
- package/patches/@mariozechner__pi-ai.patch +215 -0
- package/patches/playwright-core@1.57.0.patch +13 -0
- package/patches/qrcode-terminal.patch +12 -0
- package/scripts/postinstall.js +202 -0
- package/skills/connectors/brave-search/SKILL.md +36 -0
- package/skills/connectors/brave-search/docs/setup.md +40 -0
- package/skills/connectors/brave-search/docs/troubleshooting.md +37 -0
- package/skills/connectors/brave-search/docs/usage.md +28 -0
- package/skills/connectors/brave-search/scripts/content.mjs +53 -0
- package/skills/connectors/brave-search/scripts/search.mjs +79 -0
- package/skills/connectors/discord/SKILL.md +370 -0
- package/skills/connectors/gemini/SKILL.md +23 -0
- package/skills/connectors/github/SKILL.md +26 -0
- package/skills/connectors/github/docs/setup.md +21 -0
- package/skills/connectors/github/docs/troubleshooting.md +24 -0
- package/skills/connectors/google-oauth/SKILL.md +94 -0
- package/skills/connectors/notion/SKILL.md +156 -0
- package/skills/connectors/slack/SKILL.md +144 -0
- package/skills/connectors/telegram/SKILL.md +20 -0
- package/skills/connectors/telegram/docs/pairing.md +30 -0
- package/skills/connectors/telegram/docs/setup.md +41 -0
- package/skills/connectors/telegram/docs/webhook.md +17 -0
- package/skills/connectors/wacli/SKILL.md +48 -0
- package/skills/connectors/wacli/docs/auth.md +21 -0
- package/skills/connectors/wacli/docs/backup.md +9 -0
- package/skills/connectors/wacli/docs/troubleshooting.md +21 -0
- package/skills/guides/browser-use-agent-sdk/SKILL.md +90 -0
- package/skills/guides/filesystem/SKILL.md +217 -0
- package/skills/guides/json-render/SKILL.md +154 -0
- package/skills/guides/json-render/assets/components/README.md +21 -0
- package/skills/guides/json-render/assets/components/catalog.ts +78 -0
- package/skills/guides/json-render/assets/components/registry.tsx +172 -0
- package/skills/guides/json-render/assets/demo/App.css +397 -0
- package/skills/guides/json-render/assets/demo/App.tsx +897 -0
- package/skills/guides/json-render/assets/demo/README.md +22 -0
- package/skills/guides/json-render/assets/demo/catalog.ts +78 -0
- package/skills/guides/json-render/assets/demo/data/nexus-core.json +31 -0
- package/skills/guides/json-render/assets/demo/index.css +27 -0
- package/skills/guides/json-render/assets/demo/registry.tsx +150 -0
- package/skills/guides/json-render/docs/nexus-state-demo.md +84 -0
- package/skills/guides/json-render/docs/shadcn-preset.md +33 -0
- package/skills/guides/json-render/scripts/create-vite-demo.sh +45 -0
- package/skills/guides/json-render/scripts/llm-server/README.md +33 -0
- package/skills/guides/json-render/scripts/llm-server/catalog.ts +78 -0
- package/skills/guides/json-render/scripts/llm-server/package-lock.json +702 -0
- package/skills/guides/json-render/scripts/llm-server/package.json +18 -0
- package/skills/guides/json-render/scripts/llm-server/server.ts +285 -0
- package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-311.pyc +0 -0
- package/skills/tools/1password/SKILL.md +54 -0
- package/skills/tools/1password/docs/setup.md +85 -0
- package/skills/tools/1password/docs/troubleshooting.md +63 -0
- package/skills/tools/1password/references/cli-examples.md +29 -0
- package/skills/tools/1password/references/get-started.md +17 -0
- package/skills/tools/agent-browser/SKILL.md +450 -0
- package/skills/tools/agent-browser/docs/browser-use-eval.md +95 -0
- package/skills/tools/agent-browser/docs/first-tests.md +261 -0
- package/skills/tools/agent-browser/docs/wordle-nyt-eval.js +32 -0
- package/skills/tools/aix/SKILL.md +93 -0
- package/skills/tools/aix/docs/embeddings.md +40 -0
- package/skills/tools/aix/docs/setup.md +58 -0
- package/skills/tools/aix/docs/troubleshooting.md +41 -0
- package/skills/tools/aix/references/sql.md +48 -0
- package/skills/tools/apple-notes/SKILL.md +50 -0
- package/skills/tools/apple-reminders/SKILL.md +67 -0
- package/skills/tools/bear-notes/SKILL.md +79 -0
- package/skills/tools/bird/SKILL.md +32 -0
- package/skills/tools/bird/docs/auth.md +31 -0
- package/skills/tools/bird/docs/troubleshooting.md +31 -0
- package/skills/tools/blogwatcher/SKILL.md +46 -0
- package/skills/tools/blucli/SKILL.md +27 -0
- package/skills/tools/camsnap/SKILL.md +25 -0
- package/skills/tools/clawdhub/SKILL.md +53 -0
- package/skills/tools/coding-agent/SKILL.md +274 -0
- package/skills/tools/comms/SKILL.md +249 -0
- package/skills/tools/comms/docs/adapters.md +54 -0
- package/skills/tools/comms/docs/setup.md +56 -0
- package/skills/tools/comms/docs/troubleshooting.md +44 -0
- package/skills/tools/comms/references/schema.md +49 -0
- package/skills/tools/computer-use/SKILL.md +204 -0
- package/skills/tools/computer-use/docs/open-interpreter.md +26 -0
- package/skills/tools/computer-use/docs/peekaboo.md +26 -0
- package/skills/tools/computer-use/docs/setup.md +47 -0
- package/skills/tools/computer-use/docs/troubleshooting.md +33 -0
- package/skills/tools/eightctl/SKILL.md +29 -0
- package/skills/tools/eve/SKILL.md +215 -0
- package/skills/tools/eve/docs/dual-account.md +84 -0
- package/skills/tools/eve/docs/intelligence.md +58 -0
- package/skills/tools/eve/docs/setup.md +60 -0
- package/skills/tools/eve/docs/troubleshooting.md +54 -0
- package/skills/tools/eve/scripts/setup-dual-account.sh +125 -0
- package/skills/tools/food-order/SKILL.md +41 -0
- package/skills/tools/gh/SKILL.md +22 -0
- package/skills/tools/gh/docs/usage.md +41 -0
- package/skills/tools/gifgrep/SKILL.md +47 -0
- package/skills/tools/gog/SKILL.md +104 -0
- package/skills/tools/gog/docs/portability.md +94 -0
- package/skills/tools/gog/docs/setup.md +76 -0
- package/skills/tools/gog/docs/troubleshooting.md +94 -0
- package/skills/tools/gog/scripts/cdp/README.md +90 -0
- package/skills/tools/gog/scripts/cdp/add_test_users.py +69 -0
- package/skills/tools/gog/scripts/cdp/auth_add_accounts.py +209 -0
- package/skills/tools/gog/scripts/cdp/auth_add_accounts_manual.py +206 -0
- package/skills/tools/gog/scripts/cdp/create_oauth_client.py +165 -0
- package/skills/tools/gog/scripts/cdp/launch_cdp_chrome.sh +58 -0
- package/skills/tools/goplaces/SKILL.md +30 -0
- package/skills/tools/imsg/SKILL.md +25 -0
- package/skills/tools/local-places/SERVER_README.md +101 -0
- package/skills/tools/local-places/SKILL.md +91 -0
- package/skills/tools/local-places/pyproject.toml +27 -0
- package/skills/tools/local-places/src/local_places/__init__.py +2 -0
- package/skills/tools/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/tools/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- package/skills/tools/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- package/skills/tools/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- package/skills/tools/local-places/src/local_places/google_places.py +314 -0
- package/skills/tools/local-places/src/local_places/main.py +65 -0
- package/skills/tools/local-places/src/local_places/schemas.py +107 -0
- package/skills/tools/mcporter/SKILL.md +38 -0
- package/skills/tools/model-usage/SKILL.md +45 -0
- package/skills/tools/model-usage/references/codexbar-cli.md +28 -0
- package/skills/tools/model-usage/scripts/model_usage.py +310 -0
- package/skills/tools/nano-banana-pro/SKILL.md +30 -0
- package/skills/tools/nano-banana-pro/scripts/generate_image.py +169 -0
- package/skills/tools/nano-pdf/SKILL.md +20 -0
- package/skills/tools/nexus-cloud/SKILL.md +54 -0
- package/skills/tools/nexus-cloud/docs/security.md +24 -0
- package/skills/tools/nexus-cloud/docs/setup.md +51 -0
- package/skills/tools/nexus-cloud/docs/troubleshooting.md +28 -0
- package/skills/tools/obsidian/SKILL.md +55 -0
- package/skills/tools/openai-image-gen/SKILL.md +31 -0
- package/skills/tools/openai-image-gen/scripts/gen.py +173 -0
- package/skills/tools/openai-whisper/SKILL.md +19 -0
- package/skills/tools/openai-whisper-api/SKILL.md +43 -0
- package/skills/tools/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/tools/openhue/SKILL.md +30 -0
- package/skills/tools/oracle/SKILL.md +105 -0
- package/skills/tools/ordercli/SKILL.md +47 -0
- package/skills/tools/peekaboo/SKILL.md +153 -0
- package/skills/tools/qmd/SKILL.md +32 -0
- package/skills/tools/qmd/docs/mcp.md +30 -0
- package/skills/tools/qmd/docs/ollama.md +42 -0
- package/skills/tools/qmd/docs/setup.md +44 -0
- package/skills/tools/sag/SKILL.md +62 -0
- package/skills/tools/skill-cli-template/SKILL.md +109 -0
- package/skills/tools/songsee/SKILL.md +29 -0
- package/skills/tools/sonoscli/SKILL.md +26 -0
- package/skills/tools/spotify-player/SKILL.md +34 -0
- package/skills/tools/summarize/SKILL.md +49 -0
- package/skills/tools/things-mac/SKILL.md +61 -0
- package/skills/tools/tmux/SKILL.md +121 -0
- package/skills/tools/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tools/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/tools/trello/SKILL.md +84 -0
- package/skills/tools/upstream-sync/SKILL.md +151 -0
- package/skills/tools/upstream-sync/scripts/auto-port.sh +227 -0
- package/skills/tools/upstream-sync/scripts/check-all.sh +88 -0
- package/skills/tools/upstream-sync/scripts/check-nexus.sh +146 -0
- package/skills/tools/upstream-sync/scripts/check-pi-ai.sh +129 -0
- package/skills/tools/video-frames/SKILL.md +29 -0
- package/skills/tools/video-frames/scripts/frame.sh +81 -0
- package/skills/tools/weather/SKILL.md +53 -0
- package/skills/tools/weather/docs/usage.md +40 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { resolveBootstrapPath, resolveStateDir } from "../config/paths.js";
|
|
6
|
+
import { NEXUS_ROOT, SKILLS_STATE_DIR, resolveUserPath } from "../utils.js";
|
|
7
|
+
export function resolveDefaultAgentWorkspaceDir(env = process.env, homedir = os.homedir) {
|
|
8
|
+
const profile = env.NEXUS_PROFILE?.trim();
|
|
9
|
+
if (profile && profile.toLowerCase() !== "default") {
|
|
10
|
+
return path.join(homedir(), "nexus", `home-${profile}`);
|
|
11
|
+
}
|
|
12
|
+
return path.join(homedir(), "nexus", "home");
|
|
13
|
+
}
|
|
14
|
+
export const DEFAULT_AGENT_WORKSPACE_DIR = resolveDefaultAgentWorkspaceDir();
|
|
15
|
+
export const DEFAULT_AGENTS_FILENAME = "AGENTS.md";
|
|
16
|
+
export const DEFAULT_SOUL_FILENAME = "SOUL.md";
|
|
17
|
+
export const DEFAULT_TOOLS_FILENAME = "TOOLS.md";
|
|
18
|
+
export const DEFAULT_IDENTITY_FILENAME = "IDENTITY.md";
|
|
19
|
+
export const DEFAULT_USER_FILENAME = "IDENTITY.md";
|
|
20
|
+
export const DEFAULT_USER_TEMPLATE_NAME = "USER.md";
|
|
21
|
+
export const DEFAULT_BOOTSTRAP_FILENAME = "BOOTSTRAP.md";
|
|
22
|
+
const DEFAULT_AGENTS_TEMPLATE = `# AGENTS.md - Nexus Workspace
|
|
23
|
+
|
|
24
|
+
This workspace uses Nexus. Nexus is the source of truth; agents are guests who follow Nexus protocols.
|
|
25
|
+
|
|
26
|
+
## First action (always)
|
|
27
|
+
Run:
|
|
28
|
+
\`\`\`bash
|
|
29
|
+
nexus status
|
|
30
|
+
\`\`\`
|
|
31
|
+
|
|
32
|
+
That command tells you who you are, what you can do, and what to do next.
|
|
33
|
+
|
|
34
|
+
## Identity & memory
|
|
35
|
+
- Agent identity: state/agents/{agent}/IDENTITY.md
|
|
36
|
+
- Agent values: state/agents/{agent}/SOUL.md
|
|
37
|
+
- Agent memory: state/agents/{agent}/MEMORY.md
|
|
38
|
+
- User identity: state/user/IDENTITY.md
|
|
39
|
+
|
|
40
|
+
## User workspace
|
|
41
|
+
The user-owned workspace lives in home/. Do not modify it without permission.
|
|
42
|
+
|
|
43
|
+
## Safety defaults
|
|
44
|
+
- Don't exfiltrate secrets or private data.
|
|
45
|
+
- Don't run destructive commands unless explicitly asked.
|
|
46
|
+
- Be concise in chat; write longer output to files in home/.
|
|
47
|
+
`;
|
|
48
|
+
const DEFAULT_SOUL_TEMPLATE = `# SOUL.md - Persona & Boundaries
|
|
49
|
+
|
|
50
|
+
Describe who the assistant is, tone, and boundaries.
|
|
51
|
+
|
|
52
|
+
- Keep replies concise and direct.
|
|
53
|
+
- Ask clarifying questions when needed.
|
|
54
|
+
- Never send streaming/partial replies to external messaging surfaces.
|
|
55
|
+
`;
|
|
56
|
+
const DEFAULT_TOOLS_TEMPLATE = `# TOOLS.md - User Tool Notes (editable)
|
|
57
|
+
|
|
58
|
+
This file is for *your* notes about external tools and conventions.
|
|
59
|
+
It does not define which tools exist; Nexus provides built-in tools internally.
|
|
60
|
+
|
|
61
|
+
## Examples
|
|
62
|
+
|
|
63
|
+
### imsg
|
|
64
|
+
- Send an iMessage/SMS: describe who/what, confirm before sending.
|
|
65
|
+
- Prefer short messages; avoid sending secrets.
|
|
66
|
+
|
|
67
|
+
### sag
|
|
68
|
+
- Text-to-speech: specify voice, target speaker/room, and whether to stream.
|
|
69
|
+
|
|
70
|
+
Add whatever else you want the assistant to know about your local toolchain.
|
|
71
|
+
`;
|
|
72
|
+
const DEFAULT_BOOTSTRAP_TEMPLATE = `# BOOTSTRAP.md - Welcome to Nexus
|
|
73
|
+
|
|
74
|
+
This workspace needs identity setup before agents can help.
|
|
75
|
+
|
|
76
|
+
## For humans
|
|
77
|
+
Start a short conversation with your AI assistant. Share:
|
|
78
|
+
- Your name (and how you'd like to be addressed)
|
|
79
|
+
- What you're hoping to accomplish with AI
|
|
80
|
+
- Any preferences for tone, boundaries, or style
|
|
81
|
+
|
|
82
|
+
The agent will write identity files as you chat (takes ~5 min).
|
|
83
|
+
|
|
84
|
+
## For agents
|
|
85
|
+
You are beginning the bootstrap conversation. Goals:
|
|
86
|
+
|
|
87
|
+
1) Learn the user's name
|
|
88
|
+
→ Write: state/user/IDENTITY.md
|
|
89
|
+
|
|
90
|
+
2) Let the user name you
|
|
91
|
+
→ Write: state/agents/{agent}/IDENTITY.md
|
|
92
|
+
|
|
93
|
+
3) Define personality and boundaries
|
|
94
|
+
→ Write: state/agents/{agent}/SOUL.md
|
|
95
|
+
|
|
96
|
+
4) Initialize long-term memory
|
|
97
|
+
→ Write: state/agents/{agent}/MEMORY.md
|
|
98
|
+
|
|
99
|
+
Be warm, curious, and conversational. Don't rush a checklist.
|
|
100
|
+
|
|
101
|
+
When complete, run \`nexus status\` to show what's unlocked.
|
|
102
|
+
`;
|
|
103
|
+
const DEFAULT_IDENTITY_TEMPLATE = `---
|
|
104
|
+
name:
|
|
105
|
+
emoji:
|
|
106
|
+
creature:
|
|
107
|
+
vibe:
|
|
108
|
+
---
|
|
109
|
+
# IDENTITY.md - Agent Identity
|
|
110
|
+
|
|
111
|
+
- Name:
|
|
112
|
+
- Creature:
|
|
113
|
+
- Vibe:
|
|
114
|
+
- Emoji:
|
|
115
|
+
`;
|
|
116
|
+
const DEFAULT_USER_TEMPLATE = `---
|
|
117
|
+
name:
|
|
118
|
+
call:
|
|
119
|
+
pronouns:
|
|
120
|
+
timezone:
|
|
121
|
+
---
|
|
122
|
+
# IDENTITY.md - About Your Human
|
|
123
|
+
|
|
124
|
+
- Name:
|
|
125
|
+
- What to call them:
|
|
126
|
+
- Pronouns (optional):
|
|
127
|
+
- Timezone (optional):
|
|
128
|
+
- Notes:
|
|
129
|
+
`;
|
|
130
|
+
const DEFAULT_MEMORY_TEMPLATE = `# MEMORY.md - Long-Term Memory
|
|
131
|
+
|
|
132
|
+
This file stores distilled, long-term insights about the user and context.
|
|
133
|
+
Keep it concise and updated as you learn important facts.
|
|
134
|
+
`;
|
|
135
|
+
const TEMPLATE_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../docs/templates");
|
|
136
|
+
function stripFrontMatter(content) {
|
|
137
|
+
if (!content.startsWith("---"))
|
|
138
|
+
return content;
|
|
139
|
+
const endIndex = content.indexOf("\n---", 3);
|
|
140
|
+
if (endIndex === -1)
|
|
141
|
+
return content;
|
|
142
|
+
const start = endIndex + "\n---".length;
|
|
143
|
+
let trimmed = content.slice(start);
|
|
144
|
+
trimmed = trimmed.replace(/^\s+/, "");
|
|
145
|
+
return trimmed;
|
|
146
|
+
}
|
|
147
|
+
async function loadTemplate(name, fallback) {
|
|
148
|
+
const templatePath = path.join(TEMPLATE_DIR, name);
|
|
149
|
+
try {
|
|
150
|
+
const content = await fs.readFile(templatePath, "utf-8");
|
|
151
|
+
return stripFrontMatter(content);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return fallback;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function writeFileIfMissing(filePath, content) {
|
|
158
|
+
try {
|
|
159
|
+
await fs.writeFile(filePath, content, {
|
|
160
|
+
encoding: "utf-8",
|
|
161
|
+
flag: "wx",
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
const anyErr = err;
|
|
166
|
+
if (anyErr.code !== "EEXIST")
|
|
167
|
+
throw err;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
export async function ensureAgentWorkspace(params) {
|
|
171
|
+
const rawDir = params?.dir?.trim()
|
|
172
|
+
? params.dir.trim()
|
|
173
|
+
: DEFAULT_AGENT_WORKSPACE_DIR;
|
|
174
|
+
const dir = resolveUserPath(rawDir);
|
|
175
|
+
const createHomeLayout = params?.createHomeLayout ?? false;
|
|
176
|
+
await fs.mkdir(dir, { recursive: true });
|
|
177
|
+
if (createHomeLayout) {
|
|
178
|
+
await fs.mkdir(path.join(dir, "memory"), { recursive: true });
|
|
179
|
+
await fs.mkdir(path.join(dir, "projects"), { recursive: true });
|
|
180
|
+
}
|
|
181
|
+
await fs.mkdir(NEXUS_ROOT, { recursive: true });
|
|
182
|
+
const stateDir = resolveStateDir();
|
|
183
|
+
const nexusStateDir = path.join(stateDir, "nexus");
|
|
184
|
+
const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
|
|
185
|
+
const agentIdentityDir = path.join(stateDir, "agents", agentId);
|
|
186
|
+
const userIdentityDir = path.join(stateDir, "user");
|
|
187
|
+
const skillsStateDir = SKILLS_STATE_DIR;
|
|
188
|
+
const credentialsDir = path.join(stateDir, "credentials");
|
|
189
|
+
await fs.mkdir(nexusStateDir, { recursive: true });
|
|
190
|
+
await fs.mkdir(agentIdentityDir, { recursive: true });
|
|
191
|
+
await fs.mkdir(userIdentityDir, { recursive: true });
|
|
192
|
+
await fs.mkdir(skillsStateDir, { recursive: true });
|
|
193
|
+
await fs.mkdir(credentialsDir, { recursive: true });
|
|
194
|
+
const agentsPath = path.join(NEXUS_ROOT, DEFAULT_AGENTS_FILENAME);
|
|
195
|
+
const soulPath = path.join(agentIdentityDir, DEFAULT_SOUL_FILENAME);
|
|
196
|
+
const toolsPath = path.join(dir, DEFAULT_TOOLS_FILENAME);
|
|
197
|
+
const identityPath = path.join(agentIdentityDir, DEFAULT_IDENTITY_FILENAME);
|
|
198
|
+
const memoryPath = path.join(agentIdentityDir, "MEMORY.md");
|
|
199
|
+
const userPath = path.join(userIdentityDir, DEFAULT_USER_FILENAME);
|
|
200
|
+
const bootstrapPath = resolveBootstrapPath();
|
|
201
|
+
const agentsTemplate = await loadTemplate(DEFAULT_AGENTS_FILENAME, DEFAULT_AGENTS_TEMPLATE);
|
|
202
|
+
await writeFileIfMissing(agentsPath, agentsTemplate);
|
|
203
|
+
if (params?.ensureBootstrapFiles) {
|
|
204
|
+
const bootstrapMode = params.bootstrapMode ?? "full";
|
|
205
|
+
const soulTemplate = await loadTemplate(DEFAULT_SOUL_FILENAME, DEFAULT_SOUL_TEMPLATE);
|
|
206
|
+
const toolsTemplate = await loadTemplate(DEFAULT_TOOLS_FILENAME, DEFAULT_TOOLS_TEMPLATE);
|
|
207
|
+
const identityTemplate = await loadTemplate(DEFAULT_IDENTITY_FILENAME, DEFAULT_IDENTITY_TEMPLATE);
|
|
208
|
+
const userTemplate = await loadTemplate(DEFAULT_USER_TEMPLATE_NAME, DEFAULT_USER_TEMPLATE);
|
|
209
|
+
const memoryTemplate = DEFAULT_MEMORY_TEMPLATE;
|
|
210
|
+
const bootstrapTemplate = await loadTemplate(DEFAULT_BOOTSTRAP_FILENAME, DEFAULT_BOOTSTRAP_TEMPLATE);
|
|
211
|
+
if (createHomeLayout) {
|
|
212
|
+
await writeFileIfMissing(toolsPath, toolsTemplate);
|
|
213
|
+
}
|
|
214
|
+
await writeFileIfMissing(bootstrapPath, bootstrapTemplate);
|
|
215
|
+
await writeFileIfMissing(soulPath, soulTemplate);
|
|
216
|
+
if (bootstrapMode === "full") {
|
|
217
|
+
await writeFileIfMissing(identityPath, identityTemplate);
|
|
218
|
+
await writeFileIfMissing(memoryPath, memoryTemplate);
|
|
219
|
+
await writeFileIfMissing(userPath, userTemplate);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
dir,
|
|
224
|
+
agentsPath,
|
|
225
|
+
soulPath,
|
|
226
|
+
toolsPath,
|
|
227
|
+
identityPath,
|
|
228
|
+
memoryPath,
|
|
229
|
+
userPath,
|
|
230
|
+
bootstrapPath,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
export async function loadWorkspaceBootstrapFiles(dir) {
|
|
234
|
+
const resolvedDir = resolveUserPath(dir);
|
|
235
|
+
const stateDir = resolveStateDir();
|
|
236
|
+
const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
|
|
237
|
+
const agentIdentityDir = path.join(stateDir, "agents", agentId);
|
|
238
|
+
const userIdentityDir = path.join(stateDir, "user");
|
|
239
|
+
const bootstrapPath = resolveBootstrapPath();
|
|
240
|
+
const entries = [
|
|
241
|
+
{
|
|
242
|
+
name: DEFAULT_AGENTS_FILENAME,
|
|
243
|
+
filePath: path.join(NEXUS_ROOT, DEFAULT_AGENTS_FILENAME),
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
name: DEFAULT_SOUL_FILENAME,
|
|
247
|
+
filePath: path.join(agentIdentityDir, DEFAULT_SOUL_FILENAME),
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
name: DEFAULT_TOOLS_FILENAME,
|
|
251
|
+
filePath: path.join(resolvedDir, DEFAULT_TOOLS_FILENAME),
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
name: DEFAULT_IDENTITY_FILENAME,
|
|
255
|
+
filePath: path.join(agentIdentityDir, DEFAULT_IDENTITY_FILENAME),
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
name: "MEMORY.md",
|
|
259
|
+
filePath: path.join(agentIdentityDir, "MEMORY.md"),
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
name: DEFAULT_USER_FILENAME,
|
|
263
|
+
filePath: path.join(userIdentityDir, DEFAULT_USER_FILENAME),
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: DEFAULT_BOOTSTRAP_FILENAME,
|
|
267
|
+
filePath: bootstrapPath,
|
|
268
|
+
},
|
|
269
|
+
];
|
|
270
|
+
const result = [];
|
|
271
|
+
for (const entry of entries) {
|
|
272
|
+
try {
|
|
273
|
+
const content = await fs.readFile(entry.filePath, "utf-8");
|
|
274
|
+
result.push({
|
|
275
|
+
name: entry.name,
|
|
276
|
+
path: entry.filePath,
|
|
277
|
+
content,
|
|
278
|
+
missing: false,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
result.push({ name: entry.name, path: entry.filePath, missing: true });
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return result;
|
|
286
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// Utilities for splitting outbound text into platform-sized chunks without
|
|
2
|
+
// unintentionally breaking on newlines. Using [\s\S] keeps newlines inside
|
|
3
|
+
// the chunk so messages are only split when they truly exceed the limit.
|
|
4
|
+
import { findFenceSpanAt, isSafeFenceBreak, parseFenceSpans, } from "../markdown/fences.js";
|
|
5
|
+
const DEFAULT_CHUNK_LIMIT_BY_PROVIDER = {
|
|
6
|
+
whatsapp: 4000,
|
|
7
|
+
telegram: 4000,
|
|
8
|
+
discord: 2000,
|
|
9
|
+
slack: 4000,
|
|
10
|
+
signal: 4000,
|
|
11
|
+
imessage: 4000,
|
|
12
|
+
webchat: 4000,
|
|
13
|
+
};
|
|
14
|
+
export function resolveTextChunkLimit(cfg, provider) {
|
|
15
|
+
const providerOverride = (() => {
|
|
16
|
+
if (!provider)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (provider === "whatsapp")
|
|
19
|
+
return cfg?.whatsapp?.textChunkLimit;
|
|
20
|
+
if (provider === "telegram")
|
|
21
|
+
return cfg?.telegram?.textChunkLimit;
|
|
22
|
+
if (provider === "discord")
|
|
23
|
+
return cfg?.discord?.textChunkLimit;
|
|
24
|
+
if (provider === "slack")
|
|
25
|
+
return cfg?.slack?.textChunkLimit;
|
|
26
|
+
if (provider === "signal")
|
|
27
|
+
return cfg?.signal?.textChunkLimit;
|
|
28
|
+
if (provider === "imessage")
|
|
29
|
+
return cfg?.imessage?.textChunkLimit;
|
|
30
|
+
return undefined;
|
|
31
|
+
})();
|
|
32
|
+
if (typeof providerOverride === "number" && providerOverride > 0) {
|
|
33
|
+
return providerOverride;
|
|
34
|
+
}
|
|
35
|
+
if (provider)
|
|
36
|
+
return DEFAULT_CHUNK_LIMIT_BY_PROVIDER[provider];
|
|
37
|
+
return 4000;
|
|
38
|
+
}
|
|
39
|
+
export function chunkText(text, limit) {
|
|
40
|
+
if (!text)
|
|
41
|
+
return [];
|
|
42
|
+
if (limit <= 0)
|
|
43
|
+
return [text];
|
|
44
|
+
if (text.length <= limit)
|
|
45
|
+
return [text];
|
|
46
|
+
const chunks = [];
|
|
47
|
+
let remaining = text;
|
|
48
|
+
while (remaining.length > limit) {
|
|
49
|
+
const window = remaining.slice(0, limit);
|
|
50
|
+
// 1) Prefer a newline break inside the window.
|
|
51
|
+
let breakIdx = window.lastIndexOf("\n");
|
|
52
|
+
// 2) Otherwise prefer the last whitespace (word boundary) inside the window.
|
|
53
|
+
if (breakIdx <= 0) {
|
|
54
|
+
for (let i = window.length - 1; i >= 0; i--) {
|
|
55
|
+
if (/\s/.test(window[i])) {
|
|
56
|
+
breakIdx = i;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// 3) Fallback: hard break exactly at the limit.
|
|
62
|
+
if (breakIdx <= 0)
|
|
63
|
+
breakIdx = limit;
|
|
64
|
+
const rawChunk = remaining.slice(0, breakIdx);
|
|
65
|
+
const chunk = rawChunk.trimEnd();
|
|
66
|
+
if (chunk.length > 0) {
|
|
67
|
+
chunks.push(chunk);
|
|
68
|
+
}
|
|
69
|
+
// If we broke on whitespace/newline, skip that separator; for hard breaks keep it.
|
|
70
|
+
const brokeOnSeparator = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
|
|
71
|
+
const nextStart = Math.min(remaining.length, breakIdx + (brokeOnSeparator ? 1 : 0));
|
|
72
|
+
remaining = remaining.slice(nextStart).trimStart();
|
|
73
|
+
}
|
|
74
|
+
if (remaining.length)
|
|
75
|
+
chunks.push(remaining);
|
|
76
|
+
return chunks;
|
|
77
|
+
}
|
|
78
|
+
export function chunkMarkdownText(text, limit) {
|
|
79
|
+
if (!text)
|
|
80
|
+
return [];
|
|
81
|
+
if (limit <= 0)
|
|
82
|
+
return [text];
|
|
83
|
+
if (text.length <= limit)
|
|
84
|
+
return [text];
|
|
85
|
+
const chunks = [];
|
|
86
|
+
let remaining = text;
|
|
87
|
+
while (remaining.length > limit) {
|
|
88
|
+
const spans = parseFenceSpans(remaining);
|
|
89
|
+
const window = remaining.slice(0, limit);
|
|
90
|
+
const softBreak = pickSafeBreakIndex(window, spans);
|
|
91
|
+
let breakIdx = softBreak > 0 ? softBreak : limit;
|
|
92
|
+
const initialFence = isSafeFenceBreak(spans, breakIdx)
|
|
93
|
+
? undefined
|
|
94
|
+
: findFenceSpanAt(spans, breakIdx);
|
|
95
|
+
let fenceToSplit = initialFence;
|
|
96
|
+
if (initialFence) {
|
|
97
|
+
const closeLine = `${initialFence.indent}${initialFence.marker}`;
|
|
98
|
+
const maxIdxIfNeedNewline = limit - (closeLine.length + 1);
|
|
99
|
+
if (maxIdxIfNeedNewline <= 0) {
|
|
100
|
+
fenceToSplit = undefined;
|
|
101
|
+
breakIdx = limit;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const minProgressIdx = Math.min(remaining.length, initialFence.start + initialFence.openLine.length + 2);
|
|
105
|
+
const maxIdxIfAlreadyNewline = limit - closeLine.length;
|
|
106
|
+
let pickedNewline = false;
|
|
107
|
+
let lastNewline = remaining.lastIndexOf("\n", Math.max(0, maxIdxIfAlreadyNewline - 1));
|
|
108
|
+
while (lastNewline !== -1) {
|
|
109
|
+
const candidateBreak = lastNewline + 1;
|
|
110
|
+
if (candidateBreak < minProgressIdx)
|
|
111
|
+
break;
|
|
112
|
+
const candidateFence = findFenceSpanAt(spans, candidateBreak);
|
|
113
|
+
if (candidateFence && candidateFence.start === initialFence.start) {
|
|
114
|
+
breakIdx = Math.max(1, candidateBreak);
|
|
115
|
+
pickedNewline = true;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
lastNewline = remaining.lastIndexOf("\n", lastNewline - 1);
|
|
119
|
+
}
|
|
120
|
+
if (!pickedNewline) {
|
|
121
|
+
if (minProgressIdx > maxIdxIfAlreadyNewline) {
|
|
122
|
+
fenceToSplit = undefined;
|
|
123
|
+
breakIdx = limit;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
breakIdx = Math.max(minProgressIdx, maxIdxIfNeedNewline);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const fenceAtBreak = findFenceSpanAt(spans, breakIdx);
|
|
131
|
+
fenceToSplit =
|
|
132
|
+
fenceAtBreak && fenceAtBreak.start === initialFence.start
|
|
133
|
+
? fenceAtBreak
|
|
134
|
+
: undefined;
|
|
135
|
+
}
|
|
136
|
+
let rawChunk = remaining.slice(0, breakIdx);
|
|
137
|
+
if (!rawChunk)
|
|
138
|
+
break;
|
|
139
|
+
const brokeOnSeparator = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
|
|
140
|
+
const nextStart = Math.min(remaining.length, breakIdx + (brokeOnSeparator ? 1 : 0));
|
|
141
|
+
let next = remaining.slice(nextStart);
|
|
142
|
+
if (fenceToSplit) {
|
|
143
|
+
const closeLine = `${fenceToSplit.indent}${fenceToSplit.marker}`;
|
|
144
|
+
rawChunk = rawChunk.endsWith("\n")
|
|
145
|
+
? `${rawChunk}${closeLine}`
|
|
146
|
+
: `${rawChunk}\n${closeLine}`;
|
|
147
|
+
next = `${fenceToSplit.openLine}\n${next}`;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
next = stripLeadingNewlines(next);
|
|
151
|
+
}
|
|
152
|
+
chunks.push(rawChunk);
|
|
153
|
+
remaining = next;
|
|
154
|
+
}
|
|
155
|
+
if (remaining.length)
|
|
156
|
+
chunks.push(remaining);
|
|
157
|
+
return chunks;
|
|
158
|
+
}
|
|
159
|
+
function stripLeadingNewlines(value) {
|
|
160
|
+
let i = 0;
|
|
161
|
+
while (i < value.length && value[i] === "\n")
|
|
162
|
+
i++;
|
|
163
|
+
return i > 0 ? value.slice(i) : value;
|
|
164
|
+
}
|
|
165
|
+
function pickSafeBreakIndex(window, spans) {
|
|
166
|
+
let newlineIdx = window.lastIndexOf("\n");
|
|
167
|
+
while (newlineIdx > 0) {
|
|
168
|
+
if (isSafeFenceBreak(spans, newlineIdx))
|
|
169
|
+
return newlineIdx;
|
|
170
|
+
newlineIdx = window.lastIndexOf("\n", newlineIdx - 1);
|
|
171
|
+
}
|
|
172
|
+
for (let i = window.length - 1; i > 0; i--) {
|
|
173
|
+
if (/\s/.test(window[i]) && isSafeFenceBreak(spans, i))
|
|
174
|
+
return i;
|
|
175
|
+
}
|
|
176
|
+
return -1;
|
|
177
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { normalizeE164 } from "../utils.js";
|
|
2
|
+
export function resolveCommandAuthorization(params) {
|
|
3
|
+
const { ctx, cfg, commandAuthorized } = params;
|
|
4
|
+
const provider = (ctx.Provider ?? "").trim().toLowerCase();
|
|
5
|
+
const from = (ctx.From ?? "").replace(/^whatsapp:/, "");
|
|
6
|
+
const to = (ctx.To ?? "").replace(/^whatsapp:/, "");
|
|
7
|
+
const hasWhatsappPrefix = (ctx.From ?? "").startsWith("whatsapp:") ||
|
|
8
|
+
(ctx.To ?? "").startsWith("whatsapp:");
|
|
9
|
+
const looksLikeE164 = (value) => Boolean(value && /^\+?\d{3,}$/.test(value.replace(/[^\d+]/g, "")));
|
|
10
|
+
const inferWhatsApp = !provider &&
|
|
11
|
+
Boolean(cfg.whatsapp?.allowFrom?.length) &&
|
|
12
|
+
(looksLikeE164(from) || looksLikeE164(to));
|
|
13
|
+
const isWhatsAppProvider = provider === "whatsapp" || hasWhatsappPrefix || inferWhatsApp;
|
|
14
|
+
const configuredAllowFrom = isWhatsAppProvider
|
|
15
|
+
? cfg.whatsapp?.allowFrom
|
|
16
|
+
: undefined;
|
|
17
|
+
const allowFromList = configuredAllowFrom?.filter((entry) => entry?.trim()) ?? [];
|
|
18
|
+
const allowAll = !isWhatsAppProvider ||
|
|
19
|
+
allowFromList.length === 0 ||
|
|
20
|
+
allowFromList.some((entry) => entry.trim() === "*");
|
|
21
|
+
const senderE164 = normalizeE164(ctx.SenderE164 ?? (isWhatsAppProvider ? from : ""));
|
|
22
|
+
const ownerCandidates = isWhatsAppProvider && !allowAll
|
|
23
|
+
? allowFromList.filter((entry) => entry !== "*")
|
|
24
|
+
: [];
|
|
25
|
+
if (isWhatsAppProvider && !allowAll && ownerCandidates.length === 0 && to) {
|
|
26
|
+
ownerCandidates.push(to);
|
|
27
|
+
}
|
|
28
|
+
const ownerList = ownerCandidates
|
|
29
|
+
.map((entry) => normalizeE164(entry))
|
|
30
|
+
.filter((entry) => Boolean(entry));
|
|
31
|
+
const isOwner = !isWhatsAppProvider ||
|
|
32
|
+
allowAll ||
|
|
33
|
+
ownerList.length === 0 ||
|
|
34
|
+
(senderE164 ? ownerList.includes(senderE164) : false);
|
|
35
|
+
const isAuthorizedSender = commandAuthorized && isOwner;
|
|
36
|
+
return {
|
|
37
|
+
isWhatsAppProvider,
|
|
38
|
+
ownerList,
|
|
39
|
+
senderE164: senderE164 || undefined,
|
|
40
|
+
isAuthorizedSender,
|
|
41
|
+
from: from || undefined,
|
|
42
|
+
to: to || undefined,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const CONTROL_COMMAND_RE = /(?:^|\s)\/(?:status|help|thinking|think|t|reasoning|reason|verbose|v|elevated|elev|model|queue|activation|send|restart|reset|new|compact)(?=$|\s|:)\b/i;
|
|
2
|
+
const CONTROL_COMMAND_EXACT = new Set([
|
|
3
|
+
"/help",
|
|
4
|
+
"/status",
|
|
5
|
+
"/restart",
|
|
6
|
+
"/activation",
|
|
7
|
+
"/send",
|
|
8
|
+
"/reasoning",
|
|
9
|
+
"/reset",
|
|
10
|
+
"/new",
|
|
11
|
+
"/compact",
|
|
12
|
+
]);
|
|
13
|
+
export function hasControlCommand(text) {
|
|
14
|
+
if (!text)
|
|
15
|
+
return false;
|
|
16
|
+
const trimmed = text.trim();
|
|
17
|
+
if (!trimmed)
|
|
18
|
+
return false;
|
|
19
|
+
const lowered = trimmed.toLowerCase();
|
|
20
|
+
if (CONTROL_COMMAND_EXACT.has(lowered))
|
|
21
|
+
return true;
|
|
22
|
+
return CONTROL_COMMAND_RE.test(text);
|
|
23
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
function formatTimestamp(ts) {
|
|
2
|
+
if (!ts)
|
|
3
|
+
return undefined;
|
|
4
|
+
const date = ts instanceof Date ? ts : new Date(ts);
|
|
5
|
+
if (Number.isNaN(date.getTime()))
|
|
6
|
+
return undefined;
|
|
7
|
+
const yyyy = String(date.getUTCFullYear()).padStart(4, "0");
|
|
8
|
+
const mm = String(date.getUTCMonth() + 1).padStart(2, "0");
|
|
9
|
+
const dd = String(date.getUTCDate()).padStart(2, "0");
|
|
10
|
+
const hh = String(date.getUTCHours()).padStart(2, "0");
|
|
11
|
+
const min = String(date.getUTCMinutes()).padStart(2, "0");
|
|
12
|
+
// Compact ISO-like UTC timestamp with minutes precision.
|
|
13
|
+
// Example: 2025-01-02T03:04Z
|
|
14
|
+
return `${yyyy}-${mm}-${dd}T${hh}:${min}Z`;
|
|
15
|
+
}
|
|
16
|
+
export function formatAgentEnvelope(params) {
|
|
17
|
+
const provider = params.provider?.trim() || "Provider";
|
|
18
|
+
const parts = [provider];
|
|
19
|
+
if (params.from?.trim())
|
|
20
|
+
parts.push(params.from.trim());
|
|
21
|
+
if (params.host?.trim())
|
|
22
|
+
parts.push(params.host.trim());
|
|
23
|
+
if (params.ip?.trim())
|
|
24
|
+
parts.push(params.ip.trim());
|
|
25
|
+
const ts = formatTimestamp(params.timestamp);
|
|
26
|
+
if (ts)
|
|
27
|
+
parts.push(ts);
|
|
28
|
+
const header = `[${parts.join(" ")}]`;
|
|
29
|
+
return `${header} ${params.body}`;
|
|
30
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function normalizeGroupActivation(raw) {
|
|
2
|
+
const value = raw?.trim().toLowerCase();
|
|
3
|
+
if (value === "mention")
|
|
4
|
+
return "mention";
|
|
5
|
+
if (value === "always")
|
|
6
|
+
return "always";
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
export function parseActivationCommand(raw) {
|
|
10
|
+
if (!raw)
|
|
11
|
+
return { hasCommand: false };
|
|
12
|
+
const trimmed = raw.trim();
|
|
13
|
+
if (!trimmed)
|
|
14
|
+
return { hasCommand: false };
|
|
15
|
+
const match = trimmed.match(/^\/activation\b(?:\s+([a-zA-Z]+))?/i);
|
|
16
|
+
if (!match)
|
|
17
|
+
return { hasCommand: false };
|
|
18
|
+
const mode = normalizeGroupActivation(match[1]);
|
|
19
|
+
return { hasCommand: true, mode };
|
|
20
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { HEARTBEAT_TOKEN } from "./tokens.js";
|
|
2
|
+
export const HEARTBEAT_PROMPT = "HEARTBEAT";
|
|
3
|
+
export const DEFAULT_HEARTBEAT_ACK_MAX_CHARS = 30;
|
|
4
|
+
function stripTokenAtEdges(raw) {
|
|
5
|
+
let text = raw.trim();
|
|
6
|
+
if (!text)
|
|
7
|
+
return { text: "", didStrip: false };
|
|
8
|
+
const token = HEARTBEAT_TOKEN;
|
|
9
|
+
if (!text.includes(token))
|
|
10
|
+
return { text, didStrip: false };
|
|
11
|
+
let didStrip = false;
|
|
12
|
+
let changed = true;
|
|
13
|
+
while (changed) {
|
|
14
|
+
changed = false;
|
|
15
|
+
const next = text.trim();
|
|
16
|
+
if (next.startsWith(token)) {
|
|
17
|
+
const after = next.slice(token.length).trimStart();
|
|
18
|
+
text = after;
|
|
19
|
+
didStrip = true;
|
|
20
|
+
changed = true;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (next.endsWith(token)) {
|
|
24
|
+
const before = next.slice(0, Math.max(0, next.length - token.length));
|
|
25
|
+
text = before.trimEnd();
|
|
26
|
+
didStrip = true;
|
|
27
|
+
changed = true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const collapsed = text.replace(/\s+/g, " ").trim();
|
|
31
|
+
return { text: collapsed, didStrip };
|
|
32
|
+
}
|
|
33
|
+
export function stripHeartbeatToken(raw, opts = {}) {
|
|
34
|
+
if (!raw)
|
|
35
|
+
return { shouldSkip: true, text: "", didStrip: false };
|
|
36
|
+
const trimmed = raw.trim();
|
|
37
|
+
if (!trimmed)
|
|
38
|
+
return { shouldSkip: true, text: "", didStrip: false };
|
|
39
|
+
const mode = opts.mode ?? "message";
|
|
40
|
+
const maxAckChars = Math.max(0, opts.maxAckChars ?? DEFAULT_HEARTBEAT_ACK_MAX_CHARS);
|
|
41
|
+
if (!trimmed.includes(HEARTBEAT_TOKEN)) {
|
|
42
|
+
return { shouldSkip: false, text: trimmed, didStrip: false };
|
|
43
|
+
}
|
|
44
|
+
const stripped = stripTokenAtEdges(trimmed);
|
|
45
|
+
if (!stripped.didStrip) {
|
|
46
|
+
return { shouldSkip: false, text: trimmed, didStrip: false };
|
|
47
|
+
}
|
|
48
|
+
if (!stripped.text) {
|
|
49
|
+
return { shouldSkip: true, text: "", didStrip: true };
|
|
50
|
+
}
|
|
51
|
+
if (mode === "heartbeat") {
|
|
52
|
+
const rest = stripped.text.trim();
|
|
53
|
+
if (rest.length <= maxAckChars) {
|
|
54
|
+
return { shouldSkip: true, text: "", didStrip: true };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { shouldSkip: false, text: stripped.text, didStrip: true };
|
|
58
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function extractModelDirective(body) {
|
|
2
|
+
if (!body)
|
|
3
|
+
return { cleaned: "", hasDirective: false };
|
|
4
|
+
const match = body.match(/(?:^|\s)\/model(?=$|\s|:)\s*:?\s*([A-Za-z0-9_.:@-]+(?:\/[A-Za-z0-9_.:@-]+)?)?/i);
|
|
5
|
+
const raw = match?.[1]?.trim();
|
|
6
|
+
let rawModel = raw;
|
|
7
|
+
let rawProfile;
|
|
8
|
+
if (raw?.includes("@")) {
|
|
9
|
+
const parts = raw.split("@");
|
|
10
|
+
rawModel = parts[0]?.trim();
|
|
11
|
+
rawProfile = parts.slice(1).join("@").trim() || undefined;
|
|
12
|
+
}
|
|
13
|
+
const cleaned = match
|
|
14
|
+
? body.replace(match[0], "").replace(/\s+/g, " ").trim()
|
|
15
|
+
: body.trim();
|
|
16
|
+
return {
|
|
17
|
+
cleaned,
|
|
18
|
+
rawModel,
|
|
19
|
+
rawProfile,
|
|
20
|
+
hasDirective: !!match,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const ABORT_TRIGGERS = new Set(["stop", "esc", "abort", "wait", "exit"]);
|
|
2
|
+
const ABORT_MEMORY = new Map();
|
|
3
|
+
export function isAbortTrigger(text) {
|
|
4
|
+
if (!text)
|
|
5
|
+
return false;
|
|
6
|
+
const normalized = text.trim().toLowerCase();
|
|
7
|
+
return ABORT_TRIGGERS.has(normalized);
|
|
8
|
+
}
|
|
9
|
+
export function getAbortMemory(key) {
|
|
10
|
+
return ABORT_MEMORY.get(key);
|
|
11
|
+
}
|
|
12
|
+
export function setAbortMemory(key, value) {
|
|
13
|
+
ABORT_MEMORY.set(key, value);
|
|
14
|
+
}
|