@huanlin/dsh-focus-chat 0.1.23

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 (52) hide show
  1. package/README.md +73 -0
  2. package/README.zh.md +71 -0
  3. package/cordis.patch.yml +7 -0
  4. package/lib/client.js +6051 -0
  5. package/lib/index.js +6 -0
  6. package/lib/types/client/apply.d.ts +12 -0
  7. package/lib/types/client/contract/props.d.ts +78 -0
  8. package/lib/types/client/index.d.ts +10 -0
  9. package/lib/types/client/locales.d.ts +437 -0
  10. package/lib/types/client/model/feedback-controller.d.ts +161 -0
  11. package/lib/types/client/model/flow.d.ts +76 -0
  12. package/lib/types/client/model/index.d.ts +5 -0
  13. package/lib/types/client/model/text.d.ts +42 -0
  14. package/lib/types/client/model/todo.d.ts +38 -0
  15. package/lib/types/client/model/tools.d.ts +35 -0
  16. package/lib/types/client/model/turn-slice.d.ts +38 -0
  17. package/lib/types/client/model/types.d.ts +289 -0
  18. package/lib/types/client/view/FocusView.d.ts +9 -0
  19. package/lib/types/client/view/chrome/ImageLightbox.d.ts +26 -0
  20. package/lib/types/client/view/chrome/MessageActions.d.ts +24 -0
  21. package/lib/types/client/view/chrome/MessageFeedbackActions.d.ts +46 -0
  22. package/lib/types/client/view/chrome/MessageImage.d.ts +46 -0
  23. package/lib/types/client/view/chrome/NavRail.d.ts +21 -0
  24. package/lib/types/client/view/chrome/ReferenceIcon.d.ts +17 -0
  25. package/lib/types/client/view/chrome/RunningStatus.d.ts +7 -0
  26. package/lib/types/client/view/chrome/TurnNavigator.d.ts +14 -0
  27. package/lib/types/client/view/helpers/format.d.ts +30 -0
  28. package/lib/types/client/view/helpers/icons.d.ts +9 -0
  29. package/lib/types/client/view/helpers/image-labels.d.ts +13 -0
  30. package/lib/types/client/view/helpers/message.d.ts +13 -0
  31. package/lib/types/client/view/helpers/terminal.d.ts +20 -0
  32. package/lib/types/client/view/rows/CommandRow.d.ts +12 -0
  33. package/lib/types/client/view/rows/CompactionRow.d.ts +24 -0
  34. package/lib/types/client/view/rows/ContextRow.d.ts +22 -0
  35. package/lib/types/client/view/rows/FlowRow.d.ts +20 -0
  36. package/lib/types/client/view/rows/RemoteTurnRow.d.ts +33 -0
  37. package/lib/types/client/view/rows/RetryRow.d.ts +10 -0
  38. package/lib/types/client/view/rows/SystemPromptRow.d.ts +12 -0
  39. package/lib/types/client/view/rows/ThinkRow.d.ts +16 -0
  40. package/lib/types/client/view/rows/ToolCallRow.d.ts +8 -0
  41. package/lib/types/client/view/rows/ToolGroupRow.d.ts +11 -0
  42. package/lib/types/client/view/rows/TurnFoldRow.d.ts +27 -0
  43. package/lib/types/client/view/rows/TurnTailRow.d.ts +16 -0
  44. package/lib/types/client/view/rows/TurnUsageDisclosure.d.ts +9 -0
  45. package/lib/types/client/view/rows/UserBubble.d.ts +18 -0
  46. package/lib/types/client/view/rows/group-title.d.ts +32 -0
  47. package/lib/types/client/view/rows/produced-fit.d.ts +14 -0
  48. package/lib/types/host/rpc.d.ts +63 -0
  49. package/lib/types/host/turn-index.d.ts +40 -0
  50. package/lib/types/index.d.ts +3 -0
  51. package/lib/types/protocol.d.ts +94 -0
  52. package/package.json +109 -0
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Browser-local object layer over one Session's durable message-feedback
3
+ * sidecar. The Host owns per-item compare-and-set: every mutation carries the
4
+ * version this controller last observed, and a `version-conflict` reply carries
5
+ * the authoritative item, so a lost race reconciles from the reply itself
6
+ * instead of refetching the whole Session.
7
+ * @module @deepseek-ai/dsh-client-ui-message-feedback/client/controller
8
+ */
9
+ import type { RemoteResult } from '@deepseek-ai/dsh-typert-protocol';
10
+ import type { HostObservable } from '@deepseek-ai/dsh-client-ui-slots';
11
+ import type { MessageId, SessionId } from '@deepseek-ai/dsh-client-connection/client';
12
+ import type { MessageFeedbackDeleteResult, MessageFeedbackItem, MessageFeedbackListResult, MessageFeedbackPutResult, MessageFeedbackRating } from '@deepseek-ai/dsh-message-feedback/types';
13
+ /**
14
+ * The three Remote calls this controller needs. The generated face wraps every
15
+ * business result in {@link RemoteResult}: a carrier failure arrives as the
16
+ * `ok: false` branch rather than a rejection, so this controller reads one
17
+ * envelope and never wraps a call to recover a transport error.
18
+ */
19
+ export interface MessageFeedbackRemote {
20
+ list: (request: {
21
+ sessionId: SessionId;
22
+ }) => Promise<RemoteResult<MessageFeedbackListResult>>;
23
+ put: (request: {
24
+ sessionId: SessionId;
25
+ messageId: MessageId;
26
+ rating: MessageFeedbackRating;
27
+ note?: string;
28
+ ifVersion: MessageFeedbackItem['version'] | null;
29
+ }) => Promise<RemoteResult<MessageFeedbackPutResult>>;
30
+ delete: (request: {
31
+ sessionId: SessionId;
32
+ messageId: MessageId;
33
+ ifVersion: MessageFeedbackItem['version'];
34
+ }) => Promise<RemoteResult<MessageFeedbackDeleteResult>>;
35
+ }
36
+ /** Load state of the one list read that seeds every per-message control. */
37
+ export type MessageFeedbackStatus = 'cold' | 'loading' | 'ready' | 'error';
38
+ /** Immutable view published to every per-message control in one Session. */
39
+ export interface MessageFeedbackView {
40
+ status: MessageFeedbackStatus;
41
+ /** Current item per message, keyed by the addressed message id. */
42
+ items: ReadonlyMap<MessageId, MessageFeedbackItem>;
43
+ /** Reason the last load failed, cleared by the next successful load. */
44
+ error: string | null;
45
+ }
46
+ /** Settled action shape rendered by the message-level controls. */
47
+ export type MessageFeedbackActionResult = {
48
+ ok: true;
49
+ } | {
50
+ ok: false;
51
+ error: {
52
+ code: string;
53
+ message: string;
54
+ };
55
+ };
56
+ /**
57
+ * Per-session feedback object layer. One instance backs every per-message
58
+ * control in that Session, so a single list read seeds them all.
59
+ */
60
+ export declare class MessageFeedbackController implements HostObservable<MessageFeedbackView> {
61
+ private readonly remote;
62
+ private readonly sessionId;
63
+ private view;
64
+ private readonly listeners;
65
+ private loadPromise;
66
+ private operationTail;
67
+ private disposed;
68
+ /**
69
+ * @param remote - the messageFeedback Remote namespace.
70
+ * @param sessionId - Session owning every addressed assistant message.
71
+ */
72
+ constructor(remote: MessageFeedbackRemote, sessionId: SessionId);
73
+ /** Return the cached immutable view. */
74
+ getSnapshot: () => MessageFeedbackView;
75
+ /** Subscribe to view replacement. */
76
+ subscribe: (listener: () => void) => (() => void);
77
+ /**
78
+ * Load once; a failed load stays retryable.
79
+ * @returns the settled load result, shared by concurrent callers.
80
+ */
81
+ ensure(): Promise<MessageFeedbackActionResult>;
82
+ /**
83
+ * Re-read the authoritative list, collapsing concurrent callers onto one
84
+ * in-flight read.
85
+ *
86
+ * This is the unserialized read used to seed a cold controller, where no
87
+ * mutation can be in flight yet. A reconnect must use {@link resync} instead:
88
+ * an unserialized list response can otherwise arrive after a newer mutation's
89
+ * reply and overwrite the version that mutation just committed.
90
+ * @returns the settled reload result.
91
+ */
92
+ refresh(): Promise<MessageFeedbackActionResult>;
93
+ /**
94
+ * Re-read the list behind this Session's queued mutations, so a reconnect
95
+ * cannot resurrect a version an in-flight mutation already replaced.
96
+ * @returns the settled reload result.
97
+ */
98
+ resync(): Promise<MessageFeedbackActionResult>;
99
+ /**
100
+ * Create or replace feedback for one message, comparing against the version
101
+ * this controller last observed.
102
+ *
103
+ * The note is resolved here rather than by the caller: `mutate` awaits the
104
+ * one list read first, so this body always sees the committed item, while a
105
+ * control that rendered before that read completed would still be holding
106
+ * `undefined`. Omitting `note` therefore keeps whatever is stored; only
107
+ * {@link clearNote} removes one.
108
+ * @param messageId - target assistant message.
109
+ * @param rating - desired judgment.
110
+ * @param note - replacement explanation; omitted keeps the stored note.
111
+ * @returns the settled mutation result.
112
+ */
113
+ rate(messageId: MessageId, rating: MessageFeedbackRating, note?: string): Promise<MessageFeedbackActionResult>;
114
+ /**
115
+ * Replace one message's rating with the opposite judgment, or retract it when
116
+ * the committed rating already matches. The decision reads the committed item
117
+ * inside the serialized mutation, so a click that lands before the first list
118
+ * read still toggles against the stored value rather than the empty view a
119
+ * cold control rendered.
120
+ * @param messageId - target assistant message.
121
+ * @param rating - the judgment the human asked for.
122
+ * @returns the settled mutation result.
123
+ */
124
+ toggle(messageId: MessageId, rating: MessageFeedbackRating): Promise<MessageFeedbackActionResult>;
125
+ /**
126
+ * Drop the note while keeping the rating. Absent feedback needs no call.
127
+ * @param messageId - target assistant message.
128
+ * @returns the settled mutation result.
129
+ */
130
+ clearNote(messageId: MessageId): Promise<MessageFeedbackActionResult>;
131
+ /**
132
+ * Remove feedback for one message. A message with no known item is already
133
+ * in the requested state, so no call is made.
134
+ * @param messageId - target assistant message.
135
+ * @returns the settled mutation result.
136
+ */
137
+ clear(messageId: MessageId): Promise<MessageFeedbackActionResult>;
138
+ /** Commit one put against the observed version and reconcile a conflict. */
139
+ private putCommitted;
140
+ /** Commit one delete against the observed version and reconcile a conflict. */
141
+ private deleteCommitted;
142
+ /** Drop subscribers and refuse further work when the owning fiber unloads. */
143
+ dispose(): void;
144
+ /** Fetch the whole sidecar and publish it as the seeded view. */
145
+ private load;
146
+ /**
147
+ * Serialize one mutation behind this Session's prior mutation so queued
148
+ * operations always compare against the committed version, and translate a
149
+ * transport throw into the same settled shape the controls already render.
150
+ */
151
+ private mutate;
152
+ /**
153
+ * Replace one message's entry, keeping every other entry's identity. Only a
154
+ * `mutate` operation reaches this, and `mutate` refuses admission once the
155
+ * controller is disposed, so no disposal guard belongs here; `publish` is
156
+ * the single place that stops notifying after listeners are dropped.
157
+ */
158
+ private commit;
159
+ /** Replace the view and contain subscriber failures at the observable boundary. */
160
+ private publish;
161
+ }
@@ -0,0 +1,76 @@
1
+ import type { ChatConversationViewNode, ToolCallBlock } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ import { type ToolRowModelCache } from './tools.ts';
3
+ import type { FocusFlowItem } from './types.ts';
4
+ /**
5
+ * One derived flow item plus the identity facts it was derived from. The
6
+ * signature holds node/data references only — O(1) per node per rebuild —
7
+ * so an unchanged node reuses its previous item object and memoized rows
8
+ * never re-render while the rest of the conversation streams.
9
+ */
10
+ interface CachedFlowItem {
11
+ readonly signature: unknown;
12
+ readonly item: FocusFlowItem | null;
13
+ }
14
+ /**
15
+ * Cross-build cache for the focus flow derivation: per-node derived items,
16
+ * the tool-row models the groups fold, and whole tool-group rows. Keyed by
17
+ * stable node/call ids, holding only immutable snapshot references, so it
18
+ * never grows beyond the conversation and is discarded with the view.
19
+ */
20
+ export interface FlowBuildCache {
21
+ readonly items: Map<string, CachedFlowItem>;
22
+ readonly rows: ToolRowModelCache['rows'];
23
+ /** One emitted tool-group row per run (its node keys), valid while the
24
+ * run's blocks keep their references and the group absorbed no context
25
+ * batch (an absorption changes the group's shape). */
26
+ readonly groups: Map<string, {
27
+ blocks: readonly ToolCallBlock[];
28
+ item: FocusFlowItem;
29
+ }>;
30
+ }
31
+ /** One cache instance per mounted focus view (the build is React-free). */
32
+ export declare function createFlowBuildCache(): FlowBuildCache;
33
+ /**
34
+ * Every chat-target node kind's disposition in this module, compile-checked
35
+ * against the merge-extensible {@link ChatNodeKind}: a new upstream kind (the
36
+ * map grows) fails the `Record` for its missing key, and a removed kind fails
37
+ * the excess-property check — a renamed event can no longer degrade silently
38
+ * into the `unknown` fallback row (the gap behind the system-prompt /
39
+ * turn-process / turn-max-tokens regressions).
40
+ */
41
+ export declare const CHAT_KIND_DISPOSITION: {
42
+ 'assistant-step': string;
43
+ command: string;
44
+ compaction: string;
45
+ context: string;
46
+ 'manual-compaction': string;
47
+ 'model-retry': string;
48
+ steering: string;
49
+ 'system-prompt': string;
50
+ 'tool-call': string;
51
+ 'turn-error': string;
52
+ 'turn-max-tokens': string;
53
+ 'turn-process': string;
54
+ 'turn-tail': string;
55
+ unknown: string;
56
+ user: string;
57
+ };
58
+ /**
59
+ * Build the condensed flow over the chat snapshot: consecutive `tool-call`
60
+ * nodes fold into one group per run, and directly-consecutive runs merge
61
+ * into a single group. A completed turn (its wall duration known) folds
62
+ * everything except the closing assistant's reply — every intermediate
63
+ * assistant row and tool run — into one `工作了 X 分 Y 秒` line, keeping the
64
+ * running turn unfolded. Stale keys (node vanished from the live store) are
65
+ * dropped.
66
+ * @param order - snapshot chat order (stable node keys).
67
+ * @param getNode - snapshot chat node reader.
68
+ * @param cwd - session workspace root for relative path summaries.
69
+ * @param home - host account home; a leftover POSIX home path displays as `~`.
70
+ * @param cache - optional cross-build derivation cache: unchanged nodes and
71
+ * tool calls keep their previous item/row object identities, so memoized
72
+ * rows bail out while only the streaming tail changes.
73
+ * @returns the condensed flow in order.
74
+ */
75
+ export declare function buildFocusFlow(order: readonly string[], getNode: (key: string) => ChatConversationViewNode | undefined, cwd?: string, home?: string, cache?: FlowBuildCache): FocusFlowItem[];
76
+ export {};
@@ -0,0 +1,5 @@
1
+ /** The focus flow model: pure derivations over the chat snapshot (React-free). */
2
+ export * from './types.ts';
3
+ export * from './tools.ts';
4
+ export * from './flow.ts';
5
+ export * from './text.ts';
@@ -0,0 +1,42 @@
1
+ /** Text derivations of the focus flow model (React-free). */
2
+ import type { AssistantBlock, AssistantChatData } from '@deepseek-ai/dsh-client-ui-chat/client';
3
+ import type { ContentBlock } from '@deepseek-ai/dsh-llm/types';
4
+ import type { FocusDeliverablesData } from './types.ts';
5
+ export declare function assistantText(blocks: readonly AssistantBlock[]): string;
6
+ /**
7
+ * Files one closing assistant produced: mutation paths settled at or before
8
+ * the closing seq, in first-seen order, deduped (the ui-deliverables
9
+ * derivation, reimplemented here).
10
+ * @param data - engine-published deliverables for one turn.
11
+ * @param seq - closing assistant seq; later tool settlements are excluded.
12
+ * @returns produced paths in first-seen order; empty when the turn wrote nothing.
13
+ */
14
+ export declare function producedForClosing(data: Readonly<FocusDeliverablesData> | undefined, seq: number): readonly string[];
15
+ /**
16
+ * Resolve a terminal view's working directory the way the render-intent
17
+ * contract assigns to the UI bridge: an absolute path is used as-is, a
18
+ * relative one joins under the session workspace, and an omitted one IS the
19
+ * session workspace (the chat derivation). Without a session cwd there is
20
+ * nothing to resolve against, so a relative path stays as authored.
21
+ * @param viewCwd - the cwd the terminal call view carries, if any.
22
+ * @param sessionCwd - the session workspace root, if the caller knows it.
23
+ * @returns the working directory for the prompt label, or undefined.
24
+ */
25
+ export declare function relativizeToCwd(text: string, cwd: string | undefined): string;
26
+ /** Concatenate text content blocks (the result body the row expands to). */
27
+ export declare function flattenText(content: readonly ContentBlock[]): string;
28
+ /**
29
+ * Assistant thinking duration: time from the step's start to its first
30
+ * non-empty token delta. Only meaningful once the step is settled; null
31
+ * when the timing boundaries are unavailable.
32
+ * @param data - the assistant chat node data.
33
+ * @returns thinking time in ms, or null when not derivable.
34
+ */
35
+ export declare function thoughtDurationMs(data: AssistantChatData): number | null;
36
+ /**
37
+ * Display seconds for a duration: one decimal under ten seconds, whole
38
+ * seconds beyond. Unit-less so the locale templates own the suffix.
39
+ * @param ms - Duration in milliseconds (negatives clamp to zero).
40
+ * @returns display number in seconds without unit.
41
+ */
42
+ export declare function formatSeconds(ms: number): string;
@@ -0,0 +1,38 @@
1
+ /** Pure plan derivation for the todo_write row's one-line summary (copied
2
+ * from the official chat's `toolviews/plan-summary.ts`). Several items may
3
+ * be `in_progress` at once — parallel work runs concurrent tasks, so a
4
+ * summary built from one active item would silently drop the rest. */
5
+ /**
6
+ * One list item as the row sees it: unvalidated model JSON parsed from a
7
+ * call's args, so any field may be missing or mistyped.
8
+ */
9
+ export interface PlanItemLike {
10
+ content?: unknown;
11
+ status?: unknown;
12
+ }
13
+ /**
14
+ * Counts plus the two halves of the summary, deliberately NOT pre-joined:
15
+ * the row ellipsizes its summary text, and a count concatenated onto the end
16
+ * of the task name is the first thing a narrow row clips — exactly when it
17
+ * carries information. The row renders `activeExtra` as a non-shrinking
18
+ * suffix beside the truncatable text.
19
+ */
20
+ export interface PlanSummary {
21
+ done: number;
22
+ total: number;
23
+ /** First `in_progress` content, or null when that first item is unusable. */
24
+ activeContent: string | null;
25
+ /** Active items beyond the first; 0 whenever there is no `activeContent` to sit beside. */
26
+ activeExtra: number;
27
+ }
28
+ /**
29
+ * Derive the counts and the active summary from a whole-list snapshot. It
30
+ * names the first `in_progress` item and counts the remaining active ones,
31
+ * so a parallel plan reports how many tasks are running rather than naming
32
+ * one and hiding the others. `activeContent` is null when nothing is in
33
+ * progress, or when the first active item's content is missing, mistyped, or
34
+ * blank once trimmed — the row then renders the counts alone.
35
+ * @param todos - the whole list, in model order.
36
+ * @returns the done/total counts and the two summary halves.
37
+ */
38
+ export declare function planSummary(todos: readonly PlanItemLike[]): PlanSummary;
@@ -0,0 +1,35 @@
1
+ import type { ToolCallBlock } from '@deepseek-ai/dsh-client-ui-chat/client';
2
+ import type { FocusGroupThink, FocusMetricKey, FocusToolGroup, FocusToolRow } from './types.ts';
3
+ export declare const METRIC_BY_TOOL: Readonly<Record<string, FocusMetricKey>>;
4
+ /**
5
+ * Per-build tool-row cache: the derived row model keyed by call id, kept
6
+ * only while the underlying block reference is unchanged. Settled history
7
+ * dominates long sessions, and its block objects are identity-stable, so
8
+ * cached rows let every flow rebuild skip the args JSON parse, card
9
+ * materialization, and path normalization for settled calls.
10
+ */
11
+ export interface ToolRowModelCache {
12
+ readonly rows: Map<string, {
13
+ block: ToolCallBlock;
14
+ row: FocusToolRow;
15
+ }>;
16
+ }
17
+ /**
18
+ * Derive the condensed row model from a frozen call slice (the chat row
19
+ * model's derivation, reimplemented here), caching by call id: a repeat
20
+ * build over an unchanged block reference reuses the previous row object —
21
+ * same identity, so memoized rows never re-render.
22
+ * @param block - running call or settled result node.
23
+ * @param cwd - session workspace root; workspace-rooted path summaries display relative to it.
24
+ * @param home - host account home; a leftover POSIX home path displays as `~`.
25
+ * @param cache - optional per-session row cache (stable across builds).
26
+ * @returns the row model.
27
+ */
28
+ export declare function toolRowModel(block: ToolCallBlock, cwd?: string, home?: string, cache?: ToolRowModelCache): FocusToolRow;
29
+ /** A running call paints no live row until it has run this long: fast
30
+ * calls (a few hundred ms) would otherwise flash a live row that settles
31
+ * into the summary a moment later — the debounce skips the flash. */
32
+ export declare const LIVE_ROW_THRESHOLD_MS = 400;
33
+ /** Fold one consecutive run of root calls into a group model. */
34
+ export declare function toolGroup(blocks: readonly ToolCallBlock[], cwd: string | undefined, thoughtMs: number | null, think: readonly FocusGroupThink[], home?: string, cache?: ToolRowModelCache): FocusToolGroup;
35
+ /** Resolve one node's data into the flow item family, or null to skip (turn-tail chrome). */
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Remote turn-slice projection: the durable event slice of one completed
3
+ * turn → the focus flow items its expanded row renders. React-free, in the
4
+ * same posture as `toolRowModel`: the chat's derivations, reimplemented here
5
+ * because the bundle cannot import another plugin's runtime values.
6
+ *
7
+ * Fold semantics align with `flow.ts` (0.1.22): consecutive tool calls fold
8
+ * into one group, directly-consecutive runs merge, context injections
9
+ * (including turn-less notices, counted as background jobs) absorb into the
10
+ * adjacent run, steering interjections stay visible rows between runs, and
11
+ * the closing reply's reasoning moves out of the reply row. Settled history
12
+ * never consumes chunk rows — `assistant/message` carries the final blocks;
13
+ * chunks feed the step timing (thinking time, TTFT, decode throughput) only.
14
+ * @module dsh-focus-chat/client/model/turn-slice
15
+ */
16
+ import type { ContentBlock } from '@deepseek-ai/dsh-llm/types';
17
+ import type { SessionEvent } from '@deepseek-ai/dsh-session/types';
18
+ import type { AssistantBlock } from '@deepseek-ai/dsh-client-ui-chat/client';
19
+ import type { FocusFlowItem } from './types.ts';
20
+ /** One projected turn: the work rows, the closing reply, and the turn tail. */
21
+ export interface TurnSlice {
22
+ /** The turn's interior rows in flow order: context folds, tool groups, intermediate rows, steering bubbles. */
23
+ readonly work: readonly FocusFlowItem[];
24
+ /** The closing reply's assistant row; null when the turn has no text reply. */
25
+ readonly closing: FocusFlowItem | null;
26
+ /** The turn-tail row (branch disabled; the deliverables lane is window-only). */
27
+ readonly tail: FocusFlowItem | null;
28
+ }
29
+ /** Classify one finalized assistant block (the chat's content switch). */
30
+ export declare function toAssistantBlock(block: ContentBlock): AssistantBlock;
31
+ /**
32
+ * Project one completed turn's durable event slice into the focus flow items.
33
+ * @param events - the `[turn/start..turn/end]` closed event slice, in seq order.
34
+ * @param cwd - session workspace root for relative path summaries.
35
+ * @param home - host account home; a leftover POSIX home path displays as `~`.
36
+ * @returns the turn's work rows, closing reply, and tail row.
37
+ */
38
+ export declare function projectTurnSlice(events: readonly SessionEvent[], cwd?: string, home?: string): TurnSlice;