@phnx-labs/agents-cli 1.12.0 → 1.14.2
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 +308 -297
- 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 +10 -0
- package/dist/commands/cloud.js +408 -0
- 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 +207 -20
- 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 +45 -6
- 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 +11 -0
- package/dist/commands/profiles.js +291 -0
- 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 +93 -129
- 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 +10 -0
- package/dist/commands/secrets.js +518 -0
- 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 +288 -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 +353 -20
- package/dist/index.d.ts +7 -2
- package/dist/index.js +205 -38
- 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 +207 -23
- 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 +25 -0
- package/dist/lib/cloud/codex.js +250 -0
- package/dist/lib/cloud/factory.d.ts +31 -0
- package/dist/lib/cloud/factory.js +53 -0
- package/dist/lib/cloud/registry.d.ts +15 -0
- package/dist/lib/cloud/registry.js +67 -0
- package/dist/lib/cloud/rush.d.ts +75 -0
- package/dist/lib/cloud/rush.js +438 -0
- package/dist/lib/cloud/store.d.ts +22 -0
- package/dist/lib/cloud/store.js +115 -0
- package/dist/lib/cloud/stream.d.ts +23 -0
- package/dist/lib/cloud/stream.js +194 -0
- package/dist/lib/cloud/types.d.ts +205 -0
- package/dist/lib/cloud/types.js +34 -0
- 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 +25 -5
- package/dist/lib/exec.js +72 -27
- 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 +191 -21
- 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 +25 -11
- package/dist/lib/models.js +405 -16
- 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 +24 -0
- package/dist/lib/profiles-presets.js +103 -0
- package/dist/lib/profiles.d.ts +69 -0
- package/dist/lib/profiles.js +144 -0
- 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 +89 -0
- package/dist/lib/rotate.js +327 -0
- 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 +39 -0
- package/dist/lib/secrets/bundles.js +189 -0
- 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 +16 -0
- package/dist/lib/session/artifacts.js +95 -0
- 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 +24 -2
- package/dist/lib/session/types.js +10 -2
- package/dist/lib/shims.d.ts +93 -5
- package/dist/lib/shims.js +380 -67
- 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 +114 -22
- package/dist/lib/state.js +323 -138
- 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 +48 -1
- package/dist/lib/usage.js +97 -16
- package/dist/lib/version-duplicates.d.ts +21 -0
- package/dist/lib/version-duplicates.js +90 -0
- package/dist/lib/versions.d.ts +39 -4
- package/dist/lib/versions.js +401 -111
- package/package.json +33 -18
- 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/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/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/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 -184
- package/dist/lib/__tests__/models.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 -218
- package/dist/lib/__tests__/usage.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/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/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/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/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/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
package/dist/lib/exec.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import type { AgentId } from './types.js';
|
|
2
|
+
/** Agent execution modes controlling tool access and autonomy level. */
|
|
2
3
|
export type ExecMode = 'plan' | 'edit' | 'full';
|
|
4
|
+
/** Reasoning effort levels passed to agents that support them. 'auto' defers to the agent's default. */
|
|
3
5
|
export type ExecEffort = 'low' | 'medium' | 'high' | 'xhigh' | 'max' | 'auto';
|
|
6
|
+
/** Options for spawning an agent process. Omitting `prompt` launches the CLI interactively. */
|
|
4
7
|
export interface ExecOptions {
|
|
5
8
|
agent: AgentId;
|
|
6
9
|
version?: string;
|
|
7
|
-
prompt
|
|
10
|
+
/** Omit to launch the CLI interactively -- no prompt, no --print, stdio fully inherited. */
|
|
11
|
+
prompt?: string;
|
|
12
|
+
/** Force interactive mode even when a prompt is provided. */
|
|
13
|
+
interactive?: boolean;
|
|
8
14
|
mode: ExecMode;
|
|
9
15
|
effort: ExecEffort;
|
|
10
16
|
cwd?: string;
|
|
@@ -17,8 +23,15 @@ export interface ExecOptions {
|
|
|
17
23
|
verbose?: boolean;
|
|
18
24
|
env?: Record<string, string>;
|
|
19
25
|
}
|
|
26
|
+
/** Parse an array of KEY=VALUE strings into an env record. Returns undefined for empty input. */
|
|
20
27
|
export declare function parseExecEnv(entries: string[]): Record<string, string> | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Build the process environment for an agent invocation.
|
|
30
|
+
* Pins CLAUDE_CONFIG_DIR for Claude and CODEX_HOME for Codex; strips the
|
|
31
|
+
* other agent's env var so it doesn't leak into unrelated invocations.
|
|
32
|
+
*/
|
|
21
33
|
export declare function buildExecEnv(options: ExecOptions): NodeJS.ProcessEnv;
|
|
34
|
+
/** Describes how to translate ExecOptions into CLI arguments for a specific agent. */
|
|
22
35
|
export interface AgentCommandTemplate {
|
|
23
36
|
base: string[];
|
|
24
37
|
promptFlag: 'positional' | string;
|
|
@@ -32,26 +45,34 @@ export interface AgentCommandTemplate {
|
|
|
32
45
|
printFlags?: string[];
|
|
33
46
|
verboseFlag?: string;
|
|
34
47
|
}
|
|
48
|
+
/** CLI command templates for every supported agent. */
|
|
35
49
|
export declare const AGENT_COMMANDS: Record<AgentId, AgentCommandTemplate>;
|
|
50
|
+
/** Assemble the full CLI argument array for an agent invocation. */
|
|
36
51
|
export declare function buildExecCommand(options: ExecOptions): string[];
|
|
52
|
+
/** Spawn an agent and return its exit code. Convenience wrapper over spawnAgent. */
|
|
37
53
|
export declare function execAgent(options: ExecOptions): Promise<number>;
|
|
38
54
|
/**
|
|
39
55
|
* Patterns that indicate a rate/usage limit. Matching is intentionally broad
|
|
40
|
-
* because providers phrase these differently
|
|
56
|
+
* because providers phrase these differently -- Anthropic uses "5-hour limit"
|
|
41
57
|
* and "rate limit", OpenAI surfaces 429s, Google says "quota exceeded".
|
|
42
58
|
* False positives here just trigger a fallback attempt; false negatives leave
|
|
43
59
|
* the original error unhandled, which is worse.
|
|
44
60
|
*/
|
|
45
61
|
export declare const RATE_LIMIT_PATTERNS: RegExp[];
|
|
62
|
+
/** Return true if the text contains any known rate-limit or overload indicator. */
|
|
46
63
|
export declare function detectRateLimit(text: string): boolean;
|
|
64
|
+
/** An agent (with optional pinned version) in a fallback chain. */
|
|
47
65
|
export interface FallbackEntry {
|
|
48
66
|
agent: AgentId;
|
|
49
67
|
/** Optional pinned version (e.g. '0.116.0'). When set, takes precedence over the active default. */
|
|
50
68
|
version?: string;
|
|
51
69
|
}
|
|
70
|
+
/** ExecOptions extended with a fallback chain for rate-limit cascading. */
|
|
52
71
|
export interface FallbackOptions extends ExecOptions {
|
|
53
72
|
/** Ordered list of agents to try if the primary (options.agent) hits a rate limit. */
|
|
54
73
|
fallback: FallbackEntry[];
|
|
74
|
+
/** Fallback requires a prompt -- chain handoff doesn't apply to interactive sessions. */
|
|
75
|
+
prompt: string;
|
|
55
76
|
}
|
|
56
77
|
/**
|
|
57
78
|
* Build the prompt handed to the fallback agent when the primary was stopped
|
|
@@ -60,7 +81,7 @@ export interface FallbackOptions extends ExecOptions {
|
|
|
60
81
|
* When the prior agent was Claude we pin its session ID via `--session-id` so
|
|
61
82
|
* `prevSessionId` is always defined; for other primaries we pass undefined and
|
|
62
83
|
* get a simpler retry-with-context prompt. Claude understands `/continue <id>`
|
|
63
|
-
* via its shipped skill
|
|
84
|
+
* via its shipped skill -- other agents fall through to an explicit instruction
|
|
64
85
|
* that points at the version-agnostic `agents sessions <id>` reader.
|
|
65
86
|
*/
|
|
66
87
|
export declare function buildFallbackPrompt(prevAgent: AgentId, prevSessionId: string | undefined, nextAgent: AgentId, originalPrompt: string): string;
|
|
@@ -69,7 +90,7 @@ export declare function buildFallbackPrompt(prevAgent: AgentId, prevSessionId: s
|
|
|
69
90
|
*
|
|
70
91
|
* The primary agent gets the original prompt. Subsequent agents get a
|
|
71
92
|
* `/continue <id>`-style handoff (see buildFallbackPrompt) when we can pin a
|
|
72
|
-
* session ID
|
|
93
|
+
* session ID -- which today means Claude as primary (supports `--session-id`).
|
|
73
94
|
* For other primaries, fallbacks run with the original prompt plus a
|
|
74
95
|
* retry-with-context note, since we can't deterministically resolve their
|
|
75
96
|
* auto-generated session IDs.
|
|
@@ -79,4 +100,3 @@ export declare function buildFallbackPrompt(prevAgent: AgentId, prevSessionId: s
|
|
|
79
100
|
* instead of an opaque "all agents failed" message.
|
|
80
101
|
*/
|
|
81
102
|
export declare function runWithFallback(options: FallbackOptions): Promise<number>;
|
|
82
|
-
//# sourceMappingURL=exec.d.ts.map
|
package/dist/lib/exec.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent execution -- command building, process spawning, and rate-limit fallback.
|
|
3
|
+
*
|
|
4
|
+
* Translates high-level ExecOptions into CLI invocations for each supported agent,
|
|
5
|
+
* manages environment isolation per agent, and chains fallback agents on rate limits.
|
|
6
|
+
*/
|
|
1
7
|
import { spawn } from 'child_process';
|
|
2
8
|
import { randomUUID } from 'crypto';
|
|
3
9
|
import * as path from 'path';
|
|
4
10
|
import { parseTimeout } from './routines.js';
|
|
5
11
|
import { getVersionHomePath, isVersionInstalled, resolveVersion } from './versions.js';
|
|
6
12
|
import { resolveModel, buildReasoningFlags } from './models.js';
|
|
13
|
+
/** Pattern for valid environment variable names (C identifier rules). */
|
|
7
14
|
const EXEC_ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
15
|
+
/** Parse a single KEY=VALUE string into a tuple, validating the key name. */
|
|
8
16
|
function parseExecEnvEntry(entry) {
|
|
9
17
|
const separatorIndex = entry.indexOf('=');
|
|
10
18
|
if (separatorIndex <= 0) {
|
|
@@ -17,34 +25,58 @@ function parseExecEnvEntry(entry) {
|
|
|
17
25
|
}
|
|
18
26
|
return [key, value];
|
|
19
27
|
}
|
|
28
|
+
/** Parse an array of KEY=VALUE strings into an env record. Returns undefined for empty input. */
|
|
20
29
|
export function parseExecEnv(entries) {
|
|
21
30
|
if (entries.length === 0) {
|
|
22
31
|
return undefined;
|
|
23
32
|
}
|
|
24
33
|
return Object.fromEntries(entries.map(parseExecEnvEntry));
|
|
25
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Build the process environment for an agent invocation.
|
|
37
|
+
* Pins CLAUDE_CONFIG_DIR for Claude and CODEX_HOME for Codex; strips the
|
|
38
|
+
* other agent's env var so it doesn't leak into unrelated invocations.
|
|
39
|
+
*/
|
|
26
40
|
export function buildExecEnv(options) {
|
|
27
41
|
const result = { ...process.env };
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
// when we are, pin it to the resolved version's home.
|
|
42
|
+
// Config-dir env vars are agent-specific. When the caller is running inside
|
|
43
|
+
// an agent-managed shell, process.env already carries one; spreading into a
|
|
44
|
+
// different agent's env would leak a config pointer the target CLI doesn't
|
|
45
|
+
// understand. Strip foreign vars and pin the right one to the versioned home.
|
|
33
46
|
if (options.agent === 'claude') {
|
|
34
47
|
const cwd = options.cwd || process.cwd();
|
|
35
|
-
const
|
|
36
|
-
|
|
48
|
+
const resolvedVersion = options.version ?? resolveVersion('claude', cwd);
|
|
49
|
+
// Use an explicitly pinned version unconditionally; for auto-resolved versions
|
|
50
|
+
// only inject the path when the version is actually installed on disk.
|
|
51
|
+
const version = options.version
|
|
52
|
+
? resolvedVersion
|
|
53
|
+
: (resolvedVersion && isVersionInstalled('claude', resolvedVersion) ? resolvedVersion : null);
|
|
54
|
+
if (version) {
|
|
37
55
|
result.CLAUDE_CONFIG_DIR = path.join(getVersionHomePath('claude', version), '.claude');
|
|
38
56
|
}
|
|
57
|
+
delete result.CODEX_HOME;
|
|
58
|
+
}
|
|
59
|
+
else if (options.agent === 'codex') {
|
|
60
|
+
const cwd = options.cwd || process.cwd();
|
|
61
|
+
const resolvedVersion = options.version ?? resolveVersion('codex', cwd);
|
|
62
|
+
const version = options.version
|
|
63
|
+
? resolvedVersion
|
|
64
|
+
: (resolvedVersion && isVersionInstalled('codex', resolvedVersion) ? resolvedVersion : null);
|
|
65
|
+
if (version) {
|
|
66
|
+
result.CODEX_HOME = path.join(getVersionHomePath('codex', version), '.codex');
|
|
67
|
+
}
|
|
68
|
+
delete result.CLAUDE_CONFIG_DIR;
|
|
39
69
|
}
|
|
40
70
|
else {
|
|
41
71
|
delete result.CLAUDE_CONFIG_DIR;
|
|
72
|
+
delete result.CODEX_HOME;
|
|
42
73
|
}
|
|
43
74
|
return {
|
|
44
75
|
...result,
|
|
45
76
|
...options.env,
|
|
46
77
|
};
|
|
47
78
|
}
|
|
79
|
+
/** CLI command templates for every supported agent. */
|
|
48
80
|
export const AGENT_COMMANDS = {
|
|
49
81
|
claude: {
|
|
50
82
|
base: ['claude'],
|
|
@@ -164,9 +196,11 @@ export const AGENT_COMMANDS = {
|
|
|
164
196
|
modelFlag: '--model',
|
|
165
197
|
},
|
|
166
198
|
};
|
|
199
|
+
/** Assemble the full CLI argument array for an agent invocation. */
|
|
167
200
|
export function buildExecCommand(options) {
|
|
168
201
|
const template = AGENT_COMMANDS[options.agent];
|
|
169
202
|
const cmd = [...template.base];
|
|
203
|
+
const interactive = options.interactive === true || options.prompt === undefined;
|
|
170
204
|
// Use versioned alias if a specific version was requested (e.g., claude@2.1.98)
|
|
171
205
|
if (options.version && cmd.length > 0) {
|
|
172
206
|
cmd[0] = `${cmd[0]}@${options.version}`;
|
|
@@ -189,8 +223,10 @@ export function buildExecCommand(options) {
|
|
|
189
223
|
// Add mode flags
|
|
190
224
|
const modeFlags = template.modeFlags[options.mode];
|
|
191
225
|
cmd.push(...modeFlags);
|
|
192
|
-
// Add print/headless flags
|
|
193
|
-
|
|
226
|
+
// Add print/headless flags only when a prompt is provided. Without a prompt
|
|
227
|
+
// the caller wants an interactive REPL -- passing --print would immediately
|
|
228
|
+
// wait on stdin and never render the TUI.
|
|
229
|
+
if (!interactive && options.headless && template.printFlags) {
|
|
194
230
|
cmd.push(...template.printFlags);
|
|
195
231
|
}
|
|
196
232
|
// Add session ID (Claude only)
|
|
@@ -222,12 +258,16 @@ export function buildExecCommand(options) {
|
|
|
222
258
|
cmd.push(template.verboseFlag);
|
|
223
259
|
}
|
|
224
260
|
}
|
|
225
|
-
// Add prompt
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
261
|
+
// Add prompt when provided. In pure interactive mode (no prompt) we skip this
|
|
262
|
+
// so the CLI launches its TUI. When --interactive is passed alongside a prompt
|
|
263
|
+
// we still forward the prompt so the agent receives it as the first message.
|
|
264
|
+
if (options.prompt !== undefined) {
|
|
265
|
+
if (template.promptFlag === 'positional') {
|
|
266
|
+
cmd.push(options.prompt);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
cmd.push(template.promptFlag, options.prompt);
|
|
270
|
+
}
|
|
231
271
|
}
|
|
232
272
|
// Claude-specific: add dirs
|
|
233
273
|
if (options.agent === 'claude' && options.addDirs) {
|
|
@@ -237,6 +277,7 @@ export function buildExecCommand(options) {
|
|
|
237
277
|
}
|
|
238
278
|
return cmd;
|
|
239
279
|
}
|
|
280
|
+
/** Spawn an agent and return its exit code. Convenience wrapper over spawnAgent. */
|
|
240
281
|
export async function execAgent(options) {
|
|
241
282
|
const { exitCode } = await spawnAgent(options);
|
|
242
283
|
return exitCode;
|
|
@@ -245,7 +286,7 @@ export async function execAgent(options) {
|
|
|
245
286
|
* Spawn an agent process and return its exit code plus a tee'd copy of stderr.
|
|
246
287
|
*
|
|
247
288
|
* Stderr is always piped so the caller can inspect it (e.g., for rate-limit
|
|
248
|
-
* detection) while also forwarding every chunk to process.stderr in real time
|
|
289
|
+
* detection) while also forwarding every chunk to process.stderr in real time --
|
|
249
290
|
* the user sees the same output they would with stdio: 'inherit'. Stdout keeps
|
|
250
291
|
* the original behavior: 'pipe' when downstream output is piped (so `agents
|
|
251
292
|
* run ... | ...` composes cleanly), otherwise 'inherit' so TTY output is
|
|
@@ -256,23 +297,27 @@ async function spawnAgent(options) {
|
|
|
256
297
|
const [executable, ...args] = cmd;
|
|
257
298
|
const timeoutMs = options.timeout ? parseTimeout(options.timeout) : undefined;
|
|
258
299
|
const piped = !process.stdout.isTTY;
|
|
300
|
+
const interactive = options.interactive === true || options.prompt === undefined;
|
|
259
301
|
return new Promise((resolve, reject) => {
|
|
302
|
+
// Interactive mode inherits all stdio so the CLI owns the TTY (TUI
|
|
303
|
+
// rendering, raw-mode keystrokes, colored output). Headless mode pipes
|
|
304
|
+
// stderr so we can scan for rate limits and feed fallback. stdout stays
|
|
305
|
+
// inherited for TTY, piped when the caller pipes us downstream.
|
|
306
|
+
const stdio = interactive
|
|
307
|
+
? ['inherit', 'inherit', 'inherit']
|
|
308
|
+
: ['inherit', piped ? 'pipe' : 'inherit', 'pipe'];
|
|
260
309
|
const child = spawn(executable, args, {
|
|
261
310
|
cwd: options.cwd || process.cwd(),
|
|
262
|
-
stdio
|
|
263
|
-
'inherit',
|
|
264
|
-
piped ? 'pipe' : 'inherit',
|
|
265
|
-
'pipe',
|
|
266
|
-
],
|
|
311
|
+
stdio,
|
|
267
312
|
env: buildExecEnv(options),
|
|
268
313
|
shell: false,
|
|
269
314
|
});
|
|
270
|
-
if (piped && child.stdout) {
|
|
315
|
+
if (!interactive && piped && child.stdout) {
|
|
271
316
|
child.stdout.pipe(process.stdout);
|
|
272
317
|
}
|
|
273
318
|
let stderrBuffer = '';
|
|
274
319
|
const STDERR_BUFFER_CAP = 64 * 1024;
|
|
275
|
-
if (child.stderr) {
|
|
320
|
+
if (!interactive && child.stderr) {
|
|
276
321
|
child.stderr.on('data', (chunk) => {
|
|
277
322
|
process.stderr.write(chunk);
|
|
278
323
|
if (stderrBuffer.length < STDERR_BUFFER_CAP) {
|
|
@@ -304,7 +349,7 @@ async function spawnAgent(options) {
|
|
|
304
349
|
}
|
|
305
350
|
/**
|
|
306
351
|
* Patterns that indicate a rate/usage limit. Matching is intentionally broad
|
|
307
|
-
* because providers phrase these differently
|
|
352
|
+
* because providers phrase these differently -- Anthropic uses "5-hour limit"
|
|
308
353
|
* and "rate limit", OpenAI surfaces 429s, Google says "quota exceeded".
|
|
309
354
|
* False positives here just trigger a fallback attempt; false negatives leave
|
|
310
355
|
* the original error unhandled, which is worse.
|
|
@@ -319,6 +364,7 @@ export const RATE_LIMIT_PATTERNS = [
|
|
|
319
364
|
/api[\s_-]?overloaded/i,
|
|
320
365
|
/\boverloaded\b/i,
|
|
321
366
|
];
|
|
367
|
+
/** Return true if the text contains any known rate-limit or overload indicator. */
|
|
322
368
|
export function detectRateLimit(text) {
|
|
323
369
|
return RATE_LIMIT_PATTERNS.some(pattern => pattern.test(text));
|
|
324
370
|
}
|
|
@@ -329,7 +375,7 @@ export function detectRateLimit(text) {
|
|
|
329
375
|
* When the prior agent was Claude we pin its session ID via `--session-id` so
|
|
330
376
|
* `prevSessionId` is always defined; for other primaries we pass undefined and
|
|
331
377
|
* get a simpler retry-with-context prompt. Claude understands `/continue <id>`
|
|
332
|
-
* via its shipped skill
|
|
378
|
+
* via its shipped skill -- other agents fall through to an explicit instruction
|
|
333
379
|
* that points at the version-agnostic `agents sessions <id>` reader.
|
|
334
380
|
*/
|
|
335
381
|
export function buildFallbackPrompt(prevAgent, prevSessionId, nextAgent, originalPrompt) {
|
|
@@ -350,7 +396,7 @@ export function buildFallbackPrompt(prevAgent, prevSessionId, nextAgent, origina
|
|
|
350
396
|
*
|
|
351
397
|
* The primary agent gets the original prompt. Subsequent agents get a
|
|
352
398
|
* `/continue <id>`-style handoff (see buildFallbackPrompt) when we can pin a
|
|
353
|
-
* session ID
|
|
399
|
+
* session ID -- which today means Claude as primary (supports `--session-id`).
|
|
354
400
|
* For other primaries, fallbacks run with the original prompt plus a
|
|
355
401
|
* retry-with-context note, since we can't deterministically resolve their
|
|
356
402
|
* auto-generated session IDs.
|
|
@@ -411,4 +457,3 @@ export async function runWithFallback(options) {
|
|
|
411
457
|
}
|
|
412
458
|
return 1;
|
|
413
459
|
}
|
|
414
|
-
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/** Walk a directory recursively for files with a given extension. */
|
|
4
|
+
export function walkForFiles(dir, ext, limit) {
|
|
5
|
+
const results = [];
|
|
6
|
+
function walk(d, depth) {
|
|
7
|
+
if (depth > 5)
|
|
8
|
+
return;
|
|
9
|
+
let entries;
|
|
10
|
+
try {
|
|
11
|
+
entries = fs.readdirSync(d);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
for (const entry of entries) {
|
|
17
|
+
const full = path.join(d, entry);
|
|
18
|
+
const stat = safeStatSync(full);
|
|
19
|
+
if (!stat)
|
|
20
|
+
continue;
|
|
21
|
+
if (stat.isDirectory()) {
|
|
22
|
+
walk(full, depth + 1);
|
|
23
|
+
}
|
|
24
|
+
else if (entry.endsWith(ext)) {
|
|
25
|
+
results.push({ path: full, mtime: stat.mtimeMs });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
walk(dir, 0);
|
|
30
|
+
results.sort((a, b) => b.mtime - a.mtime);
|
|
31
|
+
return results.slice(0, limit).map(r => r.path);
|
|
32
|
+
}
|
|
33
|
+
function safeStatSync(p) {
|
|
34
|
+
try {
|
|
35
|
+
return fs.statSync(p);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fuzzy string matching for user-provided identifiers.
|
|
3
|
+
* Auto-corrects typos like "cladue" -> "claude" based on Levenshtein distance.
|
|
4
|
+
*/
|
|
5
|
+
/** Levenshtein edit distance between two strings. */
|
|
6
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
7
|
+
export interface FuzzyOptions {
|
|
8
|
+
/** Absolute max edit distance allowed. */
|
|
9
|
+
maxDistance?: number;
|
|
10
|
+
/** Max ratio of distance to input length. If set, effective threshold = min(maxDistance, floor(len * maxRatio)). */
|
|
11
|
+
maxRatio?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Fuzzy match an input string against a list of candidates.
|
|
15
|
+
* Returns the single best match within tolerance, or null if no match or ambiguous.
|
|
16
|
+
*/
|
|
17
|
+
export declare function fuzzyMatch<T extends string>(input: string, candidates: readonly T[], options?: FuzzyOptions): T | null;
|
|
18
|
+
/**
|
|
19
|
+
* Preset configurations for different identifier types.
|
|
20
|
+
* Based on pairwise distance analysis of candidate pools.
|
|
21
|
+
*/
|
|
22
|
+
export declare const FUZZY_PRESETS: {
|
|
23
|
+
/** Agents: min pairwise dist=3 (opencode/openclaw), safe tolerance=2 */
|
|
24
|
+
readonly agents: {
|
|
25
|
+
readonly maxDistance: 2;
|
|
26
|
+
};
|
|
27
|
+
/** Modes: plan/edit/full all at dist=4, lenient */
|
|
28
|
+
readonly modes: {
|
|
29
|
+
readonly maxDistance: 2;
|
|
30
|
+
};
|
|
31
|
+
/** Efforts: high/xhigh at dist=1, must be strict */
|
|
32
|
+
readonly efforts: {
|
|
33
|
+
readonly maxDistance: 1;
|
|
34
|
+
};
|
|
35
|
+
/** Strategies: pinned/available/rotate all far apart */
|
|
36
|
+
readonly strategies: {
|
|
37
|
+
readonly maxDistance: 2;
|
|
38
|
+
};
|
|
39
|
+
/** Beta features: drive/factory at dist=7, lenient */
|
|
40
|
+
readonly beta: {
|
|
41
|
+
readonly maxDistance: 2;
|
|
42
|
+
};
|
|
43
|
+
/** Dynamic/user-defined: profiles, commands, hooks, etc. */
|
|
44
|
+
readonly dynamic: {
|
|
45
|
+
readonly maxDistance: 2;
|
|
46
|
+
readonly maxRatio: 0.3;
|
|
47
|
+
};
|
|
48
|
+
/** Skills: often longer names, slightly more lenient */
|
|
49
|
+
readonly skills: {
|
|
50
|
+
readonly maxDistance: 3;
|
|
51
|
+
readonly maxRatio: 0.3;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fuzzy string matching for user-provided identifiers.
|
|
3
|
+
* Auto-corrects typos like "cladue" -> "claude" based on Levenshtein distance.
|
|
4
|
+
*/
|
|
5
|
+
/** Levenshtein edit distance between two strings. */
|
|
6
|
+
export function levenshtein(a, b) {
|
|
7
|
+
const m = a.length, n = b.length;
|
|
8
|
+
if (m === 0)
|
|
9
|
+
return n;
|
|
10
|
+
if (n === 0)
|
|
11
|
+
return m;
|
|
12
|
+
const dp = Array.from({ length: m + 1 }, (_, i) => Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)));
|
|
13
|
+
for (let i = 1; i <= m; i++) {
|
|
14
|
+
for (let j = 1; j <= n; j++) {
|
|
15
|
+
dp[i][j] = a[i - 1] === b[j - 1]
|
|
16
|
+
? dp[i - 1][j - 1]
|
|
17
|
+
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return dp[m][n];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Fuzzy match an input string against a list of candidates.
|
|
24
|
+
* Returns the single best match within tolerance, or null if no match or ambiguous.
|
|
25
|
+
*/
|
|
26
|
+
export function fuzzyMatch(input, candidates, options = {}) {
|
|
27
|
+
const { maxDistance = 2, maxRatio } = options;
|
|
28
|
+
const lower = input.toLowerCase();
|
|
29
|
+
// Reject inputs that are too short - they're too ambiguous
|
|
30
|
+
if (lower.length < 3)
|
|
31
|
+
return null;
|
|
32
|
+
// Compute effective threshold
|
|
33
|
+
const threshold = maxRatio
|
|
34
|
+
? Math.min(maxDistance, Math.floor(lower.length * maxRatio))
|
|
35
|
+
: maxDistance;
|
|
36
|
+
// Find all candidates within threshold (excluding exact matches)
|
|
37
|
+
const matches = [];
|
|
38
|
+
for (const candidate of candidates) {
|
|
39
|
+
const dist = levenshtein(lower, candidate.toLowerCase());
|
|
40
|
+
if (dist > 0 && dist <= threshold) {
|
|
41
|
+
matches.push({ candidate, dist });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (matches.length === 0)
|
|
45
|
+
return null;
|
|
46
|
+
// Sort by distance
|
|
47
|
+
matches.sort((a, b) => a.dist - b.dist);
|
|
48
|
+
// Only return if exactly one candidate at the minimum distance (no ambiguity)
|
|
49
|
+
const minDist = matches[0].dist;
|
|
50
|
+
const atMinDist = matches.filter(m => m.dist === minDist);
|
|
51
|
+
return atMinDist.length === 1 ? atMinDist[0].candidate : null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Preset configurations for different identifier types.
|
|
55
|
+
* Based on pairwise distance analysis of candidate pools.
|
|
56
|
+
*/
|
|
57
|
+
export const FUZZY_PRESETS = {
|
|
58
|
+
/** Agents: min pairwise dist=3 (opencode/openclaw), safe tolerance=2 */
|
|
59
|
+
agents: { maxDistance: 2 },
|
|
60
|
+
/** Modes: plan/edit/full all at dist=4, lenient */
|
|
61
|
+
modes: { maxDistance: 2 },
|
|
62
|
+
/** Efforts: high/xhigh at dist=1, must be strict */
|
|
63
|
+
efforts: { maxDistance: 1 },
|
|
64
|
+
/** Strategies: pinned/available/rotate all far apart */
|
|
65
|
+
strategies: { maxDistance: 2 },
|
|
66
|
+
/** Beta features: drive/factory at dist=7, lenient */
|
|
67
|
+
beta: { maxDistance: 2 },
|
|
68
|
+
/** Dynamic/user-defined: profiles, commands, hooks, etc. */
|
|
69
|
+
dynamic: { maxDistance: 2, maxRatio: 0.3 },
|
|
70
|
+
/** Skills: often longer names, slightly more lenient */
|
|
71
|
+
skills: { maxDistance: 3, maxRatio: 0.3 },
|
|
72
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function readGeminiSettings(settingsPath: string): Record<string, unknown>;
|
|
2
|
+
export declare function writeGeminiSettings(settingsPath: string, settings: Record<string, unknown>): void;
|
|
3
|
+
export declare function updateGeminiSettings(settingsPath: string, mutate: (settings: Record<string, unknown>) => void): Record<string, unknown>;
|
|
4
|
+
export declare function setGeminiAutoUpdateDisabled(settings: Record<string, unknown>): void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
function isRecord(value) {
|
|
4
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
export function readGeminiSettings(settingsPath) {
|
|
7
|
+
if (!fs.existsSync(settingsPath)) {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
const raw = fs.readFileSync(settingsPath, 'utf-8');
|
|
11
|
+
const parsed = JSON.parse(raw);
|
|
12
|
+
if (!isRecord(parsed)) {
|
|
13
|
+
throw new Error(`Gemini settings must be a JSON object: ${settingsPath}`);
|
|
14
|
+
}
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
export function writeGeminiSettings(settingsPath, settings) {
|
|
18
|
+
fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
|
|
19
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
export function updateGeminiSettings(settingsPath, mutate) {
|
|
22
|
+
const settings = readGeminiSettings(settingsPath);
|
|
23
|
+
mutate(settings);
|
|
24
|
+
writeGeminiSettings(settingsPath, settings);
|
|
25
|
+
return settings;
|
|
26
|
+
}
|
|
27
|
+
export function setGeminiAutoUpdateDisabled(settings) {
|
|
28
|
+
const general = isRecord(settings.general) ? settings.general : {};
|
|
29
|
+
settings.general = {
|
|
30
|
+
...general,
|
|
31
|
+
enableAutoUpdate: false,
|
|
32
|
+
};
|
|
33
|
+
}
|
package/dist/lib/git.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** Parsed representation of a git source string (GitHub, generic URL, or local path). */
|
|
1
2
|
export interface GitSource {
|
|
2
3
|
type: 'github' | 'url' | 'local';
|
|
3
4
|
url: string;
|
|
@@ -21,20 +22,24 @@ export interface GitSource {
|
|
|
21
22
|
* ./relative/path -> local path
|
|
22
23
|
*/
|
|
23
24
|
export declare function parseSource(source: string): GitSource;
|
|
25
|
+
/** Clone a remote repo or pull updates if it already exists locally. */
|
|
24
26
|
export declare function cloneOrPull(source: GitSource, targetDir: string): Promise<{
|
|
25
27
|
isNew: boolean;
|
|
26
28
|
commit: string;
|
|
27
29
|
}>;
|
|
30
|
+
/** Clone a repository from a source string, returning the local path and commit hash. */
|
|
28
31
|
export declare function cloneRepo(source: string): Promise<{
|
|
29
32
|
localPath: string;
|
|
30
33
|
commit: string;
|
|
31
34
|
isNew: boolean;
|
|
32
35
|
}>;
|
|
36
|
+
/** Clone a package from a source string into the packages directory. */
|
|
33
37
|
export declare function clonePackage(source: string): Promise<{
|
|
34
38
|
localPath: string;
|
|
35
39
|
commit: string;
|
|
36
40
|
isNew: boolean;
|
|
37
41
|
}>;
|
|
42
|
+
/** Get the short commit hash (8 chars) of the latest commit in a repo. */
|
|
38
43
|
export declare function getRepoCommit(repoPath: string): Promise<string>;
|
|
39
44
|
/**
|
|
40
45
|
* Get the current GitHub username using gh CLI.
|
|
@@ -91,7 +96,7 @@ export declare function isSystemRepoOrigin(dir: string): Promise<boolean>;
|
|
|
91
96
|
export declare function hasLocalChanges(dir: string): Promise<boolean>;
|
|
92
97
|
/**
|
|
93
98
|
* Pull changes in an existing repo.
|
|
94
|
-
* Refuses to pull if the working tree is dirty
|
|
99
|
+
* Refuses to pull if the working tree is dirty -- user must commit or discard changes first.
|
|
95
100
|
*/
|
|
96
101
|
export declare function pullRepo(dir: string): Promise<{
|
|
97
102
|
success: boolean;
|
|
@@ -103,12 +108,18 @@ export declare function pullRepo(dir: string): Promise<{
|
|
|
103
108
|
* Returns files categorized by their status relative to HEAD.
|
|
104
109
|
*/
|
|
105
110
|
export interface GitSyncStatus {
|
|
111
|
+
/** Tracked and unchanged files. */
|
|
106
112
|
synced: string[];
|
|
113
|
+
/** Modified but not staged files. */
|
|
107
114
|
modified: string[];
|
|
115
|
+
/** Untracked files. */
|
|
108
116
|
new: string[];
|
|
117
|
+
/** Staged for commit. */
|
|
109
118
|
staged: string[];
|
|
119
|
+
/** Deleted files. */
|
|
110
120
|
deleted: string[];
|
|
111
121
|
}
|
|
122
|
+
/** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
|
|
112
123
|
export declare function getGitSyncStatus(dir: string, subdir?: string): Promise<GitSyncStatus | null>;
|
|
113
124
|
/**
|
|
114
125
|
* Get list of files tracked by git in a directory.
|
|
@@ -143,4 +154,3 @@ export declare function tryAutoPull(dir: string): Promise<{
|
|
|
143
154
|
pulled: boolean;
|
|
144
155
|
error?: string;
|
|
145
156
|
}>;
|
|
146
|
-
//# sourceMappingURL=git.d.ts.map
|
package/dist/lib/git.js
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git operations for the agents-cli system repo and package repositories.
|
|
3
|
+
*
|
|
4
|
+
* Handles cloning, pulling, syncing, and inspecting git repos used by
|
|
5
|
+
* the agents version management and plugin/package system. Includes
|
|
6
|
+
* source parsing for GitHub shorthand, SSH, HTTPS, and local paths.
|
|
7
|
+
*/
|
|
1
8
|
import simpleGit from 'simple-git';
|
|
2
9
|
import * as fs from 'fs';
|
|
3
10
|
import * as path from 'path';
|
|
@@ -8,7 +15,7 @@ import { DEFAULT_SYSTEM_REPO, LEGACY_SYSTEM_REPO, systemRepoSlug } from './types
|
|
|
8
15
|
*
|
|
9
16
|
* Why: `git config core.hooksPath` is a known sandbox-escape vector and is
|
|
10
17
|
* blocked by some sandboxed environments (e.g. Claude Code). Symlinks inside
|
|
11
|
-
* `.git/hooks/` sidestep that restriction entirely
|
|
18
|
+
* `.git/hooks/` sidestep that restriction entirely -- Git runs them the same way.
|
|
12
19
|
*/
|
|
13
20
|
function installGithooksSymlinks(repoDir) {
|
|
14
21
|
const githooksDir = path.join(repoDir, '.githooks');
|
|
@@ -149,6 +156,7 @@ export function parseSource(source) {
|
|
|
149
156
|
}
|
|
150
157
|
throw new Error(`Invalid source: ${source}. Supported formats: gh:owner/repo, owner/repo, github.com/owner/repo, https://github.com/owner/repo, or local path`);
|
|
151
158
|
}
|
|
159
|
+
/** Clone a remote repo or pull updates if it already exists locally. */
|
|
152
160
|
export async function cloneOrPull(source, targetDir) {
|
|
153
161
|
const git = simpleGit();
|
|
154
162
|
if (source.type === 'local') {
|
|
@@ -174,6 +182,7 @@ export async function cloneOrPull(source, targetDir) {
|
|
|
174
182
|
const log = await repoGit.log({ maxCount: 1 });
|
|
175
183
|
return { isNew: true, commit: log.latest?.hash.slice(0, 8) || 'unknown' };
|
|
176
184
|
}
|
|
185
|
+
/** Clone a repository from a source string, returning the local path and commit hash. */
|
|
177
186
|
export async function cloneRepo(source) {
|
|
178
187
|
const parsed = parseSource(source);
|
|
179
188
|
if (parsed.type === 'local') {
|
|
@@ -191,6 +200,7 @@ export async function cloneRepo(source) {
|
|
|
191
200
|
isNew: result.isNew,
|
|
192
201
|
};
|
|
193
202
|
}
|
|
203
|
+
/** Clone a package from a source string into the packages directory. */
|
|
194
204
|
export async function clonePackage(source) {
|
|
195
205
|
const parsed = parseSource(source);
|
|
196
206
|
if (parsed.type === 'local') {
|
|
@@ -208,6 +218,7 @@ export async function clonePackage(source) {
|
|
|
208
218
|
isNew: result.isNew,
|
|
209
219
|
};
|
|
210
220
|
}
|
|
221
|
+
/** Get the short commit hash (8 chars) of the latest commit in a repo. */
|
|
211
222
|
export async function getRepoCommit(repoPath) {
|
|
212
223
|
try {
|
|
213
224
|
const git = simpleGit(repoPath);
|
|
@@ -270,10 +281,10 @@ export async function setRemoteUrl(repoPath, url) {
|
|
|
270
281
|
*/
|
|
271
282
|
export async function checkGitHubRepoExists(owner, repo) {
|
|
272
283
|
try {
|
|
273
|
-
const {
|
|
284
|
+
const { execFile } = await import('child_process');
|
|
274
285
|
const { promisify } = await import('util');
|
|
275
|
-
const
|
|
276
|
-
await
|
|
286
|
+
const execFileAsync = promisify(execFile);
|
|
287
|
+
await execFileAsync('gh', ['repo', 'view', `${owner}/${repo}`, '--json', 'name']);
|
|
277
288
|
return true;
|
|
278
289
|
}
|
|
279
290
|
catch {
|
|
@@ -414,7 +425,7 @@ export async function hasLocalChanges(dir) {
|
|
|
414
425
|
}
|
|
415
426
|
/**
|
|
416
427
|
* Pull changes in an existing repo.
|
|
417
|
-
* Refuses to pull if the working tree is dirty
|
|
428
|
+
* Refuses to pull if the working tree is dirty -- user must commit or discard changes first.
|
|
418
429
|
*/
|
|
419
430
|
export async function pullRepo(dir) {
|
|
420
431
|
try {
|
|
@@ -440,6 +451,7 @@ export async function pullRepo(dir) {
|
|
|
440
451
|
return { success: false, commit: '', error: err.message };
|
|
441
452
|
}
|
|
442
453
|
}
|
|
454
|
+
/** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
|
|
443
455
|
export async function getGitSyncStatus(dir, subdir) {
|
|
444
456
|
if (!isGitRepo(dir)) {
|
|
445
457
|
return null;
|
|
@@ -632,4 +644,3 @@ export async function tryAutoPull(dir) {
|
|
|
632
644
|
return { pulled: false, error: err.message };
|
|
633
645
|
}
|
|
634
646
|
}
|
|
635
|
-
//# sourceMappingURL=git.js.map
|