@cerbur/clutch-dsh-worktree 0.1.18 → 0.1.20

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 (181) hide show
  1. package/README.md +120 -10
  2. package/README.zh.md +96 -10
  3. package/assets/screenshots/screenshots-agent-steer.jpg +0 -0
  4. package/assets/screenshots/screenshots-baseline-sync.png +0 -0
  5. package/lib/client/WorktreeSurface.d.ts.map +1 -1
  6. package/lib/client/WorktreeSurface.js +19 -3
  7. package/lib/client/WorktreeSurface.js.map +1 -1
  8. package/lib/client/context/worktree-context-store.d.ts +3 -1
  9. package/lib/client/context/worktree-context-store.d.ts.map +1 -1
  10. package/lib/client/context/worktree-context-store.js +3 -2
  11. package/lib/client/context/worktree-context-store.js.map +1 -1
  12. package/lib/client/dashboard/WorktreeDashboard.d.ts +8 -3
  13. package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
  14. package/lib/client/dashboard/WorktreeDashboard.js +120 -12
  15. package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
  16. package/lib/client/dashboard/dashboard-selection.d.ts +4 -0
  17. package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -1
  18. package/lib/client/dashboard/dashboard-selection.js +23 -0
  19. package/lib/client/dashboard/dashboard-selection.js.map +1 -1
  20. package/lib/client/dsh-slot-contract.d.ts +8 -1
  21. package/lib/client/dsh-slot-contract.d.ts.map +1 -1
  22. package/lib/client/entry.d.ts.map +1 -1
  23. package/lib/client/entry.js +22 -4
  24. package/lib/client/entry.js.map +1 -1
  25. package/lib/client/locales.d.ts +58 -0
  26. package/lib/client/locales.d.ts.map +1 -1
  27. package/lib/client/locales.js +66 -8
  28. package/lib/client/locales.js.map +1 -1
  29. package/lib/client/permission/worktree-permission.d.ts.map +1 -1
  30. package/lib/client/permission/worktree-permission.js +14 -6
  31. package/lib/client/permission/worktree-permission.js.map +1 -1
  32. package/lib/client/session/active-sessions.d.ts +21 -0
  33. package/lib/client/session/active-sessions.d.ts.map +1 -0
  34. package/lib/client/session/active-sessions.js +61 -0
  35. package/lib/client/session/active-sessions.js.map +1 -0
  36. package/lib/client/settings/diagnostics.d.ts +4 -0
  37. package/lib/client/settings/diagnostics.d.ts.map +1 -1
  38. package/lib/client/settings/diagnostics.js +12 -0
  39. package/lib/client/settings/diagnostics.js.map +1 -1
  40. package/lib/client/steer/SteerDock.d.ts +8 -0
  41. package/lib/client/steer/SteerDock.d.ts.map +1 -0
  42. package/lib/client/steer/SteerDock.js +12 -0
  43. package/lib/client/steer/SteerDock.js.map +1 -0
  44. package/lib/client/steer/steer-activity.d.ts +18 -0
  45. package/lib/client/steer/steer-activity.d.ts.map +1 -0
  46. package/lib/client/steer/steer-activity.js +37 -0
  47. package/lib/client/steer/steer-activity.js.map +1 -0
  48. package/lib/client/steer/steer-state.d.ts +24 -0
  49. package/lib/client/steer/steer-state.d.ts.map +1 -0
  50. package/lib/client/steer/steer-state.js +102 -0
  51. package/lib/client/steer/steer-state.js.map +1 -0
  52. package/lib/client/surface/components/SessionActivityBell.d.ts +14 -0
  53. package/lib/client/surface/components/SessionActivityBell.d.ts.map +1 -0
  54. package/lib/client/surface/components/SessionActivityBell.js +92 -0
  55. package/lib/client/surface/components/SessionActivityBell.js.map +1 -0
  56. package/lib/client/surface/components/SurfaceHeader.d.ts +3 -2
  57. package/lib/client/surface/components/SurfaceHeader.d.ts.map +1 -1
  58. package/lib/client/surface/components/SurfaceHeader.js +4 -2
  59. package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
  60. package/lib/client/surface/state/useSurfaceRefresh.d.ts.map +1 -1
  61. package/lib/client/surface/state/useSurfaceRefresh.js +6 -3
  62. package/lib/client/surface/state/useSurfaceRefresh.js.map +1 -1
  63. package/lib/client/surface/types.d.ts +5 -1
  64. package/lib/client/surface/types.d.ts.map +1 -1
  65. package/lib/client/view/worktree-view-read.d.ts +3 -0
  66. package/lib/client/view/worktree-view-read.d.ts.map +1 -1
  67. package/lib/client/view/worktree-view-read.js +23 -1
  68. package/lib/client/view/worktree-view-read.js.map +1 -1
  69. package/lib/client/worktree-connection.d.ts +1 -0
  70. package/lib/client/worktree-connection.d.ts.map +1 -1
  71. package/lib/client/worktree-connection.js +2 -0
  72. package/lib/client/worktree-connection.js.map +1 -1
  73. package/lib/client.js +1298 -484
  74. package/lib/client.js.map +1 -1
  75. package/lib/contract/baseline-sync.d.ts +27 -0
  76. package/lib/contract/baseline-sync.d.ts.map +1 -0
  77. package/lib/contract/baseline-sync.js +2 -0
  78. package/lib/contract/baseline-sync.js.map +1 -0
  79. package/lib/contract/index.contract.js +1 -0
  80. package/lib/contract/index.contract.js.map +1 -1
  81. package/lib/contract/index.d.ts +5 -1
  82. package/lib/contract/index.d.ts.map +1 -1
  83. package/lib/contract/index.js +1 -0
  84. package/lib/contract/index.js.map +1 -1
  85. package/lib/contract/worktree-permission.d.ts +2 -0
  86. package/lib/contract/worktree-permission.d.ts.map +1 -1
  87. package/lib/contract/worktree-permission.js +1 -1
  88. package/lib/contract/worktree-permission.js.map +1 -1
  89. package/lib/contract/worktree-tool-changes.d.ts +2 -0
  90. package/lib/contract/worktree-tool-changes.d.ts.map +1 -1
  91. package/lib/host/baseline-sync.d.ts +15 -0
  92. package/lib/host/baseline-sync.d.ts.map +1 -0
  93. package/lib/host/baseline-sync.js +93 -0
  94. package/lib/host/baseline-sync.js.map +1 -0
  95. package/lib/host/remote.d.ts +2 -1
  96. package/lib/host/remote.d.ts.map +1 -1
  97. package/lib/host/remote.js +1 -1
  98. package/lib/host/remote.js.map +1 -1
  99. package/lib/host/service.d.ts +5 -0
  100. package/lib/host/service.d.ts.map +1 -1
  101. package/lib/host/service.js +27 -2
  102. package/lib/host/service.js.map +1 -1
  103. package/lib/host/worktree-permission.d.ts +12 -0
  104. package/lib/host/worktree-permission.d.ts.map +1 -1
  105. package/lib/host/worktree-permission.js +87 -16
  106. package/lib/host/worktree-permission.js.map +1 -1
  107. package/lib/host/worktree-tool-changes.d.ts +1 -1
  108. package/lib/host/worktree-tool-changes.d.ts.map +1 -1
  109. package/lib/host/worktree-tool-changes.js +5 -2
  110. package/lib/host/worktree-tool-changes.js.map +1 -1
  111. package/lib/index.d.ts +1 -1
  112. package/lib/index.d.ts.map +1 -1
  113. package/lib/index.js.map +1 -1
  114. package/lib/manage/manager.d.ts +5 -0
  115. package/lib/manage/manager.d.ts.map +1 -1
  116. package/lib/manage/manager.js +17 -1
  117. package/lib/manage/manager.js.map +1 -1
  118. package/lib/manage/types.d.ts +5 -0
  119. package/lib/manage/types.d.ts.map +1 -1
  120. package/lib/tool/agent-relay.d.ts +55 -0
  121. package/lib/tool/agent-relay.d.ts.map +1 -0
  122. package/lib/tool/agent-relay.js +159 -0
  123. package/lib/tool/agent-relay.js.map +1 -0
  124. package/lib/tool/delegation.d.ts +1 -0
  125. package/lib/tool/delegation.d.ts.map +1 -1
  126. package/lib/tool/delegation.js +32 -6
  127. package/lib/tool/delegation.js.map +1 -1
  128. package/lib/tool/dispatch-session.d.ts +18 -0
  129. package/lib/tool/dispatch-session.d.ts.map +1 -0
  130. package/lib/tool/dispatch-session.js +41 -0
  131. package/lib/tool/dispatch-session.js.map +1 -0
  132. package/lib/tool/errors.d.ts +6 -0
  133. package/lib/tool/errors.d.ts.map +1 -1
  134. package/lib/tool/errors.js +16 -2
  135. package/lib/tool/errors.js.map +1 -1
  136. package/lib/tool/guidance.d.ts +1 -0
  137. package/lib/tool/guidance.d.ts.map +1 -1
  138. package/lib/tool/guidance.js +2 -0
  139. package/lib/tool/guidance.js.map +1 -1
  140. package/lib/tool/index.d.ts.map +1 -1
  141. package/lib/tool/index.js +38 -4
  142. package/lib/tool/index.js.map +1 -1
  143. package/lib/tool/inputs.d.ts.map +1 -1
  144. package/lib/tool/inputs.js +6 -6
  145. package/lib/tool/inputs.js.map +1 -1
  146. package/lib/tool/list-models.js +2 -2
  147. package/lib/tool/list-models.js.map +1 -1
  148. package/lib/tool/list-sessions.js +2 -2
  149. package/lib/tool/list-sessions.js.map +1 -1
  150. package/lib/tool/list-worktrees.js +1 -1
  151. package/lib/tool/list-worktrees.js.map +1 -1
  152. package/lib/tool/native-session.d.ts +4 -0
  153. package/lib/tool/native-session.d.ts.map +1 -1
  154. package/lib/tool/native-session.js +17 -0
  155. package/lib/tool/native-session.js.map +1 -1
  156. package/lib/tool/new-worktree.js +4 -4
  157. package/lib/tool/new-worktree.js.map +1 -1
  158. package/lib/tool/report-result.d.ts.map +1 -1
  159. package/lib/tool/report-result.js +9 -7
  160. package/lib/tool/report-result.js.map +1 -1
  161. package/lib/tool/schema.d.ts +8 -0
  162. package/lib/tool/schema.d.ts.map +1 -1
  163. package/lib/tool/schema.js +31 -2
  164. package/lib/tool/schema.js.map +1 -1
  165. package/lib/tool/send-message.d.ts.map +1 -1
  166. package/lib/tool/send-message.js +8 -7
  167. package/lib/tool/send-message.js.map +1 -1
  168. package/lib/tool/span-worktree.d.ts.map +1 -1
  169. package/lib/tool/span-worktree.js +33 -59
  170. package/lib/tool/span-worktree.js.map +1 -1
  171. package/lib/tool/types.d.ts +2 -0
  172. package/lib/tool/types.d.ts.map +1 -1
  173. package/lib/tool/wire-schema.d.ts +4 -0
  174. package/lib/tool/wire-schema.d.ts.map +1 -0
  175. package/lib/tool/wire-schema.js +24 -0
  176. package/lib/tool/wire-schema.js.map +1 -0
  177. package/lib/typert.host.js +117 -56
  178. package/lib/typert.remote-client.d.ts +3 -1
  179. package/lib/typert.remote-client.d.ts.map +1 -1
  180. package/lib/typert.remote-client.js +117 -56
  181. package/package.json +4 -1
@@ -1,9 +1,9 @@
1
1
  const englishReason = 'This Worktree Session may need Git metadata and linked Worktree files outside the Session directory. '
2
2
  + 'Full Access disables filesystem confinement for this Session; approval prompts remain enabled, '
3
- + 'and network and process policy is unchanged. Continue?';
3
+ + 'and network and process policy is unchanged. The native menu may show Custom when the named preset is unavailable. Continue?';
4
4
  const chineseReason = '这个 Worktree Session 可能需要访问 Session 目录之外的 Git 元数据和关联 Worktree 文件。'
5
5
  + '完全访问会关闭此 Session 的文件系统沙箱,但会保留审批提示,网络和进程策略不变。'
6
- + '是否继续?';
6
+ + '命名预设未加载时,原生菜单可能显示 Custom(自定义)。是否继续?';
7
7
  export function worktreeFullAccessConfirmationMessage(input, locale = globalThis.navigator?.language) {
8
8
  const reason = locale?.toLocaleLowerCase().startsWith('zh') === true
9
9
  ? chineseReason
@@ -41,10 +41,18 @@ export function createWorktreeFullAccessConfirmationController() {
41
41
  request: (input) => {
42
42
  if (disposed)
43
43
  return Promise.resolve(false);
44
- return new Promise((resolve) => {
45
- queue.push({ input, resolve });
46
- showNext();
47
- });
44
+ const existing = [active, ...queue].find(pending => pending !== undefined &&
45
+ pending.input.workspaceId === input.workspaceId &&
46
+ pending.input.worktreeId === input.worktreeId &&
47
+ pending.input.sessionId === input.sessionId &&
48
+ pending.input.cwd === input.cwd);
49
+ if (existing !== undefined)
50
+ return existing.promise;
51
+ let settle;
52
+ const promise = new Promise(resolve => { settle = resolve; });
53
+ queue.push({ input: { ...input }, resolve: settle, promise });
54
+ showNext();
55
+ return promise;
48
56
  },
49
57
  resolve: (confirmed) => {
50
58
  if (active === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"worktree-permission.js","sourceRoot":"","sources":["../../../src/client/permission/worktree-permission.ts"],"names":[],"mappings":"AAeA,MAAM,aAAa,GACjB,uGAAuG;MACrG,iGAAiG;MACjG,wDAAwD,CAAC;AAC7D,MAAM,aAAa,GACjB,kEAAkE;MAChE,8CAA8C;MAC9C,OAAO,CAAC;AAEZ,MAAM,UAAU,qCAAqC,CACnD,KAA0C,EAC1C,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ;IAEvC,MAAM,MAAM,GAAG,MAAM,EAAE,iBAAiB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI;QAClE,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,aAAa,CAAC;IAClB,OAAO,GAAG,MAAM,iBAAiB,KAAK,CAAC,GAAG,EAAE,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,8CAA8C;IAO5D,IAAI,MAAkC,CAAC;IACvC,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,UAAU,GAA6C;QAC3D,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK;QAChC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;YACtB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,QAAQ;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;gBACtC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/B,QAAQ,EAAE,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE;YACrB,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC;YACvB,MAAM,GAAG,SAAS,CAAC;YACnB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC3B,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,GAAG,SAAS,CAAC;YACnB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC;QACX,CAAC;KACF,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"worktree-permission.js","sourceRoot":"","sources":["../../../src/client/permission/worktree-permission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { WorktreeWorkspaceView } from '../view/worktree-view.js';
2
+ import type { WorkspaceListLike } from '../surface/types.js';
3
+ import type { SessionListLike, SessionPresentation } from './session-view.js';
4
+ export interface ActiveSession {
5
+ readonly sessionId: string;
6
+ readonly workspaceId: string;
7
+ readonly workspaceTitle: string;
8
+ /** Undefined while relationship facts are unavailable; null means Local/Main. */
9
+ readonly worktree: string | null | undefined;
10
+ readonly presentation: SessionPresentation;
11
+ }
12
+ /** Join existing ready facts only, independently of tree search, folding and row limits. */
13
+ export declare function activeSessions(sessions: SessionListLike, presentations: Readonly<Record<string, SessionPresentation>>, workspaces: WorkspaceListLike, views: readonly WorktreeWorkspaceView[]): readonly ActiveSession[];
14
+ export interface ActivityClock {
15
+ readonly ongoing: boolean;
16
+ readonly updatedAt: number | undefined;
17
+ readonly since: number | undefined;
18
+ }
19
+ /** Ephemeral display clocks, never an unread owner or persisted Session fact. */
20
+ export declare function activityClocks(previous: ReadonlyMap<string, ActivityClock>, presentations: Readonly<Record<string, SessionPresentation>>, now: number): ReadonlyMap<string, ActivityClock>;
21
+ //# sourceMappingURL=active-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-sessions.d.ts","sourceRoot":"","sources":["../../../src/client/session/active-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;CAC5C;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,EAC5D,UAAU,EAAE,iBAAiB,EAC7B,KAAK,EAAE,SAAS,qBAAqB,EAAE,GACtC,SAAS,aAAa,EAAE,CAqC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAC5C,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,EAC5D,GAAG,EAAE,MAAM,GACV,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAuBpC"}
@@ -0,0 +1,61 @@
1
+ import { workspaceSessionIds } from '../view/view-mode.js';
2
+ /** Join existing ready facts only, independently of tree search, folding and row limits. */
3
+ export function activeSessions(sessions, presentations, workspaces, views) {
4
+ const archived = new Set(workspaces.archivedSessionIds ?? []);
5
+ const listed = new Set(sessions.ids);
6
+ const seen = new Set();
7
+ const result = [];
8
+ for (const workspace of workspaces.items) {
9
+ const view = views.find((item) => item.workspaceId === workspace.workspaceId);
10
+ const members = new Set([
11
+ ...workspaceSessionIds(workspaces, workspace.workspaceId, sessions.ids),
12
+ ...(view?.bindings.map((binding) => binding.sessionId) ?? []),
13
+ ]);
14
+ for (const sessionId of members) {
15
+ const presentation = presentations[sessionId];
16
+ if (seen.has(sessionId) ||
17
+ !listed.has(sessionId) ||
18
+ archived.has(sessionId) ||
19
+ sessions.byId[sessionId]?.blank === true ||
20
+ presentation === undefined ||
21
+ (!presentation.ongoing &&
22
+ !presentation.completed &&
23
+ presentation.status.state !== 'warning'))
24
+ continue;
25
+ seen.add(sessionId);
26
+ const binding = view?.bindings.find((item) => item.sessionId === sessionId);
27
+ const record = view?.worktrees.find((item) => item.worktreeId === binding?.worktreeId);
28
+ result.push({
29
+ sessionId,
30
+ workspaceId: workspace.workspaceId,
31
+ workspaceTitle: workspace.title,
32
+ worktree: binding === undefined ? (view === undefined ? undefined : null) : record?.branch,
33
+ presentation,
34
+ });
35
+ }
36
+ }
37
+ return result.sort((a, b) => (b.presentation.updatedAt ?? 0) - (a.presentation.updatedAt ?? 0));
38
+ }
39
+ /** Ephemeral display clocks, never an unread owner or persisted Session fact. */
40
+ export function activityClocks(previous, presentations, now) {
41
+ return new Map(Object.entries(presentations).map(([id, presentation]) => {
42
+ const old = previous.get(id);
43
+ const transitioned = old !== undefined && old.ongoing !== presentation.ongoing;
44
+ const newPrompt = presentation.ongoing &&
45
+ presentation.updatedAt !== undefined &&
46
+ (old?.updatedAt === undefined || presentation.updatedAt > old.updatedAt);
47
+ return [
48
+ id,
49
+ {
50
+ ongoing: presentation.ongoing,
51
+ updatedAt: presentation.updatedAt,
52
+ since: transitioned
53
+ ? now
54
+ : newPrompt
55
+ ? presentation.updatedAt
56
+ : (old?.since ?? presentation.updatedAt),
57
+ },
58
+ ];
59
+ }));
60
+ }
61
+ //# sourceMappingURL=active-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-sessions.js","sourceRoot":"","sources":["../../../src/client/session/active-sessions.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@ export declare function createWorktreeDiagnostics(): {
9
9
  getSnapshot: () => readonly WorktreeDiagnostic[];
10
10
  subscribe: (listener: () => void) => () => void;
11
11
  publish(source: string, notices: readonly WorktreeNotification[]): void;
12
+ /** Late results retain evidence without reactivating an unmounted UI source. */
13
+ recordInactive(source: string, notices: readonly WorktreeNotification[]): void;
12
14
  deactivate(source: string): void;
13
15
  clearHistory(): void;
14
16
  dispose(): void;
@@ -17,6 +19,8 @@ export declare const worktreeDiagnostics: {
17
19
  getSnapshot: () => readonly WorktreeDiagnostic[];
18
20
  subscribe: (listener: () => void) => () => void;
19
21
  publish(source: string, notices: readonly WorktreeNotification[]): void;
22
+ /** Late results retain evidence without reactivating an unmounted UI source. */
23
+ recordInactive(source: string, notices: readonly WorktreeNotification[]): void;
20
24
  deactivate(source: string): void;
21
25
  clearHistory(): void;
22
26
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/client/settings/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;CAChE;AAED,2FAA2F;AAC3F,wBAAgB,yBAAyB;;0BAmBf,MAAM,IAAI;oBAIhB,MAAM,WAAW,SAAS,oBAAoB,EAAE;uBAqB7C,MAAM;;;EAe5B;AAGD,eAAO,MAAM,mBAAmB;;0BA3CN,MAAM,IAAI;oBAIhB,MAAM,WAAW,SAAS,oBAAoB,EAAE;uBAqB7C,MAAM;;;CAkBiC,CAAC"}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/client/settings/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;CAChE;AAED,2FAA2F;AAC3F,wBAAgB,yBAAyB;;0BAmBf,MAAM,IAAI;oBAIhB,MAAM,WAAW,SAAS,oBAAoB,EAAE;IAqBhE,gFAAgF;2BACzD,MAAM,WAAW,SAAS,oBAAoB,EAAE;uBAUpD,MAAM;;;EAe5B;AAGD,eAAO,MAAM,mBAAmB;;0BAtDN,MAAM,IAAI;oBAIhB,MAAM,WAAW,SAAS,oBAAoB,EAAE;IAqBhE,gFAAgF;2BACzD,MAAM,WAAW,SAAS,oBAAoB,EAAE;uBAUpD,MAAM;;;CAkBiC,CAAC"}
@@ -42,6 +42,18 @@ export function createWorktreeDiagnostics() {
42
42
  limitHistory();
43
43
  emit();
44
44
  },
45
+ /** Late results retain evidence without reactivating an unmounted UI source. */
46
+ recordInactive(source, notices) {
47
+ if (notices.length === 0)
48
+ return;
49
+ for (const notice of notices) {
50
+ snapshot = [...snapshot.filter((entry) => entry.key !== notice.key), {
51
+ ...notice, source, status: 'inactive', actions: [],
52
+ }];
53
+ }
54
+ limitHistory();
55
+ emit();
56
+ },
45
57
  deactivate(source) {
46
58
  sources.delete(source);
47
59
  retire(source, 'inactive');
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/client/settings/diagnostics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/client/settings/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store';
2
+ import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
3
+ import type { SteerState } from './steer-state.js';
4
+ export interface SteerDockInjected {
5
+ readonly steer: ObservableSnapshot<SteerState | undefined>;
6
+ }
7
+ export declare function SteerDock({ useProjection, steer, t }: PropsRuntime<'conversation.input.dock'> & PropsLocale<'worktree'> & SteerDockInjected): import("react").JSX.Element | null;
8
+ //# sourceMappingURL=SteerDock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SteerDock.d.ts","sourceRoot":"","sources":["../../../src/client/steer/SteerDock.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAIlF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CAC5D;AAED,wBAAgB,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,yBAAyB,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,iBAAiB,sCAoB3I"}
@@ -0,0 +1,12 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useSyncExternalStore } from 'react';
3
+ import { visibleSteerRows } from './steer-state.js';
4
+ import styles from './steer.css';
5
+ export function SteerDock({ useProjection, steer, t }) {
6
+ const state = useSyncExternalStore(steer.subscribe, steer.getSnapshot, steer.getSnapshot);
7
+ const rows = visibleSteerRows(state, useProjection('inbox'));
8
+ if (rows.length === 0)
9
+ return null;
10
+ return _jsxs("section", { className: styles.strip, "aria-label": t('steer.title'), children: [_jsxs("div", { className: styles.title, children: [t('steer.title'), " \u00B7 ", rows.length] }), _jsx("div", { className: styles.items, children: rows.map(row => _jsxs("details", { className: styles.item, "data-worktree-steer": row.status, children: [_jsxs("summary", { children: [_jsx("span", { className: styles.status, children: t(`steer.${row.status}`) }), _jsx("span", { className: styles.preview, children: row.text })] }), _jsxs("div", { className: styles.body, children: [_jsx("div", { className: styles.sender, children: t('steer.sender', { sender: row.sender }) }), _jsx("p", { children: row.text }), _jsx("small", { children: t('steer.receiptHint') })] })] }, row.id)) })] });
11
+ }
12
+ //# sourceMappingURL=SteerDock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SteerDock.js","sourceRoot":"","sources":["../../../src/client/steer/SteerDock.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAO7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,MAAM,MAAM,aAAa,CAAC;AAMjC,MAAM,UAAU,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAyF;IAC1I,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,mBAAS,SAAS,EAAE,MAAM,CAAC,KAAK,gBAAc,CAAC,CAAC,aAAa,CAAC,aACnE,eAAK,SAAS,EAAE,MAAM,CAAC,KAAK,aAAG,CAAC,CAAC,aAAa,CAAC,cAAK,IAAI,CAAC,MAAM,IAAO,EACtE,cAAK,SAAS,EAAE,MAAM,CAAC,KAAK,YACzB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,mBAAsB,SAAS,EAAE,MAAM,CAAC,IAAI,yBAAuB,GAAG,CAAC,MAAM,aAC5F,8BACE,eAAM,SAAS,EAAE,MAAM,CAAC,MAAM,YAAG,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,GAAQ,EACjE,eAAM,SAAS,EAAE,MAAM,CAAC,OAAO,YAAG,GAAG,CAAC,IAAI,GAAQ,IAC1C,EACV,eAAK,SAAS,EAAE,MAAM,CAAC,IAAI,aACzB,cAAK,SAAS,EAAE,MAAM,CAAC,MAAM,YAAG,CAAC,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAO,EAChF,sBAAI,GAAG,CAAC,IAAI,GAAK,EACjB,0BAAQ,CAAC,CAAC,mBAAmB,CAAC,GAAS,IACnC,KATuB,GAAG,CAAC,EAAE,CAU3B,CAAC,GACP,IACE,CAAC;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import type { ConversationNodeDefinition, ConversationViewDefinition, ConversationViewNode } from '@deepseek-ai/dsh-client-ui-conversation/client';
3
+ import type { SteerState } from './steer-state.js';
4
+ export declare const WORKTREE_STEER_TARGET = "clutch-dsh-worktree-steer";
5
+ declare module '@deepseek-ai/dsh-client-ui-conversation/client' {
6
+ interface ConversationViewSnapshotMap {
7
+ 'clutch-dsh-worktree-steer': SteerState;
8
+ }
9
+ }
10
+ /** One Session-local fold, rebuilt by native history replacement and pagination. */
11
+ export declare const worktreeSteerNode: ConversationNodeDefinition<SteerState>;
12
+ type SteerNode = ConversationViewNode & {
13
+ readonly data: SteerState;
14
+ };
15
+ export declare const worktreeSteerView: ConversationViewDefinition<SteerNode, SteerState>;
16
+ export declare function installWorktreeSteerActivity(ctx: Context): void;
17
+ export {};
18
+ //# sourceMappingURL=steer-activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steer-activity.d.ts","sourceRoot":"","sources":["../../../src/client/steer/steer-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AAEnJ,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,eAAO,MAAM,qBAAqB,8BAA8B,CAAC;AAEjE,OAAO,QAAQ,gDAAgD,CAAC;IAC9D,UAAU,2BAA2B;QACnC,2BAA2B,EAAE,UAAU,CAAC;KACzC;CACF;AAED,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,EAAE,0BAA0B,CAAC,UAAU,CAYpE,CAAC;AAEF,KAAK,SAAS,GAAG,oBAAoB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AACtE,eAAO,MAAM,iBAAiB,EAAE,0BAA0B,CAAC,SAAS,EAAE,UAAU,CAY/E,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAM/D"}
@@ -0,0 +1,37 @@
1
+ import { EMPTY_STEER_STATE, reduceSteerState, steerRelay } from './steer-state.js';
2
+ export const WORKTREE_STEER_TARGET = 'clutch-dsh-worktree-steer';
3
+ /** One Session-local fold, rebuilt by native history replacement and pagination. */
4
+ export const worktreeSteerNode = {
5
+ kind: WORKTREE_STEER_TARGET,
6
+ target: WORKTREE_STEER_TARGET,
7
+ match: event => event.type === 'turn/start' || event.type === 'agent/inbox/spliced' ||
8
+ (event.type === 'user/message' && event.surfaceOp === 'append' && steerRelay(event.data) !== undefined)
9
+ ? { id: 'state', role: 'start' } : null,
10
+ start: (_context, match) => reduceSteerState(EMPTY_STEER_STATE, match.event),
11
+ update: (context, match) => reduceSteerState(context.state, match.event),
12
+ buildViewNode: context => context.state === undefined ? null : {
13
+ key: context.key, kind: WORKTREE_STEER_TARGET, id: context.id,
14
+ target: WORKTREE_STEER_TARGET, data: context.state,
15
+ },
16
+ };
17
+ export const worktreeSteerView = {
18
+ target: WORKTREE_STEER_TARGET,
19
+ create: () => {
20
+ let state = EMPTY_STEER_STATE;
21
+ return {
22
+ empty: EMPTY_STEER_STATE,
23
+ replace: ({ nodes }) => (state = nodes.at(-1)?.data ?? EMPTY_STEER_STATE),
24
+ apply: ({ upserts }) => (state = upserts.at(-1)?.data ?? state),
25
+ };
26
+ },
27
+ // A status strip must not turn an otherwise blank Session into a Chat view.
28
+ isActive: () => false,
29
+ };
30
+ export function installWorktreeSteerActivity(ctx) {
31
+ ctx.effect(() => {
32
+ const node = ctx.uiConversation.events.register(worktreeSteerNode);
33
+ const view = ctx.uiConversation.views.register(worktreeSteerView);
34
+ return () => { view(); node(); };
35
+ }, 'clutch-dsh-worktree: steer activity');
36
+ }
37
+ //# sourceMappingURL=steer-activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steer-activity.js","sourceRoot":"","sources":["../../../src/client/steer/steer-activity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AAQjE,oFAAoF;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAA2C;IACvE,IAAI,EAAE,qBAAqB;IAC3B,MAAM,EAAE,qBAAqB;IAC7B,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB;QACjF,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;QACvG,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;IACzC,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC;IAC5E,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACxE,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE;QAC7D,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK;KACnD;CACF,CAAC;AAGF,MAAM,CAAC,MAAM,iBAAiB,GAAsD;IAClF,MAAM,EAAE,qBAAqB;IAC7B,MAAM,EAAE,GAAG,EAAE;QACX,IAAI,KAAK,GAAG,iBAAiB,CAAC;QAC9B,OAAO;YACL,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,iBAAiB,CAAC;YACzE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC;SAChE,CAAC;IACJ,CAAC;IACD,4EAA4E;IAC5E,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;CACtB,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,GAAY;IACvD,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAClE,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,EAAE,qCAAqC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** Read-only presentation of this plugin's native next-step relay occurrences. */
2
+ export interface SteerRow {
3
+ readonly id: string;
4
+ readonly sender: string;
5
+ readonly text: string;
6
+ readonly status: 'pending' | 'preparing' | 'received' | 'canceled' | 'unknown';
7
+ }
8
+ export interface SteerState {
9
+ /** Full native positions, including other producers, needed to interpret splices. */
10
+ readonly pending: readonly string[] | undefined;
11
+ readonly rows: readonly SteerRow[];
12
+ }
13
+ export declare const EMPTY_STEER_STATE: SteerState;
14
+ /** Identity and source must both identify a Worktree task relay, never a report or human echo. */
15
+ export declare function steerRelay(value: unknown): SteerRow | undefined;
16
+ /** Replay native evidence; an inbox claim alone never establishes receipt or completion. */
17
+ export declare function reduceSteerState(state: SteerState, event: {
18
+ readonly type: string;
19
+ readonly data: unknown;
20
+ readonly surfaceOp?: unknown;
21
+ }): SteerState;
22
+ /** Merge the authoritative pending projection with verified, current/recent-turn receipts. */
23
+ export declare function visibleSteerRows(state: SteerState | undefined, inbox: unknown): readonly SteerRow[];
24
+ //# sourceMappingURL=steer-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steer-state.d.ts","sourceRoot":"","sources":["../../../src/client/steer/steer-state.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;CAChF;AAED,MAAM,WAAW,UAAU;IACzB,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;CACpC;AAED,eAAO,MAAM,iBAAiB,EAAE,UAAsC,CAAC;AAOvE,kGAAkG;AAClG,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAe/D;AAQD,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,UAAU,CAyCtJ;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,QAAQ,EAAE,CAoBnG"}
@@ -0,0 +1,102 @@
1
+ export const EMPTY_STEER_STATE = { pending: [], rows: [] };
2
+ const RECENT_LIMIT = 8;
3
+ function object(value) {
4
+ return typeof value === 'object' && value !== null ? value : undefined;
5
+ }
6
+ /** Identity and source must both identify a Worktree task relay, never a report or human echo. */
7
+ export function steerRelay(value) {
8
+ const message = object(value);
9
+ const source = object(message?.source);
10
+ if (typeof message?.id !== 'string' || !/^clutch-worktree-relay:[a-f0-9]{64}$/.test(message.id) ||
11
+ message.role !== 'user' || source?.kind !== 'agent-message' || source.form !== 'relay' ||
12
+ typeof source.senderSessionId !== 'string' || !Array.isArray(message.content))
13
+ return undefined;
14
+ const content = message.content.map(object);
15
+ const envelope = 'Agent ' + source.senderSessionId + ' sent a message: ';
16
+ const body = content[0]?.type === 'text' && content[0].text === envelope ? content.slice(1) : content;
17
+ return {
18
+ id: message.id,
19
+ sender: source.senderSessionId,
20
+ text: body.flatMap(part => part?.type === 'text' && typeof part.text === 'string' ? [part.text] : []).join('\n'),
21
+ status: 'pending',
22
+ };
23
+ }
24
+ function bounded(rows) {
25
+ const recent = rows.filter(row => row.status !== 'pending' && row.status !== 'preparing').slice(-RECENT_LIMIT);
26
+ const keep = new Set(recent.map(row => row.id));
27
+ return rows.filter(row => row.status === 'pending' || row.status === 'preparing' || keep.has(row.id));
28
+ }
29
+ /** Replay native evidence; an inbox claim alone never establishes receipt or completion. */
30
+ export function reduceSteerState(state, event) {
31
+ const data = object(event.data);
32
+ if (event.type === 'turn/start') {
33
+ return { ...state, rows: bounded(state.rows.filter(row => row.status === 'pending' || row.status === 'preparing')
34
+ .map(row => row.status === 'preparing' ? { ...row, status: 'unknown' } : row)) };
35
+ }
36
+ if (event.type === 'user/message') {
37
+ if (event.surfaceOp !== 'append')
38
+ return state;
39
+ const receipt = steerRelay(data);
40
+ if (receipt === undefined)
41
+ return state;
42
+ const rows = state.rows.map(row => row.id === receipt.id && row.sender === receipt.sender && row.text === receipt.text
43
+ ? { ...row, status: 'received' } : row);
44
+ return { ...state, rows: bounded(rows) };
45
+ }
46
+ if (event.type !== 'agent/inbox/spliced' || !Array.isArray(data?.inserted))
47
+ return state;
48
+ const inserted = data.inserted;
49
+ if (data.target === 'next-turn') {
50
+ // A canceled activity can route a steer to the normal Queue; native QueueDock owns it.
51
+ const queued = new Set(inserted.map(item => object(item)?.id));
52
+ return { ...state, rows: state.rows.filter(row => !queued.has(row.id)) };
53
+ }
54
+ if (data.target !== 'next-step')
55
+ return state;
56
+ const start = data.start;
57
+ const count = data.removedCount ?? 0;
58
+ const ids = inserted.map(item => object(item)?.id);
59
+ const valid = typeof start === 'number' && Number.isSafeInteger(start) && start >= 0 &&
60
+ typeof count === 'number' && Number.isSafeInteger(count) && count >= 0 && ids.every(id => typeof id === 'string');
61
+ const positionsKnown = valid && state.pending !== undefined && start + count <= state.pending.length;
62
+ const previous = state.pending ?? [];
63
+ const removed = new Set(positionsKnown ? previous.slice(start, start + count) : []);
64
+ const pending = positionsKnown
65
+ ? [...previous.slice(0, start), ...ids, ...previous.slice(start + count)]
66
+ : undefined;
67
+ let rows = state.rows.map(row => removed.has(row.id)
68
+ ? { ...row, status: data.outcome === 'canceled' ? 'canceled' : 'preparing' }
69
+ : !positionsKnown && (row.status === 'pending' || row.status === 'preparing') ? { ...row, status: 'unknown' } : row);
70
+ for (const item of inserted) {
71
+ const relay = steerRelay(item);
72
+ if (relay !== undefined)
73
+ rows = [...rows.filter(row => row.id !== relay.id), relay];
74
+ }
75
+ return { pending, rows: bounded(rows) };
76
+ }
77
+ /** Merge the authoritative pending projection with verified, current/recent-turn receipts. */
78
+ export function visibleSteerRows(state, inbox) {
79
+ const projection = object(inbox);
80
+ const queued = new Set(Array.isArray(projection?.['next-turn'])
81
+ ? projection['next-turn'].map(item => object(item)?.id) : []);
82
+ const rows = new Map((state?.rows ?? []).map(row => [row.id, row]));
83
+ if (Array.isArray(projection?.['next-step'])) {
84
+ for (const value of projection['next-step']) {
85
+ const relay = steerRelay(value);
86
+ if (relay !== undefined && !rows.has(relay.id))
87
+ rows.set(relay.id, relay);
88
+ }
89
+ }
90
+ // Projection absence is not an empty inbox and cannot prove consumption.
91
+ const waiting = Array.isArray(projection?.['next-step']) ? new Set(projection['next-step'].map(item => object(item)?.id)) : undefined;
92
+ const order = [...(waiting ?? [])];
93
+ const rank = new Map(order.map((id, index) => [id, index]));
94
+ return [...rows.values()].filter(row => !queued.has(row.id)).map((row) => {
95
+ if (row.status === 'unknown' && waiting?.has(row.id))
96
+ return { ...row, status: 'pending' };
97
+ if (row.status === 'pending' && !waiting?.has(row.id))
98
+ return { ...row, status: waiting === undefined ? 'unknown' : 'preparing' };
99
+ return row;
100
+ }).sort((a, b) => (rank.get(a.id) ?? order.length) - (rank.get(b.id) ?? order.length));
101
+ }
102
+ //# sourceMappingURL=steer-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steer-state.js","sourceRoot":"","sources":["../../../src/client/steer/steer-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type ActiveSession } from '../../session/active-sessions.js';
2
+ import { type SessionListLike, type SessionPresentation } from '../../session/session-view.js';
3
+ import type { WorktreeTranslate } from '../types.js';
4
+ type Input = {
5
+ readonly entries: readonly ActiveSession[];
6
+ readonly sessions: SessionListLike;
7
+ readonly presentations: Readonly<Record<string, SessionPresentation>>;
8
+ readonly t: WorktreeTranslate;
9
+ readonly hidden: boolean;
10
+ readonly onOpenSession: (workspaceId: string, sessionId: string) => void;
11
+ };
12
+ export declare function SessionActivityBell({ entries, sessions, presentations, t, hidden, onOpenSession, }: Input): import("react").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=SessionActivityBell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionActivityBell.d.ts","sourceRoot":"","sources":["../../../../src/client/surface/components/SessionActivityBell.tsx"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,+BAA+B,CAAC;AAMvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1E,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,EACR,aAAa,EACb,CAAC,EACD,MAAM,EACN,aAAa,GACd,EAAE,KAAK,+BA6KP"}
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useRef, useState } from 'react';
3
+ import { createPortal } from 'react-dom';
4
+ import { MenuSurface, StateDot, Tooltip, useAnchoredPosition, useDismissOnOutsidePointer, } from '@deepseek-ai/dsh-client-ui-primitives';
5
+ import { activityClocks, } from '../../session/active-sessions.js';
6
+ import { relativeTime, sessionDisplayLabel, } from '../../session/session-view.js';
7
+ import { sessionHoverTimeLabel, sessionStatusLabel, sessionTimeLabel, } from '../../session/session-labels.js';
8
+ import styles from '../../worktree.css';
9
+ export function SessionActivityBell({ entries, sessions, presentations, t, hidden, onOpenSession, }) {
10
+ const [open, setOpen] = useState(false);
11
+ const [now, setNow] = useState(Date.now);
12
+ const clocks = useRef(new Map());
13
+ const root = useRef(null);
14
+ const trigger = useRef(null);
15
+ const panel = useRef(null);
16
+ const panelId = useId();
17
+ const visible = open && !hidden;
18
+ const position = useAnchoredPosition({
19
+ open: visible,
20
+ anchorRef: trigger,
21
+ panelRef: panel,
22
+ side: 'bottom',
23
+ align: 'end',
24
+ gap: 8,
25
+ margin: 8,
26
+ });
27
+ useDismissOnOutsidePointer(root, visible, setOpen, panel);
28
+ useEffect(() => {
29
+ const timestamp = Date.now();
30
+ clocks.current = activityClocks(clocks.current, presentations, timestamp);
31
+ setNow(timestamp);
32
+ }, [presentations]);
33
+ useEffect(() => {
34
+ if (hidden)
35
+ setOpen(false);
36
+ }, [hidden]);
37
+ useEffect(() => {
38
+ if (!visible)
39
+ return;
40
+ const timer = window.setInterval(() => setNow(Date.now()), 1000);
41
+ const dismiss = (event) => {
42
+ if (event.key === 'Escape') {
43
+ event.preventDefault();
44
+ setOpen(false);
45
+ trigger.current?.focus();
46
+ }
47
+ };
48
+ document.addEventListener('keydown', dismiss);
49
+ return () => {
50
+ window.clearInterval(timer);
51
+ document.removeEventListener('keydown', dismiss);
52
+ };
53
+ }, [visible]);
54
+ useEffect(() => {
55
+ if (visible && position !== null)
56
+ panel.current?.focus();
57
+ }, [visible, position === null]);
58
+ const hasActivity = entries.length > 0;
59
+ return (_jsxs("span", { ref: root, className: styles.activityBell, children: [_jsx(Tooltip, { label: t('activity.title'), side: "bottom", delayMs: 500, disabled: visible, children: _jsxs("button", { ref: trigger, type: "button", className: styles.iconButton, "aria-label": hasActivity ? t('activity.count', { n: entries.length }) : t('activity.title'), "aria-expanded": visible, "aria-haspopup": "dialog", "aria-controls": visible ? panelId : undefined, "data-session-activity": hasActivity ? 'active' : 'empty', onClick: () => {
60
+ setNow(Date.now());
61
+ setOpen((value) => !value);
62
+ }, children: [_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.25", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M6.25 13a1.8 1.8 0 0 0 3.5 0M2.5 11.5c1-1 1.25-2 1.25-4.5a4.25 4.25 0 0 1 8.5 0c0 2.5.25 3.5 1.25 4.5Z" }) }), hasActivity && _jsx("span", { className: styles.activityBadge, "aria-hidden": "true" })] }) }), visible &&
63
+ createPortal(_jsxs(MenuSurface, { ref: panel, id: panelId, role: "dialog", "aria-label": t('activity.title'), tabIndex: -1, className: styles.activityPanel, style: { ...position, visibility: position === null ? 'hidden' : undefined }, onBlur: (event) => {
64
+ const next = event.relatedTarget;
65
+ if (next instanceof Node &&
66
+ !event.currentTarget.contains(next) &&
67
+ !root.current?.contains(next))
68
+ setOpen(false);
69
+ }, children: [_jsx("div", { className: styles.activityHeading, children: t('activity.title') }), entries.length === 0 ? (_jsx("p", { className: styles.activityEmpty, children: t('activity.empty') })) : (_jsx("ul", { className: styles.activityList, children: entries.map((entry) => {
70
+ const { sessionId, presentation } = entry;
71
+ const status = sessionStatusLabel(t, presentation.status);
72
+ const since = clocks.current.get(sessionId)?.since ?? presentation.updatedAt;
73
+ const time = relativeTime(since, now);
74
+ const duration = since === undefined ? undefined : Math.max(0, Math.floor((now - since) / 1000));
75
+ const timeLabel = time === undefined
76
+ ? undefined
77
+ : presentation.ongoing
78
+ ? t('activity.runningFor', {
79
+ t: duration !== undefined && duration < 60
80
+ ? t('activity.seconds', { n: duration })
81
+ : sessionTimeLabel(t, time),
82
+ })
83
+ : sessionHoverTimeLabel(t, time);
84
+ return (_jsx("li", { children: _jsxs("button", { type: "button", className: styles.activityEntry, "data-activity-session": sessionId, onClick: () => {
85
+ setOpen(false);
86
+ onOpenSession(entry.workspaceId, sessionId);
87
+ }, children: [_jsxs("span", { className: styles.activityIdentity, children: [_jsx("span", { className: styles.activityName, children: sessionDisplayLabel(sessionId, sessions, t('session.new')) }), _jsx("span", { className: styles.activityContext, title: entry.workspaceTitle, children: entry.workspaceTitle }), _jsx("span", { className: styles.activityContext, title: entry.worktree ?? undefined, children: entry.worktree === null
88
+ ? t('worktree.main')
89
+ : (entry.worktree ?? t('activity.unknownWorktree')) })] }), _jsxs("span", { className: styles.activityMetadata, children: [_jsx("span", { role: "img", "aria-label": status, title: status, children: _jsx(StateDot, { state: presentation.status.state }) }), timeLabel !== undefined && (_jsx("span", { className: styles.activityTime, children: timeLabel }))] })] }) }, sessionId));
90
+ }) }))] }), document.body)] }));
91
+ }
92
+ //# sourceMappingURL=SessionActivityBell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionActivityBell.js","sourceRoot":"","sources":["../../../../src/client/surface/components/SessionActivityBell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,WAAW,EACX,QAAQ,EACR,OAAO,EACP,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,cAAc,GAGf,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,mBAAmB,GAGpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAWxC,MAAM,UAAU,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,EACR,aAAa,EACb,CAAC,EACD,MAAM,EACN,aAAa,GACP;IACN,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAqC,IAAI,GAAG,EAAE,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;IAChC,MAAM,QAAQ,GAAG,mBAAmB,CAAC;QACnC,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,OAAO;QAClB,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,CAAC;QACN,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;IACH,0BAA0B,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QAC1E,MAAM,CAAC,SAAS,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACb,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,CAAC,KAAoB,EAAE,EAAE;YACvC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5B,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACd,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,IAAI,QAAQ,KAAK,IAAI;YAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,OAAO,CACL,gBAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,aAC7C,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,YAChF,kBACE,GAAG,EAAE,OAAO,EACZ,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,UAAU,gBAE1B,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,mBAEjE,OAAO,mBACR,QAAQ,mBACP,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,2BACrB,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EACvD,OAAO,EAAE,GAAG,EAAE;wBACZ,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;wBACnB,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;oBAC7B,CAAC,aAED,cACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,MAAM,EAClB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,iBACV,MAAM,YAElB,eAAM,CAAC,EAAC,wGAAwG,GAAG,GAC/G,EACL,WAAW,IAAI,eAAM,SAAS,EAAE,MAAM,CAAC,aAAa,iBAAc,MAAM,GAAG,IACrE,GACD,EACT,OAAO;gBACN,YAAY,CACV,MAAC,WAAW,IACV,GAAG,EAAE,KAAK,EACV,EAAE,EAAE,OAAO,EACX,IAAI,EAAC,QAAQ,gBACD,CAAC,CAAC,gBAAgB,CAAC,EAC/B,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAE,MAAM,CAAC,aAAa,EAC/B,KAAK,EAAE,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,EAC5E,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;wBAChB,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;wBACjC,IACE,IAAI,YAAY,IAAI;4BACpB,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;4BACnC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC;4BAE7B,OAAO,CAAC,KAAK,CAAC,CAAC;oBACnB,CAAC,aAED,cAAK,SAAS,EAAE,MAAM,CAAC,eAAe,YAAG,CAAC,CAAC,gBAAgB,CAAC,GAAO,EAClE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,YAAG,SAAS,EAAE,MAAM,CAAC,aAAa,YAAG,CAAC,CAAC,gBAAgB,CAAC,GAAK,CAC9D,CAAC,CAAC,CAAC,CACF,aAAI,SAAS,EAAE,MAAM,CAAC,YAAY,YAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gCACrB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;gCAC1C,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;gCAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,YAAY,CAAC,SAAS,CAAC;gCAC7E,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gCACtC,MAAM,QAAQ,GACZ,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gCAClF,MAAM,SAAS,GACb,IAAI,KAAK,SAAS;oCAChB,CAAC,CAAC,SAAS;oCACX,CAAC,CAAC,YAAY,CAAC,OAAO;wCACpB,CAAC,CAAC,CAAC,CAAC,qBAAqB,EAAE;4CACvB,CAAC,EACC,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,EAAE;gDACrC,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;gDACxC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;yCAChC,CAAC;wCACJ,CAAC,CAAC,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gCACvC,OAAO,CACL,uBACE,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,MAAM,CAAC,aAAa,2BACR,SAAS,EAChC,OAAO,EAAE,GAAG,EAAE;4CACZ,OAAO,CAAC,KAAK,CAAC,CAAC;4CACf,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;wCAC9C,CAAC,aAED,gBAAM,SAAS,EAAE,MAAM,CAAC,gBAAgB,aACtC,eAAM,SAAS,EAAE,MAAM,CAAC,YAAY,YACjC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,GACtD,EACP,eAAM,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,YACjE,KAAK,CAAC,cAAc,GAChB,EACP,eACE,SAAS,EAAE,MAAM,CAAC,eAAe,EACjC,KAAK,EAAE,KAAK,CAAC,QAAQ,IAAI,SAAS,YAEjC,KAAK,CAAC,QAAQ,KAAK,IAAI;4DACtB,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;4DACpB,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,0BAA0B,CAAC,CAAC,GAChD,IACF,EACP,gBAAM,SAAS,EAAE,MAAM,CAAC,gBAAgB,aACtC,eAAM,IAAI,EAAC,KAAK,gBAAa,MAAM,EAAE,KAAK,EAAE,MAAM,YAChD,KAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,GAAI,GACzC,EACN,SAAS,KAAK,SAAS,IAAI,CAC1B,eAAM,SAAS,EAAE,MAAM,CAAC,YAAY,YAAG,SAAS,GAAQ,CACzD,IACI,IACA,IAlCF,SAAS,CAmCb,CACN,CAAC;4BACJ,CAAC,CAAC,GACC,CACN,IACW,EACd,QAAQ,CAAC,IAAI,CACd,IACE,CACR,CAAC;AACJ,CAAC"}
@@ -6,10 +6,11 @@ import type { useSurfaceSources } from '../state/useSurfaceSources.js';
6
6
  type Input = {
7
7
  expansion: Pick<ReturnType<typeof useSessionExpansion>, 'searchExpanded' | 'searchRoot' | 'setSearchExpanded' | 'searchInput' | 'searchQuery' | 'setSearchQuery' | 'setExpandedArchivedWorkspaces' | 'setExpandedSessionGroups' | 'setCurrentSessionReveal' | 'currentSessionLocation'>;
8
8
  props: Pick<WorktreeSurfaceProps, 't' | 'expandState' | 'createWorkspace' | 'actions'>;
9
- source: Pick<ReturnType<typeof useSurfaceSources>, 'workspaceIds'>;
9
+ source: Pick<ReturnType<typeof useSurfaceSources>, 'workspaceIds' | 'sessions' | 'sessionPresentations' | 'workspaces' | 'collapsed' | 'bounds'>;
10
+ onOpenSession: (workspaceId: string, sessionId: string) => void;
10
11
  read: Pick<ReturnType<typeof useSurfaceRefresh>, 'readState'>;
11
12
  mutation: Pick<ReturnType<typeof useSurfaceMutation>, 'runMutation'>;
12
13
  };
13
- export declare function SurfaceHeader({ expansion, props, source, read, mutation }: Input): import("react").JSX.Element;
14
+ export declare function SurfaceHeader({ expansion, props, source, read, mutation, onOpenSession }: Input): import("react").JSX.Element;
14
15
  export {};
15
16
  //# sourceMappingURL=SurfaceHeader.d.ts.map