@intent-systems/nexus 2026.1.5-4 → 2026.1.5-8
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/dist/agents/agent-id.js +41 -0
- package/dist/agents/auth-profiles.js +114 -25
- package/dist/agents/identity-state.js +101 -0
- package/dist/agents/model-auth.js +1 -0
- package/dist/agents/model-fallback.js +15 -9
- package/dist/agents/model-selection.js +1 -1
- package/dist/agents/models-config.js +17 -11
- package/dist/agents/pi-embedded-runner.js +101 -9
- package/dist/agents/sandbox.js +12 -3
- package/dist/agents/skill-runner.js +41 -6
- package/dist/agents/skill-usage.js +117 -17
- package/dist/agents/skills-status.js +4 -3
- package/dist/agents/skills.js +38 -30
- package/dist/agents/subagent-registry.js +25 -11
- package/dist/agents/system-prompt.js +16 -0
- package/dist/agents/tool-policy.js +19 -3
- package/dist/agents/tools/browser-tool.js +5 -2
- package/dist/agents/tools/image-tool.js +93 -8
- package/dist/agents/tools/sessions-announce-target.js +5 -1
- package/dist/agents/workspace.js +81 -59
- package/dist/auto-reply/command-detection.js +2 -1
- package/dist/auto-reply/reply/directive-handling.js +153 -28
- package/dist/auto-reply/reply/directives.js +17 -2
- package/dist/auto-reply/reply/model-selection.js +8 -3
- package/dist/auto-reply/reply/queue.js +2 -2
- package/dist/auto-reply/reply.js +1 -1
- package/dist/auto-reply/thinking.js +15 -0
- package/dist/browser/chrome.js +1 -1
- package/dist/browser/client.js +2 -0
- package/dist/browser/config.js +6 -2
- package/dist/browser/pw-tools-core.js +3 -0
- package/dist/browser/routes/agent.js +14 -0
- package/dist/canvas-host/server.js +1 -1
- package/dist/capabilities/detector.js +46 -15
- package/dist/capabilities/registry.js +2 -1
- package/dist/cli/cloud-cli.js +70 -7
- package/dist/cli/credential-cli.js +214 -23
- package/dist/cli/gateway-cli.js +1 -1
- package/dist/cli/log-cli.js +25 -0
- package/dist/cli/pairing-cli.js +1 -1
- package/dist/cli/program.js +82 -8
- package/dist/cli/run-main.js +1 -1
- package/dist/cli/skills-cli.js +165 -30
- package/dist/cli/skills-hub-cli.js +68 -36
- package/dist/cli/tool-connector-cli.js +99 -24
- package/dist/cli/upstream-sync-cli.js +253 -96
- package/dist/cli/usage-cli.js +14 -0
- package/dist/commands/auth-choice-options.js +6 -1
- package/dist/commands/auth-choice.js +157 -5
- package/dist/commands/bootstrap-preset.js +26 -12
- package/dist/commands/capabilities.js +33 -6
- package/dist/commands/claude-md.js +3 -2
- package/dist/commands/config-view.js +1 -1
- package/dist/commands/config.js +85 -0
- package/dist/commands/configure.js +4 -4
- package/dist/commands/credential.js +497 -36
- package/dist/commands/cursor-hooks.js +240 -0
- package/dist/commands/cursor-rules.js +14 -188
- package/dist/commands/doctor.js +5 -4
- package/dist/commands/identity.js +29 -32
- package/dist/commands/init.js +304 -20
- package/dist/commands/log.js +134 -0
- package/dist/commands/models/fallbacks.js +1 -1
- package/dist/commands/models/image-fallbacks.js +1 -1
- package/dist/commands/models/list.js +1 -1
- package/dist/commands/models/scan.js +1 -1
- package/dist/commands/onboard-auth.js +27 -2
- package/dist/commands/onboard-eve-identity.js +8 -9
- package/dist/commands/onboard-non-interactive.js +4 -2
- package/dist/commands/onboard-quickstart.js +18 -11
- package/dist/commands/quest-state.js +271 -0
- package/dist/commands/quest.js +53 -13
- package/dist/commands/reset.js +1 -1
- package/dist/commands/sessions-ingest.js +5 -4
- package/dist/commands/setup.js +4 -2
- package/dist/commands/skills-manifest.js +89 -29
- package/dist/commands/status.js +193 -73
- package/dist/commands/suggestions.js +1 -1
- package/dist/commands/usage-tracking.js +32 -0
- package/dist/commands/usage-upload.js +6 -1
- package/dist/config/defaults.js +1 -3
- package/dist/config/includes.js +5 -7
- package/dist/config/io.js +88 -16
- package/dist/config/legacy.js +4 -2
- package/dist/config/paths.js +16 -0
- package/dist/config/sessions.js +9 -5
- package/dist/config/zod-schema.js +4 -3
- package/dist/control-plane/broker/broker.js +131 -78
- package/dist/control-plane/compaction.js +3 -5
- package/dist/control-plane/factory.js +2 -2
- package/dist/control-plane/index.js +2 -2
- package/dist/control-plane/odu/agents.js +28 -23
- package/dist/control-plane/odu/interaction-tools.js +62 -50
- package/dist/control-plane/odu/prompt-loader.js +8 -8
- package/dist/control-plane/odu/runtime.js +87 -75
- package/dist/control-plane/odu-control-plane.js +14 -12
- package/dist/control-plane/single-agent.js +13 -13
- package/dist/credentials/store.js +133 -7
- package/dist/daemon/launchd.js +14 -0
- package/dist/entry.js +0 -0
- package/dist/gateway/server-browser.js +5 -4
- package/dist/gateway/server-methods/cron.js +11 -1
- package/dist/gateway/server.js +14 -7
- package/dist/infra/bonjour.js +1 -1
- package/dist/infra/event-log.js +8 -2
- package/dist/infra/path-env.js +1 -2
- package/dist/infra/provider-usage.auth.js +5 -3
- package/dist/infra/provider-usage.fetch.claude.js +16 -6
- package/dist/infra/provider-usage.fetch.minimax.js +8 -3
- package/dist/infra/provider-usage.js +9 -5
- package/dist/infra/restart.js +2 -2
- package/dist/infra/usage-settings.js +78 -0
- package/dist/infra/usage-suggestions.js +17 -5
- package/dist/infra/usage-upload.js +38 -1
- package/dist/infra/voicewake.js +2 -2
- package/dist/media/image-ops.js +3 -1
- package/dist/memory/index.js +2 -381
- package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud +0 -0
- package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud-rs +0 -0
- package/dist/pairing/pairing-store.js +24 -0
- package/dist/providers/github-copilot-auth.js +1 -1
- package/dist/routing/resolve-route.js +6 -6
- package/dist/routing/session-key.js +3 -1
- package/dist/sessions/send-policy.js +5 -5
- package/dist/slack/monitor.js +22 -1
- package/dist/telegram/reaction-level.js +2 -1
- package/dist/utils.js +8 -3
- package/dist/wizard/onboarding.js +29 -7
- package/docs/AGENTS.default.md +1 -1
- package/docs/configuration.md +1 -1
- package/docs/feature-inventory/overview.md +2 -2
- package/docs/reference/templates/AGENTS.md +172 -109
- package/docs/templates/AGENTS.md +140 -199
- package/docs/templates/BOOTSTRAP.md +40 -20
- package/docs/templates/IDENTITY.md +6 -0
- package/docs/templates/USER.md +22 -2
- package/package.json +3 -1
- package/skills/{notion → connectors/notion}/SKILL.md +1 -1
- package/skills/{filesystem → guides/filesystem}/SKILL.md +1 -1
- package/skills/{onboarding → guides/onboarding}/SKILL.md +1 -1
- package/skills/{onboarding → guides/onboarding}/docs/CAPABILITY_TAXONOMY.md +5 -5
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR.md +8 -8
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_ONBOARDING.md +2 -2
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_SKILLS.md +26 -20
- package/skills/{onboarding → guides/onboarding}/docs/GOAL_STATE_ARCHITECTURE.md +38 -43
- package/skills/{onboarding → guides/onboarding}/docs/NEXUS_SYSTEM_OVERVIEW.md +4 -4
- package/skills/{onboarding → guides/onboarding}/docs/SKILLS_HUB_SPEC.md +1 -1
- package/skills/{onboarding → guides/onboarding}/docs/SKILLS_SPECIFICATION.md +8 -7
- package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_DESIGN.md +16 -16
- package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_PRD.md +10 -12
- package/skills/guides/onboarding/docs/canonical/00_CONFLICT_ANALYSIS.md +463 -0
- package/skills/guides/onboarding/docs/canonical/01_NEXUS_OVERVIEW.md +167 -0
- package/skills/guides/onboarding/docs/canonical/02_CLI_REFERENCE.md +404 -0
- package/skills/guides/onboarding/docs/canonical/03_STATE_ARCHITECTURE.md +357 -0
- package/skills/guides/onboarding/docs/canonical/04_SKILL_SPECIFICATION.md +393 -0
- package/skills/guides/onboarding/docs/canonical/05_CAPABILITY_TAXONOMY.md +298 -0
- package/skills/guides/onboarding/docs/canonical/06_CAPABILITIES_REFERENCE.md +207 -0
- package/skills/guides/onboarding/docs/canonical/07_AGENT_BINDINGS.md +85 -0
- package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/nexus-cloud.md +2 -2
- package/skills/{onboarding → guides/onboarding}/scripts/ralph/progress.txt +1 -1
- package/skills/{nexus-cloud → tools/nexus-cloud}/SKILL.md +2 -1
- package/skills/{nexus-cloud → tools/nexus-cloud}/docs/setup.md +1 -1
- package/docs/templates/PROFILE.md +0 -14
- /package/skills/{brave-search → connectors/brave-search}/SKILL.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/setup.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/troubleshooting.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/usage.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/scripts/content.mjs +0 -0
- /package/skills/{brave-search → connectors/brave-search}/scripts/search.mjs +0 -0
- /package/skills/{discord → connectors/discord}/SKILL.md +0 -0
- /package/skills/{gemini → connectors/gemini}/SKILL.md +0 -0
- /package/skills/{github → connectors/github}/SKILL.md +0 -0
- /package/skills/{github → connectors/github}/docs/setup.md +0 -0
- /package/skills/{github → connectors/github}/docs/troubleshooting.md +0 -0
- /package/skills/{google-oauth → connectors/google-oauth}/SKILL.md +0 -0
- /package/skills/{slack → connectors/slack}/SKILL.md +0 -0
- /package/skills/{telegram → connectors/telegram}/SKILL.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/pairing.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/setup.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/webhook.md +0 -0
- /package/skills/{wacli → connectors/wacli}/SKILL.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/auth.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/backup.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/troubleshooting.md +0 -0
- /package/skills/{browser-use-agent-sdk → guides/browser-use-agent-sdk}/SKILL.md +0 -0
- /package/skills/{json-render → guides/json-render}/SKILL.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/registry.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/App.css +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/App.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/data/nexus-core.json +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/index.css +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/registry.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/docs/nexus-state-demo.md +0 -0
- /package/skills/{json-render → guides/json-render}/docs/shadcn-preset.md +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/create-vite-demo.sh +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/package-lock.json +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/package.json +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/server.ts +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/CAPABILITIES.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_CREDENTIALS.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/DOCUMENTATION_OVERVIEW.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/ENTITY_MODEL.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/SKILL_INVENTORY.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/STATE_ARCHITECTURE.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/TROUBLESHOOTING.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/USER_JOURNEY.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/WOW_MOMENTS.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/agent-apple-id.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/1password.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/TEMPLATE.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/aix.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/bird.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/brave-search.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/comms.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/computer-use.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/cron-and-heartbeat.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/eve.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/github.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/gog.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/homebrew-prereqs.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/qmd.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/telegram.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/wacli.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/weather.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prd.json +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prompt.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.log +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.sh +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/setup-cursor-skills.sh +0 -0
- /package/skills/{1password → tools/1password}/SKILL.md +0 -0
- /package/skills/{1password → tools/1password}/docs/setup.md +0 -0
- /package/skills/{1password → tools/1password}/docs/troubleshooting.md +0 -0
- /package/skills/{1password → tools/1password}/references/cli-examples.md +0 -0
- /package/skills/{1password → tools/1password}/references/get-started.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/SKILL.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/browser-use-eval.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/first-tests.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/wordle-nyt-eval.js +0 -0
- /package/skills/{aix → tools/aix}/SKILL.md +0 -0
- /package/skills/{aix → tools/aix}/docs/embeddings.md +0 -0
- /package/skills/{aix → tools/aix}/docs/setup.md +0 -0
- /package/skills/{aix → tools/aix}/docs/troubleshooting.md +0 -0
- /package/skills/{aix → tools/aix}/references/sql.md +0 -0
- /package/skills/{apple-notes → tools/apple-notes}/SKILL.md +0 -0
- /package/skills/{apple-reminders → tools/apple-reminders}/SKILL.md +0 -0
- /package/skills/{bear-notes → tools/bear-notes}/SKILL.md +0 -0
- /package/skills/{bird → tools/bird}/SKILL.md +0 -0
- /package/skills/{bird → tools/bird}/docs/auth.md +0 -0
- /package/skills/{bird → tools/bird}/docs/troubleshooting.md +0 -0
- /package/skills/{blogwatcher → tools/blogwatcher}/SKILL.md +0 -0
- /package/skills/{blucli → tools/blucli}/SKILL.md +0 -0
- /package/skills/{camsnap → tools/camsnap}/SKILL.md +0 -0
- /package/skills/{clawdhub → tools/clawdhub}/SKILL.md +0 -0
- /package/skills/{coding-agent → tools/coding-agent}/SKILL.md +0 -0
- /package/skills/{comms → tools/comms}/SKILL.md +0 -0
- /package/skills/{comms → tools/comms}/docs/adapters.md +0 -0
- /package/skills/{comms → tools/comms}/docs/setup.md +0 -0
- /package/skills/{comms → tools/comms}/docs/troubleshooting.md +0 -0
- /package/skills/{comms → tools/comms}/references/schema.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/SKILL.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/open-interpreter.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/peekaboo.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/setup.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/troubleshooting.md +0 -0
- /package/skills/{eightctl → tools/eightctl}/SKILL.md +0 -0
- /package/skills/{eve → tools/eve}/SKILL.md +0 -0
- /package/skills/{eve → tools/eve}/docs/dual-account.md +0 -0
- /package/skills/{eve → tools/eve}/docs/intelligence.md +0 -0
- /package/skills/{eve → tools/eve}/docs/setup.md +0 -0
- /package/skills/{eve → tools/eve}/docs/troubleshooting.md +0 -0
- /package/skills/{eve → tools/eve}/scripts/setup-dual-account.sh +0 -0
- /package/skills/{food-order → tools/food-order}/SKILL.md +0 -0
- /package/skills/{gh → tools/gh}/SKILL.md +0 -0
- /package/skills/{gh → tools/gh}/docs/usage.md +0 -0
- /package/skills/{gifgrep → tools/gifgrep}/SKILL.md +0 -0
- /package/skills/{gog → tools/gog}/SKILL.md +0 -0
- /package/skills/{gog → tools/gog}/docs/portability.md +0 -0
- /package/skills/{gog → tools/gog}/docs/setup.md +0 -0
- /package/skills/{gog → tools/gog}/docs/troubleshooting.md +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/README.md +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/add_test_users.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts_manual.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/create_oauth_client.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/launch_cdp_chrome.sh +0 -0
- /package/skills/{goplaces → tools/goplaces}/SKILL.md +0 -0
- /package/skills/{imsg → tools/imsg}/SKILL.md +0 -0
- /package/skills/{local-places → tools/local-places}/SERVER_README.md +0 -0
- /package/skills/{local-places → tools/local-places}/SKILL.md +0 -0
- /package/skills/{local-places → tools/local-places}/pyproject.toml +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__init__.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/google_places.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/main.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/schemas.py +0 -0
- /package/skills/{mcporter → tools/mcporter}/SKILL.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/SKILL.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/references/codexbar-cli.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/scripts/model_usage.py +0 -0
- /package/skills/{nano-banana-pro → tools/nano-banana-pro}/SKILL.md +0 -0
- /package/skills/{nano-banana-pro → tools/nano-banana-pro}/scripts/generate_image.py +0 -0
- /package/skills/{nano-pdf → tools/nano-pdf}/SKILL.md +0 -0
- /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/security.md +0 -0
- /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/troubleshooting.md +0 -0
- /package/skills/{obsidian → tools/obsidian}/SKILL.md +0 -0
- /package/skills/{openai-image-gen → tools/openai-image-gen}/SKILL.md +0 -0
- /package/skills/{openai-image-gen → tools/openai-image-gen}/scripts/gen.py +0 -0
- /package/skills/{openai-whisper → tools/openai-whisper}/SKILL.md +0 -0
- /package/skills/{openai-whisper-api → tools/openai-whisper-api}/SKILL.md +0 -0
- /package/skills/{openai-whisper-api → tools/openai-whisper-api}/scripts/transcribe.sh +0 -0
- /package/skills/{openhue → tools/openhue}/SKILL.md +0 -0
- /package/skills/{oracle → tools/oracle}/SKILL.md +0 -0
- /package/skills/{ordercli → tools/ordercli}/SKILL.md +0 -0
- /package/skills/{peekaboo → tools/peekaboo}/SKILL.md +0 -0
- /package/skills/{qmd → tools/qmd}/SKILL.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/mcp.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/ollama.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/setup.md +0 -0
- /package/skills/{sag → tools/sag}/SKILL.md +0 -0
- /package/skills/{skill-cli-template → tools/skill-cli-template}/SKILL.md +0 -0
- /package/skills/{songsee → tools/songsee}/SKILL.md +0 -0
- /package/skills/{sonoscli → tools/sonoscli}/SKILL.md +0 -0
- /package/skills/{spotify-player → tools/spotify-player}/SKILL.md +0 -0
- /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
- /package/skills/{things-mac → tools/things-mac}/SKILL.md +0 -0
- /package/skills/{tmux → tools/tmux}/SKILL.md +0 -0
- /package/skills/{tmux → tools/tmux}/scripts/find-sessions.sh +0 -0
- /package/skills/{tmux → tools/tmux}/scripts/wait-for-text.sh +0 -0
- /package/skills/{trello → tools/trello}/SKILL.md +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/SKILL.md +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/auto-port.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-all.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-nexus.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-pi-ai.sh +0 -0
- /package/skills/{video-frames → tools/video-frames}/SKILL.md +0 -0
- /package/skills/{video-frames → tools/video-frames}/scripts/frame.sh +0 -0
- /package/skills/{weather → tools/weather}/SKILL.md +0 -0
- /package/skills/{weather → tools/weather}/docs/usage.md +0 -0
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import crypto from "node:crypto";
|
|
20
20
|
import { loadSession, writeSessionMetadata, } from "../../config/sessions.js";
|
|
21
21
|
import { createSubsystemLogger } from "../../logging.js";
|
|
22
|
-
import { normalizeAgentId,
|
|
22
|
+
import { DEFAULT_AGENT_ID, normalizeAgentId, } from "../../routing/session-key.js";
|
|
23
23
|
/**
|
|
24
24
|
* Active Message Broker - manages agent lifecycle
|
|
25
25
|
*/
|
|
@@ -52,10 +52,9 @@ export class ActiveMessageBroker {
|
|
|
52
52
|
collectMaxMessages = 10; // Default max messages before auto-flush
|
|
53
53
|
// Logger
|
|
54
54
|
logger;
|
|
55
|
-
// Config reference
|
|
56
55
|
config;
|
|
57
56
|
constructor(config) {
|
|
58
|
-
this.logger = createSubsystemLogger(
|
|
57
|
+
this.logger = createSubsystemLogger("broker");
|
|
59
58
|
this.config = config;
|
|
60
59
|
}
|
|
61
60
|
/**
|
|
@@ -65,7 +64,10 @@ export class ActiveMessageBroker {
|
|
|
65
64
|
registerODU(oduName, sessionStorePath, agentFactory) {
|
|
66
65
|
this.sessionStorePaths.set(oduName, sessionStorePath);
|
|
67
66
|
this.agentFactories.set(oduName, agentFactory);
|
|
68
|
-
this.logger.info(`ODU registered: ${oduName}`, {
|
|
67
|
+
this.logger.info(`ODU registered: ${oduName}`, {
|
|
68
|
+
oduName,
|
|
69
|
+
sessionStorePath,
|
|
70
|
+
});
|
|
69
71
|
}
|
|
70
72
|
/**
|
|
71
73
|
* Register an IA with the broker
|
|
@@ -80,7 +82,10 @@ export class ActiveMessageBroker {
|
|
|
80
82
|
*/
|
|
81
83
|
setDeliveryMode(agentId, mode) {
|
|
82
84
|
this.deliveryModes.set(agentId, mode);
|
|
83
|
-
this.logger.debug(`Delivery mode set for ${agentId}: ${mode}`, {
|
|
85
|
+
this.logger.debug(`Delivery mode set for ${agentId}: ${mode}`, {
|
|
86
|
+
agentId,
|
|
87
|
+
mode,
|
|
88
|
+
});
|
|
84
89
|
}
|
|
85
90
|
/**
|
|
86
91
|
* Set collection parameters (for 'collect' mode)
|
|
@@ -90,7 +95,10 @@ export class ActiveMessageBroker {
|
|
|
90
95
|
this.collectDebounceMs = debounceMs;
|
|
91
96
|
if (maxMessages !== undefined)
|
|
92
97
|
this.collectMaxMessages = maxMessages;
|
|
93
|
-
this.logger.debug(
|
|
98
|
+
this.logger.debug("Collection params updated", {
|
|
99
|
+
debounceMs: this.collectDebounceMs,
|
|
100
|
+
maxMessages: this.collectMaxMessages,
|
|
101
|
+
});
|
|
94
102
|
}
|
|
95
103
|
/**
|
|
96
104
|
* Handle collect mode: buffer messages and debounce delivery
|
|
@@ -101,13 +109,16 @@ export class ActiveMessageBroker {
|
|
|
101
109
|
if (!this.collectionBuffers.has(agentId)) {
|
|
102
110
|
this.collectionBuffers.set(agentId, []);
|
|
103
111
|
}
|
|
104
|
-
this.collectionBuffers.get(agentId)
|
|
112
|
+
this.collectionBuffers.get(agentId)?.push(message);
|
|
105
113
|
// Clear existing timer
|
|
106
|
-
|
|
107
|
-
|
|
114
|
+
const existingTimer = this.collectionTimers.get(agentId);
|
|
115
|
+
if (existingTimer) {
|
|
116
|
+
clearTimeout(existingTimer);
|
|
108
117
|
}
|
|
109
118
|
// Check if we've hit max messages
|
|
110
119
|
const buffer = this.collectionBuffers.get(agentId);
|
|
120
|
+
if (!buffer)
|
|
121
|
+
return;
|
|
111
122
|
if (buffer.length >= this.collectMaxMessages) {
|
|
112
123
|
// Flush immediately
|
|
113
124
|
this.flushCollectionBuffer(agentId);
|
|
@@ -126,10 +137,14 @@ export class ActiveMessageBroker {
|
|
|
126
137
|
const buffer = this.collectionBuffers.get(agentId);
|
|
127
138
|
if (!buffer || buffer.length === 0)
|
|
128
139
|
return;
|
|
129
|
-
this.logger.debug(`Flushing collection buffer for ${agentId}`, {
|
|
140
|
+
this.logger.debug(`Flushing collection buffer for ${agentId}`, {
|
|
141
|
+
agentId,
|
|
142
|
+
messageCount: buffer.length,
|
|
143
|
+
});
|
|
130
144
|
// Clear timer and buffer
|
|
131
|
-
|
|
132
|
-
|
|
145
|
+
const timer = this.collectionTimers.get(agentId);
|
|
146
|
+
if (timer) {
|
|
147
|
+
clearTimeout(timer);
|
|
133
148
|
this.collectionTimers.delete(agentId);
|
|
134
149
|
}
|
|
135
150
|
this.collectionBuffers.delete(agentId);
|
|
@@ -163,25 +178,32 @@ export class ActiveMessageBroker {
|
|
|
163
178
|
throw new Error(`Cannot wait for ack: ${message.to} is not a registered IA`);
|
|
164
179
|
}
|
|
165
180
|
// Track external caller if needed
|
|
166
|
-
if (message.from !== message.to &&
|
|
181
|
+
if (message.from !== message.to &&
|
|
182
|
+
message.from !== "user" &&
|
|
183
|
+
message.from !== "system") {
|
|
167
184
|
if (!this.externalCallers.has(message.to)) {
|
|
168
185
|
this.externalCallers.set(message.to, new Set());
|
|
169
186
|
}
|
|
170
|
-
this.externalCallers.get(message.to)
|
|
187
|
+
this.externalCallers.get(message.to)?.add(message.from);
|
|
171
188
|
}
|
|
172
189
|
// Add to queue for tracking
|
|
173
190
|
this.enqueue(message);
|
|
174
191
|
// Queue message at IA
|
|
175
192
|
if (ia.queueMessage) {
|
|
176
|
-
ia.queueMessage(message.content, message.priority ||
|
|
193
|
+
ia.queueMessage(message.content, message.priority || "normal", message.from);
|
|
177
194
|
}
|
|
178
|
-
this.logger.debug(`Waiting for ack from ${message.to}...`, {
|
|
195
|
+
this.logger.debug(`Waiting for ack from ${message.to}...`, {
|
|
196
|
+
to: message.to,
|
|
197
|
+
});
|
|
179
198
|
// Kick off processing and wait for acknowledgment
|
|
180
|
-
let ack =
|
|
199
|
+
let ack = "";
|
|
181
200
|
if (ia.processQueue) {
|
|
182
201
|
ack = await ia.processQueue();
|
|
183
202
|
}
|
|
184
|
-
this.logger.debug(`Received ack from ${message.to}`, {
|
|
203
|
+
this.logger.debug(`Received ack from ${message.to}`, {
|
|
204
|
+
to: message.to,
|
|
205
|
+
ackLength: ack.length,
|
|
206
|
+
});
|
|
185
207
|
return ack;
|
|
186
208
|
}
|
|
187
209
|
/**
|
|
@@ -204,25 +226,27 @@ export class ActiveMessageBroker {
|
|
|
204
226
|
message.to = resolvedTo;
|
|
205
227
|
this.logger.debug(`Routed to ${resolvedTo}`, { resolvedTo });
|
|
206
228
|
// 1. Track external caller (if not self-message)
|
|
207
|
-
if (message.from !== message.to &&
|
|
229
|
+
if (message.from !== message.to &&
|
|
230
|
+
message.from !== "user" &&
|
|
231
|
+
message.from !== "system") {
|
|
208
232
|
if (!this.externalCallers.has(message.to)) {
|
|
209
233
|
this.externalCallers.set(message.to, new Set());
|
|
210
234
|
}
|
|
211
|
-
this.externalCallers.get(message.to)
|
|
235
|
+
this.externalCallers.get(message.to)?.add(message.from);
|
|
212
236
|
}
|
|
213
237
|
// 2. Handle collect mode (buffer and debounce)
|
|
214
|
-
if (message.deliveryMode ===
|
|
238
|
+
if (message.deliveryMode === "collect") {
|
|
215
239
|
this.handleCollectMode(message);
|
|
216
240
|
return; // Don't enqueue immediately
|
|
217
241
|
}
|
|
218
242
|
// 3. Handle steer mode (interrupt like urgent)
|
|
219
|
-
if (message.deliveryMode ===
|
|
243
|
+
if (message.deliveryMode === "steer") {
|
|
220
244
|
// Steer mode interrupts current work
|
|
221
|
-
message.priority =
|
|
222
|
-
message.deliveryMode =
|
|
245
|
+
message.priority = "urgent";
|
|
246
|
+
message.deliveryMode = "interrupt";
|
|
223
247
|
}
|
|
224
248
|
// 4. Handle followup mode (queue without interrupting)
|
|
225
|
-
if (message.deliveryMode ===
|
|
249
|
+
if (message.deliveryMode === "followup") {
|
|
226
250
|
// Followup doesn't interrupt - just queues normally
|
|
227
251
|
// No special handling needed, just enqueue
|
|
228
252
|
}
|
|
@@ -233,23 +257,30 @@ export class ActiveMessageBroker {
|
|
|
233
257
|
const ia = this.registeredIAs.get(message.to);
|
|
234
258
|
if (ia) {
|
|
235
259
|
// IA is always running - queue message and trigger processing
|
|
236
|
-
this.logger.debug(`Delivering to IA: ${message.to}`, {
|
|
260
|
+
this.logger.debug(`Delivering to IA: ${message.to}`, {
|
|
261
|
+
to: message.to,
|
|
262
|
+
contentPreview: message.content.substring(0, 100),
|
|
263
|
+
});
|
|
237
264
|
// Queue the message with sender information
|
|
238
265
|
if (ia.queueMessage) {
|
|
239
|
-
ia.queueMessage(message.content, message.priority ||
|
|
266
|
+
ia.queueMessage(message.content, message.priority || "normal", message.from);
|
|
240
267
|
}
|
|
241
268
|
// Trigger processing by calling processQueue() if it exists, otherwise use chatSync
|
|
242
269
|
if (ia.processQueue) {
|
|
243
|
-
this.logger.debug(`Calling processQueue() for ${message.to}`, {
|
|
270
|
+
this.logger.debug(`Calling processQueue() for ${message.to}`, {
|
|
271
|
+
to: message.to,
|
|
272
|
+
});
|
|
244
273
|
ia.processQueue().catch((error) => {
|
|
245
274
|
this.logger.error(`IA ${message.to} processQueue error: ${error.message}`, { to: message.to, error: error.message });
|
|
246
275
|
});
|
|
247
276
|
}
|
|
248
277
|
else if (ia.chatSync) {
|
|
249
278
|
// Fallback: Call chatSync with empty string
|
|
250
|
-
this.logger.debug(`Calling chatSync('') for ${message.to} (fallback)`, {
|
|
279
|
+
this.logger.debug(`Calling chatSync('') for ${message.to} (fallback)`, {
|
|
280
|
+
to: message.to,
|
|
281
|
+
});
|
|
251
282
|
setImmediate(() => {
|
|
252
|
-
ia.chatSync(
|
|
283
|
+
ia.chatSync?.("").catch((error) => {
|
|
253
284
|
this.logger.error(`IA ${message.to} chatSync error: ${error.message}`, { to: message.to, error: error.message });
|
|
254
285
|
});
|
|
255
286
|
});
|
|
@@ -261,13 +292,17 @@ export class ActiveMessageBroker {
|
|
|
261
292
|
const running = this.runningAgents.get(message.to);
|
|
262
293
|
if (shouldInterrupt && running) {
|
|
263
294
|
// Interrupt and restart immediately
|
|
264
|
-
this.logger.info(`Interrupting ${message.to} for urgent message`, {
|
|
295
|
+
this.logger.info(`Interrupting ${message.to} for urgent message`, {
|
|
296
|
+
agentId: message.to,
|
|
297
|
+
});
|
|
265
298
|
await this.interruptAndRestart(message.to);
|
|
266
299
|
}
|
|
267
300
|
else if (!running && !this.startingAgents.has(message.to)) {
|
|
268
301
|
// Agent not running and not being started - mark as starting and process
|
|
269
302
|
this.startingAgents.add(message.to);
|
|
270
|
-
this.logger.info(`Processing batch for ${message.to}`, {
|
|
303
|
+
this.logger.info(`Processing batch for ${message.to}`, {
|
|
304
|
+
agentId: message.to,
|
|
305
|
+
});
|
|
271
306
|
try {
|
|
272
307
|
await this.processNextBatch(message.to);
|
|
273
308
|
}
|
|
@@ -301,10 +336,10 @@ export class ActiveMessageBroker {
|
|
|
301
336
|
// Rule 2: Short name - expand to caller's ODU EA
|
|
302
337
|
// Special case: 'user' and 'system' default to primary ODU
|
|
303
338
|
let callerODU;
|
|
304
|
-
if (from ===
|
|
339
|
+
if (from === "user" || from === "system") {
|
|
305
340
|
// Get first registered ODU (primary)
|
|
306
341
|
const odus = Array.from(this.agentFactories.keys());
|
|
307
|
-
callerODU = odus[0] ||
|
|
342
|
+
callerODU = odus[0] || "nexus";
|
|
308
343
|
}
|
|
309
344
|
else {
|
|
310
345
|
callerODU = this.getODUName(from);
|
|
@@ -319,14 +354,14 @@ export class ActiveMessageBroker {
|
|
|
319
354
|
* Examples: "toolbox-ea-worktrees", "meta-ia"
|
|
320
355
|
*/
|
|
321
356
|
isFullyQualified(name) {
|
|
322
|
-
const parts = name.split(
|
|
357
|
+
const parts = name.split("-");
|
|
323
358
|
// Must have at least 2 parts (oduName-ia) or 3+ parts (oduName-ea-identifier)
|
|
324
359
|
if (parts.length < 2) {
|
|
325
360
|
return false;
|
|
326
361
|
}
|
|
327
362
|
// Second part must be 'ia' or 'ea'
|
|
328
363
|
const agentType = parts[1];
|
|
329
|
-
return agentType ===
|
|
364
|
+
return agentType === "ia" || agentType === "ea";
|
|
330
365
|
}
|
|
331
366
|
/**
|
|
332
367
|
* Expand short agent name to fully-qualified ID
|
|
@@ -379,7 +414,7 @@ export class ActiveMessageBroker {
|
|
|
379
414
|
* Returns 'idle' if agent never started or completed
|
|
380
415
|
*/
|
|
381
416
|
getAgentStatus(agentId) {
|
|
382
|
-
return this.agentStatus.get(agentId) ||
|
|
417
|
+
return this.agentStatus.get(agentId) || "idle";
|
|
383
418
|
}
|
|
384
419
|
/**
|
|
385
420
|
* Set session status for an agent
|
|
@@ -388,10 +423,13 @@ export class ActiveMessageBroker {
|
|
|
388
423
|
setAgentStatus(agentId, status) {
|
|
389
424
|
const oldStatus = this.agentStatus.get(agentId);
|
|
390
425
|
this.agentStatus.set(agentId, status);
|
|
391
|
-
this.logger.debug(`Agent ${agentId} status: ${status}`, {
|
|
426
|
+
this.logger.debug(`Agent ${agentId} status: ${status}`, {
|
|
427
|
+
agentId,
|
|
428
|
+
status,
|
|
429
|
+
});
|
|
392
430
|
// Emit status change event
|
|
393
431
|
if (oldStatus !== status) {
|
|
394
|
-
this.emit(
|
|
432
|
+
this.emit("agent_status_changed", {
|
|
395
433
|
agentId,
|
|
396
434
|
oldStatus,
|
|
397
435
|
newStatus: status,
|
|
@@ -403,7 +441,7 @@ export class ActiveMessageBroker {
|
|
|
403
441
|
* Check if agent is currently active (processing messages)
|
|
404
442
|
*/
|
|
405
443
|
isAgentActive(agentId) {
|
|
406
|
-
return this.getAgentStatus(agentId) ===
|
|
444
|
+
return this.getAgentStatus(agentId) === "active";
|
|
407
445
|
}
|
|
408
446
|
/**
|
|
409
447
|
* Get list of external agents that have sent messages to this agent
|
|
@@ -432,7 +470,7 @@ export class ActiveMessageBroker {
|
|
|
432
470
|
if (!this.completionCallbacks.has(agentId)) {
|
|
433
471
|
this.completionCallbacks.set(agentId, []);
|
|
434
472
|
}
|
|
435
|
-
this.completionCallbacks.get(agentId)
|
|
473
|
+
this.completionCallbacks.get(agentId)?.push(resolve);
|
|
436
474
|
});
|
|
437
475
|
}
|
|
438
476
|
/**
|
|
@@ -440,24 +478,24 @@ export class ActiveMessageBroker {
|
|
|
440
478
|
*/
|
|
441
479
|
shouldInterrupt(message) {
|
|
442
480
|
// Rule 1: External → IA always interrupts
|
|
443
|
-
if (message.to.endsWith(
|
|
481
|
+
if (message.to.endsWith("-ia") && message.metadata?.source === "user") {
|
|
444
482
|
return true;
|
|
445
483
|
}
|
|
446
484
|
// Rule 2: EA → parent IA never interrupts
|
|
447
|
-
if (message.to.endsWith(
|
|
485
|
+
if (message.to.endsWith("-ia") && message.metadata?.source === "ea") {
|
|
448
486
|
return false;
|
|
449
487
|
}
|
|
450
488
|
// Rule 3: Explicit interrupt mode
|
|
451
|
-
if (message.deliveryMode ===
|
|
489
|
+
if (message.deliveryMode === "interrupt") {
|
|
452
490
|
return true;
|
|
453
491
|
}
|
|
454
492
|
// Rule 4: Priority-based
|
|
455
|
-
if (message.priority ===
|
|
493
|
+
if (message.priority === "urgent") {
|
|
456
494
|
return true;
|
|
457
495
|
}
|
|
458
|
-
if (message.priority ===
|
|
496
|
+
if (message.priority === "high") {
|
|
459
497
|
const running = this.runningAgents.get(message.to);
|
|
460
|
-
if (running &&
|
|
498
|
+
if (running && Date.now() - running.startedAt > 30000) {
|
|
461
499
|
return true; // Running > 30s, interrupt
|
|
462
500
|
}
|
|
463
501
|
}
|
|
@@ -480,7 +518,10 @@ export class ActiveMessageBroker {
|
|
|
480
518
|
const batch = [];
|
|
481
519
|
// Take all consecutive messages from the same sender
|
|
482
520
|
while (queue.length > 0 && queue[0].from === firstSender) {
|
|
483
|
-
|
|
521
|
+
const nextMessage = queue.shift();
|
|
522
|
+
if (!nextMessage)
|
|
523
|
+
break;
|
|
524
|
+
batch.push(nextMessage);
|
|
484
525
|
}
|
|
485
526
|
this.logger.info(`Batched ${batch.length} messages from ${firstSender} for ${agentId}`, {
|
|
486
527
|
agentId,
|
|
@@ -523,8 +564,8 @@ export class ActiveMessageBroker {
|
|
|
523
564
|
});
|
|
524
565
|
// 4. Format batch messages
|
|
525
566
|
let taskDescription;
|
|
526
|
-
const deliveryMode = this.deliveryModes.get(agentId) ||
|
|
527
|
-
if (deliveryMode ===
|
|
567
|
+
const deliveryMode = this.deliveryModes.get(agentId) || "batch";
|
|
568
|
+
if (deliveryMode === "single" || batch.length === 1) {
|
|
528
569
|
// Single message
|
|
529
570
|
taskDescription = batch[0].content;
|
|
530
571
|
this.logger.debug(`Processing single message from ${this.getDisplayName(batch[0].from)}`, {
|
|
@@ -540,7 +581,7 @@ export class ActiveMessageBroker {
|
|
|
540
581
|
else {
|
|
541
582
|
taskDescription = batch
|
|
542
583
|
.map((m, i) => `Message ${i + 1}:\n${m.content}`)
|
|
543
|
-
.join(
|
|
584
|
+
.join("\n\n---\n\n");
|
|
544
585
|
}
|
|
545
586
|
this.logger.debug(`Batched ${batch.length} messages into prompt`, {
|
|
546
587
|
agentId,
|
|
@@ -552,9 +593,9 @@ export class ActiveMessageBroker {
|
|
|
552
593
|
// 6. Start and track
|
|
553
594
|
const promise = agent.execute();
|
|
554
595
|
// Mark agent as active
|
|
555
|
-
this.setAgentStatus(agentId,
|
|
596
|
+
this.setAgentStatus(agentId, "active");
|
|
556
597
|
// Emit agent started event
|
|
557
|
-
this.emit(
|
|
598
|
+
this.emit("agent_started", {
|
|
558
599
|
agentId,
|
|
559
600
|
oduName: this.getODUName(agentId),
|
|
560
601
|
timestamp: Date.now(),
|
|
@@ -565,7 +606,7 @@ export class ActiveMessageBroker {
|
|
|
565
606
|
instance: agent,
|
|
566
607
|
promise,
|
|
567
608
|
startedAt: Date.now(),
|
|
568
|
-
status:
|
|
609
|
+
status: "active",
|
|
569
610
|
});
|
|
570
611
|
this.logger.info(`Agent ${agentId} started (status: active)`, {
|
|
571
612
|
agentId,
|
|
@@ -592,10 +633,10 @@ export class ActiveMessageBroker {
|
|
|
592
633
|
* meta-ia → meta-ia (keep IAs fully-qualified)
|
|
593
634
|
*/
|
|
594
635
|
getDisplayName(agentId) {
|
|
595
|
-
const parts = agentId.split(
|
|
596
|
-
if (parts.length >= 3 && parts[1] ===
|
|
636
|
+
const parts = agentId.split("-");
|
|
637
|
+
if (parts.length >= 3 && parts[1] === "ea") {
|
|
597
638
|
// EA: return task name part
|
|
598
|
-
return parts.slice(2).join(
|
|
639
|
+
return parts.slice(2).join("-");
|
|
599
640
|
}
|
|
600
641
|
// IA or other: return full name
|
|
601
642
|
return agentId;
|
|
@@ -606,11 +647,11 @@ export class ActiveMessageBroker {
|
|
|
606
647
|
onAgentComplete(agentId) {
|
|
607
648
|
this.logger.info(`Agent ${agentId} completed`, { agentId });
|
|
608
649
|
// Mark agent as idle
|
|
609
|
-
this.setAgentStatus(agentId,
|
|
650
|
+
this.setAgentStatus(agentId, "idle");
|
|
610
651
|
// Remove from running agents
|
|
611
652
|
this.runningAgents.delete(agentId);
|
|
612
653
|
// Emit agent completed event
|
|
613
|
-
this.emit(
|
|
654
|
+
this.emit("agent_completed", {
|
|
614
655
|
agentId,
|
|
615
656
|
oduName: this.getODUName(agentId),
|
|
616
657
|
timestamp: Date.now(),
|
|
@@ -638,7 +679,9 @@ export class ActiveMessageBroker {
|
|
|
638
679
|
});
|
|
639
680
|
}
|
|
640
681
|
else {
|
|
641
|
-
this.logger.debug(`Agent ${agentId} idle (no more messages)`, {
|
|
682
|
+
this.logger.debug(`Agent ${agentId} idle (no more messages)`, {
|
|
683
|
+
agentId,
|
|
684
|
+
});
|
|
642
685
|
}
|
|
643
686
|
}
|
|
644
687
|
/**
|
|
@@ -650,7 +693,7 @@ export class ActiveMessageBroker {
|
|
|
650
693
|
error: error.message,
|
|
651
694
|
});
|
|
652
695
|
// Mark agent as idle (failed, but can receive new messages)
|
|
653
|
-
this.setAgentStatus(agentId,
|
|
696
|
+
this.setAgentStatus(agentId, "idle");
|
|
654
697
|
// Remove from running
|
|
655
698
|
this.runningAgents.delete(agentId);
|
|
656
699
|
// Notify completion listeners with error
|
|
@@ -664,7 +707,9 @@ export class ActiveMessageBroker {
|
|
|
664
707
|
*/
|
|
665
708
|
notifyCompletion(agentId, result) {
|
|
666
709
|
const callbacks = this.completionCallbacks.get(agentId) || [];
|
|
667
|
-
callbacks.forEach(cb =>
|
|
710
|
+
callbacks.forEach((cb) => {
|
|
711
|
+
cb(result);
|
|
712
|
+
});
|
|
668
713
|
this.completionCallbacks.delete(agentId); // One-time callbacks
|
|
669
714
|
if (callbacks.length > 0) {
|
|
670
715
|
this.logger.debug(`Notified ${callbacks.length} listener(s) for ${agentId}`, {
|
|
@@ -693,7 +738,9 @@ export class ActiveMessageBroker {
|
|
|
693
738
|
}
|
|
694
739
|
catch {
|
|
695
740
|
// Interrupt causes early exit, that's expected
|
|
696
|
-
this.logger.debug(`Agent ${agentId} interrupted successfully`, {
|
|
741
|
+
this.logger.debug(`Agent ${agentId} interrupted successfully`, {
|
|
742
|
+
agentId,
|
|
743
|
+
});
|
|
697
744
|
}
|
|
698
745
|
// Remove from running
|
|
699
746
|
this.runningAgents.delete(agentId);
|
|
@@ -715,16 +762,16 @@ export class ActiveMessageBroker {
|
|
|
715
762
|
if (!this.queues.has(message.to)) {
|
|
716
763
|
this.queues.set(message.to, []);
|
|
717
764
|
}
|
|
718
|
-
this.queues.get(message.to)
|
|
765
|
+
this.queues.get(message.to)?.push(message);
|
|
719
766
|
this.sortQueue(message.to);
|
|
720
767
|
// Emit message queued event
|
|
721
|
-
this.emit(
|
|
768
|
+
this.emit("message_queued", {
|
|
722
769
|
messageId: message.id,
|
|
723
770
|
from: message.from,
|
|
724
771
|
to: message.to,
|
|
725
772
|
priority: message.priority,
|
|
726
773
|
timestamp: message.timestamp,
|
|
727
|
-
queueSize: this.queues.get(message.to)
|
|
774
|
+
queueSize: this.queues.get(message.to)?.length,
|
|
728
775
|
});
|
|
729
776
|
}
|
|
730
777
|
/**
|
|
@@ -752,7 +799,7 @@ export class ActiveMessageBroker {
|
|
|
752
799
|
* - 'meta-ia' → 'meta'
|
|
753
800
|
*/
|
|
754
801
|
getODUName(agentId) {
|
|
755
|
-
const parts = agentId.split(
|
|
802
|
+
const parts = agentId.split("-");
|
|
756
803
|
if (parts.length < 2) {
|
|
757
804
|
throw new Error(`Invalid agent ID format: ${agentId}`);
|
|
758
805
|
}
|
|
@@ -762,7 +809,7 @@ export class ActiveMessageBroker {
|
|
|
762
809
|
/**
|
|
763
810
|
* Load session from Nexus session store (new format)
|
|
764
811
|
*/
|
|
765
|
-
async loadSessionFromStore(
|
|
812
|
+
async loadSessionFromStore(_storePath, agentId) {
|
|
766
813
|
try {
|
|
767
814
|
const sessionKey = `agent:${agentId}`;
|
|
768
815
|
const agentIdNormalized = normalizeAgentId(DEFAULT_AGENT_ID);
|
|
@@ -771,7 +818,7 @@ export class ActiveMessageBroker {
|
|
|
771
818
|
return null;
|
|
772
819
|
}
|
|
773
820
|
// Load history from new format
|
|
774
|
-
const history = session.history.map(turn => ({
|
|
821
|
+
const history = session.history.map((turn) => ({
|
|
775
822
|
role: turn.role,
|
|
776
823
|
content: turn.content,
|
|
777
824
|
timestamp: new Date(turn.timestamp).getTime(),
|
|
@@ -792,7 +839,7 @@ export class ActiveMessageBroker {
|
|
|
792
839
|
* Register or update EA in session store (new format)
|
|
793
840
|
* EAs persist forever once created
|
|
794
841
|
*/
|
|
795
|
-
async registerEA(
|
|
842
|
+
async registerEA(_storePath, agentId, taskName) {
|
|
796
843
|
try {
|
|
797
844
|
const sessionKey = `agent:${agentId}`;
|
|
798
845
|
const agentIdNormalized = normalizeAgentId(DEFAULT_AGENT_ID);
|
|
@@ -815,13 +862,17 @@ export class ActiveMessageBroker {
|
|
|
815
862
|
sessionId: crypto.randomUUID(),
|
|
816
863
|
updatedAt: now,
|
|
817
864
|
displayName: taskName || displayName,
|
|
818
|
-
chatType:
|
|
865
|
+
chatType: "direct",
|
|
819
866
|
};
|
|
820
867
|
await writeSessionMetadata(agentIdNormalized, sessionKey, {
|
|
821
868
|
...newEntry,
|
|
822
869
|
created: new Date().toISOString(),
|
|
823
870
|
});
|
|
824
|
-
this.logger.info(`Registered new EA: ${agentId}`, {
|
|
871
|
+
this.logger.info(`Registered new EA: ${agentId}`, {
|
|
872
|
+
agentId,
|
|
873
|
+
oduName,
|
|
874
|
+
displayName,
|
|
875
|
+
});
|
|
825
876
|
}
|
|
826
877
|
}
|
|
827
878
|
catch (error) {
|
|
@@ -887,7 +938,7 @@ export class ActiveMessageBroker {
|
|
|
887
938
|
for (const [id] of this.registeredIAs.entries()) {
|
|
888
939
|
agents.push({
|
|
889
940
|
agentId: id,
|
|
890
|
-
type:
|
|
941
|
+
type: "ia",
|
|
891
942
|
status: this.getAgentStatus(id),
|
|
892
943
|
oduName: this.getODUName(id),
|
|
893
944
|
queueSize: this.getQueueSize(id),
|
|
@@ -898,7 +949,7 @@ export class ActiveMessageBroker {
|
|
|
898
949
|
for (const [id, runningAgent] of this.runningAgents.entries()) {
|
|
899
950
|
agents.push({
|
|
900
951
|
agentId: id,
|
|
901
|
-
type:
|
|
952
|
+
type: "ea",
|
|
902
953
|
status: runningAgent.status,
|
|
903
954
|
oduName: this.getODUName(id),
|
|
904
955
|
queueSize: this.getQueueSize(id),
|
|
@@ -907,11 +958,13 @@ export class ActiveMessageBroker {
|
|
|
907
958
|
}
|
|
908
959
|
// Add queued agents that aren't running
|
|
909
960
|
for (const [id, queue] of this.queues.entries()) {
|
|
910
|
-
if (!this.runningAgents.has(id) &&
|
|
961
|
+
if (!this.runningAgents.has(id) &&
|
|
962
|
+
!this.registeredIAs.has(id) &&
|
|
963
|
+
queue.length > 0) {
|
|
911
964
|
agents.push({
|
|
912
965
|
agentId: id,
|
|
913
|
-
type:
|
|
914
|
-
status:
|
|
966
|
+
type: "ea",
|
|
967
|
+
status: "idle",
|
|
915
968
|
oduName: this.getODUName(id),
|
|
916
969
|
queueSize: queue.length,
|
|
917
970
|
isRunning: false,
|
|
@@ -933,7 +986,7 @@ export class ActiveMessageBroker {
|
|
|
933
986
|
if (!this.eventListeners.has(event)) {
|
|
934
987
|
this.eventListeners.set(event, []);
|
|
935
988
|
}
|
|
936
|
-
this.eventListeners.get(event)
|
|
989
|
+
this.eventListeners.get(event)?.push(callback);
|
|
937
990
|
}
|
|
938
991
|
/**
|
|
939
992
|
* Unsubscribe from broker events
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import Anthropic from "@anthropic-ai/sdk";
|
|
2
1
|
import fs from "node:fs";
|
|
3
2
|
import os from "node:os";
|
|
4
3
|
import path from "node:path";
|
|
4
|
+
import Anthropic from "@anthropic-ai/sdk";
|
|
5
5
|
import { compactEmbeddedPiSession, } from "../agents/pi-embedded-runner.js";
|
|
6
6
|
import { archiveHistory, loadHistory, resolveSessionDir, writeSummary, } from "../config/sessions.js";
|
|
7
7
|
import { createSubsystemLogger } from "../logging.js";
|
|
@@ -133,9 +133,7 @@ function partitionHistory(history, keepRecentMessages, keepRecentTokens) {
|
|
|
133
133
|
for (let i = history.length - 1; i >= 0; i--) {
|
|
134
134
|
const turn = history[i];
|
|
135
135
|
const estimatedTokens = Math.ceil((turn.content?.length ?? 0) / 4 +
|
|
136
|
-
(turn.tool_calls
|
|
137
|
-
? JSON.stringify(turn.tool_calls).length / 4
|
|
138
|
-
: 0));
|
|
136
|
+
(turn.tool_calls ? JSON.stringify(turn.tool_calls).length / 4 : 0));
|
|
139
137
|
tokenCount += estimatedTokens;
|
|
140
138
|
if (tokenCount > keepRecentTokens) {
|
|
141
139
|
// Found the split point
|
|
@@ -251,7 +249,7 @@ ${summaryText}
|
|
|
251
249
|
log.debug(`Cleaned up temp history file: ${tmpFilePath}`);
|
|
252
250
|
}
|
|
253
251
|
catch (error) {
|
|
254
|
-
log.warn(`Failed to clean up temp history file ${tmpFilePath}: ${error}`);
|
|
252
|
+
log.warn(`Failed to clean up temp history file ${tmpFilePath}: ${String(error)}`);
|
|
255
253
|
}
|
|
256
254
|
}
|
|
257
255
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Factory for creating the appropriate AgentControlPlane implementation
|
|
3
3
|
* based on configuration.
|
|
4
4
|
*/
|
|
5
|
-
import { SingleAgentControlPlane } from "./single-agent.js";
|
|
6
5
|
import { ODUControlPlane } from "./odu-control-plane.js";
|
|
6
|
+
import { SingleAgentControlPlane } from "./single-agent.js";
|
|
7
7
|
/**
|
|
8
8
|
* Creates an AgentControlPlane instance based on the config.
|
|
9
9
|
*
|
|
@@ -26,6 +26,6 @@ export function createControlPlane(options) {
|
|
|
26
26
|
workspaceDir: options?.workspaceDir,
|
|
27
27
|
});
|
|
28
28
|
default:
|
|
29
|
-
throw new Error(`Unknown control plane mode: ${mode}. Valid modes: 'single', 'odu'`);
|
|
29
|
+
throw new Error(`Unknown control plane mode: ${String(mode)}. Valid modes: 'single', 'odu'`);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* and routing messages. It allows switching between different orchestration
|
|
6
6
|
* strategies without changing the Gateway (Access Plane) code.
|
|
7
7
|
*/
|
|
8
|
-
export {
|
|
8
|
+
export { createControlPlane, } from "./factory.js";
|
|
9
9
|
export { ODUControlPlane } from "./odu-control-plane.js";
|
|
10
|
-
export {
|
|
10
|
+
export { SingleAgentControlPlane } from "./single-agent.js";
|