@kirkchinese/dsh-citeciter 0.3.2 → 0.4.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.
- package/README.md +55 -24
- package/README.zh.md +55 -24
- package/lib/client.js +646 -151
- package/lib/index.js +442 -107
- package/lib/{topic-DByv84H6.js → topic-BVNCaVbJ.js} +1 -0
- package/lib/{typert-common-Bvx1k2cq.js → typert-common-4_cbghYz.js} +3 -2
- package/lib/typert.host.js +2 -2
- package/lib/typert.remote-client.js +1 -1
- package/lib/types/client/companion-controller.d.ts +6 -4
- package/lib/types/client/components/CiteCiterSettings.d.ts +3 -1
- package/lib/types/client/components/CitePanel.d.ts +1 -1
- package/lib/types/client/conversation-dom.d.ts +72 -0
- package/lib/types/client/prompt.d.ts +7 -2
- package/lib/types/client/request-guard.d.ts +26 -0
- package/lib/types/client/selection.d.ts +8 -0
- package/lib/types/client/settings-document.d.ts +21 -0
- package/lib/types/index.d.ts +1 -1
- package/lib/types/topic-runtime.d.ts +39 -2
- package/lib/types/topic.d.ts +1 -0
- package/lib/types/typert-common.d.ts +5 -1
- package/lib/types/typert.host.d.ts +6 -1
- package/lib/types/typert.remote-client.d.ts +1 -1
- package/package.json +82 -78
- package/lib/types/client/citation.d.ts +0 -10
package/lib/client.js
CHANGED
|
@@ -4335,6 +4335,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4335
4335
|
}).strict(),
|
|
4336
4336
|
object({
|
|
4337
4337
|
action: literal("ask"),
|
|
4338
|
+
requestId: string().min(1).optional(),
|
|
4338
4339
|
topicSessionId: topicSessionIdSchema,
|
|
4339
4340
|
question: questionSchema
|
|
4340
4341
|
}).strict(),
|
|
@@ -4428,6 +4429,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4428
4429
|
schema: citeCiterRequestSchema
|
|
4429
4430
|
}
|
|
4430
4431
|
}],
|
|
4432
|
+
cancellation: { parameter: "signal" },
|
|
4431
4433
|
result: {
|
|
4432
4434
|
mode: "strict",
|
|
4433
4435
|
typeSymbol: "@kirkchinese/dsh-citeciter#CiteCiterResponse",
|
|
@@ -4435,7 +4437,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4435
4437
|
},
|
|
4436
4438
|
sourceLocation: {
|
|
4437
4439
|
file: "src/index.ts",
|
|
4438
|
-
line:
|
|
4440
|
+
line: 66,
|
|
4439
4441
|
column: 3
|
|
4440
4442
|
}
|
|
4441
4443
|
}]
|
|
@@ -4468,6 +4470,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4468
4470
|
const MAX_QUESTION_CHARS = 12e3;
|
|
4469
4471
|
const NEXT_QUESTIONS_OPEN = "<citeciter-next-questions>";
|
|
4470
4472
|
const NEXT_QUESTIONS_CLOSE = "</citeciter-next-questions>";
|
|
4473
|
+
const NEXT_QUESTION_MARKERS = [NEXT_QUESTIONS_OPEN, NEXT_QUESTIONS_CLOSE];
|
|
4471
4474
|
/**
|
|
4472
4475
|
* Normalize a genuine user question without wrapping it in Citation or role
|
|
4473
4476
|
* prose. System Tutor and Citation Context travel through their own layers.
|
|
@@ -4478,17 +4481,44 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4478
4481
|
if (question.length > 12e3) throw new Error(`question exceeds ${MAX_QUESTION_CHARS} characters`);
|
|
4479
4482
|
return question;
|
|
4480
4483
|
}
|
|
4481
|
-
|
|
4482
|
-
|
|
4483
|
-
const
|
|
4484
|
-
|
|
4484
|
+
function partialMarkerIndex(text) {
|
|
4485
|
+
let earliest = -1;
|
|
4486
|
+
for (const marker of NEXT_QUESTION_MARKERS) for (let length = Math.min(text.length, marker.length - 1); length > 0; length -= 1) {
|
|
4487
|
+
if (!text.endsWith(marker.slice(0, length))) continue;
|
|
4488
|
+
const index = text.length - length;
|
|
4489
|
+
earliest = earliest < 0 ? index : Math.min(earliest, index);
|
|
4490
|
+
break;
|
|
4491
|
+
}
|
|
4492
|
+
return earliest;
|
|
4493
|
+
}
|
|
4494
|
+
/**
|
|
4495
|
+
* Parse optional follow-up control text without exposing complete or partial markers.
|
|
4496
|
+
* @param text - accumulated assistant text.
|
|
4497
|
+
* @param streaming - whether the text may end inside a control marker.
|
|
4498
|
+
* @returns visible answer text, valid shortcut questions, and malformed-control status.
|
|
4499
|
+
*/
|
|
4500
|
+
function parseNextQuestions(text, streaming = false) {
|
|
4501
|
+
const openIndex = text.indexOf(NEXT_QUESTIONS_OPEN);
|
|
4502
|
+
const closeIndex = text.indexOf(NEXT_QUESTIONS_CLOSE);
|
|
4503
|
+
const markerIndices = [
|
|
4504
|
+
openIndex,
|
|
4505
|
+
closeIndex,
|
|
4506
|
+
streaming ? partialMarkerIndex(text) : -1
|
|
4507
|
+
].filter((index) => index >= 0);
|
|
4508
|
+
if (markerIndices.length === 0) return {
|
|
4485
4509
|
text,
|
|
4486
4510
|
questions: [],
|
|
4487
4511
|
invalid: false
|
|
4488
4512
|
};
|
|
4489
|
-
const markerIndex = Math.min(...
|
|
4513
|
+
const markerIndex = Math.min(...markerIndices);
|
|
4490
4514
|
const visibleText = text.slice(0, markerIndex).trimEnd();
|
|
4491
|
-
const
|
|
4515
|
+
const trimmed = text.trimEnd();
|
|
4516
|
+
if (openIndex < 0 || closeIndex < openIndex || openIndex !== trimmed.lastIndexOf(NEXT_QUESTIONS_OPEN) || closeIndex !== trimmed.lastIndexOf(NEXT_QUESTIONS_CLOSE) || !trimmed.endsWith(NEXT_QUESTIONS_CLOSE)) return {
|
|
4517
|
+
text: visibleText,
|
|
4518
|
+
questions: [],
|
|
4519
|
+
invalid: true
|
|
4520
|
+
};
|
|
4521
|
+
const match = new RegExp(`^${NEXT_QUESTIONS_OPEN}[ \\t]*(?:\\r?\\n)?([\\s\\S]*?)[ \\t]*(?:\\r?\\n)?${NEXT_QUESTIONS_CLOSE}[ \\t]*$`, "u").exec(trimmed.slice(openIndex));
|
|
4492
4522
|
if (match === null) return {
|
|
4493
4523
|
text: visibleText,
|
|
4494
4524
|
questions: [],
|
|
@@ -4513,6 +4543,97 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4513
4543
|
}
|
|
4514
4544
|
}
|
|
4515
4545
|
//#endregion
|
|
4546
|
+
//#region lib/types/client/request-guard.js
|
|
4547
|
+
const STORAGE_PREFIX = "citeciter:pending-request:";
|
|
4548
|
+
const memoryIntents = /* @__PURE__ */ new Map();
|
|
4549
|
+
function stableFallbackIntentKey(identity) {
|
|
4550
|
+
let hash = 2166136261;
|
|
4551
|
+
for (const byte of new TextEncoder().encode(identity)) {
|
|
4552
|
+
hash ^= byte;
|
|
4553
|
+
hash = Math.imul(hash, 16777619);
|
|
4554
|
+
}
|
|
4555
|
+
return `${(hash >>> 0).toString(16).padStart(8, "0")}-${identity.length.toString(16)}`;
|
|
4556
|
+
}
|
|
4557
|
+
async function requestIntentKey(identity) {
|
|
4558
|
+
try {
|
|
4559
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(identity));
|
|
4560
|
+
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
4561
|
+
} catch {
|
|
4562
|
+
return stableFallbackIntentKey(identity);
|
|
4563
|
+
}
|
|
4564
|
+
}
|
|
4565
|
+
async function claimRequestIntent(namespace, identity) {
|
|
4566
|
+
const key = `${namespace}:${await requestIntentKey(identity)}`;
|
|
4567
|
+
const storageKey = STORAGE_PREFIX + key;
|
|
4568
|
+
let stored = null;
|
|
4569
|
+
let persistent = false;
|
|
4570
|
+
try {
|
|
4571
|
+
stored = sessionStorage.getItem(storageKey) ?? memoryIntents.get(key) ?? null;
|
|
4572
|
+
persistent = true;
|
|
4573
|
+
} catch {
|
|
4574
|
+
stored = memoryIntents.get(key) ?? null;
|
|
4575
|
+
}
|
|
4576
|
+
if (stored !== null && stored.startsWith("topic-")) return {
|
|
4577
|
+
key,
|
|
4578
|
+
requestId: stored
|
|
4579
|
+
};
|
|
4580
|
+
let requestId = `topic-${key}`;
|
|
4581
|
+
try {
|
|
4582
|
+
requestId = `topic-${globalThis.crypto.randomUUID()}`;
|
|
4583
|
+
} catch {}
|
|
4584
|
+
if (persistent) try {
|
|
4585
|
+
sessionStorage.setItem(storageKey, requestId);
|
|
4586
|
+
} catch {
|
|
4587
|
+
memoryIntents.set(key, requestId);
|
|
4588
|
+
}
|
|
4589
|
+
else memoryIntents.set(key, requestId);
|
|
4590
|
+
return {
|
|
4591
|
+
key,
|
|
4592
|
+
requestId
|
|
4593
|
+
};
|
|
4594
|
+
}
|
|
4595
|
+
/**
|
|
4596
|
+
* Claim the retry-stable request ID for one pending Topic-creation intent.
|
|
4597
|
+
* @param selection - cited source selection.
|
|
4598
|
+
* @param question - normalized first question.
|
|
4599
|
+
* @param mode - resolved Topic creation mode.
|
|
4600
|
+
* @returns the pending intent key and request ID.
|
|
4601
|
+
*/
|
|
4602
|
+
function claimCreateTopicIntent(selection, question, mode) {
|
|
4603
|
+
return claimRequestIntent("create", JSON.stringify([
|
|
4604
|
+
selection.sourceSessionId,
|
|
4605
|
+
selection.anchorKey,
|
|
4606
|
+
selection.startOffset,
|
|
4607
|
+
selection.endOffset,
|
|
4608
|
+
selection.sourceHintText ?? null,
|
|
4609
|
+
selection.prefixText,
|
|
4610
|
+
selection.suffixText,
|
|
4611
|
+
selection.displayText,
|
|
4612
|
+
question,
|
|
4613
|
+
mode
|
|
4614
|
+
]));
|
|
4615
|
+
}
|
|
4616
|
+
/**
|
|
4617
|
+
* Claim the retry-stable request ID for one pending Topic follow-up.
|
|
4618
|
+
* @param topicSessionId - target private Topic Session.
|
|
4619
|
+
* @param question - normalized follow-up question.
|
|
4620
|
+
* @returns the pending intent key and request ID.
|
|
4621
|
+
*/
|
|
4622
|
+
function claimAskIntent(topicSessionId, question) {
|
|
4623
|
+
return claimRequestIntent("ask", JSON.stringify([topicSessionId, question]));
|
|
4624
|
+
}
|
|
4625
|
+
/**
|
|
4626
|
+
* Forget a confirmed request so a later identical submission is a new user intent.
|
|
4627
|
+
* @param intent - confirmed pending intent.
|
|
4628
|
+
*/
|
|
4629
|
+
function completeRequestIntent(intent) {
|
|
4630
|
+
memoryIntents.delete(intent.key);
|
|
4631
|
+
try {
|
|
4632
|
+
const storageKey = STORAGE_PREFIX + intent.key;
|
|
4633
|
+
if (sessionStorage.getItem(storageKey) === intent.requestId) sessionStorage.removeItem(storageKey);
|
|
4634
|
+
} catch {}
|
|
4635
|
+
}
|
|
4636
|
+
//#endregion
|
|
4516
4637
|
//#region lib/types/client/response-guard.js
|
|
4517
4638
|
/** Return whether an asynchronous Topic response still belongs to the visible source and request. */
|
|
4518
4639
|
function isCurrentTopicResponse(operationEpoch, currentEpoch, currentSourceSessionId, responseSourceSessionId, responseSessionId, expectedSessionId) {
|
|
@@ -4524,7 +4645,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4524
4645
|
}
|
|
4525
4646
|
//#endregion
|
|
4526
4647
|
//#region lib/types/client/companion-controller.js
|
|
4527
|
-
|
|
4648
|
+
/** Initial browser snapshot for the root-scoped CiteCiter controller. */
|
|
4649
|
+
const INITIAL_COMPANION_SNAPSHOT = {
|
|
4528
4650
|
sourceSessionId: null,
|
|
4529
4651
|
phase: "idle",
|
|
4530
4652
|
draftQuote: null,
|
|
@@ -4579,8 +4701,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4579
4701
|
} catch {}
|
|
4580
4702
|
}
|
|
4581
4703
|
/** Bind private Topic Remote calls to one browser snapshot and polling lifecycle. */
|
|
4582
|
-
function createCompanionController(sessions, settingsScope, request, onAutoOpen
|
|
4704
|
+
function createCompanionController(sessions, settingsScope, request, onAutoOpen, store) {
|
|
4583
4705
|
let disposed = false;
|
|
4706
|
+
const lifecycle = new AbortController();
|
|
4707
|
+
const operations = /* @__PURE__ */ new Set();
|
|
4708
|
+
const remoteOperations = /* @__PURE__ */ new Set();
|
|
4584
4709
|
let visible = false;
|
|
4585
4710
|
let sourceGeneration = 0;
|
|
4586
4711
|
let activeGeneration = 0;
|
|
@@ -4599,6 +4724,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4599
4724
|
let effortOperation = 0;
|
|
4600
4725
|
let pendingRoute = null;
|
|
4601
4726
|
let pendingEffort = null;
|
|
4727
|
+
const pendingCreates = /* @__PURE__ */ new Map();
|
|
4728
|
+
const pendingAsks = /* @__PURE__ */ new Map();
|
|
4729
|
+
const track = (pending, operation) => {
|
|
4730
|
+
let tracked;
|
|
4731
|
+
tracked = operation.finally(() => pending.delete(tracked));
|
|
4732
|
+
pending.add(tracked);
|
|
4733
|
+
return tracked;
|
|
4734
|
+
};
|
|
4735
|
+
const admit = (fallback, operation) => {
|
|
4736
|
+
if (disposed) return Promise.resolve(fallback);
|
|
4737
|
+
return track(operations, Promise.resolve().then(() => disposed ? fallback : operation()));
|
|
4738
|
+
};
|
|
4602
4739
|
const update = (mutator) => {
|
|
4603
4740
|
if (!disposed) store.update(mutator);
|
|
4604
4741
|
};
|
|
@@ -4650,8 +4787,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4650
4787
|
});
|
|
4651
4788
|
writeLastTopic(topic.topic.sourceSessionId, topic.topic.sessionId);
|
|
4652
4789
|
};
|
|
4653
|
-
const call =
|
|
4790
|
+
const call = (command) => track(remoteOperations, (async () => {
|
|
4791
|
+
lifecycle.signal.throwIfAborted();
|
|
4792
|
+
const result = await request(command, lifecycle.signal);
|
|
4793
|
+
lifecycle.signal.throwIfAborted();
|
|
4794
|
+
return remoteValue(result);
|
|
4795
|
+
})());
|
|
4654
4796
|
const openTopic = async (sessionId, operationGeneration = activeGeneration) => {
|
|
4797
|
+
if (disposed) return;
|
|
4655
4798
|
update((draft) => {
|
|
4656
4799
|
draft.phase = "creating";
|
|
4657
4800
|
draft.error = null;
|
|
@@ -4668,6 +4811,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4668
4811
|
}
|
|
4669
4812
|
};
|
|
4670
4813
|
const refreshTopicsOnce = async (showLoading) => {
|
|
4814
|
+
if (disposed) return;
|
|
4671
4815
|
const snapshot = store.getSnapshot();
|
|
4672
4816
|
if (snapshot.sourceSessionId === null) return;
|
|
4673
4817
|
const generation = sourceGeneration;
|
|
@@ -4727,6 +4871,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4727
4871
|
return refresh;
|
|
4728
4872
|
};
|
|
4729
4873
|
const refreshActive = async (operationGeneration = activeGeneration) => {
|
|
4874
|
+
if (disposed) return;
|
|
4730
4875
|
const active = store.getSnapshot().active;
|
|
4731
4876
|
if (active === null) return;
|
|
4732
4877
|
const response = await call({
|
|
@@ -4737,6 +4882,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4737
4882
|
};
|
|
4738
4883
|
const poll = async () => {
|
|
4739
4884
|
if (!visible || disposed || polling) return;
|
|
4885
|
+
const active = store.getSnapshot().active;
|
|
4886
|
+
if (active !== null && pendingAsks.has(active.topic.sessionId)) return;
|
|
4740
4887
|
polling = true;
|
|
4741
4888
|
const operationGeneration = activeGeneration;
|
|
4742
4889
|
try {
|
|
@@ -4749,7 +4896,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4749
4896
|
}
|
|
4750
4897
|
};
|
|
4751
4898
|
const loadModels = async () => {
|
|
4752
|
-
if (store.getSnapshot().providers.length > 0) return;
|
|
4899
|
+
if (disposed || store.getSnapshot().providers.length > 0) return;
|
|
4753
4900
|
const generation = sourceGeneration;
|
|
4754
4901
|
try {
|
|
4755
4902
|
const response = await call({ action: "models" });
|
|
@@ -4823,9 +4970,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4823
4970
|
poll();
|
|
4824
4971
|
}, 700);
|
|
4825
4972
|
};
|
|
4826
|
-
|
|
4827
|
-
if (
|
|
4828
|
-
const question = normalizeQuestion(rawQuestion);
|
|
4973
|
+
async function runCreate(selection, question, mode, intent) {
|
|
4974
|
+
if (disposed) return;
|
|
4829
4975
|
const operationGeneration = ++activeGeneration;
|
|
4830
4976
|
update((draft) => {
|
|
4831
4977
|
draft.sourceSessionId = selection.sourceSessionId;
|
|
@@ -4842,7 +4988,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4842
4988
|
if (answer === null || answer.status !== "settled") throw new Error("请在一次模型调用完成后引用;无需等待整轮长任务结束");
|
|
4843
4989
|
const response = await call({
|
|
4844
4990
|
action: "create",
|
|
4845
|
-
requestId:
|
|
4991
|
+
requestId: intent.requestId,
|
|
4846
4992
|
selectionClaim: {
|
|
4847
4993
|
sourceSessionId: selection.sourceSessionId,
|
|
4848
4994
|
anchorSeq: node.anchorSeq,
|
|
@@ -4852,23 +4998,33 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4852
4998
|
suffixText: selection.suffixText
|
|
4853
4999
|
},
|
|
4854
5000
|
question,
|
|
4855
|
-
mode
|
|
5001
|
+
mode
|
|
4856
5002
|
});
|
|
4857
5003
|
if (response.kind !== "topic") throw new Error("CiteCiter 返回了错误的创建响应");
|
|
5004
|
+
completeRequestIntent(intent);
|
|
4858
5005
|
writeCitationAnchor(selection.sourceSessionId, response.topic.topic.citation.anchorSeq, selection.anchorKey);
|
|
4859
5006
|
acceptTopic(response.topic, operationGeneration);
|
|
4860
5007
|
await refreshTopics();
|
|
4861
5008
|
} catch (error) {
|
|
4862
5009
|
fail(error, operationGeneration);
|
|
4863
5010
|
}
|
|
4864
|
-
}
|
|
4865
|
-
const
|
|
4866
|
-
|
|
4867
|
-
if (active === null) {
|
|
4868
|
-
fail("请先从选区创建 Topic,或打开一个旧 Topic");
|
|
4869
|
-
return false;
|
|
4870
|
-
}
|
|
5011
|
+
}
|
|
5012
|
+
const create = async (selection, rawQuestion, mode) => {
|
|
5013
|
+
if (disposed) return;
|
|
4871
5014
|
const question = normalizeQuestion(rawQuestion);
|
|
5015
|
+
const resolvedMode = mode ?? store.getSnapshot().settings.defaultMode;
|
|
5016
|
+
const intent = await claimCreateTopicIntent(selection, question, resolvedMode);
|
|
5017
|
+
if (disposed) return;
|
|
5018
|
+
const pending = pendingCreates.get(intent.requestId);
|
|
5019
|
+
if (pending !== void 0) return pending;
|
|
5020
|
+
const operation = runCreate(selection, question, resolvedMode, intent).finally(() => {
|
|
5021
|
+
if (pendingCreates.get(intent.requestId) === operation) pendingCreates.delete(intent.requestId);
|
|
5022
|
+
});
|
|
5023
|
+
pendingCreates.set(intent.requestId, operation);
|
|
5024
|
+
return operation;
|
|
5025
|
+
};
|
|
5026
|
+
async function runAsk(active, question, intent) {
|
|
5027
|
+
if (disposed) return false;
|
|
4872
5028
|
const operationGeneration = ++activeGeneration;
|
|
4873
5029
|
update((draft) => {
|
|
4874
5030
|
draft.phase = "running";
|
|
@@ -4877,17 +5033,40 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4877
5033
|
try {
|
|
4878
5034
|
const response = await call({
|
|
4879
5035
|
action: "ask",
|
|
5036
|
+
requestId: intent.requestId,
|
|
4880
5037
|
topicSessionId: active.topic.sessionId,
|
|
4881
5038
|
question
|
|
4882
5039
|
});
|
|
5040
|
+
completeRequestIntent(intent);
|
|
4883
5041
|
if (response.kind === "topic") acceptTopic(response.topic, operationGeneration, active.topic.sessionId);
|
|
4884
5042
|
return response.kind === "topic" && operationGeneration === activeGeneration;
|
|
4885
5043
|
} catch (error) {
|
|
4886
5044
|
fail(error, operationGeneration);
|
|
4887
5045
|
return false;
|
|
4888
5046
|
}
|
|
5047
|
+
}
|
|
5048
|
+
const ask = async (rawQuestion) => {
|
|
5049
|
+
if (disposed) return false;
|
|
5050
|
+
const snapshot = store.getSnapshot();
|
|
5051
|
+
const active = snapshot.active;
|
|
5052
|
+
if (active === null || ![
|
|
5053
|
+
"ready",
|
|
5054
|
+
"stopped",
|
|
5055
|
+
"error"
|
|
5056
|
+
].includes(snapshot.phase)) return false;
|
|
5057
|
+
const sessionId = active.topic.sessionId;
|
|
5058
|
+
if (pendingAsks.has(sessionId)) return false;
|
|
5059
|
+
const question = normalizeQuestion(rawQuestion);
|
|
5060
|
+
const intent = await claimAskIntent(sessionId, question);
|
|
5061
|
+
if (disposed || pendingAsks.has(sessionId)) return false;
|
|
5062
|
+
const operation = runAsk(active, question, intent).finally(() => {
|
|
5063
|
+
if (pendingAsks.get(sessionId) === operation) pendingAsks.delete(sessionId);
|
|
5064
|
+
});
|
|
5065
|
+
pendingAsks.set(sessionId, operation);
|
|
5066
|
+
return operation;
|
|
4889
5067
|
};
|
|
4890
5068
|
const stop = async () => {
|
|
5069
|
+
if (disposed) return;
|
|
4891
5070
|
const active = store.getSnapshot().active;
|
|
4892
5071
|
if (active === null) return;
|
|
4893
5072
|
const operationGeneration = ++activeGeneration;
|
|
@@ -4906,6 +5085,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4906
5085
|
}
|
|
4907
5086
|
};
|
|
4908
5087
|
const answerQuestion = async (key, answer) => {
|
|
5088
|
+
if (disposed) return;
|
|
4909
5089
|
const active = store.getSnapshot().active;
|
|
4910
5090
|
if (active === null) return;
|
|
4911
5091
|
const operationGeneration = ++activeGeneration;
|
|
@@ -4922,6 +5102,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4922
5102
|
}
|
|
4923
5103
|
};
|
|
4924
5104
|
const cancelQuestion = async (key) => {
|
|
5105
|
+
if (disposed) return;
|
|
4925
5106
|
const active = store.getSnapshot().active;
|
|
4926
5107
|
if (active === null) return;
|
|
4927
5108
|
const operationGeneration = ++activeGeneration;
|
|
@@ -4937,6 +5118,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4937
5118
|
}
|
|
4938
5119
|
};
|
|
4939
5120
|
const rename = async (rawTitle) => {
|
|
5121
|
+
if (disposed) return false;
|
|
4940
5122
|
const active = store.getSnapshot().active;
|
|
4941
5123
|
const title = rawTitle.trim();
|
|
4942
5124
|
if (active === null || title === "") return false;
|
|
@@ -4966,6 +5148,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4966
5148
|
}
|
|
4967
5149
|
};
|
|
4968
5150
|
const archive = async (archived) => {
|
|
5151
|
+
if (disposed) return false;
|
|
4969
5152
|
const active = store.getSnapshot().active;
|
|
4970
5153
|
if (active === null) return false;
|
|
4971
5154
|
const operationGeneration = ++activeGeneration;
|
|
@@ -5005,6 +5188,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5005
5188
|
});
|
|
5006
5189
|
};
|
|
5007
5190
|
const setModelRoute = async (provider, model) => {
|
|
5191
|
+
if (disposed) return;
|
|
5008
5192
|
const active = store.getSnapshot().active;
|
|
5009
5193
|
if (active === null) return;
|
|
5010
5194
|
const operation = ++routeOperation;
|
|
@@ -5047,10 +5231,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5047
5231
|
draft.modelRouteSaving = false;
|
|
5048
5232
|
});
|
|
5049
5233
|
fail(error, operationGeneration);
|
|
5050
|
-
await refreshActive(activeGeneration);
|
|
5234
|
+
if (!disposed) await refreshActive(activeGeneration);
|
|
5051
5235
|
}
|
|
5052
5236
|
};
|
|
5053
5237
|
const setReasoningEffort = async (reasoningEffort) => {
|
|
5238
|
+
if (disposed) return;
|
|
5054
5239
|
const active = store.getSnapshot().active;
|
|
5055
5240
|
if (active === null) return;
|
|
5056
5241
|
const operation = ++effortOperation;
|
|
@@ -5087,7 +5272,43 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5087
5272
|
draft.reasoningEffortSaving = false;
|
|
5088
5273
|
});
|
|
5089
5274
|
fail(error, operationGeneration);
|
|
5090
|
-
await refreshActive(activeGeneration);
|
|
5275
|
+
if (!disposed) await refreshActive(activeGeneration);
|
|
5276
|
+
}
|
|
5277
|
+
};
|
|
5278
|
+
const setSetting = async (key, value) => {
|
|
5279
|
+
if (disposed) return;
|
|
5280
|
+
const operation = ++settingOperation;
|
|
5281
|
+
pendingSettings.set(key, {
|
|
5282
|
+
operation,
|
|
5283
|
+
value
|
|
5284
|
+
});
|
|
5285
|
+
update((draft) => {
|
|
5286
|
+
draft.settings = {
|
|
5287
|
+
...draft.settings,
|
|
5288
|
+
[key]: value
|
|
5289
|
+
};
|
|
5290
|
+
draft.settingsSaveStatus = "saving";
|
|
5291
|
+
draft.settingsSaveMessage = "正在保存…";
|
|
5292
|
+
});
|
|
5293
|
+
try {
|
|
5294
|
+
await track(remoteOperations, settingsScope.set(key, value));
|
|
5295
|
+
if (pendingSettings.get(key)?.operation !== operation || disposed) return;
|
|
5296
|
+
pendingSettings.delete(key);
|
|
5297
|
+
const authoritative = settingsScope.getSnapshot().value ?? DEFAULT_CITECITER_SETTINGS;
|
|
5298
|
+
update((draft) => {
|
|
5299
|
+
draft.settings = settingsWithPending(authoritative);
|
|
5300
|
+
draft.settingsSaveStatus = pendingSettings.size === 0 ? "saved" : "saving";
|
|
5301
|
+
draft.settingsSaveMessage = pendingSettings.size === 0 ? "已保存" : "正在保存…";
|
|
5302
|
+
});
|
|
5303
|
+
} catch (error) {
|
|
5304
|
+
if (pendingSettings.get(key)?.operation !== operation || disposed) return;
|
|
5305
|
+
pendingSettings.delete(key);
|
|
5306
|
+
const restored = settingsScope.getSnapshot().value ?? DEFAULT_CITECITER_SETTINGS;
|
|
5307
|
+
update((draft) => {
|
|
5308
|
+
draft.settings = settingsWithPending(restored);
|
|
5309
|
+
draft.settingsSaveStatus = "error";
|
|
5310
|
+
draft.settingsSaveMessage = `保存失败,已恢复:${error instanceof Error ? error.message : String(error)}`;
|
|
5311
|
+
});
|
|
5091
5312
|
}
|
|
5092
5313
|
};
|
|
5093
5314
|
return {
|
|
@@ -5095,15 +5316,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5095
5316
|
subscribe: store.subscribe,
|
|
5096
5317
|
setSource,
|
|
5097
5318
|
setVisible,
|
|
5098
|
-
create,
|
|
5099
|
-
openTopic: (sessionId) => openTopic(sessionId, ++activeGeneration),
|
|
5100
|
-
ask,
|
|
5101
|
-
answerQuestion,
|
|
5102
|
-
cancelQuestion,
|
|
5103
|
-
stop,
|
|
5104
|
-
rename,
|
|
5105
|
-
archive,
|
|
5319
|
+
create: (selection, question, mode) => admit(void 0, () => create(selection, question, mode)),
|
|
5320
|
+
openTopic: (sessionId) => admit(void 0, () => openTopic(sessionId, ++activeGeneration)),
|
|
5321
|
+
ask: (question) => admit(false, () => ask(question)),
|
|
5322
|
+
answerQuestion: (key, answer) => admit(void 0, () => answerQuestion(key, answer)),
|
|
5323
|
+
cancelQuestion: (key) => admit(void 0, () => cancelQuestion(key)),
|
|
5324
|
+
stop: () => admit(void 0, stop),
|
|
5325
|
+
rename: (title) => admit(false, () => rename(title)),
|
|
5326
|
+
archive: (archived) => admit(false, () => archive(archived)),
|
|
5106
5327
|
setIncludeArchived: (include) => {
|
|
5328
|
+
if (disposed) return;
|
|
5107
5329
|
activeGeneration++;
|
|
5108
5330
|
update((draft) => {
|
|
5109
5331
|
draft.includeArchived = include;
|
|
@@ -5115,52 +5337,146 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5115
5337
|
});
|
|
5116
5338
|
refreshTopics(true);
|
|
5117
5339
|
},
|
|
5118
|
-
setModelRoute,
|
|
5119
|
-
setReasoningEffort,
|
|
5120
|
-
setSetting:
|
|
5121
|
-
const operation = ++settingOperation;
|
|
5122
|
-
pendingSettings.set(key, {
|
|
5123
|
-
operation,
|
|
5124
|
-
value
|
|
5125
|
-
});
|
|
5126
|
-
update((draft) => {
|
|
5127
|
-
draft.settings = {
|
|
5128
|
-
...draft.settings,
|
|
5129
|
-
[key]: value
|
|
5130
|
-
};
|
|
5131
|
-
draft.settingsSaveStatus = "saving";
|
|
5132
|
-
draft.settingsSaveMessage = "正在保存…";
|
|
5133
|
-
});
|
|
5134
|
-
try {
|
|
5135
|
-
await settingsScope.set(key, value);
|
|
5136
|
-
if (pendingSettings.get(key)?.operation !== operation || disposed) return;
|
|
5137
|
-
pendingSettings.delete(key);
|
|
5138
|
-
const authoritative = settingsScope.getSnapshot().value ?? DEFAULT_CITECITER_SETTINGS;
|
|
5139
|
-
update((draft) => {
|
|
5140
|
-
draft.settings = settingsWithPending(authoritative);
|
|
5141
|
-
draft.settingsSaveStatus = pendingSettings.size === 0 ? "saved" : "saving";
|
|
5142
|
-
draft.settingsSaveMessage = pendingSettings.size === 0 ? "已保存" : "正在保存…";
|
|
5143
|
-
});
|
|
5144
|
-
} catch (error) {
|
|
5145
|
-
if (pendingSettings.get(key)?.operation !== operation || disposed) return;
|
|
5146
|
-
pendingSettings.delete(key);
|
|
5147
|
-
const restored = settingsScope.getSnapshot().value ?? DEFAULT_CITECITER_SETTINGS;
|
|
5148
|
-
update((draft) => {
|
|
5149
|
-
draft.settings = settingsWithPending(restored);
|
|
5150
|
-
draft.settingsSaveStatus = "error";
|
|
5151
|
-
draft.settingsSaveMessage = `保存失败,已恢复:${error instanceof Error ? error.message : String(error)}`;
|
|
5152
|
-
});
|
|
5153
|
-
}
|
|
5154
|
-
},
|
|
5340
|
+
setModelRoute: (provider, model) => admit(void 0, () => setModelRoute(provider, model)),
|
|
5341
|
+
setReasoningEffort: (effort) => admit(void 0, () => setReasoningEffort(effort)),
|
|
5342
|
+
setSetting: (key, value) => admit(void 0, () => setSetting(key, value)),
|
|
5155
5343
|
dispose: async () => {
|
|
5156
5344
|
if (disposed) return;
|
|
5157
5345
|
disposed = true;
|
|
5346
|
+
visible = false;
|
|
5347
|
+
sourceGeneration++;
|
|
5348
|
+
activeGeneration++;
|
|
5349
|
+
topicsRefreshAgain = false;
|
|
5158
5350
|
if (pollTimer !== null) clearInterval(pollTimer);
|
|
5351
|
+
pollTimer = null;
|
|
5159
5352
|
unsubscribeSettings();
|
|
5353
|
+
lifecycle.abort(new DOMException("CiteCiter is shutting down", "AbortError"));
|
|
5354
|
+
while (operations.size > 0 || remoteOperations.size > 0 || topicsRefresh !== null) await Promise.allSettled([
|
|
5355
|
+
...operations,
|
|
5356
|
+
...remoteOperations,
|
|
5357
|
+
...topicsRefresh === null ? [] : [topicsRefresh]
|
|
5358
|
+
]);
|
|
5160
5359
|
}
|
|
5161
5360
|
};
|
|
5162
5361
|
}
|
|
5163
5362
|
//#endregion
|
|
5363
|
+
//#region lib/types/client/conversation-dom.js
|
|
5364
|
+
/** Centralized best-effort adapters for DSH conversation and Read Frog DOM markers. */
|
|
5365
|
+
const DSH_FLOW_SELECTOR = "[data-chat-flow-kind]";
|
|
5366
|
+
const DSH_ASSISTANT_ANCHOR_SELECTOR = "[data-chat-flow-kind=\"assistant-step\"][data-chat-anchor-key]";
|
|
5367
|
+
const DSH_REASONING_SELECTOR = "[data-variant=\"think\"]";
|
|
5368
|
+
const DSH_GENERATED_CONTENT_SELECTOR = "button, .katex, [data-footnotes], sup";
|
|
5369
|
+
const DSH_CODE_BLOCK_SELECTOR = ".md-code-block";
|
|
5370
|
+
const READ_FROG_TRANSLATION_SELECTOR = "[data-read-frog-translation-mode]";
|
|
5371
|
+
const READ_FROG_PARAGRAPH_SELECTOR = "[data-read-frog-paragraph]";
|
|
5372
|
+
function elementForNode(node) {
|
|
5373
|
+
return node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
|
|
5374
|
+
}
|
|
5375
|
+
function parseFlow(element) {
|
|
5376
|
+
if (element === null) return null;
|
|
5377
|
+
return {
|
|
5378
|
+
element,
|
|
5379
|
+
kind: element.dataset.chatFlowKind ?? "",
|
|
5380
|
+
anchorKey: element.dataset.chatAnchorKey ?? null
|
|
5381
|
+
};
|
|
5382
|
+
}
|
|
5383
|
+
function parseAssistantAnchor(element) {
|
|
5384
|
+
const flow = parseFlow(element);
|
|
5385
|
+
if (flow === null || flow.kind !== "assistant-step" || flow.anchorKey === null || flow.anchorKey === "") return null;
|
|
5386
|
+
return {
|
|
5387
|
+
element: flow.element,
|
|
5388
|
+
anchorKey: flow.anchorKey
|
|
5389
|
+
};
|
|
5390
|
+
}
|
|
5391
|
+
/**
|
|
5392
|
+
* Parse the nearest DSH conversation flow containing a DOM node.
|
|
5393
|
+
*
|
|
5394
|
+
* @param node - rendered conversation node to inspect.
|
|
5395
|
+
* @returns parsed flow metadata, or null outside a known DSH flow.
|
|
5396
|
+
*/
|
|
5397
|
+
function dshConversationFlow(node) {
|
|
5398
|
+
return parseFlow(elementForNode(node)?.closest(DSH_FLOW_SELECTOR) ?? null);
|
|
5399
|
+
}
|
|
5400
|
+
/**
|
|
5401
|
+
* Parse the assistant anchor that owns a context-menu event target.
|
|
5402
|
+
*
|
|
5403
|
+
* @param target - browser event target to inspect.
|
|
5404
|
+
* @returns validated assistant metadata, or null outside an anchored assistant flow.
|
|
5405
|
+
*/
|
|
5406
|
+
function dshAssistantAnchorForTarget(target) {
|
|
5407
|
+
if (!(target instanceof Element)) return null;
|
|
5408
|
+
return parseAssistantAnchor(target.closest(DSH_ASSISTANT_ANCHOR_SELECTOR));
|
|
5409
|
+
}
|
|
5410
|
+
/**
|
|
5411
|
+
* Return assistant anchors intersected by a DOM range in document order.
|
|
5412
|
+
*
|
|
5413
|
+
* @param range - current rendered selection range.
|
|
5414
|
+
* @returns validated assistant anchors touched by the range.
|
|
5415
|
+
*/
|
|
5416
|
+
function dshIntersectedAssistantAnchors(range) {
|
|
5417
|
+
const anchors = [];
|
|
5418
|
+
for (const element of document.querySelectorAll(DSH_ASSISTANT_ANCHOR_SELECTOR)) {
|
|
5419
|
+
if (!range.intersectsNode(element)) continue;
|
|
5420
|
+
const anchor = parseAssistantAnchor(element);
|
|
5421
|
+
if (anchor !== null) anchors.push(anchor);
|
|
5422
|
+
}
|
|
5423
|
+
return anchors;
|
|
5424
|
+
}
|
|
5425
|
+
/**
|
|
5426
|
+
* Detect DSH-rendered reasoning, generated controls, and collapsed code chrome.
|
|
5427
|
+
*
|
|
5428
|
+
* @param range - current rendered selection range.
|
|
5429
|
+
* @param flow - assistant flow containing the range.
|
|
5430
|
+
* @returns whether the range touches content that CiteCiter must ignore.
|
|
5431
|
+
*/
|
|
5432
|
+
function dshRangeTouchesExcludedContent(range, flow) {
|
|
5433
|
+
for (const reasoning of flow.querySelectorAll(DSH_REASONING_SELECTOR)) if (range.intersectsNode(reasoning)) return true;
|
|
5434
|
+
for (const generated of flow.querySelectorAll(DSH_GENERATED_CONTENT_SELECTOR)) if (range.intersectsNode(generated)) return true;
|
|
5435
|
+
for (const endpoint of [range.startContainer, range.endContainer]) {
|
|
5436
|
+
const element = elementForNode(endpoint);
|
|
5437
|
+
if (element?.closest(DSH_CODE_BLOCK_SELECTOR) !== null && element?.closest("pre") === null) return true;
|
|
5438
|
+
}
|
|
5439
|
+
return false;
|
|
5440
|
+
}
|
|
5441
|
+
/**
|
|
5442
|
+
* Find the current DSH assistant element for a persisted anchor key.
|
|
5443
|
+
*
|
|
5444
|
+
* @param anchorKey - stable anchor emitted by the DSH conversation renderer.
|
|
5445
|
+
* @returns matching rendered assistant element, or null when it is not mounted.
|
|
5446
|
+
*/
|
|
5447
|
+
function findDshAssistantAnchor(anchorKey) {
|
|
5448
|
+
for (const element of document.querySelectorAll(DSH_ASSISTANT_ANCHOR_SELECTOR)) if (element.dataset.chatAnchorKey === anchorKey) return element;
|
|
5449
|
+
return null;
|
|
5450
|
+
}
|
|
5451
|
+
/**
|
|
5452
|
+
* Determine whether a node is a Read Frog translated projection rather than source text.
|
|
5453
|
+
*
|
|
5454
|
+
* @param node - rendered node to classify.
|
|
5455
|
+
* @returns whether Read Frog marks the node as translated content.
|
|
5456
|
+
*/
|
|
5457
|
+
function isReadFrogTranslatedContent(node) {
|
|
5458
|
+
return node.nodeType === Node.ELEMENT_NODE && node.matches(READ_FROG_TRANSLATION_SELECTOR);
|
|
5459
|
+
}
|
|
5460
|
+
/**
|
|
5461
|
+
* Resolve a selection wholly inside one Read Frog translation to its source paragraph.
|
|
5462
|
+
*
|
|
5463
|
+
* @param range - current rendered selection range.
|
|
5464
|
+
* @param assistant - assistant flow containing the translated projection.
|
|
5465
|
+
* @returns translation mapping state and source paragraph when available.
|
|
5466
|
+
*/
|
|
5467
|
+
function readFrogSelection(range, assistant) {
|
|
5468
|
+
const translatedStart = elementForNode(range.startContainer)?.closest(READ_FROG_TRANSLATION_SELECTOR);
|
|
5469
|
+
const translatedEnd = elementForNode(range.endContainer)?.closest(READ_FROG_TRANSLATION_SELECTOR);
|
|
5470
|
+
if (translatedStart === null || translatedStart === void 0) return translatedEnd === null || translatedEnd === void 0 ? { kind: "none" } : { kind: "invalid" };
|
|
5471
|
+
if (translatedEnd === null || translatedEnd === void 0 || translatedStart !== translatedEnd) return { kind: "invalid" };
|
|
5472
|
+
const sourceParagraph = translatedStart.parentElement?.closest(READ_FROG_PARAGRAPH_SELECTOR);
|
|
5473
|
+
if (sourceParagraph === null || sourceParagraph === void 0 || !assistant.contains(sourceParagraph)) return { kind: "invalid" };
|
|
5474
|
+
return {
|
|
5475
|
+
kind: "translation",
|
|
5476
|
+
sourceParagraph
|
|
5477
|
+
};
|
|
5478
|
+
}
|
|
5479
|
+
//#endregion
|
|
5164
5480
|
//#region \0citeciter-svg:src/client/assets/collapse-arrow.svg
|
|
5165
5481
|
var collapse_arrow_default = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSI+CiAgPHBhdGggZD0iTTExIDcuNSAxOS41IDE2IDExIDI0LjUiIHN0cm9rZT0iIzM0NzhmNiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg==";
|
|
5166
5482
|
//#endregion
|
|
@@ -5168,7 +5484,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5168
5484
|
var citeciter_mascot_default = "data:image/png;base64,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";
|
|
5169
5485
|
//#endregion
|
|
5170
5486
|
//#region \0dsh-css:src/client/components/CiteCiter.module.css.mjs
|
|
5171
|
-
const css = "[data-citeciter-docked=true]{grid-template-columns:var(--citeciter-sidebar-width) minmax(0, 1fr) var(--citeciter-dock-width)!important}[data-citeciter-docked=true]>[data-side=details]{display:none!important}._1Fxyxa_selectionPopover{z-index:9999;box-sizing:border-box;width:min(378px,100vw - 24px);color:var(--dsw-alias-label-primary,#20232a);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 96%, #fff);border:1px solid var(--dsw-alias-border-l2,#d9dde5);pointer-events:auto;border-radius:14px;padding:10px;position:fixed;box-shadow:0 16px 44px #191f2c33,0 2px 8px #191f2c14}._1Fxyxa_popoverQuote{color:var(--dsw-alias-label-secondary,#5c6472);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}._1Fxyxa_popoverQuote:before{vertical-align:1px;content:\"\";background:#3478f6;border-radius:999px;width:6px;height:6px;margin-right:7px;display:inline-block}._1Fxyxa_popoverComposer{grid-template-columns:minmax(0,1fr) auto;gap:7px;margin-top:8px;display:grid}._1Fxyxa_popoverComposer input,._1Fxyxa_topicToolbar input,._1Fxyxa_topicToolbar select,._1Fxyxa_composer textarea{box-sizing:border-box;min-width:0;color:var(--dsw-alias-label-primary,#20232a);background:var(--dsw-alias-bg-base,#fff);border:1px solid var(--dsw-alias-border-l1,#dfe3ea);outline:none}._1Fxyxa_popoverComposer input{height:36px;font:inherit;border-radius:9px;padding:0 11px;font-size:13px}._1Fxyxa_popoverComposer button,._1Fxyxa_sendButton{color:#fff;cursor:pointer;background:linear-gradient(135deg,#3478f6,#245fd1);border:0;border-radius:9px;padding:0 14px;font-weight:650;box-shadow:0 4px 12px #3478f638}._1Fxyxa_popoverComposer button:disabled,._1Fxyxa_sendButton:disabled{cursor:default;filter:grayscale(.45);opacity:.52;box-shadow:none}._1Fxyxa_popoverComposer input:focus,._1Fxyxa_topicToolbar input:focus,._1Fxyxa_topicToolbar select:focus,._1Fxyxa_composer textarea:focus{border-color:#3478f6;box-shadow:0 0 0 3px #3478f621}._1Fxyxa_popoverMode{color:var(--dsw-alias-label-tertiary,#858c98);margin-top:8px;font-size:11px}._1Fxyxa_popoverMode summary{cursor:pointer;user-select:none}._1Fxyxa_popoverMode select{width:100%;height:30px;color:var(--dsw-alias-label-secondary,#535b68);background:var(--dsw-specific-bubble,#f5f7fa);border:1px solid var(--dsw-alias-border-l1,#dfe3ea);border-radius:7px;margin-top:6px;padding:0 7px}._1Fxyxa_topicLauncher{z-index:200;color:#fff;cursor:pointer;background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 90%, #dceaff);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l2,#d9dde5) 65%, #3478f6);pointer-events:auto;border-radius:999px;align-items:center;width:112px;height:112px;padding:5px;display:flex;position:fixed;bottom:76px;right:22px;box-shadow:0 10px 28px #245fd13d}._1Fxyxa_topicLauncher img{object-fit:contain;width:100px;height:100px;display:block}._1Fxyxa_launcherCount{border:2px solid var(--dsw-alias-bg-base,#fff);background:#245fd1;border-radius:999px;place-items:center;min-width:24px;height:24px;padding:0 5px;font-size:11px;line-height:1;display:grid;position:absolute;top:-4px;right:-4px}._1Fxyxa_topicLauncher:hover{transform:translateY(-1px)}._1Fxyxa_dock{--citeciter-accent:#3478f6;z-index:1;box-sizing:border-box;min-width:360px;color:var(--dsw-alias-label-primary,#20232a);background:var(--dsw-alias-bg-base,#fff);border-left:1px solid var(--dsw-alias-border-l2,#d9dde5);pointer-events:auto;grid-template-columns:clamp(138px,24%,210px) minmax(0,1fr);display:grid;position:absolute;top:0;bottom:0;right:0;overflow:visible;box-shadow:-12px 0 32px #1a1f2c14}._1Fxyxa_resizeHandle{z-index:3;cursor:col-resize;touch-action:none;width:10px;position:absolute;top:0;bottom:0;left:-5px}._1Fxyxa_resizeHandle:after{content:\"\";background:var(--dsw-alias-border-l2,#d9dde5);border-radius:999px;width:3px;height:42px;transition:background .12s,width .12s;position:absolute;top:50%;left:3px;transform:translateY(-50%)}._1Fxyxa_resizeHandle:hover:after,._1Fxyxa_resizeHandle:focus-visible:after{background:var(--citeciter-accent);width:4px}._1Fxyxa_citationWaterline{z-index:199;pointer-events:none;opacity:0;width:100vw;height:100vh;transition:opacity .16s;position:fixed;inset:0;overflow:visible}._1Fxyxa_citationWaterline[data-visible]{opacity:.48}._1Fxyxa_citationWaterline path{fill:none;stroke:color-mix(in srgb, var(--citeciter-accent) 72%, #73d9ff);stroke-width:1.5px;stroke-linecap:round;stroke-dasharray:3 7}._1Fxyxa_topicRail{background:color-mix(in srgb, var(--dsw-specific-sidebar-fill,#f7f8fa) 94%, #edf5ff);border-right:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}._1Fxyxa_brand{border-bottom:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex:none;align-items:center;gap:9px;min-height:65px;padding:0 13px;display:flex}._1Fxyxa_mascotStatus,._1Fxyxa_settingsWhale{background:linear-gradient(145deg, color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 90%, #3478f6), color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 72%, #3478f6));border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#dfe3ea) 64%, #3478f6);width:32px;height:32px;box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 72%, transparent);border-radius:10px;flex:none;place-items:center;display:grid;overflow:hidden}._1Fxyxa_mascotStatus img,._1Fxyxa_settingsWhale img{object-fit:contain;width:100%;height:100%}._1Fxyxa_mascotStatus{position:relative;overflow:visible}._1Fxyxa_mascotStatus img{transition:transform .18s}._1Fxyxa_mascotStatus>span{pointer-events:none;position:absolute}._1Fxyxa_mascotStatus[data-state=diving] img{transform:translateY(9px)}._1Fxyxa_mascotStatus[data-state=diving]>span,._1Fxyxa_mascotStatus[data-state=surfaced]>span{border-top:2px solid #44aef4;border-radius:50%;height:6px;bottom:3px;left:1px;right:1px;box-shadow:0 -3px 0 -2px #7fd9ff}._1Fxyxa_mascotStatus[data-state=reading]>span{border:2px solid #245fd1;border-radius:50%;width:9px;height:9px;top:4px;right:2px}._1Fxyxa_mascotStatus[data-state=reading]>span:after{content:\"\";background:#245fd1;border-radius:2px;width:6px;height:2px;position:absolute;bottom:-3px;right:-5px;transform:rotate(48deg)}._1Fxyxa_mascotStatus[data-state=answering]>span{color:#245fd1;content:\"\";background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid #8eb4ff;border-radius:7px;place-items:center;width:15px;height:13px;display:grid;top:-4px;right:-5px}._1Fxyxa_mascotStatus[data-state=answering]>span:before{content:\"“\";font-size:12px;line-height:1}._1Fxyxa_brand div{flex-direction:column;min-width:0;display:flex}._1Fxyxa_brand strong{text-overflow:ellipsis;font-size:14px;overflow:hidden}._1Fxyxa_brand>div>span{color:var(--dsw-alias-label-tertiary,#858c98);font-size:10px}._1Fxyxa_railCaption,._1Fxyxa_railFoot{color:var(--dsw-alias-label-tertiary,#858c98);flex:none;justify-content:space-between;align-items:center;gap:6px;padding:10px 11px 7px;font-size:10px;display:flex}._1Fxyxa_railCaption button,._1Fxyxa_topicToolbar button,._1Fxyxa_composerActions button:not(._1Fxyxa_sendButton){color:var(--dsw-alias-label-secondary,#58606d);cursor:pointer;background:0 0;border:0;border-radius:6px}._1Fxyxa_railCaption button:hover,._1Fxyxa_topicToolbar button:hover,._1Fxyxa_composerActions button:not(._1Fxyxa_sendButton):hover,._1Fxyxa_closeButton:hover{background:var(--dsw-alias-interactive-bg-hover,#0000000f)}._1Fxyxa_topicList{flex-direction:column;flex:1;gap:4px;min-height:0;padding:0 7px;display:flex;overflow-y:auto}._1Fxyxa_topicItem{width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;grid-template-columns:7px minmax(0,1fr);align-items:start;gap:7px;padding:9px 8px;display:grid}._1Fxyxa_topicItem:hover{background:var(--dsw-alias-interactive-bg-hover,#0000000b)}._1Fxyxa_topicItem[data-active]{background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 88%, #eaf3ff);border-color:color-mix(in srgb, var(--dsw-alias-border-l1,#dde1e8) 72%, #7ca8ff);box-shadow:0 2px 7px #1c222f0d}._1Fxyxa_topicItem[data-archived]{opacity:.58}._1Fxyxa_topicStatus{background:#99a1ae;border-radius:999px;width:6px;height:6px;margin-top:5px}._1Fxyxa_topicStatus[data-running]{background:var(--citeciter-accent);animation:1.2s ease-in-out infinite _1Fxyxa_citeciterPulse;box-shadow:0 0 0 3px #3478f629}@keyframes _1Fxyxa_citeciterPulse{50%{opacity:.42}}._1Fxyxa_topicCopy{flex-direction:column;gap:3px;min-width:0;display:flex}._1Fxyxa_topicCopy strong,._1Fxyxa_topicCopy small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._1Fxyxa_topicCopy strong{font-size:12px;font-weight:590}._1Fxyxa_topicCopy strong[data-pending]{color:var(--dsw-alias-label-secondary,#606875);font-style:italic}._1Fxyxa_topicCopy small{color:var(--dsw-alias-label-tertiary,#858c98);font-size:10px}._1Fxyxa_railEmpty{color:var(--dsw-alias-label-tertiary,#858c98);margin:9px 6px;font-size:11px;line-height:17px}._1Fxyxa_railError{color:var(--dsw-alias-state-error-primary,#c93f3f);overflow-wrap:anywhere;margin:9px 6px;font-size:10px;line-height:15px}._1Fxyxa_railFoot{border-top:1px solid var(--dsw-alias-border-l1,#e4e7ec);padding-top:8px;padding-bottom:9px}._1Fxyxa_learningWorkspace{background:var(--dsw-alias-bg-base,#fff);flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}._1Fxyxa_dockHeader{border-bottom:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex:none;justify-content:space-between;align-items:center;gap:12px;min-height:64px;padding:0 15px;display:flex}._1Fxyxa_dockHeading{grid-template-columns:auto minmax(0,1fr);align-items:center;gap:2px 7px;min-width:0;display:grid}._1Fxyxa_dockHeading strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}._1Fxyxa_dockHeading>span:last-child{color:var(--dsw-alias-label-tertiary,#858c98);grid-column:1/-1;font-size:10px}._1Fxyxa_modeBadge{color:color-mix(in srgb, var(--dsw-alias-label-primary,#20232a) 36%, #3478f6);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 84%, #3478f6);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#dfe3ea) 64%, #3478f6);letter-spacing:.02em;white-space:nowrap;border-radius:999px;padding:2px 6px;font-size:9px;font-weight:700}._1Fxyxa_closeButton{z-index:5;color:#3478f6;cursor:pointer;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#d9dde5);border-radius:999px;flex:none;place-items:center;width:30px;height:30px;padding:0;display:grid;position:absolute;top:50%;left:6px;transform:translateY(-50%);box-shadow:0 4px 14px #1d222f24}._1Fxyxa_closeButton img{width:18px;height:18px}._1Fxyxa_emptyState{box-sizing:border-box;text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;padding:34px 24px;display:flex}._1Fxyxa_emptyWhale{background:radial-gradient(circle at 32% 25%,#fff,#dceaff);border:1px solid #c9dcff;border-radius:22px;place-items:center;width:68px;height:68px;margin-bottom:13px;display:grid;overflow:hidden;box-shadow:0 14px 35px #245fd124}._1Fxyxa_emptyWhale img{object-fit:contain;width:100%;height:100%}._1Fxyxa_emptyState h2{margin:0;font-size:17px}._1Fxyxa_emptyState>p{max-width:430px;color:var(--dsw-alias-label-secondary,#606875);margin:9px 0 0;font-size:12px;line-height:20px}._1Fxyxa_contextBar{background:color-mix(in srgb, var(--dsw-specific-bubble,#f6f7f9) 90%, #edf5ff);border-bottom:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex:none;padding:10px 14px}._1Fxyxa_contextBar blockquote{max-height:57px;color:var(--dsw-alias-label-secondary,#59616e);border-left:3px solid var(--citeciter-accent);margin:0;padding-left:9px;font-size:11px;line-height:18px;overflow:auto}._1Fxyxa_contextMeta{color:var(--dsw-alias-label-tertiary,#858c98);gap:9px;margin-top:6px;font-size:9px;display:flex}._1Fxyxa_contextMeta span:first-child:before{content:\"\";vertical-align:1px;background:#b3bac5;border-radius:999px;width:5px;height:5px;margin-right:4px;display:inline-block}._1Fxyxa_contextMeta span[data-ok]:before{background:#27a96b}._1Fxyxa_topicToolbar{border-bottom:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex:none;align-items:center;gap:6px;padding:7px 11px;display:flex;overflow-x:auto}._1Fxyxa_topicToolbar form{flex:180px;min-width:130px;display:flex}._1Fxyxa_topicToolbar input,._1Fxyxa_topicToolbar select{border-radius:7px;height:30px;padding:0 7px;font-size:10px}._1Fxyxa_topicToolbar input{flex:1}._1Fxyxa_topicToolbar form button,._1Fxyxa_topicToolbar>button{white-space:nowrap;flex:none;padding:5px 7px;font-size:10px}._1Fxyxa_archiveButton{align-items:center;gap:3px;display:inline-flex}._1Fxyxa_topicToolbar button:disabled,._1Fxyxa_nextQuestions button:disabled{cursor:default;opacity:.42}._1Fxyxa_transcript{flex-direction:column;flex:1;gap:14px;min-height:0;padding:17px clamp(12px,4%,28px) 24px;display:flex;overflow:hidden auto}._1Fxyxa_assistantTurn,._1Fxyxa_userTurn,._1Fxyxa_errorTurn{overflow-wrap:anywhere;min-width:0;font-size:13px;line-height:21px}._1Fxyxa_assistantTurn{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#e4e7ec) 72%, transparent);padding-bottom:14px}._1Fxyxa_userTurn{background:var(--dsw-specific-bubble,#f1f3f7);border-radius:12px 12px 3px;align-self:flex-end;max-width:86%;padding:8px 11px}._1Fxyxa_errorTurn,._1Fxyxa_panelError{color:var(--dsw-alias-state-error-primary,#c93f3f);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 88%, #f45555);border:1px solid #c93f3f33;border-radius:8px}._1Fxyxa_errorTurn{padding:8px 10px}._1Fxyxa_errorTurn[data-status=stopped]{color:var(--dsw-alias-label-secondary,#606875);background:var(--dsw-specific-bubble,#f5f6f8);border-color:var(--dsw-alias-border-l1,#e4e7ec)}._1Fxyxa_errorMeta{color:var(--dsw-alias-label-tertiary,#858c98);flex-wrap:wrap;gap:5px 10px;font-size:9px;display:flex}._1Fxyxa_errorTurn details{margin-top:6px}._1Fxyxa_errorTurn pre{white-space:pre-wrap;max-height:160px;overflow:auto}._1Fxyxa_assistantTurn p,._1Fxyxa_userTurn p,._1Fxyxa_errorTurn p{margin-top:0;margin-bottom:8px}._1Fxyxa_turnRole{color:var(--dsw-alias-label-tertiary,#858c98);margin-bottom:5px;font-size:10px;font-weight:650}._1Fxyxa_flowDisclosure{min-width:0;color:var(--dsw-alias-label-secondary,#606875);font-size:12px}._1Fxyxa_flowRow,._1Fxyxa_flowRowRunning{align-items:center;min-width:0;height:26px;display:flex;position:relative;overflow:hidden}._1Fxyxa_flowRowRunning:after{content:\"\";pointer-events:none;background:linear-gradient(90deg,#0000 20%,#ffffff94 48%,#0000 76%);animation:1.7s linear infinite _1Fxyxa_citeciterSweep;position:absolute;inset:0;transform:translate(-100%)}@keyframes _1Fxyxa_citeciterSweep{to{transform:translate(100%)}}._1Fxyxa_flowDot{color:var(--dsw-alias-label-tertiary,#858c98);flex:none;margin:0 6px}._1Fxyxa_flowSummary{min-width:0;color:var(--dsw-alias-label-tertiary,#78808e);white-space:nowrap;overflow-x:hidden}._1Fxyxa_flowBody{max-height:320px;color:var(--dsw-alias-label-secondary,#606875);background:var(--dsw-specific-bubble,#f5f6f8);font:inherit;white-space:pre-wrap;border-radius:7px;margin:5px 0 5px 22px;padding:7px 9px;font-size:11px;line-height:18px;overflow:auto}._1Fxyxa_toolPreview{background:var(--dsw-specific-bubble,#f5f6f8);border-radius:7px;gap:5px;max-height:360px;margin:5px 0 5px 22px;padding:8px;display:grid;overflow:auto}._1Fxyxa_toolPreview>strong{color:var(--dsw-alias-label-tertiary,#858c98);text-transform:uppercase;font-size:9px}._1Fxyxa_toolPreview pre{overflow-wrap:anywhere;white-space:pre-wrap;margin:0;font:10px/17px ui-monospace,SFMono-Regular,Menlo,monospace}._1Fxyxa_loadingCard{color:var(--dsw-alias-label-secondary,#606875);background:color-mix(in srgb, var(--dsw-specific-bubble,#f5f6f8) 82%, #3478f6);border-radius:9px;align-self:flex-start;padding:8px 10px;font-size:11px}._1Fxyxa_panelError{overflow-wrap:anywhere;margin:0;padding:8px 10px;font-size:11px;line-height:17px}._1Fxyxa_composer{background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1,#fff));border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l2,#d9dde5));box-shadow:var(--dsw-shadow-lv2,0 5px 18px #1d222f14);border-radius:22px;flex:none;margin:0 12px 12px;padding:10px 8px 6px}._1Fxyxa_composer textarea{resize:none;width:100%;min-height:50px;max-height:150px;font:inherit;border:0;padding:4px 12px 0 16px;font-size:14px;line-height:22px;display:block}._1Fxyxa_composer textarea:focus{box-shadow:none}._1Fxyxa_composerActions{align-items:center;gap:6px;margin-top:4px;padding:2px 0 0 8px;display:flex}._1Fxyxa_composerActions span{color:var(--dsw-alias-label-tertiary,#858c98);margin-right:auto;font-size:9px}._1Fxyxa_composerActions ._1Fxyxa_sendButton{border-radius:999px;place-items:center;width:34px;height:34px;min-height:34px;padding:0;display:grid;transform:translateY(-2px)}._1Fxyxa_nextQuestions{flex-wrap:wrap;gap:6px;margin-top:10px;display:flex}._1Fxyxa_nextQuestions button{color:color-mix(in srgb, var(--dsw-alias-label-primary,#20232a) 46%, #3478f6);text-align:left;cursor:pointer;background:color-mix(in srgb, var(--dsw-specific-bubble,#f5f6f8) 86%, #3478f6);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#dfe3ea) 70%, #3478f6);border-radius:999px;padding:6px 9px;font-size:10px}._1Fxyxa_questionFrame{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#d9dde5);border-radius:14px;flex:none;margin:0 12px 12px;padding:12px;box-shadow:0 6px 20px #1d222f1a}._1Fxyxa_questionHeader{color:var(--dsw-alias-label-secondary,#606875);grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:8px;display:grid}._1Fxyxa_questionHeader>div{flex-direction:column;gap:2px;min-width:0;display:flex}._1Fxyxa_questionHeader span{color:var(--dsw-alias-label-tertiary,#858c98);font-size:9px}._1Fxyxa_questionHeader strong{color:var(--dsw-alias-label-primary,#20232a);font-size:12px;line-height:18px}._1Fxyxa_questionOptions{gap:6px;margin-top:10px;display:grid}._1Fxyxa_questionOptions>button{color:inherit;text-align:left;cursor:pointer;background:var(--dsw-specific-bubble,#f5f6f8);border:1px solid #0000;border-radius:8px;grid-template-columns:20px minmax(0,1fr);align-items:start;gap:6px;padding:8px;display:grid}._1Fxyxa_questionOptions>button[data-selected]{background:color-mix(in srgb, var(--dsw-specific-bubble,#f5f6f8) 82%, #3478f6);border-color:color-mix(in srgb, var(--dsw-alias-border-l1,#dfe3ea) 54%, #3478f6)}._1Fxyxa_questionOptions>button>span:first-child{color:#245fd1;background:var(--dsw-alias-bg-base,#fff);border:1px solid var(--dsw-alias-border-l2,#d9dde5);border-radius:5px;place-items:center;width:18px;height:18px;font-size:9px;display:grid}._1Fxyxa_questionOptions>button>span:last-child{flex-direction:column;min-width:0;display:flex}._1Fxyxa_questionOptions strong{font-size:11px}._1Fxyxa_questionOptions small{color:var(--dsw-alias-label-tertiary,#858c98);margin-top:2px;font-size:9px;line-height:14px}._1Fxyxa_questionCustom{box-sizing:border-box;resize:vertical;width:100%;color:inherit;background:var(--dsw-alias-bg-base,#fff);border:1px solid var(--dsw-alias-border-l1,#dfe3ea);font:inherit;border-radius:8px;outline:0;margin-top:8px;padding:7px 8px;font-size:10px}._1Fxyxa_questionCustom:focus{border-color:#3478f6;box-shadow:0 0 0 3px #3478f61f}._1Fxyxa_questionFooter{align-items:center;gap:6px;margin-top:9px;display:flex}._1Fxyxa_questionFooter span{flex:1}._1Fxyxa_questionFooter button{min-height:28px;color:var(--dsw-alias-label-secondary,#606875);cursor:pointer;background:0 0;border:0;border-radius:7px;padding:0 9px;font-size:10px}._1Fxyxa_questionFooter button:last-child{color:#fff;background:#3478f6}._1Fxyxa_questionFooter button:disabled{cursor:default;opacity:.45}._1Fxyxa_richAnswer{min-width:0}._1Fxyxa_richFigure{background:var(--dsw-specific-bubble,#f5f6f8);border:1px solid var(--dsw-alias-border-l1,#e4e7ec);border-radius:9px;margin:10px 0;overflow:hidden}._1Fxyxa_richSvg{width:100%;height:auto;display:block}._1Fxyxa_richHtml{border:0;width:100%;min-height:240px;display:block}._1Fxyxa_settingsPage{width:min(760px,100%);color:var(--dsw-alias-label-primary,#20232a);flex-direction:column;gap:14px;padding-bottom:32px;display:flex}._1Fxyxa_settingsHero{background:linear-gradient(130deg, color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 82%, #3478f6), var(--dsw-alias-bg-layer-1,#fff) 72%);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#e4e7ec) 72%, #8eb4ff);border-radius:14px;align-items:center;gap:13px;padding:17px;display:flex}._1Fxyxa_settingsWhale{width:42px;height:42px;font-size:21px}._1Fxyxa_settingsHero h2,._1Fxyxa_settingsHero p,._1Fxyxa_settingsGroup h3{margin:0}._1Fxyxa_settingsHero h2{font-size:17px}._1Fxyxa_settingsHero p{color:var(--dsw-alias-label-secondary,#606875);margin-top:3px;font-size:11px}._1Fxyxa_settingsGroup{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l1,#e4e7ec);border-radius:13px;flex-direction:column;gap:8px;padding:15px;display:flex}._1Fxyxa_settingsGroup h3{margin-bottom:3px;font-size:13px}._1Fxyxa_settingChoice,._1Fxyxa_settingToggle{cursor:pointer;border:1px solid var(--dsw-alias-border-l1,#e4e7ec);border-radius:10px;align-items:center;gap:10px;padding:10px;display:flex}._1Fxyxa_settingChoice[data-selected]{background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 82%, #3478f6);border-color:color-mix(in srgb, var(--dsw-alias-border-l1,#e4e7ec) 48%, #3478f6)}._1Fxyxa_settingChoice>span,._1Fxyxa_settingToggle>span{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}._1Fxyxa_settingChoice strong,._1Fxyxa_settingToggle strong,._1Fxyxa_widthSetting strong{font-size:12px}._1Fxyxa_settingChoice small,._1Fxyxa_settingToggle small{color:var(--dsw-alias-label-secondary,#606875);font-size:10px;line-height:16px}._1Fxyxa_settingChoice input,._1Fxyxa_settingToggle input{accent-color:var(--citeciter-accent,#3478f6)}._1Fxyxa_settingToggle>input{width:17px;height:17px}._1Fxyxa_widthSetting{flex-direction:column;gap:8px;padding:5px 2px 9px;display:flex}._1Fxyxa_widthSetting>span{justify-content:space-between;display:flex}._1Fxyxa_widthSetting output{color:#245fd1;font-size:11px;font-weight:650}._1Fxyxa_widthSetting input{accent-color:#3478f6;width:100%}._1Fxyxa_dockPreview{height:72px;color:var(--dsw-alias-label-tertiary,#858c98);background:var(--dsw-alias-bg-base,#fff);border:1px solid var(--dsw-alias-border-l1,#e4e7ec);border-radius:9px;font-size:9px;display:flex;overflow:hidden}._1Fxyxa_previewSidebar{background:var(--dsw-specific-sidebar-fill,#f5f6f8);border-right:1px solid var(--dsw-alias-border-l1,#e4e7ec);width:16%}._1Fxyxa_previewCoding,._1Fxyxa_previewDock{place-items:center;min-width:0;display:grid}._1Fxyxa_previewCoding{flex:1}._1Fxyxa_previewDock{color:#245fd1;background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 82%, #3478f6);border-left:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#e4e7ec) 58%, #3478f6);max-width:55%}._1Fxyxa_settingsSaveStatus{min-height:18px;color:var(--dsw-alias-label-tertiary,#858c98);align-self:flex-end;margin:-7px 4px;font-size:10px}._1Fxyxa_settingsSaveStatus[data-status=error]{color:var(--dsw-alias-state-error-primary,#c93f3f)}@media (width<=720px){._1Fxyxa_dock{grid-template-columns:128px minmax(0,1fr);min-width:100%}._1Fxyxa_brand{padding:0 8px}._1Fxyxa_mascotStatus,._1Fxyxa_topicToolbar form{display:none}._1Fxyxa_topicLauncher{width:78px;height:78px}._1Fxyxa_topicLauncher img{width:68px;height:68px}._1Fxyxa_closeButton{left:6px}}@media (prefers-reduced-motion:reduce){._1Fxyxa_topicStatus[data-running]{animation:none}._1Fxyxa_topicLauncher:hover{transform:none}}";
|
|
5487
|
+
const css = "[data-citeciter-docked]{grid-template-columns:var(--citeciter-sidebar-width) minmax(0, 1fr) var(--citeciter-dock-width)!important}[data-citeciter-docked]>[data-side=details]{display:none!important}[data-citeciter-docked]>:has(+[data-shell-overlay]){visibility:hidden!important}._1Fxyxa_selectionPopover{z-index:9999;box-sizing:border-box;width:min(378px,100vw - 24px);color:var(--dsw-alias-label-primary,#20232a);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 96%, #fff);border:1px solid var(--dsw-alias-border-l2,#d9dde5);pointer-events:auto;border-radius:14px;padding:10px;position:fixed;box-shadow:0 16px 44px #191f2c33,0 2px 8px #191f2c14}._1Fxyxa_popoverQuote{color:var(--dsw-alias-label-secondary,#5c6472);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}._1Fxyxa_popoverQuote:before{vertical-align:1px;content:\"\";background:#3478f6;border-radius:999px;width:6px;height:6px;margin-right:7px;display:inline-block}._1Fxyxa_popoverComposer{grid-template-columns:minmax(0,1fr) auto;gap:7px;margin-top:8px;display:grid}._1Fxyxa_popoverComposer input,._1Fxyxa_topicToolbar input,._1Fxyxa_topicToolbar select,._1Fxyxa_composer textarea{box-sizing:border-box;min-width:0;color:var(--dsw-alias-label-primary,#20232a);background:var(--dsw-alias-bg-base,#fff);border:1px solid var(--dsw-alias-border-l1,#dfe3ea);outline:none}._1Fxyxa_popoverComposer input{height:36px;font:inherit;border-radius:9px;padding:0 11px;font-size:13px}._1Fxyxa_popoverComposer button,._1Fxyxa_sendButton{color:#fff;cursor:pointer;background:linear-gradient(135deg,#3478f6,#245fd1);border:0;border-radius:9px;padding:0 14px;font-weight:650;box-shadow:0 4px 12px #3478f638}._1Fxyxa_popoverComposer button:disabled,._1Fxyxa_sendButton:disabled{cursor:default;filter:grayscale(.45);opacity:.52;box-shadow:none}._1Fxyxa_popoverComposer input:focus,._1Fxyxa_topicToolbar input:focus,._1Fxyxa_topicToolbar select:focus,._1Fxyxa_composer textarea:focus{border-color:#3478f6;box-shadow:0 0 0 3px #3478f621}._1Fxyxa_popoverMode{color:var(--dsw-alias-label-tertiary,#858c98);margin-top:8px;font-size:11px}._1Fxyxa_popoverMode summary{cursor:pointer;user-select:none}._1Fxyxa_popoverMode select{width:100%;height:30px;color:var(--dsw-alias-label-secondary,#535b68);background:var(--dsw-specific-bubble,#f5f7fa);border:1px solid var(--dsw-alias-border-l1,#dfe3ea);border-radius:7px;margin-top:6px;padding:0 7px}._1Fxyxa_topicLauncher{z-index:200;color:#fff;cursor:pointer;background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 90%, #dceaff);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l2,#d9dde5) 65%, #3478f6);pointer-events:auto;border-radius:999px;align-items:center;width:112px;height:112px;padding:5px;display:flex;position:fixed;bottom:76px;right:22px;box-shadow:0 10px 28px #245fd13d}._1Fxyxa_topicLauncher img{object-fit:contain;width:100px;height:100px;display:block}._1Fxyxa_launcherCount{border:2px solid var(--dsw-alias-bg-base,#fff);background:#245fd1;border-radius:999px;place-items:center;min-width:24px;height:24px;padding:0 5px;font-size:11px;line-height:1;display:grid;position:absolute;top:-4px;right:-4px}._1Fxyxa_topicLauncher:hover{transform:translateY(-1px)}._1Fxyxa_dock{--citeciter-accent:#3478f6;z-index:1;box-sizing:border-box;width:clamp(360px, var(--citeciter-panel-width), calc(100vw - 24px));min-width:360px;color:var(--dsw-alias-label-primary,#20232a);background:var(--dsw-alias-bg-base,#fff);border-left:1px solid var(--dsw-alias-border-l2,#d9dde5);pointer-events:auto;grid-template-columns:clamp(138px,24%,210px) minmax(0,1fr);display:grid;position:absolute;top:0;bottom:0;right:0;overflow:visible;box-shadow:-12px 0 32px #1a1f2c14}._1Fxyxa_resizeHandle{z-index:3;cursor:col-resize;touch-action:none;width:10px;position:absolute;top:0;bottom:0;left:-5px}._1Fxyxa_resizeHandle:after{content:\"\";background:var(--dsw-alias-border-l2,#d9dde5);border-radius:999px;width:3px;height:42px;transition:background .12s,width .12s;position:absolute;top:50%;left:3px;transform:translateY(-50%)}._1Fxyxa_resizeHandle:hover:after,._1Fxyxa_resizeHandle:focus-visible:after{background:var(--citeciter-accent);width:4px}._1Fxyxa_citationWaterline{z-index:199;pointer-events:none;opacity:0;width:100vw;height:100vh;transition:opacity .16s;position:fixed;inset:0;overflow:visible}._1Fxyxa_citationWaterline[data-visible]{opacity:.48}._1Fxyxa_citationWaterline path{fill:none;stroke:color-mix(in srgb, var(--citeciter-accent) 72%, #73d9ff);stroke-width:1.5px;stroke-linecap:round;stroke-dasharray:3 7}._1Fxyxa_topicRail{background:color-mix(in srgb, var(--dsw-specific-sidebar-fill,#f7f8fa) 94%, #edf5ff);border-right:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}._1Fxyxa_brand{border-bottom:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex:none;align-items:center;gap:9px;min-height:65px;padding:0 13px;display:flex}._1Fxyxa_mascotStatus,._1Fxyxa_settingsWhale{background:linear-gradient(145deg, color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 90%, #3478f6), color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 72%, #3478f6));border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#dfe3ea) 64%, #3478f6);width:32px;height:32px;box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 72%, transparent);border-radius:10px;flex:none;place-items:center;display:grid;overflow:hidden}._1Fxyxa_mascotStatus img,._1Fxyxa_settingsWhale img{object-fit:contain;width:100%;height:100%}._1Fxyxa_mascotStatus{position:relative;overflow:visible}._1Fxyxa_mascotStatus img{transition:transform .18s}._1Fxyxa_mascotStatus>span{pointer-events:none;position:absolute}._1Fxyxa_mascotStatus[data-state=diving] img{transform:translateY(9px)}._1Fxyxa_mascotStatus[data-state=diving]>span,._1Fxyxa_mascotStatus[data-state=surfaced]>span{border-top:2px solid #44aef4;border-radius:50%;height:6px;bottom:3px;left:1px;right:1px;box-shadow:0 -3px 0 -2px #7fd9ff}._1Fxyxa_mascotStatus[data-state=reading]>span{border:2px solid #245fd1;border-radius:50%;width:9px;height:9px;top:4px;right:2px}._1Fxyxa_mascotStatus[data-state=reading]>span:after{content:\"\";background:#245fd1;border-radius:2px;width:6px;height:2px;position:absolute;bottom:-3px;right:-5px;transform:rotate(48deg)}._1Fxyxa_mascotStatus[data-state=answering]>span{color:#245fd1;content:\"\";background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid #8eb4ff;border-radius:7px;place-items:center;width:15px;height:13px;display:grid;top:-4px;right:-5px}._1Fxyxa_mascotStatus[data-state=answering]>span:before{content:\"“\";font-size:12px;line-height:1}._1Fxyxa_brand div{flex-direction:column;min-width:0;display:flex}._1Fxyxa_brand strong{text-overflow:ellipsis;font-size:14px;overflow:hidden}._1Fxyxa_brand>div>span{color:var(--dsw-alias-label-tertiary,#858c98);font-size:10px}._1Fxyxa_railCaption,._1Fxyxa_railFoot{color:var(--dsw-alias-label-tertiary,#858c98);flex:none;justify-content:space-between;align-items:center;gap:6px;padding:10px 11px 7px;font-size:10px;display:flex}._1Fxyxa_railCaption button,._1Fxyxa_topicToolbar button,._1Fxyxa_composerActions button:not(._1Fxyxa_sendButton){color:var(--dsw-alias-label-secondary,#58606d);cursor:pointer;background:0 0;border:0;border-radius:6px}._1Fxyxa_railCaption button:hover,._1Fxyxa_topicToolbar button:hover,._1Fxyxa_composerActions button:not(._1Fxyxa_sendButton):hover,._1Fxyxa_closeButton:hover{background:var(--dsw-alias-interactive-bg-hover,#0000000f)}._1Fxyxa_topicList{flex-direction:column;flex:1;gap:4px;min-height:0;padding:0 7px;display:flex;overflow-y:auto}._1Fxyxa_topicItem{width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:9px;grid-template-columns:7px minmax(0,1fr);align-items:start;gap:7px;padding:9px 8px;display:grid}._1Fxyxa_topicItem:hover{background:var(--dsw-alias-interactive-bg-hover,#0000000b)}._1Fxyxa_topicItem[data-active]{background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 88%, #eaf3ff);border-color:color-mix(in srgb, var(--dsw-alias-border-l1,#dde1e8) 72%, #7ca8ff);box-shadow:0 2px 7px #1c222f0d}._1Fxyxa_topicItem[data-archived]{opacity:.58}._1Fxyxa_topicStatus{background:#99a1ae;border-radius:999px;width:6px;height:6px;margin-top:5px}._1Fxyxa_topicStatus[data-running]{background:var(--citeciter-accent);animation:1.2s ease-in-out infinite _1Fxyxa_citeciterPulse;box-shadow:0 0 0 3px #3478f629}@keyframes _1Fxyxa_citeciterPulse{50%{opacity:.42}}._1Fxyxa_topicCopy{flex-direction:column;gap:3px;min-width:0;display:flex}._1Fxyxa_topicCopy strong,._1Fxyxa_topicCopy small{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._1Fxyxa_topicCopy strong{font-size:12px;font-weight:590}._1Fxyxa_topicCopy strong[data-pending]{color:var(--dsw-alias-label-secondary,#606875);font-style:italic}._1Fxyxa_topicCopy small{color:var(--dsw-alias-label-tertiary,#858c98);font-size:10px}._1Fxyxa_railEmpty{color:var(--dsw-alias-label-tertiary,#858c98);margin:9px 6px;font-size:11px;line-height:17px}._1Fxyxa_railError{color:var(--dsw-alias-state-error-primary,#c93f3f);overflow-wrap:anywhere;margin:9px 6px;font-size:10px;line-height:15px}._1Fxyxa_railFoot{border-top:1px solid var(--dsw-alias-border-l1,#e4e7ec);padding-top:8px;padding-bottom:9px}._1Fxyxa_learningWorkspace{background:var(--dsw-alias-bg-base,#fff);flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}._1Fxyxa_dockHeader{border-bottom:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex:none;justify-content:space-between;align-items:center;gap:12px;min-height:64px;padding:0 15px;display:flex}._1Fxyxa_dockHeading{grid-template-columns:auto minmax(0,1fr);align-items:center;gap:2px 7px;min-width:0;display:grid}._1Fxyxa_dockHeading strong{text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}._1Fxyxa_dockHeading>span:last-child{color:var(--dsw-alias-label-tertiary,#858c98);grid-column:1/-1;font-size:10px}._1Fxyxa_modeBadge{color:color-mix(in srgb, var(--dsw-alias-label-primary,#20232a) 36%, #3478f6);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 84%, #3478f6);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#dfe3ea) 64%, #3478f6);letter-spacing:.02em;white-space:nowrap;border-radius:999px;padding:2px 6px;font-size:9px;font-weight:700}._1Fxyxa_closeButton{z-index:5;color:#3478f6;cursor:pointer;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#d9dde5);border-radius:999px;flex:none;place-items:center;width:30px;height:30px;padding:0;display:grid;position:absolute;top:50%;left:6px;transform:translateY(-50%);box-shadow:0 4px 14px #1d222f24}._1Fxyxa_closeButton img{width:18px;height:18px}._1Fxyxa_emptyState{box-sizing:border-box;text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;padding:34px 24px;display:flex}._1Fxyxa_emptyWhale{background:radial-gradient(circle at 32% 25%,#fff,#dceaff);border:1px solid #c9dcff;border-radius:22px;place-items:center;width:68px;height:68px;margin-bottom:13px;display:grid;overflow:hidden;box-shadow:0 14px 35px #245fd124}._1Fxyxa_emptyWhale img{object-fit:contain;width:100%;height:100%}._1Fxyxa_emptyState h2{margin:0;font-size:17px}._1Fxyxa_emptyState>p{max-width:430px;color:var(--dsw-alias-label-secondary,#606875);margin:9px 0 0;font-size:12px;line-height:20px}._1Fxyxa_contextBar{background:color-mix(in srgb, var(--dsw-specific-bubble,#f6f7f9) 90%, #edf5ff);border-bottom:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex:none;padding:10px 14px}._1Fxyxa_contextBar blockquote{max-height:57px;color:var(--dsw-alias-label-secondary,#59616e);border-left:3px solid var(--citeciter-accent);margin:0;padding-left:9px;font-size:11px;line-height:18px;overflow:auto}._1Fxyxa_contextMeta{color:var(--dsw-alias-label-tertiary,#858c98);gap:9px;margin-top:6px;font-size:9px;display:flex}._1Fxyxa_contextMeta span:first-child:before{content:\"\";vertical-align:1px;background:#b3bac5;border-radius:999px;width:5px;height:5px;margin-right:4px;display:inline-block}._1Fxyxa_contextMeta span[data-ok]:before{background:#27a96b}._1Fxyxa_topicToolbar{border-bottom:1px solid var(--dsw-alias-border-l1,#e4e7ec);flex:none;align-items:center;gap:6px;padding:7px 11px;display:flex;overflow-x:auto}._1Fxyxa_topicToolbar form{flex:180px;min-width:130px;display:flex}._1Fxyxa_topicToolbar input,._1Fxyxa_topicToolbar select{border-radius:7px;height:30px;padding:0 7px;font-size:10px}._1Fxyxa_topicToolbar input{flex:1}._1Fxyxa_topicToolbar form button,._1Fxyxa_topicToolbar>button{white-space:nowrap;flex:none;padding:5px 7px;font-size:10px}._1Fxyxa_archiveButton{align-items:center;gap:3px;display:inline-flex}._1Fxyxa_topicToolbar button:disabled,._1Fxyxa_nextQuestions button:disabled{cursor:default;opacity:.42}._1Fxyxa_transcript{flex-direction:column;flex:1;gap:14px;min-height:0;padding:17px clamp(12px,4%,28px) 24px;display:flex;overflow:hidden auto}._1Fxyxa_assistantTurn,._1Fxyxa_userTurn,._1Fxyxa_errorTurn{overflow-wrap:anywhere;min-width:0;font-size:13px;line-height:21px}._1Fxyxa_assistantTurn{border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#e4e7ec) 72%, transparent);padding-bottom:14px}._1Fxyxa_userTurn{background:var(--dsw-specific-bubble,#f1f3f7);border-radius:12px 12px 3px;align-self:flex-end;max-width:86%;padding:8px 11px}._1Fxyxa_errorTurn,._1Fxyxa_panelError{color:var(--dsw-alias-state-error-primary,#c93f3f);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 88%, #f45555);border:1px solid #c93f3f33;border-radius:8px}._1Fxyxa_errorTurn{padding:8px 10px}._1Fxyxa_errorTurn[data-status=stopped]{color:var(--dsw-alias-label-secondary,#606875);background:var(--dsw-specific-bubble,#f5f6f8);border-color:var(--dsw-alias-border-l1,#e4e7ec)}._1Fxyxa_errorMeta{color:var(--dsw-alias-label-tertiary,#858c98);flex-wrap:wrap;gap:5px 10px;font-size:9px;display:flex}._1Fxyxa_errorTurn details{margin-top:6px}._1Fxyxa_errorTurn pre{white-space:pre-wrap;max-height:160px;overflow:auto}._1Fxyxa_assistantTurn p,._1Fxyxa_userTurn p,._1Fxyxa_errorTurn p{margin-top:0;margin-bottom:8px}._1Fxyxa_turnRole{color:var(--dsw-alias-label-tertiary,#858c98);margin-bottom:5px;font-size:10px;font-weight:650}._1Fxyxa_flowDisclosure{min-width:0;color:var(--dsw-alias-label-secondary,#606875);font-size:12px}._1Fxyxa_flowRow,._1Fxyxa_flowRowRunning{align-items:center;min-width:0;height:26px;display:flex;position:relative;overflow:hidden}._1Fxyxa_flowRowRunning:after{content:\"\";pointer-events:none;background:linear-gradient(90deg,#0000 20%,#ffffff94 48%,#0000 76%);animation:1.7s linear infinite _1Fxyxa_citeciterSweep;position:absolute;inset:0;transform:translate(-100%)}@keyframes _1Fxyxa_citeciterSweep{to{transform:translate(100%)}}._1Fxyxa_flowDot{color:var(--dsw-alias-label-tertiary,#858c98);flex:none;margin:0 6px}._1Fxyxa_flowSummary{min-width:0;color:var(--dsw-alias-label-tertiary,#78808e);white-space:nowrap;overflow-x:hidden}._1Fxyxa_flowBody{max-height:320px;color:var(--dsw-alias-label-secondary,#606875);background:var(--dsw-specific-bubble,#f5f6f8);font:inherit;white-space:pre-wrap;border-radius:7px;margin:5px 0 5px 22px;padding:7px 9px;font-size:11px;line-height:18px;overflow:auto}._1Fxyxa_toolPreview{background:var(--dsw-specific-bubble,#f5f6f8);border-radius:7px;gap:5px;max-height:360px;margin:5px 0 5px 22px;padding:8px;display:grid;overflow:auto}._1Fxyxa_toolPreview>strong{color:var(--dsw-alias-label-tertiary,#858c98);text-transform:uppercase;font-size:9px}._1Fxyxa_toolPreview pre{overflow-wrap:anywhere;white-space:pre-wrap;margin:0;font:10px/17px ui-monospace,SFMono-Regular,Menlo,monospace}._1Fxyxa_loadingCard{color:var(--dsw-alias-label-secondary,#606875);background:color-mix(in srgb, var(--dsw-specific-bubble,#f5f6f8) 82%, #3478f6);border-radius:9px;align-self:flex-start;padding:8px 10px;font-size:11px}._1Fxyxa_panelError{overflow-wrap:anywhere;margin:0;padding:8px 10px;font-size:11px;line-height:17px}._1Fxyxa_composer{background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1,#fff));border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l2,#d9dde5));box-shadow:var(--dsw-shadow-lv2,0 5px 18px #1d222f14);border-radius:22px;flex:none;margin:0 12px 12px;padding:10px 8px 6px}._1Fxyxa_composer textarea{resize:none;width:100%;min-height:50px;max-height:150px;font:inherit;border:0;padding:4px 12px 0 16px;font-size:14px;line-height:22px;display:block}._1Fxyxa_composer textarea:focus{box-shadow:none}._1Fxyxa_composerActions{align-items:center;gap:6px;margin-top:4px;padding:2px 0 0 8px;display:flex}._1Fxyxa_composerActions span{color:var(--dsw-alias-label-tertiary,#858c98);margin-right:auto;font-size:9px}._1Fxyxa_composerActions ._1Fxyxa_sendButton{border-radius:999px;place-items:center;width:34px;height:34px;min-height:34px;padding:0;display:grid;transform:translateY(-2px)}._1Fxyxa_nextQuestions{flex-wrap:wrap;gap:6px;margin-top:10px;display:flex}._1Fxyxa_nextQuestions button{color:color-mix(in srgb, var(--dsw-alias-label-primary,#20232a) 46%, #3478f6);text-align:left;cursor:pointer;background:color-mix(in srgb, var(--dsw-specific-bubble,#f5f6f8) 86%, #3478f6);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#dfe3ea) 70%, #3478f6);border-radius:999px;padding:6px 9px;font-size:10px}._1Fxyxa_questionFrame{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#d9dde5);border-radius:14px;flex:none;margin:0 12px 12px;padding:12px;box-shadow:0 6px 20px #1d222f1a}._1Fxyxa_questionHeader{color:var(--dsw-alias-label-secondary,#606875);grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:8px;display:grid}._1Fxyxa_questionHeader>div{flex-direction:column;gap:2px;min-width:0;display:flex}._1Fxyxa_questionHeader span{color:var(--dsw-alias-label-tertiary,#858c98);font-size:9px}._1Fxyxa_questionHeader strong{color:var(--dsw-alias-label-primary,#20232a);font-size:12px;line-height:18px}._1Fxyxa_questionOptions{gap:6px;margin-top:10px;display:grid}._1Fxyxa_questionOptions>button{color:inherit;text-align:left;cursor:pointer;background:var(--dsw-specific-bubble,#f5f6f8);border:1px solid #0000;border-radius:8px;grid-template-columns:20px minmax(0,1fr);align-items:start;gap:6px;padding:8px;display:grid}._1Fxyxa_questionOptions>button[data-selected]{background:color-mix(in srgb, var(--dsw-specific-bubble,#f5f6f8) 82%, #3478f6);border-color:color-mix(in srgb, var(--dsw-alias-border-l1,#dfe3ea) 54%, #3478f6)}._1Fxyxa_questionOptions>button>span:first-child{color:#245fd1;background:var(--dsw-alias-bg-base,#fff);border:1px solid var(--dsw-alias-border-l2,#d9dde5);border-radius:5px;place-items:center;width:18px;height:18px;font-size:9px;display:grid}._1Fxyxa_questionOptions>button>span:last-child{flex-direction:column;min-width:0;display:flex}._1Fxyxa_questionOptions strong{font-size:11px}._1Fxyxa_questionOptions small{color:var(--dsw-alias-label-tertiary,#858c98);margin-top:2px;font-size:9px;line-height:14px}._1Fxyxa_questionCustom{box-sizing:border-box;resize:vertical;width:100%;color:inherit;background:var(--dsw-alias-bg-base,#fff);border:1px solid var(--dsw-alias-border-l1,#dfe3ea);font:inherit;border-radius:8px;outline:0;margin-top:8px;padding:7px 8px;font-size:10px}._1Fxyxa_questionCustom:focus{border-color:#3478f6;box-shadow:0 0 0 3px #3478f61f}._1Fxyxa_questionFooter{align-items:center;gap:6px;margin-top:9px;display:flex}._1Fxyxa_questionFooter span{flex:1}._1Fxyxa_questionFooter button{min-height:28px;color:var(--dsw-alias-label-secondary,#606875);cursor:pointer;background:0 0;border:0;border-radius:7px;padding:0 9px;font-size:10px}._1Fxyxa_questionFooter button:last-child{color:#fff;background:#3478f6}._1Fxyxa_questionFooter button:disabled{cursor:default;opacity:.45}._1Fxyxa_richAnswer{min-width:0}._1Fxyxa_richFigure{background:var(--dsw-specific-bubble,#f5f6f8);border:1px solid var(--dsw-alias-border-l1,#e4e7ec);border-radius:9px;margin:10px 0;overflow:hidden}._1Fxyxa_richSvg{width:100%;height:auto;display:block}._1Fxyxa_richHtml{border:0;width:100%;min-height:240px;display:block}._1Fxyxa_settingsPage{width:min(760px,100%);color:var(--dsw-alias-label-primary,#20232a);flex-direction:column;gap:14px;padding-bottom:32px;display:flex}._1Fxyxa_settingsHero{background:linear-gradient(130deg, color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 82%, #3478f6), var(--dsw-alias-bg-layer-1,#fff) 72%);border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#e4e7ec) 72%, #8eb4ff);border-radius:14px;align-items:center;gap:13px;padding:17px;display:flex}._1Fxyxa_settingsWhale{width:42px;height:42px;font-size:21px}._1Fxyxa_settingsHero h2,._1Fxyxa_settingsHero p,._1Fxyxa_settingsGroup h3{margin:0}._1Fxyxa_settingsHero h2{font-size:17px}._1Fxyxa_settingsHero p{color:var(--dsw-alias-label-secondary,#606875);margin-top:3px;font-size:11px}._1Fxyxa_settingsGroup{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l1,#e4e7ec);border-radius:13px;flex-direction:column;gap:8px;padding:15px;display:flex}._1Fxyxa_settingsGroup h3{margin-bottom:3px;font-size:13px}._1Fxyxa_settingChoice,._1Fxyxa_settingToggle{cursor:pointer;border:1px solid var(--dsw-alias-border-l1,#e4e7ec);border-radius:10px;align-items:center;gap:10px;padding:10px;display:flex}._1Fxyxa_settingChoice[data-selected]{background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 82%, #3478f6);border-color:color-mix(in srgb, var(--dsw-alias-border-l1,#e4e7ec) 48%, #3478f6)}._1Fxyxa_settingChoice>span,._1Fxyxa_settingToggle>span{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}._1Fxyxa_settingChoice strong,._1Fxyxa_settingToggle strong,._1Fxyxa_widthSetting strong{font-size:12px}._1Fxyxa_settingChoice small,._1Fxyxa_settingToggle small{color:var(--dsw-alias-label-secondary,#606875);font-size:10px;line-height:16px}._1Fxyxa_settingChoice input,._1Fxyxa_settingToggle input{accent-color:var(--citeciter-accent,#3478f6)}._1Fxyxa_settingToggle>input{width:17px;height:17px}._1Fxyxa_settingsDocumentAction{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}._1Fxyxa_settingsDocumentButton{min-height:32px;color:var(--dsw-alias-label-primary,#20232a);background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l1,#e4e7ec);font:inherit;border-radius:8px;align-items:center;gap:7px;padding:0 11px;font-size:12px;display:inline-flex}._1Fxyxa_settingsDocumentButton:focus-visible{outline:2px solid var(--dsw-alias-state-focus,#356ae6);outline-offset:2px}._1Fxyxa_settingsDocumentButton:disabled{cursor:not-allowed;opacity:.55}._1Fxyxa_settingsDocumentStatus{min-width:0;color:var(--dsw-alias-label-secondary,#606875);overflow-wrap:anywhere;margin:0;font-size:11px;line-height:16px}._1Fxyxa_settingsDocumentStatus[data-status=success]{color:var(--dsw-alias-state-success-primary,#21845b)}._1Fxyxa_settingsDocumentStatus[data-status=error]{color:var(--dsw-alias-state-error-primary,#c93f3f)}._1Fxyxa_widthSetting{flex-direction:column;gap:8px;padding:5px 2px 9px;display:flex}._1Fxyxa_widthSetting>span{justify-content:space-between;display:flex}._1Fxyxa_widthSetting output{color:#245fd1;font-size:11px;font-weight:650}._1Fxyxa_widthSetting input{accent-color:#3478f6;width:100%}._1Fxyxa_dockPreview{height:72px;color:var(--dsw-alias-label-tertiary,#858c98);background:var(--dsw-alias-bg-base,#fff);border:1px solid var(--dsw-alias-border-l1,#e4e7ec);border-radius:9px;font-size:9px;display:flex;overflow:hidden}._1Fxyxa_previewSidebar{background:var(--dsw-specific-sidebar-fill,#f5f6f8);border-right:1px solid var(--dsw-alias-border-l1,#e4e7ec);width:16%}._1Fxyxa_previewCoding,._1Fxyxa_previewDock{place-items:center;min-width:0;display:grid}._1Fxyxa_previewCoding{flex:1}._1Fxyxa_previewDock{color:#245fd1;background:color-mix(in srgb, var(--dsw-alias-bg-layer-1,#fff) 82%, #3478f6);border-left:1px solid color-mix(in srgb, var(--dsw-alias-border-l1,#e4e7ec) 58%, #3478f6);max-width:55%}._1Fxyxa_settingsSaveStatus{min-height:18px;color:var(--dsw-alias-label-tertiary,#858c98);align-self:flex-end;margin:-7px 4px;font-size:10px}._1Fxyxa_settingsSaveStatus[data-status=error]{color:var(--dsw-alias-state-error-primary,#c93f3f)}@media (width<=720px){._1Fxyxa_dock{grid-template-columns:128px minmax(0,1fr);min-width:100%}._1Fxyxa_brand{padding:0 8px}._1Fxyxa_mascotStatus,._1Fxyxa_topicToolbar form{display:none}._1Fxyxa_topicLauncher{width:78px;height:78px}._1Fxyxa_topicLauncher img{width:68px;height:68px}._1Fxyxa_closeButton{left:6px}}@media (prefers-reduced-motion:reduce){._1Fxyxa_topicStatus[data-running]{animation:none}._1Fxyxa_topicLauncher:hover{transform:none}}";
|
|
5172
5488
|
const tagId = "@kirkchinese/dsh-citeciter/CiteCiter.module.css";
|
|
5173
5489
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
5174
5490
|
const tag = document.createElement("style");
|
|
@@ -5233,6 +5549,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5233
5549
|
"selectionPopover": "_1Fxyxa_selectionPopover",
|
|
5234
5550
|
"sendButton": "_1Fxyxa_sendButton",
|
|
5235
5551
|
"settingChoice": "_1Fxyxa_settingChoice",
|
|
5552
|
+
"settingsDocumentAction": "_1Fxyxa_settingsDocumentAction",
|
|
5553
|
+
"settingsDocumentButton": "_1Fxyxa_settingsDocumentButton",
|
|
5554
|
+
"settingsDocumentStatus": "_1Fxyxa_settingsDocumentStatus",
|
|
5236
5555
|
"settingsGroup": "_1Fxyxa_settingsGroup",
|
|
5237
5556
|
"settingsHero": "_1Fxyxa_settingsHero",
|
|
5238
5557
|
"settingsPage": "_1Fxyxa_settingsPage",
|
|
@@ -5535,7 +5854,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5535
5854
|
const [visible, setVisible] = (0, react.useState)(false);
|
|
5536
5855
|
(0, react.useEffect)(() => {
|
|
5537
5856
|
if (anchorKey === void 0) return;
|
|
5538
|
-
const source =
|
|
5857
|
+
const source = findDshAssistantAnchor(anchorKey);
|
|
5539
5858
|
const destination = target.current;
|
|
5540
5859
|
if (source === null || destination === null) return;
|
|
5541
5860
|
const update = () => {
|
|
@@ -5727,11 +6046,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5727
6046
|
});
|
|
5728
6047
|
}
|
|
5729
6048
|
function AssistantTurn({ message, first, disabled, companion, reportParseError }) {
|
|
5730
|
-
const parsed = (0, react.useMemo)(() =>
|
|
5731
|
-
text: message.text,
|
|
5732
|
-
questions: [],
|
|
5733
|
-
invalid: false
|
|
5734
|
-
}, [first, message.text]);
|
|
6049
|
+
const parsed = (0, react.useMemo)(() => parseNextQuestions(message.text, message.streaming), [message.streaming, message.text]);
|
|
5735
6050
|
(0, react.useEffect)(() => {
|
|
5736
6051
|
if (parsed.invalid && !message.streaming) reportParseError(message.id);
|
|
5737
6052
|
}, [
|
|
@@ -5755,7 +6070,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5755
6070
|
text: parsed.text,
|
|
5756
6071
|
streaming: message.streaming
|
|
5757
6072
|
}),
|
|
5758
|
-
!message.streaming && parsed.questions.length === 3 && (0, react_jsx_runtime.jsx)("div", {
|
|
6073
|
+
first && !message.streaming && parsed.questions.length === 3 && (0, react_jsx_runtime.jsx)("div", {
|
|
5759
6074
|
className: CiteCiter_module_css_default.nextQuestions,
|
|
5760
6075
|
"aria-label": "接下来可能想问",
|
|
5761
6076
|
children: parsed.questions.map((question) => (0, react_jsx_runtime.jsx)("button", {
|
|
@@ -5770,37 +6085,54 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5770
6085
|
]
|
|
5771
6086
|
});
|
|
5772
6087
|
}
|
|
5773
|
-
|
|
5774
|
-
|
|
6088
|
+
function findContainingFrame(panel) {
|
|
6089
|
+
const frame = panel?.closest("[data-shell-overlay]")?.parentElement;
|
|
6090
|
+
return frame instanceof HTMLElement ? frame : null;
|
|
6091
|
+
}
|
|
6092
|
+
/** Temporarily reserve an AppFrame column until DSH exposes a public right-dock contribution point. */
|
|
6093
|
+
function useDockColumn(panel, open, widthPercent) {
|
|
5775
6094
|
const [width, setWidth] = (0, react.useState)(0);
|
|
5776
|
-
const [docked, setDocked] = (0, react.useState)(
|
|
6095
|
+
const [docked, setDocked] = (0, react.useState)(false);
|
|
5777
6096
|
(0, react.useEffect)(() => {
|
|
5778
6097
|
if (!open) return;
|
|
5779
|
-
const frame =
|
|
5780
|
-
if (
|
|
6098
|
+
const frame = findContainingFrame(panel.current);
|
|
6099
|
+
if (frame === null) {
|
|
6100
|
+
setWidth(Math.min(window.innerWidth, 720));
|
|
6101
|
+
setDocked(false);
|
|
6102
|
+
return;
|
|
6103
|
+
}
|
|
6104
|
+
const owner = crypto.randomUUID();
|
|
5781
6105
|
const setTrack = (name, value) => {
|
|
5782
6106
|
if (frame.style.getPropertyValue(name) !== value) frame.style.setProperty(name, value);
|
|
5783
6107
|
};
|
|
6108
|
+
const clearDock = () => {
|
|
6109
|
+
if (frame.dataset.citeciterDocked !== owner) return;
|
|
6110
|
+
delete frame.dataset.citeciterDocked;
|
|
6111
|
+
frame.style.removeProperty("--citeciter-sidebar-width");
|
|
6112
|
+
frame.style.removeProperty("--citeciter-dock-width");
|
|
6113
|
+
};
|
|
5784
6114
|
const apply = () => {
|
|
6115
|
+
const activeOwner = frame.dataset.citeciterDocked;
|
|
6116
|
+
if (activeOwner !== void 0 && activeOwner !== owner) return;
|
|
5785
6117
|
const frameWidth = frame.getBoundingClientRect().width;
|
|
5786
6118
|
const nativeTrack = /^([\d.]+)px(?:\s|$)/u.exec(frame.style.gridTemplateColumns);
|
|
5787
6119
|
const sidebarWidth = nativeTrack === null ? frame.firstElementChild?.getBoundingClientRect().width ?? 0 : Number(nativeTrack[1]);
|
|
5788
6120
|
const available = frameWidth - sidebarWidth - 480;
|
|
5789
|
-
setTrack("--citeciter-sidebar-width", sidebarWidth + "px");
|
|
5790
6121
|
if (available < 360) {
|
|
5791
|
-
|
|
6122
|
+
clearDock();
|
|
5792
6123
|
setWidth(Math.min(frameWidth, 720));
|
|
5793
6124
|
setDocked(false);
|
|
5794
6125
|
return;
|
|
5795
6126
|
}
|
|
5796
6127
|
const requested = frameWidth * widthPercent / 100;
|
|
5797
6128
|
const panelWidth = Math.max(360, Math.min(requested, available));
|
|
5798
|
-
setTrack("--citeciter-
|
|
6129
|
+
setTrack("--citeciter-sidebar-width", `${sidebarWidth}px`);
|
|
6130
|
+
setTrack("--citeciter-dock-width", `${panelWidth}px`);
|
|
6131
|
+
frame.dataset.citeciterDocked = owner;
|
|
5799
6132
|
setWidth(panelWidth);
|
|
5800
6133
|
setDocked(true);
|
|
5801
6134
|
};
|
|
5802
6135
|
apply();
|
|
5803
|
-
frame.dataset.citeciterDocked = "true";
|
|
5804
6136
|
const resizeObserver = new ResizeObserver(apply);
|
|
5805
6137
|
const styleObserver = new MutationObserver(apply);
|
|
5806
6138
|
resizeObserver.observe(frame);
|
|
@@ -5811,14 +6143,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5811
6143
|
return () => {
|
|
5812
6144
|
resizeObserver.disconnect();
|
|
5813
6145
|
styleObserver.disconnect();
|
|
5814
|
-
|
|
5815
|
-
frame.style.removeProperty("--citeciter-sidebar-width");
|
|
5816
|
-
frame.style.removeProperty("--citeciter-dock-width");
|
|
6146
|
+
clearDock();
|
|
5817
6147
|
};
|
|
5818
|
-
}, [
|
|
6148
|
+
}, [
|
|
6149
|
+
open,
|
|
6150
|
+
panel,
|
|
6151
|
+
widthPercent
|
|
6152
|
+
]);
|
|
5819
6153
|
return [width, docked];
|
|
5820
6154
|
}
|
|
5821
|
-
/** Independent
|
|
6155
|
+
/** Independent learning workspace with a reversible Host-column compatibility adapter. */
|
|
5822
6156
|
function CitePanel({ bus, companion, closePanel, reportParseError }) {
|
|
5823
6157
|
const overlay = (0, react.useSyncExternalStore)(bus.subscribe, bus.getSnapshot);
|
|
5824
6158
|
const snapshot = (0, react.useSyncExternalStore)(companion.subscribe, companion.getSnapshot);
|
|
@@ -5827,10 +6161,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5827
6161
|
const [titleDirty, setTitleDirty] = (0, react.useState)(false);
|
|
5828
6162
|
const [widthPercent, setWidthPercent] = (0, react.useState)(snapshot.settings.panelWidthPercent);
|
|
5829
6163
|
const resizeOrigin = (0, react.useRef)(null);
|
|
6164
|
+
const panelRef = (0, react.useRef)(null);
|
|
5830
6165
|
const titleRef = (0, react.useRef)(null);
|
|
5831
6166
|
const open = overlay.panelOpen;
|
|
5832
|
-
const [panelWidth, docked] = useDockColumn(open, widthPercent);
|
|
6167
|
+
const [panelWidth, docked] = useDockColumn(panelRef, open, widthPercent);
|
|
5833
6168
|
const active = snapshot.active;
|
|
6169
|
+
const canAsk = snapshot.phase === "ready" || snapshot.phase === "stopped" || snapshot.phase === "error";
|
|
5834
6170
|
(0, react.useEffect)(() => companion.setVisible(open), [companion, open]);
|
|
5835
6171
|
(0, react.useEffect)(() => setWidthPercent(snapshot.settings.panelWidthPercent), [snapshot.settings.panelWidthPercent]);
|
|
5836
6172
|
(0, react.useEffect)(() => {
|
|
@@ -5851,7 +6187,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5851
6187
|
if (!open) return null;
|
|
5852
6188
|
const submit = (event) => {
|
|
5853
6189
|
event.preventDefault();
|
|
5854
|
-
if (
|
|
6190
|
+
if (!canAsk) return;
|
|
5855
6191
|
const value = question.trim();
|
|
5856
6192
|
if (value === "") return;
|
|
5857
6193
|
const submitted = question;
|
|
@@ -5870,7 +6206,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5870
6206
|
resizeOrigin.current = {
|
|
5871
6207
|
x: event.clientX,
|
|
5872
6208
|
width: widthPercent,
|
|
5873
|
-
frameWidth:
|
|
6209
|
+
frameWidth: findContainingFrame(panelRef.current)?.getBoundingClientRect().width ?? window.innerWidth
|
|
5874
6210
|
};
|
|
5875
6211
|
};
|
|
5876
6212
|
const moveResize = (event) => {
|
|
@@ -5896,8 +6232,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5896
6232
|
updateWidth(widthPercent + (event.key === "ArrowLeft" ? 1 : -1));
|
|
5897
6233
|
};
|
|
5898
6234
|
return (0, react_jsx_runtime.jsxs)("aside", {
|
|
6235
|
+
ref: panelRef,
|
|
5899
6236
|
className: CiteCiter_module_css_default.dock,
|
|
5900
|
-
style: {
|
|
6237
|
+
style: {
|
|
6238
|
+
width: panelWidth > 0 ? panelWidth : void 0,
|
|
6239
|
+
"--citeciter-panel-width": `${widthPercent}vw`
|
|
6240
|
+
},
|
|
5901
6241
|
"data-citeciter-panel": true,
|
|
5902
6242
|
"data-overlay": docked ? void 0 : true,
|
|
5903
6243
|
"aria-label": "CiteCiter 学习伴侣",
|
|
@@ -6142,7 +6482,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6142
6482
|
return (0, react_jsx_runtime.jsx)(AssistantTurn, {
|
|
6143
6483
|
message,
|
|
6144
6484
|
first: message.id === firstAssistantId,
|
|
6145
|
-
disabled:
|
|
6485
|
+
disabled: !canAsk,
|
|
6146
6486
|
companion,
|
|
6147
6487
|
reportParseError
|
|
6148
6488
|
}, message.id);
|
|
@@ -6177,7 +6517,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6177
6517
|
children: [(0, react_jsx_runtime.jsx)("span", { children: "只读 · 不干预主 Agent" }), (0, react_jsx_runtime.jsx)("button", {
|
|
6178
6518
|
className: CiteCiter_module_css_default.sendButton,
|
|
6179
6519
|
type: snapshot.phase === "running" ? "button" : "submit",
|
|
6180
|
-
disabled: snapshot.phase === "stopping" || snapshot.phase !== "running" && (active === null || question.trim() === ""),
|
|
6520
|
+
disabled: snapshot.phase === "stopping" || snapshot.phase !== "running" && (!canAsk || active === null || question.trim() === ""),
|
|
6181
6521
|
"aria-label": snapshot.phase === "running" ? "停止回答" : snapshot.phase === "stopping" ? "正在停止" : "发送",
|
|
6182
6522
|
onClick: snapshot.phase === "running" ? () => {
|
|
6183
6523
|
companion.stop();
|
|
@@ -6194,11 +6534,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6194
6534
|
//#endregion
|
|
6195
6535
|
//#region lib/types/client/components/CiteCiterSettings.js
|
|
6196
6536
|
/** Native DSH settings page for CiteCiter-owned preferences. */
|
|
6197
|
-
function CiteCiterSettings({ companion }) {
|
|
6537
|
+
function CiteCiterSettings({ companion, settingsDocument }) {
|
|
6198
6538
|
const snapshot = (0, react.useSyncExternalStore)(companion.subscribe, companion.getSnapshot);
|
|
6539
|
+
const documentSnapshot = (0, react.useSyncExternalStore)(settingsDocument.subscribe, settingsDocument.getSnapshot);
|
|
6199
6540
|
const settings = snapshot.settings;
|
|
6200
6541
|
const [widthDraft, setWidthDraft] = (0, react.useState)(settings.panelWidthPercent);
|
|
6201
6542
|
const committedWidth = (0, react.useRef)(settings.panelWidthPercent);
|
|
6543
|
+
(0, react.useEffect)(() => {
|
|
6544
|
+
settingsDocument.load();
|
|
6545
|
+
}, [settingsDocument]);
|
|
6202
6546
|
(0, react.useEffect)(() => {
|
|
6203
6547
|
committedWidth.current = settings.panelWidthPercent;
|
|
6204
6548
|
setWidthDraft(settings.panelWidthPercent);
|
|
@@ -6284,6 +6628,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6284
6628
|
})
|
|
6285
6629
|
]
|
|
6286
6630
|
}),
|
|
6631
|
+
(0, react_jsx_runtime.jsxs)("section", {
|
|
6632
|
+
className: CiteCiter_module_css_default.settingsGroup,
|
|
6633
|
+
children: [(0, react_jsx_runtime.jsx)("h3", { children: "配置文件" }), (0, react_jsx_runtime.jsxs)("div", {
|
|
6634
|
+
className: CiteCiter_module_css_default.settingsDocumentAction,
|
|
6635
|
+
children: [(0, react_jsx_runtime.jsxs)("button", {
|
|
6636
|
+
type: "button",
|
|
6637
|
+
className: CiteCiter_module_css_default.settingsDocumentButton,
|
|
6638
|
+
"data-status": documentSnapshot.status,
|
|
6639
|
+
disabled: [
|
|
6640
|
+
"loading",
|
|
6641
|
+
"missing",
|
|
6642
|
+
"unavailable"
|
|
6643
|
+
].includes(documentSnapshot.status) || documentSnapshot.opening,
|
|
6644
|
+
"aria-busy": documentSnapshot.opening || documentSnapshot.status === "loading",
|
|
6645
|
+
onClick: () => {
|
|
6646
|
+
settingsDocument.open();
|
|
6647
|
+
},
|
|
6648
|
+
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSettingsOutline14, { size: 14 }), documentSnapshot.opening ? "正在打开…" : documentSnapshot.status === "loading" ? "正在检查…" : documentSnapshot.status === "unavailable" ? "宿主不支持打开" : documentSnapshot.status === "missing" ? "配置文件不存在" : documentSnapshot.status === "error" ? "重试打开配置文件" : "打开配置文件"]
|
|
6649
|
+
}), (documentSnapshot.error !== null || documentSnapshot.message !== null) && (0, react_jsx_runtime.jsx)("p", {
|
|
6650
|
+
className: CiteCiter_module_css_default.settingsDocumentStatus,
|
|
6651
|
+
"data-status": documentSnapshot.error === null ? "success" : "error",
|
|
6652
|
+
role: documentSnapshot.error === null ? "status" : "alert",
|
|
6653
|
+
children: documentSnapshot.error ?? documentSnapshot.message
|
|
6654
|
+
})]
|
|
6655
|
+
})]
|
|
6656
|
+
}),
|
|
6287
6657
|
(0, react_jsx_runtime.jsxs)("section", {
|
|
6288
6658
|
className: CiteCiter_module_css_default.settingsGroup,
|
|
6289
6659
|
children: [
|
|
@@ -6440,22 +6810,136 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6440
6810
|
})] });
|
|
6441
6811
|
}
|
|
6442
6812
|
//#endregion
|
|
6443
|
-
//#region lib/types/client/
|
|
6444
|
-
const
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6448
|
-
|
|
6813
|
+
//#region lib/types/client/settings-document.js
|
|
6814
|
+
const INITIAL = Object.freeze({
|
|
6815
|
+
status: "idle",
|
|
6816
|
+
opening: false,
|
|
6817
|
+
error: null,
|
|
6818
|
+
message: null
|
|
6819
|
+
});
|
|
6820
|
+
function memoryStore(initial) {
|
|
6821
|
+
let state = initial;
|
|
6822
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
6823
|
+
return {
|
|
6824
|
+
getSnapshot: () => state,
|
|
6825
|
+
subscribe: (listener) => {
|
|
6826
|
+
listeners.add(listener);
|
|
6827
|
+
return () => listeners.delete(listener);
|
|
6828
|
+
},
|
|
6829
|
+
update: (mutator) => {
|
|
6830
|
+
const next = { ...state };
|
|
6831
|
+
mutator(next);
|
|
6832
|
+
state = next;
|
|
6833
|
+
for (const listener of [...listeners]) listener();
|
|
6834
|
+
},
|
|
6835
|
+
set: (next) => {
|
|
6836
|
+
state = next;
|
|
6837
|
+
for (const listener of [...listeners]) listener();
|
|
6838
|
+
}
|
|
6839
|
+
};
|
|
6449
6840
|
}
|
|
6450
|
-
|
|
6451
|
-
|
|
6841
|
+
/**
|
|
6842
|
+
* Create the browser owner for the Host settings-document action.
|
|
6843
|
+
* @param describe - mirrored Host settings-document availability.
|
|
6844
|
+
* @param openDocument - Host operation that opens the authoritative file.
|
|
6845
|
+
* @returns observable loading, availability, and action state.
|
|
6846
|
+
*/
|
|
6847
|
+
function createSettingsDocumentController(describe, openDocument) {
|
|
6848
|
+
const store = memoryStore(INITIAL);
|
|
6849
|
+
let unsubscribe = null;
|
|
6850
|
+
let opening = null;
|
|
6851
|
+
let disposed = false;
|
|
6852
|
+
const operations = /* @__PURE__ */ new Set();
|
|
6853
|
+
const track = (operation) => {
|
|
6854
|
+
let tracked;
|
|
6855
|
+
tracked = operation.finally(() => operations.delete(tracked));
|
|
6856
|
+
operations.add(tracked);
|
|
6857
|
+
return tracked;
|
|
6858
|
+
};
|
|
6859
|
+
const derive = () => {
|
|
6860
|
+
const mirrored = describe.getSnapshot();
|
|
6861
|
+
if (mirrored.view === void 0) {
|
|
6862
|
+
store.update((state) => {
|
|
6863
|
+
state.status = mirrored.status === "loading" ? "loading" : mirrored.status === "unavailable" ? "unavailable" : mirrored.error === null ? "idle" : "error";
|
|
6864
|
+
state.error = mirrored.status === "unavailable" ? mirrored.error ?? "当前宿主不支持打开配置文件" : mirrored.error;
|
|
6865
|
+
state.message = null;
|
|
6866
|
+
});
|
|
6867
|
+
return;
|
|
6868
|
+
}
|
|
6869
|
+
const hasDocument = mirrored.view.hasDocument;
|
|
6870
|
+
store.update((state) => {
|
|
6871
|
+
state.status = hasDocument ? "ready" : "missing";
|
|
6872
|
+
state.error = hasDocument ? mirrored.error : "配置文件不存在";
|
|
6873
|
+
state.message = null;
|
|
6874
|
+
});
|
|
6875
|
+
};
|
|
6876
|
+
const load = async () => {
|
|
6877
|
+
if (disposed) return;
|
|
6878
|
+
unsubscribe ??= describe.subscribe(derive);
|
|
6879
|
+
store.update((state) => {
|
|
6880
|
+
state.status = "loading";
|
|
6881
|
+
state.error = null;
|
|
6882
|
+
state.message = null;
|
|
6883
|
+
});
|
|
6884
|
+
try {
|
|
6885
|
+
await track(describe.ensure());
|
|
6886
|
+
if (!disposed) derive();
|
|
6887
|
+
} catch (error) {
|
|
6888
|
+
if (!disposed) store.update((state) => {
|
|
6889
|
+
state.status = "error";
|
|
6890
|
+
state.error = error instanceof Error ? error.message : String(error);
|
|
6891
|
+
});
|
|
6892
|
+
}
|
|
6893
|
+
};
|
|
6894
|
+
return {
|
|
6895
|
+
getSnapshot: store.getSnapshot,
|
|
6896
|
+
subscribe: store.subscribe,
|
|
6897
|
+
load,
|
|
6898
|
+
open: async () => {
|
|
6899
|
+
if (store.getSnapshot().status === "idle" || store.getSnapshot().status === "error") await load();
|
|
6900
|
+
if (disposed || store.getSnapshot().status !== "ready" || store.getSnapshot().opening) return;
|
|
6901
|
+
const abort = new AbortController();
|
|
6902
|
+
opening = abort;
|
|
6903
|
+
store.update((state) => {
|
|
6904
|
+
state.opening = true;
|
|
6905
|
+
state.error = null;
|
|
6906
|
+
state.message = null;
|
|
6907
|
+
});
|
|
6908
|
+
try {
|
|
6909
|
+
await track(openDocument(abort.signal));
|
|
6910
|
+
if (!disposed) store.update((state) => {
|
|
6911
|
+
state.opening = false;
|
|
6912
|
+
state.message = "已打开配置文件";
|
|
6913
|
+
});
|
|
6914
|
+
} catch (error) {
|
|
6915
|
+
if (!disposed) store.update((state) => {
|
|
6916
|
+
state.opening = false;
|
|
6917
|
+
state.error = error instanceof Error ? error.message : String(error);
|
|
6918
|
+
});
|
|
6919
|
+
} finally {
|
|
6920
|
+
if (opening === abort) opening = null;
|
|
6921
|
+
}
|
|
6922
|
+
},
|
|
6923
|
+
dispose: async () => {
|
|
6924
|
+
if (disposed) return;
|
|
6925
|
+
disposed = true;
|
|
6926
|
+
opening?.abort();
|
|
6927
|
+
opening = null;
|
|
6928
|
+
unsubscribe?.();
|
|
6929
|
+
unsubscribe = null;
|
|
6930
|
+
while (operations.size > 0) await Promise.allSettled([...operations]);
|
|
6931
|
+
}
|
|
6932
|
+
};
|
|
6452
6933
|
}
|
|
6934
|
+
//#endregion
|
|
6935
|
+
//#region lib/types/client/selection.js
|
|
6936
|
+
const RANGE_CONTEXT_CHARS = 240;
|
|
6453
6937
|
function committedText(root, target) {
|
|
6454
6938
|
let text = "";
|
|
6455
6939
|
let targetStart;
|
|
6456
6940
|
let targetEnd;
|
|
6457
6941
|
const visit = (node) => {
|
|
6458
|
-
if (
|
|
6942
|
+
if (isReadFrogTranslatedContent(node)) return;
|
|
6459
6943
|
if (node === target) targetStart = text.length;
|
|
6460
6944
|
if (node.nodeType === Node.TEXT_NODE) text += node.textContent ?? "";
|
|
6461
6945
|
else for (const child of node.childNodes) visit(child);
|
|
@@ -6472,7 +6956,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6472
6956
|
let text = "";
|
|
6473
6957
|
let found = false;
|
|
6474
6958
|
const visit = (node) => {
|
|
6475
|
-
if (found ||
|
|
6959
|
+
if (found || isReadFrogTranslatedContent(node)) return;
|
|
6476
6960
|
if (node === boundary) {
|
|
6477
6961
|
if (node.nodeType === Node.TEXT_NODE) text += (node.textContent ?? "").slice(0, offset);
|
|
6478
6962
|
else for (let index = 0; index < offset; index++) {
|
|
@@ -6500,55 +6984,47 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6500
6984
|
* @returns validated selection metadata, or null when CiteCiter should ignore it.
|
|
6501
6985
|
*/
|
|
6502
6986
|
function readSelection(event, sourceSessionId) {
|
|
6987
|
+
const eventAnchor = dshAssistantAnchorForTarget(event.target);
|
|
6988
|
+
if (eventAnchor === null) return null;
|
|
6503
6989
|
const selection = window.getSelection();
|
|
6504
6990
|
if (selection === null || selection.isCollapsed || selection.rangeCount === 0) return null;
|
|
6505
6991
|
const range = selection.getRangeAt(0);
|
|
6506
|
-
const startFlow =
|
|
6507
|
-
const endFlow =
|
|
6508
|
-
if (startFlow === null ||
|
|
6509
|
-
if (endFlow !== startFlow) {
|
|
6510
|
-
const
|
|
6511
|
-
const anchorKey = flow?.dataset.chatAnchorKey;
|
|
6992
|
+
const startFlow = dshConversationFlow(range.startContainer);
|
|
6993
|
+
const endFlow = dshConversationFlow(range.endContainer);
|
|
6994
|
+
if (startFlow === null || endFlow === null) return null;
|
|
6995
|
+
if (endFlow.element !== startFlow.element) {
|
|
6996
|
+
const anchor = dshIntersectedAssistantAnchors(range).at(-1);
|
|
6512
6997
|
const displayText = range.toString().trim();
|
|
6513
|
-
if (
|
|
6514
|
-
const projected = committedText(
|
|
6998
|
+
if (anchor === void 0 || anchor.element !== eventAnchor.element || displayText === "") return null;
|
|
6999
|
+
const projected = committedText(anchor.element).text;
|
|
6515
7000
|
const sourceHintText = projected.trim();
|
|
6516
7001
|
if (sourceHintText === "") return null;
|
|
7002
|
+
const startOffset = projected.length - projected.trimStart().length;
|
|
7003
|
+
const endOffset = projected.length - (projected.length - projected.trimEnd().length);
|
|
6517
7004
|
return {
|
|
6518
7005
|
sourceSessionId,
|
|
6519
7006
|
displayText,
|
|
6520
7007
|
sourceHintText,
|
|
6521
7008
|
kind: "assistant-step",
|
|
6522
|
-
anchorKey,
|
|
6523
|
-
startOffset
|
|
6524
|
-
endOffset
|
|
7009
|
+
anchorKey: anchor.anchorKey,
|
|
7010
|
+
startOffset,
|
|
7011
|
+
endOffset,
|
|
6525
7012
|
prefixText: "",
|
|
6526
7013
|
suffixText: "",
|
|
6527
7014
|
x: event.clientX,
|
|
6528
7015
|
y: event.clientY
|
|
6529
7016
|
};
|
|
6530
7017
|
}
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
const element = parentElement(endpoint);
|
|
6535
|
-
if (element?.closest(".md-code-block") !== null && element?.closest("pre") === null) return null;
|
|
6536
|
-
}
|
|
6537
|
-
const kind = startFlow.dataset.chatFlowKind;
|
|
6538
|
-
const anchorKey = startFlow.dataset.chatAnchorKey;
|
|
6539
|
-
if (kind !== "assistant-step" || anchorKey === void 0 || anchorKey === "") return null;
|
|
6540
|
-
const translatedStart = parentElement(range.startContainer)?.closest(TRANSLATED_CONTENT_SELECTOR);
|
|
6541
|
-
const translatedEnd = parentElement(range.endContainer)?.closest(TRANSLATED_CONTENT_SELECTOR);
|
|
7018
|
+
if (startFlow.element !== eventAnchor.element || dshRangeTouchesExcludedContent(range, startFlow.element)) return null;
|
|
7019
|
+
const translated = readFrogSelection(range, startFlow.element);
|
|
7020
|
+
if (translated.kind === "invalid") return null;
|
|
6542
7021
|
let text;
|
|
6543
7022
|
let flowText;
|
|
6544
7023
|
let startOffset;
|
|
6545
7024
|
let endOffset;
|
|
6546
7025
|
let sourceHintText;
|
|
6547
|
-
if (
|
|
6548
|
-
|
|
6549
|
-
const sourceElement = translatedStart.parentElement?.closest("[data-read-frog-paragraph]");
|
|
6550
|
-
if (sourceElement === null || sourceElement === void 0 || !startFlow.contains(sourceElement)) return null;
|
|
6551
|
-
const projected = committedText(startFlow, sourceElement);
|
|
7026
|
+
if (translated.kind === "translation") {
|
|
7027
|
+
const projected = committedText(startFlow.element, translated.sourceParagraph);
|
|
6552
7028
|
if (projected.targetStart === void 0 || projected.targetEnd === void 0) return null;
|
|
6553
7029
|
const rawSourceHint = projected.text.slice(projected.targetStart, projected.targetEnd);
|
|
6554
7030
|
const sourceLeading = rawSourceHint.length - rawSourceHint.trimStart().length;
|
|
@@ -6559,14 +7035,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6559
7035
|
endOffset = projected.targetEnd - sourceTrailing;
|
|
6560
7036
|
sourceHintText = rawSourceHint.trim();
|
|
6561
7037
|
} else {
|
|
6562
|
-
const beforeStart = committedTextBefore(startFlow, range.startContainer, range.startOffset);
|
|
6563
|
-
const beforeEnd = committedTextBefore(startFlow, range.endContainer, range.endOffset);
|
|
7038
|
+
const beforeStart = committedTextBefore(startFlow.element, range.startContainer, range.startOffset);
|
|
7039
|
+
const beforeEnd = committedTextBefore(startFlow.element, range.endContainer, range.endOffset);
|
|
6564
7040
|
if (beforeStart === null || beforeEnd === null || beforeEnd.length < beforeStart.length) return null;
|
|
6565
7041
|
const rawText = beforeEnd.slice(beforeStart.length);
|
|
6566
7042
|
const leadingWhitespace = rawText.length - rawText.trimStart().length;
|
|
6567
7043
|
const trailingWhitespace = rawText.length - rawText.trimEnd().length;
|
|
6568
7044
|
text = rawText.trim();
|
|
6569
|
-
flowText = committedText(startFlow).text;
|
|
7045
|
+
flowText = committedText(startFlow.element).text;
|
|
6570
7046
|
startOffset = beforeStart.length + leadingWhitespace;
|
|
6571
7047
|
endOffset = beforeEnd.length - trailingWhitespace;
|
|
6572
7048
|
}
|
|
@@ -6576,8 +7052,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6576
7052
|
sourceSessionId,
|
|
6577
7053
|
displayText: text,
|
|
6578
7054
|
...sourceHintText === void 0 ? {} : { sourceHintText },
|
|
6579
|
-
kind,
|
|
6580
|
-
anchorKey,
|
|
7055
|
+
kind: "assistant-step",
|
|
7056
|
+
anchorKey: eventAnchor.anchorKey,
|
|
6581
7057
|
startOffset,
|
|
6582
7058
|
endOffset,
|
|
6583
7059
|
prefixText: flowText.slice(Math.max(0, startOffset - RANGE_CONTEXT_CHARS), startOffset),
|
|
@@ -6586,6 +7062,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6586
7062
|
y: event.clientY
|
|
6587
7063
|
};
|
|
6588
7064
|
}
|
|
7065
|
+
/**
|
|
7066
|
+
* Claim a context menu only after resolving a valid DSH assistant selection.
|
|
7067
|
+
*
|
|
7068
|
+
* @param event - context-menu event to validate and optionally cancel.
|
|
7069
|
+
* @param sourceSessionId - current source session captured with the selection.
|
|
7070
|
+
* @returns validated selection metadata, or null while leaving the native menu untouched.
|
|
7071
|
+
*/
|
|
7072
|
+
function claimSelectionContextMenu(event, sourceSessionId) {
|
|
7073
|
+
const selection = readSelection(event, sourceSessionId);
|
|
7074
|
+
if (selection === null) return null;
|
|
7075
|
+
event.preventDefault();
|
|
7076
|
+
return selection;
|
|
7077
|
+
}
|
|
6589
7078
|
//#endregion
|
|
6590
7079
|
//#region lib/types/client/types.js
|
|
6591
7080
|
/** Tiny observable state shared by the selection popover and independent dock. */
|
|
@@ -6639,11 +7128,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6639
7128
|
//#region lib/types/client/index.js
|
|
6640
7129
|
const name = "@kirkchinese/dsh-citeciter";
|
|
6641
7130
|
const inject = [
|
|
6642
|
-
"layout",
|
|
6643
7131
|
"slots",
|
|
6644
7132
|
"sessions",
|
|
6645
7133
|
"remote",
|
|
6646
|
-
"settingsScope"
|
|
7134
|
+
"settingsScope",
|
|
7135
|
+
"connection"
|
|
6647
7136
|
];
|
|
6648
7137
|
function decodeSettings(section) {
|
|
6649
7138
|
const parsed = citeCiterSettingsSchema.safeParse(section);
|
|
@@ -6655,20 +7144,24 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6655
7144
|
ctx.effect(() => unmountRemote, "citeciter: Remote contribution");
|
|
6656
7145
|
ctx.inject(["remote.citeciter"], (remoteCtx) => {
|
|
6657
7146
|
const sessions = remoteCtx.get("sessions");
|
|
6658
|
-
const
|
|
7147
|
+
const settingsBinder = remoteCtx.settingsScope;
|
|
7148
|
+
const settings = settingsBinder.bind({
|
|
6659
7149
|
namespace: CITECITER_SETTINGS_NAMESPACE,
|
|
6660
7150
|
decode: decodeSettings
|
|
6661
7151
|
});
|
|
7152
|
+
const connection = remoteCtx.get("connection");
|
|
7153
|
+
const settingsDocument = createSettingsDocumentController(settingsBinder.describe(), async (signal) => {
|
|
7154
|
+
const response = await connection.api.settings.openDocument({}, signal);
|
|
7155
|
+
if (!response.result.ok) throw new Error(response.result.error.message);
|
|
7156
|
+
});
|
|
6662
7157
|
const bus = new CiteBus((error) => remoteCtx.logger.warn("CiteCiter browser listener failed", error));
|
|
6663
7158
|
const openPanel = () => {
|
|
6664
|
-
remoteCtx.layout.closeDetails();
|
|
6665
7159
|
bus.setPanelOpen(true);
|
|
6666
7160
|
};
|
|
6667
7161
|
const closePanel = () => {
|
|
6668
|
-
remoteCtx.layout.closeDetails();
|
|
6669
7162
|
bus.setPanelOpen(false);
|
|
6670
7163
|
};
|
|
6671
|
-
const companion = createCompanionController(sessions, settings, (request) => remoteCtx.remote.citeciter.request(request), openPanel);
|
|
7164
|
+
const companion = createCompanionController(sessions, settings, (request, signal) => remoteCtx.remote.citeciter.request(request, signal), openPanel, (0, _deepseek_ai_dsh_client_runtime_client.createSnapshotStore)(INITIAL_COMPANION_SNAPSHOT));
|
|
6672
7165
|
const reportedParseErrors = /* @__PURE__ */ new Set();
|
|
6673
7166
|
const reportParseError = (messageId) => {
|
|
6674
7167
|
const storageKey = `citeciter:malformed-followups:${messageId}`;
|
|
@@ -6689,9 +7182,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6689
7182
|
const onContextMenu = (event) => {
|
|
6690
7183
|
const sourceSessionId = sessions.list.getSnapshot().current;
|
|
6691
7184
|
if (sourceSessionId === void 0) return;
|
|
6692
|
-
const selection =
|
|
7185
|
+
const selection = claimSelectionContextMenu(event, sourceSessionId);
|
|
6693
7186
|
if (selection === null) return;
|
|
6694
|
-
event.preventDefault();
|
|
6695
7187
|
bus.setMenuSelection(selection);
|
|
6696
7188
|
};
|
|
6697
7189
|
const onPointerDown = (event) => {
|
|
@@ -6734,12 +7226,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6734
7226
|
id: "citeciter",
|
|
6735
7227
|
order: 45,
|
|
6736
7228
|
label: "CiteCiter",
|
|
6737
|
-
inject: () => ({
|
|
7229
|
+
inject: () => ({
|
|
7230
|
+
companion,
|
|
7231
|
+
settingsDocument
|
|
7232
|
+
})
|
|
6738
7233
|
}, CiteCiterSettings));
|
|
6739
7234
|
remoteCtx.effect(() => async () => {
|
|
6740
7235
|
unsubscribeSessions();
|
|
6741
7236
|
closePanel();
|
|
6742
|
-
await companion.dispose();
|
|
7237
|
+
await Promise.all([companion.dispose(), settingsDocument.dispose()]);
|
|
6743
7238
|
}, "citeciter: browser controller");
|
|
6744
7239
|
});
|
|
6745
7240
|
}
|