@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,611 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import JSON5 from "json5";
|
|
6
|
+
import { buildAgentMainSessionKey, DEFAULT_AGENT_ID, DEFAULT_MAIN_KEY, normalizeAgentId, parseAgentSessionKey, } from "../routing/session-key.js";
|
|
7
|
+
import { normalizeE164 } from "../utils.js";
|
|
8
|
+
import { resolveStateDir } from "./paths.js";
|
|
9
|
+
const GROUP_SURFACES = new Set([
|
|
10
|
+
"whatsapp",
|
|
11
|
+
"telegram",
|
|
12
|
+
"discord",
|
|
13
|
+
"signal",
|
|
14
|
+
"imessage",
|
|
15
|
+
"webchat",
|
|
16
|
+
"slack",
|
|
17
|
+
]);
|
|
18
|
+
function resolveAgentSessionsDir(agentId, env = process.env, homedir = os.homedir) {
|
|
19
|
+
const root = resolveStateDir(env, homedir);
|
|
20
|
+
const id = normalizeAgentId(agentId ?? DEFAULT_AGENT_ID);
|
|
21
|
+
return path.join(root, "agents", id, "sessions");
|
|
22
|
+
}
|
|
23
|
+
export function resolveSessionTranscriptsDir(env = process.env, homedir = os.homedir) {
|
|
24
|
+
return resolveAgentSessionsDir(DEFAULT_AGENT_ID, env, homedir);
|
|
25
|
+
}
|
|
26
|
+
export function resolveDefaultSessionStorePath(agentId) {
|
|
27
|
+
return path.join(resolveAgentSessionsDir(agentId), "sessions.json");
|
|
28
|
+
}
|
|
29
|
+
export const DEFAULT_RESET_TRIGGER = "/new";
|
|
30
|
+
export const DEFAULT_RESET_TRIGGERS = ["/new", "/reset"];
|
|
31
|
+
export const DEFAULT_IDLE_MINUTES = 60;
|
|
32
|
+
export function resolveSessionTranscriptPath(sessionId, agentId) {
|
|
33
|
+
return path.join(resolveAgentSessionsDir(agentId), `${sessionId}.jsonl`);
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// New Session Storage Format (agent-grouped, per-session directories)
|
|
37
|
+
// ============================================================================
|
|
38
|
+
/**
|
|
39
|
+
* Resolve the directory path for a specific session.
|
|
40
|
+
* New format: ~/nexus/state/agents/{agentId}/sessions/{sessionId}/
|
|
41
|
+
*/
|
|
42
|
+
export function resolveSessionDir(agentId, sessionId, env = process.env, homedir = os.homedir) {
|
|
43
|
+
const sessionsDir = resolveAgentSessionsDir(agentId, env, homedir);
|
|
44
|
+
return path.join(sessionsDir, sessionId);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create session directory structure.
|
|
48
|
+
* Creates: ~/nexus/state/agents/{agentId}/sessions/{sessionId}/
|
|
49
|
+
*/
|
|
50
|
+
export async function createSessionDir(agentId, sessionId) {
|
|
51
|
+
const sessionDir = resolveSessionDir(agentId, sessionId);
|
|
52
|
+
await fs.promises.mkdir(sessionDir, { recursive: true });
|
|
53
|
+
return sessionDir;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Write session metadata to session.json.
|
|
57
|
+
* Includes: sessionId, agentId, created, updated, surface, parentSession, chatType, model, etc.
|
|
58
|
+
*/
|
|
59
|
+
export async function writeSessionMetadata(agentId, sessionId, metadata) {
|
|
60
|
+
const sessionDir = await createSessionDir(agentId, sessionId);
|
|
61
|
+
const metadataPath = path.join(sessionDir, "session.json");
|
|
62
|
+
const existing = await loadSessionMetadata(agentId, sessionId).catch(() => null);
|
|
63
|
+
const sessionData = {
|
|
64
|
+
sessionId,
|
|
65
|
+
agentId,
|
|
66
|
+
created: existing?.created ?? metadata.created ?? new Date().toISOString(),
|
|
67
|
+
updated: new Date().toISOString(),
|
|
68
|
+
surface: metadata.surface ?? existing?.surface,
|
|
69
|
+
chatType: metadata.chatType ?? existing?.chatType,
|
|
70
|
+
parentSession: metadata.parentSession ?? existing?.parentSession ?? null,
|
|
71
|
+
agentType: metadata.agentType ?? existing?.agentType,
|
|
72
|
+
model: metadata.modelOverride ?? existing?.model,
|
|
73
|
+
compactionCount: metadata.compactionCount ?? existing?.compactionCount ?? 0,
|
|
74
|
+
displayName: metadata.displayName ?? existing?.displayName,
|
|
75
|
+
// Copy all other metadata fields
|
|
76
|
+
...metadata,
|
|
77
|
+
};
|
|
78
|
+
const json = JSON.stringify(sessionData, null, 2);
|
|
79
|
+
await fs.promises.writeFile(metadataPath, json, "utf-8");
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Load session metadata from session.json.
|
|
83
|
+
* Returns null if session doesn't exist.
|
|
84
|
+
*/
|
|
85
|
+
export async function loadSessionMetadata(agentId, sessionId) {
|
|
86
|
+
const sessionDir = resolveSessionDir(agentId, sessionId);
|
|
87
|
+
const metadataPath = path.join(sessionDir, "session.json");
|
|
88
|
+
try {
|
|
89
|
+
const raw = await fs.promises.readFile(metadataPath, "utf-8");
|
|
90
|
+
return JSON.parse(raw);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const code = err && typeof err === "object" && "code" in err
|
|
94
|
+
? String(err.code)
|
|
95
|
+
: null;
|
|
96
|
+
if (code === "ENOENT")
|
|
97
|
+
return null;
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Append a turn to history.jsonl.
|
|
103
|
+
*/
|
|
104
|
+
export async function appendToHistory(agentId, sessionId, turn) {
|
|
105
|
+
const sessionDir = await createSessionDir(agentId, sessionId);
|
|
106
|
+
const historyPath = path.join(sessionDir, "history.jsonl");
|
|
107
|
+
const line = JSON.stringify(turn) + "\n";
|
|
108
|
+
await fs.promises.appendFile(historyPath, line, "utf-8");
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Load history from history.jsonl.
|
|
112
|
+
* Returns empty array if no history exists.
|
|
113
|
+
*/
|
|
114
|
+
export async function loadHistory(agentId, sessionId) {
|
|
115
|
+
const sessionDir = resolveSessionDir(agentId, sessionId);
|
|
116
|
+
const historyPath = path.join(sessionDir, "history.jsonl");
|
|
117
|
+
try {
|
|
118
|
+
const raw = await fs.promises.readFile(historyPath, "utf-8");
|
|
119
|
+
const lines = raw.trim().split("\n").filter(Boolean);
|
|
120
|
+
return lines.map((line) => JSON.parse(line));
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
const code = err && typeof err === "object" && "code" in err
|
|
124
|
+
? String(err.code)
|
|
125
|
+
: null;
|
|
126
|
+
if (code === "ENOENT")
|
|
127
|
+
return [];
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Archive old history to archives/{n}.jsonl and optionally keep recent messages in history.jsonl.
|
|
133
|
+
* Increments compaction count in session metadata.
|
|
134
|
+
*
|
|
135
|
+
* @param agentId - Agent ID
|
|
136
|
+
* @param sessionId - Session ID
|
|
137
|
+
* @param keepMessages - Optional array of recent messages to keep in history.jsonl
|
|
138
|
+
*/
|
|
139
|
+
export async function archiveHistory(agentId, sessionId, keepMessages) {
|
|
140
|
+
const sessionDir = resolveSessionDir(agentId, sessionId);
|
|
141
|
+
const historyPath = path.join(sessionDir, "history.jsonl");
|
|
142
|
+
const archivesDir = path.join(sessionDir, "archives");
|
|
143
|
+
// Get current compaction count
|
|
144
|
+
const metadata = await loadSessionMetadata(agentId, sessionId);
|
|
145
|
+
const nextNum = (metadata?.compactionCount ?? 0) + 1;
|
|
146
|
+
// Create archives directory
|
|
147
|
+
await fs.promises.mkdir(archivesDir, { recursive: true });
|
|
148
|
+
// Load current history to archive
|
|
149
|
+
const currentHistory = await loadHistory(agentId, sessionId);
|
|
150
|
+
// Calculate which messages to archive (exclude keepMessages from the end)
|
|
151
|
+
const numToKeep = keepMessages?.length ?? 0;
|
|
152
|
+
const toArchive = numToKeep > 0
|
|
153
|
+
? currentHistory.slice(0, currentHistory.length - numToKeep)
|
|
154
|
+
: currentHistory;
|
|
155
|
+
// Write archived messages to archive file
|
|
156
|
+
const archivePath = path.join(archivesDir, `${String(nextNum).padStart(3, "0")}.jsonl`);
|
|
157
|
+
if (toArchive.length > 0) {
|
|
158
|
+
const archiveContent = toArchive
|
|
159
|
+
.map((turn) => JSON.stringify(turn))
|
|
160
|
+
.join("\n");
|
|
161
|
+
await fs.promises.writeFile(archivePath, archiveContent + "\n", "utf-8");
|
|
162
|
+
}
|
|
163
|
+
// Rewrite history.jsonl with only the kept messages
|
|
164
|
+
if (keepMessages && keepMessages.length > 0) {
|
|
165
|
+
const newHistoryContent = keepMessages
|
|
166
|
+
.map((turn) => JSON.stringify(turn))
|
|
167
|
+
.join("\n");
|
|
168
|
+
await fs.promises.writeFile(historyPath, newHistoryContent + "\n", "utf-8");
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// No messages to keep, delete or truncate history.jsonl
|
|
172
|
+
try {
|
|
173
|
+
await fs.promises.unlink(historyPath);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
const code = err && typeof err === "object" && "code" in err
|
|
177
|
+
? String(err.code)
|
|
178
|
+
: null;
|
|
179
|
+
if (code !== "ENOENT") {
|
|
180
|
+
throw err;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Update compaction count in metadata
|
|
185
|
+
await writeSessionMetadata(agentId, sessionId, {
|
|
186
|
+
compactionCount: nextNum,
|
|
187
|
+
});
|
|
188
|
+
return nextNum;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Write or update summary.md.
|
|
192
|
+
*/
|
|
193
|
+
export async function writeSummary(agentId, sessionId, summary) {
|
|
194
|
+
const sessionDir = await createSessionDir(agentId, sessionId);
|
|
195
|
+
const summaryPath = path.join(sessionDir, "summary.md");
|
|
196
|
+
await fs.promises.writeFile(summaryPath, summary, "utf-8");
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Load summary.md.
|
|
200
|
+
* Returns null if no summary exists.
|
|
201
|
+
*/
|
|
202
|
+
export async function loadSummary(agentId, sessionId) {
|
|
203
|
+
const sessionDir = resolveSessionDir(agentId, sessionId);
|
|
204
|
+
const summaryPath = path.join(sessionDir, "summary.md");
|
|
205
|
+
try {
|
|
206
|
+
return await fs.promises.readFile(summaryPath, "utf-8");
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
const code = err && typeof err === "object" && "code" in err
|
|
210
|
+
? String(err.code)
|
|
211
|
+
: null;
|
|
212
|
+
if (code === "ENOENT")
|
|
213
|
+
return null;
|
|
214
|
+
throw err;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Load complete session (metadata + history).
|
|
219
|
+
* Returns null if session doesn't exist.
|
|
220
|
+
*/
|
|
221
|
+
export async function loadSession(agentId, sessionId) {
|
|
222
|
+
const metadata = await loadSessionMetadata(agentId, sessionId);
|
|
223
|
+
if (!metadata)
|
|
224
|
+
return null;
|
|
225
|
+
const history = await loadHistory(agentId, sessionId);
|
|
226
|
+
const summary = await loadSummary(agentId, sessionId);
|
|
227
|
+
return { metadata, history, summary };
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* List all session IDs for an agent.
|
|
231
|
+
* Returns empty array if no sessions exist.
|
|
232
|
+
*/
|
|
233
|
+
export async function listAgentSessions(agentId) {
|
|
234
|
+
const sessionsDir = resolveAgentSessionsDir(agentId);
|
|
235
|
+
try {
|
|
236
|
+
const entries = await fs.promises.readdir(sessionsDir, { withFileTypes: true });
|
|
237
|
+
return entries
|
|
238
|
+
.filter((entry) => entry.isDirectory())
|
|
239
|
+
.map((entry) => entry.name)
|
|
240
|
+
.sort();
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
const code = err && typeof err === "object" && "code" in err
|
|
244
|
+
? String(err.code)
|
|
245
|
+
: null;
|
|
246
|
+
if (code === "ENOENT")
|
|
247
|
+
return [];
|
|
248
|
+
throw err;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Check if old format exists (sessions.json + {sessionId}.jsonl).
|
|
253
|
+
* Used for migration detection.
|
|
254
|
+
*/
|
|
255
|
+
export async function hasOldFormatSessions(agentId) {
|
|
256
|
+
const storePath = resolveDefaultSessionStorePath(agentId);
|
|
257
|
+
try {
|
|
258
|
+
await fs.promises.access(storePath);
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Migrate a single session from old format to new format.
|
|
267
|
+
* Old: sessions.json entry + {sessionId}.jsonl
|
|
268
|
+
* New: {sessionId}/session.json + {sessionId}/history.jsonl
|
|
269
|
+
*/
|
|
270
|
+
export async function migrateSessionToNewFormat(agentId, sessionKey, sessionEntry) {
|
|
271
|
+
const { sessionId } = sessionEntry;
|
|
272
|
+
// Create session directory and write metadata
|
|
273
|
+
await writeSessionMetadata(agentId, sessionId, {
|
|
274
|
+
...sessionEntry,
|
|
275
|
+
created: new Date(sessionEntry.updatedAt).toISOString(),
|
|
276
|
+
});
|
|
277
|
+
// Migrate transcript if it exists
|
|
278
|
+
const oldTranscriptPath = resolveSessionTranscriptPath(sessionId, agentId);
|
|
279
|
+
try {
|
|
280
|
+
const transcriptContent = await fs.promises.readFile(oldTranscriptPath, "utf-8");
|
|
281
|
+
const lines = transcriptContent.trim().split("\n").filter(Boolean);
|
|
282
|
+
// Parse old transcript format and convert to new history format
|
|
283
|
+
for (const line of lines) {
|
|
284
|
+
try {
|
|
285
|
+
const parsed = JSON.parse(line);
|
|
286
|
+
// Old format might vary, so we do a best-effort conversion
|
|
287
|
+
const turn = {
|
|
288
|
+
turn_id: parsed.turn_id ?? crypto.randomUUID(),
|
|
289
|
+
role: parsed.role ?? "user",
|
|
290
|
+
content: parsed.content ?? JSON.stringify(parsed),
|
|
291
|
+
tool_calls: parsed.tool_calls,
|
|
292
|
+
tool_call_id: parsed.tool_call_id,
|
|
293
|
+
timestamp: parsed.timestamp ?? new Date().toISOString(),
|
|
294
|
+
};
|
|
295
|
+
await appendToHistory(agentId, sessionId, turn);
|
|
296
|
+
}
|
|
297
|
+
catch (parseErr) {
|
|
298
|
+
// Skip malformed lines
|
|
299
|
+
console.warn(`Failed to parse transcript line for session ${sessionId}:`, parseErr);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
const code = err && typeof err === "object" && "code" in err
|
|
305
|
+
? String(err.code)
|
|
306
|
+
: null;
|
|
307
|
+
if (code !== "ENOENT") {
|
|
308
|
+
throw err;
|
|
309
|
+
}
|
|
310
|
+
// No transcript to migrate, that's ok
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Migrate all sessions from old format to new format.
|
|
315
|
+
* Should be called once on first access if old format detected.
|
|
316
|
+
*/
|
|
317
|
+
export async function migrateAllSessionsToNewFormat(agentId) {
|
|
318
|
+
const hasOld = await hasOldFormatSessions(agentId);
|
|
319
|
+
if (!hasOld)
|
|
320
|
+
return;
|
|
321
|
+
const storePath = resolveDefaultSessionStorePath(agentId);
|
|
322
|
+
const store = loadSessionStore(storePath);
|
|
323
|
+
// Migrate each session
|
|
324
|
+
for (const [sessionKey, sessionEntry] of Object.entries(store)) {
|
|
325
|
+
await migrateSessionToNewFormat(agentId, sessionKey, sessionEntry);
|
|
326
|
+
}
|
|
327
|
+
// Optionally: rename old sessions.json to sessions.json.migrated
|
|
328
|
+
// to preserve it but mark as migrated
|
|
329
|
+
try {
|
|
330
|
+
await fs.promises.rename(storePath, `${storePath}.migrated`);
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
// Best effort, ignore errors
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
export function resolveStorePath(store, opts) {
|
|
337
|
+
const agentId = normalizeAgentId(opts?.agentId ?? DEFAULT_AGENT_ID);
|
|
338
|
+
if (!store)
|
|
339
|
+
return resolveDefaultSessionStorePath(agentId);
|
|
340
|
+
if (store.includes("{agentId}")) {
|
|
341
|
+
return path.resolve(store.replaceAll("{agentId}", agentId).replace("~", os.homedir()));
|
|
342
|
+
}
|
|
343
|
+
if (store.startsWith("~"))
|
|
344
|
+
return path.resolve(store.replace("~", os.homedir()));
|
|
345
|
+
return path.resolve(store);
|
|
346
|
+
}
|
|
347
|
+
export function resolveMainSessionKey(cfg) {
|
|
348
|
+
if (cfg?.session?.scope === "global")
|
|
349
|
+
return "global";
|
|
350
|
+
const agentId = normalizeAgentId(cfg?.routing?.defaultAgentId ?? DEFAULT_AGENT_ID);
|
|
351
|
+
const mainKey = (cfg?.session?.mainKey ?? DEFAULT_MAIN_KEY).trim() || DEFAULT_MAIN_KEY;
|
|
352
|
+
return buildAgentMainSessionKey({ agentId, mainKey });
|
|
353
|
+
}
|
|
354
|
+
export function resolveAgentIdFromSessionKey(sessionKey) {
|
|
355
|
+
const parsed = parseAgentSessionKey(sessionKey);
|
|
356
|
+
return normalizeAgentId(parsed?.agentId ?? DEFAULT_AGENT_ID);
|
|
357
|
+
}
|
|
358
|
+
export function resolveAgentMainSessionKey(params) {
|
|
359
|
+
const mainKey = (params.cfg?.session?.mainKey ?? DEFAULT_MAIN_KEY).trim() ||
|
|
360
|
+
DEFAULT_MAIN_KEY;
|
|
361
|
+
return buildAgentMainSessionKey({ agentId: params.agentId, mainKey });
|
|
362
|
+
}
|
|
363
|
+
function normalizeGroupLabel(raw) {
|
|
364
|
+
const trimmed = raw?.trim().toLowerCase() ?? "";
|
|
365
|
+
if (!trimmed)
|
|
366
|
+
return "";
|
|
367
|
+
const dashed = trimmed.replace(/\s+/g, "-");
|
|
368
|
+
const cleaned = dashed.replace(/[^a-z0-9#@._+-]+/g, "-");
|
|
369
|
+
return cleaned.replace(/-{2,}/g, "-").replace(/^[-.]+|[-.]+$/g, "");
|
|
370
|
+
}
|
|
371
|
+
function shortenGroupId(value) {
|
|
372
|
+
const trimmed = value?.trim() ?? "";
|
|
373
|
+
if (!trimmed)
|
|
374
|
+
return "";
|
|
375
|
+
if (trimmed.length <= 14)
|
|
376
|
+
return trimmed;
|
|
377
|
+
return `${trimmed.slice(0, 6)}...${trimmed.slice(-4)}`;
|
|
378
|
+
}
|
|
379
|
+
export function buildGroupDisplayName(params) {
|
|
380
|
+
const providerKey = (params.provider?.trim().toLowerCase() || "group").trim();
|
|
381
|
+
const room = params.room?.trim();
|
|
382
|
+
const space = params.space?.trim();
|
|
383
|
+
const subject = params.subject?.trim();
|
|
384
|
+
const detail = (room && space
|
|
385
|
+
? `${space}${room.startsWith("#") ? "" : "#"}${room}`
|
|
386
|
+
: room || subject || space || "") || "";
|
|
387
|
+
const fallbackId = params.id?.trim() || params.key.replace(/^group:/, "");
|
|
388
|
+
const rawLabel = detail || fallbackId;
|
|
389
|
+
let token = normalizeGroupLabel(rawLabel);
|
|
390
|
+
if (!token) {
|
|
391
|
+
token = normalizeGroupLabel(shortenGroupId(rawLabel));
|
|
392
|
+
}
|
|
393
|
+
if (!params.room && token.startsWith("#")) {
|
|
394
|
+
token = token.replace(/^#+/, "");
|
|
395
|
+
}
|
|
396
|
+
if (token &&
|
|
397
|
+
!/^[@#]/.test(token) &&
|
|
398
|
+
!token.startsWith("g-") &&
|
|
399
|
+
!token.includes("#")) {
|
|
400
|
+
token = `g-${token}`;
|
|
401
|
+
}
|
|
402
|
+
return token ? `${providerKey}:${token}` : providerKey;
|
|
403
|
+
}
|
|
404
|
+
export function resolveGroupSessionKey(ctx) {
|
|
405
|
+
const from = typeof ctx.From === "string" ? ctx.From.trim() : "";
|
|
406
|
+
if (!from)
|
|
407
|
+
return null;
|
|
408
|
+
const chatType = ctx.ChatType?.trim().toLowerCase();
|
|
409
|
+
const isGroup = chatType === "group" ||
|
|
410
|
+
from.startsWith("group:") ||
|
|
411
|
+
from.includes("@g.us") ||
|
|
412
|
+
from.includes(":group:") ||
|
|
413
|
+
from.includes(":channel:");
|
|
414
|
+
if (!isGroup)
|
|
415
|
+
return null;
|
|
416
|
+
const providerHint = ctx.Provider?.trim().toLowerCase();
|
|
417
|
+
const hasLegacyGroupPrefix = from.startsWith("group:");
|
|
418
|
+
const raw = (hasLegacyGroupPrefix ? from.slice("group:".length) : from).trim();
|
|
419
|
+
let provider;
|
|
420
|
+
let kind;
|
|
421
|
+
let id = "";
|
|
422
|
+
const parseKind = (value) => {
|
|
423
|
+
if (value === "channel")
|
|
424
|
+
return "channel";
|
|
425
|
+
return "group";
|
|
426
|
+
};
|
|
427
|
+
const parseParts = (parts) => {
|
|
428
|
+
if (parts.length >= 2 && GROUP_SURFACES.has(parts[0])) {
|
|
429
|
+
provider = parts[0];
|
|
430
|
+
if (parts.length >= 3) {
|
|
431
|
+
const kindCandidate = parts[1];
|
|
432
|
+
if (["group", "channel"].includes(kindCandidate)) {
|
|
433
|
+
kind = parseKind(kindCandidate);
|
|
434
|
+
id = parts.slice(2).join(":");
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
id = parts.slice(1).join(":");
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
id = parts[1];
|
|
442
|
+
}
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
if (parts.length >= 2 && ["group", "channel"].includes(parts[0])) {
|
|
446
|
+
kind = parseKind(parts[0]);
|
|
447
|
+
id = parts.slice(1).join(":");
|
|
448
|
+
}
|
|
449
|
+
};
|
|
450
|
+
if (hasLegacyGroupPrefix) {
|
|
451
|
+
const legacyParts = raw.split(":").filter(Boolean);
|
|
452
|
+
if (legacyParts.length > 1) {
|
|
453
|
+
parseParts(legacyParts);
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
id = raw;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
else if (from.includes("@g.us") && !from.includes(":")) {
|
|
460
|
+
id = from;
|
|
461
|
+
}
|
|
462
|
+
else {
|
|
463
|
+
parseParts(from.split(":").filter(Boolean));
|
|
464
|
+
if (!id) {
|
|
465
|
+
id = raw || from;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
const resolvedProvider = provider ?? providerHint;
|
|
469
|
+
if (!resolvedProvider) {
|
|
470
|
+
const legacy = hasLegacyGroupPrefix ? `group:${raw}` : `group:${from}`;
|
|
471
|
+
return {
|
|
472
|
+
key: legacy,
|
|
473
|
+
id: raw || from,
|
|
474
|
+
legacyKey: legacy,
|
|
475
|
+
chatType: "group",
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
const resolvedKind = kind === "channel" ? "channel" : "group";
|
|
479
|
+
const key = `${resolvedProvider}:${resolvedKind}:${id || raw || from}`;
|
|
480
|
+
let legacyKey;
|
|
481
|
+
if (hasLegacyGroupPrefix || from.includes("@g.us")) {
|
|
482
|
+
legacyKey = `group:${id || raw || from}`;
|
|
483
|
+
}
|
|
484
|
+
return {
|
|
485
|
+
key,
|
|
486
|
+
legacyKey,
|
|
487
|
+
provider: resolvedProvider,
|
|
488
|
+
id: id || raw || from,
|
|
489
|
+
chatType: resolvedKind === "channel" ? "room" : "group",
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
export function loadSessionStore(storePath) {
|
|
493
|
+
try {
|
|
494
|
+
const raw = fs.readFileSync(storePath, "utf-8");
|
|
495
|
+
const parsed = JSON5.parse(raw);
|
|
496
|
+
if (parsed && typeof parsed === "object") {
|
|
497
|
+
return parsed;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
// ignore missing/invalid store; we'll recreate it
|
|
502
|
+
}
|
|
503
|
+
return {};
|
|
504
|
+
}
|
|
505
|
+
export async function saveSessionStore(storePath, store) {
|
|
506
|
+
await fs.promises.mkdir(path.dirname(storePath), { recursive: true });
|
|
507
|
+
const json = JSON.stringify(store, null, 2);
|
|
508
|
+
const tmp = `${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;
|
|
509
|
+
try {
|
|
510
|
+
await fs.promises.writeFile(tmp, json, "utf-8");
|
|
511
|
+
await fs.promises.rename(tmp, storePath);
|
|
512
|
+
}
|
|
513
|
+
catch (err) {
|
|
514
|
+
const code = err && typeof err === "object" && "code" in err
|
|
515
|
+
? String(err.code)
|
|
516
|
+
: null;
|
|
517
|
+
if (code === "ENOENT") {
|
|
518
|
+
// In tests the temp session-store directory may be deleted while writes are in-flight.
|
|
519
|
+
// Best-effort: try a direct write (recreating the parent dir), otherwise ignore.
|
|
520
|
+
try {
|
|
521
|
+
await fs.promises.mkdir(path.dirname(storePath), { recursive: true });
|
|
522
|
+
await fs.promises.writeFile(storePath, json, "utf-8");
|
|
523
|
+
}
|
|
524
|
+
catch (err2) {
|
|
525
|
+
const code2 = err2 && typeof err2 === "object" && "code" in err2
|
|
526
|
+
? String(err2.code)
|
|
527
|
+
: null;
|
|
528
|
+
if (code2 === "ENOENT")
|
|
529
|
+
return;
|
|
530
|
+
throw err2;
|
|
531
|
+
}
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
throw err;
|
|
535
|
+
}
|
|
536
|
+
finally {
|
|
537
|
+
await fs.promises.rm(tmp, { force: true });
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
export async function updateLastRoute(params) {
|
|
541
|
+
const { storePath, sessionKey, provider, to, accountId } = params;
|
|
542
|
+
const store = loadSessionStore(storePath);
|
|
543
|
+
const existing = store[sessionKey];
|
|
544
|
+
const now = Date.now();
|
|
545
|
+
const next = {
|
|
546
|
+
sessionId: existing?.sessionId ?? crypto.randomUUID(),
|
|
547
|
+
updatedAt: Math.max(existing?.updatedAt ?? 0, now),
|
|
548
|
+
systemSent: existing?.systemSent,
|
|
549
|
+
abortedLastRun: existing?.abortedLastRun,
|
|
550
|
+
thinkingLevel: existing?.thinkingLevel,
|
|
551
|
+
verboseLevel: existing?.verboseLevel,
|
|
552
|
+
providerOverride: existing?.providerOverride,
|
|
553
|
+
modelOverride: existing?.modelOverride,
|
|
554
|
+
sendPolicy: existing?.sendPolicy,
|
|
555
|
+
queueMode: existing?.queueMode,
|
|
556
|
+
inputTokens: existing?.inputTokens,
|
|
557
|
+
outputTokens: existing?.outputTokens,
|
|
558
|
+
totalTokens: existing?.totalTokens,
|
|
559
|
+
modelProvider: existing?.modelProvider,
|
|
560
|
+
model: existing?.model,
|
|
561
|
+
contextTokens: existing?.contextTokens,
|
|
562
|
+
displayName: existing?.displayName,
|
|
563
|
+
chatType: existing?.chatType,
|
|
564
|
+
provider: existing?.provider,
|
|
565
|
+
subject: existing?.subject,
|
|
566
|
+
room: existing?.room,
|
|
567
|
+
space: existing?.space,
|
|
568
|
+
skillsSnapshot: existing?.skillsSnapshot,
|
|
569
|
+
lastProvider: provider,
|
|
570
|
+
lastTo: to?.trim() ? to.trim() : undefined,
|
|
571
|
+
lastAccountId: accountId?.trim()
|
|
572
|
+
? accountId.trim()
|
|
573
|
+
: existing?.lastAccountId,
|
|
574
|
+
};
|
|
575
|
+
store[sessionKey] = next;
|
|
576
|
+
await saveSessionStore(storePath, store);
|
|
577
|
+
return next;
|
|
578
|
+
}
|
|
579
|
+
// Decide which session bucket to use (per-sender vs global).
|
|
580
|
+
export function deriveSessionKey(scope, ctx) {
|
|
581
|
+
if (scope === "global")
|
|
582
|
+
return "global";
|
|
583
|
+
const resolvedGroup = resolveGroupSessionKey(ctx);
|
|
584
|
+
if (resolvedGroup)
|
|
585
|
+
return resolvedGroup.key;
|
|
586
|
+
const from = ctx.From ? normalizeE164(ctx.From) : "";
|
|
587
|
+
return from || "unknown";
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Resolve the session key with a canonical direct-chat bucket (default: "main").
|
|
591
|
+
* All non-group direct chats collapse to this bucket; groups stay isolated.
|
|
592
|
+
*/
|
|
593
|
+
export function resolveSessionKey(scope, ctx, mainKey) {
|
|
594
|
+
const explicit = ctx.SessionKey?.trim();
|
|
595
|
+
if (explicit)
|
|
596
|
+
return explicit;
|
|
597
|
+
const raw = deriveSessionKey(scope, ctx);
|
|
598
|
+
if (scope === "global")
|
|
599
|
+
return raw;
|
|
600
|
+
const canonicalMainKey = (mainKey ?? DEFAULT_MAIN_KEY).trim() || DEFAULT_MAIN_KEY;
|
|
601
|
+
const canonical = buildAgentMainSessionKey({
|
|
602
|
+
agentId: DEFAULT_AGENT_ID,
|
|
603
|
+
mainKey: canonicalMainKey,
|
|
604
|
+
});
|
|
605
|
+
const isGroup = raw.startsWith("group:") ||
|
|
606
|
+
raw.includes(":group:") ||
|
|
607
|
+
raw.includes(":channel:");
|
|
608
|
+
if (!isGroup)
|
|
609
|
+
return canonical;
|
|
610
|
+
return `agent:${DEFAULT_AGENT_ID}:${raw}`;
|
|
611
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export function readTalkApiKeyFromProfile(deps = {}) {
|
|
5
|
+
const fsImpl = deps.fs ?? fs;
|
|
6
|
+
const osImpl = deps.os ?? os;
|
|
7
|
+
const pathImpl = deps.path ?? path;
|
|
8
|
+
const home = osImpl.homedir();
|
|
9
|
+
const candidates = [".profile", ".zprofile", ".zshrc", ".bashrc"].map((name) => pathImpl.join(home, name));
|
|
10
|
+
for (const candidate of candidates) {
|
|
11
|
+
if (!fsImpl.existsSync(candidate))
|
|
12
|
+
continue;
|
|
13
|
+
try {
|
|
14
|
+
const text = fsImpl.readFileSync(candidate, "utf-8");
|
|
15
|
+
const match = text.match(/(?:^|\n)\s*(?:export\s+)?ELEVENLABS_API_KEY\s*=\s*["']?([^\n"']+)["']?/);
|
|
16
|
+
const value = match?.[1]?.trim();
|
|
17
|
+
if (value)
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Ignore profile read errors.
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
export function resolveTalkApiKey(env = process.env, deps = {}) {
|
|
27
|
+
const envValue = (env.ELEVENLABS_API_KEY ?? "").trim();
|
|
28
|
+
if (envValue)
|
|
29
|
+
return envValue;
|
|
30
|
+
return readTalkApiKeyFromProfile(deps);
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { applyIdentityDefaults, applyModelDefaults, applySessionDefaults, } from "./defaults.js";
|
|
2
|
+
import { findLegacyConfigIssues } from "./legacy.js";
|
|
3
|
+
import { NexusSchema } from "./zod-schema.js";
|
|
4
|
+
export function validateConfigObject(raw) {
|
|
5
|
+
const legacyIssues = findLegacyConfigIssues(raw);
|
|
6
|
+
if (legacyIssues.length > 0) {
|
|
7
|
+
return {
|
|
8
|
+
ok: false,
|
|
9
|
+
issues: legacyIssues.map((iss) => ({
|
|
10
|
+
path: iss.path,
|
|
11
|
+
message: iss.message,
|
|
12
|
+
})),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const validated = NexusSchema.safeParse(raw);
|
|
16
|
+
if (!validated.success) {
|
|
17
|
+
return {
|
|
18
|
+
ok: false,
|
|
19
|
+
issues: validated.error.issues.map((iss) => ({
|
|
20
|
+
path: iss.path.join("."),
|
|
21
|
+
message: iss.message,
|
|
22
|
+
})),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
ok: true,
|
|
27
|
+
config: applyModelDefaults(applySessionDefaults(applyIdentityDefaults(validated.data))),
|
|
28
|
+
};
|
|
29
|
+
}
|