@phnx-labs/agents-cli 1.12.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 +293 -300
- 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 +511 -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 +79 -0
- package/dist/lib/rotate.js +285 -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
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in profile presets for popular model providers.
|
|
3
|
+
*
|
|
4
|
+
* Each preset bundles a host CLI, API base URL, default model, and provider
|
|
5
|
+
* name so users can `agents profiles add kimi` without manual configuration.
|
|
6
|
+
*/
|
|
7
|
+
// Model IDs verified against openrouter.ai/api/v1/models on 2026-04-20.
|
|
8
|
+
// Presets target the top-ranked open-source model per provider based on
|
|
9
|
+
// SWE-bench Verified, LiveCodeBench, HumanEval, and Chatbot Arena rankings.
|
|
10
|
+
//
|
|
11
|
+
// Important limitation of Claude Code + non-Anthropic models via OpenRouter:
|
|
12
|
+
// Claude Code sends `thinking:{type:"enabled"}` in its Anthropic payload by
|
|
13
|
+
// default, and its `--print` consolidation returns empty text when a response
|
|
14
|
+
// contains thinking/redacted_thinking blocks — even when the model *also*
|
|
15
|
+
// emits a text block. This means reasoning models work fine in interactive
|
|
16
|
+
// `claude` mode (same env vars) but `agents run <profile> --print` sees
|
|
17
|
+
// empty stdout.
|
|
18
|
+
//
|
|
19
|
+
// Presets flagged "print-safe" use non-reasoning variants that ignore
|
|
20
|
+
// thinking:enabled. Presets flagged "reasoning" are the leaderboard leaders
|
|
21
|
+
// but are best invoked interactively.
|
|
22
|
+
const OPENROUTER_BASE = 'https://openrouter.ai/api';
|
|
23
|
+
const OPENROUTER_AUTH = {
|
|
24
|
+
provider: 'openrouter',
|
|
25
|
+
host: 'claude',
|
|
26
|
+
authEnvVar: 'ANTHROPIC_AUTH_TOKEN',
|
|
27
|
+
signupUrl: 'https://openrouter.ai/keys',
|
|
28
|
+
};
|
|
29
|
+
export const PRESETS = [
|
|
30
|
+
// ----- Top coding (via OpenRouter) -----
|
|
31
|
+
{
|
|
32
|
+
name: 'kimi',
|
|
33
|
+
description: 'Kimi K2.5 via OpenRouter (262K ctx, $0.38/$1.72 per 1M). Top Kimi: 99% HumanEval, 76.8% SWE-bench. REASONING — works interactively, but `agents run --print` returns empty stdout. Use `kimi-chat` preset for scripting.',
|
|
34
|
+
...OPENROUTER_AUTH,
|
|
35
|
+
env: {
|
|
36
|
+
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
37
|
+
ANTHROPIC_MODEL: 'moonshotai/kimi-k2.5',
|
|
38
|
+
ANTHROPIC_SMALL_FAST_MODEL: 'moonshotai/kimi-k2.5',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'kimi-chat',
|
|
43
|
+
description: 'Kimi K2 0905 via OpenRouter (262K ctx, $0.40/$2.00 per 1M). Non-reasoning sibling of K2.5 — slightly older but PRINT-SAFE, works end-to-end with `agents run --print` and in scripts/automation.',
|
|
44
|
+
...OPENROUTER_AUTH,
|
|
45
|
+
env: {
|
|
46
|
+
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
47
|
+
ANTHROPIC_MODEL: 'moonshotai/kimi-k2-0905',
|
|
48
|
+
ANTHROPIC_SMALL_FAST_MODEL: 'moonshotai/kimi-k2-0905',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'minimax',
|
|
53
|
+
description: 'MiniMax M2.5 via OpenRouter (230B params). #1 SWE-bench Verified (80.2%) on Apr 2026 leaderboards. REASONING — works interactively, --print returns empty.',
|
|
54
|
+
...OPENROUTER_AUTH,
|
|
55
|
+
env: {
|
|
56
|
+
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
57
|
+
ANTHROPIC_MODEL: 'minimax/minimax-m2.5',
|
|
58
|
+
ANTHROPIC_SMALL_FAST_MODEL: 'minimax/minimax-m2.5',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'glm',
|
|
63
|
+
description: 'GLM 5 via OpenRouter (80K ctx, $0.72/$2.30 per 1M). #1 Chatbot Arena ELO (1451) among open-weight models on BenchLM.ai (Apr 2026). Prompt-complexity-dependent reasoning — Claude Code\'s 38K system prompt typically triggers thinking blocks, so --print is unreliable. Interactive use is fine.',
|
|
64
|
+
...OPENROUTER_AUTH,
|
|
65
|
+
env: {
|
|
66
|
+
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
67
|
+
ANTHROPIC_MODEL: 'z-ai/glm-5',
|
|
68
|
+
ANTHROPIC_SMALL_FAST_MODEL: 'z-ai/glm-5',
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'qwen',
|
|
73
|
+
description: 'Qwen3 Coder Next via OpenRouter (256K ctx, $0.15/$0.80 per 1M, sparse MoE 80B/3B active). Latest coding-specific Qwen (Feb 2026). PRINT-SAFE — works with `agents run --print`.',
|
|
74
|
+
...OPENROUTER_AUTH,
|
|
75
|
+
env: {
|
|
76
|
+
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
77
|
+
ANTHROPIC_MODEL: 'qwen/qwen3-coder-next',
|
|
78
|
+
ANTHROPIC_SMALL_FAST_MODEL: 'qwen/qwen3-coder-next',
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'deepseek',
|
|
83
|
+
description: 'DeepSeek Chat V3 (0324) via OpenRouter. Latest DeepSeek Chat variant that ignores thinking:enabled. PRINT-SAFE. The newer V3.2 / V3.1-Terminus / V3.2-Speciale are reasoning variants — use `--model deepseek/deepseek-v3.2` to override if you want those for interactive use.',
|
|
84
|
+
...OPENROUTER_AUTH,
|
|
85
|
+
env: {
|
|
86
|
+
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
87
|
+
ANTHROPIC_MODEL: 'deepseek/deepseek-chat-v3-0324',
|
|
88
|
+
ANTHROPIC_SMALL_FAST_MODEL: 'deepseek/deepseek-chat-v3-0324',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
/** Look up a preset by name (case-sensitive). */
|
|
93
|
+
export function getPreset(name) {
|
|
94
|
+
return PRESETS.find((p) => p.name === name);
|
|
95
|
+
}
|
|
96
|
+
/** Return a copy of all available presets. */
|
|
97
|
+
export function listPresets() {
|
|
98
|
+
return [...PRESETS];
|
|
99
|
+
}
|
|
100
|
+
/** Return the unique set of provider names across all presets. */
|
|
101
|
+
export function listProviders() {
|
|
102
|
+
return [...new Set(PRESETS.map((p) => p.provider))];
|
|
103
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile management -- named bundles of (host CLI, endpoint, model, auth).
|
|
3
|
+
*
|
|
4
|
+
* Profiles let users run agents against alternative providers (OpenRouter,
|
|
5
|
+
* custom endpoints) without reconfiguring the agent CLI itself. Stored as
|
|
6
|
+
* YAML files under ~/.agents/profiles/.
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentId } from './types.js';
|
|
9
|
+
import { type Preset } from './profiles-presets.js';
|
|
10
|
+
/** A named profile binding an agent host, env vars, and optional keychain auth. */
|
|
11
|
+
export interface Profile {
|
|
12
|
+
name: string;
|
|
13
|
+
host: {
|
|
14
|
+
agent: AgentId;
|
|
15
|
+
version?: string;
|
|
16
|
+
};
|
|
17
|
+
env: Record<string, string>;
|
|
18
|
+
auth?: {
|
|
19
|
+
envVar: string;
|
|
20
|
+
keychainItem: string;
|
|
21
|
+
};
|
|
22
|
+
description?: string;
|
|
23
|
+
preset?: string;
|
|
24
|
+
provider?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Get the directory where profile YAML files are stored. */
|
|
27
|
+
export declare function getProfilesDir(): string;
|
|
28
|
+
/** Validate a profile name against the allowed pattern. Throws on invalid input. */
|
|
29
|
+
export declare function validateProfileName(name: string): void;
|
|
30
|
+
/** Check whether a profile YAML file exists on disk. */
|
|
31
|
+
export declare function profileExists(name: string): boolean;
|
|
32
|
+
/** Read and parse a profile from disk. Throws if not found or malformed. */
|
|
33
|
+
export declare function readProfile(name: string): Profile;
|
|
34
|
+
/** Write a profile to disk atomically (write-to-tmp then rename). */
|
|
35
|
+
export declare function writeProfile(profile: Profile): void;
|
|
36
|
+
/** Delete a profile from disk. Returns false if it did not exist. */
|
|
37
|
+
export declare function deleteProfile(name: string): boolean;
|
|
38
|
+
/** List all valid profiles, sorted by name. Malformed files are silently skipped. */
|
|
39
|
+
export declare function listProfiles(): Profile[];
|
|
40
|
+
/**
|
|
41
|
+
* Build a profile from a preset. The keychain item is shared across all
|
|
42
|
+
* profiles that point at the same provider, so adding kimi + deepseek prompts
|
|
43
|
+
* for the OpenRouter key exactly once.
|
|
44
|
+
*/
|
|
45
|
+
export declare function profileFromPreset(profileName: string, preset: Preset, version?: string): Profile;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve a profile into the env block that should be injected into the
|
|
48
|
+
* spawned agent process. Reads the token from keychain at exec time so the
|
|
49
|
+
* profile YAML never holds secrets.
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveProfileEnv(profile: Profile): Record<string, string>;
|
|
52
|
+
/** Resolved profile data ready for spawning an agent process. */
|
|
53
|
+
export interface ResolvedProfileRun {
|
|
54
|
+
agent: AgentId;
|
|
55
|
+
version?: string;
|
|
56
|
+
env: Record<string, string>;
|
|
57
|
+
profileName: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolve a name into (agent, version, env). Throws if the name is not a
|
|
61
|
+
* profile. Callers are expected to try agent-id resolution first and fall
|
|
62
|
+
* back to this when that fails, so we don't need a "isProfile" probe.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveProfileForRun(name: string): ResolvedProfileRun;
|
|
65
|
+
/**
|
|
66
|
+
* Look up the preset a profile was created from, if any. Used by
|
|
67
|
+
* `profiles view` to show upstream metadata like signup URLs.
|
|
68
|
+
*/
|
|
69
|
+
export declare function getPresetForProfile(profile: Profile): Preset | undefined;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile management -- named bundles of (host CLI, endpoint, model, auth).
|
|
3
|
+
*
|
|
4
|
+
* Profiles let users run agents against alternative providers (OpenRouter,
|
|
5
|
+
* custom endpoints) without reconfiguring the agent CLI itself. Stored as
|
|
6
|
+
* YAML files under ~/.agents/profiles/.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as yaml from 'yaml';
|
|
11
|
+
import { getUserAgentsDir } from './state.js';
|
|
12
|
+
import { getKeychainToken, keychainItemName } from './secrets/profiles.js';
|
|
13
|
+
import { getPreset } from './profiles-presets.js';
|
|
14
|
+
const PROFILE_NAME_PATTERN = /^[a-z0-9][a-z0-9-_]{0,48}$/i;
|
|
15
|
+
/** Get the directory where profile YAML files are stored. */
|
|
16
|
+
export function getProfilesDir() {
|
|
17
|
+
return path.join(getUserAgentsDir(), 'profiles');
|
|
18
|
+
}
|
|
19
|
+
function profilePath(name) {
|
|
20
|
+
return path.join(getProfilesDir(), `${name}.yml`);
|
|
21
|
+
}
|
|
22
|
+
/** Validate a profile name against the allowed pattern. Throws on invalid input. */
|
|
23
|
+
export function validateProfileName(name) {
|
|
24
|
+
if (!PROFILE_NAME_PATTERN.test(name)) {
|
|
25
|
+
throw new Error(`Invalid profile name '${name}'. Use letters, digits, dash, underscore (max 48 chars).`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Check whether a profile YAML file exists on disk. */
|
|
29
|
+
export function profileExists(name) {
|
|
30
|
+
return fs.existsSync(profilePath(name));
|
|
31
|
+
}
|
|
32
|
+
/** Read and parse a profile from disk. Throws if not found or malformed. */
|
|
33
|
+
export function readProfile(name) {
|
|
34
|
+
validateProfileName(name);
|
|
35
|
+
const file = profilePath(name);
|
|
36
|
+
if (!fs.existsSync(file)) {
|
|
37
|
+
throw new Error(`Profile '${name}' not found.`);
|
|
38
|
+
}
|
|
39
|
+
const raw = fs.readFileSync(file, 'utf-8');
|
|
40
|
+
const parsed = yaml.parse(raw);
|
|
41
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
42
|
+
throw new Error(`Profile '${name}' is malformed.`);
|
|
43
|
+
}
|
|
44
|
+
if (!parsed.name)
|
|
45
|
+
parsed.name = name;
|
|
46
|
+
if (!parsed.host?.agent) {
|
|
47
|
+
throw new Error(`Profile '${name}' is missing host.agent.`);
|
|
48
|
+
}
|
|
49
|
+
if (!parsed.env || typeof parsed.env !== 'object') {
|
|
50
|
+
parsed.env = {};
|
|
51
|
+
}
|
|
52
|
+
return parsed;
|
|
53
|
+
}
|
|
54
|
+
/** Write a profile to disk atomically (write-to-tmp then rename). */
|
|
55
|
+
export function writeProfile(profile) {
|
|
56
|
+
validateProfileName(profile.name);
|
|
57
|
+
const dir = getProfilesDir();
|
|
58
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
59
|
+
const body = yaml.stringify(profile);
|
|
60
|
+
const file = profilePath(profile.name);
|
|
61
|
+
const tmp = `${file}.tmp-${process.pid}`;
|
|
62
|
+
fs.writeFileSync(tmp, body, 'utf-8');
|
|
63
|
+
fs.renameSync(tmp, file);
|
|
64
|
+
}
|
|
65
|
+
/** Delete a profile from disk. Returns false if it did not exist. */
|
|
66
|
+
export function deleteProfile(name) {
|
|
67
|
+
validateProfileName(name);
|
|
68
|
+
const file = profilePath(name);
|
|
69
|
+
if (!fs.existsSync(file))
|
|
70
|
+
return false;
|
|
71
|
+
fs.unlinkSync(file);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/** List all valid profiles, sorted by name. Malformed files are silently skipped. */
|
|
75
|
+
export function listProfiles() {
|
|
76
|
+
const dir = getProfilesDir();
|
|
77
|
+
if (!fs.existsSync(dir))
|
|
78
|
+
return [];
|
|
79
|
+
const entries = fs.readdirSync(dir).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'));
|
|
80
|
+
const profiles = [];
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
const name = entry.replace(/\.(yml|yaml)$/, '');
|
|
83
|
+
try {
|
|
84
|
+
profiles.push(readProfile(name));
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Skip malformed profile files; surfacing via `agents profiles view <name>`.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return profiles.sort((a, b) => a.name.localeCompare(b.name));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Build a profile from a preset. The keychain item is shared across all
|
|
94
|
+
* profiles that point at the same provider, so adding kimi + deepseek prompts
|
|
95
|
+
* for the OpenRouter key exactly once.
|
|
96
|
+
*/
|
|
97
|
+
export function profileFromPreset(profileName, preset, version) {
|
|
98
|
+
return {
|
|
99
|
+
name: profileName,
|
|
100
|
+
host: { agent: preset.host, version },
|
|
101
|
+
env: { ...preset.env },
|
|
102
|
+
auth: {
|
|
103
|
+
envVar: preset.authEnvVar,
|
|
104
|
+
keychainItem: keychainItemName(preset.provider),
|
|
105
|
+
},
|
|
106
|
+
description: preset.description,
|
|
107
|
+
preset: preset.name,
|
|
108
|
+
provider: preset.provider,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Resolve a profile into the env block that should be injected into the
|
|
113
|
+
* spawned agent process. Reads the token from keychain at exec time so the
|
|
114
|
+
* profile YAML never holds secrets.
|
|
115
|
+
*/
|
|
116
|
+
export function resolveProfileEnv(profile) {
|
|
117
|
+
const env = { ...profile.env };
|
|
118
|
+
if (profile.auth) {
|
|
119
|
+
const token = getKeychainToken(profile.auth.keychainItem);
|
|
120
|
+
env[profile.auth.envVar] = token;
|
|
121
|
+
}
|
|
122
|
+
return env;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Resolve a name into (agent, version, env). Throws if the name is not a
|
|
126
|
+
* profile. Callers are expected to try agent-id resolution first and fall
|
|
127
|
+
* back to this when that fails, so we don't need a "isProfile" probe.
|
|
128
|
+
*/
|
|
129
|
+
export function resolveProfileForRun(name) {
|
|
130
|
+
const profile = readProfile(name);
|
|
131
|
+
return {
|
|
132
|
+
agent: profile.host.agent,
|
|
133
|
+
version: profile.host.version,
|
|
134
|
+
env: resolveProfileEnv(profile),
|
|
135
|
+
profileName: profile.name,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Look up the preset a profile was created from, if any. Used by
|
|
140
|
+
* `profiles view` to show upstream metadata like signup URLs.
|
|
141
|
+
*/
|
|
142
|
+
export function getPresetForProfile(profile) {
|
|
143
|
+
return profile.preset ? getPreset(profile.preset) : undefined;
|
|
144
|
+
}
|
package/dist/lib/pty-client.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Thin client that connects to the PTY sidecar server over unix socket.
|
|
5
5
|
* Each call opens a connection, sends a JSON request, reads the JSON response, and closes.
|
|
6
6
|
*/
|
|
7
|
+
/** JSON response envelope from the PTY server. */
|
|
7
8
|
export interface PtyResponse {
|
|
8
9
|
ok: boolean;
|
|
9
10
|
error?: string;
|
|
@@ -19,4 +20,3 @@ export declare function ptyRequest(action: string, id?: string, params?: Record<
|
|
|
19
20
|
* Handles: \n \r \t \e \xHH \\
|
|
20
21
|
*/
|
|
21
22
|
export declare function unescapeInput(input: string): string;
|
|
22
|
-
//# sourceMappingURL=pty-client.d.ts.map
|
package/dist/lib/pty-client.js
CHANGED
package/dist/lib/pty-server.d.ts
CHANGED
|
@@ -6,11 +6,25 @@
|
|
|
6
6
|
* across multiple CLI invocations. Each session holds a real PTY (via node-pty)
|
|
7
7
|
* and a headless terminal emulator (via @xterm/headless) for screen rendering.
|
|
8
8
|
*
|
|
9
|
-
* Protocol: newline-delimited JSON over ~/.agents/pty.sock
|
|
9
|
+
* Protocol: newline-delimited JSON over ~/.agents-system/pty.sock
|
|
10
10
|
*/
|
|
11
|
+
/**
|
|
12
|
+
* Capture a stable identifier for a process at the moment it was started.
|
|
13
|
+
* Used to defeat PID reuse: a kill(pid, ...) is only safe when the process
|
|
14
|
+
* still occupies the PID we observed at spawn time.
|
|
15
|
+
*
|
|
16
|
+
* Linux: field 22 of /proc/<pid>/stat (starttime in clock ticks since boot).
|
|
17
|
+
* macOS: output of `ps -o lstart= -p <pid>` (start time in human format).
|
|
18
|
+
* Returns null on any error so callers can skip the guard rather than crash.
|
|
19
|
+
*/
|
|
20
|
+
export declare function captureProcessStartTime(pid: number): string | null;
|
|
21
|
+
/** Get the unix socket path for the PTY server. */
|
|
11
22
|
export declare function getSocketPath(): string;
|
|
23
|
+
/** Get the path to the PTY server PID file. */
|
|
12
24
|
export declare function getPtyPidPath(): string;
|
|
25
|
+
/** Get the path to the PTY server log file. */
|
|
13
26
|
export declare function getPtyLogPath(): string;
|
|
27
|
+
/** Check if the PTY server process is alive by probing the stored PID. */
|
|
14
28
|
export declare function isPtyServerRunning(): boolean;
|
|
29
|
+
/** Start the PTY sidecar server, listening on the unix socket for JSON requests. */
|
|
15
30
|
export declare function runPtyServer(): Promise<void>;
|
|
16
|
-
//# sourceMappingURL=pty-server.d.ts.map
|
package/dist/lib/pty-server.js
CHANGED
|
@@ -6,14 +6,51 @@
|
|
|
6
6
|
* across multiple CLI invocations. Each session holds a real PTY (via node-pty)
|
|
7
7
|
* and a headless terminal emulator (via @xterm/headless) for screen rendering.
|
|
8
8
|
*
|
|
9
|
-
* Protocol: newline-delimited JSON over ~/.agents/pty.sock
|
|
9
|
+
* Protocol: newline-delimited JSON over ~/.agents-system/pty.sock
|
|
10
10
|
*/
|
|
11
11
|
import * as net from 'net';
|
|
12
12
|
import * as fs from 'fs';
|
|
13
13
|
import * as path from 'path';
|
|
14
14
|
import * as crypto from 'crypto';
|
|
15
|
+
import { execFileSync } from 'child_process';
|
|
15
16
|
import { fileURLToPath } from 'url';
|
|
16
17
|
import { getAgentsDir } from './state.js';
|
|
18
|
+
/**
|
|
19
|
+
* Capture a stable identifier for a process at the moment it was started.
|
|
20
|
+
* Used to defeat PID reuse: a kill(pid, ...) is only safe when the process
|
|
21
|
+
* still occupies the PID we observed at spawn time.
|
|
22
|
+
*
|
|
23
|
+
* Linux: field 22 of /proc/<pid>/stat (starttime in clock ticks since boot).
|
|
24
|
+
* macOS: output of `ps -o lstart= -p <pid>` (start time in human format).
|
|
25
|
+
* Returns null on any error so callers can skip the guard rather than crash.
|
|
26
|
+
*/
|
|
27
|
+
export function captureProcessStartTime(pid) {
|
|
28
|
+
if (!pid || pid <= 0)
|
|
29
|
+
return null;
|
|
30
|
+
try {
|
|
31
|
+
if (process.platform === 'linux') {
|
|
32
|
+
const stat = fs.readFileSync(`/proc/${pid}/stat`, 'utf-8');
|
|
33
|
+
// The comm field (#2) is wrapped in parens and may contain spaces, so
|
|
34
|
+
// split off everything after the last `)` to get a clean field list.
|
|
35
|
+
const lastParen = stat.lastIndexOf(')');
|
|
36
|
+
if (lastParen < 0)
|
|
37
|
+
return null;
|
|
38
|
+
const tail = stat.slice(lastParen + 2);
|
|
39
|
+
const fields = tail.split(' ');
|
|
40
|
+
// After comm we are at field 3; starttime is field 22, so index 19 here.
|
|
41
|
+
return fields[19] || null;
|
|
42
|
+
}
|
|
43
|
+
const out = execFileSync('ps', ['-o', 'lstart=', '-p', String(pid)], {
|
|
44
|
+
encoding: 'utf-8',
|
|
45
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
46
|
+
});
|
|
47
|
+
const trimmed = out.trim();
|
|
48
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
17
54
|
// --- Constants ---
|
|
18
55
|
const SENTINEL = '__AGENTS_PTY_DONE__';
|
|
19
56
|
const SOCKET_NAME = 'pty.sock';
|
|
@@ -22,15 +59,39 @@ const LOG_FILE = 'pty.log';
|
|
|
22
59
|
const SESSION_IDLE_MS = 30 * 60 * 1000; // 30 min
|
|
23
60
|
const SERVER_IDLE_MS = 60 * 60 * 1000; // 1 hour
|
|
24
61
|
// --- Path helpers ---
|
|
62
|
+
/** Env vars forwarded into PTY sessions. Excludes API tokens, cloud creds, etc. */
|
|
63
|
+
const PTY_ENV_ALLOWLIST = [
|
|
64
|
+
'HOME', 'PATH', 'SHELL', 'USER', 'LOGNAME',
|
|
65
|
+
'TERM', 'TERM_PROGRAM', 'TERM_PROGRAM_VERSION', 'COLORTERM',
|
|
66
|
+
'LANG', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES', 'TZ',
|
|
67
|
+
'TMPDIR',
|
|
68
|
+
'XDG_RUNTIME_DIR', 'XDG_CONFIG_HOME', 'XDG_DATA_HOME', 'XDG_CACHE_HOME',
|
|
69
|
+
'NODE_PATH', 'NVM_DIR', 'BUN_INSTALL',
|
|
70
|
+
'EDITOR', 'VISUAL', 'PAGER', 'LESS',
|
|
71
|
+
'NO_COLOR', 'FORCE_COLOR',
|
|
72
|
+
];
|
|
73
|
+
function buildPtyEnv() {
|
|
74
|
+
const env = {};
|
|
75
|
+
for (const key of PTY_ENV_ALLOWLIST) {
|
|
76
|
+
const v = process.env[key];
|
|
77
|
+
if (v !== undefined)
|
|
78
|
+
env[key] = v;
|
|
79
|
+
}
|
|
80
|
+
return env;
|
|
81
|
+
}
|
|
82
|
+
/** Get the unix socket path for the PTY server. */
|
|
25
83
|
export function getSocketPath() {
|
|
26
84
|
return path.join(getAgentsDir(), SOCKET_NAME);
|
|
27
85
|
}
|
|
86
|
+
/** Get the path to the PTY server PID file. */
|
|
28
87
|
export function getPtyPidPath() {
|
|
29
88
|
return path.join(getAgentsDir(), PID_FILE);
|
|
30
89
|
}
|
|
90
|
+
/** Get the path to the PTY server log file. */
|
|
31
91
|
export function getPtyLogPath() {
|
|
32
92
|
return path.join(getAgentsDir(), LOG_FILE);
|
|
33
93
|
}
|
|
94
|
+
/** Check if the PTY server process is alive by probing the stored PID. */
|
|
34
95
|
export function isPtyServerRunning() {
|
|
35
96
|
const pidPath = getPtyPidPath();
|
|
36
97
|
if (!fs.existsSync(pidPath))
|
|
@@ -60,6 +121,7 @@ function log(level, message) {
|
|
|
60
121
|
catch { }
|
|
61
122
|
}
|
|
62
123
|
// --- Server ---
|
|
124
|
+
/** Start the PTY sidecar server, listening on the unix socket for JSON requests. */
|
|
63
125
|
export async function runPtyServer() {
|
|
64
126
|
// Dynamic imports for optional native deps
|
|
65
127
|
let nodePty;
|
|
@@ -177,7 +239,7 @@ export async function runPtyServer() {
|
|
|
177
239
|
cols,
|
|
178
240
|
rows,
|
|
179
241
|
cwd,
|
|
180
|
-
env:
|
|
242
|
+
env: buildPtyEnv(),
|
|
181
243
|
});
|
|
182
244
|
}
|
|
183
245
|
catch (err) {
|
|
@@ -193,6 +255,7 @@ export async function runPtyServer() {
|
|
|
193
255
|
shell,
|
|
194
256
|
cwd,
|
|
195
257
|
pid: ptyProcess.pid,
|
|
258
|
+
startTime: captureProcessStartTime(ptyProcess.pid),
|
|
196
259
|
startedAt: Date.now(),
|
|
197
260
|
lastActivity: Date.now(),
|
|
198
261
|
pendingOutput: '',
|
|
@@ -308,6 +371,18 @@ export async function runPtyServer() {
|
|
|
308
371
|
if (!['INT', 'TERM', 'KILL', 'HUP'].includes(sig)) {
|
|
309
372
|
return { ok: false, error: `Unsupported signal: ${sig}` };
|
|
310
373
|
}
|
|
374
|
+
// Guard against PID reuse: confirm the PID is still owned by the
|
|
375
|
+
// process we spawned. If the start-time we captured at spawn no
|
|
376
|
+
// longer matches /proc or `ps`, treat the session as exited and
|
|
377
|
+
// refuse to signal — otherwise we'd kill an unrelated process that
|
|
378
|
+
// happens to have inherited this PID.
|
|
379
|
+
if (session.startTime !== null) {
|
|
380
|
+
const current = captureProcessStartTime(session.pid);
|
|
381
|
+
if (current === null || current !== session.startTime) {
|
|
382
|
+
session.exited = true;
|
|
383
|
+
return { ok: false, error: 'Session has exited' };
|
|
384
|
+
}
|
|
385
|
+
}
|
|
311
386
|
try {
|
|
312
387
|
// node-pty kill accepts signal number; use process.kill for named signals
|
|
313
388
|
process.kill(session.pid, `SIG${sig}`);
|
|
@@ -389,9 +464,24 @@ export async function runPtyServer() {
|
|
|
389
464
|
});
|
|
390
465
|
conn.on('error', () => { });
|
|
391
466
|
});
|
|
467
|
+
// Lock down ~/.agents-system/ before opening the socket — without this, any local
|
|
468
|
+
// user with execute on the parent dir could connect to the socket during
|
|
469
|
+
// the listen()-to-chmod() window. macOS BSD AF_UNIX semantics make socket
|
|
470
|
+
// mode advisory only, so the parent dir is the real boundary.
|
|
471
|
+
const agentsDir = getAgentsDir();
|
|
472
|
+
fs.mkdirSync(agentsDir, { recursive: true });
|
|
473
|
+
fs.chmodSync(agentsDir, 0o700);
|
|
474
|
+
// umask covers any inherited group/other bits while listen() is creating
|
|
475
|
+
// the socket inode — it only matters for the unobservable instant before
|
|
476
|
+
// we can chmod the inode itself.
|
|
477
|
+
process.umask(0o077);
|
|
392
478
|
await new Promise((resolve) => {
|
|
393
479
|
server.listen(socketPath, () => resolve());
|
|
394
480
|
});
|
|
481
|
+
// Surface chmod failures: a 0o600 socket is a load-bearing security
|
|
482
|
+
// assumption, not a nice-to-have. If we can't lock it down, refuse to
|
|
483
|
+
// start so the caller learns immediately.
|
|
484
|
+
fs.chmodSync(socketPath, 0o600);
|
|
395
485
|
// Write PID
|
|
396
486
|
fs.writeFileSync(getPtyPidPath(), String(process.pid), 'utf-8');
|
|
397
487
|
log('INFO', `PTY server started (PID: ${process.pid}, socket: ${socketPath})`);
|
|
@@ -419,4 +509,3 @@ export async function runPtyServer() {
|
|
|
419
509
|
// Keep alive
|
|
420
510
|
await new Promise(() => { });
|
|
421
511
|
}
|
|
422
|
-
//# sourceMappingURL=pty-server.js.map
|
package/dist/lib/registry.d.ts
CHANGED
|
@@ -1,28 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Package registry client -- search, resolve, and install from remote registries.
|
|
3
|
+
*
|
|
4
|
+
* Queries the MCP registry (registry.modelcontextprotocol.io) and future skill
|
|
5
|
+
* registries to find packages, then resolves them into installable entries
|
|
6
|
+
* with transport, runtime, and argument metadata.
|
|
7
|
+
*/
|
|
8
|
+
import type { RegistryType, RegistryConfig, McpServerEntry, SkillEntry, RegistrySearchResult, ResolvedPackage } from './types.js';
|
|
9
|
+
/** Get all registries of a given type, merging defaults with user overrides. */
|
|
2
10
|
export declare function getRegistries(type: RegistryType): Record<string, RegistryConfig>;
|
|
11
|
+
/** Get only the enabled registries of a given type. */
|
|
3
12
|
export declare function getEnabledRegistries(type: RegistryType): Array<{
|
|
4
13
|
name: string;
|
|
5
14
|
config: RegistryConfig;
|
|
6
15
|
}>;
|
|
16
|
+
/** Add or update a registry configuration in agents.yaml. */
|
|
7
17
|
export declare function setRegistry(type: RegistryType, name: string, config: Partial<RegistryConfig>): void;
|
|
18
|
+
/** Remove a user-configured registry. Returns false if it did not exist. */
|
|
8
19
|
export declare function removeRegistry(type: RegistryType, name: string): boolean;
|
|
20
|
+
/** Search MCP registries for servers matching a query string. */
|
|
9
21
|
export declare function searchMcpRegistries(query: string, options?: {
|
|
10
22
|
registry?: string;
|
|
11
23
|
limit?: number;
|
|
12
24
|
}): Promise<RegistrySearchResult[]>;
|
|
25
|
+
/** Look up detailed info for an MCP server by exact name. */
|
|
13
26
|
export declare function getMcpServerInfo(serverName: string, registryName?: string): Promise<McpServerEntry | null>;
|
|
14
|
-
|
|
27
|
+
/** Search skill registries for entries matching a query string. */
|
|
28
|
+
export declare function searchSkillRegistries(query: string, options?: {
|
|
15
29
|
registry?: string;
|
|
16
30
|
limit?: number;
|
|
17
31
|
}): Promise<RegistrySearchResult[]>;
|
|
32
|
+
/** Look up a skill by identifier (or name) across enabled skill registries. */
|
|
33
|
+
export declare function getSkillEntry(skillIdentifier: string, registryName?: string): Promise<SkillEntry | null>;
|
|
34
|
+
/** Derive a cloneable git source from a skill entry's repo/source metadata. */
|
|
35
|
+
export declare function skillEntryToGitSource(entry: SkillEntry): string | null;
|
|
36
|
+
/** Unified search across all enabled registries of the specified type(s). */
|
|
18
37
|
export declare function search(query: string, options?: {
|
|
19
38
|
type?: RegistryType;
|
|
20
39
|
registry?: string;
|
|
21
40
|
limit?: number;
|
|
22
41
|
}): Promise<RegistrySearchResult[]>;
|
|
42
|
+
/** Parse a package identifier into its type (mcp, skill, git) and name. */
|
|
23
43
|
export declare function parsePackageIdentifier(identifier: string): {
|
|
24
44
|
type: RegistryType | 'git' | 'unknown';
|
|
25
45
|
name: string;
|
|
26
46
|
};
|
|
47
|
+
/** Resolve a package identifier to an installable package with source metadata. */
|
|
27
48
|
export declare function resolvePackage(identifier: string): Promise<ResolvedPackage | null>;
|
|
28
|
-
//# sourceMappingURL=registry.d.ts.map
|