@cerbur/clutch-dsh-worktree 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +136 -0
  2. package/cordis.patch.yml +5 -0
  3. package/lib/client/WorktreeModeAction.d.ts +11 -0
  4. package/lib/client/WorktreeModeAction.d.ts.map +1 -0
  5. package/lib/client/WorktreeModeAction.js +14 -0
  6. package/lib/client/WorktreeModeAction.js.map +1 -0
  7. package/lib/client/WorktreeSurface.d.ts +33 -0
  8. package/lib/client/WorktreeSurface.d.ts.map +1 -0
  9. package/lib/client/WorktreeSurface.js +834 -0
  10. package/lib/client/WorktreeSurface.js.map +1 -0
  11. package/lib/client/entry.d.ts +18 -0
  12. package/lib/client/entry.d.ts.map +1 -0
  13. package/lib/client/entry.js +100 -0
  14. package/lib/client/entry.js.map +1 -0
  15. package/lib/client/index.d.ts +7 -0
  16. package/lib/client/index.d.ts.map +1 -0
  17. package/lib/client/index.js +6 -0
  18. package/lib/client/index.js.map +1 -0
  19. package/lib/client/navigation.d.ts +7 -0
  20. package/lib/client/navigation.d.ts.map +1 -0
  21. package/lib/client/navigation.js +5 -0
  22. package/lib/client/navigation.js.map +1 -0
  23. package/lib/client/overlay-bounds.d.ts +11 -0
  24. package/lib/client/overlay-bounds.d.ts.map +1 -0
  25. package/lib/client/overlay-bounds.js +9 -0
  26. package/lib/client/overlay-bounds.js.map +1 -0
  27. package/lib/client/sidebar-overlay-geometry.d.ts +10 -0
  28. package/lib/client/sidebar-overlay-geometry.d.ts.map +1 -0
  29. package/lib/client/sidebar-overlay-geometry.js +96 -0
  30. package/lib/client/sidebar-overlay-geometry.js.map +1 -0
  31. package/lib/client/view-mode-store.d.ts +5 -0
  32. package/lib/client/view-mode-store.d.ts.map +1 -0
  33. package/lib/client/view-mode-store.js +15 -0
  34. package/lib/client/view-mode-store.js.map +1 -0
  35. package/lib/client/view-mode.d.ts +52 -0
  36. package/lib/client/view-mode.d.ts.map +1 -0
  37. package/lib/client/view-mode.js +76 -0
  38. package/lib/client/view-mode.js.map +1 -0
  39. package/lib/client/virtual-workspace-membership.d.ts +27 -0
  40. package/lib/client/virtual-workspace-membership.d.ts.map +1 -0
  41. package/lib/client/virtual-workspace-membership.js +95 -0
  42. package/lib/client/virtual-workspace-membership.js.map +1 -0
  43. package/lib/client/worktree-connection.d.ts +42 -0
  44. package/lib/client/worktree-connection.d.ts.map +1 -0
  45. package/lib/client/worktree-connection.js +139 -0
  46. package/lib/client/worktree-connection.js.map +1 -0
  47. package/lib/client/worktree-view.d.ts +63 -0
  48. package/lib/client/worktree-view.d.ts.map +1 -0
  49. package/lib/client/worktree-view.js +116 -0
  50. package/lib/client/worktree-view.js.map +1 -0
  51. package/lib/client.js +1952 -0
  52. package/lib/client.js.map +1 -0
  53. package/lib/contract/index.contract.d.ts +2 -0
  54. package/lib/contract/index.contract.d.ts.map +1 -0
  55. package/lib/contract/index.contract.js +51 -0
  56. package/lib/contract/index.contract.js.map +1 -0
  57. package/lib/contract/index.d.ts +181 -0
  58. package/lib/contract/index.d.ts.map +1 -0
  59. package/lib/contract/index.js +45 -0
  60. package/lib/contract/index.js.map +1 -0
  61. package/lib/host/dsh-read-adapter.d.ts +58 -0
  62. package/lib/host/dsh-read-adapter.d.ts.map +1 -0
  63. package/lib/host/dsh-read-adapter.js +59 -0
  64. package/lib/host/dsh-read-adapter.js.map +1 -0
  65. package/lib/host/index.d.ts +16 -0
  66. package/lib/host/index.d.ts.map +1 -0
  67. package/lib/host/index.js +14 -0
  68. package/lib/host/index.js.map +1 -0
  69. package/lib/host/remote.d.ts +16 -0
  70. package/lib/host/remote.d.ts.map +1 -0
  71. package/lib/host/remote.js +61 -0
  72. package/lib/host/remote.js.map +1 -0
  73. package/lib/host/service.d.ts +58 -0
  74. package/lib/host/service.d.ts.map +1 -0
  75. package/lib/host/service.js +121 -0
  76. package/lib/host/service.js.map +1 -0
  77. package/lib/index.d.ts +23 -0
  78. package/lib/index.d.ts.map +1 -0
  79. package/lib/index.js +22 -0
  80. package/lib/index.js.map +1 -0
  81. package/lib/manage/index.d.ts +9 -0
  82. package/lib/manage/index.d.ts.map +1 -0
  83. package/lib/manage/index.js +8 -0
  84. package/lib/manage/index.js.map +1 -0
  85. package/lib/manage/manager.d.ts +86 -0
  86. package/lib/manage/manager.d.ts.map +1 -0
  87. package/lib/manage/manager.js +584 -0
  88. package/lib/manage/manager.js.map +1 -0
  89. package/lib/manage/types.d.ts +41 -0
  90. package/lib/manage/types.d.ts.map +1 -0
  91. package/lib/manage/types.js +2 -0
  92. package/lib/manage/types.js.map +1 -0
  93. package/lib/provider/git.d.ts +42 -0
  94. package/lib/provider/git.d.ts.map +1 -0
  95. package/lib/provider/git.js +222 -0
  96. package/lib/provider/git.js.map +1 -0
  97. package/lib/provider/index.d.ts +13 -0
  98. package/lib/provider/index.d.ts.map +1 -0
  99. package/lib/provider/index.js +12 -0
  100. package/lib/provider/index.js.map +1 -0
  101. package/lib/provider/sidecar.d.ts +85 -0
  102. package/lib/provider/sidecar.d.ts.map +1 -0
  103. package/lib/provider/sidecar.js +410 -0
  104. package/lib/provider/sidecar.js.map +1 -0
  105. package/lib/provider/types.d.ts +126 -0
  106. package/lib/provider/types.d.ts.map +1 -0
  107. package/lib/provider/types.js +46 -0
  108. package/lib/provider/types.js.map +1 -0
  109. package/lib/typert.host.d.ts +3 -0
  110. package/lib/typert.host.js +290 -0
  111. package/lib/typert.remote-client.d.ts +32 -0
  112. package/lib/typert.remote-client.d.ts.map +1 -0
  113. package/lib/typert.remote-client.js +284 -0
  114. package/package.json +118 -0
@@ -0,0 +1,27 @@
1
+ import { type VirtualWorkspaceBinding } from './view-mode.js';
2
+ /** The writable face of DSH's in-memory Workspace list store. */
3
+ export interface WritableWorkspaceList<T extends {
4
+ readonly items: readonly unknown[];
5
+ }> {
6
+ getSnapshot(): T;
7
+ set(next: T): void;
8
+ subscribe(listener: () => void): () => void;
9
+ }
10
+ export interface VirtualWorkspaceMembership {
11
+ ensure(binding: VirtualWorkspaceBinding): void;
12
+ sync(bindings: readonly VirtualWorkspaceBinding[]): void;
13
+ removeSession(sessionId: string): void;
14
+ dispose(): void;
15
+ }
16
+ /**
17
+ * Maintains a re-playable in-memory overlay over DSH's Workspace list. Native
18
+ * refreshes are observed and the current sidecar bindings are applied again;
19
+ * no DSH Host mutation or persistence is involved.
20
+ */
21
+ export declare function createVirtualWorkspaceMembership<T extends {
22
+ readonly items: readonly {
23
+ readonly workspaceId: string;
24
+ readonly sessionIds: readonly string[];
25
+ }[];
26
+ }>(list: WritableWorkspaceList<T>): VirtualWorkspaceMembership;
27
+ //# sourceMappingURL=virtual-workspace-membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-workspace-membership.d.ts","sourceRoot":"","sources":["../../src/client/virtual-workspace-membership.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AAExB,iEAAiE;AACjE,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE;IACrF,WAAW,IAAI,CAAC,CAAC;IACjB,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC/C,IAAI,CAAC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,GAAG,IAAI,CAAC;IACzD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,OAAO,IAAI,IAAI,CAAC;CACjB;AA2CD;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,CAAC,SAAS;IACR,QAAQ,CAAC,KAAK,EAAE,SAAS;QACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;KACxC,EAAE,CAAC;CACL,EACD,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,0BAA0B,CAuD5D"}
@@ -0,0 +1,95 @@
1
+ import { projectVirtualWorkspaceMembership, } from './view-mode.js';
2
+ function normalizeBindings(bindings) {
3
+ const bySession = new Map();
4
+ for (const binding of bindings) {
5
+ if (binding.workspaceId.length === 0 || binding.sessionId.length === 0)
6
+ continue;
7
+ bySession.set(binding.sessionId, binding);
8
+ }
9
+ return [...bySession.values()];
10
+ }
11
+ function sameWorkspaceItems(left, right) {
12
+ if (left.items.length !== right.items.length)
13
+ return false;
14
+ return left.items.every((item, index) => {
15
+ const other = right.items[index];
16
+ if (item === other)
17
+ return true;
18
+ if (typeof item !== 'object' ||
19
+ item === null ||
20
+ typeof other !== 'object' ||
21
+ other === null ||
22
+ !('workspaceId' in item) ||
23
+ !('workspaceId' in other) ||
24
+ !('sessionIds' in item) ||
25
+ !('sessionIds' in other)) {
26
+ return false;
27
+ }
28
+ const leftSessionIds = item.sessionIds;
29
+ const rightSessionIds = other.sessionIds;
30
+ return (item.workspaceId === other.workspaceId &&
31
+ Array.isArray(leftSessionIds) &&
32
+ Array.isArray(rightSessionIds) &&
33
+ leftSessionIds.length === rightSessionIds.length &&
34
+ leftSessionIds.every((sessionId, sessionIndex) => sessionId === rightSessionIds[sessionIndex]));
35
+ });
36
+ }
37
+ /**
38
+ * Maintains a re-playable in-memory overlay over DSH's Workspace list. Native
39
+ * refreshes are observed and the current sidecar bindings are applied again;
40
+ * no DSH Host mutation or persistence is involved.
41
+ */
42
+ export function createVirtualWorkspaceMembership(list) {
43
+ let bindings = [];
44
+ let disposed = false;
45
+ let applying = false;
46
+ const apply = (nextBindings) => {
47
+ const current = list.getSnapshot();
48
+ const next = projectVirtualWorkspaceMembership(current, bindings, nextBindings);
49
+ if (sameWorkspaceItems(current, next))
50
+ return;
51
+ applying = true;
52
+ try {
53
+ list.set(next);
54
+ }
55
+ finally {
56
+ applying = false;
57
+ }
58
+ };
59
+ const replay = () => {
60
+ if (disposed || applying)
61
+ return;
62
+ apply(bindings);
63
+ };
64
+ const unsubscribe = list.subscribe(replay);
65
+ const sync = (nextBindings) => {
66
+ if (disposed)
67
+ return;
68
+ const normalized = normalizeBindings(nextBindings);
69
+ apply(normalized);
70
+ bindings = normalized;
71
+ };
72
+ return {
73
+ ensure(binding) {
74
+ if (disposed)
75
+ return;
76
+ if (bindings.some((current) => current.workspaceId === binding.workspaceId && current.sessionId === binding.sessionId)) {
77
+ return;
78
+ }
79
+ sync([...bindings.filter((current) => current.sessionId !== binding.sessionId), binding]);
80
+ },
81
+ sync,
82
+ removeSession(sessionId) {
83
+ sync(bindings.filter((binding) => binding.sessionId !== sessionId));
84
+ },
85
+ dispose() {
86
+ if (disposed)
87
+ return;
88
+ apply([]);
89
+ bindings = [];
90
+ disposed = true;
91
+ unsubscribe();
92
+ },
93
+ };
94
+ }
95
+ //# sourceMappingURL=virtual-workspace-membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-workspace-membership.js","sourceRoot":"","sources":["../../src/client/virtual-workspace-membership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { ClientConnectionRpc } from '@deepseek-ai/dsh-client-connection/client';
2
+ import type { WorktreeManager } from '../contract/index.js';
3
+ /** The one logical channel shared by the DSH Connection and Typert Gateway. */
4
+ export declare const WORKTREE_CONNECTION_CHANNEL: "/api";
5
+ /**
6
+ * Canonical Worktree endpoints owned by this adapter. Keeping the table here makes
7
+ * the browser call surface auditable without making React know wire names.
8
+ */
9
+ export declare const WORKTREE_CONNECTION_ENDPOINTS: Readonly<{
10
+ listWorktrees: "worktreeManager/listWorktrees";
11
+ listBranches: "worktreeManager/listBranches";
12
+ createWorktree: "worktreeManager/createWorktree";
13
+ removeWorktree: "worktreeManager/removeWorktree";
14
+ listBindings: "worktreeManager/listBindings";
15
+ bindSession: "worktreeManager/bindSession";
16
+ }>;
17
+ /** Deliberately narrow transport seam: the adapter only needs `call`. */
18
+ export type WorktreeConnectionRpc = Pick<ClientConnectionRpc, 'call'>;
19
+ export interface WorktreeConnectionErrorOptions {
20
+ readonly code: string;
21
+ readonly message: string;
22
+ readonly details?: Readonly<Record<string, unknown>>;
23
+ readonly retryable: boolean;
24
+ readonly cause?: unknown;
25
+ }
26
+ /** Browser-safe error shared by transport, Gateway, endpoint and domain failures. */
27
+ export declare class WorktreeConnectionError extends Error {
28
+ readonly code: string;
29
+ readonly details: Readonly<Record<string, unknown>>;
30
+ readonly retryable: boolean;
31
+ constructor(options: WorktreeConnectionErrorOptions);
32
+ }
33
+ export interface WorktreeConnectionAdapter extends WorktreeManager {
34
+ /** Abort all requests owned by this Client plugin instance. */
35
+ dispose(): void;
36
+ }
37
+ /**
38
+ * Adapt the shared DSH Connection RPC into the existing WorktreeManager contract.
39
+ * All wire details and request cancellation live behind this one deep module.
40
+ */
41
+ export declare function createWorktreeConnectionAdapter(rpc: WorktreeConnectionRpc): WorktreeConnectionAdapter;
42
+ //# sourceMappingURL=worktree-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-connection.d.ts","sourceRoot":"","sources":["../../src/client/worktree-connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAErF,OAAO,KAAK,EAEV,eAAe,EAGhB,MAAM,sBAAsB,CAAC;AAE9B,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,EAAG,MAAe,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,6BAA6B;;;;;;;EAOiB,CAAC;AAE5D,yEAAyE;AACzE,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;AAEtE,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qFAAqF;AACrF,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,OAAO,EAAE,8BAA8B;CAOpD;AAED,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,+DAA+D;IAC/D,OAAO,IAAI,IAAI,CAAC;CACjB;AA8ED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,qBAAqB,GACzB,yBAAyB,CA4C3B"}
@@ -0,0 +1,139 @@
1
+ /** The one logical channel shared by the DSH Connection and Typert Gateway. */
2
+ export const WORKTREE_CONNECTION_CHANNEL = '/api';
3
+ /**
4
+ * Canonical Worktree endpoints owned by this adapter. Keeping the table here makes
5
+ * the browser call surface auditable without making React know wire names.
6
+ */
7
+ export const WORKTREE_CONNECTION_ENDPOINTS = Object.freeze({
8
+ listWorktrees: 'worktreeManager/listWorktrees',
9
+ listBranches: 'worktreeManager/listBranches',
10
+ createWorktree: 'worktreeManager/createWorktree',
11
+ removeWorktree: 'worktreeManager/removeWorktree',
12
+ listBindings: 'worktreeManager/listBindings',
13
+ bindSession: 'worktreeManager/bindSession',
14
+ });
15
+ /** Browser-safe error shared by transport, Gateway, endpoint and domain failures. */
16
+ export class WorktreeConnectionError extends Error {
17
+ code;
18
+ details;
19
+ retryable;
20
+ constructor(options) {
21
+ super(options.message, options.cause === undefined ? undefined : { cause: options.cause });
22
+ this.name = 'WorktreeConnectionError';
23
+ this.code = options.code;
24
+ this.details = Object.freeze({ ...(options.details ?? {}) });
25
+ this.retryable = options.retryable;
26
+ }
27
+ }
28
+ function isRecord(value) {
29
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
30
+ }
31
+ function isWorktreeError(value) {
32
+ return (isRecord(value) &&
33
+ typeof value.code === 'string' &&
34
+ typeof value.message === 'string' &&
35
+ isRecord(value.details));
36
+ }
37
+ function isWorktreeRemoteResult(value) {
38
+ if (!isRecord(value) || typeof value.ok !== 'boolean')
39
+ return false;
40
+ return value.ok || (isWorktreeError(value.error) && value.error.details !== undefined);
41
+ }
42
+ function disposedError() {
43
+ return new WorktreeConnectionError({
44
+ code: 'CLIENT_DISPOSED',
45
+ message: 'Worktree connection is disposed; reload the plugin and retry.',
46
+ details: {},
47
+ retryable: false,
48
+ });
49
+ }
50
+ function connectionFailure(endpoint, error, code = 'CONNECTION_CALL_FAILED') {
51
+ const message = error instanceof Error ? error.message : String(error);
52
+ return new WorktreeConnectionError({
53
+ code,
54
+ message: `Worktree endpoint ${endpoint} failed; retryable connection error: ${message}`,
55
+ details: { endpoint },
56
+ retryable: true,
57
+ cause: error,
58
+ });
59
+ }
60
+ function gatewayFailure(endpoint, result) {
61
+ throw new WorktreeConnectionError({
62
+ code: result.error.code,
63
+ message: `Worktree endpoint ${endpoint} failed: ${result.error.message}`,
64
+ details: isRecord(result.error.details) ? result.error.details : {},
65
+ retryable: true,
66
+ });
67
+ }
68
+ function invalidResult(endpoint) {
69
+ return new WorktreeConnectionError({
70
+ code: 'WORKTREE_RPC_INVALID_RESULT',
71
+ message: `Worktree endpoint ${endpoint} returned an invalid result; retry the request.`,
72
+ details: { endpoint },
73
+ retryable: true,
74
+ });
75
+ }
76
+ function unwrap(endpoint, result) {
77
+ if (!result.ok)
78
+ gatewayFailure(endpoint, result);
79
+ if (!isWorktreeRemoteResult(result.value))
80
+ throw invalidResult(endpoint);
81
+ if (!result.value.ok) {
82
+ throw new WorktreeConnectionError({
83
+ code: result.value.error.code,
84
+ message: result.value.error.message,
85
+ details: result.value.error.details,
86
+ retryable: false,
87
+ });
88
+ }
89
+ return result.value.value;
90
+ }
91
+ /**
92
+ * Adapt the shared DSH Connection RPC into the existing WorktreeManager contract.
93
+ * All wire details and request cancellation live behind this one deep module.
94
+ */
95
+ export function createWorktreeConnectionAdapter(rpc) {
96
+ const inFlight = new Set();
97
+ let disposed = false;
98
+ async function invoke(method, input) {
99
+ if (disposed)
100
+ throw disposedError();
101
+ const controller = new AbortController();
102
+ inFlight.add(controller);
103
+ const endpoint = WORKTREE_CONNECTION_ENDPOINTS[method];
104
+ try {
105
+ let result;
106
+ try {
107
+ result = await rpc.call(WORKTREE_CONNECTION_CHANNEL, endpoint, { args: { input } }, controller.signal);
108
+ }
109
+ catch (error) {
110
+ if (disposed && controller.signal.aborted)
111
+ throw disposedError();
112
+ throw connectionFailure(endpoint, error);
113
+ }
114
+ return unwrap(endpoint, result);
115
+ }
116
+ finally {
117
+ inFlight.delete(controller);
118
+ }
119
+ }
120
+ return {
121
+ listWorktrees: (input) => invoke('listWorktrees', input),
122
+ listBranches: (input) => invoke('listBranches', input),
123
+ createWorktree: (input) => invoke('createWorktree', input),
124
+ async removeWorktree(input) {
125
+ await invoke('removeWorktree', input);
126
+ },
127
+ listBindings: (input) => invoke('listBindings', input),
128
+ bindSession: (input) => invoke('bindSession', input),
129
+ dispose() {
130
+ if (disposed)
131
+ return;
132
+ disposed = true;
133
+ for (const controller of inFlight)
134
+ controller.abort();
135
+ inFlight.clear();
136
+ },
137
+ };
138
+ }
139
+ //# sourceMappingURL=worktree-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-connection.js","sourceRoot":"","sources":["../../src/client/worktree-connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { BranchRecord, SessionBinding, WorktreeManager, WorktreeRecord } from '../contract/index.js';
2
+ /** A DSH Session exists even when the external Worktree binding needs repair. */
3
+ export declare class WorktreeSessionBindingError extends Error {
4
+ readonly code = "SESSION_BINDING_FAILED";
5
+ readonly retryable = true;
6
+ readonly sessionId: string;
7
+ readonly cause: unknown;
8
+ constructor(sessionId: string, cause: unknown);
9
+ }
10
+ export interface WorktreeViewData {
11
+ readonly worktrees: readonly WorktreeRecord[];
12
+ readonly branches: readonly BranchRecord[];
13
+ readonly bindings: readonly SessionBinding[];
14
+ }
15
+ export interface WorktreeWorkspaceView extends WorktreeViewData {
16
+ readonly workspaceId: string;
17
+ }
18
+ /** Reuse the previous ID snapshot when DSH republishes equivalent Workspace items. */
19
+ export declare function stableWorkspaceIds(previous: readonly string[], next: readonly string[]): readonly string[];
20
+ /** Prefer the branch checked out by the DSH Workspace, then fall back to any local branch. */
21
+ export declare function selectDefaultBaseBranch(branches: readonly BranchRecord[]): string;
22
+ /** Generate a short, editable default branch name without colliding with known local names. */
23
+ export declare function createDefaultWorktreeName(existingNames: Iterable<string>, randomUuid?: () => string): string;
24
+ export interface CreateSessionForWorktreeInput {
25
+ readonly workspaceId: string;
26
+ readonly worktreeId: string;
27
+ readonly cwd: string;
28
+ }
29
+ export interface WorktreeViewError {
30
+ readonly code: string;
31
+ readonly message: string;
32
+ readonly retryable: boolean;
33
+ }
34
+ /** Hide DSH-archived Sessions from the browser-local Worktree projection. */
35
+ export declare function filterArchivedSessionIds(sessionIds: readonly string[], archivedSessionIds: readonly string[]): readonly string[];
36
+ export type WorktreeViewAction = {
37
+ readonly type: 'createWorktree';
38
+ readonly input: Parameters<WorktreeManager['createWorktree']>[0];
39
+ } | {
40
+ readonly type: 'removeWorktree';
41
+ readonly input: Parameters<WorktreeManager['removeWorktree']>[0];
42
+ };
43
+ /** Read all three Worktree projections needed by the surface in one refresh. */
44
+ export declare function loadWorktreeView(manager: WorktreeManager, workspaceId: string): Promise<WorktreeViewData>;
45
+ /** Load one independent projection per DSH Workspace for the flat sidebar hierarchy. */
46
+ export declare function loadWorktreeViews(manager: WorktreeManager, workspaceIds: readonly string[]): Promise<readonly WorktreeWorkspaceView[]>;
47
+ /** Keep mutation routing in the browser Consumer while leaving wire details to the adapter. */
48
+ export declare function executeWorktreeAction(manager: WorktreeManager, action: WorktreeViewAction): Promise<WorktreeRecord | void>;
49
+ /**
50
+ * Create a normal DSH Session at a Worktree cwd, then add the external binding.
51
+ * A binding failure deliberately leaves the DSH-created Session intact.
52
+ */
53
+ export declare function createSessionForWorktree(input: CreateSessionForWorktreeInput & {
54
+ readonly createSession: (input: {
55
+ cwd: string;
56
+ }) => Promise<string>;
57
+ readonly manager: Pick<WorktreeManager, 'bindSession'>;
58
+ readonly beforeOpen?: (sessionId: string) => void;
59
+ readonly openSession: (sessionId: string) => void;
60
+ }): Promise<string>;
61
+ /** Convert any adapter/Gateway failure into renderable, retry-aware UI data. */
62
+ export declare function toWorktreeViewError(error: unknown): WorktreeViewError;
63
+ //# sourceMappingURL=worktree-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-view.d.ts","sourceRoot":"","sources":["../../src/client/worktree-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /** A DSH Session exists even when the external Worktree binding needs repair. */
2
+ export class WorktreeSessionBindingError extends Error {
3
+ code = 'SESSION_BINDING_FAILED';
4
+ retryable = true;
5
+ sessionId;
6
+ cause;
7
+ constructor(sessionId, cause) {
8
+ const reason = cause instanceof Error ? cause.message : String(cause);
9
+ super(`Session ${sessionId} was created, but Worktree binding failed: ${reason}`);
10
+ this.name = 'WorktreeSessionBindingError';
11
+ this.sessionId = sessionId;
12
+ this.cause = cause;
13
+ }
14
+ }
15
+ /** Reuse the previous ID snapshot when DSH republishes equivalent Workspace items. */
16
+ export function stableWorkspaceIds(previous, next) {
17
+ if (previous.length !== next.length)
18
+ return next;
19
+ for (let index = 0; index < previous.length; index += 1) {
20
+ if (previous[index] !== next[index])
21
+ return next;
22
+ }
23
+ return previous;
24
+ }
25
+ /** Prefer the branch checked out by the DSH Workspace, then fall back to any local branch. */
26
+ export function selectDefaultBaseBranch(branches) {
27
+ return branches.find((branch) => branch.isCurrent)?.name ?? branches[0]?.name ?? '';
28
+ }
29
+ function browserRandomUuid() {
30
+ const randomUUID = globalThis.crypto?.randomUUID;
31
+ if (typeof randomUUID === 'function')
32
+ return randomUUID.call(globalThis.crypto);
33
+ return `${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`;
34
+ }
35
+ /** Generate a short, editable default branch name without colliding with known local names. */
36
+ export function createDefaultWorktreeName(existingNames, randomUuid = browserRandomUuid) {
37
+ const usedNames = new Set([...existingNames].map((name) => name.trim()));
38
+ for (let attempt = 0; attempt < 100; attempt += 1) {
39
+ const suffix = randomUuid().replace(/[^a-z0-9]/gi, '').slice(0, 8).toLowerCase();
40
+ if (suffix.length < 8)
41
+ continue;
42
+ const candidate = `dsh/${suffix}`;
43
+ if (!usedNames.has(candidate))
44
+ return candidate;
45
+ }
46
+ throw new Error('Unable to generate an available default Worktree name.');
47
+ }
48
+ /** Hide DSH-archived Sessions from the browser-local Worktree projection. */
49
+ export function filterArchivedSessionIds(sessionIds, archivedSessionIds) {
50
+ return sessionIds.filter((sessionId) => !archivedSessionIds.includes(sessionId));
51
+ }
52
+ /** Read all three Worktree projections needed by the surface in one refresh. */
53
+ export async function loadWorktreeView(manager, workspaceId) {
54
+ const [worktrees, branches, bindings] = await Promise.all([
55
+ manager.listWorktrees({ workspaceId }),
56
+ manager.listBranches({ workspaceId }),
57
+ manager.listBindings({ workspaceId }),
58
+ ]);
59
+ return { worktrees, branches, bindings };
60
+ }
61
+ /** Load one independent projection per DSH Workspace for the flat sidebar hierarchy. */
62
+ export async function loadWorktreeViews(manager, workspaceIds) {
63
+ return Promise.all(workspaceIds.map(async (workspaceId) => ({
64
+ workspaceId,
65
+ ...(await loadWorktreeView(manager, workspaceId)),
66
+ })));
67
+ }
68
+ /** Keep mutation routing in the browser Consumer while leaving wire details to the adapter. */
69
+ export async function executeWorktreeAction(manager, action) {
70
+ if (action.type === 'createWorktree') {
71
+ return manager.createWorktree(action.input);
72
+ }
73
+ if (action.type === 'removeWorktree') {
74
+ await manager.removeWorktree(action.input);
75
+ return;
76
+ }
77
+ }
78
+ /**
79
+ * Create a normal DSH Session at a Worktree cwd, then add the external binding.
80
+ * A binding failure deliberately leaves the DSH-created Session intact.
81
+ */
82
+ export async function createSessionForWorktree(input) {
83
+ const sessionId = await input.createSession({ cwd: input.cwd });
84
+ try {
85
+ await input.manager.bindSession({
86
+ workspaceId: input.workspaceId,
87
+ worktreeId: input.worktreeId,
88
+ sessionId,
89
+ });
90
+ }
91
+ catch (error) {
92
+ throw new WorktreeSessionBindingError(sessionId, error);
93
+ }
94
+ input.beforeOpen?.(sessionId);
95
+ input.openSession(sessionId);
96
+ return sessionId;
97
+ }
98
+ /** Convert any adapter/Gateway failure into renderable, retry-aware UI data. */
99
+ export function toWorktreeViewError(error) {
100
+ if (typeof error === 'object' && error !== null) {
101
+ const candidate = error;
102
+ return {
103
+ code: typeof candidate.code === 'string' ? candidate.code : 'WORKTREE_VIEW_FAILED',
104
+ message: typeof candidate.message === 'string'
105
+ ? candidate.message
106
+ : 'Worktree data is unavailable. Retry the request.',
107
+ retryable: candidate.retryable !== false,
108
+ };
109
+ }
110
+ return {
111
+ code: 'WORKTREE_VIEW_FAILED',
112
+ message: 'Worktree data is unavailable. Retry the request.',
113
+ retryable: true,
114
+ };
115
+ }
116
+ //# sourceMappingURL=worktree-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-view.js","sourceRoot":"","sources":["../../src/client/worktree-view.ts"],"names":[],"mappings":"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"}