@phnx-labs/agents-cli 0.1.0 → 1.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -1
- package/README.md +283 -372
- package/dist/commands/alias.d.ts +11 -0
- package/dist/commands/alias.js +117 -0
- package/dist/commands/beta.d.ts +2 -0
- package/dist/commands/beta.js +53 -0
- package/dist/commands/cloud.d.ts +8 -1
- package/dist/commands/cloud.js +108 -22
- package/dist/commands/commands.d.ts +9 -1
- package/dist/commands/commands.js +24 -172
- package/dist/commands/daemon.d.ts +8 -1
- package/dist/commands/daemon.js +13 -5
- package/dist/commands/doctor.d.ts +15 -0
- package/dist/commands/doctor.js +132 -0
- package/dist/commands/drive.d.ts +8 -1
- package/dist/commands/drive.js +20 -3
- package/dist/commands/exec.d.ts +8 -1
- package/dist/commands/exec.js +96 -27
- package/dist/commands/factory.d.ts +19 -0
- package/dist/commands/factory.js +71 -0
- package/dist/commands/fork.d.ts +8 -1
- package/dist/commands/fork.js +11 -4
- package/dist/commands/hooks.d.ts +9 -1
- package/dist/commands/hooks.js +30 -182
- package/dist/commands/init.d.ts +15 -1
- package/dist/commands/init.js +168 -74
- package/dist/commands/mcp.d.ts +9 -1
- package/dist/commands/mcp.js +11 -7
- package/dist/commands/models.d.ts +8 -1
- package/dist/commands/models.js +16 -4
- package/dist/commands/packages.d.ts +8 -1
- package/dist/commands/packages.js +13 -7
- package/dist/commands/permissions.d.ts +9 -1
- package/dist/commands/permissions.js +3 -3
- package/dist/commands/plugins.d.ts +8 -1
- package/dist/commands/plugins.js +13 -2
- package/dist/commands/profiles.d.ts +9 -1
- package/dist/commands/profiles.js +56 -7
- package/dist/commands/prune.d.ts +22 -0
- package/dist/commands/prune.js +191 -0
- package/dist/commands/pty.d.ts +1 -1
- package/dist/commands/pty.js +2 -1
- package/dist/commands/pull.d.ts +8 -1
- package/dist/commands/pull.js +58 -128
- package/dist/commands/refresh-memory.d.ts +7 -1
- package/dist/commands/refresh-memory.js +7 -1
- package/dist/commands/repo.d.ts +15 -0
- package/dist/commands/repo.js +570 -0
- package/dist/commands/resource-view.d.ts +10 -3
- package/dist/commands/resource-view.js +18 -5
- package/dist/commands/routines.d.ts +8 -1
- package/dist/commands/routines.js +17 -4
- package/dist/commands/rules.d.ts +9 -1
- package/dist/commands/rules.js +16 -11
- package/dist/commands/secrets.d.ts +8 -1
- package/dist/commands/secrets.js +235 -63
- package/dist/commands/sessions-picker.d.ts +2 -1
- package/dist/commands/sessions-picker.js +88 -11
- package/dist/commands/sessions-tail.d.ts +19 -0
- package/dist/commands/sessions-tail.js +235 -0
- package/dist/commands/sessions.d.ts +2 -1
- package/dist/commands/sessions.js +188 -7
- package/dist/commands/skills.d.ts +9 -1
- package/dist/commands/skills.js +28 -178
- package/dist/commands/status.d.ts +7 -1
- package/dist/commands/status.js +7 -1
- package/dist/commands/subagents.d.ts +8 -1
- package/dist/commands/subagents.js +11 -1
- package/dist/commands/sync.d.ts +8 -1
- package/dist/commands/sync.js +8 -1
- package/dist/commands/teams-picker.d.ts +4 -1
- package/dist/commands/teams-picker.js +55 -3
- package/dist/commands/teams.d.ts +15 -1
- package/dist/commands/teams.js +323 -69
- package/dist/commands/usage.d.ts +11 -0
- package/dist/commands/usage.js +60 -0
- package/dist/commands/utils.d.ts +6 -1
- package/dist/commands/utils.js +6 -1
- package/dist/commands/versions.d.ts +8 -1
- package/dist/commands/versions.js +4 -3
- package/dist/commands/view.d.ts +47 -2
- package/dist/commands/view.js +317 -24
- package/dist/index.d.ts +7 -2
- package/dist/index.js +172 -34
- package/dist/lib/acp/client.d.ts +31 -0
- package/dist/lib/acp/client.js +117 -0
- package/dist/lib/acp/harnesses.d.ts +26 -0
- package/dist/lib/acp/harnesses.js +65 -0
- package/dist/lib/acp/run.d.ts +18 -0
- package/dist/lib/acp/run.js +39 -0
- package/dist/lib/agents.d.ts +74 -2
- package/dist/lib/agents.js +197 -21
- package/dist/lib/artifact-actions.d.ts +8 -4
- package/dist/lib/artifact-actions.js +8 -6
- package/dist/lib/auto-pull-worker.d.ts +11 -0
- package/dist/lib/auto-pull-worker.js +121 -0
- package/dist/lib/auto-pull.d.ts +31 -0
- package/dist/lib/auto-pull.js +97 -0
- package/dist/lib/beta.d.ts +23 -0
- package/dist/lib/beta.js +90 -0
- package/dist/lib/capabilities.d.ts +29 -0
- package/dist/lib/capabilities.js +74 -0
- package/dist/lib/cloud/codex.d.ts +9 -3
- package/dist/lib/cloud/codex.js +53 -13
- package/dist/lib/cloud/factory.d.ts +8 -3
- package/dist/lib/cloud/factory.js +19 -3
- package/dist/lib/cloud/registry.d.ts +10 -1
- package/dist/lib/cloud/registry.js +14 -3
- package/dist/lib/cloud/rush.d.ts +63 -3
- package/dist/lib/cloud/rush.js +273 -20
- package/dist/lib/cloud/store.d.ts +13 -1
- package/dist/lib/cloud/store.js +23 -4
- package/dist/lib/cloud/stream.d.ts +6 -1
- package/dist/lib/cloud/stream.js +95 -39
- package/dist/lib/cloud/types.d.ts +153 -8
- package/dist/lib/cloud/types.js +34 -2
- package/dist/lib/command-skills.d.ts +20 -0
- package/dist/lib/command-skills.js +142 -0
- package/dist/lib/commands.d.ts +22 -2
- package/dist/lib/commands.js +51 -11
- package/dist/lib/convert.d.ts +10 -1
- package/dist/lib/convert.js +9 -1
- package/dist/lib/daemon.d.ts +21 -1
- package/dist/lib/daemon.js +97 -4
- package/dist/lib/drive-sync.d.ts +18 -1
- package/dist/lib/drive-sync.js +57 -15
- package/dist/lib/exec.d.ts +23 -6
- package/dist/lib/exec.js +53 -17
- package/dist/lib/fs-walk.d.ts +2 -0
- package/dist/lib/fs-walk.js +40 -0
- package/dist/lib/fuzzy.d.ts +53 -0
- package/dist/lib/fuzzy.js +72 -0
- package/dist/lib/gemini-settings.d.ts +4 -0
- package/dist/lib/gemini-settings.js +33 -0
- package/dist/lib/git.d.ts +12 -2
- package/dist/lib/git.js +17 -6
- package/dist/lib/help.d.ts +20 -1
- package/dist/lib/help.js +45 -6
- package/dist/lib/hooks/match.d.ts +32 -0
- package/dist/lib/hooks/match.js +120 -0
- package/dist/lib/hooks.d.ts +17 -4
- package/dist/lib/hooks.js +119 -101
- package/dist/lib/manifest.d.ts +6 -1
- package/dist/lib/manifest.js +15 -4
- package/dist/lib/markdown.d.ts +0 -1
- package/dist/lib/markdown.js +6 -1
- package/dist/lib/mcp.d.ts +0 -1
- package/dist/lib/mcp.js +29 -33
- package/dist/lib/memory-compile.d.ts +13 -3
- package/dist/lib/memory-compile.js +31 -9
- package/dist/lib/memory.d.ts +14 -7
- package/dist/lib/memory.js +67 -38
- package/dist/lib/migrate.d.ts +8 -0
- package/dist/lib/migrate.js +85 -0
- package/dist/lib/models.d.ts +10 -4
- package/dist/lib/models.js +36 -15
- package/dist/lib/onepassword.d.ts +63 -0
- package/dist/lib/onepassword.js +186 -0
- package/dist/lib/paths.d.ts +8 -0
- package/dist/lib/paths.js +20 -0
- package/dist/lib/permissions.d.ts +24 -2
- package/dist/lib/permissions.js +117 -48
- package/dist/lib/picker.d.ts +10 -1
- package/dist/lib/picker.js +15 -1
- package/dist/lib/plugins.d.ts +7 -1
- package/dist/lib/plugins.js +10 -1
- package/dist/lib/profiles-presets.d.ts +10 -1
- package/dist/lib/profiles-presets.js +9 -1
- package/dist/lib/profiles.d.ts +35 -1
- package/dist/lib/profiles.js +36 -15
- package/dist/lib/pty-client.d.ts +1 -1
- package/dist/lib/pty-client.js +0 -1
- package/dist/lib/pty-server.d.ts +16 -2
- package/dist/lib/pty-server.js +92 -3
- package/dist/lib/registry.d.ts +23 -3
- package/dist/lib/registry.js +153 -8
- package/dist/lib/resources.d.ts +28 -1
- package/dist/lib/resources.js +79 -1
- package/dist/lib/rotate.d.ts +40 -13
- package/dist/lib/rotate.js +238 -40
- package/dist/lib/routines.d.ts +29 -1
- package/dist/lib/routines.js +32 -5
- package/dist/lib/runner.d.ts +14 -1
- package/dist/lib/runner.js +22 -3
- package/dist/lib/sandbox.d.ts +16 -1
- package/dist/lib/sandbox.js +39 -16
- package/dist/lib/scheduler.d.ts +8 -1
- package/dist/lib/scheduler.js +8 -1
- package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
- package/dist/lib/{secrets-bundles.d.ts → secrets/bundles.d.ts} +12 -2
- package/dist/lib/{secrets-bundles.js → secrets/bundles.js} +38 -17
- package/dist/lib/secrets/index.d.ts +55 -0
- package/dist/lib/secrets/index.js +211 -0
- package/dist/lib/secrets/profiles.d.ts +10 -0
- package/dist/lib/secrets/profiles.js +13 -0
- package/dist/lib/session/active.d.ts +43 -0
- package/dist/lib/session/active.js +392 -0
- package/dist/lib/session/artifacts.d.ts +12 -1
- package/dist/lib/session/artifacts.js +25 -5
- package/dist/lib/session/cloud.d.ts +30 -0
- package/dist/lib/session/cloud.js +121 -0
- package/dist/lib/session/db.d.ts +23 -2
- package/dist/lib/session/db.js +76 -12
- package/dist/lib/session/discover.d.ts +19 -4
- package/dist/lib/session/discover.js +344 -48
- package/dist/lib/session/parse.d.ts +28 -1
- package/dist/lib/session/parse.js +267 -9
- package/dist/lib/session/prompt.d.ts +9 -1
- package/dist/lib/session/prompt.js +17 -3
- package/dist/lib/session/render.d.ts +13 -1
- package/dist/lib/session/render.js +20 -1
- package/dist/lib/session/team-filter.d.ts +9 -1
- package/dist/lib/session/team-filter.js +11 -2
- package/dist/lib/session/types.d.ts +16 -2
- package/dist/lib/session/types.js +10 -2
- package/dist/lib/shims.d.ts +64 -5
- package/dist/lib/shims.js +309 -47
- package/dist/lib/skills.d.ts +27 -2
- package/dist/lib/skills.js +127 -65
- package/dist/lib/sqlite.d.ts +43 -0
- package/dist/lib/sqlite.js +94 -0
- package/dist/lib/state.d.ts +112 -27
- package/dist/lib/state.js +320 -148
- package/dist/lib/subagents.d.ts +9 -1
- package/dist/lib/subagents.js +70 -63
- package/dist/lib/sync-manifest.d.ts +81 -0
- package/dist/lib/sync-manifest.js +450 -0
- package/dist/lib/teams/agents.d.ts +103 -5
- package/dist/lib/teams/agents.js +414 -91
- package/dist/lib/teams/api.d.ts +26 -3
- package/dist/lib/teams/api.js +63 -3
- package/dist/lib/teams/debug.d.ts +6 -1
- package/dist/lib/teams/debug.js +6 -1
- package/dist/lib/teams/file_ops.d.ts +7 -1
- package/dist/lib/teams/file_ops.js +7 -1
- package/dist/lib/teams/index.d.ts +15 -0
- package/dist/lib/teams/index.js +14 -0
- package/dist/lib/teams/parsers.d.ts +4 -1
- package/dist/lib/teams/parsers.js +11 -1
- package/dist/lib/teams/persistence.d.ts +15 -1
- package/dist/lib/teams/persistence.js +102 -20
- package/dist/lib/teams/registry.d.ts +12 -1
- package/dist/lib/teams/registry.js +116 -33
- package/dist/lib/teams/summarizer.d.ts +15 -1
- package/dist/lib/teams/summarizer.js +14 -1
- package/dist/lib/teams/supervisor.d.ts +48 -0
- package/dist/lib/teams/supervisor.js +73 -0
- package/dist/lib/template.d.ts +8 -6
- package/dist/lib/template.js +8 -6
- package/dist/lib/types.d.ts +147 -8
- package/dist/lib/types.js +26 -3
- package/dist/lib/usage.d.ts +32 -1
- package/dist/lib/usage.js +70 -6
- package/dist/lib/version-duplicates.d.ts +21 -0
- package/dist/lib/version-duplicates.js +90 -0
- package/dist/lib/versions.d.ts +33 -4
- package/dist/lib/versions.js +376 -108
- package/package.json +32 -17
- package/scripts/postinstall.js +126 -30
- package/dist/commands/__tests__/sessions.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions.test.js +0 -636
- package/dist/commands/__tests__/sessions.test.js.map +0 -1
- package/dist/commands/cloud.d.ts.map +0 -1
- package/dist/commands/cloud.js.map +0 -1
- package/dist/commands/commands.d.ts.map +0 -1
- package/dist/commands/commands.js.map +0 -1
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/fork.d.ts.map +0 -1
- package/dist/commands/fork.js.map +0 -1
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/packages.d.ts.map +0 -1
- package/dist/commands/packages.js.map +0 -1
- package/dist/commands/permissions.d.ts.map +0 -1
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/profiles.d.ts.map +0 -1
- package/dist/commands/profiles.js.map +0 -1
- package/dist/commands/pty.d.ts.map +0 -1
- package/dist/commands/pty.js.map +0 -1
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -3
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -180
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/refresh-memory.d.ts.map +0 -1
- package/dist/commands/refresh-memory.js.map +0 -1
- package/dist/commands/resource-view.d.ts.map +0 -1
- package/dist/commands/resource-view.js.map +0 -1
- package/dist/commands/routines.d.ts.map +0 -1
- package/dist/commands/routines.js.map +0 -1
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/sessions-picker.d.ts.map +0 -1
- package/dist/commands/sessions-picker.js.map +0 -1
- package/dist/commands/sessions.d.ts.map +0 -1
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/subagents.d.ts.map +0 -1
- package/dist/commands/subagents.js.map +0 -1
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/teams-picker.d.ts.map +0 -1
- package/dist/commands/teams-picker.js.map +0 -1
- package/dist/commands/teams.d.ts.map +0 -1
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/commands/versions.d.ts.map +0 -1
- package/dist/commands/versions.js.map +0 -1
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
- package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.js +0 -192
- package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
- package/dist/lib/__tests__/exec.test.d.ts +0 -2
- package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
- package/dist/lib/__tests__/exec.test.js +0 -446
- package/dist/lib/__tests__/exec.test.js.map +0 -1
- package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
- package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
- package/dist/lib/__tests__/git-sync.test.js +0 -138
- package/dist/lib/__tests__/git-sync.test.js.map +0 -1
- package/dist/lib/__tests__/hooks.test.d.ts +0 -2
- package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
- package/dist/lib/__tests__/hooks.test.js +0 -203
- package/dist/lib/__tests__/hooks.test.js.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
- package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.js +0 -95
- package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
- package/dist/lib/__tests__/models.test.d.ts +0 -2
- package/dist/lib/__tests__/models.test.d.ts.map +0 -1
- package/dist/lib/__tests__/models.test.js +0 -239
- package/dist/lib/__tests__/models.test.js.map +0 -1
- package/dist/lib/__tests__/rotate.test.d.ts +0 -2
- package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
- package/dist/lib/__tests__/rotate.test.js +0 -80
- package/dist/lib/__tests__/rotate.test.js.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
- package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
- package/dist/lib/__tests__/secrets.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets.test.js +0 -90
- package/dist/lib/__tests__/secrets.test.js.map +0 -1
- package/dist/lib/__tests__/shims.test.d.ts +0 -2
- package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
- package/dist/lib/__tests__/shims.test.js +0 -39
- package/dist/lib/__tests__/shims.test.js.map +0 -1
- package/dist/lib/__tests__/usage.test.d.ts +0 -2
- package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
- package/dist/lib/__tests__/usage.test.js +0 -220
- package/dist/lib/__tests__/usage.test.js.map +0 -1
- package/dist/lib/__tests__/versions.test.d.ts +0 -2
- package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
- package/dist/lib/__tests__/versions.test.js +0 -63
- package/dist/lib/__tests__/versions.test.js.map +0 -1
- package/dist/lib/agents.d.ts.map +0 -1
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/artifact-actions.d.ts.map +0 -1
- package/dist/lib/artifact-actions.js.map +0 -1
- package/dist/lib/cloud/codex.d.ts.map +0 -1
- package/dist/lib/cloud/codex.js.map +0 -1
- package/dist/lib/cloud/factory.d.ts.map +0 -1
- package/dist/lib/cloud/factory.js.map +0 -1
- package/dist/lib/cloud/registry.d.ts.map +0 -1
- package/dist/lib/cloud/registry.js.map +0 -1
- package/dist/lib/cloud/rush.d.ts.map +0 -1
- package/dist/lib/cloud/rush.js.map +0 -1
- package/dist/lib/cloud/store.d.ts.map +0 -1
- package/dist/lib/cloud/store.js.map +0 -1
- package/dist/lib/cloud/stream.d.ts.map +0 -1
- package/dist/lib/cloud/stream.js.map +0 -1
- package/dist/lib/cloud/types.d.ts.map +0 -1
- package/dist/lib/cloud/types.js.map +0 -1
- package/dist/lib/commands.d.ts.map +0 -1
- package/dist/lib/commands.js.map +0 -1
- package/dist/lib/convert.d.ts.map +0 -1
- package/dist/lib/convert.js.map +0 -1
- package/dist/lib/daemon.d.ts.map +0 -1
- package/dist/lib/daemon.js.map +0 -1
- package/dist/lib/drive-sync.d.ts.map +0 -1
- package/dist/lib/drive-sync.js.map +0 -1
- package/dist/lib/exec.d.ts.map +0 -1
- package/dist/lib/exec.js.map +0 -1
- package/dist/lib/factory.d.ts +0 -57
- package/dist/lib/factory.d.ts.map +0 -1
- package/dist/lib/factory.js +0 -110
- package/dist/lib/factory.js.map +0 -1
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/help.d.ts.map +0 -1
- package/dist/lib/help.js.map +0 -1
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/manifest.d.ts.map +0 -1
- package/dist/lib/manifest.js.map +0 -1
- package/dist/lib/markdown.d.ts.map +0 -1
- package/dist/lib/markdown.js.map +0 -1
- package/dist/lib/mcp.d.ts.map +0 -1
- package/dist/lib/mcp.js.map +0 -1
- package/dist/lib/memory-compile.d.ts.map +0 -1
- package/dist/lib/memory-compile.js.map +0 -1
- package/dist/lib/memory.d.ts.map +0 -1
- package/dist/lib/memory.js.map +0 -1
- package/dist/lib/models.d.ts.map +0 -1
- package/dist/lib/models.js.map +0 -1
- package/dist/lib/permissions.d.ts.map +0 -1
- package/dist/lib/permissions.js.map +0 -1
- package/dist/lib/picker.d.ts.map +0 -1
- package/dist/lib/picker.js.map +0 -1
- package/dist/lib/plugins.d.ts.map +0 -1
- package/dist/lib/plugins.js.map +0 -1
- package/dist/lib/profiles-keychain.d.ts +0 -3
- package/dist/lib/profiles-keychain.d.ts.map +0 -1
- package/dist/lib/profiles-keychain.js +0 -10
- package/dist/lib/profiles-keychain.js.map +0 -1
- package/dist/lib/profiles-presets.d.ts.map +0 -1
- package/dist/lib/profiles-presets.js.map +0 -1
- package/dist/lib/profiles.d.ts.map +0 -1
- package/dist/lib/profiles.js.map +0 -1
- package/dist/lib/pty-client.d.ts.map +0 -1
- package/dist/lib/pty-client.js.map +0 -1
- package/dist/lib/pty-server.d.ts.map +0 -1
- package/dist/lib/pty-server.js.map +0 -1
- package/dist/lib/registry.d.ts.map +0 -1
- package/dist/lib/registry.js.map +0 -1
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.js.map +0 -1
- package/dist/lib/rotate.d.ts.map +0 -1
- package/dist/lib/rotate.js.map +0 -1
- package/dist/lib/routines.d.ts.map +0 -1
- package/dist/lib/routines.js.map +0 -1
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.js.map +0 -1
- package/dist/lib/sandbox.d.ts.map +0 -1
- package/dist/lib/sandbox.js.map +0 -1
- package/dist/lib/scheduler.d.ts.map +0 -1
- package/dist/lib/scheduler.js.map +0 -1
- package/dist/lib/secrets-bundles.d.ts.map +0 -1
- package/dist/lib/secrets-bundles.js.map +0 -1
- package/dist/lib/secrets.d.ts +0 -27
- package/dist/lib/secrets.d.ts.map +0 -1
- package/dist/lib/secrets.js +0 -127
- package/dist/lib/secrets.js.map +0 -1
- package/dist/lib/session/__tests__/db.test.d.ts +0 -2
- package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/db.test.js +0 -54
- package/dist/lib/session/__tests__/db.test.js.map +0 -1
- package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
- package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/discover.test.js +0 -63
- package/dist/lib/session/__tests__/discover.test.js.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
- package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.js +0 -44
- package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
- package/dist/lib/session/__tests__/render.test.d.ts +0 -2
- package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/render.test.js +0 -602
- package/dist/lib/session/__tests__/render.test.js.map +0 -1
- package/dist/lib/session/artifacts.d.ts.map +0 -1
- package/dist/lib/session/artifacts.js.map +0 -1
- package/dist/lib/session/db.d.ts.map +0 -1
- package/dist/lib/session/db.js.map +0 -1
- package/dist/lib/session/discover.d.ts.map +0 -1
- package/dist/lib/session/discover.js.map +0 -1
- package/dist/lib/session/parse.d.ts.map +0 -1
- package/dist/lib/session/parse.js.map +0 -1
- package/dist/lib/session/prompt.d.ts.map +0 -1
- package/dist/lib/session/prompt.js.map +0 -1
- package/dist/lib/session/prompt.test.d.ts +0 -2
- package/dist/lib/session/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/prompt.test.js +0 -57
- package/dist/lib/session/prompt.test.js.map +0 -1
- package/dist/lib/session/render.d.ts.map +0 -1
- package/dist/lib/session/render.js.map +0 -1
- package/dist/lib/session/team-filter.d.ts.map +0 -1
- package/dist/lib/session/team-filter.js.map +0 -1
- package/dist/lib/session/team-filter.test.d.ts +0 -2
- package/dist/lib/session/team-filter.test.d.ts.map +0 -1
- package/dist/lib/session/team-filter.test.js +0 -157
- package/dist/lib/session/team-filter.test.js.map +0 -1
- package/dist/lib/session/types.d.ts.map +0 -1
- package/dist/lib/session/types.js.map +0 -1
- package/dist/lib/shims.d.ts.map +0 -1
- package/dist/lib/shims.js.map +0 -1
- package/dist/lib/skills.d.ts.map +0 -1
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/subagents.d.ts.map +0 -1
- package/dist/lib/subagents.js.map +0 -1
- package/dist/lib/teams/agents.d.ts.map +0 -1
- package/dist/lib/teams/agents.js.map +0 -1
- package/dist/lib/teams/api.d.ts.map +0 -1
- package/dist/lib/teams/api.js.map +0 -1
- package/dist/lib/teams/cloud.d.ts +0 -11
- package/dist/lib/teams/cloud.d.ts.map +0 -1
- package/dist/lib/teams/cloud.js +0 -169
- package/dist/lib/teams/cloud.js.map +0 -1
- package/dist/lib/teams/debug.d.ts.map +0 -1
- package/dist/lib/teams/debug.js.map +0 -1
- package/dist/lib/teams/file_ops.d.ts.map +0 -1
- package/dist/lib/teams/file_ops.js.map +0 -1
- package/dist/lib/teams/parsers.d.ts.map +0 -1
- package/dist/lib/teams/parsers.js.map +0 -1
- package/dist/lib/teams/persistence.d.ts.map +0 -1
- package/dist/lib/teams/persistence.js.map +0 -1
- package/dist/lib/teams/ralph.d.ts +0 -8
- package/dist/lib/teams/ralph.d.ts.map +0 -1
- package/dist/lib/teams/ralph.js +0 -59
- package/dist/lib/teams/ralph.js.map +0 -1
- package/dist/lib/teams/registry.d.ts.map +0 -1
- package/dist/lib/teams/registry.js.map +0 -1
- package/dist/lib/teams/summarizer.d.ts.map +0 -1
- package/dist/lib/teams/summarizer.js.map +0 -1
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/usage.d.ts.map +0 -1
- package/dist/lib/usage.js.map +0 -1
- package/dist/lib/versions.d.ts.map +0 -1
- package/dist/lib/versions.js.map +0 -1
- package/scripts/rebuild-sqlite.sh +0 -46
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
|
package/dist/lib/registry.js
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
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
|
+
*/
|
|
1
8
|
import * as fs from 'fs';
|
|
2
9
|
import { DEFAULT_REGISTRIES } from './types.js';
|
|
3
10
|
import { readMeta, writeMeta } from './state.js';
|
|
11
|
+
/** Get all registries of a given type, merging defaults with user overrides. */
|
|
4
12
|
export function getRegistries(type) {
|
|
5
13
|
const meta = readMeta();
|
|
6
14
|
const defaultRegs = DEFAULT_REGISTRIES[type] || {};
|
|
@@ -8,12 +16,14 @@ export function getRegistries(type) {
|
|
|
8
16
|
// Merge defaults with user config (user overrides defaults)
|
|
9
17
|
return { ...defaultRegs, ...userRegs };
|
|
10
18
|
}
|
|
19
|
+
/** Get only the enabled registries of a given type. */
|
|
11
20
|
export function getEnabledRegistries(type) {
|
|
12
21
|
const registries = getRegistries(type);
|
|
13
22
|
return Object.entries(registries)
|
|
14
23
|
.filter(([, config]) => config.enabled)
|
|
15
24
|
.map(([name, config]) => ({ name, config }));
|
|
16
25
|
}
|
|
26
|
+
/** Add or update a registry configuration in agents.yaml. */
|
|
17
27
|
export function setRegistry(type, name, config) {
|
|
18
28
|
const meta = readMeta();
|
|
19
29
|
if (!meta.registries) {
|
|
@@ -26,6 +36,7 @@ export function setRegistry(type, name, config) {
|
|
|
26
36
|
meta.registries[type][name] = { ...existing, ...config };
|
|
27
37
|
writeMeta(meta);
|
|
28
38
|
}
|
|
39
|
+
/** Remove a user-configured registry. Returns false if it did not exist. */
|
|
29
40
|
export function removeRegistry(type, name) {
|
|
30
41
|
const meta = readMeta();
|
|
31
42
|
if (meta.registries?.[type]?.[name]) {
|
|
@@ -53,6 +64,7 @@ async function fetchMcpRegistry(url, query, limit = 20, apiKey) {
|
|
|
53
64
|
}
|
|
54
65
|
return response.json();
|
|
55
66
|
}
|
|
67
|
+
/** Search MCP registries for servers matching a query string. */
|
|
56
68
|
export async function searchMcpRegistries(query, options) {
|
|
57
69
|
const registries = getEnabledRegistries('mcp');
|
|
58
70
|
const results = [];
|
|
@@ -86,6 +98,7 @@ export async function searchMcpRegistries(query, options) {
|
|
|
86
98
|
}
|
|
87
99
|
return results;
|
|
88
100
|
}
|
|
101
|
+
/** Look up detailed info for an MCP server by exact name. */
|
|
89
102
|
export async function getMcpServerInfo(serverName, registryName) {
|
|
90
103
|
const registries = getEnabledRegistries('mcp');
|
|
91
104
|
const targetRegistries = registryName
|
|
@@ -108,16 +121,134 @@ export async function getMcpServerInfo(serverName, registryName) {
|
|
|
108
121
|
}
|
|
109
122
|
return null;
|
|
110
123
|
}
|
|
111
|
-
|
|
124
|
+
const skillIndexCache = new Map();
|
|
125
|
+
const SKILL_INDEX_TTL_MS = 10 * 60_000;
|
|
126
|
+
/** Fetch and cache a flat skill-index JSON document. */
|
|
127
|
+
async function fetchSkillIndex(url, apiKey) {
|
|
128
|
+
const cached = skillIndexCache.get(url);
|
|
129
|
+
if (cached && Date.now() - cached.fetchedAt < SKILL_INDEX_TTL_MS) {
|
|
130
|
+
return cached.doc;
|
|
131
|
+
}
|
|
132
|
+
const headers = { Accept: 'application/json' };
|
|
133
|
+
if (apiKey)
|
|
134
|
+
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
135
|
+
const response = await fetch(url, { headers });
|
|
136
|
+
if (!response.ok) {
|
|
137
|
+
throw new Error(`Registry request failed: ${response.status} ${response.statusText}`);
|
|
138
|
+
}
|
|
139
|
+
const doc = (await response.json());
|
|
140
|
+
skillIndexCache.set(url, { fetchedAt: Date.now(), doc });
|
|
141
|
+
return doc;
|
|
142
|
+
}
|
|
143
|
+
/** Map a raw skill-index row into the canonical SkillEntry shape. */
|
|
144
|
+
function normalizeSkillEntry(raw) {
|
|
145
|
+
return {
|
|
146
|
+
name: raw.name,
|
|
147
|
+
description: raw.description,
|
|
148
|
+
source: raw.source || 'unknown',
|
|
149
|
+
identifier: raw.identifier,
|
|
150
|
+
repo: raw.repo || undefined,
|
|
151
|
+
path: raw.path || undefined,
|
|
152
|
+
author: raw.author,
|
|
153
|
+
installs: raw.installs,
|
|
154
|
+
tags: raw.tags,
|
|
155
|
+
trustLevel: raw.trust_level,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Case-insensitive substring match against the fields users expect to search. */
|
|
159
|
+
function skillMatchesQuery(entry, query) {
|
|
160
|
+
if (!query)
|
|
161
|
+
return true;
|
|
162
|
+
const q = query.toLowerCase();
|
|
163
|
+
const haystack = [
|
|
164
|
+
entry.name,
|
|
165
|
+
entry.identifier,
|
|
166
|
+
entry.description,
|
|
167
|
+
entry.source,
|
|
168
|
+
...(entry.tags || []),
|
|
169
|
+
]
|
|
170
|
+
.filter(Boolean)
|
|
171
|
+
.join(' ')
|
|
172
|
+
.toLowerCase();
|
|
173
|
+
return haystack.includes(q);
|
|
174
|
+
}
|
|
175
|
+
/** Search skill registries for entries matching a query string. */
|
|
176
|
+
export async function searchSkillRegistries(query, options) {
|
|
112
177
|
const registries = getEnabledRegistries('skill');
|
|
113
|
-
if (registries.length === 0)
|
|
114
|
-
|
|
178
|
+
if (registries.length === 0)
|
|
179
|
+
return [];
|
|
180
|
+
const targetRegistries = options?.registry
|
|
181
|
+
? registries.filter((r) => r.name === options.registry)
|
|
182
|
+
: registries;
|
|
183
|
+
if (targetRegistries.length === 0) {
|
|
184
|
+
if (options?.registry) {
|
|
185
|
+
throw new Error(`Registry '${options.registry}' not found or not enabled`);
|
|
186
|
+
}
|
|
115
187
|
return [];
|
|
116
188
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
189
|
+
const limit = options?.limit ?? 20;
|
|
190
|
+
const results = [];
|
|
191
|
+
for (const { name, config } of targetRegistries) {
|
|
192
|
+
try {
|
|
193
|
+
const doc = await fetchSkillIndex(config.url, config.apiKey);
|
|
194
|
+
for (const raw of doc.skills || []) {
|
|
195
|
+
const entry = normalizeSkillEntry(raw);
|
|
196
|
+
if (!skillMatchesQuery(entry, query))
|
|
197
|
+
continue;
|
|
198
|
+
results.push({
|
|
199
|
+
name: entry.identifier || entry.name,
|
|
200
|
+
description: entry.description,
|
|
201
|
+
type: 'skill',
|
|
202
|
+
source: entry.source,
|
|
203
|
+
registry: name,
|
|
204
|
+
installs: entry.installs,
|
|
205
|
+
});
|
|
206
|
+
if (results.length >= limit)
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
if (results.length >= limit)
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
console.error(`Failed to search ${name}: ${err.message}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return results;
|
|
217
|
+
}
|
|
218
|
+
/** Look up a skill by identifier (or name) across enabled skill registries. */
|
|
219
|
+
export async function getSkillEntry(skillIdentifier, registryName) {
|
|
220
|
+
const registries = getEnabledRegistries('skill');
|
|
221
|
+
const targets = registryName
|
|
222
|
+
? registries.filter((r) => r.name === registryName)
|
|
223
|
+
: registries;
|
|
224
|
+
for (const { config } of targets) {
|
|
225
|
+
try {
|
|
226
|
+
const doc = await fetchSkillIndex(config.url, config.apiKey);
|
|
227
|
+
const match = (doc.skills || []).find((s) => s.identifier === skillIdentifier || s.name === skillIdentifier);
|
|
228
|
+
if (match)
|
|
229
|
+
return normalizeSkillEntry(match);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
/* try next registry */
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
/** Derive a cloneable git source from a skill entry's repo/source metadata. */
|
|
238
|
+
export function skillEntryToGitSource(entry) {
|
|
239
|
+
if (entry.repo) {
|
|
240
|
+
// Already an owner/repo; cloneRepo understands the `gh:` shorthand.
|
|
241
|
+
return `gh:${entry.repo.replace(/\.git$/, '')}`;
|
|
242
|
+
}
|
|
243
|
+
if (entry.source === 'official') {
|
|
244
|
+
// Hermes 'official' entries live in NousResearch/hermes-agent; the path
|
|
245
|
+
// sits under optional-skills/. cloneRepo pulls the whole repo — the
|
|
246
|
+
// per-path narrowing is a follow-on improvement.
|
|
247
|
+
return 'gh:NousResearch/hermes-agent';
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
120
250
|
}
|
|
251
|
+
/** Unified search across all enabled registries of the specified type(s). */
|
|
121
252
|
export async function search(query, options) {
|
|
122
253
|
const results = [];
|
|
123
254
|
if (!options?.type || options.type === 'mcp') {
|
|
@@ -130,6 +261,7 @@ export async function search(query, options) {
|
|
|
130
261
|
}
|
|
131
262
|
return results;
|
|
132
263
|
}
|
|
264
|
+
/** Parse a package identifier into its type (mcp, skill, git) and name. */
|
|
133
265
|
export function parsePackageIdentifier(identifier) {
|
|
134
266
|
// mcp:filesystem -> MCP registry
|
|
135
267
|
if (identifier.startsWith('mcp:')) {
|
|
@@ -161,6 +293,7 @@ export function parsePackageIdentifier(identifier) {
|
|
|
161
293
|
// Single word -> search MCP registries first
|
|
162
294
|
return { type: 'unknown', name: identifier };
|
|
163
295
|
}
|
|
296
|
+
/** Resolve a package identifier to an installable package with source metadata. */
|
|
164
297
|
export async function resolvePackage(identifier) {
|
|
165
298
|
const parsed = parsePackageIdentifier(identifier);
|
|
166
299
|
if (parsed.type === 'git') {
|
|
@@ -178,7 +311,20 @@ export async function resolvePackage(identifier) {
|
|
|
178
311
|
return null;
|
|
179
312
|
}
|
|
180
313
|
if (parsed.type === 'skill') {
|
|
181
|
-
|
|
314
|
+
const entry = await getSkillEntry(parsed.name);
|
|
315
|
+
if (entry) {
|
|
316
|
+
const gitSource = skillEntryToGitSource(entry);
|
|
317
|
+
if (gitSource) {
|
|
318
|
+
return {
|
|
319
|
+
type: 'skill',
|
|
320
|
+
source: gitSource,
|
|
321
|
+
skillEntry: entry,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
// Entry found but has no installable repo (e.g. lobehub-only listings).
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
// Fall back to git shorthand when the identifier isn't in any registry.
|
|
182
328
|
const gitSource = parsed.name.startsWith('gh:') ? parsed.name : `gh:${parsed.name}`;
|
|
183
329
|
return { type: 'git', source: gitSource };
|
|
184
330
|
}
|
|
@@ -200,4 +346,3 @@ export async function resolvePackage(identifier) {
|
|
|
200
346
|
}
|
|
201
347
|
return null;
|
|
202
348
|
}
|
|
203
|
-
//# sourceMappingURL=registry.js.map
|
package/dist/lib/resources.d.ts
CHANGED
|
@@ -4,19 +4,46 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { AgentId } from './types.js';
|
|
6
6
|
import { type SkillParseError } from './skills.js';
|
|
7
|
+
/** Resource kind — matches the subdirectory name under each repo root. */
|
|
8
|
+
export type ResourceKind = 'commands' | 'skills' | 'hooks' | 'rules' | 'mcp' | 'permissions' | 'subagents' | 'profiles' | 'secrets';
|
|
9
|
+
/** A resource resolved with its origin. */
|
|
10
|
+
export interface ResolvedResource {
|
|
11
|
+
name: string;
|
|
12
|
+
/** Absolute path to the resource file or directory. */
|
|
13
|
+
path: string;
|
|
14
|
+
source: 'project' | 'user' | 'system';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a single resource by kind + name using project > user > system precedence.
|
|
18
|
+
* For file-based resources the path ends in `.md`, `.yaml`, or `.yml` as appropriate.
|
|
19
|
+
* Returns null when the resource does not exist in any scope.
|
|
20
|
+
*
|
|
21
|
+
* Extra repos are searched last (after system) to match syncResourcesToVersion order.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveResource(kind: ResourceKind, name: string, cwd?: string): ResolvedResource | null;
|
|
24
|
+
/**
|
|
25
|
+
* List all resources of a given kind across project, user, and system scopes.
|
|
26
|
+
* Returns a deduplicated union (project wins on name collision), each entry
|
|
27
|
+
* annotated with its origin source.
|
|
28
|
+
*/
|
|
29
|
+
export declare function listResources(kind: ResourceKind, cwd?: string): ResolvedResource[];
|
|
30
|
+
/** A single installed resource (command, skill, memory file, or hook). */
|
|
7
31
|
export interface ResourceEntry {
|
|
8
32
|
name: string;
|
|
9
33
|
path: string;
|
|
10
34
|
scope: 'user' | 'project';
|
|
11
35
|
}
|
|
36
|
+
/** A skill resource entry with optional rule count. */
|
|
12
37
|
export interface SkillResourceEntry extends ResourceEntry {
|
|
13
38
|
ruleCount?: number;
|
|
14
39
|
}
|
|
40
|
+
/** An MCP server resource entry. */
|
|
15
41
|
export interface McpResourceEntry {
|
|
16
42
|
name: string;
|
|
17
43
|
scope: 'user' | 'project';
|
|
18
44
|
version?: string;
|
|
19
45
|
}
|
|
46
|
+
/** All resources installed for a specific agent. */
|
|
20
47
|
export interface AgentResources {
|
|
21
48
|
agentId: AgentId;
|
|
22
49
|
commands: ResourceEntry[];
|
|
@@ -26,6 +53,7 @@ export interface AgentResources {
|
|
|
26
53
|
memory: ResourceEntry[];
|
|
27
54
|
hooks: ResourceEntry[];
|
|
28
55
|
}
|
|
56
|
+
/** Options for resource discovery. */
|
|
29
57
|
export interface GetAgentResourcesOptions {
|
|
30
58
|
cwd?: string;
|
|
31
59
|
scope?: 'user' | 'project' | 'all';
|
|
@@ -47,4 +75,3 @@ export declare function getAllAgentResources(agentIds: AgentId[], options?: GetA
|
|
|
47
75
|
installed: boolean;
|
|
48
76
|
}>;
|
|
49
77
|
}): AgentResources[];
|
|
50
|
-
//# sourceMappingURL=resources.d.ts.map
|
package/dist/lib/resources.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Unified resource discovery for agents.
|
|
3
3
|
* Scans filesystem (source of truth) to find all installed resources for an agent.
|
|
4
4
|
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
5
7
|
import { AGENTS, listInstalledMcpsWithScope } from './agents.js';
|
|
6
8
|
import { listInstalledCommandsWithScope } from './commands.js';
|
|
7
9
|
import { listInstalledSkillsWithScope } from './skills.js';
|
|
@@ -9,6 +11,83 @@ import { listInstalledHooksWithScope } from './hooks.js';
|
|
|
9
11
|
import { listInstalledInstructionsWithScope } from './memory.js';
|
|
10
12
|
import { getEffectiveHome } from './versions.js';
|
|
11
13
|
import { listMcpServerConfigs } from './mcp.js';
|
|
14
|
+
import { getProjectAgentsDir, getUserAgentsDir, getSystemAgentsDir, getEnabledExtraRepos, } from './state.js';
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a single resource by kind + name using project > user > system precedence.
|
|
17
|
+
* For file-based resources the path ends in `.md`, `.yaml`, or `.yml` as appropriate.
|
|
18
|
+
* Returns null when the resource does not exist in any scope.
|
|
19
|
+
*
|
|
20
|
+
* Extra repos are searched last (after system) to match syncResourcesToVersion order.
|
|
21
|
+
*/
|
|
22
|
+
export function resolveResource(kind, name, cwd) {
|
|
23
|
+
const projectDir = getProjectAgentsDir(cwd);
|
|
24
|
+
const extraRepos = getEnabledExtraRepos();
|
|
25
|
+
const candidates = [
|
|
26
|
+
...(projectDir ? [[path.join(projectDir, kind), 'project']] : []),
|
|
27
|
+
[path.join(getUserAgentsDir(), kind), 'user'],
|
|
28
|
+
[path.join(getSystemAgentsDir(), kind), 'system'],
|
|
29
|
+
...extraRepos.map((e) => [path.join(e.dir, kind), 'system']),
|
|
30
|
+
];
|
|
31
|
+
for (const [dir, source] of candidates) {
|
|
32
|
+
if (!fs.existsSync(dir))
|
|
33
|
+
continue;
|
|
34
|
+
// Try exact name (for directories like skills/subagents)
|
|
35
|
+
const exactPath = path.join(dir, name);
|
|
36
|
+
if (fs.existsSync(exactPath)) {
|
|
37
|
+
return { name, path: exactPath, source };
|
|
38
|
+
}
|
|
39
|
+
// Try with common file extensions
|
|
40
|
+
for (const ext of ['.md', '.yaml', '.yml']) {
|
|
41
|
+
const withExt = exactPath + ext;
|
|
42
|
+
if (fs.existsSync(withExt)) {
|
|
43
|
+
return { name, path: withExt, source };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* List all resources of a given kind across project, user, and system scopes.
|
|
51
|
+
* Returns a deduplicated union (project wins on name collision), each entry
|
|
52
|
+
* annotated with its origin source.
|
|
53
|
+
*/
|
|
54
|
+
export function listResources(kind, cwd) {
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
const results = [];
|
|
57
|
+
const projectDir = getProjectAgentsDir(cwd);
|
|
58
|
+
const extraRepos = getEnabledExtraRepos();
|
|
59
|
+
const roots = [
|
|
60
|
+
...(projectDir ? [[path.join(projectDir, kind), 'project']] : []),
|
|
61
|
+
[path.join(getUserAgentsDir(), kind), 'user'],
|
|
62
|
+
[path.join(getSystemAgentsDir(), kind), 'system'],
|
|
63
|
+
...extraRepos.map((e) => [path.join(e.dir, kind), 'system']),
|
|
64
|
+
];
|
|
65
|
+
for (const [dir, source] of roots) {
|
|
66
|
+
if (!fs.existsSync(dir))
|
|
67
|
+
continue;
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
if (entry.name.startsWith('.'))
|
|
77
|
+
continue;
|
|
78
|
+
const rawName = entry.name.replace(/\.(md|yaml|yml)$/, '');
|
|
79
|
+
if (seen.has(rawName))
|
|
80
|
+
continue;
|
|
81
|
+
seen.add(rawName);
|
|
82
|
+
results.push({
|
|
83
|
+
name: rawName,
|
|
84
|
+
path: path.join(dir, entry.name),
|
|
85
|
+
source,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return results;
|
|
90
|
+
}
|
|
12
91
|
/**
|
|
13
92
|
* Get all resources installed for a specific agent by scanning the filesystem.
|
|
14
93
|
* This is the source of truth - not the tracking data in agents.yaml.
|
|
@@ -100,4 +179,3 @@ export function getAllAgentResources(agentIds, options = {}) {
|
|
|
100
179
|
return getAgentResources(agentId, { ...restOptions, cliInstalled });
|
|
101
180
|
});
|
|
102
181
|
}
|
|
103
|
-
//# sourceMappingURL=resources.js.map
|