@ahggg/dsh-side-chat 0.1.0-alpha.1

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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -0
  3. package/README.zh-CN.md +114 -0
  4. package/cordis.patch.yml +3 -0
  5. package/lib/client/apply.d.ts +5 -0
  6. package/lib/client/apply.d.ts.map +1 -0
  7. package/lib/client/apply.js +35 -0
  8. package/lib/client/apply.js.map +1 -0
  9. package/lib/client/contracts.d.ts +76 -0
  10. package/lib/client/contracts.d.ts.map +1 -0
  11. package/lib/client/contracts.js +2 -0
  12. package/lib/client/contracts.js.map +1 -0
  13. package/lib/client/index.d.ts +11 -0
  14. package/lib/client/index.d.ts.map +1 -0
  15. package/lib/client/index.js +9 -0
  16. package/lib/client/index.js.map +1 -0
  17. package/lib/client/panel/SelectionQuote.d.ts +10 -0
  18. package/lib/client/panel/SelectionQuote.d.ts.map +1 -0
  19. package/lib/client/panel/SelectionQuote.js +8 -0
  20. package/lib/client/panel/SelectionQuote.js.map +1 -0
  21. package/lib/client/panel/SendIcon.d.ts +3 -0
  22. package/lib/client/panel/SendIcon.d.ts.map +1 -0
  23. package/lib/client/panel/SendIcon.js +6 -0
  24. package/lib/client/panel/SendIcon.js.map +1 -0
  25. package/lib/client/panel/SideChatBody.d.ts +6 -0
  26. package/lib/client/panel/SideChatBody.d.ts.map +1 -0
  27. package/lib/client/panel/SideChatBody.js +6 -0
  28. package/lib/client/panel/SideChatBody.js.map +1 -0
  29. package/lib/client/panel/SideChatErrorState.d.ts +9 -0
  30. package/lib/client/panel/SideChatErrorState.d.ts.map +1 -0
  31. package/lib/client/panel/SideChatErrorState.js +6 -0
  32. package/lib/client/panel/SideChatErrorState.js.map +1 -0
  33. package/lib/client/panel/SideChatHeader.d.ts +9 -0
  34. package/lib/client/panel/SideChatHeader.d.ts.map +1 -0
  35. package/lib/client/panel/SideChatHeader.js +5 -0
  36. package/lib/client/panel/SideChatHeader.js.map +1 -0
  37. package/lib/client/panel/SideChatPanel.d.ts +17 -0
  38. package/lib/client/panel/SideChatPanel.d.ts.map +1 -0
  39. package/lib/client/panel/SideChatPanel.js +35 -0
  40. package/lib/client/panel/SideChatPanel.js.map +1 -0
  41. package/lib/client/panel/messages.d.ts +22 -0
  42. package/lib/client/panel/messages.d.ts.map +1 -0
  43. package/lib/client/panel/messages.js +43 -0
  44. package/lib/client/panel/messages.js.map +1 -0
  45. package/lib/client/panel/use-auto-growing-textarea.d.ts +3 -0
  46. package/lib/client/panel/use-auto-growing-textarea.d.ts.map +1 -0
  47. package/lib/client/panel/use-auto-growing-textarea.js +21 -0
  48. package/lib/client/panel/use-auto-growing-textarea.js.map +1 -0
  49. package/lib/client/parent-composer/add-to-conversation.d.ts +4 -0
  50. package/lib/client/parent-composer/add-to-conversation.d.ts.map +1 -0
  51. package/lib/client/parent-composer/add-to-conversation.js +25 -0
  52. package/lib/client/parent-composer/add-to-conversation.js.map +1 -0
  53. package/lib/client/rc6/ArchivedConversation.d.ts +13 -0
  54. package/lib/client/rc6/ArchivedConversation.d.ts.map +1 -0
  55. package/lib/client/rc6/ArchivedConversation.js +170 -0
  56. package/lib/client/rc6/ArchivedConversation.js.map +1 -0
  57. package/lib/client/rc6/Rc6SideChatOverlay.d.ts +8 -0
  58. package/lib/client/rc6/Rc6SideChatOverlay.d.ts.map +1 -0
  59. package/lib/client/rc6/Rc6SideChatOverlay.js +136 -0
  60. package/lib/client/rc6/Rc6SideChatOverlay.js.map +1 -0
  61. package/lib/client/rc6/context.d.ts +10 -0
  62. package/lib/client/rc6/context.d.ts.map +1 -0
  63. package/lib/client/rc6/context.js +2 -0
  64. package/lib/client/rc6/context.js.map +1 -0
  65. package/lib/client/rc6/remote-adapter.d.ts +7 -0
  66. package/lib/client/rc6/remote-adapter.d.ts.map +1 -0
  67. package/lib/client/rc6/remote-adapter.js +29 -0
  68. package/lib/client/rc6/remote-adapter.js.map +1 -0
  69. package/lib/client/rc6/sessions-adapter.d.ts +34 -0
  70. package/lib/client/rc6/sessions-adapter.d.ts.map +1 -0
  71. package/lib/client/rc6/sessions-adapter.js +252 -0
  72. package/lib/client/rc6/sessions-adapter.js.map +1 -0
  73. package/lib/client/selection/SelectionActions.d.ts +9 -0
  74. package/lib/client/selection/SelectionActions.d.ts.map +1 -0
  75. package/lib/client/selection/SelectionActions.js +20 -0
  76. package/lib/client/selection/SelectionActions.js.map +1 -0
  77. package/lib/client/selection/selection-controller.d.ts +26 -0
  78. package/lib/client/selection/selection-controller.d.ts.map +1 -0
  79. package/lib/client/selection/selection-controller.js +111 -0
  80. package/lib/client/selection/selection-controller.js.map +1 -0
  81. package/lib/client/selection/selection-limits.d.ts +7 -0
  82. package/lib/client/selection/selection-limits.d.ts.map +1 -0
  83. package/lib/client/selection/selection-limits.js +19 -0
  84. package/lib/client/selection/selection-limits.js.map +1 -0
  85. package/lib/client/selection/selection-normalizer.d.ts +16 -0
  86. package/lib/client/selection/selection-normalizer.d.ts.map +1 -0
  87. package/lib/client/selection/selection-normalizer.js +48 -0
  88. package/lib/client/selection/selection-normalizer.js.map +1 -0
  89. package/lib/client/side-chat-controller.d.ts +55 -0
  90. package/lib/client/side-chat-controller.d.ts.map +1 -0
  91. package/lib/client/side-chat-controller.js +379 -0
  92. package/lib/client/side-chat-controller.js.map +1 -0
  93. package/lib/client.js +5988 -0
  94. package/lib/client.js.map +1 -0
  95. package/lib/host/archived-fork-service.d.ts +27 -0
  96. package/lib/host/archived-fork-service.d.ts.map +1 -0
  97. package/lib/host/archived-fork-service.js +186 -0
  98. package/lib/host/archived-fork-service.js.map +1 -0
  99. package/lib/host/index.d.ts +2 -0
  100. package/lib/host/index.d.ts.map +1 -0
  101. package/lib/host/index.js +2 -0
  102. package/lib/host/index.js.map +1 -0
  103. package/lib/index.d.ts +23 -0
  104. package/lib/index.d.ts.map +1 -0
  105. package/lib/index.js +24 -0
  106. package/lib/index.js.map +1 -0
  107. package/lib/remote.d.ts +22 -0
  108. package/lib/remote.d.ts.map +1 -0
  109. package/lib/remote.js +8 -0
  110. package/lib/remote.js.map +1 -0
  111. package/lib/shared/archived-wire.d.ts +100 -0
  112. package/lib/shared/archived-wire.d.ts.map +1 -0
  113. package/lib/shared/archived-wire.js +31 -0
  114. package/lib/shared/archived-wire.js.map +1 -0
  115. package/lib/shared/constants.d.ts +16 -0
  116. package/lib/shared/constants.d.ts.map +1 -0
  117. package/lib/shared/constants.js +16 -0
  118. package/lib/shared/constants.js.map +1 -0
  119. package/lib/shared/contracts.d.ts +92 -0
  120. package/lib/shared/contracts.d.ts.map +1 -0
  121. package/lib/shared/contracts.js +4 -0
  122. package/lib/shared/contracts.js.map +1 -0
  123. package/lib/shared/error-codes.d.ts +4 -0
  124. package/lib/shared/error-codes.d.ts.map +1 -0
  125. package/lib/shared/error-codes.js +25 -0
  126. package/lib/shared/error-codes.js.map +1 -0
  127. package/lib/shared/observable.d.ts +22 -0
  128. package/lib/shared/observable.d.ts.map +1 -0
  129. package/lib/shared/observable.js +40 -0
  130. package/lib/shared/observable.js.map +1 -0
  131. package/lib/typert.d.ts +80 -0
  132. package/lib/typert.d.ts.map +1 -0
  133. package/lib/typert.js +40 -0
  134. package/lib/typert.js.map +1 -0
  135. package/package.json +126 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-adapter.js","sourceRoot":"","sources":["../../../src/client/rc6/remote-adapter.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,iBAAiB,CAAA;AAI3C,SAAS,aAAa,CAAC,KAAoB;IACzC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB;QAC1E,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,2BAA2B;QACrD,WAAW,EAAE,KAAK,CAAC,IAAI,KAAK,aAAa;KAC1C,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAqB;IAI7D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAmD,CAAA;IACrG,OAAO;QACL,MAAM,EAAE;YACN,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACxB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;oBACnC,GAAG,OAAO;oBACV,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;iBACjC,CAAC,CAAA;gBACF,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;YACrF,CAAC;YACD,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBAC5C,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;YACrF,CAAC;SACF;QACD,OAAO;KACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { ConversationSnapshot, SessionFace } from '@deepseek-ai/dsh-client-runtime/client';
2
+ import type { SideChatClientSessions, SideChatSessionLease } from '../contracts.js';
3
+ import type { ConversationSelection, SessionId } from '../../shared/contracts.js';
4
+ import type { Rc6ClientContext } from './context.js';
5
+ /** Adapter over rc.6's public SessionRuntime and exported concrete Session type. */
6
+ export declare class Rc6SideChatSessions implements SideChatClientSessions {
7
+ private readonly ctx;
8
+ private readonly renamed;
9
+ constructor(ctx: Rc6ClientContext);
10
+ /** Observable rc.6 Session-list surface used to follow main-session switches. */
11
+ readonly subscribeList: (listener: () => void) => (() => void);
12
+ currentSessionId(): SessionId | undefined;
13
+ lastCompletedSeq(parentSessionId: SessionId): number | undefined;
14
+ selectionIsCurrent(selection: ConversationSelection): boolean;
15
+ retain(sessionId: SessionId): Promise<SideChatSessionLease>;
16
+ openSession(sessionId: SessionId): Promise<void>;
17
+ notify(message: {
18
+ readonly kind: 'status' | 'warning';
19
+ readonly text: string;
20
+ }): void;
21
+ face(sessionId: SessionId): SessionFace | undefined;
22
+ title(sessionId: SessionId): string | undefined;
23
+ private waitForBinding;
24
+ }
25
+ export declare function selectionDescriptor(snapshot: ConversationSnapshot, anchorKey: string): {
26
+ readonly nodeKey: string;
27
+ readonly nodeKind: string;
28
+ readonly turnKey: string;
29
+ readonly seq: number;
30
+ readonly source: 'user' | 'assistant' | 'context' | 'code';
31
+ readonly modelVisible: boolean;
32
+ readonly settled: boolean;
33
+ } | undefined;
34
+ //# sourceMappingURL=sessions-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions-adapter.d.ts","sourceRoot":"","sources":["../../../src/client/rc6/sessions-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,oBAAoB,EAEpB,WAAW,EAEZ,MAAM,wCAAwC,CAAA;AAS/C,OAAO,KAAK,EACV,sBAAsB,EAGtB,oBAAoB,EAErB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EACV,qBAAqB,EACrB,SAAS,EAGV,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AA6JpD,oFAAoF;AACpF,qBAAa,mBAAoB,YAAW,sBAAsB;IAGpD,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAElB,GAAG,EAAE,gBAAgB;IAElD,iFAAiF;IACjF,QAAQ,CAAC,aAAa,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAA8C;IAE3G,gBAAgB,IAAI,SAAS,GAAG,SAAS;IAKzC,gBAAgB,CAAC,eAAe,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS;IAKhE,kBAAkB,CAAC,SAAS,EAAE,qBAAqB,GAAG,OAAO;IAcvD,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAc3D,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,MAAM,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKrF,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS;IAInD,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS;IAI/C,OAAO,CAAC,cAAc;CAwBvB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,MAAM,GAChB;IACD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;IAC1D,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B,GAAG,SAAS,CAuBZ"}
@@ -0,0 +1,252 @@
1
+ import { SessionId as sideChatSessionId } from '../../shared/contracts.js';
2
+ const BINDING_WAIT_MS = 8_000;
3
+ function sideChatError(error, fallback) {
4
+ return {
5
+ code: error.code === 'session-not-found' ? 'side_chat_not_found' : fallback,
6
+ message: error.message,
7
+ recoverable: error.code !== 'bad-request',
8
+ };
9
+ }
10
+ function operationError(code, message) {
11
+ return { code, message, recoverable: true };
12
+ }
13
+ function dshSessionId(id) {
14
+ return id;
15
+ }
16
+ function latestCompleted(snapshot) {
17
+ let latest;
18
+ for (const seq of snapshot.turnEnds.values()) {
19
+ if (latest === undefined || seq > latest)
20
+ latest = seq;
21
+ }
22
+ return latest;
23
+ }
24
+ function locationSettled(location) {
25
+ if (location.kind === 'turn')
26
+ return location.turn.status === 'closed';
27
+ if (location.kind === 'step')
28
+ return location.turn.status === 'closed' && location.step.status === 'closed';
29
+ return false;
30
+ }
31
+ function childSnapshot(face) {
32
+ const snapshot = face.getSnapshot();
33
+ const pending = snapshot.pending[0];
34
+ const status = pending?.kind === 'approval'
35
+ ? 'needs-approval'
36
+ : pending?.kind === 'question'
37
+ ? 'needs-input'
38
+ : snapshot.openState === 'error' || snapshot.lastAgentError !== null
39
+ ? 'failed'
40
+ : snapshot.running
41
+ ? 'running'
42
+ : 'idle';
43
+ return { status };
44
+ }
45
+ class Rc6SessionBinding {
46
+ face;
47
+ sessionId;
48
+ constructor(face) {
49
+ this.face = face;
50
+ this.sessionId = sideChatSessionId(face.sessionId);
51
+ }
52
+ getSnapshot = () => childSnapshot(this.face);
53
+ subscribe = (listener) => this.face.subscribe(listener);
54
+ async prompt(content, mode) {
55
+ const result = await this.face.prompt(content.map(part => ({ ...part })), mode);
56
+ return result.ok
57
+ ? { ok: true }
58
+ : { ok: false, error: sideChatError(result.error, 'side_chat_prompt_failed') };
59
+ }
60
+ async updateQueue(itemId, action) {
61
+ if (action.kind === 'edit' && action.content.some(part => part.type !== 'text')) {
62
+ return {
63
+ ok: false,
64
+ error: operationError('invalid_request', 'Queued image messages cannot be edited in the Side Chat panel.'),
65
+ };
66
+ }
67
+ const normalized = action.kind === 'edit'
68
+ ? { kind: 'edit', content: action.content.map(part => ({ type: 'text', text: part.type === 'text' ? part.text : '' })) }
69
+ : action;
70
+ const result = await this.face.updateQueue(itemId, normalized);
71
+ return result.ok
72
+ ? { ok: true }
73
+ : { ok: false, error: sideChatError(result.error, 'side_chat_prompt_failed') };
74
+ }
75
+ async cancel() {
76
+ const result = await this.face.cancel();
77
+ return result.ok
78
+ ? { ok: true }
79
+ : { ok: false, error: sideChatError(result.error, 'side_chat_interrupt_failed') };
80
+ }
81
+ async respondApproval(interactionId, decision) {
82
+ const wait = this.face.getSnapshot().pending
83
+ .find(item => item.key === interactionId && item.kind === 'approval');
84
+ if (wait === undefined) {
85
+ return { ok: false, error: operationError('invalid_request', 'The approval is no longer pending.') };
86
+ }
87
+ try {
88
+ const receipt = await wait.respond({
89
+ ok: true,
90
+ value: {
91
+ sessionId: wait.sessionId,
92
+ approvalId: wait.payload.approvalId,
93
+ outcome: decision === 'approve' ? 'allowed-once' : 'rejected',
94
+ },
95
+ });
96
+ return receipt.accepted
97
+ ? { ok: true }
98
+ : { ok: false, error: operationError('transport_error', 'The approval response arrived too late.') };
99
+ }
100
+ catch {
101
+ return { ok: false, error: operationError('transport_error', 'The approval response failed.') };
102
+ }
103
+ }
104
+ async respondQuestion(interactionId, answer) {
105
+ const wait = this.face.getSnapshot().pending
106
+ .find(item => item.key === interactionId && item.kind === 'question');
107
+ if (wait === undefined) {
108
+ return { ok: false, error: operationError('invalid_request', 'The question is no longer pending.') };
109
+ }
110
+ try {
111
+ const result = answer === null
112
+ ? {
113
+ ok: false,
114
+ error: { code: 'cancelled', message: 'Question cancelled.', details: {} },
115
+ }
116
+ : {
117
+ ok: true,
118
+ value: {
119
+ sessionId: wait.sessionId,
120
+ answer: {
121
+ answers: answer.answers.map(item => ({
122
+ id: item.id,
123
+ selected: [...item.selected],
124
+ ...(item.custom === undefined ? {} : { custom: item.custom }),
125
+ })),
126
+ },
127
+ },
128
+ };
129
+ const receipt = await wait.respond(result);
130
+ return receipt.accepted
131
+ ? { ok: true }
132
+ : { ok: false, error: operationError('transport_error', 'The question response arrived too late.') };
133
+ }
134
+ catch {
135
+ return { ok: false, error: operationError('transport_error', 'The question response failed.') };
136
+ }
137
+ }
138
+ }
139
+ /** Adapter over rc.6's public SessionRuntime and exported concrete Session type. */
140
+ export class Rc6SideChatSessions {
141
+ ctx;
142
+ renamed = new Set();
143
+ constructor(ctx) {
144
+ this.ctx = ctx;
145
+ }
146
+ /** Observable rc.6 Session-list surface used to follow main-session switches. */
147
+ subscribeList = (listener) => this.ctx.sessions.list.subscribe(listener);
148
+ currentSessionId() {
149
+ const current = this.ctx.sessions.list.getSnapshot().current;
150
+ return current === undefined ? undefined : sideChatSessionId(current);
151
+ }
152
+ lastCompletedSeq(parentSessionId) {
153
+ const snapshot = this.ctx.sessions.binding(dshSessionId(parentSessionId))?.session.getSnapshot();
154
+ return snapshot === undefined ? undefined : latestCompleted(snapshot);
155
+ }
156
+ selectionIsCurrent(selection) {
157
+ if (this.currentSessionId() !== selection.parentSessionId)
158
+ return false;
159
+ const snapshot = this.ctx.sessions.binding(dshSessionId(selection.parentSessionId))?.session.getSnapshot();
160
+ if (snapshot === undefined)
161
+ return false;
162
+ return selection.fragments.every((fragment) => {
163
+ const node = snapshot.chat.nodes.get(fragment.nodeKey);
164
+ return node !== undefined
165
+ && node.visibility === 'visible'
166
+ && node.kind === fragment.nodeKind
167
+ && node.anchorSeq === fragment.seq
168
+ && locationSettled(node.location);
169
+ });
170
+ }
171
+ async retain(sessionId) {
172
+ const binding = await this.waitForBinding(dshSessionId(sessionId));
173
+ const concrete = binding.session;
174
+ await concrete.open();
175
+ if (!this.renamed.has(sessionId)) {
176
+ this.renamed.add(sessionId);
177
+ const parentTitle = this.ctx.sessions.list.getSnapshot().byId[dshSessionId(sessionId)]?.displayTitle;
178
+ const title = parentTitle === undefined ? 'Side Chat' : `Side Chat · ${parentTitle}`;
179
+ await binding.session.rename(title.slice(0, 160)).catch(() => undefined);
180
+ }
181
+ const adapted = new Rc6SessionBinding(binding.session);
182
+ return { sessionId, binding: adapted, release: () => { } };
183
+ }
184
+ async openSession(sessionId) {
185
+ this.ctx.sessions.open(dshSessionId(sessionId));
186
+ }
187
+ notify(message) {
188
+ const method = message.kind === 'warning' ? 'warn' : 'info';
189
+ console[method](`[dsh-side-chat] ${message.text}`);
190
+ }
191
+ face(sessionId) {
192
+ return this.ctx.sessions.binding(dshSessionId(sessionId))?.session;
193
+ }
194
+ title(sessionId) {
195
+ return this.ctx.sessions.list.getSnapshot().byId[dshSessionId(sessionId)]?.displayTitle;
196
+ }
197
+ waitForBinding(sessionId) {
198
+ const immediate = this.ctx.sessions.binding(sessionId);
199
+ if (immediate !== undefined)
200
+ return Promise.resolve(immediate);
201
+ return new Promise((resolve, reject) => {
202
+ let settled = false;
203
+ const finish = () => {
204
+ if (settled)
205
+ return;
206
+ const binding = this.ctx.sessions.binding(sessionId);
207
+ if (binding === undefined)
208
+ return;
209
+ settled = true;
210
+ clearTimeout(timer);
211
+ unsubscribe();
212
+ resolve(binding);
213
+ };
214
+ const unsubscribe = this.ctx.sessions.list.subscribe(finish);
215
+ const timer = setTimeout(() => {
216
+ if (settled)
217
+ return;
218
+ settled = true;
219
+ unsubscribe();
220
+ reject(new Error(`Side Chat child ${sessionId} did not appear in the rc.6 Session list.`));
221
+ }, BINDING_WAIT_MS);
222
+ finish();
223
+ });
224
+ }
225
+ }
226
+ export function selectionDescriptor(snapshot, anchorKey) {
227
+ const node = snapshot.chat.nodes.get(anchorKey);
228
+ if (node === undefined || node.visibility !== 'visible')
229
+ return undefined;
230
+ const source = node.kind === 'user' || node.kind === 'steering'
231
+ ? 'user'
232
+ : node.kind === 'assistant-step'
233
+ ? 'assistant'
234
+ : node.kind === 'context'
235
+ ? 'context'
236
+ : undefined;
237
+ const turn = node.location.kind === 'turn' || node.location.kind === 'step'
238
+ ? node.location.turn.turn
239
+ : undefined;
240
+ if (source === undefined || turn === undefined)
241
+ return undefined;
242
+ return {
243
+ nodeKey: node.key,
244
+ nodeKind: node.kind,
245
+ turnKey: `turn:${String(turn)}`,
246
+ seq: node.anchorSeq,
247
+ source,
248
+ modelVisible: true,
249
+ settled: locationSettled(node.location),
250
+ };
251
+ }
252
+ //# sourceMappingURL=sessions-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions-adapter.js","sourceRoot":"","sources":["../../../src/client/rc6/sessions-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ConversationSelection } from '../../shared/contracts.js';
2
+ export interface SelectionActionsProps {
3
+ readonly selection: ConversationSelection;
4
+ readonly askDisabledReason?: string;
5
+ readonly onAskInSideChat: (selection: ConversationSelection) => void;
6
+ readonly onDismiss: () => void;
7
+ }
8
+ export declare function SelectionActions({ selection, askDisabledReason, onAskInSideChat, onDismiss, }: SelectionActionsProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=SelectionActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionActions.d.ts","sourceRoot":"","sources":["../../../src/client/selection/SelectionActions.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEtE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAA;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,eAAe,EAAE,CAAC,SAAS,EAAE,qBAAqB,KAAK,IAAI,CAAA;IACpE,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAA;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,SAAS,GACV,EAAE,qBAAqB,2CAkCvB"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export function SelectionActions({ selection, askDisabledReason, onAskInSideChat, onDismiss, }) {
3
+ const center = selection.rect.x + selection.rect.width / 2;
4
+ const style = {
5
+ left: Math.min(Math.max(8, center), selection.rect.viewportWidth - 8),
6
+ top: selection.rect.y < 56
7
+ ? selection.rect.y + selection.rect.height + 8
8
+ : selection.rect.y - 8,
9
+ transform: selection.rect.y < 56 ? 'translate(0, 0)' : 'translate(0, -100%)',
10
+ };
11
+ const keepSelection = (event) => { event.preventDefault(); };
12
+ return (_jsx("div", { className: "dsh-side-chat-selection-actions", role: "toolbar", "aria-label": "Selected conversation text actions", style: style, onMouseDown: keepSelection, onKeyDown: (event) => {
13
+ if (event.key === 'Escape')
14
+ onDismiss();
15
+ }, children: _jsx("button", { type: "button", disabled: askDisabledReason !== undefined, title: askDisabledReason, onClick: () => {
16
+ onAskInSideChat(selection);
17
+ onDismiss();
18
+ }, children: "Ask in side chat" }) }));
19
+ }
20
+ //# sourceMappingURL=SelectionActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionActions.js","sourceRoot":"","sources":["../../../src/client/selection/SelectionActions.tsx"],"names":[],"mappings":";AAUA,MAAM,UAAU,gBAAgB,CAAC,EAC/B,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,SAAS,GACa;IACtB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAkB;QAC3B,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACrE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE;YACxB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YAC9C,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;QACxB,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,qBAAqB;KAC7E,CAAA;IACD,MAAM,aAAa,GAAG,CAAC,KAAiC,EAAQ,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAA,CAAC,CAAC,CAAA;IAC7F,OAAO,CACL,cACE,SAAS,EAAC,iCAAiC,EAC3C,IAAI,EAAC,SAAS,gBACH,oCAAoC,EAC/C,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,aAAa,EAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,SAAS,EAAE,CAAA;QACzC,CAAC,YAED,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,iBAAiB,KAAK,SAAS,EACzC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,GAAG,EAAE;gBACZ,eAAe,CAAC,SAAS,CAAC,CAAA;gBAC1B,SAAS,EAAE,CAAA;YACb,CAAC,iCAGM,GACL,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ConversationSelection, SelectionFragment, SessionId } from '../../shared/contracts.js';
2
+ /** Authoritative Chat Node information resolved from the locked DSH DOM anchor. */
3
+ export interface SelectionNodeDescriptor {
4
+ readonly nodeKey: string;
5
+ readonly nodeKind: string;
6
+ readonly turnKey: string;
7
+ readonly seq: number;
8
+ readonly source: SelectionFragment['source'];
9
+ readonly modelVisible: boolean;
10
+ readonly settled: boolean;
11
+ }
12
+ /** Resolves only public `data-chat-*` anchors against the current snapshot. */
13
+ export interface SelectionAnchorResolver {
14
+ resolve(anchor: HTMLElement): SelectionNodeDescriptor | undefined;
15
+ }
16
+ /**
17
+ * Locked-commit fallback capture. It intentionally fails closed unless every
18
+ * selected text node belongs to one public Chat anchor.
19
+ */
20
+ export declare function captureDomConversationSelection(input: {
21
+ readonly selection: Selection | null;
22
+ readonly conversationRoot: HTMLElement;
23
+ readonly parentSessionId: SessionId;
24
+ readonly resolver: SelectionAnchorResolver;
25
+ }): Promise<ConversationSelection>;
26
+ //# sourceMappingURL=selection-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-controller.d.ts","sourceRoot":"","sources":["../../../src/client/selection/selection-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EACjB,SAAS,EACV,MAAM,2BAA2B,CAAA;AAMlC,mFAAmF;AACnF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IAC5C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,+EAA+E;AAC/E,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,uBAAuB,GAAG,SAAS,CAAA;CAClE;AAoDD;;;GAGG;AACH,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAA;IACtC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAA;IACnC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAA;CAC3C,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6DjC"}
@@ -0,0 +1,111 @@
1
+ import { finalizeConversationSelection, SelectionValidationError, } from './selection-normalizer.js';
2
+ function anchorOf(node) {
3
+ const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
4
+ return element?.closest('[data-chat-anchor-key]') ?? null;
5
+ }
6
+ function excluded(node, root) {
7
+ const parent = node.parentElement;
8
+ if (parent === null || !root.contains(parent))
9
+ return true;
10
+ return parent.closest([
11
+ '[data-selection-exclude]',
12
+ '[data-side-chat-panel]',
13
+ '[aria-hidden="true"]',
14
+ 'button',
15
+ 'textarea',
16
+ 'input',
17
+ '[role="button"]',
18
+ ].join(',')) !== null;
19
+ }
20
+ function acceptedTextNodes(anchor, root) {
21
+ const nodes = [];
22
+ const walker = document.createTreeWalker(anchor, NodeFilter.SHOW_TEXT);
23
+ let current = walker.nextNode();
24
+ while (current !== null) {
25
+ const text = current;
26
+ if (!excluded(text, root))
27
+ nodes.push(text);
28
+ current = walker.nextNode();
29
+ }
30
+ return nodes;
31
+ }
32
+ function selectedSlice(range, node) {
33
+ if (!range.intersectsNode(node))
34
+ return;
35
+ let start = range.startContainer === node ? range.startOffset : 0;
36
+ let end = range.endContainer === node ? range.endOffset : node.data.length;
37
+ if (start > 0
38
+ && /[\uDC00-\uDFFF]/u.test(node.data[start] ?? '')
39
+ && /[\uD800-\uDBFF]/u.test(node.data[start - 1] ?? '')) {
40
+ start -= 1;
41
+ }
42
+ if (end > 0
43
+ && end < node.data.length
44
+ && /[\uD800-\uDBFF]/u.test(node.data[end - 1] ?? '')
45
+ && /[\uDC00-\uDFFF]/u.test(node.data[end] ?? '')) {
46
+ end += 1;
47
+ }
48
+ if (end <= start)
49
+ return;
50
+ return { start, end, text: node.data.slice(start, end) };
51
+ }
52
+ /**
53
+ * Locked-commit fallback capture. It intentionally fails closed unless every
54
+ * selected text node belongs to one public Chat anchor.
55
+ */
56
+ export async function captureDomConversationSelection(input) {
57
+ const range = input.selection?.rangeCount === 1 ? input.selection.getRangeAt(0) : undefined;
58
+ if (range === undefined || range.collapsed) {
59
+ throw new SelectionValidationError('selection_empty', 'Select some conversation text first.');
60
+ }
61
+ if (!input.conversationRoot.contains(range.startContainer)
62
+ || !input.conversationRoot.contains(range.endContainer)) {
63
+ throw new SelectionValidationError('selection_outside_conversation', 'The selection must stay inside the current conversation.');
64
+ }
65
+ const startAnchor = anchorOf(range.startContainer);
66
+ const endAnchor = anchorOf(range.endContainer);
67
+ if (startAnchor === null || endAnchor === null || startAnchor !== endAnchor) {
68
+ throw new SelectionValidationError('selection_crosses_unsupported_nodes', 'This compatibility adapter supports a selection inside one message only.');
69
+ }
70
+ const descriptor = input.resolver.resolve(startAnchor);
71
+ if (descriptor === undefined) {
72
+ throw new SelectionValidationError('selection_stale', 'The selected message is no longer in the Session snapshot.');
73
+ }
74
+ const nodes = acceptedTextNodes(startAnchor, input.conversationRoot);
75
+ const pieces = [];
76
+ let startOffset;
77
+ let endOffset;
78
+ let visibleOffset = 0;
79
+ for (const node of nodes) {
80
+ const slice = selectedSlice(range, node);
81
+ if (slice !== undefined) {
82
+ startOffset ??= visibleOffset + slice.start;
83
+ endOffset = visibleOffset + slice.end;
84
+ pieces.push(slice.text);
85
+ }
86
+ visibleOffset += node.data.length;
87
+ }
88
+ if (startOffset === undefined || endOffset === undefined) {
89
+ throw new SelectionValidationError('selection_not_model_visible', 'The selection contains no supported visible text.');
90
+ }
91
+ const rect = range.getBoundingClientRect();
92
+ return await finalizeConversationSelection({
93
+ parentSessionId: input.parentSessionId,
94
+ fragments: [{
95
+ ...descriptor,
96
+ startOffset,
97
+ endOffset,
98
+ text: pieces.join(''),
99
+ }],
100
+ rawText: pieces.join(''),
101
+ rect: {
102
+ x: rect.x,
103
+ y: rect.y,
104
+ width: rect.width,
105
+ height: rect.height,
106
+ viewportWidth: window.innerWidth,
107
+ viewportHeight: window.innerHeight,
108
+ },
109
+ });
110
+ }
111
+ //# sourceMappingURL=selection-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-controller.js","sourceRoot":"","sources":["../../../src/client/selection/selection-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** UTF-8 byte length used by the complete selection admission limit. */
2
+ export declare function utf8ByteLength(value: string): number;
3
+ /** Whether a selected passage fits the v1 privacy and performance limit. */
4
+ export declare function selectionFitsLimit(value: string): boolean;
5
+ /** Code-point-safe preview that never cuts a surrogate pair. */
6
+ export declare function summarizeSelection(value: string, maxCodePoints?: number): string;
7
+ //# sourceMappingURL=selection-limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-limits.d.ts","sourceRoot":"","sources":["../../../src/client/selection/selection-limits.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,SAAM,GAAG,MAAM,CAM7E"}
@@ -0,0 +1,19 @@
1
+ import { MAX_SELECTION_BYTES } from '../../shared/constants.js';
2
+ /** UTF-8 byte length used by the complete selection admission limit. */
3
+ export function utf8ByteLength(value) {
4
+ return new TextEncoder().encode(value).byteLength;
5
+ }
6
+ /** Whether a selected passage fits the v1 privacy and performance limit. */
7
+ export function selectionFitsLimit(value) {
8
+ return utf8ByteLength(value) <= MAX_SELECTION_BYTES;
9
+ }
10
+ /** Code-point-safe preview that never cuts a surrogate pair. */
11
+ export function summarizeSelection(value, maxCodePoints = 240) {
12
+ const points = [...value];
13
+ if (points.length <= maxCodePoints)
14
+ return value;
15
+ const headLength = Math.ceil(maxCodePoints * 0.65);
16
+ const tailLength = maxCodePoints - headLength;
17
+ return `${points.slice(0, headLength).join('')}…${points.slice(-tailLength).join('')}`;
18
+ }
19
+ //# sourceMappingURL=selection-limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-limits.js","sourceRoot":"","sources":["../../../src/client/selection/selection-limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE/D,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAA;AACnD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAA;AACrD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,aAAa,GAAG,GAAG;IACnE,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;IACzB,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa;QAAE,OAAO,KAAK,CAAA;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAClD,MAAM,UAAU,GAAG,aAAa,GAAG,UAAU,CAAA;IAC7C,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA;AACxF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ConversationSelection, SelectionFragment, SelectionRect, SessionId } from '../../shared/contracts.js';
2
+ import type { SideChatErrorCode } from '../../shared/error-codes.js';
3
+ export declare class SelectionValidationError extends Error {
4
+ readonly code: SideChatErrorCode;
5
+ constructor(code: SideChatErrorCode, message: string);
6
+ }
7
+ export declare function normalizeSelectedText(value: string): string;
8
+ export interface ConversationSelectionInput {
9
+ readonly parentSessionId: SessionId;
10
+ readonly fragments: readonly SelectionFragment[];
11
+ readonly rawText: string;
12
+ readonly rect: SelectionRect;
13
+ }
14
+ export declare function finalizeConversationSelection(input: ConversationSelectionInput): ConversationSelection;
15
+ export declare function assertSelectionCurrent(selection: ConversationSelection, currentSessionId: SessionId | undefined): void;
16
+ //# sourceMappingURL=selection-normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-normalizer.d.ts","sourceRoot":"","sources":["../../../src/client/selection/selection-normalizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,SAAS,EACV,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAGpE,qBAAa,wBAAyB,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,iBAAiB;gBAAvB,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM;CAI9D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAA;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAC7B;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,0BAA0B,GAAG,qBAAqB,CA+BtG;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,qBAAqB,EAChC,gBAAgB,EAAE,SAAS,GAAG,SAAS,GACtC,IAAI,CAIN"}
@@ -0,0 +1,48 @@
1
+ import { MAX_SELECTION_BYTES } from '../../shared/constants.js';
2
+ import { utf8ByteLength } from './selection-limits.js';
3
+ export class SelectionValidationError extends Error {
4
+ code;
5
+ constructor(code, message) {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = 'SelectionValidationError';
9
+ }
10
+ }
11
+ export function normalizeSelectedText(value) {
12
+ return value.replace(/\r\n?/gu, '\n').replace(/\n(?:[\t ]*\n){3,}/gu, '\n\n\n').trim();
13
+ }
14
+ export function finalizeConversationSelection(input) {
15
+ const fragment = input.fragments[0];
16
+ if (fragment === undefined) {
17
+ throw new SelectionValidationError('selection_empty', 'Select some conversation text first.');
18
+ }
19
+ if (input.fragments.length !== 1) {
20
+ throw new SelectionValidationError('selection_crosses_unsupported_nodes', 'Select text inside one completed message.');
21
+ }
22
+ const text = normalizeSelectedText(input.rawText);
23
+ if (text.length === 0) {
24
+ throw new SelectionValidationError('selection_empty', 'The selection contains only whitespace.');
25
+ }
26
+ if (utf8ByteLength(text) > MAX_SELECTION_BYTES) {
27
+ throw new SelectionValidationError('selection_too_large', 'The selected text is too large.');
28
+ }
29
+ if (!fragment.modelVisible || !fragment.settled) {
30
+ throw new SelectionValidationError('fork_unavailable', 'Wait for this message to finish before branching.');
31
+ }
32
+ if (!Number.isSafeInteger(fragment.seq) || fragment.seq < 0) {
33
+ throw new SelectionValidationError('selection_stale', 'The selected message is no longer available.');
34
+ }
35
+ return Object.freeze({
36
+ parentSessionId: input.parentSessionId,
37
+ fragments: Object.freeze([{ ...fragment }]),
38
+ text,
39
+ atSeq: fragment.seq,
40
+ rect: Object.freeze({ ...input.rect }),
41
+ });
42
+ }
43
+ export function assertSelectionCurrent(selection, currentSessionId) {
44
+ if (currentSessionId !== selection.parentSessionId) {
45
+ throw new SelectionValidationError('selection_stale', 'The parent conversation changed after selection.');
46
+ }
47
+ }
48
+ //# sourceMappingURL=selection-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-normalizer.js","sourceRoot":"","sources":["../../../src/client/selection/selection-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAQ/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAC5B;IAArB,YAAqB,IAAuB,EAAE,OAAe;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAA;QADK,SAAI,GAAJ,IAAI,CAAmB;QAE1C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAA;AACxF,CAAC;AASD,MAAM,UAAU,6BAA6B,CAAC,KAAiC;IAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,wBAAwB,CAAC,iBAAiB,EAAE,sCAAsC,CAAC,CAAA;IAC/F,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,wBAAwB,CAChC,qCAAqC,EACrC,2CAA2C,CAC5C,CAAA;IACH,CAAC;IACD,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,wBAAwB,CAAC,iBAAiB,EAAE,yCAAyC,CAAC,CAAA;IAClG,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,mBAAmB,EAAE,CAAC;QAC/C,MAAM,IAAI,wBAAwB,CAAC,qBAAqB,EAAE,iCAAiC,CAAC,CAAA;IAC9F,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,wBAAwB,CAAC,kBAAkB,EAAE,mDAAmD,CAAC,CAAA;IAC7G,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,wBAAwB,CAAC,iBAAiB,EAAE,8CAA8C,CAAC,CAAA;IACvG,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;QAC3C,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,GAAG;QACnB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;KACvC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,SAAgC,EAChC,gBAAuC;IAEvC,IAAI,gBAAgB,KAAK,SAAS,CAAC,eAAe,EAAE,CAAC;QACnD,MAAM,IAAI,wBAAwB,CAAC,iBAAiB,EAAE,kDAAkD,CAAC,CAAA;IAC3G,CAAC;AACH,CAAC"}