@cerbur/clutch-dsh-worktree 0.1.16 → 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 +214 -15
- package/README.zh.md +175 -12
- 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 +5 -4
- 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 +2 -1
- package/lib/client/dashboard/DashboardRequest.d.ts.map +1 -1
- package/lib/client/dashboard/DashboardRequest.js +3 -3
- package/lib/client/dashboard/DashboardRequest.js.map +1 -1
- 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 +48 -24
- 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 -52
- 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 +39 -2
- 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 +144 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +204 -60
- 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 +3 -1
- package/lib/client/overlay/sidebar-overlay-geometry.d.ts.map +1 -1
- package/lib/client/overlay/sidebar-overlay-geometry.js +94 -34
- package/lib/client/overlay/sidebar-overlay-geometry.js.map +1 -1
- package/lib/client/restart-notice.d.ts +10 -3
- package/lib/client/restart-notice.d.ts.map +1 -1
- package/lib/client/restart-notice.js +44 -11
- package/lib/client/restart-notice.js.map +1 -1
- 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/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.map +1 -1
- package/lib/client/surface/components/RestartToast.js +4 -3
- package/lib/client/surface/components/RestartToast.js.map +1 -1
- 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 +2 -1
- 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 +14 -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 +15 -97
- 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 +1 -1
- package/lib/client/surface/state/useSurfaceSources.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceSources.js +4 -2
- 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 -14
- 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/worktree-connection.d.ts +6 -2
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +6 -0
- 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 +2188 -947
- package/lib/client.js.map +1 -1
- package/lib/contract/index.d.ts +11 -1
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +9 -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 +29 -28
- 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 +34 -11
- package/lib/manage/manager-sessions.js.map +1 -1
- package/lib/manage/manager-support.d.ts +3 -1
- package/lib/manage/manager-support.d.ts.map +1 -1
- package/lib/manage/manager-support.js +17 -0
- 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 +74 -22
- 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 +12 -1
- 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 +215 -44
- 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 +215 -44
- package/package.json +14 -2
|
@@ -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';
|
|
@@ -85,22 +86,22 @@ async function resolveWorktree(context, input) {
|
|
|
85
86
|
worktreeId: input.worktreeId,
|
|
86
87
|
});
|
|
87
88
|
}
|
|
88
|
-
if (!(await isDirectory(record
|
|
89
|
-
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)}`, {
|
|
90
91
|
workspaceId: input.workspaceId,
|
|
91
92
|
worktreeId: input.worktreeId,
|
|
92
|
-
absolutePath: record
|
|
93
|
+
absolutePath: gitWorktreeRoot(record),
|
|
93
94
|
});
|
|
94
95
|
}
|
|
95
96
|
const repositoryRoot = context.git.resolveRepositoryRoot
|
|
96
97
|
? await context.git.resolveRepositoryRoot(workspace.rootPath, { signal: context.signal })
|
|
97
98
|
: workspace.rootPath;
|
|
98
|
-
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));
|
|
99
100
|
if (!live) {
|
|
100
|
-
throw providerError('WORKTREE_NOT_FOUND', `Git Worktree registration is unavailable: ${record
|
|
101
|
+
throw providerError('WORKTREE_NOT_FOUND', `Git Worktree registration is unavailable: ${gitWorktreeRoot(record)}`, {
|
|
101
102
|
workspaceId: input.workspaceId,
|
|
102
103
|
worktreeId: input.worktreeId,
|
|
103
|
-
absolutePath: record
|
|
104
|
+
absolutePath: gitWorktreeRoot(record),
|
|
104
105
|
});
|
|
105
106
|
}
|
|
106
107
|
return {
|
|
@@ -155,7 +156,7 @@ async function resolveLocalBranchCommit(context, resolved, baseBranch, options =
|
|
|
155
156
|
return undefined;
|
|
156
157
|
unavailable();
|
|
157
158
|
}
|
|
158
|
-
const commit = await resolveCommit(resolved.record
|
|
159
|
+
const commit = await resolveCommit(gitWorktreeRoot(resolved.record), baseBranch, {
|
|
159
160
|
signal: context.signal,
|
|
160
161
|
});
|
|
161
162
|
if (!COMMIT_PATTERN.test(commit)) {
|
|
@@ -182,7 +183,7 @@ async function resolveSelectedBaseline(context, resolved, rawBranch) {
|
|
|
182
183
|
const headCommit = await baselineHeadCommit(context, resolved);
|
|
183
184
|
const findMergeBase = gitReadOptional(context, 'findMergeBase');
|
|
184
185
|
const mergeBase = headCommit !== undefined && findMergeBase !== undefined
|
|
185
|
-
? await findMergeBase(resolved.record
|
|
186
|
+
? await findMergeBase(gitWorktreeRoot(resolved.record), commit, headCommit, { signal: context.signal })
|
|
186
187
|
: undefined;
|
|
187
188
|
if (mergeBase !== undefined && !COMMIT_PATTERN.test(mergeBase)) {
|
|
188
189
|
throw providerError('GIT_OPERATION_FAILED', 'Git returned an invalid selected branch merge base', {
|
|
@@ -284,7 +285,7 @@ async function resolveBaseline(context, resolved, requestedBaseBranch) {
|
|
|
284
285
|
});
|
|
285
286
|
}
|
|
286
287
|
const commit = context.git.resolveCommit
|
|
287
|
-
? await context.git.resolveCommit(record
|
|
288
|
+
? await context.git.resolveCommit(gitWorktreeRoot(record), record.baseCommit, { signal: context.signal })
|
|
288
289
|
: record.baseCommit;
|
|
289
290
|
return {
|
|
290
291
|
baseline: {
|
|
@@ -305,7 +306,7 @@ async function resolveBaseline(context, resolved, requestedBaseBranch) {
|
|
|
305
306
|
if (currentBranch === undefined || currentBranch === record.baseBranch || context.git.findMergeBase === undefined) {
|
|
306
307
|
return undefined;
|
|
307
308
|
}
|
|
308
|
-
const commit = await context.git.findMergeBase(record
|
|
309
|
+
const commit = await context.git.findMergeBase(gitWorktreeRoot(record), record.baseBranch, 'HEAD', { signal: context.signal });
|
|
309
310
|
if (commit === undefined)
|
|
310
311
|
return undefined;
|
|
311
312
|
if (!COMMIT_PATTERN.test(commit)) {
|
|
@@ -336,7 +337,7 @@ async function baselineHeadCommit(context, resolved) {
|
|
|
336
337
|
const resolveCommit = gitReadOptional(context, 'resolveCommit');
|
|
337
338
|
return resolveCommit === undefined
|
|
338
339
|
? undefined
|
|
339
|
-
: await resolveCommit(resolved.record
|
|
340
|
+
: await resolveCommit(gitWorktreeRoot(resolved.record), 'HEAD', { signal: context.signal });
|
|
340
341
|
}
|
|
341
342
|
/** Count commits unique to each head for one resolved comparison boundary. */
|
|
342
343
|
async function readCommitDivergence(context, resolved, comparison, head) {
|
|
@@ -345,7 +346,7 @@ async function readCommitDivergence(context, resolved, comparison, head) {
|
|
|
345
346
|
return undefined;
|
|
346
347
|
// Count each branch from its current tip. The tree boundary may be the
|
|
347
348
|
// merge base, but ahead/behind must include commits unique to both heads.
|
|
348
|
-
return getCommitDivergence(resolved.record
|
|
349
|
+
return getCommitDivergence(gitWorktreeRoot(resolved.record), comparison.baseHeadCommit, head, { signal: context.signal });
|
|
349
350
|
}
|
|
350
351
|
/**
|
|
351
352
|
* Authorize commit SHAs against one pinned comparison projection.
|
|
@@ -369,7 +370,7 @@ async function authorizeCommits(context, resolved, comparison, candidates) {
|
|
|
369
370
|
return candidate;
|
|
370
371
|
});
|
|
371
372
|
const listCommits = gitRead(context, 'listCommits', worktreeId);
|
|
372
|
-
const history = await listCommits(resolved.record
|
|
373
|
+
const history = await listCommits(gitWorktreeRoot(resolved.record), comparison.baseHeadCommit, {
|
|
373
374
|
signal: context.signal,
|
|
374
375
|
});
|
|
375
376
|
const members = new Set(history.commits.map((commit) => commit.sha));
|
|
@@ -493,10 +494,10 @@ export async function listWorktreeCommits(context, input) {
|
|
|
493
494
|
const readWorkingTreePaths = gitReadOptional(context, 'listWorkingTreeChangedPaths')
|
|
494
495
|
?? gitReadOptional(context, 'listWorkingTreeFiles');
|
|
495
496
|
const [history, workingTreeFiles] = await Promise.all([
|
|
496
|
-
listCommits(resolved.value.record
|
|
497
|
+
listCommits(gitWorktreeRoot(resolved.value.record), baseline.baseHeadCommit, { signal: context.signal }),
|
|
497
498
|
readWorkingTreePaths === undefined
|
|
498
499
|
? Promise.resolve({ files: [], truncated: false })
|
|
499
|
-
: readWorkingTreePaths(resolved.value.record
|
|
500
|
+
: readWorkingTreePaths(gitWorktreeRoot(resolved.value.record), { signal: context.signal }),
|
|
500
501
|
]);
|
|
501
502
|
const divergence = await readCommitDivergence(context, resolved.value, baseline, history.headCommit);
|
|
502
503
|
return {
|
|
@@ -609,7 +610,7 @@ async function authorizeLiveSummaryHead(context, resolved) {
|
|
|
609
610
|
const resolveCommit = gitReadOptional(context, 'resolveCommit');
|
|
610
611
|
if (resolveCommit === undefined)
|
|
611
612
|
return;
|
|
612
|
-
const currentHead = await resolveCommit(resolved.record
|
|
613
|
+
const currentHead = await resolveCommit(gitWorktreeRoot(resolved.record), 'HEAD', { signal: context.signal });
|
|
613
614
|
if (!COMMIT_PATTERN.test(currentHead)) {
|
|
614
615
|
throw providerError('GIT_OPERATION_FAILED', 'Git returned an invalid live Worktree HEAD', {
|
|
615
616
|
worktreeId: resolved.record.worktreeId,
|
|
@@ -620,19 +621,19 @@ async function listSummaryFiles(context, resolved, selection, baseCommit, headCo
|
|
|
620
621
|
if (selection.includeWorkingTree === true) {
|
|
621
622
|
const listWorkingTreeDiffFiles = gitRead(context, 'listWorkingTreeDiffFiles', resolved.record.worktreeId);
|
|
622
623
|
await authorizeLiveSummaryHead(context, resolved);
|
|
623
|
-
return listWorkingTreeDiffFiles(resolved.record
|
|
624
|
+
return listWorkingTreeDiffFiles(gitWorktreeRoot(resolved.record), baseCommit, { signal: context.signal });
|
|
624
625
|
}
|
|
625
626
|
const listDiffFiles = gitRead(context, 'listDiffFiles', resolved.record.worktreeId);
|
|
626
|
-
return listDiffFiles(resolved.record
|
|
627
|
+
return listDiffFiles(gitWorktreeRoot(resolved.record), baseCommit, headCommit, { signal: context.signal });
|
|
627
628
|
}
|
|
628
629
|
async function readSummaryFileDiff(context, resolved, selection, baseCommit, headCommit, filePath) {
|
|
629
630
|
if (selection.includeWorkingTree === true) {
|
|
630
631
|
const readWorkingTreeDiffFileDiff = gitRead(context, 'readWorkingTreeDiffFileDiff', resolved.record.worktreeId);
|
|
631
632
|
await authorizeLiveSummaryHead(context, resolved);
|
|
632
|
-
return readWorkingTreeDiffFileDiff(resolved.record
|
|
633
|
+
return readWorkingTreeDiffFileDiff(gitWorktreeRoot(resolved.record), baseCommit, filePath, { signal: context.signal });
|
|
633
634
|
}
|
|
634
635
|
const readDiffFileDiff = gitRead(context, 'readDiffFileDiff', resolved.record.worktreeId);
|
|
635
|
-
return readDiffFileDiff(resolved.record
|
|
636
|
+
return readDiffFileDiff(gitWorktreeRoot(resolved.record), baseCommit, headCommit, filePath, { signal: context.signal });
|
|
636
637
|
}
|
|
637
638
|
async function selectedAggregateFileDiff(context, absolutePath, worktreeId, selection, commits, requestedPath) {
|
|
638
639
|
if (requestedPath.length === 0) {
|
|
@@ -701,7 +702,7 @@ async function listAggregateFiles(context, resolved, selection, requestedBaseBra
|
|
|
701
702
|
...(read.truncated ? { truncated: true } : {}),
|
|
702
703
|
};
|
|
703
704
|
}
|
|
704
|
-
const groups = await selectedCommitFiles(context, resolved.record
|
|
705
|
+
const groups = await selectedCommitFiles(context, gitWorktreeRoot(resolved.record), resolved.record.worktreeId, authorized.commits);
|
|
705
706
|
return {
|
|
706
707
|
commit: authorized.commits[0],
|
|
707
708
|
selection: authorized.selection,
|
|
@@ -733,7 +734,7 @@ async function aggregateFileDiff(context, resolved, selection, requestedPath, re
|
|
|
733
734
|
selection: authorized.selection,
|
|
734
735
|
};
|
|
735
736
|
}
|
|
736
|
-
return selectedAggregateFileDiff(context, resolved.record
|
|
737
|
+
return selectedAggregateFileDiff(context, gitWorktreeRoot(resolved.record), resolved.record.worktreeId, authorized.selection, authorized.commits, requestedPath);
|
|
737
738
|
}
|
|
738
739
|
export async function listWorktreeCommitFiles(context, input) {
|
|
739
740
|
const resolved = await resolveWorktree(context, input);
|
|
@@ -767,7 +768,7 @@ export async function listWorktreeCommitFiles(context, input) {
|
|
|
767
768
|
if (commit === WORKTREE_GIT_WORKING_TREE) {
|
|
768
769
|
await authorizeWorkingTree(context, resolved.value, input.baseBranch);
|
|
769
770
|
const listWorkingTreeFiles = gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
|
|
770
|
-
const read = await listWorkingTreeFiles(resolved.value.record
|
|
771
|
+
const read = await listWorkingTreeFiles(gitWorktreeRoot(resolved.value.record), { signal: context.signal });
|
|
771
772
|
return {
|
|
772
773
|
commit: WORKTREE_GIT_WORKING_TREE,
|
|
773
774
|
files: read.files,
|
|
@@ -776,7 +777,7 @@ export async function listWorktreeCommitFiles(context, input) {
|
|
|
776
777
|
}
|
|
777
778
|
const authorized = await authorizeCommit(context, resolved.value, commit, input.baseBranch);
|
|
778
779
|
const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
|
|
779
|
-
const read = await listCommitFiles(resolved.value.record
|
|
780
|
+
const read = await listCommitFiles(gitWorktreeRoot(resolved.value.record), authorized.commit, { signal: context.signal });
|
|
780
781
|
return {
|
|
781
782
|
commit: authorized.commit,
|
|
782
783
|
files: read.files,
|
|
@@ -848,7 +849,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
848
849
|
// untracked file on each file click.
|
|
849
850
|
const readChangedPaths = gitReadOptional(context, 'listWorkingTreeChangedPaths')
|
|
850
851
|
?? gitRead(context, 'listWorkingTreeFiles', input.worktreeId);
|
|
851
|
-
const readPaths = await readChangedPaths(resolved.value.record
|
|
852
|
+
const readPaths = await readChangedPaths(gitWorktreeRoot(resolved.value.record), { signal: context.signal });
|
|
852
853
|
const changedFile = findChangedFile(readPaths.files, input.path);
|
|
853
854
|
if (changedFile === undefined) {
|
|
854
855
|
throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed in the working tree', {
|
|
@@ -857,7 +858,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
857
858
|
path: input.path,
|
|
858
859
|
});
|
|
859
860
|
}
|
|
860
|
-
const diff = await readWorkingTreeFileDiff(resolved.value.record
|
|
861
|
+
const diff = await readWorkingTreeFileDiff(gitWorktreeRoot(resolved.value.record), changedFile.path, { signal: context.signal });
|
|
861
862
|
return {
|
|
862
863
|
...diff,
|
|
863
864
|
commit: WORKTREE_GIT_WORKING_TREE,
|
|
@@ -869,7 +870,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
869
870
|
const listCommitFiles = gitRead(context, 'listCommitFiles', input.worktreeId);
|
|
870
871
|
// The changed-file projection is the authorization boundary for the path, so
|
|
871
872
|
// the diff is only read for an exact member of that projection.
|
|
872
|
-
const filesRead = await listCommitFiles(resolved.value.record
|
|
873
|
+
const filesRead = await listCommitFiles(gitWorktreeRoot(resolved.value.record), authorized.commit, { signal: context.signal });
|
|
873
874
|
const changedFile = findChangedFile(filesRead.files, input.path);
|
|
874
875
|
if (changedFile === undefined) {
|
|
875
876
|
throw providerError('WORKTREE_STATE_CONFLICT', 'The requested path is not changed by this commit', {
|
|
@@ -878,7 +879,7 @@ export async function getWorktreeCommitFileDiff(context, input) {
|
|
|
878
879
|
path: input.path,
|
|
879
880
|
});
|
|
880
881
|
}
|
|
881
|
-
const diff = await readCommitFileDiff(resolved.value.record
|
|
882
|
+
const diff = await readCommitFileDiff(gitWorktreeRoot(resolved.value.record), authorized.commit, changedFile.path, { signal: context.signal });
|
|
882
883
|
return {
|
|
883
884
|
...diff,
|
|
884
885
|
commit: authorized.commit,
|