@prestyj/cli 5.7.0 → 5.9.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 -2
- package/assets/skills/evidence-led-ui/LICENSES.md +12 -0
- package/assets/skills/evidence-led-ui/SKILL.md +14 -6
- package/assets/skills/evidence-led-ui/references/anti-defaults.md +9 -1
- package/assets/skills/evidence-led-ui/references/craft-rulings.md +33 -0
- package/assets/skills/evidence-led-ui/references/production-contract.md +41 -21
- package/assets/skills/evidence-led-ui/references/provenance.md +7 -5
- package/assets/skills/evidence-led-ui/references/quality-rubric.md +10 -10
- package/dist/app-sidecar-sessions.d.ts +8 -0
- package/dist/app-sidecar-sessions.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.js +31 -0
- package/dist/app-sidecar-sessions.js.map +1 -0
- package/dist/app-sidecar-sessions.test.d.ts +2 -0
- package/dist/app-sidecar-sessions.test.d.ts.map +1 -0
- package/dist/app-sidecar-sessions.test.js +83 -0
- package/dist/app-sidecar-sessions.test.js.map +1 -0
- package/dist/app-sidecar.js +488 -156
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +5 -2
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/shared.d.ts.map +1 -1
- package/dist/cli/shared.js +2 -0
- package/dist/cli/shared.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +61 -29
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +7 -0
- package/dist/config.test.js.map +1 -1
- package/dist/core/agent-session-compaction.test.js +540 -10
- package/dist/core/agent-session-compaction.test.js.map +1 -1
- package/dist/core/agent-session-memory-tail.test.js +1 -1
- package/dist/core/agent-session-memory-tail.test.js.map +1 -1
- package/dist/core/agent-session-queue.test.js +1 -1
- package/dist/core/agent-session-queue.test.js.map +1 -1
- package/dist/core/agent-session-review-coverage.test.js +26 -0
- package/dist/core/agent-session-review-coverage.test.js.map +1 -1
- package/dist/core/agent-session-tool-result-policy.test.d.ts +2 -0
- package/dist/core/agent-session-tool-result-policy.test.d.ts.map +1 -0
- package/dist/core/agent-session-tool-result-policy.test.js +25 -0
- package/dist/core/agent-session-tool-result-policy.test.js.map +1 -0
- package/dist/core/agent-session.d.ts +44 -8
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +369 -99
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.d.ts +1 -1
- package/dist/core/agents.d.ts.map +1 -1
- package/dist/core/agents.js +4 -1
- package/dist/core/agents.js.map +1 -1
- package/dist/core/auth-providers.d.ts.map +1 -1
- package/dist/core/auth-providers.js +15 -8
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/auth-storage.d.ts +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/compaction/active-context.d.ts +17 -0
- package/dist/core/compaction/active-context.d.ts.map +1 -0
- package/dist/core/compaction/active-context.js +20 -0
- package/dist/core/compaction/active-context.js.map +1 -0
- package/dist/core/compaction/active-context.test.d.ts +2 -0
- package/dist/core/compaction/active-context.test.d.ts.map +1 -0
- package/dist/core/compaction/active-context.test.js +36 -0
- package/dist/core/compaction/active-context.test.js.map +1 -0
- package/dist/core/compaction/compactor.d.ts +19 -18
- package/dist/core/compaction/compactor.d.ts.map +1 -1
- package/dist/core/compaction/compactor.js +84 -53
- package/dist/core/compaction/compactor.js.map +1 -1
- package/dist/core/compaction/compactor.test.js +135 -65
- package/dist/core/compaction/compactor.test.js.map +1 -1
- package/dist/core/compaction/token-estimator.d.ts +25 -1
- package/dist/core/compaction/token-estimator.d.ts.map +1 -1
- package/dist/core/compaction/token-estimator.js +86 -1
- package/dist/core/compaction/token-estimator.js.map +1 -1
- package/dist/core/compaction/token-estimator.test.js +147 -1
- package/dist/core/compaction/token-estimator.test.js.map +1 -1
- package/dist/core/compaction/tool-result-pruner.d.ts +37 -0
- package/dist/core/compaction/tool-result-pruner.d.ts.map +1 -0
- package/dist/core/compaction/tool-result-pruner.js +103 -0
- package/dist/core/compaction/tool-result-pruner.js.map +1 -0
- package/dist/core/compaction/tool-result-pruner.test.d.ts +2 -0
- package/dist/core/compaction/tool-result-pruner.test.d.ts.map +1 -0
- package/dist/core/compaction/tool-result-pruner.test.js +148 -0
- package/dist/core/compaction/tool-result-pruner.test.js.map +1 -0
- package/dist/core/event-bus.d.ts +5 -0
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +6 -0
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/goal-controller.test.js +3 -3
- package/dist/core/goal-controller.test.js.map +1 -1
- package/dist/core/ideal-review.d.ts +6 -0
- package/dist/core/ideal-review.d.ts.map +1 -1
- package/dist/core/ideal-review.js +14 -0
- package/dist/core/ideal-review.js.map +1 -1
- package/dist/core/ideal-review.test.js +10 -1
- package/dist/core/ideal-review.test.js.map +1 -1
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/input-normalization.test.d.ts +2 -0
- package/dist/core/input-normalization.test.d.ts.map +1 -0
- package/dist/core/input-normalization.test.js +75 -0
- package/dist/core/input-normalization.test.js.map +1 -0
- package/dist/core/loop-breaker.d.ts +38 -1
- package/dist/core/loop-breaker.d.ts.map +1 -1
- package/dist/core/loop-breaker.js +84 -2
- package/dist/core/loop-breaker.js.map +1 -1
- package/dist/core/loop-breaker.test.js +108 -1
- package/dist/core/loop-breaker.test.js.map +1 -1
- package/dist/core/message-images.d.ts +12 -0
- package/dist/core/message-images.d.ts.map +1 -0
- package/dist/core/message-images.js +52 -0
- package/dist/core/message-images.js.map +1 -0
- package/dist/core/message-images.test.d.ts +2 -0
- package/dist/core/message-images.test.d.ts.map +1 -0
- package/dist/core/message-images.test.js +62 -0
- package/dist/core/message-images.test.js.map +1 -0
- package/dist/core/project-discovery.d.ts +7 -10
- package/dist/core/project-discovery.d.ts.map +1 -1
- package/dist/core/project-discovery.js +125 -66
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/project-discovery.test.js +177 -0
- package/dist/core/project-discovery.test.js.map +1 -1
- package/dist/core/resolve-start.test.js +1 -0
- package/dist/core/resolve-start.test.js.map +1 -1
- package/dist/core/session-compaction.d.ts +3 -0
- package/dist/core/session-compaction.d.ts.map +1 -1
- package/dist/core/session-compaction.js +14 -1
- package/dist/core/session-compaction.js.map +1 -1
- package/dist/core/session-compaction.test.js +5 -0
- package/dist/core/session-compaction.test.js.map +1 -1
- package/dist/core/session-manager.d.ts +35 -8
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +264 -125
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-manager.test.js +17 -0
- package/dist/core/session-manager.test.js.map +1 -1
- package/dist/core/session-preview.d.ts +11 -0
- package/dist/core/session-preview.d.ts.map +1 -0
- package/dist/core/session-preview.js +50 -0
- package/dist/core/session-preview.js.map +1 -0
- package/dist/core/session-storage.d.ts +57 -0
- package/dist/core/session-storage.d.ts.map +1 -0
- package/dist/core/session-storage.js +568 -0
- package/dist/core/session-storage.js.map +1 -0
- package/dist/core/session-storage.test.d.ts +2 -0
- package/dist/core/session-storage.test.d.ts.map +1 -0
- package/dist/core/session-storage.test.js +269 -0
- package/dist/core/session-storage.test.js.map +1 -0
- package/dist/core/settings-manager.d.ts +3 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +10 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/sidecar-error-reporter.d.ts +12 -0
- package/dist/core/sidecar-error-reporter.d.ts.map +1 -0
- package/dist/core/sidecar-error-reporter.js +57 -0
- package/dist/core/sidecar-error-reporter.js.map +1 -0
- package/dist/core/sidecar-error-reporter.test.d.ts +2 -0
- package/dist/core/sidecar-error-reporter.test.d.ts.map +1 -0
- package/dist/core/sidecar-error-reporter.test.js +61 -0
- package/dist/core/sidecar-error-reporter.test.js.map +1 -0
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +9 -4
- package/dist/core/subagent-manager.d.ts.map +1 -1
- package/dist/core/subagent-manager.js +30 -2
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-manager.test.js +47 -3
- package/dist/core/subagent-manager.test.js.map +1 -1
- package/dist/core/verify-commands.d.ts.map +1 -1
- package/dist/core/verify-commands.js +1 -6
- package/dist/core/verify-commands.js.map +1 -1
- package/dist/core/verify-commands.test.js +1 -5
- package/dist/core/verify-commands.test.js.map +1 -1
- package/dist/core/workspace-guard.d.ts +38 -0
- package/dist/core/workspace-guard.d.ts.map +1 -0
- package/dist/core/workspace-guard.js +112 -0
- package/dist/core/workspace-guard.js.map +1 -0
- package/dist/core/workspace-guard.test.d.ts +2 -0
- package/dist/core/workspace-guard.test.d.ts.map +1 -0
- package/dist/core/workspace-guard.test.js +86 -0
- package/dist/core/workspace-guard.test.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/json-mode.d.ts.map +1 -1
- package/dist/modes/json-mode.js +9 -0
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
- package/dist/modes/subagent-worker-mode.js +11 -0
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/session.d.ts +4 -4
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +38 -101
- package/dist/session.js.map +1 -1
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +35 -0
- package/dist/session.test.js.map +1 -0
- package/dist/system-prompt.d.ts +12 -0
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +86 -19
- package/dist/system-prompt.js.map +1 -1
- package/dist/system-prompt.test.js +132 -8
- package/dist/system-prompt.test.js.map +1 -1
- package/dist/tools/bash.d.ts +12 -2
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +65 -24
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/bash.test.d.ts +2 -0
- package/dist/tools/bash.test.d.ts.map +1 -0
- package/dist/tools/bash.test.js +89 -0
- package/dist/tools/bash.test.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -1
- package/dist/tools/edit.d.ts.map +1 -1
- package/dist/tools/edit.js +7 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/edit.test.js +7 -0
- package/dist/tools/edit.test.js.map +1 -1
- package/dist/tools/exit-plan.d.ts.map +1 -1
- package/dist/tools/exit-plan.js +15 -4
- package/dist/tools/exit-plan.js.map +1 -1
- package/dist/tools/exit-plan.test.d.ts +2 -0
- package/dist/tools/exit-plan.test.d.ts.map +1 -0
- package/dist/tools/exit-plan.test.js +72 -0
- package/dist/tools/exit-plan.test.js.map +1 -0
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +8 -3
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep.test.js +6 -0
- package/dist/tools/grep.test.js.map +1 -1
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/overflow.d.ts +12 -2
- package/dist/tools/overflow.d.ts.map +1 -1
- package/dist/tools/overflow.js +49 -4
- package/dist/tools/overflow.js.map +1 -1
- package/dist/tools/overflow.test.d.ts +2 -0
- package/dist/tools/overflow.test.d.ts.map +1 -0
- package/dist/tools/overflow.test.js +62 -0
- package/dist/tools/overflow.test.js.map +1 -0
- package/dist/tools/screenshot.js +1 -1
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +4 -2
- package/dist/tools/skill.js.map +1 -1
- package/dist/tools/source-path.d.ts.map +1 -1
- package/dist/tools/source-path.js +9 -0
- package/dist/tools/source-path.js.map +1 -1
- package/dist/tools/subagent-shared.d.ts +9 -1
- package/dist/tools/subagent-shared.d.ts.map +1 -1
- package/dist/tools/subagent-shared.js +4 -1
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/subagent-shared.test.js +21 -1
- package/dist/tools/subagent-shared.test.js.map +1 -1
- package/dist/tools/subagent.d.ts +3 -8
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +10 -8
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/subagent.test.js +17 -1
- package/dist/tools/subagent.test.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +13 -2
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/write.d.ts +2 -1
- package/dist/tools/write.d.ts.map +1 -1
- package/dist/tools/write.js +7 -1
- package/dist/tools/write.js.map +1 -1
- package/dist/tools/write.test.js +12 -0
- package/dist/tools/write.test.js.map +1 -1
- package/dist/ui/App.d.ts +0 -2
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +23 -87
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/app-items.d.ts +10 -0
- package/dist/ui/app-items.d.ts.map +1 -1
- package/dist/ui/app-items.js +10 -0
- package/dist/ui/app-items.js.map +1 -1
- package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
- package/dist/ui/components/ActivityIndicator.js +1 -0
- package/dist/ui/components/ActivityIndicator.js.map +1 -1
- package/dist/ui/components/Footer.test.js +1 -1
- package/dist/ui/components/ModelSelector.d.ts.map +1 -1
- package/dist/ui/components/ModelSelector.js +1 -0
- package/dist/ui/components/ModelSelector.js.map +1 -1
- package/dist/ui/components/SubAgentPanel.d.ts +2 -0
- package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
- package/dist/ui/components/SubAgentPanel.js +4 -2
- package/dist/ui/components/SubAgentPanel.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.d.ts +7 -6
- package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
- package/dist/ui/hooks/useAgentLoop.js +56 -11
- package/dist/ui/hooks/useAgentLoop.js.map +1 -1
- package/dist/ui/hooks/useAgentLoop.test.js +31 -0
- package/dist/ui/hooks/useAgentLoop.test.js.map +1 -1
- package/dist/ui/hooks/useContextCompaction.d.ts +5 -8
- package/dist/ui/hooks/useContextCompaction.d.ts.map +1 -1
- package/dist/ui/hooks/useContextCompaction.js +77 -16
- package/dist/ui/hooks/useContextCompaction.js.map +1 -1
- package/dist/ui/hooks/useContextCompaction.test.d.ts +2 -0
- package/dist/ui/hooks/useContextCompaction.test.d.ts.map +1 -0
- package/dist/ui/hooks/useContextCompaction.test.js +135 -0
- package/dist/ui/hooks/useContextCompaction.test.js.map +1 -0
- package/dist/ui/hooks/useSessionPersistence.d.ts.map +1 -1
- package/dist/ui/hooks/useSessionPersistence.js +3 -0
- package/dist/ui/hooks/useSessionPersistence.js.map +1 -1
- package/dist/ui/hooks/useTerminalTitle.d.ts +3 -3
- package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -1
- package/dist/ui/hooks/useTerminalTitle.js +5 -9
- package/dist/ui/hooks/useTerminalTitle.js.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
- package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
- package/dist/ui/hooks/useTranscriptHistory.js +2 -30
- package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
- package/dist/ui/login.d.ts.map +1 -1
- package/dist/ui/login.js +7 -2
- package/dist/ui/login.js.map +1 -1
- package/dist/ui/render.d.ts +0 -2
- package/dist/ui/render.d.ts.map +1 -1
- package/dist/ui/render.js +0 -4
- package/dist/ui/render.js.map +1 -1
- package/dist/ui/render.test.js +10 -1
- package/dist/ui/render.test.js.map +1 -1
- package/dist/ui/terminal-history.js +6 -2
- package/dist/ui/terminal-history.js.map +1 -1
- package/dist/ui/terminal-history.test.js +2 -2
- package/dist/ui/terminal-history.test.js.map +1 -1
- package/dist/ui/tui-history-parity.test.js +8 -1
- package/dist/ui/tui-history-parity.test.js.map +1 -1
- package/dist/utils/git.d.ts +2 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +12 -0
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/git.test.d.ts +2 -0
- package/dist/utils/git.test.d.ts.map +1 -0
- package/dist/utils/git.test.js +36 -0
- package/dist/utils/git.test.js.map +1 -0
- package/dist/utils/http-body.d.ts +19 -0
- package/dist/utils/http-body.d.ts.map +1 -0
- package/dist/utils/http-body.js +58 -0
- package/dist/utils/http-body.js.map +1 -0
- package/dist/utils/http-body.test.d.ts +2 -0
- package/dist/utils/http-body.test.d.ts.map +1 -0
- package/dist/utils/http-body.test.js +68 -0
- package/dist/utils/http-body.test.js.map +1 -0
- package/dist/utils/text.d.ts +9 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +11 -0
- package/dist/utils/text.js.map +1 -0
- package/package.json +5 -5
- package/dist/utils/session-title.d.ts +0 -19
- package/dist/utils/session-title.d.ts.map +0 -1
- package/dist/utils/session-title.js +0 -82
- package/dist/utils/session-title.js.map +0 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { getAppPaths } from "../config.js";
|
|
4
|
+
/** True when `target` is `root` or contained within it. */
|
|
5
|
+
function isWithin(root, target) {
|
|
6
|
+
const relative = path.relative(root, target);
|
|
7
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Decide whether a resolved write/edit target path is allowed.
|
|
11
|
+
* Allowed by default: under `cwd`, under the OS temp dir, and under the
|
|
12
|
+
* agent's own state dir (~/.ezcoder) — sessions/plans/settings must keep working.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveWriteGuard(cwd, resolvedPath, settings) {
|
|
15
|
+
if (settings?.allowOutsideWorkspaceWrites)
|
|
16
|
+
return { allowed: true };
|
|
17
|
+
const target = path.resolve(resolvedPath);
|
|
18
|
+
const allowedRoots = [
|
|
19
|
+
path.resolve(cwd),
|
|
20
|
+
path.resolve(os.tmpdir()),
|
|
21
|
+
path.resolve(getAppPaths().agentDir),
|
|
22
|
+
];
|
|
23
|
+
for (const root of allowedRoots) {
|
|
24
|
+
if (isWithin(root, target))
|
|
25
|
+
return { allowed: true };
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
allowed: false,
|
|
29
|
+
reason: `Blocked: ${target} is outside the workspace (${path.resolve(cwd)}). ` +
|
|
30
|
+
"Writing outside the workspace requires user approval — ask the user to confirm, " +
|
|
31
|
+
"or have them enable the allowOutsideWorkspaceWrites setting.",
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// ── Catastrophic command guard ─────────────────────────────
|
|
35
|
+
/** Strip simple quoting so `rm -rf "/"` and `rm -rf '/'` match too. */
|
|
36
|
+
function unquote(token) {
|
|
37
|
+
const trimmed = token.trim();
|
|
38
|
+
if (trimmed.length >= 2 &&
|
|
39
|
+
((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
40
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'")))) {
|
|
41
|
+
return trimmed.slice(1, -1);
|
|
42
|
+
}
|
|
43
|
+
return trimmed;
|
|
44
|
+
}
|
|
45
|
+
/** Targets whose recursive force-removal is never acceptable without explicit
|
|
46
|
+
* user confirmation. `cwd` adds the workspace root itself. */
|
|
47
|
+
function isCatastrophicRemovalTarget(rawTarget, cwd) {
|
|
48
|
+
const target = unquote(rawTarget);
|
|
49
|
+
if (target === "/" || target === "~" || target === "$HOME" || target === "${HOME}")
|
|
50
|
+
return true;
|
|
51
|
+
// Bare drive roots (Windows-style), e.g. C:\ or C:/
|
|
52
|
+
if (/^[A-Za-z]:[\\/]?$/.test(target))
|
|
53
|
+
return true;
|
|
54
|
+
// Home directory or workspace root by absolute/relative path.
|
|
55
|
+
const home = os.homedir();
|
|
56
|
+
const resolved = path.resolve(cwd, target.replace(/^~(?=\/|$)/, home));
|
|
57
|
+
if (resolved === path.resolve(home))
|
|
58
|
+
return true;
|
|
59
|
+
if (resolved === path.resolve(cwd))
|
|
60
|
+
return true;
|
|
61
|
+
if (resolved === path.parse(resolved).root)
|
|
62
|
+
return true;
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Match only the unambiguous disasters:
|
|
67
|
+
* - `rm -rf` (any flag spelling including -r -f, -fr, --recursive --force)
|
|
68
|
+
* targeting /, ~, $HOME, the workspace root, or a bare drive root
|
|
69
|
+
* - Windows `rd /s /q C:\` (or `rmdir`)
|
|
70
|
+
* - `git push --force --mirror` (mirror force-push rewrites every ref)
|
|
71
|
+
*
|
|
72
|
+
* Returns an error string telling the model to get explicit user confirmation,
|
|
73
|
+
* or null when the command is not catastrophic.
|
|
74
|
+
*/
|
|
75
|
+
export function isCatastrophicCommand(command, cwd) {
|
|
76
|
+
const confirmNote = "This command is irreversible and destroys data far beyond the workspace. " +
|
|
77
|
+
"Get explicit user confirmation first, then re-run it quoting the user's words " +
|
|
78
|
+
"authorizing it.";
|
|
79
|
+
// rm with both recursive and force flags
|
|
80
|
+
const rmMatch = /(?:^|[;&|]\s*)(?:sudo\s+)?rm\s+((?:-{1,2}[A-Za-z-]+\s+)+)(.+)/.exec(command);
|
|
81
|
+
if (rmMatch) {
|
|
82
|
+
const flags = rmMatch[1];
|
|
83
|
+
const recursive = /(?:^|\s)-{1,2}(?:[a-zA-Z]*r[a-zA-Z]*|recursive)(?:\s|$)/.test(flags);
|
|
84
|
+
const force = /(?:^|\s)-{1,2}(?:[a-zA-Z]*f[a-zA-Z]*|force)(?:\s|$)/.test(flags);
|
|
85
|
+
if (recursive && force) {
|
|
86
|
+
const targets = rmMatch[2].split(/\s+/).filter((t) => t.length > 0 && !t.startsWith("-"));
|
|
87
|
+
for (const target of targets) {
|
|
88
|
+
if (isCatastrophicRemovalTarget(target, cwd)) {
|
|
89
|
+
return `Refusing to run: recursive force-remove of ${unquote(target)}. ${confirmNote}`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Windows: rd /s /q C:\ (or rmdir)
|
|
95
|
+
const rdMatch = /(?:^|[;&|]\s*)(?:rd|rmdir)\s+((?:\/[sq]\s+)+)(.+)/i.exec(command);
|
|
96
|
+
if (rdMatch && /\/s/i.test(rdMatch[1])) {
|
|
97
|
+
const targets = rdMatch[2].split(/\s+/).filter((t) => t.length > 0 && !t.startsWith("/"));
|
|
98
|
+
for (const target of targets) {
|
|
99
|
+
if (isCatastrophicRemovalTarget(target, cwd)) {
|
|
100
|
+
return `Refusing to run: recursive removal of ${unquote(target)}. ${confirmNote}`;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// git push --force --mirror (in either order; -f counts as --force)
|
|
105
|
+
if (/(?:^|[;&|]\s*)git\s+push\b/.test(command) &&
|
|
106
|
+
/\s--mirror\b/.test(command) &&
|
|
107
|
+
/\s(?:--force\b|-f\b)/.test(command)) {
|
|
108
|
+
return `Refusing to run: mirror force-push rewrites every ref on the remote. ${confirmNote}`;
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=workspace-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-guard.js","sourceRoot":"","sources":["../../src/core/workspace-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-guard.test.d.ts","sourceRoot":"","sources":["../../src/core/workspace-guard.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { isCatastrophicCommand, resolveWriteGuard } from "./workspace-guard.js";
|
|
5
|
+
const cwd = path.join(os.tmpdir(), "guard-test-workspace");
|
|
6
|
+
describe("resolveWriteGuard", () => {
|
|
7
|
+
it("allows paths under the workspace cwd", () => {
|
|
8
|
+
expect(resolveWriteGuard(cwd, path.join(cwd, "src", "a.ts")).allowed).toBe(true);
|
|
9
|
+
expect(resolveWriteGuard(cwd, cwd).allowed).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
it("allows paths under the OS temp dir", () => {
|
|
12
|
+
const target = path.join(os.tmpdir(), "scratch", "notes.md");
|
|
13
|
+
expect(resolveWriteGuard("/somewhere/else", target).allowed).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
it("allows paths under the agent's own ~/.ezcoder state dir", () => {
|
|
16
|
+
const target = path.join(os.homedir(), ".ezcoder", "plans", "plan.md");
|
|
17
|
+
expect(resolveWriteGuard(cwd, target).allowed).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it("blocks paths outside all allowed roots with an instructive reason", () => {
|
|
20
|
+
const target = path.join(os.homedir(), "Documents", "outside.txt");
|
|
21
|
+
const result = resolveWriteGuard(cwd, target);
|
|
22
|
+
expect(result.allowed).toBe(false);
|
|
23
|
+
expect(result.reason).toContain("outside the workspace");
|
|
24
|
+
expect(result.reason).toContain("allowOutsideWorkspaceWrites");
|
|
25
|
+
});
|
|
26
|
+
it("does not treat sibling directories with a shared prefix as inside", () => {
|
|
27
|
+
const result = resolveWriteGuard(cwd, `${cwd}-evil/file.txt`);
|
|
28
|
+
// `${cwd}-evil` shares the cwd string prefix but is a different directory.
|
|
29
|
+
// It IS still under tmpdir here, so use a home-based pair instead.
|
|
30
|
+
const home = path.join(os.homedir(), "project");
|
|
31
|
+
expect(resolveWriteGuard(home, `${home}-evil/file.txt`).allowed).toBe(false);
|
|
32
|
+
expect(result.allowed).toBe(true); // tmpdir root still allows it
|
|
33
|
+
});
|
|
34
|
+
it("allows everything when allowOutsideWorkspaceWrites is enabled", () => {
|
|
35
|
+
const target = path.join(os.homedir(), "Documents", "outside.txt");
|
|
36
|
+
expect(resolveWriteGuard(cwd, target, { allowOutsideWorkspaceWrites: true }).allowed).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe("isCatastrophicCommand", () => {
|
|
40
|
+
it.each([
|
|
41
|
+
"rm -rf /",
|
|
42
|
+
"rm -fr /",
|
|
43
|
+
"rm -r -f /",
|
|
44
|
+
"rm --recursive --force /",
|
|
45
|
+
"rm -rf ~",
|
|
46
|
+
"rm -rf $HOME",
|
|
47
|
+
'rm -rf "$HOME"',
|
|
48
|
+
"sudo rm -rf /",
|
|
49
|
+
`rm -rf ${os.homedir()}`,
|
|
50
|
+
])("blocks %s", (command) => {
|
|
51
|
+
const result = isCatastrophicCommand(command, cwd);
|
|
52
|
+
expect(result).not.toBeNull();
|
|
53
|
+
expect(result).toContain("user confirmation");
|
|
54
|
+
});
|
|
55
|
+
it("blocks recursive force-remove of the workspace root itself", () => {
|
|
56
|
+
expect(isCatastrophicCommand("rm -rf .", cwd)).not.toBeNull();
|
|
57
|
+
expect(isCatastrophicCommand(`rm -rf ${cwd}`, cwd)).not.toBeNull();
|
|
58
|
+
});
|
|
59
|
+
it("blocks Windows rd /s /q on a bare drive root", () => {
|
|
60
|
+
expect(isCatastrophicCommand("rd /s /q C:\\", cwd)).not.toBeNull();
|
|
61
|
+
expect(isCatastrophicCommand("rmdir /s /q C:\\", cwd)).not.toBeNull();
|
|
62
|
+
});
|
|
63
|
+
it("blocks a chained catastrophic command", () => {
|
|
64
|
+
expect(isCatastrophicCommand("echo done && rm -rf /", cwd)).not.toBeNull();
|
|
65
|
+
});
|
|
66
|
+
it("blocks git push --force --mirror", () => {
|
|
67
|
+
expect(isCatastrophicCommand("git push --force --mirror origin", cwd)).not.toBeNull();
|
|
68
|
+
expect(isCatastrophicCommand("git push --mirror -f origin", cwd)).not.toBeNull();
|
|
69
|
+
});
|
|
70
|
+
it.each([
|
|
71
|
+
"rm -rf node_modules",
|
|
72
|
+
"rm -rf ./dist",
|
|
73
|
+
"rm -rf /tmp/scratch-dir",
|
|
74
|
+
"rm -rf build coverage",
|
|
75
|
+
"rm file.txt",
|
|
76
|
+
"rm -r src/old",
|
|
77
|
+
"git reset --hard HEAD~1",
|
|
78
|
+
"git push --force origin feature-branch",
|
|
79
|
+
"git push --mirror backup", // mirror without force
|
|
80
|
+
"rd /s /q build",
|
|
81
|
+
"ls -la /",
|
|
82
|
+
])("allows %s", (command) => {
|
|
83
|
+
expect(isCatastrophicCommand(command, cwd)).toBeNull();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=workspace-guard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-guard.test.js","sourceRoot":"","sources":["../../src/core/workspace-guard.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { createTools, createReadTool, createWriteTool, createEditTool, createBashTool, createFindTool, createGrepTool, createLsTool, createSourcePathTool, } from "./tools/index.js";
|
|
2
2
|
export { buildSystemPrompt } from "./system-prompt.js";
|
|
3
3
|
export { createSession, loadSession, listSessions, getMostRecentSession, persistMessage, } from "./session.js";
|
|
4
|
-
export { EventBus, AgentSession, SessionManager, SettingsManager, AuthStorage, SlashCommandRegistry, ExtensionLoader, MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, usesOpenAICodexTransport, getMaxThinkingLevel, getNextThinkingLevel, getSupportedThinkingLevels, isThinkingLevelSupported, shouldCompact, compact, discoverSkills, estimateTokens, estimateConversationTokens, } from "./core/index.js";
|
|
4
|
+
export { EventBus, AgentSession, SessionManager, SettingsManager, AuthStorage, SlashCommandRegistry, ExtensionLoader, MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, usesOpenAICodexTransport, getMaxThinkingLevel, getDefaultThinkingLevel, getNextThinkingLevel, getSupportedThinkingLevels, isThinkingLevelSupported, shouldCompact, compact, discoverSkills, estimateTokens, estimateConversationTokens, } from "./core/index.js";
|
|
5
5
|
export { runPrintMode } from "./modes/index.js";
|
|
6
6
|
export { renderApp } from "./ui/render.js";
|
|
7
7
|
export { APP_NAME, VERSION, getAppPaths, ensureAppDirs } from "./config.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,EACb,OAAO,EACP,cAAc,EACd,cAAc,EACd,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EACV,SAAS,EACT,aAAa,IAAI,mBAAmB,EACpC,mBAAmB,EACnB,YAAY,IAAI,kBAAkB,EAClC,WAAW,IAAI,iBAAiB,GACjC,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,EACb,OAAO,EACP,cAAc,EACd,cAAc,EACd,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EACV,SAAS,EACT,aAAa,IAAI,mBAAmB,EACpC,mBAAmB,EACnB,YAAY,IAAI,kBAAkB,EAClC,WAAW,IAAI,iBAAiB,GACjC,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ export { buildSystemPrompt } from "./system-prompt.js";
|
|
|
5
5
|
// Session (legacy — still usable)
|
|
6
6
|
export { createSession, loadSession, listSessions, getMostRecentSession, persistMessage, } from "./session.js";
|
|
7
7
|
// Core
|
|
8
|
-
export { EventBus, AgentSession, SessionManager, SettingsManager, AuthStorage, SlashCommandRegistry, ExtensionLoader, MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, usesOpenAICodexTransport, getMaxThinkingLevel, getNextThinkingLevel, getSupportedThinkingLevels, isThinkingLevelSupported, shouldCompact, compact, discoverSkills, estimateTokens, estimateConversationTokens, } from "./core/index.js";
|
|
8
|
+
export { EventBus, AgentSession, SessionManager, SettingsManager, AuthStorage, SlashCommandRegistry, ExtensionLoader, MODELS, getModel, getModelsForProvider, getDefaultModel, getContextWindow, usesOpenAICodexTransport, getMaxThinkingLevel, getDefaultThinkingLevel, getNextThinkingLevel, getSupportedThinkingLevels, isThinkingLevelSupported, shouldCompact, compact, discoverSkills, estimateTokens, estimateConversationTokens, } from "./core/index.js";
|
|
9
9
|
// Modes
|
|
10
10
|
export { runPrintMode } from "./modes/index.js";
|
|
11
11
|
// UI entry
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,kCAAkC;AAClC,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO;AACP,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,EACb,OAAO,EACP,cAAc,EACd,cAAc,EACd,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,WAAW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5E,gEAAgE;AAChE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GAInB,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,YAAY,EACZ,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,kCAAkC;AAClC,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,OAAO;AACP,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,wBAAwB,EACxB,aAAa,EACb,OAAO,EACP,cAAc,EACd,cAAc,EACd,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,WAAW;AACX,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5E,gEAAgE;AAChE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GAInB,MAAM,6BAA6B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-mode.d.ts","sourceRoot":"","sources":["../../src/modes/json-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"json-mode.d.ts","sourceRoot":"","sources":["../../src/modes/json-mode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO3D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFzE"}
|
package/dist/modes/json-mode.js
CHANGED
|
@@ -2,6 +2,7 @@ import { AgentSession } from "../core/agent-session.js";
|
|
|
2
2
|
import { isAbortError } from "@prestyj/agent";
|
|
3
3
|
import { formatUserError } from "../utils/error-handler.js";
|
|
4
4
|
import { closeLogger } from "../core/logger.js";
|
|
5
|
+
import { captureSidecarError, flushSidecarErrors } from "../core/sidecar-error-reporter.js";
|
|
5
6
|
function emitJson(payload) {
|
|
6
7
|
process.stdout.write(JSON.stringify(payload) + "\n");
|
|
7
8
|
}
|
|
@@ -56,6 +57,9 @@ export async function runJsonMode(options) {
|
|
|
56
57
|
session.eventBus.on("max_turns", (payload) => {
|
|
57
58
|
emitJson({ type: "max_turns", ...payload });
|
|
58
59
|
});
|
|
60
|
+
session.eventBus.on("truncated", (payload) => {
|
|
61
|
+
emitJson({ type: "truncated", ...payload });
|
|
62
|
+
});
|
|
59
63
|
session.eventBus.on("server_tool_call", (payload) => {
|
|
60
64
|
emitJson({ type: "server_tool_call", ...payload });
|
|
61
65
|
});
|
|
@@ -74,6 +78,11 @@ export async function runJsonMode(options) {
|
|
|
74
78
|
emitJson({ type: "error", message: "Interrupted" });
|
|
75
79
|
process.exit(130);
|
|
76
80
|
}
|
|
81
|
+
captureSidecarError(err, "json-mode.run", {
|
|
82
|
+
provider: options.provider,
|
|
83
|
+
model: options.model,
|
|
84
|
+
});
|
|
85
|
+
await flushSidecarErrors();
|
|
77
86
|
process.stderr.write(formatUserError(err) + "\n");
|
|
78
87
|
process.exit(1);
|
|
79
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-mode.js","sourceRoot":"","sources":["../../src/modes/json-mode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"json-mode.js","sourceRoot":"","sources":["../../src/modes/json-mode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AA2B5F,SAAS,QAAQ,CAAC,OAAgC;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAwB;IACxD,sFAAsF;IACtF,2FAA2F;IAE3F,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,yEAAyE;QACzE,uEAAuE;QACvE,gEAAgE;QAChE,SAAS,EAAE,IAAI;QACf,4EAA4E;QAC5E,0EAA0E;QAC1E,2EAA2E;QAC3E,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;IAE9C,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE;QAC5C,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE;QAChD,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE;QACjD,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE;QAClD,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;QAC/C,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;QAC1C,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,EAAE;QAC5C,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;QAC3C,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE;QAC3C,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE;QAClD,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE;QACpD,QAAQ,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QACzC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,MAAM,kBAAkB,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-worker-mode.d.ts","sourceRoot":"","sources":["../../src/modes/subagent-worker-mode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"subagent-worker-mode.d.ts","sourceRoot":"","sources":["../../src/modes/subagent-worker-mode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAM3D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAoBD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoM3D"}
|
|
@@ -2,6 +2,7 @@ import { createInterface } from "node:readline";
|
|
|
2
2
|
import { AgentSession } from "../core/agent-session.js";
|
|
3
3
|
import { isModelUnavailableError } from "../tools/subagent.js";
|
|
4
4
|
import { boundSubAgentOutput, SUB_AGENT_TIMEOUT_MS } from "../tools/subagent-shared.js";
|
|
5
|
+
import { captureSidecarError, flushSidecarErrors } from "../core/sidecar-error-reporter.js";
|
|
5
6
|
function emit(frame) {
|
|
6
7
|
process.stdout.write(`${JSON.stringify(frame)}\n`);
|
|
7
8
|
}
|
|
@@ -29,6 +30,7 @@ export async function runSubagentWorkerMode() {
|
|
|
29
30
|
"tool_call_end",
|
|
30
31
|
"turn_end",
|
|
31
32
|
"max_turns",
|
|
33
|
+
"truncated",
|
|
32
34
|
"server_tool_call",
|
|
33
35
|
"server_tool_result",
|
|
34
36
|
];
|
|
@@ -110,6 +112,12 @@ export async function runSubagentWorkerMode() {
|
|
|
110
112
|
.catch((error) => {
|
|
111
113
|
clearTimeout(turnTimer);
|
|
112
114
|
const interrupted = controller.signal.aborted;
|
|
115
|
+
if (!interrupted) {
|
|
116
|
+
captureSidecarError(error, "subagent-worker.turn", {
|
|
117
|
+
provider: initializeOptions?.provider ?? "unknown",
|
|
118
|
+
model: initializeOptions?.model ?? "unknown",
|
|
119
|
+
});
|
|
120
|
+
}
|
|
113
121
|
setState(interrupted ? "interrupted" : "idle");
|
|
114
122
|
emit({
|
|
115
123
|
type: "turn_complete",
|
|
@@ -176,6 +184,7 @@ export async function runSubagentWorkerMode() {
|
|
|
176
184
|
}
|
|
177
185
|
}
|
|
178
186
|
catch (error) {
|
|
187
|
+
captureSidecarError(error, "subagent-worker.command", { command: command.command });
|
|
179
188
|
reject(command.request_id, error);
|
|
180
189
|
}
|
|
181
190
|
};
|
|
@@ -188,6 +197,7 @@ export async function runSubagentWorkerMode() {
|
|
|
188
197
|
throw new Error("Invalid command frame");
|
|
189
198
|
}
|
|
190
199
|
catch (error) {
|
|
200
|
+
captureSidecarError(error, "subagent-worker.protocol");
|
|
191
201
|
emit({ type: "protocol_error", error: errorMessage(error) });
|
|
192
202
|
return;
|
|
193
203
|
}
|
|
@@ -197,5 +207,6 @@ export async function runSubagentWorkerMode() {
|
|
|
197
207
|
controller.abort();
|
|
198
208
|
await activeTurn?.catch(() => undefined);
|
|
199
209
|
await session?.dispose();
|
|
210
|
+
await flushSidecarErrors();
|
|
200
211
|
}
|
|
201
212
|
//# sourceMappingURL=subagent-worker-mode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-worker-mode.js","sourceRoot":"","sources":["../../src/modes/subagent-worker-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"subagent-worker-mode.js","sourceRoot":"","sources":["../../src/modes/subagent-worker-mode.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -5,12 +5,12 @@ export interface Session {
|
|
|
5
5
|
path: string;
|
|
6
6
|
append(entry: SessionEntry): Promise<void>;
|
|
7
7
|
}
|
|
8
|
-
export declare function createSession(cwd: string, provider: string, model: string): Promise<Session>;
|
|
9
|
-
export declare function loadSession(sessionPath: string): Promise<{
|
|
8
|
+
export declare function createSession(cwd: string, provider: string, model: string, sessionsDir?: string): Promise<Session>;
|
|
9
|
+
export declare function loadSession(sessionPath: string, sessionsDir?: string): Promise<{
|
|
10
10
|
header: SessionHeader;
|
|
11
11
|
messages: Message[];
|
|
12
12
|
}>;
|
|
13
|
-
export declare function listSessions(cwd: string): Promise<SessionInfo[]>;
|
|
14
|
-
export declare function getMostRecentSession(cwd: string): Promise<string | null>;
|
|
13
|
+
export declare function listSessions(cwd: string, sessionsDir?: string): Promise<SessionInfo[]>;
|
|
14
|
+
export declare function getMostRecentSession(cwd: string, sessionsDir?: string): Promise<string | null>;
|
|
15
15
|
export declare function persistMessage(session: Session, message: Message): Promise<void>;
|
|
16
16
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAuB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAWhG,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,WAAW,SAAc,GACxB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAID,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,SAAc,GACxB,OAAO,CAAC;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAgBzD;AAID,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGjG;AAID,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,WAAW,SAAc,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGxB;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF"}
|
package/dist/session.js
CHANGED
|
@@ -1,119 +1,56 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
1
|
import path from "node:path";
|
|
3
2
|
import os from "node:os";
|
|
4
3
|
import crypto from "node:crypto";
|
|
5
|
-
import {
|
|
4
|
+
import { SessionManager, } from "./core/session-manager.js";
|
|
6
5
|
const SESSION_DIR = path.join(os.homedir(), ".ezcoder", "sessions");
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const sessionManager = new SessionManager(SESSION_DIR);
|
|
7
|
+
export async function createSession(cwd, provider, model, sessionsDir = SESSION_DIR) {
|
|
8
|
+
const manager = sessionsDir === SESSION_DIR ? sessionManager : new SessionManager(sessionsDir);
|
|
9
|
+
const created = await manager.create(cwd, provider, model);
|
|
10
|
+
return {
|
|
11
|
+
id: created.id,
|
|
12
|
+
path: created.path,
|
|
13
|
+
async append(entry) {
|
|
14
|
+
if (entry.type !== "message")
|
|
15
|
+
return;
|
|
16
|
+
const managedEntry = {
|
|
17
|
+
type: "message",
|
|
18
|
+
id: crypto.randomUUID(),
|
|
19
|
+
parentId: null,
|
|
20
|
+
timestamp: entry.timestamp,
|
|
21
|
+
message: entry.message,
|
|
22
|
+
};
|
|
23
|
+
await manager.appendEntry(created.path, managedEntry);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
9
26
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
await fs.mkdir(dir, { recursive: true });
|
|
15
|
-
const fileName = `${timestamp.replace(/[:.]/g, "-")}_${id.slice(0, 8)}.jsonl`;
|
|
16
|
-
const filePath = path.join(dir, fileName);
|
|
27
|
+
// ── Load Session ────────────────────────────────────────────
|
|
28
|
+
export async function loadSession(sessionPath, sessionsDir = SESSION_DIR) {
|
|
29
|
+
const manager = sessionsDir === SESSION_DIR ? sessionManager : new SessionManager(sessionsDir);
|
|
30
|
+
const loaded = await manager.load(sessionPath);
|
|
17
31
|
const header = {
|
|
18
32
|
type: "session",
|
|
19
33
|
version: 1,
|
|
20
|
-
id,
|
|
21
|
-
timestamp,
|
|
22
|
-
cwd,
|
|
23
|
-
provider: provider,
|
|
24
|
-
model,
|
|
34
|
+
id: loaded.header.id,
|
|
35
|
+
timestamp: loaded.header.timestamp,
|
|
36
|
+
cwd: loaded.header.cwd,
|
|
37
|
+
provider: loaded.header.provider,
|
|
38
|
+
model: loaded.header.model,
|
|
25
39
|
};
|
|
26
|
-
await fs.appendFile(filePath, JSON.stringify(header) + "\n", "utf-8");
|
|
27
40
|
return {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
async append(entry) {
|
|
31
|
-
await fs.appendFile(filePath, JSON.stringify(entry) + "\n", "utf-8");
|
|
32
|
-
},
|
|
41
|
+
header,
|
|
42
|
+
messages: manager.getMessages(loaded.entries, loaded.header.leafId),
|
|
33
43
|
};
|
|
34
44
|
}
|
|
35
|
-
// ── Load Session ────────────────────────────────────────────
|
|
36
|
-
export async function loadSession(sessionPath) {
|
|
37
|
-
const content = await fs.readFile(sessionPath, "utf-8");
|
|
38
|
-
const lines = content.trim().split("\n").filter(Boolean);
|
|
39
|
-
let header = null;
|
|
40
|
-
const messages = [];
|
|
41
|
-
for (const line of lines) {
|
|
42
|
-
const entry = JSON.parse(line);
|
|
43
|
-
if (entry.type === "session") {
|
|
44
|
-
header = entry;
|
|
45
|
-
}
|
|
46
|
-
else if (entry.type === "message") {
|
|
47
|
-
// Skip system messages — they'll be rebuilt fresh
|
|
48
|
-
if (entry.message.role !== "system") {
|
|
49
|
-
messages.push(entry.message);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (!header) {
|
|
54
|
-
throw new Error(`Invalid session file: no header found in ${sessionPath}`);
|
|
55
|
-
}
|
|
56
|
-
return { header, messages };
|
|
57
|
-
}
|
|
58
45
|
// ── List Sessions ───────────────────────────────────────────
|
|
59
|
-
export async function listSessions(cwd) {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
files = await fs.readdir(dir);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return [];
|
|
67
|
-
}
|
|
68
|
-
const sessions = [];
|
|
69
|
-
for (const file of files) {
|
|
70
|
-
if (!file.endsWith(".jsonl"))
|
|
71
|
-
continue;
|
|
72
|
-
const filePath = path.join(dir, file);
|
|
73
|
-
try {
|
|
74
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
75
|
-
const lines = content.trim().split("\n").filter(Boolean);
|
|
76
|
-
if (lines.length === 0)
|
|
77
|
-
continue;
|
|
78
|
-
const header = JSON.parse(lines[0]);
|
|
79
|
-
if (header.type !== "session")
|
|
80
|
-
continue;
|
|
81
|
-
let messageCount = 0;
|
|
82
|
-
let lastActivity = header.timestamp;
|
|
83
|
-
for (const line of lines) {
|
|
84
|
-
try {
|
|
85
|
-
const entry = JSON.parse(line);
|
|
86
|
-
if (entry.type === "message") {
|
|
87
|
-
messageCount++;
|
|
88
|
-
if (entry.timestamp)
|
|
89
|
-
lastActivity = entry.timestamp;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// Skip corrupt lines
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
sessions.push({
|
|
97
|
-
id: header.id,
|
|
98
|
-
path: filePath,
|
|
99
|
-
timestamp: header.timestamp,
|
|
100
|
-
lastActivity,
|
|
101
|
-
cwd: header.cwd,
|
|
102
|
-
messageCount,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
// Skip corrupt files
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
// Sort by last activity descending (the session most recently spoken in first)
|
|
110
|
-
sessions.sort((a, b) => b.lastActivity.localeCompare(a.lastActivity));
|
|
111
|
-
return sessions;
|
|
46
|
+
export async function listSessions(cwd, sessionsDir = SESSION_DIR) {
|
|
47
|
+
const manager = sessionsDir === SESSION_DIR ? sessionManager : new SessionManager(sessionsDir);
|
|
48
|
+
return manager.list(cwd);
|
|
112
49
|
}
|
|
113
50
|
// ── Get Most Recent Session ─────────────────────────────────
|
|
114
|
-
export async function getMostRecentSession(cwd) {
|
|
115
|
-
const
|
|
116
|
-
return
|
|
51
|
+
export async function getMostRecentSession(cwd, sessionsDir = SESSION_DIR) {
|
|
52
|
+
const manager = sessionsDir === SESSION_DIR ? sessionManager : new SessionManager(sessionsDir);
|
|
53
|
+
return manager.getMostRecent(cwd);
|
|
117
54
|
}
|
|
118
55
|
// ── Persist Messages ────────────────────────────────────────
|
|
119
56
|
export function persistMessage(session, message) {
|
package/dist/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|