✨ feat(vscode): URI 开的会话不再登记进会话管理列表

delegate-fix 等外部方通过 create-session URI 开的一次性会话,
不写入 .spx/session-names.json,也跳过 sessionId 轮询捕获;
面板内手动创建的会话仍照常登记。

Claude-Session: https://claude.ai/code/session_01Kgmb1LvrPmFX3NoUDB4zZC
This commit is contained in:
cruldra committed 2026-09-13 10:07:30 +08:00
1 parent 5bfd759822
commit b182e0ac5b
3 files changed
+13 -6

No files matched your search

+1 -1
View File
@@ -2,7 +2,7 @@
"publisher": "clurdra", "publisher": "clurdra",
"name": "superpowers-vscode-clurdra", "name": "superpowers-vscode-clurdra",
"displayName": "Superpowers-clurdra", "displayName": "Superpowers-clurdra",
"version": "0.2.131", "version": "0.2.132",
"packageManager": "pnpm@10.27.0", "packageManager": "pnpm@10.27.0",
"description": "Superpowers specs and plans Kanban explorer", "description": "Superpowers specs and plans Kanban explorer",
"author": "clurdra", "author": "clurdra",
+11 -5
View File
@@ -65,14 +65,17 @@ export interface CreateCcSessionTabOptions {
cwd?: string cwd?: string
/** 有 panel 时登记存活终端并推全量列表;panel 外触发(如 URI handler)传 null。 */ /** 有 panel 时登记存活终端并推全量列表;panel 外触发(如 URI handler)传 null。 */
panel: KanbanWebviewPanel | null panel: KanbanWebviewPanel | null
/** 是否把会话登记进 managed store(会话管理列表);委派类一次性会话传 false。 */
register: boolean
} }
/** /**
* 创建 cc 会话终端 tab 并登记 managed store(核心逻辑,不要求 panel): * 创建 cc 会话终端 tab(核心逻辑,不要求 panel):
* - 启动命令统一由 buildCcCommand 构建(claude --dangerously-skip-permissions * - 启动命令统一由 buildCcCommand 构建(claude --dangerously-skip-permissions
* --settings '<profilePath>'),prompt 非空时作为位置参数传入。 * --settings '<profilePath>'),prompt 非空时作为位置参数传入。
* - 用 pollForNewSession 捕获新 sessionId(共享 projects 目录用轮询更可靠), * - register 为 true 时用 pollForNewSession 捕获新 sessionId(共享 projects 目录用轮询更可靠),
* 落进 workspaceRoot 的 .spx/session-names.json;有 panel 时再登记终端并推全量列表。 * 落进 workspaceRoot 的 .spx/session-names.json;有 panel 时再登记终端并推全量列表。
* - register 为 false 时只开终端,不落 store、不进会话管理列表。
* *
* 校验失败时 showErrorMessage 并返回 undefined;成功返回终端名。 * 校验失败时 showErrorMessage 并返回 undefined;成功返回终端名。
*/ */
@@ -120,7 +123,10 @@ export async function createCcSessionTab(opts: CreateCcSessionTabOptions): Promi
} }
// managed 会话的 projects 目录是繁忙共享目录,fs.watch 会漏 rename;改用轮询 diff。 // managed 会话的 projects 目录是繁忙共享目录,fs.watch 会漏 rename;改用轮询 diff。
const watchPromise = pollForNewSession({ projectsDir: projDir, timeoutMs: 120_000 }) // 不登记的会话无需捕获 sessionId,省掉这趟轮询。
const watchPromise = opts.register
? pollForNewSession({ projectsDir: projDir, timeoutMs: 120_000 })
: null
// 终端名:用户填了会话名字就用它,否则用默认 cc-会话。 // 终端名:用户填了会话名字就用它,否则用默认 cc-会话。
// (VS Code 终端创建后不能改名,所以只在 createTerminal 时设定。) // (VS Code 终端创建后不能改名,所以只在 createTerminal 时设定。)
@@ -140,7 +146,7 @@ export async function createCcSessionTab(opts: CreateCcSessionTabOptions): Promi
terminal.sendText(cmd) terminal.sendText(cmd)
// Fire-and-forget:会话 jsonl 出现后写进 store;有 panel 再登记终端并推全量列表。 // Fire-and-forget:会话 jsonl 出现后写进 store;有 panel 再登记终端并推全量列表。
watchPromise.then(async (sid) => { watchPromise?.then(async (sid) => {
if (!sid) { if (!sid) {
logger.add({ logger.add({
level: 'warn', level: 'warn',
@@ -191,7 +197,7 @@ export async function handleManagedSessionsCreate(panel: KanbanWebviewPanel, pro
return return
} }
const created = await createCcSessionTab({ workspaceRoot, profilePath, name, prompt, panel }) const created = await createCcSessionTab({ workspaceRoot, profilePath, name, prompt, panel, register: true })
if (!created) if (!created)
return return
@@ -81,6 +81,7 @@ async function handleCreateSessionUri(uri: Uri): Promise<void> {
prompt, prompt,
cwd, cwd,
panel: null, panel: null,
register: false,
}) })
if (!created) if (!created)
return return