@swarmify/agents-cli 1.13.3 → 1.14.0
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/README.md +2 -319
- package/bin/agents.js +2 -0
- package/package.json +13 -79
- package/scripts/postinstall.js +4 -71
- package/CHANGELOG.md +0 -316
- package/LICENSE +0 -21
- package/dist/commands/__tests__/sessions-tail.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions-tail.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions-tail.test.js +0 -108
- package/dist/commands/__tests__/sessions-tail.test.js.map +0 -1
- 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 +0 -11
- package/dist/commands/cloud.d.ts.map +0 -1
- package/dist/commands/cloud.js +0 -363
- package/dist/commands/cloud.js.map +0 -1
- package/dist/commands/commands.d.ts +0 -12
- package/dist/commands/commands.d.ts.map +0 -1
- package/dist/commands/commands.js +0 -629
- package/dist/commands/commands.js.map +0 -1
- package/dist/commands/daemon.d.ts +0 -11
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js +0 -119
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/drive.d.ts +0 -11
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js +0 -175
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/exec.d.ts +0 -11
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js +0 -251
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/factory.d.ts +0 -11
- package/dist/commands/factory.d.ts.map +0 -1
- package/dist/commands/factory.js +0 -445
- package/dist/commands/factory.js.map +0 -1
- package/dist/commands/fork.d.ts +0 -11
- package/dist/commands/fork.d.ts.map +0 -1
- package/dist/commands/fork.js +0 -147
- package/dist/commands/fork.js.map +0 -1
- package/dist/commands/hooks.d.ts +0 -12
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js +0 -690
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/init.d.ts +0 -15
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -137
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -12
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -583
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/models.d.ts +0 -11
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js +0 -170
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/packages.d.ts +0 -11
- package/dist/commands/packages.d.ts.map +0 -1
- package/dist/commands/packages.js +0 -551
- package/dist/commands/packages.js.map +0 -1
- package/dist/commands/permissions.d.ts +0 -12
- package/dist/commands/permissions.d.ts.map +0 -1
- package/dist/commands/permissions.js +0 -724
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/plugins.d.ts +0 -11
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js +0 -393
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/profiles.d.ts +0 -12
- package/dist/commands/profiles.d.ts.map +0 -1
- package/dist/commands/profiles.js +0 -255
- package/dist/commands/profiles.js.map +0 -1
- package/dist/commands/pty.d.ts +0 -21
- package/dist/commands/pty.d.ts.map +0 -1
- package/dist/commands/pty.js +0 -391
- package/dist/commands/pty.js.map +0 -1
- package/dist/commands/pull.d.ts +0 -11
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js +0 -456
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -11
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -188
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/refresh-memory.d.ts +0 -16
- package/dist/commands/refresh-memory.d.ts.map +0 -1
- package/dist/commands/refresh-memory.js +0 -52
- package/dist/commands/refresh-memory.js.map +0 -1
- package/dist/commands/resource-view.d.ts +0 -39
- package/dist/commands/resource-view.d.ts.map +0 -1
- package/dist/commands/resource-view.js +0 -197
- package/dist/commands/resource-view.js.map +0 -1
- package/dist/commands/routines.d.ts +0 -11
- package/dist/commands/routines.d.ts.map +0 -1
- package/dist/commands/routines.js +0 -590
- package/dist/commands/routines.js.map +0 -1
- package/dist/commands/rules.d.ts +0 -12
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js +0 -489
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/secrets.d.ts +0 -11
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js +0 -352
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/sessions-picker.d.ts +0 -18
- package/dist/commands/sessions-picker.d.ts.map +0 -1
- package/dist/commands/sessions-picker.js +0 -265
- package/dist/commands/sessions-picker.js.map +0 -1
- package/dist/commands/sessions-tail.d.ts +0 -20
- package/dist/commands/sessions-tail.d.ts.map +0 -1
- package/dist/commands/sessions-tail.js +0 -236
- package/dist/commands/sessions-tail.js.map +0 -1
- package/dist/commands/sessions.d.ts +0 -18
- package/dist/commands/sessions.d.ts.map +0 -1
- package/dist/commands/sessions.js +0 -1173
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/skills.d.ts +0 -12
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js +0 -717
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts +0 -10
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -26
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/subagents.d.ts +0 -11
- package/dist/commands/subagents.d.ts.map +0 -1
- package/dist/commands/subagents.js +0 -361
- package/dist/commands/subagents.js.map +0 -1
- package/dist/commands/sync.d.ts +0 -11
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js +0 -70
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/teams-picker.d.ts +0 -18
- package/dist/commands/teams-picker.d.ts.map +0 -1
- package/dist/commands/teams-picker.js +0 -290
- package/dist/commands/teams-picker.js.map +0 -1
- package/dist/commands/teams.d.ts +0 -18
- package/dist/commands/teams.d.ts.map +0 -1
- package/dist/commands/teams.js +0 -1144
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/utils.d.ts +0 -45
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js +0 -106
- package/dist/commands/utils.js.map +0 -1
- package/dist/commands/versions.d.ts +0 -11
- package/dist/commands/versions.d.ts.map +0 -1
- package/dist/commands/versions.js +0 -701
- package/dist/commands/versions.js.map +0 -1
- package/dist/commands/view.d.ts +0 -43
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js +0 -894
- package/dist/commands/view.js.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -496
- 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 -57
- 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 +0 -158
- package/dist/lib/agents.d.ts.map +0 -1
- package/dist/lib/agents.js +0 -1159
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/artifact-actions.d.ts +0 -27
- package/dist/lib/artifact-actions.d.ts.map +0 -1
- package/dist/lib/artifact-actions.js +0 -58
- package/dist/lib/artifact-actions.js.map +0 -1
- package/dist/lib/cloud/codex.d.ts +0 -26
- package/dist/lib/cloud/codex.d.ts.map +0 -1
- package/dist/lib/cloud/codex.js +0 -237
- package/dist/lib/cloud/codex.js.map +0 -1
- package/dist/lib/cloud/factory.d.ts +0 -32
- package/dist/lib/cloud/factory.d.ts.map +0 -1
- package/dist/lib/cloud/factory.js +0 -43
- package/dist/lib/cloud/factory.js.map +0 -1
- package/dist/lib/cloud/registry.d.ts +0 -16
- package/dist/lib/cloud/registry.d.ts.map +0 -1
- package/dist/lib/cloud/registry.js +0 -68
- package/dist/lib/cloud/registry.js.map +0 -1
- package/dist/lib/cloud/rush.d.ts +0 -37
- package/dist/lib/cloud/rush.d.ts.map +0 -1
- package/dist/lib/cloud/rush.js +0 -230
- package/dist/lib/cloud/rush.js.map +0 -1
- package/dist/lib/cloud/rush.test.d.ts +0 -2
- package/dist/lib/cloud/rush.test.d.ts.map +0 -1
- package/dist/lib/cloud/rush.test.js +0 -63
- package/dist/lib/cloud/rush.test.js.map +0 -1
- package/dist/lib/cloud/store.d.ts +0 -23
- package/dist/lib/cloud/store.d.ts.map +0 -1
- package/dist/lib/cloud/store.js +0 -116
- package/dist/lib/cloud/store.js.map +0 -1
- package/dist/lib/cloud/stream.d.ts +0 -24
- package/dist/lib/cloud/stream.d.ts.map +0 -1
- package/dist/lib/cloud/stream.js +0 -145
- package/dist/lib/cloud/stream.js.map +0 -1
- package/dist/lib/cloud/types.d.ts +0 -109
- package/dist/lib/cloud/types.d.ts.map +0 -1
- package/dist/lib/cloud/types.js +0 -33
- package/dist/lib/cloud/types.js.map +0 -1
- package/dist/lib/cloud/types.test.d.ts +0 -2
- package/dist/lib/cloud/types.test.d.ts.map +0 -1
- package/dist/lib/cloud/types.test.js +0 -41
- package/dist/lib/cloud/types.test.js.map +0 -1
- package/dist/lib/commands.d.ts +0 -141
- package/dist/lib/commands.d.ts.map +0 -1
- package/dist/lib/commands.js +0 -514
- package/dist/lib/commands.js.map +0 -1
- package/dist/lib/convert.d.ts +0 -21
- package/dist/lib/convert.d.ts.map +0 -1
- package/dist/lib/convert.js +0 -54
- package/dist/lib/convert.js.map +0 -1
- package/dist/lib/daemon.d.ts +0 -43
- package/dist/lib/daemon.d.ts.map +0 -1
- package/dist/lib/daemon.js +0 -332
- package/dist/lib/daemon.js.map +0 -1
- package/dist/lib/drive-sync.d.ts +0 -46
- package/dist/lib/drive-sync.d.ts.map +0 -1
- package/dist/lib/drive-sync.js +0 -209
- package/dist/lib/drive-sync.js.map +0 -1
- package/dist/lib/exec.d.ts +0 -101
- package/dist/lib/exec.d.ts.map +0 -1
- package/dist/lib/exec.js +0 -450
- package/dist/lib/exec.js.map +0 -1
- package/dist/lib/factory/__tests__/config.test.d.ts +0 -2
- package/dist/lib/factory/__tests__/config.test.d.ts.map +0 -1
- package/dist/lib/factory/__tests__/config.test.js +0 -128
- package/dist/lib/factory/__tests__/config.test.js.map +0 -1
- package/dist/lib/factory/config.d.ts +0 -49
- package/dist/lib/factory/config.d.ts.map +0 -1
- package/dist/lib/factory/config.js +0 -127
- package/dist/lib/factory/config.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 -107
- package/dist/lib/factory.js.map +0 -1
- package/dist/lib/git.d.ts +0 -157
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js +0 -647
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/help.d.ts +0 -10
- package/dist/lib/help.d.ts.map +0 -1
- package/dist/lib/help.js +0 -66
- package/dist/lib/help.js.map +0 -1
- package/dist/lib/hooks.d.ts +0 -125
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/lib/hooks.js +0 -846
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/ledger/__tests__/local.test.d.ts +0 -2
- package/dist/lib/ledger/__tests__/local.test.d.ts.map +0 -1
- package/dist/lib/ledger/__tests__/local.test.js +0 -177
- package/dist/lib/ledger/__tests__/local.test.js.map +0 -1
- package/dist/lib/ledger/__tests__/sync.test.d.ts +0 -2
- package/dist/lib/ledger/__tests__/sync.test.d.ts.map +0 -1
- package/dist/lib/ledger/__tests__/sync.test.js +0 -117
- package/dist/lib/ledger/__tests__/sync.test.js.map +0 -1
- package/dist/lib/ledger/index.d.ts +0 -18
- package/dist/lib/ledger/index.d.ts.map +0 -1
- package/dist/lib/ledger/index.js +0 -32
- package/dist/lib/ledger/index.js.map +0 -1
- package/dist/lib/ledger/local.d.ts +0 -22
- package/dist/lib/ledger/local.d.ts.map +0 -1
- package/dist/lib/ledger/local.js +0 -333
- package/dist/lib/ledger/local.js.map +0 -1
- package/dist/lib/ledger/r2.d.ts +0 -41
- package/dist/lib/ledger/r2.d.ts.map +0 -1
- package/dist/lib/ledger/r2.js +0 -335
- package/dist/lib/ledger/r2.js.map +0 -1
- package/dist/lib/ledger/sync.d.ts +0 -33
- package/dist/lib/ledger/sync.d.ts.map +0 -1
- package/dist/lib/ledger/sync.js +0 -106
- package/dist/lib/ledger/sync.js.map +0 -1
- package/dist/lib/ledger/types.d.ts +0 -100
- package/dist/lib/ledger/types.d.ts.map +0 -1
- package/dist/lib/ledger/types.js +0 -21
- package/dist/lib/ledger/types.js.map +0 -1
- package/dist/lib/manifest.d.ts +0 -14
- package/dist/lib/manifest.d.ts.map +0 -1
- package/dist/lib/manifest.js +0 -48
- package/dist/lib/manifest.js.map +0 -1
- package/dist/lib/markdown.d.ts +0 -5
- package/dist/lib/markdown.d.ts.map +0 -1
- package/dist/lib/markdown.js +0 -17
- package/dist/lib/markdown.js.map +0 -1
- package/dist/lib/mcp.d.ts +0 -64
- package/dist/lib/mcp.d.ts.map +0 -1
- package/dist/lib/mcp.js +0 -327
- package/dist/lib/mcp.js.map +0 -1
- package/dist/lib/memory-compile.d.ts +0 -65
- package/dist/lib/memory-compile.d.ts.map +0 -1
- package/dist/lib/memory-compile.js +0 -174
- package/dist/lib/memory-compile.js.map +0 -1
- package/dist/lib/memory.d.ts +0 -64
- package/dist/lib/memory.d.ts.map +0 -1
- package/dist/lib/memory.js +0 -275
- package/dist/lib/memory.js.map +0 -1
- package/dist/lib/models.d.ts +0 -98
- package/dist/lib/models.d.ts.map +0 -1
- package/dist/lib/models.js +0 -728
- package/dist/lib/models.js.map +0 -1
- package/dist/lib/permissions.d.ts +0 -227
- package/dist/lib/permissions.d.ts.map +0 -1
- package/dist/lib/permissions.js +0 -1071
- package/dist/lib/permissions.js.map +0 -1
- package/dist/lib/picker.d.ts +0 -27
- package/dist/lib/picker.d.ts.map +0 -1
- package/dist/lib/picker.js +0 -110
- package/dist/lib/picker.js.map +0 -1
- package/dist/lib/plugins.d.ts +0 -80
- package/dist/lib/plugins.d.ts.map +0 -1
- package/dist/lib/plugins.js +0 -556
- package/dist/lib/plugins.js.map +0 -1
- package/dist/lib/profiles-keychain.d.ts +0 -11
- package/dist/lib/profiles-keychain.d.ts.map +0 -1
- package/dist/lib/profiles-keychain.js +0 -14
- package/dist/lib/profiles-keychain.js.map +0 -1
- package/dist/lib/profiles-presets.d.ts +0 -25
- package/dist/lib/profiles-presets.d.ts.map +0 -1
- package/dist/lib/profiles-presets.js +0 -104
- package/dist/lib/profiles-presets.js.map +0 -1
- package/dist/lib/profiles.d.ts +0 -70
- package/dist/lib/profiles.d.ts.map +0 -1
- package/dist/lib/profiles.js +0 -145
- package/dist/lib/profiles.js.map +0 -1
- package/dist/lib/pty-client.d.ts +0 -23
- package/dist/lib/pty-client.d.ts.map +0 -1
- package/dist/lib/pty-client.js +0 -181
- package/dist/lib/pty-client.js.map +0 -1
- package/dist/lib/pty-server.d.ts +0 -21
- package/dist/lib/pty-server.d.ts.map +0 -1
- package/dist/lib/pty-server.js +0 -427
- package/dist/lib/pty-server.js.map +0 -1
- package/dist/lib/registry.d.ts +0 -45
- package/dist/lib/registry.d.ts.map +0 -1
- package/dist/lib/registry.js +0 -220
- package/dist/lib/registry.js.map +0 -1
- package/dist/lib/resources.d.ts +0 -55
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.js +0 -103
- package/dist/lib/resources.js.map +0 -1
- package/dist/lib/rotate.d.ts +0 -58
- package/dist/lib/rotate.d.ts.map +0 -1
- package/dist/lib/rotate.js +0 -93
- package/dist/lib/rotate.js.map +0 -1
- package/dist/lib/routines.d.ts +0 -99
- package/dist/lib/routines.d.ts.map +0 -1
- package/dist/lib/routines.js +0 -352
- package/dist/lib/routines.js.map +0 -1
- package/dist/lib/runner.d.ts +0 -26
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.js +0 -325
- package/dist/lib/runner.js.map +0 -1
- package/dist/lib/sandbox.d.ts +0 -26
- package/dist/lib/sandbox.d.ts.map +0 -1
- package/dist/lib/sandbox.js +0 -218
- package/dist/lib/sandbox.js.map +0 -1
- package/dist/lib/scheduler.d.ts +0 -26
- package/dist/lib/scheduler.d.ts.map +0 -1
- package/dist/lib/scheduler.js +0 -77
- package/dist/lib/scheduler.js.map +0 -1
- package/dist/lib/secrets-bundles.d.ts +0 -38
- package/dist/lib/secrets-bundles.d.ts.map +0 -1
- package/dist/lib/secrets-bundles.js +0 -176
- package/dist/lib/secrets-bundles.js.map +0 -1
- package/dist/lib/secrets.d.ts +0 -53
- package/dist/lib/secrets.d.ts.map +0 -1
- package/dist/lib/secrets.js +0 -140
- 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/active.d.ts +0 -44
- package/dist/lib/session/active.d.ts.map +0 -1
- package/dist/lib/session/active.js +0 -379
- package/dist/lib/session/active.js.map +0 -1
- package/dist/lib/session/artifacts.d.ts +0 -15
- package/dist/lib/session/artifacts.d.ts.map +0 -1
- package/dist/lib/session/artifacts.js +0 -86
- package/dist/lib/session/artifacts.js.map +0 -1
- package/dist/lib/session/db.d.ts +0 -140
- package/dist/lib/session/db.d.ts.map +0 -1
- package/dist/lib/session/db.js +0 -599
- package/dist/lib/session/db.js.map +0 -1
- package/dist/lib/session/discover.d.ts +0 -72
- package/dist/lib/session/discover.d.ts.map +0 -1
- package/dist/lib/session/discover.js +0 -1315
- package/dist/lib/session/discover.js.map +0 -1
- package/dist/lib/session/parse.d.ts +0 -34
- package/dist/lib/session/parse.d.ts.map +0 -1
- package/dist/lib/session/parse.js +0 -663
- package/dist/lib/session/parse.js.map +0 -1
- package/dist/lib/session/prompt.d.ts +0 -13
- package/dist/lib/session/prompt.d.ts.map +0 -1
- package/dist/lib/session/prompt.js +0 -79
- 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 +0 -103
- package/dist/lib/session/render.d.ts.map +0 -1
- package/dist/lib/session/render.js +0 -798
- package/dist/lib/session/render.js.map +0 -1
- package/dist/lib/session/team-filter.d.ts +0 -35
- package/dist/lib/session/team-filter.d.ts.map +0 -1
- package/dist/lib/session/team-filter.js +0 -75
- 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 +0 -84
- package/dist/lib/session/types.d.ts.map +0 -1
- package/dist/lib/session/types.js +0 -11
- package/dist/lib/session/types.js.map +0 -1
- package/dist/lib/shims.d.ts +0 -272
- package/dist/lib/shims.d.ts.map +0 -1
- package/dist/lib/shims.js +0 -1322
- package/dist/lib/shims.js.map +0 -1
- package/dist/lib/skills.d.ts +0 -142
- package/dist/lib/skills.d.ts.map +0 -1
- package/dist/lib/skills.js +0 -791
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/state.d.ts +0 -87
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js +0 -333
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/subagents.d.ts +0 -84
- package/dist/lib/subagents.d.ts.map +0 -1
- package/dist/lib/subagents.js +0 -410
- package/dist/lib/subagents.js.map +0 -1
- package/dist/lib/teams/__tests__/oracle.test.d.ts +0 -2
- package/dist/lib/teams/__tests__/oracle.test.d.ts.map +0 -1
- package/dist/lib/teams/__tests__/oracle.test.js +0 -89
- package/dist/lib/teams/__tests__/oracle.test.js.map +0 -1
- package/dist/lib/teams/__tests__/supervisor.test.d.ts +0 -2
- package/dist/lib/teams/__tests__/supervisor.test.d.ts.map +0 -1
- package/dist/lib/teams/__tests__/supervisor.test.js +0 -179
- package/dist/lib/teams/__tests__/supervisor.test.js.map +0 -1
- package/dist/lib/teams/agents.d.ts +0 -247
- package/dist/lib/teams/agents.d.ts.map +0 -1
- package/dist/lib/teams/agents.js +0 -1244
- package/dist/lib/teams/agents.js.map +0 -1
- package/dist/lib/teams/api.d.ts +0 -91
- package/dist/lib/teams/api.d.ts.map +0 -1
- package/dist/lib/teams/api.js +0 -239
- 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 +0 -8
- package/dist/lib/teams/debug.d.ts.map +0 -1
- package/dist/lib/teams/debug.js +0 -12
- package/dist/lib/teams/debug.js.map +0 -1
- package/dist/lib/teams/file_ops.d.ts +0 -13
- package/dist/lib/teams/file_ops.d.ts.map +0 -1
- package/dist/lib/teams/file_ops.js +0 -66
- package/dist/lib/teams/file_ops.js.map +0 -1
- package/dist/lib/teams/index.d.ts +0 -16
- package/dist/lib/teams/index.d.ts.map +0 -1
- package/dist/lib/teams/index.js +0 -15
- package/dist/lib/teams/index.js.map +0 -1
- package/dist/lib/teams/oracle.d.ts +0 -20
- package/dist/lib/teams/oracle.d.ts.map +0 -1
- package/dist/lib/teams/oracle.js +0 -59
- package/dist/lib/teams/oracle.js.map +0 -1
- package/dist/lib/teams/parsers.d.ts +0 -9
- package/dist/lib/teams/parsers.d.ts.map +0 -1
- package/dist/lib/teams/parsers.js +0 -837
- package/dist/lib/teams/parsers.js.map +0 -1
- package/dist/lib/teams/persistence.d.ts +0 -43
- package/dist/lib/teams/persistence.d.ts.map +0 -1
- package/dist/lib/teams/persistence.js +0 -299
- 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 +0 -18
- package/dist/lib/teams/registry.d.ts.map +0 -1
- package/dist/lib/teams/registry.js +0 -68
- package/dist/lib/teams/registry.js.map +0 -1
- package/dist/lib/teams/summarizer.d.ts +0 -73
- package/dist/lib/teams/summarizer.d.ts.map +0 -1
- package/dist/lib/teams/summarizer.js +0 -780
- package/dist/lib/teams/summarizer.js.map +0 -1
- package/dist/lib/teams/supervisor.d.ts +0 -49
- package/dist/lib/teams/supervisor.d.ts.map +0 -1
- package/dist/lib/teams/supervisor.js +0 -74
- package/dist/lib/teams/supervisor.js.map +0 -1
- package/dist/lib/template.d.ts +0 -27
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js +0 -60
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/types.d.ts +0 -331
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js +0 -29
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/usage.d.ts +0 -105
- package/dist/lib/usage.d.ts.map +0 -1
- package/dist/lib/usage.js +0 -686
- package/dist/lib/usage.js.map +0 -1
- package/dist/lib/versions.d.ts +0 -253
- package/dist/lib/versions.d.ts.map +0 -1
- package/dist/lib/versions.js +0 -1796
- package/dist/lib/versions.js.map +0 -1
- package/scripts/rebuild-sqlite.sh +0 -46
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import * as os from 'os';
|
|
5
|
-
import { symlinkAllowedDirs } from '../sandbox.js';
|
|
6
|
-
import { validateJob, parseAtTime, writeJob, readJob, deleteJob, resolveJobPrompt } from '../routines.js';
|
|
7
|
-
import { cleanOrphanedPluginSkills } from '../plugins.js';
|
|
8
|
-
describe('Bug Fix: Path traversal in sandbox.ts', () => {
|
|
9
|
-
let overlayHome;
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
overlayHome = fs.mkdtempSync(path.join(os.tmpdir(), 'sandbox-test-'));
|
|
12
|
-
});
|
|
13
|
-
afterEach(() => {
|
|
14
|
-
fs.rmSync(overlayHome, { recursive: true, force: true });
|
|
15
|
-
});
|
|
16
|
-
it('should block path traversal via .. components', () => {
|
|
17
|
-
// ~/../../../etc should resolve outside HOME and be rejected
|
|
18
|
-
symlinkAllowedDirs(overlayHome, ['~/../../../etc']);
|
|
19
|
-
// No symlink should be created for the traversal path
|
|
20
|
-
const entries = fs.readdirSync(overlayHome);
|
|
21
|
-
const hasEtc = entries.some(e => e === 'etc' || e.includes('etc'));
|
|
22
|
-
expect(hasEtc).toBe(false);
|
|
23
|
-
});
|
|
24
|
-
it('should block ~/../../../ style traversals', () => {
|
|
25
|
-
symlinkAllowedDirs(overlayHome, ['~/../../..']);
|
|
26
|
-
const entries = fs.readdirSync(overlayHome);
|
|
27
|
-
expect(entries.length).toBe(0);
|
|
28
|
-
});
|
|
29
|
-
it('should allow valid paths under HOME', () => {
|
|
30
|
-
const validDir = path.join(os.homedir(), '.agents');
|
|
31
|
-
if (!fs.existsSync(validDir))
|
|
32
|
-
return; // skip if doesn't exist
|
|
33
|
-
symlinkAllowedDirs(overlayHome, ['~/.agents']);
|
|
34
|
-
// Should create symlink for .agents
|
|
35
|
-
const symlinkPath = path.join(overlayHome, '.agents');
|
|
36
|
-
expect(fs.existsSync(symlinkPath)).toBe(true);
|
|
37
|
-
expect(fs.lstatSync(symlinkPath).isSymbolicLink()).toBe(true);
|
|
38
|
-
});
|
|
39
|
-
it('should block absolute paths outside HOME', () => {
|
|
40
|
-
symlinkAllowedDirs(overlayHome, ['/etc', '/tmp', '/var']);
|
|
41
|
-
const entries = fs.readdirSync(overlayHome);
|
|
42
|
-
expect(entries.length).toBe(0);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
describe('Bug Fix: Cron expression validation', () => {
|
|
46
|
-
it('should reject invalid cron expressions', () => {
|
|
47
|
-
const errors = validateJob({
|
|
48
|
-
name: 'test',
|
|
49
|
-
schedule: '99 99 99 99 99',
|
|
50
|
-
agent: 'claude',
|
|
51
|
-
prompt: 'test',
|
|
52
|
-
});
|
|
53
|
-
expect(errors.some(e => e.includes('invalid cron expression'))).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
it('should accept valid cron expressions', () => {
|
|
56
|
-
const errors = validateJob({
|
|
57
|
-
name: 'test',
|
|
58
|
-
schedule: '0 9 * * 1-5',
|
|
59
|
-
agent: 'claude',
|
|
60
|
-
prompt: 'test',
|
|
61
|
-
});
|
|
62
|
-
expect(errors.some(e => e.includes('invalid cron expression'))).toBe(false);
|
|
63
|
-
});
|
|
64
|
-
it('should reject invalid agent names', () => {
|
|
65
|
-
const errors = validateJob({
|
|
66
|
-
name: 'test',
|
|
67
|
-
schedule: '0 9 * * *',
|
|
68
|
-
agent: 'fake-agent',
|
|
69
|
-
prompt: 'test',
|
|
70
|
-
});
|
|
71
|
-
expect(errors.some(e => e.includes('agent must be one of'))).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
it('should accept openclaw as a valid agent', () => {
|
|
74
|
-
const errors = validateJob({
|
|
75
|
-
name: 'test',
|
|
76
|
-
schedule: '0 9 * * *',
|
|
77
|
-
agent: 'openclaw',
|
|
78
|
-
prompt: 'test',
|
|
79
|
-
});
|
|
80
|
-
expect(errors.some(e => e.includes('agent must be one of'))).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe('Bug Fix: Timezone day resolution', () => {
|
|
84
|
-
it('should resolve {day} correctly for a timezone', () => {
|
|
85
|
-
const config = {
|
|
86
|
-
name: 'test',
|
|
87
|
-
schedule: '0 9 * * *',
|
|
88
|
-
agent: 'claude',
|
|
89
|
-
mode: 'plan',
|
|
90
|
-
effort: 'auto',
|
|
91
|
-
timeout: '30m',
|
|
92
|
-
enabled: true,
|
|
93
|
-
prompt: 'Today is {day}',
|
|
94
|
-
timezone: 'America/New_York',
|
|
95
|
-
};
|
|
96
|
-
const resolved = resolveJobPrompt(config);
|
|
97
|
-
const validDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
98
|
-
const dayFound = validDays.some(day => resolved.includes(day));
|
|
99
|
-
expect(dayFound).toBe(true);
|
|
100
|
-
});
|
|
101
|
-
it('should resolve {day} using Intl API for correct timezone', () => {
|
|
102
|
-
const config = {
|
|
103
|
-
name: 'test',
|
|
104
|
-
schedule: '0 9 * * *',
|
|
105
|
-
agent: 'claude',
|
|
106
|
-
mode: 'plan',
|
|
107
|
-
effort: 'auto',
|
|
108
|
-
timeout: '30m',
|
|
109
|
-
enabled: true,
|
|
110
|
-
prompt: '{day}',
|
|
111
|
-
timezone: 'UTC',
|
|
112
|
-
};
|
|
113
|
-
const resolved = resolveJobPrompt(config);
|
|
114
|
-
// Verify it's a valid day name (not empty or broken)
|
|
115
|
-
const validDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
116
|
-
expect(validDays).toContain(resolved);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
describe('Bug Fix: One-shot job runOnce field', () => {
|
|
120
|
-
it('parseAtTime should return runOnce: true', () => {
|
|
121
|
-
const result = parseAtTime('14:30');
|
|
122
|
-
expect(result).not.toBeNull();
|
|
123
|
-
expect(result.runOnce).toBe(true);
|
|
124
|
-
});
|
|
125
|
-
it('parseAtTime with date should return runOnce: true', () => {
|
|
126
|
-
const result = parseAtTime('2030-06-15 09:00');
|
|
127
|
-
expect(result).not.toBeNull();
|
|
128
|
-
expect(result.runOnce).toBe(true);
|
|
129
|
-
});
|
|
130
|
-
it('runOnce should survive write/read cycle', () => {
|
|
131
|
-
const testJobName = '__test-runonce-bugfix__';
|
|
132
|
-
try {
|
|
133
|
-
writeJob({
|
|
134
|
-
name: testJobName,
|
|
135
|
-
schedule: '30 14 25 3 *',
|
|
136
|
-
agent: 'claude',
|
|
137
|
-
mode: 'plan',
|
|
138
|
-
effort: 'auto',
|
|
139
|
-
timeout: '30m',
|
|
140
|
-
enabled: true,
|
|
141
|
-
prompt: 'test',
|
|
142
|
-
runOnce: true,
|
|
143
|
-
});
|
|
144
|
-
const read = readJob(testJobName);
|
|
145
|
-
expect(read).not.toBeNull();
|
|
146
|
-
expect(read.runOnce).toBe(true);
|
|
147
|
-
}
|
|
148
|
-
finally {
|
|
149
|
-
deleteJob(testJobName);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
describe('Bug Fix: Plugin orphan cleanup', () => {
|
|
154
|
-
let tempDir;
|
|
155
|
-
beforeEach(() => {
|
|
156
|
-
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'plugin-orphan-test-'));
|
|
157
|
-
});
|
|
158
|
-
afterEach(() => {
|
|
159
|
-
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
160
|
-
});
|
|
161
|
-
it('should remove orphaned plugin skill dirs', () => {
|
|
162
|
-
// Create a fake version home with plugin skills
|
|
163
|
-
const skillsDir = path.join(tempDir, '.claude', 'skills');
|
|
164
|
-
fs.mkdirSync(skillsDir, { recursive: true });
|
|
165
|
-
// Active plugin skill
|
|
166
|
-
fs.mkdirSync(path.join(skillsDir, 'active-plugin--skill1'));
|
|
167
|
-
fs.writeFileSync(path.join(skillsDir, 'active-plugin--skill1', 'SKILL.md'), 'test');
|
|
168
|
-
// Orphaned plugin skill (plugin no longer exists)
|
|
169
|
-
fs.mkdirSync(path.join(skillsDir, 'deleted-plugin--skill1'));
|
|
170
|
-
fs.writeFileSync(path.join(skillsDir, 'deleted-plugin--skill1', 'SKILL.md'), 'test');
|
|
171
|
-
// Regular skill (not a plugin)
|
|
172
|
-
fs.mkdirSync(path.join(skillsDir, 'regular-skill'));
|
|
173
|
-
fs.writeFileSync(path.join(skillsDir, 'regular-skill', 'SKILL.md'), 'test');
|
|
174
|
-
const activePlugins = new Set(['active-plugin']);
|
|
175
|
-
const removed = cleanOrphanedPluginSkills('claude', tempDir, activePlugins);
|
|
176
|
-
// Should remove deleted-plugin--skill1 but keep others
|
|
177
|
-
expect(removed).toEqual(['deleted-plugin--skill1']);
|
|
178
|
-
expect(fs.existsSync(path.join(skillsDir, 'active-plugin--skill1'))).toBe(true);
|
|
179
|
-
expect(fs.existsSync(path.join(skillsDir, 'deleted-plugin--skill1'))).toBe(false);
|
|
180
|
-
expect(fs.existsSync(path.join(skillsDir, 'regular-skill'))).toBe(true);
|
|
181
|
-
});
|
|
182
|
-
it('should not touch non-plugin dirs (no -- separator)', () => {
|
|
183
|
-
const skillsDir = path.join(tempDir, '.claude', 'skills');
|
|
184
|
-
fs.mkdirSync(skillsDir, { recursive: true });
|
|
185
|
-
fs.mkdirSync(path.join(skillsDir, 'my-normal-skill'));
|
|
186
|
-
fs.writeFileSync(path.join(skillsDir, 'my-normal-skill', 'SKILL.md'), 'test');
|
|
187
|
-
const removed = cleanOrphanedPluginSkills('claude', tempDir, new Set());
|
|
188
|
-
expect(removed).toEqual([]);
|
|
189
|
-
expect(fs.existsSync(path.join(skillsDir, 'my-normal-skill'))).toBe(true);
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
//# sourceMappingURL=bugfixes.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bugfixes.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/bugfixes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,6DAA6D;QAC7D,kBAAkB,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAEpD,sDAAsD;QACtD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,kBAAkB,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;QAEhD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,wBAAwB;QAE9D,kBAAkB,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAE/C,oCAAoC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,kBAAkB,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,aAAa;YACvB,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,YAAmB;YAC1B,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC;YACzB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,QAAiB;YACxB,IAAI,EAAE,MAAe;YACrB,MAAM,EAAE,MAAe;YACvB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gBAAgB;YACxB,QAAQ,EAAE,kBAAkB;SAC7B,CAAC;QAEF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjG,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,QAAiB;YACxB,IAAI,EAAE,MAAe;YACrB,MAAM,EAAE,MAAe;YACvB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC1C,qDAAqD;QACrD,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjG,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,WAAW,GAAG,yBAAyB,CAAC;QAC9C,IAAI,CAAC;YACH,QAAQ,CAAC;gBACP,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,cAAc;gBACxB,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,WAAW,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,gDAAgD;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC1D,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,sBAAsB;QACtB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAEpF,kDAAkD;QAClD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC,CAAC;QAC7D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAErF,+BAA+B;QAC/B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;QACpD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAE5E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAE5E,uDAAuD;QACvD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClF,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC1D,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACtD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAE9E,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAExE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exec.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/exec.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,446 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { buildExecCommand, buildExecEnv, buildFallbackPrompt, detectRateLimit, AGENT_COMMANDS, parseExecEnv, } from '../exec.js';
|
|
3
|
-
function opts(overrides) {
|
|
4
|
-
return {
|
|
5
|
-
agent: 'claude',
|
|
6
|
-
prompt: 'do the thing',
|
|
7
|
-
mode: 'plan',
|
|
8
|
-
effort: 'auto',
|
|
9
|
-
...overrides,
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
const ALL_AGENTS = Object.keys(AGENT_COMMANDS);
|
|
13
|
-
const ALL_MODES = ['plan', 'edit', 'full'];
|
|
14
|
-
describe('buildExecCommand', () => {
|
|
15
|
-
// --- Mode flags per agent ---
|
|
16
|
-
describe('mode flags', () => {
|
|
17
|
-
it('claude plan produces --permission-mode plan', () => {
|
|
18
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', mode: 'plan' }));
|
|
19
|
-
expect(cmd).toContain('--permission-mode');
|
|
20
|
-
expect(cmd[cmd.indexOf('--permission-mode') + 1]).toBe('plan');
|
|
21
|
-
});
|
|
22
|
-
it('claude edit produces --permission-mode acceptEdits', () => {
|
|
23
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', mode: 'edit' }));
|
|
24
|
-
expect(cmd).toContain('--permission-mode');
|
|
25
|
-
expect(cmd[cmd.indexOf('--permission-mode') + 1]).toBe('acceptEdits');
|
|
26
|
-
});
|
|
27
|
-
it('claude full produces --dangerously-skip-permissions', () => {
|
|
28
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', mode: 'full' }));
|
|
29
|
-
expect(cmd).toContain('--dangerously-skip-permissions');
|
|
30
|
-
expect(cmd).not.toContain('--permission-mode');
|
|
31
|
-
});
|
|
32
|
-
it('codex plan produces --sandbox workspace-write', () => {
|
|
33
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', mode: 'plan' }));
|
|
34
|
-
expect(cmd).toContain('--sandbox');
|
|
35
|
-
expect(cmd[cmd.indexOf('--sandbox') + 1]).toBe('workspace-write');
|
|
36
|
-
expect(cmd).not.toContain('--full-auto');
|
|
37
|
-
});
|
|
38
|
-
it('codex edit produces --sandbox workspace-write --full-auto', () => {
|
|
39
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', mode: 'edit' }));
|
|
40
|
-
expect(cmd).toContain('--sandbox');
|
|
41
|
-
expect(cmd).toContain('--full-auto');
|
|
42
|
-
});
|
|
43
|
-
it('codex full produces --full-auto without --sandbox', () => {
|
|
44
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', mode: 'full' }));
|
|
45
|
-
expect(cmd).toContain('--full-auto');
|
|
46
|
-
expect(cmd).not.toContain('--sandbox');
|
|
47
|
-
});
|
|
48
|
-
it('gemini plan has no mode flags', () => {
|
|
49
|
-
const cmd = buildExecCommand(opts({ agent: 'gemini', mode: 'plan' }));
|
|
50
|
-
expect(cmd).not.toContain('--yolo');
|
|
51
|
-
});
|
|
52
|
-
it('gemini edit produces --yolo', () => {
|
|
53
|
-
const cmd = buildExecCommand(opts({ agent: 'gemini', mode: 'edit' }));
|
|
54
|
-
expect(cmd).toContain('--yolo');
|
|
55
|
-
});
|
|
56
|
-
it('gemini full produces --yolo', () => {
|
|
57
|
-
const cmd = buildExecCommand(opts({ agent: 'gemini', mode: 'full' }));
|
|
58
|
-
expect(cmd).toContain('--yolo');
|
|
59
|
-
});
|
|
60
|
-
it('cursor plan has no mode flags', () => {
|
|
61
|
-
const cmd = buildExecCommand(opts({ agent: 'cursor', mode: 'plan' }));
|
|
62
|
-
expect(cmd).not.toContain('-f');
|
|
63
|
-
});
|
|
64
|
-
it('cursor edit produces -f', () => {
|
|
65
|
-
const cmd = buildExecCommand(opts({ agent: 'cursor', mode: 'edit' }));
|
|
66
|
-
expect(cmd).toContain('-f');
|
|
67
|
-
});
|
|
68
|
-
it('cursor full produces -f', () => {
|
|
69
|
-
const cmd = buildExecCommand(opts({ agent: 'cursor', mode: 'full' }));
|
|
70
|
-
expect(cmd).toContain('-f');
|
|
71
|
-
});
|
|
72
|
-
it('opencode plan produces --agent plan', () => {
|
|
73
|
-
const cmd = buildExecCommand(opts({ agent: 'opencode', mode: 'plan' }));
|
|
74
|
-
expect(cmd).toContain('--agent');
|
|
75
|
-
expect(cmd[cmd.indexOf('--agent') + 1]).toBe('plan');
|
|
76
|
-
});
|
|
77
|
-
it('opencode edit produces --agent build', () => {
|
|
78
|
-
const cmd = buildExecCommand(opts({ agent: 'opencode', mode: 'edit' }));
|
|
79
|
-
expect(cmd[cmd.indexOf('--agent') + 1]).toBe('build');
|
|
80
|
-
});
|
|
81
|
-
it('opencode full produces --agent build', () => {
|
|
82
|
-
const cmd = buildExecCommand(opts({ agent: 'opencode', mode: 'full' }));
|
|
83
|
-
expect(cmd[cmd.indexOf('--agent') + 1]).toBe('build');
|
|
84
|
-
});
|
|
85
|
-
it('openclaw plan produces --mode plan', () => {
|
|
86
|
-
const cmd = buildExecCommand(opts({ agent: 'openclaw', mode: 'plan' }));
|
|
87
|
-
expect(cmd).toContain('--mode');
|
|
88
|
-
expect(cmd[cmd.indexOf('--mode') + 1]).toBe('plan');
|
|
89
|
-
});
|
|
90
|
-
it('openclaw edit produces --mode edit', () => {
|
|
91
|
-
const cmd = buildExecCommand(opts({ agent: 'openclaw', mode: 'edit' }));
|
|
92
|
-
expect(cmd[cmd.indexOf('--mode') + 1]).toBe('edit');
|
|
93
|
-
});
|
|
94
|
-
it('openclaw full produces --mode full', () => {
|
|
95
|
-
const cmd = buildExecCommand(opts({ agent: 'openclaw', mode: 'full' }));
|
|
96
|
-
expect(cmd[cmd.indexOf('--mode') + 1]).toBe('full');
|
|
97
|
-
});
|
|
98
|
-
it('every agent has all three mode entries', () => {
|
|
99
|
-
for (const agent of ALL_AGENTS) {
|
|
100
|
-
const template = AGENT_COMMANDS[agent];
|
|
101
|
-
for (const mode of ALL_MODES) {
|
|
102
|
-
expect(template.modeFlags[mode]).toBeDefined();
|
|
103
|
-
expect(Array.isArray(template.modeFlags[mode])).toBe(true);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
// --- Print / headless ---
|
|
109
|
-
describe('print/headless flags', () => {
|
|
110
|
-
it('claude headless adds --print', () => {
|
|
111
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', headless: true }));
|
|
112
|
-
expect(cmd).toContain('--print');
|
|
113
|
-
});
|
|
114
|
-
it('claude headless=false omits --print', () => {
|
|
115
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', headless: false }));
|
|
116
|
-
expect(cmd).not.toContain('--print');
|
|
117
|
-
});
|
|
118
|
-
it('codex headless adds nothing (no printFlags)', () => {
|
|
119
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', headless: true }));
|
|
120
|
-
expect(cmd).not.toContain('--print');
|
|
121
|
-
});
|
|
122
|
-
it('gemini headless adds nothing', () => {
|
|
123
|
-
const cmd = buildExecCommand(opts({ agent: 'gemini', headless: true }));
|
|
124
|
-
expect(cmd).not.toContain('--print');
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
// --- Session ID ---
|
|
128
|
-
describe('session ID', () => {
|
|
129
|
-
it('claude with sessionId adds --session-id', () => {
|
|
130
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', sessionId: 'abc-123' }));
|
|
131
|
-
const idx = cmd.indexOf('--session-id');
|
|
132
|
-
expect(idx).toBeGreaterThan(-1);
|
|
133
|
-
expect(cmd[idx + 1]).toBe('abc-123');
|
|
134
|
-
});
|
|
135
|
-
it('codex ignores sessionId', () => {
|
|
136
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', sessionId: 'abc-123' }));
|
|
137
|
-
expect(cmd).not.toContain('--session-id');
|
|
138
|
-
});
|
|
139
|
-
it('gemini ignores sessionId', () => {
|
|
140
|
-
const cmd = buildExecCommand(opts({ agent: 'gemini', sessionId: 'abc-123' }));
|
|
141
|
-
expect(cmd).not.toContain('--session-id');
|
|
142
|
-
});
|
|
143
|
-
it('omits --session-id when not provided', () => {
|
|
144
|
-
const cmd = buildExecCommand(opts({ agent: 'claude' }));
|
|
145
|
-
expect(cmd).not.toContain('--session-id');
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
// --- Verbose ---
|
|
149
|
-
describe('verbose flag', () => {
|
|
150
|
-
it('claude verbose adds --verbose', () => {
|
|
151
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', verbose: true }));
|
|
152
|
-
expect(cmd).toContain('--verbose');
|
|
153
|
-
});
|
|
154
|
-
it('claude verbose + json does not duplicate --verbose', () => {
|
|
155
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', verbose: true, json: true }));
|
|
156
|
-
const count = cmd.filter((f) => f === '--verbose').length;
|
|
157
|
-
expect(count).toBe(1);
|
|
158
|
-
});
|
|
159
|
-
it('codex verbose adds nothing (no verboseFlag)', () => {
|
|
160
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', verbose: true }));
|
|
161
|
-
expect(cmd).not.toContain('--verbose');
|
|
162
|
-
});
|
|
163
|
-
it('claude json without verbose still includes --verbose from jsonFlags', () => {
|
|
164
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', json: true, verbose: false }));
|
|
165
|
-
expect(cmd).toContain('--verbose');
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
// --- JSON flags ---
|
|
169
|
-
describe('JSON flags', () => {
|
|
170
|
-
it('claude json adds --output-format stream-json --verbose', () => {
|
|
171
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', json: true }));
|
|
172
|
-
expect(cmd).toContain('--output-format');
|
|
173
|
-
expect(cmd).toContain('stream-json');
|
|
174
|
-
expect(cmd).toContain('--verbose');
|
|
175
|
-
});
|
|
176
|
-
it('codex json adds --json', () => {
|
|
177
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', json: true }));
|
|
178
|
-
expect(cmd).toContain('--json');
|
|
179
|
-
});
|
|
180
|
-
it('json=false adds no json flags', () => {
|
|
181
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', json: false }));
|
|
182
|
-
expect(cmd).not.toContain('--output-format');
|
|
183
|
-
expect(cmd).not.toContain('stream-json');
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
// --- Model selection ---
|
|
187
|
-
describe('model selection', () => {
|
|
188
|
-
it('explicit model is forwarded via --model', () => {
|
|
189
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', model: 'custom-model' }));
|
|
190
|
-
expect(cmd).toContain('--model');
|
|
191
|
-
expect(cmd[cmd.indexOf('--model') + 1]).toBe('custom-model');
|
|
192
|
-
});
|
|
193
|
-
it('no --model flag when model is not provided (agent uses its default)', () => {
|
|
194
|
-
const cmd = buildExecCommand(opts({ agent: 'claude' }));
|
|
195
|
-
expect(cmd).not.toContain('--model');
|
|
196
|
-
});
|
|
197
|
-
it('no --model flag for codex without explicit model', () => {
|
|
198
|
-
const cmd = buildExecCommand(opts({ agent: 'codex' }));
|
|
199
|
-
expect(cmd).not.toContain('--model');
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
// --- Reasoning effort flags ---
|
|
203
|
-
describe('reasoning effort', () => {
|
|
204
|
-
it('claude effort=high adds --effort high', () => {
|
|
205
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', effort: 'high' }));
|
|
206
|
-
const idx = cmd.indexOf('--effort');
|
|
207
|
-
expect(idx).toBeGreaterThan(-1);
|
|
208
|
-
expect(cmd[idx + 1]).toBe('high');
|
|
209
|
-
});
|
|
210
|
-
it('claude effort=auto omits reasoning flags (agent uses its default)', () => {
|
|
211
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', effort: 'auto' }));
|
|
212
|
-
expect(cmd).not.toContain('--effort');
|
|
213
|
-
});
|
|
214
|
-
it('codex effort=medium injects -c model_reasoning_effort=medium before exec', () => {
|
|
215
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', effort: 'medium' }));
|
|
216
|
-
const cIdx = cmd.indexOf('-c');
|
|
217
|
-
const execIdx = cmd.indexOf('exec');
|
|
218
|
-
expect(cIdx).toBeGreaterThan(-1);
|
|
219
|
-
expect(execIdx).toBeGreaterThan(cIdx);
|
|
220
|
-
expect(cmd[cIdx + 1]).toBe('model_reasoning_effort=medium');
|
|
221
|
-
});
|
|
222
|
-
it('codex effort=xhigh clamps to high', () => {
|
|
223
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', effort: 'xhigh' }));
|
|
224
|
-
const cIdx = cmd.indexOf('-c');
|
|
225
|
-
expect(cmd[cIdx + 1]).toBe('model_reasoning_effort=high');
|
|
226
|
-
});
|
|
227
|
-
it('codex effort=auto omits reasoning flags', () => {
|
|
228
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', effort: 'auto' }));
|
|
229
|
-
expect(cmd).not.toContain('-c');
|
|
230
|
-
});
|
|
231
|
-
it('gemini ignores effort (no reasoning flags)', () => {
|
|
232
|
-
const cmd = buildExecCommand(opts({ agent: 'gemini', effort: 'high' }));
|
|
233
|
-
expect(cmd).not.toContain('--effort');
|
|
234
|
-
expect(cmd).not.toContain('-c');
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
// --- Prompt positioning ---
|
|
238
|
-
describe('prompt positioning', () => {
|
|
239
|
-
it('claude uses -p flag for prompt', () => {
|
|
240
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', prompt: 'hello world' }));
|
|
241
|
-
const idx = cmd.indexOf('-p');
|
|
242
|
-
expect(idx).toBeGreaterThan(-1);
|
|
243
|
-
expect(cmd[idx + 1]).toBe('hello world');
|
|
244
|
-
});
|
|
245
|
-
it('codex uses positional prompt', () => {
|
|
246
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', prompt: 'hello world' }));
|
|
247
|
-
expect(cmd).not.toContain('-p');
|
|
248
|
-
expect(cmd).toContain('hello world');
|
|
249
|
-
});
|
|
250
|
-
it('gemini uses positional prompt', () => {
|
|
251
|
-
const cmd = buildExecCommand(opts({ agent: 'gemini', prompt: 'hello world' }));
|
|
252
|
-
expect(cmd).not.toContain('-p');
|
|
253
|
-
expect(cmd).toContain('hello world');
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
// --- Add dirs ---
|
|
257
|
-
describe('add dirs', () => {
|
|
258
|
-
it('claude addDirs adds --add-dir for each directory', () => {
|
|
259
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', addDirs: ['/a', '/b'] }));
|
|
260
|
-
const indices = cmd.reduce((acc, v, i) => (v === '--add-dir' ? [...acc, i] : acc), []);
|
|
261
|
-
expect(indices).toHaveLength(2);
|
|
262
|
-
expect(cmd[indices[0] + 1]).toBe('/a');
|
|
263
|
-
expect(cmd[indices[1] + 1]).toBe('/b');
|
|
264
|
-
});
|
|
265
|
-
it('codex ignores addDirs', () => {
|
|
266
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', addDirs: ['/a'] }));
|
|
267
|
-
expect(cmd).not.toContain('--add-dir');
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
describe('exec env', () => {
|
|
271
|
-
it('parses repeated KEY=VALUE entries', () => {
|
|
272
|
-
expect(parseExecEnv(['ANTHROPIC_BASE_URL=https://ollama.example.com', 'ANTHROPIC_MODEL=qwen3.6:35b'])).toEqual({
|
|
273
|
-
ANTHROPIC_BASE_URL: 'https://ollama.example.com',
|
|
274
|
-
ANTHROPIC_MODEL: 'qwen3.6:35b',
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
it('preserves equals signs in values', () => {
|
|
278
|
-
expect(parseExecEnv(['AUTH_HEADER=Bearer abc=123'])).toEqual({
|
|
279
|
-
AUTH_HEADER: 'Bearer abc=123',
|
|
280
|
-
});
|
|
281
|
-
});
|
|
282
|
-
it('rejects malformed entries', () => {
|
|
283
|
-
expect(() => parseExecEnv(['NOT_VALID'])).toThrow('Invalid --env value "NOT_VALID". Use KEY=VALUE.');
|
|
284
|
-
});
|
|
285
|
-
it('merges explicit env over process env', () => {
|
|
286
|
-
const previous = process.env.ANTHROPIC_MODEL;
|
|
287
|
-
process.env.ANTHROPIC_MODEL = 'claude-sonnet-4-5';
|
|
288
|
-
try {
|
|
289
|
-
const env = buildExecEnv(opts({ env: { ANTHROPIC_MODEL: 'qwen3.6:35b', ANTHROPIC_BASE_URL: 'https://ollama.example.com' } }));
|
|
290
|
-
expect(env.ANTHROPIC_MODEL).toBe('qwen3.6:35b');
|
|
291
|
-
expect(env.ANTHROPIC_BASE_URL).toBe('https://ollama.example.com');
|
|
292
|
-
}
|
|
293
|
-
finally {
|
|
294
|
-
if (previous === undefined) {
|
|
295
|
-
delete process.env.ANTHROPIC_MODEL;
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
process.env.ANTHROPIC_MODEL = previous;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
it('injects Claude config dir for pinned Claude versions', () => {
|
|
303
|
-
const env = buildExecEnv(opts({ agent: 'claude', version: '2.1.98' }));
|
|
304
|
-
expect(env.CLAUDE_CONFIG_DIR).toBe(`${process.env.HOME}/.agents/versions/claude/2.1.98/home/.claude`);
|
|
305
|
-
});
|
|
306
|
-
it('lets explicit env override injected Claude config dir', () => {
|
|
307
|
-
const env = buildExecEnv(opts({
|
|
308
|
-
agent: 'claude',
|
|
309
|
-
version: '2.1.98',
|
|
310
|
-
env: { CLAUDE_CONFIG_DIR: '/tmp/custom-claude-config' },
|
|
311
|
-
}));
|
|
312
|
-
expect(env.CLAUDE_CONFIG_DIR).toBe('/tmp/custom-claude-config');
|
|
313
|
-
});
|
|
314
|
-
it('does not inject Claude config dir for non-Claude agents', () => {
|
|
315
|
-
const env = buildExecEnv(opts({ agent: 'codex', version: '0.98.0' }));
|
|
316
|
-
expect(env.CLAUDE_CONFIG_DIR).toBeUndefined();
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
// --- Version pinning ---
|
|
320
|
-
describe('version pinning', () => {
|
|
321
|
-
it('appends @version to base command when version is set', () => {
|
|
322
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', version: '2.1.98', mode: 'full' }));
|
|
323
|
-
expect(cmd[0]).toBe('claude@2.1.98');
|
|
324
|
-
});
|
|
325
|
-
it('does not append @version when version is undefined', () => {
|
|
326
|
-
const cmd = buildExecCommand(opts({ agent: 'claude', mode: 'full' }));
|
|
327
|
-
expect(cmd[0]).toBe('claude');
|
|
328
|
-
});
|
|
329
|
-
it('works for codex with version', () => {
|
|
330
|
-
const cmd = buildExecCommand(opts({ agent: 'codex', version: '0.98.0', mode: 'full' }));
|
|
331
|
-
expect(cmd[0]).toBe('codex@0.98.0');
|
|
332
|
-
expect(cmd[1]).toBe('exec');
|
|
333
|
-
});
|
|
334
|
-
});
|
|
335
|
-
// --- Snapshot: agent-runner.sh patterns ---
|
|
336
|
-
describe('agent-runner.sh compatibility', () => {
|
|
337
|
-
it('produces claude command matching agent-runner pattern', () => {
|
|
338
|
-
const cmd = buildExecCommand(opts({
|
|
339
|
-
agent: 'claude',
|
|
340
|
-
mode: 'full',
|
|
341
|
-
headless: true,
|
|
342
|
-
sessionId: 'sess-123',
|
|
343
|
-
verbose: true,
|
|
344
|
-
prompt: 'fix the bug',
|
|
345
|
-
}));
|
|
346
|
-
expect(cmd).toEqual([
|
|
347
|
-
'claude',
|
|
348
|
-
'--dangerously-skip-permissions',
|
|
349
|
-
'--print',
|
|
350
|
-
'--session-id', 'sess-123',
|
|
351
|
-
'--verbose',
|
|
352
|
-
'-p', 'fix the bug',
|
|
353
|
-
]);
|
|
354
|
-
});
|
|
355
|
-
it('produces codex command matching agent-runner pattern', () => {
|
|
356
|
-
const cmd = buildExecCommand(opts({
|
|
357
|
-
agent: 'codex',
|
|
358
|
-
mode: 'full',
|
|
359
|
-
prompt: 'fix the bug',
|
|
360
|
-
}));
|
|
361
|
-
expect(cmd).toEqual([
|
|
362
|
-
'codex', 'exec',
|
|
363
|
-
'--full-auto',
|
|
364
|
-
'fix the bug',
|
|
365
|
-
]);
|
|
366
|
-
});
|
|
367
|
-
it('claude with effort=high emits --effort high', () => {
|
|
368
|
-
const cmd = buildExecCommand(opts({
|
|
369
|
-
agent: 'claude',
|
|
370
|
-
mode: 'full',
|
|
371
|
-
effort: 'high',
|
|
372
|
-
prompt: 'fix the bug',
|
|
373
|
-
}));
|
|
374
|
-
expect(cmd).toEqual([
|
|
375
|
-
'claude',
|
|
376
|
-
'--effort', 'high',
|
|
377
|
-
'--dangerously-skip-permissions',
|
|
378
|
-
'-p', 'fix the bug',
|
|
379
|
-
]);
|
|
380
|
-
});
|
|
381
|
-
it('codex with effort=medium emits -c model_reasoning_effort=medium before exec', () => {
|
|
382
|
-
const cmd = buildExecCommand(opts({
|
|
383
|
-
agent: 'codex',
|
|
384
|
-
mode: 'full',
|
|
385
|
-
effort: 'medium',
|
|
386
|
-
prompt: 'fix the bug',
|
|
387
|
-
}));
|
|
388
|
-
expect(cmd).toEqual([
|
|
389
|
-
'codex',
|
|
390
|
-
'-c', 'model_reasoning_effort=medium',
|
|
391
|
-
'exec',
|
|
392
|
-
'--full-auto',
|
|
393
|
-
'fix the bug',
|
|
394
|
-
]);
|
|
395
|
-
});
|
|
396
|
-
});
|
|
397
|
-
});
|
|
398
|
-
describe('detectRateLimit', () => {
|
|
399
|
-
it.each([
|
|
400
|
-
['Anthropic 5-hour limit', 'Your 5-hour limit has been reached. Resets in 2h.'],
|
|
401
|
-
['generic rate-limit phrasing', 'Error: rate limit exceeded for claude-opus'],
|
|
402
|
-
['hyphenated rate-limit phrasing', 'rate-limit hit'],
|
|
403
|
-
['HTTP 429 code in error body', 'Request failed with status 429'],
|
|
404
|
-
['Google quota exceeded', 'RESOURCE_EXHAUSTED: quota exceeded for requests'],
|
|
405
|
-
['OpenAI usage limit', 'You have exceeded your usage limit for this month'],
|
|
406
|
-
['429 too many requests', '429: Too Many Requests'],
|
|
407
|
-
['Anthropic overloaded', 'API Error: Overloaded'],
|
|
408
|
-
['api_overloaded snake case', 'error_type: api_overloaded'],
|
|
409
|
-
])('matches %s', (_label, text) => {
|
|
410
|
-
expect(detectRateLimit(text)).toBe(true);
|
|
411
|
-
});
|
|
412
|
-
it.each([
|
|
413
|
-
['normal success output', 'Task completed successfully.'],
|
|
414
|
-
['unrelated error', 'TypeError: Cannot read property foo of undefined'],
|
|
415
|
-
['auth error', 'Authentication failed: invalid API key'],
|
|
416
|
-
['file not found', 'ENOENT: no such file or directory'],
|
|
417
|
-
['empty stderr', ''],
|
|
418
|
-
])('does not match %s', (_label, text) => {
|
|
419
|
-
expect(detectRateLimit(text)).toBe(false);
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
describe('buildFallbackPrompt', () => {
|
|
423
|
-
const uuid = 'f47ac10b-58cc-4372-a567-0e02b2c3d479';
|
|
424
|
-
it('returns /continue <id> when next agent is Claude and we have a session ID', () => {
|
|
425
|
-
expect(buildFallbackPrompt('claude', uuid, 'claude', 'original task')).toBe(`/continue ${uuid}`);
|
|
426
|
-
});
|
|
427
|
-
it('uses plain-text handoff for non-Claude next agent even with session ID', () => {
|
|
428
|
-
const prompt = buildFallbackPrompt('claude', uuid, 'codex', 'refactor auth');
|
|
429
|
-
expect(prompt).toContain('previous claude session was interrupted by a rate limit');
|
|
430
|
-
expect(prompt).toContain(`agents sessions ${uuid}`);
|
|
431
|
-
expect(prompt).toContain('Original request: refactor auth');
|
|
432
|
-
});
|
|
433
|
-
it('falls back to context note without session reference when no session ID is known', () => {
|
|
434
|
-
const prompt = buildFallbackPrompt('codex', undefined, 'gemini', 'write tests');
|
|
435
|
-
expect(prompt).toContain('previous codex session was interrupted by a rate limit');
|
|
436
|
-
expect(prompt).not.toContain('agents sessions');
|
|
437
|
-
expect(prompt).toContain('Original request: write tests');
|
|
438
|
-
});
|
|
439
|
-
it('/continue branch requires a session ID (not just Claude as next)', () => {
|
|
440
|
-
// No session ID + Claude-as-next must fall through to the plain-text form.
|
|
441
|
-
const prompt = buildFallbackPrompt('codex', undefined, 'claude', 'deploy');
|
|
442
|
-
expect(prompt).not.toMatch(/^\/continue/);
|
|
443
|
-
expect(prompt).toContain('Original request: deploy');
|
|
444
|
-
});
|
|
445
|
-
});
|
|
446
|
-
//# sourceMappingURL=exec.test.js.map
|