@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.
- package/README.md +120 -10
- package/README.zh.md +96 -10
- package/assets/screenshots/screenshots-agent-steer.jpg +0 -0
- package/assets/screenshots/screenshots-baseline-sync.png +0 -0
- package/lib/client/WorktreeSurface.d.ts.map +1 -1
- package/lib/client/WorktreeSurface.js +19 -3
- package/lib/client/WorktreeSurface.js.map +1 -1
- package/lib/client/context/worktree-context-store.d.ts +3 -1
- package/lib/client/context/worktree-context-store.d.ts.map +1 -1
- package/lib/client/context/worktree-context-store.js +3 -2
- package/lib/client/context/worktree-context-store.js.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.d.ts +8 -3
- package/lib/client/dashboard/WorktreeDashboard.d.ts.map +1 -1
- package/lib/client/dashboard/WorktreeDashboard.js +120 -12
- package/lib/client/dashboard/WorktreeDashboard.js.map +1 -1
- package/lib/client/dashboard/dashboard-selection.d.ts +4 -0
- package/lib/client/dashboard/dashboard-selection.d.ts.map +1 -1
- package/lib/client/dashboard/dashboard-selection.js +23 -0
- package/lib/client/dashboard/dashboard-selection.js.map +1 -1
- package/lib/client/dsh-slot-contract.d.ts +8 -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 +22 -4
- package/lib/client/entry.js.map +1 -1
- package/lib/client/locales.d.ts +58 -0
- package/lib/client/locales.d.ts.map +1 -1
- package/lib/client/locales.js +66 -8
- package/lib/client/locales.js.map +1 -1
- package/lib/client/permission/worktree-permission.d.ts.map +1 -1
- package/lib/client/permission/worktree-permission.js +14 -6
- package/lib/client/permission/worktree-permission.js.map +1 -1
- package/lib/client/session/active-sessions.d.ts +21 -0
- package/lib/client/session/active-sessions.d.ts.map +1 -0
- package/lib/client/session/active-sessions.js +61 -0
- package/lib/client/session/active-sessions.js.map +1 -0
- package/lib/client/settings/diagnostics.d.ts +4 -0
- package/lib/client/settings/diagnostics.d.ts.map +1 -1
- package/lib/client/settings/diagnostics.js +12 -0
- package/lib/client/settings/diagnostics.js.map +1 -1
- package/lib/client/steer/SteerDock.d.ts +8 -0
- package/lib/client/steer/SteerDock.d.ts.map +1 -0
- package/lib/client/steer/SteerDock.js +12 -0
- package/lib/client/steer/SteerDock.js.map +1 -0
- package/lib/client/steer/steer-activity.d.ts +18 -0
- package/lib/client/steer/steer-activity.d.ts.map +1 -0
- package/lib/client/steer/steer-activity.js +37 -0
- package/lib/client/steer/steer-activity.js.map +1 -0
- package/lib/client/steer/steer-state.d.ts +24 -0
- package/lib/client/steer/steer-state.d.ts.map +1 -0
- package/lib/client/steer/steer-state.js +102 -0
- package/lib/client/steer/steer-state.js.map +1 -0
- package/lib/client/surface/components/SessionActivityBell.d.ts +14 -0
- package/lib/client/surface/components/SessionActivityBell.d.ts.map +1 -0
- package/lib/client/surface/components/SessionActivityBell.js +92 -0
- package/lib/client/surface/components/SessionActivityBell.js.map +1 -0
- package/lib/client/surface/components/SurfaceHeader.d.ts +3 -2
- package/lib/client/surface/components/SurfaceHeader.d.ts.map +1 -1
- package/lib/client/surface/components/SurfaceHeader.js +4 -2
- package/lib/client/surface/components/SurfaceHeader.js.map +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.d.ts.map +1 -1
- package/lib/client/surface/state/useSurfaceRefresh.js +6 -3
- package/lib/client/surface/state/useSurfaceRefresh.js.map +1 -1
- package/lib/client/surface/types.d.ts +5 -1
- package/lib/client/surface/types.d.ts.map +1 -1
- package/lib/client/view/worktree-view-read.d.ts +3 -0
- package/lib/client/view/worktree-view-read.d.ts.map +1 -1
- package/lib/client/view/worktree-view-read.js +23 -1
- package/lib/client/view/worktree-view-read.js.map +1 -1
- package/lib/client/worktree-connection.d.ts +1 -0
- package/lib/client/worktree-connection.d.ts.map +1 -1
- package/lib/client/worktree-connection.js +2 -0
- package/lib/client/worktree-connection.js.map +1 -1
- package/lib/client.js +1298 -484
- package/lib/client.js.map +1 -1
- package/lib/contract/baseline-sync.d.ts +27 -0
- package/lib/contract/baseline-sync.d.ts.map +1 -0
- package/lib/contract/baseline-sync.js +2 -0
- package/lib/contract/baseline-sync.js.map +1 -0
- package/lib/contract/index.contract.js +1 -0
- package/lib/contract/index.contract.js.map +1 -1
- package/lib/contract/index.d.ts +5 -1
- package/lib/contract/index.d.ts.map +1 -1
- package/lib/contract/index.js +1 -0
- package/lib/contract/index.js.map +1 -1
- package/lib/contract/worktree-permission.d.ts +2 -0
- package/lib/contract/worktree-permission.d.ts.map +1 -1
- package/lib/contract/worktree-permission.js +1 -1
- package/lib/contract/worktree-permission.js.map +1 -1
- package/lib/contract/worktree-tool-changes.d.ts +2 -0
- package/lib/contract/worktree-tool-changes.d.ts.map +1 -1
- package/lib/host/baseline-sync.d.ts +15 -0
- package/lib/host/baseline-sync.d.ts.map +1 -0
- package/lib/host/baseline-sync.js +93 -0
- package/lib/host/baseline-sync.js.map +1 -0
- package/lib/host/remote.d.ts +2 -1
- package/lib/host/remote.d.ts.map +1 -1
- package/lib/host/remote.js +1 -1
- package/lib/host/remote.js.map +1 -1
- package/lib/host/service.d.ts +5 -0
- package/lib/host/service.d.ts.map +1 -1
- package/lib/host/service.js +27 -2
- package/lib/host/service.js.map +1 -1
- package/lib/host/worktree-permission.d.ts +12 -0
- package/lib/host/worktree-permission.d.ts.map +1 -1
- package/lib/host/worktree-permission.js +87 -16
- package/lib/host/worktree-permission.js.map +1 -1
- package/lib/host/worktree-tool-changes.d.ts +1 -1
- package/lib/host/worktree-tool-changes.d.ts.map +1 -1
- package/lib/host/worktree-tool-changes.js +5 -2
- package/lib/host/worktree-tool-changes.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/manage/manager.d.ts +5 -0
- package/lib/manage/manager.d.ts.map +1 -1
- package/lib/manage/manager.js +17 -1
- package/lib/manage/manager.js.map +1 -1
- package/lib/manage/types.d.ts +5 -0
- package/lib/manage/types.d.ts.map +1 -1
- package/lib/tool/agent-relay.d.ts +55 -0
- package/lib/tool/agent-relay.d.ts.map +1 -0
- package/lib/tool/agent-relay.js +159 -0
- package/lib/tool/agent-relay.js.map +1 -0
- package/lib/tool/delegation.d.ts +1 -0
- package/lib/tool/delegation.d.ts.map +1 -1
- package/lib/tool/delegation.js +32 -6
- package/lib/tool/delegation.js.map +1 -1
- package/lib/tool/dispatch-session.d.ts +18 -0
- package/lib/tool/dispatch-session.d.ts.map +1 -0
- package/lib/tool/dispatch-session.js +41 -0
- package/lib/tool/dispatch-session.js.map +1 -0
- package/lib/tool/errors.d.ts +6 -0
- package/lib/tool/errors.d.ts.map +1 -1
- package/lib/tool/errors.js +16 -2
- package/lib/tool/errors.js.map +1 -1
- package/lib/tool/guidance.d.ts +1 -0
- package/lib/tool/guidance.d.ts.map +1 -1
- package/lib/tool/guidance.js +2 -0
- package/lib/tool/guidance.js.map +1 -1
- package/lib/tool/index.d.ts.map +1 -1
- package/lib/tool/index.js +38 -4
- package/lib/tool/index.js.map +1 -1
- package/lib/tool/inputs.d.ts.map +1 -1
- package/lib/tool/inputs.js +6 -6
- package/lib/tool/inputs.js.map +1 -1
- package/lib/tool/list-models.js +2 -2
- package/lib/tool/list-models.js.map +1 -1
- package/lib/tool/list-sessions.js +2 -2
- package/lib/tool/list-sessions.js.map +1 -1
- package/lib/tool/list-worktrees.js +1 -1
- package/lib/tool/list-worktrees.js.map +1 -1
- package/lib/tool/native-session.d.ts +4 -0
- package/lib/tool/native-session.d.ts.map +1 -1
- package/lib/tool/native-session.js +17 -0
- package/lib/tool/native-session.js.map +1 -1
- package/lib/tool/new-worktree.js +4 -4
- package/lib/tool/new-worktree.js.map +1 -1
- package/lib/tool/report-result.d.ts.map +1 -1
- package/lib/tool/report-result.js +9 -7
- package/lib/tool/report-result.js.map +1 -1
- package/lib/tool/schema.d.ts +8 -0
- package/lib/tool/schema.d.ts.map +1 -1
- package/lib/tool/schema.js +31 -2
- package/lib/tool/schema.js.map +1 -1
- package/lib/tool/send-message.d.ts.map +1 -1
- package/lib/tool/send-message.js +8 -7
- package/lib/tool/send-message.js.map +1 -1
- package/lib/tool/span-worktree.d.ts.map +1 -1
- package/lib/tool/span-worktree.js +33 -59
- package/lib/tool/span-worktree.js.map +1 -1
- package/lib/tool/types.d.ts +2 -0
- package/lib/tool/types.d.ts.map +1 -1
- package/lib/tool/wire-schema.d.ts +4 -0
- package/lib/tool/wire-schema.d.ts.map +1 -0
- package/lib/tool/wire-schema.js +24 -0
- package/lib/tool/wire-schema.js.map +1 -0
- package/lib/typert.host.js +117 -56
- package/lib/typert.remote-client.d.ts +3 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +117 -56
- 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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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,
|
|
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;
|
|
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":"AAQA,2FAA2F;AAC3F,MAAM,UAAU,yBAAyB;IACvC,IAAI,QAAQ,GAAkC,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2C,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QAClF,QAAQ,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,MAA+B,EAAE,OAAO,IAAI,GAAG,EAAU,EAAE,EAAE;QAC3F,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAChC,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;YAC1E,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YACnC,CAAC,CAAC,KAAK,CACV,CAAC;QACF,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC;IACF,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC3B,SAAS,EAAE,CAAC,QAAoB,EAAE,EAAE;YAClC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,CAAC,MAAc,EAAE,OAAwC;YAC9D,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAuB;oBAChC,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;oBACnC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;wBAC/C,GAAG,MAAM;wBACT,OAAO,EAAE,GAAG,EAAE;4BACZ,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO;gCACnF,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;4BAChD,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ;gCAAE,OAAO,CAAC,OAAO,EAAE,CAAC;wBACpE,CAAC;qBACF,CAAC,CAAC;iBACJ,CAAC;gBACF,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC5E,CAAC;YACD,8EAA8E;YAC9E,YAAY,EAAE,CAAC;YACf,IAAI,EAAE,CAAC;QACT,CAAC;QACD,gFAAgF;QAChF,cAAc,CAAC,MAAc,EAAE,OAAwC;YACrE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE;wBACnE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;qBACnD,CAAC,CAAC;YACL,CAAC;YACD,YAAY,EAAE,CAAC;YACf,IAAI,EAAE,CAAC;QACT,CAAC;QACD,UAAU,CAAC,MAAc;YACvB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC;QACT,CAAC;QACD,YAAY;YACV,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;YACjE,IAAI,EAAE,CAAC;QACT,CAAC;QACD,OAAO;YACL,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,QAAQ,GAAG,EAAE,CAAC;YACd,IAAI,EAAE,CAAC;QACT,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,EAAE,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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
|