@selesai/code 0.5.19 → 0.5.21
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/dist/extensions/handoff-new.test.ts +8 -9
- package/dist/extensions/handoff-new.ts +6 -8
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +31 -0
- package/dist/extensions/pi-intercom/broker/spawn.ts +5 -3
- package/dist/extensions/pi-subagents/CHANGELOG.md +1367 -0
- package/dist/extensions/pi-subagents/README.md +602 -220
- package/dist/extensions/pi-subagents/banner.png +0 -0
- package/dist/extensions/pi-subagents/index.ts +1 -0
- package/dist/extensions/pi-subagents/install.mjs +3 -3
- package/dist/extensions/pi-subagents/package-lock.json +3405 -0
- package/dist/extensions/pi-subagents/package.json +26 -14
- package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
- package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
- package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +3 -3
- package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +7 -7
- package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
- package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
- package/dist/extensions/pi-subagents/prompts/review-loop.md +13 -11
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +267 -176
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +89 -16
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +19 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +218 -120
- package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +67 -13
- package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
- package/dist/extensions/pi-subagents/src/agents/skills.ts +25 -12
- package/dist/extensions/pi-subagents/src/api/background-work.ts +197 -0
- package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +17 -0
- package/dist/extensions/pi-subagents/src/api/delegation.ts +285 -0
- package/dist/extensions/pi-subagents/src/api/preflight.ts +399 -0
- package/dist/extensions/pi-subagents/src/extension/chain-validation.ts +165 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +7 -1
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +15 -0
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +3 -1
- package/dist/extensions/pi-subagents/src/extension/index.ts +113 -157
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +41 -4
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +45 -15
- package/dist/extensions/pi-subagents/src/extension/steering-notices.ts +35 -0
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +28 -15
- package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +4 -3
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +225 -29
- package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +11 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -10
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +452 -62
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +60 -9
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +198 -52
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +119 -21
- package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +67 -0
- package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +2 -0
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +16 -8
- package/dist/extensions/pi-subagents/src/runs/background/completion-batcher.ts +6 -4
- package/dist/extensions/pi-subagents/src/runs/background/completion-dedupe.ts +2 -11
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +260 -13
- package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +32 -6
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +171 -90
- package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +280 -0
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +149 -88
- package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +14 -2
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +33 -17
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +9 -1
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +38 -10
- package/dist/extensions/pi-subagents/src/runs/background/steering.ts +237 -0
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +1297 -307
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +610 -0
- package/dist/extensions/pi-subagents/src/runs/background/top-level-async.ts +2 -1
- package/dist/extensions/pi-subagents/src/runs/background/wait-config.ts +36 -0
- package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +26 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +230 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +22 -6
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +228 -140
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +452 -138
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +90 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1001 -416
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +443 -132
- package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +38 -0
- package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +178 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +121 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +41 -93
- package/dist/extensions/pi-subagents/src/runs/shared/context-mode.ts +44 -0
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +11 -9
- package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +4 -0
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +12 -6
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +36 -0
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +44 -7
- package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +4 -1
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +154 -0
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +18 -0
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +174 -54
- package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +38 -31
- package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +90 -5
- package/dist/extensions/pi-subagents/src/runs/shared/session-lease.ts +299 -0
- package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +61 -6
- package/dist/extensions/pi-subagents/src/runs/shared/spawn-budget.ts +128 -0
- package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +112 -7
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +14 -6
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +149 -36
- package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +181 -0
- package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +83 -0
- package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +11 -5
- package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +50 -4
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +63 -14
- package/dist/extensions/pi-subagents/src/shared/accessible-dir.ts +25 -0
- package/dist/extensions/pi-subagents/src/shared/artifacts.ts +37 -7
- package/dist/extensions/pi-subagents/src/shared/atomic-json.ts +18 -43
- package/dist/extensions/pi-subagents/src/shared/child-transcript.ts +52 -0
- package/dist/extensions/pi-subagents/src/shared/env.ts +16 -0
- package/dist/extensions/pi-subagents/src/shared/file-system-retry.ts +47 -0
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +28 -3
- package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +123 -0
- package/dist/extensions/pi-subagents/src/shared/model-info.ts +8 -5
- package/dist/extensions/pi-subagents/src/shared/settings.ts +9 -1
- package/dist/extensions/pi-subagents/src/shared/status-format.ts +7 -1
- package/dist/extensions/pi-subagents/src/shared/types.ts +522 -51
- package/dist/extensions/pi-subagents/src/shared/utils.ts +59 -53
- package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +604 -0
- package/dist/extensions/pi-subagents/src/slash/delegation-json.ts +108 -0
- package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +249 -0
- package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +353 -345
- package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +2 -2
- package/dist/extensions/pi-subagents/src/slash/selector.ts +147 -0
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +265 -23
- package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +2 -2
- package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +428 -0
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +362 -0
- package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +472 -0
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +664 -0
- package/dist/extensions/pi-subagents/src/tui/render.ts +115 -31
- package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +220 -0
- package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +205 -0
- package/dist/extensions/pi-subagents/src/watchdog/emission-guard.ts +123 -0
- package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +532 -0
- package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +167 -0
- package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +117 -0
- package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +433 -0
- package/dist/extensions/pi-subagents/src/watchdog/render.ts +54 -0
- package/dist/extensions/pi-subagents/src/watchdog/review.ts +298 -0
- package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +714 -0
- package/dist/extensions/pi-subagents/src/watchdog/settings.ts +528 -0
- package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +155 -0
- package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +161 -0
- package/dist/extensions/pi-subagents/src/watchdog/types.ts +188 -0
- package/dist/extensions/pi-subagents/src/watchdog/warning-format.ts +73 -0
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +130 -2
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +439 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1632 -61
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +54 -1
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +112 -0
- package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +98 -1
- package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +179 -9
- package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +16 -9
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +6 -5
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +589 -9
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +528 -21
- package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +227 -3
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +235 -7
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +172 -2
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1502 -18
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +993 -4
- package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +7 -1
- package/dist/extensions/pi-subagents/test/support/helpers.ts +32 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +59 -2
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +32 -6
- package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +25 -24
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +59 -35
- package/dist/extensions/pi-subagents/test/support/session-lease-child.mjs +42 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +703 -69
- package/dist/extensions/pi-subagents/test/unit/accessible-dir.test.ts +82 -0
- package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
- package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +478 -19
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +228 -7
- package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +198 -78
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +15 -1
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +102 -7
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +439 -6
- package/dist/extensions/pi-subagents/test/unit/atomic-json.test.ts +41 -1
- package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +79 -0
- package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +285 -0
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +84 -0
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +68 -0
- package/dist/extensions/pi-subagents/test/unit/chain-validation.test.ts +326 -0
- package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +82 -0
- package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +46 -4
- package/dist/extensions/pi-subagents/test/unit/completion-batcher.test.ts +3 -1
- package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +9 -17
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +175 -3
- package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +10 -5
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +126 -6
- package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +219 -0
- package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +913 -0
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +13 -2
- package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +351 -0
- package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +280 -0
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +575 -0
- package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +65 -0
- package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +94 -1
- package/dist/extensions/pi-subagents/test/unit/get-final-output.test.ts +23 -0
- package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +157 -0
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +367 -5
- package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +11 -0
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +36 -0
- package/dist/extensions/pi-subagents/test/unit/model-info.test.ts +25 -3
- package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +341 -10
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +16 -0
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +52 -0
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +168 -7
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +85 -7
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +175 -0
- package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +243 -16
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +79 -36
- package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +174 -56
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +322 -0
- package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +204 -0
- package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +20 -12
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +117 -4
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +40 -7
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +48 -1
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +21 -3
- package/dist/extensions/pi-subagents/test/unit/selector.test.ts +57 -0
- package/dist/extensions/pi-subagents/test/unit/session-lease.test.ts +326 -0
- package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +101 -2
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +111 -1
- package/dist/extensions/pi-subagents/test/unit/spawn-budget.test.ts +124 -0
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +6 -4
- package/dist/extensions/pi-subagents/test/unit/status-format.test.ts +7 -0
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +397 -0
- package/dist/extensions/pi-subagents/test/unit/steering-notices.test.ts +58 -0
- package/dist/extensions/pi-subagents/test/unit/steering.test.ts +173 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +25 -4
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +390 -25
- package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +837 -0
- package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +86 -0
- package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +15 -0
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +47 -1
- package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +56 -10
- package/dist/extensions/pi-subagents/test/unit/watchdog-change-signature.test.ts +387 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +110 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-emission-guard.test.ts +62 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +144 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-model-selection.test.ts +121 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-render.test.ts +76 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-review.test.ts +327 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +863 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +290 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +91 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-turn-delta.test.ts +130 -0
- package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +32 -4
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +5 -1
- package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +30 -0
- package/dist/extensions/question/batch.ts +39 -0
- package/dist/extensions/question/dialog-adapter.ts +23 -1
- package/dist/extensions/question/index.ts +237 -7
- package/dist/extensions/question/schemas.ts +28 -15
- package/dist/extensions/question/tests/batch.test.ts +26 -0
- package/dist/extensions/question/tests/ui-protocol.test.ts +23 -3
- package/dist/extensions/question/tui-adapter.ts +2 -3
- package/dist/extensions/question/types.ts +37 -0
- package/dist/extensions/question/ui-protocol.ts +3 -3
- package/dist/skills/batch-grill-me/SKILL.md +3 -1
- package/package.json +2 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { ensureAccessibleDir } from "../../src/shared/accessible-dir.ts";
|
|
4
|
+
|
|
5
|
+
class FakeFs {
|
|
6
|
+
mkdirCalls = 0;
|
|
7
|
+
accessCalls = 0;
|
|
8
|
+
failMkdirCodes: string[] = [];
|
|
9
|
+
failAccessCodes: string[] = [];
|
|
10
|
+
|
|
11
|
+
mkdirSync(): void {
|
|
12
|
+
this.mkdirCalls++;
|
|
13
|
+
const failureCode = this.failMkdirCodes.shift();
|
|
14
|
+
if (failureCode) {
|
|
15
|
+
const error = new Error(`mkdir failed with ${failureCode}`) as NodeJS.ErrnoException;
|
|
16
|
+
error.code = failureCode;
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
accessSync(): void {
|
|
22
|
+
this.accessCalls++;
|
|
23
|
+
const failureCode = this.failAccessCodes.shift();
|
|
24
|
+
if (failureCode) {
|
|
25
|
+
const error = new Error(`access failed with ${failureCode}`) as NodeJS.ErrnoException;
|
|
26
|
+
error.code = failureCode;
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe("ensureAccessibleDir", () => {
|
|
33
|
+
it("retries transient shared-directory mkdir failures before validating access", () => {
|
|
34
|
+
const fakeFs = new FakeFs();
|
|
35
|
+
fakeFs.failMkdirCodes = ["EPERM", "EBUSY"];
|
|
36
|
+
const waits: number[] = [];
|
|
37
|
+
|
|
38
|
+
ensureAccessibleDir("/tmp/pi-subagents-user/async-subagent-results", {
|
|
39
|
+
fs: fakeFs as any,
|
|
40
|
+
retryDirectoryErrors: true,
|
|
41
|
+
retryDelaysMs: [1, 2, 3],
|
|
42
|
+
wait: (delayMs) => waits.push(delayMs),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
assert.equal(fakeFs.mkdirCalls, 3);
|
|
46
|
+
assert.equal(fakeFs.accessCalls, 1);
|
|
47
|
+
assert.deepEqual(waits, [1, 2]);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("retries transient shared-directory access failures without recreating the directory", () => {
|
|
51
|
+
const fakeFs = new FakeFs();
|
|
52
|
+
fakeFs.failAccessCodes = ["EPERM", "EACCES"];
|
|
53
|
+
const waits: number[] = [];
|
|
54
|
+
|
|
55
|
+
ensureAccessibleDir("/tmp/pi-subagents-user/async-subagent-results", {
|
|
56
|
+
fs: fakeFs as any,
|
|
57
|
+
retryDirectoryErrors: true,
|
|
58
|
+
retryDelaysMs: [1, 2, 3],
|
|
59
|
+
wait: (delayMs) => waits.push(delayMs),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
assert.equal(fakeFs.mkdirCalls, 1);
|
|
63
|
+
assert.equal(fakeFs.accessCalls, 3);
|
|
64
|
+
assert.deepEqual(waits, [1, 2]);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("throws non-retryable access failures without retrying", () => {
|
|
68
|
+
const fakeFs = new FakeFs();
|
|
69
|
+
fakeFs.failAccessCodes = ["ENOENT"];
|
|
70
|
+
const waits: number[] = [];
|
|
71
|
+
|
|
72
|
+
assert.throws(() => ensureAccessibleDir("/tmp/pi-subagents-user/async-subagent-results", {
|
|
73
|
+
fs: fakeFs as any,
|
|
74
|
+
retryDirectoryErrors: true,
|
|
75
|
+
retryDelaysMs: [1, 2, 3],
|
|
76
|
+
wait: (delayMs) => waits.push(delayMs),
|
|
77
|
+
}), /ENOENT/);
|
|
78
|
+
assert.equal(fakeFs.mkdirCalls, 1);
|
|
79
|
+
assert.equal(fakeFs.accessCalls, 1);
|
|
80
|
+
assert.deepEqual(waits, []);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -45,15 +45,15 @@ describe("builtin agent disabling", () => {
|
|
|
45
45
|
writeJson(path.join(tempHome, ".selesai", "agent", "settings.json"), {
|
|
46
46
|
subagents: {
|
|
47
47
|
agentOverrides: {
|
|
48
|
-
|
|
48
|
+
commentator: { disabled: true },
|
|
49
49
|
},
|
|
50
50
|
},
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
-
const runtimeReviewer = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "
|
|
53
|
+
const runtimeReviewer = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "commentator");
|
|
54
54
|
assert.equal(runtimeReviewer, undefined);
|
|
55
55
|
|
|
56
|
-
const allReviewer = discoverAgentsAll(tempProject).builtin.find((agent) => agent.name === "
|
|
56
|
+
const allReviewer = discoverAgentsAll(tempProject).builtin.find((agent) => agent.name === "commentator");
|
|
57
57
|
assert.ok(allReviewer);
|
|
58
58
|
assert.equal(allReviewer.disabled, true);
|
|
59
59
|
assert.equal(allReviewer.override?.scope, "user");
|
|
@@ -64,7 +64,7 @@ describe("builtin agent disabling", () => {
|
|
|
64
64
|
writeJson(settingsPath, {
|
|
65
65
|
subagents: {
|
|
66
66
|
agentOverrides: {
|
|
67
|
-
|
|
67
|
+
commentator: { disabled: "true" },
|
|
68
68
|
},
|
|
69
69
|
},
|
|
70
70
|
});
|
|
@@ -73,7 +73,7 @@ describe("builtin agent disabling", () => {
|
|
|
73
73
|
() => discoverAgents(tempProject, "both"),
|
|
74
74
|
(error: unknown) => error instanceof Error
|
|
75
75
|
&& error.message.includes(settingsPath)
|
|
76
|
-
&& error.message.includes("
|
|
76
|
+
&& error.message.includes("commentator")
|
|
77
77
|
&& error.message.includes("disabled"),
|
|
78
78
|
);
|
|
79
79
|
});
|
|
@@ -97,16 +97,16 @@ describe("builtin agent disabling", () => {
|
|
|
97
97
|
subagents: {
|
|
98
98
|
disableBuiltins: true,
|
|
99
99
|
agentOverrides: {
|
|
100
|
-
|
|
100
|
+
commentator: { model: "openai/gpt-5.4" },
|
|
101
101
|
},
|
|
102
102
|
},
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
-
const
|
|
106
|
-
assert.ok(
|
|
107
|
-
assert.equal(
|
|
108
|
-
assert.equal(
|
|
109
|
-
assert.equal(
|
|
105
|
+
const commentator = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "commentator");
|
|
106
|
+
assert.ok(commentator);
|
|
107
|
+
assert.equal(commentator.disabled, undefined);
|
|
108
|
+
assert.equal(commentator.model, "openai/gpt-5.4");
|
|
109
|
+
assert.equal(commentator.override?.scope, "user");
|
|
110
110
|
});
|
|
111
111
|
|
|
112
112
|
it("project disableBuiltins false re-enables builtins hidden by user bulk disable", () => {
|
|
@@ -127,7 +127,7 @@ describe("builtin agent disabling", () => {
|
|
|
127
127
|
subagents: {
|
|
128
128
|
disableBuiltins: true,
|
|
129
129
|
agentOverrides: {
|
|
130
|
-
|
|
130
|
+
commentator: { disabled: false, model: "openai/gpt-5.4" },
|
|
131
131
|
},
|
|
132
132
|
},
|
|
133
133
|
});
|
|
@@ -135,10 +135,10 @@ describe("builtin agent disabling", () => {
|
|
|
135
135
|
subagents: { disableBuiltins: true },
|
|
136
136
|
});
|
|
137
137
|
|
|
138
|
-
const
|
|
139
|
-
assert.equal(
|
|
138
|
+
const commentator = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "commentator");
|
|
139
|
+
assert.equal(commentator, undefined);
|
|
140
140
|
|
|
141
|
-
const allReviewer = discoverAgentsAll(tempProject).builtin.find((agent) => agent.name === "
|
|
141
|
+
const allReviewer = discoverAgentsAll(tempProject).builtin.find((agent) => agent.name === "commentator");
|
|
142
142
|
assert.ok(allReviewer);
|
|
143
143
|
assert.equal(allReviewer.disabled, true);
|
|
144
144
|
assert.equal(allReviewer.override?.scope, "project");
|
|
@@ -74,18 +74,18 @@ describe("agent eject/disable/enable/reset management actions", () => {
|
|
|
74
74
|
describe("eject", () => {
|
|
75
75
|
it("copies a bundled builtin to user scope verbatim and shadows the builtin", () => {
|
|
76
76
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
77
|
-
const builtin = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "
|
|
77
|
+
const builtin = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "commentator");
|
|
78
78
|
assert.ok(builtin);
|
|
79
79
|
|
|
80
|
-
const ejected = handleManagementAction("eject", { agent: "
|
|
80
|
+
const ejected = handleManagementAction("eject", { agent: "commentator" }, ctx);
|
|
81
81
|
assert.equal(ejected.isError, false);
|
|
82
|
-
assert.match(readText(ejected), /Ejected agent '
|
|
82
|
+
assert.match(readText(ejected), /Ejected agent 'commentator' from builtin to user scope/);
|
|
83
83
|
|
|
84
|
-
const target = userAgentPath("
|
|
84
|
+
const target = userAgentPath("commentator");
|
|
85
85
|
assert.equal(fs.existsSync(target), true);
|
|
86
86
|
assert.equal(fs.readFileSync(target, "utf-8"), fs.readFileSync(builtin.filePath, "utf-8"));
|
|
87
87
|
|
|
88
|
-
const effective = discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
88
|
+
const effective = discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator");
|
|
89
89
|
assert.ok(effective);
|
|
90
90
|
assert.equal(effective.source, "user");
|
|
91
91
|
assert.equal(effective.filePath, target);
|
|
@@ -94,38 +94,38 @@ describe("agent eject/disable/enable/reset management actions", () => {
|
|
|
94
94
|
it("ejects to project scope when agentScope is project", () => {
|
|
95
95
|
fs.mkdirSync(path.join(tempDir, ".selesai"), { recursive: true });
|
|
96
96
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
97
|
-
const ejected = handleManagementAction("eject", { agent: "
|
|
97
|
+
const ejected = handleManagementAction("eject", { agent: "explorer", agentScope: "project" }, ctx);
|
|
98
98
|
assert.equal(ejected.isError, false);
|
|
99
99
|
assert.match(readText(ejected), /to project scope/);
|
|
100
|
-
assert.equal(fs.existsSync(projectAgentPath("
|
|
101
|
-
assert.equal(discoverAgentsAll(tempDir).project.find((a) => a.name === "
|
|
100
|
+
assert.equal(fs.existsSync(projectAgentPath("explorer")), true);
|
|
101
|
+
assert.equal(discoverAgentsAll(tempDir).project.find((a) => a.name === "explorer")?.source, "project");
|
|
102
102
|
});
|
|
103
103
|
|
|
104
104
|
it("copies a package agent that shadows a builtin by runtime precedence", () => {
|
|
105
105
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
106
|
-
writePackageAgent("
|
|
107
|
-
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
106
|
+
writePackageAgent("commentator");
|
|
107
|
+
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator")?.source, "package");
|
|
108
108
|
|
|
109
|
-
const ejected = handleManagementAction("eject", { agent: "
|
|
109
|
+
const ejected = handleManagementAction("eject", { agent: "commentator" }, ctx);
|
|
110
110
|
assert.equal(ejected.isError, false);
|
|
111
111
|
assert.match(readText(ejected), /from package to user scope/);
|
|
112
|
-
assert.equal(fs.readFileSync(userAgentPath("
|
|
112
|
+
assert.equal(fs.readFileSync(userAgentPath("commentator"), "utf-8"), fs.readFileSync(packageAgentPath("commentator"), "utf-8"));
|
|
113
113
|
});
|
|
114
114
|
|
|
115
115
|
it("refuses invalid management scopes without writing user files", () => {
|
|
116
116
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
117
|
-
const ejected = handleManagementAction("eject", { agent: "
|
|
117
|
+
const ejected = handleManagementAction("eject", { agent: "commentator", agentScope: "workspace" }, ctx);
|
|
118
118
|
assert.equal(ejected.isError, true);
|
|
119
119
|
assert.match(readText(ejected), /agentScope must be 'user' or 'project'/);
|
|
120
|
-
assert.equal(fs.existsSync(userAgentPath("
|
|
120
|
+
assert.equal(fs.existsSync(userAgentPath("commentator")), false);
|
|
121
121
|
});
|
|
122
122
|
|
|
123
123
|
it("refuses to eject when a custom agent already exists", () => {
|
|
124
124
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
125
|
-
fs.mkdirSync(path.dirname(userAgentPath("
|
|
126
|
-
fs.writeFileSync(userAgentPath("
|
|
125
|
+
fs.mkdirSync(path.dirname(userAgentPath("commentator")), { recursive: true });
|
|
126
|
+
fs.writeFileSync(userAgentPath("commentator"), "---\nname: commentator\ndescription: Mine\n---\n\nMine.\n", "utf-8");
|
|
127
127
|
|
|
128
|
-
const ejected = handleManagementAction("eject", { agent: "
|
|
128
|
+
const ejected = handleManagementAction("eject", { agent: "commentator" }, ctx);
|
|
129
129
|
assert.equal(ejected.isError, true);
|
|
130
130
|
assert.match(readText(ejected), /already a custom user agent/);
|
|
131
131
|
});
|
|
@@ -141,48 +141,48 @@ describe("agent eject/disable/enable/reset management actions", () => {
|
|
|
141
141
|
describe("disable", () => {
|
|
142
142
|
it("hides a builtin from runtime discovery via a user settings override", () => {
|
|
143
143
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
144
|
-
const disabled = handleManagementAction("disable", { agent: "
|
|
144
|
+
const disabled = handleManagementAction("disable", { agent: "commentator" }, ctx);
|
|
145
145
|
assert.equal(disabled.isError, false);
|
|
146
|
-
assert.match(readText(disabled), /Disabled agent '
|
|
146
|
+
assert.match(readText(disabled), /Disabled agent 'commentator' via user settings override/);
|
|
147
147
|
|
|
148
|
-
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
149
|
-
const all = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "
|
|
148
|
+
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"), undefined);
|
|
149
|
+
const all = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "commentator");
|
|
150
150
|
assert.ok(all);
|
|
151
151
|
assert.equal(all.disabled, true);
|
|
152
152
|
assert.equal(all.override?.scope, "user");
|
|
153
153
|
|
|
154
|
-
const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: {
|
|
155
|
-
assert.equal(settings.subagents.agentOverrides.
|
|
154
|
+
const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { commentator: { disabled: boolean } } } };
|
|
155
|
+
assert.equal(settings.subagents.agentOverrides.commentator.disabled, true);
|
|
156
156
|
});
|
|
157
157
|
|
|
158
158
|
it("merges disabled into an existing override without dropping other fields", () => {
|
|
159
159
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
160
160
|
writeJson(userSettingsPath(), {
|
|
161
|
-
subagents: { agentOverrides: {
|
|
161
|
+
subagents: { agentOverrides: { commentator: { model: "openai/gpt-5.4" } } },
|
|
162
162
|
});
|
|
163
163
|
|
|
164
|
-
handleManagementAction("disable", { agent: "
|
|
164
|
+
handleManagementAction("disable", { agent: "commentator" }, ctx);
|
|
165
165
|
|
|
166
|
-
const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: {
|
|
167
|
-
assert.deepEqual(settings.subagents.agentOverrides.
|
|
166
|
+
const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { commentator: { model: string; disabled: boolean } } } };
|
|
167
|
+
assert.deepEqual(settings.subagents.agentOverrides.commentator, { model: "openai/gpt-5.4", disabled: true });
|
|
168
168
|
});
|
|
169
169
|
|
|
170
170
|
it("hides a disabled agent from agent-facing list output", () => {
|
|
171
171
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
172
|
-
handleManagementAction("disable", { agent: "
|
|
172
|
+
handleManagementAction("disable", { agent: "commentator" }, ctx);
|
|
173
173
|
|
|
174
174
|
const text = readText(handleManagementAction("list", {}, ctx));
|
|
175
|
-
assert.doesNotMatch(text, /^-
|
|
175
|
+
assert.doesNotMatch(text, /^- commentator /m);
|
|
176
176
|
});
|
|
177
177
|
|
|
178
178
|
it("writes a project-scoped override when agentScope is project", () => {
|
|
179
179
|
fs.mkdirSync(path.join(tempDir, ".selesai"), { recursive: true });
|
|
180
180
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
181
|
-
const disabled = handleManagementAction("disable", { agent: "
|
|
181
|
+
const disabled = handleManagementAction("disable", { agent: "commentator", agentScope: "project" }, ctx);
|
|
182
182
|
assert.equal(disabled.isError, false);
|
|
183
183
|
assert.match(readText(disabled), /via project settings override/);
|
|
184
184
|
|
|
185
|
-
const all = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "
|
|
185
|
+
const all = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "commentator");
|
|
186
186
|
assert.equal(all?.override?.scope, "project");
|
|
187
187
|
assert.equal(fs.existsSync(projectSettingsPath()), true);
|
|
188
188
|
});
|
|
@@ -206,14 +206,14 @@ describe("agent eject/disable/enable/reset management actions", () => {
|
|
|
206
206
|
|
|
207
207
|
it("also disables a package agent via a settings override", () => {
|
|
208
208
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
209
|
-
writePackageAgent("packaged-
|
|
210
|
-
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "packaged-
|
|
209
|
+
writePackageAgent("packaged-commentator");
|
|
210
|
+
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "packaged-commentator")?.source, "package");
|
|
211
211
|
|
|
212
|
-
const disabled = handleManagementAction("disable", { agent: "packaged-
|
|
212
|
+
const disabled = handleManagementAction("disable", { agent: "packaged-commentator" }, ctx);
|
|
213
213
|
assert.equal(disabled.isError, false);
|
|
214
|
-
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "packaged-
|
|
214
|
+
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "packaged-commentator"), undefined);
|
|
215
215
|
|
|
216
|
-
const all = discoverAgentsAll(tempDir).package.find((a) => a.name === "packaged-
|
|
216
|
+
const all = discoverAgentsAll(tempDir).package.find((a) => a.name === "packaged-commentator");
|
|
217
217
|
assert.equal(all?.disabled, true);
|
|
218
218
|
assert.equal(all?.override?.scope, "user");
|
|
219
219
|
});
|
|
@@ -222,34 +222,34 @@ describe("agent eject/disable/enable/reset management actions", () => {
|
|
|
222
222
|
describe("enable", () => {
|
|
223
223
|
it("restores a previously disabled builtin to runtime discovery", () => {
|
|
224
224
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
225
|
-
handleManagementAction("disable", { agent: "
|
|
226
|
-
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
225
|
+
handleManagementAction("disable", { agent: "commentator" }, ctx);
|
|
226
|
+
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"), undefined);
|
|
227
227
|
|
|
228
|
-
const enabled = handleManagementAction("enable", { agent: "
|
|
228
|
+
const enabled = handleManagementAction("enable", { agent: "commentator" }, ctx);
|
|
229
229
|
assert.equal(enabled.isError, false);
|
|
230
|
-
assert.match(readText(enabled), /Enabled agent '
|
|
231
|
-
assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
230
|
+
assert.match(readText(enabled), /Enabled agent 'commentator'/);
|
|
231
|
+
assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"));
|
|
232
232
|
|
|
233
233
|
const settings = readJson(userSettingsPath()) as { subagents?: { agentOverrides?: Record<string, unknown> } };
|
|
234
|
-
assert.equal(settings.subagents?.agentOverrides?.
|
|
234
|
+
assert.equal(settings.subagents?.agentOverrides?.commentator, undefined);
|
|
235
235
|
});
|
|
236
236
|
|
|
237
237
|
it("preserves other override fields when removing the disabled flag", () => {
|
|
238
238
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
239
239
|
writeJson(userSettingsPath(), {
|
|
240
|
-
subagents: { agentOverrides: {
|
|
240
|
+
subagents: { agentOverrides: { commentator: { model: "openai/gpt-5.4", disabled: true } } },
|
|
241
241
|
});
|
|
242
242
|
|
|
243
|
-
handleManagementAction("enable", { agent: "
|
|
243
|
+
handleManagementAction("enable", { agent: "commentator" }, ctx);
|
|
244
244
|
|
|
245
|
-
const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: {
|
|
246
|
-
assert.deepEqual(settings.subagents.agentOverrides.
|
|
247
|
-
assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
245
|
+
const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { commentator: { model: string; disabled?: boolean } } } };
|
|
246
|
+
assert.deepEqual(settings.subagents.agentOverrides.commentator, { model: "openai/gpt-5.4" });
|
|
247
|
+
assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"));
|
|
248
248
|
});
|
|
249
249
|
|
|
250
250
|
it("reports already enabled and makes no changes when nothing is disabled", () => {
|
|
251
251
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
252
|
-
const enabled = handleManagementAction("enable", { agent: "
|
|
252
|
+
const enabled = handleManagementAction("enable", { agent: "commentator" }, ctx);
|
|
253
253
|
assert.equal(enabled.isError, false);
|
|
254
254
|
assert.match(readText(enabled), /already enabled/);
|
|
255
255
|
assert.equal(fs.existsSync(userSettingsPath()), false);
|
|
@@ -258,9 +258,9 @@ describe("agent eject/disable/enable/reset management actions", () => {
|
|
|
258
258
|
it("points to the disabling scope when enabling the wrong scope", () => {
|
|
259
259
|
fs.mkdirSync(path.join(tempDir, ".selesai"), { recursive: true });
|
|
260
260
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
261
|
-
handleManagementAction("disable", { agent: "
|
|
261
|
+
handleManagementAction("disable", { agent: "commentator", agentScope: "project" }, ctx);
|
|
262
262
|
|
|
263
|
-
const enabled = handleManagementAction("enable", { agent: "
|
|
263
|
+
const enabled = handleManagementAction("enable", { agent: "commentator" }, ctx);
|
|
264
264
|
assert.equal(enabled.isError, true);
|
|
265
265
|
assert.match(readText(enabled), /still disabled via a project scope override/);
|
|
266
266
|
assert.match(readText(enabled), /agentScope: 'project'/);
|
|
@@ -277,45 +277,45 @@ describe("agent eject/disable/enable/reset management actions", () => {
|
|
|
277
277
|
describe("reset", () => {
|
|
278
278
|
it("deletes a custom shadow file and restores the bundled builtin", () => {
|
|
279
279
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
280
|
-
handleManagementAction("eject", { agent: "
|
|
281
|
-
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
280
|
+
handleManagementAction("eject", { agent: "commentator" }, ctx);
|
|
281
|
+
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator")?.source, "user");
|
|
282
282
|
|
|
283
|
-
const reset = handleManagementAction("reset", { agent: "
|
|
283
|
+
const reset = handleManagementAction("reset", { agent: "commentator" }, ctx);
|
|
284
284
|
assert.equal(reset.isError, false);
|
|
285
285
|
assert.match(readText(reset), /Deleted custom user agent file/);
|
|
286
|
-
assert.match(readText(reset), /Reset agent '
|
|
287
|
-
assert.equal(fs.existsSync(userAgentPath("
|
|
288
|
-
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
286
|
+
assert.match(readText(reset), /Reset agent 'commentator' to its bundled builtin default/);
|
|
287
|
+
assert.equal(fs.existsSync(userAgentPath("commentator")), false);
|
|
288
|
+
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator")?.source, "builtin");
|
|
289
289
|
});
|
|
290
290
|
|
|
291
291
|
it("removes a settings override and restores the pristine builtin", () => {
|
|
292
292
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
293
|
-
handleManagementAction("disable", { agent: "
|
|
294
|
-
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
293
|
+
handleManagementAction("disable", { agent: "commentator" }, ctx);
|
|
294
|
+
assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"), undefined);
|
|
295
295
|
|
|
296
|
-
const reset = handleManagementAction("reset", { agent: "
|
|
296
|
+
const reset = handleManagementAction("reset", { agent: "commentator" }, ctx);
|
|
297
297
|
assert.equal(reset.isError, false);
|
|
298
298
|
assert.match(readText(reset), /Removed user settings override/);
|
|
299
|
-
assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
299
|
+
assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"));
|
|
300
300
|
assert.equal((readJson(userSettingsPath()) as { subagents?: unknown }).subagents, undefined);
|
|
301
301
|
});
|
|
302
302
|
|
|
303
303
|
it("removes both a custom file and a settings override in one reset", () => {
|
|
304
304
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
305
|
-
handleManagementAction("eject", { agent: "
|
|
306
|
-
handleManagementAction("disable", { agent: "
|
|
305
|
+
handleManagementAction("eject", { agent: "commentator" }, ctx);
|
|
306
|
+
handleManagementAction("disable", { agent: "commentator" }, ctx);
|
|
307
307
|
|
|
308
|
-
const reset = handleManagementAction("reset", { agent: "
|
|
308
|
+
const reset = handleManagementAction("reset", { agent: "commentator" }, ctx);
|
|
309
309
|
assert.equal(reset.isError, false);
|
|
310
310
|
assert.match(readText(reset), /Deleted custom user agent file/);
|
|
311
311
|
assert.match(readText(reset), /Removed user settings override/);
|
|
312
|
-
assert.equal(fs.existsSync(userAgentPath("
|
|
313
|
-
assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "
|
|
312
|
+
assert.equal(fs.existsSync(userAgentPath("commentator")), false);
|
|
313
|
+
assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"));
|
|
314
314
|
});
|
|
315
315
|
|
|
316
316
|
it("reports a no-op when there is nothing to reset in the target scope", () => {
|
|
317
317
|
const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
|
|
318
|
-
const reset = handleManagementAction("reset", { agent: "
|
|
318
|
+
const reset = handleManagementAction("reset", { agent: "commentator" }, ctx);
|
|
319
319
|
assert.equal(reset.isError, false);
|
|
320
320
|
assert.match(readText(reset), /no user customization to reset/);
|
|
321
321
|
assert.match(readText(reset), /at its bundled builtin default/);
|