@shipit-ai/cli 1.167.0 → 1.167.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-merge-review-data.js +5 -1
- package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/open-shell.js +5 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +43 -9
- package/dist/src/presentation/web/lib/path-sanitizers.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/path-sanitizers.js +5 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +3 -3
- package/web/.next/fallback-build-manifest.json +3 -3
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +31 -31
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +1 -1
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__0_-chcy._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__0e9p7em._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
- package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
- package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
- package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
- package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
- package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__02.89uf._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__02.89uf._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__04rq9lr._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__04rq9lr._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0c0xoi_._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0c0xoi_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0r5zhk.._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0r5zhk.._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0uy_5rw._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0uy_5rw._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0l10ccg._.js → _0-.ckn5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0l10ccg._.js.map → _0-.ckn5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
- package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_069y.js._.js +2 -2
- package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0__4si~._.js +1 -1
- package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0_m17kl._.js +1 -1
- package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0mo6j.n._.js → _0aaotn-._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0mo6j.n._.js.map → _0aaotn-._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_0d4miu.._.js +1 -1
- package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0e8ern9._.js +1 -1
- package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0n.magx._.js +1 -1
- package/web/.next/server/chunks/ssr/_0p3~u8u._.js +2 -2
- package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0r.3n~3._.js +1 -1
- package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0t59q8r._.js +1 -1
- package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
- package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
- package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0zk-h5w._.js +1 -1
- package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
- package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1161g9x._.js +1 -1
- package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0mvhe_2._.js → _138qywk._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0mvhe_2._.js.map → _138qywk._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_0aji.op._.js +1 -1
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/pages/500.html +1 -1
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +50 -50
- package/web/.next/static/chunks/{11~m1ei9bh269.js → 0-woqr2brccx_.js} +1 -1
- package/web/.next/static/chunks/{0.8ue6wwr7ni~.js → 022nrd6snse79.js} +1 -1
- package/web/.next/static/chunks/{028x3z97mchhz.js → 02phgt~f2c-2q.js} +1 -1
- package/web/.next/static/chunks/{0pyz97q7eg0jz.js → 03s7z6w1lj0w~.js} +1 -1
- package/web/.next/static/chunks/{044f5piy5pt5t.js → 08611baheit.t.js} +1 -1
- package/web/.next/static/chunks/{0n3u~4ytndfyd.js → 0j.wph28jrce1.js} +1 -1
- package/web/.next/static/chunks/0ls0v8h_qbctm.js +1 -0
- package/web/.next/static/chunks/{0_.x~txb5da7d.js → 0ma7k9iohb3bb.js} +1 -1
- package/web/.next/static/chunks/{0qqe9hx_txhso.js → 0ps5sykbi-z5-.js} +1 -1
- package/web/.next/static/chunks/{13w6ziae82sjy.js → 0q7ohuqneuur4.js} +1 -1
- package/web/.next/static/chunks/{0hti2r43x0~b7.js → 0q8ax~44oybo2.js} +1 -1
- package/web/.next/static/chunks/{0jo5-_q.1n69j.js → 15rbgqykl.er8.js} +1 -1
- package/web/.next/static/chunks/{0vx7ldqj8436q.js → 17z2sq7c5z8cr.js} +3 -3
- package/web/.next/static/chunks/16.83v.xq8bn9.js +0 -1
- /package/web/.next/static/{ksBer6au8b_fS1_7dCF2D → GSG_c1emY-f_AA00vD56y}/_buildManifest.js +0 -0
- /package/web/.next/static/{ksBer6au8b_fS1_7dCF2D → GSG_c1emY-f_AA00vD56y}/_clientMiddlewareManifest.js +0 -0
- /package/web/.next/static/{ksBer6au8b_fS1_7dCF2D → GSG_c1emY-f_AA00vD56y}/_ssgManifest.js +0 -0
package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/open-ide.ts","../../../../../../../src/presentation/web/app/actions/open-shell.ts","../../../../../../../src/presentation/web/app/actions/open-folder.ts","../../../../../../../src/presentation/web/app/actions/sync-repository.ts","../../../../../../../src/presentation/web/app/actions/agent-setup-flag.ts","../../../../../../../src/presentation/web/app/actions/check-agent-auth.ts","../../../../../../../src/presentation/web/app/actions/check-tool-status.ts","../../../../../../../src/presentation/web/app/actions/get-feature-metadata.ts","../../../../../../../src/presentation/web/app/actions/archive-feature.ts","../../../../../../../src/presentation/web/app/actions/delete-feature.ts","../../../../../../../src/presentation/web/app/actions/resume-feature.ts","../../../../../../../src/presentation/web/app/actions/start-feature.ts","../../../../../../../src/presentation/web/app/actions/stop-feature.ts","../../../../../../../src/presentation/web/app/actions/unarchive-feature.ts","../../../../../../../src/presentation/web/app/actions/add-repository.ts","../../../../../../../src/presentation/web/app/actions/delete-repository.ts"],"sourcesContent":["'use server';\n\nimport { isAbsolute } from 'node:path';\nimport { resolve } from '@/lib/server-container';\nimport type { LoadSettingsUseCase } from '@shipit-ai/core/application/use-cases/settings/load-settings.use-case';\nimport type { LaunchIdeUseCase } from '@shipit-ai/core/application/use-cases/ide/launch-ide.use-case';\n\ninterface OpenIdeInput {\n repositoryPath: string;\n branch?: string;\n}\n\nexport async function openIde(\n input: OpenIdeInput\n): Promise<{ success: boolean; error?: string; editor?: string; path?: string }> {\n const { repositoryPath, branch } = input;\n\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n const loadSettings = resolve<LoadSettingsUseCase>('LoadSettingsUseCase');\n const settings = await loadSettings.execute();\n const editor = settings.environment.defaultEditor;\n\n const useCase = resolve<LaunchIdeUseCase>('LaunchIdeUseCase');\n const result = await useCase.execute({\n editorId: editor,\n repositoryPath,\n branch,\n checkAvailability: true,\n });\n\n if (!result.ok) {\n return { success: false, error: result.message };\n }\n\n return { success: true, editor: result.editorName, path: result.worktreePath };\n}\n","'use server';\n\nimport { realpathSync } from 'node:fs';\nimport { platform } from 'node:os';\nimport { isAbsolute } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { computeWorktreePath } from '@/lib/core-utils';\nimport { resolve } from '@/lib/server-container';\nimport type { LoadSettingsUseCase } from '@shipit-ai/core/application/use-cases/settings/load-settings.use-case';\nimport type { IToolInstallerService } from '@shipit-ai/core/application/ports/output/services/tool-installer.service';\n\n/**\n * Resolve the target path through realpath() so that any symlink traversal\n * happens up-front and the resulting absolute path is the authoritative\n * value used for all subsequent spawn operations. Returns null if the path\n * does not exist or cannot be resolved.\n */\nfunction resolveTargetPath(repositoryPath: string, branch?: string): string | null {\n try {\n const base = branch ? computeWorktreePath(repositoryPath, branch) : repositoryPath;\n return realpathSync(base);\n } catch {\n return null;\n }\n}\n\n/**\n * POSIX shell-escape a path for safe inclusion in a shell:true command string.\n * Wraps in single quotes and escapes embedded single quotes using the\n * standard '\\'' pattern. All tool configurations that opt into shell:true\n * use POSIX-style commands (`cd {dir} && exec <tool>`) and run on Unix only.\n */\nfunction shellEscapePosixPath(p: string): string {\n return `'${p.replace(/'/g, `'\\\\''`)}'`;\n}\n\n// Fallback commands for the \"system\" terminal when no tool metadata entry exists.\n// Uses a record lookup instead of if/else to prevent the bundler from\n// tree-shaking platform branches at build time. Turbopack evaluates\n// os.platform() during the build and dead-code-eliminates unused branches,\n// baking in the CI platform (linux) and breaking macOS/Windows installs.\nconst SYSTEM_TERMINAL_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> =\n {\n darwin: { cmd: 'open', args: (p) => ['-a', 'Terminal', p] },\n linux: { cmd: 'x-terminal-emulator', args: (p) => [`--working-directory=${p}`] },\n win32: {\n cmd: 'cmd.exe',\n args: (p) => ['/c', 'start', 'powershell', '-NoExit', '-Command', `Set-Location \"${p}\"`],\n },\n };\n\ninterface OpenShellInput {\n repositoryPath: string;\n branch?: string;\n}\n\nexport async function openShell(\n input: OpenShellInput\n): Promise<{ success: boolean; error?: string; path?: string; shell?: string }> {\n const { repositoryPath, branch } = input;\n\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n const loadSettings = resolve<LoadSettingsUseCase>('LoadSettingsUseCase');\n const settings = await loadSettings.execute();\n const shell = settings.environment.shellPreference;\n const terminalPref = settings.environment.terminalPreference ?? 'system';\n\n // Resolve the target path through realpath() up-front. From this point\n // on, `targetPath` is the authoritative, symlink-resolved absolute path\n // used for every spawn call — never the raw user-supplied value.\n const targetPath = resolveTargetPath(repositoryPath, branch);\n if (!targetPath) {\n return { success: false, error: 'Path does not exist' };\n }\n\n // Try to find the terminal in tool metadata via DI container.\n // Using DI (not a direct import from tool-metadata) ensures that\n // TOOL_METADATA is read from the correct tools/ directory path — it is loaded once\n // in the Node.js CLI bootstrap context where import.meta.url resolves correctly.\n // Direct imports of tool-metadata break in standalone production builds.\n if (terminalPref !== 'system') {\n try {\n const service = resolve<IToolInstallerService>('IToolInstallerService');\n const config = service.getTerminalOpenConfig(terminalPref);\n\n if (config?.openDirectory.includes('{dir}')) {\n if (config.shell) {\n // For shell:true tools (claude-code, codex-cli, etc.) the tool\n // config is a POSIX shell string like `cd {dir} && exec claude`.\n // Shell-escape the path to prevent command injection: a malicious\n // path like `/tmp; rm -rf /` becomes `'/tmp; rm -rf /'` which the\n // shell treats as a single literal argument to `cd`.\n const escapedPath = shellEscapePosixPath(targetPath);\n const command = config.openDirectory.replaceAll('{dir}', escapedPath);\n // codeql[js/command-line-injection] -- targetPath from realpathSync (must exist on disk); shell-escaped via single-quote wrapping in shellEscapePosixPath; localhost-only server action\n const child = spawn(command, [], {\n detached: true,\n stdio: 'ignore',\n shell: true,\n });\n child.on('error', () => undefined);\n child.unref();\n } else {\n // For non-shell tools (alacritty, kitty, etc.) the config is a\n // whitespace-separated command. Split first, then substitute {dir}\n // INTO AN ARGV ELEMENT (never back into a concatenated string).\n // CodeQL recognizes the argv-form of spawn as sanitized input.\n const tokens = config.openDirectory.split(/\\s+/).filter(Boolean);\n const command = tokens[0];\n const args = tokens.slice(1).map((t) => t.replaceAll('{dir}', targetPath));\n const child = spawn(command, args, {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined);\n child.unref();\n }\n\n return { success: true, path: targetPath, shell };\n }\n } catch {\n // DI container not available — fall through to system terminal\n }\n }\n\n // Fallback to system terminal\n const entry = SYSTEM_TERMINAL_COMMANDS[platform()];\n if (!entry) {\n return {\n success: false,\n error: `Unsupported platform: ${platform()}`,\n };\n }\n\n const child = spawn(entry.cmd, entry.args(targetPath), {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined); // Prevent uncaught exception on spawn failure\n child.unref();\n\n return { success: true, path: targetPath, shell };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open shell';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { realpathSync } from 'node:fs';\nimport { platform } from 'node:os';\nimport { isAbsolute, normalize } from 'node:path';\nimport { spawn } from 'node:child_process';\n\n// Use a record lookup instead of if/else to prevent the bundler from\n// tree-shaking platform branches at build time. Turbopack evaluates\n// os.platform() during the build and dead-code-eliminates unused branches,\n// baking in the CI platform (linux) and breaking macOS/Windows installs.\nconst FOLDER_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> = {\n darwin: { cmd: 'open', args: (p) => [p] },\n linux: { cmd: 'xdg-open', args: (p) => [p] },\n win32: { cmd: 'explorer', args: (p) => [p] },\n};\n\nexport async function openFolder(\n repositoryPath: string\n): Promise<{ success: boolean; error?: string; path?: string }> {\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n // Resolve through realpath() up-front. All subsequent uses of the path\n // reference this symlink-resolved absolute value, not the raw user input.\n // This eliminates path-injection via symlinks and is the sanitizer that\n // CodeQL's js/path-injection analysis recognizes.\n let resolvedPath: string;\n try {\n resolvedPath = realpathSync(repositoryPath);\n } catch {\n return { success: false, error: 'Directory not found' };\n }\n\n const entry = FOLDER_COMMANDS[platform()];\n if (!entry) {\n return {\n success: false,\n error: `Unsupported platform: ${platform()}`,\n };\n }\n\n // Normalize to platform-native separators — explorer.exe on Windows\n // does not understand forward-slash paths and falls back to Documents.\n const nativePath = normalize(resolvedPath);\n\n const child = spawn(entry.cmd, entry.args(nativePath), {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined); // Prevent uncaught exception on spawn failure\n child.unref();\n\n return { success: true, path: resolvedPath };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { SyncRepositoryMainUseCase } from '@shipit-ai/core/application/use-cases/repositories/sync-repository-main.use-case';\n\nexport async function syncRepository(\n repositoryId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'Repository id is required' };\n }\n\n try {\n const useCase = resolve<SyncRepositoryMainUseCase>('SyncRepositoryMainUseCase');\n await useCase.execute(repositoryId);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to sync repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { LoadSettingsUseCase } from '@shipit-ai/core/application/use-cases/settings/load-settings.use-case';\n\n/**\n * Check whether onboarding has been completed.\n */\nexport async function isAgentSetupComplete(): Promise<boolean> {\n try {\n const useCase = resolve<LoadSettingsUseCase>('LoadSettingsUseCase');\n const settings = await useCase.execute();\n return settings.onboardingComplete;\n } catch {\n return false;\n }\n}\n","'use server';\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { execFile } from 'node:child_process';\nimport { IS_WINDOWS } from '@/lib/core-utils';\nimport { resolve } from '@/lib/server-container';\nimport type { LoadSettingsUseCase } from '@shipit-ai/core/application/use-cases/settings/load-settings.use-case';\nimport type { ListToolsUseCase } from '@shipit-ai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface AgentAuthStatus {\n agentType: string;\n /** Whether the CLI tool binary is installed */\n installed: boolean;\n /** Whether credentials / auth appear valid */\n authenticated: boolean;\n /** Human-readable label for the agent */\n label: string;\n /** CLI binary name (e.g. \"claude\", \"gemini\") */\n binaryName: string | null;\n /** Shell command to install the tool (e.g. \"npm install -g @anthropic-ai/claude-code\") */\n installCommand: string | null;\n /** Instructions to authenticate if not authenticated */\n authCommand: string | null;\n}\n\nconst AGENT_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n 'codex-cli': 'Codex CLI',\n 'copilot-cli': 'GitHub Copilot CLI',\n cursor: 'Cursor CLI',\n 'gemini-cli': 'Gemini CLI',\n 'rovo-dev': 'Rovo Dev CLI',\n};\n\nconst AGENT_TOOL_MAP: Record<string, string> = {\n 'claude-code': 'claude-code',\n 'codex-cli': 'codex-cli',\n 'copilot-cli': 'copilot-cli',\n cursor: 'cursor-cli',\n 'gemini-cli': 'gemini-cli',\n 'rovo-dev': 'rovo-dev',\n};\n\nconst AGENT_BINARY_MAP: Record<string, string> = {\n 'claude-code': 'claude',\n 'codex-cli': 'codex',\n 'copilot-cli': 'copilot',\n cursor: 'cursor-agent',\n 'gemini-cli': 'gemini',\n 'rovo-dev': 'acli',\n};\n\n/**\n * Tier 1 result indicating how auth was detected.\n * - 'env-var': Explicit env var config (e.g. ANTHROPIC_API_KEY for proxy/gateway) — skip Tier 2\n * - 'file': Credential file found — run Tier 2 to verify tokens aren't expired\n * - false: No credentials found in known locations\n */\ntype Tier1Result = 'env-var' | 'file' | false;\n\n/**\n * Tier 1: Instant credential/env check (~5ms, no subprocess).\n * Distinguishes env-var auth (explicit user config, e.g. API key for a proxy)\n * from file-based auth (may be stale, needs Tier 2 verification).\n */\nfunction tier1AuthCheck(agentType: string): Tier1Result {\n const home = homedir();\n\n switch (agentType) {\n case 'claude-code': {\n if (process.env['ANTHROPIC_API_KEY']) return 'env-var';\n if (process.env['CLAUDE_CODE_USE_BEDROCK']) return 'env-var';\n if (process.env['CLAUDE_CODE_USE_VERTEX']) return 'env-var';\n if (process.env['CLAUDE_CODE_OAUTH_TOKEN']) return 'env-var';\n const credPath = join(home, '.claude', '.credentials.json');\n return existsSync(credPath) ? 'file' : false;\n }\n case 'codex-cli': {\n if (process.env['OPENAI_API_KEY']) return 'env-var';\n return false;\n }\n case 'cursor': {\n if (process.env['CURSOR_API_KEY']) return 'env-var';\n const cursorDir = join(home, '.cursor');\n return existsSync(cursorDir) ? 'file' : false;\n }\n case 'gemini-cli': {\n if (process.env['GEMINI_API_KEY']) return 'env-var';\n if (process.env['GOOGLE_API_KEY']) return 'env-var';\n if (process.env['GOOGLE_APPLICATION_CREDENTIALS']) return 'env-var';\n const accountsPath = join(home, '.gemini', 'google_accounts.json');\n return existsSync(accountsPath) ? 'file' : false;\n }\n case 'copilot-cli': {\n if (process.env['COPILOT_GITHUB_TOKEN']) return 'env-var';\n if (process.env['GH_TOKEN']) return 'env-var';\n if (process.env['GITHUB_TOKEN']) return 'env-var';\n const configPath = process.env['COPILOT_HOME']\n ? join(process.env['COPILOT_HOME'], 'config.json')\n : join(home, '.copilot', 'config.json');\n return existsSync(configPath) ? 'file' : false;\n }\n case 'rovo-dev': {\n if (process.env['ATLASSIAN_API_TOKEN']) return 'env-var';\n const acliDir = join(home, '.acli');\n return existsSync(acliDir) ? 'file' : false;\n }\n default:\n // Unknown agents — assume no auth needed\n return 'env-var';\n }\n}\n\n/**\n * Tier 2: Subprocess verification (~200ms).\n * Only called if tier 1 passes, to confirm tokens aren't expired.\n */\nfunction tier2AuthVerify(agentType: string, binaryName: string): Promise<boolean> {\n return new Promise((resolve) => {\n let cmd: string;\n let args: string[];\n\n switch (agentType) {\n case 'claude-code':\n cmd = binaryName;\n args = ['auth', 'status'];\n break;\n case 'cursor':\n cmd = binaryName;\n args = ['status'];\n break;\n case 'codex-cli':\n // Codex CLI has no `auth status` command — cannot verify via subprocess\n resolve(false);\n return;\n case 'copilot-cli':\n // No auth status command — trust tier 1\n resolve(true);\n return;\n case 'rovo-dev': {\n const rovoOpts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile('acli', ['rovodev', 'auth', 'status'], rovoOpts, (error) => {\n resolve(!error);\n });\n return;\n }\n default:\n // No tier 2 command available — trust tier 1\n resolve(true);\n return;\n }\n\n try {\n const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile(cmd, args, opts, (error) => {\n resolve(!error);\n });\n } catch {\n resolve(false);\n }\n });\n}\n\n/**\n * Check agent tool installation + auth status.\n * Uses two-tier detection: instant file/env check, then optional subprocess verify.\n */\nexport async function checkAgentAuth(): Promise<AgentAuthStatus> {\n let agentType: string;\n try {\n const loadSettings = resolve<LoadSettingsUseCase>('LoadSettingsUseCase');\n const settings = await loadSettings.execute();\n agentType = settings.agent.type;\n } catch {\n return {\n agentType: 'unknown',\n installed: false,\n authenticated: false,\n label: 'Unknown',\n binaryName: null,\n installCommand: null,\n authCommand: null,\n };\n }\n\n const label = AGENT_LABELS[agentType] ?? agentType;\n const toolId = AGENT_TOOL_MAP[agentType] ?? null;\n const binaryName = AGENT_BINARY_MAP[agentType] ?? null;\n\n // Agents without a tool mapping — always good\n if (!toolId) {\n return {\n agentType,\n installed: true,\n authenticated: true,\n label,\n binaryName: null,\n installCommand: null,\n authCommand: null,\n };\n }\n\n // Check if tool is installed (also grab install command from metadata)\n let installed = false;\n let installCommand: string | null = null;\n try {\n const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');\n const tools = await useCase.execute();\n const tool = tools.find((t) => t.id === toolId);\n installed = tool?.status.status === 'available';\n installCommand = tool?.installCommand ?? null;\n } catch {\n installed = false;\n }\n\n if (!installed) {\n return {\n agentType,\n installed: false,\n authenticated: false,\n label,\n binaryName,\n installCommand,\n authCommand: binaryName ? `Install ${label} first` : null,\n };\n }\n\n // Tier 1: instant file/env check — fast path for known credential locations\n const tier1 = tier1AuthCheck(agentType);\n\n if (tier1 === 'env-var') {\n // Explicit env var auth (e.g. ANTHROPIC_API_KEY for LiteLLM proxy).\n // Trust the user's config — skip Tier 2 subprocess check which may\n // fail against a proxy that the CLI binary doesn't know about.\n return {\n agentType,\n installed: true,\n authenticated: true,\n label,\n binaryName,\n installCommand,\n authCommand: null,\n };\n }\n\n if (tier1 === 'file') {\n // Credential file found but may be stale/expired.\n // Run Tier 2 subprocess verify to confirm tokens are still valid (~200ms).\n let authenticated = true;\n if (binaryName) {\n authenticated = await tier2AuthVerify(agentType, binaryName);\n }\n return {\n agentType,\n installed: true,\n authenticated,\n label,\n binaryName,\n installCommand,\n authCommand: authenticated ? null : binaryName,\n };\n }\n\n // Tier 1 found nothing — credentials not in expected locations.\n // Fall through to Tier 2 because some auth methods (e.g. Claude Code OAuth\n // via claude.ai) store credentials outside the paths Tier 1 checks.\n if (binaryName) {\n const authenticated = await tier2AuthVerify(agentType, binaryName);\n if (authenticated) {\n return {\n agentType,\n installed: true,\n authenticated: true,\n label,\n binaryName,\n installCommand,\n authCommand: null,\n };\n }\n }\n\n // Both tiers failed — agent genuinely needs authentication\n return {\n agentType,\n installed: true,\n authenticated: false,\n label,\n binaryName,\n installCommand,\n authCommand: binaryName,\n };\n}\n","'use server';\n\nimport { execFile } from 'node:child_process';\nimport { IS_WINDOWS } from '@/lib/core-utils';\nimport { resolve } from '@/lib/server-container';\nimport type { ListToolsUseCase } from '@shipit-ai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolStatusEntry {\n installed: boolean;\n version: string | null;\n /** Platform-specific install command from tool JSON metadata */\n installCommand: string | null;\n /** Documentation/website URL */\n installUrl: string | null;\n}\n\nexport interface ToolStatusResult {\n git: ToolStatusEntry;\n gh: ToolStatusEntry;\n}\n\nfunction getVersion(\n command: string,\n args: string[]\n): Promise<{ installed: boolean; version: string | null }> {\n return new Promise((resolve) => {\n try {\n const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile(command, args, opts, (error, stdout) => {\n if (error) {\n resolve({ installed: false, version: null });\n return;\n }\n // Extract version number from output like \"git version 2.43.0\" or \"gh version 2.40.1\"\n const match = stdout.match(/(\\d+\\.\\d+(?:\\.\\d+)?)/);\n resolve({ installed: true, version: match?.[1] ?? null });\n });\n } catch {\n resolve({ installed: false, version: null });\n }\n });\n}\n\nexport async function checkToolStatus(): Promise<ToolStatusResult> {\n // Run version checks and tool metadata lookup in parallel\n const [gitVersion, ghVersion, tools] = await Promise.all([\n getVersion('git', ['--version']),\n getVersion('gh', ['--version']),\n (async () => {\n try {\n const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');\n return await useCase.execute();\n } catch {\n return [];\n }\n })(),\n ]);\n\n const gitTool = tools.find((t) => t.id === 'git');\n const ghTool = tools.find((t) => t.id === 'gh');\n\n return {\n git: {\n ...gitVersion,\n installCommand: gitTool?.installCommand ?? null,\n installUrl: gitTool?.website ?? 'https://git-scm.com',\n },\n gh: {\n ...ghVersion,\n installCommand: ghTool?.installCommand ?? null,\n installUrl: ghTool?.website ?? 'https://cli.github.com',\n },\n };\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { IFeatureRepository } from '@shipit-ai/core/application/ports/output/repositories/feature-repository.interface';\n\n/**\n * Lightweight server action to fetch a single feature's name and description.\n * Used by the SSE effect to update node metadata after AI metadata generation\n * without a full graph reconcile (which can overwrite SSE-driven state).\n */\nexport async function getFeatureMetadata(\n featureId: string\n): Promise<{ name: string; description: string } | null> {\n const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');\n const feature = await featureRepo.findById(featureId);\n if (!feature) return null;\n return { name: feature.name, description: feature.description };\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { ArchiveFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/archive-feature.use-case';\nimport type { Feature } from '@shipit-ai/core/domain/generated/output';\n\nexport async function archiveFeature(\n featureId: string\n): Promise<{ feature?: Feature; error?: string }> {\n if (!featureId?.trim()) {\n return { error: 'id is required' };\n }\n\n try {\n const archiveFeatureUseCase = resolve<ArchiveFeatureUseCase>('ArchiveFeatureUseCase');\n const feature = await archiveFeatureUseCase.execute(featureId);\n return { feature };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to archive feature';\n return { error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/delete-feature.use-case';\nimport type { Feature } from '@shipit-ai/core/domain/generated/output';\n\nexport async function deleteFeature(\n featureId: string,\n cleanup?: boolean,\n cascadeDelete?: boolean,\n closePr?: boolean\n): Promise<{ feature?: Feature; error?: string }> {\n if (!featureId?.trim()) {\n return { error: 'id is required' };\n }\n\n try {\n const deleteFeatureUseCase = resolve<DeleteFeatureUseCase>('DeleteFeatureUseCase');\n const options: { cleanup?: boolean; cascadeDelete?: boolean; closePr?: boolean } = {};\n if (cleanup !== undefined) options.cleanup = cleanup;\n if (cascadeDelete !== undefined) options.cascadeDelete = cascadeDelete;\n if (closePr !== undefined) options.closePr = closePr;\n const feature =\n Object.keys(options).length > 0\n ? await deleteFeatureUseCase.execute(featureId, options)\n : await deleteFeatureUseCase.execute(featureId);\n return { feature };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete feature';\n return { error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { ResumeFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/resume-feature.use-case';\n\nexport async function resumeFeature(\n featureId: string\n): Promise<{ resumed: boolean; error?: string }> {\n if (!featureId.trim()) {\n return { resumed: false, error: 'Feature id is required' };\n }\n\n try {\n const useCase = resolve<ResumeFeatureUseCase>('ResumeFeatureUseCase');\n await useCase.execute(featureId);\n return { resumed: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to resume feature';\n return { resumed: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { StartFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/start-feature.use-case';\n\nexport async function startFeature(\n featureId: string\n): Promise<{ started: boolean; error?: string }> {\n if (!featureId.trim()) {\n return { started: false, error: 'Feature id is required' };\n }\n\n try {\n const useCase = resolve<StartFeatureUseCase>('StartFeatureUseCase');\n await useCase.execute(featureId);\n return { started: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to start feature';\n return { started: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { StopAgentRunUseCase } from '@shipit-ai/core/application/use-cases/agents/stop-agent-run.use-case';\nimport type { IAgentRunRepository } from '@shipit-ai/core/application/ports/output/agents/agent-run-repository.interface';\n\nexport async function stopFeature(\n featureId: string\n): Promise<{ stopped: boolean; error?: string }> {\n if (!featureId.trim()) {\n return { stopped: false, error: 'Feature id is required' };\n }\n\n try {\n // Find the active agent run for this feature\n const runRepo = resolve<IAgentRunRepository>('IAgentRunRepository');\n const allRuns = await runRepo.list();\n const activeRun = allRuns.find(\n (r) =>\n r.featureId === featureId &&\n r.status !== 'completed' &&\n r.status !== 'failed' &&\n r.status !== 'interrupted' &&\n r.status !== 'cancelled'\n );\n\n if (!activeRun) {\n return { stopped: false, error: 'No active agent run found for this feature' };\n }\n\n const useCase = resolve<StopAgentRunUseCase>('StopAgentRunUseCase');\n const result = await useCase.execute(activeRun.id);\n\n if (!result.stopped) {\n return { stopped: false, error: result.reason };\n }\n return { stopped: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to stop agent';\n return { stopped: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { UnarchiveFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/unarchive-feature.use-case';\nimport type { Feature } from '@shipit-ai/core/domain/generated/output';\n\nexport async function unarchiveFeature(\n featureId: string\n): Promise<{ feature?: Feature; error?: string }> {\n if (!featureId?.trim()) {\n return { error: 'id is required' };\n }\n\n try {\n const unarchiveFeatureUseCase = resolve<UnarchiveFeatureUseCase>('UnarchiveFeatureUseCase');\n const feature = await unarchiveFeatureUseCase.execute(featureId);\n return { feature };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to unarchive feature';\n return { error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { AddRepositoryUseCase } from '@shipit-ai/core/application/use-cases/repositories/add-repository.use-case';\nimport type { Repository } from '@shipit-ai/core/domain/generated/output';\n\ninterface AddRepositoryInput {\n path: string;\n name?: string;\n}\n\nexport async function addRepository(\n input: AddRepositoryInput\n): Promise<{ repository?: Repository; error?: string }> {\n const { path, name } = input;\n\n if (!path?.trim()) {\n return { error: 'path is required' };\n }\n\n try {\n const addRepoUseCase = resolve<AddRepositoryUseCase>('AddRepositoryUseCase');\n const repository = await addRepoUseCase.execute({ path, name });\n return { repository };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to add repository';\n return { error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteRepositoryUseCase } from '@shipit-ai/core/application/use-cases/repositories/delete-repository.use-case';\n\nexport async function deleteRepository(\n repositoryId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'id is required' };\n }\n\n try {\n const useCase = resolve<DeleteRepositoryUseCase>('DeleteRepositoryUseCase');\n await useCase.execute(repositoryId);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete repository';\n return { success: false, error: message };\n }\n}\n"],"names":["openIde","input","repositoryPath","branch","success","error","loadSettings","settings","execute","editor","environment","defaultEditor","useCase","result","editorId","checkAvailability","ok","message","editorName","path","worktreePath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/presentation/web/app/actions/open-ide.ts","../../../../../../../src/presentation/web/app/actions/open-shell.ts","../../../../../../../src/presentation/web/app/actions/open-folder.ts","../../../../../../../src/presentation/web/app/actions/sync-repository.ts","../../../../../../../src/presentation/web/app/actions/agent-setup-flag.ts","../../../../../../../src/presentation/web/app/actions/check-agent-auth.ts","../../../../../../../src/presentation/web/app/actions/check-tool-status.ts","../../../../../../../src/presentation/web/app/actions/get-feature-metadata.ts","../../../../../../../src/presentation/web/app/actions/archive-feature.ts","../../../../../../../src/presentation/web/app/actions/delete-feature.ts","../../../../../../../src/presentation/web/app/actions/resume-feature.ts","../../../../../../../src/presentation/web/app/actions/start-feature.ts","../../../../../../../src/presentation/web/app/actions/stop-feature.ts","../../../../../../../src/presentation/web/app/actions/unarchive-feature.ts","../../../../../../../src/presentation/web/app/actions/add-repository.ts","../../../../../../../src/presentation/web/app/actions/delete-repository.ts"],"sourcesContent":["'use server';\n\nimport { isAbsolute } from 'node:path';\nimport { resolve } from '@/lib/server-container';\nimport type { LoadSettingsUseCase } from '@shipit-ai/core/application/use-cases/settings/load-settings.use-case';\nimport type { LaunchIdeUseCase } from '@shipit-ai/core/application/use-cases/ide/launch-ide.use-case';\n\ninterface OpenIdeInput {\n repositoryPath: string;\n branch?: string;\n}\n\nexport async function openIde(\n input: OpenIdeInput\n): Promise<{ success: boolean; error?: string; editor?: string; path?: string }> {\n const { repositoryPath, branch } = input;\n\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n const loadSettings = resolve<LoadSettingsUseCase>('LoadSettingsUseCase');\n const settings = await loadSettings.execute();\n const editor = settings.environment.defaultEditor;\n\n const useCase = resolve<LaunchIdeUseCase>('LaunchIdeUseCase');\n const result = await useCase.execute({\n editorId: editor,\n repositoryPath,\n branch,\n checkAvailability: true,\n });\n\n if (!result.ok) {\n return { success: false, error: result.message };\n }\n\n return { success: true, editor: result.editorName, path: result.worktreePath };\n}\n","'use server';\n\nimport { realpathSync } from 'node:fs';\nimport { platform } from 'node:os';\nimport { isAbsolute } from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { computeWorktreePath } from '@/lib/core-utils';\nimport { resolve } from '@/lib/server-container';\nimport type { LoadSettingsUseCase } from '@shipit-ai/core/application/use-cases/settings/load-settings.use-case';\nimport type { IToolInstallerService } from '@shipit-ai/core/application/ports/output/services/tool-installer.service';\n\n/**\n * Resolve the target path through realpath() so that any symlink traversal\n * happens up-front and the resulting absolute path is the authoritative\n * value used for all subsequent spawn operations. Returns null if the path\n * does not exist or cannot be resolved.\n */\nfunction resolveTargetPath(repositoryPath: string, branch?: string): string | null {\n try {\n const base = branch ? computeWorktreePath(repositoryPath, branch) : repositoryPath;\n return realpathSync(base);\n } catch {\n return null;\n }\n}\n\n/**\n * POSIX shell-escape a path for safe inclusion in a shell:true command string.\n * Wraps in single quotes and escapes embedded single quotes using the\n * standard '\\'' pattern. All tool configurations that opt into shell:true\n * use POSIX-style commands (`cd {dir} && exec <tool>`) and run on Unix only.\n */\nfunction shellEscapePosixPath(p: string): string {\n return `'${p.replace(/'/g, `'\\\\''`)}'`;\n}\n\n// Fallback commands for the \"system\" terminal when no tool metadata entry exists.\n// Uses a record lookup instead of if/else to prevent the bundler from\n// tree-shaking platform branches at build time. Turbopack evaluates\n// os.platform() during the build and dead-code-eliminates unused branches,\n// baking in the CI platform (linux) and breaking macOS/Windows installs.\nconst SYSTEM_TERMINAL_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> =\n {\n darwin: { cmd: 'open', args: (p) => ['-a', 'Terminal', p] },\n linux: { cmd: 'x-terminal-emulator', args: (p) => [`--working-directory=${p}`] },\n win32: {\n cmd: 'cmd.exe',\n args: (p) => ['/c', 'start', 'powershell', '-NoExit', '-Command', `Set-Location \"${p}\"`],\n },\n };\n\ninterface OpenShellInput {\n repositoryPath: string;\n branch?: string;\n}\n\nexport async function openShell(\n input: OpenShellInput\n): Promise<{ success: boolean; error?: string; path?: string; shell?: string }> {\n const { repositoryPath, branch } = input;\n\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n const loadSettings = resolve<LoadSettingsUseCase>('LoadSettingsUseCase');\n const settings = await loadSettings.execute();\n const shell = settings.environment.shellPreference;\n const terminalPref = settings.environment.terminalPreference ?? 'system';\n\n // Resolve the target path through realpath() up-front. From this point\n // on, `targetPath` is the authoritative, symlink-resolved absolute path\n // used for every spawn call — never the raw user-supplied value.\n const targetPath = resolveTargetPath(repositoryPath, branch);\n if (!targetPath) {\n return { success: false, error: 'Path does not exist' };\n }\n\n // Try to find the terminal in tool metadata via DI container.\n // Using DI (not a direct import from tool-metadata) ensures that\n // TOOL_METADATA is read from the correct tools/ directory path — it is loaded once\n // in the Node.js CLI bootstrap context where import.meta.url resolves correctly.\n // Direct imports of tool-metadata break in standalone production builds.\n if (terminalPref !== 'system') {\n try {\n const service = resolve<IToolInstallerService>('IToolInstallerService');\n const config = service.getTerminalOpenConfig(terminalPref);\n\n if (config?.openDirectory.includes('{dir}')) {\n if (config.shell) {\n // For shell:true tools (claude-code, codex-cli, etc.) the tool\n // config is a POSIX shell string like `cd {dir} && exec claude`.\n // Shell-escape the path to prevent command injection: a malicious\n // path like `/tmp; rm -rf /` becomes `'/tmp; rm -rf /'` which the\n // shell treats as a single literal argument to `cd`.\n const escapedPath = shellEscapePosixPath(targetPath);\n const command = config.openDirectory.replaceAll('{dir}', escapedPath);\n // SECURITY: targetPath from realpathSync (must exist on disk); single-quote\n // shell-escaped via shellEscapePosixPath; localhost-only server action.\n // shell:true is required by tool configs using `cd {dir} && exec <tool>`.\n // CodeQL flags this because it does not model custom sanitizer functions —\n // alert js/command-line-injection #29 dismissed as false positive.\n const child = spawn(command, [], {\n detached: true,\n stdio: 'ignore',\n shell: true,\n });\n child.on('error', () => undefined);\n child.unref();\n } else {\n // For non-shell tools (alacritty, kitty, etc.) the config is a\n // whitespace-separated command. Split first, then substitute {dir}\n // INTO AN ARGV ELEMENT (never back into a concatenated string).\n // CodeQL recognizes the argv-form of spawn as sanitized input.\n const tokens = config.openDirectory.split(/\\s+/).filter(Boolean);\n const command = tokens[0];\n const args = tokens.slice(1).map((t) => t.replaceAll('{dir}', targetPath));\n const child = spawn(command, args, {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined);\n child.unref();\n }\n\n return { success: true, path: targetPath, shell };\n }\n } catch {\n // DI container not available — fall through to system terminal\n }\n }\n\n // Fallback to system terminal\n const entry = SYSTEM_TERMINAL_COMMANDS[platform()];\n if (!entry) {\n return {\n success: false,\n error: `Unsupported platform: ${platform()}`,\n };\n }\n\n const child = spawn(entry.cmd, entry.args(targetPath), {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined); // Prevent uncaught exception on spawn failure\n child.unref();\n\n return { success: true, path: targetPath, shell };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open shell';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { realpathSync } from 'node:fs';\nimport { platform } from 'node:os';\nimport { isAbsolute, normalize } from 'node:path';\nimport { spawn } from 'node:child_process';\n\n// Use a record lookup instead of if/else to prevent the bundler from\n// tree-shaking platform branches at build time. Turbopack evaluates\n// os.platform() during the build and dead-code-eliminates unused branches,\n// baking in the CI platform (linux) and breaking macOS/Windows installs.\nconst FOLDER_COMMANDS: Record<string, { cmd: string; args: (path: string) => string[] }> = {\n darwin: { cmd: 'open', args: (p) => [p] },\n linux: { cmd: 'xdg-open', args: (p) => [p] },\n win32: { cmd: 'explorer', args: (p) => [p] },\n};\n\nexport async function openFolder(\n repositoryPath: string\n): Promise<{ success: boolean; error?: string; path?: string }> {\n if (!repositoryPath || !isAbsolute(repositoryPath)) {\n return { success: false, error: 'repositoryPath must be an absolute path' };\n }\n\n try {\n // Resolve through realpath() up-front. All subsequent uses of the path\n // reference this symlink-resolved absolute value, not the raw user input.\n // This eliminates path-injection via symlinks and is the sanitizer that\n // CodeQL's js/path-injection analysis recognizes.\n let resolvedPath: string;\n try {\n resolvedPath = realpathSync(repositoryPath);\n } catch {\n return { success: false, error: 'Directory not found' };\n }\n\n const entry = FOLDER_COMMANDS[platform()];\n if (!entry) {\n return {\n success: false,\n error: `Unsupported platform: ${platform()}`,\n };\n }\n\n // Normalize to platform-native separators — explorer.exe on Windows\n // does not understand forward-slash paths and falls back to Documents.\n const nativePath = normalize(resolvedPath);\n\n const child = spawn(entry.cmd, entry.args(nativePath), {\n detached: true,\n stdio: 'ignore',\n });\n child.on('error', () => undefined); // Prevent uncaught exception on spawn failure\n child.unref();\n\n return { success: true, path: resolvedPath };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to open folder';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { SyncRepositoryMainUseCase } from '@shipit-ai/core/application/use-cases/repositories/sync-repository-main.use-case';\n\nexport async function syncRepository(\n repositoryId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'Repository id is required' };\n }\n\n try {\n const useCase = resolve<SyncRepositoryMainUseCase>('SyncRepositoryMainUseCase');\n await useCase.execute(repositoryId);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to sync repository';\n return { success: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { LoadSettingsUseCase } from '@shipit-ai/core/application/use-cases/settings/load-settings.use-case';\n\n/**\n * Check whether onboarding has been completed.\n */\nexport async function isAgentSetupComplete(): Promise<boolean> {\n try {\n const useCase = resolve<LoadSettingsUseCase>('LoadSettingsUseCase');\n const settings = await useCase.execute();\n return settings.onboardingComplete;\n } catch {\n return false;\n }\n}\n","'use server';\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { execFile } from 'node:child_process';\nimport { IS_WINDOWS } from '@/lib/core-utils';\nimport { resolve } from '@/lib/server-container';\nimport type { LoadSettingsUseCase } from '@shipit-ai/core/application/use-cases/settings/load-settings.use-case';\nimport type { ListToolsUseCase } from '@shipit-ai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface AgentAuthStatus {\n agentType: string;\n /** Whether the CLI tool binary is installed */\n installed: boolean;\n /** Whether credentials / auth appear valid */\n authenticated: boolean;\n /** Human-readable label for the agent */\n label: string;\n /** CLI binary name (e.g. \"claude\", \"gemini\") */\n binaryName: string | null;\n /** Shell command to install the tool (e.g. \"npm install -g @anthropic-ai/claude-code\") */\n installCommand: string | null;\n /** Instructions to authenticate if not authenticated */\n authCommand: string | null;\n}\n\nconst AGENT_LABELS: Record<string, string> = {\n 'claude-code': 'Claude Code',\n 'codex-cli': 'Codex CLI',\n 'copilot-cli': 'GitHub Copilot CLI',\n cursor: 'Cursor CLI',\n 'gemini-cli': 'Gemini CLI',\n 'rovo-dev': 'Rovo Dev CLI',\n};\n\nconst AGENT_TOOL_MAP: Record<string, string> = {\n 'claude-code': 'claude-code',\n 'codex-cli': 'codex-cli',\n 'copilot-cli': 'copilot-cli',\n cursor: 'cursor-cli',\n 'gemini-cli': 'gemini-cli',\n 'rovo-dev': 'rovo-dev',\n};\n\nconst AGENT_BINARY_MAP: Record<string, string> = {\n 'claude-code': 'claude',\n 'codex-cli': 'codex',\n 'copilot-cli': 'copilot',\n cursor: 'cursor-agent',\n 'gemini-cli': 'gemini',\n 'rovo-dev': 'acli',\n};\n\n/**\n * Tier 1 result indicating how auth was detected.\n * - 'env-var': Explicit env var config (e.g. ANTHROPIC_API_KEY for proxy/gateway) — skip Tier 2\n * - 'file': Credential file found — run Tier 2 to verify tokens aren't expired\n * - false: No credentials found in known locations\n */\ntype Tier1Result = 'env-var' | 'file' | false;\n\n/**\n * Tier 1: Instant credential/env check (~5ms, no subprocess).\n * Distinguishes env-var auth (explicit user config, e.g. API key for a proxy)\n * from file-based auth (may be stale, needs Tier 2 verification).\n */\nfunction tier1AuthCheck(agentType: string): Tier1Result {\n const home = homedir();\n\n switch (agentType) {\n case 'claude-code': {\n if (process.env['ANTHROPIC_API_KEY']) return 'env-var';\n if (process.env['CLAUDE_CODE_USE_BEDROCK']) return 'env-var';\n if (process.env['CLAUDE_CODE_USE_VERTEX']) return 'env-var';\n if (process.env['CLAUDE_CODE_OAUTH_TOKEN']) return 'env-var';\n const credPath = join(home, '.claude', '.credentials.json');\n return existsSync(credPath) ? 'file' : false;\n }\n case 'codex-cli': {\n if (process.env['OPENAI_API_KEY']) return 'env-var';\n return false;\n }\n case 'cursor': {\n if (process.env['CURSOR_API_KEY']) return 'env-var';\n const cursorDir = join(home, '.cursor');\n return existsSync(cursorDir) ? 'file' : false;\n }\n case 'gemini-cli': {\n if (process.env['GEMINI_API_KEY']) return 'env-var';\n if (process.env['GOOGLE_API_KEY']) return 'env-var';\n if (process.env['GOOGLE_APPLICATION_CREDENTIALS']) return 'env-var';\n const accountsPath = join(home, '.gemini', 'google_accounts.json');\n return existsSync(accountsPath) ? 'file' : false;\n }\n case 'copilot-cli': {\n if (process.env['COPILOT_GITHUB_TOKEN']) return 'env-var';\n if (process.env['GH_TOKEN']) return 'env-var';\n if (process.env['GITHUB_TOKEN']) return 'env-var';\n const configPath = process.env['COPILOT_HOME']\n ? join(process.env['COPILOT_HOME'], 'config.json')\n : join(home, '.copilot', 'config.json');\n return existsSync(configPath) ? 'file' : false;\n }\n case 'rovo-dev': {\n if (process.env['ATLASSIAN_API_TOKEN']) return 'env-var';\n const acliDir = join(home, '.acli');\n return existsSync(acliDir) ? 'file' : false;\n }\n default:\n // Unknown agents — assume no auth needed\n return 'env-var';\n }\n}\n\n/**\n * Tier 2: Subprocess verification (~200ms).\n * Only called if tier 1 passes, to confirm tokens aren't expired.\n */\nfunction tier2AuthVerify(agentType: string, binaryName: string): Promise<boolean> {\n return new Promise((resolve) => {\n let cmd: string;\n let args: string[];\n\n switch (agentType) {\n case 'claude-code':\n cmd = binaryName;\n args = ['auth', 'status'];\n break;\n case 'cursor':\n cmd = binaryName;\n args = ['status'];\n break;\n case 'codex-cli':\n // Codex CLI has no `auth status` command — cannot verify via subprocess\n resolve(false);\n return;\n case 'copilot-cli':\n // No auth status command — trust tier 1\n resolve(true);\n return;\n case 'rovo-dev': {\n const rovoOpts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile('acli', ['rovodev', 'auth', 'status'], rovoOpts, (error) => {\n resolve(!error);\n });\n return;\n }\n default:\n // No tier 2 command available — trust tier 1\n resolve(true);\n return;\n }\n\n try {\n const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile(cmd, args, opts, (error) => {\n resolve(!error);\n });\n } catch {\n resolve(false);\n }\n });\n}\n\n/**\n * Check agent tool installation + auth status.\n * Uses two-tier detection: instant file/env check, then optional subprocess verify.\n */\nexport async function checkAgentAuth(): Promise<AgentAuthStatus> {\n let agentType: string;\n try {\n const loadSettings = resolve<LoadSettingsUseCase>('LoadSettingsUseCase');\n const settings = await loadSettings.execute();\n agentType = settings.agent.type;\n } catch {\n return {\n agentType: 'unknown',\n installed: false,\n authenticated: false,\n label: 'Unknown',\n binaryName: null,\n installCommand: null,\n authCommand: null,\n };\n }\n\n const label = AGENT_LABELS[agentType] ?? agentType;\n const toolId = AGENT_TOOL_MAP[agentType] ?? null;\n const binaryName = AGENT_BINARY_MAP[agentType] ?? null;\n\n // Agents without a tool mapping — always good\n if (!toolId) {\n return {\n agentType,\n installed: true,\n authenticated: true,\n label,\n binaryName: null,\n installCommand: null,\n authCommand: null,\n };\n }\n\n // Check if tool is installed (also grab install command from metadata)\n let installed = false;\n let installCommand: string | null = null;\n try {\n const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');\n const tools = await useCase.execute();\n const tool = tools.find((t) => t.id === toolId);\n installed = tool?.status.status === 'available';\n installCommand = tool?.installCommand ?? null;\n } catch {\n installed = false;\n }\n\n if (!installed) {\n return {\n agentType,\n installed: false,\n authenticated: false,\n label,\n binaryName,\n installCommand,\n authCommand: binaryName ? `Install ${label} first` : null,\n };\n }\n\n // Tier 1: instant file/env check — fast path for known credential locations\n const tier1 = tier1AuthCheck(agentType);\n\n if (tier1 === 'env-var') {\n // Explicit env var auth (e.g. ANTHROPIC_API_KEY for LiteLLM proxy).\n // Trust the user's config — skip Tier 2 subprocess check which may\n // fail against a proxy that the CLI binary doesn't know about.\n return {\n agentType,\n installed: true,\n authenticated: true,\n label,\n binaryName,\n installCommand,\n authCommand: null,\n };\n }\n\n if (tier1 === 'file') {\n // Credential file found but may be stale/expired.\n // Run Tier 2 subprocess verify to confirm tokens are still valid (~200ms).\n let authenticated = true;\n if (binaryName) {\n authenticated = await tier2AuthVerify(agentType, binaryName);\n }\n return {\n agentType,\n installed: true,\n authenticated,\n label,\n binaryName,\n installCommand,\n authCommand: authenticated ? null : binaryName,\n };\n }\n\n // Tier 1 found nothing — credentials not in expected locations.\n // Fall through to Tier 2 because some auth methods (e.g. Claude Code OAuth\n // via claude.ai) store credentials outside the paths Tier 1 checks.\n if (binaryName) {\n const authenticated = await tier2AuthVerify(agentType, binaryName);\n if (authenticated) {\n return {\n agentType,\n installed: true,\n authenticated: true,\n label,\n binaryName,\n installCommand,\n authCommand: null,\n };\n }\n }\n\n // Both tiers failed — agent genuinely needs authentication\n return {\n agentType,\n installed: true,\n authenticated: false,\n label,\n binaryName,\n installCommand,\n authCommand: binaryName,\n };\n}\n","'use server';\n\nimport { execFile } from 'node:child_process';\nimport { IS_WINDOWS } from '@/lib/core-utils';\nimport { resolve } from '@/lib/server-container';\nimport type { ListToolsUseCase } from '@shipit-ai/core/application/use-cases/tools/list-tools.use-case';\n\nexport interface ToolStatusEntry {\n installed: boolean;\n version: string | null;\n /** Platform-specific install command from tool JSON metadata */\n installCommand: string | null;\n /** Documentation/website URL */\n installUrl: string | null;\n}\n\nexport interface ToolStatusResult {\n git: ToolStatusEntry;\n gh: ToolStatusEntry;\n}\n\nfunction getVersion(\n command: string,\n args: string[]\n): Promise<{ installed: boolean; version: string | null }> {\n return new Promise((resolve) => {\n try {\n const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };\n execFile(command, args, opts, (error, stdout) => {\n if (error) {\n resolve({ installed: false, version: null });\n return;\n }\n // Extract version number from output like \"git version 2.43.0\" or \"gh version 2.40.1\"\n const match = stdout.match(/(\\d+\\.\\d+(?:\\.\\d+)?)/);\n resolve({ installed: true, version: match?.[1] ?? null });\n });\n } catch {\n resolve({ installed: false, version: null });\n }\n });\n}\n\nexport async function checkToolStatus(): Promise<ToolStatusResult> {\n // Run version checks and tool metadata lookup in parallel\n const [gitVersion, ghVersion, tools] = await Promise.all([\n getVersion('git', ['--version']),\n getVersion('gh', ['--version']),\n (async () => {\n try {\n const useCase = resolve<ListToolsUseCase>('ListToolsUseCase');\n return await useCase.execute();\n } catch {\n return [];\n }\n })(),\n ]);\n\n const gitTool = tools.find((t) => t.id === 'git');\n const ghTool = tools.find((t) => t.id === 'gh');\n\n return {\n git: {\n ...gitVersion,\n installCommand: gitTool?.installCommand ?? null,\n installUrl: gitTool?.website ?? 'https://git-scm.com',\n },\n gh: {\n ...ghVersion,\n installCommand: ghTool?.installCommand ?? null,\n installUrl: ghTool?.website ?? 'https://cli.github.com',\n },\n };\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { IFeatureRepository } from '@shipit-ai/core/application/ports/output/repositories/feature-repository.interface';\n\n/**\n * Lightweight server action to fetch a single feature's name and description.\n * Used by the SSE effect to update node metadata after AI metadata generation\n * without a full graph reconcile (which can overwrite SSE-driven state).\n */\nexport async function getFeatureMetadata(\n featureId: string\n): Promise<{ name: string; description: string } | null> {\n const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');\n const feature = await featureRepo.findById(featureId);\n if (!feature) return null;\n return { name: feature.name, description: feature.description };\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { ArchiveFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/archive-feature.use-case';\nimport type { Feature } from '@shipit-ai/core/domain/generated/output';\n\nexport async function archiveFeature(\n featureId: string\n): Promise<{ feature?: Feature; error?: string }> {\n if (!featureId?.trim()) {\n return { error: 'id is required' };\n }\n\n try {\n const archiveFeatureUseCase = resolve<ArchiveFeatureUseCase>('ArchiveFeatureUseCase');\n const feature = await archiveFeatureUseCase.execute(featureId);\n return { feature };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to archive feature';\n return { error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/delete-feature.use-case';\nimport type { Feature } from '@shipit-ai/core/domain/generated/output';\n\nexport async function deleteFeature(\n featureId: string,\n cleanup?: boolean,\n cascadeDelete?: boolean,\n closePr?: boolean\n): Promise<{ feature?: Feature; error?: string }> {\n if (!featureId?.trim()) {\n return { error: 'id is required' };\n }\n\n try {\n const deleteFeatureUseCase = resolve<DeleteFeatureUseCase>('DeleteFeatureUseCase');\n const options: { cleanup?: boolean; cascadeDelete?: boolean; closePr?: boolean } = {};\n if (cleanup !== undefined) options.cleanup = cleanup;\n if (cascadeDelete !== undefined) options.cascadeDelete = cascadeDelete;\n if (closePr !== undefined) options.closePr = closePr;\n const feature =\n Object.keys(options).length > 0\n ? await deleteFeatureUseCase.execute(featureId, options)\n : await deleteFeatureUseCase.execute(featureId);\n return { feature };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete feature';\n return { error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { ResumeFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/resume-feature.use-case';\n\nexport async function resumeFeature(\n featureId: string\n): Promise<{ resumed: boolean; error?: string }> {\n if (!featureId.trim()) {\n return { resumed: false, error: 'Feature id is required' };\n }\n\n try {\n const useCase = resolve<ResumeFeatureUseCase>('ResumeFeatureUseCase');\n await useCase.execute(featureId);\n return { resumed: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to resume feature';\n return { resumed: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { StartFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/start-feature.use-case';\n\nexport async function startFeature(\n featureId: string\n): Promise<{ started: boolean; error?: string }> {\n if (!featureId.trim()) {\n return { started: false, error: 'Feature id is required' };\n }\n\n try {\n const useCase = resolve<StartFeatureUseCase>('StartFeatureUseCase');\n await useCase.execute(featureId);\n return { started: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to start feature';\n return { started: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { StopAgentRunUseCase } from '@shipit-ai/core/application/use-cases/agents/stop-agent-run.use-case';\nimport type { IAgentRunRepository } from '@shipit-ai/core/application/ports/output/agents/agent-run-repository.interface';\n\nexport async function stopFeature(\n featureId: string\n): Promise<{ stopped: boolean; error?: string }> {\n if (!featureId.trim()) {\n return { stopped: false, error: 'Feature id is required' };\n }\n\n try {\n // Find the active agent run for this feature\n const runRepo = resolve<IAgentRunRepository>('IAgentRunRepository');\n const allRuns = await runRepo.list();\n const activeRun = allRuns.find(\n (r) =>\n r.featureId === featureId &&\n r.status !== 'completed' &&\n r.status !== 'failed' &&\n r.status !== 'interrupted' &&\n r.status !== 'cancelled'\n );\n\n if (!activeRun) {\n return { stopped: false, error: 'No active agent run found for this feature' };\n }\n\n const useCase = resolve<StopAgentRunUseCase>('StopAgentRunUseCase');\n const result = await useCase.execute(activeRun.id);\n\n if (!result.stopped) {\n return { stopped: false, error: result.reason };\n }\n return { stopped: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to stop agent';\n return { stopped: false, error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { UnarchiveFeatureUseCase } from '@shipit-ai/core/application/use-cases/features/unarchive-feature.use-case';\nimport type { Feature } from '@shipit-ai/core/domain/generated/output';\n\nexport async function unarchiveFeature(\n featureId: string\n): Promise<{ feature?: Feature; error?: string }> {\n if (!featureId?.trim()) {\n return { error: 'id is required' };\n }\n\n try {\n const unarchiveFeatureUseCase = resolve<UnarchiveFeatureUseCase>('UnarchiveFeatureUseCase');\n const feature = await unarchiveFeatureUseCase.execute(featureId);\n return { feature };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to unarchive feature';\n return { error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { AddRepositoryUseCase } from '@shipit-ai/core/application/use-cases/repositories/add-repository.use-case';\nimport type { Repository } from '@shipit-ai/core/domain/generated/output';\n\ninterface AddRepositoryInput {\n path: string;\n name?: string;\n}\n\nexport async function addRepository(\n input: AddRepositoryInput\n): Promise<{ repository?: Repository; error?: string }> {\n const { path, name } = input;\n\n if (!path?.trim()) {\n return { error: 'path is required' };\n }\n\n try {\n const addRepoUseCase = resolve<AddRepositoryUseCase>('AddRepositoryUseCase');\n const repository = await addRepoUseCase.execute({ path, name });\n return { repository };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to add repository';\n return { error: message };\n }\n}\n","'use server';\n\nimport { resolve } from '@/lib/server-container';\nimport type { DeleteRepositoryUseCase } from '@shipit-ai/core/application/use-cases/repositories/delete-repository.use-case';\n\nexport async function deleteRepository(\n repositoryId: string\n): Promise<{ success: boolean; error?: string }> {\n if (!repositoryId?.trim()) {\n return { success: false, error: 'id is required' };\n }\n\n try {\n const useCase = resolve<DeleteRepositoryUseCase>('DeleteRepositoryUseCase');\n await useCase.execute(repositoryId);\n return { success: true };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to delete repository';\n return { success: false, error: message };\n }\n}\n"],"names":["openIde","input","repositoryPath","branch","success","error","loadSettings","settings","execute","editor","environment","defaultEditor","useCase","result","editorId","checkAvailability","ok","message","editorName","path","worktreePath"],"mappings":"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"}
|