@intent-systems/nexus 2026.1.5-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +222 -0
- package/LICENSE +21 -0
- package/README-header.png +0 -0
- package/README.md +462 -0
- package/dist/agents/agent-paths.js +16 -0
- package/dist/agents/agent-scope.js +44 -0
- package/dist/agents/auth-profiles.js +626 -0
- package/dist/agents/bash-process-registry.js +126 -0
- package/dist/agents/bash-tools.js +838 -0
- package/dist/agents/chutes-oauth.js +47 -0
- package/dist/agents/clawdbot-tools.js +62 -0
- package/dist/agents/context.js +34 -0
- package/dist/agents/defaults.js +6 -0
- package/dist/agents/memory-search.js +80 -0
- package/dist/agents/model-auth.js +115 -0
- package/dist/agents/model-catalog.js +55 -0
- package/dist/agents/model-fallback.js +210 -0
- package/dist/agents/model-scan.js +263 -0
- package/dist/agents/model-selection.js +152 -0
- package/dist/agents/models-config.js +171 -0
- package/dist/agents/nexus-tools.js +46 -0
- package/dist/agents/pi-embedded-block-chunker.js +188 -0
- package/dist/agents/pi-embedded-helpers.js +139 -0
- package/dist/agents/pi-embedded-runner.js +932 -0
- package/dist/agents/pi-embedded-subscribe.js +541 -0
- package/dist/agents/pi-embedded-utils.js +20 -0
- package/dist/agents/pi-embedded.js +1 -0
- package/dist/agents/pi-extensions/compaction-safeguard.js +140 -0
- package/dist/agents/pi-tool-definition-adapter.js +17 -0
- package/dist/agents/pi-tools.js +510 -0
- package/dist/agents/pi-tools.schema.js +358 -0
- package/dist/agents/sandbox-paths.js +68 -0
- package/dist/agents/sandbox.js +667 -0
- package/dist/agents/shell-utils.js +53 -0
- package/dist/agents/skill-runner.js +224 -0
- package/dist/agents/skill-state.js +164 -0
- package/dist/agents/skill-tools.js +191 -0
- package/dist/agents/skill-usage.js +43 -0
- package/dist/agents/skills-install.js +244 -0
- package/dist/agents/skills-status.js +157 -0
- package/dist/agents/skills.js +472 -0
- package/dist/agents/subagent-registry.js +321 -0
- package/dist/agents/subagent-registry.store.js +47 -0
- package/dist/agents/system-prompt.js +179 -0
- package/dist/agents/timeout.js +26 -0
- package/dist/agents/tool-display.js +155 -0
- package/dist/agents/tool-display.json +236 -0
- package/dist/agents/tool-images.js +138 -0
- package/dist/agents/tool-policy.js +87 -0
- package/dist/agents/tools/agent-step.js +41 -0
- package/dist/agents/tools/browser-tool.js +295 -0
- package/dist/agents/tools/canvas-tool.js +193 -0
- package/dist/agents/tools/common.js +88 -0
- package/dist/agents/tools/cron-tool.js +141 -0
- package/dist/agents/tools/discord-actions-guild.js +186 -0
- package/dist/agents/tools/discord-actions-messaging.js +313 -0
- package/dist/agents/tools/discord-actions-moderation.js +70 -0
- package/dist/agents/tools/discord-actions.js +56 -0
- package/dist/agents/tools/discord-schema.js +199 -0
- package/dist/agents/tools/discord-tool.js +16 -0
- package/dist/agents/tools/gateway-tool.js +46 -0
- package/dist/agents/tools/gateway.js +28 -0
- package/dist/agents/tools/image-tool.js +140 -0
- package/dist/agents/tools/memory-tool.js +92 -0
- package/dist/agents/tools/nodes-tool.js +413 -0
- package/dist/agents/tools/nodes-utils.js +92 -0
- package/dist/agents/tools/sessions-announce-target.js +35 -0
- package/dist/agents/tools/sessions-helpers.js +88 -0
- package/dist/agents/tools/sessions-history-tool.js +137 -0
- package/dist/agents/tools/sessions-list-tool.js +196 -0
- package/dist/agents/tools/sessions-send-helpers.js +103 -0
- package/dist/agents/tools/sessions-send-tool.js +371 -0
- package/dist/agents/tools/sessions-spawn-tool.js +319 -0
- package/dist/agents/tools/slack-actions.js +129 -0
- package/dist/agents/tools/slack-schema.js +59 -0
- package/dist/agents/tools/slack-tool.js +16 -0
- package/dist/agents/tools/telegram-actions.js +159 -0
- package/dist/agents/tools/telegram-schema.js +28 -0
- package/dist/agents/tools/telegram-tool.js +16 -0
- package/dist/agents/tools/whatsapp-login-tool.js +63 -0
- package/dist/agents/usage.js +58 -0
- package/dist/agents/workspace.js +264 -0
- package/dist/auto-reply/chunk.js +177 -0
- package/dist/auto-reply/command-auth.js +44 -0
- package/dist/auto-reply/command-detection.js +22 -0
- package/dist/auto-reply/envelope.js +30 -0
- package/dist/auto-reply/group-activation.js +20 -0
- package/dist/auto-reply/heartbeat.js +58 -0
- package/dist/auto-reply/model.js +22 -0
- package/dist/auto-reply/reply/abort.js +14 -0
- package/dist/auto-reply/reply/agent-runner.js +426 -0
- package/dist/auto-reply/reply/bash-command.js +314 -0
- package/dist/auto-reply/reply/block-streaming.js +34 -0
- package/dist/auto-reply/reply/body.js +29 -0
- package/dist/auto-reply/reply/commands.js +332 -0
- package/dist/auto-reply/reply/directive-handling.js +626 -0
- package/dist/auto-reply/reply/directives.js +59 -0
- package/dist/auto-reply/reply/dispatch-from-config.js +23 -0
- package/dist/auto-reply/reply/followup-runner.js +181 -0
- package/dist/auto-reply/reply/groups.js +152 -0
- package/dist/auto-reply/reply/mentions.js +64 -0
- package/dist/auto-reply/reply/model-selection.js +209 -0
- package/dist/auto-reply/reply/queue.js +399 -0
- package/dist/auto-reply/reply/reply-dispatcher.js +68 -0
- package/dist/auto-reply/reply/reply-tags.js +26 -0
- package/dist/auto-reply/reply/session-updates.js +103 -0
- package/dist/auto-reply/reply/session.js +169 -0
- package/dist/auto-reply/reply/typing.js +125 -0
- package/dist/auto-reply/reply.js +655 -0
- package/dist/auto-reply/send-policy.js +28 -0
- package/dist/auto-reply/status.js +197 -0
- package/dist/auto-reply/templating.js +9 -0
- package/dist/auto-reply/thinking.js +49 -0
- package/dist/auto-reply/tokens.js +2 -0
- package/dist/auto-reply/tool-meta.js +74 -0
- package/dist/auto-reply/transcription.js +57 -0
- package/dist/auto-reply/types.js +1 -0
- package/dist/browser/bridge-server.js +37 -0
- package/dist/browser/cdp.js +382 -0
- package/dist/browser/chrome.js +432 -0
- package/dist/browser/client-actions-core.js +67 -0
- package/dist/browser/client-actions-observe.js +24 -0
- package/dist/browser/client-actions-types.js +1 -0
- package/dist/browser/client-actions.js +3 -0
- package/dist/browser/client-fetch.js +43 -0
- package/dist/browser/client.js +105 -0
- package/dist/browser/config.js +155 -0
- package/dist/browser/constants.js +5 -0
- package/dist/browser/profiles-service.js +124 -0
- package/dist/browser/profiles.js +96 -0
- package/dist/browser/pw-ai.js +2 -0
- package/dist/browser/pw-session.js +144 -0
- package/dist/browser/pw-tools-core.js +363 -0
- package/dist/browser/routes/agent.js +535 -0
- package/dist/browser/routes/basic.js +155 -0
- package/dist/browser/routes/index.js +8 -0
- package/dist/browser/routes/tabs.js +105 -0
- package/dist/browser/routes/utils.js +62 -0
- package/dist/browser/screenshot.js +40 -0
- package/dist/browser/server-context.js +377 -0
- package/dist/browser/server.js +81 -0
- package/dist/browser/target-id.js +18 -0
- package/dist/browser/trash.js +21 -0
- package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
- package/dist/canvas-host/a2ui/index.html +246 -0
- package/dist/canvas-host/a2ui.js +187 -0
- package/dist/canvas-host/server.js +382 -0
- package/dist/channel-web.js +8 -0
- package/dist/cli/browser-cli-actions-input.js +459 -0
- package/dist/cli/browser-cli-actions-observe.js +56 -0
- package/dist/cli/browser-cli-examples.js +31 -0
- package/dist/cli/browser-cli-inspect.js +97 -0
- package/dist/cli/browser-cli-manage.js +286 -0
- package/dist/cli/browser-cli-shared.js +1 -0
- package/dist/cli/browser-cli.js +26 -0
- package/dist/cli/canvas-cli.js +416 -0
- package/dist/cli/cloud-cli.js +336 -0
- package/dist/cli/credential-cli.js +227 -0
- package/dist/cli/cron-cli.js +454 -0
- package/dist/cli/deps.js +17 -0
- package/dist/cli/dns-cli.js +180 -0
- package/dist/cli/gateway-cli.js +665 -0
- package/dist/cli/gateway-rpc.js +20 -0
- package/dist/cli/hooks-cli.js +135 -0
- package/dist/cli/memory-cli.js +101 -0
- package/dist/cli/models-cli.js +248 -0
- package/dist/cli/nodes-camera.js +57 -0
- package/dist/cli/nodes-canvas.js +26 -0
- package/dist/cli/nodes-cli.js +946 -0
- package/dist/cli/nodes-screen.js +37 -0
- package/dist/cli/pairing-cli.js +100 -0
- package/dist/cli/parse-duration.js +20 -0
- package/dist/cli/plugins-cli.js +158 -0
- package/dist/cli/ports.js +97 -0
- package/dist/cli/profile.js +81 -0
- package/dist/cli/program.js +162 -0
- package/dist/cli/prompt.js +19 -0
- package/dist/cli/run-main.js +48 -0
- package/dist/cli/skills-cli.js +132 -0
- package/dist/cli/skills-hub-cli.js +1093 -0
- package/dist/cli/telegram-cli.js +56 -0
- package/dist/cli/tool-connector-cli.js +118 -0
- package/dist/cli/tui-cli.js +35 -0
- package/dist/cli/upstream-sync-cli.js +2833 -0
- package/dist/cli/usage-cli.js +24 -0
- package/dist/cli/wait.js +8 -0
- package/dist/commands/agent-via-gateway.js +115 -0
- package/dist/commands/agent.js +665 -0
- package/dist/commands/antigravity-oauth.js +327 -0
- package/dist/commands/auth-choice-options.js +80 -0
- package/dist/commands/auth-choice.js +134 -0
- package/dist/commands/auth-token.js +31 -0
- package/dist/commands/bootstrap-preset.js +214 -0
- package/dist/commands/capabilities.js +36 -0
- package/dist/commands/chutes-oauth.js +144 -0
- package/dist/commands/claude-md.js +137 -0
- package/dist/commands/config-view.js +11 -0
- package/dist/commands/configure.js +648 -0
- package/dist/commands/credential.js +236 -0
- package/dist/commands/cursor-rules.js +230 -0
- package/dist/commands/doctor-state-migrations.js +358 -0
- package/dist/commands/doctor-ui.js +113 -0
- package/dist/commands/doctor.js +673 -0
- package/dist/commands/health.js +112 -0
- package/dist/commands/identity.js +54 -0
- package/dist/commands/init.js +167 -0
- package/dist/commands/models/aliases.js +85 -0
- package/dist/commands/models/fallbacks.js +123 -0
- package/dist/commands/models/image-fallbacks.js +123 -0
- package/dist/commands/models/list.js +347 -0
- package/dist/commands/models/scan.js +271 -0
- package/dist/commands/models/set-image.js +27 -0
- package/dist/commands/models/set.js +27 -0
- package/dist/commands/models/shared.js +73 -0
- package/dist/commands/models.js +7 -0
- package/dist/commands/onboard-auth.js +101 -0
- package/dist/commands/onboard-channels.js +814 -0
- package/dist/commands/onboard-eve-identity.js +98 -0
- package/dist/commands/onboard-github.js +153 -0
- package/dist/commands/onboard-helpers.js +303 -0
- package/dist/commands/onboard-interactive.js +17 -0
- package/dist/commands/onboard-non-interactive.js +228 -0
- package/dist/commands/onboard-providers.js +829 -0
- package/dist/commands/onboard-quickstart.js +185 -0
- package/dist/commands/onboard-remote.js +120 -0
- package/dist/commands/onboard-skills.js +148 -0
- package/dist/commands/onboard-types.js +1 -0
- package/dist/commands/onboard.js +19 -0
- package/dist/commands/openai-codex-model-default.js +38 -0
- package/dist/commands/poll.js +64 -0
- package/dist/commands/quest.js +27 -0
- package/dist/commands/reset.js +61 -0
- package/dist/commands/send.js +124 -0
- package/dist/commands/sessions-ingest.js +359 -0
- package/dist/commands/sessions.js +212 -0
- package/dist/commands/setup.js +59 -0
- package/dist/commands/signal-install.js +135 -0
- package/dist/commands/skills-manifest.js +235 -0
- package/dist/commands/status.js +139 -0
- package/dist/commands/suggestions.js +54 -0
- package/dist/commands/systemd-linger.js +71 -0
- package/dist/commands/update.js +16 -0
- package/dist/commands/usage-upload.js +27 -0
- package/dist/config/config.js +6 -0
- package/dist/config/defaults.js +140 -0
- package/dist/config/group-policy.js +49 -0
- package/dist/config/includes.js +183 -0
- package/dist/config/io.js +188 -0
- package/dist/config/legacy-migrate.js +13 -0
- package/dist/config/legacy.js +425 -0
- package/dist/config/paths.js +82 -0
- package/dist/config/port-defaults.js +32 -0
- package/dist/config/schema.js +173 -0
- package/dist/config/sessions.js +611 -0
- package/dist/config/talk.js +31 -0
- package/dist/config/types.js +1 -0
- package/dist/config/validation.js +29 -0
- package/dist/config/zod-schema.js +1110 -0
- package/dist/control-ui/assets/index-D8Q5AI4D.js +2393 -0
- package/dist/control-ui/assets/index-D8Q5AI4D.js.map +1 -0
- package/dist/control-ui/assets/index-g06q5Xc3.css +1 -0
- package/dist/control-ui/favicon.ico +0 -0
- package/dist/control-ui/index.html +16 -0
- package/dist/cron/isolated-agent.js +529 -0
- package/dist/cron/normalize.js +73 -0
- package/dist/cron/parse.js +24 -0
- package/dist/cron/run-log.js +72 -0
- package/dist/cron/schedule.js +24 -0
- package/dist/cron/service.js +471 -0
- package/dist/cron/store.js +43 -0
- package/dist/cron/types.js +1 -0
- package/dist/daemon/constants.js +10 -0
- package/dist/daemon/launchd.js +295 -0
- package/dist/daemon/legacy.js +63 -0
- package/dist/daemon/program-args.js +141 -0
- package/dist/daemon/schtasks.js +269 -0
- package/dist/daemon/service.js +69 -0
- package/dist/daemon/systemd.js +332 -0
- package/dist/discord/index.js +2 -0
- package/dist/discord/monitor.js +1089 -0
- package/dist/discord/probe.js +54 -0
- package/dist/discord/send.js +652 -0
- package/dist/discord/token.js +8 -0
- package/dist/entry.js +16 -0
- package/dist/gateway/auth.js +121 -0
- package/dist/gateway/call.js +103 -0
- package/dist/gateway/chat-attachments.js +41 -0
- package/dist/gateway/client.js +180 -0
- package/dist/gateway/config-reload.js +274 -0
- package/dist/gateway/control-ui.js +184 -0
- package/dist/gateway/hooks-mapping.js +282 -0
- package/dist/gateway/hooks.js +168 -0
- package/dist/gateway/net.js +29 -0
- package/dist/gateway/protocol/index.js +62 -0
- package/dist/gateway/protocol/schema.js +577 -0
- package/dist/gateway/server-bridge-subscriptions.js +93 -0
- package/dist/gateway/server-bridge.js +1066 -0
- package/dist/gateway/server-browser.js +11 -0
- package/dist/gateway/server-channels.js +680 -0
- package/dist/gateway/server-chat.js +159 -0
- package/dist/gateway/server-constants.js +8 -0
- package/dist/gateway/server-discovery.js +62 -0
- package/dist/gateway/server-http.js +165 -0
- package/dist/gateway/server-methods/agent-job.js +114 -0
- package/dist/gateway/server-methods/agent.js +254 -0
- package/dist/gateway/server-methods/channels.js +239 -0
- package/dist/gateway/server-methods/chat.js +207 -0
- package/dist/gateway/server-methods/config.js +50 -0
- package/dist/gateway/server-methods/connect.js +6 -0
- package/dist/gateway/server-methods/cron.js +89 -0
- package/dist/gateway/server-methods/health.js +28 -0
- package/dist/gateway/server-methods/models.js +16 -0
- package/dist/gateway/server-methods/nodes.js +294 -0
- package/dist/gateway/server-methods/providers.js +257 -0
- package/dist/gateway/server-methods/send.js +254 -0
- package/dist/gateway/server-methods/sessions.js +382 -0
- package/dist/gateway/server-methods/skills.js +83 -0
- package/dist/gateway/server-methods/system.js +118 -0
- package/dist/gateway/server-methods/talk.js +22 -0
- package/dist/gateway/server-methods/types.js +1 -0
- package/dist/gateway/server-methods/voicewake.js +30 -0
- package/dist/gateway/server-methods/web.js +81 -0
- package/dist/gateway/server-methods/wizard.js +100 -0
- package/dist/gateway/server-methods.js +53 -0
- package/dist/gateway/server-providers.js +687 -0
- package/dist/gateway/server-shared.js +1 -0
- package/dist/gateway/server-utils.js +35 -0
- package/dist/gateway/server.js +1478 -0
- package/dist/gateway/session-utils.js +355 -0
- package/dist/gateway/ws-log.js +343 -0
- package/dist/gateway/ws-logging.js +8 -0
- package/dist/globals.js +41 -0
- package/dist/hooks/gmail-ops.js +236 -0
- package/dist/hooks/gmail-setup-utils.js +278 -0
- package/dist/hooks/gmail-watcher.js +190 -0
- package/dist/hooks/gmail.js +177 -0
- package/dist/imessage/client.js +165 -0
- package/dist/imessage/index.js +3 -0
- package/dist/imessage/monitor.js +365 -0
- package/dist/imessage/probe.js +26 -0
- package/dist/imessage/send.js +83 -0
- package/dist/imessage/targets.js +176 -0
- package/dist/index.js +55 -0
- package/dist/infra/agent-events.js +46 -0
- package/dist/infra/binaries.js +9 -0
- package/dist/infra/bonjour-discovery.js +163 -0
- package/dist/infra/bonjour.js +200 -0
- package/dist/infra/bridge/server.js +564 -0
- package/dist/infra/canvas-host-url.js +54 -0
- package/dist/infra/channel-summary.js +78 -0
- package/dist/infra/control-ui-assets.js +112 -0
- package/dist/infra/dotenv.js +15 -0
- package/dist/infra/env.js +8 -0
- package/dist/infra/errors.js +28 -0
- package/dist/infra/event-log.js +251 -0
- package/dist/infra/gateway-lock.js +8 -0
- package/dist/infra/git-commit.js +91 -0
- package/dist/infra/heartbeat-events.js +21 -0
- package/dist/infra/heartbeat-runner.js +458 -0
- package/dist/infra/heartbeat-wake.js +61 -0
- package/dist/infra/is-main.js +37 -0
- package/dist/infra/json-file.js +21 -0
- package/dist/infra/machine-name.js +40 -0
- package/dist/infra/nexus-root.js +56 -0
- package/dist/infra/node-pairing.js +212 -0
- package/dist/infra/path-env.js +93 -0
- package/dist/infra/ports.js +87 -0
- package/dist/infra/provider-summary.js +80 -0
- package/dist/infra/provider-usage.auth.js +189 -0
- package/dist/infra/provider-usage.fetch.claude.js +129 -0
- package/dist/infra/provider-usage.fetch.codex.js +62 -0
- package/dist/infra/provider-usage.fetch.copilot.js +42 -0
- package/dist/infra/provider-usage.fetch.gemini.js +57 -0
- package/dist/infra/provider-usage.fetch.js +6 -0
- package/dist/infra/provider-usage.fetch.minimax.js +214 -0
- package/dist/infra/provider-usage.fetch.shared.js +11 -0
- package/dist/infra/provider-usage.fetch.zai.js +62 -0
- package/dist/infra/provider-usage.format.js +77 -0
- package/dist/infra/provider-usage.js +145 -0
- package/dist/infra/provider-usage.load.js +54 -0
- package/dist/infra/provider-usage.shared.js +19 -0
- package/dist/infra/provider-usage.types.js +1 -0
- package/dist/infra/restart.js +29 -0
- package/dist/infra/retry.js +16 -0
- package/dist/infra/runtime-guard.js +59 -0
- package/dist/infra/shell-env.js +88 -0
- package/dist/infra/system-events.js +71 -0
- package/dist/infra/system-presence.js +217 -0
- package/dist/infra/tailnet.js +46 -0
- package/dist/infra/tailscale.js +149 -0
- package/dist/infra/unhandled-rejections.js +19 -0
- package/dist/infra/usage-suggestions.js +241 -0
- package/dist/infra/usage-upload.js +290 -0
- package/dist/infra/voicewake.js +78 -0
- package/dist/infra/widearea-dns.js +123 -0
- package/dist/infra/ws.js +13 -0
- package/dist/logger.js +52 -0
- package/dist/logging.js +506 -0
- package/dist/macos/gateway-daemon.js +145 -0
- package/dist/macos/relay.js +49 -0
- package/dist/media/constants.js +33 -0
- package/dist/media/host.js +42 -0
- package/dist/media/image-ops.js +119 -0
- package/dist/media/mime.js +123 -0
- package/dist/media/parse.js +83 -0
- package/dist/media/server.js +64 -0
- package/dist/media/store.js +139 -0
- package/dist/polls.js +43 -0
- package/dist/process/command-queue.js +97 -0
- package/dist/process/exec.js +75 -0
- package/dist/provider-web.js +8 -0
- package/dist/providers/github-copilot-auth.js +123 -0
- package/dist/providers/github-copilot-models.js +35 -0
- package/dist/providers/github-copilot-token.js +11 -0
- package/dist/providers/location.js +48 -0
- package/dist/providers/web/index.js +2 -0
- package/dist/runtime.js +8 -0
- package/dist/sessions/level-overrides.js +9 -0
- package/dist/sessions/send-policy.js +68 -0
- package/dist/signal/client.js +134 -0
- package/dist/signal/daemon.js +69 -0
- package/dist/signal/index.js +3 -0
- package/dist/signal/monitor.js +411 -0
- package/dist/signal/probe.js +46 -0
- package/dist/signal/send.js +91 -0
- package/dist/slack/actions.js +97 -0
- package/dist/slack/index.js +5 -0
- package/dist/slack/monitor.js +1270 -0
- package/dist/slack/probe.js +47 -0
- package/dist/slack/send.js +131 -0
- package/dist/slack/token.js +10 -0
- package/dist/telegram/allowed-updates.js +8 -0
- package/dist/telegram/bot.js +724 -0
- package/dist/telegram/download.js +34 -0
- package/dist/telegram/index.js +4 -0
- package/dist/telegram/monitor.js +47 -0
- package/dist/telegram/pairing-store.js +77 -0
- package/dist/telegram/probe.js +63 -0
- package/dist/telegram/proxy.js +9 -0
- package/dist/telegram/reaction-level.js +45 -0
- package/dist/telegram/send.js +151 -0
- package/dist/telegram/sent-message-cache.js +65 -0
- package/dist/telegram/token.js +30 -0
- package/dist/telegram/update-offset-store.js +61 -0
- package/dist/telegram/webhook-set.js +12 -0
- package/dist/telegram/webhook.js +56 -0
- package/dist/tui/commands.js +87 -0
- package/dist/tui/components/assistant-message.js +16 -0
- package/dist/tui/components/chat-log.js +92 -0
- package/dist/tui/components/custom-editor.js +55 -0
- package/dist/tui/components/selectors.js +8 -0
- package/dist/tui/components/tool-execution.js +111 -0
- package/dist/tui/components/user-message.js +17 -0
- package/dist/tui/gateway-chat.js +140 -0
- package/dist/tui/theme/theme.js +80 -0
- package/dist/tui/tui.js +708 -0
- package/dist/utils.js +153 -0
- package/dist/version.js +18 -0
- package/dist/web/accounts.js +86 -0
- package/dist/web/active-listener.js +25 -0
- package/dist/web/auto-reply.js +1256 -0
- package/dist/web/inbound.js +649 -0
- package/dist/web/login-qr.js +230 -0
- package/dist/web/login.js +71 -0
- package/dist/web/media.js +175 -0
- package/dist/web/outbound.js +102 -0
- package/dist/web/qr-image.js +97 -0
- package/dist/web/reconnect.js +60 -0
- package/dist/web/session.js +370 -0
- package/dist/wizard/clack-prompter.js +56 -0
- package/dist/wizard/onboarding.js +620 -0
- package/dist/wizard/prompts.js +6 -0
- package/dist/wizard/session.js +203 -0
- package/docs/AGENTS.default.md +116 -0
- package/docs/CAPABILITIES.md +444 -0
- package/docs/CNAME +1 -0
- package/docs/NEXUS_CORE_REWRITE_SPEC.md +226 -0
- package/docs/RELEASING.md +69 -0
- package/docs/_config.yml +53 -0
- package/docs/_layouts/default.html +145 -0
- package/docs/agent-assisted-install.md +95 -0
- package/docs/agent-loop.md +61 -0
- package/docs/agent-send.md +21 -0
- package/docs/agent.md +108 -0
- package/docs/android.md +133 -0
- package/docs/architecture.md +114 -0
- package/docs/assets/markdown.css +133 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/terminal.css +470 -0
- package/docs/assets/theme.js +55 -0
- package/docs/audio.md +48 -0
- package/docs/automation/nexus-sync.md +371 -0
- package/docs/background-process.md +74 -0
- package/docs/bash.md +32 -0
- package/docs/bedrock.md +71 -0
- package/docs/bonjour.md +159 -0
- package/docs/browser-linux-troubleshooting.md +114 -0
- package/docs/browser.md +293 -0
- package/docs/bun.md +56 -0
- package/docs/camera.md +152 -0
- package/docs/clawd.md +212 -0
- package/docs/concepts/usage-tracking.md +29 -0
- package/docs/configuration.md +1666 -0
- package/docs/control-ui.md +83 -0
- package/docs/cron.md +385 -0
- package/docs/dashboard.md +17 -0
- package/docs/device-models.md +46 -0
- package/docs/discord.md +308 -0
- package/docs/discovery.md +112 -0
- package/docs/docker.md +258 -0
- package/docs/docs.json +105 -0
- package/docs/doctor.md +68 -0
- package/docs/elevated.md +31 -0
- package/docs/faq.md +736 -0
- package/docs/feature-inventory/overview.md +141 -0
- package/docs/feature-inventory/rollout-checklist.md +53 -0
- package/docs/feature-inventory/test-matrix.md +87 -0
- package/docs/feature-inventory.md +9 -0
- package/docs/gateway/configuration-examples.md +221 -0
- package/docs/gateway/configuration.md +172 -0
- package/docs/gateway/cron.md +61 -0
- package/docs/gateway/heartbeat.md +207 -0
- package/docs/gateway/pairing.md +109 -0
- package/docs/gateway-lock.md +28 -0
- package/docs/gateway.md +227 -0
- package/docs/gmail-pubsub.md +191 -0
- package/docs/grammy.md +27 -0
- package/docs/group-messages.md +73 -0
- package/docs/groups.md +130 -0
- package/docs/health.md +28 -0
- package/docs/heartbeat.md +73 -0
- package/docs/home-userspace.md +277 -0
- package/docs/hubs.md +148 -0
- package/docs/images.md +51 -0
- package/docs/imessage.md +94 -0
- package/docs/index.md +196 -0
- package/docs/ios.md +372 -0
- package/docs/linux.md +11 -0
- package/docs/location-command.md +95 -0
- package/docs/location.md +46 -0
- package/docs/logging.md +110 -0
- package/docs/lore.md +131 -0
- package/docs/mac/bun.md +133 -0
- package/docs/mac/canvas.md +161 -0
- package/docs/mac/child-process.md +72 -0
- package/docs/mac/dev-setup.md +81 -0
- package/docs/mac/health.md +28 -0
- package/docs/mac/icon.md +26 -0
- package/docs/mac/logging.md +51 -0
- package/docs/mac/menu-bar.md +69 -0
- package/docs/mac/peekaboo.md +170 -0
- package/docs/mac/permissions.md +40 -0
- package/docs/mac/release.md +76 -0
- package/docs/mac/remote.md +57 -0
- package/docs/mac/signing.md +41 -0
- package/docs/mac/skills.md +27 -0
- package/docs/mac/voice-overlay.md +52 -0
- package/docs/mac/voicewake.md +56 -0
- package/docs/mac/webchat.md +27 -0
- package/docs/mac/xpc.md +40 -0
- package/docs/macos.md +104 -0
- package/docs/model-failover.md +75 -0
- package/docs/models.md +91 -0
- package/docs/multi-agent.md +74 -0
- package/docs/nix.md +95 -0
- package/docs/nodes.md +157 -0
- package/docs/onboarding-config-protocol.md +34 -0
- package/docs/onboarding.md +189 -0
- package/docs/pairing.md +85 -0
- package/docs/plans/cron-add-hardening.md +72 -0
- package/docs/plans/group-policy-hardening.md +121 -0
- package/docs/poll.md +52 -0
- package/docs/prereqs.md +67 -0
- package/docs/presence.md +133 -0
- package/docs/proposals/model-config.md +147 -0
- package/docs/provider-routing.md +25 -0
- package/docs/queue.md +78 -0
- package/docs/reference/templates/AGENTS.md +164 -0
- package/docs/remote-gateway-readme.md +153 -0
- package/docs/remote.md +61 -0
- package/docs/research/memory.md +227 -0
- package/docs/rpc.md +35 -0
- package/docs/security.md +200 -0
- package/docs/session-ingestion.md +119 -0
- package/docs/session-tool.md +154 -0
- package/docs/session.md +85 -0
- package/docs/sessions.md +8 -0
- package/docs/setup.md +131 -0
- package/docs/showcase.md +37 -0
- package/docs/signal.md +122 -0
- package/docs/skills-config.md +58 -0
- package/docs/skills.md +153 -0
- package/docs/slack.md +221 -0
- package/docs/subagents.md +72 -0
- package/docs/tailscale.md +71 -0
- package/docs/talk.md +79 -0
- package/docs/telegram.md +96 -0
- package/docs/templates/AGENTS.md +286 -0
- package/docs/templates/BOOTSTRAP.md +35 -0
- package/docs/templates/IDENTITY.md +17 -0
- package/docs/templates/PROFILE.md +14 -0
- package/docs/templates/SOUL.md +41 -0
- package/docs/templates/TOOLS.md +41 -0
- package/docs/templates/USER.md +8 -0
- package/docs/test.md +43 -0
- package/docs/testing-onboarding-quickstart.md +76 -0
- package/docs/testing-philosophy.md +211 -0
- package/docs/thinking.md +46 -0
- package/docs/timezone.md +40 -0
- package/docs/tools.md +346 -0
- package/docs/troubleshooting.md +257 -0
- package/docs/tui.md +71 -0
- package/docs/typebox.md +42 -0
- package/docs/updating.md +138 -0
- package/docs/usage-cloud-aggregation-spec.md +133 -0
- package/docs/usage-suggestions-pipeline.md +126 -0
- package/docs/voicewake.md +61 -0
- package/docs/web.md +115 -0
- package/docs/webchat.md +34 -0
- package/docs/webhook.md +132 -0
- package/docs/whatsapp-clawd.jpg +0 -0
- package/docs/whatsapp.md +170 -0
- package/docs/windows.md +11 -0
- package/docs/wizard.md +167 -0
- package/package.json +209 -0
- package/skills/1password/SKILL.md +54 -0
- package/skills/1password/docs/setup.md +85 -0
- package/skills/1password/docs/troubleshooting.md +63 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/agent-browser/SKILL.md +450 -0
- package/skills/agent-browser/docs/browser-use-eval.md +95 -0
- package/skills/agent-browser/docs/first-tests.md +261 -0
- package/skills/agent-browser/docs/wordle-nyt-eval.js +32 -0
- package/skills/aix/SKILL.md +93 -0
- package/skills/aix/docs/embeddings.md +40 -0
- package/skills/aix/docs/setup.md +58 -0
- package/skills/aix/docs/troubleshooting.md +41 -0
- package/skills/aix/references/sql.md +48 -0
- package/skills/apple-notes/SKILL.md +50 -0
- package/skills/apple-reminders/SKILL.md +67 -0
- package/skills/bear-notes/SKILL.md +79 -0
- package/skills/bird/SKILL.md +32 -0
- package/skills/bird/docs/auth.md +31 -0
- package/skills/bird/docs/troubleshooting.md +31 -0
- package/skills/blogwatcher/SKILL.md +46 -0
- package/skills/blucli/SKILL.md +27 -0
- package/skills/brave-search/SKILL.md +36 -0
- package/skills/brave-search/docs/setup.md +40 -0
- package/skills/brave-search/docs/troubleshooting.md +37 -0
- package/skills/brave-search/docs/usage.md +28 -0
- package/skills/brave-search/scripts/content.mjs +53 -0
- package/skills/brave-search/scripts/search.mjs +79 -0
- package/skills/browser-use-agent-sdk/SKILL.md +90 -0
- package/skills/camsnap/SKILL.md +25 -0
- package/skills/clawdhub/SKILL.md +53 -0
- package/skills/coding-agent/SKILL.md +274 -0
- package/skills/comms/SKILL.md +249 -0
- package/skills/comms/docs/adapters.md +54 -0
- package/skills/comms/docs/setup.md +56 -0
- package/skills/comms/docs/troubleshooting.md +44 -0
- package/skills/comms/references/schema.md +49 -0
- package/skills/computer-use/SKILL.md +204 -0
- package/skills/computer-use/docs/open-interpreter.md +26 -0
- package/skills/computer-use/docs/peekaboo.md +26 -0
- package/skills/computer-use/docs/setup.md +47 -0
- package/skills/computer-use/docs/troubleshooting.md +33 -0
- package/skills/discord/SKILL.md +370 -0
- package/skills/eightctl/SKILL.md +29 -0
- package/skills/eve/SKILL.md +215 -0
- package/skills/eve/docs/dual-account.md +84 -0
- package/skills/eve/docs/intelligence.md +58 -0
- package/skills/eve/docs/setup.md +60 -0
- package/skills/eve/docs/troubleshooting.md +54 -0
- package/skills/eve/scripts/setup-dual-account.sh +125 -0
- package/skills/filesystem/SKILL.md +217 -0
- package/skills/food-order/SKILL.md +41 -0
- package/skills/gemini/SKILL.md +23 -0
- package/skills/gh/SKILL.md +22 -0
- package/skills/gh/docs/usage.md +41 -0
- package/skills/gifgrep/SKILL.md +47 -0
- package/skills/github/SKILL.md +26 -0
- package/skills/github/docs/setup.md +21 -0
- package/skills/github/docs/troubleshooting.md +24 -0
- package/skills/gog/SKILL.md +104 -0
- package/skills/gog/docs/portability.md +94 -0
- package/skills/gog/docs/setup.md +76 -0
- package/skills/gog/docs/troubleshooting.md +94 -0
- package/skills/gog/scripts/cdp/README.md +90 -0
- package/skills/gog/scripts/cdp/add_test_users.py +69 -0
- package/skills/gog/scripts/cdp/auth_add_accounts.py +209 -0
- package/skills/gog/scripts/cdp/auth_add_accounts_manual.py +206 -0
- package/skills/gog/scripts/cdp/create_oauth_client.py +165 -0
- package/skills/gog/scripts/cdp/launch_cdp_chrome.sh +58 -0
- package/skills/google-oauth/SKILL.md +94 -0
- package/skills/goplaces/SKILL.md +30 -0
- package/skills/imsg/SKILL.md +25 -0
- package/skills/json-render/SKILL.md +154 -0
- package/skills/json-render/assets/components/README.md +21 -0
- package/skills/json-render/assets/components/catalog.ts +78 -0
- package/skills/json-render/assets/components/registry.tsx +172 -0
- package/skills/json-render/assets/demo/App.css +397 -0
- package/skills/json-render/assets/demo/App.tsx +897 -0
- package/skills/json-render/assets/demo/README.md +22 -0
- package/skills/json-render/assets/demo/catalog.ts +78 -0
- package/skills/json-render/assets/demo/data/nexus-core.json +31 -0
- package/skills/json-render/assets/demo/index.css +27 -0
- package/skills/json-render/assets/demo/registry.tsx +150 -0
- package/skills/json-render/docs/nexus-state-demo.md +84 -0
- package/skills/json-render/docs/shadcn-preset.md +33 -0
- package/skills/json-render/scripts/create-vite-demo.sh +45 -0
- package/skills/json-render/scripts/llm-server/README.md +33 -0
- package/skills/json-render/scripts/llm-server/catalog.ts +78 -0
- package/skills/json-render/scripts/llm-server/package-lock.json +702 -0
- package/skills/json-render/scripts/llm-server/package.json +18 -0
- package/skills/json-render/scripts/llm-server/server.ts +285 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +91 -0
- package/skills/local-places/pyproject.toml +27 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +38 -0
- package/skills/model-usage/SKILL.md +45 -0
- package/skills/model-usage/references/codexbar-cli.md +28 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +30 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +169 -0
- package/skills/nano-pdf/SKILL.md +20 -0
- package/skills/nexus-cloud/SKILL.md +53 -0
- package/skills/nexus-cloud/docs/security.md +24 -0
- package/skills/nexus-cloud/docs/setup.md +51 -0
- package/skills/nexus-cloud/docs/troubleshooting.md +28 -0
- package/skills/notion/SKILL.md +156 -0
- package/skills/obsidian/SKILL.md +55 -0
- package/skills/onboarding/SKILL.md +515 -0
- package/skills/onboarding/docs/CAPABILITIES.md +444 -0
- package/skills/onboarding/docs/CAPABILITY_TAXONOMY.md +608 -0
- package/skills/onboarding/docs/CLI_GRAMMAR.md +797 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_CREDENTIALS.md +632 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_ONBOARDING.md +815 -0
- package/skills/onboarding/docs/CLI_GRAMMAR_SKILLS.md +449 -0
- package/skills/onboarding/docs/DOCUMENTATION_OVERVIEW.md +290 -0
- package/skills/onboarding/docs/ENTITY_MODEL.md +582 -0
- package/skills/onboarding/docs/GOAL_STATE_ARCHITECTURE.md +395 -0
- package/skills/onboarding/docs/NEXUS_SYSTEM_OVERVIEW.md +476 -0
- package/skills/onboarding/docs/SKILLS_HUB_SPEC.md +477 -0
- package/skills/onboarding/docs/SKILLS_SPECIFICATION.md +947 -0
- package/skills/onboarding/docs/SKILL_GATEWAY_DESIGN.md +702 -0
- package/skills/onboarding/docs/SKILL_GATEWAY_PRD.md +278 -0
- package/skills/onboarding/docs/SKILL_INVENTORY.md +266 -0
- package/skills/onboarding/docs/STATE_ARCHITECTURE.md +547 -0
- package/skills/onboarding/docs/TROUBLESHOOTING.md +363 -0
- package/skills/onboarding/docs/USER_JOURNEY.md +797 -0
- package/skills/onboarding/docs/WOW_MOMENTS.md +232 -0
- package/skills/onboarding/docs/agent-apple-id.md +289 -0
- package/skills/onboarding/docs/skill-deep-dives/1password.md +367 -0
- package/skills/onboarding/docs/skill-deep-dives/TEMPLATE.md +197 -0
- package/skills/onboarding/docs/skill-deep-dives/aix.md +498 -0
- package/skills/onboarding/docs/skill-deep-dives/bird.md +357 -0
- package/skills/onboarding/docs/skill-deep-dives/brave-search.md +601 -0
- package/skills/onboarding/docs/skill-deep-dives/comms.md +607 -0
- package/skills/onboarding/docs/skill-deep-dives/computer-use.md +599 -0
- package/skills/onboarding/docs/skill-deep-dives/cron-and-heartbeat.md +576 -0
- package/skills/onboarding/docs/skill-deep-dives/eve.md +711 -0
- package/skills/onboarding/docs/skill-deep-dives/github.md +333 -0
- package/skills/onboarding/docs/skill-deep-dives/gog.md +640 -0
- package/skills/onboarding/docs/skill-deep-dives/homebrew-prereqs.md +785 -0
- package/skills/onboarding/docs/skill-deep-dives/nexus-cloud.md +689 -0
- package/skills/onboarding/docs/skill-deep-dives/qmd.md +742 -0
- package/skills/onboarding/docs/skill-deep-dives/telegram.md +379 -0
- package/skills/onboarding/docs/skill-deep-dives/wacli.md +399 -0
- package/skills/onboarding/docs/skill-deep-dives/weather.md +513 -0
- package/skills/onboarding/scripts/ralph/prd.json +215 -0
- package/skills/onboarding/scripts/ralph/progress.txt +99 -0
- package/skills/onboarding/scripts/ralph/prompt.md +87 -0
- package/skills/onboarding/scripts/ralph/ralph.log +84 -0
- package/skills/onboarding/scripts/ralph/ralph.sh +45 -0
- package/skills/onboarding/scripts/setup-cursor-skills.sh +40 -0
- package/skills/openai-image-gen/SKILL.md +31 -0
- package/skills/openai-image-gen/scripts/gen.py +173 -0
- package/skills/openai-whisper/SKILL.md +19 -0
- package/skills/openai-whisper-api/SKILL.md +43 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +30 -0
- package/skills/oracle/SKILL.md +105 -0
- package/skills/ordercli/SKILL.md +47 -0
- package/skills/peekaboo/SKILL.md +153 -0
- package/skills/qmd/SKILL.md +32 -0
- package/skills/qmd/docs/mcp.md +30 -0
- package/skills/qmd/docs/ollama.md +42 -0
- package/skills/qmd/docs/setup.md +44 -0
- package/skills/sag/SKILL.md +62 -0
- package/skills/skill-cli-template/SKILL.md +109 -0
- package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-311.pyc +0 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +29 -0
- package/skills/sonoscli/SKILL.md +26 -0
- package/skills/spotify-player/SKILL.md +34 -0
- package/skills/summarize/SKILL.md +49 -0
- package/skills/telegram/SKILL.md +20 -0
- package/skills/telegram/docs/pairing.md +30 -0
- package/skills/telegram/docs/setup.md +41 -0
- package/skills/telegram/docs/webhook.md +17 -0
- package/skills/things-mac/SKILL.md +61 -0
- package/skills/tmux/SKILL.md +121 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +84 -0
- package/skills/upstream-sync/SKILL.md +151 -0
- package/skills/upstream-sync/scripts/auto-port.sh +227 -0
- package/skills/upstream-sync/scripts/check-all.sh +88 -0
- package/skills/upstream-sync/scripts/check-nexus.sh +146 -0
- package/skills/upstream-sync/scripts/check-pi-ai.sh +129 -0
- package/skills/video-frames/SKILL.md +29 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/wacli/SKILL.md +48 -0
- package/skills/wacli/docs/auth.md +21 -0
- package/skills/wacli/docs/backup.md +9 -0
- package/skills/wacli/docs/troubleshooting.md +21 -0
- package/skills/weather/SKILL.md +53 -0
- package/skills/weather/docs/usage.md +40 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Summarize CodexBar local cost usage by model.
|
|
4
|
+
|
|
5
|
+
Defaults to current model (most recent daily entry), or list all models.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from datetime import date, datetime, timedelta
|
|
17
|
+
from typing import Any, Dict, Iterable, List, Optional, Tuple
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def eprint(msg: str) -> None:
|
|
21
|
+
print(msg, file=sys.stderr)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def run_codexbar_cost(provider: str) -> List[Dict[str, Any]]:
|
|
25
|
+
cmd = ["codexbar", "cost", "--format", "json", "--provider", provider]
|
|
26
|
+
try:
|
|
27
|
+
output = subprocess.check_output(cmd, text=True)
|
|
28
|
+
except FileNotFoundError:
|
|
29
|
+
raise RuntimeError("codexbar not found on PATH. Install CodexBar CLI first.")
|
|
30
|
+
except subprocess.CalledProcessError as exc:
|
|
31
|
+
raise RuntimeError(f"codexbar cost failed (exit {exc.returncode}).")
|
|
32
|
+
try:
|
|
33
|
+
payload = json.loads(output)
|
|
34
|
+
except json.JSONDecodeError as exc:
|
|
35
|
+
raise RuntimeError(f"Failed to parse codexbar JSON output: {exc}")
|
|
36
|
+
if not isinstance(payload, list):
|
|
37
|
+
raise RuntimeError("Expected codexbar cost JSON array.")
|
|
38
|
+
return payload
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def load_payload(input_path: Optional[str], provider: str) -> Dict[str, Any]:
|
|
42
|
+
if input_path:
|
|
43
|
+
if input_path == "-":
|
|
44
|
+
raw = sys.stdin.read()
|
|
45
|
+
else:
|
|
46
|
+
with open(input_path, "r", encoding="utf-8") as handle:
|
|
47
|
+
raw = handle.read()
|
|
48
|
+
data = json.loads(raw)
|
|
49
|
+
else:
|
|
50
|
+
data = run_codexbar_cost(provider)
|
|
51
|
+
|
|
52
|
+
if isinstance(data, dict):
|
|
53
|
+
return data
|
|
54
|
+
|
|
55
|
+
if isinstance(data, list):
|
|
56
|
+
for entry in data:
|
|
57
|
+
if isinstance(entry, dict) and entry.get("provider") == provider:
|
|
58
|
+
return entry
|
|
59
|
+
raise RuntimeError(f"Provider '{provider}' not found in codexbar payload.")
|
|
60
|
+
|
|
61
|
+
raise RuntimeError("Unsupported JSON input format.")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@dataclass
|
|
65
|
+
class ModelCost:
|
|
66
|
+
model: str
|
|
67
|
+
cost: float
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def parse_daily_entries(payload: Dict[str, Any]) -> List[Dict[str, Any]]:
|
|
71
|
+
daily = payload.get("daily")
|
|
72
|
+
if not daily:
|
|
73
|
+
return []
|
|
74
|
+
if not isinstance(daily, list):
|
|
75
|
+
return []
|
|
76
|
+
return [entry for entry in daily if isinstance(entry, dict)]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def parse_date(value: str) -> Optional[date]:
|
|
80
|
+
try:
|
|
81
|
+
return datetime.strptime(value, "%Y-%m-%d").date()
|
|
82
|
+
except Exception:
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def filter_by_days(entries: List[Dict[str, Any]], days: Optional[int]) -> List[Dict[str, Any]]:
|
|
87
|
+
if not days:
|
|
88
|
+
return entries
|
|
89
|
+
cutoff = date.today() - timedelta(days=days - 1)
|
|
90
|
+
filtered: List[Dict[str, Any]] = []
|
|
91
|
+
for entry in entries:
|
|
92
|
+
day = entry.get("date")
|
|
93
|
+
if not isinstance(day, str):
|
|
94
|
+
continue
|
|
95
|
+
parsed = parse_date(day)
|
|
96
|
+
if parsed and parsed >= cutoff:
|
|
97
|
+
filtered.append(entry)
|
|
98
|
+
return filtered
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def aggregate_costs(entries: Iterable[Dict[str, Any]]) -> Dict[str, float]:
|
|
102
|
+
totals: Dict[str, float] = {}
|
|
103
|
+
for entry in entries:
|
|
104
|
+
breakdowns = entry.get("modelBreakdowns")
|
|
105
|
+
if not breakdowns:
|
|
106
|
+
continue
|
|
107
|
+
if not isinstance(breakdowns, list):
|
|
108
|
+
continue
|
|
109
|
+
for item in breakdowns:
|
|
110
|
+
if not isinstance(item, dict):
|
|
111
|
+
continue
|
|
112
|
+
model = item.get("modelName")
|
|
113
|
+
cost = item.get("cost")
|
|
114
|
+
if not isinstance(model, str):
|
|
115
|
+
continue
|
|
116
|
+
if not isinstance(cost, (int, float)):
|
|
117
|
+
continue
|
|
118
|
+
totals[model] = totals.get(model, 0.0) + float(cost)
|
|
119
|
+
return totals
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def pick_current_model(entries: List[Dict[str, Any]]) -> Tuple[Optional[str], Optional[str]]:
|
|
123
|
+
if not entries:
|
|
124
|
+
return None, None
|
|
125
|
+
sorted_entries = sorted(
|
|
126
|
+
entries,
|
|
127
|
+
key=lambda entry: entry.get("date") or "",
|
|
128
|
+
)
|
|
129
|
+
for entry in reversed(sorted_entries):
|
|
130
|
+
breakdowns = entry.get("modelBreakdowns")
|
|
131
|
+
if isinstance(breakdowns, list) and breakdowns:
|
|
132
|
+
scored: List[ModelCost] = []
|
|
133
|
+
for item in breakdowns:
|
|
134
|
+
if not isinstance(item, dict):
|
|
135
|
+
continue
|
|
136
|
+
model = item.get("modelName")
|
|
137
|
+
cost = item.get("cost")
|
|
138
|
+
if isinstance(model, str) and isinstance(cost, (int, float)):
|
|
139
|
+
scored.append(ModelCost(model=model, cost=float(cost)))
|
|
140
|
+
if scored:
|
|
141
|
+
scored.sort(key=lambda item: item.cost, reverse=True)
|
|
142
|
+
return scored[0].model, entry.get("date") if isinstance(entry.get("date"), str) else None
|
|
143
|
+
models_used = entry.get("modelsUsed")
|
|
144
|
+
if isinstance(models_used, list) and models_used:
|
|
145
|
+
last = models_used[-1]
|
|
146
|
+
if isinstance(last, str):
|
|
147
|
+
return last, entry.get("date") if isinstance(entry.get("date"), str) else None
|
|
148
|
+
return None, None
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def usd(value: Optional[float]) -> str:
|
|
152
|
+
if value is None:
|
|
153
|
+
return "—"
|
|
154
|
+
return f"${value:,.2f}"
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def latest_day_cost(entries: List[Dict[str, Any]], model: str) -> Tuple[Optional[str], Optional[float]]:
|
|
158
|
+
if not entries:
|
|
159
|
+
return None, None
|
|
160
|
+
sorted_entries = sorted(
|
|
161
|
+
entries,
|
|
162
|
+
key=lambda entry: entry.get("date") or "",
|
|
163
|
+
)
|
|
164
|
+
for entry in reversed(sorted_entries):
|
|
165
|
+
breakdowns = entry.get("modelBreakdowns")
|
|
166
|
+
if not isinstance(breakdowns, list):
|
|
167
|
+
continue
|
|
168
|
+
for item in breakdowns:
|
|
169
|
+
if not isinstance(item, dict):
|
|
170
|
+
continue
|
|
171
|
+
if item.get("modelName") == model:
|
|
172
|
+
cost = item.get("cost") if isinstance(item.get("cost"), (int, float)) else None
|
|
173
|
+
day = entry.get("date") if isinstance(entry.get("date"), str) else None
|
|
174
|
+
return day, float(cost) if cost is not None else None
|
|
175
|
+
return None, None
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def render_text_current(
|
|
179
|
+
provider: str,
|
|
180
|
+
model: str,
|
|
181
|
+
latest_date: Optional[str],
|
|
182
|
+
total_cost: Optional[float],
|
|
183
|
+
latest_cost: Optional[float],
|
|
184
|
+
latest_cost_date: Optional[str],
|
|
185
|
+
entry_count: int,
|
|
186
|
+
) -> str:
|
|
187
|
+
lines = [f"Provider: {provider}", f"Current model: {model}"]
|
|
188
|
+
if latest_date:
|
|
189
|
+
lines.append(f"Latest model date: {latest_date}")
|
|
190
|
+
lines.append(f"Total cost (rows): {usd(total_cost)}")
|
|
191
|
+
if latest_cost_date:
|
|
192
|
+
lines.append(f"Latest day cost: {usd(latest_cost)} ({latest_cost_date})")
|
|
193
|
+
lines.append(f"Daily rows: {entry_count}")
|
|
194
|
+
return "\n".join(lines)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def render_text_all(provider: str, totals: Dict[str, float]) -> str:
|
|
198
|
+
lines = [f"Provider: {provider}", "Models:"]
|
|
199
|
+
for model, cost in sorted(totals.items(), key=lambda item: item[1], reverse=True):
|
|
200
|
+
lines.append(f"- {model}: {usd(cost)}")
|
|
201
|
+
return "\n".join(lines)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def build_json_current(
|
|
205
|
+
provider: str,
|
|
206
|
+
model: str,
|
|
207
|
+
latest_date: Optional[str],
|
|
208
|
+
total_cost: Optional[float],
|
|
209
|
+
latest_cost: Optional[float],
|
|
210
|
+
latest_cost_date: Optional[str],
|
|
211
|
+
entry_count: int,
|
|
212
|
+
) -> Dict[str, Any]:
|
|
213
|
+
return {
|
|
214
|
+
"provider": provider,
|
|
215
|
+
"mode": "current",
|
|
216
|
+
"model": model,
|
|
217
|
+
"latestModelDate": latest_date,
|
|
218
|
+
"totalCostUSD": total_cost,
|
|
219
|
+
"latestDayCostUSD": latest_cost,
|
|
220
|
+
"latestDayCostDate": latest_cost_date,
|
|
221
|
+
"dailyRowCount": entry_count,
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def build_json_all(provider: str, totals: Dict[str, float]) -> Dict[str, Any]:
|
|
226
|
+
return {
|
|
227
|
+
"provider": provider,
|
|
228
|
+
"mode": "all",
|
|
229
|
+
"models": [
|
|
230
|
+
{"model": model, "totalCostUSD": cost}
|
|
231
|
+
for model, cost in sorted(totals.items(), key=lambda item: item[1], reverse=True)
|
|
232
|
+
],
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def main() -> int:
|
|
237
|
+
parser = argparse.ArgumentParser(description="Summarize CodexBar model usage from local cost logs.")
|
|
238
|
+
parser.add_argument("--provider", choices=["codex", "claude"], default="codex")
|
|
239
|
+
parser.add_argument("--mode", choices=["current", "all"], default="current")
|
|
240
|
+
parser.add_argument("--model", help="Explicit model name to report instead of auto-current.")
|
|
241
|
+
parser.add_argument("--input", help="Path to codexbar cost JSON (or '-' for stdin).")
|
|
242
|
+
parser.add_argument("--days", type=int, help="Limit to last N days (based on daily rows).")
|
|
243
|
+
parser.add_argument("--format", choices=["text", "json"], default="text")
|
|
244
|
+
parser.add_argument("--pretty", action="store_true", help="Pretty-print JSON output.")
|
|
245
|
+
|
|
246
|
+
args = parser.parse_args()
|
|
247
|
+
|
|
248
|
+
try:
|
|
249
|
+
payload = load_payload(args.input, args.provider)
|
|
250
|
+
except Exception as exc:
|
|
251
|
+
eprint(str(exc))
|
|
252
|
+
return 1
|
|
253
|
+
|
|
254
|
+
entries = parse_daily_entries(payload)
|
|
255
|
+
entries = filter_by_days(entries, args.days)
|
|
256
|
+
|
|
257
|
+
if args.mode == "current":
|
|
258
|
+
model = args.model
|
|
259
|
+
latest_date = None
|
|
260
|
+
if not model:
|
|
261
|
+
model, latest_date = pick_current_model(entries)
|
|
262
|
+
if not model:
|
|
263
|
+
eprint("No model data found in codexbar cost payload.")
|
|
264
|
+
return 2
|
|
265
|
+
totals = aggregate_costs(entries)
|
|
266
|
+
total_cost = totals.get(model)
|
|
267
|
+
latest_cost_date, latest_cost = latest_day_cost(entries, model)
|
|
268
|
+
|
|
269
|
+
if args.format == "json":
|
|
270
|
+
payload_out = build_json_current(
|
|
271
|
+
provider=args.provider,
|
|
272
|
+
model=model,
|
|
273
|
+
latest_date=latest_date,
|
|
274
|
+
total_cost=total_cost,
|
|
275
|
+
latest_cost=latest_cost,
|
|
276
|
+
latest_cost_date=latest_cost_date,
|
|
277
|
+
entry_count=len(entries),
|
|
278
|
+
)
|
|
279
|
+
indent = 2 if args.pretty else None
|
|
280
|
+
print(json.dumps(payload_out, indent=indent, sort_keys=args.pretty))
|
|
281
|
+
else:
|
|
282
|
+
print(
|
|
283
|
+
render_text_current(
|
|
284
|
+
provider=args.provider,
|
|
285
|
+
model=model,
|
|
286
|
+
latest_date=latest_date,
|
|
287
|
+
total_cost=total_cost,
|
|
288
|
+
latest_cost=latest_cost,
|
|
289
|
+
latest_cost_date=latest_cost_date,
|
|
290
|
+
entry_count=len(entries),
|
|
291
|
+
)
|
|
292
|
+
)
|
|
293
|
+
return 0
|
|
294
|
+
|
|
295
|
+
totals = aggregate_costs(entries)
|
|
296
|
+
if not totals:
|
|
297
|
+
eprint("No model breakdowns found in codexbar cost payload.")
|
|
298
|
+
return 2
|
|
299
|
+
|
|
300
|
+
if args.format == "json":
|
|
301
|
+
payload_out = build_json_all(provider=args.provider, totals=totals)
|
|
302
|
+
indent = 2 if args.pretty else None
|
|
303
|
+
print(json.dumps(payload_out, indent=indent, sort_keys=args.pretty))
|
|
304
|
+
else:
|
|
305
|
+
print(render_text_all(provider=args.provider, totals=totals))
|
|
306
|
+
return 0
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
if __name__ == "__main__":
|
|
310
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nano-banana-pro
|
|
3
|
+
description: Generate or edit images via Gemini 3 Pro Image (Nano Banana Pro).
|
|
4
|
+
homepage: https://ai.google.dev/
|
|
5
|
+
metadata: {"nexus":{"emoji":"🍌","requires":{"bins":["uv"],"env":["GEMINI_API_KEY"]},"primaryEnv":"GEMINI_API_KEY","install":[{"id":"uv-brew","kind":"brew","formula":"uv","bins":["uv"],"label":"Install uv (brew)"}]}}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Nano Banana Pro (Gemini 3 Pro Image)
|
|
9
|
+
|
|
10
|
+
Use the bundled script to generate or edit images.
|
|
11
|
+
|
|
12
|
+
Generate
|
|
13
|
+
```bash
|
|
14
|
+
uv run {baseDir}/scripts/generate_image.py --prompt "your image description" --filename "output.png" --resolution 1K
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Edit
|
|
18
|
+
```bash
|
|
19
|
+
uv run {baseDir}/scripts/generate_image.py --prompt "edit instructions" --filename "output.png" --input-image "/path/in.png" --resolution 2K
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
API key
|
|
23
|
+
- `GEMINI_API_KEY` env var
|
|
24
|
+
- Or set `skills."nano-banana-pro".apiKey` / `skills."nano-banana-pro".env.GEMINI_API_KEY` in `~/nexus/state/nexus.json`
|
|
25
|
+
|
|
26
|
+
Notes
|
|
27
|
+
- Resolutions: `1K` (default), `2K`, `4K`.
|
|
28
|
+
- Use timestamps in filenames: `yyyy-mm-dd-hh-mm-ss-name.png`.
|
|
29
|
+
- The script prints a `MEDIA:` line for Nexus to auto-attach on supported chat providers.
|
|
30
|
+
- Do not read the image back; report the saved path only.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# /// script
|
|
3
|
+
# requires-python = ">=3.10"
|
|
4
|
+
# dependencies = [
|
|
5
|
+
# "google-genai>=1.0.0",
|
|
6
|
+
# "pillow>=10.0.0",
|
|
7
|
+
# ]
|
|
8
|
+
# ///
|
|
9
|
+
"""
|
|
10
|
+
Generate images using Google's Nano Banana Pro (Gemini 3 Pro Image) API.
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
uv run generate_image.py --prompt "your image description" --filename "output.png" [--resolution 1K|2K|4K] [--api-key KEY]
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import argparse
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_api_key(provided_key: str | None) -> str | None:
|
|
23
|
+
"""Get API key from argument first, then environment."""
|
|
24
|
+
if provided_key:
|
|
25
|
+
return provided_key
|
|
26
|
+
return os.environ.get("GEMINI_API_KEY")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def main():
|
|
30
|
+
parser = argparse.ArgumentParser(
|
|
31
|
+
description="Generate images using Nano Banana Pro (Gemini 3 Pro Image)"
|
|
32
|
+
)
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
"--prompt", "-p",
|
|
35
|
+
required=True,
|
|
36
|
+
help="Image description/prompt"
|
|
37
|
+
)
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
"--filename", "-f",
|
|
40
|
+
required=True,
|
|
41
|
+
help="Output filename (e.g., sunset-mountains.png)"
|
|
42
|
+
)
|
|
43
|
+
parser.add_argument(
|
|
44
|
+
"--input-image", "-i",
|
|
45
|
+
help="Optional input image path for editing/modification"
|
|
46
|
+
)
|
|
47
|
+
parser.add_argument(
|
|
48
|
+
"--resolution", "-r",
|
|
49
|
+
choices=["1K", "2K", "4K"],
|
|
50
|
+
default="1K",
|
|
51
|
+
help="Output resolution: 1K (default), 2K, or 4K"
|
|
52
|
+
)
|
|
53
|
+
parser.add_argument(
|
|
54
|
+
"--api-key", "-k",
|
|
55
|
+
help="Gemini API key (overrides GEMINI_API_KEY env var)"
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
args = parser.parse_args()
|
|
59
|
+
|
|
60
|
+
# Get API key
|
|
61
|
+
api_key = get_api_key(args.api_key)
|
|
62
|
+
if not api_key:
|
|
63
|
+
print("Error: No API key provided.", file=sys.stderr)
|
|
64
|
+
print("Please either:", file=sys.stderr)
|
|
65
|
+
print(" 1. Provide --api-key argument", file=sys.stderr)
|
|
66
|
+
print(" 2. Set GEMINI_API_KEY environment variable", file=sys.stderr)
|
|
67
|
+
sys.exit(1)
|
|
68
|
+
|
|
69
|
+
# Import here after checking API key to avoid slow import on error
|
|
70
|
+
from google import genai
|
|
71
|
+
from google.genai import types
|
|
72
|
+
from PIL import Image as PILImage
|
|
73
|
+
|
|
74
|
+
# Initialise client
|
|
75
|
+
client = genai.Client(api_key=api_key)
|
|
76
|
+
|
|
77
|
+
# Set up output path
|
|
78
|
+
output_path = Path(args.filename)
|
|
79
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
80
|
+
|
|
81
|
+
# Load input image if provided
|
|
82
|
+
input_image = None
|
|
83
|
+
output_resolution = args.resolution
|
|
84
|
+
if args.input_image:
|
|
85
|
+
try:
|
|
86
|
+
input_image = PILImage.open(args.input_image)
|
|
87
|
+
print(f"Loaded input image: {args.input_image}")
|
|
88
|
+
|
|
89
|
+
# Auto-detect resolution if not explicitly set by user
|
|
90
|
+
if args.resolution == "1K": # Default value
|
|
91
|
+
# Map input image size to resolution
|
|
92
|
+
width, height = input_image.size
|
|
93
|
+
max_dim = max(width, height)
|
|
94
|
+
if max_dim >= 3000:
|
|
95
|
+
output_resolution = "4K"
|
|
96
|
+
elif max_dim >= 1500:
|
|
97
|
+
output_resolution = "2K"
|
|
98
|
+
else:
|
|
99
|
+
output_resolution = "1K"
|
|
100
|
+
print(f"Auto-detected resolution: {output_resolution} (from input {width}x{height})")
|
|
101
|
+
except Exception as e:
|
|
102
|
+
print(f"Error loading input image: {e}", file=sys.stderr)
|
|
103
|
+
sys.exit(1)
|
|
104
|
+
|
|
105
|
+
# Build contents (image first if editing, prompt only if generating)
|
|
106
|
+
if input_image:
|
|
107
|
+
contents = [input_image, args.prompt]
|
|
108
|
+
print(f"Editing image with resolution {output_resolution}...")
|
|
109
|
+
else:
|
|
110
|
+
contents = args.prompt
|
|
111
|
+
print(f"Generating image with resolution {output_resolution}...")
|
|
112
|
+
|
|
113
|
+
try:
|
|
114
|
+
response = client.models.generate_content(
|
|
115
|
+
model="gemini-3-pro-image-preview",
|
|
116
|
+
contents=contents,
|
|
117
|
+
config=types.GenerateContentConfig(
|
|
118
|
+
response_modalities=["TEXT", "IMAGE"],
|
|
119
|
+
image_config=types.ImageConfig(
|
|
120
|
+
image_size=output_resolution
|
|
121
|
+
)
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Process response and convert to PNG
|
|
126
|
+
image_saved = False
|
|
127
|
+
for part in response.parts:
|
|
128
|
+
if part.text is not None:
|
|
129
|
+
print(f"Model response: {part.text}")
|
|
130
|
+
elif part.inline_data is not None:
|
|
131
|
+
# Convert inline data to PIL Image and save as PNG
|
|
132
|
+
from io import BytesIO
|
|
133
|
+
|
|
134
|
+
# inline_data.data is already bytes, not base64
|
|
135
|
+
image_data = part.inline_data.data
|
|
136
|
+
if isinstance(image_data, str):
|
|
137
|
+
# If it's a string, it might be base64
|
|
138
|
+
import base64
|
|
139
|
+
image_data = base64.b64decode(image_data)
|
|
140
|
+
|
|
141
|
+
image = PILImage.open(BytesIO(image_data))
|
|
142
|
+
|
|
143
|
+
# Ensure RGB mode for PNG (convert RGBA to RGB with white background if needed)
|
|
144
|
+
if image.mode == 'RGBA':
|
|
145
|
+
rgb_image = PILImage.new('RGB', image.size, (255, 255, 255))
|
|
146
|
+
rgb_image.paste(image, mask=image.split()[3])
|
|
147
|
+
rgb_image.save(str(output_path), 'PNG')
|
|
148
|
+
elif image.mode == 'RGB':
|
|
149
|
+
image.save(str(output_path), 'PNG')
|
|
150
|
+
else:
|
|
151
|
+
image.convert('RGB').save(str(output_path), 'PNG')
|
|
152
|
+
image_saved = True
|
|
153
|
+
|
|
154
|
+
if image_saved:
|
|
155
|
+
full_path = output_path.resolve()
|
|
156
|
+
print(f"\nImage saved: {full_path}")
|
|
157
|
+
# Nexus parses MEDIA tokens and will attach the file on supported providers.
|
|
158
|
+
print(f"MEDIA: {full_path}")
|
|
159
|
+
else:
|
|
160
|
+
print("Error: No image was generated in the response.", file=sys.stderr)
|
|
161
|
+
sys.exit(1)
|
|
162
|
+
|
|
163
|
+
except Exception as e:
|
|
164
|
+
print(f"Error generating image: {e}", file=sys.stderr)
|
|
165
|
+
sys.exit(1)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
if __name__ == "__main__":
|
|
169
|
+
main()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nano-pdf
|
|
3
|
+
description: Edit PDFs with natural-language instructions using the nano-pdf CLI.
|
|
4
|
+
homepage: https://pypi.org/project/nano-pdf/
|
|
5
|
+
metadata: {"nexus":{"emoji":"📄","requires":{"bins":["nano-pdf"]},"install":[{"id":"uv","kind":"uv","package":"nano-pdf","bins":["nano-pdf"],"label":"Install nano-pdf (uv)"}]}}
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# nano-pdf
|
|
9
|
+
|
|
10
|
+
Use `nano-pdf` to apply edits to a specific page in a PDF using a natural-language instruction.
|
|
11
|
+
|
|
12
|
+
## Quick start
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
nano-pdf edit deck.pdf 1 "Change the title to 'Q3 Results' and fix the typo in the subtitle"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Notes:
|
|
19
|
+
- Page numbers are 0-based or 1-based depending on the tool’s version/config; if the result looks off by one, retry with the other.
|
|
20
|
+
- Always sanity-check the output PDF before sending it out.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nexus-cloud
|
|
3
|
+
description: "Install and operate the Nexus Cloud CLI for encrypted workspace sync: build the Rust CLI, init/login, enable the background daemon, sync the personal workspace, mount shared workspaces, and explain how shared workspaces are created and shared."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Nexus Cloud CLI
|
|
7
|
+
|
|
8
|
+
Keep the security model straight: keys stay local, the server never sees plaintext.
|
|
9
|
+
|
|
10
|
+
## Docs
|
|
11
|
+
|
|
12
|
+
- `docs/setup.md`
|
|
13
|
+
- `docs/security.md`
|
|
14
|
+
- `docs/troubleshooting.md`
|
|
15
|
+
|
|
16
|
+
## Install and setup (personal workspace)
|
|
17
|
+
|
|
18
|
+
1. Go to the repo: `~/nexus/home/projects/nexus-cloud`
|
|
19
|
+
2. Build the CLI: `./scripts/build-rust-cli.sh`
|
|
20
|
+
3. Point to the binary:
|
|
21
|
+
- `CLI=./rust/target/release/cli`
|
|
22
|
+
4. Initialize the workspace:
|
|
23
|
+
- `$CLI init --workspace ~/nexus/home`
|
|
24
|
+
5. Login (browser auth + local key provisioning):
|
|
25
|
+
- `$CLI login`
|
|
26
|
+
6. Enable always-on sync:
|
|
27
|
+
- macOS: `$CLI daemon install`
|
|
28
|
+
- other OS: run `$CLI daemon` in a long-lived shell
|
|
29
|
+
|
|
30
|
+
## Explain the lifecycle to humans
|
|
31
|
+
|
|
32
|
+
- "My Workspace" == personal workspace; always-on once the daemon is installed.
|
|
33
|
+
- "Shared Workspaces" == shared workspaces; each is mounted to a local folder.
|
|
34
|
+
- Use `$CLI guide` to show the lifecycle summary.
|
|
35
|
+
|
|
36
|
+
## Shared workspaces (current CLI flow)
|
|
37
|
+
|
|
38
|
+
- List spaces: `$CLI collab spaces list`
|
|
39
|
+
- Mount: `$CLI spaces mount <space_id> --path <path>`
|
|
40
|
+
- Sync: `$CLI spaces push <space_id>` / `$CLI spaces pull <space_id>`
|
|
41
|
+
|
|
42
|
+
## Create a shared workspace (current model)
|
|
43
|
+
|
|
44
|
+
- Ensure members are accepted connections (managed on the website today).
|
|
45
|
+
- Create: `$CLI collab spaces create --name "Project" --members "alice@example.com,bob@example.com"`
|
|
46
|
+
- Mount after creation: `$CLI spaces mount <space_id>`
|
|
47
|
+
|
|
48
|
+
## Share link invites (allowlist model)
|
|
49
|
+
|
|
50
|
+
- Create a link restricted to specific emails:
|
|
51
|
+
- `$CLI collab spaces invite-links create <space_id> --emails "alice@example.com,bob@example.com"`
|
|
52
|
+
- Share the URL printed by the CLI.
|
|
53
|
+
- Invitees accept in the browser and then run `$CLI login` to fetch space keys.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Nexus Cloud Security
|
|
2
|
+
|
|
3
|
+
## Zero-knowledge model
|
|
4
|
+
|
|
5
|
+
All encryption happens locally. The server only stores encrypted blobs.
|
|
6
|
+
|
|
7
|
+
## Master password
|
|
8
|
+
|
|
9
|
+
- Required to decrypt data.
|
|
10
|
+
- Store in 1Password immediately.
|
|
11
|
+
- If lost, data is unrecoverable.
|
|
12
|
+
|
|
13
|
+
## .nexusignore
|
|
14
|
+
|
|
15
|
+
Exclude sensitive paths:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
sessions/
|
|
19
|
+
.env
|
|
20
|
+
*credentials*
|
|
21
|
+
*secret*
|
|
22
|
+
*.key
|
|
23
|
+
*.pem
|
|
24
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Nexus Cloud Setup
|
|
2
|
+
|
|
3
|
+
This is the encrypted workspace sync CLI.
|
|
4
|
+
|
|
5
|
+
## Install wrangler
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g wrangler
|
|
9
|
+
wrangler --version
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Authenticate with Cloudflare
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
wrangler login
|
|
16
|
+
wrangler whoami
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Create R2 bucket
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
wrangler r2 bucket create nexus-blobs
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Deploy the worker
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cd ~/nexus/home/projects/nexus-cloud
|
|
29
|
+
wrangler deploy
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Initialize locally
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
nexus-cloud init
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Provide:
|
|
39
|
+
- Worker URL
|
|
40
|
+
- Master password (store in 1Password)
|
|
41
|
+
|
|
42
|
+
## First sync
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
nexus-cloud push -m "Initial sync"
|
|
46
|
+
nexus-cloud status
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Notes
|
|
50
|
+
|
|
51
|
+
- Create a `.nexusignore` to exclude sensitive files.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Nexus Cloud Troubleshooting
|
|
2
|
+
|
|
3
|
+
## Not authenticated with Cloudflare
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
wrangler login
|
|
7
|
+
wrangler whoami
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## R2 bucket not found
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
wrangler r2 bucket create nexus-blobs
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Master password lost
|
|
17
|
+
|
|
18
|
+
Data cannot be recovered without the original master password.
|
|
19
|
+
Initialize again and create a new workspace.
|
|
20
|
+
|
|
21
|
+
## Worker timeout on large sync
|
|
22
|
+
|
|
23
|
+
Split pushes:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
nexus-cloud push --path skills/ -m "Sync skills"
|
|
27
|
+
nexus-cloud push --path projects/ -m "Sync projects"
|
|
28
|
+
```
|