dsh-lark-bot 0.2.7 → 0.3.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 +19 -6
- package/SECURITY.md +42 -0
- package/dist/cli.js +2729 -1111
- package/dist/cli.js.map +1 -1
- package/package.json +4 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/cli/commands/doctor.ts","../src/adapters/dsh/availability.ts","../src/config/app-paths.ts","../src/config/env.ts","../src/config/dsh-runtime.ts","../src/config/profile-store.ts","../src/platform/atomic-write.ts","../src/cli/commands/start.ts","../src/adapters/dsh/adapter.ts","../src/adapters/dsh/translate.ts","../src/bot/active-runs.ts","../src/bot/pending-queue.ts","../src/bot/run-policy.ts","../src/bridge/channel.ts","../src/commands/index.ts","../src/card/workspace-card.ts","../src/core/logger.ts","../src/bridge/lark-channel.ts","../src/bridge/run-flow.ts","../src/card/run-state.ts","../src/card/run-renderer.ts","../src/config/access-manager.ts","../src/onboard/registration.ts","../src/media/attachments.ts","../src/session/store.ts","../src/workspace/git-worktree.ts","../src/workspace/store.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { runDoctor } from './cli/commands/doctor.js';\nimport { runStart } from './cli/commands/start.js';\n\nfunction packageVersion(): string {\n const raw = readFileSync(new URL('../package.json', import.meta.url), 'utf8');\n const pkg = JSON.parse(raw) as { version?: unknown };\n return typeof pkg.version === 'string' ? pkg.version : '0.0.0';\n}\n\nexport interface StartOptions {\n profile?: string;\n workspace?: string;\n appId?: string;\n appSecret?: string;\n tenant?: string;\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name('dsh-lark-bot')\n .description('Bridge DeepSeek Harness into Feishu / Lark')\n .version(packageVersion(), '-v, --version');\n\n program\n .command('start')\n .description('Start the bridge in the foreground')\n .option('--profile <name>', 'profile name')\n .option('--workspace <path>', 'initial working directory')\n .option('--app-id <id>', 'existing Lark/Feishu app id')\n .option('--app-secret <secret>', 'existing Lark/Feishu app secret')\n .option('--tenant <tenant>', 'feishu or lark')\n .action(async (opts: StartOptions) => {\n await runStart(opts);\n });\n\n program\n .command('doctor')\n .description('Run local diagnostics')\n .option('--profile <name>', 'profile name')\n .option('--workspace <path>', 'initial working directory')\n .option('--app-id <id>', 'existing Lark/Feishu app id')\n .option('--app-secret <secret>', 'existing Lark/Feishu app secret')\n .option('--tenant <tenant>', 'feishu or lark')\n .action(async (opts: StartOptions) => {\n await runDoctor({ ...opts, version: packageVersion() });\n });\n\n return program;\n}\n\nexport async function main(argv: readonly string[] = process.argv): Promise<void> {\n await buildProgram().parseAsync([...argv]);\n}\n","import { stat } from 'node:fs/promises';\nimport { checkDshAvailability } from '../../adapters/dsh/availability.js';\nimport { resolveAppPaths } from '../../config/app-paths.js';\nimport { loadRuntimeEnv } from '../../config/env.js';\nimport { ConfigStore } from '../../config/profile-store.js';\nimport type { StartOptions } from '../../cli.js';\n\nexport interface DoctorOptions extends StartOptions {\n version?: string;\n output?: (text: string) => void;\n}\n\nexport async function runDoctor(options: DoctorOptions): Promise<void> {\n const env = loadRuntimeEnv({\n ...process.env,\n ...(options.workspace ? { DSH_LARK_WORKSPACE: options.workspace } : {}),\n ...(options.tenant ? { DSH_LARK_TENANT: options.tenant } : {}),\n ...(options.appId ? { DSH_LARK_APP_ID: options.appId } : {}),\n ...(options.appSecret ? { DSH_LARK_APP_SECRET: options.appSecret } : {}),\n });\n const paths = resolveAppPaths(env.home);\n const profileName = options.profile ?? 'default';\n const store = new ConfigStore(paths.configFile);\n await store.load();\n const profile = store.getProfile(profileName);\n\n const lines: string[] = [\n 'dsh-lark-bot doctor',\n `version: ${options.version ?? 'unknown'}`,\n `node: ${process.version}`,\n `profile: ${profileName}`,\n `home: ${paths.root}`,\n `dsh_command: ${env.dshCommand}`,\n `dsh_args: ${env.dshArgs.join(',')}`,\n ];\n\n let critical = false;\n\n if (!profile) {\n lines.push('config: missing');\n critical = true;\n } else {\n lines.push(\n [\n 'config: ok',\n `tenant=${profile.tenant}`,\n `app_id=${profile.accounts.appId}`,\n `app_secret=${profile.accounts.appSecret ? 'present' : 'missing'}`,\n `allowed_users=${profile.access.allowedUsers.length}`,\n `allowed_chats=${profile.access.allowedChats.length}`,\n ].join(' '),\n );\n if (!profile.accounts.appId || !profile.accounts.appSecret) critical = true;\n }\n\n const workspace =\n options.workspace ??\n profile?.workspaces.default ??\n env.workspace ??\n paths.profilePath(profileName, 'workspace');\n try {\n const info = await stat(workspace);\n lines.push(`workspace: ${workspace} (${info.isDirectory() ? 'directory' : 'not-directory'})`);\n } catch {\n lines.push(`workspace: ${workspace} (missing)`);\n }\n\n const availability = await checkDshAvailability({\n command: env.dshCommand,\n args: env.dshArgs,\n });\n if (availability.ok) {\n lines.push(`dsh: ok${availability.version ? ` (${availability.version})` : ''}`);\n } else {\n lines.push(`dsh: unavailable (${availability.error ?? 'unknown'})`);\n critical = true;\n }\n\n const output = options.output ?? ((text: string) => process.stdout.write(text));\n output(`${lines.join('\\n')}\\n`);\n if (critical) process.exitCode = 1;\n}\n","import { spawn } from 'cross-spawn';\nimport { existsSync } from 'node:fs';\nimport type { AgentAvailability } from '../types.js';\n\nexport interface AvailabilityCheckOptions {\n command: string;\n args?: string[];\n timeoutMs?: number;\n}\n\nexport async function checkDshAvailability(\n options: AvailabilityCheckOptions,\n): Promise<AgentAvailability> {\n const timeoutMs = options.timeoutMs ?? 5_000;\n const versionArgs = options.command === 'node' && options.args?.[0] && existsSync(options.args[0])\n ? [options.args[0], '--version']\n : ['--version'];\n\n return new Promise((resolve) => {\n const child = spawn(options.command, versionArgs, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const finish = (result: AgentAvailability): void => {\n if (settled) return;\n settled = true;\n resolve(result);\n };\n\n const timer = setTimeout(() => {\n child.kill('SIGKILL');\n finish({ ok: false, error: `timed out after ${timeoutMs}ms`, version: undefined });\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString('utf8');\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString('utf8');\n });\n child.on('error', (error) => {\n clearTimeout(timer);\n finish({ ok: false, error: error.message, version: undefined });\n });\n child.on('exit', (code) => {\n clearTimeout(timer);\n const version = stdout.trim();\n if (code !== 0 && !version) {\n finish({ ok: false, error: stderr.trim() || `exited with code ${String(code)}`, version: undefined });\n return;\n }\n finish({ ok: true, error: undefined, version: version || undefined });\n });\n });\n}\n","import { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\n\nexport interface AppPaths {\n root: string;\n configFile: string;\n activeProfileFile: string;\n profileDir: (profile: string) => string;\n profilePath: (profile: string, ...parts: string[]) => string;\n sessionsFile: (profile: string) => string;\n sessionCatalogFile: (profile: string) => string;\n workspacesFile: (profile: string) => string;\n mediaDir: (profile: string) => string;\n logsDir: (profile: string) => string;\n registryFile: string;\n locksDir: string;\n}\n\nexport function defaultHome(): string {\n const override = process.env.DSH_LARK_HOME?.trim();\n return override ? resolve(override) : join(homedir(), '.dsh-lark');\n}\n\nexport function resolveAppPaths(root: string = defaultHome()): AppPaths {\n const profileDir = (profile: string): string => join(root, 'profiles', profile);\n const profilePath = (profile: string, ...parts: string[]): string =>\n join(profileDir(profile), ...parts);\n\n return {\n root,\n configFile: join(root, 'config.json'),\n activeProfileFile: join(root, 'active-profile'),\n profileDir,\n profilePath,\n sessionsFile: (profile) => profilePath(profile, 'sessions.json'),\n sessionCatalogFile: (profile) => profilePath(profile, 'sessions.json.catalog.json'),\n workspacesFile: (profile) => profilePath(profile, 'workspaces.json'),\n mediaDir: (profile) => profilePath(profile, 'media'),\n logsDir: (profile) => profilePath(profile, 'logs'),\n registryFile: join(root, 'registry', 'processes.json'),\n locksDir: join(root, 'registry', 'locks'),\n };\n}\n","import { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { resolveDshRuntime } from './dsh-runtime.js';\n\nexport type LarkTenant = 'feishu' | 'lark';\n\nexport interface RuntimeEnv {\n home: string;\n tenant: LarkTenant;\n appId: string | undefined;\n appSecret: string | undefined;\n workspace: string | undefined;\n dshCommand: string;\n dshArgs: string[];\n provider: string;\n model: string;\n runTimeoutMs: number;\n stopGraceMs: number;\n}\n\nconst DEFAULTS = {\n tenant: 'feishu' as const,\n provider: 'deepseek-official',\n model: 'deepseek-v4-flash',\n runTimeoutMs: 300_000,\n stopGraceMs: 5_000,\n};\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction parseTenant(value: string | undefined): LarkTenant {\n const tenant = nonEmpty(value) ?? DEFAULTS.tenant;\n if (tenant !== 'feishu' && tenant !== 'lark') {\n throw new Error(`DSH_LARK_TENANT must be \"feishu\" or \"lark\", got \"${tenant}\"`);\n }\n return tenant;\n}\n\nfunction parseDshArgs(value: string | undefined): string[] {\n const raw = value?.trim();\n if (!raw) return [];\n return raw\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction parseTimeout(value: string | undefined): number {\n const raw = value?.trim();\n if (!raw) return DEFAULTS.runTimeoutMs;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`DSH_LARK_RUN_TIMEOUT_MS must be a non-negative integer, got \"${raw}\"`);\n }\n return parsed;\n}\n\nfunction parseStopGrace(value: string | undefined): number {\n const raw = value?.trim();\n if (!raw) return DEFAULTS.stopGraceMs;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`DSH_LARK_STOP_GRACE_MS must be a non-negative integer, got \"${raw}\"`);\n }\n return parsed;\n}\n\nexport function loadRuntimeEnv(\n source: NodeJS.ProcessEnv = process.env,\n): RuntimeEnv {\n const homeOverride = nonEmpty(source.DSH_LARK_HOME);\n const workspace = nonEmpty(source.DSH_LARK_WORKSPACE);\n const home = homeOverride ? resolve(homeOverride) : join(homedir(), '.dsh-lark');\n const osHome = homedir();\n const dshCommand = nonEmpty(source.DSH_LARK_DSH_COMMAND);\n const rawDshArgs = nonEmpty(source.DSH_LARK_DSH_ARGS);\n const dshRuntime = resolveDshRuntime({\n home: osHome,\n env: source,\n ...(dshCommand ? { command: dshCommand } : {}),\n ...(rawDshArgs ? { args: parseDshArgs(rawDshArgs) } : {}),\n });\n\n return {\n home,\n tenant: parseTenant(source.DSH_LARK_TENANT),\n appId: nonEmpty(source.DSH_LARK_APP_ID),\n appSecret: nonEmpty(source.DSH_LARK_APP_SECRET),\n workspace: workspace ? resolve(workspace) : undefined,\n dshCommand: dshRuntime.command,\n dshArgs: dshRuntime.args,\n provider: nonEmpty(source.DSH_LARK_PROVIDER) ?? DEFAULTS.provider,\n model: nonEmpty(source.DSH_LARK_MODEL) ?? DEFAULTS.model,\n runTimeoutMs: parseTimeout(source.DSH_LARK_RUN_TIMEOUT_MS),\n stopGraceMs: parseStopGrace(source.DSH_LARK_STOP_GRACE_MS),\n };\n}\n","import { existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface DshRuntimeSpec {\n command: string;\n args: string[];\n bin?: string;\n}\n\nconst DS_HARNESS_RELATIVE = join('@deepseek-ai', 'dsh', 'lib', 'bin.js');\n\nfunction firstExisting(...paths: string[]): string | undefined {\n return paths.find((path) => existsSync(path));\n}\n\nfunction children(root: string): string[] {\n try {\n return readdirSync(root, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() || entry.isSymbolicLink())\n .map((entry) => join(root, entry.name));\n } catch {\n return [];\n }\n}\n\nexport function discoverDshBin(\n home: string,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const dshHome = env.DSH_HOME?.trim() || join(home, '.dsh');\n\n const candidates = [\n join(dshHome, 'profiles', 'node_modules', DS_HARNESS_RELATIVE),\n join(home, '.npm', '_npx', 'node_modules', DS_HARNESS_RELATIVE),\n join(home, '.cache', 'pnpm', 'dlx', 'node_modules', DS_HARNESS_RELATIVE),\n join(home, '.local', 'share', 'pnpm', 'node_modules', DS_HARNESS_RELATIVE),\n ];\n\n const direct = firstExisting(...candidates);\n if (direct) return direct;\n\n for (const root of [join(home, '.npm', '_npx'), join(home, '.cache', 'pnpm', 'dlx')]) {\n for (const child of children(root)) {\n const path = join(child, 'node_modules', DS_HARNESS_RELATIVE);\n if (existsSync(path)) return path;\n }\n }\n\n return undefined;\n}\n\nexport function resolveDshRuntime(\n input: {\n command?: string;\n args?: string[];\n home: string;\n env?: NodeJS.ProcessEnv;\n },\n): DshRuntimeSpec {\n if (input.command || input.args) {\n return {\n command: input.command ?? 'node',\n args: input.args ?? ['--profile', 'headless'],\n };\n }\n\n const bin = discoverDshBin(input.home, input.env);\n if (bin) {\n return {\n command: 'node',\n args: [bin, '--profile', 'headless'],\n bin,\n };\n }\n\n return {\n command: 'dsh',\n args: ['--profile', 'headless'],\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { writeFileAtomic } from '../platform/atomic-write.js';\nimport type { LarkTenant } from './env.js';\n\nexport interface ProfileConfig {\n schemaVersion: 1;\n agentKind: 'dsh';\n tenant: LarkTenant;\n accounts: {\n appId: string;\n appSecret: string;\n };\n workspaces: {\n default: string | undefined;\n };\n preferences: {\n model: string | undefined;\n stopGraceMs: number | undefined;\n runTimeoutMs: number | undefined;\n };\n access: {\n allowedUsers: string[];\n allowedChats: string[];\n admins: string[];\n };\n}\n\nexport interface RootConfig {\n schemaVersion: 1;\n activeProfile: string;\n profiles: Record<string, ProfileConfig>;\n}\n\nexport class ConfigStore {\n private data: RootConfig | undefined;\n\n constructor(private readonly path: string) {}\n\n async load(): Promise<RootConfig> {\n try {\n const raw = await readFile(this.path, 'utf8');\n const parsed = JSON.parse(raw) as Partial<RootConfig>;\n this.data = {\n schemaVersion: 1,\n activeProfile: parsed.activeProfile ?? 'default',\n profiles: Object.fromEntries(\n Object.entries(parsed.profiles ?? {}).map(([name, profile]) => [\n name,\n {\n ...profile,\n access: {\n allowedUsers: profile.access?.allowedUsers ?? [],\n allowedChats: profile.access?.allowedChats ?? [],\n admins: profile.access?.admins ?? [],\n },\n },\n ]),\n ),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n this.data = {\n schemaVersion: 1,\n activeProfile: 'default',\n profiles: {},\n };\n }\n return this.data;\n }\n\n getActiveProfile(): ProfileConfig | undefined {\n const data = this.getData();\n return data.profiles[data.activeProfile];\n }\n\n getProfile(name: string): ProfileConfig | undefined {\n const data = this.getData();\n return data.profiles[name];\n }\n\n async saveProfile(\n name: string,\n input: {\n tenant: LarkTenant;\n appId: string;\n appSecret: string;\n workspace?: string;\n model?: string;\n stopGraceMs?: number;\n runTimeoutMs?: number;\n operatorOpenId?: string;\n access?: {\n allowedUsers?: string[];\n allowedChats?: string[];\n admins?: string[];\n };\n },\n ): Promise<void> {\n const data = this.getData();\n const existing = data.profiles[name];\n const profile: ProfileConfig = {\n schemaVersion: 1,\n agentKind: 'dsh',\n tenant: input.tenant,\n accounts: {\n appId: input.appId,\n appSecret: input.appSecret,\n },\n workspaces: {\n default: input.workspace ?? existing?.workspaces.default ?? undefined,\n },\n preferences: {\n model: input.model ?? existing?.preferences.model ?? undefined,\n stopGraceMs: input.stopGraceMs ?? existing?.preferences.stopGraceMs ?? undefined,\n runTimeoutMs: input.runTimeoutMs ?? existing?.preferences.runTimeoutMs ?? undefined,\n },\n access: {\n allowedUsers: input.access?.allowedUsers ?? existing?.access?.allowedUsers ?? [],\n allowedChats: input.access?.allowedChats ?? existing?.access?.allowedChats ?? [],\n admins: input.access?.admins ?? existing?.access?.admins ?? [],\n },\n };\n if (input.operatorOpenId && !profile.access.allowedUsers.includes(input.operatorOpenId)) {\n profile.access.allowedUsers.push(input.operatorOpenId);\n profile.access.admins.push(input.operatorOpenId);\n }\n data.profiles[name] = profile;\n data.activeProfile = name;\n await this.persist();\n }\n\n private getData(): RootConfig {\n if (!this.data) {\n throw new Error('ConfigStore must be loaded before use');\n }\n return this.data;\n }\n\n private async persist(): Promise<void> {\n const data = this.getData();\n await mkdir(dirname(this.path), { recursive: true });\n await writeFileAtomic(this.path, `${JSON.stringify(data, null, 2)}\\n`, {\n mode: 0o600,\n });\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport { mkdir, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n}\n\nexport async function writeFileAtomic(\n target: string,\n data: string,\n options: AtomicWriteOptions = {},\n): Promise<void> {\n const directory = dirname(target);\n await mkdir(directory, { recursive: true });\n const temporary = join(directory, `.${randomBytes(8).toString('hex')}.tmp`);\n\n try {\n await writeFile(temporary, data, options.mode === undefined ? undefined : { mode: options.mode });\n await rename(temporary, target);\n } catch (error) {\n await rmSilently(temporary);\n throw error;\n }\n}\n\nasync function rmSilently(path: string): Promise<void> {\n const { rm } = await import('node:fs/promises');\n try {\n await rm(path, { force: true });\n } catch {\n // best effort cleanup only\n }\n}\n","import { mkdir } from 'node:fs/promises';\nimport type { LarkChannel, NormalizedMessage } from '@larksuite/channel';\nimport { DshAdapter } from '../../adapters/dsh/adapter.js';\nimport { ActiveRuns } from '../../bot/active-runs.js';\nimport { PendingQueue } from '../../bot/pending-queue.js';\nimport { RunPolicyStore } from '../../bot/run-policy.js';\nimport { startChannel } from '../../bridge/channel.js';\nimport { adaptLarkChannel } from '../../bridge/lark-channel.js';\nimport { runAgentBatch } from '../../bridge/run-flow.js';\nimport type { StreamingChannel } from '../../bridge/types.js';\nimport { resolveAppPaths } from '../../config/app-paths.js';\nimport { AccessManager } from '../../config/access-manager.js';\nimport { loadRuntimeEnv } from '../../config/env.js';\nimport { ConfigStore } from '../../config/profile-store.js';\nimport { log } from '../../core/logger.js';\nimport { onboardPersonalAgent } from '../../onboard/registration.js';\nimport { prepareAttachments } from '../../media/attachments.js';\nimport { SessionStore } from '../../session/store.js';\nimport { GitWorktreeManager } from '../../workspace/git-worktree.js';\nimport { WorkspaceStore } from '../../workspace/store.js';\nimport type { StartOptions } from '../../cli.js';\n\nconst DEBOUNCE_MS = 600;\n\nexport async function runStart(options: StartOptions): Promise<void> {\n const env = loadRuntimeEnv({\n ...process.env,\n ...(options.workspace ? { DSH_LARK_WORKSPACE: options.workspace } : {}),\n ...(options.tenant ? { DSH_LARK_TENANT: options.tenant } : {}),\n ...(options.appId ? { DSH_LARK_APP_ID: options.appId } : {}),\n ...(options.appSecret ? { DSH_LARK_APP_SECRET: options.appSecret } : {}),\n });\n const paths = resolveAppPaths(env.home);\n const profileName = options.profile ?? 'default';\n const configStore = new ConfigStore(paths.configFile);\n await configStore.load();\n const accessManager = new AccessManager(configStore, profileName);\n\n if (env.appId && env.appSecret) {\n const profileInput: Parameters<ConfigStore['saveProfile']>[1] = {\n tenant: env.tenant,\n appId: env.appId,\n appSecret: env.appSecret,\n model: env.model,\n stopGraceMs: env.stopGraceMs,\n runTimeoutMs: env.runTimeoutMs,\n };\n if (env.workspace !== undefined) profileInput.workspace = env.workspace;\n await configStore.saveProfile(profileName, profileInput);\n }\n\n const profile = configStore.getProfile(profileName);\n if (!profile) {\n try {\n const created = await onboardPersonalAgent();\n const onboardingProfile: Parameters<ConfigStore['saveProfile']>[1] = {\n tenant: created.tenant,\n appId: created.appId,\n appSecret: created.appSecret,\n model: env.model,\n stopGraceMs: env.stopGraceMs,\n runTimeoutMs: env.runTimeoutMs,\n };\n if (created.operatorOpenId !== undefined) {\n onboardingProfile.operatorOpenId = created.operatorOpenId;\n }\n if (env.workspace !== undefined) onboardingProfile.workspace = env.workspace;\n await configStore.saveProfile(profileName, onboardingProfile);\n } catch (error) {\n log.fail('onboarding', error);\n process.stderr.write('扫码创建应用失败,未写入本地配置。\\n');\n process.exitCode = 1;\n return;\n }\n }\n\n const activeProfile = configStore.getProfile(profileName);\n if (!activeProfile) {\n process.stderr.write('本地配置读取失败,请检查后重试。\\n');\n process.exitCode = 1;\n return;\n }\n\n const defaultWorkspace =\n options.workspace ??\n activeProfile.workspaces.default ??\n env.workspace ??\n paths.profilePath(profileName, 'workspace');\n await mkdir(defaultWorkspace, { recursive: true });\n\n const sessions = new SessionStore(paths.sessionsFile(profileName));\n const workspaces = new WorkspaceStore(paths.workspacesFile(profileName));\n const worktreeManager = new GitWorktreeManager({\n worktreesRoot: paths.profilePath(profileName, 'worktrees'),\n });\n await Promise.all([sessions.load(), workspaces.load()]);\n\n const adapterOptions: { command: string; args: string[]; stopGraceMs?: number } = {\n command: env.dshCommand,\n args: env.dshArgs,\n stopGraceMs: env.stopGraceMs,\n };\n if (activeProfile.preferences.stopGraceMs !== undefined) {\n Object.assign(adapterOptions, { stopGraceMs: activeProfile.preferences.stopGraceMs });\n }\n const adapter = new DshAdapter(adapterOptions);\n const activeRuns = new ActiveRuns();\n const runPolicies = new RunPolicyStore();\n let streaming: StreamingChannel | undefined;\n let larkChannel: LarkChannel | undefined;\n\n const pending = new PendingQueue<NormalizedMessage>(DEBOUNCE_MS, async (scope, batch) => {\n if (!streaming) return;\n const first = batch[0];\n if (!first) return;\n pending.block(scope);\n try {\n const attachments = await prepareAttachments(\n larkChannel,\n first,\n paths.mediaDir(profileName),\n );\n const messages = [\n first.content,\n ...attachments.textFileNotes,\n ].filter(Boolean);\n const runInput: Parameters<typeof runAgentBatch>[0] = {\n scope,\n chatId: first.chatId,\n messages,\n adapter,\n sessions,\n workspaces,\n workspaceManager: worktreeManager,\n activeRuns,\n runPolicies,\n channel: streaming,\n defaultWorkspace,\n replyTo: first.messageId,\n runTimeoutMs: activeProfile.preferences.runTimeoutMs ?? env.runTimeoutMs,\n images: attachments.imagePaths,\n };\n if (activeProfile.preferences.model !== undefined) runInput.model = activeProfile.preferences.model;\n if (activeProfile.preferences.stopGraceMs !== undefined) {\n runInput.stopGraceMs = activeProfile.preferences.stopGraceMs;\n }\n await runAgentBatch(runInput);\n } finally {\n pending.unblock(scope);\n }\n });\n\n const channelInput: Parameters<typeof startChannel>[0] = {\n appId: activeProfile.accounts.appId,\n appSecret: activeProfile.accounts.appSecret,\n tenant: activeProfile.tenant,\n adapter,\n sessions,\n workspaces,\n activeRuns,\n runPolicies,\n defaultRunTimeoutMs: activeProfile.preferences.runTimeoutMs ?? env.runTimeoutMs,\n accessManager,\n pending,\n defaultWorkspace,\n allowedUsers: activeProfile.access.allowedUsers,\n allowedChats: activeProfile.access.allowedChats,\n };\n if (activeProfile.preferences.model !== undefined) channelInput.model = activeProfile.preferences.model;\n if (activeProfile.preferences.stopGraceMs !== undefined) {\n channelInput.stopGraceMs = activeProfile.preferences.stopGraceMs;\n }\n const bridge = await startChannel(channelInput);\n streaming = adaptLarkChannel(bridge.channel);\n larkChannel = bridge.channel;\n\n log.info('cli', 'started', {\n profile: profileName,\n home: paths.root,\n tenant: activeProfile.tenant,\n workspace: defaultWorkspace,\n });\n process.stdout.write(`dsh-lark-bot 已启动,profile=${profileName}\\n`);\n\n await waitForShutdown();\n await bridge.disconnect();\n await Promise.all([sessions.flush(), workspaces.flush()]);\n}\n\nfunction waitForShutdown(): Promise<void> {\n return new Promise((resolve) => {\n const shutdown = (): void => {\n process.off('SIGINT', shutdown);\n process.off('SIGTERM', shutdown);\n resolve();\n };\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n });\n}\n","import { spawn } from 'cross-spawn';\nimport { createInterface } from 'node:readline';\nimport type { ChildProcess } from 'node:child_process';\nimport { checkDshAvailability } from './availability.js';\nimport { plainOutputEvent, translateDshLine } from './translate.js';\nimport type {\n AgentAdapter,\n AgentAvailability,\n AgentEvent,\n AgentRun,\n AgentRunOptions,\n} from '../types.js';\n\nexport interface DshAdapterOptions {\n command?: string;\n args?: string[];\n stopGraceMs?: number;\n}\n\ntype DshChild = ChildProcess;\n\nexport class DshAdapter implements AgentAdapter {\n readonly id = 'dsh';\n readonly displayName = 'DeepSeek Harness';\n\n private readonly command: string;\n private readonly args: string[];\n private readonly stopGraceMs: number;\n\n constructor(options: DshAdapterOptions = {}) {\n this.command = options.command ?? 'dsh';\n this.args = options.args ?? ['--profile', 'headless'];\n this.stopGraceMs = options.stopGraceMs ?? 5_000;\n }\n\n async isAvailable(): Promise<boolean> {\n return (await this.checkAvailability()).ok;\n }\n\n checkAvailability(): Promise<AgentAvailability> {\n return checkDshAvailability({ command: this.command, args: this.args });\n }\n\n run(options: AgentRunOptions): AgentRun {\n const prompt =\n options.images?.length\n ? `${options.prompt}\\n\\nImage files attached to this message:\\n${options.images.join('\\n')}`\n : options.prompt;\n\n const child = spawn(\n this.command,\n [...this.args, prompt],\n {\n cwd: options.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n ) as DshChild;\n\n child.stdin?.end();\n\n const stderrChunks: Buffer[] = [];\n let runtimeError: Error | null = null;\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrChunks.push(chunk);\n });\n child.on('error', (error: Error) => {\n runtimeError = error;\n });\n\n return {\n runId: options.runId,\n events: createEventStream(child, stderrChunks, () => runtimeError, {\n sessionId: options.sessionId,\n cwd: options.cwd,\n model: options.model,\n }),\n stop: () => stopChild(child, this.stopGraceMs),\n waitForExit: (timeoutMs) => waitForChildExit(child, timeoutMs),\n };\n }\n}\n\nasync function* createEventStream(\n child: DshChild,\n stderrChunks: Buffer[],\n getError: () => Error | null,\n system: {\n sessionId: string | undefined;\n cwd: string | undefined;\n model: string | undefined;\n },\n): AsyncGenerator<AgentEvent> {\n if (!child.pid) {\n const error = getError();\n yield {\n type: 'error',\n message: error ? `failed to spawn dsh: ${error.message}` : 'spawn returned no pid',\n terminationReason: 'failed',\n };\n return;\n }\n\n yield {\n type: 'system',\n sessionId: system.sessionId,\n cwd: system.cwd,\n model: system.model,\n };\n\n if (!child.stdout) {\n yield {\n type: 'error',\n message: 'dsh stdout stream is unavailable',\n terminationReason: 'failed',\n };\n return;\n }\n\n const lines = createInterface({ input: child.stdout, crlfDelay: Infinity });\n const plainLines: string[] = [];\n let emittedProtocol = false;\n let terminalEmitted = false;\n\n for await (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const events = translateDshLine(trimmed);\n if (events.length > 0) {\n emittedProtocol = true;\n for (const event of events) {\n if (event.type === 'done' || event.type === 'error') terminalEmitted = true;\n yield event;\n }\n } else {\n plainLines.push(trimmed);\n }\n }\n\n const exitCode = await waitForExitResult(child, 0).then((value) => value.code);\n const runtimeError = getError();\n\n if (!terminalEmitted) {\n if (exitCode !== null && exitCode !== 0) {\n const stderr = Buffer.concat(stderrChunks).toString('utf8').trim();\n const detail = stderr ? `: ${stderr.slice(0, 500)}` : '';\n yield {\n type: 'error',\n message: `dsh exited with code ${exitCode}${detail}`,\n terminationReason: 'failed',\n };\n return;\n }\n\n if (runtimeError) {\n yield {\n type: 'error',\n message: `dsh runtime error: ${runtimeError.message}`,\n terminationReason: 'failed',\n };\n return;\n }\n\n if (emittedProtocol) {\n yield { type: 'done', sessionId: system.sessionId, terminationReason: 'normal' };\n } else {\n yield* plainOutputEvent(plainLines.join('\\n'));\n yield { type: 'done', sessionId: system.sessionId, terminationReason: 'normal' };\n }\n }\n}\n\nasync function waitForExitResult(\n child: DshChild,\n timeoutMs: number,\n): Promise<{ code: number | null; timedOut: boolean }> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return { code: child.exitCode, timedOut: false };\n }\n\n return new Promise((resolve) => {\n const onExit = (code: number | null): void => {\n if (timer !== undefined) clearTimeout(timer);\n resolve({ code, timedOut: false });\n };\n const timer =\n timeoutMs > 0\n ? setTimeout(() => {\n child.removeListener('exit', onExit);\n resolve({ code: child.exitCode, timedOut: true });\n }, timeoutMs)\n : undefined;\n child.once('exit', onExit);\n });\n}\n\nasync function stopChild(child: DshChild, graceMs: number): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) return;\n child.kill('SIGTERM');\n const stopped = await waitForExitResult(child, graceMs);\n if (!stopped.timedOut) return;\n child.kill('SIGKILL');\n}\n\nasync function waitForChildExit(child: DshChild, timeoutMs: number): Promise<boolean> {\n const result = await waitForExitResult(child, timeoutMs);\n return !result.timedOut && result.code !== null;\n}\n","import type { AgentEvent } from '../types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function translateDshLine(line: string): AgentEvent[] {\n const trimmed = line.trim();\n if (!trimmed) return [];\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!isRecord(parsed) || typeof parsed.type !== 'string') return [];\n\n switch (parsed.type) {\n case 'system':\n return [\n {\n type: 'system',\n sessionId: stringValue(parsed.sessionId),\n cwd: stringValue(parsed.cwd),\n model: stringValue(parsed.model),\n },\n ];\n case 'text':\n return [{ type: 'text', delta: stringValue(parsed.delta) ?? '' }];\n case 'final_text':\n return [{ type: 'final_text', content: stringValue(parsed.content) ?? '' }];\n case 'thinking':\n return [{ type: 'thinking', delta: stringValue(parsed.delta) ?? '' }];\n case 'tool_use':\n return [\n {\n type: 'tool_use',\n id: stringValue(parsed.id) ?? 'unknown',\n name: stringValue(parsed.name) ?? 'tool',\n input: parsed.input,\n },\n ];\n case 'tool_result':\n return [\n {\n type: 'tool_result',\n id: stringValue(parsed.id) ?? 'unknown',\n output: stringValue(parsed.output) ?? '',\n isError: parsed.isError === true,\n },\n ];\n case 'done':\n return [\n {\n type: 'done',\n sessionId: stringValue(parsed.sessionId),\n terminationReason: 'normal',\n },\n ];\n case 'error':\n return [\n {\n type: 'error',\n message: stringValue(parsed.message) ?? 'dsh failed',\n terminationReason: 'failed',\n },\n ];\n default:\n return [];\n }\n } catch {\n return [];\n }\n}\n\nexport function plainOutputEvent(output: string): AgentEvent[] {\n const trimmed = output.trim();\n return trimmed ? [{ type: 'final_text', content: trimmed }] : [];\n}\n","export interface ActiveRunHandle {\n runId: string;\n stop(): Promise<void>;\n}\n\nexport class ActiveRuns {\n private readonly runs = new Map<string, ActiveRunHandle>();\n\n set(scope: string, handle: ActiveRunHandle): void {\n this.runs.set(scope, handle);\n }\n\n get(scope: string): ActiveRunHandle | undefined {\n return this.runs.get(scope);\n }\n\n delete(scope: string): boolean {\n return this.runs.delete(scope);\n }\n\n async interrupt(scope: string): Promise<boolean> {\n const handle = this.runs.get(scope);\n if (!handle) return false;\n this.runs.delete(scope);\n await handle.stop();\n return true;\n }\n}\n","export type PendingFlush<T> = (scope: string, batch: T[]) => void | Promise<void>;\n\nexport class PendingQueue<T> {\n private readonly pending = new Map<string, T[]>();\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly blocked = new Set<string>();\n private readonly flushing = new Set<string>();\n\n constructor(\n private readonly quietMs: number,\n private readonly onFlush: PendingFlush<T>,\n ) {}\n\n push(scope: string, item: T): void {\n const batch = this.pending.get(scope) ?? [];\n batch.push(item);\n this.pending.set(scope, batch);\n this.schedule(scope);\n }\n\n block(scope: string): void {\n this.blocked.add(scope);\n this.clearTimer(scope);\n }\n\n unblock(scope: string): void {\n this.blocked.delete(scope);\n this.schedule(scope);\n }\n\n async flushNow(scope: string): Promise<void> {\n this.clearTimer(scope);\n if (this.flushing.has(scope)) return;\n\n const batch = this.pending.get(scope) ?? [];\n this.pending.delete(scope);\n if (batch.length === 0) return;\n\n this.flushing.add(scope);\n try {\n await this.onFlush(scope, batch);\n } finally {\n this.flushing.delete(scope);\n }\n }\n\n hasPending(scope: string): boolean {\n return (this.pending.get(scope)?.length ?? 0) > 0;\n }\n\n isBlocked(scope: string): boolean {\n return this.blocked.has(scope);\n }\n\n private schedule(scope: string): void {\n if (this.blocked.has(scope) || this.flushing.has(scope)) return;\n if (this.timers.has(scope)) return;\n if (!this.hasPending(scope)) return;\n\n this.timers.set(\n scope,\n setTimeout(() => {\n this.timers.delete(scope);\n void this.flushNow(scope);\n }, this.quietMs),\n );\n }\n\n private clearTimer(scope: string): void {\n const timer = this.timers.get(scope);\n if (timer === undefined) return;\n clearTimeout(timer);\n this.timers.delete(scope);\n }\n}\n","export class RunPolicyStore {\n private readonly timeouts = new Map<string, number>();\n\n get(scope: string): number | undefined {\n return this.timeouts.get(scope);\n }\n\n set(scope: string, runTimeoutMs: number): void {\n this.timeouts.set(scope, runTimeoutMs);\n }\n\n clear(scope: string): boolean {\n return this.timeouts.delete(scope);\n }\n}\n","import { createLarkChannel, type LarkChannel, type NormalizedMessage } from '@larksuite/channel';\nimport type { AgentAdapter } from '../adapters/types.js';\nimport type { ActiveRuns } from '../bot/active-runs.js';\nimport type { PendingQueue } from '../bot/pending-queue.js';\nimport type { RunPolicyStore } from '../bot/run-policy.js';\nimport { tryHandleCommand, type CommandChannel } from '../commands/index.js';\nimport type { AccessManager } from '../config/access-manager.js';\nimport { log } from '../core/logger.js';\nimport type { SessionStore } from '../session/store.js';\nimport type { WorkspaceStore } from '../workspace/store.js';\nimport { adaptLarkChannel } from './lark-channel.js';\n\nexport interface StartChannelDeps {\n appId: string;\n appSecret: string;\n tenant: 'feishu' | 'lark';\n adapter: AgentAdapter;\n sessions: SessionStore;\n workspaces: WorkspaceStore;\n activeRuns: ActiveRuns;\n runPolicies: RunPolicyStore;\n defaultRunTimeoutMs: number;\n accessManager: AccessManager;\n pending: PendingQueue<NormalizedMessage>;\n defaultWorkspace: string;\n allowedUsers?: string[];\n allowedChats?: string[];\n model?: string;\n stopGraceMs?: number;\n createChannel?: typeof createLarkChannel;\n}\n\nexport interface BridgeChannel {\n channel: LarkChannel;\n disconnect(): Promise<void>;\n}\n\nexport async function startChannel(deps: StartChannelDeps): Promise<BridgeChannel> {\n const channel = (deps.createChannel ?? createLarkChannel)({\n appId: deps.appId,\n appSecret: deps.appSecret,\n domain:\n deps.tenant === 'lark' ? 'https://open.larksuite.com' : 'https://open.feishu.cn',\n source: 'dsh-lark-bot',\n policy: {\n dmMode: deps.allowedUsers?.length ? 'allowlist' : 'open',\n requireMention: true,\n respondToMentionAll: false,\n ...(deps.allowedUsers ? { dmAllowlist: deps.allowedUsers } : {}),\n ...(deps.allowedChats ? { groupAllowlist: deps.allowedChats } : {}),\n },\n safety: {\n chatQueue: { enabled: false },\n },\n outbound: {\n streamThrottleMs: 400,\n },\n includeRawEvent: true,\n handshakeTimeoutMs: 8_000,\n httpTimeoutMs: 30_000,\n respectProxyEnv: true,\n });\n\n const streaming = adaptLarkChannel(channel);\n const commandChannel: CommandChannel = streaming;\n\n channel.on({\n message: async (msg) => {\n const scope = scopeForMessage(msg);\n const context = {\n scope,\n chatId: msg.chatId,\n messageId: msg.messageId,\n threadId: msg.threadId,\n chatMode: msg.chatMode ?? msg.chatType,\n sessions: deps.sessions,\n workspaces: deps.workspaces,\n activeRuns: deps.activeRuns,\n runPolicies: deps.runPolicies,\n defaultRunTimeoutMs: deps.defaultRunTimeoutMs,\n accessManager: deps.accessManager,\n channel: commandChannel,\n defaultWorkspace: deps.defaultWorkspace,\n };\n\n const handled = await tryHandleCommand(msg.content, context).catch((error: unknown) => {\n log.fail('channel-command', error, { scope });\n return false;\n });\n if (!handled) deps.pending.push(scope, msg);\n },\n cardAction: async (event) => {\n const value =\n event.action.value && typeof event.action.value === 'object'\n ? (event.action.value as Record<string, unknown>)\n : undefined;\n if (value?.cmd === 'stop') {\n const scope = event.raw\n ? await resolveCardScope(event.chatId, event.raw as { message?: { thread_id?: string } })\n : event.chatId;\n await deps.activeRuns.interrupt(scope);\n }\n },\n reconnecting: () => {\n log.warn('channel', 'reconnecting', {});\n },\n reconnected: () => {\n log.info('channel', 'reconnected', {});\n },\n error: (error) => {\n log.fail('channel', error);\n },\n });\n\n await channel.connect();\n return {\n channel,\n disconnect: () => channel.disconnect(),\n };\n}\n\nfunction scopeForMessage(msg: NormalizedMessage): string {\n if (msg.chatMode === 'topic' && msg.threadId) return `${msg.chatId}:${msg.threadId}`;\n return msg.chatId;\n}\n\nasync function resolveCardScope(\n chatId: string,\n raw: { message?: { thread_id?: string } },\n): Promise<string> {\n return raw.message?.thread_id ? `${chatId}:${raw.message.thread_id}` : chatId;\n}\n","import { resolve } from 'node:path';\nimport type { ActiveRuns } from '../bot/active-runs.js';\nimport type { RunPolicyStore } from '../bot/run-policy.js';\nimport type { AccessManager } from '../config/access-manager.js';\nimport type { SessionStore } from '../session/store.js';\nimport type { WorkspaceStore } from '../workspace/store.js';\nimport { renderWorkspaceCard } from '../card/workspace-card.js';\n\nexport interface CommandChannel {\n sendMarkdown(\n chatId: string,\n markdown: string,\n options?: { replyTo?: string },\n ): Promise<void>;\n sendCard?(chatId: string, card: object): Promise<void>;\n}\n\nexport interface CommandContext {\n scope: string;\n chatId: string;\n messageId: string;\n threadId: string | undefined;\n chatMode: 'p2p' | 'group' | 'topic';\n sessions: SessionStore;\n workspaces: WorkspaceStore;\n activeRuns: ActiveRuns;\n runPolicies: RunPolicyStore;\n defaultRunTimeoutMs: number;\n accessManager: AccessManager;\n channel: CommandChannel;\n defaultWorkspace: string;\n}\n\ntype Handler = (args: string, ctx: CommandContext) => Promise<void>;\n\nconst HELP = [\n '**dsh-lark-bot 命令**',\n '',\n '- `/new` `/reset` — 开始新会话',\n '- `/cd <path>` — 切换工作目录并重置会话',\n '- `/ws list|save <name>|use <name>|remove <name>` — 管理工作空间',\n '- `/status` — 查看当前状态',\n '- `/resume` — 查看当前会话最近上下文',\n '- `/stop` — 终止当前任务',\n '- `/timeout [N|off|default]` — 查看或设置当前会话运行超时',\n '- `/invite user|admin|group <id>` — 管理访问白名单',\n '- `/help` — 显示本帮助',\n].join('\\n');\n\nasync function reply(ctx: CommandContext, markdown: string): Promise<void> {\n await ctx.channel.sendMarkdown(ctx.chatId, markdown, {\n replyTo: ctx.messageId,\n });\n}\n\nasync function handleNew(_args: string, ctx: CommandContext): Promise<void> {\n const wasRunning = await ctx.activeRuns.interrupt(ctx.scope);\n ctx.sessions.clear(ctx.scope);\n await reply(ctx, wasRunning ? '已中断当前任务并开始新会话。' : '已开始新会话。');\n}\n\nasync function handleCd(args: string, ctx: CommandContext): Promise<void> {\n const path = args.trim();\n if (!path) {\n await reply(ctx, '用法:`/cd <path>`');\n return;\n }\n const cwd = resolve(path);\n await ctx.activeRuns.interrupt(ctx.scope);\n ctx.workspaces.setCwd(ctx.scope, cwd);\n ctx.sessions.clear(ctx.scope);\n await reply(ctx, `已切换工作目录:\\`${cwd}\\`,会话已重置。`);\n}\n\nasync function handleWs(args: string, ctx: CommandContext): Promise<void> {\n const [sub, ...rest] = args.trim().split(/\\s+/);\n const name = rest.join(' ').trim();\n\n if (!sub || sub === 'list') {\n const current = ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace;\n const named = ctx.workspaces.listNamed();\n const index = ctx.workspaces.listIndex();\n if (ctx.channel.sendCard) {\n await ctx.channel.sendCard(ctx.chatId, renderWorkspaceCard({ current, index }));\n return;\n }\n const lines = Object.entries(named).map(\n ([key, value]) => `- **${key}** → \\`${value}\\`${value === current ? ' ← 当前' : ''}`,\n );\n await reply(\n ctx,\n [\n `当前 cwd:\\`${current}\\``,\n '',\n ...(lines.length > 0 ? lines : ['暂无命名工作空间。']),\n ].join('\\n'),\n );\n return;\n }\n\n if (sub === 'save') {\n if (!name) {\n await reply(ctx, '用法:`/ws save <name>`');\n return;\n }\n const current = ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace;\n ctx.workspaces.saveNamed(name, current);\n await reply(ctx, `已保存工作空间:**${name}** → \\`${current}\\``);\n return;\n }\n\n if (sub === 'use') {\n if (!name) {\n await reply(ctx, '用法:`/ws use <name>`');\n return;\n }\n const cwd = ctx.workspaces.getNamed(name);\n if (!cwd) {\n await reply(ctx, `未找到工作空间:**${name}**`);\n return;\n }\n await ctx.activeRuns.interrupt(ctx.scope);\n ctx.workspaces.setCwd(ctx.scope, cwd);\n ctx.workspaces.touchNamed(name);\n ctx.sessions.clear(ctx.scope);\n await reply(ctx, `已切换到工作空间:**${name}** → \\`${cwd}\\``);\n return;\n }\n\n if (sub === 'remove') {\n if (!name) {\n await reply(ctx, '用法:`/ws remove <name>`');\n return;\n }\n const removed = ctx.workspaces.removeNamed(name);\n await reply(ctx, removed ? `已删除工作空间:**${name}**` : `未找到工作空间:**${name}**`);\n return;\n }\n\n await reply(ctx, '未知 `/ws` 子命令,请使用 list / save / use / remove。');\n}\n\nasync function handleStatus(_args: string, ctx: CommandContext): Promise<void> {\n const cwd = ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace;\n const session = ctx.sessions.getRaw(ctx.scope)?.sessionId ?? '(无)';\n const running = Boolean(ctx.activeRuns.get(ctx.scope));\n const scopeLabel =\n ctx.chatMode === 'topic' ? `${ctx.scope}(话题独立 session)` : ctx.scope;\n\n await reply(\n ctx,\n [\n `🧭 **scope**: \\`${scopeLabel}\\``,\n `📁 **cwd**: \\`${cwd}\\``,\n `🔗 **session**: \\`${session}\\``,\n `🏃 **active run**: ${running ? 'yes' : 'no'}`,\n ].join('\\n'),\n );\n}\n\nasync function handleResume(_args: string, ctx: CommandContext): Promise<void> {\n const cwd = ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace;\n const history = ctx.sessions.historyFor(ctx.scope, cwd);\n if (history.length === 0) {\n await reply(ctx, '当前会话没有历史上下文。');\n return;\n }\n\n const recent = history.slice(-6).map((message) => {\n const speaker = message.role === 'user' ? '👤' : '🤖';\n return `${speaker} ${message.content.slice(0, 300)}`;\n });\n\n await reply(ctx, [`当前 scope:\\`${ctx.scope}\\``, '', ...recent].join('\\n'));\n}\n\nasync function handleStop(_args: string, ctx: CommandContext): Promise<void> {\n const stopped = await ctx.activeRuns.interrupt(ctx.scope);\n await reply(ctx, stopped ? '已请求终止当前任务。' : '当前没有运行中的任务。');\n}\n\nasync function handleTimeout(args: string, ctx: CommandContext): Promise<void> {\n const input = args.trim();\n const effectiveMs = ctx.runPolicies.get(ctx.scope) ?? ctx.defaultRunTimeoutMs;\n\n if (!input) {\n const minutes = effectiveMs > 0 ? Math.round(effectiveMs / 60_000) : 0;\n await reply(\n ctx,\n minutes > 0\n ? `当前会话运行超时:${minutes} 分钟。可用 \\`/timeout <N|off|default>\\` 调整。`\n : '当前会话运行超时:关闭。',\n );\n return;\n }\n\n if (input === 'off') {\n ctx.runPolicies.set(ctx.scope, 0);\n await reply(ctx, '已关闭当前会话运行超时。');\n return;\n }\n\n if (input === 'default') {\n ctx.runPolicies.clear(ctx.scope);\n await reply(ctx, '已恢复默认运行超时。');\n return;\n }\n\n const minutes = Number(input);\n if (!Number.isInteger(minutes) || minutes <= 0) {\n await reply(ctx, '用法:`/timeout <N|off|default>`,N 为大于 0 的分钟数。');\n return;\n }\n\n ctx.runPolicies.set(ctx.scope, minutes * 60_000);\n await reply(ctx, `已设置当前会话运行超时:${minutes} 分钟。`);\n}\n\nasync function handleInvite(args: string, ctx: CommandContext): Promise<void> {\n const [kind, ...rest] = args.trim().split(/\\s+/);\n const id = rest.join(' ').trim();\n\n if (kind === 'list') {\n const snapshot = ctx.accessManager.snapshot();\n await reply(\n ctx,\n [\n '**访问白名单**',\n `users: ${snapshot.allowedUsers.join(', ') || '(空)'}`,\n `chats: ${snapshot.allowedChats.join(', ') || '(空)'}`,\n `admins: ${snapshot.admins.join(', ') || '(空)'}`,\n ].join('\\n'),\n );\n return;\n }\n\n if (!kind || !id) {\n await reply(\n ctx,\n '用法:`/invite user|admin|group <id>`、`/invite list`、`/invite remove user|group <id>`',\n );\n return;\n }\n\n if (kind === 'user') {\n await ctx.accessManager.addUser(id);\n await reply(ctx, `已允许用户:\\`${id}\\``);\n return;\n }\n\n if (kind === 'admin') {\n await ctx.accessManager.addAdmin(id);\n await reply(ctx, `已设为管理员:\\`${id}\\``);\n return;\n }\n\n if (kind === 'group') {\n await ctx.accessManager.addChat(id);\n await reply(ctx, `已允许群聊:\\`${id}\\``);\n return;\n }\n\n if (kind === 'remove') {\n const [sub, target] = rest;\n if (sub === 'user' && target) {\n await ctx.accessManager.removeUser(target);\n await reply(ctx, `已移除用户:\\`${target}\\``);\n return;\n }\n if (sub === 'group' && target) {\n await ctx.accessManager.removeChat(target);\n await reply(ctx, `已移除群聊:\\`${target}\\``);\n return;\n }\n await reply(ctx, '用法:`/invite remove user <id>` 或 `/invite remove group <chatId>`');\n return;\n }\n\n await reply(ctx, '未知 `/invite` 类型,请使用 user / admin / group / list / remove。');\n}\n\nasync function handleHelp(_args: string, ctx: CommandContext): Promise<void> {\n await reply(ctx, HELP);\n}\n\nconst handlers: Record<string, Handler> = {\n '/new': handleNew,\n '/reset': handleNew,\n '/cd': handleCd,\n '/ws': handleWs,\n '/status': handleStatus,\n '/resume': handleResume,\n '/stop': handleStop,\n '/timeout': handleTimeout,\n '/invite': handleInvite,\n '/help': handleHelp,\n};\n\nexport async function tryHandleCommand(text: string, ctx: CommandContext): Promise<boolean> {\n const trimmed = text.trim();\n if (!trimmed.startsWith('/')) return false;\n const [command, ...rest] = trimmed.split(/\\s+/);\n const handler = handlers[command ?? ''];\n if (!handler) return false;\n await handler(rest.join(' '), ctx);\n return true;\n}\n","export function renderWorkspaceCard(input: {\n current: string;\n index: Array<{ name: string; cwd: string; lastUsed: number | undefined }>;\n}): object {\n const entries = input.index;\n const markdown = [\n `**当前工作目录**\\n\\`${input.current}\\``,\n '',\n ...(entries.length > 0\n ? entries.map(({ name, cwd, lastUsed }) =>\n `- **${name}** → \\`${cwd}\\`${lastUsed ? ` · ${new Date(lastUsed).toLocaleString()}` : ''}`,\n )\n : ['暂无命名工作空间。']),\n ].join('\\n');\n\n return {\n schema: '2.0',\n config: {\n summary: { content: '工作空间导航' },\n },\n body: {\n elements: [\n {\n tag: 'markdown',\n content: markdown,\n },\n ],\n },\n };\n}\n","import type { Writable } from 'node:stream';\n\ntype LogLevel = 'info' | 'warn' | 'error';\n\nexport interface LogFields {\n [key: string]: unknown;\n}\n\nconst REDACTED = '[redacted]';\nconst SENSITIVE_KEY = /(secret|token|password|api[_-]?key)/i;\n\nfunction redactValue(value: unknown, key: string, depth: number): unknown {\n if (SENSITIVE_KEY.test(key)) return REDACTED;\n if (depth === 0) return value;\n if (Array.isArray(value)) {\n return value.map((item, index) => redactValue(item, `${key}.${index}`, depth - 1));\n }\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = redactValue(childValue, childKey, depth - 1);\n }\n return out;\n }\n return value;\n}\n\nexport function redactFields(fields: LogFields, depth = 4): LogFields {\n return redactValue(fields, '', depth) as LogFields;\n}\n\nfunction serializeMessage(\n level: LogLevel,\n category: string,\n event: string,\n fields: LogFields,\n): string {\n const entry = {\n time: new Date().toISOString(),\n level,\n category,\n event,\n fields: redactFields(fields),\n };\n return JSON.stringify(entry);\n}\n\nexport interface Logger {\n info(category: string, event: string, fields?: LogFields): void;\n warn(category: string, event: string, fields?: LogFields): void;\n error(category: string, event: string, fields?: LogFields): void;\n fail(category: string, error: unknown, fields?: LogFields): void;\n}\n\nexport function createLogger(output: Writable = process.stderr): Logger {\n const write = (level: LogLevel, category: string, event: string, fields: LogFields): void => {\n output.write(`${serializeMessage(level, category, event, fields)}\\n`);\n };\n\n return {\n info: (category, event, fields = {}) => write('info', category, event, fields),\n warn: (category, event, fields = {}) => write('warn', category, event, fields),\n error: (category, event, fields = {}) => write('error', category, event, fields),\n fail(category, error, fields = {}) {\n const message = error instanceof Error ? error.message : String(error);\n write('error', category, 'fail', { message, ...fields });\n },\n };\n}\n\nexport const log = createLogger();\n","import type {\n CardStreamController as LarkCardStreamController,\n LarkChannel,\n SendOptions,\n} from '@larksuite/channel';\nimport type { CommandChannel } from '../commands/index.js';\nimport type { StreamingChannel } from './types.js';\n\nexport function adaptLarkChannel(channel: LarkChannel): StreamingChannel {\n const base: CommandChannel = {\n async sendMarkdown(chatId, markdown, options) {\n const sendOptions: SendOptions = {};\n if (options?.replyTo) sendOptions.replyTo = options.replyTo;\n await channel.send(chatId, { markdown }, sendOptions);\n },\n };\n\n return {\n ...base,\n async sendCard(chatId, card) {\n await channel.send(chatId, { card }, {});\n },\n async streamCard(chatId, initial, producer, options) {\n const sendOptions: SendOptions = {};\n if (options?.replyTo) sendOptions.replyTo = options.replyTo;\n await channel.stream(\n chatId,\n {\n card: {\n initial,\n producer: async (controller: LarkCardStreamController) => {\n await producer(controller);\n },\n },\n },\n sendOptions,\n );\n },\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport type { AgentAdapter, AgentEvent } from '../adapters/types.js';\nimport type { ActiveRuns } from '../bot/active-runs.js';\nimport type { RunPolicyStore } from '../bot/run-policy.js';\nimport {\n finalizeIfRunning,\n initialState,\n markIdleTimeout,\n markInterrupted,\n reduce,\n type RunState,\n} from '../card/run-state.js';\nimport { renderCard } from '../card/run-renderer.js';\nimport { log } from '../core/logger.js';\nimport type { SessionStore } from '../session/store.js';\nimport type { WorkspaceStore } from '../workspace/store.js';\nimport type { GitWorktreeManager } from '../workspace/git-worktree.js';\nimport type { StreamingChannel } from './types.js';\n\nexport interface RunFlowInput {\n scope: string;\n chatId: string;\n messages: string[];\n adapter: AgentAdapter;\n sessions: SessionStore;\n workspaces: WorkspaceStore;\n workspaceManager?: GitWorktreeManager;\n activeRuns: ActiveRuns;\n runPolicies?: RunPolicyStore;\n channel: StreamingChannel;\n defaultWorkspace: string;\n model?: string;\n stopGraceMs?: number;\n runTimeoutMs?: number;\n images?: string[];\n replyTo?: string;\n}\n\nexport async function runAgentBatch(input: RunFlowInput): Promise<void> {\n const replyOptions = input.replyTo ? { replyTo: input.replyTo } : {};\n\n if (input.activeRuns.get(input.scope)) {\n await input.channel.sendMarkdown(input.chatId, '当前会话已有任务正在运行,请先 `/stop` 或等待完成。', {\n ...replyOptions,\n });\n return;\n }\n\n const requestedCwd = input.workspaces.cwdFor(input.scope) ?? input.defaultWorkspace;\n const workspace = input.workspaceManager\n ? await input.workspaceManager.ensure(input.scope, requestedCwd)\n : { cwd: requestedCwd };\n const cwd = workspace.cwd;\n const sessionId = input.sessions.resumeFor(input.scope, cwd);\n const history = input.sessions.historyFor(input.scope, cwd);\n const prompt = buildPrompt(history, input.messages);\n const runId = randomUUID();\n\n const run = input.adapter.run({\n runId,\n prompt,\n cwd,\n sessionId,\n model: input.model,\n images: input.images,\n stopGraceMs: input.stopGraceMs,\n });\n input.activeRuns.set(input.scope, { runId, stop: run.stop });\n\n let state: RunState = initialState;\n const stopRequested = { value: false };\n const timeoutMs = input.runPolicies?.get(input.scope) ?? input.runTimeoutMs ?? 0;\n let timedOut = false;\n let assistantOutput = '';\n\n try {\n await input.channel.streamCard(\n input.chatId,\n renderCard(state),\n async (controller) => {\n const consume = async (): Promise<void> => {\n for await (const event of run.events) {\n if (timedOut) return;\n state = applyEvent(state, event, stopRequested);\n if (event.type === 'final_text') {\n assistantOutput = event.content;\n } else if (event.type === 'text') {\n assistantOutput += event.delta;\n }\n if (event.type === 'system' && event.sessionId) {\n input.sessions.set(input.scope, event.sessionId, event.cwd ?? cwd);\n }\n await controller.update(renderCard(state));\n }\n };\n\n let timeoutTimer: NodeJS.Timeout | undefined;\n const timeoutPromise =\n timeoutMs > 0\n ? new Promise<void>((resolve) => {\n timeoutTimer = setTimeout(() => {\n timedOut = true;\n void run.stop();\n resolve();\n }, timeoutMs);\n })\n : undefined;\n\n try {\n if (timeoutPromise) {\n await Promise.race([consume(), timeoutPromise]);\n } else {\n await consume();\n }\n\n state = timedOut\n ? markIdleTimeout(state, timeoutMs / 60_000)\n : finalizeIfRunning(state);\n await controller.update(renderCard(state));\n } finally {\n if (timeoutTimer !== undefined) clearTimeout(timeoutTimer);\n }\n },\n replyOptions,\n );\n input.sessions.recordExchange(input.scope, cwd, input.messages, assistantOutput);\n } catch (error) {\n log.fail('run-flow', error, { scope: input.scope, runId });\n state = markInterrupted(state);\n try {\n await input.channel.sendMarkdown(input.chatId, `⚠️ agent 运行失败:${errorMessage(error)}`, {\n ...replyOptions,\n });\n } catch {\n // best effort; the card may already have failed\n }\n } finally {\n input.activeRuns.delete(input.scope);\n }\n}\n\nfunction buildPrompt(\n history: Array<{ role: 'user' | 'assistant'; content: string }>,\n messages: string[],\n): string {\n if (history.length === 0) return messages.join('\\n\\n');\n\n const transcript = history\n .map((message) => `${message.role === 'user' ? 'User' : 'Assistant'}: ${message.content}`)\n .join('\\n\\n');\n\n return [\n 'Continue the conversation using the history below.',\n '',\n transcript,\n '',\n `Current user message:\\n${messages.join('\\n\\n')}`,\n ].join('\\n');\n}\n\nfunction applyEvent(\n state: RunState,\n event: AgentEvent,\n stopRequested: { value: boolean },\n): RunState {\n if (event.type === 'done' && event.terminationReason === 'interrupted') {\n stopRequested.value = true;\n return markInterrupted(state);\n }\n if (event.type === 'error' && event.terminationReason === 'timeout') {\n return markIdleTimeout(state, 0);\n }\n return reduce(state, event);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { AgentEvent } from '../adapters/types.js';\n\nexport type ToolStatus = 'running' | 'done' | 'error';\n\nexport interface ToolEntry {\n id: string;\n name: string;\n input: unknown;\n status: ToolStatus;\n output?: string;\n}\n\nexport type Block =\n | { kind: 'text'; content: string; streaming: boolean }\n | { kind: 'tool'; tool: ToolEntry };\n\nexport type FooterStatus = 'thinking' | 'tool_running' | 'streaming' | null;\nexport type Terminal = 'running' | 'done' | 'interrupted' | 'error' | 'idle_timeout';\n\nexport interface RunState {\n blocks: Block[];\n reasoning: { content: string; active: boolean };\n footer: FooterStatus;\n terminal: Terminal;\n errorMsg: string | undefined;\n idleTimeoutMinutes: number | undefined;\n}\n\nexport const initialState: RunState = {\n blocks: [],\n reasoning: { content: '', active: false },\n footer: 'thinking',\n terminal: 'running',\n errorMsg: undefined,\n idleTimeoutMinutes: undefined,\n};\n\nfunction closeStreamingText(blocks: Block[]): Block[] {\n return blocks.map((block) =>\n block.kind === 'text' && block.streaming ? { ...block, streaming: false } : block,\n );\n}\n\nexport function reduce(state: RunState, event: AgentEvent): RunState {\n switch (event.type) {\n case 'text': {\n const last = state.blocks[state.blocks.length - 1];\n if (last?.kind === 'text' && last.streaming) {\n return {\n ...state,\n blocks: [\n ...state.blocks.slice(0, -1),\n { ...last, content: last.content + event.delta },\n ],\n reasoning: { ...state.reasoning, active: false },\n footer: 'streaming',\n };\n }\n return {\n ...state,\n blocks: [...state.blocks, { kind: 'text', content: event.delta, streaming: true }],\n reasoning: { ...state.reasoning, active: false },\n footer: 'streaming',\n };\n }\n\n case 'thinking':\n return {\n ...state,\n reasoning: {\n content: state.reasoning.content + event.delta,\n active: true,\n },\n footer: 'thinking',\n };\n\n case 'final_text':\n return {\n ...state,\n blocks: [\n ...closeStreamingText(state.blocks),\n { kind: 'text', content: event.content, streaming: false },\n ],\n reasoning: { ...state.reasoning, active: false },\n footer: null,\n };\n\n case 'tool_use':\n return {\n ...state,\n blocks: [\n ...closeStreamingText(state.blocks),\n {\n kind: 'tool',\n tool: {\n id: event.id,\n name: event.name,\n input: event.input,\n status: 'running',\n },\n },\n ],\n reasoning: { ...state.reasoning, active: false },\n footer: 'tool_running',\n };\n\n case 'tool_result':\n return {\n ...state,\n blocks: state.blocks.map((block) => {\n if (block.kind !== 'tool' || block.tool.id !== event.id) return block;\n return {\n ...block,\n tool: {\n ...block.tool,\n status: event.isError ? 'error' : 'done',\n output: event.output,\n },\n };\n }),\n };\n\n case 'error':\n return {\n ...state,\n terminal:\n event.terminationReason === 'interrupted'\n ? 'interrupted'\n : event.terminationReason === 'timeout'\n ? 'idle_timeout'\n : 'error',\n errorMsg: event.terminationReason === 'failed' ? event.message : undefined,\n idleTimeoutMinutes: undefined,\n footer: null,\n };\n\n case 'done':\n return {\n ...state,\n blocks: closeStreamingText(state.blocks),\n reasoning: { ...state.reasoning, active: false },\n terminal:\n event.terminationReason === 'interrupted'\n ? 'interrupted'\n : event.terminationReason === 'timeout'\n ? 'idle_timeout'\n : 'done',\n footer: null,\n };\n\n default:\n return state;\n }\n}\n\nexport function markInterrupted(state: RunState): RunState {\n return {\n ...state,\n blocks: closeStreamingText(state.blocks),\n reasoning: { ...state.reasoning, active: false },\n terminal: 'interrupted',\n footer: null,\n };\n}\n\nexport function markIdleTimeout(state: RunState, minutes: number): RunState {\n return {\n ...state,\n blocks: closeStreamingText(state.blocks),\n reasoning: { ...state.reasoning, active: false },\n terminal: 'idle_timeout',\n footer: null,\n idleTimeoutMinutes: minutes,\n };\n}\n\nexport function finalizeIfRunning(state: RunState): RunState {\n if (state.terminal !== 'running') return state;\n return {\n ...state,\n blocks: closeStreamingText(state.blocks),\n reasoning: { ...state.reasoning, active: false },\n terminal: 'done',\n footer: null,\n };\n}\n","import type { Block, FooterStatus, RunState, ToolEntry } from './run-state.js';\n\nfunction markdown(content: string): object {\n return { tag: 'markdown', content };\n}\n\nfunction noteMd(content: string): object {\n return { tag: 'markdown', content, text_size: 'notation' };\n}\n\nfunction footerStatus(status: Exclude<FooterStatus, null>): object {\n const text =\n status === 'thinking'\n ? '🧠 正在思考'\n : status === 'tool_running'\n ? '🧰 正在调用工具'\n : '✍️ 正在输出';\n return noteMd(text);\n}\n\nfunction summaryText(state: RunState): string {\n if (state.terminal === 'interrupted') return '已中断';\n if (state.terminal === 'idle_timeout') return '已超时';\n if (state.terminal === 'error') return '出错';\n if (state.terminal === 'done') return '已完成';\n if (state.footer === 'tool_running') return '正在调用工具';\n if (state.footer === 'streaming') return '正在输出';\n return '思考中';\n}\n\nfunction stopButton(): object {\n return {\n tag: 'button',\n text: { tag: 'plain_text', content: '⏹ 终止' },\n type: 'danger',\n value: { cmd: 'stop' },\n };\n}\n\nfunction textBlock(block: Extract<Block, { kind: 'text' }>): object {\n return markdown(block.content);\n}\n\nfunction toolBlock(tool: ToolEntry): object {\n const icon = tool.status === 'error' ? '⚠️' : tool.status === 'done' ? '✅' : '⏳';\n return markdown(`${icon} **${tool.name}**`);\n}\n\nexport function renderCard(state: RunState): object {\n const elements: object[] = [];\n\n if (state.reasoning.content) {\n elements.push(\n noteMd(\n state.reasoning.active\n ? '🧠 正在思考…'\n : `🧠 思考完成:${state.reasoning.content.slice(0, 300)}`,\n ),\n );\n }\n\n for (const block of state.blocks) {\n elements.push(block.kind === 'text' ? textBlock(block) : toolBlock(block.tool));\n }\n\n if (state.terminal === 'interrupted') {\n elements.push(noteMd('_⏹ 已被中断_'));\n } else if (state.terminal === 'idle_timeout') {\n elements.push(noteMd(`_⏱ ${state.idleTimeoutMinutes ?? 0} 分钟无响应,已自动终止_`));\n } else if (state.terminal === 'error' && state.errorMsg) {\n elements.push(noteMd(`⚠️ agent 失败:${state.errorMsg}`));\n } else if (state.terminal === 'done' && elements.length === 0) {\n elements.push(noteMd('_(未返回内容)_'));\n }\n\n if (state.terminal === 'running') {\n if (state.footer) elements.push(footerStatus(state.footer));\n elements.push(stopButton());\n }\n\n return {\n schema: '2.0',\n config: {\n streaming_mode: state.terminal === 'running',\n summary: { content: summaryText(state) },\n },\n body: { elements },\n };\n}\n","import type { ConfigStore, ProfileConfig } from './profile-store.js';\n\nexport interface AccessSnapshot {\n allowedUsers: string[];\n allowedChats: string[];\n admins: string[];\n}\n\nexport class AccessManager {\n constructor(\n private readonly store: ConfigStore,\n private readonly profileName: string,\n ) {}\n\n snapshot(): AccessSnapshot {\n const profile = this.profile();\n return {\n allowedUsers: [...profile.access.allowedUsers],\n allowedChats: [...profile.access.allowedChats],\n admins: [...profile.access.admins],\n };\n }\n\n async addUser(id: string): Promise<void> {\n const snapshot = this.snapshot();\n if (!snapshot.allowedUsers.includes(id)) snapshot.allowedUsers.push(id);\n await this.persist(snapshot);\n }\n\n async addAdmin(id: string): Promise<void> {\n const snapshot = this.snapshot();\n if (!snapshot.allowedUsers.includes(id)) snapshot.allowedUsers.push(id);\n if (!snapshot.admins.includes(id)) snapshot.admins.push(id);\n await this.persist(snapshot);\n }\n\n async addChat(chatId: string): Promise<void> {\n const snapshot = this.snapshot();\n if (!snapshot.allowedChats.includes(chatId)) snapshot.allowedChats.push(chatId);\n await this.persist(snapshot);\n }\n\n async removeUser(id: string): Promise<void> {\n const snapshot = this.snapshot();\n snapshot.allowedUsers = snapshot.allowedUsers.filter((item) => item !== id);\n snapshot.admins = snapshot.admins.filter((item) => item !== id);\n await this.persist(snapshot);\n }\n\n async removeChat(chatId: string): Promise<void> {\n const snapshot = this.snapshot();\n snapshot.allowedChats = snapshot.allowedChats.filter((item) => item !== chatId);\n await this.persist(snapshot);\n }\n\n private profile(): ProfileConfig {\n const profile = this.store.getProfile(this.profileName);\n if (!profile) throw new Error(`profile not found: ${this.profileName}`);\n return profile;\n }\n\n private async persist(snapshot: AccessSnapshot): Promise<void> {\n const profile = this.profile();\n await this.store.saveProfile(this.profileName, {\n tenant: profile.tenant,\n appId: profile.accounts.appId,\n appSecret: profile.accounts.appSecret,\n access: snapshot,\n });\n }\n}\n","import { registerApp, type RegisterAppOptions, type RegisterAppResult } from '@larksuite/channel';\nimport qrcode from 'qrcode-terminal';\nimport type { LarkTenant } from '../config/env.js';\n\nexport interface OnboardedApp {\n appId: string;\n appSecret: string;\n tenant: LarkTenant;\n operatorOpenId: string | undefined;\n}\n\nexport interface RegistrationDeps {\n register?: (options: RegisterAppOptions) => Promise<RegisterAppResult>;\n renderQr?: (value: string) => void;\n print?: (line: string) => void;\n source?: string;\n signal?: AbortSignal;\n}\n\nconst DEFAULT_SOURCE = 'dsh-lark-bot';\n\nexport async function onboardPersonalAgent(\n deps: RegistrationDeps = {},\n): Promise<OnboardedApp> {\n const register = deps.register ?? registerApp;\n const renderQr = deps.renderQr ?? ((value) => qrcode.generate(value, { small: true }));\n const print = deps.print ?? ((line) => process.stdout.write(`${line}\\n`));\n\n print('');\n print('未检测到飞书 / Lark 应用凭据,进入扫码创建向导。');\n print('');\n\n const result = await register({\n source: deps.source ?? DEFAULT_SOURCE,\n ...(deps.signal ? { signal: deps.signal } : {}),\n onQRCodeReady: (info) => {\n print('请使用飞书 / Lark App 扫描以下二维码,创建或选择 PersonalAgent 应用:');\n print('');\n renderQr(info.url);\n print('');\n const minutes = Math.max(1, Math.round(info.expireIn / 60));\n print(`二维码有效期约 ${minutes} 分钟。`);\n print(`也可以直接在浏览器打开:${info.url}`);\n print('');\n },\n onStatusChange: (info) => {\n if (info.status === 'domain_switched') {\n print('已识别到国际版租户,自动切换到 larksuite.com 域名。');\n } else if (info.status === 'slow_down') {\n print('轮询速度过快,已自动降速。');\n }\n },\n });\n\n const tenant: LarkTenant = result.user_info?.tenant_brand === 'lark' ? 'lark' : 'feishu';\n\n print('✓ PersonalAgent 应用创建 / 绑定成功。');\n print(` App ID: ${result.client_id}`);\n print(` Tenant: ${tenant}`);\n print('');\n\n return {\n appId: result.client_id,\n appSecret: result.client_secret,\n tenant,\n operatorOpenId: result.user_info?.open_id,\n };\n}\n","import { mkdir, readFile, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n LarkChannel,\n NormalizedMessage,\n} from '@larksuite/channel';\n\nexport interface PreparedAttachments {\n imagePaths: string[];\n textFileNotes: string[];\n}\n\nconst MAX_TEXT_FILE_BYTES = 256_000;\n\nexport async function prepareAttachments(\n channel: LarkChannel | undefined,\n message: NormalizedMessage,\n mediaDir: string,\n): Promise<PreparedAttachments> {\n await mkdir(mediaDir, { recursive: true });\n const result: PreparedAttachments = { imagePaths: [], textFileNotes: [] };\n\n for (const resource of message.resources) {\n if (!channel || resource.type !== 'image' && resource.type !== 'file') continue;\n const destination = join(mediaDir, `${message.messageId}-${resource.fileKey}`);\n await channel.downloadResourceToFile(\n message.messageId,\n resource.fileKey,\n resource.type,\n destination,\n );\n\n if (resource.type === 'image') {\n result.imagePaths.push(destination);\n continue;\n }\n\n const info = await stat(destination);\n if (info.size > MAX_TEXT_FILE_BYTES) {\n result.textFileNotes.push(`[attachment: ${resource.fileName ?? resource.fileKey}] ${destination}`);\n continue;\n }\n\n const content = await readFile(destination, 'utf8');\n result.textFileNotes.push(\n `[attachment: ${resource.fileName ?? resource.fileKey}]\\n${content}`,\n );\n }\n\n return result;\n}\n","import { readFile } from 'node:fs/promises';\nimport { writeFileAtomic } from '../platform/atomic-write.js';\nimport { log } from '../core/logger.js';\n\nexport interface SessionRecord {\n sessionId: string | undefined;\n cwd: string;\n messages: ChatMessage[];\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\ninterface SessionData {\n chats: Record<string, SessionRecord>;\n}\n\nexport class SessionStore {\n private data: SessionData = { chats: {} };\n private saving: Promise<void> = Promise.resolve();\n private readonly path: string;\n\n constructor(path: string) {\n this.path = path;\n }\n\n async load(): Promise<void> {\n try {\n const raw = await readFile(this.path, 'utf8');\n const parsed = JSON.parse(raw) as Partial<SessionData>;\n this.data = {\n chats: Object.fromEntries(\n Object.entries(parsed.chats ?? {}).map(([scope, record]) => [\n scope,\n {\n sessionId: record.sessionId,\n cwd: record.cwd,\n messages: record.messages ?? [],\n },\n ]),\n ),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n }\n\n getRaw(scopeId: string): SessionRecord | undefined {\n return this.data.chats[scopeId];\n }\n\n set(scopeId: string, sessionId: string | undefined, cwd: string): void {\n const existing = this.data.chats[scopeId];\n this.data.chats[scopeId] = {\n sessionId: sessionId ?? existing?.sessionId,\n cwd,\n messages: existing?.messages ?? [],\n };\n this.schedulePersist();\n }\n\n historyFor(scopeId: string, cwd: string): ChatMessage[] {\n const record = this.data.chats[scopeId];\n return record && record.cwd === cwd ? record.messages : [];\n }\n\n recordExchange(\n scopeId: string,\n cwd: string,\n userMessages: string[],\n assistantMessage: string | undefined,\n ): void {\n const existing = this.data.chats[scopeId];\n const next: ChatMessage[] = [...(existing?.messages ?? [])];\n\n for (const content of userMessages) {\n if (content.trim()) next.push({ role: 'user', content });\n }\n\n if (assistantMessage?.trim()) {\n next.push({ role: 'assistant', content: assistantMessage });\n }\n\n this.data.chats[scopeId] = {\n sessionId: existing?.sessionId,\n cwd,\n messages: next.slice(-40),\n };\n this.schedulePersist();\n }\n\n clear(scopeId: string): boolean {\n if (!(scopeId in this.data.chats)) return false;\n delete this.data.chats[scopeId];\n this.schedulePersist();\n return true;\n }\n\n fork(scopeId: string, newScopeId: string, cwd: string): boolean {\n const source = this.data.chats[scopeId];\n if (!source) return false;\n this.data.chats[newScopeId] = {\n sessionId: undefined,\n cwd,\n messages: [...source.messages],\n };\n this.schedulePersist();\n return true;\n }\n\n resumeFor(scopeId: string, cwd: string): string | undefined {\n const record = this.data.chats[scopeId];\n return record && record.cwd === cwd ? record.sessionId : undefined;\n }\n\n async flush(): Promise<void> {\n await this.saving;\n }\n\n private schedulePersist(): void {\n const snapshot = this.snapshot();\n this.saving = this.saving\n .then(async () => {\n await writeFileAtomic(this.path, `${JSON.stringify(snapshot, null, 2)}\\n`, {\n mode: 0o600,\n });\n })\n .catch((error: unknown) => {\n log.fail('session', error, { step: 'persist' });\n });\n }\n\n private snapshot(): SessionData {\n return {\n chats: Object.fromEntries(\n Object.entries(this.data.chats).map(([key, record]) => [\n key,\n {\n ...record,\n messages: [...record.messages],\n },\n ]),\n ),\n };\n }\n}\n","import { execFile } from 'node:child_process';\nimport { randomBytes } from 'node:crypto';\nimport { access, copyFile, mkdir } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\nexport type GitRunner = (args: string[], cwd: string) => Promise<string>;\n\nexport interface WorktreeEnsureResult {\n cwd: string;\n created: boolean;\n branch?: string;\n}\n\nexport interface GitWorktreeOptions {\n worktreesRoot: string;\n runGit?: GitRunner;\n copyRulesFile?: (source: string, target: string) => Promise<void>;\n}\n\nasync function defaultRunGit(args: string[], cwd: string): Promise<string> {\n const result = await execFileAsync('git', args, {\n cwd,\n encoding: 'utf8',\n });\n return result.stdout;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function defaultCopyRulesFile(source: string, target: string): Promise<void> {\n await mkdir(dirname(target), { recursive: true });\n await copyFile(source, target);\n}\n\nfunction slugify(scope: string): string {\n const slug = scope\n .trim()\n .replace(/[^a-zA-Z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64);\n return slug || 'session';\n}\n\nexport class GitWorktreeManager {\n private readonly runGit: GitRunner;\n private readonly copyRulesFile: (source: string, target: string) => Promise<void>;\n\n constructor(private readonly options: GitWorktreeOptions) {\n this.runGit = options.runGit ?? defaultRunGit;\n this.copyRulesFile = options.copyRulesFile ?? defaultCopyRulesFile;\n }\n\n async ensure(scope: string, base: string): Promise<WorktreeEnsureResult> {\n const isGit = await this.isGitRepository(base);\n if (!isGit) return { cwd: base, created: false };\n\n const slug = slugify(scope);\n const target = join(this.options.worktreesRoot, slug);\n if (await exists(target)) {\n await this.ensureProjectRules(base, target);\n return { cwd: target, created: false };\n }\n\n const branch = `dsh-lark/${slug}-${Date.now().toString(36)}-${randomBytes(3).toString('hex')}`;\n await mkdir(this.options.worktreesRoot, { recursive: true });\n await this.runGit(['worktree', 'add', '-b', branch, target, 'HEAD'], base);\n await this.ensureProjectRules(base, target);\n return { cwd: target, created: true, branch };\n }\n\n async isGitRepository(cwd: string): Promise<boolean> {\n try {\n const result = await this.runGit(['rev-parse', '--is-inside-work-tree'], cwd);\n return result.trim() === 'true';\n } catch {\n return false;\n }\n }\n\n private async ensureProjectRules(base: string, target: string): Promise<void> {\n const destination = join(target, 'AGENTS.md');\n if (await exists(destination)) return;\n\n const sourceCandidates = [join(base, '.dsh-lark', 'AGENTS.md'), join(base, 'AGENTS.md')];\n for (const source of sourceCandidates) {\n if (await exists(source)) {\n await this.copyRulesFile(source, destination);\n return;\n }\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { writeFileAtomic } from '../platform/atomic-write.js';\nimport { log } from '../core/logger.js';\n\ninterface WorkspaceData {\n chats: Record<string, { cwd: string }>;\n named: Record<string, string>;\n lastUsed: Record<string, number>;\n}\n\nexport class WorkspaceStore {\n private data: WorkspaceData = { chats: {}, named: {}, lastUsed: {} };\n private saving: Promise<void> = Promise.resolve();\n private readonly path: string;\n\n constructor(path: string) {\n this.path = path;\n }\n\n async load(): Promise<void> {\n try {\n const raw = await readFile(this.path, 'utf8');\n const parsed = JSON.parse(raw) as Partial<WorkspaceData>;\n this.data = {\n chats: parsed.chats ?? {},\n named: parsed.named ?? {},\n lastUsed: parsed.lastUsed ?? {},\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n }\n\n cwdFor(scopeId: string): string | undefined {\n return this.data.chats[scopeId]?.cwd;\n }\n\n setCwd(scopeId: string, cwd: string): void {\n this.data.chats[scopeId] = { cwd };\n this.schedulePersist();\n }\n\n removeCwd(scopeId: string): boolean {\n if (!(scopeId in this.data.chats)) return false;\n delete this.data.chats[scopeId];\n this.schedulePersist();\n return true;\n }\n\n listNamed(): Record<string, string> {\n return { ...this.data.named };\n }\n\n getNamed(name: string): string | undefined {\n return this.data.named[name];\n }\n\n saveNamed(name: string, cwd: string): void {\n this.data.named[name] = cwd;\n this.data.lastUsed[name] = Date.now();\n this.schedulePersist();\n }\n\n touchNamed(name: string): void {\n if (!(name in this.data.named)) return;\n this.data.lastUsed[name] = Date.now();\n this.schedulePersist();\n }\n\n removeNamed(name: string): boolean {\n if (!(name in this.data.named)) return false;\n delete this.data.named[name];\n delete this.data.lastUsed[name];\n this.schedulePersist();\n return true;\n }\n\n listIndex(): Array<{ name: string; cwd: string; lastUsed: number | undefined }> {\n return Object.entries(this.data.named)\n .map(([name, cwd]) => ({ name, cwd, lastUsed: this.data.lastUsed[name] }))\n .sort((a, b) => (b.lastUsed ?? 0) - (a.lastUsed ?? 0));\n }\n\n async flush(): Promise<void> {\n await this.saving;\n }\n\n private schedulePersist(): void {\n const snapshot: WorkspaceData = {\n chats: { ...this.data.chats },\n named: { ...this.data.named },\n lastUsed: { ...this.data.lastUsed },\n };\n this.saving = this.saving\n .then(async () => {\n await writeFileAtomic(this.path, `${JSON.stringify(snapshot, null, 2)}\\n`, {\n mode: 0o600,\n });\n })\n .catch((error: unknown) => {\n log.fail('workspace', error, { step: 'persist' });\n });\n }\n}\n"],"mappings":"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","names":["resolve","join","resolve","homedir","existsSync","join","resolve","join","homedir","mkdir","dirname","join","mkdir","dirname","mkdir","spawn","spawn","resolve","resolve","markdown","markdown","resolve","minutes","markdown","resolve","mkdir","readFile","stat","join","readFile","readFile","randomBytes","mkdir","dirname","join","readFile","readFile","mkdir","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/dsh/event-channel.ts","../src/config/dsh-runtime.ts","../src/adapters/dsh/acp-runtime.ts","../src/adapters/dsh/acp-adapter.ts","../src/cli.ts","../src/cli/commands/doctor.ts","../src/adapters/index.ts","../src/adapters/dsh/adapter.ts","../src/adapters/dsh/availability.ts","../src/adapters/dsh/translate.ts","../src/adapters/dsh/sdk-adapter.ts","../src/adapters/dsh/sdk-translate.ts","../src/adapters/dsh/sdk-runtime.ts","../src/config/app-paths.ts","../src/config/env.ts","../src/config/profile-store.ts","../src/platform/atomic-write.ts","../src/cli/commands/start.ts","../src/bot/active-runs.ts","../src/config/security.ts","../src/core/logger.ts","../src/bot/approvals.ts","../src/bot/density-store.ts","../src/bot/pending-queue.ts","../src/bot/questions.ts","../src/bot/run-policy.ts","../src/bridge/channel.ts","../src/commands/index.ts","../src/card/workspace-card.ts","../src/card/density.ts","../src/bridge/run-flow.ts","../src/card/run-state.ts","../src/card/run-renderer.ts","../src/card/approval-card.ts","../src/card/question-card.ts","../src/bridge/lark-channel.ts","../src/config/access-manager.ts","../src/onboard/registration.ts","../src/media/attachments.ts","../src/session/store.ts","../src/workspace/git-worktree.ts","../src/workspace/store.ts"],"sourcesContent":["/** Ordered async queue used to stream translated events out of a run. */\nexport class EventChannel<T> implements AsyncIterable<T> {\n private static readonly END = Symbol('event-channel-end');\n private readonly queue: T[] = [];\n private readonly waiters: Array<(event: T) => void> = [];\n private closed = false;\n\n push(event: T): void {\n if (this.closed) return;\n const waiter = this.waiters.shift();\n if (waiter) {\n waiter(event);\n } else {\n this.queue.push(event);\n }\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n for (const waiter of this.waiters.splice(0)) {\n waiter(EventChannel.END as unknown as T);\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n for (;;) {\n if (this.closed && this.queue.length === 0) return;\n const queued = this.queue.shift();\n if (queued !== undefined) {\n yield queued;\n continue;\n }\n const value = await new Promise<T>((resolve) => {\n this.waiters.push(resolve);\n });\n if (value === EventChannel.END) return;\n yield value;\n }\n }\n}\n","import { existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface DshRuntimeSpec {\n command: string;\n args: string[];\n bin?: string;\n}\n\nconst DS_HARNESS_RELATIVE = join('@deepseek-ai', 'dsh', 'lib', 'bin.js');\n\nexport function resolveDshHome(\n home: string,\n env: NodeJS.ProcessEnv = process.env,\n): string {\n return env.DSH_HOME?.trim() || join(home, '.dsh');\n}\n\nfunction firstExisting(...paths: string[]): string | undefined {\n return paths.find((path) => existsSync(path));\n}\n\nfunction children(root: string): string[] {\n try {\n return readdirSync(root, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() || entry.isSymbolicLink())\n .map((entry) => join(root, entry.name));\n } catch {\n return [];\n }\n}\n\nexport function discoverDshBin(\n home: string,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const dshHome = resolveDshHome(home, env);\n\n const candidates = [\n join(dshHome, 'profiles', 'node_modules', DS_HARNESS_RELATIVE),\n join(home, '.npm', '_npx', 'node_modules', DS_HARNESS_RELATIVE),\n join(home, '.cache', 'pnpm', 'dlx', 'node_modules', DS_HARNESS_RELATIVE),\n join(home, '.local', 'share', 'pnpm', 'node_modules', DS_HARNESS_RELATIVE),\n ];\n\n const direct = firstExisting(...candidates);\n if (direct) return direct;\n\n for (const root of [join(home, '.npm', '_npx'), join(home, '.cache', 'pnpm', 'dlx')]) {\n for (const child of children(root)) {\n const path = join(child, 'node_modules', DS_HARNESS_RELATIVE);\n if (existsSync(path)) return path;\n }\n }\n\n return undefined;\n}\n\nexport function resolveDshRuntime(\n input: {\n command?: string;\n args?: string[];\n home: string;\n env?: NodeJS.ProcessEnv;\n },\n): DshRuntimeSpec {\n if (input.command || input.args) {\n return {\n command: input.command ?? 'node',\n args: input.args ?? ['--profile', 'headless'],\n };\n }\n\n const bin = discoverDshBin(input.home, input.env);\n if (bin) {\n return {\n command: 'node',\n args: [bin, '--profile', 'headless'],\n bin,\n };\n }\n\n return {\n command: 'dsh',\n args: ['--profile', 'headless'],\n };\n}\n","import { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { discoverDshBin, resolveDshHome } from '../../config/dsh-runtime.js';\n\nexport const ACP_PACKAGE = '@deepseek-ai/dsh-acp';\nexport const ACP_VERSION = '0.1.0-rc.6';\nexport const ACP_BASE_BUNDLE = '@deepseek-ai/dsh-base';\nexport const DEFAULT_ACP_PROFILE = 'dsh-lark-acp';\n\nexport interface AcpRuntimeOptions {\n home: string;\n env?: NodeJS.ProcessEnv;\n command?: string;\n args?: string[];\n bin?: string;\n profile?: string;\n provider?: string;\n model?: string;\n install?: (profileRoot: string) => Promise<void>;\n}\n\nexport interface AcpLaunchSpec {\n command: string;\n args: string[];\n profile: string;\n}\n\nexport interface AcpProfileEnsureResult {\n ok: boolean;\n created: boolean;\n error?: string;\n}\n\nexport function acpProfileRoot(home: string, profile: string, env?: NodeJS.ProcessEnv): string {\n return join(resolveDshHome(home, env), 'profiles', profile);\n}\n\nfunction packageJsonFor(profile: string): string {\n return `${JSON.stringify(\n {\n name: `dsh-profile-${profile}`,\n private: true,\n dependencies: {\n [ACP_PACKAGE]: ACP_VERSION,\n },\n dsh: {\n profile: {\n bundles: [ACP_BASE_BUNDLE],\n },\n },\n },\n null,\n 2,\n )}\\n`;\n}\n\nexport function acpPatchYaml(provider: string, model: string): string {\n return [\n '# dsh-lark ACP JSON-RPC runtime overlay (managed by dsh-lark-bot).',\n '# stdout is reserved for ACP JSON-RPC frames; no console logger may load.',\n '- insert:',\n ' - id: acp',\n ` name: '${ACP_PACKAGE}'`,\n ' config:',\n ` provider: ${provider}`,\n ` model: ${model}`,\n '',\n '# Unattended IM runtime: interactive user questions cannot be answered',\n '# through Feishu, so the tool is disabled (default-deny).',\n '- id: user-questions',\n ' disabled: true',\n '',\n '- id: system-prompt',\n ' config:',\n ' persona: >-',\n ' You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.',\n '',\n '- id: hmr',\n ' disabled: true',\n '',\n ].join('\\n');\n}\n\nfunction acpPluginInstalled(profileRoot: string): boolean {\n const candidates = [\n join(profileRoot, 'node_modules', ACP_PACKAGE),\n join(profileRoot, '..', 'node_modules', ACP_PACKAGE),\n ];\n return candidates.some((path) => existsSync(path));\n}\n\nexport function isAcpProfileReady(profileRoot: string): boolean {\n return (\n existsSync(join(profileRoot, 'package.json')) &&\n existsSync(join(profileRoot, 'cordis.yml')) &&\n existsSync(join(profileRoot, 'cordis.patch.yml')) &&\n acpPluginInstalled(profileRoot)\n );\n}\n\nfunction runPnpmInstall(profileRoot: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn('pnpm', ['install'], {\n cwd: profileRoot,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let output = '';\n child.stdout.on('data', (chunk: Buffer) => {\n output += chunk.toString('utf8');\n });\n child.stderr.on('data', (chunk: Buffer) => {\n output += chunk.toString('utf8');\n });\n child.on('error', (error) => {\n reject(error);\n });\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n const tail = output.trim().split('\\n').slice(-8).join('\\n');\n reject(new Error(`pnpm install exited with code ${String(code)}\\n${tail}`));\n });\n });\n}\n\n/**\n * Ensure the ACP runtime profile exists under the shared dsh installation.\n * The profile composes `@deepseek-ai/dsh-base` with the official\n * `@deepseek-ai/dsh-acp` plugin (approval policy stays `ask`; the bridge\n * answers through `session/request_permission`).\n */\nexport async function ensureAcpProfile(\n options: AcpRuntimeOptions,\n): Promise<AcpProfileEnsureResult> {\n const profile = options.profile ?? DEFAULT_ACP_PROFILE;\n const root = acpProfileRoot(options.home, profile, options.env);\n const provider = options.provider ?? 'deepseek-official';\n const model = options.model ?? 'deepseek-v4-flash';\n const ready = isAcpProfileReady(root);\n\n try {\n if (!ready) {\n await mkdir(root, { recursive: true });\n await writeFile(join(root, 'package.json'), packageJsonFor(profile), 'utf8');\n await writeFile(join(root, 'cordis.yml'), '[]\\n', 'utf8');\n await writeFile(join(root, 'cordis.patch.yml'), acpPatchYaml(provider, model), 'utf8');\n const install = options.install ?? runPnpmInstall;\n await install(root);\n if (!isAcpProfileReady(root)) {\n return {\n ok: false,\n created: true,\n error: `${ACP_PACKAGE}@${ACP_VERSION} was not found after install`,\n };\n }\n }\n // The patch carries the provider/model route; rewrite it when changed so\n // profile re-use picks up env overrides without reinstalling plugins.\n await writeFile(join(root, 'cordis.patch.yml'), acpPatchYaml(provider, model), 'utf8');\n return { ok: true, created: !ready };\n } catch (error) {\n return {\n ok: false,\n created: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/** Resolve the launch spec for the ACP runtime subprocess. */\nexport function resolveAcpLaunch(options: AcpRuntimeOptions): AcpLaunchSpec {\n const profile = options.profile ?? DEFAULT_ACP_PROFILE;\n if (options.command || options.args) {\n return {\n command: options.command ?? 'node',\n args: options.args ?? ['--profile', profile],\n profile,\n };\n }\n const bin = options.bin ?? discoverDshBin(options.home, options.env);\n if (bin) {\n return { command: 'node', args: [bin, '--profile', profile], profile };\n }\n return { command: 'dsh', args: ['--profile', profile], profile };\n}\n","import { randomUUID } from 'node:crypto';\nimport {\n spawn as defaultSpawn,\n type ChildProcess,\n type SpawnOptionsWithoutStdio,\n} from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { Readable as NodeReadable, Writable as NodeWritable } from 'node:stream';\nimport {\n ClientSideConnection,\n ndJsonStream,\n PROTOCOL_VERSION,\n type Agent as AcpAgent,\n type Client as AcpClient,\n type ContentBlock as AcpContentBlock,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type SessionNotification,\n} from '@agentclientprotocol/sdk';\nimport type { RuntimeEnv } from '../../config/env.js';\nimport type {\n AgentAdapter,\n AgentAvailability,\n AgentEvent,\n AgentRun,\n AgentRunOptions,\n ApprovalOutcome,\n ApprovalRequest,\n} from '../types.js';\nimport { ensureAcpProfile, resolveAcpLaunch, type AcpLaunchSpec } from './acp-runtime.js';\nimport { EventChannel } from './event-channel.js';\n\nexport interface AcpAdapterOptions {\n launch: AcpLaunchSpec;\n provider: string;\n model: string;\n probeTimeoutMs?: number;\n spawn?: (command: string, args: string[], options: SpawnOptionsWithoutStdio) => ChildProcess;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction textOfContent(content: unknown): string {\n if (!isRecord(content) || typeof content.text !== 'string') return '';\n return content.text;\n}\n\n/** Translate an ACP session update into bridge events (forward-compatible). */\nexport function translateAcpUpdate(notification: SessionNotification): AgentEvent[] {\n const update = notification.update;\n if (!isRecord(update)) return [];\n switch (update.sessionUpdate) {\n case 'agent_message_chunk':\n return textOfContent(update.content)\n ? [{ type: 'text', delta: textOfContent(update.content) }]\n : [];\n case 'agent_thought_chunk':\n return textOfContent(update.content)\n ? [{ type: 'thinking', delta: textOfContent(update.content) }]\n : [];\n case 'tool_call': {\n if (typeof update.toolCallId !== 'string') return [];\n return [\n {\n type: 'tool_use',\n id: update.toolCallId,\n name: typeof update.title === 'string' ? update.title : 'tool',\n input: update.rawInput ?? {},\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction mapApprovalOutcome(\n outcome: ApprovalOutcome,\n options: RequestPermissionRequest['options'],\n): RequestPermissionResponse {\n if (outcome === 'cancelled') {\n return { outcome: { outcome: 'cancelled' } };\n }\n const wanted: 'allow_once' | 'reject_once' =\n outcome === 'allowed-once' ? 'allow_once' : 'reject_once';\n const option = options.find((item) => item.kind === wanted);\n if (!option) return { outcome: { outcome: 'cancelled' } };\n return { outcome: { outcome: 'selected', optionId: option.optionId } };\n}\n\nfunction buildPromptText(prompt: string, images: readonly string[] | undefined): string {\n return images?.length\n ? `${prompt}\\n\\nImage files attached to this message:\\n${images.join('\\n')}`\n : prompt;\n}\n\nfunction waitForChildExit(\n child: ChildProcess,\n timeoutMs: number,\n): Promise<{ code: number | null; timedOut: boolean }> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return Promise.resolve({ code: child.exitCode, timedOut: false });\n }\n return new Promise((resolve) => {\n const timer =\n timeoutMs > 0\n ? setTimeout(() => {\n child.removeListener('exit', onExit);\n resolve({ code: child.exitCode, timedOut: true });\n }, timeoutMs)\n : undefined;\n const onExit = (code: number | null): void => {\n if (timer !== undefined) clearTimeout(timer);\n resolve({ code, timedOut: false });\n };\n child.once('exit', onExit);\n });\n}\n\nasync function disposeChild(child: ChildProcess, graceMs: number): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) return;\n child.stdin?.end();\n if (!(await waitForChildExit(child, graceMs)).timedOut) return;\n child.kill('SIGTERM');\n if (!(await waitForChildExit(child, graceMs)).timedOut) return;\n child.kill('SIGKILL');\n}\n\n/**\n * Official ACP adapter. Spawns the `dsh-lark-acp` runtime and speaks the\n * Agent Client Protocol over stdio as a client: `session/request_permission`\n * maps to Feishu approval cards through `AgentRunOptions.onApprovalRequest`.\n * ACP sessions are fresh per run (no resume), matching the upstream server.\n */\nexport class AcpDshAdapter implements AgentAdapter {\n readonly id = 'dsh-acp';\n readonly displayName = 'DeepSeek Harness (ACP)';\n\n private readonly launch: AcpLaunchSpec;\n private readonly model: string;\n private readonly probeTimeoutMs: number;\n private readonly spawn: AcpAdapterOptions['spawn'];\n private readonly stopGraceMs: number;\n\n constructor(options: AcpAdapterOptions) {\n this.launch = options.launch;\n this.model = options.model;\n this.probeTimeoutMs = options.probeTimeoutMs ?? 15_000;\n this.spawn = options.spawn;\n this.stopGraceMs = 5_000;\n }\n\n async isAvailable(): Promise<boolean> {\n return (await this.checkAvailability()).ok;\n }\n\n async checkAvailability(): Promise<AgentAvailability> {\n const child = this.spawnChild(process.cwd());\n if (!child.stdin || !child.stdout) {\n await disposeChild(child, this.stopGraceMs);\n return { ok: false, error: 'ACP child did not expose protocol streams', version: undefined };\n }\n const conn = new ClientSideConnection(\n () => ({\n requestPermission: () => Promise.resolve({ outcome: { outcome: 'cancelled' } }),\n sessionUpdate: () => Promise.resolve(),\n }),\n ndJsonStream(\n NodeWritable.toWeb(child.stdin) as WritableStream<Uint8Array>,\n NodeReadable.toWeb(child.stdout) as ReadableStream<Uint8Array>,\n ),\n );\n try {\n const info = await withTimeout(\n conn.initialize({ protocolVersion: PROTOCOL_VERSION, clientCapabilities: {} }),\n this.probeTimeoutMs,\n );\n const name = info.agentInfo?.name ?? 'deepseek-harness-acp';\n const version = info.agentInfo?.version ?? 'unknown';\n return { ok: true, error: undefined, version: `${name}@${version}` };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n version: undefined,\n };\n } finally {\n await disposeChild(child, this.stopGraceMs);\n }\n }\n\n run(options: AgentRunOptions): AgentRun {\n const cwd = options.cwd ?? process.cwd();\n const model = options.model ?? this.model;\n const stopRequested = { value: false };\n const channel = new EventChannel<AgentEvent>();\n const child = this.spawnChild(cwd);\n let serverSessionId: string | undefined;\n let conn: ClientSideConnection | undefined;\n let hadError = false;\n const clientSessionId = `acp-${randomUUID().replaceAll('-', '')}`;\n\n const makeClient = (_agent: AcpAgent): AcpClient => ({\n sessionUpdate: async (notification: SessionNotification) => {\n for (const event of translateAcpUpdate(notification)) {\n if (event.type === 'error') hadError = true;\n channel.push(event);\n }\n },\n requestPermission: async (request: RequestPermissionRequest) => {\n if (!options.onApprovalRequest) {\n return { outcome: { outcome: 'cancelled' } };\n }\n const approval: ApprovalRequest = {\n id: request.toolCall.toolCallId,\n sessionId: request.sessionId,\n toolName:\n typeof request.toolCall.title === 'string' ? request.toolCall.title : 'tool',\n reason: undefined,\n options: request.options.map((item) => ({\n optionId: item.optionId,\n name: item.name,\n kind: item.kind,\n })),\n };\n const outcome = await options.onApprovalRequest(approval);\n return mapApprovalOutcome(outcome, request.options);\n },\n });\n\n const task = (async () => {\n if (!child.stdin || !child.stdout) {\n throw new Error('ACP child did not expose protocol streams');\n }\n conn = new ClientSideConnection(\n makeClient,\n ndJsonStream(\n NodeWritable.toWeb(child.stdin) as WritableStream<Uint8Array>,\n NodeReadable.toWeb(child.stdout) as ReadableStream<Uint8Array>,\n ),\n );\n await conn.initialize({ protocolVersion: PROTOCOL_VERSION, clientCapabilities: {} });\n const created = await conn.newSession({ cwd, mcpServers: [] });\n serverSessionId = created.sessionId;\n const blocks: AcpContentBlock[] = [\n { type: 'text', text: buildPromptText(options.prompt, options.images) },\n ];\n const response = await conn.prompt({ sessionId: serverSessionId, prompt: blocks });\n if (response.stopReason === 'cancelled') {\n if (!stopRequested.value) {\n channel.push({ type: 'error', message: 'ACP turn cancelled', terminationReason: 'interrupted' });\n hadError = true;\n }\n return;\n }\n if (response.stopReason === 'refusal' || response.stopReason === 'max_turn_requests') {\n channel.push({\n type: 'error',\n message: `ACP turn stopped with reason: ${response.stopReason}`,\n terminationReason: 'failed',\n });\n hadError = true;\n return;\n }\n if (response.usage) {\n const usage: AgentEvent = {\n type: 'usage',\n ...(typeof response.usage.inputTokens === 'number'\n ? { inputTokens: response.usage.inputTokens }\n : {}),\n ...(typeof response.usage.outputTokens === 'number'\n ? { outputTokens: response.usage.outputTokens }\n : {}),\n };\n channel.push(usage);\n }\n })().catch((error: unknown) => {\n if (!stopRequested.value) {\n channel.push({\n type: 'error',\n message: error instanceof Error ? error.message : String(error),\n terminationReason: 'failed',\n });\n hadError = true;\n }\n }).finally(() => {\n channel.close();\n });\n\n async function* events(): AsyncGenerator<AgentEvent> {\n yield {\n type: 'system',\n sessionId: clientSessionId,\n cwd,\n model,\n };\n for await (const event of channel) {\n yield event;\n }\n await task;\n if (!hadError) {\n yield {\n type: 'done',\n sessionId: clientSessionId,\n terminationReason: stopRequested.value ? 'interrupted' : 'normal',\n };\n }\n }\n\n return {\n runId: options.runId,\n events: events(),\n stop: async () => {\n stopRequested.value = true;\n if (conn && serverSessionId !== undefined) {\n try {\n await conn.cancel({ sessionId: serverSessionId });\n } catch {\n // The child may already be gone; teardown below is authoritative.\n }\n }\n await disposeChild(child, this.stopGraceMs);\n },\n waitForExit: (timeoutMs) =>\n waitForChildExit(child, timeoutMs).then((result) => !result.timedOut && result.code !== null),\n };\n }\n\n private spawnChild(cwd: string): ChildProcess {\n const spawnFn = this.spawn ?? defaultSpawn;\n return spawnFn(this.launch.command, this.launch.args, {\n cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n }\n}\n\nfunction withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`ACP probe timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n promise.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error: unknown) => {\n clearTimeout(timer);\n reject(error);\n },\n );\n });\n}\n\n/** Build the ACP adapter for the configured env (used by `buildAgentAdapter`). */\nexport async function buildAcpAgentAdapter(\n env: RuntimeEnv,\n preferences: { stopGraceMs: number | undefined; model: string | undefined },\n): Promise<AcpDshAdapter> {\n const runtimeOptions = {\n home: homedir(),\n env: process.env,\n provider: env.provider,\n model: preferences.model ?? env.model,\n ...(env.dshExplicit ? { command: env.dshCommand, args: env.dshArgs } : {}),\n };\n const ensure = await ensureAcpProfile(runtimeOptions);\n if (!ensure.ok) {\n throw new Error(\n `ACP runtime profile setup failed: ${ensure.error ?? 'unknown error'} ` +\n '(install pnpm, or set DSH_LARK_ADAPTER=headless for the legacy adapter)',\n );\n }\n const launch = resolveAcpLaunch(runtimeOptions);\n return new AcpDshAdapter({\n launch,\n provider: env.provider,\n model: preferences.model ?? env.model,\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { Command } from 'commander';\nimport { runDoctor } from './cli/commands/doctor.js';\nimport { runStart } from './cli/commands/start.js';\n\nfunction packageVersion(): string {\n const raw = readFileSync(new URL('../package.json', import.meta.url), 'utf8');\n const pkg = JSON.parse(raw) as { version?: unknown };\n return typeof pkg.version === 'string' ? pkg.version : '0.0.0';\n}\n\nexport interface StartOptions {\n profile?: string;\n workspace?: string;\n appId?: string;\n appSecret?: string;\n tenant?: string;\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name('dsh-lark-bot')\n .description('Bridge DeepSeek Harness into Feishu / Lark')\n .version(packageVersion(), '-v, --version');\n\n program\n .command('start')\n .description('Start the bridge in the foreground')\n .option('--profile <name>', 'profile name')\n .option('--workspace <path>', 'initial working directory')\n .option('--app-id <id>', 'existing Lark/Feishu app id')\n .option('--app-secret <secret>', 'existing Lark/Feishu app secret')\n .option('--tenant <tenant>', 'feishu or lark')\n .action(async (opts: StartOptions) => {\n await runStart(opts);\n });\n\n program\n .command('doctor')\n .description('Run local diagnostics')\n .option('--profile <name>', 'profile name')\n .option('--workspace <path>', 'initial working directory')\n .option('--app-id <id>', 'existing Lark/Feishu app id')\n .option('--app-secret <secret>', 'existing Lark/Feishu app secret')\n .option('--tenant <tenant>', 'feishu or lark')\n .action(async (opts: StartOptions) => {\n await runDoctor({ ...opts, version: packageVersion() });\n });\n\n return program;\n}\n\nexport async function main(argv: readonly string[] = process.argv): Promise<void> {\n await buildProgram().parseAsync([...argv]);\n}\n","import { stat } from 'node:fs/promises';\nimport { buildAgentAdapter } from '../../adapters/index.js';\nimport { resolveAppPaths } from '../../config/app-paths.js';\nimport { loadRuntimeEnv } from '../../config/env.js';\nimport { ConfigStore } from '../../config/profile-store.js';\nimport type { StartOptions } from '../../cli.js';\n\nexport interface DoctorOptions extends StartOptions {\n version?: string;\n output?: (text: string) => void;\n}\n\nexport async function runDoctor(options: DoctorOptions): Promise<void> {\n const env = loadRuntimeEnv({\n ...process.env,\n ...(options.workspace ? { DSH_LARK_WORKSPACE: options.workspace } : {}),\n ...(options.tenant ? { DSH_LARK_TENANT: options.tenant } : {}),\n ...(options.appId ? { DSH_LARK_APP_ID: options.appId } : {}),\n ...(options.appSecret ? { DSH_LARK_APP_SECRET: options.appSecret } : {}),\n });\n const paths = resolveAppPaths(env.home);\n const profileName = options.profile ?? 'default';\n const store = new ConfigStore(paths.configFile);\n await store.load();\n const profile = store.getProfile(profileName);\n\n const lines: string[] = [\n 'dsh-lark-bot doctor',\n `version: ${options.version ?? 'unknown'}`,\n `node: ${process.version}`,\n `profile: ${profileName}`,\n `home: ${paths.root}`,\n `adapter: ${env.adapterMode}`,\n `dsh_command: ${env.dshCommand}`,\n `dsh_args: ${env.dshArgs.join(',')}`,\n ];\n\n let critical = false;\n\n if (!profile) {\n lines.push('config: missing');\n critical = true;\n } else {\n lines.push(\n [\n 'config: ok',\n `tenant=${profile.tenant}`,\n `app_id=${profile.accounts.appId}`,\n `app_secret=${profile.accounts.appSecret ? 'present' : 'missing'}`,\n `allowed_users=${profile.access.allowedUsers.length}`,\n `allowed_chats=${profile.access.allowedChats.length}`,\n ].join(' '),\n );\n if (!profile.accounts.appId || !profile.accounts.appSecret) critical = true;\n }\n\n const workspace =\n options.workspace ??\n profile?.workspaces.default ??\n env.workspace ??\n paths.profilePath(profileName, 'workspace');\n try {\n const info = await stat(workspace);\n lines.push(`workspace: ${workspace} (${info.isDirectory() ? 'directory' : 'not-directory'})`);\n } catch {\n lines.push(`workspace: ${workspace} (missing)`);\n }\n\n try {\n const adapter = await buildAgentAdapter(env, {\n stopGraceMs: profile?.preferences.stopGraceMs,\n model: profile?.preferences.model,\n });\n const availability = await adapter.checkAvailability();\n if (availability.ok) {\n lines.push(`dsh: ok${availability.version ? ` (${availability.version})` : ''}`);\n } else {\n lines.push(`dsh: unavailable (${availability.error ?? 'unknown'})`);\n critical = true;\n }\n await adapter.dispose?.();\n } catch (error) {\n lines.push(`dsh: unavailable (${error instanceof Error ? error.message : String(error)})`);\n critical = true;\n }\n\n const output = options.output ?? ((text: string) => process.stdout.write(text));\n output(`${lines.join('\\n')}\\n`);\n if (critical) process.exitCode = 1;\n}\n","import { homedir } from 'node:os';\nimport type { RuntimeEnv } from '../config/env.js';\nimport { DshAdapter } from './dsh/adapter.js';\nimport { SdkDshAdapter } from './dsh/sdk-adapter.js';\nimport { ensureSdkProfile, resolveSdkLaunch } from './dsh/sdk-runtime.js';\nimport type { AgentAdapter } from './types.js';\n\nexport interface AdapterPreferences {\n stopGraceMs: number | undefined;\n model: string | undefined;\n}\n\n/**\n * Build the agent adapter for the configured mode:\n * - `sdk` (default): official `@deepseek-ai/dsh-sdk-client` runtime.\n * - `acp`: official ACP server runtime with approval cards.\n * - `headless`: legacy subprocess fallback (kept for compatibility).\n */\nexport async function buildAgentAdapter(\n env: RuntimeEnv,\n preferences: AdapterPreferences = { stopGraceMs: undefined, model: undefined },\n): Promise<AgentAdapter> {\n switch (env.adapterMode) {\n case 'headless': {\n const options: ConstructorParameters<typeof DshAdapter>[0] = {\n command: env.dshCommand,\n args: env.dshArgs,\n };\n if (preferences.stopGraceMs !== undefined) {\n options.stopGraceMs = preferences.stopGraceMs;\n }\n return new DshAdapter(options);\n }\n case 'acp': {\n const { buildAcpAgentAdapter } = await import('./dsh/acp-adapter.js');\n return buildAcpAgentAdapter(env, preferences);\n }\n case 'sdk':\n default: {\n const runtimeOptions = {\n home: homedir(),\n env: process.env,\n ...(env.dshExplicit\n ? { command: env.dshCommand, args: env.dshArgs }\n : {}),\n };\n const ensure = await ensureSdkProfile(runtimeOptions);\n if (!ensure.ok) {\n throw new Error(\n `SDK runtime profile setup failed: ${ensure.error ?? 'unknown error'} ` +\n '(install pnpm, or set DSH_LARK_ADAPTER=headless for the legacy adapter)',\n );\n }\n const launch = resolveSdkLaunch(runtimeOptions);\n return new SdkDshAdapter({\n launch,\n provider: env.provider,\n model: preferences.model ?? env.model,\n ...(env.maxTokens === undefined ? {} : { maxTokens: env.maxTokens }),\n });\n }\n }\n}\n","import { spawn } from 'cross-spawn';\nimport { createInterface } from 'node:readline';\nimport type { ChildProcess } from 'node:child_process';\nimport { checkDshAvailability } from './availability.js';\nimport { plainOutputEvent, translateDshLine } from './translate.js';\nimport type {\n AgentAdapter,\n AgentAvailability,\n AgentEvent,\n AgentRun,\n AgentRunOptions,\n} from '../types.js';\n\nexport interface DshAdapterOptions {\n command?: string;\n args?: string[];\n stopGraceMs?: number;\n}\n\ntype DshChild = ChildProcess;\n\nexport class DshAdapter implements AgentAdapter {\n readonly id = 'dsh';\n readonly displayName = 'DeepSeek Harness';\n\n private readonly command: string;\n private readonly args: string[];\n private readonly stopGraceMs: number;\n\n constructor(options: DshAdapterOptions = {}) {\n this.command = options.command ?? 'dsh';\n this.args = options.args ?? ['--profile', 'headless'];\n this.stopGraceMs = options.stopGraceMs ?? 5_000;\n }\n\n async isAvailable(): Promise<boolean> {\n return (await this.checkAvailability()).ok;\n }\n\n checkAvailability(): Promise<AgentAvailability> {\n return checkDshAvailability({ command: this.command, args: this.args });\n }\n\n run(options: AgentRunOptions): AgentRun {\n const prompt =\n options.images?.length\n ? `${options.prompt}\\n\\nImage files attached to this message:\\n${options.images.join('\\n')}`\n : options.prompt;\n\n const child = spawn(\n this.command,\n [...this.args, prompt],\n {\n cwd: options.cwd,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n ) as DshChild;\n\n child.stdin?.end();\n\n const stderrChunks: Buffer[] = [];\n let runtimeError: Error | null = null;\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrChunks.push(chunk);\n });\n child.on('error', (error: Error) => {\n runtimeError = error;\n });\n\n return {\n runId: options.runId,\n events: createEventStream(child, stderrChunks, () => runtimeError, {\n sessionId: options.sessionId,\n cwd: options.cwd,\n model: options.model,\n }),\n stop: () => stopChild(child, this.stopGraceMs),\n waitForExit: (timeoutMs) => waitForChildExit(child, timeoutMs),\n };\n }\n}\n\nasync function* createEventStream(\n child: DshChild,\n stderrChunks: Buffer[],\n getError: () => Error | null,\n system: {\n sessionId: string | undefined;\n cwd: string | undefined;\n model: string | undefined;\n },\n): AsyncGenerator<AgentEvent> {\n if (!child.pid) {\n const error = getError();\n yield {\n type: 'error',\n message: error ? `failed to spawn dsh: ${error.message}` : 'spawn returned no pid',\n terminationReason: 'failed',\n };\n return;\n }\n\n yield {\n type: 'system',\n sessionId: system.sessionId,\n cwd: system.cwd,\n model: system.model,\n };\n\n if (!child.stdout) {\n yield {\n type: 'error',\n message: 'dsh stdout stream is unavailable',\n terminationReason: 'failed',\n };\n return;\n }\n\n const lines = createInterface({ input: child.stdout, crlfDelay: Infinity });\n const plainLines: string[] = [];\n let emittedProtocol = false;\n let terminalEmitted = false;\n\n for await (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const events = translateDshLine(trimmed);\n if (events.length > 0) {\n emittedProtocol = true;\n for (const event of events) {\n if (event.type === 'done' || event.type === 'error') terminalEmitted = true;\n yield event;\n }\n } else {\n plainLines.push(trimmed);\n }\n }\n\n const exitCode = await waitForExitResult(child, 0).then((value) => value.code);\n const runtimeError = getError();\n\n if (!terminalEmitted) {\n if (exitCode !== null && exitCode !== 0) {\n const stderr = Buffer.concat(stderrChunks).toString('utf8').trim();\n const detail = stderr ? `: ${stderr.slice(0, 500)}` : '';\n yield {\n type: 'error',\n message: `dsh exited with code ${exitCode}${detail}`,\n terminationReason: 'failed',\n };\n return;\n }\n\n if (runtimeError) {\n yield {\n type: 'error',\n message: `dsh runtime error: ${runtimeError.message}`,\n terminationReason: 'failed',\n };\n return;\n }\n\n if (emittedProtocol) {\n yield { type: 'done', sessionId: system.sessionId, terminationReason: 'normal' };\n } else {\n yield* plainOutputEvent(plainLines.join('\\n'));\n yield { type: 'done', sessionId: system.sessionId, terminationReason: 'normal' };\n }\n }\n}\n\nasync function waitForExitResult(\n child: DshChild,\n timeoutMs: number,\n): Promise<{ code: number | null; timedOut: boolean }> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return { code: child.exitCode, timedOut: false };\n }\n\n return new Promise((resolve) => {\n const onExit = (code: number | null): void => {\n if (timer !== undefined) clearTimeout(timer);\n resolve({ code, timedOut: false });\n };\n const timer =\n timeoutMs > 0\n ? setTimeout(() => {\n child.removeListener('exit', onExit);\n resolve({ code: child.exitCode, timedOut: true });\n }, timeoutMs)\n : undefined;\n child.once('exit', onExit);\n });\n}\n\nasync function stopChild(child: DshChild, graceMs: number): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) return;\n child.kill('SIGTERM');\n const stopped = await waitForExitResult(child, graceMs);\n if (!stopped.timedOut) return;\n child.kill('SIGKILL');\n}\n\nasync function waitForChildExit(child: DshChild, timeoutMs: number): Promise<boolean> {\n const result = await waitForExitResult(child, timeoutMs);\n return !result.timedOut && result.code !== null;\n}\n","import { spawn } from 'cross-spawn';\nimport { existsSync } from 'node:fs';\nimport type { AgentAvailability } from '../types.js';\n\nexport interface AvailabilityCheckOptions {\n command: string;\n args?: string[];\n timeoutMs?: number;\n}\n\nexport async function checkDshAvailability(\n options: AvailabilityCheckOptions,\n): Promise<AgentAvailability> {\n const timeoutMs = options.timeoutMs ?? 5_000;\n const versionArgs = options.command === 'node' && options.args?.[0] && existsSync(options.args[0])\n ? [options.args[0], '--version']\n : ['--version'];\n\n return new Promise((resolve) => {\n const child = spawn(options.command, versionArgs, {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const finish = (result: AgentAvailability): void => {\n if (settled) return;\n settled = true;\n resolve(result);\n };\n\n const timer = setTimeout(() => {\n child.kill('SIGKILL');\n finish({ ok: false, error: `timed out after ${timeoutMs}ms`, version: undefined });\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString('utf8');\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString('utf8');\n });\n child.on('error', (error) => {\n clearTimeout(timer);\n finish({ ok: false, error: error.message, version: undefined });\n });\n child.on('exit', (code) => {\n clearTimeout(timer);\n const version = stdout.trim();\n if (code !== 0 && !version) {\n finish({ ok: false, error: stderr.trim() || `exited with code ${String(code)}`, version: undefined });\n return;\n }\n finish({ ok: true, error: undefined, version: version || undefined });\n });\n });\n}\n","import type { AgentEvent } from '../types.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nexport function translateDshLine(line: string): AgentEvent[] {\n const trimmed = line.trim();\n if (!trimmed) return [];\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!isRecord(parsed) || typeof parsed.type !== 'string') return [];\n\n switch (parsed.type) {\n case 'system':\n return [\n {\n type: 'system',\n sessionId: stringValue(parsed.sessionId),\n cwd: stringValue(parsed.cwd),\n model: stringValue(parsed.model),\n },\n ];\n case 'text':\n return [{ type: 'text', delta: stringValue(parsed.delta) ?? '' }];\n case 'final_text':\n return [{ type: 'final_text', content: stringValue(parsed.content) ?? '' }];\n case 'thinking':\n return [{ type: 'thinking', delta: stringValue(parsed.delta) ?? '' }];\n case 'tool_use':\n return [\n {\n type: 'tool_use',\n id: stringValue(parsed.id) ?? 'unknown',\n name: stringValue(parsed.name) ?? 'tool',\n input: parsed.input,\n },\n ];\n case 'tool_result':\n return [\n {\n type: 'tool_result',\n id: stringValue(parsed.id) ?? 'unknown',\n output: stringValue(parsed.output) ?? '',\n isError: parsed.isError === true,\n },\n ];\n case 'done':\n return [\n {\n type: 'done',\n sessionId: stringValue(parsed.sessionId),\n terminationReason: 'normal',\n },\n ];\n case 'error':\n return [\n {\n type: 'error',\n message: stringValue(parsed.message) ?? 'dsh failed',\n terminationReason: 'failed',\n },\n ];\n default:\n return [];\n }\n } catch {\n return [];\n }\n}\n\nexport function plainOutputEvent(output: string): AgentEvent[] {\n const trimmed = output.trim();\n return trimmed ? [{ type: 'final_text', content: trimmed }] : [];\n}\n","import { randomUUID } from 'node:crypto';\nimport {\n DeepSeekHarness,\n HarnessClient,\n} from '@deepseek-ai/dsh-sdk-client';\nimport type {\n AgentAdapter,\n AgentAvailability,\n AgentRun,\n AgentRunOptions,\n} from '../types.js';\nimport { createSdkRun } from './sdk-translate.js';\nimport type { SdkLaunchSpec } from './sdk-runtime.js';\n\nexport interface SdkAdapterOptions {\n /** Launch spec for the SDK runtime subprocess (command + args, no cwd). */\n launch: SdkLaunchSpec;\n provider: string;\n model: string;\n maxTokens?: number;\n /** Per-request timeout for the availability probe. */\n probeTimeoutMs?: number;\n /** Injectable harness factory for tests. */\n harnessFactory?: (cwd: string) => DeepSeekHarness;\n}\n\ninterface RuntimeEntry {\n harness: DeepSeekHarness;\n}\n\nfunction waitWithTimeout(promise: Promise<unknown>, timeoutMs: number): Promise<boolean> {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(false), timeoutMs > 0 ? timeoutMs : 5_000);\n promise.then(\n () => {\n clearTimeout(timer);\n resolve(true);\n },\n () => {\n clearTimeout(timer);\n resolve(true);\n },\n );\n });\n}\n\n/**\n * Official DeepSeek Harness SDK adapter. Replaces the hand-written headless\n * subprocess protocol with `@deepseek-ai/dsh-sdk-client`: one runtime per\n * workspace cwd, native `session(id)` continuation, and token-level streaming\n * events (`assistant/chunk` reasoning/text deltas).\n */\nexport class SdkDshAdapter implements AgentAdapter {\n readonly id = 'dsh-sdk';\n readonly displayName = 'DeepSeek Harness (SDK)';\n\n private readonly launch: SdkLaunchSpec;\n private readonly provider: string;\n private readonly model: string;\n private readonly maxTokens: number | undefined;\n private readonly probeTimeoutMs: number;\n private readonly harnessFactory: (cwd: string) => DeepSeekHarness;\n private readonly runtimes = new Map<string, RuntimeEntry>();\n private disposed = false;\n\n constructor(options: SdkAdapterOptions) {\n this.launch = options.launch;\n this.provider = options.provider;\n this.model = options.model;\n this.maxTokens = options.maxTokens;\n this.probeTimeoutMs = options.probeTimeoutMs ?? 15_000;\n this.harnessFactory = options.harnessFactory ?? ((cwd) => this.createHarness(cwd));\n }\n\n async isAvailable(): Promise<boolean> {\n return (await this.checkAvailability()).ok;\n }\n\n async checkAvailability(): Promise<AgentAvailability> {\n if (this.disposed) {\n return { ok: false, error: 'adapter disposed', version: undefined };\n }\n const client = new HarnessClient({\n command: this.launch.command,\n args: this.launch.args,\n cwd: process.cwd(),\n requestTimeoutMs: this.probeTimeoutMs,\n });\n try {\n client.start();\n const info = await client.initialize({\n cwd: process.cwd(),\n provider: this.provider,\n model: this.model,\n ...(this.maxTokens === undefined ? {} : { maxTokens: this.maxTokens }),\n });\n return {\n ok: true,\n error: undefined,\n version: `${info.serverInfo.name}@${info.serverInfo.version}`,\n };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n version: undefined,\n };\n } finally {\n await client.close();\n }\n }\n\n run(options: AgentRunOptions): AgentRun {\n const cwd = options.cwd ?? process.cwd();\n const entry = this.runtimeFor(cwd);\n const sessionId =\n options.sessionId ?? `session-${randomUUID().replaceAll('-', '')}`;\n const stopRequested = { value: false };\n const handle = createSdkRun(entry.harness, options.prompt, {\n sessionId,\n cwd,\n model: options.model ?? this.model,\n images: options.images,\n stopRequested,\n });\n\n return {\n runId: options.runId,\n events: handle.events,\n stop: async () => {\n stopRequested.value = true;\n await this.closeRuntime(cwd);\n },\n waitForExit: (timeoutMs) => waitWithTimeout(handle.settled, timeoutMs),\n };\n }\n\n /** Close every runtime subprocess (used on bridge shutdown). */\n async dispose(): Promise<void> {\n this.disposed = true;\n const entries = [...this.runtimes.values()];\n this.runtimes.clear();\n await Promise.allSettled(\n entries.map((entry) => entry.harness.close()),\n );\n }\n\n private createHarness(cwd: string): DeepSeekHarness {\n return new DeepSeekHarness({\n launch: {\n command: this.launch.command,\n args: this.launch.args,\n cwd,\n },\n cwd,\n provider: this.provider,\n model: this.model,\n ...(this.maxTokens === undefined ? {} : { maxTokens: this.maxTokens }),\n });\n }\n\n private runtimeFor(cwd: string): RuntimeEntry {\n if (this.disposed) {\n throw new Error('SdkDshAdapter is disposed');\n }\n const existing = this.runtimes.get(cwd);\n if (existing) return existing;\n const entry: RuntimeEntry = { harness: this.harnessFactory(cwd) };\n this.runtimes.set(cwd, entry);\n return entry;\n }\n\n private async closeRuntime(cwd: string): Promise<void> {\n const entry = this.runtimes.get(cwd);\n if (!entry) return;\n this.runtimes.delete(cwd);\n try {\n await entry.harness.close();\n } catch (error) {\n // Closing is best-effort; the runtime process teardown ladder is\n // already idempotent inside the SDK client.\n void error;\n }\n }\n}\n","import type { DeepSeekHarness, HarnessNotification } from '@deepseek-ai/dsh-sdk-client';\nimport type { AgentEvent } from '../types.js';\nimport { EventChannel } from './event-channel.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction safeParseJson(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction textOfBlocks(blocks: unknown): string {\n if (!Array.isArray(blocks)) return '';\n return blocks\n .filter(isRecord)\n .filter((block) => block.type === 'text' && typeof block.text === 'string')\n .map((block) => block.text as string)\n .join('');\n}\n\ninterface ToolDeltaTracker {\n emitted: Set<string>;\n}\n\nfunction translateChunk(chunk: unknown, tracker: ToolDeltaTracker): AgentEvent[] {\n if (!isRecord(chunk)) return [];\n switch (chunk.type) {\n case 'reasoning-delta':\n return typeof chunk.text === 'string' && chunk.text\n ? [{ type: 'thinking', delta: chunk.text }]\n : [];\n case 'text-delta':\n return typeof chunk.text === 'string' && chunk.text\n ? [{ type: 'text', delta: chunk.text }]\n : [];\n case 'tool-call-delta': {\n const id = stringValue(chunk.id);\n if (!id || tracker.emitted.has(id)) return [];\n tracker.emitted.add(id);\n return [\n {\n type: 'tool_use',\n id,\n name: stringValue(chunk.name) ?? 'tool',\n input: {},\n },\n ];\n }\n default:\n return [];\n }\n}\n\nfunction translateToolResult(data: unknown): AgentEvent[] {\n if (!isRecord(data)) return [];\n const message = isRecord(data.message) ? data.message : undefined;\n const block = Array.isArray(message?.content) ? message.content[0] : undefined;\n const toolCallId = stringValue(\n isRecord(block) ? block.toolCallId : undefined,\n );\n if (!toolCallId) return [];\n const output = textOfBlocks(isRecord(block) ? block.content : undefined);\n const isError =\n data.error !== undefined || (isRecord(block) ? block.isError === true : false);\n return [\n {\n type: 'tool_result',\n id: toolCallId,\n output,\n isError,\n },\n ];\n}\n\nfunction translateAssistantMessage(data: unknown): AgentEvent[] {\n if (!isRecord(data) || !isRecord(data.usage)) return [];\n const usage = data.usage;\n const inputTokens =\n typeof usage.inputTokens === 'number' ? usage.inputTokens : undefined;\n const outputTokens =\n typeof usage.outputTokens === 'number' ? usage.outputTokens : undefined;\n if (inputTokens === undefined && outputTokens === undefined) return [];\n return [\n {\n type: 'usage',\n ...(inputTokens === undefined ? {} : { inputTokens }),\n ...(outputTokens === undefined ? {} : { outputTokens }),\n },\n ];\n}\n\nfunction translateTurnEnd(data: unknown): AgentEvent[] {\n if (!isRecord(data) || !isRecord(data.reason) || data.reason.kind !== 'error') return [];\n const failure = isRecord(data.reason.error) ? data.reason.error : undefined;\n const message = stringValue(failure?.message) ?? 'dsh turn failed';\n return [{ type: 'error', message, terminationReason: 'failed' }];\n}\n\n/**\n * Translate one SDK session event into bridge `AgentEvent`s.\n * Token-level `assistant/chunk` deltas give the streaming (typewriter) card\n * experience: reasoning deltas feed the thinking section, text deltas feed\n * the output block, tool deltas surface live tool activity.\n */\nexport function translateSessionEvent(\n event: unknown,\n tracker: ToolDeltaTracker,\n): AgentEvent[] {\n if (!isRecord(event) || typeof event.type !== 'string') return [];\n switch (event.type) {\n case 'assistant/chunk':\n return translateChunk(isRecord(event.data) ? event.data.chunk : undefined, tracker);\n case 'tool/call': {\n const data = isRecord(event.data) ? event.data : undefined;\n const id = stringValue(data?.callId);\n if (!id) return [];\n return [\n {\n type: 'tool_use',\n id,\n name: stringValue(data?.name) ?? 'tool',\n input: safeParseJson(data?.arguments),\n },\n ];\n }\n case 'tool/result':\n return translateToolResult(event.data);\n case 'assistant/message':\n return translateAssistantMessage(event.data);\n case 'turn/end':\n return translateTurnEnd(event.data);\n default:\n return [];\n }\n}\n\nfunction translateNotification(\n notification: HarnessNotification,\n sessionId: string,\n tracker: ToolDeltaTracker,\n): AgentEvent[] {\n if (notification.method !== 'session.event') return [];\n const params = isRecord(notification.params) ? notification.params : undefined;\n if (params?.sessionId !== sessionId) return [];\n return translateSessionEvent(params.event, tracker);\n}\n\nexport interface SdkRunOptions {\n sessionId: string;\n cwd: string | undefined;\n model: string | undefined;\n images: readonly string[] | undefined;\n stopRequested: { value: boolean };\n}\n\nexport interface SdkRunHandle {\n events: AsyncIterable<AgentEvent>;\n /** Resolves when the underlying SDK turn settles (success or failure). */\n settled: Promise<void>;\n}\n\nfunction buildPromptText(prompt: string, images: readonly string[] | undefined): string {\n return images?.length\n ? `${prompt}\\n\\nImage files attached to this message:\\n${images.join('\\n')}`\n : prompt;\n}\n\n/**\n * Run one prompt on a harness session and stream the result as `AgentEvent`s.\n * The SDK client owns the runtime handshake; this helper owns the\n * notification-to-event translation and the run lifecycle.\n */\nexport function createSdkRun(\n harness: DeepSeekHarness,\n prompt: string,\n options: SdkRunOptions,\n): SdkRunHandle {\n const channel = new EventChannel<AgentEvent>();\n const tracker: ToolDeltaTracker = { emitted: new Set() };\n let hadError = false;\n\n const task = harness\n .run(buildPromptText(prompt, options.images), {\n sessionId: options.sessionId,\n onNotification: (notification) => {\n for (const event of translateNotification(notification, options.sessionId, tracker)) {\n if (event.type === 'error') hadError = true;\n channel.push(event);\n }\n },\n })\n .catch((error: unknown) => {\n if (!options.stopRequested.value) {\n channel.push({\n type: 'error',\n message: error instanceof Error ? error.message : String(error),\n terminationReason: 'failed',\n });\n hadError = true;\n }\n })\n .finally(() => {\n channel.close();\n });\n\n async function* events(): AsyncGenerator<AgentEvent> {\n yield {\n type: 'system',\n sessionId: options.sessionId,\n cwd: options.cwd,\n model: options.model,\n };\n for await (const event of channel) {\n yield event;\n }\n await task;\n if (!hadError) {\n yield {\n type: 'done',\n sessionId: options.sessionId,\n terminationReason: options.stopRequested.value ? 'interrupted' : 'normal',\n };\n }\n }\n\n return { events: events(), settled: task.then(() => undefined) };\n}\n","import { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { discoverDshBin, resolveDshHome } from '../../config/dsh-runtime.js';\n\nexport const SDK_SERVER_PACKAGE = '@deepseek-ai/dsh-sdk-jsonrpc-server';\nexport const SDK_SERVER_VERSION = '0.1.0-rc.6';\nexport const SDK_BASE_BUNDLE = '@deepseek-ai/dsh-base';\nexport const DEFAULT_SDK_PROFILE = 'dsh-lark';\n\nexport interface SdkRuntimeOptions {\n /** OS home directory used to resolve the shared dsh installation. */\n home: string;\n /** Environment snapshot for dsh home resolution (defaults to process.env). */\n env?: NodeJS.ProcessEnv;\n /** Explicit runtime command; overrides auto-discovery (from DSH_LARK_DSH_COMMAND). */\n command?: string;\n /** Explicit runtime args; overrides auto-discovery (from DSH_LARK_DSH_ARGS). */\n args?: string[];\n /** Discovered dsh bin path; used when command/args are not explicit. */\n bin?: string;\n /** Profile name for the SDK runtime composition. */\n profile?: string;\n /** Injectable installer for tests. */\n install?: (profileRoot: string) => Promise<void>;\n}\n\nexport interface SdkLaunchSpec {\n command: string;\n args: string[];\n profile: string;\n}\n\nexport interface SdkProfileEnsureResult {\n ok: boolean;\n created: boolean;\n error?: string;\n}\n\nexport function sdkProfileRoot(home: string, profile: string, env?: NodeJS.ProcessEnv): string {\n return join(resolveDshHome(home, env), 'profiles', profile);\n}\n\nfunction packageJsonFor(profile: string): string {\n return `${JSON.stringify(\n {\n name: `dsh-profile-${profile}`,\n private: true,\n dependencies: {\n [SDK_SERVER_PACKAGE]: SDK_SERVER_VERSION,\n },\n dsh: {\n profile: {\n bundles: [SDK_BASE_BUNDLE],\n },\n },\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction patchYamlFor(): string {\n return [\n '# dsh-lark SDK JSON-RPC runtime overlay (managed by dsh-lark-bot).',\n '# stdout is reserved for SDK JSON-RPC frames; no console logger may load.',\n '- insert:',\n ' - id: sdk-jsonrpc-server',\n ` name: '${SDK_SERVER_PACKAGE}'`,\n ' config:',\n ' maxTokensAsSuccess: true',\n '',\n '# Unattended IM runtime: interactive user questions cannot be answered',\n '# through Feishu, so the tool is disabled (default-deny).',\n '- id: user-questions',\n ' disabled: true',\n '',\n '- id: system-prompt',\n ' config:',\n ' persona: >-',\n ' You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.',\n '',\n '- id: hmr',\n ' disabled: true',\n '',\n ].join('\\n');\n}\n\nfunction sdkServerInstalled(profileRoot: string): boolean {\n const candidates = [\n join(profileRoot, 'node_modules', SDK_SERVER_PACKAGE),\n join(profileRoot, '..', 'node_modules', SDK_SERVER_PACKAGE),\n ];\n return candidates.some((path) => existsSync(path));\n}\n\nexport function isSdkProfileReady(profileRoot: string): boolean {\n return (\n existsSync(join(profileRoot, 'package.json')) &&\n existsSync(join(profileRoot, 'cordis.yml')) &&\n existsSync(join(profileRoot, 'cordis.patch.yml')) &&\n sdkServerInstalled(profileRoot)\n );\n}\n\nfunction runPnpmInstall(profileRoot: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn('pnpm', ['install'], {\n cwd: profileRoot,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let output = '';\n child.stdout.on('data', (chunk: Buffer) => {\n output += chunk.toString('utf8');\n });\n child.stderr.on('data', (chunk: Buffer) => {\n output += chunk.toString('utf8');\n });\n child.on('error', (error) => {\n reject(error);\n });\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n const tail = output.trim().split('\\n').slice(-8).join('\\n');\n reject(new Error(`pnpm install exited with code ${String(code)}\\n${tail}`));\n });\n });\n}\n\n/**\n * Ensure the SDK runtime profile exists under the shared dsh installation.\n * The profile is a managed composition: `@deepseek-ai/dsh-base` bundle plus\n * the official `@deepseek-ai/dsh-sdk-jsonrpc-server` plugin. Idempotent.\n */\nexport async function ensureSdkProfile(\n options: SdkRuntimeOptions,\n): Promise<SdkProfileEnsureResult> {\n const profile = options.profile ?? DEFAULT_SDK_PROFILE;\n const root = sdkProfileRoot(options.home, profile, options.env);\n if (isSdkProfileReady(root)) return { ok: true, created: false };\n\n try {\n await mkdir(root, { recursive: true });\n await writeFile(join(root, 'package.json'), packageJsonFor(profile), 'utf8');\n await writeFile(join(root, 'cordis.yml'), '[]\\n', 'utf8');\n await writeFile(join(root, 'cordis.patch.yml'), patchYamlFor(), 'utf8');\n const install = options.install ?? runPnpmInstall;\n await install(root);\n if (!isSdkProfileReady(root)) {\n return {\n ok: false,\n created: true,\n error: `${SDK_SERVER_PACKAGE}@${SDK_SERVER_VERSION} was not found after install`,\n };\n }\n return { ok: true, created: true };\n } catch (error) {\n return {\n ok: false,\n created: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/** Resolve the launch spec for the SDK runtime subprocess. */\nexport function resolveSdkLaunch(options: SdkRuntimeOptions): SdkLaunchSpec {\n const profile = options.profile ?? DEFAULT_SDK_PROFILE;\n if (options.command || options.args) {\n return {\n command: options.command ?? 'node',\n args: options.args ?? ['--profile', profile],\n profile,\n };\n }\n const bin = options.bin ?? discoverDshBin(options.home, options.env);\n if (bin) {\n return { command: 'node', args: [bin, '--profile', profile], profile };\n }\n return { command: 'dsh', args: ['--profile', profile], profile };\n}\n","import { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\n\nexport interface AppPaths {\n root: string;\n configFile: string;\n activeProfileFile: string;\n profileDir: (profile: string) => string;\n profilePath: (profile: string, ...parts: string[]) => string;\n sessionsFile: (profile: string) => string;\n sessionCatalogFile: (profile: string) => string;\n workspacesFile: (profile: string) => string;\n mediaDir: (profile: string) => string;\n logsDir: (profile: string) => string;\n registryFile: string;\n locksDir: string;\n}\n\nexport function defaultHome(): string {\n const override = process.env.DSH_LARK_HOME?.trim();\n return override ? resolve(override) : join(homedir(), '.dsh-lark');\n}\n\nexport function resolveAppPaths(root: string = defaultHome()): AppPaths {\n const profileDir = (profile: string): string => join(root, 'profiles', profile);\n const profilePath = (profile: string, ...parts: string[]): string =>\n join(profileDir(profile), ...parts);\n\n return {\n root,\n configFile: join(root, 'config.json'),\n activeProfileFile: join(root, 'active-profile'),\n profileDir,\n profilePath,\n sessionsFile: (profile) => profilePath(profile, 'sessions.json'),\n sessionCatalogFile: (profile) => profilePath(profile, 'sessions.json.catalog.json'),\n workspacesFile: (profile) => profilePath(profile, 'workspaces.json'),\n mediaDir: (profile) => profilePath(profile, 'media'),\n logsDir: (profile) => profilePath(profile, 'logs'),\n registryFile: join(root, 'registry', 'processes.json'),\n locksDir: join(root, 'registry', 'locks'),\n };\n}\n","import { join, resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { resolveDshRuntime } from './dsh-runtime.js';\n\nexport type LarkTenant = 'feishu' | 'lark';\nexport type AdapterMode = 'sdk' | 'acp' | 'headless';\n\nexport interface RuntimeEnv {\n home: string;\n tenant: LarkTenant;\n appId: string | undefined;\n appSecret: string | undefined;\n workspace: string | undefined;\n dshCommand: string;\n dshArgs: string[];\n /** True when DSH_LARK_DSH_COMMAND / DSH_LARK_DSH_ARGS were set explicitly. */\n dshExplicit: boolean;\n adapterMode: AdapterMode;\n provider: string;\n model: string;\n maxTokens: number | undefined;\n runTimeoutMs: number;\n stopGraceMs: number;\n accessDefaultDeny: boolean;\n eventFreshnessMs: number;\n}\n\nconst DEFAULTS = {\n tenant: 'feishu' as const,\n provider: 'deepseek-official',\n model: 'deepseek-v4-flash',\n runTimeoutMs: 300_000,\n stopGraceMs: 5_000,\n};\n\nfunction nonEmpty(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction parseTenant(value: string | undefined): LarkTenant {\n const tenant = nonEmpty(value) ?? DEFAULTS.tenant;\n if (tenant !== 'feishu' && tenant !== 'lark') {\n throw new Error(`DSH_LARK_TENANT must be \"feishu\" or \"lark\", got \"${tenant}\"`);\n }\n return tenant;\n}\n\nfunction parseDshArgs(value: string | undefined): string[] {\n const raw = value?.trim();\n if (!raw) return [];\n return raw\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction parseTimeout(value: string | undefined): number {\n const raw = value?.trim();\n if (!raw) return DEFAULTS.runTimeoutMs;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`DSH_LARK_RUN_TIMEOUT_MS must be a non-negative integer, got \"${raw}\"`);\n }\n return parsed;\n}\n\nfunction parseStopGrace(value: string | undefined): number {\n const raw = value?.trim();\n if (!raw) return DEFAULTS.stopGraceMs;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`DSH_LARK_STOP_GRACE_MS must be a non-negative integer, got \"${raw}\"`);\n }\n return parsed;\n}\n\nfunction parseAdapterMode(value: string | undefined): AdapterMode {\n const mode = nonEmpty(value) ?? 'sdk';\n if (mode !== 'sdk' && mode !== 'acp' && mode !== 'headless') {\n throw new Error(`DSH_LARK_ADAPTER must be \"sdk\", \"acp\" or \"headless\", got \"${mode}\"`);\n }\n return mode;\n}\n\nfunction parseMaxTokens(value: string | undefined): number | undefined {\n const raw = value?.trim();\n if (!raw) return undefined;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`DSH_LARK_MAX_TOKENS must be a positive integer, got \"${raw}\"`);\n }\n return parsed;\n}\n\nfunction parseBoolean(value: string | undefined, fallback: boolean): boolean {\n const raw = value?.trim().toLowerCase();\n if (!raw) return fallback;\n if (raw === '1' || raw === 'true' || raw === 'yes') return true;\n if (raw === '0' || raw === 'false' || raw === 'no') return false;\n return fallback;\n}\n\nfunction parseFreshness(value: string | undefined): number {\n const raw = value?.trim();\n if (!raw) return 600_000;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(`DSH_LARK_EVENT_FRESHNESS_MS must be a non-negative integer, got \"${raw}\"`);\n }\n return parsed;\n}\n\nexport function loadRuntimeEnv(\n source: NodeJS.ProcessEnv = process.env,\n): RuntimeEnv {\n const homeOverride = nonEmpty(source.DSH_LARK_HOME);\n const workspace = nonEmpty(source.DSH_LARK_WORKSPACE);\n const home = homeOverride ? resolve(homeOverride) : join(homedir(), '.dsh-lark');\n const osHome = homedir();\n const explicitCommand = nonEmpty(source.DSH_LARK_DSH_COMMAND);\n const rawDshArgs = nonEmpty(source.DSH_LARK_DSH_ARGS);\n const dshExplicit = explicitCommand !== undefined || rawDshArgs !== undefined;\n const dshRuntime = resolveDshRuntime({\n home: osHome,\n env: source,\n ...(explicitCommand ? { command: explicitCommand } : {}),\n ...(rawDshArgs ? { args: parseDshArgs(rawDshArgs) } : {}),\n });\n\n return {\n home,\n tenant: parseTenant(source.DSH_LARK_TENANT),\n appId: nonEmpty(source.DSH_LARK_APP_ID),\n appSecret: nonEmpty(source.DSH_LARK_APP_SECRET),\n workspace: workspace ? resolve(workspace) : undefined,\n dshCommand: dshRuntime.command,\n dshArgs: dshRuntime.args,\n dshExplicit,\n adapterMode: parseAdapterMode(source.DSH_LARK_ADAPTER),\n provider: nonEmpty(source.DSH_LARK_PROVIDER) ?? DEFAULTS.provider,\n model: nonEmpty(source.DSH_LARK_MODEL) ?? DEFAULTS.model,\n maxTokens: parseMaxTokens(source.DSH_LARK_MAX_TOKENS),\n runTimeoutMs: parseTimeout(source.DSH_LARK_RUN_TIMEOUT_MS),\n stopGraceMs: parseStopGrace(source.DSH_LARK_STOP_GRACE_MS),\n accessDefaultDeny: parseBoolean(source.DSH_LARK_ACCESS_DEFAULT_DENY, false),\n eventFreshnessMs: parseFreshness(source.DSH_LARK_EVENT_FRESHNESS_MS),\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport { writeFileAtomic } from '../platform/atomic-write.js';\nimport type { LarkTenant } from './env.js';\n\nexport interface ProfileConfig {\n schemaVersion: 1;\n agentKind: 'dsh';\n tenant: LarkTenant;\n accounts: {\n appId: string;\n appSecret: string;\n };\n workspaces: {\n default: string | undefined;\n };\n preferences: {\n model: string | undefined;\n stopGraceMs: number | undefined;\n runTimeoutMs: number | undefined;\n };\n access: {\n allowedUsers: string[];\n allowedChats: string[];\n admins: string[];\n };\n}\n\nexport interface RootConfig {\n schemaVersion: 1;\n activeProfile: string;\n profiles: Record<string, ProfileConfig>;\n}\n\nexport class ConfigStore {\n private data: RootConfig | undefined;\n\n constructor(private readonly path: string) {}\n\n async load(): Promise<RootConfig> {\n try {\n const raw = await readFile(this.path, 'utf8');\n const parsed = JSON.parse(raw) as Partial<RootConfig>;\n this.data = {\n schemaVersion: 1,\n activeProfile: parsed.activeProfile ?? 'default',\n profiles: Object.fromEntries(\n Object.entries(parsed.profiles ?? {}).map(([name, profile]) => [\n name,\n {\n ...profile,\n access: {\n allowedUsers: profile.access?.allowedUsers ?? [],\n allowedChats: profile.access?.allowedChats ?? [],\n admins: profile.access?.admins ?? [],\n },\n },\n ]),\n ),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n this.data = {\n schemaVersion: 1,\n activeProfile: 'default',\n profiles: {},\n };\n }\n return this.data;\n }\n\n getActiveProfile(): ProfileConfig | undefined {\n const data = this.getData();\n return data.profiles[data.activeProfile];\n }\n\n getProfile(name: string): ProfileConfig | undefined {\n const data = this.getData();\n return data.profiles[name];\n }\n\n async saveProfile(\n name: string,\n input: {\n tenant: LarkTenant;\n appId: string;\n appSecret: string;\n workspace?: string;\n model?: string;\n stopGraceMs?: number;\n runTimeoutMs?: number;\n operatorOpenId?: string;\n access?: {\n allowedUsers?: string[];\n allowedChats?: string[];\n admins?: string[];\n };\n },\n ): Promise<void> {\n const data = this.getData();\n const existing = data.profiles[name];\n const profile: ProfileConfig = {\n schemaVersion: 1,\n agentKind: 'dsh',\n tenant: input.tenant,\n accounts: {\n appId: input.appId,\n appSecret: input.appSecret,\n },\n workspaces: {\n default: input.workspace ?? existing?.workspaces.default ?? undefined,\n },\n preferences: {\n model: input.model ?? existing?.preferences.model ?? undefined,\n stopGraceMs: input.stopGraceMs ?? existing?.preferences.stopGraceMs ?? undefined,\n runTimeoutMs: input.runTimeoutMs ?? existing?.preferences.runTimeoutMs ?? undefined,\n },\n access: {\n allowedUsers: input.access?.allowedUsers ?? existing?.access?.allowedUsers ?? [],\n allowedChats: input.access?.allowedChats ?? existing?.access?.allowedChats ?? [],\n admins: input.access?.admins ?? existing?.access?.admins ?? [],\n },\n };\n if (input.operatorOpenId && !profile.access.allowedUsers.includes(input.operatorOpenId)) {\n profile.access.allowedUsers.push(input.operatorOpenId);\n profile.access.admins.push(input.operatorOpenId);\n }\n data.profiles[name] = profile;\n data.activeProfile = name;\n await this.persist();\n }\n\n private getData(): RootConfig {\n if (!this.data) {\n throw new Error('ConfigStore must be loaded before use');\n }\n return this.data;\n }\n\n private async persist(): Promise<void> {\n const data = this.getData();\n await mkdir(dirname(this.path), { recursive: true });\n await writeFileAtomic(this.path, `${JSON.stringify(data, null, 2)}\\n`, {\n mode: 0o600,\n });\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport { mkdir, rename, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n}\n\nexport async function writeFileAtomic(\n target: string,\n data: string,\n options: AtomicWriteOptions = {},\n): Promise<void> {\n const directory = dirname(target);\n await mkdir(directory, { recursive: true });\n const temporary = join(directory, `.${randomBytes(8).toString('hex')}.tmp`);\n\n try {\n await writeFile(temporary, data, options.mode === undefined ? undefined : { mode: options.mode });\n await rename(temporary, target);\n } catch (error) {\n await rmSilently(temporary);\n throw error;\n }\n}\n\nasync function rmSilently(path: string): Promise<void> {\n const { rm } = await import('node:fs/promises');\n try {\n await rm(path, { force: true });\n } catch {\n // best effort cleanup only\n }\n}\n","import { mkdir } from 'node:fs/promises';\nimport type { LarkChannel, NormalizedMessage } from '@larksuite/channel';\nimport { buildAgentAdapter } from '../../adapters/index.js';\nimport { ActiveRuns } from '../../bot/active-runs.js';\nimport { ApprovalRegistry } from '../../bot/approvals.js';\nimport { DensityStore } from '../../bot/density-store.js';\nimport { PendingQueue } from '../../bot/pending-queue.js';\nimport { QuestionRegistry } from '../../bot/questions.js';\nimport { RunPolicyStore } from '../../bot/run-policy.js';\nimport { startChannel } from '../../bridge/channel.js';\nimport { adaptLarkChannel } from '../../bridge/lark-channel.js';\nimport { runAgentBatch } from '../../bridge/run-flow.js';\nimport type { StreamingChannel } from '../../bridge/types.js';\nimport { resolveAppPaths } from '../../config/app-paths.js';\nimport { AccessManager } from '../../config/access-manager.js';\nimport { loadRuntimeEnv } from '../../config/env.js';\nimport { ConfigStore } from '../../config/profile-store.js';\nimport { log } from '../../core/logger.js';\nimport { onboardPersonalAgent } from '../../onboard/registration.js';\nimport { prepareAttachments } from '../../media/attachments.js';\nimport { SessionStore } from '../../session/store.js';\nimport { GitWorktreeManager } from '../../workspace/git-worktree.js';\nimport { WorkspaceStore } from '../../workspace/store.js';\nimport type { StartOptions } from '../../cli.js';\n\nconst DEBOUNCE_MS = 600;\n\nexport async function runStart(options: StartOptions): Promise<void> {\n const env = loadRuntimeEnv({\n ...process.env,\n ...(options.workspace ? { DSH_LARK_WORKSPACE: options.workspace } : {}),\n ...(options.tenant ? { DSH_LARK_TENANT: options.tenant } : {}),\n ...(options.appId ? { DSH_LARK_APP_ID: options.appId } : {}),\n ...(options.appSecret ? { DSH_LARK_APP_SECRET: options.appSecret } : {}),\n });\n const paths = resolveAppPaths(env.home);\n const profileName = options.profile ?? 'default';\n const configStore = new ConfigStore(paths.configFile);\n await configStore.load();\n const accessManager = new AccessManager(configStore, profileName);\n\n if (env.appId && env.appSecret) {\n const profileInput: Parameters<ConfigStore['saveProfile']>[1] = {\n tenant: env.tenant,\n appId: env.appId,\n appSecret: env.appSecret,\n model: env.model,\n stopGraceMs: env.stopGraceMs,\n runTimeoutMs: env.runTimeoutMs,\n };\n if (env.workspace !== undefined) profileInput.workspace = env.workspace;\n await configStore.saveProfile(profileName, profileInput);\n }\n\n const profile = configStore.getProfile(profileName);\n if (!profile) {\n try {\n const created = await onboardPersonalAgent();\n const onboardingProfile: Parameters<ConfigStore['saveProfile']>[1] = {\n tenant: created.tenant,\n appId: created.appId,\n appSecret: created.appSecret,\n model: env.model,\n stopGraceMs: env.stopGraceMs,\n runTimeoutMs: env.runTimeoutMs,\n };\n if (created.operatorOpenId !== undefined) {\n onboardingProfile.operatorOpenId = created.operatorOpenId;\n }\n if (env.workspace !== undefined) onboardingProfile.workspace = env.workspace;\n await configStore.saveProfile(profileName, onboardingProfile);\n } catch (error) {\n log.fail('onboarding', error);\n process.stderr.write('扫码创建应用失败,未写入本地配置。\\n');\n process.exitCode = 1;\n return;\n }\n }\n\n const activeProfile = configStore.getProfile(profileName);\n if (!activeProfile) {\n process.stderr.write('本地配置读取失败,请检查后重试。\\n');\n process.exitCode = 1;\n return;\n }\n\n const defaultWorkspace =\n options.workspace ??\n activeProfile.workspaces.default ??\n env.workspace ??\n paths.profilePath(profileName, 'workspace');\n await mkdir(defaultWorkspace, { recursive: true });\n\n const sessions = new SessionStore(paths.sessionsFile(profileName));\n const workspaces = new WorkspaceStore(paths.workspacesFile(profileName));\n const worktreeManager = new GitWorktreeManager({\n worktreesRoot: paths.profilePath(profileName, 'worktrees'),\n });\n await Promise.all([sessions.load(), workspaces.load()]);\n\n let adapter;\n try {\n adapter = await buildAgentAdapter(env, {\n stopGraceMs:\n activeProfile.preferences.stopGraceMs ?? env.stopGraceMs,\n model: activeProfile.preferences.model,\n });\n } catch (error) {\n log.fail('adapter', error);\n process.stderr.write(`agent adapter 初始化失败:${errorMessage(error)}\\n`);\n process.exitCode = 1;\n return;\n }\n const activeRuns = new ActiveRuns();\n const runPolicies = new RunPolicyStore();\n const approvals = new ApprovalRegistry();\n const questions = new QuestionRegistry();\n const densityStore = new DensityStore();\n let streaming: StreamingChannel | undefined;\n let larkChannel: LarkChannel | undefined;\n\n const pending = new PendingQueue<NormalizedMessage>(DEBOUNCE_MS, async (scope, batch) => {\n if (!streaming) return;\n const first = batch[0];\n if (!first) return;\n pending.block(scope);\n try {\n const attachments = await prepareAttachments(\n larkChannel,\n first,\n paths.mediaDir(profileName),\n );\n const messages = [\n first.content,\n ...attachments.textFileNotes,\n ].filter(Boolean);\n const runInput: Parameters<typeof runAgentBatch>[0] = {\n scope,\n chatId: first.chatId,\n messages,\n adapter,\n sessions,\n workspaces,\n workspaceManager: worktreeManager,\n activeRuns,\n runPolicies,\n approvals,\n questions,\n densityStore,\n channel: streaming,\n defaultWorkspace,\n replyTo: first.messageId,\n runTimeoutMs: activeProfile.preferences.runTimeoutMs ?? env.runTimeoutMs,\n images: attachments.imagePaths,\n };\n if (activeProfile.preferences.model !== undefined) runInput.model = activeProfile.preferences.model;\n if (activeProfile.preferences.stopGraceMs !== undefined) {\n runInput.stopGraceMs = activeProfile.preferences.stopGraceMs;\n }\n await runAgentBatch(runInput);\n } finally {\n pending.unblock(scope);\n }\n });\n\n const channelInput: Parameters<typeof startChannel>[0] = {\n appId: activeProfile.accounts.appId,\n appSecret: activeProfile.accounts.appSecret,\n tenant: activeProfile.tenant,\n adapter,\n sessions,\n workspaces,\n activeRuns,\n runPolicies,\n approvals,\n questions,\n densityStore,\n defaultRunTimeoutMs: activeProfile.preferences.runTimeoutMs ?? env.runTimeoutMs,\n accessManager,\n pending,\n defaultWorkspace,\n accessDefaultDeny: env.accessDefaultDeny,\n eventFreshnessMs: env.eventFreshnessMs,\n allowedUsers: activeProfile.access.allowedUsers,\n allowedChats: activeProfile.access.allowedChats,\n };\n if (activeProfile.preferences.model !== undefined) channelInput.model = activeProfile.preferences.model;\n if (activeProfile.preferences.stopGraceMs !== undefined) {\n channelInput.stopGraceMs = activeProfile.preferences.stopGraceMs;\n }\n const bridge = await startChannel(channelInput);\n streaming = adaptLarkChannel(bridge.channel);\n larkChannel = bridge.channel;\n\n log.info('cli', 'started', {\n profile: profileName,\n home: paths.root,\n tenant: activeProfile.tenant,\n workspace: defaultWorkspace,\n });\n process.stdout.write(`dsh-lark-bot 已启动,profile=${profileName}\\n`);\n\n await waitForShutdown();\n await bridge.disconnect();\n await adapter.dispose?.();\n await Promise.all([sessions.flush(), workspaces.flush()]);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction waitForShutdown(): Promise<void> {\n return new Promise((resolve) => {\n const shutdown = (): void => {\n process.off('SIGINT', shutdown);\n process.off('SIGTERM', shutdown);\n resolve();\n };\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n });\n}\n","export interface ActiveRunHandle {\n runId: string;\n stop(): Promise<void>;\n}\n\nexport class ActiveRuns {\n private readonly runs = new Map<string, ActiveRunHandle>();\n\n set(scope: string, handle: ActiveRunHandle): void {\n this.runs.set(scope, handle);\n }\n\n get(scope: string): ActiveRunHandle | undefined {\n return this.runs.get(scope);\n }\n\n delete(scope: string): boolean {\n return this.runs.delete(scope);\n }\n\n async interrupt(scope: string): Promise<boolean> {\n const handle = this.runs.get(scope);\n if (!handle) return false;\n this.runs.delete(scope);\n await handle.stop();\n return true;\n }\n}\n","import { realpathSync } from 'node:fs';\nimport { isIP } from 'node:net';\nimport { isAbsolute, relative, resolve, sep } from 'node:path';\n\nconst REDACTED = '[redacted]';\n\nconst SECRET_PATTERNS: readonly { label: string; pattern: RegExp; keyed: boolean }[] = [\n { label: 'bearer', pattern: /\\bBearer\\s+[A-Za-z0-9._~+/=-]{8,}/g, keyed: false },\n { label: 'deepseek-key', pattern: /\\bsk-[A-Za-z0-9_-]{8,}/g, keyed: false },\n { label: 'api-key', pattern: /\\b(api[_-]?key)\\s*[=:]\\s*[\"']?[A-Za-z0-9._~+/=-]{8,}/gi, keyed: true },\n];\n\n/** Redact common secret shapes (Bearer / sk- / api_key=…) from free text. */\nexport function redactSecrets(text: string): string {\n let result = text;\n for (const { pattern, keyed } of SECRET_PATTERNS) {\n result = keyed\n ? result.replace(pattern, (_match, keyName: string) => `${keyName}=${REDACTED}`)\n : result.replace(pattern, REDACTED);\n }\n return result;\n}\n\nfunction resolveReal(path: string): string {\n try {\n return realpathSync(path);\n } catch {\n return resolve(path);\n }\n}\n\n/**\n * Path containment: `candidate` is inside (or equal to) `root`.\n * Uses realpath when the path exists so symlink escapes are rejected.\n */\nexport function isPathWithin(root: string, candidate: string): boolean {\n const rootReal = resolveReal(root);\n const candidateReal = resolveReal(candidate);\n const rel = relative(rootReal, candidateReal);\n return (\n rel === '' ||\n (!isAbsolute(rel) && rel !== '..' && !rel.startsWith(`..${sep}`))\n );\n}\n\n/**\n * Truncate text to `maxBytes` UTF-8 without splitting a multi-byte sequence\n * or a UTF-16 surrogate pair.\n */\nexport function truncateUtf8Safe(text: string, maxBytes: number): string {\n if (maxBytes <= 0) return '';\n if (Buffer.byteLength(text, 'utf8') <= maxBytes) return text;\n let slice = text.slice(0, maxBytes);\n while (Buffer.byteLength(slice, 'utf8') > maxBytes && slice.length > 0) {\n slice = slice.slice(0, -1);\n }\n const code = slice.charCodeAt(slice.length - 1);\n if (code >= 0xd800 && code <= 0xdbff) {\n slice = slice.slice(0, -1);\n }\n return slice;\n}\n\n/** Reject stale events (e.g. replayed/duplicated IM messages). */\nexport function isEventFresh(\n timestampMs: number | undefined,\n windowMs: number,\n now: number = Date.now(),\n): boolean {\n if (timestampMs === undefined) return true;\n return now - timestampMs <= windowMs;\n}\n\n/** Interactive tools that cannot be answered back through IM; default-deny. */\nexport const DEFAULT_DENIED_INTERACTIVE_TOOLS: readonly string[] = [\n 'ask_user_question',\n 'terminal',\n 'browser',\n 'vim',\n 'code',\n];\n\nexport function isDeniedTool(name: string): boolean {\n const normalized = name.trim().toLowerCase();\n return DEFAULT_DENIED_INTERACTIVE_TOOLS.includes(normalized);\n}\n\nfunction ipv4IsPrivate(parts: number[]): boolean {\n const [a, b] = parts;\n if (a === 0 || a === 10 || a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b !== undefined && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 168) return true;\n if (a === 100 && b !== undefined && b >= 64 && b <= 127) return true;\n return false;\n}\n\nfunction ipv6IsPrivate(host: string): boolean {\n const normalized = host.toLowerCase();\n if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1') return true;\n if (normalized === '::' || normalized.startsWith('0:')) return true;\n if (normalized.startsWith('fe80:')) return true;\n if (normalized.startsWith('fc') || normalized.startsWith('fd')) return true;\n return false;\n}\n\n/**\n * SSRF guard: only http(s) URLs whose hostname is a public address are safe.\n * Loopback, link-local, private, CGNAT and IPv6 ULA ranges are rejected.\n */\nexport function isSafeHttpUrl(url: string): boolean {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return false;\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return false;\n let host = parsed.hostname.toLowerCase();\n if (host.startsWith('[') && host.endsWith(']')) {\n host = host.slice(1, -1);\n }\n if (host === 'localhost' || host.endsWith('.localhost')) return false;\n const ipVersion = isIP(host);\n if (ipVersion === 4) {\n return !ipv4IsPrivate(host.split('.').map((part) => Number(part)));\n }\n if (ipVersion === 6) {\n return !ipv6IsPrivate(host);\n }\n // Hostnames resolve later; the URL-level guard is the transport boundary.\n return true;\n}\n","import type { Writable } from 'node:stream';\nimport { redactSecrets } from '../config/security.js';\n\ntype LogLevel = 'info' | 'warn' | 'error';\n\nexport interface LogFields {\n [key: string]: unknown;\n}\n\nconst REDACTED = '[redacted]';\nconst SENSITIVE_KEY = /(secret|token|password|api[_-]?key)/i;\n\nfunction redactValue(value: unknown, key: string, depth: number): unknown {\n if (SENSITIVE_KEY.test(key)) return REDACTED;\n if (typeof value === 'string') return redactSecrets(value);\n if (depth === 0) return value;\n if (Array.isArray(value)) {\n return value.map((item, index) => redactValue(item, `${key}.${index}`, depth - 1));\n }\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n out[childKey] = redactValue(childValue, childKey, depth - 1);\n }\n return out;\n }\n return value;\n}\n\nexport function redactFields(fields: LogFields, depth = 4): LogFields {\n return redactValue(fields, '', depth) as LogFields;\n}\n\nfunction serializeMessage(\n level: LogLevel,\n category: string,\n event: string,\n fields: LogFields,\n): string {\n const entry = {\n time: new Date().toISOString(),\n level,\n category,\n event,\n fields: redactFields(fields),\n };\n return JSON.stringify(entry);\n}\n\nexport interface Logger {\n info(category: string, event: string, fields?: LogFields): void;\n warn(category: string, event: string, fields?: LogFields): void;\n error(category: string, event: string, fields?: LogFields): void;\n fail(category: string, error: unknown, fields?: LogFields): void;\n}\n\nexport function createLogger(output: Writable = process.stderr): Logger {\n const write = (level: LogLevel, category: string, event: string, fields: LogFields): void => {\n output.write(`${serializeMessage(level, category, event, fields)}\\n`);\n };\n\n return {\n info: (category, event, fields = {}) => write('info', category, event, fields),\n warn: (category, event, fields = {}) => write('warn', category, event, fields),\n error: (category, event, fields = {}) => write('error', category, event, fields),\n fail(category, error, fields = {}) {\n const message = error instanceof Error ? error.message : String(error);\n write('error', category, 'fail', { message, ...fields });\n },\n };\n}\n\nexport const log = createLogger();\n","import type { ApprovalOutcome, ApprovalRequest } from '../adapters/types.js';\nimport { log } from '../core/logger.js';\n\ninterface PendingApproval {\n request: ApprovalRequest;\n resolve: (outcome: ApprovalOutcome) => void;\n settled: boolean;\n}\n\n/**\n * Pending approval registry. Cards are rendered by the caller; this store\n * correlates card button clicks with the ACP `request_permission` promise and\n * guarantees every request is settled when a run ends or is disposed.\n */\nexport class ApprovalRegistry {\n private readonly pending = new Map<string, PendingApproval>();\n\n register(scope: string, request: ApprovalRequest): Promise<ApprovalOutcome> {\n const key = `${scope}:${request.id}`;\n const existing = this.pending.get(key);\n if (existing) return Promise.resolve('cancelled');\n return new Promise<ApprovalOutcome>((resolve) => {\n this.pending.set(key, { request, resolve, settled: false });\n });\n }\n\n resolve(scope: string, id: string, outcome: ApprovalOutcome): boolean {\n const key = `${scope}:${id}`;\n const pending = this.pending.get(key);\n if (!pending || pending.settled) return false;\n pending.settled = true;\n this.pending.delete(key);\n pending.resolve(outcome);\n return true;\n }\n\n /** Settle every pending approval for a scope (run end / dispose). */\n settleAll(scope: string, outcome: ApprovalOutcome): number {\n let count = 0;\n for (const [key, pending] of this.pending) {\n if (!key.startsWith(`${scope}:`)) continue;\n if (pending.settled) continue;\n pending.settled = true;\n this.pending.delete(key);\n pending.resolve(outcome);\n count += 1;\n }\n if (count > 0) {\n log.warn('approvals', 'settled-pending', { scope, outcome, count });\n }\n return count;\n }\n\n pendingCount(scope: string): number {\n let count = 0;\n for (const key of this.pending.keys()) {\n if (key.startsWith(`${scope}:`)) count += 1;\n }\n return count;\n }\n}\n","import type { CardDensity } from '../card/density.js';\n\n/** Per-scope card density overrides on top of a default. */\nexport class DensityStore {\n private readonly overrides = new Map<string, CardDensity>();\n\n constructor(private readonly defaultDensity: CardDensity = 'standard') {}\n\n get(scope: string): CardDensity {\n return this.overrides.get(scope) ?? this.defaultDensity;\n }\n\n set(scope: string, density: CardDensity): void {\n this.overrides.set(scope, density);\n }\n\n clear(scope: string): boolean {\n return this.overrides.delete(scope);\n }\n}\n","export type PendingFlush<T> = (scope: string, batch: T[]) => void | Promise<void>;\n\nexport class PendingQueue<T> {\n private readonly pending = new Map<string, T[]>();\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly blocked = new Set<string>();\n private readonly flushing = new Set<string>();\n\n constructor(\n private readonly quietMs: number,\n private readonly onFlush: PendingFlush<T>,\n ) {}\n\n push(scope: string, item: T): void {\n const batch = this.pending.get(scope) ?? [];\n batch.push(item);\n this.pending.set(scope, batch);\n this.schedule(scope);\n }\n\n block(scope: string): void {\n this.blocked.add(scope);\n this.clearTimer(scope);\n }\n\n unblock(scope: string): void {\n this.blocked.delete(scope);\n this.schedule(scope);\n }\n\n async flushNow(scope: string): Promise<void> {\n this.clearTimer(scope);\n if (this.flushing.has(scope)) return;\n\n const batch = this.pending.get(scope) ?? [];\n this.pending.delete(scope);\n if (batch.length === 0) return;\n\n this.flushing.add(scope);\n try {\n await this.onFlush(scope, batch);\n } finally {\n this.flushing.delete(scope);\n }\n }\n\n hasPending(scope: string): boolean {\n return (this.pending.get(scope)?.length ?? 0) > 0;\n }\n\n isBlocked(scope: string): boolean {\n return this.blocked.has(scope);\n }\n\n private schedule(scope: string): void {\n if (this.blocked.has(scope) || this.flushing.has(scope)) return;\n if (this.timers.has(scope)) return;\n if (!this.hasPending(scope)) return;\n\n this.timers.set(\n scope,\n setTimeout(() => {\n this.timers.delete(scope);\n void this.flushNow(scope);\n }, this.quietMs),\n );\n }\n\n private clearTimer(scope: string): void {\n const timer = this.timers.get(scope);\n if (timer === undefined) return;\n clearTimeout(timer);\n this.timers.delete(scope);\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { QuestionCardInput } from '../card/question-card.js';\n\ninterface PendingQuestion {\n input: QuestionCardInput;\n resolve: (answer: string | string[] | undefined) => void;\n settled: boolean;\n}\n\n/**\n * Pending question-card registry. `/ask` registers a card; the card submit\n * action resolves it, and the answer is recorded back into the session.\n */\nexport class QuestionRegistry {\n private readonly pending = new Map<string, PendingQuestion>();\n\n register(\n scope: string,\n input: Omit<QuestionCardInput, 'id'>,\n ): { id: string; promise: Promise<string | string[] | undefined> } {\n const id = `question-${randomUUID().replaceAll('-', '')}`;\n const full: QuestionCardInput = { ...input, id };\n const promise = new Promise<string | string[] | undefined>((resolve) => {\n this.pending.set(`${scope}:${id}`, { input: full, resolve, settled: false });\n });\n return { id, promise };\n }\n\n resolve(scope: string, id: string, answer: string | string[] | undefined): boolean {\n const pending = this.pending.get(`${scope}:${id}`);\n if (!pending || pending.settled) return false;\n pending.settled = true;\n this.pending.delete(`${scope}:${id}`);\n pending.resolve(answer);\n return true;\n }\n\n settleAll(scope: string): number {\n let count = 0;\n for (const [key, pending] of this.pending) {\n if (!key.startsWith(`${scope}:`)) continue;\n if (pending.settled) continue;\n pending.settled = true;\n this.pending.delete(key);\n pending.resolve(undefined);\n count += 1;\n }\n return count;\n }\n\n get(scope: string, id: string): QuestionCardInput | undefined {\n return this.pending.get(`${scope}:${id}`)?.input;\n }\n}\n","export class RunPolicyStore {\n private readonly timeouts = new Map<string, number>();\n\n get(scope: string): number | undefined {\n return this.timeouts.get(scope);\n }\n\n set(scope: string, runTimeoutMs: number): void {\n this.timeouts.set(scope, runTimeoutMs);\n }\n\n clear(scope: string): boolean {\n return this.timeouts.delete(scope);\n }\n}\n","import { createLarkChannel, type LarkChannel, type NormalizedMessage } from '@larksuite/channel';\nimport type { AgentAdapter } from '../adapters/types.js';\nimport type { ActiveRuns } from '../bot/active-runs.js';\nimport type { ApprovalRegistry } from '../bot/approvals.js';\nimport type { DensityStore } from '../bot/density-store.js';\nimport type { PendingQueue } from '../bot/pending-queue.js';\nimport type { QuestionRegistry } from '../bot/questions.js';\nimport type { RunPolicyStore } from '../bot/run-policy.js';\nimport { tryHandleCommand, type CommandChannel } from '../commands/index.js';\nimport { extractQuestionAnswer } from '../card/question-card.js';\nimport type { AccessManager } from '../config/access-manager.js';\nimport { isEventFresh } from '../config/security.js';\nimport { log } from '../core/logger.js';\nimport type { SessionStore } from '../session/store.js';\nimport type { WorkspaceStore } from '../workspace/store.js';\nimport { adaptLarkChannel } from './lark-channel.js';\n\nexport interface StartChannelDeps {\n appId: string;\n appSecret: string;\n tenant: 'feishu' | 'lark';\n adapter: AgentAdapter;\n sessions: SessionStore;\n workspaces: WorkspaceStore;\n activeRuns: ActiveRuns;\n runPolicies: RunPolicyStore;\n defaultRunTimeoutMs: number;\n accessManager: AccessManager;\n pending: PendingQueue<NormalizedMessage>;\n approvals?: ApprovalRegistry;\n questions?: QuestionRegistry;\n densityStore?: DensityStore;\n defaultWorkspace: string;\n allowedUsers?: string[];\n allowedChats?: string[];\n accessDefaultDeny?: boolean;\n eventFreshnessMs?: number;\n model?: string;\n stopGraceMs?: number;\n createChannel?: typeof createLarkChannel;\n}\n\nexport interface BridgeChannel {\n channel: LarkChannel;\n disconnect(): Promise<void>;\n}\n\nexport async function startChannel(deps: StartChannelDeps): Promise<BridgeChannel> {\n const channel = (deps.createChannel ?? createLarkChannel)({\n appId: deps.appId,\n appSecret: deps.appSecret,\n domain:\n deps.tenant === 'lark' ? 'https://open.larksuite.com' : 'https://open.feishu.cn',\n source: 'dsh-lark-bot',\n policy: {\n dmMode: deps.allowedUsers?.length\n ? 'allowlist'\n : deps.accessDefaultDeny === true\n ? 'disabled'\n : 'open',\n requireMention: true,\n respondToMentionAll: false,\n ...(deps.allowedUsers ? { dmAllowlist: deps.allowedUsers } : {}),\n ...(deps.allowedChats ? { groupAllowlist: deps.allowedChats } : {}),\n },\n safety: {\n chatQueue: { enabled: false },\n },\n outbound: {\n streamThrottleMs: 400,\n },\n includeRawEvent: true,\n resolveChatMode: true,\n handshakeTimeoutMs: 8_000,\n httpTimeoutMs: 30_000,\n respectProxyEnv: true,\n });\n\n const streaming = adaptLarkChannel(channel);\n const commandChannel: CommandChannel = streaming;\n\n channel.on({\n message: async (msg) => {\n const scope = scopeForMessage(msg);\n if (\n deps.eventFreshnessMs !== undefined &&\n deps.eventFreshnessMs > 0 &&\n !isEventFresh(msg.createTime, deps.eventFreshnessMs)\n ) {\n log.warn('channel', 'stale-message-dropped', {\n scope,\n ageMs: Date.now() - msg.createTime,\n });\n return;\n }\n const context = {\n scope,\n chatId: msg.chatId,\n messageId: msg.messageId,\n threadId: msg.threadId,\n chatMode: msg.chatMode ?? msg.chatType,\n sessions: deps.sessions,\n workspaces: deps.workspaces,\n activeRuns: deps.activeRuns,\n runPolicies: deps.runPolicies,\n defaultRunTimeoutMs: deps.defaultRunTimeoutMs,\n accessManager: deps.accessManager,\n approvals: deps.approvals,\n questions: deps.questions,\n densityStore: deps.densityStore,\n channel: commandChannel,\n defaultWorkspace: deps.defaultWorkspace,\n };\n\n const handled = await tryHandleCommand(msg.content, context).catch((error: unknown) => {\n log.fail('channel-command', error, { scope });\n return false;\n });\n if (!handled) deps.pending.push(scope, msg);\n },\n cardAction: async (event) => {\n const value =\n event.action.value && typeof event.action.value === 'object'\n ? (event.action.value as Record<string, unknown>)\n : undefined;\n const scope = event.raw\n ? await resolveCardScope(event.chatId, event.raw as { message?: { thread_id?: string } })\n : event.chatId;\n if (value?.cmd === 'stop') {\n await deps.activeRuns.interrupt(scope);\n return;\n }\n if (value?.cmd === 'approve' && typeof value.id === 'string' && deps.approvals) {\n const outcome = value.outcome === 'allow' ? 'allowed-once' : 'rejected';\n deps.approvals.resolve(scope, value.id, outcome);\n return;\n }\n if (value?.cmd === 'question-submit' && typeof value.id === 'string' && deps.questions) {\n const question = deps.questions.get(scope, value.id);\n const form = event.action.formValue;\n if (question) {\n const answer = extractQuestionAnswer(\n question.kind,\n form?.answer,\n question.options,\n );\n deps.questions.resolve(scope, value.id, answer);\n }\n }\n },\n reconnecting: () => {\n log.warn('channel', 'reconnecting', {});\n },\n reconnected: () => {\n log.info('channel', 'reconnected', {});\n },\n error: (error) => {\n log.fail('channel', error);\n },\n });\n\n await channel.connect();\n return {\n channel,\n disconnect: () => channel.disconnect(),\n };\n}\n\nfunction scopeForMessage(msg: NormalizedMessage): string {\n if (msg.chatMode === 'topic' && msg.threadId) return `${msg.chatId}:${msg.threadId}`;\n return msg.chatId;\n}\n\nasync function resolveCardScope(\n chatId: string,\n raw: { message?: { thread_id?: string } },\n): Promise<string> {\n return raw.message?.thread_id ? `${chatId}:${raw.message.thread_id}` : chatId;\n}\n","import { resolve } from 'node:path';\nimport type { ActiveRuns } from '../bot/active-runs.js';\nimport type { ApprovalRegistry } from '../bot/approvals.js';\nimport type { DensityStore } from '../bot/density-store.js';\nimport type { QuestionRegistry } from '../bot/questions.js';\nimport type { RunPolicyStore } from '../bot/run-policy.js';\nimport type { AccessManager } from '../config/access-manager.js';\nimport type { SessionStore } from '../session/store.js';\nimport type { WorkspaceStore } from '../workspace/store.js';\nimport { renderWorkspaceCard } from '../card/workspace-card.js';\nimport { parseCardDensity, type CardDensity } from '../card/density.js';\nimport { questionHandlerFor } from '../bridge/run-flow.js';\n\nexport interface CommandChannel {\n sendMarkdown(\n chatId: string,\n markdown: string,\n options?: { replyTo?: string },\n ): Promise<void>;\n sendCard?(chatId: string, card: object): Promise<void>;\n}\n\nexport interface CommandContext {\n scope: string;\n chatId: string;\n messageId: string;\n threadId: string | undefined;\n chatMode: 'p2p' | 'group' | 'topic';\n sessions: SessionStore;\n workspaces: WorkspaceStore;\n activeRuns: ActiveRuns;\n runPolicies: RunPolicyStore;\n approvals: ApprovalRegistry | undefined;\n questions: QuestionRegistry | undefined;\n densityStore: DensityStore | undefined;\n defaultRunTimeoutMs: number;\n accessManager: AccessManager;\n channel: CommandChannel;\n defaultWorkspace: string;\n}\n\ntype Handler = (args: string, ctx: CommandContext) => Promise<void>;\n\nconst HELP = [\n '**dsh-lark-bot 命令**',\n '',\n '- `/new` `/reset` — 开始新会话',\n '- `/cd <path>` — 切换工作目录并重置会话',\n '- `/ws list|save <name>|use <name>|remove <name>` — 管理工作空间',\n '- `/status` — 查看当前状态',\n '- `/resume` — 查看当前会话最近上下文',\n '- `/stop` — 终止当前任务',\n '- `/timeout [N|off|default]` — 查看或设置当前会话运行超时',\n '- `/density [compact|standard|detailed]` — 查看或设置卡片密度',\n '- `/ask <问题>` — 发送结构化问答卡(回答将记入会话)',\n '- `/invite user|admin|group <id>` — 管理访问白名单',\n '- `/help` — 显示本帮助',\n].join('\\n');\n\nasync function reply(ctx: CommandContext, markdown: string): Promise<void> {\n await ctx.channel.sendMarkdown(ctx.chatId, markdown, {\n replyTo: ctx.messageId,\n });\n}\n\nasync function handleNew(_args: string, ctx: CommandContext): Promise<void> {\n const wasRunning = await ctx.activeRuns.interrupt(ctx.scope);\n ctx.sessions.clear(ctx.scope);\n await reply(ctx, wasRunning ? '已中断当前任务并开始新会话。' : '已开始新会话。');\n}\n\nasync function handleCd(args: string, ctx: CommandContext): Promise<void> {\n const path = args.trim();\n if (!path) {\n await reply(ctx, '用法:`/cd <path>`');\n return;\n }\n const cwd = resolve(path);\n await ctx.activeRuns.interrupt(ctx.scope);\n ctx.workspaces.setCwd(ctx.scope, cwd);\n ctx.sessions.clear(ctx.scope);\n await reply(ctx, `已切换工作目录:\\`${cwd}\\`,会话已重置。`);\n}\n\nasync function handleWs(args: string, ctx: CommandContext): Promise<void> {\n const [sub, ...rest] = args.trim().split(/\\s+/);\n const name = rest.join(' ').trim();\n\n if (!sub || sub === 'list') {\n const current = ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace;\n const named = ctx.workspaces.listNamed();\n const index = ctx.workspaces.listIndex();\n if (ctx.channel.sendCard) {\n await ctx.channel.sendCard(ctx.chatId, renderWorkspaceCard({ current, index }));\n return;\n }\n const lines = Object.entries(named).map(\n ([key, value]) => `- **${key}** → \\`${value}\\`${value === current ? ' ← 当前' : ''}`,\n );\n await reply(\n ctx,\n [\n `当前 cwd:\\`${current}\\``,\n '',\n ...(lines.length > 0 ? lines : ['暂无命名工作空间。']),\n ].join('\\n'),\n );\n return;\n }\n\n if (sub === 'save') {\n if (!name) {\n await reply(ctx, '用法:`/ws save <name>`');\n return;\n }\n const current = ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace;\n ctx.workspaces.saveNamed(name, current);\n await reply(ctx, `已保存工作空间:**${name}** → \\`${current}\\``);\n return;\n }\n\n if (sub === 'use') {\n if (!name) {\n await reply(ctx, '用法:`/ws use <name>`');\n return;\n }\n const cwd = ctx.workspaces.getNamed(name);\n if (!cwd) {\n await reply(ctx, `未找到工作空间:**${name}**`);\n return;\n }\n await ctx.activeRuns.interrupt(ctx.scope);\n ctx.workspaces.setCwd(ctx.scope, cwd);\n ctx.workspaces.touchNamed(name);\n ctx.sessions.clear(ctx.scope);\n await reply(ctx, `已切换到工作空间:**${name}** → \\`${cwd}\\``);\n return;\n }\n\n if (sub === 'remove') {\n if (!name) {\n await reply(ctx, '用法:`/ws remove <name>`');\n return;\n }\n const removed = ctx.workspaces.removeNamed(name);\n await reply(ctx, removed ? `已删除工作空间:**${name}**` : `未找到工作空间:**${name}**`);\n return;\n }\n\n await reply(ctx, '未知 `/ws` 子命令,请使用 list / save / use / remove。');\n}\n\nasync function handleStatus(_args: string, ctx: CommandContext): Promise<void> {\n const cwd = ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace;\n const session = ctx.sessions.getRaw(ctx.scope)?.sessionId ?? '(无)';\n const running = Boolean(ctx.activeRuns.get(ctx.scope));\n const scopeLabel =\n ctx.chatMode === 'topic' ? `${ctx.scope}(话题独立 session)` : ctx.scope;\n\n await reply(\n ctx,\n [\n `🧭 **scope**: \\`${scopeLabel}\\``,\n `📁 **cwd**: \\`${cwd}\\``,\n `🔗 **session**: \\`${session}\\``,\n `🏃 **active run**: ${running ? 'yes' : 'no'}`,\n ].join('\\n'),\n );\n}\n\nasync function handleResume(_args: string, ctx: CommandContext): Promise<void> {\n const cwd = ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace;\n const history = ctx.sessions.historyFor(ctx.scope, cwd);\n if (history.length === 0) {\n await reply(ctx, '当前会话没有历史上下文。');\n return;\n }\n\n const recent = history.slice(-6).map((message) => {\n const speaker = message.role === 'user' ? '👤' : '🤖';\n return `${speaker} ${message.content.slice(0, 300)}`;\n });\n\n await reply(ctx, [`当前 scope:\\`${ctx.scope}\\``, '', ...recent].join('\\n'));\n}\n\nasync function handleStop(_args: string, ctx: CommandContext): Promise<void> {\n const stopped = await ctx.activeRuns.interrupt(ctx.scope);\n await reply(ctx, stopped ? '已请求终止当前任务。' : '当前没有运行中的任务。');\n}\n\nasync function handleTimeout(args: string, ctx: CommandContext): Promise<void> {\n const input = args.trim();\n const effectiveMs = ctx.runPolicies.get(ctx.scope) ?? ctx.defaultRunTimeoutMs;\n\n if (!input) {\n const minutes = effectiveMs > 0 ? Math.round(effectiveMs / 60_000) : 0;\n await reply(\n ctx,\n minutes > 0\n ? `当前会话运行超时:${minutes} 分钟。可用 \\`/timeout <N|off|default>\\` 调整。`\n : '当前会话运行超时:关闭。',\n );\n return;\n }\n\n if (input === 'off') {\n ctx.runPolicies.set(ctx.scope, 0);\n await reply(ctx, '已关闭当前会话运行超时。');\n return;\n }\n\n if (input === 'default') {\n ctx.runPolicies.clear(ctx.scope);\n await reply(ctx, '已恢复默认运行超时。');\n return;\n }\n\n const minutes = Number(input);\n if (!Number.isInteger(minutes) || minutes <= 0) {\n await reply(ctx, '用法:`/timeout <N|off|default>`,N 为大于 0 的分钟数。');\n return;\n }\n\n ctx.runPolicies.set(ctx.scope, minutes * 60_000);\n await reply(ctx, `已设置当前会话运行超时:${minutes} 分钟。`);\n}\n\nasync function handleDensity(args: string, ctx: CommandContext): Promise<void> {\n const input = args.trim().toLowerCase();\n if (!input) {\n const current = ctx.densityStore?.get(ctx.scope) ?? 'standard';\n await reply(\n ctx,\n `当前卡片密度:**${current}**。可用 \\`/density compact|standard|detailed\\` 调整。`,\n );\n return;\n }\n if (input === 'default') {\n ctx.densityStore?.clear(ctx.scope);\n await reply(ctx, '已恢复默认卡片密度。');\n return;\n }\n const density: CardDensity | undefined = parseCardDensity(input);\n if (!density) {\n await reply(ctx, '用法:`/density [compact|standard|detailed|default]`');\n return;\n }\n ctx.densityStore?.set(ctx.scope, density);\n await reply(ctx, `已设置当前会话卡片密度:**${density}**。`);\n}\n\nasync function handleAsk(args: string, ctx: CommandContext): Promise<void> {\n const question = args.trim();\n if (!question) {\n await reply(ctx, '用法:`/ask <问题>`');\n return;\n }\n if (!ctx.questions) {\n await reply(ctx, '问答卡未启用(请确认 questions 已接线)。');\n return;\n }\n const answer = await questionHandlerFor({\n questions: ctx.questions,\n channel: ctx.channel,\n chatId: ctx.chatId,\n scope: ctx.scope,\n })({\n kind: 'text',\n question,\n id: '',\n });\n if (answer !== undefined) {\n const text = Array.isArray(answer) ? answer.join('、') : answer;\n ctx.sessions.recordExchange(ctx.scope, ctx.workspaces.cwdFor(ctx.scope) ?? ctx.defaultWorkspace, [text], undefined);\n await reply(ctx, `已记录你的回答,并写入会话上下文。`);\n } else {\n await reply(ctx, '未收到回答(卡片可能已超时或被忽略)。');\n }\n}\n\nasync function handleInvite(args: string, ctx: CommandContext): Promise<void> {\n const [kind, ...rest] = args.trim().split(/\\s+/);\n const id = rest.join(' ').trim();\n\n if (kind === 'list') {\n const snapshot = ctx.accessManager.snapshot();\n await reply(\n ctx,\n [\n '**访问白名单**',\n `users: ${snapshot.allowedUsers.join(', ') || '(空)'}`,\n `chats: ${snapshot.allowedChats.join(', ') || '(空)'}`,\n `admins: ${snapshot.admins.join(', ') || '(空)'}`,\n ].join('\\n'),\n );\n return;\n }\n\n if (!kind || !id) {\n await reply(\n ctx,\n '用法:`/invite user|admin|group <id>`、`/invite list`、`/invite remove user|group <id>`',\n );\n return;\n }\n\n if (kind === 'user') {\n await ctx.accessManager.addUser(id);\n await reply(ctx, `已允许用户:\\`${id}\\``);\n return;\n }\n\n if (kind === 'admin') {\n await ctx.accessManager.addAdmin(id);\n await reply(ctx, `已设为管理员:\\`${id}\\``);\n return;\n }\n\n if (kind === 'group') {\n await ctx.accessManager.addChat(id);\n await reply(ctx, `已允许群聊:\\`${id}\\``);\n return;\n }\n\n if (kind === 'remove') {\n const [sub, target] = rest;\n if (sub === 'user' && target) {\n await ctx.accessManager.removeUser(target);\n await reply(ctx, `已移除用户:\\`${target}\\``);\n return;\n }\n if (sub === 'group' && target) {\n await ctx.accessManager.removeChat(target);\n await reply(ctx, `已移除群聊:\\`${target}\\``);\n return;\n }\n await reply(ctx, '用法:`/invite remove user <id>` 或 `/invite remove group <chatId>`');\n return;\n }\n\n await reply(ctx, '未知 `/invite` 类型,请使用 user / admin / group / list / remove。');\n}\n\nasync function handleHelp(_args: string, ctx: CommandContext): Promise<void> {\n await reply(ctx, HELP);\n}\n\nconst handlers: Record<string, Handler> = {\n '/new': handleNew,\n '/reset': handleNew,\n '/cd': handleCd,\n '/ws': handleWs,\n '/status': handleStatus,\n '/resume': handleResume,\n '/stop': handleStop,\n '/timeout': handleTimeout,\n '/density': handleDensity,\n '/ask': handleAsk,\n '/invite': handleInvite,\n '/help': handleHelp,\n};\n\nexport async function tryHandleCommand(text: string, ctx: CommandContext): Promise<boolean> {\n const trimmed = text.trim();\n if (!trimmed.startsWith('/')) return false;\n const [command, ...rest] = trimmed.split(/\\s+/);\n const handler = handlers[command ?? ''];\n if (!handler) return false;\n await handler(rest.join(' '), ctx);\n return true;\n}\n","export function renderWorkspaceCard(input: {\n current: string;\n index: Array<{ name: string; cwd: string; lastUsed: number | undefined }>;\n}): object {\n const entries = input.index;\n const markdown = [\n `**当前工作目录**\\n\\`${input.current}\\``,\n '',\n ...(entries.length > 0\n ? entries.map(({ name, cwd, lastUsed }) =>\n `- **${name}** → \\`${cwd}\\`${lastUsed ? ` · ${new Date(lastUsed).toLocaleString()}` : ''}`,\n )\n : ['暂无命名工作空间。']),\n ].join('\\n');\n\n return {\n schema: '2.0',\n config: {\n summary: { content: '工作空间导航' },\n },\n body: {\n elements: [\n {\n tag: 'markdown',\n content: markdown,\n },\n ],\n },\n };\n}\n","export type CardDensity = 'compact' | 'standard' | 'detailed';\n\nexport const CARD_DENSITIES: readonly CardDensity[] = ['compact', 'standard', 'detailed'];\n\nexport function parseCardDensity(value: string | undefined): CardDensity | undefined {\n const normalized = value?.trim().toLowerCase();\n if (!normalized) return undefined;\n if ((CARD_DENSITIES as readonly string[]).includes(normalized)) {\n return normalized as CardDensity;\n }\n return undefined;\n}\n","import { randomUUID } from 'node:crypto';\nimport type { AgentAdapter, AgentEvent } from '../adapters/types.js';\nimport type { ActiveRuns } from '../bot/active-runs.js';\nimport { ApprovalRegistry } from '../bot/approvals.js';\nimport type { DensityStore } from '../bot/density-store.js';\nimport type { RunPolicyStore } from '../bot/run-policy.js';\nimport type { QuestionRegistry } from '../bot/questions.js';\nimport {\n finalizeIfRunning,\n initialState,\n markIdleTimeout,\n markInterrupted,\n reduce,\n type RunState,\n} from '../card/run-state.js';\nimport { renderCard } from '../card/run-renderer.js';\nimport { renderApprovalCard } from '../card/approval-card.js';\nimport { renderQuestionCard } from '../card/question-card.js';\nimport { log } from '../core/logger.js';\nimport type { SessionStore } from '../session/store.js';\nimport type { WorkspaceStore } from '../workspace/store.js';\nimport type { GitWorktreeManager } from '../workspace/git-worktree.js';\nimport type { StreamingChannel } from './types.js';\nimport type { ApprovalOutcome, ApprovalRequest } from '../adapters/types.js';\nimport type { QuestionCardInput } from '../card/question-card.js';\n\nexport interface RunFlowInput {\n scope: string;\n chatId: string;\n messages: string[];\n adapter: AgentAdapter;\n sessions: SessionStore;\n workspaces: WorkspaceStore;\n workspaceManager?: GitWorktreeManager;\n activeRuns: ActiveRuns;\n runPolicies?: RunPolicyStore;\n approvals?: ApprovalRegistry;\n questions?: QuestionRegistry;\n densityStore?: DensityStore;\n channel: StreamingChannel;\n defaultWorkspace: string;\n model?: string;\n stopGraceMs?: number;\n runTimeoutMs?: number;\n images?: string[];\n replyTo?: string;\n}\n\nexport async function runAgentBatch(input: RunFlowInput): Promise<void> {\n const replyOptions = input.replyTo ? { replyTo: input.replyTo } : {};\n\n if (input.activeRuns.get(input.scope)) {\n await input.channel.sendMarkdown(input.chatId, '当前会话已有任务正在运行,请先 `/stop` 或等待完成。', {\n ...replyOptions,\n });\n return;\n }\n\n const requestedCwd = input.workspaces.cwdFor(input.scope) ?? input.defaultWorkspace;\n const workspace = input.workspaceManager\n ? await input.workspaceManager.ensure(input.scope, requestedCwd)\n : { cwd: requestedCwd };\n const cwd = workspace.cwd;\n const sessionId = input.sessions.resumeFor(input.scope, cwd);\n const history = input.sessions.historyFor(input.scope, cwd);\n const prompt = buildPrompt(history, input.messages);\n const runId = randomUUID();\n\n const run = input.adapter.run({\n runId,\n prompt,\n cwd,\n sessionId,\n model: input.model,\n images: input.images,\n stopGraceMs: input.stopGraceMs,\n ...(input.approvals\n ? {\n onApprovalRequest: approvalHandlerFor({\n approvals: input.approvals,\n channel: input.channel,\n chatId: input.chatId,\n scope: input.scope,\n }),\n }\n : {}),\n });\n input.activeRuns.set(input.scope, { runId, stop: run.stop });\n\n let state: RunState = initialState;\n const stopRequested = { value: false };\n const timeoutMs = input.runPolicies?.get(input.scope) ?? input.runTimeoutMs ?? 0;\n let timedOut = false;\n let assistantOutput = '';\n const density = input.densityStore?.get(input.scope) ?? 'standard';\n\n try {\n await input.channel.streamCard(\n input.chatId,\n renderCard(state, density),\n async (controller) => {\n const consume = async (): Promise<void> => {\n for await (const event of run.events) {\n if (timedOut) return;\n state = applyEvent(state, event, stopRequested);\n if (event.type === 'final_text') {\n assistantOutput = event.content;\n } else if (event.type === 'text') {\n assistantOutput += event.delta;\n }\n if (event.type === 'system' && event.sessionId) {\n input.sessions.set(input.scope, event.sessionId, event.cwd ?? cwd);\n }\n await controller.update(renderCard(state, density));\n }\n };\n\n let timeoutTimer: NodeJS.Timeout | undefined;\n const timeoutPromise =\n timeoutMs > 0\n ? new Promise<void>((resolve) => {\n timeoutTimer = setTimeout(() => {\n timedOut = true;\n void run.stop();\n resolve();\n }, timeoutMs);\n })\n : undefined;\n\n try {\n if (timeoutPromise) {\n await Promise.race([consume(), timeoutPromise]);\n } else {\n await consume();\n }\n\n state = timedOut\n ? markIdleTimeout(state, timeoutMs / 60_000)\n : finalizeIfRunning(state);\n await controller.update(renderCard(state, density));\n } finally {\n if (timeoutTimer !== undefined) clearTimeout(timeoutTimer);\n }\n },\n replyOptions,\n );\n input.sessions.recordExchange(input.scope, cwd, input.messages, assistantOutput);\n } catch (error) {\n log.fail('run-flow', error, { scope: input.scope, runId });\n state = markInterrupted(state);\n try {\n await input.channel.sendMarkdown(input.chatId, `⚠️ agent 运行失败:${errorMessage(error)}`, {\n ...replyOptions,\n });\n } catch {\n // best effort; the card may already have failed\n }\n } finally {\n input.activeRuns.delete(input.scope);\n if (input.approvals) {\n input.approvals.settleAll(input.scope, 'cancelled');\n }\n if (input.questions) {\n input.questions.settleAll(input.scope);\n }\n }\n}\n\n/** Build the per-run approval handler wiring ACP requests to approval cards. */\nexport function approvalHandlerFor(\n input: {\n approvals: ApprovalRegistry | undefined;\n channel: { sendCard?: (chatId: string, card: object) => Promise<void> };\n chatId: string;\n scope: string;\n },\n): (request: ApprovalRequest) => Promise<ApprovalOutcome> {\n return async (request) => {\n if (!input.approvals || !input.channel.sendCard) return 'cancelled';\n const promise = input.approvals.register(input.scope, request);\n try {\n await input.channel.sendCard(\n input.chatId,\n renderApprovalCard({\n id: request.id,\n toolName: request.toolName,\n reason: request.reason,\n options: request.options,\n }),\n );\n } catch (error) {\n log.fail('approval-card', error, { scope: input.scope });\n input.approvals.settleAll(input.scope, 'cancelled');\n return 'cancelled';\n }\n return promise;\n };\n}\n\n/** Build the per-run question handler wiring `/ask` cards back to sessions. */\nexport function questionHandlerFor(\n input: {\n questions: QuestionRegistry | undefined;\n channel: { sendCard?: (chatId: string, card: object) => Promise<void> };\n chatId: string;\n scope: string;\n },\n): (question: QuestionCardInput) => Promise<string | string[] | undefined> {\n return async (question) => {\n if (!input.questions || !input.channel.sendCard) return undefined;\n const { id, promise } = input.questions.register(input.scope, {\n kind: question.kind,\n question: question.question,\n ...(question.options === undefined ? {} : { options: question.options }),\n ...(question.placeholder === undefined ? {} : { placeholder: question.placeholder }),\n });\n try {\n await input.channel.sendCard(input.chatId, renderQuestionCard({ ...question, id }));\n } catch (error) {\n log.fail('question-card', error, { scope: input.scope });\n input.questions.settleAll(input.scope);\n return undefined;\n }\n return promise;\n };\n}\n\nfunction buildPrompt(\n history: Array<{ role: 'user' | 'assistant'; content: string }>,\n messages: string[],\n): string {\n if (history.length === 0) return messages.join('\\n\\n');\n\n const transcript = history\n .map((message) => `${message.role === 'user' ? 'User' : 'Assistant'}: ${message.content}`)\n .join('\\n\\n');\n\n return [\n 'Continue the conversation using the history below.',\n '',\n transcript,\n '',\n `Current user message:\\n${messages.join('\\n\\n')}`,\n ].join('\\n');\n}\n\nfunction applyEvent(\n state: RunState,\n event: AgentEvent,\n stopRequested: { value: boolean },\n): RunState {\n if (event.type === 'done' && event.terminationReason === 'interrupted') {\n stopRequested.value = true;\n return markInterrupted(state);\n }\n if (event.type === 'error' && event.terminationReason === 'timeout') {\n return markIdleTimeout(state, 0);\n }\n return reduce(state, event);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { AgentEvent } from '../adapters/types.js';\n\nexport type ToolStatus = 'running' | 'done' | 'error';\n\nexport interface ToolEntry {\n id: string;\n name: string;\n input: unknown;\n status: ToolStatus;\n output?: string;\n}\n\nexport type Block =\n | { kind: 'text'; content: string; streaming: boolean }\n | { kind: 'tool'; tool: ToolEntry };\n\nexport type FooterStatus = 'thinking' | 'tool_running' | 'streaming' | null;\nexport type Terminal = 'running' | 'done' | 'interrupted' | 'error' | 'idle_timeout';\n\nexport interface RunState {\n blocks: Block[];\n reasoning: { content: string; active: boolean };\n usage: { inputTokens: number | undefined; outputTokens: number | undefined } | undefined;\n footer: FooterStatus;\n terminal: Terminal;\n errorMsg: string | undefined;\n idleTimeoutMinutes: number | undefined;\n}\n\nexport const initialState: RunState = {\n blocks: [],\n reasoning: { content: '', active: false },\n usage: undefined,\n footer: 'thinking',\n terminal: 'running',\n errorMsg: undefined,\n idleTimeoutMinutes: undefined,\n};\n\nfunction closeStreamingText(blocks: Block[]): Block[] {\n return blocks.map((block) =>\n block.kind === 'text' && block.streaming ? { ...block, streaming: false } : block,\n );\n}\n\nexport function reduce(state: RunState, event: AgentEvent): RunState {\n switch (event.type) {\n case 'text': {\n const last = state.blocks[state.blocks.length - 1];\n if (last?.kind === 'text' && last.streaming) {\n return {\n ...state,\n blocks: [\n ...state.blocks.slice(0, -1),\n { ...last, content: last.content + event.delta },\n ],\n reasoning: { ...state.reasoning, active: false },\n footer: 'streaming',\n };\n }\n return {\n ...state,\n blocks: [...state.blocks, { kind: 'text', content: event.delta, streaming: true }],\n reasoning: { ...state.reasoning, active: false },\n footer: 'streaming',\n };\n }\n\n case 'thinking':\n return {\n ...state,\n reasoning: {\n content: state.reasoning.content + event.delta,\n active: true,\n },\n footer: 'thinking',\n };\n\n case 'final_text':\n return {\n ...state,\n blocks: [\n ...closeStreamingText(state.blocks),\n { kind: 'text', content: event.content, streaming: false },\n ],\n reasoning: { ...state.reasoning, active: false },\n footer: null,\n };\n\n case 'usage':\n return {\n ...state,\n usage: {\n inputTokens: event.inputTokens,\n outputTokens: event.outputTokens,\n },\n };\n\n case 'tool_use':\n return {\n ...state,\n blocks: [\n ...closeStreamingText(state.blocks),\n {\n kind: 'tool',\n tool: {\n id: event.id,\n name: event.name,\n input: event.input,\n status: 'running',\n },\n },\n ],\n reasoning: { ...state.reasoning, active: false },\n footer: 'tool_running',\n };\n\n case 'tool_result':\n return {\n ...state,\n blocks: state.blocks.map((block) => {\n if (block.kind !== 'tool' || block.tool.id !== event.id) return block;\n return {\n ...block,\n tool: {\n ...block.tool,\n status: event.isError ? 'error' : 'done',\n output: event.output,\n },\n };\n }),\n };\n\n case 'error':\n return {\n ...state,\n terminal:\n event.terminationReason === 'interrupted'\n ? 'interrupted'\n : event.terminationReason === 'timeout'\n ? 'idle_timeout'\n : 'error',\n errorMsg: event.terminationReason === 'failed' ? event.message : undefined,\n idleTimeoutMinutes: undefined,\n footer: null,\n };\n\n case 'done':\n return {\n ...state,\n blocks: closeStreamingText(state.blocks),\n reasoning: { ...state.reasoning, active: false },\n terminal:\n event.terminationReason === 'interrupted'\n ? 'interrupted'\n : event.terminationReason === 'timeout'\n ? 'idle_timeout'\n : 'done',\n footer: null,\n };\n\n default:\n return state;\n }\n}\n\nexport function markInterrupted(state: RunState): RunState {\n return {\n ...state,\n blocks: closeStreamingText(state.blocks),\n reasoning: { ...state.reasoning, active: false },\n terminal: 'interrupted',\n footer: null,\n };\n}\n\nexport function markIdleTimeout(state: RunState, minutes: number): RunState {\n return {\n ...state,\n blocks: closeStreamingText(state.blocks),\n reasoning: { ...state.reasoning, active: false },\n terminal: 'idle_timeout',\n footer: null,\n idleTimeoutMinutes: minutes,\n };\n}\n\nexport function finalizeIfRunning(state: RunState): RunState {\n if (state.terminal !== 'running') return state;\n return {\n ...state,\n blocks: closeStreamingText(state.blocks),\n reasoning: { ...state.reasoning, active: false },\n terminal: 'done',\n footer: null,\n };\n}\n","import type { Block, FooterStatus, RunState, ToolEntry } from './run-state.js';\nimport type { CardDensity } from './density.js';\n\nfunction markdown(content: string): object {\n return { tag: 'markdown', content };\n}\n\nfunction noteMd(content: string): object {\n return { tag: 'markdown', content, text_size: 'notation' };\n}\n\nfunction footerStatus(status: Exclude<FooterStatus, null>): object {\n const text =\n status === 'thinking'\n ? '🧠 正在思考'\n : status === 'tool_running'\n ? '🧰 正在调用工具'\n : '✍️ 正在输出';\n return noteMd(text);\n}\n\nfunction summaryText(state: RunState): string {\n if (state.terminal === 'interrupted') return '已中断';\n if (state.terminal === 'idle_timeout') return '已超时';\n if (state.terminal === 'error') return '出错';\n if (state.terminal === 'done') return '已完成';\n if (state.footer === 'tool_running') return '正在调用工具';\n if (state.footer === 'streaming') return '正在输出';\n return '思考中';\n}\n\nfunction stopButton(): object {\n return {\n tag: 'button',\n text: { tag: 'plain_text', content: '⏹ 终止' },\n type: 'danger',\n value: { cmd: 'stop' },\n };\n}\n\nfunction textBlock(block: Extract<Block, { kind: 'text' }>): object {\n return markdown(block.content);\n}\n\nfunction toolBlock(tool: ToolEntry): object {\n const icon = tool.status === 'error' ? '⚠️' : tool.status === 'done' ? '✅' : '⏳';\n return markdown(`${icon} **${tool.name}**`);\n}\n\nfunction usageLine(state: RunState): string {\n if (!state.usage) return '';\n const parts: string[] = [];\n if (state.usage.inputTokens !== undefined) parts.push(`in ${state.usage.inputTokens}`);\n if (state.usage.outputTokens !== undefined) parts.push(`out ${state.usage.outputTokens}`);\n return parts.length ? `(tokens ${parts.join(' · ')})` : '';\n}\n\nfunction renderStandard(state: RunState): object {\n const elements: object[] = [];\n\n if (state.reasoning.content) {\n elements.push(\n noteMd(\n state.reasoning.active\n ? '🧠 正在思考…'\n : `🧠 思考完成:${state.reasoning.content.slice(0, 300)}`,\n ),\n );\n }\n\n for (const block of state.blocks) {\n if (block.kind === 'text') {\n elements.push(textBlock(block));\n } else if (block.tool.status !== 'done') {\n elements.push(toolBlock(block.tool));\n }\n }\n\n if (state.terminal === 'interrupted') {\n elements.push(noteMd('_⏹ 已被中断_'));\n } else if (state.terminal === 'idle_timeout') {\n elements.push(noteMd(`_⏱ ${state.idleTimeoutMinutes ?? 0} 分钟无响应,已自动终止_`));\n } else if (state.terminal === 'error' && state.errorMsg) {\n elements.push(noteMd(`⚠️ agent 失败:${state.errorMsg}`));\n } else if (state.terminal === 'done' && elements.length === 0) {\n elements.push(noteMd('_(未返回内容)_'));\n } else if (state.terminal === 'done') {\n const usage = usageLine(state);\n if (usage) elements.push(noteMd(usage));\n }\n\n if (state.terminal === 'running') {\n if (state.footer) elements.push(footerStatus(state.footer));\n elements.push(stopButton());\n }\n\n return {\n schema: '2.0',\n config: {\n streaming_mode: state.terminal === 'running',\n summary: { content: summaryText(state) },\n },\n body: { elements },\n };\n}\n\nfunction renderCompact(state: RunState): object {\n const elements: object[] = [noteMd(summaryText(state))];\n if (state.terminal === 'running' && state.footer) {\n elements.push(footerStatus(state.footer));\n }\n if (state.terminal === 'running') {\n elements.push(stopButton());\n }\n return {\n schema: '2.0',\n config: {\n streaming_mode: state.terminal === 'running',\n summary: { content: summaryText(state) },\n },\n body: { elements },\n };\n}\n\nfunction renderDetailed(state: RunState): object {\n const elements: object[] = [];\n\n if (state.reasoning.content) {\n elements.push(\n noteMd(\n state.reasoning.active\n ? '🧠 正在思考…'\n : `🧠 **思考过程**\\n${state.reasoning.content.slice(0, 2000)}`,\n ),\n );\n }\n\n for (const block of state.blocks) {\n if (block.kind === 'text') {\n elements.push(textBlock(block));\n continue;\n }\n const tool = block.tool;\n const icon = tool.status === 'error' ? '⚠️' : tool.status === 'done' ? '✅' : '⏳';\n const lines = [`${icon} **${tool.name}**`];\n if (tool.input !== undefined && tool.input !== '') {\n lines.push(`输入:\\`\\`\\`\\n${safeJsonPreview(tool.input)}\\n\\`\\`\\``);\n }\n if (tool.output) {\n lines.push(`输出:${tool.output.slice(0, 500)}`);\n }\n elements.push(markdown(lines.join('\\n')));\n }\n\n if (state.terminal === 'interrupted') {\n elements.push(noteMd('_⏹ 已被中断_'));\n } else if (state.terminal === 'idle_timeout') {\n elements.push(noteMd(`_⏱ ${state.idleTimeoutMinutes ?? 0} 分钟无响应,已自动终止_`));\n } else if (state.terminal === 'error' && state.errorMsg) {\n elements.push(noteMd(`⚠️ agent 失败:${state.errorMsg}`));\n } else if (state.terminal === 'done') {\n const usage = usageLine(state);\n if (usage) elements.push(noteMd(usage));\n }\n\n if (state.terminal === 'running') {\n if (state.footer) elements.push(footerStatus(state.footer));\n elements.push(stopButton());\n }\n\n return {\n schema: '2.0',\n config: {\n streaming_mode: state.terminal === 'running',\n summary: { content: summaryText(state) },\n },\n body: { elements },\n };\n}\n\nfunction safeJsonPreview(value: unknown): string {\n if (typeof value === 'string') return value.slice(0, 300);\n try {\n return JSON.stringify(value).slice(0, 300);\n } catch {\n return String(value).slice(0, 300);\n }\n}\n\n/** Render the run card at the requested density (compact / standard / detailed). */\nexport function renderCard(state: RunState, density: CardDensity = 'standard'): object {\n if (density === 'compact') return renderCompact(state);\n if (density === 'detailed') return renderDetailed(state);\n return renderStandard(state);\n}\n","import type { ApprovalOption } from '../adapters/types.js';\n\nexport interface ApprovalCardInput {\n id: string;\n toolName: string;\n reason: string | undefined;\n options: readonly ApprovalOption[];\n}\n\n/**\n * Feishu approval card for ACP `session/request_permission`: one-shot\n * allow / reject buttons, mirroring the options offered by the harness.\n */\nexport function renderApprovalCard(input: ApprovalCardInput): object {\n const allow = input.options.find((option) => option.kind === 'allow_once') ??\n input.options.find((option) => option.kind === 'allow_always');\n const reject = input.options.find((option) => option.kind === 'reject_once') ??\n input.options.find((option) => option.kind === 'reject_always');\n\n const markdown = [\n '🔐 **审批请求**',\n '',\n `**工具** \\`${input.toolName}\\``,\n ...(input.reason ? ['', input.reason] : []),\n ].join('\\n');\n\n const actions = [\n ...(allow\n ? [\n {\n tag: 'button',\n text: { tag: 'plain_text', content: `✅ ${allow.name}` },\n type: 'primary',\n value: { cmd: 'approve', id: input.id, outcome: 'allow' },\n },\n ]\n : []),\n ...(reject\n ? [\n {\n tag: 'button',\n text: { tag: 'plain_text', content: `⛔ ${reject.name}` },\n type: 'danger',\n value: { cmd: 'approve', id: input.id, outcome: 'reject' },\n },\n ]\n : []),\n ];\n\n return {\n schema: '2.0',\n config: {\n summary: { content: '审批请求' },\n },\n body: {\n elements: [\n { tag: 'markdown', content: markdown },\n { tag: 'action', actions },\n ],\n },\n };\n}\n","export type QuestionKind = 'single' | 'multi' | 'text';\n\nexport interface QuestionCardInput {\n id: string;\n kind: QuestionKind;\n question: string;\n options?: string[];\n placeholder?: string;\n}\n\nfunction formElement(input: QuestionCardInput): object {\n if (input.kind === 'text') {\n return {\n tag: 'input',\n name: 'answer',\n placeholder: { tag: 'plain_text', content: input.placeholder ?? '请输入答案…' },\n };\n }\n const options = (input.options ?? []).map((option, index) => ({\n text: { tag: 'plain_text', content: option },\n value: `option-${index}`,\n }));\n if (input.kind === 'multi') {\n return {\n tag: 'multi_select_static',\n name: 'answer',\n placeholder: { tag: 'plain_text', content: '请选择(可多选)…' },\n options,\n };\n }\n return {\n tag: 'select_static',\n name: 'answer',\n placeholder: { tag: 'plain_text', content: '请选择…' },\n options,\n };\n}\n\n/** Structured question card: single choice, multi choice, or free text. */\nexport function renderQuestionCard(input: QuestionCardInput): object {\n return {\n schema: '2.0',\n config: {\n summary: { content: '问题' },\n },\n body: {\n elements: [\n { tag: 'markdown', content: `❓ ${input.question}` },\n formElement(input),\n {\n tag: 'action',\n actions: [\n {\n tag: 'button',\n text: { tag: 'plain_text', content: '提交' },\n type: 'primary',\n value: { cmd: 'question-submit', id: input.id },\n },\n ],\n },\n ],\n },\n };\n}\n\n/**\n * Normalize a card action value into an answer for the question kind.\n * `answer` shapes: string (text / single select) or string[] (multi select).\n */\nexport function extractQuestionAnswer(\n kind: QuestionKind,\n value: unknown,\n options?: string[],\n): string | string[] | undefined {\n const answer = value;\n if (kind === 'text') {\n return typeof answer === 'string' && answer.trim() ? answer.trim() : undefined;\n }\n const selected = Array.isArray(answer)\n ? answer.map((item) => String(item))\n : typeof answer === 'string' && answer\n ? [answer]\n : [];\n if (selected.length === 0) return undefined;\n const labels = options ?? [];\n const resolved = selected.map((item) => {\n const match = /^option-(\\d+)$/.exec(item);\n if (match) {\n const index = Number(match[1]);\n return labels[index] ?? item;\n }\n return item;\n });\n return kind === 'single' ? resolved[0] : resolved;\n}\n","import type {\n CardStreamController as LarkCardStreamController,\n LarkChannel,\n SendOptions,\n} from '@larksuite/channel';\nimport type { CommandChannel } from '../commands/index.js';\nimport type { StreamingChannel } from './types.js';\n\nexport function adaptLarkChannel(channel: LarkChannel): StreamingChannel {\n const base: CommandChannel = {\n async sendMarkdown(chatId, markdown, options) {\n const sendOptions: SendOptions = {};\n if (options?.replyTo) sendOptions.replyTo = options.replyTo;\n await channel.send(chatId, { markdown }, sendOptions);\n },\n };\n\n return {\n ...base,\n async sendCard(chatId, card) {\n await channel.send(chatId, { card }, {});\n },\n async streamCard(chatId, initial, producer, options) {\n const sendOptions: SendOptions = {};\n if (options?.replyTo) sendOptions.replyTo = options.replyTo;\n await channel.stream(\n chatId,\n {\n card: {\n initial,\n producer: async (controller: LarkCardStreamController) => {\n await producer(controller);\n },\n },\n },\n sendOptions,\n );\n },\n };\n}\n","import type { ConfigStore, ProfileConfig } from './profile-store.js';\n\nexport interface AccessSnapshot {\n allowedUsers: string[];\n allowedChats: string[];\n admins: string[];\n}\n\nexport class AccessManager {\n constructor(\n private readonly store: ConfigStore,\n private readonly profileName: string,\n ) {}\n\n snapshot(): AccessSnapshot {\n const profile = this.profile();\n return {\n allowedUsers: [...profile.access.allowedUsers],\n allowedChats: [...profile.access.allowedChats],\n admins: [...profile.access.admins],\n };\n }\n\n async addUser(id: string): Promise<void> {\n const snapshot = this.snapshot();\n if (!snapshot.allowedUsers.includes(id)) snapshot.allowedUsers.push(id);\n await this.persist(snapshot);\n }\n\n async addAdmin(id: string): Promise<void> {\n const snapshot = this.snapshot();\n if (!snapshot.allowedUsers.includes(id)) snapshot.allowedUsers.push(id);\n if (!snapshot.admins.includes(id)) snapshot.admins.push(id);\n await this.persist(snapshot);\n }\n\n async addChat(chatId: string): Promise<void> {\n const snapshot = this.snapshot();\n if (!snapshot.allowedChats.includes(chatId)) snapshot.allowedChats.push(chatId);\n await this.persist(snapshot);\n }\n\n async removeUser(id: string): Promise<void> {\n const snapshot = this.snapshot();\n snapshot.allowedUsers = snapshot.allowedUsers.filter((item) => item !== id);\n snapshot.admins = snapshot.admins.filter((item) => item !== id);\n await this.persist(snapshot);\n }\n\n async removeChat(chatId: string): Promise<void> {\n const snapshot = this.snapshot();\n snapshot.allowedChats = snapshot.allowedChats.filter((item) => item !== chatId);\n await this.persist(snapshot);\n }\n\n private profile(): ProfileConfig {\n const profile = this.store.getProfile(this.profileName);\n if (!profile) throw new Error(`profile not found: ${this.profileName}`);\n return profile;\n }\n\n private async persist(snapshot: AccessSnapshot): Promise<void> {\n const profile = this.profile();\n await this.store.saveProfile(this.profileName, {\n tenant: profile.tenant,\n appId: profile.accounts.appId,\n appSecret: profile.accounts.appSecret,\n access: snapshot,\n });\n }\n}\n","import { registerApp, type RegisterAppOptions, type RegisterAppResult } from '@larksuite/channel';\nimport qrcode from 'qrcode-terminal';\nimport type { LarkTenant } from '../config/env.js';\n\nexport interface OnboardedApp {\n appId: string;\n appSecret: string;\n tenant: LarkTenant;\n operatorOpenId: string | undefined;\n}\n\nexport interface RegistrationDeps {\n register?: (options: RegisterAppOptions) => Promise<RegisterAppResult>;\n renderQr?: (value: string) => void;\n print?: (line: string) => void;\n source?: string;\n signal?: AbortSignal;\n}\n\nconst DEFAULT_SOURCE = 'dsh-lark-bot';\n\nexport async function onboardPersonalAgent(\n deps: RegistrationDeps = {},\n): Promise<OnboardedApp> {\n const register = deps.register ?? registerApp;\n const renderQr = deps.renderQr ?? ((value) => qrcode.generate(value, { small: true }));\n const print = deps.print ?? ((line) => process.stdout.write(`${line}\\n`));\n\n print('');\n print('未检测到飞书 / Lark 应用凭据,进入扫码创建向导。');\n print('');\n\n const result = await register({\n source: deps.source ?? DEFAULT_SOURCE,\n ...(deps.signal ? { signal: deps.signal } : {}),\n onQRCodeReady: (info) => {\n print('请使用飞书 / Lark App 扫描以下二维码,创建或选择 PersonalAgent 应用:');\n print('');\n renderQr(info.url);\n print('');\n const minutes = Math.max(1, Math.round(info.expireIn / 60));\n print(`二维码有效期约 ${minutes} 分钟。`);\n print(`也可以直接在浏览器打开:${info.url}`);\n print('');\n },\n onStatusChange: (info) => {\n if (info.status === 'domain_switched') {\n print('已识别到国际版租户,自动切换到 larksuite.com 域名。');\n } else if (info.status === 'slow_down') {\n print('轮询速度过快,已自动降速。');\n }\n },\n });\n\n const tenant: LarkTenant = result.user_info?.tenant_brand === 'lark' ? 'lark' : 'feishu';\n\n print('✓ PersonalAgent 应用创建 / 绑定成功。');\n print(` App ID: ${result.client_id}`);\n print(` Tenant: ${tenant}`);\n print('');\n\n return {\n appId: result.client_id,\n appSecret: result.client_secret,\n tenant,\n operatorOpenId: result.user_info?.open_id,\n };\n}\n","import { mkdir, readFile, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { isPathWithin, truncateUtf8Safe } from '../config/security.js';\nimport type {\n LarkChannel,\n NormalizedMessage,\n} from '@larksuite/channel';\n\nexport interface PreparedAttachments {\n imagePaths: string[];\n textFileNotes: string[];\n}\n\nconst MAX_TEXT_FILE_BYTES = 256_000;\n\nfunction assertSafeMediaName(mediaDir: string, destination: string): void {\n if (!isPathWithin(mediaDir, destination)) {\n throw new Error(`unsafe attachment destination rejected: ${destination}`);\n }\n}\n\nexport async function prepareAttachments(\n channel: LarkChannel | undefined,\n message: NormalizedMessage,\n mediaDir: string,\n): Promise<PreparedAttachments> {\n await mkdir(mediaDir, { recursive: true });\n const result: PreparedAttachments = { imagePaths: [], textFileNotes: [] };\n\n for (const resource of message.resources) {\n if (!channel || resource.type !== 'image' && resource.type !== 'file') continue;\n const destination = join(mediaDir, `${message.messageId}-${resource.fileKey}`);\n assertSafeMediaName(mediaDir, destination);\n await channel.downloadResourceToFile(\n message.messageId,\n resource.fileKey,\n resource.type,\n destination,\n );\n\n if (resource.type === 'image') {\n result.imagePaths.push(destination);\n continue;\n }\n\n const info = await stat(destination);\n if (info.size > MAX_TEXT_FILE_BYTES) {\n result.textFileNotes.push(`[attachment: ${resource.fileName ?? resource.fileKey}] ${destination}`);\n continue;\n }\n\n const content = await readFile(destination, 'utf8');\n const safeContent = truncateUtf8Safe(content, MAX_TEXT_FILE_BYTES);\n result.textFileNotes.push(\n `[attachment: ${resource.fileName ?? resource.fileKey}]\\n${safeContent}`,\n );\n }\n\n return result;\n}\n","import { readFile } from 'node:fs/promises';\nimport { writeFileAtomic } from '../platform/atomic-write.js';\nimport { log } from '../core/logger.js';\n\nexport interface SessionRecord {\n sessionId: string | undefined;\n cwd: string;\n messages: ChatMessage[];\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\ninterface SessionData {\n chats: Record<string, SessionRecord>;\n}\n\nexport class SessionStore {\n private data: SessionData = { chats: {} };\n private saving: Promise<void> = Promise.resolve();\n private readonly path: string;\n\n constructor(path: string) {\n this.path = path;\n }\n\n async load(): Promise<void> {\n try {\n const raw = await readFile(this.path, 'utf8');\n const parsed = JSON.parse(raw) as Partial<SessionData>;\n this.data = {\n chats: Object.fromEntries(\n Object.entries(parsed.chats ?? {}).map(([scope, record]) => [\n scope,\n {\n sessionId: record.sessionId,\n cwd: record.cwd,\n messages: record.messages ?? [],\n },\n ]),\n ),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n }\n\n getRaw(scopeId: string): SessionRecord | undefined {\n return this.data.chats[scopeId];\n }\n\n set(scopeId: string, sessionId: string | undefined, cwd: string): void {\n const existing = this.data.chats[scopeId];\n this.data.chats[scopeId] = {\n sessionId: sessionId ?? existing?.sessionId,\n cwd,\n messages: existing?.messages ?? [],\n };\n this.schedulePersist();\n }\n\n historyFor(scopeId: string, cwd: string): ChatMessage[] {\n const record = this.data.chats[scopeId];\n return record && record.cwd === cwd ? record.messages : [];\n }\n\n recordExchange(\n scopeId: string,\n cwd: string,\n userMessages: string[],\n assistantMessage: string | undefined,\n ): void {\n const existing = this.data.chats[scopeId];\n const next: ChatMessage[] = [...(existing?.messages ?? [])];\n\n for (const content of userMessages) {\n if (content.trim()) next.push({ role: 'user', content });\n }\n\n if (assistantMessage?.trim()) {\n next.push({ role: 'assistant', content: assistantMessage });\n }\n\n this.data.chats[scopeId] = {\n sessionId: existing?.sessionId,\n cwd,\n messages: next.slice(-40),\n };\n this.schedulePersist();\n }\n\n clear(scopeId: string): boolean {\n if (!(scopeId in this.data.chats)) return false;\n delete this.data.chats[scopeId];\n this.schedulePersist();\n return true;\n }\n\n fork(scopeId: string, newScopeId: string, cwd: string): boolean {\n const source = this.data.chats[scopeId];\n if (!source) return false;\n this.data.chats[newScopeId] = {\n sessionId: undefined,\n cwd,\n messages: [...source.messages],\n };\n this.schedulePersist();\n return true;\n }\n\n resumeFor(scopeId: string, cwd: string): string | undefined {\n const record = this.data.chats[scopeId];\n return record && record.cwd === cwd ? record.sessionId : undefined;\n }\n\n async flush(): Promise<void> {\n await this.saving;\n }\n\n private schedulePersist(): void {\n const snapshot = this.snapshot();\n this.saving = this.saving\n .then(async () => {\n await writeFileAtomic(this.path, `${JSON.stringify(snapshot, null, 2)}\\n`, {\n mode: 0o600,\n });\n })\n .catch((error: unknown) => {\n log.fail('session', error, { step: 'persist' });\n });\n }\n\n private snapshot(): SessionData {\n return {\n chats: Object.fromEntries(\n Object.entries(this.data.chats).map(([key, record]) => [\n key,\n {\n ...record,\n messages: [...record.messages],\n },\n ]),\n ),\n };\n }\n}\n","import { execFile } from 'node:child_process';\nimport { randomBytes } from 'node:crypto';\nimport { access, copyFile, mkdir } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { promisify } from 'node:util';\nimport { isPathWithin } from '../config/security.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport type GitRunner = (args: string[], cwd: string) => Promise<string>;\n\nexport interface WorktreeEnsureResult {\n cwd: string;\n created: boolean;\n branch?: string;\n}\n\nexport interface GitWorktreeOptions {\n worktreesRoot: string;\n runGit?: GitRunner;\n copyRulesFile?: (source: string, target: string) => Promise<void>;\n}\n\nasync function defaultRunGit(args: string[], cwd: string): Promise<string> {\n const result = await execFileAsync('git', args, {\n cwd,\n encoding: 'utf8',\n });\n return result.stdout;\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function defaultCopyRulesFile(source: string, target: string): Promise<void> {\n await mkdir(dirname(target), { recursive: true });\n await copyFile(source, target);\n}\n\nfunction slugify(scope: string): string {\n const slug = scope\n .trim()\n .replace(/[^a-zA-Z0-9._-]+/g, '-')\n .replace(/^[.]+/, '')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64);\n return slug || 'session';\n}\n\nexport class GitWorktreeManager {\n private readonly runGit: GitRunner;\n private readonly copyRulesFile: (source: string, target: string) => Promise<void>;\n\n constructor(private readonly options: GitWorktreeOptions) {\n this.runGit = options.runGit ?? defaultRunGit;\n this.copyRulesFile = options.copyRulesFile ?? defaultCopyRulesFile;\n }\n\n async ensure(scope: string, base: string): Promise<WorktreeEnsureResult> {\n const isGit = await this.isGitRepository(base);\n if (!isGit) return { cwd: base, created: false };\n\n const slug = slugify(scope);\n const target = join(this.options.worktreesRoot, slug);\n if (!isPathWithin(this.options.worktreesRoot, target)) {\n throw new Error(`unsafe worktree target rejected: ${target}`);\n }\n if (await exists(target)) {\n await this.ensureProjectRules(base, target);\n return { cwd: target, created: false };\n }\n\n const branch = `dsh-lark/${slug}-${Date.now().toString(36)}-${randomBytes(3).toString('hex')}`;\n await mkdir(this.options.worktreesRoot, { recursive: true });\n await this.runGit(['worktree', 'add', '-b', branch, target, 'HEAD'], base);\n await this.ensureProjectRules(base, target);\n return { cwd: target, created: true, branch };\n }\n\n async isGitRepository(cwd: string): Promise<boolean> {\n try {\n const result = await this.runGit(['rev-parse', '--is-inside-work-tree'], cwd);\n return result.trim() === 'true';\n } catch {\n return false;\n }\n }\n\n private async ensureProjectRules(base: string, target: string): Promise<void> {\n const destination = join(target, 'AGENTS.md');\n if (await exists(destination)) return;\n\n const sourceCandidates = [join(base, '.dsh-lark', 'AGENTS.md'), join(base, 'AGENTS.md')];\n for (const source of sourceCandidates) {\n if (await exists(source)) {\n await this.copyRulesFile(source, destination);\n return;\n }\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { writeFileAtomic } from '../platform/atomic-write.js';\nimport { log } from '../core/logger.js';\n\ninterface WorkspaceData {\n chats: Record<string, { cwd: string }>;\n named: Record<string, string>;\n lastUsed: Record<string, number>;\n}\n\nexport class WorkspaceStore {\n private data: WorkspaceData = { chats: {}, named: {}, lastUsed: {} };\n private saving: Promise<void> = Promise.resolve();\n private readonly path: string;\n\n constructor(path: string) {\n this.path = path;\n }\n\n async load(): Promise<void> {\n try {\n const raw = await readFile(this.path, 'utf8');\n const parsed = JSON.parse(raw) as Partial<WorkspaceData>;\n this.data = {\n chats: parsed.chats ?? {},\n named: parsed.named ?? {},\n lastUsed: parsed.lastUsed ?? {},\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n }\n\n cwdFor(scopeId: string): string | undefined {\n return this.data.chats[scopeId]?.cwd;\n }\n\n setCwd(scopeId: string, cwd: string): void {\n this.data.chats[scopeId] = { cwd };\n this.schedulePersist();\n }\n\n removeCwd(scopeId: string): boolean {\n if (!(scopeId in this.data.chats)) return false;\n delete this.data.chats[scopeId];\n this.schedulePersist();\n return true;\n }\n\n listNamed(): Record<string, string> {\n return { ...this.data.named };\n }\n\n getNamed(name: string): string | undefined {\n return this.data.named[name];\n }\n\n saveNamed(name: string, cwd: string): void {\n this.data.named[name] = cwd;\n this.data.lastUsed[name] = Date.now();\n this.schedulePersist();\n }\n\n touchNamed(name: string): void {\n if (!(name in this.data.named)) return;\n this.data.lastUsed[name] = Date.now();\n this.schedulePersist();\n }\n\n removeNamed(name: string): boolean {\n if (!(name in this.data.named)) return false;\n delete this.data.named[name];\n delete this.data.lastUsed[name];\n this.schedulePersist();\n return true;\n }\n\n listIndex(): Array<{ name: string; cwd: string; lastUsed: number | undefined }> {\n return Object.entries(this.data.named)\n .map(([name, cwd]) => ({ name, cwd, lastUsed: this.data.lastUsed[name] }))\n .sort((a, b) => (b.lastUsed ?? 0) - (a.lastUsed ?? 0));\n }\n\n async flush(): Promise<void> {\n await this.saving;\n }\n\n private schedulePersist(): void {\n const snapshot: WorkspaceData = {\n chats: { ...this.data.chats },\n named: { ...this.data.named },\n lastUsed: { ...this.data.lastUsed },\n };\n this.saving = this.saving\n .then(async () => {\n await writeFileAtomic(this.path, `${JSON.stringify(snapshot, null, 2)}\\n`, {\n mode: 0o600,\n });\n })\n .catch((error: unknown) => {\n log.fail('workspace', error, { step: 'persist' });\n });\n }\n}\n"],"mappings":"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","names":["resolve","existsSync","spawn","existsSync","mkdir","writeFile","join","packageJsonFor","runPnpmInstall","resolve","randomUUID","isRecord","buildPromptText","waitForChildExit","resolve","homedir","spawn","resolve","spawn","resolve","isRecord","stringValue","resolve","spawn","existsSync","join","resolve","buildAcpAgentAdapter","homedir","homedir","join","join","resolve","homedir","mkdir","dirname","mkdir","writeFile","join","mkdir","dirname","mkdir","resolve","REDACTED","resolve","randomUUID","resolve","resolve","markdown","randomUUID","markdown","randomUUID","resolve","markdown","resolve","minutes","markdown","mkdir","readFile","stat","join","mkdir","join","stat","readFile","readFile","readFile","randomBytes","mkdir","dirname","join","mkdir","dirname","join","randomBytes","readFile","readFile","mkdir","errorMessage","resolve"]}
|