@cerbur/clutch-dsh-worktree 0.1.15 → 0.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +243 -22
- package/README.zh.md +203 -20
- package/assets/screenshots/screenshots-dashboard.png +0 -0
- package/assets/screenshots/screenshots-en.png +0 -0
- package/assets/screenshots/screenshots-git-reviewer.png +0 -0
- package/assets/screenshots/screenshots-import.png +0 -0
- package/assets/screenshots/screenshots-worktree-tool.png +0 -0
- package/assets/screenshots/screenshots-zh.png +0 -0
- package/cordis.patch.yml +6 -19
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +35 -11
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/command-activity.d.ts +11 -0
- package/lib/client/command-activity.d.ts.map +1 -0
- package/lib/client/command-activity.js +71 -0
- package/lib/client/command-activity.js.map +1 -0
- package/lib/client/dashboard/DashboardRequest.d.ts +11 -0
- package/lib/client/dashboard/DashboardRequest.d.ts.map +1 -0
- package/lib/client/dashboard/DashboardRequest.js +38 -0
- package/lib/client/dashboard/DashboardRequest.js.map +1 -0
- package/lib/client/dashboard/WorktreeDashboard.d.ts +2 -1
- package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.js +89 -59
- package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
- package/lib/client/dashboard/WorktreeInstructions.d.ts +2 -1
- package/lib/client/dashboard/WorktreeInstructions.d.ts.map +1 -1
- package/lib/client/dashboard/WorktreeInstructions.js +27 -8
- package/lib/client/dashboard/WorktreeInstructions.js.map +1 -1
- package/lib/client/dashboard/dashboard-overlay.d.ts.map +1 -1
- package/lib/client/dashboard/dashboard-overlay.js +38 -42
- package/lib/client/dashboard/dashboard-overlay.js.map +1 -1
- package/lib/client/dashboard/dashboard-selection.d.ts +1 -0
- package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -1
- package/lib/client/dashboard/dashboard-selection.js.map +1 -1
- package/lib/client/dashboard/git/WorktreeGitPanel.d.ts +2 -1
- package/lib/client/dashboard/git/WorktreeGitPanel.d.ts.map +1 -1
- package/lib/client/dashboard/git/WorktreeGitPanel.js +54 -8
- package/lib/client/dashboard/git/WorktreeGitPanel.js.map +1 -1
- package/lib/client/dashboard/git/file-address.d.ts +2 -1
- package/lib/client/dashboard/git/file-address.d.ts.map +1 -1
- package/lib/client/dashboard/git/file-address.js +8 -13
- package/lib/client/dashboard/git/file-address.js.map +1 -1
- package/lib/client/dashboard/git/useWorktreeGitState.d.ts.map +1 -1
- package/lib/client/dashboard/git/useWorktreeGitState.js +4 -1
- package/lib/client/dashboard/git/useWorktreeGitState.js.map +1 -1
- package/lib/client/dsh-icons.d.ts +2 -0
- package/lib/client/dsh-icons.d.ts.map +1 -1
- package/lib/client/dsh-icons.js +3 -1
- package/lib/client/dsh-icons.js.map +1 -1
- package/lib/client/dsh-slot-contract.d.ts +9 -1
- package/lib/client/dsh-slot-contract.d.ts.map +1 -1
- package/lib/client/entry.d.ts.map +1 -1
- package/lib/client/entry.js +57 -1
- package/lib/client/entry.js.map +1 -1
- package/lib/client/layout/app-frame.d.ts +12 -0
- package/lib/client/layout/app-frame.d.ts.map +1 -0
- package/lib/client/layout/app-frame.js +82 -0
- package/lib/client/layout/app-frame.js.map +1 -0
- package/lib/client/locales.d.ts +150 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +208 -58
- package/lib/client/locales.js.map +1 -1
- package/lib/client/overlay/overlay-bounds.d.ts.map +1 -1
- package/lib/client/overlay/overlay-bounds.js +8 -3
- package/lib/client/overlay/overlay-bounds.js.map +1 -1
- package/lib/client/overlay/sidebar-overlay-geometry.d.ts +6 -0
- package/lib/client/overlay/sidebar-overlay-geometry.d.ts.map +1 -1
- package/lib/client/overlay/sidebar-overlay-geometry.js +180 -32
- package/lib/client/overlay/sidebar-overlay-geometry.js.map +1 -1
- package/lib/client/restart-notice.d.ts +25 -0
- package/lib/client/restart-notice.d.ts.map +1 -0
- package/lib/client/restart-notice.js +97 -0
- package/lib/client/restart-notice.js.map +1 -0
- package/lib/client/session/session-view.d.ts +16 -2
- package/lib/client/session/session-view.d.ts.map +1 -1
- package/lib/client/session/session-view.js +24 -10
- package/lib/client/session/session-view.js.map +1 -1
- package/lib/client/session/worktree-session.d.ts +1 -0
- package/lib/client/session/worktree-session.d.ts.map +1 -1
- package/lib/client/session/worktree-session.js +3 -1
- package/lib/client/session/worktree-session.js.map +1 -1
- package/lib/client/settings/ToolSettings.d.ts +9 -0
- package/lib/client/settings/ToolSettings.d.ts.map +1 -0
- package/lib/client/settings/ToolSettings.js +77 -0
- package/lib/client/settings/ToolSettings.js.map +1 -0
- package/lib/client/settings/WorktreeSettings.d.ts +8 -0
- package/lib/client/settings/WorktreeSettings.d.ts.map +1 -0
- package/lib/client/settings/WorktreeSettings.js +46 -0
- package/lib/client/settings/WorktreeSettings.js.map +1 -0
- package/lib/client/settings/WorktreeSettingsNavIcon.d.ts +6 -0
- package/lib/client/settings/WorktreeSettingsNavIcon.d.ts.map +1 -0
- package/lib/client/settings/WorktreeSettingsNavIcon.js +51 -0
- package/lib/client/settings/WorktreeSettingsNavIcon.js.map +1 -0
- package/lib/client/settings/diagnostics.d.ts +24 -0
- package/lib/client/settings/diagnostics.d.ts.map +1 -0
- package/lib/client/settings/diagnostics.js +63 -0
- package/lib/client/settings/diagnostics.js.map +1 -0
- package/lib/client/settings/settings-navigation.d.ts +7 -0
- package/lib/client/settings/settings-navigation.d.ts.map +1 -0
- package/lib/client/settings/settings-navigation.js +12 -0
- package/lib/client/settings/settings-navigation.js.map +1 -0
- package/lib/client/surface/actions/useLifecycleActions.d.ts +2 -1
- package/lib/client/surface/actions/useLifecycleActions.d.ts.map +1 -1
- package/lib/client/surface/actions/useLifecycleActions.js +14 -5
- package/lib/client/surface/actions/useLifecycleActions.js.map +1 -1
- package/lib/client/surface/actions/useSessionActions.d.ts.map +1 -1
- package/lib/client/surface/actions/useSessionActions.js +6 -6
- package/lib/client/surface/actions/useSessionActions.js.map +1 -1
- package/lib/client/surface/actions/useWorktreeRegistration.d.ts.map +1 -1
- package/lib/client/surface/actions/useWorktreeRegistration.js +4 -2
- package/lib/client/surface/actions/useWorktreeRegistration.js.map +1 -1
- package/lib/client/surface/components/AnimatedTree.d.ts +32 -0
- package/lib/client/surface/components/AnimatedTree.d.ts.map +1 -0
- package/lib/client/surface/components/AnimatedTree.js +139 -0
- package/lib/client/surface/components/AnimatedTree.js.map +1 -0
- package/lib/client/surface/components/NotificationToasts.d.ts +19 -3
- package/lib/client/surface/components/NotificationToasts.d.ts.map +1 -1
- package/lib/client/surface/components/NotificationToasts.js +73 -7
- package/lib/client/surface/components/NotificationToasts.js.map +1 -1
- package/lib/client/surface/components/OverlayScrollbar.d.ts +6 -0
- package/lib/client/surface/components/OverlayScrollbar.d.ts.map +1 -0
- package/lib/client/surface/components/OverlayScrollbar.js +84 -0
- package/lib/client/surface/components/OverlayScrollbar.js.map +1 -0
- package/lib/client/surface/components/RestartToast.d.ts +6 -0
- package/lib/client/surface/components/RestartToast.d.ts.map +1 -0
- package/lib/client/surface/components/RestartToast.js +11 -0
- package/lib/client/surface/components/RestartToast.js.map +1 -0
- package/lib/client/surface/components/SurfaceContent.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceContent.js +110 -39
- package/lib/client/surface/components/SurfaceContent.js.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.d.ts.map +1 -1
- package/lib/client/surface/components/WorkspaceTree.js +7 -2
- package/lib/client/surface/components/WorkspaceTree.js.map +1 -1
- package/lib/client/surface/components/dialogs.d.ts.map +1 -1
- package/lib/client/surface/components/dialogs.js +16 -10
- package/lib/client/surface/components/dialogs.js.map +1 -1
- package/lib/client/surface/components/rows.d.ts +1 -1
- package/lib/client/surface/components/rows.d.ts.map +1 -1
- package/lib/client/surface/components/rows.js +24 -101
- package/lib/client/surface/components/rows.js.map +1 -1
- package/lib/client/surface/notification-queue.d.ts +15 -0
- package/lib/client/surface/notification-queue.d.ts.map +1 -1
- package/lib/client/surface/notification-queue.js +13 -2
- package/lib/client/surface/notification-queue.js.map +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.d.ts +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.js +13 -1
- package/lib/client/surface/state/useSurfaceRefresh.js.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.d.ts +2 -1
- package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.js +7 -5
- package/lib/client/surface/state/useSurfaceSources.js.map +1 -1
- package/lib/client/surface/state/useTitleMarquee.d.ts +7 -0
- package/lib/client/surface/state/useTitleMarquee.d.ts.map +1 -0
- package/lib/client/surface/state/useTitleMarquee.js +60 -0
- package/lib/client/surface/state/useTitleMarquee.js.map +1 -0
- package/lib/client/surface/types.d.ts +8 -1
- package/lib/client/surface/types.d.ts.map +1 -1
- package/lib/client/view/worktree-error-copy.d.ts.map +1 -1
- package/lib/client/view/worktree-error-copy.js +69 -8
- package/lib/client/view/worktree-error-copy.js.map +1 -1
- package/lib/client/view/worktree-view-errors.d.ts.map +1 -1
- package/lib/client/view/worktree-view-errors.js +13 -5
- package/lib/client/view/worktree-view-errors.js.map +1 -1
- package/lib/client/view/worktree-view-read.d.ts +3 -0
- package/lib/client/view/worktree-view-read.d.ts.map +1 -1
- package/lib/client/view/worktree-view-read.js +9 -0
- package/lib/client/view/worktree-view-read.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +14 -2
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +20 -2
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client/worktree-tool-changes.d.ts +13 -0
- package/lib/client/worktree-tool-changes.d.ts.map +1 -0
- package/lib/client/worktree-tool-changes.js +64 -0
- package/lib/client/worktree-tool-changes.js.map +1 -0
- package/lib/client.js +2791 -1131
- package/lib/client.js.map +1 -1
- package/lib/contract/index.d.ts +12 -2
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +10 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/contract/tool-settings.d.ts +28 -0
- package/lib/contract/tool-settings.d.ts.map +1 -0
- package/lib/contract/tool-settings.js +10 -0
- package/lib/contract/tool-settings.js.map +1 -0
- package/lib/contract/worktree-tool-changes.d.ts +10 -0
- package/lib/contract/worktree-tool-changes.d.ts.map +1 -0
- package/lib/contract/worktree-tool-changes.js +2 -0
- package/lib/contract/worktree-tool-changes.js.map +1 -0
- package/lib/host/permission-preset-append.d.ts +15 -0
- package/lib/host/permission-preset-append.d.ts.map +1 -0
- package/lib/host/permission-preset-append.js +63 -0
- package/lib/host/permission-preset-append.js.map +1 -0
- package/lib/host/service.d.ts +17 -0
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +67 -11
- package/lib/host/service.js.map +1 -1
- package/lib/host/tool-settings.d.ts +14 -0
- package/lib/host/tool-settings.d.ts.map +1 -0
- package/lib/host/tool-settings.js +98 -0
- package/lib/host/tool-settings.js.map +1 -0
- package/lib/host/worktree-permission-manager.d.ts.map +1 -1
- package/lib/host/worktree-permission-manager.js +2 -4
- package/lib/host/worktree-permission-manager.js.map +1 -1
- package/lib/host/worktree-tool-changes.d.ts +12 -0
- package/lib/host/worktree-tool-changes.d.ts.map +1 -0
- package/lib/host/worktree-tool-changes.js +60 -0
- package/lib/host/worktree-tool-changes.js.map +1 -0
- package/lib/manage/manager-git-history.d.ts.map +1 -1
- package/lib/manage/manager-git-history.js +43 -38
- package/lib/manage/manager-git-history.js.map +1 -1
- package/lib/manage/manager-sessions.d.ts +5 -0
- package/lib/manage/manager-sessions.d.ts.map +1 -1
- package/lib/manage/manager-sessions.js +35 -12
- package/lib/manage/manager-sessions.js.map +1 -1
- package/lib/manage/manager-support.d.ts +10 -2
- package/lib/manage/manager-support.d.ts.map +1 -1
- package/lib/manage/manager-support.js +90 -14
- package/lib/manage/manager-support.js.map +1 -1
- package/lib/manage/manager-worktree-lifecycle.d.ts.map +1 -1
- package/lib/manage/manager-worktree-lifecycle.js +5 -4
- package/lib/manage/manager-worktree-lifecycle.js.map +1 -1
- package/lib/manage/manager-worktrees.d.ts +1 -0
- package/lib/manage/manager-worktrees.d.ts.map +1 -1
- package/lib/manage/manager-worktrees.js +80 -26
- package/lib/manage/manager-worktrees.js.map +1 -1
- package/lib/manage/manager.d.ts +10 -0
- package/lib/manage/manager.d.ts.map +1 -1
- package/lib/manage/manager.js +14 -3
- package/lib/manage/manager.js.map +1 -1
- package/lib/manage/types.d.ts +10 -1
- package/lib/manage/types.d.ts.map +1 -1
- package/lib/provider/generated-name.d.ts.map +1 -1
- package/lib/provider/generated-name.js +5 -4
- package/lib/provider/generated-name.js.map +1 -1
- package/lib/provider/git/adapter.d.ts.map +1 -1
- package/lib/provider/git/adapter.js +5 -2
- package/lib/provider/git/adapter.js.map +1 -1
- package/lib/provider/mutation-token.d.ts +1 -1
- package/lib/provider/mutation-token.d.ts.map +1 -1
- package/lib/provider/mutation-token.js +1 -0
- package/lib/provider/mutation-token.js.map +1 -1
- package/lib/provider/sidecar/repository.d.ts.map +1 -1
- package/lib/provider/sidecar/repository.js +1 -0
- package/lib/provider/sidecar/repository.js.map +1 -1
- package/lib/provider/sidecar/sidecar-schema.d.ts.map +1 -1
- package/lib/provider/sidecar/sidecar-schema.js +24 -4
- package/lib/provider/sidecar/sidecar-schema.js.map +1 -1
- package/lib/provider/transaction/operations/adopt-branch.d.ts.map +1 -1
- package/lib/provider/transaction/operations/adopt-branch.js +6 -5
- package/lib/provider/transaction/operations/adopt-branch.js.map +1 -1
- package/lib/provider/transaction/operations/clean.d.ts.map +1 -1
- package/lib/provider/transaction/operations/clean.js +20 -19
- package/lib/provider/transaction/operations/clean.js.map +1 -1
- package/lib/provider/transaction/operations/create.d.ts +1 -1
- package/lib/provider/transaction/operations/create.d.ts.map +1 -1
- package/lib/provider/transaction/operations/create.js +23 -13
- package/lib/provider/transaction/operations/create.js.map +1 -1
- package/lib/provider/transaction/operations/import.d.ts.map +1 -1
- package/lib/provider/transaction/operations/import.js +7 -1
- package/lib/provider/transaction/operations/import.js.map +1 -1
- package/lib/provider/transaction/operations/remove.d.ts.map +1 -1
- package/lib/provider/transaction/operations/remove.js +20 -19
- package/lib/provider/transaction/operations/remove.js.map +1 -1
- package/lib/provider/transaction/recovery/failure-recovery.d.ts.map +1 -1
- package/lib/provider/transaction/recovery/failure-recovery.js +19 -18
- package/lib/provider/transaction/recovery/failure-recovery.js.map +1 -1
- package/lib/provider/transaction/recovery/recover.d.ts.map +1 -1
- package/lib/provider/transaction/recovery/recover.js +6 -2
- package/lib/provider/transaction/recovery/recover.js.map +1 -1
- package/lib/provider/transaction/support/inspection.d.ts.map +1 -1
- package/lib/provider/transaction/support/inspection.js +3 -2
- package/lib/provider/transaction/support/inspection.js.map +1 -1
- package/lib/provider/transaction/support/journal.d.ts.map +1 -1
- package/lib/provider/transaction/support/journal.js +8 -5
- package/lib/provider/transaction/support/journal.js.map +1 -1
- package/lib/provider/transaction/support/path-safety.d.ts.map +1 -1
- package/lib/provider/transaction/support/path-safety.js +4 -3
- package/lib/provider/transaction/support/path-safety.js.map +1 -1
- package/lib/provider/transaction/types.d.ts +2 -1
- package/lib/provider/transaction/types.d.ts.map +1 -1
- package/lib/provider/types.d.ts +3 -1
- package/lib/provider/types.d.ts.map +1 -1
- package/lib/provider/types.js +1 -1
- package/lib/provider/types.js.map +1 -1
- package/lib/provider/worktree-path.d.ts +10 -0
- package/lib/provider/worktree-path.d.ts.map +1 -0
- package/lib/provider/worktree-path.js +47 -0
- package/lib/provider/worktree-path.js.map +1 -0
- package/lib/tool/context.d.ts +14 -0
- package/lib/tool/context.d.ts.map +1 -0
- package/lib/tool/context.js +95 -0
- package/lib/tool/context.js.map +1 -0
- package/lib/tool/delegation.d.ts +41 -0
- package/lib/tool/delegation.d.ts.map +1 -0
- package/lib/tool/delegation.js +196 -0
- package/lib/tool/delegation.js.map +1 -0
- package/lib/tool/errors.d.ts +3 -0
- package/lib/tool/errors.d.ts.map +1 -0
- package/lib/tool/errors.js +63 -0
- package/lib/tool/errors.js.map +1 -0
- package/lib/tool/guidance.d.ts +5 -0
- package/lib/tool/guidance.d.ts.map +1 -0
- package/lib/tool/guidance.js +48 -0
- package/lib/tool/guidance.js.map +1 -0
- package/lib/tool/history.d.ts +27 -0
- package/lib/tool/history.d.ts.map +1 -0
- package/lib/tool/history.js +157 -0
- package/lib/tool/history.js.map +1 -0
- package/lib/tool/index.d.ts +8 -0
- package/lib/tool/index.d.ts.map +1 -0
- package/lib/tool/index.js +296 -0
- package/lib/tool/index.js.map +1 -0
- package/lib/tool/inputs.d.ts +12 -0
- package/lib/tool/inputs.d.ts.map +1 -0
- package/lib/tool/inputs.js +24 -0
- package/lib/tool/inputs.js.map +1 -0
- package/lib/tool/list-models.d.ts +3 -0
- package/lib/tool/list-models.d.ts.map +1 -0
- package/lib/tool/list-models.js +38 -0
- package/lib/tool/list-models.js.map +1 -0
- package/lib/tool/list-sessions.d.ts +3 -0
- package/lib/tool/list-sessions.d.ts.map +1 -0
- package/lib/tool/list-sessions.js +70 -0
- package/lib/tool/list-sessions.js.map +1 -0
- package/lib/tool/list-worktrees.d.ts +3 -0
- package/lib/tool/list-worktrees.d.ts.map +1 -0
- package/lib/tool/list-worktrees.js +39 -0
- package/lib/tool/list-worktrees.js.map +1 -0
- package/lib/tool/native-session.d.ts +74 -0
- package/lib/tool/native-session.d.ts.map +1 -0
- package/lib/tool/native-session.js +248 -0
- package/lib/tool/native-session.js.map +1 -0
- package/lib/tool/new-worktree.d.ts +3 -0
- package/lib/tool/new-worktree.d.ts.map +1 -0
- package/lib/tool/new-worktree.js +81 -0
- package/lib/tool/new-worktree.js.map +1 -0
- package/lib/tool/outputs.d.ts +50 -0
- package/lib/tool/outputs.d.ts.map +1 -0
- package/lib/tool/outputs.js +65 -0
- package/lib/tool/outputs.js.map +1 -0
- package/lib/tool/report-result.d.ts +3 -0
- package/lib/tool/report-result.d.ts.map +1 -0
- package/lib/tool/report-result.js +83 -0
- package/lib/tool/report-result.js.map +1 -0
- package/lib/tool/schema.d.ts +7 -0
- package/lib/tool/schema.d.ts.map +1 -0
- package/lib/tool/schema.js +92 -0
- package/lib/tool/schema.js.map +1 -0
- package/lib/tool/send-message.d.ts +3 -0
- package/lib/tool/send-message.d.ts.map +1 -0
- package/lib/tool/send-message.js +64 -0
- package/lib/tool/send-message.js.map +1 -0
- package/lib/tool/span-worktree.d.ts +3 -0
- package/lib/tool/span-worktree.d.ts.map +1 -0
- package/lib/tool/span-worktree.js +114 -0
- package/lib/tool/span-worktree.js.map +1 -0
- package/lib/tool/types.d.ts +54 -0
- package/lib/tool/types.d.ts.map +1 -0
- package/lib/tool/types.js +2 -0
- package/lib/tool/types.js.map +1 -0
- package/lib/typert.host.js +237 -66
- package/lib/typert.remote-client.d.ts +7 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +237 -66
- package/package.json +55 -43
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, open, readFile, rename, unlink } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { WORKTREE_TOOL_IDS, } from '../contract/tool-settings.js';
|
|
5
|
+
/** Preferences have their own files; relationship shards never contain tool configuration. */
|
|
6
|
+
export class WorktreeToolSettings {
|
|
7
|
+
dshHome;
|
|
8
|
+
queue = Promise.resolve();
|
|
9
|
+
listeners = new Set();
|
|
10
|
+
constructor(dshHome) {
|
|
11
|
+
this.dshHome = dshHome;
|
|
12
|
+
}
|
|
13
|
+
subscribe(listener) {
|
|
14
|
+
this.listeners.add(listener);
|
|
15
|
+
return () => this.listeners.delete(listener);
|
|
16
|
+
}
|
|
17
|
+
filename(scope) {
|
|
18
|
+
const root = path.join(this.dshHome, 'clutch-dsh-worktree', 'tool-settings');
|
|
19
|
+
if (scope.kind === 'general')
|
|
20
|
+
return path.join(root, 'general.json');
|
|
21
|
+
if (scope.kind === 'local' && scope.workspaceId)
|
|
22
|
+
return path.join(root, 'locals', 'ws-' + encodeURIComponent(scope.workspaceId) + '.json');
|
|
23
|
+
if (scope.kind !== 'worktree' || !scope.workspaceId || !scope.worktreeId)
|
|
24
|
+
throw new Error('Invalid tool settings scope');
|
|
25
|
+
return path.join(root, 'worktrees', 'ws-' + encodeURIComponent(scope.workspaceId), 'wt-' + encodeURIComponent(scope.worktreeId) + '.json');
|
|
26
|
+
}
|
|
27
|
+
async read(scope) {
|
|
28
|
+
try {
|
|
29
|
+
const text = await readFile(this.filename(scope), 'utf8');
|
|
30
|
+
if (text.length > 32_000)
|
|
31
|
+
throw new Error('Tool settings file is too large');
|
|
32
|
+
const data = JSON.parse(text);
|
|
33
|
+
if (data.version !== 1)
|
|
34
|
+
throw new Error('Unsupported tool settings version');
|
|
35
|
+
return normalizeToolSelection(data.selection);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error.code !== 'ENOENT')
|
|
39
|
+
throw error;
|
|
40
|
+
return { enabled: false, tools: [...WORKTREE_TOOL_IDS] };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
update(scope, selection, expected) {
|
|
44
|
+
const operation = this.queue.then(async () => {
|
|
45
|
+
const next = normalizeToolSelection(selection);
|
|
46
|
+
const current = await this.read(scope);
|
|
47
|
+
if (JSON.stringify(current) !== JSON.stringify(normalizeToolSelection(expected)))
|
|
48
|
+
throw new Error('Tool settings changed elsewhere. Reload the settings and try again.');
|
|
49
|
+
const filename = this.filename(scope);
|
|
50
|
+
const directory = path.dirname(filename);
|
|
51
|
+
await mkdir(directory, { recursive: true });
|
|
52
|
+
const temporary = filename + '.' + randomUUID() + '.tmp';
|
|
53
|
+
try {
|
|
54
|
+
const handle = await open(temporary, 'wx', 0o600);
|
|
55
|
+
try {
|
|
56
|
+
await handle.writeFile(JSON.stringify({ version: 1, selection: next }) + '\n');
|
|
57
|
+
await handle.sync();
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
await handle.close();
|
|
61
|
+
}
|
|
62
|
+
await rename(temporary, filename);
|
|
63
|
+
// Only directory syncing is best effort; file syncing must succeed before publication.
|
|
64
|
+
try {
|
|
65
|
+
const directoryHandle = await open(directory, 'r');
|
|
66
|
+
try {
|
|
67
|
+
await directoryHandle.sync();
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await directoryHandle.close();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* Filesystems may not support directory syncing. */
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await unlink(temporary).catch(() => undefined);
|
|
79
|
+
}
|
|
80
|
+
for (const listener of this.listeners)
|
|
81
|
+
listener(scope, next);
|
|
82
|
+
return next;
|
|
83
|
+
});
|
|
84
|
+
this.queue = operation.catch(() => undefined);
|
|
85
|
+
return operation;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function normalizeToolSelection(value) {
|
|
89
|
+
const selection = value;
|
|
90
|
+
if (!selection ||
|
|
91
|
+
typeof selection.enabled !== 'boolean' ||
|
|
92
|
+
!Array.isArray(selection.tools) ||
|
|
93
|
+
selection.tools.some((tool) => !WORKTREE_TOOL_IDS.includes(tool)))
|
|
94
|
+
throw new Error('Invalid Worktree tool selection');
|
|
95
|
+
const tools = WORKTREE_TOOL_IDS.filter((tool) => selection.tools.includes(tool));
|
|
96
|
+
return { enabled: selection.enabled && tools.length > 0, tools };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=tool-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-settings.js","sourceRoot":"","sources":["../../src/host/tool-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-permission-manager.d.ts","sourceRoot":"","sources":["../../src/host/worktree-permission-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktree-permission-manager.d.ts","sourceRoot":"","sources":["../../src/host/worktree-permission-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,yBAAyB,EAEzB,sBAAsB,EAGvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,GAAG,cAAc,CAAC,CAAC;IAC1E,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAyBD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,gCAAgC,GACxC,yBAAyB,CAkJ3B"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
1
|
import { providerError } from '../provider/types.js';
|
|
3
|
-
import {
|
|
2
|
+
import { boundSessionCwdMatchesWorktree } from '../provider/worktree-path.js';
|
|
4
3
|
function unverified() {
|
|
5
4
|
return { status: 'unverified', retryable: true };
|
|
6
5
|
}
|
|
@@ -60,8 +59,7 @@ export function createWorktreePermissionManager(options) {
|
|
|
60
59
|
sessionId: input.sessionId,
|
|
61
60
|
});
|
|
62
61
|
}
|
|
63
|
-
const sessionCwdMatches =
|
|
64
|
-
await samePhysicalPath(session.cwd, worktree.absolutePath);
|
|
62
|
+
const sessionCwdMatches = await boundSessionCwdMatchesWorktree(session.cwd, worktree);
|
|
65
63
|
if ((session.workspaceId !== undefined && session.workspaceId !== workspace.workspaceId) ||
|
|
66
64
|
!sessionCwdMatches) {
|
|
67
65
|
throw providerError('SESSION_CWD_MISMATCH', `Session "${input.sessionId}" does not belong to this Worktree`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-permission-manager.js","sourceRoot":"","sources":["../../src/host/worktree-permission-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worktree-permission-manager.js","sourceRoot":"","sources":["../../src/host/worktree-permission-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WorktreeToolChangeBatch } from '../contract/worktree-tool-changes.js';
|
|
2
|
+
/** Coalesced identities and bounded long-poll lifetime; no Git or Session facts. */
|
|
3
|
+
export declare class WorktreeToolChanges {
|
|
4
|
+
private revision;
|
|
5
|
+
private readonly latest;
|
|
6
|
+
private readonly waiters;
|
|
7
|
+
private disposed;
|
|
8
|
+
changed(workspaceId: string, worktreeId: string): void;
|
|
9
|
+
watch(afterRevision: number, signal: AbortSignal): Promise<WorktreeToolChangeBatch>;
|
|
10
|
+
dispose(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=worktree-tool-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-tool-changes.d.ts","sourceRoot":"","sources":["../../src/host/worktree-tool-changes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAEpF,oFAAoF;AACpF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGnB;IACJ,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAUhD,KAAK,CACT,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,uBAAuB,CAAC;IAgCnC,OAAO,IAAI,IAAI;CAKhB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** Coalesced identities and bounded long-poll lifetime; no Git or Session facts. */
|
|
2
|
+
export class WorktreeToolChanges {
|
|
3
|
+
revision = 0;
|
|
4
|
+
latest = new Map();
|
|
5
|
+
waiters = new Set();
|
|
6
|
+
disposed = false;
|
|
7
|
+
changed(workspaceId, worktreeId) {
|
|
8
|
+
if (this.disposed)
|
|
9
|
+
return;
|
|
10
|
+
this.latest.set(workspaceId, {
|
|
11
|
+
revision: ++this.revision,
|
|
12
|
+
workspaceId,
|
|
13
|
+
worktreeId,
|
|
14
|
+
});
|
|
15
|
+
for (const wake of [...this.waiters])
|
|
16
|
+
wake();
|
|
17
|
+
}
|
|
18
|
+
async watch(afterRevision, signal) {
|
|
19
|
+
signal.throwIfAborted();
|
|
20
|
+
if (!Number.isSafeInteger(afterRevision) || afterRevision < 0)
|
|
21
|
+
throw new Error('Invalid revision');
|
|
22
|
+
if (this.disposed)
|
|
23
|
+
throw new Error('Worktree plugin is disposed');
|
|
24
|
+
if (afterRevision === this.revision) {
|
|
25
|
+
await new Promise((resolve, reject) => {
|
|
26
|
+
const done = (error) => {
|
|
27
|
+
clearTimeout(timer);
|
|
28
|
+
this.waiters.delete(wake);
|
|
29
|
+
signal.removeEventListener('abort', abort);
|
|
30
|
+
if (error)
|
|
31
|
+
reject(error);
|
|
32
|
+
else
|
|
33
|
+
resolve();
|
|
34
|
+
};
|
|
35
|
+
const wake = () => done();
|
|
36
|
+
const abort = () => done(signal.reason ?? new Error('Aborted'));
|
|
37
|
+
const timer = setTimeout(wake, 20000);
|
|
38
|
+
this.waiters.add(wake);
|
|
39
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
signal.throwIfAborted();
|
|
43
|
+
if (this.disposed)
|
|
44
|
+
throw new Error('Worktree plugin is disposed');
|
|
45
|
+
const baseline = afterRevision > this.revision ? 0 : afterRevision;
|
|
46
|
+
return {
|
|
47
|
+
revision: this.revision,
|
|
48
|
+
changes: [...this.latest.values()]
|
|
49
|
+
.filter((change) => change.revision > baseline)
|
|
50
|
+
.map(({ workspaceId, worktreeId }) => ({ workspaceId, worktreeId })),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
dispose() {
|
|
54
|
+
this.disposed = true;
|
|
55
|
+
for (const wake of [...this.waiters])
|
|
56
|
+
wake();
|
|
57
|
+
this.latest.clear();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=worktree-tool-changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-tool-changes.js","sourceRoot":"","sources":["../../src/host/worktree-tool-changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager-git-history.d.ts","sourceRoot":"","sources":["../../src/manage/manager-git-history.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager-git-history.d.ts","sourceRoot":"","sources":["../../src/manage/manager-git-history.ts"],"names":[],"mappings":"AACA,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAElC,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EAExB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AA4RnE,iFAAiF;AACjF,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE;IACL,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC,GACA,OAAO,CAAC,MAAM,CAAC,CA4EjB;AAwRD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACjG,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAuYD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAiEjC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,mBAAmB,CAAC,CA0I9B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { gitWorktreeRoot } from '../contract/index.js';
|
|
1
2
|
import { WORKTREE_GIT_COMMIT_PATTERN, WORKTREE_GIT_SUMMARY, WORKTREE_GIT_WORKING_TREE, } from '../contract/index.js';
|
|
2
3
|
import { providerError } from '../provider/types.js';
|
|
3
4
|
import { isDirectory, requireWorkspace, samePhysicalPath } from './manager-support.js';
|
|
@@ -59,7 +60,11 @@ async function findLiveWorktree(worktrees, absolutePath) {
|
|
|
59
60
|
async function resolveWorktree(context, input) {
|
|
60
61
|
const workspace = await requireWorkspace(context, input.workspaceId);
|
|
61
62
|
if (isMainWorktreeId(input.worktreeId, input.workspaceId)) {
|
|
62
|
-
|
|
63
|
+
// The imported Workspace can be nested, while committed Git paths are root-relative.
|
|
64
|
+
const repositoryRoot = context.git.resolveRepositoryRoot
|
|
65
|
+
? await context.git.resolveRepositoryRoot(workspace.rootPath, { signal: context.signal })
|
|
66
|
+
: workspace.rootPath;
|
|
67
|
+
return { main: true, workspaceRoot: workspace.rootPath, repositoryRoot };
|
|
63
68
|
}
|
|
64
69
|
const snapshot = await context.sidecar.read(input.workspaceId);
|
|
65
70
|
if (snapshot.pendingOperation !== undefined || (snapshot.recoveryIssues?.length ?? 0) > 0) {
|
|
@@ -81,22 +86,22 @@ async function resolveWorktree(context, input) {
|
|
|
81
86
|
worktreeId: input.worktreeId,
|
|
82
87
|
});
|
|
83
88
|
}
|
|
84
|
-
if (!(await isDirectory(record
|
|
85
|
-
throw providerError('WORKTREE_NOT_FOUND', `Worktree directory is unavailable: ${record
|
|
89
|
+
if (!(await isDirectory(gitWorktreeRoot(record)))) {
|
|
90
|
+
throw providerError('WORKTREE_NOT_FOUND', `Worktree directory is unavailable: ${gitWorktreeRoot(record)}`, {
|
|
86
91
|
workspaceId: input.workspaceId,
|
|
87
92
|
worktreeId: input.worktreeId,
|
|
88
|
-
absolutePath: record
|
|
93
|
+
absolutePath: gitWorktreeRoot(record),
|
|
89
94
|
});
|
|
90
95
|
}
|
|
91
96
|
const repositoryRoot = context.git.resolveRepositoryRoot
|
|
92
97
|
? await context.git.resolveRepositoryRoot(workspace.rootPath, { signal: context.signal })
|
|
93
98
|
: workspace.rootPath;
|
|
94
|
-
const live = await findLiveWorktree(await context.git.listWorktrees(repositoryRoot, { signal: context.signal }), record
|
|
99
|
+
const live = await findLiveWorktree(await context.git.listWorktrees(repositoryRoot, { signal: context.signal }), gitWorktreeRoot(record));
|
|
95
100
|
if (!live) {
|
|
96
|
-
throw providerError('WORKTREE_NOT_FOUND', `Git Worktree registration is unavailable: ${record
|
|
101
|
+
throw providerError('WORKTREE_NOT_FOUND', `Git Worktree registration is unavailable: ${gitWorktreeRoot(record)}`, {
|
|
97
102
|
workspaceId: input.workspaceId,
|
|
98
103
|
worktreeId: input.worktreeId,
|
|
99
|
-
absolutePath: record
|
|
104
|
+
absolutePath: gitWorktreeRoot(record),
|
|
100
105
|
});
|
|
101
106
|
}
|
|
102
107
|
return {
|
|
@@ -151,7 +156,7 @@ async function resolveLocalBranchCommit(context, resolved, baseBranch, options =
|
|
|
151
156
|
return undefined;
|
|
152
157
|
unavailable();
|
|
153
158
|
}
|
|
154
|
-
const commit = await resolveCommit(resolved.record
|
|
159
|
+
const commit = await resolveCommit(gitWorktreeRoot(resolved.record), baseBranch, {
|
|
155
160
|
signal: context.signal,
|
|
156
161
|
});
|
|
157
162
|
if (!COMMIT_PATTERN.test(commit)) {
|
|
@@ -178,7 +183,7 @@ async function resolveSelectedBaseline(context, resolved, rawBranch) {
|
|
|
178
183
|
const headCommit = await baselineHeadCommit(context, resolved);
|
|
179
184
|
const findMergeBase = gitReadOptional(context, 'findMergeBase');
|
|
180
185
|
const mergeBase = headCommit !== undefined && findMergeBase !== undefined
|
|
181
|
-
? await findMergeBase(resolved.record
|
|
186
|
+
? await findMergeBase(gitWorktreeRoot(resolved.record), commit, headCommit, { signal: context.signal })
|
|
182
187
|
: undefined;
|
|
183
188
|
if (mergeBase !== undefined && !COMMIT_PATTERN.test(mergeBase)) {
|
|
184
189
|
throw providerError('GIT_OPERATION_FAILED', 'Git returned an invalid selected branch merge base', {
|
|
@@ -280,7 +285,7 @@ async function resolveBaseline(context, resolved, requestedBaseBranch) {
|
|
|
280
285
|
});
|
|
281
286
|
}
|
|
282
287
|
const commit = context.git.resolveCommit
|
|
283
|
-
? await context.git.resolveCommit(record
|
|
288
|
+
? await context.git.resolveCommit(gitWorktreeRoot(record), record.baseCommit, { signal: context.signal })
|
|
284
289
|
: record.baseCommit;
|
|
285
290
|
return {
|
|
286
291
|
baseline: {
|
|
@@ -301,7 +306,7 @@ async function resolveBaseline(context, resolved, requestedBaseBranch) {
|
|
|
301
306
|
if (currentBranch === undefined || currentBranch === record.baseBranch || context.git.findMergeBase === undefined) {
|
|
302
307
|
return undefined;
|
|
303
308
|
}
|
|
304
|
-
const commit = await context.git.findMergeBase(record
|
|
309
|
+
const commit = await context.git.findMergeBase(gitWorktreeRoot(record), record.baseBranch, 'HEAD', { signal: context.signal });
|
|
305
310
|
if (commit === undefined)
|
|
306
311
|
return undefined;
|
|
307
312
|
if (!COMMIT_PATTERN.test(commit)) {
|
|
@@ -332,7 +337,7 @@ async function baselineHeadCommit(context, resolved) {
|
|
|
332
337
|
const resolveCommit = gitReadOptional(context, 'resolveCommit');
|
|
333
338
|
return resolveCommit === undefined
|
|
334
339
|
? undefined
|
|
335
|
-
: await resolveCommit(resolved.record
|
|
340
|
+
: await resolveCommit(gitWorktreeRoot(resolved.record), 'HEAD', { signal: context.signal });
|
|
336
341
|
}
|
|
337
342
|
/** Count commits unique to each head for one resolved comparison boundary. */
|
|
338
343
|
async function readCommitDivergence(context, resolved, comparison, head) {
|
|
@@ -341,7 +346,7 @@ async function readCommitDivergence(context, resolved, comparison, head) {
|
|
|
341
346
|
return undefined;
|
|
342
347
|
// Count each branch from its current tip. The tree boundary may be the
|
|
343
348
|
// merge base, but ahead/behind must include commits unique to both heads.
|
|
344
|
-
return getCommitDivergence(resolved.record
|
|
349
|
+
return getCommitDivergence(gitWorktreeRoot(resolved.record), comparison.baseHeadCommit, head, { signal: context.signal });
|
|
345
350
|
}
|
|
346
351
|
/**
|
|
347
352
|
* Authorize commit SHAs against one pinned comparison projection.
|
|
@@ -365,7 +370,7 @@ async function authorizeCommits(context, resolved, comparison, candidates) {
|
|
|
365
370
|
return candidate;
|
|
366
371
|
});
|
|
367
372
|
const listCommits = gitRead(context, 'listCommits', worktreeId);
|
|
368
|
-
const history = await listCommits(resolved.record
|
|
373
|
+
const history = await listCommits(gitWorktreeRoot(resolved.record), comparison.baseHeadCommit, {
|
|
369
374
|
signal: context.signal,
|
|
370
375
|
});
|
|
371
376
|
const members = new Set(history.commits.map((commit) => commit.sha));
|
|
@@ -489,10 +494,10 @@ export async function listWorktreeCommits(context, input) {
|
|
|
489
494
|
const readWorkingTreePaths = gitReadOptional(context, 'listWorkingTreeChangedPaths')
|
|
490
495
|
?? gitReadOptional(context, 'listWorkingTreeFiles');
|
|
491
496
|
const [history, workingTreeFiles] = await Promise.all([
|
|
492
|
-
listCommits(resolved.value.record
|
|
497
|
+
listCommits(gitWorktreeRoot(resolved.value.record), baseline.baseHeadCommit, { signal: context.signal }),
|
|
493
498
|
readWorkingTreePaths === undefined
|
|
494
499
|
? Promise.resolve({ files: [], truncated: false })
|
|
495
|
-
: readWorkingTreePaths(resolved.value.record
|
|
500
|
+
: readWorkingTreePaths(gitWorktreeRoot(resolved.value.record), { signal: context.signal }),
|
|
496
501
|
]);
|
|
497
502
|
const divergence = await readCommitDivergence(context, resolved.value, baseline, history.headCommit);
|
|
498
503
|
return {
|
|
@@ -605,7 +610,7 @@ async function authorizeLiveSummaryHead(context, resolved) {
|
|
|
605
610
|
const resolveCommit = gitReadOptional(context, 'resolveCommit');
|
|
606
611
|
if (resolveCommit === undefined)
|
|
607
612
|
return;
|
|
608
|
-
const currentHead = await resolveCommit(resolved.record
|
|
613
|
+
const currentHead = await resolveCommit(gitWorktreeRoot(resolved.record), 'HEAD', { signal: context.signal });
|
|
609
614
|
if (!COMMIT_PATTERN.test(currentHead)) {
|
|
610
615
|
throw providerError('GIT_OPERATION_FAILED', 'Git returned an invalid live Worktree HEAD', {
|
|
611
616
|
worktreeId: resolved.record.worktreeId,
|
|
@@ -616,19 +621,19 @@ async function listSummaryFiles(context, resolved, selection, baseCommit, headCo
|
|
|
616
621
|
if (selection.includeWorkingTree === true) {
|
|
617
622
|
const listWorkingTreeDiffFiles = gitRead(context, 'listWorkingTreeDiffFiles', resolved.record.worktreeId);
|
|
618
623
|
await authorizeLiveSummaryHead(context, resolved);
|
|
619
|
-
return listWorkingTreeDiffFiles(resolved.record
|
|
624
|
+
return listWorkingTreeDiffFiles(gitWorktreeRoot(resolved.record), baseCommit, { signal: context.signal });
|
|
620
625
|
}
|
|
621
626
|
const listDiffFiles = gitRead(context, 'listDiffFiles', resolved.record.worktreeId);
|
|
622
|
-
return listDiffFiles(resolved.record
|
|
627
|
+
return listDiffFiles(gitWorktreeRoot(resolved.record), baseCommit, headCommit, { signal: context.signal });
|
|
623
628
|
}
|
|
624
629
|
async function readSummaryFileDiff(context, resolved, selection, baseCommit, headCommit, filePath) {
|
|
625
630
|
if (selection.includeWorkingTree === true) {
|
|
626
631
|
const readWorkingTreeDiffFileDiff = gitRead(context, 'readWorkingTreeDiffFileDiff', resolved.record.worktreeId);
|
|
627
632
|
await authorizeLiveSummaryHead(context, resolved);
|
|
628
|
-
return readWorkingTreeDiffFileDiff(resolved.record
|
|
633
|
+
return readWorkingTreeDiffFileDiff(gitWorktreeRoot(resolved.record), baseCommit, filePath, { signal: context.signal });
|
|
629
634
|
}
|
|
630
635
|
const readDiffFileDiff = gitRead(context, 'readDiffFileDiff', resolved.record.worktreeId);
|
|
631
|
-
return readDiffFileDiff(resolved.record
|
|
636
|
+
return readDiffFileDiff(gitWorktreeRoot(resolved.record), baseCommit, headCommit, filePath, { signal: context.signal });
|
|
632
637
|
}
|
|
633
638
|
async function selectedAggregateFileDiff(context, absolutePath, worktreeId, selection, commits, requestedPath) {
|
|
634
639
|
if (requestedPath.length === 0) {
|
|
@@ -667,18 +672,18 @@ async function selectedAggregateFileDiff(context, absolutePath, worktreeId, sele
|
|
|
667
672
|
segments,
|
|
668
673
|
};
|
|
669
674
|
}
|
|
670
|
-
async function aggregateMainFileDiff(context, workspaceRoot, worktreeId, selection, requestedPath) {
|
|
675
|
+
async function aggregateMainFileDiff(context, workspaceRoot, repositoryRoot, worktreeId, selection, requestedPath) {
|
|
671
676
|
if (typeof requestedPath !== 'string' || requestedPath.length === 0) {
|
|
672
677
|
throw providerError('WORKTREE_STATE_CONFLICT', 'A changed file path is required', {
|
|
673
678
|
worktreeId,
|
|
674
679
|
});
|
|
675
680
|
}
|
|
676
681
|
const authorized = await authorizeMainAggregate(context, workspaceRoot, worktreeId, selection);
|
|
677
|
-
return selectedAggregateFileDiff(context,
|
|
682
|
+
return selectedAggregateFileDiff(context, repositoryRoot, worktreeId, authorized.selection, authorized.commits, requestedPath);
|
|
678
683
|
}
|
|
679
|
-
async function listMainAggregateFiles(context, workspaceRoot, worktreeId, selection) {
|
|
684
|
+
async function listMainAggregateFiles(context, workspaceRoot, repositoryRoot, worktreeId, selection) {
|
|
680
685
|
const authorized = await authorizeMainAggregate(context, workspaceRoot, worktreeId, selection);
|
|
681
|
-
const groups = await selectedCommitFiles(context,
|
|
686
|
+
const groups = await selectedCommitFiles(context, repositoryRoot, worktreeId, authorized.commits);
|
|
682
687
|
return {
|
|
683
688
|
commit: authorized.commits[0],
|
|
684
689
|
selection: authorized.selection,
|
|
@@ -697,7 +702,7 @@ async function listAggregateFiles(context, resolved, selection, requestedBaseBra
|
|
|
697
702
|
...(read.truncated ? { truncated: true } : {}),
|
|
698
703
|
};
|
|
699
704
|
}
|
|
700
|
-
const groups = await selectedCommitFiles(context, resolved.record
|
|
705
|
+
const groups = await selectedCommitFiles(context, gitWorktreeRoot(resolved.record), resolved.record.worktreeId, authorized.commits);
|
|
701
706
|
return {
|
|
702
707
|
commit: authorized.commits[0],
|
|
703
708
|
selection: authorized.selection,
|
|
@@ -729,14 +734,14 @@ async function aggregateFileDiff(context, resolved, selection, requestedPath, re
|
|
|
729
734
|
selection: authorized.selection,
|
|
730
735
|
};
|
|
731
736
|
}
|
|
732
|
-
return selectedAggregateFileDiff(context, resolved.record
|
|
737
|
+
return selectedAggregateFileDiff(context, gitWorktreeRoot(resolved.record), resolved.record.worktreeId, authorized.selection, authorized.commits, requestedPath);
|
|
733
738
|
}
|
|
734
739
|
export async function listWorktreeCommitFiles(context, input) {
|
|
735
740
|
const resolved = await resolveWorktree(context, input);
|
|
736
741
|
const requested = requestedDiff(input, input.worktreeId);
|
|
737
742
|
if (resolved.main) {
|
|
738
743
|
if (requested.kind === 'aggregate') {
|
|
739
|
-
return listMainAggregateFiles(context, resolved.workspaceRoot, input.worktreeId, requested.selection);
|
|
744
|
+
return listMainAggregateFiles(context, resolved.workspaceRoot, resolved.repositoryRoot, input.worktreeId, requested.selection);
|
|
740
745
|
}
|
|
741
746
|
if (requested.commit === WORKTREE_GIT_WORKING_TREE) {
|
|
742
747
|
const listWorkingTreeFiles = gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
|
|
@@ -749,7 +754,7 @@ export async function listWorktreeCommitFiles(context, input) {
|
|
|
749
754
|
}
|
|
750
755
|
const commit = await authorizeMainCommit(context, resolved.workspaceRoot, input.worktreeId, requested.commit);
|
|
751
756
|
const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
|
|
752
|
-
const read = await listCommitFiles(resolved.
|
|
757
|
+
const read = await listCommitFiles(resolved.repositoryRoot, commit, { signal: context.signal });
|
|
753
758
|
return {
|
|
754
759
|
commit,
|
|
755
760
|
files: read.files,
|
|
@@ -763,7 +768,7 @@ export async function listWorktreeCommitFiles(context, input) {
|
|
|
763
768
|
if (commit === WORKTREE_GIT_WORKING_TREE) {
|
|
764
769
|
await authorizeWorkingTree(context, resolved.value, input.baseBranch);
|
|
765
770
|
const listWorkingTreeFiles = gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
|
|
766
|
-
const read = await listWorkingTreeFiles(resolved.value.record
|
|
771
|
+
const read = await listWorkingTreeFiles(gitWorktreeRoot(resolved.value.record), { signal: context.signal });
|
|
767
772
|
return {
|
|
768
773
|
commit: WORKTREE_GIT_WORKING_TREE,
|
|
769
774
|
files: read.files,
|
|
@@ -772,7 +777,7 @@ export async function listWorktreeCommitFiles(context, input) {
|
|
|
772
777
|
}
|
|
773
778
|
const authorized = await authorizeCommit(context, resolved.value, commit, input.baseBranch);
|
|
774
779
|
const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
|
|
775
|
-
const read = await listCommitFiles(resolved.value.record
|
|
780
|
+
const read = await listCommitFiles(gitWorktreeRoot(resolved.value.record), authorized.commit, { signal: context.signal });
|
|
776
781
|
return {
|
|
777
782
|
commit: authorized.commit,
|
|
778
783
|
files: read.files,
|
|
@@ -789,7 +794,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
789
794
|
worktreeId: input.worktreeId,
|
|
790
795
|
});
|
|
791
796
|
}
|
|
792
|
-
return aggregateMainFileDiff(context, resolved.workspaceRoot, input.worktreeId, requested.selection, input.path);
|
|
797
|
+
return aggregateMainFileDiff(context, resolved.workspaceRoot, resolved.repositoryRoot, input.worktreeId, requested.selection, input.path);
|
|
793
798
|
}
|
|
794
799
|
if (typeof input.path !== 'string' || input.path.length === 0) {
|
|
795
800
|
throw providerError('WORKTREE_STATE_CONFLICT', 'A changed file path is required', {
|
|
@@ -814,7 +819,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
814
819
|
}
|
|
815
820
|
const commit = await authorizeMainCommit(context, resolved.workspaceRoot, input.worktreeId, requested.commit);
|
|
816
821
|
const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
|
|
817
|
-
const filesRead = await listCommitFiles(resolved.
|
|
822
|
+
const filesRead = await listCommitFiles(resolved.repositoryRoot, commit, { signal: context.signal });
|
|
818
823
|
const changedFile = findChangedFile(filesRead.files, input.path);
|
|
819
824
|
if (changedFile === undefined) {
|
|
820
825
|
throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed by this commit', {
|
|
@@ -824,7 +829,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
824
829
|
});
|
|
825
830
|
}
|
|
826
831
|
const readCommitFileDiff = gitRead(context, 'readCommitFileDiff', input.worktreeId);
|
|
827
|
-
const diff = await readCommitFileDiff(resolved.
|
|
832
|
+
const diff = await readCommitFileDiff(resolved.repositoryRoot, commit, changedFile.path, { signal: context.signal });
|
|
828
833
|
return { ...diff, commit, path: input.path };
|
|
829
834
|
}
|
|
830
835
|
if (requested.kind === 'aggregate') {
|
|
@@ -844,7 +849,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
844
849
|
// untracked file on each file click.
|
|
845
850
|
const readChangedPaths = gitReadOptional(context, 'listWorkingTreeChangedPaths')
|
|
846
851
|
?? gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
|
|
847
|
-
const readPaths = await readChangedPaths(resolved.value.record
|
|
852
|
+
const readPaths = await readChangedPaths(gitWorktreeRoot(resolved.value.record), { signal: context.signal });
|
|
848
853
|
const changedFile = findChangedFile(readPaths.files, input.path);
|
|
849
854
|
if (changedFile === undefined) {
|
|
850
855
|
throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed in the working tree', {
|
|
@@ -853,7 +858,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
853
858
|
path: input.path,
|
|
854
859
|
});
|
|
855
860
|
}
|
|
856
|
-
const diff = await readWorkingTreeFileDiff(resolved.value.record
|
|
861
|
+
const diff = await readWorkingTreeFileDiff(gitWorktreeRoot(resolved.value.record), changedFile.path, { signal: context.signal });
|
|
857
862
|
return {
|
|
858
863
|
...diff,
|
|
859
864
|
commit: WORKTREE_GIT_WORKING_TREE,
|
|
@@ -865,7 +870,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
865
870
|
const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
|
|
866
871
|
// The changed-file projection is the authorization boundary for the path, so
|
|
867
872
|
// the diff is only read for an exact member of that projection.
|
|
868
|
-
const filesRead = await listCommitFiles(resolved.value.record
|
|
873
|
+
const filesRead = await listCommitFiles(gitWorktreeRoot(resolved.value.record), authorized.commit, { signal: context.signal });
|
|
869
874
|
const changedFile = findChangedFile(filesRead.files, input.path);
|
|
870
875
|
if (changedFile === undefined) {
|
|
871
876
|
throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed by this commit', {
|
|
@@ -874,7 +879,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
874
879
|
path: input.path,
|
|
875
880
|
});
|
|
876
881
|
}
|
|
877
|
-
const diff = await readCommitFileDiff(resolved.value.record
|
|
882
|
+
const diff = await readCommitFileDiff(gitWorktreeRoot(resolved.value.record), authorized.commit, changedFile.path, { signal: context.signal });
|
|
878
883
|
return {
|
|
879
884
|
...diff,
|
|
880
885
|
commit: authorized.commit,
|