@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,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session artifact discovery and resolution.
|
|
3
|
+
*
|
|
4
|
+
* Scans parsed session events for file-write tool calls (Write, Edit, etc.)
|
|
5
|
+
* and returns metadata about each artifact: path, authoring tool, existence
|
|
6
|
+
* on disk, and file size. Used by the artifacts subcommand and session detail views.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { parseSession } from './parse.js';
|
|
11
|
+
/** Tool names that produce file artifacts (writes, edits, patches). */
|
|
12
|
+
const WRITE_TOOLS = new Set([
|
|
13
|
+
'Write', 'Edit', 'write_file', 'edit_file', 'create_file', 'replace', 'patch',
|
|
14
|
+
]);
|
|
15
|
+
/** Parse a session and return metadata for every file written or edited during it. */
|
|
16
|
+
export function discoverArtifacts(meta) {
|
|
17
|
+
let events;
|
|
18
|
+
try {
|
|
19
|
+
events = parseSession(meta.filePath, meta.agent);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
// Map path -> last write event (later occurrence wins for dedup)
|
|
25
|
+
const latestByPath = new Map();
|
|
26
|
+
for (const event of events) {
|
|
27
|
+
if (event.type !== 'tool_use')
|
|
28
|
+
continue;
|
|
29
|
+
const tool = event.tool || '';
|
|
30
|
+
if (!WRITE_TOOLS.has(tool))
|
|
31
|
+
continue;
|
|
32
|
+
const p = event.path
|
|
33
|
+
|| event.args?.file_path
|
|
34
|
+
|| event.args?.path
|
|
35
|
+
|| event.args?.filePath
|
|
36
|
+
|| '';
|
|
37
|
+
if (!p)
|
|
38
|
+
continue;
|
|
39
|
+
latestByPath.set(p, { tool, timestamp: event.timestamp });
|
|
40
|
+
}
|
|
41
|
+
const artifacts = [];
|
|
42
|
+
for (const [p, { tool, timestamp }] of latestByPath) {
|
|
43
|
+
let exists = false;
|
|
44
|
+
let sizeBytes;
|
|
45
|
+
try {
|
|
46
|
+
const stat = fs.lstatSync(p);
|
|
47
|
+
if (stat.isFile()) {
|
|
48
|
+
exists = true;
|
|
49
|
+
sizeBytes = stat.size;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// file gone, inaccessible, or symlink/special file
|
|
54
|
+
}
|
|
55
|
+
artifacts.push({
|
|
56
|
+
path: p,
|
|
57
|
+
tool,
|
|
58
|
+
timestamp,
|
|
59
|
+
exists,
|
|
60
|
+
sizeBytes: exists ? sizeBytes : undefined,
|
|
61
|
+
sessionId: meta.id,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return artifacts;
|
|
65
|
+
}
|
|
66
|
+
/** Refuse to load artifact files larger than this. Returns '' silently above the cap. */
|
|
67
|
+
export const ARTIFACT_MAX_BYTES = 50_000_000;
|
|
68
|
+
/** Read the current contents of an artifact file from disk. Rejects symlinks. */
|
|
69
|
+
export function readArtifact(artifact) {
|
|
70
|
+
const stat = fs.lstatSync(artifact.path);
|
|
71
|
+
if (!stat.isFile()) {
|
|
72
|
+
throw new Error(`Refusing to read non-regular file: ${artifact.path}`);
|
|
73
|
+
}
|
|
74
|
+
if (stat.size > ARTIFACT_MAX_BYTES)
|
|
75
|
+
return '';
|
|
76
|
+
return fs.readFileSync(artifact.path, 'utf-8');
|
|
77
|
+
}
|
|
78
|
+
/** Resolve a user-provided name to an artifact by exact path, basename, or path suffix. */
|
|
79
|
+
export function resolveArtifact(artifacts, name) {
|
|
80
|
+
// Exact path match
|
|
81
|
+
const exact = artifacts.find(a => a.path === name);
|
|
82
|
+
if (exact)
|
|
83
|
+
return exact;
|
|
84
|
+
// Basename match
|
|
85
|
+
const byBase = artifacts.filter(a => path.basename(a.path) === name);
|
|
86
|
+
if (byBase.length === 1)
|
|
87
|
+
return byBase[0];
|
|
88
|
+
if (byBase.length > 1)
|
|
89
|
+
return byBase[0];
|
|
90
|
+
// Path suffix match (e.g. "src/foo.ts")
|
|
91
|
+
const bySuffix = artifacts.filter(a => a.path.endsWith('/' + name) || a.path === name);
|
|
92
|
+
if (bySuffix.length >= 1)
|
|
93
|
+
return bySuffix[0];
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rush Cloud session source.
|
|
3
|
+
*
|
|
4
|
+
* Fetches cloud-captured sessions from halo/proxy (api.prix.dev) and caches
|
|
5
|
+
* them locally so the existing filesystem-based parse pipeline works unchanged.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints consumed (implemented in halo/proxy/src/cloud-runs.ts):
|
|
8
|
+
* GET /api/v1/cloud-runs → list executions
|
|
9
|
+
* GET /api/v1/cloud-runs/:id → get one (used for meta)
|
|
10
|
+
* GET /api/v1/cloud-runs/:id/session.jsonl → raw captured jsonl
|
|
11
|
+
*/
|
|
12
|
+
import type { SessionMeta } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* List cloud executions the user has captured sessions for. Includes
|
|
15
|
+
* completed + needs_review + failed; an empty session_path means capture
|
|
16
|
+
* never ran, so those are silently dropped.
|
|
17
|
+
*/
|
|
18
|
+
export declare function discoverCloudSessions(options?: {
|
|
19
|
+
limit?: number;
|
|
20
|
+
}): Promise<SessionMeta[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Fetch the jsonl for one cloud execution and stash it in the local cache.
|
|
23
|
+
* Returns the local file path. Re-fetches on every call (cheap — executions
|
|
24
|
+
* are immutable once complete). Callers may pass an already-known filePath.
|
|
25
|
+
*/
|
|
26
|
+
export declare function ensureCloudSessionCached(executionId: string, destPath?: string): Promise<string>;
|
|
27
|
+
/** True if filePath points into the cloud session cache dir. */
|
|
28
|
+
export declare function isCloudSessionPath(filePath: string): boolean;
|
|
29
|
+
/** Extract execution_id from a cloud cache path. */
|
|
30
|
+
export declare function executionIdFromCloudPath(filePath: string): string | null;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rush Cloud session source.
|
|
3
|
+
*
|
|
4
|
+
* Fetches cloud-captured sessions from halo/proxy (api.prix.dev) and caches
|
|
5
|
+
* them locally so the existing filesystem-based parse pipeline works unchanged.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints consumed (implemented in halo/proxy/src/cloud-runs.ts):
|
|
8
|
+
* GET /api/v1/cloud-runs → list executions
|
|
9
|
+
* GET /api/v1/cloud-runs/:id → get one (used for meta)
|
|
10
|
+
* GET /api/v1/cloud-runs/:id/session.jsonl → raw captured jsonl
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import * as os from 'os';
|
|
15
|
+
import * as yaml from 'yaml';
|
|
16
|
+
import { getAgentsDir } from '../state.js';
|
|
17
|
+
const PROXY_BASE = process.env.RUSH_PROXY_BASE ?? 'https://api.prix.dev';
|
|
18
|
+
const USER_YAML = path.join(os.homedir(), '.rush', 'user.yaml');
|
|
19
|
+
const CLOUD_CACHE_DIR = path.join(getAgentsDir(), 'cache', 'cloud-runs');
|
|
20
|
+
function readToken() {
|
|
21
|
+
if (!fs.existsSync(USER_YAML)) {
|
|
22
|
+
throw new Error('Not logged in to Rush. Run `rush login` first.');
|
|
23
|
+
}
|
|
24
|
+
const raw = fs.readFileSync(USER_YAML, 'utf-8');
|
|
25
|
+
const data = yaml.parse(raw);
|
|
26
|
+
const token = data?.session?.access_token;
|
|
27
|
+
if (!token) {
|
|
28
|
+
throw new Error('No session token in ~/.rush/user.yaml. Run `rush login` first.');
|
|
29
|
+
}
|
|
30
|
+
return token;
|
|
31
|
+
}
|
|
32
|
+
async function api(method, endpoint, token) {
|
|
33
|
+
return fetch(`${PROXY_BASE}${endpoint}`, {
|
|
34
|
+
method,
|
|
35
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Coerce the `agent` field on a cloud-run row to a SessionAgentId. */
|
|
39
|
+
function agentToFormat(agent) {
|
|
40
|
+
if (agent === 'claude')
|
|
41
|
+
return 'claude';
|
|
42
|
+
if (agent === 'codex')
|
|
43
|
+
return 'codex';
|
|
44
|
+
if (agent === 'rush')
|
|
45
|
+
return 'rush';
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* List cloud executions the user has captured sessions for. Includes
|
|
50
|
+
* completed + needs_review + failed; an empty session_path means capture
|
|
51
|
+
* never ran, so those are silently dropped.
|
|
52
|
+
*/
|
|
53
|
+
export async function discoverCloudSessions(options) {
|
|
54
|
+
const token = readToken();
|
|
55
|
+
const limit = options?.limit ?? 50;
|
|
56
|
+
const res = await api('GET', `/api/v1/cloud-runs?limit=${limit}`, token);
|
|
57
|
+
if (!res.ok) {
|
|
58
|
+
throw new Error(`cloud-runs list failed (${res.status})`);
|
|
59
|
+
}
|
|
60
|
+
const data = (await res.json());
|
|
61
|
+
const rows = data.executions ?? [];
|
|
62
|
+
const out = [];
|
|
63
|
+
for (const row of rows) {
|
|
64
|
+
const agent = agentToFormat(row.agent);
|
|
65
|
+
if (!agent)
|
|
66
|
+
continue;
|
|
67
|
+
const id = row.execution_id;
|
|
68
|
+
const timestamp = row.updated_at || row.created_at || new Date().toISOString();
|
|
69
|
+
const project = row.repo_owner && row.repo_name ? `${row.repo_owner}/${row.repo_name}` : undefined;
|
|
70
|
+
// filePath doubles as the sink path for the cached jsonl. parseSession
|
|
71
|
+
// dispatches on detectAgent which recognizes the `session.<format>.jsonl`
|
|
72
|
+
// suffix — so the local cache file name must preserve it.
|
|
73
|
+
const filePath = path.join(CLOUD_CACHE_DIR, id, `session.${agent}.jsonl`);
|
|
74
|
+
out.push({
|
|
75
|
+
id,
|
|
76
|
+
shortId: id.slice(0, 8),
|
|
77
|
+
agent,
|
|
78
|
+
timestamp,
|
|
79
|
+
project,
|
|
80
|
+
filePath,
|
|
81
|
+
topic: row.prompt?.split('\n')[0]?.slice(0, 120),
|
|
82
|
+
label: `[cloud/${row.status}]${row.branch ? ` ${row.branch}` : ''}`,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
out.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Fetch the jsonl for one cloud execution and stash it in the local cache.
|
|
90
|
+
* Returns the local file path. Re-fetches on every call (cheap — executions
|
|
91
|
+
* are immutable once complete). Callers may pass an already-known filePath.
|
|
92
|
+
*/
|
|
93
|
+
export async function ensureCloudSessionCached(executionId, destPath) {
|
|
94
|
+
const token = readToken();
|
|
95
|
+
const res = await api('GET', `/api/v1/cloud-runs/${encodeURIComponent(executionId)}/session.jsonl`, token);
|
|
96
|
+
if (!res.ok) {
|
|
97
|
+
const body = await res.text().catch(() => '');
|
|
98
|
+
throw new Error(`session.jsonl fetch ${res.status}: ${body.slice(0, 200)}`);
|
|
99
|
+
}
|
|
100
|
+
const format = (res.headers.get('X-Session-Format') || '').toLowerCase();
|
|
101
|
+
if (!['claude', 'codex', 'rush'].includes(format)) {
|
|
102
|
+
throw new Error(`Unknown X-Session-Format on cloud response: "${format}"`);
|
|
103
|
+
}
|
|
104
|
+
const finalPath = destPath ?? path.join(CLOUD_CACHE_DIR, executionId, `session.${format}.jsonl`);
|
|
105
|
+
fs.mkdirSync(path.dirname(finalPath), { recursive: true });
|
|
106
|
+
const body = Buffer.from(await res.arrayBuffer());
|
|
107
|
+
fs.writeFileSync(finalPath, body);
|
|
108
|
+
return finalPath;
|
|
109
|
+
}
|
|
110
|
+
/** True if filePath points into the cloud session cache dir. */
|
|
111
|
+
export function isCloudSessionPath(filePath) {
|
|
112
|
+
return filePath.startsWith(CLOUD_CACHE_DIR);
|
|
113
|
+
}
|
|
114
|
+
/** Extract execution_id from a cloud cache path. */
|
|
115
|
+
export function executionIdFromCloudPath(filePath) {
|
|
116
|
+
if (!isCloudSessionPath(filePath))
|
|
117
|
+
return null;
|
|
118
|
+
const rel = path.relative(CLOUD_CACHE_DIR, filePath);
|
|
119
|
+
const parts = rel.split(path.sep);
|
|
120
|
+
return parts[0] || null;
|
|
121
|
+
}
|
package/dist/lib/session/db.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed session index and full-text search.
|
|
3
|
+
*
|
|
4
|
+
* Stores session metadata and user-prompt text in a WAL-mode SQLite database
|
|
5
|
+
* at ~/.agents/sessions/sessions.db. Provides incremental upsert, scan-stamp
|
|
6
|
+
* ledger (mtime/size tracking to skip unchanged files), FTS5 search with
|
|
7
|
+
* BM25 ranking, and label-first search for /rename'd sessions.
|
|
8
|
+
*/
|
|
9
|
+
import Database from '../sqlite.js';
|
|
2
10
|
import type { SessionAgentId, SessionMeta } from './types.js';
|
|
11
|
+
/** Raw row shape returned from the sessions table. */
|
|
3
12
|
export interface SessionRow {
|
|
4
13
|
id: string;
|
|
5
14
|
short_id: string;
|
|
@@ -20,10 +29,12 @@ export interface SessionRow {
|
|
|
20
29
|
scanned_at: number | null;
|
|
21
30
|
is_team_origin: number;
|
|
22
31
|
}
|
|
32
|
+
/** File stat snapshot used to detect changes between scan runs. */
|
|
23
33
|
export interface ScanStamp {
|
|
24
34
|
fileMtimeMs: number;
|
|
25
35
|
fileSize: number;
|
|
26
36
|
}
|
|
37
|
+
/** Filter and pagination options for querying the sessions table. */
|
|
27
38
|
export interface QueryOptions {
|
|
28
39
|
agent?: SessionAgentId;
|
|
29
40
|
agents?: SessionAgentId[];
|
|
@@ -40,8 +51,11 @@ export interface QueryOptions {
|
|
|
40
51
|
/** Keep only team-origin rows (for hidden-count queries). */
|
|
41
52
|
onlyTeamOrigin?: boolean;
|
|
42
53
|
}
|
|
54
|
+
/** Open (or return the cached) sessions database, applying migrations as needed. */
|
|
43
55
|
export declare function getDB(): Database.Database;
|
|
56
|
+
/** Close the cached database connection. */
|
|
44
57
|
export declare function closeDB(): void;
|
|
58
|
+
/** Return the absolute path to the sessions database file. */
|
|
45
59
|
export declare function getDBPath(): string;
|
|
46
60
|
/**
|
|
47
61
|
* Look up the file stat stamp we stored the last time we scanned a given file path.
|
|
@@ -66,6 +80,7 @@ export declare function recordScans(entries: Array<{
|
|
|
66
80
|
* `content` is the tokenizable user-prompt text; pass '' to leave the row unsearchable.
|
|
67
81
|
*/
|
|
68
82
|
export declare function upsertSession(meta: SessionMeta, content: string, scan?: ScanStamp): void;
|
|
83
|
+
/** Batch-upsert sessions with their FTS5 content and scan stamps in a single transaction. */
|
|
69
84
|
export declare function upsertSessionsBatch(entries: Array<{
|
|
70
85
|
meta: SessionMeta;
|
|
71
86
|
content: string;
|
|
@@ -77,11 +92,17 @@ export declare function upsertSessionsBatch(entries: Array<{
|
|
|
77
92
|
* Leaves FTS5 content/topic/project untouched — cheap to call every run.
|
|
78
93
|
*/
|
|
79
94
|
export declare function syncLabels(labelMap: Map<string, string | null>): number;
|
|
95
|
+
/** Query sessions from the database, applying filters and ordering by timestamp descending. */
|
|
80
96
|
export declare function querySessions(options?: QueryOptions): SessionMeta[];
|
|
97
|
+
/** Count sessions matching the given filter options. */
|
|
81
98
|
export declare function countSessions(options?: QueryOptions): number;
|
|
99
|
+
/** Return the set of all file paths currently tracked in the sessions table. */
|
|
82
100
|
export declare function getAllFilePaths(): Set<string>;
|
|
101
|
+
/** Look up sessions by their source file paths. */
|
|
83
102
|
export declare function getSessionsByFilePaths(paths: string[]): Map<string, SessionMeta>;
|
|
103
|
+
/** Look up a single session by its unique ID. */
|
|
84
104
|
export declare function getSessionById(id: string): SessionMeta | null;
|
|
105
|
+
/** A single full-text search result with ranking score. */
|
|
85
106
|
export interface FtsHit {
|
|
86
107
|
sessionId: string;
|
|
87
108
|
score: number;
|
|
@@ -111,8 +132,8 @@ export declare function buildFtsQuery(input: string): {
|
|
|
111
132
|
* so "higher = better" is consistent across all tiers.
|
|
112
133
|
*/
|
|
113
134
|
export declare function ftsSearch(input: string, limit?: number): FtsHit[];
|
|
135
|
+
/** Return the total row counts for the sessions and FTS5 tables (diagnostic). */
|
|
114
136
|
export declare function getRowCount(): {
|
|
115
137
|
sessions: number;
|
|
116
138
|
textRows: number;
|
|
117
139
|
};
|
|
118
|
-
//# sourceMappingURL=db.d.ts.map
|
package/dist/lib/session/db.js
CHANGED
|
@@ -1,14 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed session index and full-text search.
|
|
3
|
+
*
|
|
4
|
+
* Stores session metadata and user-prompt text in a WAL-mode SQLite database
|
|
5
|
+
* at ~/.agents/sessions/sessions.db. Provides incremental upsert, scan-stamp
|
|
6
|
+
* ledger (mtime/size tracking to skip unchanged files), FTS5 search with
|
|
7
|
+
* BM25 ranking, and label-first search for /rename'd sessions.
|
|
8
|
+
*/
|
|
1
9
|
import * as fs from 'fs';
|
|
2
|
-
import * as os from 'os';
|
|
3
10
|
import * as path from 'path';
|
|
4
|
-
import Database from '
|
|
5
|
-
|
|
6
|
-
const SESSIONS_DIR = path.join(
|
|
11
|
+
import Database from '../sqlite.js';
|
|
12
|
+
import { getAgentsDir } from '../state.js';
|
|
13
|
+
const SESSIONS_DIR = path.join(getAgentsDir(), 'sessions');
|
|
7
14
|
const DB_PATH = path.join(SESSIONS_DIR, 'sessions.db');
|
|
8
|
-
|
|
15
|
+
/** Current schema version; bumped when migrations are added. */
|
|
16
|
+
const SCHEMA_VERSION = 5;
|
|
17
|
+
/**
|
|
18
|
+
* Canonicalize a file path for use as a scan_ledger key. The same physical
|
|
19
|
+
* session file is reachable via multiple aliases — `~/.claude/projects/x.jsonl`
|
|
20
|
+
* (when `~/.claude` is a symlink to a versioned home) and
|
|
21
|
+
* `~/.agents-system/versions/claude/<v>/home/.claude/projects/x.jsonl`. Keying the
|
|
22
|
+
* ledger by the raw path means switching between these aliases (e.g. via
|
|
23
|
+
* `agents use`) misses the cache and forces a full re-parse. Realpath collapses
|
|
24
|
+
* all aliases to one stable key.
|
|
25
|
+
*/
|
|
26
|
+
function canonicalLedgerKey(filePath) {
|
|
27
|
+
if (!filePath)
|
|
28
|
+
return filePath;
|
|
29
|
+
try {
|
|
30
|
+
return fs.realpathSync(filePath);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return filePath;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
9
36
|
// BM25 column weights for session_text: label > topic > project > content.
|
|
10
37
|
// Higher weights make matches in that column rank higher.
|
|
38
|
+
/** BM25 column weights for FTS5: label > topic > project > content. */
|
|
11
39
|
const BM25_WEIGHTS = [5.0, 2.0, 1.5, 1.0];
|
|
40
|
+
/** DDL for the sessions database (tables, indexes, FTS5 virtual table). */
|
|
12
41
|
const SCHEMA = `
|
|
13
42
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
14
43
|
id TEXT PRIMARY KEY,
|
|
@@ -105,7 +134,15 @@ function migrateSchema(db, fromVersion) {
|
|
|
105
134
|
}
|
|
106
135
|
db.exec(`DELETE FROM scan_ledger;`);
|
|
107
136
|
}
|
|
137
|
+
if (fromVersion < 5) {
|
|
138
|
+
// v4 → v5: ledger is now keyed by realpath instead of the as-discovered
|
|
139
|
+
// path, so symlink/version-relative aliases for the same physical file
|
|
140
|
+
// collapse to one row. Old aliased rows are dropped — next scan will
|
|
141
|
+
// repopulate under canonical keys.
|
|
142
|
+
db.exec(`DELETE FROM scan_ledger;`);
|
|
143
|
+
}
|
|
108
144
|
}
|
|
145
|
+
/** Open (or return the cached) sessions database, applying migrations as needed. */
|
|
109
146
|
export function getDB() {
|
|
110
147
|
if (dbInstance)
|
|
111
148
|
return dbInstance;
|
|
@@ -144,12 +181,14 @@ export function getDB() {
|
|
|
144
181
|
dbInstance = db;
|
|
145
182
|
return db;
|
|
146
183
|
}
|
|
184
|
+
/** Close the cached database connection. */
|
|
147
185
|
export function closeDB() {
|
|
148
186
|
if (dbInstance) {
|
|
149
187
|
dbInstance.close();
|
|
150
188
|
dbInstance = null;
|
|
151
189
|
}
|
|
152
190
|
}
|
|
191
|
+
/** Return the absolute path to the sessions database file. */
|
|
153
192
|
export function getDBPath() {
|
|
154
193
|
return DB_PATH;
|
|
155
194
|
}
|
|
@@ -161,7 +200,7 @@ export function getScanStampByPath(filePath) {
|
|
|
161
200
|
const db = getDB();
|
|
162
201
|
const row = db
|
|
163
202
|
.prepare(`SELECT file_mtime_ms, file_size FROM scan_ledger WHERE file_path = ? LIMIT 1`)
|
|
164
|
-
.get(filePath);
|
|
203
|
+
.get(canonicalLedgerKey(filePath));
|
|
165
204
|
return row ? { fileMtimeMs: row.file_mtime_ms, fileSize: row.file_size } : null;
|
|
166
205
|
}
|
|
167
206
|
/**
|
|
@@ -173,10 +212,24 @@ export function getScanStampsForPaths(filePaths) {
|
|
|
173
212
|
if (filePaths.length === 0)
|
|
174
213
|
return result;
|
|
175
214
|
const db = getDB();
|
|
215
|
+
// Multiple input paths can resolve to the same canonical key (e.g. the same
|
|
216
|
+
// session JSONL reachable via `~/.claude/...` and `~/.agents-system/versions/...`).
|
|
217
|
+
// We query DB by canonical key, then fan results back out to every original
|
|
218
|
+
// alias so callers can `.get(filePath)` with the path they passed in.
|
|
219
|
+
const canonicalToOriginals = new Map();
|
|
220
|
+
for (const fp of filePaths) {
|
|
221
|
+
const canonical = canonicalLedgerKey(fp);
|
|
222
|
+
const aliases = canonicalToOriginals.get(canonical);
|
|
223
|
+
if (aliases)
|
|
224
|
+
aliases.push(fp);
|
|
225
|
+
else
|
|
226
|
+
canonicalToOriginals.set(canonical, [fp]);
|
|
227
|
+
}
|
|
228
|
+
const canonicalKeys = [...canonicalToOriginals.keys()];
|
|
176
229
|
// SQLite parameter limit is typically 999 / 32766 — chunk defensively.
|
|
177
230
|
const CHUNK = 500;
|
|
178
|
-
for (let i = 0; i <
|
|
179
|
-
const chunk =
|
|
231
|
+
for (let i = 0; i < canonicalKeys.length; i += CHUNK) {
|
|
232
|
+
const chunk = canonicalKeys.slice(i, i + CHUNK);
|
|
180
233
|
const placeholders = chunk.map(() => '?').join(',');
|
|
181
234
|
const rows = db
|
|
182
235
|
.prepare(`
|
|
@@ -186,7 +239,10 @@ export function getScanStampsForPaths(filePaths) {
|
|
|
186
239
|
`)
|
|
187
240
|
.all(...chunk);
|
|
188
241
|
for (const row of rows) {
|
|
189
|
-
|
|
242
|
+
const stamp = { fileMtimeMs: row.file_mtime_ms, fileSize: row.file_size };
|
|
243
|
+
for (const original of canonicalToOriginals.get(row.file_path) || []) {
|
|
244
|
+
result.set(original, stamp);
|
|
245
|
+
}
|
|
190
246
|
}
|
|
191
247
|
}
|
|
192
248
|
return result;
|
|
@@ -210,7 +266,7 @@ export function recordScans(entries) {
|
|
|
210
266
|
const now = Date.now();
|
|
211
267
|
const txn = db.transaction((items) => {
|
|
212
268
|
for (const { filePath, scan } of items) {
|
|
213
|
-
stmt.run(filePath, scan.fileMtimeMs, scan.fileSize, now);
|
|
269
|
+
stmt.run(canonicalLedgerKey(filePath), scan.fileMtimeMs, scan.fileSize, now);
|
|
214
270
|
}
|
|
215
271
|
});
|
|
216
272
|
txn(entries);
|
|
@@ -291,6 +347,7 @@ export function upsertSession(meta, content, scan) {
|
|
|
291
347
|
});
|
|
292
348
|
txn();
|
|
293
349
|
}
|
|
350
|
+
/** Batch-upsert sessions with their FTS5 content and scan stamps in a single transaction. */
|
|
294
351
|
export function upsertSessionsBatch(entries) {
|
|
295
352
|
if (entries.length === 0)
|
|
296
353
|
return;
|
|
@@ -330,7 +387,7 @@ export function upsertSessionsBatch(entries) {
|
|
|
330
387
|
delText.run(meta.id);
|
|
331
388
|
insText.run(meta.id, meta.label ?? '', meta.topic ?? '', meta.project ?? '', content ?? '');
|
|
332
389
|
if (scan && meta.filePath) {
|
|
333
|
-
ledger.run(meta.filePath, scan.fileMtimeMs, scan.fileSize, now);
|
|
390
|
+
ledger.run(canonicalLedgerKey(meta.filePath), scan.fileMtimeMs, scan.fileSize, now);
|
|
334
391
|
}
|
|
335
392
|
}
|
|
336
393
|
});
|
|
@@ -374,6 +431,7 @@ export function syncLabels(labelMap) {
|
|
|
374
431
|
txn(updates);
|
|
375
432
|
return updates.length;
|
|
376
433
|
}
|
|
434
|
+
/** Convert a raw database row into a SessionMeta object. */
|
|
377
435
|
function rowToMeta(row) {
|
|
378
436
|
return {
|
|
379
437
|
id: row.id,
|
|
@@ -393,6 +451,7 @@ function rowToMeta(row) {
|
|
|
393
451
|
isTeamOrigin: row.is_team_origin === 1,
|
|
394
452
|
};
|
|
395
453
|
}
|
|
454
|
+
/** Build a parameterized WHERE clause from query options. */
|
|
396
455
|
function buildSessionWhere(options) {
|
|
397
456
|
const where = [];
|
|
398
457
|
const params = [];
|
|
@@ -438,6 +497,7 @@ function buildSessionWhere(options) {
|
|
|
438
497
|
const clause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : '';
|
|
439
498
|
return { clause, params };
|
|
440
499
|
}
|
|
500
|
+
/** Query sessions from the database, applying filters and ordering by timestamp descending. */
|
|
441
501
|
export function querySessions(options = {}) {
|
|
442
502
|
const db = getDB();
|
|
443
503
|
const { clause, params } = buildSessionWhere(options);
|
|
@@ -446,6 +506,7 @@ export function querySessions(options = {}) {
|
|
|
446
506
|
const rows = db.prepare(sql).all(...params);
|
|
447
507
|
return rows.map(rowToMeta);
|
|
448
508
|
}
|
|
509
|
+
/** Count sessions matching the given filter options. */
|
|
449
510
|
export function countSessions(options = {}) {
|
|
450
511
|
const db = getDB();
|
|
451
512
|
const { clause, params } = buildSessionWhere(options);
|
|
@@ -453,11 +514,13 @@ export function countSessions(options = {}) {
|
|
|
453
514
|
const row = db.prepare(sql).get(...params);
|
|
454
515
|
return row ? row.n : 0;
|
|
455
516
|
}
|
|
517
|
+
/** Return the set of all file paths currently tracked in the sessions table. */
|
|
456
518
|
export function getAllFilePaths() {
|
|
457
519
|
const db = getDB();
|
|
458
520
|
const rows = db.prepare(`SELECT file_path FROM sessions`).all();
|
|
459
521
|
return new Set(rows.map(r => r.file_path));
|
|
460
522
|
}
|
|
523
|
+
/** Look up sessions by their source file paths. */
|
|
461
524
|
export function getSessionsByFilePaths(paths) {
|
|
462
525
|
if (paths.length === 0)
|
|
463
526
|
return new Map();
|
|
@@ -471,6 +534,7 @@ export function getSessionsByFilePaths(paths) {
|
|
|
471
534
|
result.set(row.file_path, rowToMeta(row));
|
|
472
535
|
return result;
|
|
473
536
|
}
|
|
537
|
+
/** Look up a single session by its unique ID. */
|
|
474
538
|
export function getSessionById(id) {
|
|
475
539
|
const db = getDB();
|
|
476
540
|
const row = db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(id);
|
|
@@ -567,10 +631,10 @@ export function ftsSearch(input, limit = 200) {
|
|
|
567
631
|
hits.sort((a, b) => b.score - a.score);
|
|
568
632
|
return hits.slice(0, limit);
|
|
569
633
|
}
|
|
634
|
+
/** Return the total row counts for the sessions and FTS5 tables (diagnostic). */
|
|
570
635
|
export function getRowCount() {
|
|
571
636
|
const db = getDB();
|
|
572
637
|
const sessions = db.prepare(`SELECT COUNT(*) AS c FROM sessions`).get().c;
|
|
573
638
|
const textRows = db.prepare(`SELECT COUNT(*) AS c FROM session_text`).get().c;
|
|
574
639
|
return { sessions, textRows };
|
|
575
640
|
}
|
|
576
|
-
//# sourceMappingURL=db.js.map
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session discovery across Claude, Codex, Gemini, OpenCode, and OpenClaw.
|
|
3
|
+
*
|
|
4
|
+
* Performs incremental scans: each agent's session files are stat'd and compared
|
|
5
|
+
* to a scan-stamp ledger in SQLite. Only files whose mtime or size changed since
|
|
6
|
+
* the last run are re-parsed. All metadata is upserted into the sessions DB so
|
|
7
|
+
* subsequent queries are served entirely from the cache.
|
|
8
|
+
*/
|
|
1
9
|
import type { SessionAgentId, SessionMeta } from './types.js';
|
|
10
|
+
/** Options controlling which sessions to discover and how to report progress. */
|
|
2
11
|
export interface DiscoverOptions {
|
|
3
12
|
agent?: SessionAgentId;
|
|
4
13
|
version?: string;
|
|
@@ -19,6 +28,7 @@ export interface DiscoverOptions {
|
|
|
19
28
|
/** Called as each agent makes parsing progress. Totals count only files that need re-parsing (cache misses). */
|
|
20
29
|
onProgress?: (progress: ScanProgress) => void;
|
|
21
30
|
}
|
|
31
|
+
/** Progress report emitted during incremental scanning. */
|
|
22
32
|
export interface ScanProgress {
|
|
23
33
|
agent: SessionAgentId;
|
|
24
34
|
parsed: number;
|
|
@@ -51,10 +61,15 @@ export declare function searchContentIndex(sessions: SessionMeta[], query: strin
|
|
|
51
61
|
* realpath to avoid double-counting symlinked version homes.
|
|
52
62
|
*/
|
|
53
63
|
export declare function getAgentSessionDirs(agent: string, subdir: string): string[];
|
|
54
|
-
export declare function readFirstLines(filePath: string, maxLines: number): Promise<string[]>;
|
|
55
64
|
/**
|
|
56
|
-
*
|
|
65
|
+
* Build a map of Claude sessionId -> user-given label from ~/.claude/sessions/*.json.
|
|
66
|
+
* Each JSON has shape { pid, sessionId, cwd, startedAt, name?, ... }. The
|
|
67
|
+
* `name` field only exists if the user ran /rename in that session.
|
|
68
|
+
* For sessionId collisions (re-resume of the same session), prefer the most
|
|
69
|
+
* recent startedAt.
|
|
57
70
|
*/
|
|
58
|
-
export declare function
|
|
71
|
+
export declare function buildClaudeLabelMap(): Map<string, string | null>;
|
|
72
|
+
/** Read up to maxLines non-empty lines from the beginning of a file. */
|
|
73
|
+
export declare function readFirstLines(filePath: string, maxLines: number): Promise<string[]>;
|
|
74
|
+
/** Parse a time filter string (relative like '7d' or ISO timestamp) into epoch milliseconds. */
|
|
59
75
|
export declare function parseTimeFilter(input: string): number;
|
|
60
|
-
//# sourceMappingURL=discover.d.ts.map
|