spec-cat 0.1.63 → 0.1.65
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/.output/nitro.json +1 -1
- package/.output/public/_nuxt/B-bFNWCF.js +43 -0
- package/.output/public/_nuxt/{D4LyIv_t.js → BEWSHKZd.js} +1 -1
- package/.output/public/_nuxt/{Su-Cl_JF.js → BHhMtuRK.js} +1 -1
- package/.output/public/_nuxt/{DwpuOtAP.js → BwRpECPL.js} +1 -1
- package/.output/public/_nuxt/{FfyCVKRU.js → CC_9aMCT.js} +1 -1
- package/.output/public/_nuxt/CHHbeXzh.js +1 -0
- package/.output/public/_nuxt/{DIOhMCOf.js → CzV__9yP.js} +3 -3
- package/.output/public/_nuxt/{Bz2rU2zs.js → DWDrIutw.js} +1 -1
- package/.output/public/_nuxt/D_4Ow2w2.js +1 -0
- package/.output/public/_nuxt/D_T_F7lf.js +1 -0
- package/.output/public/_nuxt/{DPOGSCeV.js → DqFq1MXh.js} +1 -1
- package/.output/public/_nuxt/YzuyFhrD.js +174 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/cdc4ded8-9ff7-4e22-abbe-3b8c94caa781.json +1 -0
- package/.output/public/_nuxt/default.Cyeq1Er8.css +1 -0
- package/.output/public/_nuxt/entry.uBSFaL6A.css +1 -0
- package/.output/public/_nuxt/{useTheme.Cny4Z64J.css → useTheme.B4wINCoW.css} +1 -1
- package/.output/public/_nuxt/uyJF9wDo.js +58 -0
- package/.output/server/chunks/_/aiProviderRegistry.mjs +1 -2
- package/.output/server/chunks/_/aiProviderRegistry.mjs.map +1 -1
- package/.output/server/chunks/_/aiProviderSelection.mjs +2 -2
- package/.output/server/chunks/_/chatGit.mjs +1 -2
- package/.output/server/chunks/_/chatGit.mjs.map +1 -1
- package/.output/server/chunks/_/claudeProvider.mjs +1 -215
- package/.output/server/chunks/_/claudeProvider.mjs.map +1 -1
- package/.output/server/chunks/_/claudeService.mjs +50 -54
- package/.output/server/chunks/_/claudeService.mjs.map +1 -1
- package/.output/server/chunks/_/codexProvider.mjs +47 -812
- package/.output/server/chunks/_/codexProvider.mjs.map +1 -1
- package/.output/server/chunks/_/git.mjs +1 -2
- package/.output/server/chunks/_/git.mjs.map +1 -1
- package/.output/server/chunks/_/gitApiHelpers.mjs +1 -1
- package/.output/server/chunks/_/gitBranchOperations.mjs +1 -1
- package/.output/server/chunks/_/interactiveProviderQuery.mjs +160 -0
- package/.output/server/chunks/_/interactiveProviderQuery.mjs.map +1 -0
- package/.output/server/chunks/_/jobPersister.mjs +37 -6
- package/.output/server/chunks/_/jobPersister.mjs.map +1 -1
- package/.output/server/chunks/_/jobQueue.mjs +430 -278
- package/.output/server/chunks/_/jobQueue.mjs.map +1 -1
- package/.output/server/chunks/_/terminalSessions.mjs +582 -0
- package/.output/server/chunks/_/terminalSessions.mjs.map +1 -0
- package/.output/server/chunks/_/worktreeSetup.mjs +98 -0
- package/.output/server/chunks/_/worktreeSetup.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/client.precomputed.mjs.map +1 -1
- package/.output/server/chunks/nitro/nitro.mjs +1227 -620
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/_ws.mjs +21 -111
- package/.output/server/chunks/routes/_ws.mjs.map +1 -1
- package/.output/server/chunks/routes/api/ai/providers.get.mjs +3 -1
- package/.output/server/chunks/routes/api/ai/providers.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/compare.get.mjs +4 -5
- package/.output/server/chunks/routes/api/chat/compare.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/context.get.mjs +4 -2
- package/.output/server/chunks/routes/api/chat/context.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/finalize.post.mjs +11 -7
- package/.output/server/chunks/routes/api/chat/finalize.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/generate-commit-message.post.mjs +26 -29
- package/.output/server/chunks/routes/api/chat/generate-commit-message.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/preview-sync.post.mjs +4 -5
- package/.output/server/chunks/routes/api/chat/preview-sync.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/preview.delete.mjs +4 -5
- package/.output/server/chunks/routes/api/chat/preview.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/preview.post.mjs +4 -6
- package/.output/server/chunks/routes/api/chat/preview.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/rebase.post.mjs +4 -7
- package/.output/server/chunks/routes/api/chat/rebase.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/worktree-commit.post.mjs +4 -6
- package/.output/server/chunks/routes/api/chat/worktree-commit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/worktree.delete.mjs +11 -4
- package/.output/server/chunks/routes/api/chat/worktree.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/chat/worktree.post.mjs +4 -6
- package/.output/server/chunks/routes/api/chat/worktree.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/_conversationId/archive.post.mjs +10 -9
- package/.output/server/chunks/routes/api/conversations/_conversationId/archive.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/archives/_archiveId/restore.post.mjs +4 -7
- package/.output/server/chunks/routes/api/conversations/archives/_archiveId/restore.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/archives/_archiveId_.delete.mjs +4 -7
- package/.output/server/chunks/routes/api/conversations/archives/_archiveId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/archives.delete.mjs +40 -0
- package/.output/server/chunks/routes/api/conversations/archives.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/conversations/archives.get.mjs +4 -7
- package/.output/server/chunks/routes/api/conversations/archives.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations/update.post.mjs +4 -7
- package/.output/server/chunks/routes/api/conversations/update.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations.get.mjs +4 -7
- package/.output/server/chunks/routes/api/conversations.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/conversations.post.mjs +4 -7
- package/.output/server/chunks/routes/api/conversations.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/cwd.get.mjs +4 -2
- package/.output/server/chunks/routes/api/cwd.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/branch-rename.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/branch-rename.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/branch.delete.mjs +4 -5
- package/.output/server/chunks/routes/api/git/branch.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/branches.get.mjs +4 -6
- package/.output/server/chunks/routes/api/git/branches.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/checkout.post.mjs +4 -5
- package/.output/server/chunks/routes/api/git/checkout.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/cherry-pick.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/cherry-pick.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/clean.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/clean.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs +3 -4
- package/.output/server/chunks/routes/api/git/commit/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/commit.post.mjs +4 -5
- package/.output/server/chunks/routes/api/git/commit.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/diff.get.mjs +4 -5
- package/.output/server/chunks/routes/api/git/diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/fetch.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/fetch.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/file-diff.get.mjs +4 -5
- package/.output/server/chunks/routes/api/git/file-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/graph.get.mjs +4 -5
- package/.output/server/chunks/routes/api/git/graph.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/log.get.mjs +4 -5
- package/.output/server/chunks/routes/api/git/log.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/merge-base.get.mjs +4 -5
- package/.output/server/chunks/routes/api/git/merge-base.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/merge.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/merge.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/pull.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/pull.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/push.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/push.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/rebase.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/rebase.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/remote.delete.mjs +3 -4
- package/.output/server/chunks/routes/api/git/remote.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/remote.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/remote.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/remote.put.mjs +3 -4
- package/.output/server/chunks/routes/api/git/remote.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/remotes.get.mjs +3 -4
- package/.output/server/chunks/routes/api/git/remotes.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/reset.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/reset.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/revert.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/revert.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/show.get.mjs +4 -5
- package/.output/server/chunks/routes/api/git/show.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stage.post.mjs +4 -5
- package/.output/server/chunks/routes/api/git/stage.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash-apply.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/stash-apply.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash-branch.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/stash-branch.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash-drop.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/stash-drop.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash-pop.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/stash-pop.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash.get.mjs +3 -4
- package/.output/server/chunks/routes/api/git/stash.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/stash.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/stash.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/state.get.mjs +3 -4
- package/.output/server/chunks/routes/api/git/state.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/status.get.mjs +4 -5
- package/.output/server/chunks/routes/api/git/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs +3 -4
- package/.output/server/chunks/routes/api/git/tag/_name_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/tag-push.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/tag-push.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/tag.delete.mjs +3 -4
- package/.output/server/chunks/routes/api/git/tag.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/tag.post.mjs +3 -4
- package/.output/server/chunks/routes/api/git/tag.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/git/unstage.post.mjs +4 -5
- package/.output/server/chunks/routes/api/git/unstage.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +7 -4
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get2.mjs +4 -2
- package/.output/server/chunks/routes/api/index.get2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get3.mjs +4 -2
- package/.output/server/chunks/routes/api/index.get3.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +19 -16
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post2.mjs +4 -6
- package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
- package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs +6 -3
- package/.output/server/chunks/routes/api/jobs/_id/cancel.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/jobs/_id_.get.mjs +7 -4
- package/.output/server/chunks/routes/api/jobs/_id_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/rebase/abort.post.mjs +4 -2
- package/.output/server/chunks/routes/api/rebase/abort.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/rebase/ai-resolve.post.mjs +19 -105
- package/.output/server/chunks/routes/api/rebase/ai-resolve.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/rebase/conflicts.get.mjs +3 -1
- package/.output/server/chunks/routes/api/rebase/conflicts.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/rebase/continue-sync.post.mjs +4 -2
- package/.output/server/chunks/routes/api/rebase/continue-sync.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/rebase/continue.post.mjs +71 -73
- package/.output/server/chunks/routes/api/rebase/continue.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/rebase/resolve.put.mjs +3 -1
- package/.output/server/chunks/routes/api/rebase/resolve.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repository/status.get.mjs +4 -5
- package/.output/server/chunks/routes/api/repository/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings.get.mjs +6 -5
- package/.output/server/chunks/routes/api/settings.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/settings.post.mjs +5 -3
- package/.output/server/chunks/routes/api/settings.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/skills/_skillId/prompt.post.mjs +3 -1
- package/.output/server/chunks/routes/api/skills/_skillId/prompt.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.get.mjs +3 -1
- package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.put.mjs +3 -1
- package/.output/server/chunks/routes/api/specs/_featureId/_...filename_.put.mjs.map +1 -1
- package/.output/server/chunks/routes/api/specs/features.get.mjs +3 -1
- package/.output/server/chunks/routes/api/specs/features.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/specs/reindex.post.mjs +4 -2
- package/.output/server/chunks/routes/api/specs/reindex.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/specs/search.get.mjs +4 -2
- package/.output/server/chunks/routes/api/specs/search.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/specs/status.get.mjs +4 -2
- package/.output/server/chunks/routes/api/specs/status.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/specs/traceability/_featureId_.get.mjs +4 -2
- package/.output/server/chunks/routes/api/specs/traceability/_featureId_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/worktrees/_name/switch.post.mjs +4 -2
- package/.output/server/chunks/routes/api/worktrees/_name/switch.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/worktrees/_name_.delete.mjs +3 -1
- package/.output/server/chunks/routes/api/worktrees/_name_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/git-watcher-ws.mjs +4 -2
- package/.output/server/chunks/routes/git-watcher-ws.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +4 -2
- package/.output/server/chunks/routes/terminal-ws.mjs +230 -0
- package/.output/server/chunks/routes/terminal-ws.mjs.map +1 -0
- package/.output/server/index.mjs +4 -2
- package/.output/server/index.mjs.map +1 -1
- package/.output/server/node_modules/node-pty/build/Makefile +369 -0
- package/.output/server/node_modules/node-pty/build/Release/pty.node +0 -0
- package/.output/server/node_modules/node-pty/build/binding.Makefile +6 -0
- package/.output/server/node_modules/node-pty/build/config.gypi +513 -0
- package/.output/server/node_modules/node-pty/build/pty.target.mk +168 -0
- package/.output/server/node_modules/node-pty/lib/eventEmitter2.js +47 -0
- package/.output/server/node_modules/node-pty/lib/index.js +52 -0
- package/.output/server/node_modules/node-pty/lib/shared/conout.js +11 -0
- package/.output/server/node_modules/node-pty/lib/terminal.js +190 -0
- package/.output/server/node_modules/node-pty/lib/unixTerminal.js +346 -0
- package/.output/server/node_modules/node-pty/lib/utils.js +39 -0
- package/.output/server/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
- package/.output/server/node_modules/node-pty/lib/windowsPtyAgent.js +320 -0
- package/.output/server/node_modules/node-pty/lib/windowsTerminal.js +199 -0
- package/.output/server/node_modules/node-pty/package.json +64 -0
- package/.output/server/package.json +2 -1
- package/package.json +6 -1
- package/.output/public/_nuxt/2zamijve.js +0 -1
- package/.output/public/_nuxt/BEjIzkrM.js +0 -85
- package/.output/public/_nuxt/BaSsfm-t.js +0 -36
- package/.output/public/_nuxt/BjdLSVUw.js +0 -1
- package/.output/public/_nuxt/DeqM2TrP.js +0 -1
- package/.output/public/_nuxt/builds/meta/74089fa1-2fbb-4792-94aa-7535d2aec557.json +0 -1
- package/.output/public/_nuxt/default.DKSPicGu.css +0 -1
- package/.output/public/_nuxt/entry.BUDfUMkE.css +0 -1
- package/.output/public/_nuxt/zrVRZSxq.js +0 -64
- package/.output/server/chunks/_/baseBranch.mjs +0 -137
- package/.output/server/chunks/_/baseBranch.mjs.map +0 -1
- package/.output/server/chunks/_/claude.mjs +0 -164
- package/.output/server/chunks/_/claude.mjs.map +0 -1
- package/.output/server/chunks/_/conversationStore.mjs +0 -257
- package/.output/server/chunks/_/conversationStore.mjs.map +0 -1
- package/.output/server/chunks/_/geminiProvider.mjs +0 -372
- package/.output/server/chunks/_/geminiProvider.mjs.map +0 -1
- package/.output/server/chunks/_/gitExec.mjs +0 -48
- package/.output/server/chunks/_/gitExec.mjs.map +0 -1
- package/.output/server/chunks/_/providerProcessError.mjs +0 -163
- package/.output/server/chunks/_/providerProcessError.mjs.map +0 -1
- package/.output/server/chunks/_/uiAdapter.mjs +0 -421
- package/.output/server/chunks/_/uiAdapter.mjs.map +0 -1
- package/.output/server/chunks/routes/api/chat.post.mjs +0 -276
- package/.output/server/chunks/routes/api/chat.post.mjs.map +0 -1
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync, existsSync, readFileSync, readdirSync, statSync, openSync, readSync, closeSync, realpathSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { join, dirname } from 'node:path';
|
|
5
|
+
import { spawn } from 'node-pty';
|
|
6
|
+
import { t as getSpecCatStorePath, a as getProjectDir } from '../nitro/nitro.mjs';
|
|
7
|
+
import { resolveCodexHomeForSpawn } from './codexProvider.mjs';
|
|
8
|
+
|
|
9
|
+
const HOOK_EVENTS = [
|
|
10
|
+
"SessionStart",
|
|
11
|
+
"UserPromptSubmit",
|
|
12
|
+
"PostToolUse",
|
|
13
|
+
"PostToolUseFailure",
|
|
14
|
+
"Stop",
|
|
15
|
+
"SubagentStop"
|
|
16
|
+
];
|
|
17
|
+
function ensureHookRunner() {
|
|
18
|
+
const runnerPath = getSpecCatStorePath("cli-hooks/spec-cat-hook-runner.cjs");
|
|
19
|
+
const dir = dirname(runnerPath);
|
|
20
|
+
if (!existsSync(dir)) {
|
|
21
|
+
mkdirSync(dir, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
const script = `#!/usr/bin/env node
|
|
24
|
+
const fs = require('node:fs')
|
|
25
|
+
|
|
26
|
+
let input = ''
|
|
27
|
+
process.stdin.setEncoding('utf8')
|
|
28
|
+
process.stdin.on('data', chunk => { input += chunk })
|
|
29
|
+
process.stdin.on('end', () => {
|
|
30
|
+
const contextRaw = process.env.SPEC_CAT_HOOK_CONTEXT || '{}'
|
|
31
|
+
const spoolPath = process.env.SPEC_CAT_HOOK_SPOOL
|
|
32
|
+
if (!spoolPath) {
|
|
33
|
+
process.exit(0)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let payload = null
|
|
37
|
+
let context = {}
|
|
38
|
+
try { payload = input.trim() ? JSON.parse(input) : null } catch { payload = { parseError: true, raw: input } }
|
|
39
|
+
try { context = JSON.parse(contextRaw) } catch { context = {} }
|
|
40
|
+
|
|
41
|
+
const event = {
|
|
42
|
+
timestamp: new Date().toISOString(),
|
|
43
|
+
...context,
|
|
44
|
+
hookEventName: payload && typeof payload === 'object' ? payload.hook_event_name : undefined,
|
|
45
|
+
sessionId: payload && typeof payload === 'object' ? payload.session_id : undefined,
|
|
46
|
+
turnId: payload && typeof payload === 'object' ? payload.turn_id : undefined,
|
|
47
|
+
cwd: payload && typeof payload === 'object' ? payload.cwd : undefined,
|
|
48
|
+
payload,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
fs.mkdirSync(require('node:path').dirname(spoolPath), { recursive: true })
|
|
53
|
+
fs.appendFileSync(spoolPath, JSON.stringify(event) + '\\n', 'utf8')
|
|
54
|
+
} catch {}
|
|
55
|
+
|
|
56
|
+
if (event.hookEventName === 'Stop' || event.hookEventName === 'SubagentStop') {
|
|
57
|
+
process.stdout.write('{}')
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
`;
|
|
61
|
+
try {
|
|
62
|
+
const existing = existsSync(runnerPath) ? readFileSync(runnerPath, "utf-8") : "";
|
|
63
|
+
if (existing !== script) {
|
|
64
|
+
writeFileSync(runnerPath, script, { encoding: "utf-8", mode: 493 });
|
|
65
|
+
}
|
|
66
|
+
} catch {
|
|
67
|
+
writeFileSync(runnerPath, script, { encoding: "utf-8", mode: 493 });
|
|
68
|
+
}
|
|
69
|
+
return runnerPath;
|
|
70
|
+
}
|
|
71
|
+
function prepareCliHookInjection(context) {
|
|
72
|
+
const runnerPath = ensureHookRunner();
|
|
73
|
+
const spoolPath = getCliHookSpoolPath(context.conversationId);
|
|
74
|
+
return {
|
|
75
|
+
runnerPath,
|
|
76
|
+
spoolPath,
|
|
77
|
+
env: {
|
|
78
|
+
SPEC_CAT_HOOK_CONTEXT: JSON.stringify(context),
|
|
79
|
+
SPEC_CAT_HOOK_SPOOL: spoolPath
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function getCliHookSpoolPath(conversationId) {
|
|
84
|
+
return getSpecCatStorePath(`cli-hooks/${conversationId}.jsonl`);
|
|
85
|
+
}
|
|
86
|
+
function parseCliHookRecord(line) {
|
|
87
|
+
const cleaned = line.trim();
|
|
88
|
+
if (!cleaned) return null;
|
|
89
|
+
try {
|
|
90
|
+
const parsed = JSON.parse(cleaned);
|
|
91
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null;
|
|
92
|
+
return parsed;
|
|
93
|
+
} catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function buildCommandHook(runnerPath, statusMessage) {
|
|
98
|
+
return {
|
|
99
|
+
type: "command",
|
|
100
|
+
command: `node "${runnerPath}"`,
|
|
101
|
+
timeout: 30,
|
|
102
|
+
...statusMessage ? { statusMessage } : {}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function buildCodexHooksJson(runnerPath) {
|
|
106
|
+
const hooks = {};
|
|
107
|
+
for (const event of HOOK_EVENTS) {
|
|
108
|
+
hooks[event] = [
|
|
109
|
+
{
|
|
110
|
+
hooks: [
|
|
111
|
+
buildCommandHook(runnerPath, `Spec Cat ${event}`)
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
];
|
|
115
|
+
}
|
|
116
|
+
return { hooks };
|
|
117
|
+
}
|
|
118
|
+
function buildClaudeHooksJson(runnerPath) {
|
|
119
|
+
const hooks = {};
|
|
120
|
+
for (const event of HOOK_EVENTS) {
|
|
121
|
+
hooks[event] = [
|
|
122
|
+
{
|
|
123
|
+
hooks: [
|
|
124
|
+
buildCommandHook(runnerPath)
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
return { hooks };
|
|
130
|
+
}
|
|
131
|
+
function writeCodexHooks(codexHome, runnerPath) {
|
|
132
|
+
const hooksPath = join(codexHome, "hooks.json");
|
|
133
|
+
mkdirSync(dirname(hooksPath), { recursive: true });
|
|
134
|
+
writeFileSync(hooksPath, JSON.stringify(buildCodexHooksJson(runnerPath), null, 2), "utf-8");
|
|
135
|
+
}
|
|
136
|
+
function mergeHookConfig(existing, generated) {
|
|
137
|
+
const merged = { ...existing };
|
|
138
|
+
const existingHooks = existing.hooks && typeof existing.hooks === "object" && !Array.isArray(existing.hooks) ? existing.hooks : {};
|
|
139
|
+
const generatedHooks = generated.hooks;
|
|
140
|
+
const hooks = { ...existingHooks };
|
|
141
|
+
for (const [event, entries] of Object.entries(generatedHooks)) {
|
|
142
|
+
const current = Array.isArray(existingHooks[event]) ? existingHooks[event] : [];
|
|
143
|
+
hooks[event] = [
|
|
144
|
+
...current.filter((entry) => {
|
|
145
|
+
const serialized = JSON.stringify(entry);
|
|
146
|
+
return !serialized.includes("SPEC_CAT_HOOK_SPOOL") && !serialized.includes("spec-cat-hook-runner.cjs");
|
|
147
|
+
}),
|
|
148
|
+
...entries
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
merged.hooks = hooks;
|
|
152
|
+
return merged;
|
|
153
|
+
}
|
|
154
|
+
function writeClaudeLocalSettings(cwd, runnerPath) {
|
|
155
|
+
const settingsPath = join(cwd, ".claude", "settings.local.json");
|
|
156
|
+
mkdirSync(dirname(settingsPath), { recursive: true });
|
|
157
|
+
let existing = {};
|
|
158
|
+
if (existsSync(settingsPath)) {
|
|
159
|
+
try {
|
|
160
|
+
const parsed = JSON.parse(readFileSync(settingsPath, "utf-8"));
|
|
161
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
162
|
+
existing = parsed;
|
|
163
|
+
}
|
|
164
|
+
} catch {
|
|
165
|
+
existing = {};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const generated = buildClaudeHooksJson(runnerPath);
|
|
169
|
+
writeFileSync(settingsPath, JSON.stringify(mergeHookConfig(existing, generated), null, 2), "utf-8");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function detectClaudeCli() {
|
|
173
|
+
const systemPaths = [
|
|
174
|
+
// User local bin (common for npm/pnpm global installs)
|
|
175
|
+
join(process.env.HOME || "", ".local/bin/claude"),
|
|
176
|
+
// Standard unix paths
|
|
177
|
+
"/usr/local/bin/claude",
|
|
178
|
+
"/usr/bin/claude"
|
|
179
|
+
];
|
|
180
|
+
for (const path of systemPaths) {
|
|
181
|
+
if (existsSync(path)) {
|
|
182
|
+
console.log(`[Claude CLI] Found system installation: ${path}`);
|
|
183
|
+
return path;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const whichResult = execSync("which claude 2>/dev/null", { encoding: "utf-8" }).trim();
|
|
188
|
+
if (whichResult && existsSync(whichResult)) {
|
|
189
|
+
console.log(`[Claude CLI] Found via which: ${whichResult}`);
|
|
190
|
+
return whichResult;
|
|
191
|
+
}
|
|
192
|
+
} catch {
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
let cachedCliPath = null;
|
|
197
|
+
function getClaudeCliPath() {
|
|
198
|
+
if (cachedCliPath === null) {
|
|
199
|
+
cachedCliPath = detectClaudeCli();
|
|
200
|
+
}
|
|
201
|
+
if (!cachedCliPath) {
|
|
202
|
+
throw new Error(
|
|
203
|
+
"Claude Code CLI not found. Please install Claude Code CLI globally."
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
return cachedCliPath;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const ROLLOUT_FILENAME_RE = /^rollout-.*-([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i;
|
|
210
|
+
const CWD_RE$1 = /"cwd"\s*:\s*"((?:[^"\\]|\\.)*)"/;
|
|
211
|
+
const HEAD_BYTES$1 = 8192;
|
|
212
|
+
function getCodexSessionsDir() {
|
|
213
|
+
const home = typeof process.env.CODEX_HOME === "string" && process.env.CODEX_HOME.length > 0 ? process.env.CODEX_HOME : join(process.env.HOME || homedir(), ".codex");
|
|
214
|
+
return join(home, "sessions");
|
|
215
|
+
}
|
|
216
|
+
function readRolloutCwd(filePath) {
|
|
217
|
+
let fd = null;
|
|
218
|
+
try {
|
|
219
|
+
fd = openSync(filePath, "r");
|
|
220
|
+
const buffer = Buffer.alloc(HEAD_BYTES$1);
|
|
221
|
+
const bytesRead = readSync(fd, buffer, 0, HEAD_BYTES$1, 0);
|
|
222
|
+
const head = buffer.toString("utf-8", 0, bytesRead);
|
|
223
|
+
const match = CWD_RE$1.exec(head);
|
|
224
|
+
if (!match) return null;
|
|
225
|
+
try {
|
|
226
|
+
return JSON.parse(`"${match[1]}"`);
|
|
227
|
+
} catch {
|
|
228
|
+
return match[1];
|
|
229
|
+
}
|
|
230
|
+
} catch {
|
|
231
|
+
return null;
|
|
232
|
+
} finally {
|
|
233
|
+
if (fd !== null) {
|
|
234
|
+
try {
|
|
235
|
+
closeSync(fd);
|
|
236
|
+
} catch {
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function findLatestCodexSessionIdForCwd(cwd, afterMs) {
|
|
242
|
+
const root = getCodexSessionsDir();
|
|
243
|
+
if (!existsSync(root)) return null;
|
|
244
|
+
const candidates = [];
|
|
245
|
+
const walk = (dir, depth) => {
|
|
246
|
+
let entries;
|
|
247
|
+
try {
|
|
248
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
249
|
+
} catch {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
for (const entry of entries) {
|
|
253
|
+
const fullPath = join(dir, entry.name);
|
|
254
|
+
if (entry.isDirectory()) {
|
|
255
|
+
if (depth < 4) walk(fullPath, depth + 1);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (!entry.isFile()) continue;
|
|
259
|
+
const match = ROLLOUT_FILENAME_RE.exec(entry.name);
|
|
260
|
+
if (!match) continue;
|
|
261
|
+
let mtime;
|
|
262
|
+
try {
|
|
263
|
+
mtime = statSync(fullPath).mtimeMs;
|
|
264
|
+
} catch {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
if (mtime + 1 < afterMs) continue;
|
|
268
|
+
candidates.push({ path: fullPath, id: match[1], mtime });
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
walk(root, 0);
|
|
272
|
+
candidates.sort((a, b) => b.mtime - a.mtime);
|
|
273
|
+
for (const candidate of candidates) {
|
|
274
|
+
if (readRolloutCwd(candidate.path) === cwd) {
|
|
275
|
+
return candidate.id;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const SESSION_FILENAME_RE = /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i;
|
|
282
|
+
const CWD_RE = /"cwd"\s*:\s*"((?:[^"\\]|\\.)*)"/;
|
|
283
|
+
const HEAD_BYTES = 8192;
|
|
284
|
+
function getClaudeProjectsDir() {
|
|
285
|
+
const home = typeof process.env.CLAUDE_CONFIG_DIR === "string" && process.env.CLAUDE_CONFIG_DIR.length > 0 ? process.env.CLAUDE_CONFIG_DIR : join(process.env.HOME || homedir(), ".claude");
|
|
286
|
+
return join(home, "projects");
|
|
287
|
+
}
|
|
288
|
+
function encodeClaudeProjectDir(cwd) {
|
|
289
|
+
return cwd.replace(/[/.]/g, "-");
|
|
290
|
+
}
|
|
291
|
+
function readSessionCwd(filePath) {
|
|
292
|
+
let fd = null;
|
|
293
|
+
try {
|
|
294
|
+
fd = openSync(filePath, "r");
|
|
295
|
+
const buffer = Buffer.alloc(HEAD_BYTES);
|
|
296
|
+
const bytesRead = readSync(fd, buffer, 0, HEAD_BYTES, 0);
|
|
297
|
+
const head = buffer.toString("utf-8", 0, bytesRead);
|
|
298
|
+
const match = CWD_RE.exec(head);
|
|
299
|
+
if (!match) return null;
|
|
300
|
+
try {
|
|
301
|
+
return JSON.parse(`"${match[1]}"`);
|
|
302
|
+
} catch {
|
|
303
|
+
return match[1];
|
|
304
|
+
}
|
|
305
|
+
} catch {
|
|
306
|
+
return null;
|
|
307
|
+
} finally {
|
|
308
|
+
if (fd !== null) {
|
|
309
|
+
try {
|
|
310
|
+
closeSync(fd);
|
|
311
|
+
} catch {
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
function collectCandidatesInDir(dir, afterMs) {
|
|
317
|
+
let entries;
|
|
318
|
+
try {
|
|
319
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
320
|
+
} catch {
|
|
321
|
+
return [];
|
|
322
|
+
}
|
|
323
|
+
const candidates = [];
|
|
324
|
+
for (const entry of entries) {
|
|
325
|
+
if (!entry.isFile()) continue;
|
|
326
|
+
const match = SESSION_FILENAME_RE.exec(entry.name);
|
|
327
|
+
if (!match) continue;
|
|
328
|
+
const fullPath = join(dir, entry.name);
|
|
329
|
+
let mtime;
|
|
330
|
+
try {
|
|
331
|
+
mtime = statSync(fullPath).mtimeMs;
|
|
332
|
+
} catch {
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
if (mtime + 1 < afterMs) continue;
|
|
336
|
+
candidates.push({ path: fullPath, id: match[1], mtime });
|
|
337
|
+
}
|
|
338
|
+
return candidates;
|
|
339
|
+
}
|
|
340
|
+
function pickStrictMatch(candidates, cwd) {
|
|
341
|
+
for (const candidate of [...candidates].sort((a, b) => b.mtime - a.mtime)) {
|
|
342
|
+
if (readSessionCwd(candidate.path) === cwd) return candidate.id;
|
|
343
|
+
}
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
function findLatestClaudeSessionIdForCwd(cwd, afterMs) {
|
|
347
|
+
const projectsDir = getClaudeProjectsDir();
|
|
348
|
+
const derivedDir = join(projectsDir, encodeClaudeProjectDir(cwd));
|
|
349
|
+
const derivedCandidates = existsSync(derivedDir) ? collectCandidatesInDir(derivedDir, afterMs) : [];
|
|
350
|
+
const strictLocal = pickStrictMatch(derivedCandidates, cwd);
|
|
351
|
+
if (strictLocal) return strictLocal;
|
|
352
|
+
let projectDirs = [];
|
|
353
|
+
try {
|
|
354
|
+
projectDirs = readdirSync(projectsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => join(projectsDir, entry.name)).filter((path) => path !== derivedDir);
|
|
355
|
+
} catch {
|
|
356
|
+
projectDirs = [];
|
|
357
|
+
}
|
|
358
|
+
for (const dir of projectDirs) {
|
|
359
|
+
const strict = pickStrictMatch(collectCandidatesInDir(dir, afterMs), cwd);
|
|
360
|
+
if (strict) return strict;
|
|
361
|
+
}
|
|
362
|
+
const newestUnreadable = [...derivedCandidates].sort((a, b) => b.mtime - a.mtime).find((candidate) => readSessionCwd(candidate.path) === null);
|
|
363
|
+
return newestUnreadable ? newestUnreadable.id : null;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const MAX_BUFFER_LENGTH = 2e5;
|
|
367
|
+
const DEFAULT_COLS = 100;
|
|
368
|
+
const DEFAULT_ROWS = 30;
|
|
369
|
+
const SESSION_CAPTURE_INTERVAL_MS = 400;
|
|
370
|
+
const SESSION_CAPTURE_FAST_WINDOW_MS = 12e3;
|
|
371
|
+
const SESSION_CAPTURE_SLOW_INTERVAL_MS = 2e3;
|
|
372
|
+
const SESSION_CAPTURE_MAX_MS = 5 * 6e4;
|
|
373
|
+
const DEAD_SESSION_TTL_MS = 5 * 6e4;
|
|
374
|
+
const sessions = /* @__PURE__ */ new Map();
|
|
375
|
+
function detectCodexCliPath() {
|
|
376
|
+
if (typeof process.env.CODEX_CLI_PATH === "string" && process.env.CODEX_CLI_PATH.length > 0 && existsSync(process.env.CODEX_CLI_PATH)) {
|
|
377
|
+
return process.env.CODEX_CLI_PATH;
|
|
378
|
+
}
|
|
379
|
+
const candidates = [
|
|
380
|
+
join(process.env.HOME || "", ".local/bin/codex"),
|
|
381
|
+
"/usr/local/bin/codex",
|
|
382
|
+
"/usr/bin/codex"
|
|
383
|
+
];
|
|
384
|
+
for (const candidate of candidates) {
|
|
385
|
+
if (existsSync(candidate)) return candidate;
|
|
386
|
+
}
|
|
387
|
+
try {
|
|
388
|
+
const whichResult = execSync("which codex 2>/dev/null", { encoding: "utf-8" }).trim();
|
|
389
|
+
return whichResult && existsSync(whichResult) ? whichResult : null;
|
|
390
|
+
} catch {
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function getCodexCliPath() {
|
|
395
|
+
const cliPath = detectCodexCliPath();
|
|
396
|
+
if (!cliPath) {
|
|
397
|
+
throw new Error("Codex CLI not found. Install codex CLI or set CODEX_CLI_PATH.");
|
|
398
|
+
}
|
|
399
|
+
return cliPath;
|
|
400
|
+
}
|
|
401
|
+
function resolveTerminalCommand(providerId, modelKey, resumeSessionId) {
|
|
402
|
+
if (providerId === "codex") {
|
|
403
|
+
const args2 = resumeSessionId ? ["resume", resumeSessionId, "--dangerously-bypass-approvals-and-sandbox"] : ["--dangerously-bypass-approvals-and-sandbox"];
|
|
404
|
+
if (modelKey) {
|
|
405
|
+
args2.push("--model", modelKey);
|
|
406
|
+
}
|
|
407
|
+
return {
|
|
408
|
+
command: getCodexCliPath(),
|
|
409
|
+
args: args2
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
const args = ["--dangerously-skip-permissions"];
|
|
413
|
+
if (resumeSessionId) {
|
|
414
|
+
args.unshift("--resume", resumeSessionId);
|
|
415
|
+
}
|
|
416
|
+
return {
|
|
417
|
+
command: getClaudeCliPath(),
|
|
418
|
+
args
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
function resolveSafeCwd(cwd) {
|
|
422
|
+
const fallback = getProjectDir() || process.cwd();
|
|
423
|
+
const candidate = typeof cwd === "string" && cwd.trim().length > 0 ? cwd : fallback;
|
|
424
|
+
try {
|
|
425
|
+
if (!existsSync(candidate)) return fallback;
|
|
426
|
+
return realpathSync(candidate);
|
|
427
|
+
} catch {
|
|
428
|
+
return fallback;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function trimBuffer(buffer) {
|
|
432
|
+
if (buffer.length <= MAX_BUFFER_LENGTH) return buffer;
|
|
433
|
+
return buffer.slice(buffer.length - MAX_BUFFER_LENGTH);
|
|
434
|
+
}
|
|
435
|
+
function getTerminalSession(sessionId) {
|
|
436
|
+
return sessions.get(sessionId);
|
|
437
|
+
}
|
|
438
|
+
function getOrCreateTerminalSession(options) {
|
|
439
|
+
var _a;
|
|
440
|
+
const existing = sessions.get(options.sessionId);
|
|
441
|
+
if (existing && existing.exitCode === null) {
|
|
442
|
+
existing.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
443
|
+
return existing;
|
|
444
|
+
}
|
|
445
|
+
const cwd = resolveSafeCwd(options.cwd);
|
|
446
|
+
const { command, args } = resolveTerminalCommand(options.providerId, options.modelKey, options.resumeSessionId);
|
|
447
|
+
let hookEnv = {};
|
|
448
|
+
if ((_a = options.hookContext) == null ? void 0 : _a.enabled) {
|
|
449
|
+
const injection = prepareCliHookInjection({
|
|
450
|
+
providerId: options.hookContext.providerId,
|
|
451
|
+
conversationId: options.hookContext.conversationId,
|
|
452
|
+
jobId: options.hookContext.jobId,
|
|
453
|
+
requestId: options.hookContext.requestId
|
|
454
|
+
});
|
|
455
|
+
hookEnv = { ...injection.env };
|
|
456
|
+
if (options.providerId === "codex") {
|
|
457
|
+
const codexHome = resolveCodexHomeForSpawn(false, options.hookContext.conversationId);
|
|
458
|
+
if (codexHome) {
|
|
459
|
+
writeCodexHooks(codexHome, injection.runnerPath);
|
|
460
|
+
hookEnv.CODEX_HOME = codexHome;
|
|
461
|
+
}
|
|
462
|
+
args.push("--dangerously-bypass-hook-trust");
|
|
463
|
+
} else {
|
|
464
|
+
writeClaudeLocalSettings(cwd, injection.runnerPath);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
const cols = Number.isFinite(options.cols) && options.cols > 0 ? Math.floor(options.cols) : DEFAULT_COLS;
|
|
468
|
+
const rows = Number.isFinite(options.rows) && options.rows > 0 ? Math.floor(options.rows) : DEFAULT_ROWS;
|
|
469
|
+
const spawnedAtMs = Date.now();
|
|
470
|
+
const ptyProcess = spawn(command, args, {
|
|
471
|
+
name: "xterm-256color",
|
|
472
|
+
cols,
|
|
473
|
+
rows,
|
|
474
|
+
cwd,
|
|
475
|
+
env: {
|
|
476
|
+
...process.env,
|
|
477
|
+
TERM: "xterm-256color",
|
|
478
|
+
COLORTERM: "truecolor",
|
|
479
|
+
SPEC_CAT_TERMINAL: "1",
|
|
480
|
+
HOME: process.env.HOME || homedir(),
|
|
481
|
+
PWD: cwd,
|
|
482
|
+
...hookEnv
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
const session = {
|
|
486
|
+
id: options.sessionId,
|
|
487
|
+
cwd,
|
|
488
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
489
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
490
|
+
process: ptyProcess,
|
|
491
|
+
buffer: "",
|
|
492
|
+
cols,
|
|
493
|
+
rows,
|
|
494
|
+
exitCode: null,
|
|
495
|
+
onDataCallbacks: /* @__PURE__ */ new Set(),
|
|
496
|
+
onExitCallbacks: /* @__PURE__ */ new Set()
|
|
497
|
+
};
|
|
498
|
+
ptyProcess.onData((data) => {
|
|
499
|
+
session.buffer = trimBuffer(session.buffer + data);
|
|
500
|
+
session.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
501
|
+
for (const callback of session.onDataCallbacks) {
|
|
502
|
+
callback(data);
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
ptyProcess.onExit(({ exitCode }) => {
|
|
506
|
+
session.exitCode = exitCode;
|
|
507
|
+
session.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
508
|
+
for (const callback of session.onExitCallbacks) {
|
|
509
|
+
callback(exitCode);
|
|
510
|
+
}
|
|
511
|
+
setTimeout(() => {
|
|
512
|
+
const current = sessions.get(options.sessionId);
|
|
513
|
+
if (current === session && current.exitCode !== null) {
|
|
514
|
+
sessions.delete(options.sessionId);
|
|
515
|
+
}
|
|
516
|
+
}, DEAD_SESSION_TTL_MS);
|
|
517
|
+
});
|
|
518
|
+
sessions.set(options.sessionId, session);
|
|
519
|
+
if (!options.resumeSessionId && options.onProviderSessionId) {
|
|
520
|
+
const find = options.providerId === "codex" ? findLatestCodexSessionIdForCwd : findLatestClaudeSessionIdForCwd;
|
|
521
|
+
captureProviderSessionId(session, cwd, spawnedAtMs, find, options.onProviderSessionId);
|
|
522
|
+
}
|
|
523
|
+
return session;
|
|
524
|
+
}
|
|
525
|
+
function captureProviderSessionId(session, cwd, afterMs, find, onProviderSessionId) {
|
|
526
|
+
const deadline = afterMs + SESSION_CAPTURE_MAX_MS;
|
|
527
|
+
const fastUntil = afterMs + SESSION_CAPTURE_FAST_WINDOW_MS;
|
|
528
|
+
const attempt = () => {
|
|
529
|
+
const sessionId = find(cwd, afterMs);
|
|
530
|
+
if (sessionId) {
|
|
531
|
+
try {
|
|
532
|
+
onProviderSessionId(sessionId);
|
|
533
|
+
} catch {
|
|
534
|
+
}
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
if (session.exitCode !== null || Date.now() >= deadline) return;
|
|
538
|
+
const nextInterval = Date.now() < fastUntil ? SESSION_CAPTURE_INTERVAL_MS : SESSION_CAPTURE_SLOW_INTERVAL_MS;
|
|
539
|
+
setTimeout(attempt, nextInterval);
|
|
540
|
+
};
|
|
541
|
+
setTimeout(attempt, SESSION_CAPTURE_INTERVAL_MS);
|
|
542
|
+
}
|
|
543
|
+
function subscribeTerminalSession(session, handlers) {
|
|
544
|
+
session.onDataCallbacks.add(handlers.onData);
|
|
545
|
+
session.onExitCallbacks.add(handlers.onExit);
|
|
546
|
+
return () => {
|
|
547
|
+
session.onDataCallbacks.delete(handlers.onData);
|
|
548
|
+
session.onExitCallbacks.delete(handlers.onExit);
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
function writeTerminalInput(sessionId, data) {
|
|
552
|
+
const session = sessions.get(sessionId);
|
|
553
|
+
if (!session || session.exitCode !== null) return false;
|
|
554
|
+
session.process.write(data);
|
|
555
|
+
session.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
556
|
+
return true;
|
|
557
|
+
}
|
|
558
|
+
function resizeTerminal(sessionId, cols, rows) {
|
|
559
|
+
const session = sessions.get(sessionId);
|
|
560
|
+
if (!session || session.exitCode !== null) return false;
|
|
561
|
+
if (!Number.isFinite(cols) || !Number.isFinite(rows) || cols <= 0 || rows <= 0) return false;
|
|
562
|
+
session.cols = Math.floor(cols);
|
|
563
|
+
session.rows = Math.floor(rows);
|
|
564
|
+
session.process.resize(session.cols, session.rows);
|
|
565
|
+
session.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
566
|
+
return true;
|
|
567
|
+
}
|
|
568
|
+
function buildTerminalSessionId(conversationId) {
|
|
569
|
+
return `conversation:${conversationId}`;
|
|
570
|
+
}
|
|
571
|
+
function disposeTerminalSession(sessionId) {
|
|
572
|
+
const session = sessions.get(sessionId);
|
|
573
|
+
if (!session) return;
|
|
574
|
+
try {
|
|
575
|
+
session.process.kill();
|
|
576
|
+
} catch {
|
|
577
|
+
}
|
|
578
|
+
sessions.delete(sessionId);
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
export { getOrCreateTerminalSession as a, buildTerminalSessionId as b, getTerminalSession as c, disposeTerminalSession as d, getCliHookSpoolPath as g, parseCliHookRecord as p, resizeTerminal as r, subscribeTerminalSession as s, writeTerminalInput as w };
|
|
582
|
+
//# sourceMappingURL=terminalSessions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalSessions.mjs","sources":["../../../../server/utils/cliHookInjection.ts","../../../../server/utils/claude.ts","../../../../server/utils/codexRollout.ts","../../../../server/utils/claudeSession.ts","../../../../server/utils/terminalSessions.ts"],"names":["CWD_RE","HEAD_BYTES","args"],"mappings":"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"}
|