@agimon-ai/doompi-git 0.0.1-alpha.8 → 0.0.1-alpha.9
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/_virtual/_rolldown/runtime.cjs +23 -1
- package/dist/api-contracts.cjs +7 -1
- package/dist/api-contracts.d.cts +1 -1
- package/dist/api-contracts.d.mts +1 -1
- package/dist/api-contracts.mjs +2 -1
- package/dist/extensions/pi.cjs +38 -1
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.cts +5 -4
- package/dist/extensions/pi.d.cts.map +1 -1
- package/dist/extensions/pi.d.mts +5 -4
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +33 -1
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +72 -1
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.cts +3 -3
- package/dist/extensions/server.d.cts.map +1 -1
- package/dist/extensions/server.d.mts +3 -3
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +67 -1
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +485 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/index.cjs +5 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +3 -1
- package/dist/src/constants/git.cjs +8 -0
- package/dist/src/constants/git.cjs.map +1 -0
- package/dist/src/constants/git.mjs +7 -0
- package/dist/src/constants/git.mjs.map +1 -0
- package/dist/src/extensions/(backend)/api/_lib/route.server.cjs +93 -0
- package/dist/src/extensions/(backend)/api/_lib/route.server.cjs.map +1 -0
- package/dist/src/extensions/(backend)/api/_lib/route.server.mjs +92 -0
- package/dist/src/extensions/(backend)/api/_lib/route.server.mjs.map +1 -0
- package/dist/src/extensions/(backend)/api/route.server.cjs +7 -0
- package/dist/src/extensions/(backend)/api/route.server.cjs.map +1 -0
- package/dist/src/extensions/(backend)/api/route.server.mjs +8 -0
- package/dist/src/extensions/(backend)/api/route.server.mjs.map +1 -0
- package/dist/src/extensions/(backend)/channel/_lib/git-worktrees.server.cjs +195 -0
- package/dist/src/extensions/(backend)/channel/_lib/git-worktrees.server.cjs.map +1 -0
- package/dist/src/extensions/(backend)/channel/_lib/git-worktrees.server.mjs +194 -0
- package/dist/src/extensions/(backend)/channel/_lib/git-worktrees.server.mjs.map +1 -0
- package/dist/src/extensions/(backend)/channel/git-worktrees.server.cjs +7 -0
- package/dist/src/extensions/(backend)/channel/git-worktrees.server.cjs.map +1 -0
- package/dist/src/extensions/(backend)/channel/git-worktrees.server.mjs +8 -0
- package/dist/src/extensions/(backend)/channel/git-worktrees.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs +71 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs +70 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.cjs +17 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.mjs +16 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/git.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/git.cli.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/git.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/git.cli.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/git.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompi-use-git.cli.cjs +15 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompi-use-git.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompi-use-git.cli.mjs +15 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompi-use-git.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiGit.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiGit.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiGit.server.mjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiGit.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiGitReadme.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiGitReadme.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiGitReadme.server.mjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiGitReadme.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiUseGit.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiUseGit.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiUseGit.server.mjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/doompiUseGit.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompi-use-git.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiGit.server.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiGit.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiGit.server.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiGit.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiGitReadme.server.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiGitReadme.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiGitReadme.server.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiGitReadme.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiUseGit.server.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiUseGit.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiUseGit.server.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/doompiUseGit.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/runWorktree.cli.cjs +38 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/runWorktree.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/runWorktree.cli.mjs +36 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/runWorktree.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli.cjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/runWorktree.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/runWorktree.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/runWorktree.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/runWorktree.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/runWorktree.server.mjs.map +1 -0
- package/dist/src/schemas/apiContracts.cjs +138 -0
- package/dist/src/schemas/apiContracts.cjs.map +1 -0
- package/dist/{schemas → src/schemas}/apiContracts.d.cts.map +1 -1
- package/dist/{schemas → src/schemas}/apiContracts.d.mts.map +1 -1
- package/dist/src/schemas/apiContracts.mjs +135 -0
- package/dist/src/schemas/apiContracts.mjs.map +1 -0
- package/dist/src/schemas/runWorktreeTool.cjs +152 -0
- package/dist/src/schemas/runWorktreeTool.cjs.map +1 -0
- package/dist/src/schemas/runWorktreeTool.mjs +150 -0
- package/dist/src/schemas/runWorktreeTool.mjs.map +1 -0
- package/dist/src/services/atomicJson/index.cjs +42 -0
- package/dist/src/services/atomicJson/index.cjs.map +1 -0
- package/dist/src/services/atomicJson/index.mjs +38 -0
- package/dist/src/services/atomicJson/index.mjs.map +1 -0
- package/dist/src/services/compositionMirror/index.cjs +119 -0
- package/dist/src/services/compositionMirror/index.cjs.map +1 -0
- package/dist/src/services/compositionMirror/index.mjs +116 -0
- package/dist/src/services/compositionMirror/index.mjs.map +1 -0
- package/dist/src/services/errors/index.cjs +29 -0
- package/dist/src/services/errors/index.cjs.map +1 -0
- package/dist/src/services/errors/index.mjs +27 -0
- package/dist/src/services/errors/index.mjs.map +1 -0
- package/dist/src/services/extensionService/index.cjs +13 -0
- package/dist/src/services/extensionService/index.cjs.map +1 -0
- package/dist/src/services/extensionService/index.d.cts.map +1 -0
- package/dist/src/services/extensionService/index.d.mts.map +1 -0
- package/dist/src/services/extensionService/index.mjs +13 -0
- package/dist/src/services/extensionService/index.mjs.map +1 -0
- package/dist/src/services/gitCli/index.cjs +144 -0
- package/dist/src/services/gitCli/index.cjs.map +1 -0
- package/dist/src/services/gitCli/index.mjs +142 -0
- package/dist/src/services/gitCli/index.mjs.map +1 -0
- package/dist/src/services/gitDependencies/index.cjs +14 -0
- package/dist/src/services/gitDependencies/index.cjs.map +1 -0
- package/dist/src/services/gitDependencies/index.d.cts.map +1 -0
- package/dist/src/services/gitDependencies/index.d.mts.map +1 -0
- package/dist/src/services/gitDependencies/index.mjs +14 -0
- package/dist/src/services/gitDependencies/index.mjs.map +1 -0
- package/dist/src/services/paths/index.cjs +35 -0
- package/dist/src/services/paths/index.cjs.map +1 -0
- package/dist/src/services/paths/index.mjs +30 -0
- package/dist/src/services/paths/index.mjs.map +1 -0
- package/dist/src/services/repositoryIdentity/index.cjs +71 -0
- package/dist/src/services/repositoryIdentity/index.cjs.map +1 -0
- package/dist/src/services/repositoryIdentity/index.mjs +65 -0
- package/dist/src/services/repositoryIdentity/index.mjs.map +1 -0
- package/dist/src/services/runWorktree/index.cjs +145 -0
- package/dist/src/services/runWorktree/index.cjs.map +1 -0
- package/dist/src/services/runWorktree/index.mjs +142 -0
- package/dist/src/services/runWorktree/index.mjs.map +1 -0
- package/dist/src/services/worktreeEvents/index.cjs +64 -0
- package/dist/src/services/worktreeEvents/index.cjs.map +1 -0
- package/dist/src/services/worktreeEvents/index.d.cts.map +1 -0
- package/dist/src/services/worktreeEvents/index.d.mts.map +1 -0
- package/dist/src/services/worktreeEvents/index.mjs +60 -0
- package/dist/src/services/worktreeEvents/index.mjs.map +1 -0
- package/dist/src/services/worktreeNaming/index.cjs +99 -0
- package/dist/src/services/worktreeNaming/index.cjs.map +1 -0
- package/dist/src/services/worktreeNaming/index.d.cts.map +1 -0
- package/dist/src/services/worktreeNaming/index.d.mts.map +1 -0
- package/dist/src/services/worktreeNaming/index.mjs +94 -0
- package/dist/src/services/worktreeNaming/index.mjs.map +1 -0
- package/dist/src/services/worktreeOperations/index.cjs +263 -0
- package/dist/src/services/worktreeOperations/index.cjs.map +1 -0
- package/dist/src/services/worktreeOperations/index.d.cts.map +1 -0
- package/dist/src/services/worktreeOperations/index.d.mts.map +1 -0
- package/dist/src/services/worktreeOperations/index.mjs +261 -0
- package/dist/src/services/worktreeOperations/index.mjs.map +1 -0
- package/dist/src/services/worktreeRegistry/index.cjs +38 -0
- package/dist/src/services/worktreeRegistry/index.cjs.map +1 -0
- package/dist/src/services/worktreeRegistry/index.mjs +38 -0
- package/dist/src/services/worktreeRegistry/index.mjs.map +1 -0
- package/dist/src/types/extension.d.cts.map +1 -0
- package/dist/src/types/extension.d.mts.map +1 -0
- package/dist/src/types/webWorktrees.cjs +20 -0
- package/dist/src/types/webWorktrees.cjs.map +1 -0
- package/dist/src/types/webWorktrees.mjs +20 -0
- package/dist/src/types/webWorktrees.mjs.map +1 -0
- package/dist/src/types/worktreeRegistry.d.cts.map +1 -0
- package/dist/src/types/worktreeRegistry.d.mts.map +1 -0
- package/package.json +24 -19
- package/dist/constants/git.cjs +0 -2
- package/dist/constants/git.cjs.map +0 -1
- package/dist/constants/git.mjs +0 -2
- package/dist/constants/git.mjs.map +0 -1
- package/dist/controllers/gitCommand.cjs +0 -2
- package/dist/controllers/gitCommand.cjs.map +0 -1
- package/dist/controllers/gitCommand.mjs +0 -2
- package/dist/controllers/gitCommand.mjs.map +0 -1
- package/dist/controllers/gitSession.cjs +0 -2
- package/dist/controllers/gitSession.cjs.map +0 -1
- package/dist/controllers/gitSession.mjs +0 -2
- package/dist/controllers/gitSession.mjs.map +0 -1
- package/dist/controllers/hubApi.cjs +0 -2
- package/dist/controllers/hubApi.cjs.map +0 -1
- package/dist/controllers/hubApi.mjs +0 -2
- package/dist/controllers/hubApi.mjs.map +0 -1
- package/dist/controllers/worktreesChannel.cjs +0 -2
- package/dist/controllers/worktreesChannel.cjs.map +0 -1
- package/dist/controllers/worktreesChannel.mjs +0 -2
- package/dist/controllers/worktreesChannel.mjs.map +0 -1
- package/dist/schemas/apiContracts.cjs +0 -2
- package/dist/schemas/apiContracts.cjs.map +0 -1
- package/dist/schemas/apiContracts.mjs +0 -2
- package/dist/schemas/apiContracts.mjs.map +0 -1
- package/dist/schemas/runWorktreeTool.cjs +0 -2
- package/dist/schemas/runWorktreeTool.cjs.map +0 -1
- package/dist/schemas/runWorktreeTool.mjs +0 -2
- package/dist/schemas/runWorktreeTool.mjs.map +0 -1
- package/dist/services/atomicJson/index.cjs +0 -2
- package/dist/services/atomicJson/index.cjs.map +0 -1
- package/dist/services/atomicJson/index.mjs +0 -2
- package/dist/services/atomicJson/index.mjs.map +0 -1
- package/dist/services/compositionMirror/index.cjs +0 -2
- package/dist/services/compositionMirror/index.cjs.map +0 -1
- package/dist/services/compositionMirror/index.mjs +0 -2
- package/dist/services/compositionMirror/index.mjs.map +0 -1
- package/dist/services/errors/index.cjs +0 -2
- package/dist/services/errors/index.cjs.map +0 -1
- package/dist/services/errors/index.mjs +0 -2
- package/dist/services/errors/index.mjs.map +0 -1
- package/dist/services/extensionService/index.cjs +0 -2
- package/dist/services/extensionService/index.cjs.map +0 -1
- package/dist/services/extensionService/index.d.cts.map +0 -1
- package/dist/services/extensionService/index.d.mts.map +0 -1
- package/dist/services/extensionService/index.mjs +0 -2
- package/dist/services/extensionService/index.mjs.map +0 -1
- package/dist/services/gitCli/index.cjs +0 -4
- package/dist/services/gitCli/index.cjs.map +0 -1
- package/dist/services/gitCli/index.mjs +0 -4
- package/dist/services/gitCli/index.mjs.map +0 -1
- package/dist/services/gitDependencies/index.cjs +0 -2
- package/dist/services/gitDependencies/index.cjs.map +0 -1
- package/dist/services/gitDependencies/index.d.cts.map +0 -1
- package/dist/services/gitDependencies/index.d.mts.map +0 -1
- package/dist/services/gitDependencies/index.mjs +0 -2
- package/dist/services/gitDependencies/index.mjs.map +0 -1
- package/dist/services/paths/index.cjs +0 -2
- package/dist/services/paths/index.cjs.map +0 -1
- package/dist/services/paths/index.mjs +0 -2
- package/dist/services/paths/index.mjs.map +0 -1
- package/dist/services/repositoryIdentity/index.cjs +0 -2
- package/dist/services/repositoryIdentity/index.cjs.map +0 -1
- package/dist/services/repositoryIdentity/index.mjs +0 -2
- package/dist/services/repositoryIdentity/index.mjs.map +0 -1
- package/dist/services/runWorktree/index.cjs +0 -15
- package/dist/services/runWorktree/index.cjs.map +0 -1
- package/dist/services/runWorktree/index.mjs +0 -15
- package/dist/services/runWorktree/index.mjs.map +0 -1
- package/dist/services/worktreeEvents/index.cjs +0 -2
- package/dist/services/worktreeEvents/index.cjs.map +0 -1
- package/dist/services/worktreeEvents/index.d.cts.map +0 -1
- package/dist/services/worktreeEvents/index.d.mts.map +0 -1
- package/dist/services/worktreeEvents/index.mjs +0 -2
- package/dist/services/worktreeEvents/index.mjs.map +0 -1
- package/dist/services/worktreeNaming/index.cjs +0 -2
- package/dist/services/worktreeNaming/index.cjs.map +0 -1
- package/dist/services/worktreeNaming/index.d.cts.map +0 -1
- package/dist/services/worktreeNaming/index.d.mts.map +0 -1
- package/dist/services/worktreeNaming/index.mjs +0 -2
- package/dist/services/worktreeNaming/index.mjs.map +0 -1
- package/dist/services/worktreeOperations/index.cjs +0 -2
- package/dist/services/worktreeOperations/index.cjs.map +0 -1
- package/dist/services/worktreeOperations/index.d.cts.map +0 -1
- package/dist/services/worktreeOperations/index.d.mts.map +0 -1
- package/dist/services/worktreeOperations/index.mjs +0 -2
- package/dist/services/worktreeOperations/index.mjs.map +0 -1
- package/dist/services/worktreeRegistry/index.cjs +0 -2
- package/dist/services/worktreeRegistry/index.cjs.map +0 -1
- package/dist/services/worktreeRegistry/index.mjs +0 -2
- package/dist/services/worktreeRegistry/index.mjs.map +0 -1
- package/dist/tools/runWorktree.cjs +0 -2
- package/dist/tools/runWorktree.cjs.map +0 -1
- package/dist/tools/runWorktree.mjs +0 -2
- package/dist/tools/runWorktree.mjs.map +0 -1
- package/dist/types/extension.d.cts.map +0 -1
- package/dist/types/extension.d.mts.map +0 -1
- package/dist/types/webWorktrees.cjs +0 -2
- package/dist/types/webWorktrees.cjs.map +0 -1
- package/dist/types/webWorktrees.mjs +0 -2
- package/dist/types/webWorktrees.mjs.map +0 -1
- package/dist/types/worktreeRegistry.d.cts.map +0 -1
- package/dist/types/worktreeRegistry.d.mts.map +0 -1
- package/src/extensions/web.ts +0 -33
- package/src/types/webWorktrees.ts +0 -55
- package/src/types/worktreeRegistry.ts +0 -78
- package/src/web/components/RunWorktreeToolMessage.tsx +0 -45
- package/src/web/components/WorktreesActivitySection.tsx +0 -80
- package/src/web/components/WorktreesPanel.tsx +0 -175
- package/src/web/components/toolRenderers.ts +0 -8
- package/src/web/stores/worktreesActivityStore.ts +0 -125
- package/src/web/tsconfig.json +0 -22
- /package/dist/{schemas → src/schemas}/apiContracts.d.cts +0 -0
- /package/dist/{schemas → src/schemas}/apiContracts.d.mts +0 -0
- /package/dist/{services → src/services}/extensionService/index.d.cts +0 -0
- /package/dist/{services → src/services}/extensionService/index.d.mts +0 -0
- /package/dist/{services → src/services}/gitDependencies/index.d.cts +0 -0
- /package/dist/{services → src/services}/gitDependencies/index.d.mts +0 -0
- /package/dist/{services → src/services}/worktreeEvents/index.d.cts +0 -0
- /package/dist/{services → src/services}/worktreeEvents/index.d.mts +0 -0
- /package/dist/{services → src/services}/worktreeNaming/index.d.cts +0 -0
- /package/dist/{services → src/services}/worktreeNaming/index.d.mts +0 -0
- /package/dist/{services → src/services}/worktreeOperations/index.d.cts +0 -0
- /package/dist/{services → src/services}/worktreeOperations/index.d.mts +0 -0
- /package/dist/{types → src/types}/extension.d.cts +0 -0
- /package/dist/{types → src/types}/extension.d.mts +0 -0
- /package/dist/{types → src/types}/worktreeRegistry.d.cts +0 -0
- /package/dist/{types → src/types}/worktreeRegistry.d.mts +0 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const require_index = require("../../../../services/gitCli/index.cjs");
|
|
2
|
+
const require_index$1 = require("../../../../services/errors/index.cjs");
|
|
3
|
+
const require_index$2 = require("../../../../services/worktreeEvents/index.cjs");
|
|
4
|
+
const require_index$3 = require("../../../../services/worktreeOperations/index.cjs");
|
|
5
|
+
//#region src/extensions/(backend)/api/_lib/route.server.ts
|
|
6
|
+
/**
|
|
7
|
+
* The worktree surface the cockpit panel calls.
|
|
8
|
+
*
|
|
9
|
+
* Hub-scoped because worktrees are a property of a repository, not of one
|
|
10
|
+
* session: the panel lists and creates them whether or not the session that
|
|
11
|
+
* made them is focused, and a session-scoped API would disappear with it.
|
|
12
|
+
*
|
|
13
|
+
* The panel names a repository by the hub's opaque id and never by path.
|
|
14
|
+
* `resolveRepository` turns that into an admitted root, so a browser cannot
|
|
15
|
+
* point this at a directory the cockpit was never given.
|
|
16
|
+
*/
|
|
17
|
+
function badRequest(message) {
|
|
18
|
+
return Response.json({ error: message }, { status: 400 });
|
|
19
|
+
}
|
|
20
|
+
function failed(error) {
|
|
21
|
+
if (error instanceof require_index$1.DoomGitExpectedError) return Response.json({
|
|
22
|
+
error: error.message,
|
|
23
|
+
code: error.code
|
|
24
|
+
}, { status: error.retryable ? 503 : 409 });
|
|
25
|
+
return Response.json({ error: "The worktree operation failed." }, { status: 500 });
|
|
26
|
+
}
|
|
27
|
+
const api = {
|
|
28
|
+
basePath: "git",
|
|
29
|
+
start(context) {
|
|
30
|
+
if (context.directEvents === void 0) throw new Error("Git hub API requires the direct event bus.");
|
|
31
|
+
const directEvents = context.directEvents;
|
|
32
|
+
const publishLifecycle = (sessionId, repositoryRoot) => {
|
|
33
|
+
directEvents.publish(require_index$2.GIT_WORKTREE_LIFECYCLE_EVENT, sessionId, {
|
|
34
|
+
version: 1,
|
|
35
|
+
repositoryRoot
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
const operations = require_index$3.createWorktreeOperations({
|
|
39
|
+
git: require_index.createWorktreeGit(),
|
|
40
|
+
sessionService: context.sessionService
|
|
41
|
+
});
|
|
42
|
+
/** The admitted root for a request, or a response explaining why not. */
|
|
43
|
+
const rootOf = (url) => {
|
|
44
|
+
const repositoryId = url.searchParams.get("repositoryId");
|
|
45
|
+
if (repositoryId === null || repositoryId === "") return badRequest("A repositoryId is required.");
|
|
46
|
+
const root = context.resolveRepository?.(repositoryId);
|
|
47
|
+
if (root === void 0) return badRequest("That repository is not admitted to this cockpit.");
|
|
48
|
+
return root;
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
async fetch(request) {
|
|
52
|
+
const url = new URL(request.url);
|
|
53
|
+
const root = rootOf(url);
|
|
54
|
+
if (root instanceof Response) return root;
|
|
55
|
+
const callerContext = {
|
|
56
|
+
cwd: root,
|
|
57
|
+
sessionId: url.searchParams.get("sessionId") ?? ""
|
|
58
|
+
};
|
|
59
|
+
if ((request.method === "POST" && url.pathname === "/worktrees" || request.method === "DELETE" && /^\/worktrees\/[^/]+$/u.test(url.pathname)) && callerContext.sessionId === "") return badRequest("A sessionId is required for worktree mutations.");
|
|
60
|
+
try {
|
|
61
|
+
if (request.method === "GET" && url.pathname === "/worktrees") return Response.json({ worktrees: await operations.list(callerContext) });
|
|
62
|
+
if (request.method === "POST" && url.pathname === "/worktrees") {
|
|
63
|
+
const body = await request.json();
|
|
64
|
+
if (typeof body.branch !== "string" || body.branch.trim() === "") return badRequest("A branch is required.");
|
|
65
|
+
const record = await operations.spawn(callerContext, {
|
|
66
|
+
branch: body.branch,
|
|
67
|
+
...body.baseRef === void 0 ? {} : { baseRef: body.baseRef },
|
|
68
|
+
...body.name === void 0 ? {} : { name: body.name }
|
|
69
|
+
});
|
|
70
|
+
publishLifecycle(callerContext.sessionId, record.repositoryRoot);
|
|
71
|
+
return Response.json({ worktree: record }, { status: 201 });
|
|
72
|
+
}
|
|
73
|
+
const closing = /^\/worktrees\/([^/]+)$/u.exec(url.pathname);
|
|
74
|
+
if (request.method === "DELETE" && closing) {
|
|
75
|
+
const record = await operations.close(callerContext, decodeURIComponent(String(closing[1])), url.searchParams.get("force") === "true");
|
|
76
|
+
publishLifecycle(callerContext.sessionId, record.repositoryRoot);
|
|
77
|
+
return Response.json({ worktree: record });
|
|
78
|
+
}
|
|
79
|
+
return Response.json({ error: "No such worktree route." }, { status: 404 });
|
|
80
|
+
} catch (error) {
|
|
81
|
+
context.onNotice(`worktree request failed: ${error.name}`);
|
|
82
|
+
return failed(error);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
close() {}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
//#endregion
|
|
90
|
+
exports.api = api;
|
|
91
|
+
exports.default = api;
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=route.server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.server.cjs","names":["DoomGitExpectedError","GIT_WORKTREE_LIFECYCLE_EVENT","createWorktreeOperations","createWorktreeGit"],"sources":["../../../../../../src/extensions/(backend)/api/_lib/route.server.ts"],"sourcesContent":["import type { DoomApi, DoomApiContext, DoomApiHandler } from '@agimon-ai/doompi-core/package-api';\n\nimport { DoomGitExpectedError } from '../../../../services/errors';\nimport { createWorktreeGit } from '../../../../services/gitCli';\nimport { GIT_WORKTREE_LIFECYCLE_EVENT } from '../../../../services/worktreeEvents';\nimport { createWorktreeOperations } from '../../../../services/worktreeOperations';\n\n/**\n * The worktree surface the cockpit panel calls.\n *\n * Hub-scoped because worktrees are a property of a repository, not of one\n * session: the panel lists and creates them whether or not the session that\n * made them is focused, and a session-scoped API would disappear with it.\n *\n * The panel names a repository by the hub's opaque id and never by path.\n * `resolveRepository` turns that into an admitted root, so a browser cannot\n * point this at a directory the cockpit was never given.\n */\nfunction badRequest(message: string): Response {\n return Response.json({ error: message }, { status: 400 });\n}\n\nfunction failed(error: unknown): Response {\n if (error instanceof DoomGitExpectedError) {\n return Response.json({ error: error.message, code: error.code }, { status: error.retryable ? 503 : 409 });\n }\n // Never the raw message: a git failure can carry a remote URL with a token.\n return Response.json({ error: 'The worktree operation failed.' }, { status: 500 });\n}\n\nexport const api: DoomApi = {\n basePath: 'git',\n start(context: DoomApiContext): DoomApiHandler {\n if (context.directEvents === undefined) throw new Error('Git hub API requires the direct event bus.');\n const directEvents = context.directEvents;\n const publishLifecycle = (sessionId: string, repositoryRoot: string): void => {\n directEvents.publish(GIT_WORKTREE_LIFECYCLE_EVENT, sessionId, { version: 1 as const, repositoryRoot });\n };\n const operations = createWorktreeOperations({\n git: createWorktreeGit(),\n sessionService: context.sessionService,\n });\n\n /** The admitted root for a request, or a response explaining why not. */\n const rootOf = (url: URL): string | Response => {\n const repositoryId = url.searchParams.get('repositoryId');\n if (repositoryId === null || repositoryId === '') return badRequest('A repositoryId is required.');\n const root = context.resolveRepository?.(repositoryId);\n if (root === undefined) return badRequest('That repository is not admitted to this cockpit.');\n return root;\n };\n\n return {\n async fetch(request) {\n const url = new URL(request.url);\n const root = rootOf(url);\n if (root instanceof Response) return root;\n // The operations layer works from a cwd, and an admitted repository\n // root is one.\n const callerContext = { cwd: root, sessionId: url.searchParams.get('sessionId') ?? '' };\n const isMutation =\n (request.method === 'POST' && url.pathname === '/worktrees') ||\n (request.method === 'DELETE' && /^\\/worktrees\\/[^/]+$/u.test(url.pathname));\n if (isMutation && callerContext.sessionId === '')\n return badRequest('A sessionId is required for worktree mutations.');\n\n try {\n if (request.method === 'GET' && url.pathname === '/worktrees') {\n return Response.json({ worktrees: await operations.list(callerContext) });\n }\n if (request.method === 'POST' && url.pathname === '/worktrees') {\n const body = (await request.json()) as { branch?: string; baseRef?: string; name?: string };\n if (typeof body.branch !== 'string' || body.branch.trim() === '') {\n return badRequest('A branch is required.');\n }\n const record = await operations.spawn(callerContext, {\n branch: body.branch,\n ...(body.baseRef === undefined ? {} : { baseRef: body.baseRef }),\n ...(body.name === undefined ? {} : { name: body.name }),\n });\n publishLifecycle(callerContext.sessionId, record.repositoryRoot);\n return Response.json({ worktree: record }, { status: 201 });\n }\n const closing = /^\\/worktrees\\/([^/]+)$/u.exec(url.pathname);\n if (request.method === 'DELETE' && closing) {\n const record = await operations.close(\n callerContext,\n decodeURIComponent(String(closing[1])),\n url.searchParams.get('force') === 'true',\n );\n publishLifecycle(callerContext.sessionId, record.repositoryRoot);\n return Response.json({ worktree: record });\n }\n return Response.json({ error: 'No such worktree route.' }, { status: 404 });\n } catch (error) {\n context.onNotice(`worktree request failed: ${(error as Error).name}`);\n return failed(error);\n }\n },\n close() {},\n };\n },\n};\n\nexport default api;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createWorktreeGit } from "../../../../services/gitCli/index.mjs";
|
|
2
|
+
import { DoomGitExpectedError } from "../../../../services/errors/index.mjs";
|
|
3
|
+
import { GIT_WORKTREE_LIFECYCLE_EVENT } from "../../../../services/worktreeEvents/index.mjs";
|
|
4
|
+
import { createWorktreeOperations } from "../../../../services/worktreeOperations/index.mjs";
|
|
5
|
+
//#region src/extensions/(backend)/api/_lib/route.server.ts
|
|
6
|
+
/**
|
|
7
|
+
* The worktree surface the cockpit panel calls.
|
|
8
|
+
*
|
|
9
|
+
* Hub-scoped because worktrees are a property of a repository, not of one
|
|
10
|
+
* session: the panel lists and creates them whether or not the session that
|
|
11
|
+
* made them is focused, and a session-scoped API would disappear with it.
|
|
12
|
+
*
|
|
13
|
+
* The panel names a repository by the hub's opaque id and never by path.
|
|
14
|
+
* `resolveRepository` turns that into an admitted root, so a browser cannot
|
|
15
|
+
* point this at a directory the cockpit was never given.
|
|
16
|
+
*/
|
|
17
|
+
function badRequest(message) {
|
|
18
|
+
return Response.json({ error: message }, { status: 400 });
|
|
19
|
+
}
|
|
20
|
+
function failed(error) {
|
|
21
|
+
if (error instanceof DoomGitExpectedError) return Response.json({
|
|
22
|
+
error: error.message,
|
|
23
|
+
code: error.code
|
|
24
|
+
}, { status: error.retryable ? 503 : 409 });
|
|
25
|
+
return Response.json({ error: "The worktree operation failed." }, { status: 500 });
|
|
26
|
+
}
|
|
27
|
+
const api = {
|
|
28
|
+
basePath: "git",
|
|
29
|
+
start(context) {
|
|
30
|
+
if (context.directEvents === void 0) throw new Error("Git hub API requires the direct event bus.");
|
|
31
|
+
const directEvents = context.directEvents;
|
|
32
|
+
const publishLifecycle = (sessionId, repositoryRoot) => {
|
|
33
|
+
directEvents.publish(GIT_WORKTREE_LIFECYCLE_EVENT, sessionId, {
|
|
34
|
+
version: 1,
|
|
35
|
+
repositoryRoot
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
const operations = createWorktreeOperations({
|
|
39
|
+
git: createWorktreeGit(),
|
|
40
|
+
sessionService: context.sessionService
|
|
41
|
+
});
|
|
42
|
+
/** The admitted root for a request, or a response explaining why not. */
|
|
43
|
+
const rootOf = (url) => {
|
|
44
|
+
const repositoryId = url.searchParams.get("repositoryId");
|
|
45
|
+
if (repositoryId === null || repositoryId === "") return badRequest("A repositoryId is required.");
|
|
46
|
+
const root = context.resolveRepository?.(repositoryId);
|
|
47
|
+
if (root === void 0) return badRequest("That repository is not admitted to this cockpit.");
|
|
48
|
+
return root;
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
async fetch(request) {
|
|
52
|
+
const url = new URL(request.url);
|
|
53
|
+
const root = rootOf(url);
|
|
54
|
+
if (root instanceof Response) return root;
|
|
55
|
+
const callerContext = {
|
|
56
|
+
cwd: root,
|
|
57
|
+
sessionId: url.searchParams.get("sessionId") ?? ""
|
|
58
|
+
};
|
|
59
|
+
if ((request.method === "POST" && url.pathname === "/worktrees" || request.method === "DELETE" && /^\/worktrees\/[^/]+$/u.test(url.pathname)) && callerContext.sessionId === "") return badRequest("A sessionId is required for worktree mutations.");
|
|
60
|
+
try {
|
|
61
|
+
if (request.method === "GET" && url.pathname === "/worktrees") return Response.json({ worktrees: await operations.list(callerContext) });
|
|
62
|
+
if (request.method === "POST" && url.pathname === "/worktrees") {
|
|
63
|
+
const body = await request.json();
|
|
64
|
+
if (typeof body.branch !== "string" || body.branch.trim() === "") return badRequest("A branch is required.");
|
|
65
|
+
const record = await operations.spawn(callerContext, {
|
|
66
|
+
branch: body.branch,
|
|
67
|
+
...body.baseRef === void 0 ? {} : { baseRef: body.baseRef },
|
|
68
|
+
...body.name === void 0 ? {} : { name: body.name }
|
|
69
|
+
});
|
|
70
|
+
publishLifecycle(callerContext.sessionId, record.repositoryRoot);
|
|
71
|
+
return Response.json({ worktree: record }, { status: 201 });
|
|
72
|
+
}
|
|
73
|
+
const closing = /^\/worktrees\/([^/]+)$/u.exec(url.pathname);
|
|
74
|
+
if (request.method === "DELETE" && closing) {
|
|
75
|
+
const record = await operations.close(callerContext, decodeURIComponent(String(closing[1])), url.searchParams.get("force") === "true");
|
|
76
|
+
publishLifecycle(callerContext.sessionId, record.repositoryRoot);
|
|
77
|
+
return Response.json({ worktree: record });
|
|
78
|
+
}
|
|
79
|
+
return Response.json({ error: "No such worktree route." }, { status: 404 });
|
|
80
|
+
} catch (error) {
|
|
81
|
+
context.onNotice(`worktree request failed: ${error.name}`);
|
|
82
|
+
return failed(error);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
close() {}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
//#endregion
|
|
90
|
+
export { api, api as default };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=route.server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.server.mjs","names":[],"sources":["../../../../../../src/extensions/(backend)/api/_lib/route.server.ts"],"sourcesContent":["import type { DoomApi, DoomApiContext, DoomApiHandler } from '@agimon-ai/doompi-core/package-api';\n\nimport { DoomGitExpectedError } from '../../../../services/errors';\nimport { createWorktreeGit } from '../../../../services/gitCli';\nimport { GIT_WORKTREE_LIFECYCLE_EVENT } from '../../../../services/worktreeEvents';\nimport { createWorktreeOperations } from '../../../../services/worktreeOperations';\n\n/**\n * The worktree surface the cockpit panel calls.\n *\n * Hub-scoped because worktrees are a property of a repository, not of one\n * session: the panel lists and creates them whether or not the session that\n * made them is focused, and a session-scoped API would disappear with it.\n *\n * The panel names a repository by the hub's opaque id and never by path.\n * `resolveRepository` turns that into an admitted root, so a browser cannot\n * point this at a directory the cockpit was never given.\n */\nfunction badRequest(message: string): Response {\n return Response.json({ error: message }, { status: 400 });\n}\n\nfunction failed(error: unknown): Response {\n if (error instanceof DoomGitExpectedError) {\n return Response.json({ error: error.message, code: error.code }, { status: error.retryable ? 503 : 409 });\n }\n // Never the raw message: a git failure can carry a remote URL with a token.\n return Response.json({ error: 'The worktree operation failed.' }, { status: 500 });\n}\n\nexport const api: DoomApi = {\n basePath: 'git',\n start(context: DoomApiContext): DoomApiHandler {\n if (context.directEvents === undefined) throw new Error('Git hub API requires the direct event bus.');\n const directEvents = context.directEvents;\n const publishLifecycle = (sessionId: string, repositoryRoot: string): void => {\n directEvents.publish(GIT_WORKTREE_LIFECYCLE_EVENT, sessionId, { version: 1 as const, repositoryRoot });\n };\n const operations = createWorktreeOperations({\n git: createWorktreeGit(),\n sessionService: context.sessionService,\n });\n\n /** The admitted root for a request, or a response explaining why not. */\n const rootOf = (url: URL): string | Response => {\n const repositoryId = url.searchParams.get('repositoryId');\n if (repositoryId === null || repositoryId === '') return badRequest('A repositoryId is required.');\n const root = context.resolveRepository?.(repositoryId);\n if (root === undefined) return badRequest('That repository is not admitted to this cockpit.');\n return root;\n };\n\n return {\n async fetch(request) {\n const url = new URL(request.url);\n const root = rootOf(url);\n if (root instanceof Response) return root;\n // The operations layer works from a cwd, and an admitted repository\n // root is one.\n const callerContext = { cwd: root, sessionId: url.searchParams.get('sessionId') ?? '' };\n const isMutation =\n (request.method === 'POST' && url.pathname === '/worktrees') ||\n (request.method === 'DELETE' && /^\\/worktrees\\/[^/]+$/u.test(url.pathname));\n if (isMutation && callerContext.sessionId === '')\n return badRequest('A sessionId is required for worktree mutations.');\n\n try {\n if (request.method === 'GET' && url.pathname === '/worktrees') {\n return Response.json({ worktrees: await operations.list(callerContext) });\n }\n if (request.method === 'POST' && url.pathname === '/worktrees') {\n const body = (await request.json()) as { branch?: string; baseRef?: string; name?: string };\n if (typeof body.branch !== 'string' || body.branch.trim() === '') {\n return badRequest('A branch is required.');\n }\n const record = await operations.spawn(callerContext, {\n branch: body.branch,\n ...(body.baseRef === undefined ? {} : { baseRef: body.baseRef }),\n ...(body.name === undefined ? {} : { name: body.name }),\n });\n publishLifecycle(callerContext.sessionId, record.repositoryRoot);\n return Response.json({ worktree: record }, { status: 201 });\n }\n const closing = /^\\/worktrees\\/([^/]+)$/u.exec(url.pathname);\n if (request.method === 'DELETE' && closing) {\n const record = await operations.close(\n callerContext,\n decodeURIComponent(String(closing[1])),\n url.searchParams.get('force') === 'true',\n );\n publishLifecycle(callerContext.sessionId, record.repositoryRoot);\n return Response.json({ worktree: record });\n }\n return Response.json({ error: 'No such worktree route.' }, { status: 404 });\n } catch (error) {\n context.onNotice(`worktree request failed: ${(error as Error).name}`);\n return failed(error);\n }\n },\n close() {},\n };\n },\n};\n\nexport default api;\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,SAAS,WAAW,SAA2B;CAC7C,OAAO,SAAS,KAAK,EAAE,OAAO,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAC1D;AAEA,SAAS,OAAO,OAA0B;CACxC,IAAI,iBAAiB,sBACnB,OAAO,SAAS,KAAK;EAAE,OAAO,MAAM;EAAS,MAAM,MAAM;CAAK,GAAG,EAAE,QAAQ,MAAM,YAAY,MAAM,IAAI,CAAC;CAG1G,OAAO,SAAS,KAAK,EAAE,OAAO,iCAAiC,GAAG,EAAE,QAAQ,IAAI,CAAC;AACnF;AAEA,MAAa,MAAe;CAC1B,UAAU;CACV,MAAM,SAAyC;EAC7C,IAAI,QAAQ,iBAAiB,KAAA,GAAW,MAAM,IAAI,MAAM,4CAA4C;EACpG,MAAM,eAAe,QAAQ;EAC7B,MAAM,oBAAoB,WAAmB,mBAAiC;GAC5E,aAAa,QAAQ,8BAA8B,WAAW;IAAE,SAAS;IAAY;GAAe,CAAC;EACvG;EACA,MAAM,aAAa,yBAAyB;GAC1C,KAAK,kBAAkB;GACvB,gBAAgB,QAAQ;EAC1B,CAAC;;EAGD,MAAM,UAAU,QAAgC;GAC9C,MAAM,eAAe,IAAI,aAAa,IAAI,cAAc;GACxD,IAAI,iBAAiB,QAAQ,iBAAiB,IAAI,OAAO,WAAW,6BAA6B;GACjG,MAAM,OAAO,QAAQ,oBAAoB,YAAY;GACrD,IAAI,SAAS,KAAA,GAAW,OAAO,WAAW,kDAAkD;GAC5F,OAAO;EACT;EAEA,OAAO;GACL,MAAM,MAAM,SAAS;IACnB,MAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;IAC/B,MAAM,OAAO,OAAO,GAAG;IACvB,IAAI,gBAAgB,UAAU,OAAO;IAGrC,MAAM,gBAAgB;KAAE,KAAK;KAAM,WAAW,IAAI,aAAa,IAAI,WAAW,KAAK;IAAG;IAItF,KAFG,QAAQ,WAAW,UAAU,IAAI,aAAa,gBAC9C,QAAQ,WAAW,YAAY,wBAAwB,KAAK,IAAI,QAAQ,MACzD,cAAc,cAAc,IAC5C,OAAO,WAAW,iDAAiD;IAErE,IAAI;KACF,IAAI,QAAQ,WAAW,SAAS,IAAI,aAAa,cAC/C,OAAO,SAAS,KAAK,EAAE,WAAW,MAAM,WAAW,KAAK,aAAa,EAAE,CAAC;KAE1E,IAAI,QAAQ,WAAW,UAAU,IAAI,aAAa,cAAc;MAC9D,MAAM,OAAQ,MAAM,QAAQ,KAAK;MACjC,IAAI,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,KAAK,MAAM,IAC5D,OAAO,WAAW,uBAAuB;MAE3C,MAAM,SAAS,MAAM,WAAW,MAAM,eAAe;OACnD,QAAQ,KAAK;OACb,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,KAAK,QAAQ;OAC9D,GAAI,KAAK,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK;MACvD,CAAC;MACD,iBAAiB,cAAc,WAAW,OAAO,cAAc;MAC/D,OAAO,SAAS,KAAK,EAAE,UAAU,OAAO,GAAG,EAAE,QAAQ,IAAI,CAAC;KAC5D;KACA,MAAM,UAAU,0BAA0B,KAAK,IAAI,QAAQ;KAC3D,IAAI,QAAQ,WAAW,YAAY,SAAS;MAC1C,MAAM,SAAS,MAAM,WAAW,MAC9B,eACA,mBAAmB,OAAO,QAAQ,EAAE,CAAC,GACrC,IAAI,aAAa,IAAI,OAAO,MAAM,MACpC;MACA,iBAAiB,cAAc,WAAW,OAAO,cAAc;MAC/D,OAAO,SAAS,KAAK,EAAE,UAAU,OAAO,CAAC;KAC3C;KACA,OAAO,SAAS,KAAK,EAAE,OAAO,0BAA0B,GAAG,EAAE,QAAQ,IAAI,CAAC;IAC5E,SAAS,OAAO;KACd,QAAQ,SAAS,4BAA6B,MAAgB,MAAM;KACpE,OAAO,OAAO,KAAK;IACrB;GACF;GACA,QAAQ,CAAC;EACX;CACF;AACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const require_route_server = require("./_lib/route.server.cjs");
|
|
2
|
+
//#region src/extensions/(backend)/api/route.server.ts
|
|
3
|
+
var route_server_default = (0, require("@agimon-ai/doompi-core/extension-file").defineRoute)(require_route_server.api);
|
|
4
|
+
//#endregion
|
|
5
|
+
exports.default = route_server_default;
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=route.server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.server.cjs","names":["defineRoute","contribution"],"sources":["../../../../../src/extensions/(backend)/api/route.server.ts"],"sourcesContent":["import { defineRoute } from '@agimon-ai/doompi-core/extension-file';\n\nimport contribution from './_lib/route.server';\n\nexport default defineRoute(contribution);\n"],"mappings":";;AAIA,IAAA,wBAAA,kDAAeA,CAAAA,CAAAA,YAAAA,CAAYC,qBAAAA,GAAY"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { api } from "./_lib/route.server.mjs";
|
|
2
|
+
import { defineRoute } from "@agimon-ai/doompi-core/extension-file";
|
|
3
|
+
//#region src/extensions/(backend)/api/route.server.ts
|
|
4
|
+
var route_server_default = defineRoute(api);
|
|
5
|
+
//#endregion
|
|
6
|
+
export { route_server_default as default };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=route.server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.server.mjs","names":["contribution"],"sources":["../../../../../src/extensions/(backend)/api/route.server.ts"],"sourcesContent":["import { defineRoute } from '@agimon-ai/doompi-core/extension-file';\n\nimport contribution from './_lib/route.server';\n\nexport default defineRoute(contribution);\n"],"mappings":";;;AAIA,IAAA,uBAAe,YAAYA,GAAY"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
const require_index = require("../../../../services/gitCli/index.cjs");
|
|
2
|
+
const require_index$1 = require("../../../../services/errors/index.cjs");
|
|
3
|
+
const require_index$2 = require("../../../../services/paths/index.cjs");
|
|
4
|
+
const require_index$3 = require("../../../../services/worktreeEvents/index.cjs");
|
|
5
|
+
const require_index$4 = require("../../../../services/worktreeRegistry/index.cjs");
|
|
6
|
+
const require_index$5 = require("../../../../services/worktreeOperations/index.cjs");
|
|
7
|
+
const require_webWorktrees = require("../../../../types/webWorktrees.cjs");
|
|
8
|
+
//#region src/extensions/(backend)/channel/_lib/git-worktrees.server.ts
|
|
9
|
+
function payloadOf(state) {
|
|
10
|
+
return {
|
|
11
|
+
worktrees: state.worktrees,
|
|
12
|
+
...state.pending === void 0 ? {} : { pending: state.pending },
|
|
13
|
+
...state.error === void 0 ? {} : { error: state.error }
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Worktrees visible to this session, using the hub's live session table for ownership. */
|
|
17
|
+
function viewsFor(scope, deps) {
|
|
18
|
+
try {
|
|
19
|
+
return require_index$4.createWorktreeRegistry(require_index$2.registryFile(scope.cwd, deps.homeDir)).list().flatMap((record) => {
|
|
20
|
+
const owned = record.parentSessionId === scope.sessionId;
|
|
21
|
+
const unowned = !owned && !deps.sessionService.isLive(record.parentSessionId);
|
|
22
|
+
if (!owned && !unowned) return [];
|
|
23
|
+
return [{
|
|
24
|
+
id: record.id,
|
|
25
|
+
branch: record.branch,
|
|
26
|
+
path: record.path,
|
|
27
|
+
sessionId: record.status === "orphaned" ? null : record.sessionId,
|
|
28
|
+
orphaned: record.status === "orphaned",
|
|
29
|
+
unowned
|
|
30
|
+
}];
|
|
31
|
+
});
|
|
32
|
+
} catch {
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function sameList(left, right) {
|
|
37
|
+
if (left.length !== right.length) return false;
|
|
38
|
+
return left.every((entry, index) => {
|
|
39
|
+
const other = right[index];
|
|
40
|
+
return other !== void 0 && entry.id === other.id && entry.branch === other.branch && entry.sessionId === other.sessionId && entry.orphaned === other.orphaned && entry.unowned === other.unowned;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** A command the page sent, or undefined when the frame was not one. */
|
|
44
|
+
function parseCommand(payload) {
|
|
45
|
+
if (typeof payload !== "object" || payload === null) return void 0;
|
|
46
|
+
const value = payload;
|
|
47
|
+
if (value.action === "create") {
|
|
48
|
+
if (typeof value.branch !== "string" || value.branch.trim() === "") return void 0;
|
|
49
|
+
return {
|
|
50
|
+
action: "create",
|
|
51
|
+
branch: value.branch.trim(),
|
|
52
|
+
...typeof value.baseRef === "string" && value.baseRef.trim() !== "" ? { baseRef: value.baseRef.trim() } : {}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (value.action === "close") {
|
|
56
|
+
if (typeof value.id !== "string" || value.id === "") return void 0;
|
|
57
|
+
return {
|
|
58
|
+
action: "close",
|
|
59
|
+
id: value.id,
|
|
60
|
+
...value.force === true ? { force: true } : {}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* What the reader is told when a command fails.
|
|
66
|
+
*
|
|
67
|
+
* An expected failure explains itself. Anything else is summarised, never
|
|
68
|
+
* echoed: a git error can carry a remote URL with a token in it.
|
|
69
|
+
*/
|
|
70
|
+
function failureText(error) {
|
|
71
|
+
return error instanceof require_index$1.DoomGitExpectedError ? error.message : "The worktree operation failed.";
|
|
72
|
+
}
|
|
73
|
+
/** Starts one direct-event subscription per managed session. */
|
|
74
|
+
function createWorktreesChannel(options = {}) {
|
|
75
|
+
let receiveCommand;
|
|
76
|
+
return {
|
|
77
|
+
frameType: require_webWorktrees.GIT_WORKTREES_TYPE,
|
|
78
|
+
start(host) {
|
|
79
|
+
const sessionService = host.sessionService;
|
|
80
|
+
if (sessionService === void 0) throw new require_index$1.HubUnavailableError("The cockpit session service is unavailable. Start the cockpit and try again.");
|
|
81
|
+
const worktrees = options.operations ?? require_index$5.createWorktreeOperations({
|
|
82
|
+
git: require_index.createWorktreeGit(),
|
|
83
|
+
sessionService
|
|
84
|
+
});
|
|
85
|
+
const views = {
|
|
86
|
+
homeDir: options.homeDir,
|
|
87
|
+
sessionService
|
|
88
|
+
};
|
|
89
|
+
const latest = /* @__PURE__ */ new Map();
|
|
90
|
+
const subscriptions = /* @__PURE__ */ new Map();
|
|
91
|
+
const busy = /* @__PURE__ */ new Set();
|
|
92
|
+
/** Republishes a session, skipping a frame that would say nothing new. */
|
|
93
|
+
const publish = (scope, force) => {
|
|
94
|
+
const previous = latest.get(scope.sessionId);
|
|
95
|
+
const next = {
|
|
96
|
+
worktrees: viewsFor(scope, views),
|
|
97
|
+
pending: previous?.pending,
|
|
98
|
+
error: previous?.error
|
|
99
|
+
};
|
|
100
|
+
if (!force && previous !== void 0 && sameList(previous.worktrees, next.worktrees) && previous.pending === next.pending && previous.error === next.error) return;
|
|
101
|
+
latest.set(scope.sessionId, next);
|
|
102
|
+
host.publish(scope.sessionId, payloadOf(next));
|
|
103
|
+
};
|
|
104
|
+
const mark = (scope, pending, error) => {
|
|
105
|
+
const previous = latest.get(scope.sessionId);
|
|
106
|
+
latest.set(scope.sessionId, {
|
|
107
|
+
worktrees: previous?.worktrees ?? viewsFor(scope, views),
|
|
108
|
+
pending,
|
|
109
|
+
error
|
|
110
|
+
});
|
|
111
|
+
publish(scope, true);
|
|
112
|
+
};
|
|
113
|
+
/** Announces a successful mutation to this session's lifecycle subscribers. */
|
|
114
|
+
const publishLifecycle = (scope, repositoryRoot) => {
|
|
115
|
+
host.directEvents.publish(require_index$3.GIT_WORKTREE_LIFECYCLE_EVENT, scope.sessionId, {
|
|
116
|
+
version: 1,
|
|
117
|
+
repositoryRoot
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
const run = async (scope, command) => {
|
|
121
|
+
const context = {
|
|
122
|
+
cwd: scope.cwd,
|
|
123
|
+
sessionId: scope.sessionId
|
|
124
|
+
};
|
|
125
|
+
if (command.action === "create") {
|
|
126
|
+
mark(scope, `creating ${command.branch}\u2026`, void 0);
|
|
127
|
+
const record = await worktrees.spawn(context, {
|
|
128
|
+
branch: command.branch,
|
|
129
|
+
...command.baseRef === void 0 ? {} : { baseRef: command.baseRef }
|
|
130
|
+
}, { onProgress: (label) => mark(scope, label, void 0) });
|
|
131
|
+
publishLifecycle(scope, record.repositoryRoot);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
mark(scope, `closing ${command.id}…`, void 0);
|
|
135
|
+
const record = await worktrees.close(context, command.id, command.force ?? false);
|
|
136
|
+
publishLifecycle(scope, record.repositoryRoot);
|
|
137
|
+
};
|
|
138
|
+
const source = {
|
|
139
|
+
payloadFor(scope) {
|
|
140
|
+
const state = latest.get(scope.sessionId);
|
|
141
|
+
return state === void 0 ? void 0 : payloadOf(state);
|
|
142
|
+
},
|
|
143
|
+
sessionAdded(scope) {
|
|
144
|
+
publish(scope, false);
|
|
145
|
+
const unsubscribe = host.directEvents.subscribe(require_index$3.GIT_WORKTREE_LIFECYCLE_EVENT, scope.sessionId, (payload) => {
|
|
146
|
+
if (!require_index$3.isWorktreeLifecycleEvent(payload)) return;
|
|
147
|
+
let sameRepository = false;
|
|
148
|
+
try {
|
|
149
|
+
sameRepository = require_index$2.registryFile(scope.cwd, options.homeDir) === require_index$2.registryFile(payload.repositoryRoot, options.homeDir);
|
|
150
|
+
} catch {
|
|
151
|
+
sameRepository = false;
|
|
152
|
+
}
|
|
153
|
+
if (sameRepository) publish(scope, false);
|
|
154
|
+
});
|
|
155
|
+
subscriptions.set(scope.sessionId, unsubscribe);
|
|
156
|
+
},
|
|
157
|
+
sessionRemoved(sessionId) {
|
|
158
|
+
subscriptions.get(sessionId)?.();
|
|
159
|
+
subscriptions.delete(sessionId);
|
|
160
|
+
latest.delete(sessionId);
|
|
161
|
+
busy.delete(sessionId);
|
|
162
|
+
},
|
|
163
|
+
close() {
|
|
164
|
+
for (const unsubscribe of subscriptions.values()) unsubscribe();
|
|
165
|
+
subscriptions.clear();
|
|
166
|
+
latest.clear();
|
|
167
|
+
busy.clear();
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
receiveCommand = (scope, payload) => {
|
|
171
|
+
const command = parseCommand(payload);
|
|
172
|
+
if (command === void 0) return;
|
|
173
|
+
if (busy.has(scope.sessionId)) return;
|
|
174
|
+
busy.add(scope.sessionId);
|
|
175
|
+
run(scope, command).then(() => {
|
|
176
|
+
mark(scope, void 0, void 0);
|
|
177
|
+
}).catch((error) => {
|
|
178
|
+
host.onNotice(`worktree command failed for ${scope.sessionId} (${failureText(error)})`);
|
|
179
|
+
mark(scope, void 0, failureText(error));
|
|
180
|
+
}).finally(() => {
|
|
181
|
+
busy.delete(scope.sessionId);
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
return source;
|
|
185
|
+
},
|
|
186
|
+
receive(scope, payload) {
|
|
187
|
+
receiveCommand?.(scope, payload);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
//#endregion
|
|
192
|
+
exports.createWorktreesChannel = createWorktreesChannel;
|
|
193
|
+
exports.default = createWorktreesChannel;
|
|
194
|
+
|
|
195
|
+
//# sourceMappingURL=git-worktrees.server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-worktrees.server.cjs","names":["createWorktreeRegistry","registryFile","DoomGitExpectedError","GIT_WORKTREES_TYPE","HubUnavailableError","createWorktreeOperations","createWorktreeGit","GIT_WORKTREE_LIFECYCLE_EVENT","isWorktreeLifecycleEvent"],"sources":["../../../../../../src/extensions/(backend)/channel/_lib/git-worktrees.server.ts"],"sourcesContent":["/**\n * The worktrees data channel, and the commands the dock sends back through it.\n *\n * The registry is durable state only. Live lifecycle changes arrive through the\n * hub-owned direct event bus, so this channel never polls or claims files.\n */\nimport type {\n DoomHubChannel,\n DoomHubChannelSource,\n DoomHubSessionScope,\n DoomHubSessionService,\n} from '@agimon-ai/doompi-core/hub-channel';\n\nimport { DoomGitExpectedError, HubUnavailableError } from '../../../../services/errors';\nimport { createWorktreeGit } from '../../../../services/gitCli';\nimport { registryFile } from '../../../../services/paths';\nimport { GIT_WORKTREE_LIFECYCLE_EVENT, isWorktreeLifecycleEvent } from '../../../../services/worktreeEvents';\nimport { createWorktreeOperations, type WorktreeOperations } from '../../../../services/worktreeOperations';\nimport { createWorktreeRegistry } from '../../../../services/worktreeRegistry';\nimport { GIT_WORKTREES_TYPE, type GitWorktreesCommand, type WorktreeView } from '../../../../types/webWorktrees';\n\ninterface SessionState {\n worktrees: WorktreeView[];\n pending: string | undefined;\n error: string | undefined;\n}\n\nfunction payloadOf(state: SessionState): Record<string, unknown> {\n return {\n worktrees: state.worktrees,\n ...(state.pending === undefined ? {} : { pending: state.pending }),\n ...(state.error === undefined ? {} : { error: state.error }),\n };\n}\n\n/** What the channel needs from its surroundings, injected so tests stay off this machine. */\nexport interface WorktreesChannelOptions {\n operations?: WorktreeOperations;\n homeDir?: string;\n}\n\ninterface ViewDeps {\n homeDir: string | undefined;\n sessionService: DoomHubSessionService;\n}\n\n/** Worktrees visible to this session, using the hub's live session table for ownership. */\nfunction viewsFor(scope: DoomHubSessionScope, deps: ViewDeps): WorktreeView[] {\n try {\n return createWorktreeRegistry(registryFile(scope.cwd, deps.homeDir))\n .list()\n .flatMap((record) => {\n const owned = record.parentSessionId === scope.sessionId;\n const unowned = !owned && !deps.sessionService.isLive(record.parentSessionId);\n if (!owned && !unowned) return [];\n return [\n {\n id: record.id,\n branch: record.branch,\n path: record.path,\n sessionId: record.status === 'orphaned' ? null : record.sessionId,\n orphaned: record.status === 'orphaned',\n unowned,\n },\n ];\n });\n } catch {\n return [];\n }\n}\n\nfunction sameList(left: readonly WorktreeView[], right: readonly WorktreeView[]): boolean {\n if (left.length !== right.length) return false;\n return left.every((entry, index) => {\n const other = right[index];\n return (\n other !== undefined &&\n entry.id === other.id &&\n entry.branch === other.branch &&\n entry.sessionId === other.sessionId &&\n entry.orphaned === other.orphaned &&\n entry.unowned === other.unowned\n );\n });\n}\n\n/** A command the page sent, or undefined when the frame was not one. */\nfunction parseCommand(payload: unknown): GitWorktreesCommand | undefined {\n if (typeof payload !== 'object' || payload === null) return undefined;\n const value = payload as Record<string, unknown>;\n if (value.action === 'create') {\n if (typeof value.branch !== 'string' || value.branch.trim() === '') return undefined;\n return {\n action: 'create',\n branch: value.branch.trim(),\n ...(typeof value.baseRef === 'string' && value.baseRef.trim() !== '' ? { baseRef: value.baseRef.trim() } : {}),\n };\n }\n if (value.action === 'close') {\n if (typeof value.id !== 'string' || value.id === '') return undefined;\n return { action: 'close', id: value.id, ...(value.force === true ? { force: true } : {}) };\n }\n return undefined;\n}\n\n/**\n * What the reader is told when a command fails.\n *\n * An expected failure explains itself. Anything else is summarised, never\n * echoed: a git error can carry a remote URL with a token in it.\n */\nfunction failureText(error: unknown): string {\n return error instanceof DoomGitExpectedError ? error.message : 'The worktree operation failed.';\n}\n\n/** Starts one direct-event subscription per managed session. */\nexport function createWorktreesChannel(options: WorktreesChannelOptions = {}): DoomHubChannel {\n // Assigned by start, because receive is reachable only while the channel is\n // running and the command needs the state the direct event subscriptions keep.\n let receiveCommand: ((scope: DoomHubSessionScope, payload: unknown) => void) | undefined;\n\n return {\n frameType: GIT_WORKTREES_TYPE,\n start(host) {\n const sessionService = host.sessionService;\n if (sessionService === undefined) {\n throw new HubUnavailableError('The cockpit session service is unavailable. Start the cockpit and try again.');\n }\n const worktrees =\n options.operations ??\n createWorktreeOperations({\n git: createWorktreeGit(),\n sessionService,\n });\n const views: ViewDeps = { homeDir: options.homeDir, sessionService };\n const latest = new Map<string, SessionState>();\n const subscriptions = new Map<string, () => void>();\n const busy = new Set<string>();\n\n /** Republishes a session, skipping a frame that would say nothing new. */\n const publish = (scope: DoomHubSessionScope, force: boolean): void => {\n const previous = latest.get(scope.sessionId);\n const next: SessionState = {\n worktrees: viewsFor(scope, views),\n pending: previous?.pending,\n error: previous?.error,\n };\n if (\n !force &&\n previous !== undefined &&\n sameList(previous.worktrees, next.worktrees) &&\n previous.pending === next.pending &&\n previous.error === next.error\n ) {\n return;\n }\n latest.set(scope.sessionId, next);\n host.publish(scope.sessionId, payloadOf(next));\n };\n\n const mark = (scope: DoomHubSessionScope, pending: string | undefined, error: string | undefined): void => {\n const previous = latest.get(scope.sessionId);\n latest.set(scope.sessionId, {\n worktrees: previous?.worktrees ?? viewsFor(scope, views),\n pending,\n error,\n });\n publish(scope, true);\n };\n\n /** Announces a successful mutation to this session's lifecycle subscribers. */\n const publishLifecycle = (scope: DoomHubSessionScope, repositoryRoot: string): void => {\n host.directEvents.publish(GIT_WORKTREE_LIFECYCLE_EVENT, scope.sessionId, {\n version: 1,\n repositoryRoot,\n });\n };\n\n const run = async (scope: DoomHubSessionScope, command: GitWorktreesCommand): Promise<void> => {\n const context = { cwd: scope.cwd, sessionId: scope.sessionId };\n if (command.action === 'create') {\n mark(scope, `creating ${command.branch}\\u2026`, undefined);\n const record = await worktrees.spawn(\n context,\n {\n branch: command.branch,\n ...(command.baseRef === undefined ? {} : { baseRef: command.baseRef }),\n },\n // Each phase replaces the label, so the panel says what is\n // happening instead of holding one line for the whole wait.\n { onProgress: (label) => mark(scope, label, undefined) },\n );\n publishLifecycle(scope, record.repositoryRoot);\n return;\n }\n mark(scope, `closing ${command.id}…`, undefined);\n const record = await worktrees.close(context, command.id, command.force ?? false);\n publishLifecycle(scope, record.repositoryRoot);\n };\n\n const source: DoomHubChannelSource = {\n payloadFor(scope) {\n const state = latest.get(scope.sessionId);\n return state === undefined ? undefined : payloadOf(state);\n },\n sessionAdded(scope) {\n publish(scope, false);\n const unsubscribe = host.directEvents.subscribe(GIT_WORKTREE_LIFECYCLE_EVENT, scope.sessionId, (payload) => {\n if (!isWorktreeLifecycleEvent(payload)) return;\n let sameRepository = false;\n try {\n sameRepository =\n registryFile(scope.cwd, options.homeDir) === registryFile(payload.repositoryRoot, options.homeDir);\n } catch {\n sameRepository = false;\n }\n if (sameRepository) publish(scope, false);\n });\n subscriptions.set(scope.sessionId, unsubscribe);\n },\n sessionRemoved(sessionId) {\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n latest.delete(sessionId);\n busy.delete(sessionId);\n },\n close() {\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n latest.clear();\n busy.clear();\n },\n };\n receiveCommand = (scope, payload) => {\n const command = parseCommand(payload);\n if (command === undefined) return;\n // One operation per session. A create runs for minutes, and a second\n // click must not start a second worktree behind the first.\n if (busy.has(scope.sessionId)) return;\n busy.add(scope.sessionId);\n void run(scope, command)\n .then(() => {\n mark(scope, undefined, undefined);\n })\n .catch((error: unknown) => {\n host.onNotice(`worktree command failed for ${scope.sessionId} (${failureText(error)})`);\n mark(scope, undefined, failureText(error));\n })\n .finally(() => {\n busy.delete(scope.sessionId);\n });\n };\n\n return source;\n },\n receive(scope, payload) {\n receiveCommand?.(scope, payload);\n },\n };\n}\n\nexport default createWorktreesChannel;\n"],"mappings":"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"}
|