@parhelia/core 0.2.12783 → 0.2.12786
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/dist/editor/ai/AgentImageCopyButton.d.ts +6 -0
- package/dist/editor/ai/AgentImageCopyButton.js +93 -0
- package/dist/editor/ai/AgentImageCopyButton.js.map +1 -0
- package/dist/editor/ai/terminal/components/EditFieldToolCallContent.d.ts +24 -0
- package/dist/editor/ai/terminal/components/EditFieldToolCallContent.js +97 -0
- package/dist/editor/ai/terminal/components/EditFieldToolCallContent.js.map +1 -0
- package/dist/editor/ai/terminal/components/ValueDiff.d.ts +15 -0
- package/dist/editor/ai/terminal/components/ValueDiff.js +21 -0
- package/dist/editor/ai/terminal/components/ValueDiff.js.map +1 -0
- package/dist/editor/ai/terminal/components/agentThinkingStyles.d.ts +1 -0
- package/dist/editor/ai/terminal/components/agentThinkingStyles.js +2 -0
- package/dist/editor/ai/terminal/components/agentThinkingStyles.js.map +1 -0
- package/dist/editor/ai/terminal/components/toolCallContentRenderers.d.ts +15 -0
- package/dist/editor/ai/terminal/components/toolCallContentRenderers.js +12 -0
- package/dist/editor/ai/terminal/components/toolCallContentRenderers.js.map +1 -0
- package/dist/editor/client/hooks/activeSessionSnapshots.d.ts +2 -0
- package/dist/editor/client/hooks/activeSessionSnapshots.js +43 -0
- package/dist/editor/client/hooks/activeSessionSnapshots.js.map +1 -0
- package/dist/editor/client/hooks/operationRefreshDeduplication.d.ts +22 -0
- package/dist/editor/client/hooks/operationRefreshDeduplication.js +45 -0
- package/dist/editor/client/hooks/operationRefreshDeduplication.js.map +1 -0
- package/dist/editor/client/hooks/socketMessageRetention.d.ts +7 -0
- package/dist/editor/client/hooks/socketMessageRetention.js +11 -0
- package/dist/editor/client/hooks/socketMessageRetention.js.map +1 -0
- package/dist/editor/client/hooks/useClientInfoRegistration.d.ts +13 -0
- package/dist/editor/client/hooks/useClientInfoRegistration.js +38 -0
- package/dist/editor/client/hooks/useClientInfoRegistration.js.map +1 -0
- package/dist/editor/client/undoTargetResolution.d.ts +28 -0
- package/dist/editor/client/undoTargetResolution.js +69 -0
- package/dist/editor/client/undoTargetResolution.js.map +1 -0
- package/dist/editor/field-types/singleLineTextValue.d.ts +3 -0
- package/dist/editor/field-types/singleLineTextValue.js +9 -0
- package/dist/editor/field-types/singleLineTextValue.js.map +1 -0
- package/dist/editor/insertOptionCompatibility.d.ts +7 -0
- package/dist/editor/insertOptionCompatibility.js +15 -0
- package/dist/editor/insertOptionCompatibility.js.map +1 -0
- package/dist/editor/media-selector/mediaItemDrag.d.ts +28 -0
- package/dist/editor/media-selector/mediaItemDrag.js +42 -0
- package/dist/editor/media-selector/mediaItemDrag.js.map +1 -0
- package/dist/editor/menubar/toolbar-sections/PreviewModeControl.d.ts +1 -0
- package/dist/editor/menubar/toolbar-sections/PreviewModeControl.js +14 -0
- package/dist/editor/menubar/toolbar-sections/PreviewModeControl.js.map +1 -0
- package/dist/editor/menubar/toolbar-sections/RefreshPageControl.d.ts +7 -0
- package/dist/editor/menubar/toolbar-sections/RefreshPageControl.js +44 -0
- package/dist/editor/menubar/toolbar-sections/RefreshPageControl.js.map +1 -0
- package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.d.ts +58 -0
- package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.js +731 -0
- package/dist/editor/page-editor-chrome/InlineFieldHistoryButton.js.map +1 -0
- package/dist/editor/page-viewer/bridgeInlineAiSelection.d.ts +17 -0
- package/dist/editor/page-viewer/bridgeInlineAiSelection.js +80 -0
- package/dist/editor/page-viewer/bridgeInlineAiSelection.js.map +1 -0
- package/dist/editor/page-viewer/bridgeInlineEditCommit.d.ts +18 -0
- package/dist/editor/page-viewer/bridgeInlineEditCommit.js +24 -0
- package/dist/editor/page-viewer/bridgeInlineEditCommit.js.map +1 -0
- package/dist/editor/page-viewer/bridgeItemChangeTarget.d.ts +9 -0
- package/dist/editor/page-viewer/bridgeItemChangeTarget.js +38 -0
- package/dist/editor/page-viewer/bridgeItemChangeTarget.js.map +1 -0
- package/dist/editor/page-viewer/bridgePointerDragRelease.d.ts +31 -0
- package/dist/editor/page-viewer/bridgePointerDragRelease.js +32 -0
- package/dist/editor/page-viewer/bridgePointerDragRelease.js.map +1 -0
- package/dist/editor/page-viewer/fullscreenPagePath.d.ts +1 -0
- package/dist/editor/page-viewer/fullscreenPagePath.js +11 -0
- package/dist/editor/page-viewer/fullscreenPagePath.js.map +1 -0
- package/dist/editor/page-viewer/internalLinkNavigation.d.ts +9 -0
- package/dist/editor/page-viewer/internalLinkNavigation.js +104 -0
- package/dist/editor/page-viewer/internalLinkNavigation.js.map +1 -0
- package/dist/editor/reviews/FeedbackFilters.d.ts +16 -0
- package/dist/editor/reviews/FeedbackFilters.js +45 -0
- package/dist/editor/reviews/FeedbackFilters.js.map +1 -0
- package/dist/editor/reviews/commentState.d.ts +4 -0
- package/dist/editor/reviews/commentState.js +15 -0
- package/dist/editor/reviews/commentState.js.map +1 -0
- package/dist/editor/settings/index/IndexGenerationsSection.d.ts +8 -0
- package/dist/editor/settings/index/IndexGenerationsSection.js +93 -0
- package/dist/editor/settings/index/IndexGenerationsSection.js.map +1 -0
- package/dist/editor/settings/panels/MemoriesPanel.d.ts +16 -0
- package/dist/editor/settings/panels/MemoriesPanel.js +292 -0
- package/dist/editor/settings/panels/MemoriesPanel.js.map +1 -0
- package/dist/editor/settings/panels/MemoryEntryDialog.d.ts +45 -0
- package/dist/editor/settings/panels/MemoryEntryDialog.js +167 -0
- package/dist/editor/settings/panels/MemoryEntryDialog.js.map +1 -0
- package/dist/editor/settings/panels/RenderingHostsPanel.d.ts +2 -0
- package/dist/editor/settings/panels/RenderingHostsPanel.js +63 -0
- package/dist/editor/settings/panels/RenderingHostsPanel.js.map +1 -0
- package/dist/editor/settings/panels/projectTemplateDuplication.d.ts +5 -0
- package/dist/editor/settings/panels/projectTemplateDuplication.js +57 -0
- package/dist/editor/settings/panels/projectTemplateDuplication.js.map +1 -0
- package/dist/editor/sidebar/WorkboxFilters.d.ts +11 -0
- package/dist/editor/sidebar/WorkboxFilters.js +61 -0
- package/dist/editor/sidebar/WorkboxFilters.js.map +1 -0
- package/dist/editor/version-diff/versionDiffGeometryKeys.d.ts +10 -0
- package/dist/editor/version-diff/versionDiffGeometryKeys.js +16 -0
- package/dist/editor/version-diff/versionDiffGeometryKeys.js.map +1 -0
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/package.json +1 -1
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.d.ts +0 -5
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js +0 -12
- package/dist/editor/ai/terminal/components/AgentEditHistoryButton.js.map +0 -1
- package/dist/editor/ai/terminal/components/AgentThinkingDots.d.ts +0 -5
- package/dist/editor/ai/terminal/components/AgentThinkingDots.js +0 -9
- package/dist/editor/ai/terminal/components/AgentThinkingDots.js.map +0 -1
- package/dist/editor/reviews/CommentsAndFeedback.d.ts +0 -8
- package/dist/editor/reviews/CommentsAndFeedback.js +0 -17
- package/dist/editor/reviews/CommentsAndFeedback.js.map +0 -1
- package/dist/editor/reviews/CreateReviewDetailsStep.d.ts +0 -53
- package/dist/editor/reviews/CreateReviewDetailsStep.js +0 -77
- package/dist/editor/reviews/CreateReviewDetailsStep.js.map +0 -1
- package/dist/splash-screen/ParheliaAssistantChat.d.ts +0 -8
- package/dist/splash-screen/ParheliaAssistantChat.js +0 -507
- package/dist/splash-screen/ParheliaAssistantChat.js.map +0 -1
- package/dist/splash-screen/SplashScreenAgentContext.d.ts +0 -28
- package/dist/splash-screen/SplashScreenAgentContext.js +0 -51
- package/dist/splash-screen/SplashScreenAgentContext.js.map +0 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { Check, CircleAlert, Copy, Loader2 } from "lucide-react";
|
|
4
|
+
import { toast } from "sonner";
|
|
5
|
+
import { cn } from "../../lib/utils";
|
|
6
|
+
async function convertToPng(blob) {
|
|
7
|
+
if (blob.type.toLowerCase() === "image/png") {
|
|
8
|
+
return blob;
|
|
9
|
+
}
|
|
10
|
+
const bitmap = await createImageBitmap(blob);
|
|
11
|
+
try {
|
|
12
|
+
const canvas = document.createElement("canvas");
|
|
13
|
+
canvas.width = bitmap.width;
|
|
14
|
+
canvas.height = bitmap.height;
|
|
15
|
+
const context = canvas.getContext("2d");
|
|
16
|
+
if (!context) {
|
|
17
|
+
throw new Error("Unable to create a canvas context");
|
|
18
|
+
}
|
|
19
|
+
context.drawImage(bitmap, 0, 0);
|
|
20
|
+
return await new Promise((resolve, reject) => {
|
|
21
|
+
canvas.toBlob((pngBlob) => pngBlob
|
|
22
|
+
? resolve(pngBlob)
|
|
23
|
+
: reject(new Error("Unable to convert the image to PNG")), "image/png");
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
bitmap.close();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function copyImageToClipboard(src) {
|
|
31
|
+
if (!navigator.clipboard?.write || typeof ClipboardItem === "undefined") {
|
|
32
|
+
throw new Error("Copying images is not supported by this browser");
|
|
33
|
+
}
|
|
34
|
+
await navigator.clipboard.write([
|
|
35
|
+
new ClipboardItem({
|
|
36
|
+
// Start the clipboard write during the click's user-activation window.
|
|
37
|
+
// The Clipboard API accepts a promise while the image is fetched.
|
|
38
|
+
"image/png": (async () => {
|
|
39
|
+
const response = await fetch(src);
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new Error(`Unable to load the image (${response.status})`);
|
|
42
|
+
}
|
|
43
|
+
const imageBlob = await response.blob();
|
|
44
|
+
if (imageBlob.type &&
|
|
45
|
+
!imageBlob.type.toLowerCase().startsWith("image/")) {
|
|
46
|
+
throw new Error("The selected resource is not an image");
|
|
47
|
+
}
|
|
48
|
+
return convertToPng(imageBlob);
|
|
49
|
+
})(),
|
|
50
|
+
}),
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
export function AgentImageCopyButton({ src, className, "data-testid": dataTestId = "agent-image-copy-button", }) {
|
|
54
|
+
const [copyState, setCopyState] = useState("idle");
|
|
55
|
+
const resetTimerRef = useRef(null);
|
|
56
|
+
useEffect(() => () => {
|
|
57
|
+
if (resetTimerRef.current) {
|
|
58
|
+
clearTimeout(resetTimerRef.current);
|
|
59
|
+
}
|
|
60
|
+
}, []);
|
|
61
|
+
const scheduleReset = () => {
|
|
62
|
+
if (resetTimerRef.current) {
|
|
63
|
+
clearTimeout(resetTimerRef.current);
|
|
64
|
+
}
|
|
65
|
+
resetTimerRef.current = setTimeout(() => setCopyState("idle"), 2000);
|
|
66
|
+
};
|
|
67
|
+
const handleCopy = async (event) => {
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
event.stopPropagation();
|
|
70
|
+
if (copyState === "copying")
|
|
71
|
+
return;
|
|
72
|
+
setCopyState("copying");
|
|
73
|
+
try {
|
|
74
|
+
await copyImageToClipboard(src);
|
|
75
|
+
setCopyState("copied");
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error("Failed to copy image:", error);
|
|
79
|
+
setCopyState("error");
|
|
80
|
+
toast.error("Failed to copy image to the clipboard.");
|
|
81
|
+
}
|
|
82
|
+
scheduleReset();
|
|
83
|
+
};
|
|
84
|
+
const label = copyState === "copying"
|
|
85
|
+
? "Copying image"
|
|
86
|
+
: copyState === "copied"
|
|
87
|
+
? "Image copied"
|
|
88
|
+
: copyState === "error"
|
|
89
|
+
? "Copy failed"
|
|
90
|
+
: "Copy image";
|
|
91
|
+
return (_jsx("button", { type: "button", onClick: handleCopy, "aria-label": label, title: label, "data-testid": dataTestId, className: cn("border-border-default text-neutral-grey-100 absolute top-2 right-2 z-10 flex size-8 cursor-pointer items-center justify-center rounded-md border bg-white/95 opacity-0 shadow-sm backdrop-blur-sm transition-[opacity,background-color,color] group-focus-within/image:opacity-100 group-hover/image:opacity-100 hover:bg-white focus:opacity-100 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-wait", copyState === "error" && "text-feedback-red", className), disabled: copyState === "copying", children: copyState === "copying" ? (_jsx(Loader2, { className: "size-4 animate-spin", "aria-hidden": "true" })) : copyState === "copied" ? (_jsx(Check, { className: "size-4", "aria-hidden": "true" })) : copyState === "error" ? (_jsx(CircleAlert, { className: "size-4", "aria-hidden": "true" })) : (_jsx(Copy, { className: "size-4", "aria-hidden": "true" })) }));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=AgentImageCopyButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentImageCopyButton.js","sourceRoot":"","sources":["../../../src/editor/ai/AgentImageCopyButton.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ToolCallApprovalContext, ToolCallContentContext } from "./toolCallContentRenderers";
|
|
2
|
+
interface EditFieldDetailsProps {
|
|
3
|
+
fieldLabel: string;
|
|
4
|
+
itemLabel?: string;
|
|
5
|
+
pageContext?: string;
|
|
6
|
+
oldValue: string;
|
|
7
|
+
newValue: string;
|
|
8
|
+
}
|
|
9
|
+
interface EditFieldApprovalDetails {
|
|
10
|
+
fieldName: string;
|
|
11
|
+
itemPath: string;
|
|
12
|
+
currentValue: string;
|
|
13
|
+
proposedValue: string;
|
|
14
|
+
capturedAt: string;
|
|
15
|
+
truncated: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function toDisplayString(value: unknown): string;
|
|
18
|
+
export declare function EditFieldDetailsContent({ fieldLabel, itemLabel, pageContext, oldValue, newValue, }: EditFieldDetailsProps): import("react").JSX.Element;
|
|
19
|
+
export declare function EditFieldApprovalContent({ details, }: {
|
|
20
|
+
details: EditFieldApprovalDetails;
|
|
21
|
+
}): import("react").JSX.Element;
|
|
22
|
+
export declare function resolveEditFieldDetails(context: ToolCallContentContext): React.ReactElement | null;
|
|
23
|
+
export declare function resolveEditFieldApproval(context: ToolCallApprovalContext): React.ReactElement | null;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ValueDiff } from "./ValueDiff";
|
|
3
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
4
|
+
const optionalString = (value) => typeof value === "string" && value.trim() ? value : undefined;
|
|
5
|
+
export function toDisplayString(value) {
|
|
6
|
+
if (value === null || value === undefined)
|
|
7
|
+
return "";
|
|
8
|
+
if (typeof value === "string")
|
|
9
|
+
return value;
|
|
10
|
+
if (typeof value === "object") {
|
|
11
|
+
try {
|
|
12
|
+
return JSON.stringify(value);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return String(value);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return String(value);
|
|
19
|
+
}
|
|
20
|
+
function parseEditFieldArgs(value) {
|
|
21
|
+
if (!value?.trim())
|
|
22
|
+
return {};
|
|
23
|
+
try {
|
|
24
|
+
let parsed = JSON.parse(value);
|
|
25
|
+
if (typeof parsed === "string")
|
|
26
|
+
parsed = JSON.parse(parsed);
|
|
27
|
+
if (!isRecord(parsed))
|
|
28
|
+
return {};
|
|
29
|
+
return {
|
|
30
|
+
itemId: optionalString(parsed.itemId),
|
|
31
|
+
componentId: optionalString(parsed.componentId),
|
|
32
|
+
field: optionalString(parsed.field),
|
|
33
|
+
value: parsed.value,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function getLiveOperationString(operation, property) {
|
|
41
|
+
return optionalString(operation[property]);
|
|
42
|
+
}
|
|
43
|
+
function parseApprovalDetails(details) {
|
|
44
|
+
if (!isRecord(details))
|
|
45
|
+
return null;
|
|
46
|
+
const fieldName = optionalString(details.fieldName);
|
|
47
|
+
const itemPath = optionalString(details.itemPath);
|
|
48
|
+
const currentValue = details.currentValue;
|
|
49
|
+
const proposedValue = details.proposedValue;
|
|
50
|
+
const capturedAt = optionalString(details.capturedAt);
|
|
51
|
+
if (!fieldName ||
|
|
52
|
+
!itemPath ||
|
|
53
|
+
typeof currentValue !== "string" ||
|
|
54
|
+
typeof proposedValue !== "string" ||
|
|
55
|
+
!capturedAt) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
fieldName,
|
|
60
|
+
itemPath,
|
|
61
|
+
currentValue,
|
|
62
|
+
proposedValue,
|
|
63
|
+
capturedAt,
|
|
64
|
+
truncated: details.truncated === true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function formatSnapshotTime(value) {
|
|
68
|
+
const date = new Date(value);
|
|
69
|
+
return Number.isNaN(date.getTime()) ? value : date.toLocaleString();
|
|
70
|
+
}
|
|
71
|
+
export function EditFieldDetailsContent({ fieldLabel, itemLabel, pageContext, oldValue, newValue, }) {
|
|
72
|
+
return (_jsxs("div", { className: "flex flex-col gap-2", "data-testid": "edit-field-details", children: [_jsxs("div", { className: "text-neutral-grey-100 text-xs font-medium", children: [fieldLabel, itemLabel ? ` on ${itemLabel}` : "", !itemLabel && pageContext ? ` on page ${pageContext}` : ""] }), _jsx(ValueDiff, { oldValue: oldValue, newValue: newValue, defaultMode: "rendered", clipUnchanged: true, clipThreshold: 50, clipContext: 10 })] }));
|
|
73
|
+
}
|
|
74
|
+
export function EditFieldApprovalContent({ details, }) {
|
|
75
|
+
return (_jsxs("div", { className: "mt-2 flex flex-col gap-1.5", "data-testid": "edit-field-approval", children: [_jsxs("div", { className: "text-neutral-grey-100 text-xs font-medium", children: [details.fieldName, " on ", details.itemPath] }), _jsxs("div", { className: "text-neutral-grey-50 text-[10px] leading-4", children: ["Current value as of ", formatSnapshotTime(details.capturedAt), " \u2192 proposed value"] }), _jsx(ValueDiff, { oldValue: details.currentValue, newValue: details.proposedValue, defaultMode: "raw", truncated: details.truncated, clipUnchanged: true, clipThreshold: 50, clipContext: 10 })] }));
|
|
76
|
+
}
|
|
77
|
+
export function resolveEditFieldDetails(context) {
|
|
78
|
+
const operation = context.operations.find((candidate) => candidate.type === "edit-field");
|
|
79
|
+
if (!operation)
|
|
80
|
+
return null;
|
|
81
|
+
const args = parseEditFieldArgs(context.toolCall.function?.arguments);
|
|
82
|
+
const itemLabel = getLiveOperationString(operation, "itemName") ??
|
|
83
|
+
args.itemId ??
|
|
84
|
+
args.componentId;
|
|
85
|
+
const pageContext = !itemLabel && operation.mainItemPath
|
|
86
|
+
? operation.mainItemPath
|
|
87
|
+
: !itemLabel
|
|
88
|
+
? operation.mainItem?.id
|
|
89
|
+
: undefined;
|
|
90
|
+
const fieldLabel = optionalString(operation.fieldName) ?? args.field ?? "Field";
|
|
91
|
+
return (_jsx(EditFieldDetailsContent, { fieldLabel: fieldLabel, itemLabel: itemLabel, pageContext: pageContext, oldValue: toDisplayString(operation.oldValue), newValue: toDisplayString(operation.value ?? args.value) }));
|
|
92
|
+
}
|
|
93
|
+
export function resolveEditFieldApproval(context) {
|
|
94
|
+
const details = parseApprovalDetails(context.details);
|
|
95
|
+
return details ? _jsx(EditFieldApprovalContent, { details: details }) : null;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=EditFieldToolCallContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditFieldToolCallContent.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/EditFieldToolCallContent.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ValueDiffMode = "raw" | "rendered";
|
|
2
|
+
export interface ValueDiffProps {
|
|
3
|
+
oldValue: string;
|
|
4
|
+
newValue: string;
|
|
5
|
+
defaultMode?: ValueDiffMode;
|
|
6
|
+
truncated?: boolean;
|
|
7
|
+
clipUnchanged?: boolean;
|
|
8
|
+
clipThreshold?: number;
|
|
9
|
+
clipContext?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Shared old-to-new field value diff. Raw mode compares the escaped source
|
|
13
|
+
* strings, while rendered mode strips markup before comparing visible text.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ValueDiff({ oldValue, newValue, defaultMode, truncated, clipUnchanged, clipThreshold, clipContext, }: ValueDiffProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { MultiSwitchButton } from "../../../../components/ui/multi-switch-button";
|
|
4
|
+
import { DiffView } from "../../../reviews/DiffView";
|
|
5
|
+
const modes = [
|
|
6
|
+
{ value: "raw", label: "Raw", testId: "value-diff-mode-raw" },
|
|
7
|
+
{
|
|
8
|
+
value: "rendered",
|
|
9
|
+
label: "Rendered text",
|
|
10
|
+
testId: "value-diff-mode-rendered",
|
|
11
|
+
},
|
|
12
|
+
];
|
|
13
|
+
/**
|
|
14
|
+
* Shared old-to-new field value diff. Raw mode compares the escaped source
|
|
15
|
+
* strings, while rendered mode strips markup before comparing visible text.
|
|
16
|
+
*/
|
|
17
|
+
export function ValueDiff({ oldValue, newValue, defaultMode = "rendered", truncated = false, clipUnchanged = false, clipThreshold, clipContext, }) {
|
|
18
|
+
const [mode, setMode] = useState(defaultMode);
|
|
19
|
+
return (_jsxs("div", { className: "flex flex-col gap-2", "data-testid": "value-diff", children: [_jsx("div", { className: "flex justify-end", children: _jsx(MultiSwitchButton, { "aria-label": "Field value diff mode", value: mode, options: modes, onValueChange: setMode, className: "w-48", optionClassName: "h-6 px-1.5 text-[10px]", testId: "value-diff-mode" }) }), truncated && (_jsx("div", { className: "border-feedback-orange/40 bg-feedback-orange-light/60 text-feedback-orange rounded border px-2 py-1.5 text-[10px] leading-4", "data-testid": "value-diff-truncation-notice", children: "These values were truncated for display. Omitted content is marked in the diff." })), _jsx("div", { className: "border-border-default rounded bg-white p-2", children: _jsx(DiffView, { oldText: oldValue, newText: newValue, ignoreFormatting: mode === "rendered", clipUnchanged: clipUnchanged, clipThreshold: clipThreshold, clipContext: clipContext }) })] }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ValueDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValueDiff.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/ValueDiff.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAcrD,MAAM,KAAK,GAAG;IACZ,EAAE,KAAK,EAAE,KAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE;IACtE;QACE,KAAK,EAAE,UAAmB;QAC1B,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,0BAA0B;KACnC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,QAAQ,EACR,QAAQ,EACR,WAAW,GAAG,UAAU,EACxB,SAAS,GAAG,KAAK,EACjB,aAAa,GAAG,KAAK,EACrB,aAAa,EACb,WAAW,GACI;IACf,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,WAAW,CAAC,CAAC;IAE7D,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,iBAAa,YAAY,aAC3D,cAAK,SAAS,EAAC,kBAAkB,YAC/B,KAAC,iBAAiB,kBACL,uBAAuB,EAClC,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,KAAK,EACd,aAAa,EAAE,OAAO,EACtB,SAAS,EAAC,MAAM,EAChB,eAAe,EAAC,wBAAwB,EACxC,MAAM,EAAC,iBAAiB,GACxB,GACE,EACL,SAAS,IAAI,CACZ,cACE,SAAS,EAAC,6HAA6H,iBAC3H,8BAA8B,gGAItC,CACP,EACD,cAAK,SAAS,EAAC,4CAA4C,YACzD,KAAC,QAAQ,IACP,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,EACjB,gBAAgB,EAAE,IAAI,KAAK,UAAU,EACrC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,GACxB,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const AGENT_THINKING_TEXT_SIZE_CLASS = "text-xs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentThinkingStyles.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/agentThinkingStyles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EditOperation } from "../../../../types";
|
|
2
|
+
import type { BaseToolCall } from "./ToolCallDisplay";
|
|
3
|
+
export interface ToolCallContentContext {
|
|
4
|
+
toolCall: BaseToolCall;
|
|
5
|
+
operations: EditOperation[];
|
|
6
|
+
}
|
|
7
|
+
export interface ToolCallApprovalContext {
|
|
8
|
+
functionName: string;
|
|
9
|
+
details: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface ToolCallContentRenderer {
|
|
12
|
+
resolveDetails?: (context: ToolCallContentContext) => React.ReactElement | null;
|
|
13
|
+
resolveApproval?: (context: ToolCallApprovalContext) => React.ReactElement | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function getToolCallContentRenderer(functionName: string): ToolCallContentRenderer | undefined;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { resolveEditFieldApproval, resolveEditFieldDetails, } from "./EditFieldToolCallContent";
|
|
2
|
+
import { cleanToolFunctionName } from "./toolCallApprovalGate";
|
|
3
|
+
const renderers = {
|
|
4
|
+
"edit-field": {
|
|
5
|
+
resolveDetails: resolveEditFieldDetails,
|
|
6
|
+
resolveApproval: resolveEditFieldApproval,
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
export function getToolCallContentRenderer(functionName) {
|
|
10
|
+
return renderers[cleanToolFunctionName(functionName).toLowerCase()];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=toolCallContentRenderers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolCallContentRenderers.js","sourceRoot":"","sources":["../../../../../src/editor/ai/terminal/components/toolCallContentRenderers.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAqB/D,MAAM,SAAS,GAA4C;IACzD,YAAY,EAAE;QACZ,cAAc,EAAE,uBAAuB;QACvC,eAAe,EAAE,wBAAwB;KAC1C;CACF,CAAC;AAEF,MAAM,UAAU,0BAA0B,CACxC,YAAoB;IAEpB,OAAO,SAAS,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
function descriptorKey(descriptor) {
|
|
2
|
+
if (!descriptor)
|
|
3
|
+
return "";
|
|
4
|
+
return JSON.stringify([
|
|
5
|
+
descriptor.database ?? "",
|
|
6
|
+
descriptor.id,
|
|
7
|
+
descriptor.language,
|
|
8
|
+
descriptor.version,
|
|
9
|
+
descriptor.name ?? "",
|
|
10
|
+
descriptor.displayName ?? "",
|
|
11
|
+
descriptor.path ?? "",
|
|
12
|
+
]);
|
|
13
|
+
}
|
|
14
|
+
function sessionKey(session) {
|
|
15
|
+
const user = session.user;
|
|
16
|
+
return JSON.stringify([
|
|
17
|
+
session.sessionId,
|
|
18
|
+
session.url ?? "",
|
|
19
|
+
session.userAgent ?? "",
|
|
20
|
+
session.color,
|
|
21
|
+
descriptorKey(session.page),
|
|
22
|
+
descriptorKey(session.item),
|
|
23
|
+
session.fieldLock?.fieldId ?? "",
|
|
24
|
+
descriptorKey(session.fieldLock?.item),
|
|
25
|
+
user.name,
|
|
26
|
+
user.fullName ?? "",
|
|
27
|
+
user.ai,
|
|
28
|
+
user.agentId ?? "",
|
|
29
|
+
user.email ?? "",
|
|
30
|
+
user.isLimitedPreviewUser ?? false,
|
|
31
|
+
user.isAdministrator ?? false,
|
|
32
|
+
user.avatarUrl ?? "",
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
export function activeSessionSnapshotsEqual(previous, next) {
|
|
36
|
+
if (previous === next)
|
|
37
|
+
return true;
|
|
38
|
+
if (previous.length !== next.length)
|
|
39
|
+
return false;
|
|
40
|
+
const previousById = new Map(previous.map((session) => [session.sessionId, sessionKey(session)]));
|
|
41
|
+
return next.every((session) => previousById.get(session.sessionId) === sessionKey(session));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=activeSessionSnapshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activeSessionSnapshots.js","sourceRoot":"","sources":["../../../../src/editor/client/hooks/activeSessionSnapshots.ts"],"names":[],"mappings":"AAGA,SAAS,aAAa,CAAC,UAAsC;IAC3D,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE3B,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,UAAU,CAAC,QAAQ,IAAI,EAAE;QACzB,UAAU,CAAC,EAAE;QACb,UAAU,CAAC,QAAQ;QACnB,UAAU,CAAC,OAAO;QAClB,UAAU,CAAC,IAAI,IAAI,EAAE;QACrB,UAAU,CAAC,WAAW,IAAI,EAAE;QAC5B,UAAU,CAAC,IAAI,IAAI,EAAE;KACtB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,OAAoB;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,CAAC,SAAS;QACjB,OAAO,CAAC,GAAG,IAAI,EAAE;QACjB,OAAO,CAAC,SAAS,IAAI,EAAE;QACvB,OAAO,CAAC,KAAK;QACb,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3B,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3B,OAAO,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE;QAChC,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC;QACtC,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,QAAQ,IAAI,EAAE;QACnB,IAAI,CAAC,EAAE;QACP,IAAI,CAAC,OAAO,IAAI,EAAE;QAClB,IAAI,CAAC,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC,oBAAoB,IAAI,KAAK;QAClC,IAAI,CAAC,eAAe,IAAI,KAAK;QAC7B,IAAI,CAAC,SAAS,IAAI,EAAE;KACrB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,QAAuB,EACvB,IAAmB;IAEnB,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAElD,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CACpE,CAAC;IAEF,OAAO,IAAI,CAAC,KAAK,CACf,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,CACzE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EditOperation } from "../../../types";
|
|
2
|
+
type OperationRefreshSignal = Partial<Pick<EditOperation, "id" | "executionStatus" | "executionCompleted" | "undone">> & {
|
|
3
|
+
operationId?: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* A completed long-running operation is sent to the initiating user as
|
|
7
|
+
* `operation:completed` and then broadcast to the page as `edit-operation`.
|
|
8
|
+
* Both envelopes contain the same operation and may independently request a
|
|
9
|
+
* canvas refresh. Keep only the latest lifecycle state for each operation so
|
|
10
|
+
* the second envelope does not start an identical host render.
|
|
11
|
+
*
|
|
12
|
+
* Undo and redo remain distinct because they change `undone`; a redo changes
|
|
13
|
+
* the state back again and therefore also produces a refresh.
|
|
14
|
+
*/
|
|
15
|
+
export declare class OperationRefreshDeduplicator {
|
|
16
|
+
private readonly maxTrackedOperations;
|
|
17
|
+
private readonly latestStateByOperationId;
|
|
18
|
+
constructor(maxTrackedOperations?: number);
|
|
19
|
+
shouldRefresh(operation: OperationRefreshSignal): boolean;
|
|
20
|
+
private trimOldestOperations;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A completed long-running operation is sent to the initiating user as
|
|
3
|
+
* `operation:completed` and then broadcast to the page as `edit-operation`.
|
|
4
|
+
* Both envelopes contain the same operation and may independently request a
|
|
5
|
+
* canvas refresh. Keep only the latest lifecycle state for each operation so
|
|
6
|
+
* the second envelope does not start an identical host render.
|
|
7
|
+
*
|
|
8
|
+
* Undo and redo remain distinct because they change `undone`; a redo changes
|
|
9
|
+
* the state back again and therefore also produces a refresh.
|
|
10
|
+
*/
|
|
11
|
+
export class OperationRefreshDeduplicator {
|
|
12
|
+
maxTrackedOperations;
|
|
13
|
+
latestStateByOperationId = new Map();
|
|
14
|
+
constructor(maxTrackedOperations = 256) {
|
|
15
|
+
this.maxTrackedOperations = maxTrackedOperations;
|
|
16
|
+
}
|
|
17
|
+
shouldRefresh(operation) {
|
|
18
|
+
const operationId = operation.operationId || operation.id;
|
|
19
|
+
if (!operationId)
|
|
20
|
+
return true;
|
|
21
|
+
const state = [
|
|
22
|
+
operation.executionStatus || "",
|
|
23
|
+
operation.undone === true ? "undone" : "applied",
|
|
24
|
+
operation.executionCompleted || "",
|
|
25
|
+
].join("|");
|
|
26
|
+
if (this.latestStateByOperationId.get(operationId) === state) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
this.latestStateByOperationId.delete(operationId);
|
|
30
|
+
this.latestStateByOperationId.set(operationId, state);
|
|
31
|
+
this.trimOldestOperations();
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
trimOldestOperations() {
|
|
35
|
+
while (this.latestStateByOperationId.size > this.maxTrackedOperations) {
|
|
36
|
+
const oldestOperationId = this.latestStateByOperationId
|
|
37
|
+
.keys()
|
|
38
|
+
.next().value;
|
|
39
|
+
if (!oldestOperationId)
|
|
40
|
+
return;
|
|
41
|
+
this.latestStateByOperationId.delete(oldestOperationId);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=operationRefreshDeduplication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operationRefreshDeduplication.js","sourceRoot":"","sources":["../../../../src/editor/client/hooks/operationRefreshDeduplication.ts"],"names":[],"mappings":"AAWA;;;;;;;;;GASG;AACH,MAAM,OAAO,4BAA4B;IAGV,oBAAoB;IAFhC,wBAAwB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEtE,YAA6B,oBAAoB,GAAG,GAAG;oCAA1B,oBAAoB;IAAS,CAAC;IAE3D,aAAa,CAAC,SAAiC;QAC7C,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,KAAK,GAAG;YACZ,SAAS,CAAC,eAAe,IAAI,EAAE;YAC/B,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAChD,SAAS,CAAC,kBAAkB,IAAI,EAAE;SACnC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEZ,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,oBAAoB;QAC1B,OAAO,IAAI,CAAC,wBAAwB,CAAC,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACtE,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB;iBACpD,IAAI,EAAE;iBACN,IAAI,EAAE,CAAC,KAAK,CAAC;YAChB,IAAI,CAAC,iBAAiB;gBAAE,OAAO;YAC/B,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EditorShell's retained socket history feeds the agent-run diagnostics view.
|
|
3
|
+
* Operational editor traffic is handled live and must not be copied into
|
|
4
|
+
* React state: doing so re-renders the entire editor for every remote caret or
|
|
5
|
+
* item notification even though no consumer reads those entries.
|
|
6
|
+
*/
|
|
7
|
+
export declare function shouldRetainSocketMessageForRunDiagnostics(message: unknown): boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EditorShell's retained socket history feeds the agent-run diagnostics view.
|
|
3
|
+
* Operational editor traffic is handled live and must not be copied into
|
|
4
|
+
* React state: doing so re-renders the entire editor for every remote caret or
|
|
5
|
+
* item notification even though no consumer reads those entries.
|
|
6
|
+
*/
|
|
7
|
+
export function shouldRetainSocketMessageForRunDiagnostics(message) {
|
|
8
|
+
const type = message?.type;
|
|
9
|
+
return typeof type === "string" && type.startsWith("agent:run:");
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=socketMessageRetention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socketMessageRetention.js","sourceRoot":"","sources":["../../../../src/editor/client/hooks/socketMessageRetention.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,0CAA0C,CAAC,OAAgB;IACzE,MAAM,IAAI,GAAI,OAAqC,EAAE,IAAI,CAAC;IAC1D,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const CLIENT_INFO_RETRY_MS = 1000;
|
|
2
|
+
/**
|
|
3
|
+
* Keeps the server's page subscription in sync until the registration request
|
|
4
|
+
* or active-sessions confirms that the current client-info payload was applied. Client-info updates are
|
|
5
|
+
* idempotent, so retrying closes both failed-request and lost-ack gaps without
|
|
6
|
+
* allowing editing before the realtime subscription is established.
|
|
7
|
+
*/
|
|
8
|
+
export declare function useClientInfoRegistration(input: {
|
|
9
|
+
itemKey: string | null;
|
|
10
|
+
acknowledged: boolean;
|
|
11
|
+
connectionVersion: number;
|
|
12
|
+
sendClientInfo: () => Promise<unknown> | unknown;
|
|
13
|
+
}): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
export const CLIENT_INFO_RETRY_MS = 1_000;
|
|
3
|
+
/**
|
|
4
|
+
* Keeps the server's page subscription in sync until the registration request
|
|
5
|
+
* or active-sessions confirms that the current client-info payload was applied. Client-info updates are
|
|
6
|
+
* idempotent, so retrying closes both failed-request and lost-ack gaps without
|
|
7
|
+
* allowing editing before the realtime subscription is established.
|
|
8
|
+
*/
|
|
9
|
+
export function useClientInfoRegistration(input) {
|
|
10
|
+
const { itemKey, acknowledged, connectionVersion, sendClientInfo } = input;
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!itemKey || acknowledged)
|
|
13
|
+
return;
|
|
14
|
+
let disposed = false;
|
|
15
|
+
let retryTimer = null;
|
|
16
|
+
const register = async () => {
|
|
17
|
+
try {
|
|
18
|
+
await sendClientInfo();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// The next retry handles transport failures. Avoid a recurring error
|
|
22
|
+
// log while the backend or connection is temporarily unavailable.
|
|
23
|
+
}
|
|
24
|
+
if (disposed)
|
|
25
|
+
return;
|
|
26
|
+
retryTimer = setTimeout(() => {
|
|
27
|
+
void register();
|
|
28
|
+
}, CLIENT_INFO_RETRY_MS);
|
|
29
|
+
};
|
|
30
|
+
void register();
|
|
31
|
+
return () => {
|
|
32
|
+
disposed = true;
|
|
33
|
+
if (retryTimer)
|
|
34
|
+
clearTimeout(retryTimer);
|
|
35
|
+
};
|
|
36
|
+
}, [acknowledged, connectionVersion, itemKey, sendClientInfo]);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=useClientInfoRegistration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClientInfoRegistration.js","sourceRoot":"","sources":["../../../../src/editor/client/hooks/useClientInfoRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAKzC;IACC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAE3E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,YAAY;YAAE,OAAO;QAErC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,UAAU,GAAyC,IAAI,CAAC;QAE5D,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,cAAc,EAAE,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,qEAAqE;gBACrE,kEAAkE;YACpE,CAAC;YAED,IAAI,QAAQ;gBAAE,OAAO;YACrB,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC3B,KAAK,QAAQ,EAAE,CAAC;YAClB,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,KAAK,QAAQ,EAAE,CAAC;QAEhB,OAAO,GAAG,EAAE;YACV,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,UAAU;gBAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EditOperation } from "../../types";
|
|
2
|
+
import type { ItemDescriptor } from "../pageModel";
|
|
3
|
+
export type HistoryMode = "global" | "page-centric" | "current-version" | "timeline";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the operation the toolbar/keyboard undo gesture should target.
|
|
6
|
+
*
|
|
7
|
+
* The toolbar derives its "next undoable operation" from the date-sorted
|
|
8
|
+
* history state. Inline-typing saves commit to the server asynchronously and
|
|
9
|
+
* their operation reaches that state via save-ack/websocket merges, so a
|
|
10
|
+
* click shortly after a save can carry a stale target — an older operation
|
|
11
|
+
* that was top of the history before the save. The operations context tracks
|
|
12
|
+
* the most recent locally executed undoable operation; when the requested
|
|
13
|
+
* target is older than (or unaware of) it, the local operation is what the
|
|
14
|
+
* user expects the undo gesture to revert.
|
|
15
|
+
*
|
|
16
|
+
* A requested target that is genuinely newer than the local operation
|
|
17
|
+
* (another tab or user acting after the local save) stays authoritative, as
|
|
18
|
+
* does any explicit per-operation undo — those go through undoOperations and
|
|
19
|
+
* never pass through this resolution.
|
|
20
|
+
*/
|
|
21
|
+
export declare function preferLatestLocalUndoTarget({ requestedOperationId, latestLocalOperation, editHistory, recentlyUndoneIds, historyMode, currentItem, }: {
|
|
22
|
+
requestedOperationId?: string;
|
|
23
|
+
latestLocalOperation?: EditOperation;
|
|
24
|
+
editHistory: EditOperation[];
|
|
25
|
+
recentlyUndoneIds: ReadonlySet<string>;
|
|
26
|
+
historyMode: HistoryMode;
|
|
27
|
+
currentItem?: ItemDescriptor;
|
|
28
|
+
}): string | undefined;
|