@phnx-labs/agents-cli 0.1.0 → 1.14.1
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 +7 -1
- package/README.md +283 -372
- package/dist/commands/alias.d.ts +11 -0
- package/dist/commands/alias.js +117 -0
- package/dist/commands/beta.d.ts +2 -0
- package/dist/commands/beta.js +53 -0
- package/dist/commands/cloud.d.ts +8 -1
- package/dist/commands/cloud.js +108 -22
- package/dist/commands/commands.d.ts +9 -1
- package/dist/commands/commands.js +24 -172
- package/dist/commands/daemon.d.ts +8 -1
- package/dist/commands/daemon.js +13 -5
- package/dist/commands/doctor.d.ts +15 -0
- package/dist/commands/doctor.js +132 -0
- package/dist/commands/drive.d.ts +8 -1
- package/dist/commands/drive.js +20 -3
- package/dist/commands/exec.d.ts +8 -1
- package/dist/commands/exec.js +96 -27
- package/dist/commands/factory.d.ts +19 -0
- package/dist/commands/factory.js +71 -0
- package/dist/commands/fork.d.ts +8 -1
- package/dist/commands/fork.js +11 -4
- package/dist/commands/hooks.d.ts +9 -1
- package/dist/commands/hooks.js +30 -182
- package/dist/commands/init.d.ts +15 -1
- package/dist/commands/init.js +168 -74
- package/dist/commands/mcp.d.ts +9 -1
- package/dist/commands/mcp.js +11 -7
- package/dist/commands/models.d.ts +8 -1
- package/dist/commands/models.js +16 -4
- package/dist/commands/packages.d.ts +8 -1
- package/dist/commands/packages.js +13 -7
- package/dist/commands/permissions.d.ts +9 -1
- package/dist/commands/permissions.js +3 -3
- package/dist/commands/plugins.d.ts +8 -1
- package/dist/commands/plugins.js +13 -2
- package/dist/commands/profiles.d.ts +9 -1
- package/dist/commands/profiles.js +56 -7
- package/dist/commands/prune.d.ts +22 -0
- package/dist/commands/prune.js +191 -0
- package/dist/commands/pty.d.ts +1 -1
- package/dist/commands/pty.js +2 -1
- package/dist/commands/pull.d.ts +8 -1
- package/dist/commands/pull.js +58 -128
- package/dist/commands/refresh-memory.d.ts +7 -1
- package/dist/commands/refresh-memory.js +7 -1
- package/dist/commands/repo.d.ts +15 -0
- package/dist/commands/repo.js +570 -0
- package/dist/commands/resource-view.d.ts +10 -3
- package/dist/commands/resource-view.js +18 -5
- package/dist/commands/routines.d.ts +8 -1
- package/dist/commands/routines.js +17 -4
- package/dist/commands/rules.d.ts +9 -1
- package/dist/commands/rules.js +16 -11
- package/dist/commands/secrets.d.ts +8 -1
- package/dist/commands/secrets.js +235 -63
- package/dist/commands/sessions-picker.d.ts +2 -1
- package/dist/commands/sessions-picker.js +88 -11
- package/dist/commands/sessions-tail.d.ts +19 -0
- package/dist/commands/sessions-tail.js +235 -0
- package/dist/commands/sessions.d.ts +2 -1
- package/dist/commands/sessions.js +188 -7
- package/dist/commands/skills.d.ts +9 -1
- package/dist/commands/skills.js +28 -178
- package/dist/commands/status.d.ts +7 -1
- package/dist/commands/status.js +7 -1
- package/dist/commands/subagents.d.ts +8 -1
- package/dist/commands/subagents.js +11 -1
- package/dist/commands/sync.d.ts +8 -1
- package/dist/commands/sync.js +8 -1
- package/dist/commands/teams-picker.d.ts +4 -1
- package/dist/commands/teams-picker.js +55 -3
- package/dist/commands/teams.d.ts +15 -1
- package/dist/commands/teams.js +323 -69
- package/dist/commands/usage.d.ts +11 -0
- package/dist/commands/usage.js +60 -0
- package/dist/commands/utils.d.ts +6 -1
- package/dist/commands/utils.js +6 -1
- package/dist/commands/versions.d.ts +8 -1
- package/dist/commands/versions.js +4 -3
- package/dist/commands/view.d.ts +47 -2
- package/dist/commands/view.js +317 -24
- package/dist/index.d.ts +7 -2
- package/dist/index.js +172 -34
- package/dist/lib/acp/client.d.ts +31 -0
- package/dist/lib/acp/client.js +117 -0
- package/dist/lib/acp/harnesses.d.ts +26 -0
- package/dist/lib/acp/harnesses.js +65 -0
- package/dist/lib/acp/run.d.ts +18 -0
- package/dist/lib/acp/run.js +39 -0
- package/dist/lib/agents.d.ts +74 -2
- package/dist/lib/agents.js +197 -21
- package/dist/lib/artifact-actions.d.ts +8 -4
- package/dist/lib/artifact-actions.js +8 -6
- package/dist/lib/auto-pull-worker.d.ts +11 -0
- package/dist/lib/auto-pull-worker.js +121 -0
- package/dist/lib/auto-pull.d.ts +31 -0
- package/dist/lib/auto-pull.js +97 -0
- package/dist/lib/beta.d.ts +23 -0
- package/dist/lib/beta.js +90 -0
- package/dist/lib/capabilities.d.ts +29 -0
- package/dist/lib/capabilities.js +74 -0
- package/dist/lib/cloud/codex.d.ts +9 -3
- package/dist/lib/cloud/codex.js +53 -13
- package/dist/lib/cloud/factory.d.ts +8 -3
- package/dist/lib/cloud/factory.js +19 -3
- package/dist/lib/cloud/registry.d.ts +10 -1
- package/dist/lib/cloud/registry.js +14 -3
- package/dist/lib/cloud/rush.d.ts +63 -3
- package/dist/lib/cloud/rush.js +273 -20
- package/dist/lib/cloud/store.d.ts +13 -1
- package/dist/lib/cloud/store.js +23 -4
- package/dist/lib/cloud/stream.d.ts +6 -1
- package/dist/lib/cloud/stream.js +95 -39
- package/dist/lib/cloud/types.d.ts +153 -8
- package/dist/lib/cloud/types.js +34 -2
- package/dist/lib/command-skills.d.ts +20 -0
- package/dist/lib/command-skills.js +142 -0
- package/dist/lib/commands.d.ts +22 -2
- package/dist/lib/commands.js +51 -11
- package/dist/lib/convert.d.ts +10 -1
- package/dist/lib/convert.js +9 -1
- package/dist/lib/daemon.d.ts +21 -1
- package/dist/lib/daemon.js +97 -4
- package/dist/lib/drive-sync.d.ts +18 -1
- package/dist/lib/drive-sync.js +57 -15
- package/dist/lib/exec.d.ts +23 -6
- package/dist/lib/exec.js +53 -17
- package/dist/lib/fs-walk.d.ts +2 -0
- package/dist/lib/fs-walk.js +40 -0
- package/dist/lib/fuzzy.d.ts +53 -0
- package/dist/lib/fuzzy.js +72 -0
- package/dist/lib/gemini-settings.d.ts +4 -0
- package/dist/lib/gemini-settings.js +33 -0
- package/dist/lib/git.d.ts +12 -2
- package/dist/lib/git.js +17 -6
- package/dist/lib/help.d.ts +20 -1
- package/dist/lib/help.js +45 -6
- package/dist/lib/hooks/match.d.ts +32 -0
- package/dist/lib/hooks/match.js +120 -0
- package/dist/lib/hooks.d.ts +17 -4
- package/dist/lib/hooks.js +119 -101
- package/dist/lib/manifest.d.ts +6 -1
- package/dist/lib/manifest.js +15 -4
- package/dist/lib/markdown.d.ts +0 -1
- package/dist/lib/markdown.js +6 -1
- package/dist/lib/mcp.d.ts +0 -1
- package/dist/lib/mcp.js +29 -33
- package/dist/lib/memory-compile.d.ts +13 -3
- package/dist/lib/memory-compile.js +31 -9
- package/dist/lib/memory.d.ts +14 -7
- package/dist/lib/memory.js +67 -38
- package/dist/lib/migrate.d.ts +8 -0
- package/dist/lib/migrate.js +85 -0
- package/dist/lib/models.d.ts +10 -4
- package/dist/lib/models.js +36 -15
- package/dist/lib/onepassword.d.ts +63 -0
- package/dist/lib/onepassword.js +186 -0
- package/dist/lib/paths.d.ts +8 -0
- package/dist/lib/paths.js +20 -0
- package/dist/lib/permissions.d.ts +24 -2
- package/dist/lib/permissions.js +117 -48
- package/dist/lib/picker.d.ts +10 -1
- package/dist/lib/picker.js +15 -1
- package/dist/lib/plugins.d.ts +7 -1
- package/dist/lib/plugins.js +10 -1
- package/dist/lib/profiles-presets.d.ts +10 -1
- package/dist/lib/profiles-presets.js +9 -1
- package/dist/lib/profiles.d.ts +35 -1
- package/dist/lib/profiles.js +36 -15
- package/dist/lib/pty-client.d.ts +1 -1
- package/dist/lib/pty-client.js +0 -1
- package/dist/lib/pty-server.d.ts +16 -2
- package/dist/lib/pty-server.js +92 -3
- package/dist/lib/registry.d.ts +23 -3
- package/dist/lib/registry.js +153 -8
- package/dist/lib/resources.d.ts +28 -1
- package/dist/lib/resources.js +79 -1
- package/dist/lib/rotate.d.ts +40 -13
- package/dist/lib/rotate.js +238 -40
- package/dist/lib/routines.d.ts +29 -1
- package/dist/lib/routines.js +32 -5
- package/dist/lib/runner.d.ts +14 -1
- package/dist/lib/runner.js +22 -3
- package/dist/lib/sandbox.d.ts +16 -1
- package/dist/lib/sandbox.js +39 -16
- package/dist/lib/scheduler.d.ts +8 -1
- package/dist/lib/scheduler.js +8 -1
- package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
- package/dist/lib/{secrets-bundles.d.ts → secrets/bundles.d.ts} +12 -2
- package/dist/lib/{secrets-bundles.js → secrets/bundles.js} +38 -17
- package/dist/lib/secrets/index.d.ts +55 -0
- package/dist/lib/secrets/index.js +211 -0
- package/dist/lib/secrets/profiles.d.ts +10 -0
- package/dist/lib/secrets/profiles.js +13 -0
- package/dist/lib/session/active.d.ts +43 -0
- package/dist/lib/session/active.js +392 -0
- package/dist/lib/session/artifacts.d.ts +12 -1
- package/dist/lib/session/artifacts.js +25 -5
- package/dist/lib/session/cloud.d.ts +30 -0
- package/dist/lib/session/cloud.js +121 -0
- package/dist/lib/session/db.d.ts +23 -2
- package/dist/lib/session/db.js +76 -12
- package/dist/lib/session/discover.d.ts +19 -4
- package/dist/lib/session/discover.js +344 -48
- package/dist/lib/session/parse.d.ts +28 -1
- package/dist/lib/session/parse.js +267 -9
- package/dist/lib/session/prompt.d.ts +9 -1
- package/dist/lib/session/prompt.js +17 -3
- package/dist/lib/session/render.d.ts +13 -1
- package/dist/lib/session/render.js +20 -1
- package/dist/lib/session/team-filter.d.ts +9 -1
- package/dist/lib/session/team-filter.js +11 -2
- package/dist/lib/session/types.d.ts +16 -2
- package/dist/lib/session/types.js +10 -2
- package/dist/lib/shims.d.ts +64 -5
- package/dist/lib/shims.js +309 -47
- package/dist/lib/skills.d.ts +27 -2
- package/dist/lib/skills.js +127 -65
- package/dist/lib/sqlite.d.ts +43 -0
- package/dist/lib/sqlite.js +94 -0
- package/dist/lib/state.d.ts +112 -27
- package/dist/lib/state.js +320 -148
- package/dist/lib/subagents.d.ts +9 -1
- package/dist/lib/subagents.js +70 -63
- package/dist/lib/sync-manifest.d.ts +81 -0
- package/dist/lib/sync-manifest.js +450 -0
- package/dist/lib/teams/agents.d.ts +103 -5
- package/dist/lib/teams/agents.js +414 -91
- package/dist/lib/teams/api.d.ts +26 -3
- package/dist/lib/teams/api.js +63 -3
- package/dist/lib/teams/debug.d.ts +6 -1
- package/dist/lib/teams/debug.js +6 -1
- package/dist/lib/teams/file_ops.d.ts +7 -1
- package/dist/lib/teams/file_ops.js +7 -1
- package/dist/lib/teams/index.d.ts +15 -0
- package/dist/lib/teams/index.js +14 -0
- package/dist/lib/teams/parsers.d.ts +4 -1
- package/dist/lib/teams/parsers.js +11 -1
- package/dist/lib/teams/persistence.d.ts +15 -1
- package/dist/lib/teams/persistence.js +102 -20
- package/dist/lib/teams/registry.d.ts +12 -1
- package/dist/lib/teams/registry.js +116 -33
- package/dist/lib/teams/summarizer.d.ts +15 -1
- package/dist/lib/teams/summarizer.js +14 -1
- package/dist/lib/teams/supervisor.d.ts +48 -0
- package/dist/lib/teams/supervisor.js +73 -0
- package/dist/lib/template.d.ts +8 -6
- package/dist/lib/template.js +8 -6
- package/dist/lib/types.d.ts +147 -8
- package/dist/lib/types.js +26 -3
- package/dist/lib/usage.d.ts +32 -1
- package/dist/lib/usage.js +70 -6
- package/dist/lib/version-duplicates.d.ts +21 -0
- package/dist/lib/version-duplicates.js +90 -0
- package/dist/lib/versions.d.ts +33 -4
- package/dist/lib/versions.js +376 -108
- package/package.json +32 -17
- package/scripts/postinstall.js +126 -30
- package/dist/commands/__tests__/sessions.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions.test.js +0 -636
- package/dist/commands/__tests__/sessions.test.js.map +0 -1
- package/dist/commands/cloud.d.ts.map +0 -1
- package/dist/commands/cloud.js.map +0 -1
- package/dist/commands/commands.d.ts.map +0 -1
- package/dist/commands/commands.js.map +0 -1
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/fork.d.ts.map +0 -1
- package/dist/commands/fork.js.map +0 -1
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/packages.d.ts.map +0 -1
- package/dist/commands/packages.js.map +0 -1
- package/dist/commands/permissions.d.ts.map +0 -1
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/profiles.d.ts.map +0 -1
- package/dist/commands/profiles.js.map +0 -1
- package/dist/commands/pty.d.ts.map +0 -1
- package/dist/commands/pty.js.map +0 -1
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -3
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -180
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/refresh-memory.d.ts.map +0 -1
- package/dist/commands/refresh-memory.js.map +0 -1
- package/dist/commands/resource-view.d.ts.map +0 -1
- package/dist/commands/resource-view.js.map +0 -1
- package/dist/commands/routines.d.ts.map +0 -1
- package/dist/commands/routines.js.map +0 -1
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/sessions-picker.d.ts.map +0 -1
- package/dist/commands/sessions-picker.js.map +0 -1
- package/dist/commands/sessions.d.ts.map +0 -1
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/subagents.d.ts.map +0 -1
- package/dist/commands/subagents.js.map +0 -1
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/teams-picker.d.ts.map +0 -1
- package/dist/commands/teams-picker.js.map +0 -1
- package/dist/commands/teams.d.ts.map +0 -1
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/commands/versions.d.ts.map +0 -1
- package/dist/commands/versions.js.map +0 -1
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
- package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.js +0 -192
- package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
- package/dist/lib/__tests__/exec.test.d.ts +0 -2
- package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
- package/dist/lib/__tests__/exec.test.js +0 -446
- package/dist/lib/__tests__/exec.test.js.map +0 -1
- package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
- package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
- package/dist/lib/__tests__/git-sync.test.js +0 -138
- package/dist/lib/__tests__/git-sync.test.js.map +0 -1
- package/dist/lib/__tests__/hooks.test.d.ts +0 -2
- package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
- package/dist/lib/__tests__/hooks.test.js +0 -203
- package/dist/lib/__tests__/hooks.test.js.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
- package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.js +0 -95
- package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
- package/dist/lib/__tests__/models.test.d.ts +0 -2
- package/dist/lib/__tests__/models.test.d.ts.map +0 -1
- package/dist/lib/__tests__/models.test.js +0 -239
- package/dist/lib/__tests__/models.test.js.map +0 -1
- package/dist/lib/__tests__/rotate.test.d.ts +0 -2
- package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
- package/dist/lib/__tests__/rotate.test.js +0 -80
- package/dist/lib/__tests__/rotate.test.js.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
- package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
- package/dist/lib/__tests__/secrets.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets.test.js +0 -90
- package/dist/lib/__tests__/secrets.test.js.map +0 -1
- package/dist/lib/__tests__/shims.test.d.ts +0 -2
- package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
- package/dist/lib/__tests__/shims.test.js +0 -39
- package/dist/lib/__tests__/shims.test.js.map +0 -1
- package/dist/lib/__tests__/usage.test.d.ts +0 -2
- package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
- package/dist/lib/__tests__/usage.test.js +0 -220
- package/dist/lib/__tests__/usage.test.js.map +0 -1
- package/dist/lib/__tests__/versions.test.d.ts +0 -2
- package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
- package/dist/lib/__tests__/versions.test.js +0 -63
- package/dist/lib/__tests__/versions.test.js.map +0 -1
- package/dist/lib/agents.d.ts.map +0 -1
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/artifact-actions.d.ts.map +0 -1
- package/dist/lib/artifact-actions.js.map +0 -1
- package/dist/lib/cloud/codex.d.ts.map +0 -1
- package/dist/lib/cloud/codex.js.map +0 -1
- package/dist/lib/cloud/factory.d.ts.map +0 -1
- package/dist/lib/cloud/factory.js.map +0 -1
- package/dist/lib/cloud/registry.d.ts.map +0 -1
- package/dist/lib/cloud/registry.js.map +0 -1
- package/dist/lib/cloud/rush.d.ts.map +0 -1
- package/dist/lib/cloud/rush.js.map +0 -1
- package/dist/lib/cloud/store.d.ts.map +0 -1
- package/dist/lib/cloud/store.js.map +0 -1
- package/dist/lib/cloud/stream.d.ts.map +0 -1
- package/dist/lib/cloud/stream.js.map +0 -1
- package/dist/lib/cloud/types.d.ts.map +0 -1
- package/dist/lib/cloud/types.js.map +0 -1
- package/dist/lib/commands.d.ts.map +0 -1
- package/dist/lib/commands.js.map +0 -1
- package/dist/lib/convert.d.ts.map +0 -1
- package/dist/lib/convert.js.map +0 -1
- package/dist/lib/daemon.d.ts.map +0 -1
- package/dist/lib/daemon.js.map +0 -1
- package/dist/lib/drive-sync.d.ts.map +0 -1
- package/dist/lib/drive-sync.js.map +0 -1
- package/dist/lib/exec.d.ts.map +0 -1
- package/dist/lib/exec.js.map +0 -1
- package/dist/lib/factory.d.ts +0 -57
- package/dist/lib/factory.d.ts.map +0 -1
- package/dist/lib/factory.js +0 -110
- package/dist/lib/factory.js.map +0 -1
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/help.d.ts.map +0 -1
- package/dist/lib/help.js.map +0 -1
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/manifest.d.ts.map +0 -1
- package/dist/lib/manifest.js.map +0 -1
- package/dist/lib/markdown.d.ts.map +0 -1
- package/dist/lib/markdown.js.map +0 -1
- package/dist/lib/mcp.d.ts.map +0 -1
- package/dist/lib/mcp.js.map +0 -1
- package/dist/lib/memory-compile.d.ts.map +0 -1
- package/dist/lib/memory-compile.js.map +0 -1
- package/dist/lib/memory.d.ts.map +0 -1
- package/dist/lib/memory.js.map +0 -1
- package/dist/lib/models.d.ts.map +0 -1
- package/dist/lib/models.js.map +0 -1
- package/dist/lib/permissions.d.ts.map +0 -1
- package/dist/lib/permissions.js.map +0 -1
- package/dist/lib/picker.d.ts.map +0 -1
- package/dist/lib/picker.js.map +0 -1
- package/dist/lib/plugins.d.ts.map +0 -1
- package/dist/lib/plugins.js.map +0 -1
- package/dist/lib/profiles-keychain.d.ts +0 -3
- package/dist/lib/profiles-keychain.d.ts.map +0 -1
- package/dist/lib/profiles-keychain.js +0 -10
- package/dist/lib/profiles-keychain.js.map +0 -1
- package/dist/lib/profiles-presets.d.ts.map +0 -1
- package/dist/lib/profiles-presets.js.map +0 -1
- package/dist/lib/profiles.d.ts.map +0 -1
- package/dist/lib/profiles.js.map +0 -1
- package/dist/lib/pty-client.d.ts.map +0 -1
- package/dist/lib/pty-client.js.map +0 -1
- package/dist/lib/pty-server.d.ts.map +0 -1
- package/dist/lib/pty-server.js.map +0 -1
- package/dist/lib/registry.d.ts.map +0 -1
- package/dist/lib/registry.js.map +0 -1
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.js.map +0 -1
- package/dist/lib/rotate.d.ts.map +0 -1
- package/dist/lib/rotate.js.map +0 -1
- package/dist/lib/routines.d.ts.map +0 -1
- package/dist/lib/routines.js.map +0 -1
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.js.map +0 -1
- package/dist/lib/sandbox.d.ts.map +0 -1
- package/dist/lib/sandbox.js.map +0 -1
- package/dist/lib/scheduler.d.ts.map +0 -1
- package/dist/lib/scheduler.js.map +0 -1
- package/dist/lib/secrets-bundles.d.ts.map +0 -1
- package/dist/lib/secrets-bundles.js.map +0 -1
- package/dist/lib/secrets.d.ts +0 -27
- package/dist/lib/secrets.d.ts.map +0 -1
- package/dist/lib/secrets.js +0 -127
- package/dist/lib/secrets.js.map +0 -1
- package/dist/lib/session/__tests__/db.test.d.ts +0 -2
- package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/db.test.js +0 -54
- package/dist/lib/session/__tests__/db.test.js.map +0 -1
- package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
- package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/discover.test.js +0 -63
- package/dist/lib/session/__tests__/discover.test.js.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
- package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.js +0 -44
- package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
- package/dist/lib/session/__tests__/render.test.d.ts +0 -2
- package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/render.test.js +0 -602
- package/dist/lib/session/__tests__/render.test.js.map +0 -1
- package/dist/lib/session/artifacts.d.ts.map +0 -1
- package/dist/lib/session/artifacts.js.map +0 -1
- package/dist/lib/session/db.d.ts.map +0 -1
- package/dist/lib/session/db.js.map +0 -1
- package/dist/lib/session/discover.d.ts.map +0 -1
- package/dist/lib/session/discover.js.map +0 -1
- package/dist/lib/session/parse.d.ts.map +0 -1
- package/dist/lib/session/parse.js.map +0 -1
- package/dist/lib/session/prompt.d.ts.map +0 -1
- package/dist/lib/session/prompt.js.map +0 -1
- package/dist/lib/session/prompt.test.d.ts +0 -2
- package/dist/lib/session/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/prompt.test.js +0 -57
- package/dist/lib/session/prompt.test.js.map +0 -1
- package/dist/lib/session/render.d.ts.map +0 -1
- package/dist/lib/session/render.js.map +0 -1
- package/dist/lib/session/team-filter.d.ts.map +0 -1
- package/dist/lib/session/team-filter.js.map +0 -1
- package/dist/lib/session/team-filter.test.d.ts +0 -2
- package/dist/lib/session/team-filter.test.d.ts.map +0 -1
- package/dist/lib/session/team-filter.test.js +0 -157
- package/dist/lib/session/team-filter.test.js.map +0 -1
- package/dist/lib/session/types.d.ts.map +0 -1
- package/dist/lib/session/types.js.map +0 -1
- package/dist/lib/shims.d.ts.map +0 -1
- package/dist/lib/shims.js.map +0 -1
- package/dist/lib/skills.d.ts.map +0 -1
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/subagents.d.ts.map +0 -1
- package/dist/lib/subagents.js.map +0 -1
- package/dist/lib/teams/agents.d.ts.map +0 -1
- package/dist/lib/teams/agents.js.map +0 -1
- package/dist/lib/teams/api.d.ts.map +0 -1
- package/dist/lib/teams/api.js.map +0 -1
- package/dist/lib/teams/cloud.d.ts +0 -11
- package/dist/lib/teams/cloud.d.ts.map +0 -1
- package/dist/lib/teams/cloud.js +0 -169
- package/dist/lib/teams/cloud.js.map +0 -1
- package/dist/lib/teams/debug.d.ts.map +0 -1
- package/dist/lib/teams/debug.js.map +0 -1
- package/dist/lib/teams/file_ops.d.ts.map +0 -1
- package/dist/lib/teams/file_ops.js.map +0 -1
- package/dist/lib/teams/parsers.d.ts.map +0 -1
- package/dist/lib/teams/parsers.js.map +0 -1
- package/dist/lib/teams/persistence.d.ts.map +0 -1
- package/dist/lib/teams/persistence.js.map +0 -1
- package/dist/lib/teams/ralph.d.ts +0 -8
- package/dist/lib/teams/ralph.d.ts.map +0 -1
- package/dist/lib/teams/ralph.js +0 -59
- package/dist/lib/teams/ralph.js.map +0 -1
- package/dist/lib/teams/registry.d.ts.map +0 -1
- package/dist/lib/teams/registry.js.map +0 -1
- package/dist/lib/teams/summarizer.d.ts.map +0 -1
- package/dist/lib/teams/summarizer.js.map +0 -1
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/usage.d.ts.map +0 -1
- package/dist/lib/usage.js.map +0 -1
- package/dist/lib/versions.d.ts.map +0 -1
- package/dist/lib/versions.js.map +0 -1
- package/scripts/rebuild-sqlite.sh +0 -46
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless ACP runner.
|
|
3
|
+
*
|
|
4
|
+
* Glue between the `agents run <agent> "prompt" --acp` command and the ACP
|
|
5
|
+
* client. Emits either a human-readable stream of agent messages or newline-
|
|
6
|
+
* delimited JSON events, depending on `--json`.
|
|
7
|
+
*/
|
|
8
|
+
import { runAcp } from './client.js';
|
|
9
|
+
/** Runs a prompt turn over ACP, streaming output to stdout per `json` mode. */
|
|
10
|
+
export async function runAcpHeadless(opts) {
|
|
11
|
+
const onUpdate = opts.json ? emitJsonLine : emitTextChunk;
|
|
12
|
+
const result = await runAcp({
|
|
13
|
+
agent: opts.agent,
|
|
14
|
+
prompt: opts.prompt,
|
|
15
|
+
cwd: opts.cwd,
|
|
16
|
+
mode: opts.mode,
|
|
17
|
+
onUpdate,
|
|
18
|
+
});
|
|
19
|
+
if (opts.json) {
|
|
20
|
+
emitJsonLine({
|
|
21
|
+
sessionId: result.sessionId,
|
|
22
|
+
update: { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: '' } },
|
|
23
|
+
_meta: { stopReason: result.stopReason },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
process.stdout.write('\n');
|
|
28
|
+
}
|
|
29
|
+
return result.stopReason === 'end_turn' ? 0 : 1;
|
|
30
|
+
}
|
|
31
|
+
function emitJsonLine(n) {
|
|
32
|
+
process.stdout.write(JSON.stringify(n) + '\n');
|
|
33
|
+
}
|
|
34
|
+
function emitTextChunk(n) {
|
|
35
|
+
const upd = n.update;
|
|
36
|
+
if (upd.sessionUpdate === 'agent_message_chunk' && upd.content.type === 'text') {
|
|
37
|
+
process.stdout.write(upd.content.text);
|
|
38
|
+
}
|
|
39
|
+
}
|
package/dist/lib/agents.d.ts
CHANGED
|
@@ -1,29 +1,74 @@
|
|
|
1
1
|
import type { AgentConfig, AgentId } from './types.js';
|
|
2
|
+
/** Represents the installation state of an agent's CLI binary. */
|
|
2
3
|
export interface CliState {
|
|
3
4
|
installed: boolean;
|
|
4
5
|
version: string | null;
|
|
5
6
|
path: string | null;
|
|
6
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* Minimum Codex CLI version that supports hooks.
|
|
10
|
+
* Mirrored on `AGENTS.codex.capabilities.hooks.since` -- kept exported for
|
|
11
|
+
* legacy import sites that haven't migrated to `supports()` yet.
|
|
12
|
+
*/
|
|
7
13
|
export declare const CODEX_HOOKS_MIN_VERSION = "0.116.0";
|
|
14
|
+
/** Minimum Gemini CLI version that supports the hooks system (v0.26.0, Jan 2026). */
|
|
15
|
+
export declare const GEMINI_HOOKS_MIN_VERSION = "0.26.0";
|
|
16
|
+
/**
|
|
17
|
+
* Master registry of all supported agents keyed by AgentId.
|
|
18
|
+
*
|
|
19
|
+
* Each entry defines the agent's CLI command, npm package, config directory layout,
|
|
20
|
+
* instructions file name, slash-command format, and capability flags. This is the
|
|
21
|
+
* single source of truth for agent metadata consumed throughout the codebase.
|
|
22
|
+
*/
|
|
8
23
|
export declare const AGENTS: Record<AgentId, AgentConfig>;
|
|
24
|
+
/** All registered agent IDs derived from the AGENTS registry. */
|
|
9
25
|
export declare const ALL_AGENT_IDS: AgentId[];
|
|
26
|
+
/** Agents that support MCP (Model Context Protocol) server integration. */
|
|
10
27
|
export declare const MCP_CAPABLE_AGENTS: AgentId[];
|
|
28
|
+
/** Agents that support skills (SKILL.md + rules/ bundles). */
|
|
11
29
|
export declare const SKILLS_CAPABLE_AGENTS: AgentId[];
|
|
30
|
+
/** Agents that support file-based slash commands. */
|
|
12
31
|
export declare const COMMANDS_CAPABLE_AGENTS: AgentId[];
|
|
13
|
-
|
|
32
|
+
/** Agents that support event hooks (pre/post lifecycle callbacks). */
|
|
33
|
+
export declare const HOOKS_CAPABLE_AGENTS: readonly AgentId[];
|
|
34
|
+
/** Agents that support the plugin system. */
|
|
14
35
|
export declare const PLUGINS_CAPABLE_AGENTS: AgentId[];
|
|
15
36
|
/** Get the chalk color function for an agent. Works for any AgentId or SessionAgentId. */
|
|
16
37
|
export declare function colorAgent(agentId: string): (s: string) => string;
|
|
17
38
|
/** Return the agent's display name, colored. */
|
|
18
39
|
export declare function agentLabel(agentId: string): string;
|
|
40
|
+
/** Check whether the given agent's CLI binary is present on PATH. */
|
|
19
41
|
export declare function isCliInstalled(agentId: AgentId): Promise<boolean>;
|
|
42
|
+
/** Return the installed CLI version for the given agent, or null if not found. */
|
|
20
43
|
export declare function getCliVersion(agentId: AgentId): Promise<string | null>;
|
|
44
|
+
/** Return the absolute path to the agent's CLI binary on PATH, or null. */
|
|
21
45
|
export declare function getCliPath(agentId: AgentId): Promise<string | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the full CLI state for an agent: whether it is installed, its version,
|
|
48
|
+
* and the path to the binary. Checks version-managed installs first, then falls
|
|
49
|
+
* back to a plain PATH lookup.
|
|
50
|
+
*/
|
|
22
51
|
export declare function getCliState(agentId: AgentId): Promise<CliState>;
|
|
52
|
+
/** Resolve CLI state for all registered agents in parallel. */
|
|
23
53
|
export declare function getAllCliStates(): Promise<Partial<Record<AgentId, CliState>>>;
|
|
54
|
+
/** Check whether the agent's config directory exists on disk. */
|
|
24
55
|
export declare function isConfigured(agentId: AgentId): boolean;
|
|
56
|
+
/** Info about an existing unmanaged agent installation. */
|
|
57
|
+
export interface UnmanagedInstall {
|
|
58
|
+
agentId: AgentId;
|
|
59
|
+
configDir: string;
|
|
60
|
+
version: string | null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Detect existing agent installations that are NOT yet managed by agents-cli.
|
|
64
|
+
* Returns agents whose config dir exists as a real directory (not a symlink).
|
|
65
|
+
*/
|
|
66
|
+
export declare function getUnmanagedAgentInstalls(): Promise<UnmanagedInstall[]>;
|
|
67
|
+
/** Create the agent's slash-commands directory if it does not exist. */
|
|
25
68
|
export declare function ensureCommandsDir(agentId: AgentId): void;
|
|
69
|
+
/** Create the agent's skills directory if it does not exist. */
|
|
26
70
|
export declare function ensureSkillsDir(agentId: AgentId): void;
|
|
71
|
+
/** Account identity and billing information extracted from an agent's auth config. */
|
|
27
72
|
export interface AccountInfo {
|
|
28
73
|
accountKey: string | null;
|
|
29
74
|
usageKey: string | null;
|
|
@@ -39,9 +84,21 @@ export interface AccountInfo {
|
|
|
39
84
|
} | null;
|
|
40
85
|
lastActive: Date | null;
|
|
41
86
|
}
|
|
87
|
+
/** Return the email address associated with the agent's auth config, or null. */
|
|
42
88
|
export declare function getAccountEmail(agentId: AgentId, home?: string): Promise<string | null>;
|
|
89
|
+
/**
|
|
90
|
+
* Extract full account information (identity, plan, usage status, credits) from
|
|
91
|
+
* the agent's local auth/config files. Supports Claude, Codex, and Gemini.
|
|
92
|
+
*/
|
|
43
93
|
export declare function getAccountInfo(agentId: AgentId, home?: string): Promise<AccountInfo>;
|
|
94
|
+
/**
|
|
95
|
+
* Quick count of session files for an agent (without full DB scan).
|
|
96
|
+
* Used during init to show approximate session count to user.
|
|
97
|
+
*/
|
|
98
|
+
export declare function countSessionFiles(agentId: AgentId): number;
|
|
99
|
+
/** Check whether a named MCP server is registered with the agent's CLI. */
|
|
44
100
|
export declare function isMcpRegistered(agentId: AgentId, mcpName: string): Promise<boolean>;
|
|
101
|
+
/** Register an MCP server with an agent's CLI via `mcp add`. */
|
|
45
102
|
export declare function registerMcp(agentId: AgentId, name: string, command: string, scope?: 'user' | 'project', transport?: string, options?: {
|
|
46
103
|
home?: string;
|
|
47
104
|
binary?: string;
|
|
@@ -49,6 +106,7 @@ export declare function registerMcp(agentId: AgentId, name: string, command: str
|
|
|
49
106
|
success: boolean;
|
|
50
107
|
error?: string;
|
|
51
108
|
}>;
|
|
109
|
+
/** Unregister (remove) a named MCP server from an agent's CLI config. */
|
|
52
110
|
export declare function unregisterMcp(agentId: AgentId, name: string, options?: {
|
|
53
111
|
home?: string;
|
|
54
112
|
binary?: string;
|
|
@@ -56,21 +114,32 @@ export declare function unregisterMcp(agentId: AgentId, name: string, options?:
|
|
|
56
114
|
success: boolean;
|
|
57
115
|
error?: string;
|
|
58
116
|
}>;
|
|
117
|
+
/** Result of an MCP registration or removal operation targeting a specific agent and optional version. */
|
|
59
118
|
export interface McpTargetOperationResult {
|
|
60
119
|
agentId: AgentId;
|
|
61
120
|
version?: string;
|
|
62
121
|
success: boolean;
|
|
63
122
|
error?: string;
|
|
64
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Register an MCP server across multiple agent targets, including both direct
|
|
126
|
+
* (non-version-managed) agents and specific version-managed installs.
|
|
127
|
+
*/
|
|
65
128
|
export declare function registerMcpToTargets(targets: {
|
|
66
129
|
directAgents: AgentId[];
|
|
67
130
|
versionSelections: Map<AgentId, string[]>;
|
|
68
131
|
}, name: string, command: string, scope?: 'user' | 'project', transport?: string): Promise<McpTargetOperationResult[]>;
|
|
132
|
+
/**
|
|
133
|
+
* Unregister an MCP server from multiple agent targets, including both direct
|
|
134
|
+
* agents and specific version-managed installs.
|
|
135
|
+
*/
|
|
69
136
|
export declare function unregisterMcpFromTargets(targets: {
|
|
70
137
|
directAgents: AgentId[];
|
|
71
138
|
versionSelections: Map<AgentId, string[]>;
|
|
72
139
|
}, name: string): Promise<McpTargetOperationResult[]>;
|
|
140
|
+
/** Scope at which an MCP server is registered: user-global or per-project. */
|
|
73
141
|
export type McpScope = 'user' | 'project';
|
|
142
|
+
/** Describes an MCP server discovered in an agent's config, with its scope and command. */
|
|
74
143
|
export interface InstalledMcp {
|
|
75
144
|
name: string;
|
|
76
145
|
scope: McpScope;
|
|
@@ -99,9 +168,12 @@ export declare function parseMcpConfig(agentId: AgentId, configPath: string): Re
|
|
|
99
168
|
export declare function listInstalledMcpsWithScope(agentId: AgentId, cwd?: string, options?: {
|
|
100
169
|
home?: string;
|
|
101
170
|
}): InstalledMcp[];
|
|
171
|
+
/** Map of agent name aliases and shorthand identifiers to canonical AgentId values. */
|
|
102
172
|
export declare const AGENT_NAME_ALIASES: Record<string, AgentId>;
|
|
173
|
+
/** Resolve a user-provided agent name (alias, shorthand, or canonical) to its AgentId. */
|
|
103
174
|
export declare function resolveAgentName(input: string): AgentId | null;
|
|
175
|
+
/** Check whether the input string matches any known agent name or alias. */
|
|
104
176
|
export declare function isAgentName(input: string): boolean;
|
|
177
|
+
/** Format an error message for an unrecognized agent name, listing valid options. */
|
|
105
178
|
export declare function formatAgentError(agentName: string, validAgents?: AgentId[]): string;
|
|
106
179
|
export {};
|
|
107
|
-
//# sourceMappingURL=agents.d.ts.map
|
package/dist/lib/agents.js
CHANGED
|
@@ -1,18 +1,35 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Core agent configuration and detection module.
|
|
3
|
+
*
|
|
4
|
+
* Defines the canonical registry of all supported AI coding agents (Claude, Codex,
|
|
5
|
+
* Gemini, Cursor, OpenCode, OpenClaw, Copilot, Amp, Kiro, Goose, Roo) with their
|
|
6
|
+
* CLI commands, config paths, capability flags, and MCP integration points.
|
|
7
|
+
*
|
|
8
|
+
* Provides functions for detecting installed CLIs, resolving version-managed binaries,
|
|
9
|
+
* reading account/auth info, and managing MCP server registrations across agents.
|
|
10
|
+
*/
|
|
11
|
+
import { execFile } from 'child_process';
|
|
2
12
|
import { promisify } from 'util';
|
|
3
13
|
import * as fs from 'fs';
|
|
4
14
|
import * as path from 'path';
|
|
5
15
|
import * as os from 'os';
|
|
6
16
|
import * as TOML from 'smol-toml';
|
|
7
17
|
import chalk from 'chalk';
|
|
8
|
-
import { walkForFiles } from './
|
|
9
|
-
import { getVersionsDir, getShimsDir } from './state.js';
|
|
18
|
+
import { walkForFiles } from './fs-walk.js';
|
|
19
|
+
import { getVersionsDir, getShimsDir, getAgentsDir } from './state.js';
|
|
10
20
|
import { resolveVersion, getVersionHomePath, getBinaryPath } from './versions.js';
|
|
11
21
|
import { loadClaudeOauth } from './usage.js';
|
|
12
|
-
const
|
|
22
|
+
const execFileAsync = promisify(execFile);
|
|
13
23
|
const HOME = os.homedir();
|
|
24
|
+
/**
|
|
25
|
+
* Minimum Codex CLI version that supports hooks.
|
|
26
|
+
* Mirrored on `AGENTS.codex.capabilities.hooks.since` -- kept exported for
|
|
27
|
+
* legacy import sites that haven't migrated to `supports()` yet.
|
|
28
|
+
*/
|
|
14
29
|
export const CODEX_HOOKS_MIN_VERSION = '0.116.0';
|
|
15
|
-
|
|
30
|
+
/** Minimum Gemini CLI version that supports the hooks system (v0.26.0, Jan 2026). */
|
|
31
|
+
export const GEMINI_HOOKS_MIN_VERSION = '0.26.0';
|
|
32
|
+
const CLI_VERSION_CACHE_PATH = path.join(getAgentsDir(), '.cli-version-cache.json');
|
|
16
33
|
let cliVersionCache = null;
|
|
17
34
|
function loadCliVersionCache() {
|
|
18
35
|
if (cliVersionCache)
|
|
@@ -39,7 +56,7 @@ function saveCliVersionCache() {
|
|
|
39
56
|
/* best-effort cache persist */
|
|
40
57
|
}
|
|
41
58
|
}
|
|
42
|
-
/** Synchronous PATH search
|
|
59
|
+
/** Synchronous PATH search -- no subprocess. Returns first matching binary path. */
|
|
43
60
|
function findInPath(command) {
|
|
44
61
|
const pathEnv = process.env.PATH || '';
|
|
45
62
|
const pathExt = process.platform === 'win32' ? (process.env.PATHEXT || '').split(';') : [''];
|
|
@@ -60,6 +77,67 @@ function findInPath(command) {
|
|
|
60
77
|
}
|
|
61
78
|
return null;
|
|
62
79
|
}
|
|
80
|
+
function splitCommandLine(command) {
|
|
81
|
+
const args = [];
|
|
82
|
+
let current = '';
|
|
83
|
+
let quote = null;
|
|
84
|
+
let tokenStarted = false;
|
|
85
|
+
for (let i = 0; i < command.length; i++) {
|
|
86
|
+
const char = command[i];
|
|
87
|
+
if (quote) {
|
|
88
|
+
if (char === quote) {
|
|
89
|
+
quote = null;
|
|
90
|
+
tokenStarted = true;
|
|
91
|
+
}
|
|
92
|
+
else if (char === '\\' && quote === '"' && i + 1 < command.length) {
|
|
93
|
+
current += command[++i];
|
|
94
|
+
tokenStarted = true;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
current += char;
|
|
98
|
+
tokenStarted = true;
|
|
99
|
+
}
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (char === '"' || char === "'") {
|
|
103
|
+
quote = char;
|
|
104
|
+
tokenStarted = true;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (/\s/.test(char)) {
|
|
108
|
+
if (tokenStarted) {
|
|
109
|
+
args.push(current);
|
|
110
|
+
current = '';
|
|
111
|
+
tokenStarted = false;
|
|
112
|
+
}
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (char === '\\' && i + 1 < command.length) {
|
|
116
|
+
current += command[++i];
|
|
117
|
+
tokenStarted = true;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
current += char;
|
|
121
|
+
tokenStarted = true;
|
|
122
|
+
}
|
|
123
|
+
if (quote) {
|
|
124
|
+
throw new Error('Unterminated quote in MCP command');
|
|
125
|
+
}
|
|
126
|
+
if (tokenStarted) {
|
|
127
|
+
args.push(current);
|
|
128
|
+
}
|
|
129
|
+
if (args.length === 0) {
|
|
130
|
+
throw new Error('MCP command is required');
|
|
131
|
+
}
|
|
132
|
+
return args;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Master registry of all supported agents keyed by AgentId.
|
|
136
|
+
*
|
|
137
|
+
* Each entry defines the agent's CLI command, npm package, config directory layout,
|
|
138
|
+
* instructions file name, slash-command format, and capability flags. This is the
|
|
139
|
+
* single source of truth for agent metadata consumed throughout the codebase.
|
|
140
|
+
*/
|
|
63
141
|
export const AGENTS = {
|
|
64
142
|
claude: {
|
|
65
143
|
id: 'claude',
|
|
@@ -79,6 +157,7 @@ export const AGENTS = {
|
|
|
79
157
|
supportsHooks: true,
|
|
80
158
|
capabilities: { hooks: true, mcp: true, allowlist: true, skills: true, commands: true, plugins: true, memoryImports: true },
|
|
81
159
|
},
|
|
160
|
+
// codex hooks: gated to >= 0.116.0 (introduced [features] codex_hooks flag).
|
|
82
161
|
codex: {
|
|
83
162
|
id: 'codex',
|
|
84
163
|
name: 'Codex',
|
|
@@ -94,7 +173,7 @@ export const AGENTS = {
|
|
|
94
173
|
format: 'markdown',
|
|
95
174
|
variableSyntax: '$ARGUMENTS',
|
|
96
175
|
supportsHooks: true,
|
|
97
|
-
capabilities: { hooks:
|
|
176
|
+
capabilities: { hooks: { since: '0.116.0' }, mcp: true, allowlist: false, skills: true, commands: { until: '0.117.0' }, plugins: false },
|
|
98
177
|
},
|
|
99
178
|
gemini: {
|
|
100
179
|
id: 'gemini',
|
|
@@ -112,7 +191,8 @@ export const AGENTS = {
|
|
|
112
191
|
variableSyntax: '{{args}}',
|
|
113
192
|
supportsHooks: true,
|
|
114
193
|
nativeAgentsSkillsDir: true,
|
|
115
|
-
|
|
194
|
+
// gemini hooks: shipped in v0.26.0 (Jan 2026); older binaries silently ignore the `hooks` key.
|
|
195
|
+
capabilities: { hooks: { since: '0.26.0' }, mcp: true, allowlist: false, skills: true, commands: true, plugins: false, memoryImports: true },
|
|
116
196
|
},
|
|
117
197
|
cursor: {
|
|
118
198
|
id: 'cursor',
|
|
@@ -255,12 +335,18 @@ export const AGENTS = {
|
|
|
255
335
|
capabilities: { hooks: false, mcp: true, allowlist: false, skills: true, commands: true, plugins: false },
|
|
256
336
|
},
|
|
257
337
|
};
|
|
338
|
+
/** All registered agent IDs derived from the AGENTS registry. */
|
|
258
339
|
export const ALL_AGENT_IDS = Object.keys(AGENTS);
|
|
340
|
+
/** Agents that support MCP (Model Context Protocol) server integration. */
|
|
259
341
|
export const MCP_CAPABLE_AGENTS = ALL_AGENT_IDS.filter((id) => AGENTS[id].capabilities.mcp);
|
|
342
|
+
/** Agents that support skills (SKILL.md + rules/ bundles). */
|
|
260
343
|
export const SKILLS_CAPABLE_AGENTS = ALL_AGENT_IDS.filter((id) => AGENTS[id].capabilities.skills);
|
|
344
|
+
/** Agents that support file-based slash commands. */
|
|
261
345
|
export const COMMANDS_CAPABLE_AGENTS = ALL_AGENT_IDS.filter((id) => AGENTS[id].capabilities.commands);
|
|
262
|
-
|
|
263
|
-
export const
|
|
346
|
+
/** Agents that support event hooks (pre/post lifecycle callbacks). */
|
|
347
|
+
export const HOOKS_CAPABLE_AGENTS = ALL_AGENT_IDS.filter((id) => AGENTS[id].capabilities.hooks !== false);
|
|
348
|
+
/** Agents that support the plugin system. */
|
|
349
|
+
export const PLUGINS_CAPABLE_AGENTS = ALL_AGENT_IDS.filter((id) => AGENTS[id].capabilities.plugins !== false);
|
|
264
350
|
/** Get the chalk color function for an agent. Works for any AgentId or SessionAgentId. */
|
|
265
351
|
export function colorAgent(agentId) {
|
|
266
352
|
const agent = AGENTS[agentId];
|
|
@@ -275,10 +361,12 @@ export function agentLabel(agentId) {
|
|
|
275
361
|
return agentId;
|
|
276
362
|
return chalk[agent.color](agent.name);
|
|
277
363
|
}
|
|
364
|
+
/** Check whether the given agent's CLI binary is present on PATH. */
|
|
278
365
|
export async function isCliInstalled(agentId) {
|
|
279
366
|
const agent = AGENTS[agentId];
|
|
280
367
|
return findInPath(agent.cliCommand) !== null;
|
|
281
368
|
}
|
|
369
|
+
/** Return the installed CLI version for the given agent, or null if not found. */
|
|
282
370
|
export async function getCliVersion(agentId) {
|
|
283
371
|
const agent = AGENTS[agentId];
|
|
284
372
|
const binaryPath = findInPath(agent.cliCommand);
|
|
@@ -286,6 +374,7 @@ export async function getCliVersion(agentId) {
|
|
|
286
374
|
return null;
|
|
287
375
|
return getCachedVersionForBinary(agentId, binaryPath);
|
|
288
376
|
}
|
|
377
|
+
/** Return the absolute path to the agent's CLI binary on PATH, or null. */
|
|
289
378
|
export async function getCliPath(agentId) {
|
|
290
379
|
return findInPath(AGENTS[agentId].cliCommand);
|
|
291
380
|
}
|
|
@@ -307,7 +396,7 @@ async function getCachedVersionForBinary(agentId, binaryPath) {
|
|
|
307
396
|
const agent = AGENTS[agentId];
|
|
308
397
|
let version = null;
|
|
309
398
|
try {
|
|
310
|
-
const { stdout } = await
|
|
399
|
+
const { stdout } = await execFileAsync(agent.cliCommand, ['--version'], { timeout: 3000 });
|
|
311
400
|
if (agentId === 'openclaw') {
|
|
312
401
|
const match = stdout.match(/openclaw\/(\d+\.\d+\.\d+)/);
|
|
313
402
|
version = match ? match[1] : stdout.trim();
|
|
@@ -325,6 +414,11 @@ async function getCachedVersionForBinary(agentId, binaryPath) {
|
|
|
325
414
|
saveCliVersionCache();
|
|
326
415
|
return version;
|
|
327
416
|
}
|
|
417
|
+
/**
|
|
418
|
+
* Resolve the full CLI state for an agent: whether it is installed, its version,
|
|
419
|
+
* and the path to the binary. Checks version-managed installs first, then falls
|
|
420
|
+
* back to a plain PATH lookup.
|
|
421
|
+
*/
|
|
328
422
|
export async function getCliState(agentId) {
|
|
329
423
|
// Fast path: if version-managed, derive state from filesystem (no subprocesses)
|
|
330
424
|
const agent = AGENTS[agentId];
|
|
@@ -370,6 +464,7 @@ export async function getCliState(agentId) {
|
|
|
370
464
|
path: binaryPath,
|
|
371
465
|
};
|
|
372
466
|
}
|
|
467
|
+
/** Resolve CLI state for all registered agents in parallel. */
|
|
373
468
|
export async function getAllCliStates() {
|
|
374
469
|
const states = {};
|
|
375
470
|
const results = await Promise.all(ALL_AGENT_IDS.map(async (agentId) => ({
|
|
@@ -381,26 +476,56 @@ export async function getAllCliStates() {
|
|
|
381
476
|
}
|
|
382
477
|
return states;
|
|
383
478
|
}
|
|
479
|
+
/** Check whether the agent's config directory exists on disk. */
|
|
384
480
|
export function isConfigured(agentId) {
|
|
385
481
|
const agent = AGENTS[agentId];
|
|
386
482
|
return fs.existsSync(agent.configDir);
|
|
387
483
|
}
|
|
484
|
+
/**
|
|
485
|
+
* Detect existing agent installations that are NOT yet managed by agents-cli.
|
|
486
|
+
* Returns agents whose config dir exists as a real directory (not a symlink).
|
|
487
|
+
*/
|
|
488
|
+
export async function getUnmanagedAgentInstalls() {
|
|
489
|
+
const unmanaged = [];
|
|
490
|
+
const candidates = ['claude', 'codex', 'gemini'];
|
|
491
|
+
for (const agentId of candidates) {
|
|
492
|
+
const agent = AGENTS[agentId];
|
|
493
|
+
try {
|
|
494
|
+
const stat = fs.lstatSync(agent.configDir);
|
|
495
|
+
if (stat.isDirectory() && !stat.isSymbolicLink()) {
|
|
496
|
+
const version = await getCliVersion(agentId);
|
|
497
|
+
unmanaged.push({ agentId, configDir: agent.configDir, version });
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
// Config dir doesn't exist
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return unmanaged;
|
|
505
|
+
}
|
|
506
|
+
/** Create the agent's slash-commands directory if it does not exist. */
|
|
388
507
|
export function ensureCommandsDir(agentId) {
|
|
389
508
|
const agent = AGENTS[agentId];
|
|
390
509
|
if (!fs.existsSync(agent.commandsDir)) {
|
|
391
510
|
fs.mkdirSync(agent.commandsDir, { recursive: true });
|
|
392
511
|
}
|
|
393
512
|
}
|
|
513
|
+
/** Create the agent's skills directory if it does not exist. */
|
|
394
514
|
export function ensureSkillsDir(agentId) {
|
|
395
515
|
const agent = AGENTS[agentId];
|
|
396
516
|
if (!fs.existsSync(agent.skillsDir)) {
|
|
397
517
|
fs.mkdirSync(agent.skillsDir, { recursive: true });
|
|
398
518
|
}
|
|
399
519
|
}
|
|
520
|
+
/** Return the email address associated with the agent's auth config, or null. */
|
|
400
521
|
export async function getAccountEmail(agentId, home) {
|
|
401
522
|
const info = await getAccountInfo(agentId, home);
|
|
402
523
|
return info.email;
|
|
403
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* Extract full account information (identity, plan, usage status, credits) from
|
|
527
|
+
* the agent's local auth/config files. Supports Claude, Codex, and Gemini.
|
|
528
|
+
*/
|
|
404
529
|
export async function getAccountInfo(agentId, home) {
|
|
405
530
|
const base = home || os.homedir();
|
|
406
531
|
const empty = {
|
|
@@ -537,6 +662,7 @@ export async function getAccountInfo(agentId, home) {
|
|
|
537
662
|
return { ...empty, lastActive };
|
|
538
663
|
}
|
|
539
664
|
}
|
|
665
|
+
/** Determine when the agent was last used by checking session file mtimes, falling back to config mtime. */
|
|
540
666
|
function resolveLastActive(agentId, base, configPath) {
|
|
541
667
|
const sessionDir = getSessionDir(agentId, base);
|
|
542
668
|
const sessionExt = getSessionExtension(agentId);
|
|
@@ -555,6 +681,7 @@ function resolveLastActive(agentId, base, configPath) {
|
|
|
555
681
|
return null;
|
|
556
682
|
}
|
|
557
683
|
}
|
|
684
|
+
/** Return the root directory where the agent stores session files, or null if unknown. */
|
|
558
685
|
function getSessionDir(agentId, base) {
|
|
559
686
|
switch (agentId) {
|
|
560
687
|
case 'claude':
|
|
@@ -567,6 +694,7 @@ function getSessionDir(agentId, base) {
|
|
|
567
694
|
return null;
|
|
568
695
|
}
|
|
569
696
|
}
|
|
697
|
+
/** Return the file extension used for session files by the given agent. */
|
|
570
698
|
function getSessionExtension(agentId) {
|
|
571
699
|
switch (agentId) {
|
|
572
700
|
case 'claude':
|
|
@@ -578,6 +706,36 @@ function getSessionExtension(agentId) {
|
|
|
578
706
|
return null;
|
|
579
707
|
}
|
|
580
708
|
}
|
|
709
|
+
/**
|
|
710
|
+
* Quick count of session files for an agent (without full DB scan).
|
|
711
|
+
* Used during init to show approximate session count to user.
|
|
712
|
+
*/
|
|
713
|
+
export function countSessionFiles(agentId) {
|
|
714
|
+
const sessionDir = getSessionDir(agentId, HOME);
|
|
715
|
+
const ext = getSessionExtension(agentId);
|
|
716
|
+
if (!sessionDir || !ext || !fs.existsSync(sessionDir))
|
|
717
|
+
return 0;
|
|
718
|
+
let count = 0;
|
|
719
|
+
const walk = (dir) => {
|
|
720
|
+
try {
|
|
721
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
722
|
+
for (const entry of entries) {
|
|
723
|
+
if (entry.isDirectory()) {
|
|
724
|
+
walk(path.join(dir, entry.name));
|
|
725
|
+
}
|
|
726
|
+
else if (entry.isFile() && entry.name.endsWith(ext)) {
|
|
727
|
+
count++;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
catch {
|
|
732
|
+
// Permission denied or other error
|
|
733
|
+
}
|
|
734
|
+
};
|
|
735
|
+
walk(sessionDir);
|
|
736
|
+
return count;
|
|
737
|
+
}
|
|
738
|
+
/** Walk a directory for files matching the extension and return the mtime of the most recent one. */
|
|
581
739
|
function getLatestFileMtime(dir, ext) {
|
|
582
740
|
if (!fs.existsSync(dir))
|
|
583
741
|
return null;
|
|
@@ -591,6 +749,7 @@ function getLatestFileMtime(dir, ext) {
|
|
|
591
749
|
return null;
|
|
592
750
|
}
|
|
593
751
|
}
|
|
752
|
+
/** Decode the payload section of a JWT token without verifying its signature. */
|
|
594
753
|
function decodeJwtPayload(token) {
|
|
595
754
|
const payload = token.split('.')[1];
|
|
596
755
|
if (!payload)
|
|
@@ -602,6 +761,7 @@ function decodeJwtPayload(token) {
|
|
|
602
761
|
return null;
|
|
603
762
|
}
|
|
604
763
|
}
|
|
764
|
+
/** Extract the default organization ID from a Codex/OpenAI auth claim. */
|
|
605
765
|
function getCodexDefaultOrgId(authClaim) {
|
|
606
766
|
const organizations = authClaim?.organizations;
|
|
607
767
|
if (!Array.isArray(organizations))
|
|
@@ -609,12 +769,14 @@ function getCodexDefaultOrgId(authClaim) {
|
|
|
609
769
|
const first = organizations[0];
|
|
610
770
|
return typeof first?.id === 'string' ? first.id : null;
|
|
611
771
|
}
|
|
772
|
+
/** Trim and normalize an identity string, returning null for empty or non-string values. */
|
|
612
773
|
function normalizeIdentityPart(value) {
|
|
613
774
|
if (typeof value !== 'string')
|
|
614
775
|
return null;
|
|
615
776
|
const trimmed = value.trim();
|
|
616
777
|
return trimmed || null;
|
|
617
778
|
}
|
|
779
|
+
/** Build a composite identity key like "claude:account=abc:org=xyz" from labeled parts. */
|
|
618
780
|
function buildIdentityKey(agentId, parts) {
|
|
619
781
|
const encoded = parts
|
|
620
782
|
.filter(([, value]) => value)
|
|
@@ -623,13 +785,14 @@ function buildIdentityKey(agentId, parts) {
|
|
|
623
785
|
return null;
|
|
624
786
|
return `${agentId}:${encoded.join(':')}`;
|
|
625
787
|
}
|
|
788
|
+
/** Check whether a named MCP server is registered with the agent's CLI. */
|
|
626
789
|
export async function isMcpRegistered(agentId, mcpName) {
|
|
627
790
|
const agent = AGENTS[agentId];
|
|
628
791
|
if (!agent.capabilities.mcp || !(await isCliInstalled(agentId))) {
|
|
629
792
|
return false;
|
|
630
793
|
}
|
|
631
794
|
try {
|
|
632
|
-
const { stdout } = await
|
|
795
|
+
const { stdout } = await execFileAsync(agent.cliCommand, ['mcp', 'list']);
|
|
633
796
|
return stdout.toLowerCase().includes(mcpName.toLowerCase());
|
|
634
797
|
}
|
|
635
798
|
catch {
|
|
@@ -637,6 +800,7 @@ export async function isMcpRegistered(agentId, mcpName) {
|
|
|
637
800
|
return false;
|
|
638
801
|
}
|
|
639
802
|
}
|
|
803
|
+
/** Register an MCP server with an agent's CLI via `mcp add`. */
|
|
640
804
|
export async function registerMcp(agentId, name, command, scope = 'user', transport = 'stdio', options) {
|
|
641
805
|
const agent = AGENTS[agentId];
|
|
642
806
|
if (!agent.capabilities.mcp) {
|
|
@@ -648,22 +812,24 @@ export async function registerMcp(agentId, name, command, scope = 'user', transp
|
|
|
648
812
|
try {
|
|
649
813
|
// Use explicit binary path when provided (bypasses shim for version-managed agents)
|
|
650
814
|
const bin = options?.binary || agent.cliCommand;
|
|
651
|
-
let
|
|
815
|
+
let args;
|
|
816
|
+
const commandArgs = splitCommandLine(command);
|
|
652
817
|
if (agentId === 'claude') {
|
|
653
|
-
|
|
818
|
+
args = ['mcp', 'add', '--transport', transport, '--scope', scope, name, '--', ...commandArgs];
|
|
654
819
|
}
|
|
655
820
|
else {
|
|
656
|
-
|
|
821
|
+
args = ['mcp', 'add', name, '--', ...commandArgs];
|
|
657
822
|
}
|
|
658
823
|
// When home is specified, override HOME so MCP config writes to the version's config dir
|
|
659
824
|
const env = options?.home ? { ...process.env, HOME: options.home } : undefined;
|
|
660
|
-
await
|
|
825
|
+
await execFileAsync(bin, args, env ? { env } : undefined);
|
|
661
826
|
return { success: true };
|
|
662
827
|
}
|
|
663
828
|
catch (err) {
|
|
664
829
|
return { success: false, error: err.message };
|
|
665
830
|
}
|
|
666
831
|
}
|
|
832
|
+
/** Unregister (remove) a named MCP server from an agent's CLI config. */
|
|
667
833
|
export async function unregisterMcp(agentId, name, options) {
|
|
668
834
|
const agent = AGENTS[agentId];
|
|
669
835
|
if (!agent.capabilities.mcp) {
|
|
@@ -675,13 +841,17 @@ export async function unregisterMcp(agentId, name, options) {
|
|
|
675
841
|
try {
|
|
676
842
|
const bin = options?.binary || agent.cliCommand;
|
|
677
843
|
const env = options?.home ? { ...process.env, HOME: options.home } : undefined;
|
|
678
|
-
await
|
|
844
|
+
await execFileAsync(bin, ['mcp', 'remove', name], env ? { env } : undefined);
|
|
679
845
|
return { success: true };
|
|
680
846
|
}
|
|
681
847
|
catch (err) {
|
|
682
848
|
return { success: false, error: err.message };
|
|
683
849
|
}
|
|
684
850
|
}
|
|
851
|
+
/**
|
|
852
|
+
* Register an MCP server across multiple agent targets, including both direct
|
|
853
|
+
* (non-version-managed) agents and specific version-managed installs.
|
|
854
|
+
*/
|
|
685
855
|
export async function registerMcpToTargets(targets, name, command, scope = 'user', transport = 'stdio') {
|
|
686
856
|
const results = [];
|
|
687
857
|
for (const agentId of targets.directAgents) {
|
|
@@ -699,6 +869,10 @@ export async function registerMcpToTargets(targets, name, command, scope = 'user
|
|
|
699
869
|
}
|
|
700
870
|
return results;
|
|
701
871
|
}
|
|
872
|
+
/**
|
|
873
|
+
* Unregister an MCP server from multiple agent targets, including both direct
|
|
874
|
+
* agents and specific version-managed installs.
|
|
875
|
+
*/
|
|
702
876
|
export async function unregisterMcpFromTargets(targets, name) {
|
|
703
877
|
const results = [];
|
|
704
878
|
for (const agentId of targets.directAgents) {
|
|
@@ -718,8 +892,8 @@ export async function unregisterMcpFromTargets(targets, name) {
|
|
|
718
892
|
}
|
|
719
893
|
/**
|
|
720
894
|
* Extract version from npm package specification.
|
|
721
|
-
* Examples: @
|
|
722
|
-
* @
|
|
895
|
+
* Examples: @scope/package@latest -> latest
|
|
896
|
+
* @scope/package@1.2.3 -> 1.2.3
|
|
723
897
|
* some-package -> undefined
|
|
724
898
|
*/
|
|
725
899
|
function extractNpmVersion(args) {
|
|
@@ -1051,7 +1225,7 @@ export function listInstalledMcpsWithScope(agentId, cwd = process.cwd(), options
|
|
|
1051
1225
|
}
|
|
1052
1226
|
return results;
|
|
1053
1227
|
}
|
|
1054
|
-
|
|
1228
|
+
/** Map of agent name aliases and shorthand identifiers to canonical AgentId values. */
|
|
1055
1229
|
export const AGENT_NAME_ALIASES = {
|
|
1056
1230
|
claude: 'claude',
|
|
1057
1231
|
'claude-code': 'claude',
|
|
@@ -1084,13 +1258,15 @@ export const AGENT_NAME_ALIASES = {
|
|
|
1084
1258
|
'roo-code': 'roo',
|
|
1085
1259
|
roocode: 'roo',
|
|
1086
1260
|
};
|
|
1261
|
+
/** Resolve a user-provided agent name (alias, shorthand, or canonical) to its AgentId. */
|
|
1087
1262
|
export function resolveAgentName(input) {
|
|
1088
1263
|
return AGENT_NAME_ALIASES[input.toLowerCase()] || null;
|
|
1089
1264
|
}
|
|
1265
|
+
/** Check whether the input string matches any known agent name or alias. */
|
|
1090
1266
|
export function isAgentName(input) {
|
|
1091
1267
|
return resolveAgentName(input) !== null;
|
|
1092
1268
|
}
|
|
1269
|
+
/** Format an error message for an unrecognized agent name, listing valid options. */
|
|
1093
1270
|
export function formatAgentError(agentName, validAgents = ALL_AGENT_IDS) {
|
|
1094
1271
|
return `Unknown agent '${agentName}'. Valid agents: ${validAgents.join(', ')}`;
|
|
1095
1272
|
}
|
|
1096
|
-
//# sourceMappingURL=agents.js.map
|